X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=tinyboard.git;a=blobdiff_plain;f=projects%2Fstep-up%2Fcontrol.c;h=4ffb71cf631310b98de786e785b9e02dccf7092c;hp=c877c87ae82fc2482551cd9ab4211edbd88a76b7;hb=HEAD;hpb=8b54d4bdf1305a636d6c1d03e6a725061f47c612 diff --git a/projects/step-up/control.c b/projects/step-up/control.c index c877c87..4ffb71c 100644 --- a/projects/step-up/control.c +++ b/projects/step-up/control.c @@ -3,44 +3,106 @@ #include "lights.h" -static pattern_t on_pattern [] = { - { 1, 0x10 }, - PATTERN_END +static unsigned char on_pattern[] = { + /* 8 bits */ + 0b11111111, }; -static pattern_t blink_pattern[] = { - { 1, 0x1 }, - { 0, 0x2 }, - { 1, 0x1 }, - { 0, 0x8 }, - { 1, 0x1 }, - { 0, 0x8 }, - PATTERN_END +#define IVA + +static unsigned char blink_pattern[] = { +#ifdef IVA + /* ../...-/..-/.../-.-/.-// */ + /* 137 bits, 19.7% on */ + 0b10000100, + 0b00000000, + 0b10000100, + 0b00100001, + 0b11000000, + 0b00001000, + 0b01000011, + 0b10000000, + 0b00010000, + 0b10000100, + 0b00000000, + 0b11100001, + 0b00001110, + 0b00000000, + 0b01000011, + 0b10000000, + 0b00000000, + 0b00000000, +#else /* FILIP */ + /* ..-./../.-../../.--.// */ + /* 124 bits, 19.4% on */ + 0b10000100, + 0b00111000, + 0b01000000, + 0b00001000, + 0b01000000, + 0b00001000, + 0b01110000, + 0b10000100, + 0b00000000, + 0b10000100, + 0b00000000, + 0b10000111, + 0b00001110, + 0b00010000, + 0b00000000, + 0b00000000, +#endif }; -static pattern_t slow_pattern[] = { - { 1, 0x1 }, - { 0, 0x1F }, - PATTERN_END +static unsigned char slow_pattern[] = { + /* 24 bits */ + 0b00010000, + 0b00000000, + 0b00000000, }; -static unsigned char light_mode, shutdown_in_progress; +static unsigned char light_mode; +static union { + unsigned char errors; + struct { + unsigned char shutdown_in_progress : 1; + unsigned char pwmled_error : 1; + unsigned char battery_low : 1; + }; +} e; + +void set_error(unsigned char err) +{ + switch(err) { + case ERR_BATTERY: + e.battery_low = 1; + pwmled_set_target(0); + pattern_reload(); + break; + case ERR_PWMLED: + e.pwmled_error = 1; + break; + } +} void init_control() { light_mode = 1; - shutdown_in_progress = 0; + e.errors = 0; short_press(); } void long_press_start() { - shutdown_in_progress = 1; + e.shutdown_in_progress = 1; pattern_reload(); } void short_press() { + if (e.battery_low) + return; + if (++light_mode >= 2*N_PWMLED_MODES) light_mode = 0; @@ -52,30 +114,39 @@ void short_press() void long_press() { - shutdown_in_progress = 0; - pattern_reload(); + power_down(); } -pattern_t *pwmled_pattern_select() +void pwmled_pattern_select(unsigned char led) { - if (shutdown_in_progress) - return NULL; - - if (light_mode == 0) { - return slow_pattern; + if (e.shutdown_in_progress) { + led_set_pattern(led, 0, 0, NULL); + } else if (e.battery_low) { + led_set_pattern(led, 24, 0, slow_pattern); + } else if (light_mode == 0) { + led_set_pattern(led, 24, 0, slow_pattern); } else if (light_mode < N_PWMLED_MODES) { - return blink_pattern; +#ifdef IVA + led_set_pattern(led, 137, 0, blink_pattern); +#else /* FILIP */ + led_set_pattern(led, 124, 0, blink_pattern); +#endif } else { - return on_pattern; + led_set_pattern(led, 8, 0, on_pattern); } } -pattern_t *status_led_pattern_select() +void status_led_pattern_select(unsigned char led) { - if (shutdown_in_progress) - return on_pattern; - - return number_pattern(light_mode+1, 0); + if (e.shutdown_in_progress) { + led_set_pattern(led, 8, 0, on_pattern); + } else if (e.pwmled_error) { + led_set_number_pattern(led, 1, 1); + } else if (e.battery_low) { + led_set_number_pattern(led, 1, 1); + } else { + led_set_number_pattern(led, battery_gauge(), 0); + } } #if 0