From ae5052fec77de20af245512718c7e8a4ca11fef0 Mon Sep 17 00:00:00 2001 From: JQ Date: Fri, 9 May 2025 20:30:11 -0700 Subject: [PATCH 1/3] t114 gps support --- variants/t114/platformio.ini | 4 ++- variants/t114/target.cpp | 70 +++++++++++++++++++++++++++++++++++- variants/t114/target.h | 20 ++++++++++- variants/t114/variant.h | 10 ++++-- 4 files changed, 99 insertions(+), 5 deletions(-) diff --git a/variants/t114/platformio.ini b/variants/t114/platformio.ini index 0f1047d6..66536586 100644 --- a/variants/t114/platformio.ini +++ b/variants/t114/platformio.ini @@ -71,7 +71,8 @@ build_flags = ; -D ENABLE_PRIVATE_KEY_IMPORT=1 ; -D ENABLE_PRIVATE_KEY_EXPORT=1 ; -D MESH_PACKET_LOGGING=1 -; -D MESH_DEBUG=1 + -D MESH_DEBUG=1 +; -D GPS_NMEA_DEBUG=1 build_src_filter = ${Heltec_t114.build_src_filter} + + @@ -84,6 +85,7 @@ lib_deps = adafruit/Adafruit GFX Library @ ^1.12.1 ${Heltec_t114.lib_deps} densaugeo/base64 @ ~1.4.0 + stevemarple/MicroNMEA @ ^2.0.6 [env:Heltec_t114_companion_radio_usb] extends = Heltec_t114 diff --git a/variants/t114/target.cpp b/variants/t114/target.cpp index 31215e82..f59227f4 100644 --- a/variants/t114/target.cpp +++ b/variants/t114/target.cpp @@ -1,6 +1,7 @@ #include #include "target.h" #include +#include T114Board board; @@ -10,7 +11,8 @@ WRAPPER_CLASS radio_driver(radio, board); VolatileRTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); -SensorManager sensors; +MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1); +T114SensorManager sensors = T114SensorManager(nmea); #ifndef LORA_CR #define LORA_CR 5 @@ -68,3 +70,69 @@ mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity } + +void T114SensorManager::start_gps() { + if (!gps_active) { + gps_active = true; + _location->begin(); + } +} + +void T114SensorManager::stop_gps() { + if (gps_active) { + gps_active = false; + _location->stop(); + } +} + +bool T114SensorManager::begin() { + Serial1.begin(9600); + return true; +} + +bool T114SensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) { + if (requester_permissions & TELEM_PERM_LOCATION) { // does requester have permission? + telemetry.addGPS(TELEM_CHANNEL_SELF, node_lat, node_lon, 0.0f); + } + return true; +} + +void T114SensorManager::loop() { + static long next_gps_update = 0; + + _location->loop(); + + if (millis() > next_gps_update) { + if (_location->isValid()) { + node_lat = ((double)_location->getLatitude())/1000000.; + node_lon = ((double)_location->getLongitude())/1000000.; + MESH_DEBUG_PRINTLN("lat %f lon %f", node_lat, node_lon); + } + next_gps_update = millis() + 1000; + } +} + +int T114SensorManager::getNumSettings() const { return 1; } // just one supported: "gps" (power switch) + +const char* T114SensorManager::getSettingName(int i) const { + return i == 0 ? "gps" : NULL; +} + +const char* T114SensorManager::getSettingValue(int i) const { + if (i == 0) { + return gps_active ? "1" : "0"; + } + return NULL; +} + +bool T114SensorManager::setSettingValue(const char* name, const char* value) { + if (strcmp(name, "gps") == 0) { + if (strcmp(value, "0") == 0) { + stop_gps(); + } else { + start_gps(); + } + return true; + } + return false; // not supported +} diff --git a/variants/t114/target.h b/variants/t114/target.h index b1c05b83..308fb7b9 100644 --- a/variants/t114/target.h +++ b/variants/t114/target.h @@ -7,11 +7,29 @@ #include #include #include +#include + +class T114SensorManager : public SensorManager { + bool gps_active = false; + LocationProvider* _location; + + void start_gps(); + void stop_gps(); +public: + T114SensorManager(LocationProvider &location): _location(&location) { } + bool begin() override; + bool querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) override; + void loop() override; + int getNumSettings() const override; + const char* getSettingName(int i) const override; + const char* getSettingValue(int i) const override; + bool setSettingValue(const char* name, const char* value) override; +}; extern T114Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; -extern SensorManager sensors; +extern T114SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/t114/variant.h b/variants/t114/variant.h index 56fc536d..51b6558a 100644 --- a/variants/t114/variant.h +++ b/variants/t114/variant.h @@ -41,8 +41,8 @@ //////////////////////////////////////////////////////////////////////////////// // UART pin definition -#define PIN_SERIAL1_RX (39) -#define PIN_SERIAL1_TX (37) +#define PIN_SERIAL1_RX (37) +#define PIN_SERIAL1_TX (39) #define PIN_SERIAL2_RX (9) #define PIN_SERIAL2_TX (10) @@ -112,6 +112,12 @@ #define PIN_BUZZER (46) +//////////////////////////////////////////////////////////////////////////////// +// GPS + +#define GPS_EN (21) +#define GPS_RESET (38) + //////////////////////////////////////////////////////////////////////////////// // TFT #define PIN_TFT_SCL (40) From b92e2abe753850e57a5b800ead8acd0458549996 Mon Sep 17 00:00:00 2001 From: JQ Date: Fri, 9 May 2025 20:31:28 -0700 Subject: [PATCH 2/3] remove debug --- variants/t114/platformio.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/variants/t114/platformio.ini b/variants/t114/platformio.ini index 66536586..a896adce 100644 --- a/variants/t114/platformio.ini +++ b/variants/t114/platformio.ini @@ -71,8 +71,7 @@ build_flags = ; -D ENABLE_PRIVATE_KEY_IMPORT=1 ; -D ENABLE_PRIVATE_KEY_EXPORT=1 ; -D MESH_PACKET_LOGGING=1 - -D MESH_DEBUG=1 -; -D GPS_NMEA_DEBUG=1 +; -D MESH_DEBUG=1 build_src_filter = ${Heltec_t114.build_src_filter} + + From e88a710d0f665d7c12254ad89bdd66aa617a06d0 Mon Sep 17 00:00:00 2001 From: JQ Date: Sun, 11 May 2025 09:32:34 -0700 Subject: [PATCH 3/3] don't expose GPD setting unless GPS is connected. --- variants/t114/target.cpp | 29 +++++++++++++++++++++++++---- variants/t114/target.h | 1 + 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/variants/t114/target.cpp b/variants/t114/target.cpp index f59227f4..e8773dbb 100644 --- a/variants/t114/target.cpp +++ b/variants/t114/target.cpp @@ -87,6 +87,25 @@ void T114SensorManager::stop_gps() { bool T114SensorManager::begin() { Serial1.begin(9600); + + // Try to detect if GPS is physically connected to determine if we should expose the setting + pinMode(GPS_EN, OUTPUT); + digitalWrite(GPS_EN, HIGH); // Power on GPS + + // Give GPS a moment to power up and send data + delay(500); + + // We'll consider GPS detected if we see any data on Serial1 + gps_detected = (Serial1.available() > 0); + + if (gps_detected) { + MESH_DEBUG_PRINTLN("GPS detected"); + digitalWrite(GPS_EN, LOW); // Power off GPS until the setting is changed + } else { + MESH_DEBUG_PRINTLN("No GPS detected"); + digitalWrite(GPS_EN, LOW); + } + return true; } @@ -112,21 +131,23 @@ void T114SensorManager::loop() { } } -int T114SensorManager::getNumSettings() const { return 1; } // just one supported: "gps" (power switch) +int T114SensorManager::getNumSettings() const { + return gps_detected ? 1 : 0; // only show GPS setting if GPS is detected +} const char* T114SensorManager::getSettingName(int i) const { - return i == 0 ? "gps" : NULL; + return (gps_detected && i == 0) ? "gps" : NULL; } const char* T114SensorManager::getSettingValue(int i) const { - if (i == 0) { + if (gps_detected && i == 0) { return gps_active ? "1" : "0"; } return NULL; } bool T114SensorManager::setSettingValue(const char* name, const char* value) { - if (strcmp(name, "gps") == 0) { + if (gps_detected && strcmp(name, "gps") == 0) { if (strcmp(value, "0") == 0) { stop_gps(); } else { diff --git a/variants/t114/target.h b/variants/t114/target.h index 308fb7b9..38d0e02a 100644 --- a/variants/t114/target.h +++ b/variants/t114/target.h @@ -11,6 +11,7 @@ class T114SensorManager : public SensorManager { bool gps_active = false; + bool gps_detected = false; LocationProvider* _location; void start_gps();