X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=bike-lights.git;a=blobdiff_plain;f=firmware%2Fambient.c;h=72e13323a9d6124ba863a70a71dc676af916a876;hp=cbbef9e02a78d902ef606dad286ffa8cb90358da;hb=c30006aaf666f7cff3a6ab949c613c2f8cc6163b;hpb=f956c1fa7f47b0e8b8afe323c2eff1b6c2607c2a diff --git a/firmware/ambient.c b/firmware/ambient.c index cbbef9e..72e1332 100644 --- a/firmware/ambient.c +++ b/firmware/ambient.c @@ -2,47 +2,68 @@ #include "lights.h" +#define AMBIENT_VAL_SHIFT 2 static uint16_t ambient_val; volatile unsigned char ambient_zone; -static unsigned char ambient_zone_set; -static uint16_t ambient_zones[] = { - 0x10, 0x18, 0x20, 0x40, 0x100, 0x400, 0x1000, 0x4000, 0xffff +/* 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 , 0x0290<> 4); + ambient_val += adcval - (ambient_val + >> (AMBIENT_VAL_SHIFT - AMBIENT_ADC_SHIFT)); - newzone = 0; - while (newzone < N_AMBIENT_ZONES-1 - && ambient_zones[newzone] < ambient_val) - newzone++; + while (ambient_zones[ambient_zone].lo > ambient_val) + ambient_zone--; - if (!ambient_zone_set || newzone != ambient_zone) { - ambient_zone = newzone; - ambient_zone_set = 1; - // ambient_zone_changed(); + while (ambient_zones[ambient_zone].hi < ambient_val) + ambient_zone++; + +#if 0 + if (old_zone != ambient_zone) { + log_byte(0xab); + log_byte(ambient_zone); + log_word(adcval); + log_flush(); } + // ambient_zone_changed(); +#endif }