X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=firmware%2Fambient.c;h=aca12577fd1f4876549232b817e48eda534360f4;hb=5c760c1a89dc3692c8db2aeecd80b9d4421c3c35;hp=4f257aea87df0519e7d4105038e78f977dd27a8c;hpb=0c709eb622df773b492a881a12f569cea7926fdc;p=bike-lights.git diff --git a/firmware/ambient.c b/firmware/ambient.c index 4f257ae..aca1257 100644 --- a/firmware/ambient.c +++ b/firmware/ambient.c @@ -4,9 +4,9 @@ #include "lights.h" #define AMBIENT_VAL_SHIFT 2 -static uint16_t ambient_val; +static uint16_t ambient_val, ambient_val16; volatile unsigned char ambient_zone; -static unsigned char ambient_min, ambient_max; +static unsigned char ambient_min, ambient_max, ambient_16drop; /* logging */ #define AMBIENT_LOG_SIZE 128 @@ -23,20 +23,21 @@ typedef struct { * 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_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() +static inline 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(); + pwmled_select_brightness(); + pattern_reload(); } void ambient_adc(uint16_t adcval) { unsigned char old_zone = ambient_zone; - unsigned char byte_val; + unsigned char byte_val, byte_val16; ambient_val += adcval - (ambient_val >> (AMBIENT_VAL_SHIFT - AMBIENT_ADC_SHIFT)); @@ -96,21 +91,35 @@ void ambient_adc(uint16_t adcval) while (ambient_zones[ambient_zone].hi < ambient_val) ambient_zone++; - byte_val = adcval >> 2; + 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 + + // user_param ambient zone override + if ((byte_val = get_user_param(0)) > 0) + ambient_zone = byte_val - 1; + if (old_zone != ambient_zone) { +#if 0 log_byte(0xab); log_byte(ambient_zone); log_word(adcval); log_flush(); - } - // ambient_zone_changed(); #endif + ambient_zone_changed(); + } }