X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=heater.git;a=blobdiff_plain;f=firmware%2Fmain.c;h=a6cc1a8366350e69b728ace665e976479805a1ed;hp=0aa1c4abdfb3be3c77dece344f54abc84d24083b;hb=cba1b50d5359b6b983c179b6ff6a59aee39d5706;hpb=eb6bb04d1cccfdbb7a09fdfa670aaac1ba218ef5 diff --git a/firmware/main.c b/firmware/main.c index 0aa1c4a..a6cc1a8 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -21,21 +21,15 @@ * Buttons: * There are two buttons (+ and -). Any button can wake the system up from * the power-down state. - * TODO: When the system is woken up by the "-" button, - * it starts with the minimum output power, when it is woken up by the "+" - * button, it start with the maximum output power. * When running, the "-" button is used for decreasing the output power, * the "+" button is for increasing it. - * When on the lowest power state, the "-" button switches the system off. - * Long "-" button press switches the system off, long "+" button - * press sets the output power to maximum. + * Any long button press switches the system off. * * Status LED: * When powering up by a button press, the LED goes on to provide a visual * feedback, and is switched off after the button is released. - * After a button press, the # of blinks of the LED reflects the - * chosen output power level for some time. Afterwards, it displays - * the battery level. + * It displays the current power level and current battery voltage + * using # of blinks with different blinking lengths. * When the battery is completely exhausted, the output power is switched * off, the LED keeps blinking for some time, and then the whole system is * switched off to avoid deep discharge of the battery. @@ -59,6 +53,16 @@ #define WAKEUP_POLL 50 // msec #define WAKEUP_LIMIT 5 // times WAKEUP_POLL +// #define BUTTONS_REVERSE + +#ifdef BUTTONS_REVERSE +# define BUTTON1 PB0 +# define BUTTON2 PB1 +#else +# define BUTTON1 PB1 +# define BUTTON2 PB0 +#endif /* !BUTTONS_REVERSE */ + /* which state (output on or output off) are we measuring now */ static volatile unsigned char adc_type, adc_drop; #define ADC_RUNAVG_SHIFT 5 // running average shift on batt_on, batt_off @@ -107,9 +111,7 @@ static unsigned char power_levels[] = { #define N_POWER_LEVELS (sizeof(power_levels) / sizeof(power_levels[0])) static unsigned char power_level = 0; // selected power level -static unsigned char power_level_changed; // for visual feedback -#define LED_PWRCHANGE_COUNT 5 #define LED_BATTEMPTY_COUNT 60 /* timing by WDT */ @@ -267,9 +269,9 @@ static void buttons_susp() static unsigned char buttons_pressed() { return ( - (PINB & _BV(PB0) ? 0 : 1) + (PINB & _BV(BUTTON1) ? 0 : 1) | - (PINB & _BV(PB1) ? 0 : 2) + (PINB & _BV(BUTTON2) ? 0 : 2) ); } @@ -379,10 +381,18 @@ static unsigned char battery_level() static void status_led_next_pattern() { static unsigned char battery_exhausted; + static unsigned char display_power_level; - if (power_level_changed) { - power_level_changed--; + if (display_power_level) { n_blinks = power_level + 1; + if (batt_on >> 8 == batt_off >> 8) { // load unplugged + n_blinks = 2 * n_blinks; + blink_on_time = 0; + blink_off_time = 0; + } else { + blink_on_time = 2; + blink_off_time = 2; + } } else { unsigned char b_level = battery_level(); if (b_level) { @@ -395,11 +405,12 @@ static void status_led_next_pattern() } n_blinks = b_level + 1; + blink_on_time = 4; + blink_off_time = 0; } - blink_on_time = 2; - blink_off_time = 1; - blink_counter = 10; + blink_counter = 12; + display_power_level = !display_power_level; } static void timer_blink() @@ -422,23 +433,13 @@ static void timer_blink() static void button_pressed(unsigned char button, unsigned char long_press) { // ignore simlultaneous button 1 and 2 press - // Note: we set power_level_changed after each button press, - // even when the power is at maximum, to provide visual feedback - // with status LED. if (long_press) { - if (button == 1) { - power_down(); - return; - } else if (button == 2) { - power_level = N_POWER_LEVELS-1; - } + power_down(); + return; } else { // short press if (button == 1) { if (power_level > 0) { --power_level; - } else { - power_down(); - return; } } else if (button == 2) { if (power_level < N_POWER_LEVELS-1) { @@ -446,7 +447,6 @@ static void button_pressed(unsigned char button, unsigned char long_press) } } } - power_level_changed = LED_PWRCHANGE_COUNT; status_led_next_pattern(); } @@ -563,6 +563,10 @@ int main() log_byte(batt_on >> 8); #endif } + if (jiffies == 0) { + log_byte(batt_on >> 8); + log_byte(batt_off >> 8); + } log_flush(); } }