Fahrplan-Browser.
authorWintermate <wintermute@hannover.ccc.de>
Wed, 23 Oct 2013 17:46:10 +0000 (19:46 +0200)
committerWintermate <wintermute@hannover.ccc.de>
Wed, 23 Oct 2013 17:46:10 +0000 (19:46 +0200)
badge/jumpnrun/starter.c
badge/main.c
badge/ui/browser.c
badge/ui/browser.h

index 0645487..d35c5fa 100644 (file)
@@ -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;
 }
 
index 87927b9..466ae3e 100644 (file)
@@ -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;
     }
   }
index 39a4d8a..1f5fe24 100644 (file)
@@ -2,9 +2,12 @@
 #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) {
@@ -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);
+  }
+}
index f1d0348..3fc35b5 100644 (file)
@@ -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
This page took 0.036066 seconds and 4 git commands to generate.