5 #define AMBIENT_VAL_SHIFT 3
6 static uint16_t ambient_val;
7 volatile unsigned char ambient_zone;
9 /* My photodiode reads 0x00C5 .. 0x033B */
15 * Note: these have to be sorted, starting with 0, ending with 0xFFFF
16 * and having small overlaps in order to provide a bit of hysteresis.
18 static ambient_zone_t ambient_zones[] = {
19 { 0x0000 , 0x0290<<AMBIENT_VAL_SHIFT }, // dark
20 { 0x0280<<AMBIENT_VAL_SHIFT, 0x0300<<AMBIENT_VAL_SHIFT }, // evening
21 { 0x02f8<<AMBIENT_VAL_SHIFT, 0x0320<<AMBIENT_VAL_SHIFT }, // dawn
22 { 0x0318<<AMBIENT_VAL_SHIFT, 0xffff }, // day
24 #define N_AMBIENT_ZONES (sizeof(ambient_zones)/sizeof(ambient_zones[0]))
32 void ambient_zone_changed()
36 log_byte(ambient_zone);
37 log_word(ambient_val);
41 // led_set_pattern(N_PWMLEDS, status_led_pattern_select());
42 // led_set_pattern(N_PWMLEDS+1, illumination_led_pattern_select());
46 void ambient_adc(uint16_t adcval)
48 unsigned char old_zone = ambient_zone;
50 ambient_val += adcval - (ambient_val
51 >> (AMBIENT_VAL_SHIFT - AMBIENT_ADC_SHIFT));
53 while (ambient_zones[ambient_zone].lo > ambient_val)
56 while (ambient_zones[ambient_zone].hi < ambient_val)
60 if (old_zone != ambient_zone) {
62 log_byte(ambient_zone);
66 // ambient_zone_changed();