5#include "gpsacquisition.h"
7extern MessageBufferHandle_t xLoRaTxBuff;
8extern MessageBufferHandle_t xUsbTxBuff;
9extern StreamBufferHandle_t xGpsRxBuff;
10extern SemaphoreHandle_t xUsbMutex;
12uint8_t gpsRxBuff[GPS_RX_SIZE];
13uint8_t gpsRxBuffIdx = 0;
15void vGpsTransmit(
void *argument) {
16 const TickType_t xFrequency = pdMS_TO_TICKS(500);
17 const TickType_t blockTime = pdMS_TO_TICKS(250);
20 GPS *gps = DeviceHandle_getHandle(
"GPS").device;
21 UART *usb = DeviceHandle_getHandle(
"USB").device;
22 enum State *flightState = StateHandle_getHandle(
"FlightState").state;
26 TickType_t xLastWakeTime = xTaskGetTickCount();
27 vTaskDelayUntil(&xLastWakeTime, xFrequency);
30 gps->base.
print(&gps->base, GPS_PUBX_POLL);
33 if (!xStreamBufferReceive(xGpsRxBuff, (
void *)&gpsString, gpsRxBuffIdx, blockTime))
37 gps->decode(gps, gpsString, &gpsData);
38 usb->print(usb, gpsString);
44 if ((xSemaphoreTake(xUsbMutex, pdMS_TO_TICKS(0))) == pdTRUE) {
46 snprintf(debugStr, 100,
"[GPS] %d:%d:%d\n\r", gpsData.hour, gpsData.minute, gpsData.second);
47 xMessageBufferSend(xUsbTxBuff, (
void *)debugStr, 100, 0);
48 xSemaphoreGive(xUsbMutex);
56 (*flightState << 4) | gpsData.lock
59 xMessageBufferSend(xLoRaTxBuff, &gpsPacket, LORA_MSG_LENGTH, blockTime);
72void USART3_IRQHandler() {
73 BaseType_t xHigherPriorityTaskWoken = pdFALSE;
76 while ((USART3->SR & USART_SR_RXNE) == 0);
77 uint8_t rxData = USART3->DR & 0xFF;
79 gpsRxBuff[gpsRxBuffIdx++] = rxData;
80 gpsRxBuffIdx %= GPS_RX_SIZE;
83 if (rxData == LINE_FEED) {
84 xStreamBufferSendFromISR(xGpsRxBuff, (
void *)gpsRxBuff, gpsRxBuffIdx, &xHigherPriorityTaskWoken);
85 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
LoRa_Packet LoRa_GPSData(uint8_t, char *, char *, uint8_t)
void(* print)(struct UART *, char *)
UART print string method.
Struct definition for UART interface.