5 static unsigned char pwm_vals[N_PWMLEDS*N_PWMLED_MODES];
6 static unsigned char adc_vals[N_PWMLEDS*N_PWMLED_MODES] = {
8 0x04, 0x14, 0x24, 0x38,
10 0x04, 0x14, 0x24, 0x38,
12 0x04, 0x14, 0x24, 0x38,
15 static unsigned char pwmled_state[N_PWMLEDS];
21 static unsigned char pwmled_mode[N_PWMLEDS];
23 static unsigned char pwm_probes[N_PWMLEDS];
25 static void start_probing(unsigned char n)
27 pwmled_state[n] = ST_PROBING;
37 for (i = 0; i < N_PWMLEDS*N_PWMLED_MODES; i++)
40 for (i = 0; i < N_PWMLEDS; i++) {
45 unsigned char pwmled_is_on(unsigned char n)
47 unsigned char st = pwmled_state[n];
48 if (st == ST_PROBING || st == ST_ON)
54 static void inline probing_adc(unsigned char n, uint16_t adcval)
56 unsigned char need_bigger = 0, i;
57 unsigned char *pwm_p = &pwm_vals[n*N_PWMLED_MODES];
58 unsigned char *adc_p = &adc_vals[n*N_PWMLED_MODES];
59 unsigned char pwm = pwm_probes[n];
68 if (pwm == 0 && adcval > 0) { // non-zero voltage with zero PWM?
69 pwmled_state[n] = ST_DISABLED;
77 for (i = 0; i < N_PWMLED_MODES; i++, pwm_p++, adc_p++) {
78 uint16_t adc = *adc_p;
86 if ((n == 1 && pwm > 0x35) || adcval != 0) {
94 if (!need_bigger) { // successfully probed
97 pwmled_state[n] = ST_OFF;
104 if (pwm >= 0x60) { // over the maximum!
105 pwmled_state[n] = ST_DISABLED;
120 static void inline on_adc(unsigned char n, uint16_t adcval)
123 uint16_t new_pwm = led_modes[led_mode].pwmval;
124 uint16_t old_pwm = new_pwm;
125 uint16_t adc_exp = led_modes[led_mode].expected;
127 log_word(((adcval & 0xFF) << 8) | old_pwm);
129 if (2*adcval > 5*adc_exp) { // >2.5x expected, lower significantly
130 new_pwm = 2*old_pwm/3;
131 } else if (3*adcval > 4*adc_exp) { // >1.33x expected, lower a bit
132 new_pwm = old_pwm - 1;
133 } else if (4*adcval < 3*adc_exp) { // 0.75x expected, raise a bit
134 new_pwm = old_pwm + 1;
137 if (new_pwm > 0x60) { // odpojeno?
140 if (new_pwm < 2) { // zkrat?
145 if (new_pwm != old_pwm) {
146 led_modes[led_mode].pwmval = new_pwm;
149 // ADCSRA |= _BV(ADSC);
153 void pwmled_adc(unsigned char n, uint16_t adcval)
155 unsigned char i, probing;
156 switch (pwmled_state[n]) {
158 probing_adc(n, adcval);
161 for (i = 0; i < N_PWMLEDS; i++)
162 if (pwmled_state[i] == ST_PROBING)
166 for (i = 0; i < N_PWMLEDS; i++)
167 log_byte(pwmled_state[i]);
169 for (i = 0; i < N_PWMLEDS*N_PWMLED_MODES; i++)
170 log_byte(pwm_vals[i]);
178 // WTF am I doing in this function then?