-void pwmled_adc(unsigned char n, uint16_t adcval)
-{
- unsigned char i, probing;
- switch (pwmled_state[n]) {
- case ST_PROBING:
- probing_adc(n, adcval);
-
-#if 1
- probing = 0;
- for (i = 0; i < N_PWMLEDS; i++)
- if (pwmled_state[i] == ST_PROBING)
- probing = 1;
-
- if (!probing) {
- for (i = 0; i < N_PWMLEDS; i++)
- log_byte(pwmled_state[i]);
-
- for (i = 0; i < N_PWMLEDS*N_PWMLED_MODES; i++)
- log_word(pwm_vals[i]);
- log_flush();
- log_set_state(4);
- }
-#endif
-
- return;
- case ST_ON:
- on_adc(n, adcval);
+ sum = ((int32_t)led->pwm << shift)
+ + led->err_sum + led->target - adcval;
+
+ if (sum < 0)
+ sum = 0;
+
+ led->pwm = sum >> shift;
+ sum -= led->pwm << shift;
+ led->err_sum = sum;
+
+ if (led->pwm >= PWM_MAX) {
+ pwmled_err(n);