#endif
-void usbmode(void) {
+static void usbmode(void) {
badge_event_stop();
badge_framebuffer fb = { { { 0 } } };
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) {
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;
}
}
#include "menu.h"
#include <drivers/fatfs/ff.h>
+#include <string.h>
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) {
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);
+ }
+}