#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 9000U /* 5 hrs in 2 sec units */
-#define AUTO_ON_COUNT 34200U /* 19 hrs in 2 sec units */
-#endif
+//#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 */
#define dbgpin_init() do { \
/* Set RA2 as output low */ \
RA2 = 0; \
#define dbgpin_toggle() (RA2 = (LATA2 == 0) ? 1 : 0)
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_COUNT = 19,
- BRIGHT_TOP = 100,
- BRIGHT_BOTTOM = -5,
- BRIGHT_MAX = 85,
- BRIGHT_MIN = 1,
- BRIGHT_INIT = 42, /* later, get from eeprom */
-
- MODE_SOLID = 0,
+ /* Operating modes */
+ MODE_SOLID = 0, /* Cycle through colors[][] before next mode */
//MODE_CANDLE,
- MODE_FADE,
- MODE_PARTY,
+ MODE_FADE, /* Auto cycle through colors */
+ MODE_PARTY, /* Random yet fast incolor and fade */
MODE_COUNT,
+ /* Indexes in colors[][] for LEDs */
LED_RED = 0,
LED_GRN,
LED_BLU,
LED_WHT,
LED_COUNT,
+
+ 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 = 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 */
+ PARTY_MIN = 8, /* Min party fade and incolor units */
+ PARTY_RANGE = 8, /* Party fade/incolor range mask for rand() */
+ /* ... see start_fade() */
};
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 */
};
-const static int std_fade = 16;
-const static int std_incolor = 29491;
-const static int party_min = 8;
-const static int party_range = 8;
-
unsigned char mode = MODE_SOLID;
unsigned char color = COLOR_WHITE;
led_t red;
void start_fade()
{
/* RGB PWM values are 8 bits, but computations are done in 15
- * (leaving room for a sign bit), so leds_set() uses >>7 to convert
- * to PWM values.
- */
+ * (leaving room for a sign bit), so leds_set() uses >>7 to convert
+ * to PWM values.
+ */
int newr, newg, newb, neww;
/* Select the destination color and fade-to time depending upon mode. */
- fade_steps = std_fade;
+ fade_steps = STD_FADE;
if (mode == MODE_PARTY) {
color = rand() % COLOR_COUNT;
- fade_steps = party_min + (rand() % party_range);
+ fade_steps = PARTY_MIN + (rand() % PARTY_RANGE);
} else if (mode == MODE_FADE) {
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;
wht.value += wht.remainder;
tmr_stop(TMR_FADE);
if (mode == MODE_FADE)
- tmr_start(TMR_INCOLOR, std_incolor);
+ tmr_start(TMR_INCOLOR, STD_INCOLOR);
else if (mode == MODE_PARTY)
- tmr_start(TMR_INCOLOR, party_min + (rand() % party_range));
+ tmr_start(TMR_INCOLOR, PARTY_MIN + (rand() % PARTY_RANGE));
}
leds_set();
}
case TASK_BTN_RS: /* rocker switch state change */
rs_task();
break;
- case TASK_BTN_PB_HELD: /* pushbutton is being held down */
+ case TASK_BTN_PB_HELD: /* pushbutton is being held down */
pb_held_task();
break;
case TASK_FADE: /* fade timer has fired */