X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=bike-lights.git;a=blobdiff_plain;f=firmware%2Fcontrol.c;h=73f5e8ee02ee5ce7ce9ad5da593274dbdbc7f6b6;hp=3012ba65856aaa02d9e2939ace37ed2463863da0;hb=3e13c7f4abd65b939c1645d77cf6ed5e0124808e;hpb=94524330d5709845fe0bbe8562fd68deedcb818c diff --git a/firmware/control.c b/firmware/control.c index 3012ba6..73f5e8e 100644 --- a/firmware/control.c +++ b/firmware/control.c @@ -50,12 +50,12 @@ static pattern_t fast_pattern[] = { }; static pattern_t night_pattern[] = { - { PWM_PAT(2, 0, 2), D_3 }, - { PWM_PAT(3, 0, 0), D_8 }, - { PWM_PAT(2, 0, 2), D_1 }, - { PWM_PAT(3, 0, 0), D_2 }, - { PWM_PAT(2, 0, 2), D_1 }, - { PWM_PAT(3, 0, 0), D_8 }, + { PWM_PAT(3, 0, 1), D_3 }, + { PWM_PAT(2, 0, 0), D_8 }, + { PWM_PAT(3, 0, 1), D_1 }, + { PWM_PAT(2, 0, 0), D_2 }, + { PWM_PAT(3, 0, 1), D_1 }, + { PWM_PAT(2, 0, 0), D_8 }, PATTERN_END }; @@ -75,21 +75,24 @@ pattern_t test_pattern[] = { }; #endif -volatile unsigned char braking; +volatile err_flags_t err_flags; static unsigned char dim_mode, towbar_mode; void init_control() { dim_mode = 0; towbar_mode = 0; - braking = 0; + err_flags.any_flag = 0; +#ifdef notyet + err_flags.booting = 1; +#endif pwmled_select_brightness(); } void brake_on() { - braking = 1; + err_flags.braking = 1; gpio_set(0, 1); led_set_pattern(N_STATUS_LED, status_led_pattern_select()); pwmleds_update_mode(); @@ -97,7 +100,7 @@ void brake_on() void brake_off() { - braking = 0; + err_flags.braking = 0; gpio_set(0, 0); led_set_pattern(N_STATUS_LED, status_led_pattern_select()); pwmleds_update_mode(); @@ -112,8 +115,21 @@ void toggle_dim_mode() void set_panic_mode() { - led_set_pattern(0, panic_pattern); - led_set_pattern(N_ILLUM_LED, panic_pattern); + // if error, clean it up + if (err_flags.booting) + err_flags.booting = 0; + else if (err_flags.err_pwmled2) + err_flags.err_pwmled2 = 0; + else if (err_flags.err_pwmled1) + err_flags.err_pwmled1 = 0; + else if (err_flags.err_pwmled0) + err_flags.err_pwmled0 = 0; + else if (err_flags.err_battery) + err_flags.err_battery = 0; + else { + led_set_pattern(0, panic_pattern); + led_set_pattern(N_ILLUM_LED, panic_pattern); + } } pattern_t *pwmled_pattern_select() @@ -121,9 +137,12 @@ pattern_t *pwmled_pattern_select() #ifdef TEST_PATTERN return tmp_pattern; #endif - if (battery_critical) + if (err_flags.err_battery) return slow_pattern; + if (ambient_shadow) + return night_pattern; + switch (ambient_zone) { case 0: return night_pattern; case 1: @@ -136,7 +155,22 @@ pattern_t *pwmled_pattern_select() pattern_t *status_led_pattern_select() { - if (braking) + if (err_flags.booting) + return number_pattern(1, 1); + + if (err_flags.err_pwmled2) + return number_pattern(5, 1); + + if (err_flags.err_pwmled1) + return number_pattern(4, 1); + + if (err_flags.err_pwmled0) + return number_pattern(3, 1); + + if (err_flags.err_battery) + return number_pattern(2, 1); + + if (err_flags.braking) return on_pattern; if (buttons_setup_in_progress()) @@ -148,9 +182,15 @@ pattern_t *status_led_pattern_select() pattern_t *illumination_led_pattern_select() { - if (battery_critical) + if (buttons_setup_in_progress()) + return buttons_setup_status1_pattern_select(); + + if (err_flags.err_battery) return NULL; + if (ambient_shadow) + return on_pattern; + switch (ambient_zone) { case 0: return dim_mode ? number_pattern(1, 1) @@ -180,9 +220,14 @@ void pwmled_select_brightness() { uint16_t brightness = PWMLED_BRIGHTNESS(0, 2, 1, 0, 2); // default - if (battery_critical) { + if (err_flags.err_battery) { brightness = PWMLED_BRIGHTNESS(0, 0, 0, 0, 0); - } else if (ambient_zone < 2) { + } else if (ambient_zone == 0) { + if (dim_mode) + brightness = PWMLED_BRIGHTNESS(0, 1, 0, 0, 2); + else + brightness = PWMLED_BRIGHTNESS(1, 3, 2, 1, 4); + } else if (ambient_zone == 1) { if (dim_mode) brightness = PWMLED_BRIGHTNESS(0, 1, 0, 0, 1); else @@ -190,7 +235,7 @@ void pwmled_select_brightness() } else if (ambient_zone == 2) { brightness = PWMLED_BRIGHTNESS(1, 3, 2, 1, 3); } else if (ambient_zone == 3) { - brightness = PWMLED_BRIGHTNESS(2, 4, 2, 2, 4); + brightness = PWMLED_BRIGHTNESS(2, 4, 2, 2, 5); } pwmled_set_brightness(brightness);