From c8028bb0e1137541373f46638370b96f02924e32 Mon Sep 17 00:00:00 2001 From: Wintermate Date: Wed, 23 Oct 2013 19:46:10 +0200 Subject: [PATCH] Fahrplan-Browser. --- badge/jumpnrun/starter.c | 3 +- badge/main.c | 9 +++-- badge/ui/browser.c | 79 +++++++++++++++++++++++++++++++++++++++- badge/ui/browser.h | 1 + 4 files changed, 86 insertions(+), 6 deletions(-) diff --git a/badge/jumpnrun/starter.c b/badge/jumpnrun/starter.c index 0645487..d35c5fa 100644 --- a/badge/jumpnrun/starter.c +++ b/badge/jumpnrun/starter.c @@ -76,7 +76,8 @@ static uint8_t jumpnrun_pick_level_from_fd(char *buf, size_t *first_visible, siz } *selected = choice; - strcpy(buf, fnames[*selected]); + strncpy(buf, fnames[*selected], LEVELFILE_MAX); + buf[LEVELFILE_MAX] = '\0'; return 0; } diff --git a/badge/main.c b/badge/main.c index 87927b9..466ae3e 100644 --- a/badge/main.c +++ b/badge/main.c @@ -186,7 +186,7 @@ void rbInit() { #endif -void usbmode(void) { +static void usbmode(void) { badge_event_stop(); badge_framebuffer fb = { { { 0 } } }; @@ -202,8 +202,9 @@ void usbmode(void) { for(;;); } -void scrolltest(void) { - badge_browse_textfile("/fahrplan/test.txt"); +static void fahrplan(void) { + f_chdir("/fahrplan"); + badge_browse_textfiles("fahrplan.lst"); } uint8_t main_menu_show(uint8_t selected) { @@ -233,7 +234,7 @@ void main_menu(void) { switch(selected) { case 0: badge_vanity_show(); break; case 1: jumpnrun_play (); break; - case 2: scrolltest (); break; + case 2: fahrplan (); break; case 3: usbmode (); break; } } diff --git a/badge/ui/browser.c b/badge/ui/browser.c index 39a4d8a..1f5fe24 100644 --- a/badge/ui/browser.c +++ b/badge/ui/browser.c @@ -2,9 +2,12 @@ #include "menu.h" #include +#include enum { - LINE_LENGTH = 16 + LINE_LENGTH = 16, + FNAME_MAX = 12, + BUFLEN = LINE_LENGTH + 1 + FNAME_MAX + 1 }; static void badge_browse_textfile_fd(FIL *fd) { @@ -32,10 +35,84 @@ static void badge_browse_textfile_fd(FIL *fd) { badge_scroll_text(lines, i); } +static size_t badge_count_lines_in_file(FIL *fd) { + size_t count = 0; + + if(FR_OK == f_lseek(fd, 0)) { + char buf[BUFLEN]; + while(f_gets(buf, BUFLEN, fd)) { + ++count; + } + } + + return count; +} + +static uint8_t badge_browse_pick_filename_from_fd(char *buf, size_t *first_visible, size_t *selected, FIL *fd) { + unsigned linecount = badge_count_lines_in_file(fd); + + if(FR_OK != f_lseek(fd, 0)) { + return 1; + } + + char menu_buf [linecount + 1][BUFLEN]; + char const *menu_index[linecount + 1]; + char *fnames [linecount + 1]; + unsigned i; + + for(i = 0; i < linecount && f_gets(menu_buf[i], BUFLEN, fd); ++i) { + menu_index[i] = menu_buf[i]; + char *p; + for(p = menu_buf[i]; *p && *p != '|'; ++p) + ; + if(*p) { + *p++ = '\0'; + } + fnames[i] = p; + } + + strcpy(menu_buf[i], "exit"); + menu_index[i] = menu_buf[i]; + size_t choice = badge_menu(menu_index, i + 1, first_visible, *selected); + + if(choice == linecount) { + return 1; // exit + } + + *selected = choice; + strncpy(buf, fnames[*selected], FNAME_MAX); + buf[FNAME_MAX] = '\0'; + + return 0; +} + +static uint8_t badge_pick_filename(char *buf, char const *menufile, size_t *first_visible, size_t *selected) { + FIL fd; + uint8_t err = 1; + + if(FR_OK == f_open(&fd, menufile, FA_OPEN_EXISTING | FA_READ)) { + err = badge_browse_pick_filename_from_fd(buf, first_visible, selected, &fd); + f_close(&fd); + } + + return err; +} + void badge_browse_textfile(char const *fname) { FIL fd; + if(FR_OK == f_open(&fd, fname, FA_OPEN_EXISTING | FA_READ)) { badge_browse_textfile_fd(&fd); f_close(&fd); } } + +void badge_browse_textfiles(char const *menufile) { + char buf[FNAME_MAX + 1]; + size_t first_visible = 0; + size_t selected = 0; + + while(0 == badge_pick_filename(buf, menufile, &first_visible, &selected)) { + badge_browse_textfile(buf); + } +} diff --git a/badge/ui/browser.h b/badge/ui/browser.h index f1d0348..3fc35b5 100644 --- a/badge/ui/browser.h +++ b/badge/ui/browser.h @@ -2,5 +2,6 @@ #define INCLUDED_BADGE_UI_BROWSER_H void badge_browse_textfile(char const *fname); +void badge_browse_textfiles(char const *menufile); #endif -- 2.20.1