#include <avr/io.h>
+#include <avr/eeprom.h>
#include "lights.h"
#define AMBIENT_VAL_SHIFT 2
static uint16_t ambient_val;
volatile unsigned char ambient_zone;
+static unsigned char ambient_min, ambient_max;
+
+/* logging */
+#define AMBIENT_LOG_SIZE 128
+static unsigned char ambient_log_offset_stored EEMEM;
+static unsigned char ambient_log_offset;
+static unsigned char ambient_log[AMBIENT_LOG_SIZE] EEMEM;
/* My photodiode reads 0x00C5 .. 0x033B */
typedef struct {
void init_ambient()
{
ambient_val = 0;
+ ambient_max = 0;
+ ambient_min = 0xFF;
ambient_zone = 1;
+
+ ambient_log_offset = eeprom_read_byte(&ambient_log_offset_stored);
+
+ if (ambient_log_offset == AMBIENT_LOG_SIZE)
+ ambient_log_offset = 0; // start over
+}
+
+void susp_ambient()
+{
+ unsigned char stored_offset;
+
+ ambient_log_min_max();
+
+ stored_offset = eeprom_read_byte(&ambient_log_offset_stored);
+ if (stored_offset != ambient_log_offset)
+ eeprom_write_byte(&ambient_log_offset_stored,
+ ambient_log_offset);
+}
+
+void ambient_log_min_max()
+{
+ if (ambient_log_offset >= AMBIENT_LOG_SIZE - 1)
+ return;
+
+ eeprom_write_byte(&ambient_log[ambient_log_offset++], ambient_min);
+ eeprom_write_byte(&ambient_log[ambient_log_offset++], ambient_max);
+
+ ambient_min = 0xFF;
+ ambient_max = 0;
}
void ambient_zone_changed()
void ambient_adc(uint16_t adcval)
{
unsigned char old_zone = ambient_zone;
+ unsigned char byte_val;
ambient_val += adcval - (ambient_val
>> (AMBIENT_VAL_SHIFT - AMBIENT_ADC_SHIFT));
while (ambient_zones[ambient_zone].hi < ambient_val)
ambient_zone++;
+ byte_val = adcval >> 2;
+
+ if (ambient_min > byte_val)
+ ambient_min = byte_val;
+
+ if (ambient_max < byte_val)
+ ambient_max = byte_val;
#if 0
if (old_zone != ambient_zone) {
log_byte(0xab);