X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=bike-lights.git;a=blobdiff_plain;f=firmware%2Fpwmled.c;h=30b10f1d307c0c501ac57fc49ff0e587b860ffdb;hp=bf376eea98aeb71357effc5e19ac9902eef351e0;hb=220d48069967aaae91c303f84b98f2bb36a51425;hpb=d7b30b8a6cd8a3de2207c5e6204f762611f17edb diff --git a/firmware/pwmled.c b/firmware/pwmled.c index bf376ee..30b10f1 100644 --- a/firmware/pwmled.c +++ b/firmware/pwmled.c @@ -56,10 +56,19 @@ static uint16_t adc_targets_1[] = { }; static uint16_t adc_targets_2[] = { - MA_GAIN_TO_ADC( 50, 1), - MA_GAIN_TO_ADC( 100, 1), - MA_GAIN_TO_ADC( 200, 1), - MA_GAIN_TO_ADC( 350, 1), +#ifdef TESTING_FW + MA_GAIN_TO_ADC( 120, 1), + MA_GAIN_TO_ADC( 160, 1), + MA_GAIN_TO_ADC( 240, 1), + MA_GAIN_TO_ADC( 320, 1), + MA_GAIN_TO_ADC( 460, 1), +#else + MA_GAIN_TO_ADC( 150, 1), + MA_GAIN_TO_ADC( 300, 1), + MA_GAIN_TO_ADC( 500, 1), + MA_GAIN_TO_ADC( 700, 1), + MA_GAIN_TO_ADC(1500, 1), +#endif }; static uint16_t adc_vals[N_PWMLEDS*N_PWMLED_MODES]; @@ -82,7 +91,7 @@ void init_pwmled() led->target = adc_vals[i*N_PWMLED_MODES]; led->mode = 1; led->probe_steady = 0; - led->state = ST_PROBING; + led->state = ST_OFF; led->pwm = 1; pwm_set(i, led->pwm); @@ -122,20 +131,32 @@ void pwmled_set_mode(unsigned char n, unsigned char mode) } } +#define CHECK_BRIGHTNESS(var, expr, array) \ + do { \ + (var) = (expr); \ + if ((var) >= sizeof(array)/sizeof(array[0])) \ + (var) = sizeof(array)/sizeof(array[0]) - 1; \ + } while (0) + void pwmled_set_brightness(uint16_t brightness) { unsigned char i; - adc_vals[0] = adc_targets_0[brightness & 0x7]; - adc_vals[1] = adc_targets_0[(brightness >> 3) & 0x7]; + CHECK_BRIGHTNESS(i, brightness & 0x7, adc_targets_0); + adc_vals[0] = adc_targets_0[i]; + CHECK_BRIGHTNESS(i, (brightness >> 3) & 0x7, adc_targets_0); + adc_vals[1] = adc_targets_0[i]; adc_vals[2] = adc_vals[1]; - adc_vals[3] = adc_targets_1[(brightness >> 6) & 0x7]; + CHECK_BRIGHTNESS(i, (brightness >> 6) & 0x7, adc_targets_1); + adc_vals[3] = adc_targets_1[i]; adc_vals[4] = adc_vals[3]; adc_vals[5] = adc_vals[3]; - adc_vals[6] = adc_targets_2[(brightness >> 9) & 0x7]; - adc_vals[7] = adc_targets_2[(brightness >> 12) & 0x7]; + CHECK_BRIGHTNESS(i, (brightness >> 9) & 0x7, adc_targets_2); + adc_vals[6] = adc_targets_2[i]; + CHECK_BRIGHTNESS(i, (brightness >> 12) & 0x7, adc_targets_2); + adc_vals[7] = adc_targets_2[i]; adc_vals[8] = adc_vals[7]; for (i = 0; i < N_PWMLEDS; i++) { @@ -204,6 +225,12 @@ static inline void pwmled_err(unsigned char n) log_byte(n); log_word(jiffies); log_flush(); + + switch (n) { + case 0: err_flags.err_pwmled0 = 1; break; + case 1: err_flags.err_pwmled1 = 1; break; + case 2: err_flags.err_pwmled2 = 1; break; + } } @@ -225,7 +252,8 @@ void pwmled_adc(unsigned char n, uint16_t adcval) old_pwm = led->pwm; - shift = led->state == ST_PROBING ? 3 : 8; + // shift = led->state == ST_PROBING ? 3 : 8; + shift = 3; sum = ((int32_t)led->pwm << shift) + led->err_sum + led->target - adcval;