From 08aad7338b1ab449a307743410026aa3d2d0dc33 Mon Sep 17 00:00:00 2001 From: Florent Date: Sat, 31 May 2025 10:57:22 +0200 Subject: [PATCH 1/7] gps : sync time on fix --- examples/companion_radio/main.cpp | 2 +- src/helpers/sensors/LocationProvider.h | 6 ++++ .../sensors/MicroNMEALocationProvider.h | 29 +++++++++++++++++-- variants/t1000-e/target.cpp | 21 ++++++++++++-- 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 30a1c9cc..8c6c715c 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -1643,7 +1643,7 @@ public: StdRNG fast_rng; SimpleMeshTables tables; -MyMesh the_mesh(radio_driver, fast_rng, *new VolatileRTCClock(), tables); // TODO: test with 'rtc_clock' in target.cpp +MyMesh the_mesh(radio_driver, fast_rng, rtc_clock, tables); void halt() { while (1) ; diff --git a/src/helpers/sensors/LocationProvider.h b/src/helpers/sensors/LocationProvider.h index 056e61e0..f51eea28 100644 --- a/src/helpers/sensors/LocationProvider.h +++ b/src/helpers/sensors/LocationProvider.h @@ -4,13 +4,19 @@ class LocationProvider { +protected: + bool _time_sync_needed = true; public: + virtual void syncTime() { _time_sync_needed = true; } + virtual bool waitingTimeSync() { return _time_sync_needed; } virtual long getLatitude() = 0; virtual long getLongitude() = 0; virtual long getAltitude() = 0; + virtual long satellitesCount() = 0; virtual bool isValid() = 0; virtual long getTimestamp() = 0; + virtual void sendSentence(const char * sentence); virtual void reset(); virtual void begin(); virtual void stop(); diff --git a/src/helpers/sensors/MicroNMEALocationProvider.h b/src/helpers/sensors/MicroNMEALocationProvider.h index 9f439e25..ee6e43eb 100644 --- a/src/helpers/sensors/MicroNMEALocationProvider.h +++ b/src/helpers/sensors/MicroNMEALocationProvider.h @@ -19,13 +19,16 @@ class MicroNMEALocationProvider : public LocationProvider { char _nmeaBuffer[100]; MicroNMEA nmea; + mesh::RTCClock* _clock; Stream* _gps_serial; int _pin_reset; int _pin_en; + long next_check = 0; + long time_valid = 0; public : - MicroNMEALocationProvider(Stream& ser, int pin_reset = GPS_RESET, int pin_en = GPS_EN) : - _gps_serial(&ser), nmea(_nmeaBuffer, sizeof(_nmeaBuffer)), _pin_reset(pin_reset), _pin_en(pin_en) { + MicroNMEALocationProvider(Stream& ser, mesh::RTCClock* clock = &rtc_clock, int pin_reset = GPS_RESET, int pin_en = GPS_EN) : + _gps_serial(&ser), nmea(_nmeaBuffer, sizeof(_nmeaBuffer)), _pin_reset(pin_reset), _pin_en(pin_en), _clock(clock) { if (_pin_reset != -1) { pinMode(_pin_reset, OUTPUT); digitalWrite(_pin_reset, GPS_RESET_FORCE); @@ -59,6 +62,7 @@ public : } } + void syncTime() override { nmea.clear(); LocationProvider::syncTime(); } long getLatitude() override { return nmea.getLatitude(); } long getLongitude() override { return nmea.getLongitude(); } long getAltitude() override { @@ -66,6 +70,7 @@ public : nmea.getAltitude(alt); return alt; } + long satellitesCount() override { return nmea.getNumSatellites(); } bool isValid() override { return nmea.isValid(); } long getTimestamp() override { @@ -73,7 +78,12 @@ public : return dt.unixtime(); } + void sendSentence(const char *sentence) override { + nmea.sendSentence(*_gps_serial, sentence); + } + void loop() override { + while (_gps_serial->available()) { char c = _gps_serial->read(); #ifdef GPS_NMEA_DEBUG @@ -81,5 +91,20 @@ public : #endif nmea.process(c); } + + if (!isValid()) time_valid = 0; + + if (millis() > next_check) { + next_check = millis() + 1000; + if (_time_sync_needed && time_valid > 2) { + if (_clock != NULL) { + rtc_clock.setCurrentTime(getTimestamp()); + _time_sync_needed = false; + } + } + if (isValid()) { + time_valid ++; + } + } } }; \ No newline at end of file diff --git a/variants/t1000-e/target.cpp b/variants/t1000-e/target.cpp index be82ca76..296551e1 100644 --- a/variants/t1000-e/target.cpp +++ b/variants/t1000-e/target.cpp @@ -9,7 +9,7 @@ RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BU WRAPPER_CLASS radio_driver(radio, board); VolatileRTCClock rtc_clock; -MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1); +MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1, &rtc_clock); T1000SensorManager sensors = T1000SensorManager(nmea); #ifdef DISPLAY_CLASS @@ -179,14 +179,26 @@ void T1000SensorManager::loop() { } } -int T1000SensorManager::getNumSettings() const { return 1; } // just one supported: "gps" (power switch) +int T1000SensorManager::getNumSettings() const { return 2; } // just one supported: "gps" (power switch) const char* T1000SensorManager::getSettingName(int i) const { - return i == 0 ? "gps" : NULL; + switch (i) { + case 0: + return "gps"; + break; + case 1: + return "sync"; + break; + default: + return NULL; + break; + } } const char* T1000SensorManager::getSettingValue(int i) const { if (i == 0) { return gps_active ? "1" : "0"; + } else if (i == 1) { + return _nmea->waitingTimeSync() ? "1" : "0"; } return NULL; } @@ -198,6 +210,9 @@ bool T1000SensorManager::setSettingValue(const char* name, const char* value) { start_gps(); } return true; + } else if (strcmp(name, "sync") == 0) { + _nmea->syncTime(); // whatever the value ... + return true; } return false; // not supported } From c8877b3bc717b731caa36500f75e4f69f7d38b0f Mon Sep 17 00:00:00 2001 From: Florent Date: Sat, 31 May 2025 20:29:03 +0200 Subject: [PATCH 2/7] wio_e5 : bme280 support --- variants/wio-e5-mini/platformio.ini | 2 ++ variants/wio-e5-mini/target.cpp | 34 ++++++++++++++++++++++------- variants/wio-e5-mini/target.h | 15 ++++++++++++- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/variants/wio-e5-mini/platformio.ini b/variants/wio-e5-mini/platformio.ini index 55ab0bc8..887304ea 100644 --- a/variants/wio-e5-mini/platformio.ini +++ b/variants/wio-e5-mini/platformio.ini @@ -10,6 +10,8 @@ build_flags = ${stm32_base.build_flags} -I variants/wio-e5-mini build_src_filter = ${stm32_base.build_src_filter} +<../variants/wio-e5-mini> +lib_deps = ${stm32_base.lib_deps} + finitespace/BME280 @ ^3.0.0 [env:wio-e5-mini-repeater] extends = lora_e5_mini diff --git a/variants/wio-e5-mini/target.cpp b/variants/wio-e5-mini/target.cpp index 8ccbe384..7a2b0d39 100644 --- a/variants/wio-e5-mini/target.cpp +++ b/variants/wio-e5-mini/target.cpp @@ -18,20 +18,15 @@ static const Module::RfSwitchMode_t rfswitch_table[] = { }; VolatileRTCClock rtc_clock; -SensorManager sensors; +BME280I2C bme; +WIOE5SensorManager sensors(bme); #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { -// rtc_clock.begin(Wire); - -// #ifdef SX126X_DIO3_TCXO_VOLTAGE -// float tcxo = SX126X_DIO3_TCXO_VOLTAGE; -// #else -// float tcxo = 1.6f; -// #endif + Wire.begin(); radio.setRfSwitchTable(rfswitch_pins, rfswitch_table); @@ -71,3 +66,26 @@ mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity } + +bool WIOE5SensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) { + if (!has_bme) return false; + + float temp(NAN), hum(NAN), pres(NAN); + + BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); + BME280::PresUnit presUnit(BME280::PresUnit_bar); + + _bme->read(pres, temp, hum, tempUnit, presUnit); + + telemetry.addTemperature(TELEM_CHANNEL_SELF, temp); + telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, hum); + telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, pres); + + return true; +} + +bool WIOE5SensorManager::begin() { + has_bme = _bme->begin(); + + return has_bme; +} \ No newline at end of file diff --git a/variants/wio-e5-mini/target.h b/variants/wio-e5-mini/target.h index f7a882ee..daf7e174 100644 --- a/variants/wio-e5-mini/target.h +++ b/variants/wio-e5-mini/target.h @@ -8,6 +8,9 @@ #include #include +#include +#include + class WIOE5Board : public STM32Board { public: const char* getManufacturerName() const override { @@ -21,10 +24,20 @@ public: } }; +class WIOE5SensorManager : public SensorManager { + BME280I2C* _bme; + bool has_bme = false; + +public: + WIOE5SensorManager(BME280I2C& bme) : _bme(&bme) {} + bool begin() override; + bool querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) override; +}; + extern WIOE5Board board; extern WRAPPER_CLASS radio_driver; extern VolatileRTCClock rtc_clock; -extern SensorManager sensors; +extern WIOE5SensorManager sensors; bool radio_init(); uint32_t radio_get_rng_seed(); From ecd2b0be89e5532d6e9b6f368a769b2c6aba006b Mon Sep 17 00:00:00 2001 From: JQ Date: Sat, 31 May 2025 20:55:53 -0700 Subject: [PATCH 3/7] fixing channel name display --- examples/companion_radio/main.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 30a1c9cc..590c764d 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -625,7 +625,8 @@ protected: out_frame[i++] = RESP_CODE_CHANNEL_MSG_RECV; } - out_frame[i++] = findChannelIdx(channel); + uint8_t channel_idx = findChannelIdx(channel); + out_frame[i++] = channel_idx; uint8_t path_len = out_frame[i++] = pkt->isRouteFlood() ? pkt->path_len : 0xFF; out_frame[i++] = TXT_TYPE_PLAIN; @@ -647,7 +648,13 @@ protected: #endif } #ifdef DISPLAY_CLASS - ui_task.newMsg(path_len, "Public", text, offline_queue_len); + // Get the channel name from the channel index + const char* channel_name = "Unknown"; + ChannelDetails channel_details; + if (getChannel(channel_idx, channel_details)) { + channel_name = channel_details.name; + } + ui_task.newMsg(path_len, channel_name, text, offline_queue_len); #endif } From 4c6f146b8b913f4036aad3219f32efc98276ab2b Mon Sep 17 00:00:00 2001 From: Florent Date: Sun, 1 Jun 2025 08:30:53 +0200 Subject: [PATCH 4/7] wioe5: integrate sensor in sensor mgr --- src/helpers/stm32/InternalFileSystem.cpp | 7 +++++-- variants/wio-e5-mini/target.cpp | 9 ++++----- variants/wio-e5-mini/target.h | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/helpers/stm32/InternalFileSystem.cpp b/src/helpers/stm32/InternalFileSystem.cpp index 2714ec6b..dc032eb9 100644 --- a/src/helpers/stm32/InternalFileSystem.cpp +++ b/src/helpers/stm32/InternalFileSystem.cpp @@ -126,11 +126,14 @@ InternalFileSystem::InternalFileSystem(void) bool InternalFileSystem::begin(void) { + volatile bool format_fs; #ifdef FORMAT_FS - this->format(); + format_fs = true; + #else + format_fs = false; // you can always use debugger to force formatting ;) #endif // failed to mount, erase all sector then format and mount again - if ( !Adafruit_LittleFS::begin() ) + if ( format_fs || !Adafruit_LittleFS::begin() ) { // lfs format this->format(); diff --git a/variants/wio-e5-mini/target.cpp b/variants/wio-e5-mini/target.cpp index 7a2b0d39..e3dd2ec7 100644 --- a/variants/wio-e5-mini/target.cpp +++ b/variants/wio-e5-mini/target.cpp @@ -18,8 +18,7 @@ static const Module::RfSwitchMode_t rfswitch_table[] = { }; VolatileRTCClock rtc_clock; -BME280I2C bme; -WIOE5SensorManager sensors(bme); +WIOE5SensorManager sensors; #ifndef LORA_CR #define LORA_CR 5 @@ -73,9 +72,9 @@ bool WIOE5SensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& float temp(NAN), hum(NAN), pres(NAN); BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); - BME280::PresUnit presUnit(BME280::PresUnit_bar); + BME280::PresUnit presUnit(BME280::PresUnit_hPa); - _bme->read(pres, temp, hum, tempUnit, presUnit); + bme.read(pres, temp, hum, tempUnit, presUnit); telemetry.addTemperature(TELEM_CHANNEL_SELF, temp); telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, hum); @@ -85,7 +84,7 @@ bool WIOE5SensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& } bool WIOE5SensorManager::begin() { - has_bme = _bme->begin(); + has_bme = bme.begin(); return has_bme; } \ No newline at end of file diff --git a/variants/wio-e5-mini/target.h b/variants/wio-e5-mini/target.h index daf7e174..4b510d56 100644 --- a/variants/wio-e5-mini/target.h +++ b/variants/wio-e5-mini/target.h @@ -25,11 +25,11 @@ public: }; class WIOE5SensorManager : public SensorManager { - BME280I2C* _bme; + BME280I2C bme; bool has_bme = false; public: - WIOE5SensorManager(BME280I2C& bme) : _bme(&bme) {} + WIOE5SensorManager() {} bool begin() override; bool querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) override; }; From c42e414a0962c5f9fb053467af4db1e04884e5f7 Mon Sep 17 00:00:00 2001 From: Florent Date: Sun, 1 Jun 2025 14:12:22 +0200 Subject: [PATCH 5/7] micronmea: was using global rtc_clock to sync instead of _clock --- src/helpers/sensors/MicroNMEALocationProvider.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/sensors/MicroNMEALocationProvider.h b/src/helpers/sensors/MicroNMEALocationProvider.h index ee6e43eb..a4a2f5d6 100644 --- a/src/helpers/sensors/MicroNMEALocationProvider.h +++ b/src/helpers/sensors/MicroNMEALocationProvider.h @@ -98,7 +98,7 @@ public : next_check = millis() + 1000; if (_time_sync_needed && time_valid > 2) { if (_clock != NULL) { - rtc_clock.setCurrentTime(getTimestamp()); + _clock.setCurrentTime(getTimestamp()); _time_sync_needed = false; } } From 1ac03f5592635875abdf1e53cadcdf307a876ddf Mon Sep 17 00:00:00 2001 From: Florent Date: Sun, 1 Jun 2025 15:32:02 +0200 Subject: [PATCH 6/7] t1000: remove sync custom var --- .../sensors/MicroNMEALocationProvider.h | 2 +- variants/t1000-e/target.cpp | 19 ++----------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/src/helpers/sensors/MicroNMEALocationProvider.h b/src/helpers/sensors/MicroNMEALocationProvider.h index a4a2f5d6..e8b09d9a 100644 --- a/src/helpers/sensors/MicroNMEALocationProvider.h +++ b/src/helpers/sensors/MicroNMEALocationProvider.h @@ -98,7 +98,7 @@ public : next_check = millis() + 1000; if (_time_sync_needed && time_valid > 2) { if (_clock != NULL) { - _clock.setCurrentTime(getTimestamp()); + _clock->setCurrentTime(getTimestamp()); _time_sync_needed = false; } } diff --git a/variants/t1000-e/target.cpp b/variants/t1000-e/target.cpp index 296551e1..29ca1acd 100644 --- a/variants/t1000-e/target.cpp +++ b/variants/t1000-e/target.cpp @@ -179,26 +179,14 @@ void T1000SensorManager::loop() { } } -int T1000SensorManager::getNumSettings() const { return 2; } // just one supported: "gps" (power switch) +int T1000SensorManager::getNumSettings() const { return 1; } // just one supported: "gps" (power switch) const char* T1000SensorManager::getSettingName(int i) const { - switch (i) { - case 0: - return "gps"; - break; - case 1: - return "sync"; - break; - default: - return NULL; - break; - } + return i == 0 ? "gps" : NULL; } const char* T1000SensorManager::getSettingValue(int i) const { if (i == 0) { return gps_active ? "1" : "0"; - } else if (i == 1) { - return _nmea->waitingTimeSync() ? "1" : "0"; } return NULL; } @@ -210,9 +198,6 @@ bool T1000SensorManager::setSettingValue(const char* name, const char* value) { start_gps(); } return true; - } else if (strcmp(name, "sync") == 0) { - _nmea->syncTime(); // whatever the value ... - return true; } return false; // not supported } From 6481ab1e31ca4c3f65e69c288cdd8c982209887b Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Sun, 1 Jun 2025 23:55:57 +1000 Subject: [PATCH 7/7] * MicroNMEALocationProvider: clock param now NULL by default --- src/helpers/sensors/MicroNMEALocationProvider.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/sensors/MicroNMEALocationProvider.h b/src/helpers/sensors/MicroNMEALocationProvider.h index e8b09d9a..5a2c59d3 100644 --- a/src/helpers/sensors/MicroNMEALocationProvider.h +++ b/src/helpers/sensors/MicroNMEALocationProvider.h @@ -27,7 +27,7 @@ class MicroNMEALocationProvider : public LocationProvider { long time_valid = 0; public : - MicroNMEALocationProvider(Stream& ser, mesh::RTCClock* clock = &rtc_clock, int pin_reset = GPS_RESET, int pin_en = GPS_EN) : + MicroNMEALocationProvider(Stream& ser, mesh::RTCClock* clock = NULL, int pin_reset = GPS_RESET, int pin_en = GPS_EN) : _gps_serial(&ser), nmea(_nmeaBuffer, sizeof(_nmeaBuffer)), _pin_reset(pin_reset), _pin_en(pin_en), _clock(clock) { if (_pin_reset != -1) { pinMode(_pin_reset, OUTPUT);