X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=main.c;h=a8f7324908316e99fb95a0568122a464c847fe27;hb=713be444bff004385f2397856be48508628c746a;hp=738362cb83d9dc938a6033948c8b67c417fd214f;hpb=197b6fb1de7321b9c7ca7ddd906076acd580c6fc;p=rgblamp.git diff --git a/main.c b/main.c index 738362c..a8f7324 100644 --- a/main.c +++ b/main.c @@ -45,13 +45,16 @@ #include "task.h" #include "adc_random.h" -#if 1 -#define AUTO_OFF_COUNT 450 /* 15 mins on*/ -#define AUTO_ON_COUNT 1350 /* 45 mins off */ -#else +//#define AUTO_OFF_COUNT 150 /* 5 mins on*/ +//#define AUTO_ON_COUNT 300 /* 10 mins off */ +//#define AUTO_OFF_COUNT 450 /* 15 mins on*/ +//#define AUTO_ON_COUNT 1350 /* 45 mins off */ +//#define AUTO_OFF_COUNT 600 /* 20 mins on*/ +//#define AUTO_ON_COUNT 1200 /* 40 mins off */ +//#define AUTO_OFF_COUNT 450 /* 2 hours on*/ +//#define AUTO_ON_COUNT 1350 /* 22 hours off */ #define AUTO_OFF_COUNT 9000U /* 5 hrs in 2 sec units */ #define AUTO_ON_COUNT 34200U /* 19 hrs in 2 sec units */ -#endif #define dbgpin_init() do { \ /* Set RA2 as output low */ \ RA2 = 0; \ @@ -61,11 +64,24 @@ #define dbgpin_low() (RA2 = 0) #define dbgpin_toggle() (RA2 = (LATA2 == 0) ? 1 : 0) +#define cfg_write(mode, color) do { \ + eeprom_write(CFG_MODE_ADDR, (mode)); \ + eeprom_write(CFG_COLOR_ADDR, (color)); \ + } while (0) + +#define cfg_read(mode, color) do { \ + unsigned char tmp; \ + tmp = eeprom_read(CFG_MODE_ADDR); \ + mode = (tmp < MODE_COUNT) ? tmp : MODE_SOLID; \ + tmp = eeprom_read(CFG_COLOR_ADDR); \ + color = (tmp < COLOR_COUNT) ? tmp : 0; \ + } while (0) + enum { /* Operating modes */ MODE_SOLID = 0, /* Cycle through colors[][] before next mode */ //MODE_CANDLE, - MODE_FADE, /* Auto cycle through colors */ + MODE_CYCLE, /* Auto cycle through colors */ MODE_PARTY, /* Random yet fast incolor and fade */ MODE_COUNT, @@ -79,16 +95,20 @@ enum { HELD_TMR_PERIODS = 1, /* Held timer fires every 32.768 msec */ HELD_PERIODS = 16, /* Held this long before held events fire */ COLOR_WHITE = 0, /* Color index for white */ - COLOR_COUNT = 19, + COLOR_COUNT = 11, BRIGHT_TOP = 100, /* Bright ramps up to top ... */ BRIGHT_BOTTOM = -5, /* ... then down to bottom */ BRIGHT_MAX = 85, /* Bright values are constrained for computations */ BRIGHT_MIN = 1, /* ... by min and max. */ BRIGHT_INIT = 42, /* later, get from eeprom */ STD_FADE = 16, /* Fade time in 32.768 ms units */ - STD_INCOLOR = 29491, /* Time in color when MODE_FADE, in 32.768 ms units */ + STD_INCOLOR = 29491, /* Time in color when MODE_CYCLE, in 32.768 ms units */ PARTY_MIN = 8, /* Min party fade and incolor units */ - PARTY_RANGE = 8, /* Party fade/incolor range (max = min+range) */ + PARTY_RANGE = 8, /* Party fade/incolor range mask for rand() */ + /* ... see start_fade() */ + CFG_MODE_ADDR = 0, /* EEPROM address of mode variable */ + CFG_COLOR_ADDR, /* EEPROM address of color variable */ + CFG_DELAY = 92, /* 3 seconds in 32.768 msec units */ }; typedef struct { @@ -97,27 +117,19 @@ typedef struct { signed char remainder; } led_t; -/* 18 available colors plus white, 2 bits per color, no white mix */ +/* Available colors, 6 bits per color (no values above 0x3f) */ const unsigned char colors[COLOR_COUNT][LED_COUNT] = { - { 3, 0, 0, 0 }, - { 3, 1, 0, 0 }, - { 3, 2, 0, 0 }, - { 3, 3, 0, 0 }, - { 2, 3, 0, 0 }, - { 1, 3, 0, 0 }, - { 0, 3, 0, 0 }, - { 0, 3, 1, 0 }, - { 0, 3, 2, 0 }, - { 0, 3, 3, 0 }, - { 0, 2, 3, 0 }, - { 0, 1, 3, 0 }, - { 0, 0, 3, 0 }, - { 1, 0, 3, 0 }, - { 2, 0, 3, 0 }, - { 3, 0, 3, 0 }, - { 3, 0, 2, 0 }, - { 3, 0, 1, 0 }, - { 3, 3, 3, 3 }, + { 0x28, 0x00, 0x00, 0x00 }, /* red */ + { 0x30, 0x20, 0x00, 0x00 }, /* orange */ + { 0x2c, 0x2c, 0x00, 0x00 }, /* yellow */ + { 0x20, 0x2c, 0x00, 0x00 }, /* yellow-green */ + { 0x00, 0x30, 0x00, 0x00 }, /* green */ + { 0x00, 0x30, 0x18, 0x00 }, /* green-cyan */ + { 0x00, 0x30, 0x28, 0x00 }, /* cyan */ + { 0x00, 0x18, 0x30, 0x00 }, /* cyan-blue */ + { 0x00, 0x00, 0x30, 0x00 }, /* blue */ + { 0x1c, 0x00, 0x30, 0x00 }, /* magenta */ + { 0x3f, 0x3f, 0x3f, 0x3f }, /* white */ }; unsigned char mode = MODE_SOLID; @@ -132,36 +144,22 @@ signed char bright = BRIGHT_INIT; bit bright_up; signed char pbHeldCount; -/* Return the constrained brightness level for use in computing RGB values */ -unsigned char bright_get() -{ - if (bright > BRIGHT_MAX) - return BRIGHT_MAX; - else if (bright < BRIGHT_MIN) - return BRIGHT_MIN; - else - return bright; -} - -/* RGB values will not illuminate the LED */ +/* Combine LED color value and brightness level to generate an RGB value */ unsigned char led_get(unsigned value) { - value = (value * bright_get()) >> 8; -#ifdef CEIL256 - if (value && value < 0x26) - return 0x26; -#else - if (value && value < 4) - return 4; -#endif - return value; + unsigned char tmp = bright; + + if (tmp > BRIGHT_MAX) + tmp = BRIGHT_MAX; + else if (tmp < BRIGHT_MIN) + tmp = BRIGHT_MIN; + return (value * tmp) >> 8; } /* Set the LEDs using both color and brightness values. */ void leds_set() { - rgb_set(led_get((red).value), - led_get((grn).value), led_get((blu).value), + rgb_set(led_get((red).value), led_get((grn).value), led_get((blu).value), led_get((wht).value)); } @@ -178,16 +176,16 @@ void start_fade() if (mode == MODE_PARTY) { color = rand() % COLOR_COUNT; fade_steps = PARTY_MIN + (rand() % PARTY_RANGE); - } else if (mode == MODE_FADE) { + } else if (mode == MODE_CYCLE) { if (++color == COLOR_COUNT) color = 0; } /* Retrieve the destination color */ - newr = colors[color][LED_RED] << 8; - newg = colors[color][LED_GRN] << 8; - newb = colors[color][LED_BLU] << 8; - neww = colors[color][LED_WHT] << 8; + newr = colors[color][LED_RED] << 4; + newg = colors[color][LED_GRN] << 4; + newb = colors[color][LED_BLU] << 4; + neww = colors[color][LED_WHT] << 4; /* Compute increment per fade step, and remainder, for each led */ red.increment = (newr - red.value) / fade_steps; @@ -216,6 +214,7 @@ void turnOn() void turnOff() { /* Event on to off, either by switch or auto-off timer */ + tmr_stop(TMR_CFG); tmr_stop(TMR_INCOLOR); tmr_stop(TMR_FADE); rgb_off(); @@ -228,6 +227,8 @@ void turnOff() void pb_clicked() { if (on) { + unsigned char omode = mode; + if (mode == MODE_SOLID) { if (++color == COLOR_COUNT) { color = 0; @@ -238,6 +239,8 @@ void pb_clicked() mode = 0; color = 0; } + if (mode != omode || mode == MODE_SOLID) + tmr_start(TMR_CFG, CFG_DELAY); start_fade(); } } @@ -324,7 +327,7 @@ void fade_task() blu.value += blu.remainder; wht.value += wht.remainder; tmr_stop(TMR_FADE); - if (mode == MODE_FADE) + if (mode == MODE_CYCLE) tmr_start(TMR_INCOLOR, STD_INCOLOR); else if (mode == MODE_PARTY) tmr_start(TMR_INCOLOR, PARTY_MIN + (rand() % PARTY_RANGE)); @@ -345,19 +348,11 @@ void auto_offon_task() } } -void config_read() -{ - /* Read configuration fields from eeprom, notably current mode and - * brightness level. - */ - /* FIXME: implement this */ -} - void user_boot() { dbgpin_high(); srand((adc_random() << 8) + adc_random()); - config_read(); + cfg_read(mode, color); rs_task(); } @@ -385,6 +380,9 @@ void user_tasks(unsigned char block) case TASK_TMR32: /* auto on/off event */ auto_offon_task(); break; + case TASK_CFG: /* Save config to EEPROM event */ + cfg_write(mode, color); + break; } } }