Loading...
Searching...
No Matches
loracomm.c
1/* ===================================================================== *
2 * LORA HANDLING *
3 * ===================================================================== */
4
5#include "stm32f439xx.h"
6
7#include "FreeRTOS.h"
8#include "event_groups.h"
9#include "message_buffer.h"
10
11#include "groups.h"
12#include "loracomm.h"
13#include "stateupdate.h"
14
15#include "devicelist.h"
16#include "devices.h"
17
18#include "gpiopin.h"
19
20#include "a3g4250d.h"
21#include "kx134_1211.h"
22#include "sx1272.h"
23
24#include "packets.h"
25
26extern EventGroupHandle_t xMsgReadyGroup;
27extern MessageBufferHandle_t xLoRaTxBuff;
28extern EventGroupHandle_t xSystemStatusGroup;
29
37void vLoRaTransmit(void *argument) {
38 const TickType_t blockTime = portMAX_DELAY;
39 uint8_t rxData[LORA_MSG_LENGTH];
40
41 SX1272_t *lora = DeviceList_getDeviceHandle(DEVICE_LORA).device;
42 GPIOpin_t rfToggle = GPIOpin_init(GPIOE, GPIO_PIN2, NULL);
43
44 for (;;) {
45 // Wait for SX1272 to be ready for transmission
46 EventBits_t uxBits = xEventGroupWaitBits(xMsgReadyGroup, GROUP_MESSAGE_READY_LORA, pdFALSE, pdFALSE, blockTime);
47 if ((uxBits & GROUP_MESSAGE_READY_LORA)) {
48 // Wait to receive message in buffer
49 size_t xReceivedBytes = xMessageBufferReceive(
50 xLoRaTxBuff,
51 (void *)rxData,
52 sizeof(rxData),
53 blockTime
54 );
55 // Transmit if message is available
56 if (xReceivedBytes) {
57 rfToggle.reset(&rfToggle); // Toggle RF front-end for transmit
58 lora->transmit(lora, rxData);
59 xEventGroupClearBits(xMsgReadyGroup, GROUP_MESSAGE_READY_LORA);
60 }
61 }
62 }
63}
64
73void vLoRaSample(void *argument) {
74 const TickType_t xFrequency = pdMS_TO_TICKS(250);
75 const TickType_t blockTime = pdMS_TO_TICKS(125);
76
77 A3G4250D_t *gyro = DeviceList_getDeviceHandle(DEVICE_GYRO).device;
78 KX134_1211_t *lAccel = DeviceList_getDeviceHandle(DEVICE_ACCEL_LOW).device;
79 KX134_1211_t *hAccel = DeviceList_getDeviceHandle(DEVICE_ACCEL_HIGH).device;
80
81 enum State *flightState = StateHandle_getHandle("FlightState").state;
82 float *altitude = StateHandle_getHandle("Altitude").state;
83 float *velocity = StateHandle_getHandle("Velocity").state;
84
85 for (;;) {
86 // Block until 250ms interval
87 TickType_t xLastWakeTime = xTaskGetTickCount();
88 vTaskDelayUntil(&xLastWakeTime, xFrequency);
89
90 uint8_t systemStatus = xEventGroupGetBits(xSystemStatusGroup);
91
92 // Create AVData packet with current data
93 SX1272_Packet avData = SX1272_AVData(
94 LORA_HEADER_AV_DATA,
95 *flightState | systemStatus,
96 lAccel->rawAccelData,
97 hAccel->rawAccelData,
98 KX134_1211_DATA_TOTAL,
99 gyro->rawGyroData,
100 A3G4250D_DATA_TOTAL,
101 *altitude,
102 *velocity
103 );
104
105 // Add packet to queue
106 xMessageBufferSend(xLoRaTxBuff, &avData, LORA_MSG_LENGTH, blockTime);
107 }
108}
109
117void EXTI1_IRQHandler(void) {
118 BaseType_t xHigherPriorityTaskWoken = pdFALSE, xResult;
119
120 // Clear pending interrupt
121 EXTI->PR |= (0x02);
122
123 // Let the transmit task know it can continue
124 xResult = xEventGroupSetBitsFromISR(
125 xMsgReadyGroup,
126 GROUP_MESSAGE_READY_LORA,
127 &xHigherPriorityTaskWoken
128 );
129
130 if (xResult != pdFAIL)
131 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
132}
DeviceHandle_t DeviceList_getDeviceHandle(DeviceKey)
Retrieve device handle from list by key.
Definition devicelist.c:36
void(* reset)(struct GPIOpin *)
Definition gpiopin.h:156
GPIOpin_t GPIOpin_init(GPIO_TypeDef *, GPIO_Pin, GPIO_Config *)
Initialiser for a GPIO peripheral pin interface.
Definition gpiopin.c:28
@ GPIO_PIN2
Pin 2.
Definition gpiopin.h:52
Struct definition for a GPIO pin.
Definition gpiopin.h:151
void(* transmit)(struct SX1272 *, uint8_t *)
SX1272 LoRa transmit method.
Definition sx1272.h:139
Struct definition for SX1272. Provides the interface for API consumers to interact with the SX1272 Lo...
Definition sx1272.h:133
CMSIS STM32F439xx Device Peripheral Access Layer Header File.
uint8_t rawGyroData[A3G4250D_DATA_TOTAL]
Raw gyro rates array.
Definition a3g4250d.h:48
uint8_t rawAccelData[KX134_1211_DATA_TOTAL]
Raw accelerations array.
Definition kx134_1211.h:60