2 #include <avr/eeprom.h>
6 #define AMBIENT_VAL_SHIFT 2
7 static uint16_t ambient_val;
8 volatile unsigned char ambient_zone;
9 static unsigned char ambient_min, ambient_max;
12 #define AMBIENT_LOG_SIZE 128
13 static unsigned char ambient_log_offset_stored EEMEM;
14 static unsigned char ambient_log_offset;
15 static unsigned char ambient_log[AMBIENT_LOG_SIZE] EEMEM;
17 /* My photodiode reads 0x00C5 .. 0x033B */
23 * Note: these have to be sorted, starting with 0, ending with 0xFFFF
24 * and having small overlaps in order to provide a bit of hysteresis.
26 static ambient_zone_t ambient_zones[] = {
27 { 0x0000 , 0x0280<<AMBIENT_VAL_SHIFT }, // dark
28 { 0x0270<<AMBIENT_VAL_SHIFT, 0x02f0<<AMBIENT_VAL_SHIFT }, // evening
29 { 0x02e8<<AMBIENT_VAL_SHIFT, 0x030a<<AMBIENT_VAL_SHIFT }, // dawn
30 { 0x0308<<AMBIENT_VAL_SHIFT, 0xffff }, // day
32 #define N_AMBIENT_ZONES (sizeof(ambient_zones)/sizeof(ambient_zones[0]))
41 ambient_log_offset = eeprom_read_byte(&ambient_log_offset_stored);
43 if (ambient_log_offset == AMBIENT_LOG_SIZE)
44 ambient_log_offset = 0; // start over
49 unsigned char stored_offset;
51 ambient_log_min_max();
53 stored_offset = eeprom_read_byte(&ambient_log_offset_stored);
54 if (stored_offset != ambient_log_offset)
55 eeprom_write_byte(&ambient_log_offset_stored,
59 void ambient_log_min_max()
61 if (ambient_log_offset >= AMBIENT_LOG_SIZE - 1)
64 eeprom_write_byte(&ambient_log[ambient_log_offset++], ambient_min);
65 eeprom_write_byte(&ambient_log[ambient_log_offset++], ambient_max);
71 void ambient_zone_changed()
75 log_byte(ambient_zone);
76 log_word(ambient_val);
80 // led_set_pattern(N_PWMLEDS, status_led_pattern_select());
81 // led_set_pattern(N_PWMLEDS+1, illumination_led_pattern_select());
85 void ambient_adc(uint16_t adcval)
87 unsigned char old_zone = ambient_zone;
88 unsigned char byte_val;
90 ambient_val += adcval - (ambient_val
91 >> (AMBIENT_VAL_SHIFT - AMBIENT_ADC_SHIFT));
93 while (ambient_zones[ambient_zone].lo > ambient_val)
96 while (ambient_zones[ambient_zone].hi < ambient_val)
99 byte_val = adcval >> 2;
101 if (ambient_min > byte_val)
102 ambient_min = byte_val;
104 if (ambient_max < byte_val)
105 ambient_max = byte_val;
107 if (old_zone != ambient_zone) {
109 log_byte(ambient_zone);
113 // ambient_zone_changed();