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=b8397532026fed989d06ff6454974be46e043850;hp=ab28a20faf1ce95719cdd8ff4386ef9b90790af2;hb=1dcbf67055a7a51031a57db46d899ade790b2d30;hpb=acd7fc45b8751444605da3c464e49ab16148e9c1 diff --git a/firmware/ambient.c b/firmware/ambient.c index ab28a20..b839753 100644 --- a/firmware/ambient.c +++ b/firmware/ambient.c @@ -1,48 +1,129 @@ #include +#include #include "lights.h" -static uint16_t ambient_val; +#define AMBIENT_VAL_SHIFT 2 +static uint16_t ambient_val, ambient_val16; volatile unsigned char ambient_zone; -static unsigned char ambient_zone_set; +static unsigned char ambient_min, ambient_max, ambient_16drop; -static uint16_t ambient_zones[] = { - 0x60, 0x68, 0x70, 0xa0, 0x100, 0x1c0, 0x270, 0x290, 0xffff +/* 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); + eeprom_write_byte(&ambient_log[ambient_log_offset++], ambient_16drop); + + ambient_min = 0xFF; + ambient_max = 0; + ambient_16drop = 0; } void ambient_zone_changed() { - log_byte(0xCC); +#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 newzone; + unsigned char old_zone = ambient_zone; + unsigned char byte_val, byte_val16; - if (!ambient_zone_set) - ambient_val = adcval << 4; - else // running sum - ambient_val += adcval - (ambient_val >> 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++; + + byte_val = ambient_val >> (2 + AMBIENT_VAL_SHIFT - AMBIENT_ADC_SHIFT); + + ambient_val16 += byte_val - (ambient_val16 >> 4); + byte_val16 = ambient_val16 >> 4; + + if (byte_val16 > byte_val) { + byte_val16 -= byte_val; + if (byte_val16 > ambient_16drop) + ambient_16drop = byte_val16; } + + 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 }