uas-ugv/main/ugv_main.c

165 lines
4.3 KiB
C
Raw Normal View History

2018-12-21 09:20:30 -08:00
#define U8X8_USE_PINS
#include <driver/uart.h>
#include <esp_log.h>
2018-12-21 09:20:30 -08:00
#include <freertos/FreeRTOS.h>
#include <freertos/queue.h>
#include <string.h>
#include <u8g2.h>
2018-12-21 09:20:30 -08:00
#include "sx127x_driver.h"
2018-12-21 09:20:30 -08:00
#include "u8g2_esp32_hal.h"
2018-12-16 18:12:21 -08:00
2018-12-20 19:26:59 -08:00
const char *TAG = "uas-ugv";
2018-12-16 18:12:21 -08:00
2018-12-21 09:20:30 -08:00
// U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, 16, 15, 4);
u8g2_t u8g2;
2018-12-16 18:12:21 -08:00
2018-12-21 09:20:30 -08:00
// SPIClass lora_spi(VSPI);
2018-12-16 18:12:21 -08:00
2018-12-20 19:26:59 -08:00
#define LORA_SCK 5
#define LORA_MISO 19
#define LORA_MOSI 27
#define LORA_CS 18
#define LORA_RST 14
#define LORA_IRQ 26
#define LORA_FREQ (433E6)
#define LORA_BUF_LEN 64
#define OLED_H 64
#define OLED_W 128
uint16_t packet_num;
2018-12-31 13:13:05 -07:00
sx127x_hndl lora;
2018-12-30 02:47:47 -07:00
2018-12-20 19:26:59 -08:00
void loraOnReceive(int packetSize);
2018-12-30 02:47:47 -07:00
void loraTask(void *params);
2018-12-20 19:26:59 -08:00
2018-12-21 09:20:30 -08:00
TaskHandle_t lora_task_hndl;
2018-12-20 19:26:59 -08:00
2018-12-31 12:56:02 -07:00
sx127x_rx_packet_t rx_packet;
2018-12-21 09:20:30 -08:00
void setup_oled(void) {
2018-12-21 09:20:30 -08:00
u8g2_esp32_hal_t u8g2_hal_config = {
.scl = 15,
.sda = 4,
2018-12-21 09:20:30 -08:00
.reset = 16,
};
u8g2_esp32_hal_init(u8g2_hal_config);
2018-12-31 01:40:41 -07:00
u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8g2_esp32_i2c_byte_cb,
u8g2_esp32_gpio_and_delay_cb);
2018-12-21 09:20:30 -08:00
u8g2_InitDisplay(&u8g2);
u8g2_ClearDisplay(&u8g2);
u8g2_SetPowerSave(&u8g2, false);
}
2018-12-20 19:26:59 -08:00
void setup(void) {
2018-12-20 19:26:59 -08:00
ESP_LOGI(TAG, "setup");
2018-12-21 09:20:30 -08:00
setup_oled();
2018-12-29 21:39:21 -07:00
sx127x_config_t lora_config = SX127X_CONFIG_DEFAULT;
lora_config.tx_power = 17;
lora_config.spreading_factor = 11;
lora_config.signal_bandwidth = 125E3;
2018-12-29 21:39:21 -07:00
lora_config.sync_word = 0x34;
lora_config.crc = SX127X_CRC_ENABLED;
esp_err_t ret = sx127x_init(&lora_config, &lora);
if (ret != ESP_OK) {
const char *err_name = esp_err_to_name(ret);
ESP_LOGE(TAG, "LoRa init failed: %s", err_name);
} else {
ESP_LOGI(TAG, "LoRa initialized");
ret = sx127x_start(lora);
if (ret != ESP_OK) {
ESP_LOGI(TAG, "LoRa start failed: %d", ret);
}
}
2018-12-31 12:56:02 -07:00
memset(&rx_packet, 0, sizeof(rx_packet));
2018-12-20 19:26:59 -08:00
packet_num = 0;
xTaskCreate(loraTask, "loraTask", 1024 * 10, NULL, 2, &lora_task_hndl);
}
#define XO 10
void loraTask(void *params) {
2018-12-31 12:56:02 -07:00
char tx_buf[20];
const size_t tx_buf_len = (sizeof(tx_buf) / sizeof(tx_buf[0]));
TickType_t send_period = pdMS_TO_TICKS(1000);
TickType_t current_time = xTaskGetTickCount();
TickType_t next_send = current_time + send_period;
while (true) {
2018-12-20 19:26:59 -08:00
TickType_t delay_ticks = next_send - current_time;
2018-12-31 12:56:02 -07:00
vTaskDelay(delay_ticks);
2018-12-20 19:26:59 -08:00
current_time = xTaskGetTickCount();
2018-12-31 12:56:02 -07:00
if (current_time < next_send) {
continue;
2018-12-20 19:26:59 -08:00
}
2018-12-31 12:56:02 -07:00
int written_bytes =
snprintf(tx_buf, tx_buf_len, "hello world %d", packet_num);
if (written_bytes < 0) {
ESP_LOGE(TAG, "snprintf error: %d", written_bytes);
continue;
}
packet_num++;
esp_err_t ret = sx127x_send_packet(lora, tx_buf, written_bytes,
0); // 0 means error if queue full
if (ret != ESP_OK) {
ESP_LOGE(TAG, "error sending packet: %d", ret);
} else {
ESP_LOGI(TAG, "lora wrote %d bytes", written_bytes);
}
current_time = xTaskGetTickCount();
next_send = current_time + send_period;
2018-12-20 19:26:59 -08:00
}
}
void loop(void) {
2018-12-21 09:20:30 -08:00
ESP_LOGI(TAG, "loop");
u8g2_FirstPage(&u8g2);
2018-12-31 12:56:02 -07:00
sx127x_recv_packet(lora, &rx_packet, 0);
do {
2018-12-21 09:20:30 -08:00
u8g2_DrawRFrame(&u8g2, 0, 0, OLED_W, OLED_H, 4);
2018-12-20 19:26:59 -08:00
2018-12-30 23:56:51 -07:00
multi_heap_info_t heap_info;
heap_caps_get_info(&heap_info, MALLOC_CAP_DEFAULT);
2018-12-21 09:20:30 -08:00
u8g2_SetFont(&u8g2, u8g2_font_4x6_mf);
u8g2_DrawStr(&u8g2, 4, 8, "Hello World!");
2018-12-30 23:56:51 -07:00
char buf[32];
memset(buf, 0, 32);
2018-12-31 01:40:41 -07:00
snprintf(buf, 32, "heap allc/free %d/%d", heap_info.total_allocated_bytes,
heap_info.total_free_bytes);
2018-12-21 09:20:30 -08:00
u8g2_DrawStr(&u8g2, 4, 8 + 8, buf);
2018-12-20 19:26:59 -08:00
2018-12-31 12:56:02 -07:00
if (rx_packet.data_len) {
ESP_LOGI(TAG, "lora received packet (len %d, rssi: %d, snr: %f): %.*s\n",
rx_packet.data_len, rx_packet.rssi, rx_packet.snr * 0.25f,
rx_packet.data_len, rx_packet.data);
2018-12-21 09:20:30 -08:00
u8g2_SetFont(&u8g2, u8g2_font_4x6_mf);
2018-12-31 12:56:02 -07:00
snprintf(buf, 40, "lora pkt(rssi: %d, snr: %f)", rx_packet.rssi,
rx_packet.snr * 0.25f);
2018-12-21 09:20:30 -08:00
u8g2_DrawStr(&u8g2, 4, 8 + 8 + 8, buf);
2018-12-31 12:56:02 -07:00
snprintf(buf, 40, "%.*s", rx_packet.data_len, rx_packet.data);
2018-12-21 09:20:30 -08:00
u8g2_DrawStr(&u8g2, 4, 8 + 8 + 8 + 8, buf);
2018-12-20 19:26:59 -08:00
}
2018-12-21 09:20:30 -08:00
} while (u8g2_NextPage(&u8g2));
vTaskDelay(pdMS_TO_TICKS(1000));
}
void loopTask(void *pvUser) {
2018-12-21 09:20:30 -08:00
setup();
while (1) {
2018-12-21 09:20:30 -08:00
loop();
}
}
2018-12-20 19:26:59 -08:00
2018-12-31 01:40:41 -07:00
void app_main() {
xTaskCreatePinnedToCore(loopTask, "loopTask", 8192, NULL, 1, NULL, 1);
}