#include "buttons.h"
#include "rgb.h"
-#define STEP_SIZE 64 /* ms */
-#define MIN_INCOLOR_STEPS 16
+#define STEP_SIZE 32 /* ms */
+#if 0
+#define MIN_INCOLOR_STEPS 320
#define MAX_INCOLOR_STEPS 57600
+#define MIN_FADE_STEPS 32
#define MAX_FADE_STEPS 480
-#define reset_steps() do { incolor_steps = 1; fade_steps = 0; } while (0)
-#define rand_u8() (rand() >> 7)
-#define rand_u16() (rand() << 8 + rand() >> 7)
-#if 1
-#define rand_incolor_steps() MIN_INCOLOR_STEPS * 2
-#define rand_fade_steps() 16
#else
+#define MIN_INCOLOR_STEPS 32
+#define MAX_INCOLOR_STEPS 160
+#define MIN_FADE_STEPS 32
+#define MAX_FADE_STEPS 160
+#endif
+#define reset_steps() do { incolor_steps = 1; fade_steps = 0; } while (0)
+#define rand_u8() (rand() & 0xff)
+#define rand_u16() ((rand() << 8) + (rand() & 0xff))
#define rand_incolor_steps() (MIN_INCOLOR_STEPS + rand_u16() % \
(MAX_INCOLOR_STEPS - MIN_INCOLOR_STEPS))
-#define rand_fade_steps() (1 + rand_u16() % MAX_FADE_STEPS)
-#endif
-#define leds_set(r,g,b,w) rgb_set((r).value >> 8, \
- (g).value >> 8, \
- (b).value >> 8, \
- (w).value >> 8)
+#define rand_fade_steps() (MIN_FADE_STEPS + rand() % \
+ (MAX_FADE_STEPS - MIN_FADE_STEPS))
+#define leds_set(r,g,b,w) rgb_set((r).value >> 7, \
+ (g).value >> 7, \
+ (b).value >> 7, 0)
+// (w).value >> 7)
typedef struct {
- unsigned value;
- unsigned increment;
- unsigned char remainder;
+ int value;
+ int increment;
+ int remainder;
} led_t;
#define INIT_LED { 0, 0, 0 }
led_t wht = INIT_LED;
unsigned char fast = 0;
unsigned incolor_steps;
- unsigned fade_steps;
+ int fade_steps;
pic_init();
buttons_init();
}
leds_set(red, grn, blu, wht);
} else if (--incolor_steps == 0) {
- unsigned newr, newg, newb, neww;
+ int newr, newg, newb, neww, tmp;
/* Next led color. All off is not a valid option. */
do {
- newr = rand() << 8;
- newg = rand() << 8;
- newb = rand() << 8;
- neww = rand() << 8;
+ /* RGB values are processed 15-bit values. This allows for
+ * signedness when fading to a lesser value. The actual PWM
+ * values are set from the most significant 8 bits, so
+ * leds_set() does >> 7.
+ */
+ newr = rand();
+ newg = rand();
+ newb = rand();
+ neww = rand();
} while (newr == 0 && newg == 0 && newb == 0 && neww == 0);
/* Next incolor and fade steps */
}
/* Compute increment and remainder for each led */
- red.increment = newr / fade_steps;
- red.remainder = newr - red.increment * fade_steps;
- grn.increment = newg / fade_steps;
- grn.remainder = newg - grn.increment * fade_steps;
- blu.increment = newb / fade_steps;
- blu.remainder = newb - blu.increment * fade_steps;
- wht.increment = neww / fade_steps;
- wht.remainder = neww - wht.increment * fade_steps;
+ red.increment = (newr - red.value) / fade_steps;
+ red.remainder = newr - (red.value + red.increment * fade_steps);
+ grn.increment = (newg - grn.value) / fade_steps;
+ grn.remainder = newg - (grn.value + grn.increment * fade_steps);
+ blu.increment = (newb - blu.value) / fade_steps;
+ blu.remainder = newb - (blu.value + blu.increment * fade_steps);
+ wht.increment = (neww - wht.value) / fade_steps;
+ wht.remainder = neww - (wht.value + wht.increment * fade_steps);
}
__delay_ms(STEP_SIZE); /* step should be start to start... */
} else {