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 <avr/io.h>
|
||||||
|
#include "config.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
#include "debounce.h"
|
#include "debounce.h"
|
||||||
#include "rtc.h"
|
#include "rtc.h"
|
||||||
@@ -26,8 +27,9 @@ void inc_second(void)
|
|||||||
|
|
||||||
void inc_brightness(void)
|
void inc_brightness(void)
|
||||||
{
|
{
|
||||||
led_brightness <<= 1;
|
ram_cfg.led_brightness <<= 1;
|
||||||
if(!led_brightness) led_brightness = 1;
|
if(!ram_cfg.led_brightness) ram_cfg.led_brightness = 1;
|
||||||
|
dump_ram2eem();
|
||||||
}
|
}
|
||||||
|
|
||||||
void keyboard_init(void)
|
void keyboard_init(void)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
#include "config.h"
|
||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
|
||||||
volatile uint8_t led_brightness = 1;
|
|
||||||
volatile uint8_t led_hour;
|
volatile uint8_t led_hour;
|
||||||
volatile uint8_t led_minute;
|
volatile uint8_t led_minute;
|
||||||
volatile uint8_t led_second;
|
volatile uint8_t led_second;
|
||||||
@@ -32,15 +32,15 @@ ISR(TIMER0_OVF_vect)
|
|||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
LED_PORT = ~led_hour;
|
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;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
LED_PORT = ~led_minute;
|
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;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
LED_PORT = ~led_second;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#define MINUTE_ANODE (1<<PD6)
|
#define MINUTE_ANODE (1<<PD6)
|
||||||
#define SECOND_ANODE (1<<PD7)
|
#define SECOND_ANODE (1<<PD7)
|
||||||
|
|
||||||
extern volatile uint8_t led_brightness;
|
|
||||||
extern volatile uint8_t led_hour;
|
extern volatile uint8_t led_hour;
|
||||||
extern volatile uint8_t led_minute;
|
extern volatile uint8_t led_minute;
|
||||||
extern volatile uint8_t led_second;
|
extern volatile uint8_t led_second;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
#include "config.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
#include "ptimer.h"
|
#include "ptimer.h"
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
@@ -10,6 +11,7 @@
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
cfg_init();
|
||||||
keyboard_init();
|
keyboard_init();
|
||||||
ptimer_init();
|
ptimer_init();
|
||||||
i2c_init(I2C_BITRATE);
|
i2c_init(I2C_BITRATE);
|
||||||
|
|||||||
Reference in New Issue
Block a user