diff --git a/variants/heltec_tracker/platformio.ini b/variants/heltec_tracker/platformio.ini index 7b37b810..fdf3089c 100644 --- a/variants/heltec_tracker/platformio.ini +++ b/variants/heltec_tracker/platformio.ini @@ -21,6 +21,8 @@ build_flags = -D USE_PIN_TFT=1 -D PIN_TFT_VDD_CTL=3 ; Vext is connected to VDD which is also connected to LEDA -D PIN_TFT_LEDA_CTL=21 ; LEDK (switches on/off via mosfet to create the ground) + -D PIN_GPS_RX=33 + -D PIN_GPS_TX=34 -D SX126X_DIO2_AS_RF_SWITCH=true -D SX126X_DIO3_TCXO_VOLTAGE=1.8 -D SX126X_CURRENT_LIMIT=130.0f ; for best TX power! @@ -54,5 +56,6 @@ build_src_filter = ${Heltec_tracker_base.build_src_filter} lib_deps = ${Heltec_tracker_base.lib_deps} densaugeo/base64 @ ~1.4.0 + stevemarple/MicroNMEA @ ^2.0.6 adafruit/Adafruit ST7735 and ST7789 Library @ ^1.11.0 \ No newline at end of file diff --git a/variants/heltec_tracker/target.cpp b/variants/heltec_tracker/target.cpp index 27e0ebf9..792ce45b 100644 --- a/variants/heltec_tracker/target.cpp +++ b/variants/heltec_tracker/target.cpp @@ -1,5 +1,6 @@ #include #include "target.h" +#include HeltecV3Board board; @@ -14,7 +15,8 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); -SensorManager sensors; +MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1); +HWTSensorManager sensors = HWTSensorManager(nmea); #ifndef LORA_CR #define LORA_CR 5 @@ -74,3 +76,64 @@ mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity } + +void HWTSensorManager::start_gps() { + gps_active = true; + // init GPS + Serial1.begin(115200, SERIAL_8N1, PIN_GPS_RX, PIN_GPS_TX); + Serial1.println("$CFGSYS,h35155*68"); +} + +void HWTSensorManager::stop_gps() { + gps_active = false; + Serial1.end(); +} + +bool HWTSensorManager::begin() { + return true; +} + +bool HWTSensorManager::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 HWTSensorManager::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.; + //Serial.printf("lat %f lon %f\r\n", _lat, _lon); + } + next_gps_update = millis() + 1000; + } +} + +int HWTSensorManager::getNumSettings() const { return 1; } // just one supported: "gps" (power switch) + +const char* HWTSensorManager::getSettingName(int i) const { + return i == 0 ? "gps" : NULL; +} +const char* HWTSensorManager::getSettingValue(int i) const { + if (i == 0) { + return gps_active ? "1" : "0"; + } + return NULL; +} +bool HWTSensorManager::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/heltec_tracker/target.h b/variants/heltec_tracker/target.h index b6ab2577..422e6f14 100644 --- a/variants/heltec_tracker/target.h +++ b/variants/heltec_tracker/target.h @@ -7,11 +7,29 @@ #include #include #include +#include + +class HWTSensorManager : public SensorManager { + bool gps_active = false; + LocationProvider * _location; + + void start_gps(); + void stop_gps(); +public: + HWTSensorManager(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 HeltecV3Board board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; -extern SensorManager sensors; +extern HWTSensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed();