#include "rgb.h"
#include "timer.h"
+#define AUTO_OFF_COUNT 549316UL /* 5 hrs in 32.768 ms units */
#define reset_steps() do { incolor_steps = 1; fade_steps = 0; } \
while (0)
#define rand_u8() (rand() & 0xff)
(b).value >> 7, \
0)
+#define dbgpin_init() \
+do { \
+ /* Set RA2 as output low */ \
+ PORTA &= ~0x04; \
+ TRISA &= ~0x04; \
+} while (0)
+
+#define dbgpin_high() PORTA |= 0x04;
+#define dbgpin_low() PORTA &= ~0x04;
+
typedef struct {
int value;
int increment;
const static int range_fade_steps[4] = { 1, 1, 1, 1 };
#endif
-#define dbgpin_init() \
-do { \
- /* Set RA2 as output low */ \
- PORTA &= ~0x04; \
- TRISA &= ~0x04; \
-} while (0)
-
-#define dbgpin_high() PORTA |= 0x04;
-#define dbgpin_low() PORTA &= ~0x04;
-
int main(void)
{
led_t red = INIT_LED;
unsigned char speed = 0;
unsigned incolor_steps;
int fade_steps;
+ unsigned long auto_off = 0;
+
pic_init();
unused_init();
while (1) {
unsigned char buttons = buttons_read();
- if ((buttons & (IN_ROCKERA | IN_ROCKERB))) {
+ if ((buttons & IN_ROCKERB) && auto_off == 0)
+ auto_off = AUTO_OFF_COUNT;
+
+ if (((buttons & IN_ROCKERB) && auto_off && --auto_off == 0) ||
+ (!(buttons & (IN_ROCKERA | IN_ROCKERB)))) {
+ /* Sleep when auto-off time has expired or if rocker switch is
+ * turned off.
+ */
+ rgb_off();
+ dbgpin_low();
+ auto_off = 0;
+ buttons_sleep();
+ dbgpin_high();
+ reset_steps();
+ rgb_on();
+ red.value = 0;
+ grn.value = 0;
+ blu.value = 0;
+ wht.value = 0;
+ } else {
/* Crappy way to detect rising edges to change state of speed var */
- if (!(speed & 4) && (buttons & IN_PUSHBTN)) {
+ if (!(speed & 4) && (buttons & IN_PUSHBTN))
speed |= 4;
- } else if ((speed & 4) && !(buttons & IN_PUSHBTN)) {
+ else if ((speed & 4) && !(buttons & IN_PUSHBTN)) {
speed = (speed + 1) & ~4;
reset_steps();
}
dbgpin_low();
timer_owait(); /* wait 32 ms since last return from last call() */
dbgpin_high();
- } else {
- rgb_off();
- dbgpin_low();
- buttons_sleep();
- dbgpin_high();
- reset_steps();
- rgb_on();
- red.value = 0;
- grn.value = 0;
- blu.value = 0;
- wht.value = 0;
}
}
return 0;