STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
gnss_task.c
Go to the documentation of this file.
1#include "gnss_task.h"
2
3#include "board_time.h"
4#include "board_uart9.h"
5#include "cmsis_os2.h"
6#include "emmc_stm32.h"
7#include "main.h"
8
9#define EV_RX (1U << 0)
10#define EV_MODE (1U << 1) /* gnss_task_set_active() */
11
14static volatile bool want_active;
15static volatile bool want_status; /* gnss_task_poll_status */
16
17/* REG_3V6_EN (PE11): the 3V6 buck + LP5907 that make 3V3A, which only the
18 * MAX-M10S uses (schematic p.10, p.12). 10 ms covers both regulators. */
19static void gps_power(bool on) {
22 if (on) {
23 osDelay(10);
24 }
25}
26
27static void send(void* ctx, const uint8_t* bytes, uint16_t len) {
28 (void)ctx;
29 board_uart9_send(bytes, len);
30}
31
32static void set_baud(void* ctx, uint32_t baud) {
33 (void)ctx;
35}
36
37static void to_emmc(void* ctx, uint8_t type, const void* data, uint8_t len) {
38 (void)ctx;
40 len);
41}
42
43static void gnss_task(void* argument) {
44 (void)argument;
46 core.sink = (record_sink_t){to_emmc, NULL};
47 bool uart_started = false, active = false;
48 uint8_t buf[128];
49 for (;;) {
50 if (!want_active) {
51 if (active) {
52 gps_power(false); /* Idle: the module loses its RAM config */
53 active = false;
54 }
56 continue;
57 }
58 if (!active) {
59 gps_power(true);
60 gnss_core_init(&core, board_time_us()); /* re-detect, reconfig */
61 if (!uart_started) {
63 uart_started = true;
64 }
65 active = true;
66 }
67 uint32_t wait_us = gnss_core_wait_us(&core, board_time_us());
69 (wait_us + 999U) / 1000U);
71 if (pps.count) {
73 }
74 size_t n;
75 while ((n = board_uart9_read(buf, sizeof(buf))) > 0) {
77 }
79 /* NAV-PVT wakes the task 10 times a second, so 1 s is honoured */
80 static uint32_t last_status_us;
81 uint32_t now = board_time_us();
82 if (want_status && now - last_status_us >= 1000000U &&
84 last_status_us = now;
85 }
86 }
87}
88
89bool gnss_task_start(void) {
90 static const osThreadAttr_t attr = {
91 .name = "gnss",
92 .stack_size = 1536,
93 .priority = osPriorityNormal,
94 };
96 return thread != NULL;
97}
98
99void gnss_task_set_active(bool on) {
100 want_active = on;
101 if (thread) {
103 }
104}
105
107 want_status = on;
108}
109
111 return &core;
112}
#define REG_3V6_EN_GPIO_Port
Definition main.h:117
#define REG_3V6_EN_Pin
Definition main.h:116
board_pps_t board_time_last_pps(void)
Definition board_time.c:38
uint32_t board_time_us(void)
Definition board_time.c:34
size_t board_uart9_read(uint8_t *out, size_t cap)
Definition board_uart9.c:45
bool board_uart9_start(osThreadId_t thread, uint32_t flag)
Definition board_uart9.c:38
void board_uart9_set_baud(uint32_t baud)
Definition board_uart9.c:59
void board_uart9_send(const uint8_t *bytes, uint16_t len)
Definition board_uart9.c:55
#define osFlagsWaitAny
Wait for any flag (default).
Definition cmsis_os2.h:176
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 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
osThreadId_t osThreadGetId(void)
Return the thread ID of the current running thread.
Definition cmsis_os2.c:669
#define osWaitForever
Wait forever timeout value.
Definition cmsis_os2.h:173
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.
@ osPriorityNormal
Priority: normal.
Definition cmsis_os2.h:123
osStatus_t osDelay(uint32_t ticks)
Wait for Timeout (Time Delay).
Definition cmsis_os2.c:1094
bool emmc_log_append(emmc_log_t *log, uint8_t type, uint32_t t_ms, const void *data, uint8_t len)
Definition emmc_log.c:235
emmc_log_t * emmc_stm32_log(void)
Definition emmc_stm32.c:246
void gnss_core_feed(gnss_core_t *c, const uint8_t *bytes, size_t n, uint32_t now_us)
Definition gnss_core.c:139
void gnss_core_set_pps(gnss_core_t *c, uint32_t edge_us)
Definition gnss_core.c:60
uint32_t gnss_core_wait_us(const gnss_core_t *c, uint32_t now_us)
Definition gnss_core.c:183
void gnss_core_init(gnss_core_t *c, uint32_t now_us)
Definition gnss_core.c:53
void gnss_core_poll(gnss_core_t *c, uint32_t now_us)
Definition gnss_core.c:149
bool gnss_core_request_status(gnss_core_t *c)
Definition gnss_core.c:171
void gnss_task_set_active(bool on)
Definition gnss_task.c:99
static void gnss_task(void *argument)
Definition gnss_task.c:43
static void to_emmc(void *ctx, uint8_t type, const void *data, uint8_t len)
Definition gnss_task.c:37
#define EV_MODE
Definition gnss_task.c:10
#define EV_RX
Definition gnss_task.c:9
const gnss_core_t * gnss_task_core(void)
Definition gnss_task.c:110
static void gps_power(bool on)
Definition gnss_task.c:19
static volatile bool want_active
Definition gnss_task.c:14
void gnss_task_poll_status(bool on)
Definition gnss_task.c:106
static volatile bool want_status
Definition gnss_task.c:15
bool gnss_task_start(void)
Definition gnss_task.c:89
static osThreadId_t thread
Definition gnss_task.c:13
static gnss_core_t core
Definition gnss_task.c:12
static void send(void *ctx, const uint8_t *bytes, uint16_t len)
Definition gnss_task.c:27
static void set_baud(void *ctx, uint32_t baud)
Definition gnss_task.c:32
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
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:24474
uint32_t count
Definition board_time.h:30
uint32_t edge_us
Definition board_time.h:29
Attributes structure for thread.
Definition cmsis_os2.h:240