]> www.fi.muni.cz Git - bike-lights.git/commitdiff
ambient: log minima and maxima
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 20 May 2013 21:47:05 +0000 (23:47 +0200)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 20 May 2013 21:47:05 +0000 (23:47 +0200)
In order to be able to tune the ambient light sensor better, I made
it to log the minimum and maximum values read for every three minutes
or so. When the log buffer fills, start over only after the next
off/on cycle.

firmware/ambient.c
firmware/lights.h
firmware/main.c
firmware/tmr.c

index 72e13323a9d6124ba863a70a71dc676af916a876..548ff698571b989af6ebbc9395890c97c4418a29 100644 (file)
@@ -1,10 +1,18 @@
 #include <avr/io.h>
+#include <avr/eeprom.h>
 
 #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 {
@@ -26,7 +34,38 @@ static ambient_zone_t ambient_zones[] = {
 void init_ambient()
 {
        ambient_val = 0;
+       ambient_max = 0;
+       ambient_min = 0xFF;
        ambient_zone = 1;
+
+       ambient_log_offset = eeprom_read_byte(&ambient_log_offset_stored);
+
+       if (ambient_log_offset == AMBIENT_LOG_SIZE)
+               ambient_log_offset = 0; // start over
+}
+
+void susp_ambient()
+{
+       unsigned char stored_offset;
+
+       ambient_log_min_max();
+
+       stored_offset = eeprom_read_byte(&ambient_log_offset_stored);
+       if (stored_offset != ambient_log_offset)
+               eeprom_write_byte(&ambient_log_offset_stored,
+                       ambient_log_offset);
+}
+
+void ambient_log_min_max()
+{
+       if (ambient_log_offset >= 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()
@@ -46,6 +85,7 @@ void ambient_zone_changed()
 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));
@@ -56,6 +96,13 @@ void ambient_adc(uint16_t adcval)
        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);
index 772613ac513b34943450c4182a64302f545d5f6e..68515097e6d7be62dd7962cebbd95d4e4d704c8a 100644 (file)
@@ -61,6 +61,8 @@ void gpio_set(unsigned char n, unsigned char on);
 /* ambient.c */
 #define AMBIENT_ADC_SHIFT 0    /* 1 measurement per callback */
 void init_ambient();
+void susp_ambient();
+void ambient_log_min_max();
 extern volatile unsigned char ambient_zone;
 void ambient_adc(uint16_t adc_val);
 
index 90bea63dc60d300c3f3e6723d6f0718979167cbb..393f47dff68b6a475625983726a7a47cae3dcf6b 100644 (file)
@@ -32,6 +32,7 @@ static void hw_suspend()
        susp_adc();
        susp_tmr();
        susp_gpio();
+       susp_ambient();
        susp_buttons();
 
        wdt_disable();
index 23b70b68e316e372782a0d74be4883002fd564ea..d53981a6b8d1dccfcc1655993d2568988559ee87 100644 (file)
@@ -37,5 +37,8 @@ ISR(TIMER0_COMPA_vect)
                timer_start_slow_adcs();
                pattern_div = PATTERN_DIV;
        }
+
+       if ((jiffies & 0x7FFF) == 0)
+               ambient_log_min_max();
 }