]> www.fi.muni.cz Git - bike-lights.git/blobdiff - firmware/pwmled.c
firmware: emulate higher resolution of PWM
[bike-lights.git] / firmware / pwmled.c
index b76f219fb32b1c597358832f333be26c621d50f4..d5d947be2d011a396353b11cc7f88f93824a5ae9 100644 (file)
@@ -4,9 +4,9 @@
 
 static uint16_t pwm_vals[N_PWMLEDS*N_PWMLED_MODES];
 static uint16_t pwm_max[N_PWMLEDS] = {
-       PWM_MAX/2,
+       2*PWM_MAX/3,
        PWM_MAX - (PWM_MAX >> 4), // step-up
-       PWM_MAX/2
+       2*PWM_MAX/3
 };
 
 #define PWMLED2_TESTING_WITH_350MA_LED
@@ -86,15 +86,6 @@ void pwmled_init()
        }
 }
 
-unsigned char pwmled_needs_adc(unsigned char n)
-{
-       unsigned char st = pwmled_state[n];
-       if (st == ST_PROBING || st == ST_ON)
-               return 1;
-       else
-               return 0;
-}
-
 unsigned char pwmled_enabled(unsigned char n)
 {
        unsigned char st = pwmled_state[n];
@@ -146,7 +137,7 @@ static void inline probing_adc(unsigned char n, uint16_t adcval)
 #endif
 
        if (adcval > adc_max[n] // Too high
-               || (pwm == 0 && adcval > 0) // non-zero voltage with zero PWM
+               || (pwm == 0 && adcval > 2) // non-zero voltage with zero PWM
                ) {
                pwm_off(n);
                pwmled_state[n] = ST_DISABLED;
@@ -239,7 +230,14 @@ static void inline on_adc(unsigned char n, uint16_t adcval)
 
        if (new_pwm > (int16_t)pwm_max[n]) {
                // FIXME: disconnected?
-               new_pwm = pwm_max[n];
+               log_byte(0xE1);
+               log_byte(n);
+               log_word(new_pwm);
+               log_word(adcval);
+               log_word(jiffies);
+               pwmled_state[n] = ST_DISABLED;
+               pwm_off(n);
+               return;
        }
 
        if (new_pwm < 1) {
@@ -270,6 +268,8 @@ void pwmled_adc(unsigned char n, uint16_t adcval)
                                probing = 1;
 
                if (!probing) {
+                       log_word(0x5555);
+                       log_word(jiffies);
                        for (i = 0; i < N_PWMLEDS; i++)
                                log_byte(pwmled_state[i]);
                                
@@ -277,6 +277,8 @@ void pwmled_adc(unsigned char n, uint16_t adcval)
                                log_word(pwm_vals[i]);
                        log_flush();
                        log_set_state(4);
+                       for (i = 0; i < N_PWMLEDS; i++)
+                               led_set_pattern(i, mode1_pattern);
                }
 #endif