diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index db40169f..f4ee900b 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -545,7 +545,8 @@ void MyMesh::onChannelMessageRecv(const mesh::GroupChannel &channel, mesh::Packe 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; @@ -570,7 +571,13 @@ void MyMesh::onChannelMessageRecv(const mesh::GroupChannel &channel, mesh::Packe #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 } diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 6677d49b..8c822a5c 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -74,7 +74,7 @@ static uint32_t _atoi(const char* sp) { /* GLOBAL OBJECTS */ 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); #ifdef DISPLAY_CLASS #include "UITask.h" 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..5a2c59d3 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 = 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); 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) { + _clock->setCurrentTime(getTimestamp()); + _time_sync_needed = false; + } + } + if (isValid()) { + time_valid ++; + } + } } }; \ No newline at end of file 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/t1000-e/target.cpp b/variants/t1000-e/target.cpp index be82ca76..29ca1acd 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 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..e3dd2ec7 100644 --- a/variants/wio-e5-mini/target.cpp +++ b/variants/wio-e5-mini/target.cpp @@ -18,20 +18,14 @@ static const Module::RfSwitchMode_t rfswitch_table[] = { }; VolatileRTCClock rtc_clock; -SensorManager sensors; +WIOE5SensorManager sensors; #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 +65,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_hPa); + + 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..4b510d56 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() {} + 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();