Loading...
Searching...
No Matches
loracomm.c
1/* ===================================================================== *
2 * LORA HANDLING *
3 * ===================================================================== */
4
5#include "loracomm.h"
6
7extern EventGroupHandle_t xMsgReadyGroup;
8extern MessageBufferHandle_t xLoRaTxBuff;
9extern EventGroupHandle_t xSystemStatusGroup;
10
18void vLoRaTransmit(void *argument) {
19 const TickType_t blockTime = portMAX_DELAY;
20 uint8_t rxData[LORA_MSG_LENGTH];
21
22 LoRa *lora = DeviceHandle_getHandle("LoRa").device;
23
24 for (;;) {
25 // Wait for SX1272 to be ready for transmission
26 EventBits_t uxBits = xEventGroupWaitBits(xMsgReadyGroup, GROUP_MESSAGE_READY_LORA, pdFALSE, pdFALSE, blockTime);
27 if ((uxBits & GROUP_MESSAGE_READY_LORA)) {
28 // Wait to receive message in buffer
29 size_t xReceivedBytes = xMessageBufferReceive(
30 xLoRaTxBuff,
31 (void *)rxData,
32 sizeof(rxData),
33 blockTime
34 );
35 // Transmit if message is available
36 if (xReceivedBytes) {
37 lora->transmit(lora, rxData);
38 xEventGroupClearBits(xMsgReadyGroup, GROUP_MESSAGE_READY_LORA);
39 }
40 }
41 }
42}
43
52void vLoRaSample(void *argument) {
53 const TickType_t xFrequency = pdMS_TO_TICKS(250);
54 const TickType_t blockTime = pdMS_TO_TICKS(125);
55
56 A3G4250D *gyro = DeviceHandle_getHandle("Gyro").device;
57 KX134_1211 *lAccel = DeviceHandle_getHandle("LAccel").device;
58 KX134_1211 *hAccel = DeviceHandle_getHandle("HAccel").device;
59
60 enum State *flightState = StateHandle_getHandle("FlightState").state;
61 float *altitude = StateHandle_getHandle("Altitude").state;
62 float *velocity = StateHandle_getHandle("Velocity").state;
63
64 for (;;) {
65 // Block until 250ms interval
66 TickType_t xLastWakeTime = xTaskGetTickCount();
67 vTaskDelayUntil(&xLastWakeTime, xFrequency);
68
69 uint8_t systemStatus = xEventGroupGetBits(xSystemStatusGroup);
70
71 // Create AVData packet with current data
72 LoRa_Packet avData = LoRa_AVData(
73 LORA_HEADER_AV_DATA,
74 *flightState | systemStatus,
75 lAccel->rawAccelData,
76 hAccel->rawAccelData,
77 KX134_1211_DATA_TOTAL,
78 gyro->rawGyroData,
79 A3G4250D_DATA_TOTAL,
80 *altitude,
81 *velocity
82 );
83
84 // Add packet to queue
85 xMessageBufferSend(xLoRaTxBuff, &avData, LORA_MSG_LENGTH, blockTime);
86 }
87}
88
96void EXTI1_IRQHandler(void) {
97 EXTI->PR |= (0x02);
98 BaseType_t xHigherPriorityTaskWoken = pdFALSE, xResult;
99
100 //
101 xResult = xEventGroupSetBitsFromISR(
102 xMsgReadyGroup,
103 GROUP_MESSAGE_READY_LORA,
104 &xHigherPriorityTaskWoken
105 );
106
107 if (xResult != pdFAIL)
108 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
109}
LoRa_Packet LoRa_AVData(uint8_t, uint8_t, uint8_t *, uint8_t *, uint8_t, uint8_t *, uint8_t, float, float)
Constructs a LoRa packet with accelerometer and gyroscope data, altitude, and velocity for transmissi...
Definition lora.c:122
uint8_t rawGyroData[A3G4250D_DATA_TOTAL]
Raw gyro rates array.
Definition a3g4250d.h:49
uint8_t rawAccelData[KX134_1211_DATA_TOTAL]
Raw accelerations array.
Definition kx134_1211.h:62
Definition lora.h:95
void(* transmit)(struct LoRa *, uint8_t *)
LoRa transmit method.
Definition lora.h:97
DeviceType device
Enum specifier for device type.
Definition spi.h:50