#include #include #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 { uint16_t lo, hi; } ambient_zone_t; /* * Note: these have to be sorted, starting with 0, ending with 0xFFFF * and having small overlaps in order to provide a bit of hysteresis. */ static ambient_zone_t ambient_zones[] = { { 0x0000 , 0x0280<= 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() { #if 1 log_byte(0xab); log_byte(ambient_zone); log_word(ambient_val); log_flush(); #endif // led_set_pattern(N_PWMLEDS, status_led_pattern_select()); // led_set_pattern(N_PWMLEDS+1, illumination_led_pattern_select()); // pattern_reload(); } 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].lo > ambient_val) ambient_zone--; 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); log_byte(ambient_zone); log_word(adcval); log_flush(); } // ambient_zone_changed(); #endif }