From ece7479843b725d09d9ca8190462318f2c810f54 Mon Sep 17 00:00:00 2001 From: JQ Date: Wed, 28 May 2025 22:21:51 -0700 Subject: [PATCH 1/2] add gps for techo --- variants/techo/platformio.ini | 3 ++ variants/techo/target.cpp | 81 ++++++++++++++++++++++++++++++++++- variants/techo/target.h | 19 +++++++- variants/techo/variant.cpp | 4 +- variants/techo/variant.h | 7 ++- 5 files changed, 106 insertions(+), 8 deletions(-) diff --git a/variants/techo/platformio.ini b/variants/techo/platformio.ini index c4bc8f85..95c9ff84 100644 --- a/variants/techo/platformio.ini +++ b/variants/techo/platformio.ini @@ -25,6 +25,9 @@ build_src_filter = ${nrf52840_techo.build_src_filter} + + +<../variants/techo> +lib_deps = + ${nrf52840_techo.lib_deps} + stevemarple/MicroNMEA @ ^2.0.6 debug_tool = jlink upload_protocol = nrfutil diff --git a/variants/techo/target.cpp b/variants/techo/target.cpp index 880af612..cf807e4d 100644 --- a/variants/techo/target.cpp +++ b/variants/techo/target.cpp @@ -1,6 +1,7 @@ #include #include "target.h" #include +#include TechoBoard 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); +TechoSensorManager sensors = TechoSensorManager(nmea); #ifdef DISPLAY_CLASS DISPLAY_CLASS display; @@ -72,3 +74,80 @@ mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity } + +void TechoSensorManager::start_gps() { + if (!gps_active) { + gps_active = true; + _location->begin(); + } +} + +void TechoSensorManager::stop_gps() { + if (gps_active) { + gps_active = false; + _location->stop(); + } +} + +bool TechoSensorManager::begin() { + Serial1.begin(9600); + + // GPS enabled pin + pinMode(GPS_EN, OUTPUT); + + return true; +} + +bool TechoSensorManager::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, node_altitude); + } + return true; +} + +void TechoSensorManager::loop() { + static long next_gps_update = 0; + + if (!gps_active) { + return; // GPS is not active, skip further processing + } + + _location->loop(); + + if (millis() > next_gps_update) { + if (_location->isValid()) { + node_lat = ((double)_location->getLatitude())/1000000.; + node_lon = ((double)_location->getLongitude())/1000000.; + node_altitude = ((double)_location->getAltitude()) / 1000.0; + MESH_DEBUG_PRINTLN("lat %f lon %f", node_lat, node_lon); + } + next_gps_update = millis() + 1000; + } +} + +int TechoSensorManager::getNumSettings() const { + return 1; // always show GPS setting +} + +const char* TechoSensorManager::getSettingName(int i) const { + return (i == 0) ? "gps" : NULL; +} + +const char* TechoSensorManager::getSettingValue(int i) const { + if (i == 0) { + return gps_active ? "1" : "0"; + } + return NULL; +} + +bool TechoSensorManager::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/techo/target.h b/variants/techo/target.h index 15524111..8fb8b6ca 100644 --- a/variants/techo/target.h +++ b/variants/techo/target.h @@ -7,15 +7,32 @@ #include #include #include +#include #ifdef DISPLAY_CLASS #include #endif +class TechoSensorManager : public SensorManager { + bool gps_active = false; + LocationProvider* _location; + + void start_gps(); + void stop_gps(); +public: + TechoSensorManager(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 TechoBoard board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; -extern SensorManager sensors; +extern TechoSensorManager sensors; #ifdef DISPLAY_CLASS extern DISPLAY_CLASS display; diff --git a/variants/techo/variant.cpp b/variants/techo/variant.cpp index 155aa42d..ad1fd560 100644 --- a/variants/techo/variant.cpp +++ b/variants/techo/variant.cpp @@ -29,6 +29,6 @@ void initVariant() { digitalWrite(PIN_TXCO, HIGH); // shutdown gps - pinMode(PIN_GPS_STANDBY, OUTPUT); - digitalWrite(PIN_GPS_STANDBY, LOW); + pinMode(GPS_EN, OUTPUT); + digitalWrite(GPS_EN, LOW); } diff --git a/variants/techo/variant.h b/variants/techo/variant.h index f553ab42..ef35525a 100644 --- a/variants/techo/variant.h +++ b/variants/techo/variant.h @@ -40,8 +40,8 @@ //////////////////////////////////////////////////////////////////////////////// // UART pin definition -#define PIN_SERIAL1_RX (41) // GPS TX -#define PIN_SERIAL1_TX (40) // GPS RX +#define PIN_SERIAL1_RX PIN_GPS_TX +#define PIN_SERIAL1_TX PIN_GPS_RX //////////////////////////////////////////////////////////////////////////////// // I2C pin definition @@ -127,7 +127,6 @@ extern const int SCK; #define PIN_GPS_RX (41) #define PIN_GPS_TX (40) -#define PIN_GPS_WAKEUP (34) +#define GPS_EN (34) #define PIN_GPS_RESET (37) #define PIN_GPS_PPS (36) -#define PIN_GPS_STANDBY (34) From 25850cbc781249a8cc4a7a6195a8c572a2313393 Mon Sep 17 00:00:00 2001 From: JQ Date: Wed, 28 May 2025 23:21:28 -0700 Subject: [PATCH 2/2] fix pins --- variants/techo/variant.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/variants/techo/variant.h b/variants/techo/variant.h index ef35525a..6aebf82f 100644 --- a/variants/techo/variant.h +++ b/variants/techo/variant.h @@ -125,8 +125,8 @@ extern const int SCK; //////////////////////////////////////////////////////////////////////////////// // GPS -#define PIN_GPS_RX (41) -#define PIN_GPS_TX (40) +#define PIN_GPS_RX (40) +#define PIN_GPS_TX (41) #define GPS_EN (34) #define PIN_GPS_RESET (37) #define PIN_GPS_PPS (36)