]> oss.titaniummirror.com Git - rgblamp.git/blobdiff - main.c
Set up 10 fine-tuned colors, plus white
[rgblamp.git] / main.c
diff --git a/main.c b/main.c
index c258972d20e9717696c8df660d9aa42fe502fef0..aefd4349172fe20f8ac0c1abee8b74ed3895ced8 100644 (file)
--- a/main.c
+++ b/main.c
 #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 {
@@ -91,34 +98,21 @@ 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;
@@ -167,26 +161,26 @@ void leds_set()
 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;
@@ -324,9 +318,9 @@ void fade_task()
     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();
 }
@@ -372,7 +366,7 @@ void user_tasks(unsigned char block)
       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 */