Enable storing LED brightness in EEPROM

This commit is contained in:
2020-11-17 23:33:39 +01:00
parent d01fbdd411
commit 26eac4ac69
6 changed files with 75 additions and 7 deletions

41
firmware/config.c Normal file
View File

@@ -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<len; ++i) if(*ram_cfg_byte++ != 0xFF) break;
if(i == len) load_defaults();
}

24
firmware/config.h Normal file
View File

@@ -0,0 +1,24 @@
#ifndef __CONFIG_H__
#define __CONFIG_H__
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#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

View File

@@ -1,4 +1,5 @@
#include <avr/io.h>
#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)

View File

@@ -1,8 +1,8 @@
#include <avr/io.h>
#include <avr/interrupt.h>
#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;
}

View File

@@ -10,7 +10,6 @@
#define MINUTE_ANODE (1<<PD6)
#define SECOND_ANODE (1<<PD7)
extern volatile uint8_t led_brightness;
extern volatile uint8_t led_hour;
extern volatile uint8_t led_minute;
extern volatile uint8_t led_second;

View File

@@ -1,5 +1,6 @@
#include <avr/io.h>
#include <avr/interrupt.h>
#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);