- if (led->mode) { // save the previous state
- led->mode_pwm[led->mode - 1] = led->pwm;
- led->err_sums[led->mode - 1] = led->err_sum;
- }
-
- led->mode = mode;
-
- if (mode > 0 && mode <= N_PWMLED_MODES) {
- led->target = adc_vals[n*N_PWMLED_MODES + mode - 1];
- led->state = ST_ON;
- led->pwm = led->mode_pwm[mode - 1];
- led->err_sum = led->err_sums[mode - 1];
- led->mode_changed = 1;
- pwm_set(led->pwm);
- } else {
- led->state = ST_OFF;
- pwm_off();
- }
-}
-
-#define PWMLED_PROBE_STEADY_COUNT 10
-
-static inline unsigned char pwmled_probed_ok(unsigned char n, uint16_t old_pwm)
-{
- pwmled_t *led = pwmleds + n;
-
- if (led->pwm == old_pwm) {
- if (led->probe_steady < PWMLED_PROBE_STEADY_COUNT)
- led->probe_steady++;
- } else {
- led->probe_steady = 0;
- }
-
- if (led->probe_steady < PWMLED_PROBE_STEADY_COUNT
- && old_pwm <= led->pwm)
- return 0;
-
- // probed OK
- led->mode_pwm[led->mode - 1] = led->pwm;
- led->err_sums[led->mode - 1] = 0;
-
- // next mode to probe?
- if (led->mode < N_PWMLED_MODES) {
- led->probe_steady = 0;
- led->err_sum = 0;
-
- led->mode++;
- led->target = adc_vals[n*N_PWMLED_MODES+led->mode-1];
-
- return 0;