STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
idle_task.c
Go to the documentation of this file.
1#include "idle_task.h"
2
3#include "board_bringup.h"
4#include "board_sleep.h"
5#include "bringup_task.h"
6#include "cmsis_os2.h"
7#include "main.h"
8#include "mode.h"
9#include "radio_task.h"
10
11#define EV_MODE (1U << 0)
12#define EV_CMD (1U << 1)
13#define FRAME_HEARTBEAT 0x01U /* src/radio/frame.h FrameType::Heartbeat */
14
15/* Aaron's proposals (src/app/IDLE.md); the budget covers one SF9 TxDone
16 * (2 x 165 ms time on air + 50 ms, sx1262_setup.cpp). */
17static const idle_config_t config = {
18 .heartbeat_interval_ms = 10000,
19 .wake_tolerance_ms = 500,
20 .callback_budget_ms = 500,
21 .battery_warn_mv = 7000,
22 .battery_fail_mv = 6600,
23 .battery_hysteresis_mv = 100,
24};
25
26static idle_t idle;
29static volatile bool want_active;
30
31static self_test_battery_t read_battery(void* ctx, uint32_t now_ms,
32 uint32_t budget_ms) {
33 (void)ctx;
34 return board_bringup_read_battery(bringup_task_board(), now_ms, budget_ms);
35}
36
37static bool on_usb(void* ctx) {
38 (void)ctx;
39 return board_bringup_on_usb();
40}
41
43 uint32_t budget_ms) {
44 (void)ctx;
45 (void)budget_ms; /* the radio task bounds TxDone itself */
46 bool pack = hb->battery == IDLE_BATT_OK || hb->battery == IDLE_BATT_WARN ||
48 uint16_t mv = pack ? hb->supply_mv : 0U;
49 uint32_t up_s = hb->uptime_ms / 1000U;
50 const uint8_t payload[7] = {(uint8_t)FLIGHT_IDLE, (uint8_t)mv,
51 (uint8_t)(mv >> 8), (uint8_t)up_s,
52 (uint8_t)(up_s >> 8), (uint8_t)(up_s >> 16),
53 (uint8_t)(up_s >> 24)};
55 case RADIO_SEND_OK:
59 default:
61 }
62}
63
64static idle_command_t poll_command(void* ctx) {
65 (void)ctx;
66 uint8_t c;
67 if (osMessageQueueGet(commands, &c, NULL, 0) != osOK) {
68 return IDLE_CMD_NONE;
69 }
71}
72
73/* Checked by board_sleep with the scheduler suspended. */
74static bool work_waiting(void) {
76}
77
78static void led1(bool on) { /* active low */
81}
82
83static void idle_task(void* argument) {
84 (void)argument;
87 (void)board_sleep_init();
88 (void)idle_init(&idle, &config, &port, NULL);
89 for (;;) {
90 if (!want_active) {
92 continue;
93 }
95 while (want_active) {
96 led1(true);
98 led1(false);
99 if (r.event == IDLE_EVENT_ARM_REQUESTED) {
101 break;
102 }
103 uint32_t ms =
104 r.event == IDLE_EVENT_SLEEP ? r.sleep_s * 1000U : 1000U;
105 if (board_sleep(ms, work_waiting) == 0U && !work_waiting()) {
106 /* Stop refused (option byte, LSI): wait awake instead. */
108 }
109 }
110 }
111}
112
113bool idle_task_start(void) {
114 static const osThreadAttr_t attr = {
115 .name = "idle",
116 .stack_size = 1024,
117 .priority = osPriorityBelowNormal,
118 };
119 commands = osMessageQueueNew(4, sizeof(uint8_t), NULL);
121 return thread != NULL;
122}
123
124void idle_task_set_active(bool on) {
125 want_active = on;
126 if (thread) {
128 }
129}
130
132 uint8_t c = (uint8_t)command;
133 if (commands && osMessageQueuePut(commands, &c, 0, 0) == osOK && thread) {
135 }
136}
137
139 return &idle;
140}
#define LED1_GPIO_Port
Definition main.h:194
#define LED1_Pin
Definition main.h:193
@ FLIGHT_IDLE
@ FLIGHT_EV_ARM
bool board_bringup_on_usb(void)
self_test_battery_t board_bringup_read_battery(void *context, uint32_t now_ms, uint32_t budget_ms)
uint32_t board_sleep(uint32_t ms, bool(*wake_now)(void))
Definition board_sleep.c:68
bool board_sleep_init(void)
Definition board_sleep.c:52
board_bringup_t * bringup_task_board(void)
#define osFlagsWaitAny
Wait for any flag (default).
Definition cmsis_os2.h:176
void * osMessageQueueId_t
Definition cmsis_os2.h:229
osMessageQueueId_t osMessageQueueNew(uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr)
Create and Initialize a Message Queue object.
Definition cmsis_os2.c:2100
osThreadId_t osThreadNew(osThreadFunc_t func, void *argument, const osThreadAttr_t *attr)
Create a thread and add it to Active Threads.
Definition cmsis_os2.c:577
void * osThreadId_t
Definition cmsis_os2.h:211
uint32_t osMessageQueueGetCount(osMessageQueueId_t mq_id)
Get number of queued messages in a Message Queue.
Definition cmsis_os2.c:2290
@ osOK
Operation completed successfully.
Definition cmsis_os2.h:199
uint32_t osThreadFlagsSet(osThreadId_t thread_id, uint32_t flags)
Set the specified Thread Flags of a thread.
uint32_t osKernelGetTickCount(void)
Get the RTOS kernel tick count.
Definition cmsis_os2.c:491
#define osWaitForever
Wait forever timeout value.
Definition cmsis_os2.h:173
osStatus_t osMessageQueuePut(osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout)
Put a Message into a Queue or timeout if Queue is full.
Definition cmsis_os2.c:2161
uint32_t osThreadFlagsWait(uint32_t flags, uint32_t options, uint32_t timeout)
Wait for one or more Thread Flags of the current running thread to become signaled.
@ osPriorityBelowNormal
Priority: below normal.
Definition cmsis_os2.h:115
osStatus_t osMessageQueueGet(osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout)
Get a Message from a Queue or timeout if Queue is empty.
Definition cmsis_os2.c:2209
static const emmc_port_t port
Definition emmc_stm32.c:210
flight_state_t flight_state_next(flight_state_t state, flight_event_t event)
Definition flight_state.c:3
#define EV_MODE
Definition gnss_task.c:10
static volatile bool want_active
Definition gnss_task.c:14
static osThreadId_t thread
Definition gnss_task.c:13
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
@ GPIO_PIN_SET
@ GPIO_PIN_RESET
#define NULL
Definition usbd_def.h:44
idle_result_t idle_on_wake(idle_t *idle, uint32_t now_ms)
Definition idle.c:168
static void send_heartbeat(idle_t *idle, uint32_t now_ms)
Definition idle.c:145
bool idle_enter(idle_t *idle, uint32_t now_ms)
Definition idle.c:70
bool idle_init(idle_t *idle, const idle_config_t *config, const idle_port_t *port, void *context)
Definition idle.c:50
static void read_battery(idle_t *idle, uint32_t now_ms)
Definition idle.c:120
@ IDLE_EVENT_ARM_REQUESTED
Definition idle.h:38
@ IDLE_EVENT_SLEEP
Definition idle.h:35
idle_command_t
Definition idle_port.h:25
@ IDLE_CMD_NONE
Definition idle_port.h:26
@ IDLE_CMD_ARM
Definition idle_port.h:27
@ IDLE_CMD_DISARM
Definition idle_port.h:28
@ IDLE_BATT_FAIL
Definition idle_port.h:35
@ IDLE_BATT_OK
Definition idle_port.h:33
@ IDLE_BATT_WARN
Definition idle_port.h:34
void idle_task_set_active(bool on)
Definition idle_task.c:124
static self_test_battery_t read_battery(void *ctx, uint32_t now_ms, uint32_t budget_ms)
Definition idle_task.c:31
static self_test_reply_t send_heartbeat(void *ctx, const idle_heartbeat_t *hb, uint32_t budget_ms)
Definition idle_task.c:42
#define EV_CMD
Definition idle_task.c:12
static bool work_waiting(void)
Definition idle_task.c:74
#define FRAME_HEARTBEAT
Definition idle_task.c:13
static bool on_usb(void *ctx)
Definition idle_task.c:37
const idle_t * idle_task_state(void)
Definition idle_task.c:138
static idle_t idle
Definition idle_task.c:26
static osMessageQueueId_t commands
Definition idle_task.c:28
bool idle_task_start(void)
Definition idle_task.c:113
static void idle_task(void *argument)
Definition idle_task.c:83
void idle_task_command(mode_command_t command)
Definition idle_task.c:131
static idle_command_t poll_command(void *ctx)
Definition idle_task.c:64
static void led1(bool on)
Definition idle_task.c:78
static const idle_config_t config
Definition idle_task.c:17
void app_set_state(flight_state_t to)
Definition mode.c:22
mode_command_t
Definition mode_core.h:43
@ MODE_CMD_ARM
Definition mode_core.h:43
radio_send_result_t radio_task_send_frame(uint8_t type, const uint8_t *payload, uint8_t len)
@ RADIO_SEND_TIMEOUT
Definition radio_task.h:27
@ RADIO_SEND_OK
Definition radio_task.h:26
@ SELF_TEST_FAIL
@ SELF_TEST_PASS
@ SELF_TEST_TIMEOUT
idle_battery_state_t battery
Definition idle_port.h:45
uint32_t uptime_ms
Definition idle_port.h:43
uint16_t supply_mv
Definition idle_port.h:44
Definition idle.h:51
Attributes structure for thread.
Definition cmsis_os2.h:240
static boot_report_t r