Loading...
Searching...
No Matches
gpsacquisition.c
1/* ===================================================================== *
2 * GPS *
3 * ===================================================================== */
4
5#include "gpsacquisition.h"
6
7extern MessageBufferHandle_t xLoRaTxBuff;
8extern MessageBufferHandle_t xUsbTxBuff;
9extern StreamBufferHandle_t xGpsRxBuff;
10extern SemaphoreHandle_t xUsbMutex;
11
12uint8_t gpsRxBuff[GPS_RX_SIZE];
13uint8_t gpsRxBuffIdx = 0;
14
15void vGpsTransmit(void *argument) {
16 const TickType_t xFrequency = pdMS_TO_TICKS(500);
17 const TickType_t blockTime = pdMS_TO_TICKS(250);
18 char gpsString[100];
19
20 GPS *gps = DeviceHandle_getHandle("GPS").device;
21 UART *usb = DeviceHandle_getHandle("USB").device;
22 enum State *flightState = StateHandle_getHandle("FlightState").state;
23
24 for (;;) {
25 // Block until 500ms interval
26 TickType_t xLastWakeTime = xTaskGetTickCount();
27 vTaskDelayUntil(&xLastWakeTime, xFrequency);
28
29 // Send GPS poll message
30 gps->base.print(&gps->base, GPS_PUBX_POLL);
31
32 // Read string from UART Rx buffer, skip loop if empty
33 if (!xStreamBufferReceive(xGpsRxBuff, (void *)&gpsString, gpsRxBuffIdx, blockTime))
34 continue;
35
36 struct GPS_Data gpsData;
37 gps->decode(gps, gpsString, &gpsData);
38 usb->print(usb, gpsString);
39 gpsRxBuffIdx = 0;
40
41#ifdef DEBUG
44 if ((xSemaphoreTake(xUsbMutex, pdMS_TO_TICKS(0))) == pdTRUE) {
45 char debugStr[100];
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);
49 }
50#endif
51
52 LoRa_Packet gpsPacket = LoRa_GPSData(
53 LORA_HEADER_GPS_DATA,
54 gpsData.latitude,
55 gpsData.longitude,
56 (*flightState << 4) | gpsData.lock
57 );
58 // Add packet to queue
59 xMessageBufferSend(xLoRaTxBuff, &gpsPacket, LORA_MSG_LENGTH, blockTime);
60 }
61}
62
63/* =============================================================================== */
72void USART3_IRQHandler() {
73 BaseType_t xHigherPriorityTaskWoken = pdFALSE;
74
75 // Read in data from USART3
76 while ((USART3->SR & USART_SR_RXNE) == 0);
77 uint8_t rxData = USART3->DR & 0xFF;
78
79 gpsRxBuff[gpsRxBuffIdx++] = rxData;
80 gpsRxBuffIdx %= GPS_RX_SIZE;
81
82 // Send message to buffer on carriage return
83 if (rxData == LINE_FEED) {
84 xStreamBufferSendFromISR(xGpsRxBuff, (void *)gpsRxBuff, gpsRxBuffIdx, &xHigherPriorityTaskWoken);
85 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
86 }
87}
Definition gps.h:62
Definition gps.h:33
LoRa_Packet LoRa_GPSData(uint8_t, char *, char *, uint8_t)
Definition lora.c:162
void(* print)(struct UART *, char *)
UART print string method.
Definition uart.h:62
Struct definition for UART interface.
Definition uart.h:53