Loading...
Searching...
No Matches
payloadcomm.c
1/* ===================================================================== *
2 * PAYLOAD *
3 * ===================================================================== */
4
5#include "payloadcomm.h"
6
7extern MessageBufferHandle_t xLoRaTxBuff;
8extern MessageBufferHandle_t xUsbTxBuff;
9extern SemaphoreHandle_t xUsbMutex;
10extern EventGroupHandle_t xSystemStatusGroup;
11
12bool payloadCANRequest(unsigned int can, uint16_t id, unsigned int *out) {
13
14 TIM6->ARR &= (~(TIM_ARR_ARR_Msk));
15 TIM6->PSC &= (~(TIM_PSC_PSC_Msk));
16 TIM6->SR &= ~(TIM_SR_UIF);
17 TIM6->ARR = 49999;
18 TIM6->PSC = 167;
19 TIM6->CR1 |= TIM_CR1_CEN;
20
21 // Request data from payload
22 CAN_TX(can, 8, 0x00, 0x00, id);
23
24 // Set output data
25 struct CAN_RX_data payloadRx = {.CAN_number = can};
26
27 // Wait until response is received with timeout
28 while ((CAN_RX(&payloadRx) != 0x01) && (payloadRx.address != id)) {
29 if (TIM6->SR & TIM_SR_UIF)
30 return false;
31 }
32
33 // Set output data and return
34 out[0] = payloadRx.dataL;
35 out[1] = payloadRx.dataH;
36 return true;
37}
38
39void vPayloadTransmit(void *argument) {
40 const TickType_t xFrequency = pdMS_TO_TICKS(500);
41 const TickType_t blockTime = pdMS_TO_TICKS(250);
42
43 for (;;) {
44 // Block until 250ms interval
45 TickType_t xLastWakeTime = xTaskGetTickCount();
46 vTaskDelayUntil(&xLastWakeTime, xFrequency);
47
48 uint8_t errCount = 0;
49
50 unsigned int payloadState[2];
51 errCount += !payloadCANRequest(CAN_PAYLOAD_AV, CAN_HEADER_PAYLOAD_STATUS, payloadState);
52
53 unsigned int payloadAccel[2];
54 errCount += !payloadCANRequest(CAN_PAYLOAD_AV, CAN_HEADER_PAYLOAD_ACCEL, payloadAccel);
55
56 unsigned int payloadBaro1[2];
57 errCount += !payloadCANRequest(CAN_PAYLOAD_AV, CAN_HEADER_PAYLOAD_BARO1, payloadBaro1);
58
59 unsigned int payloadBaro2[2];
60 errCount += !payloadCANRequest(CAN_PAYLOAD_AV, CAN_HEADER_PAYLOAD_BARO2, payloadBaro2);
61
62 if (errCount > 2)
63 xEventGroupSetBits(xSystemStatusGroup, GROUP_SYSTEM_STATUS_PAYLOAD);
64 else
65 xEventGroupClearBits(xSystemStatusGroup, GROUP_SYSTEM_STATUS_PAYLOAD);
66
67 LoRa_Packet payloadData = LoRa_PayloadData(
68 LORA_HEADER_PAYLOAD_DATA,
69 (uint8_t)payloadState[0],
70 (uint8_t *)payloadAccel,
71 PAYLOAD_ACCEL_TOTAL
72 );
73
74 // Add packet to queue
75 xMessageBufferSend(xLoRaTxBuff, &payloadData, LORA_MSG_LENGTH, blockTime);
76 }
77}