You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
4.5 KiB

6 years ago
#define U8X8_USE_PINS
#include <driver/uart.h>
#include <esp_log.h>
6 years ago
#include <string.h>
#include <u8g2.h>
6 years ago
#include "sx127x_driver.h"
#include "sx127x_registers.h"
6 years ago
#include "u8g2_esp32_hal.h"
#include "ugv_comms.h"
#include "ugv_config.h"
6 years ago
static const char *TAG = "ugv_main";
6 years ago
6 years ago
u8g2_t u8g2;
6 years ago
sx127x_hndl lora;
void comms_task(void *params);
sx127x_rx_packet_t rx_packet;
6 years ago
void setup_oled(void) {
6 years ago
u8g2_esp32_hal_t u8g2_hal_config = {
.scl = 15,
.sda = 4,
6 years ago
.reset = 16,
};
u8g2_esp32_hal_init(u8g2_hal_config);
u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8g2_esp32_i2c_byte_cb,
u8g2_esp32_gpio_and_delay_cb);
6 years ago
u8g2_InitDisplay(&u8g2);
u8g2_ClearDisplay(&u8g2);
u8g2_SetPowerSave(&u8g2, false);
}
const size_t GPS_BUF_SIZE = 1024;
const char NMEA_OUTPUT_RMCGGA[] =
"$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n";
const char NMEA_SET_UPDATE_1HZ[] = "$PMTK220,1000*1F\r\n";
const char NMEA_Q_RELEASE[] = "$PMTK605*31\r\n";
static void gps_task(void *arg) {
ESP_LOGI(TAG, "gps_task start");
uint8_t * data = malloc(GPS_BUF_SIZE);
size_t read_bytes;
esp_err_t ret;
uart_write_bytes(GPS_UART, NMEA_OUTPUT_RMCGGA, sizeof(NMEA_OUTPUT_RMCGGA));
ret = uart_wait_tx_done(GPS_UART, 1000);
ESP_LOGI(TAG, "sent output rmc and gga: %d", ret);
uart_write_bytes(GPS_UART, NMEA_SET_UPDATE_1HZ, sizeof(NMEA_SET_UPDATE_1HZ));
ret = uart_wait_tx_done(GPS_UART, 1000);
ESP_LOGI(TAG, "sent update 1hz: %d", ret);
vTaskDelay(pdMS_TO_TICKS(100));
uart_write_bytes(GPS_UART, NMEA_Q_RELEASE, sizeof(NMEA_Q_RELEASE));
ret = uart_wait_tx_done(GPS_UART, 1000);
ESP_LOGI(TAG, "sent q release: %d", ret);
while (true) {
read_bytes =
uart_read_bytes(GPS_UART, data, GPS_BUF_SIZE, pdMS_TO_TICKS(100));
if (read_bytes > 0) {
ESP_LOGI(TAG, "gps data: %.*s", read_bytes, data);
}
}
}
void setup_gps(void) {
uart_config_t gps_uart_config;
esp_err_t ret;
// gps_uart_config.baud_rate = 9600;
gps_uart_config.baud_rate = 57600;
gps_uart_config.data_bits = UART_DATA_8_BITS;
gps_uart_config.parity = UART_PARITY_DISABLE;
gps_uart_config.stop_bits = UART_STOP_BITS_1;
gps_uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
gps_uart_config.rx_flow_ctrl_thresh = 122;
gps_uart_config.use_ref_tick = false;
ret = uart_param_config(GPS_UART, &gps_uart_config);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "uart_param_config: %d", ret);
return;
}
uart_set_pin(GPS_UART, 17, 23, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
ret = uart_driver_install(GPS_UART, 1024, 0, 8, NULL, 0);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "uart_driver_install: %d", ret);
return;
}
ESP_LOGI(TAG, "gps uart configured");
xTaskCreate(&gps_task, "gps_task", 2 * 1024, NULL, 1, NULL);
}
void setup(void) {
ESP_LOGI(TAG, "setup");
setup_gps();
6 years ago
setup_oled();
ugv_comms_init();
6 years ago
memset(&rx_packet, 0, sizeof(rx_packet));
}
int32_t lora_rssi;
uint8_t lora_lna_gain;
void loop(void) {
6 years ago
u8g2_FirstPage(&u8g2);
sx127x_recv_packet(lora, &rx_packet, 0);
sx127x_read_rssi(lora, &lora_rssi);
sx127x_read_lna_gain(lora, &lora_lna_gain);
do {
6 years ago
u8g2_DrawRFrame(&u8g2, 0, 0, OLED_W, OLED_H, 4);
6 years ago
multi_heap_info_t heap_info;
heap_caps_get_info(&heap_info, MALLOC_CAP_DEFAULT);
u8g2_SetFont(&u8g2, u8g2_font_4x6_tr);
u8g2_DrawStr(&u8g2, 4, 8, "=====UAS UGV=====");
6 years ago
char buf[32];
memset(buf, 0, 32);
snprintf(buf, 32, "heap allc/free %d/%d", heap_info.total_allocated_bytes,
heap_info.total_free_bytes);
u8g2_DrawStr(&u8g2, 4, 2 * 8, buf);
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);
u8g2_SetFont(&u8g2, u8g2_font_4x6_tr);
snprintf(buf, 40, "lora pkt(rssi: %d, snr: %f)", rx_packet.rssi,
rx_packet.snr * 0.25f);
u8g2_DrawStr(&u8g2, 4, 3 * 8, buf);
snprintf(buf, 40, "%.*s", rx_packet.data_len, rx_packet.data);
u8g2_DrawStr(&u8g2, 4, 4 * 8, buf);
}
snprintf(buf, 40, "rssi: %d lna gain: %d", lora_rssi, lora_lna_gain);
u8g2_DrawStr(&u8g2, 4, 5 * 8, buf);
6 years ago
} while (u8g2_NextPage(&u8g2));
vTaskDelay(pdMS_TO_TICKS(1000));
}
void loopTask(void *pvUser) {
6 years ago
setup();
while (1) {
6 years ago
loop();
}
}
void app_main() {
xTaskCreatePinnedToCore(loopTask, "loopTask", 8192, NULL, 1, NULL, 1);
}