From 01622b0a4b554fc6b1def7e502ca2c71086e91bc Mon Sep 17 00:00:00 2001 From: "R. Steve McKown" Date: Mon, 5 Dec 2011 17:09:22 -0700 Subject: [PATCH] fade is working --- main.c | 123 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 45 deletions(-) diff --git a/main.c b/main.c index 4d11ee3..71693c5 100644 --- a/main.c +++ b/main.c @@ -12,23 +12,47 @@ #include "buttons.h" #include "rgb.h" -#define random_rgb() rand() /* ~ (0...255) << 7 */ -#define random_time() (rand() >> 7) /* 0...255 */ -#define min_incolor_time() 100 -#define min_fade_time() 100 +#define STEP_SIZE 64 /* ms */ +#define MIN_INCOLOR_STEPS 16 +#define MAX_INCOLOR_STEPS 57600 +#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 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) + +typedef struct { + unsigned value; + unsigned increment; + unsigned char remainder; +} led_t; +#define INIT_LED { 0, 0, 0 } int main(void) { - int red = 0, grn = 0, blu = 0; //, wht = 0; - int fadestep_red, fadestep_grn, fadestep_blu; //, fadestep_wht; - unsigned incolor_time = 0; - unsigned fade_time = 0; + led_t red = INIT_LED; + led_t grn = INIT_LED; + led_t blu = INIT_LED; + led_t wht = INIT_LED; unsigned char fast = 0; + unsigned incolor_steps; + unsigned fade_steps; pic_init(); buttons_init(); rgb_init(); - srand(27); + reset_steps(); if (buttons_on()) rgb_on(); @@ -40,56 +64,65 @@ int main(void) if (buttons & IN_PUSHBTN) { if (!fast) { fast = 1; - incolor_time = 0; - fade_time = 0; + reset_steps(); } else fast = 0; } - if (fade_time) { - red += fadestep_red; - grn += fadestep_grn; - blu += fadestep_blu; - //wht += fadestep_wht; - rgb_set(red >> 7, grn >> 7, blu >> 7, 0); // wht >> 7); - fade_time--; - } else if (incolor_time) - incolor_time--; - else /* fade_time == 0 && incolor_time == 0 */ { - int newr, newg, newb, neww; - - /* Determine next color state */ - newr = random_rgb(); - newg = random_rgb(); - newb = random_rgb(); - //neww = random_rgb(); - - /* Calculate new incolor_time and fade_time */ - if (buttons & IN_ROCKERA) { - incolor_time = 1 + random_time(); - fade_time = 1; - } else /* (buttons & IN_ROCKERB) */ { - incolor_time = min_incolor_time() + random_time() / 2; - fade_time = min_fade_time() + random_time() / 2; + if (fade_steps) { + fade_steps--; + /* Continue the in-progress fade */ + red.value += red.increment; + grn.value += grn.increment; + blu.value += blu.increment; + wht.value += wht.increment; + if (fade_steps == 0) { + red.value += red.remainder; + grn.value += grn.remainder; + blu.value += blu.remainder; + wht.value += wht.remainder; } + leds_set(red, grn, blu, wht); + } else if (--incolor_steps == 0) { + unsigned newr, newg, newb, neww; + + /* Next led color. All off is not a valid option. */ + do { + newr = rand() << 8; + newg = rand() << 8; + newb = rand() << 8; + neww = rand() << 8; + } while (newr == 0 && newg == 0 && newb == 0 && neww == 0); + /* Next incolor and fade steps */ + incolor_steps = rand_incolor_steps(); + fade_steps = (buttons & IN_ROCKERA) ? 1 : rand_fade_steps(); if (fast) { - incolor_time = 1 + incolor_time / 8; - fade_time = 1 + fade_time / 8; + incolor_steps = 1 + incolor_steps / 8; + if (buttons & IN_ROCKERB) + fade_steps = 1 + fade_steps / 8; } - fadestep_red = (newr - red) / fade_time; - fadestep_grn = (newg - red) / fade_time; - fadestep_blu = (newb - red) / fade_time; - //fadestep_wht = (neww - red) / fade_time; + /* 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; } - __delay_ms(50); + __delay_ms(STEP_SIZE); /* step should be start to start... */ } else { rgb_off(); buttons_sleep(); - incolor_time = 0; - fade_time = 0; + reset_steps(); rgb_on(); + red.value = 0; + grn.value = 0; + blu.value = 0; + wht.value = 0; } } return 0; -- 2.39.2