From 713be444bff004385f2397856be48508628c746a Mon Sep 17 00:00:00 2001 From: "R. Steve McKown" Date: Sat, 17 Dec 2011 11:48:42 -0700 Subject: [PATCH] Push minimum PWM value mgmt into rgb module --- main.c | 29 ++++++++--------------------- rgb.h | 41 +++++++++++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/main.c b/main.c index 64cf2f1..a8f7324 100644 --- a/main.c +++ b/main.c @@ -144,29 +144,16 @@ signed char bright = BRIGHT_INIT; bit bright_up; signed char pbHeldCount; -/* Return the constrained brightness level for use in computing RGB values */ -unsigned char bright_get() -{ - if (bright > BRIGHT_MAX) - return BRIGHT_MAX; - else if (bright < BRIGHT_MIN) - return BRIGHT_MIN; - else - return bright; -} - -/* RGB values will not illuminate the LED */ +/* Combine LED color value and brightness level to generate an RGB value */ unsigned char led_get(unsigned value) { - value = (value * bright_get()) >> 8; -#ifdef CEIL256 - if (value && value < 0x26) - return 0x26; -#else - if (value && value < 4) - return 4; -#endif - return value; + unsigned char tmp = bright; + + if (tmp > BRIGHT_MAX) + tmp = BRIGHT_MAX; + else if (tmp < BRIGHT_MIN) + tmp = BRIGHT_MIN; + return (value * tmp) >> 8; } /* Set the LEDs using both color and brightness values. */ diff --git a/rgb.h b/rgb.h index b2149ed..7dc0da3 100644 --- a/rgb.h +++ b/rgb.h @@ -14,6 +14,8 @@ #define CEIL256 #undef CEIL32 +#define MIN_PWM 4 /* PWM settings below this value do not illuminate the LED */ + /* Initialize the RGB LED assembly. Outputs are zero, PWM is off. */ void rgb_init(); @@ -27,31 +29,46 @@ void rgb_off(); #ifdef CEIL256 extern const unsigned char pwm_table[]; #define rgb_set(red, grn, blu, wht) do { \ + unsigned char tmp; \ ndi(); /* FIXME: doesn't seem to fix flicker */ \ - CCPR3L = pwm_table[(red)]; \ - CCPR2L = pwm_table[(grn)]; \ - CCPR4L = pwm_table[(blu)]; \ - CCPR1L = pwm_table[(wht)]; \ + tmp = pwm_table[(red)]; \ + CCPR3L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ + tmp = pwm_table[(grn)]; \ + CCPR2L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ + tmp = pwm_table[(blu)]; \ + CCPR4L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ + tmp = pwm_table[(wht)]; \ + CCPR1L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ nei(); \ } while (0) #else #ifdef CEIL32 extern const unsigned char pwm_table[]; #define rgb_set(red, grn, blu, wht) do { \ + unsigned char tmp; \ ndi(); /* FIXME: doesn't seem to fix flicker */ \ - CCPR3L = pwm_table[(red) >> 3]; \ - CCPR2L = pwm_table[(grn) >> 3]; \ - CCPR4L = pwm_table[(blu) >> 3]; \ - CCPR1L = pwm_table[(wht) >> 3]; \ + tmp = pwm_table[(red)] >> 3; \ + CCPR3L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ + tmp = pwm_table[(grn)] >> 3; \ + CCPR2L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ + tmp = pwm_table[(blu)] >> 3; \ + CCPR4L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ + tmp = pwm_table[(wht)] >> 3; \ + CCPR1L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ nei(); \ } while (0) #else #define rgb_set(red, grn, blu, wht) do { \ + unsigned char tmp; \ ndi(); /* FIXME: doesn't seem to fix flicker */ \ - CCPR3L = (red); \ - CCPR2L = (grn); \ - CCPR4L = (blu); \ - CCPR1L = (wht); \ + tmp = (red); \ + CCPR3L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ + tmp = (grn); \ + CCPR2L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ + tmp = (blu); \ + CCPR4L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ + tmp = (wht); \ + CCPR1L = (tmp < MIN_PWM) ? MIN_PWM : tmp; \ nei(); \ } while (0) #endif -- 2.39.2