Enable storing LED brightness in EEPROM
This commit is contained in:
41
firmware/config.c
Normal file
41
firmware/config.c
Normal 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
24
firmware/config.h
Normal 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
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user