From cfe6e328e5754468ca1da56449471ee9fb616d99 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Sun, 31 Jul 2011 18:15:44 +0200 Subject: [PATCH] You will probably hate me, but commit new, global config framework hopefully it will be stable now. Sorry for breaking your stuff --- firmware/applications/default.c | 15 +++++-- firmware/basic/basic.h | 36 ++++++++++------- firmware/basic/config.c | 69 +++++++++++++++++++++------------ firmware/basic/night.c | 4 +- firmware/lcd/display.c | 36 +++++++++++++---- firmware/lcd/display.h | 1 + firmware/lcd/render.c | 6 +++ firmware/lcd/render.h | 1 + 8 files changed, 117 insertions(+), 51 deletions(-) diff --git a/firmware/applications/default.c b/firmware/applications/default.c index 4e145ee..d4f0b00 100644 --- a/firmware/applications/default.c +++ b/firmware/applications/default.c @@ -38,10 +38,17 @@ void tick_default(void) { }; }; - if(isNight()) - backlightSetBrightness(globalconfig.backlightvalue); - else - backlightSetBrightness(0); + if(ctr>100/SYSTICKSPEED){ + if(isNight()){ + backlightSetBrightness(GLOBAL(lcdbacklight)); + if(GLOBAL(nightinvert)) + lcdSetInvert(0); + } else { + backlightSetBrightness(0); + if(GLOBAL(nightinvert)) + lcdSetInvert(1); + } + } if(ctr%(50/SYSTICKSPEED)==0){ diff --git a/firmware/basic/basic.h b/firmware/basic/basic.h index c4ec7bb..41ed5c7 100644 --- a/firmware/basic/basic.h +++ b/firmware/basic/basic.h @@ -187,21 +187,31 @@ void handleMenu(const struct MENU *the_menu); // config.c -struct config_t { - time_t time; - uint16_t backlighttrigger; - char backlightvalue; - char lcdstate; - char privacy; -} __attribute__((__packed__)); - -typedef struct config_t CONFIG; - -extern CONFIG globalconfig; - int readConfig(void); int saveConfig(void); -int applyConfig(void); +void applyConfig(void); + + +struct CDESC { + char *name; + char value; + char min; + char max; +}; + +extern struct CDESC the_config[]; + +#define GLOBALversion (the_config[0].value) +#define GLOBALprivacy (the_config[1].value) +#define GLOBALnighttrigger (the_config[2].value) +#define GLOBALnightinvert (the_config[3].value) +#define GLOBALlcdbacklight (the_config[4].value) +#define GLOBALlcdmirror (the_config[5].value) +#define GLOBALlcdinvert (the_config[6].value) +#define GLOBALlcdcontrast (the_config[7].value) + +#define GLOBAL(x) GLOBAL ## x + #define SYSTICKSPEED 10 diff --git a/firmware/basic/config.c b/firmware/basic/config.c index eea1936..d4a0b5a 100644 --- a/firmware/basic/config.c +++ b/firmware/basic/config.c @@ -1,21 +1,38 @@ #include #include "basic/basic.h" -#include "lcd/lcd.h" -#include "lcd/fonts/smallfonts.h" #include "lcd/print.h" #include "filesystem/ff.h" #include "basic/random.h" -CONFIG globalconfig = { 0,310,50,0,0}; +#define CFGVER 23 + +struct CDESC the_config[]= { + {"version", CFGVER, CFGVER, CFGVER}, + {"privacy", 3, 0, 2 }, + {"nighttrigger", 310/2, 0, 255}, + {"nightinvert", 1, 0, 1 }, + {"lcdbacklight", 50, 0, 100}, + {"lcdmirror", 0, 0, 1 }, + {"lcdinvert", 0, 0, 1 }, + {"lcdcontrast", 3, 1, 6 }, + { NULL, 0, 0, 0 }, +}; #define CONFFILE "r0ket.cfg" +#define CONF_ITER for(int i=0;the_config[i].name!=NULL;i++) /**************************************************************************/ +void applyConfig(){ + lcdSetContrast(GLOBAL(lcdcontrast)); + return 0; +}; + int saveConfig(void){ FIL file; /* File object */ UINT writebytes; + UINT allwrite=0; int res; res=f_open(&file, CONFFILE, FA_OPEN_ALWAYS|FA_WRITE); @@ -25,16 +42,20 @@ int saveConfig(void){ return 1; }; - res = f_write(&file, &globalconfig, sizeof(CONFIG), &writebytes); + CONF_ITER{ + res = f_write(&file, &the_config[i].value, sizeof(uint8_t), &writebytes); + allwrite+=writebytes; + if(res){ + lcdPrint("write:"); + lcdPrintln(f_get_rc_string(res)); + return 1; + }; + }; lcdPrint("write:"); lcdPrintln(f_get_rc_string(res)); - if(res){ - return 1; - }; - - lcdPrint("wrote:"); - lcdPrintInt(writebytes); - lcdPrintln("b"); + lcdPrint(" ("); + lcdPrintInt(allwrite); + lcdPrintln("b)"); res=f_close(&file); lcdPrint("close:"); @@ -48,34 +69,32 @@ int saveConfig(void){ int readConfig(void){ FIL file; /* File object */ UINT readbytes; + UINT allread; int res; - lcdFill(0); // clear display buffer - res=f_open(&file, CONFFILE, FA_OPEN_EXISTING|FA_READ); - lcdPrint("open:"); - lcdPrintln(f_get_rc_string(res)); if(res){ return 1; }; - res = f_read(&file, &globalconfig, sizeof(CONFIG), &readbytes); - lcdPrint("read:"); - lcdPrintln(f_get_rc_string(res)); - if(res){ - return 1; + CONF_ITER{ + res = f_read(&file, &the_config[i].value, sizeof(uint8_t), &readbytes); + allread+=readbytes; + if(GLOBAL(version) != CFGVER){ + GLOBAL(version) =CFGVER; + return 1; + }; + if(res || GLOBAL(version) != CFGVER) + return 1; }; res=f_close(&file); - lcdPrint("close:"); - lcdPrintln(f_get_rc_string(res)); if(res){ return 1; }; + + applyConfig(); return 0; }; -int applyConfig(){ - return 0; -}; diff --git a/firmware/basic/night.c b/firmware/basic/night.c index 6110818..ae62db1 100644 --- a/firmware/basic/night.c +++ b/firmware/basic/night.c @@ -7,7 +7,7 @@ uint32_t light=300*HYST; char _isnight=1; -#define threshold globalconfig.backlighttrigger +#define threshold GLOBAL(nighttrigger) void LightCheck(void){ int iocon; @@ -22,7 +22,7 @@ void LightCheck(void){ gpioSetDir(RB_LED3, gpioDirection_Input); IOCON_PIO1_11 = IOCON_PIO1_11_FUNC_AD7|IOCON_PIO1_11_ADMODE_ANALOG; light-=light/HYST; - light += adcRead(7); + light += (adcRead(7)/2); gpioSetDir(RB_LED3, iodir); IOCON_PIO1_11=iocon; diff --git a/firmware/lcd/display.c b/firmware/lcd/display.c index 06b61f5..3ffd916 100644 --- a/firmware/lcd/display.c +++ b/firmware/lcd/display.c @@ -13,7 +13,6 @@ /**************************************************************************/ uint8_t lcdBuffer[RESX*RESY_B]; -#define lcd_layout globalconfig.lcdstate uint32_t intstatus; // Caches USB interrupt state // (need to disable MSC while displaying) @@ -153,12 +152,12 @@ void lcdDisplay(void) { uint16_t i,page; for(page=0; page0x2e) c=0x24; + lcd_select(); + lcdWrite(TYPE_CMD,c); + lcd_deselect(); +}; +void lcdSetInvert(int c) { + if(c>1) + c=1; + if(c<0) + c=1; + + c+=0xa6; + lcd_select(); + lcdWrite(TYPE_CMD,c); + lcd_deselect(); +}; + +/* deprecated */ +void __attribute__((__deprecated__)) lcdToggleFlag(int flag) { + if(flag==LCD_MIRRORX) + GLOBAL(lcdmirror)=!GLOBAL(lcdmirror); + if(flag==LCD_INVERTED) + GLOBAL(lcdinvert)=!GLOBAL(lcdinvert); +} void lcdShiftH(bool right, bool wrap) { diff --git a/firmware/lcd/display.h b/firmware/lcd/display.h index 5d92540..79f671e 100644 --- a/firmware/lcd/display.h +++ b/firmware/lcd/display.h @@ -29,4 +29,5 @@ void lcdSetPixel(char x, char y, bool f); void lcdSafeSetPixel(char x, char y, bool f); bool lcdGetPixel(char x, char y); void lcdShift(int x, int y, bool wrap); +void lcdSetContrast(int c); #endif diff --git a/firmware/lcd/render.c b/firmware/lcd/render.c index 8355dd0..62339df 100644 --- a/firmware/lcd/render.c +++ b/firmware/lcd/render.c @@ -34,6 +34,12 @@ void setExtFont(const char *fname){ font=NULL; }; +int getFontHeight(void){ + if(font) + return font->u8Height; + return 8; // XXX: Should be done right. +}; + int _getFontData(int type, int offset){ UINT readbytes; diff --git a/firmware/lcd/render.h b/firmware/lcd/render.h index eaa69ef..e78975c 100644 --- a/firmware/lcd/render.h +++ b/firmware/lcd/render.h @@ -36,6 +36,7 @@ int DoCharX(int sx, int sy, unsigned char num); int DoShortX(int sx, int sy, uint16_t num); void setIntFont(const struct FONT_DEF * font); void setExtFont(const char *file); +int getFontHeight(void); #define START_FONT 0 #define SEEK_EXTRAS 1