diff --git a/firmware/config.c b/firmware/config.c new file mode 100644 index 0000000..5f2c0cd --- /dev/null +++ b/firmware/config.c @@ -0,0 +1,41 @@ +#include "config.h" + +struct CFG ram_cfg; +struct CFG eem_cfg EEMEM; +const struct CFG pgm_cfg PROGMEM = { + LED_BRIGHTNESS +}; + +void map_eem2ram(void) +{ + eeprom_read_block(&ram_cfg, &eem_cfg, sizeof(ram_cfg)); +} + +void map_pgm2ram(void) +{ + memcpy_P(&ram_cfg, &pgm_cfg, sizeof(ram_cfg)); +} + +void dump_ram2eem(void) +{ + eeprom_write_block(&ram_cfg, &eem_cfg, sizeof(ram_cfg)); +} + +void load_defaults(void) +{ + map_pgm2ram(); + dump_ram2eem(); +} + +void cfg_init(void) +{ + uint8_t i; + uint8_t len = sizeof(ram_cfg); + uint8_t* ram_cfg_byte = (uint8_t*) &ram_cfg; + + map_eem2ram(); + + for(i=0; i +#include + +#define LED_BRIGHTNESS 127 + +struct CFG +{ + uint8_t led_brightness; +}; + +extern struct CFG ram_cfg; +extern struct CFG eem_cfg EEMEM; +extern const struct CFG pgm_cfg PROGMEM; + +void map_eem2ram(void); +void map_pgm2ram(void); +void dump_ram2eem(void); +void load_defaults(void); +void cfg_init(void); + +#endif \ No newline at end of file diff --git a/firmware/keyboard.c b/firmware/keyboard.c index 41fee8a..c4fcf3d 100644 --- a/firmware/keyboard.c +++ b/firmware/keyboard.c @@ -1,4 +1,5 @@ #include +#include "config.h" #include "keyboard.h" #include "debounce.h" #include "rtc.h" @@ -26,8 +27,9 @@ void inc_second(void) void inc_brightness(void) { - led_brightness <<= 1; - if(!led_brightness) led_brightness = 1; + ram_cfg.led_brightness <<= 1; + if(!ram_cfg.led_brightness) ram_cfg.led_brightness = 1; + dump_ram2eem(); } void keyboard_init(void) diff --git a/firmware/led.c b/firmware/led.c index 7f81fa4..61427de 100644 --- a/firmware/led.c +++ b/firmware/led.c @@ -1,8 +1,8 @@ #include #include +#include "config.h" #include "led.h" -volatile uint8_t led_brightness = 1; volatile uint8_t led_hour; volatile uint8_t led_minute; volatile uint8_t led_second; @@ -32,15 +32,15 @@ ISR(TIMER0_OVF_vect) { case 1: LED_PORT = ~led_hour; - ANODES_PORT = led_brightness >= pwm_counter ? ~HOUR_ANODE : 0xFF; + ANODES_PORT = ram_cfg.led_brightness >= pwm_counter ? ~HOUR_ANODE : 0xFF; break; case 2: LED_PORT = ~led_minute; - ANODES_PORT = led_brightness >= pwm_counter ? ~MINUTE_ANODE : 0xFF; + ANODES_PORT = ram_cfg.led_brightness >= pwm_counter ? ~MINUTE_ANODE : 0xFF; break; case 4: LED_PORT = ~led_second; - ANODES_PORT = led_brightness >= pwm_counter ? ~SECOND_ANODE : 0xFF; + ANODES_PORT = ram_cfg.led_brightness >= pwm_counter ? ~SECOND_ANODE : 0xFF; break; } diff --git a/firmware/led.h b/firmware/led.h index 9981c43..4ed30b7 100644 --- a/firmware/led.h +++ b/firmware/led.h @@ -10,7 +10,6 @@ #define MINUTE_ANODE (1< #include +#include "config.h" #include "keyboard.h" #include "ptimer.h" #include "i2c.h" @@ -10,6 +11,7 @@ int main() { + cfg_init(); keyboard_init(); ptimer_init(); i2c_init(I2C_BITRATE);