-static uint16_t pwm_vals[N_PWMLEDS*N_PWMLED_MODES];
-static uint16_t pwm_max[N_PWMLEDS] = { 0x70, 0x70, 0xF0 };
-static uint16_t adc_max[N_PWMLEDS] = { 0x70, 0x70, 0xF0 };
+typedef struct {
+ uint16_t target, pwm;
+ int16_t err_sum;
+ unsigned char mode, state, probe_steady;
+ uint16_t mode_pwm[N_PWMLED_MODES];
+ int16_t err_sums[N_PWMLED_MODES];
+} pwmled_t;
+
+pwmled_t pwmleds[N_PWMLEDS];
+
+#define PWMLED2_TESTING_WITH_350MA_LED
+
+#define SENSE_MOHM 33 /* 0.033 Ohm */
+#define MA_MOHM_GAIN_TO_ADC(ma, mohm, gain) (\
+ ((unsigned long)(ma))*(mohm) /* voltage at sensing resistor in uV */ \
+ /(1100000UL/gain/1024UL) /* voltage of ADC reading == 1 */ \
+)
+
+static uint16_t adc_max[N_PWMLEDS] = {
+ MA_MOHM_GAIN_TO_ADC( 400, SENSE_MOHM, 20),
+ MA_MOHM_GAIN_TO_ADC( 30, SENSE_MOHM, 20),
+#ifdef PWMLED2_TESTING_WITH_350MA_LED
+ MA_MOHM_GAIN_TO_ADC( 400, SENSE_MOHM, 1)
+#else
+ MA_MOHM_GAIN_TO_ADC(2500, SENSE_MOHM, 1)
+#endif
+};
+