diff --git a/epicardium/modules/leds.c b/epicardium/modules/leds.c index a4e22e5c1e6bfb7e429d64488459395c086ab09f..93b80a993717adaa0d058da554e3d7f6433e2dc5 100644 --- a/epicardium/modules/leds.c +++ b/epicardium/modules/leds.c @@ -11,12 +11,16 @@ #define NUM_LEDS 15 /* Take from lib/card10/leds.c */ -static void update_if_needed() +static void do_update() { - if (personal_state_enabled() == 0) { - leds_update_power(); - leds_update(); + while (hwlock_acquire(HWLOCK_LED, pdMS_TO_TICKS(1)) < 0) { + vTaskDelay(pdMS_TO_TICKS(1)); } + + leds_update_power(); + leds_update(); + + hwlock_release(HWLOCK_LED); } void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b) @@ -25,8 +29,7 @@ void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b) return; leds_prep(led, r, g, b); - leds_update_power(); - leds_update(); + do_update(); } void epic_leds_set_hsv(int led, float h, float s, float v) @@ -35,7 +38,7 @@ void epic_leds_set_hsv(int led, float h, float s, float v) return; leds_prep_hsv(led, h, s, v); - update_if_needed(); + do_update(); } void epic_leds_prep(int led, uint8_t r, uint8_t g, uint8_t b) @@ -63,7 +66,7 @@ void epic_leds_set_all(uint8_t *pattern_ptr, uint8_t len) leds_prep(i, pattern[i][0], pattern[i][1], pattern[i][2]); } - update_if_needed(); + do_update(); } void epic_leds_set_all_hsv(float *pattern_ptr, uint8_t len) @@ -75,7 +78,7 @@ void epic_leds_set_all_hsv(float *pattern_ptr, uint8_t len) leds_prep_hsv(i, pattern[i][0], pattern[i][1], pattern[i][2]); } - update_if_needed(); + do_update(); } void epic_leds_dim_top(uint8_t value) @@ -105,7 +108,7 @@ void epic_set_flashlight(bool power) void epic_leds_update(void) { - update_if_needed(); + do_update(); } void epic_leds_set_powersave(bool eco) @@ -127,6 +130,5 @@ void epic_leds_clear_all(uint8_t r, uint8_t g, uint8_t b) leds_prep(i, r, g, b); } - leds_update_power(); - leds_update(); + do_update(); } diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h index 9b78e48b9b61e6c2b983da1aae3a88511d35892c..3555ab52e7c8ed66707459f2b0b4c90bf123dadd 100644 --- a/epicardium/modules/modules.h +++ b/epicardium/modules/modules.h @@ -48,6 +48,7 @@ void hwlock_init(void); enum hwlock_periph { HWLOCK_I2C = 0, HWLOCK_ADC, + HWLOCK_LED, _HWLOCK_MAX, }; diff --git a/epicardium/modules/personal_state.c b/epicardium/modules/personal_state.c index bd02c9211a3771435cbf4c9c905ea6d80e9440ba..cd6c52c7471af09a37560ef4b94644fc0549179c 100644 --- a/epicardium/modules/personal_state.c +++ b/epicardium/modules/personal_state.c @@ -31,9 +31,15 @@ int epic_personal_state_set(uint8_t state, bool persistent) personal_state_persistent = persistent; if (was_enabled && !_personal_state_enabled) { + while (hwlock_acquire(HWLOCK_LED, pdMS_TO_TICKS(1)) < 0) { + vTaskDelay(pdMS_TO_TICKS(1)); + } + leds_prep(PERSONAL_STATE_LED, 0, 0, 0); leds_update_power(); leds_update(); + + hwlock_release(HWLOCK_LED); } return 0; @@ -54,6 +60,11 @@ void vLedTask(void *pvParameters) const int led_animation_rate = 1000 / 25; /* 25Hz -> 40ms*/ while (1) { if (_personal_state_enabled) { + while (hwlock_acquire(HWLOCK_LED, pdMS_TO_TICKS(1)) < + 0) { + vTaskDelay(pdMS_TO_TICKS(1)); + } + led_animation_ticks++; if (personal_state == STATE_NO_CONTACT) { leds_prep(PERSONAL_STATE_LED, 255, 0, 0); @@ -121,6 +132,8 @@ void vLedTask(void *pvParameters) } leds_update_power(); leds_update(); + + hwlock_release(HWLOCK_LED); } vTaskDelay(led_animation_rate / portTICK_PERIOD_MS);