From: R. Steve McKown Date: Tue, 6 Dec 2011 01:48:06 +0000 (-0700) Subject: Fix fading X-Git-Tag: 1.0~62 X-Git-Url: https://oss.titaniummirror.com/gitweb?p=rgblamp.git;a=commitdiff_plain;h=3f7701b78ad4ba8d930cbcf6b17f429290606c25 Fix fading --- diff --git a/main.c b/main.c index 71693c5..4086fec 100644 --- a/main.c +++ b/main.c @@ -12,30 +12,34 @@ #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 } @@ -47,7 +51,7 @@ int main(void) led_t wht = INIT_LED; unsigned char fast = 0; unsigned incolor_steps; - unsigned fade_steps; + int fade_steps; pic_init(); buttons_init(); @@ -84,14 +88,19 @@ int main(void) } 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 */ @@ -104,14 +113,14 @@ int main(void) } /* 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 {