From c4744cd8eb779dc2211c404066129b320596ef38 Mon Sep 17 00:00:00 2001 From: harbaum Date: Thu, 3 Jul 2014 19:21:27 +0000 Subject: [PATCH] 8bit options framework --- menu.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++-------- user_io.c | 40 +++++++++++++++++++--------- user_io.h | 2 +- 3 files changed, 96 insertions(+), 25 deletions(-) diff --git a/menu.c b/menu.c index 794d222..df31eb3 100644 --- a/menu.c +++ b/menu.c @@ -133,6 +133,22 @@ void SelectFile(char* pFileExt, unsigned char Options, unsigned char MenuSelect, menustate = MENU_FILE_SELECT1; } +static void substrcpy(char *d, char *s, char idx) { + char p = 0; + + while(*s) { + if((p == idx) && *s && (*s != ',')) + *d++ = *s; + + if(*s == ',') + p++; + + s++; + } + + *d = 0; +} + #define STD_EXIT " exit" #define HELPTEXT_DELAY 10000 #define FRAME_DELAY 150 @@ -328,13 +344,43 @@ void HandleUI(void) } else OsdWrite(0, " No file I/O", 0,1); - OsdWrite(1, "", 0,0); - OsdWrite(2, "", 0,0); - OsdWrite(3, "", 0,0); - OsdWrite(4, "", 0,0); - OsdWrite(5, "", 0,0); - OsdWrite(6, "", 0,0); - OsdWrite(7, "", 0,0); + // add options as requested by core + i = 2; + do { + unsigned char status = user_io_8bit_set_status(0,0); // 0,0 gets status + + p = user_io_8bit_get_string(i); + // iprintf("Option %d: %s\n", i-1, p); + + // check for 'O'ption strings + if(p && (p[0] == 'O')) { + // p[1] is the digit after the O, so O1 is status bit 1 + char x = (status & (1<<(p[1]-'0')))?1:0; + + // get currently active option + substrcpy(s, p, 2+x); + char l = strlen(s); + + s[0] = ' '; + substrcpy(s+1, p, 1); + strcat(s, ":"); + l = 28-l-strlen(s); + while(l--) strcat(s, " "); + + substrcpy(s+strlen(s), p, 2+x); + + OsdWrite(i-1, s, menusub == i-1,0); + + // add bit in menu mask + menumask = (menumask << 1) | 1; + } + i++; + } while(p); + + // clear rest of OSD (the -=2 is on purpose!!) + for(i-=2;i<8;i++) + OsdWrite(i, "", 0,0); + menustate = MENU_8BIT_MAIN2; parentstate=MENU_8BIT_MAIN1; break; @@ -344,13 +390,24 @@ void HandleUI(void) if (menu) menustate = MENU_NONE1; if(select) { - switch(menusub) { - case 0: { - p = user_io_8bit_get_string(1); + p = user_io_8bit_get_string(1+menusub); + + // entry 0 = file selector + if(!menusub) { strcat(p, " "); // expand short extensions to 3 bytes p[3] = 0; SelectFile(p, SCAN_DIR | SCAN_LFN, MENU_8BIT_MAIN_FILE_SELECTED, MENU_8BIT_MAIN1); - } + } else { + // determine which status bit is affected + unsigned char mask = 1<<(p[1]-'0'); + unsigned char status = user_io_8bit_set_status(0,0); // 0,0 gets status + + // iprintf("Option %s %x\n", p, status ^ mask); + + // toggle bit + user_io_8bit_set_status(status ^ mask, mask); + + menustate = MENU_8BIT_MAIN1; } } break; diff --git a/user_io.c b/user_io.c index 4b22ae0..5affd36 100644 --- a/user_io.c +++ b/user_io.c @@ -345,7 +345,7 @@ void user_io_file_tx(fileTYPE *file) { // to treat it char *user_io_8bit_get_string(char index) { unsigned char i, lidx = 0, j = 0; - static char buffer[16+1]; // max 16 bytes per config item + static char buffer[32+1]; // max 32 bytes per config item // clear buffer buffer[0] = 0; @@ -361,7 +361,7 @@ char *user_io_8bit_get_string(char index) { return NULL; } - iprintf("String: "); + // iprintf("String: "); while ((i != 0) && (i!=0xff) && (j