ESP32-CAN/main/radio.cpp

95 lines
2.5 KiB
C++
Raw Normal View History

2026-03-30 22:09:23 +01:00
#include "radio.h"
2026-03-31 17:39:22 +01:00
#include "Esp.h"
2026-03-30 22:09:23 +01:00
#include "esp32-hal-gpio.h"
#include "esp_log.h"
#include "freertos/idf_additions.h"
#include <Arduino.h>
#include <RFM69.h>
#include <SPI.h>
#include <cstdint>
#include <cstring>
#include <drone_comms.h>
#define RFM69_RST 14
#define RFM69_CS 12
#define RFM69_INT 39
#define SPI_SCLK 18
#define SPI_MISO 19
#define SPI_MOSI 23
#define FREQUENCY RF69_433MHZ
#define NODEID 1
2026-03-31 17:39:22 +01:00
#define GROUNDID 99
2026-03-30 22:09:23 +01:00
#define NETWORKID 100
static const char *TAG = "RADIO_TASK";
#define PACKET_QUEUE_CAP 10
2026-03-31 17:39:22 +01:00
void radio_task(void *pvParameters) {
2026-03-30 22:09:23 +01:00
ESP_LOGI(TAG, "Radio Task Started on Core %d", xPortGetCoreID());
2026-03-31 17:39:22 +01:00
packet_rx_queue = xQueueCreate(PACKET_QUEUE_CAP, MAX_PACKET_SIZE);
packet_tx_queue = xQueueCreate(PACKET_QUEUE_CAP, MAX_PACKET_SIZE);
2026-03-30 22:09:23 +01:00
controller_input_semaphore = xSemaphoreCreateMutex();
pinMode(RFM69_CS, OUTPUT);
pinMode(RFM69_INT, INPUT);
SPIClass vspi(VSPI);
vspi.begin(SPI_SCLK, SPI_MISO, SPI_MOSI, 34);
pinMode(RFM69_RST, OUTPUT);
digitalWrite(RFM69_RST, HIGH);
vTaskDelay(pdMS_TO_TICKS(10));
digitalWrite(RFM69_RST, LOW);
vTaskDelay(pdMS_TO_TICKS(50));
RFM69 radio(RFM69_CS, RFM69_INT, true, &vspi);
if (radio.initialize(FREQUENCY, NODEID, NETWORKID)) {
radio.setHighPower(true);
ESP_LOGI(TAG, "Radio Initialized. Version: 0x%02X", radio.readReg(0x10));
} else {
2026-03-31 17:39:22 +01:00
ESP_LOGE(TAG, "Radio Init FAILED! Restarting.");
ESP.restart();
2026-03-30 22:09:23 +01:00
}
while (1) {
if (radio.receiveDone()) {
// ESP_LOGD(TAG, "Packet [ID:%d] RSSI:%d LEN:%d", radio.SENDERID,
// radio.RSSI,
// radio.DATALEN);
memset(packet_data, '\0', sizeof(packet_data));
memcpy(packet_data, radio.DATA, radio.DATALEN);
PACKET_TYPE packet_type = *((PACKET_TYPE *)&packet_data[0]);
if (packet_type == CONTROLLER_INPUT) {
2026-03-31 17:39:22 +01:00
packet_controller_input *inp =
(packet_controller_input *)(&packet_data[0] + sizeof(PACKET_TYPE));
2026-03-30 22:09:23 +01:00
if (xSemaphoreTake(controller_input_semaphore, (TickType_t)50) ==
pdTRUE) {
current_controller_input = *inp;
xSemaphoreGive(controller_input_semaphore);
}
} else {
2026-03-31 17:39:22 +01:00
xQueueSend(packet_rx_queue, &packet_data[0], portMAX_DELAY);
2026-03-30 22:09:23 +01:00
}
if (radio.ACKRequested()) {
radio.sendACK();
}
}
2026-03-31 17:39:22 +01:00
if (xQueueReceive(packet_tx_queue, &packet_data[0], 1)) {
PACKET_TYPE packet_type = *((PACKET_TYPE *)&packet_data[0]);
radio.send(GROUNDID, &packet_data[0], get_packet_size(packet_type));
}
2026-03-30 22:09:23 +01:00
2026-03-31 17:39:22 +01:00
vTaskDelay(pdMS_TO_TICKS(10));
2026-03-30 22:09:23 +01:00
}
}