Skip to content
Snippets Groups Projects
Commit 4ac704af authored by schneider's avatar schneider
Browse files

feat(personal-state): Convert personal state to use the work queue

This reduces the power consumption of the system by around .1 mA when
the personal state is not active.
parent 01dab506
Branches
Tags
1 merge request!479feat(personal-state): Convert personal state to use the work queue
Pipeline #5248 passed
...@@ -29,8 +29,6 @@ number of tasks that will have been keeping card10 running. These are: ...@@ -29,8 +29,6 @@ number of tasks that will have been keeping card10 running. These are:
+--------------------+-------------------------------+----------+-------------------------------------------+ +--------------------+-------------------------------+----------+-------------------------------------------+
| `vInterruptsTask`_ | ``interrupts_task`` (static) | +2 | Interrupt dispatcher worker | | `vInterruptsTask`_ | ``interrupts_task`` (static) | +2 | Interrupt dispatcher worker |
+--------------------+-------------------------------+----------+-------------------------------------------+ +--------------------+-------------------------------+----------+-------------------------------------------+
| `vLedTask`_ | -/- | +1 | LED Animations |
+--------------------+-------------------------------+----------+-------------------------------------------+
| `vMAX30001Task`_ | ``max30001_task_id`` (static) | +1 | `MAX30001`_ ECG driver | | `vMAX30001Task`_ | ``max30001_task_id`` (static) | +1 | `MAX30001`_ ECG driver |
+--------------------+-------------------------------+----------+-------------------------------------------+ +--------------------+-------------------------------+----------+-------------------------------------------+
| `vBhi160Task`_ | ``bhi160_task_id`` (static) | +1 | `BHI160`_ sensor fusion driver | | `vBhi160Task`_ | ``bhi160_task_id`` (static) | +1 | `BHI160`_ sensor fusion driver |
......
...@@ -172,17 +172,6 @@ int main(void) ...@@ -172,17 +172,6 @@ int main(void)
} }
} }
/* LEDs */
if (xTaskCreate(
vLedTask,
(const char *)"LED",
configMINIMAL_STACK_SIZE,
NULL,
tskIDLE_PRIORITY + 1,
NULL) != pdPASS) {
panic("Failed to create %s task!", "LED");
}
/* Lifecycle */ /* Lifecycle */
if (xTaskCreate( if (xTaskCreate(
vLifecycleTask, vLifecycleTask,
......
...@@ -2,20 +2,36 @@ ...@@ -2,20 +2,36 @@
#include "leds.h" #include "leds.h"
#include "modules.h" #include "modules.h"
#include "os/work_queue.h"
#include "FreeRTOS.h"
#include "timers.h"
#include <math.h> #include <math.h>
uint8_t _personal_state_enabled = 0; static uint8_t _personal_state_enabled = 0;
uint8_t personal_state = STATE_NONE; static uint8_t personal_state = STATE_NONE;
uint8_t personal_state_persistent = 0; static uint8_t personal_state_persistent = 0;
static int led_animation_ticks = 0;
static int led_animation_state = 0;
int led_animation_ticks = 0; static TimerHandle_t led_timer;
int led_animation_state = 0; static StaticTimer_t led_timer_buffer;
static void worktick(void *data);
static const int led_animation_rate = 1000 / 25; /* 25Hz -> 40ms*/
int personal_state_enabled() int personal_state_enabled()
{ {
return _personal_state_enabled; return _personal_state_enabled;
} }
static void tick(TimerHandle_t xTimer)
{
workqueue_schedule(worktick, NULL);
}
int epic_personal_state_set(uint8_t state, bool persistent) int epic_personal_state_set(uint8_t state, bool persistent)
{ {
if (state > STATE_CAMP) if (state > STATE_CAMP)
...@@ -30,7 +46,29 @@ int epic_personal_state_set(uint8_t state, bool persistent) ...@@ -30,7 +46,29 @@ int epic_personal_state_set(uint8_t state, bool persistent)
_personal_state_enabled = (state != STATE_NONE); _personal_state_enabled = (state != STATE_NONE);
personal_state_persistent = persistent; personal_state_persistent = persistent;
if (was_enabled && !_personal_state_enabled) { if (!was_enabled && _personal_state_enabled) {
// Activate
if (!led_timer) {
led_timer = xTimerCreateStatic(
"personal state",
led_animation_rate / portTICK_PERIOD_MS,
pdTRUE,
NULL,
tick,
&led_timer_buffer
);
// since &poll_timer_buffer is not NULL, xTimerCreateStatic should allways succeed, so
// we don't need to check for poll_timer being NULL.
}
if (xTimerIsTimerActive(led_timer) == pdFALSE) {
xTimerStart(led_timer, 0);
}
} else if (was_enabled && !_personal_state_enabled) {
// Deactivate
xTimerStop(led_timer, 0);
// TODO: we might need a lock here to avoid a race condition
leds_prep(PERSONAL_STATE_LED, 0, 0, 0); leds_prep(PERSONAL_STATE_LED, 0, 0, 0);
epic_leds_update(); epic_leds_update();
} }
...@@ -48,19 +86,15 @@ int epic_personal_state_is_persistent() ...@@ -48,19 +86,15 @@ int epic_personal_state_is_persistent()
return personal_state_persistent; return personal_state_persistent;
} }
void vLedTask(void *pvParameters) static void worktick(void *data)
{ {
const int led_animation_rate = 1000 / 25; /* 25Hz -> 40ms*/
while (1) {
if (_personal_state_enabled) { if (_personal_state_enabled) {
led_animation_ticks++; led_animation_ticks++;
if (personal_state == STATE_NO_CONTACT) { if (personal_state == STATE_NO_CONTACT) {
leds_prep(PERSONAL_STATE_LED, 255, 0, 0); leds_prep(PERSONAL_STATE_LED, 255, 0, 0);
} else if (personal_state == STATE_CHAOS) { } else if (personal_state == STATE_CHAOS) {
if (led_animation_state == 0) { if (led_animation_state == 0) {
leds_prep( leds_prep(PERSONAL_STATE_LED, 0, 0, 255);
PERSONAL_STATE_LED, 0, 0, 255
);
if (led_animation_ticks > if (led_animation_ticks >
(200 / led_animation_rate)) { (200 / led_animation_rate)) {
led_animation_ticks = 0; led_animation_ticks = 0;
...@@ -74,9 +108,7 @@ void vLedTask(void *pvParameters) ...@@ -74,9 +108,7 @@ void vLedTask(void *pvParameters)
led_animation_state = 2; led_animation_state = 2;
} }
} else if (led_animation_state == 2) { } else if (led_animation_state == 2) {
leds_prep( leds_prep(PERSONAL_STATE_LED, 0, 0, 255);
PERSONAL_STATE_LED, 0, 0, 255
);
if (led_animation_ticks > if (led_animation_ticks >
(1000 / led_animation_rate)) { (1000 / led_animation_rate)) {
led_animation_ticks = 0; led_animation_ticks = 0;
...@@ -92,9 +124,7 @@ void vLedTask(void *pvParameters) ...@@ -92,9 +124,7 @@ void vLedTask(void *pvParameters)
} }
} else if (personal_state == STATE_COMMUNICATION) { } else if (personal_state == STATE_COMMUNICATION) {
if (led_animation_state == 0) { if (led_animation_state == 0) {
leds_prep( leds_prep(PERSONAL_STATE_LED, 255, 255, 0);
PERSONAL_STATE_LED, 255, 255, 0
);
if (led_animation_ticks > if (led_animation_ticks >
(1000 / led_animation_rate)) { (1000 / led_animation_rate)) {
led_animation_ticks = 0; led_animation_ticks = 0;
...@@ -115,13 +145,9 @@ void vLedTask(void *pvParameters) ...@@ -115,13 +145,9 @@ void vLedTask(void *pvParameters)
1.0f, 1.0f,
fabs(sin( fabs(sin(
led_animation_ticks / led_animation_ticks /
(float)(1000 / (float)(1000 / led_animation_rate))));
led_animation_rate))));
} }
epic_leds_update(); epic_leds_update();
} }
vTaskDelay(led_animation_rate / portTICK_PERIOD_MS);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment