#include #include "lights.h" static uint16_t ambient_val; volatile unsigned char ambient_zone; static unsigned char ambient_zone_set; static uint16_t ambient_zones[] = { 0x0c00, 0x0d00, 0x1000, 0x1800, 0x2800, 0x2f80, 0xffff }; #define N_AMBIENT_ZONES (sizeof(ambient_zones)/sizeof(ambient_zones[0])) void init_ambient() { ambient_val = 0; ambient_zone = 0; ambient_zone_set = 0; } void ambient_zone_changed() { log_byte(0xab); log_byte(ambient_zone); log_word(ambient_val); log_flush(); pattern_reload(); } void ambient_adc(uint16_t adcval) { unsigned char newzone; if (!ambient_zone_set) ambient_val = adcval << 4; else // running sum ambient_val += adcval - (ambient_val >> 4); newzone = 0; while (newzone < N_AMBIENT_ZONES-1 && ambient_zones[newzone] < ambient_val) newzone++; // TODO: implement hysteresis? if (!ambient_zone_set || newzone != ambient_zone) { ambient_zone = newzone; ambient_zone_set = 1; // ambient_zone_changed(); } }