#define BOARD_HELTEC_T114 0x3C
#define MODEL_C6 0xC6 // Heltec Mesh Node T114, 470-510 MHz
#define MODEL_C7 0xC7 // Heltec Mesh Node T114, 863-928 MHz
+ #define MODEL_CB 0xCB // Heltec Mesh Node T114, 863-928 MHz + GPS
#define PRODUCT_TECHO 0x15 // LilyGO T-Echo devices
#define BOARD_TECHO 0x44
#define EINK_3C 0x03
#define MONO_OLED 0x04
#define TFT 0x05
- #define ADAFRUIT_TFT 0x06
#if defined(ESP32)
#define PLATFORM PLATFORM_ESP32
#elif BOARD_MODEL == BOARD_TDECK
#define IS_ESP32S3 true
#define HAS_DISPLAY false
+ #define DISPLAY TFT // to be tested...
#define HAS_CONSOLE false
#define HAS_BLUETOOTH false
#define HAS_BLE true
#define HAS_BUSY true
#define HAS_INPUT true
#define HAS_SLEEP true
- #define DIO2_AS_RF_SWITCH true
#define CONFIG_UART_BUFFER_SIZE 6144
#define CONFIG_QUEUE_SIZE 6144
#define CONFIG_QUEUE_MAX_LENGTH 200
// pins for ST7789 display on Heltec T114
const int DISPLAY_DC = 12;
const int DISPLAY_CS = 11;
- const int DISPLAY_MISO = 11;
+ const int DISPLAY_MISO = 11; // not connected
const int DISPLAY_MOSI = 9;
const int DISPLAY_CLK = 8;
const int DISPLAY_BL_PIN = PIN_T114_TFT_BLGT;
-1 // pin_tcxo_enable
}
};
+
+ #if BOARD_VARIANT == MODEL_CB
+ #define HAS_GPS true
+ #define GPS_BAUD_RATE 9600
+ #define PIN_GPS_RX 37
+ #define PIN_GPS_TX 39
+ #endif
#else
#error An unsupported nRF board was selected. Cannot compile RNode firmware.
#endif
#define ERROR_MEMORY_LOW 0x05
#define ERROR_MODEM_TIMEOUT 0x06
+ #define CMD_GPS 0xA0
+
+ #define GPS_CMD_LAT 0x00
+ #define GPS_CMD_LNG 0x01
+
// Serial logging
#define LOG_MSG 0x2F
arduino-cli lib install "Crypto"
arduino-cli lib install "Adafruit GFX Library"
arduino-cli lib install "GxEPD2"
+ arduino-cli lib install "TinyGPSPlus"
arduino-cli config set library.enable_unsafe_install true
arduino-cli lib install --git-url https://github.com/liamcottle/esp8266-oled-ssd1306#e16cee124fe26490cb14880c679321ad8ac89c95
pip install pyserial rns --upgrade --user --break-system-packages # This looks scary, but it's actually just telling pip to install packages as a user instead of trying to install them systemwide, which bypasses the "externally managed environment" error.
firmware-heltec_t114:
arduino-cli compile --log --fqbn Heltec_nRF52:Heltec_nRF52:HT-n5262 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x3C\""
+firmware-heltec_t114_gps:
+ arduino-cli compile --log --fqbn Heltec_nRF52:Heltec_nRF52:HT-n5262 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x3C\" \"-DBOARD_VARIANT=0xCB\""
+
upload-tbeam:
arduino-cli upload -p $(or $(port), /dev/ttyACM0) --fqbn esp32:esp32:t-beam
@sleep 1
SPIClass interface_spi[1] = {
// SX1262
SPIClass(
- NRF_SPIM3,
+ NRF_SPIM1,
interface_pins[0][3],
interface_pins[0][1],
interface_pins[0][2]
pinMode(PIN_LED_GREEN, OUTPUT);
pinMode(PIN_LED_BLUE, OUTPUT);
delay(200);
+ #elif BOARD_MODEL == BOARD_HELTEC_T114
+ delay(200);
+ pinMode(PIN_VEXT_EN, OUTPUT);
+ digitalWrite(PIN_VEXT_EN, HIGH);
+ delay(100);
#endif
+
if (!eeprom_begin()) { Serial.write("EEPROM initialisation failed.\r\n"); }
#endif
fifo_init(&packet_rdy_interfaces, packet_rdy_interfaces_buf, MAX_INTERFACES);
+ #if HAS_GPS
+ // init GPS
+ gps_s.begin(GPS_BAUD_RATE);
+ #endif
+
// add call to init_channel_stats here? \todo
// Create and configure interface objects
process_serial();
#if HAS_DISPLAY
- #if DISPLAY == OLED
+ #if DISPLAY == OLED || DISPLAY == TFT || DISPLAY == ADAFRUIT_TFT
if (disp_ready) update_display();
#elif DISPLAY == EINK_BW || DISPLAY == EINK_3C
// Display refreshes take so long on e-paper displays that they can disrupt
input_read();
#endif
+ #if HAS_GPS
+ while (gps_s.available() > 0) {
+ if (gps.encode(gps_s.read()) && millis() - last_gps >= GPS_INTERVAL) {
+ kiss_indicate_location();
+ last_gps = millis();
+ }
+ }
+ if (millis() > 5000 && gps.charsProcessed() < 10) {
+ while (true) {
+ Serial.println(F("No GPS detected: check wiring."));
+ }
+ }
+ #endif
+
if (memory_low) {
#if PLATFORM == PLATFORM_ESP32
if (esp_get_free_heap_size() < 8192) {
#include "Input.h"
#endif
+#if HAS_GPS
+ #include "src/misc/gps.h"
+#endif
+
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
#include "Device.h"
#endif
eeprom_erase();
}
+void kiss_indicate_location() {
+ char location[10];
+ int len;
+ int32_t val;
+ if (gps.location.isValid()) {
+ serial_write(FEND);
+ serial_write(CMD_GPS);
+ serial_write(GPS_CMD_LAT);
+ val = gps.location.lat() * 1000000;
+ escaped_serial_write(val>>24);
+ escaped_serial_write(val>>16);
+ escaped_serial_write(val>>8);
+ escaped_serial_write(val);
+ serial_write(FEND);
+
+ serial_write(FEND);
+ serial_write(CMD_GPS);
+ serial_write(GPS_CMD_LNG);
+ val = gps.location.lng() * 1000000;
+ escaped_serial_write(val>>24);
+ escaped_serial_write(val>>16);
+ escaped_serial_write(val>>8);
+ escaped_serial_write(val);
+ serial_write(FEND);
+ }
+}
+
void log_debug(const char* msg) {
serial_write(FEND);
serial_write(LOG_MSG);
--- /dev/null
+#include <TinyGPSPlus.h>
+#include <SoftwareSerial.h>
+
+#define GPS_INTERVAL 5000 // ms
+
+unsigned long last_gps = 0;
+TinyGPSPlus gps;
+SoftwareSerial gps_s(PIN_GPS_RX, PIN_GPS_TX);