From 534a0c97a7f36fe2caffd1ac111e3f38f6d7fdd4 Mon Sep 17 00:00:00 2001 From: overkillfpv Date: Thu, 5 Mar 2026 21:39:14 +1100 Subject: [PATCH 01/46] Increased preamble to 32 for setPreambleLength(16); // overcomes weird issues with small and big pkts + _radio->setPreambleLength(LORA_SF <= 8 ? 32 : 16); // overcomes weird issues with small and big pkts } float getLastRSSI() const override { return ((CustomLR1110 *)_radio)->getRSSI(); } diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index 2216ca8f..9cc7318a 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -26,6 +26,7 @@ void setFlag(void) { void RadioLibWrapper::begin() { _radio->setPacketReceivedAction(setFlag); // this is also SentComplete interrupt + _radio->setPreambleLength(LORA_SF <= 8 ? 32 : 16); // longer preamble for lower SF improves reliability state = STATE_IDLE; if (_board->getStartupReason() == BD_STARTUP_RX_PACKET) { // received a LoRa packet (while in deep sleep) From a61add2e6a7633f8035ff40bc9ed03f251959dea Mon Sep 17 00:00:00 2001 From: overkillfpv Date: Thu, 5 Mar 2026 22:14:22 +1100 Subject: [PATCH 02/46] Update preamble dynamically to match runtime SF changes via CLI --- src/helpers/radiolib/CustomLLCC68Wrapper.h | 1 + src/helpers/radiolib/CustomLR1110.h | 2 ++ src/helpers/radiolib/CustomLR1110Wrapper.h | 3 ++- src/helpers/radiolib/CustomSTM32WLxWrapper.h | 1 + src/helpers/radiolib/CustomSX1262Wrapper.h | 1 + src/helpers/radiolib/CustomSX1268Wrapper.h | 1 + src/helpers/radiolib/CustomSX1276Wrapper.h | 1 + src/helpers/radiolib/RadioLibWrappers.cpp | 3 ++- src/helpers/radiolib/RadioLibWrappers.h | 1 + 9 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/helpers/radiolib/CustomLLCC68Wrapper.h b/src/helpers/radiolib/CustomLLCC68Wrapper.h index 9e783a95..e62acaff 100644 --- a/src/helpers/radiolib/CustomLLCC68Wrapper.h +++ b/src/helpers/radiolib/CustomLLCC68Wrapper.h @@ -20,6 +20,7 @@ public: int sf = ((CustomLLCC68 *)_radio)->spreadingFactor; return packetScoreInt(snr, sf, packet_len); } + uint8_t getSpreadingFactor() const override { return ((CustomLLCC68 *)_radio)->spreadingFactor; } void doResetAGC() override { sx126xResetAGC((SX126x *)_radio); } }; diff --git a/src/helpers/radiolib/CustomLR1110.h b/src/helpers/radiolib/CustomLR1110.h index b1f68080..8cfb0906 100644 --- a/src/helpers/radiolib/CustomLR1110.h +++ b/src/helpers/radiolib/CustomLR1110.h @@ -27,4 +27,6 @@ class CustomLR1110 : public LR1110 { bool detected = ((irq & RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID) || (irq & RADIOLIB_LR11X0_IRQ_PREAMBLE_DETECTED)); return detected; } + + uint8_t getSpreadingFactor() const { return spreadingFactor; } }; \ No newline at end of file diff --git a/src/helpers/radiolib/CustomLR1110Wrapper.h b/src/helpers/radiolib/CustomLR1110Wrapper.h index be3a9f8d..c5b04233 100644 --- a/src/helpers/radiolib/CustomLR1110Wrapper.h +++ b/src/helpers/radiolib/CustomLR1110Wrapper.h @@ -19,10 +19,11 @@ public: void onSendFinished() override { RadioLibWrapper::onSendFinished(); - _radio->setPreambleLength(LORA_SF <= 8 ? 32 : 16); // overcomes weird issues with small and big pkts + _radio->setPreambleLength(getSpreadingFactor() <= 8 ? 32 : 16); // overcomes weird issues with small and big pkts } float getLastRSSI() const override { return ((CustomLR1110 *)_radio)->getRSSI(); } float getLastSNR() const override { return ((CustomLR1110 *)_radio)->getSNR(); } + uint8_t getSpreadingFactor() const override { return ((CustomLR1110 *)_radio)->getSpreadingFactor(); } int16_t setRxBoostedGainMode(bool en) { return ((CustomLR1110 *)_radio)->setRxBoostedGainMode(en); }; }; diff --git a/src/helpers/radiolib/CustomSTM32WLxWrapper.h b/src/helpers/radiolib/CustomSTM32WLxWrapper.h index e3e52029..cccdc043 100644 --- a/src/helpers/radiolib/CustomSTM32WLxWrapper.h +++ b/src/helpers/radiolib/CustomSTM32WLxWrapper.h @@ -21,6 +21,7 @@ public: int sf = ((CustomSTM32WLx *)_radio)->spreadingFactor; return packetScoreInt(snr, sf, packet_len); } + uint8_t getSpreadingFactor() const override { return ((CustomSTM32WLx *)_radio)->spreadingFactor; } void doResetAGC() override { sx126xResetAGC((SX126x *)_radio); } }; diff --git a/src/helpers/radiolib/CustomSX1262Wrapper.h b/src/helpers/radiolib/CustomSX1262Wrapper.h index 5856720b..ad140b66 100644 --- a/src/helpers/radiolib/CustomSX1262Wrapper.h +++ b/src/helpers/radiolib/CustomSX1262Wrapper.h @@ -20,6 +20,7 @@ public: int sf = ((CustomSX1262 *)_radio)->spreadingFactor; return packetScoreInt(snr, sf, packet_len); } + uint8_t getSpreadingFactor() const override { return ((CustomSX1262 *)_radio)->spreadingFactor; } virtual void powerOff() override { ((CustomSX1262 *)_radio)->sleep(false); } diff --git a/src/helpers/radiolib/CustomSX1268Wrapper.h b/src/helpers/radiolib/CustomSX1268Wrapper.h index 5149fc43..0c97752e 100644 --- a/src/helpers/radiolib/CustomSX1268Wrapper.h +++ b/src/helpers/radiolib/CustomSX1268Wrapper.h @@ -20,6 +20,7 @@ public: int sf = ((CustomSX1268 *)_radio)->spreadingFactor; return packetScoreInt(snr, sf, packet_len); } + uint8_t getSpreadingFactor() const override { return ((CustomSX1268 *)_radio)->spreadingFactor; } void doResetAGC() override { sx126xResetAGC((SX126x *)_radio); } }; diff --git a/src/helpers/radiolib/CustomSX1276Wrapper.h b/src/helpers/radiolib/CustomSX1276Wrapper.h index 28257990..fa613c8e 100644 --- a/src/helpers/radiolib/CustomSX1276Wrapper.h +++ b/src/helpers/radiolib/CustomSX1276Wrapper.h @@ -19,4 +19,5 @@ public: int sf = ((CustomSX1276 *)_radio)->spreadingFactor; return packetScoreInt(snr, sf, packet_len); } + uint8_t getSpreadingFactor() const override { return ((CustomSX1276 *)_radio)->spreadingFactor; } }; diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index 9cc7318a..9260e6df 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -26,7 +26,7 @@ void setFlag(void) { void RadioLibWrapper::begin() { _radio->setPacketReceivedAction(setFlag); // this is also SentComplete interrupt - _radio->setPreambleLength(LORA_SF <= 8 ? 32 : 16); // longer preamble for lower SF improves reliability + _radio->setPreambleLength(getSpreadingFactor() <= 8 ? 32 : 16); // longer preamble for lower SF improves reliability state = STATE_IDLE; if (_board->getStartupReason() == BD_STARTUP_RX_PACKET) { // received a LoRa packet (while in deep sleep) @@ -143,6 +143,7 @@ uint32_t RadioLibWrapper::getEstAirtimeFor(int len_bytes) { bool RadioLibWrapper::startSendRaw(const uint8_t* bytes, int len) { _board->onBeforeTransmit(); + _radio->setPreambleLength(getSpreadingFactor() <= 8 ? 32 : 16); // keep preamble in sync with current SF int err = _radio->startTransmit((uint8_t *) bytes, len); if (err == RADIOLIB_ERR_NONE) { state = STATE_TX_WAIT; diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index b338b03a..c9791a4b 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -38,6 +38,7 @@ public: } virtual float getCurrentRSSI() =0; + virtual uint8_t getSpreadingFactor() const { return LORA_SF; } int getNoiseFloor() const override { return _noise_floor; } void triggerNoiseFloorCalibrate(int threshold) override; From 6fd8c28522c7c5143d2384a91a2116b4d0738102 Mon Sep 17 00:00:00 2001 From: overkillfpv Date: Sat, 7 Mar 2026 12:48:22 +1100 Subject: [PATCH 03/46] Cache preamble SF to avoid redundant setPreambleLength() on every TX --- src/helpers/radiolib/RadioLibWrappers.cpp | 9 +++++++-- src/helpers/radiolib/RadioLibWrappers.h | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index 9260e6df..883cc623 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -26,7 +26,8 @@ void setFlag(void) { void RadioLibWrapper::begin() { _radio->setPacketReceivedAction(setFlag); // this is also SentComplete interrupt - _radio->setPreambleLength(getSpreadingFactor() <= 8 ? 32 : 16); // longer preamble for lower SF improves reliability + _preamble_sf = getSpreadingFactor(); + _radio->setPreambleLength(_preamble_sf <= 8 ? 32 : 16); // longer preamble for lower SF improves reliability state = STATE_IDLE; if (_board->getStartupReason() == BD_STARTUP_RX_PACKET) { // received a LoRa packet (while in deep sleep) @@ -143,7 +144,11 @@ uint32_t RadioLibWrapper::getEstAirtimeFor(int len_bytes) { bool RadioLibWrapper::startSendRaw(const uint8_t* bytes, int len) { _board->onBeforeTransmit(); - _radio->setPreambleLength(getSpreadingFactor() <= 8 ? 32 : 16); // keep preamble in sync with current SF + uint8_t sf = getSpreadingFactor(); + if (sf != _preamble_sf) { + _preamble_sf = sf; + _radio->setPreambleLength(sf <= 8 ? 32 : 16); // update preamble when SF has changed + } int err = _radio->startTransmit((uint8_t *) bytes, len); if (err == RADIOLIB_ERR_NONE) { state = STATE_TX_WAIT; diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index c9791a4b..0dbc8897 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -11,6 +11,7 @@ protected: int16_t _noise_floor, _threshold; uint16_t _num_floor_samples; int32_t _floor_sample_sum; + uint8_t _preamble_sf; void idle(); void startRecv(); @@ -19,7 +20,7 @@ protected: virtual void doResetAGC(); public: - RadioLibWrapper(PhysicalLayer& radio, mesh::MainBoard& board) : _radio(&radio), _board(&board) { n_recv = n_sent = 0; } + RadioLibWrapper(PhysicalLayer& radio, mesh::MainBoard& board) : _radio(&radio), _board(&board), _preamble_sf(0) { n_recv = n_sent = 0; } void begin() override; virtual void powerOff() { _radio->sleep(); } From a434f9eff5d5f851edfb4a902155721a9d9ff99f Mon Sep 17 00:00:00 2001 From: overkillfpv Date: Sun, 8 Mar 2026 05:37:49 +1100 Subject: [PATCH 04/46] simplified the calls --- src/helpers/radiolib/CustomLR1110Wrapper.h | 2 +- src/helpers/radiolib/RadioLibWrappers.cpp | 4 ++-- src/helpers/radiolib/RadioLibWrappers.h | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/helpers/radiolib/CustomLR1110Wrapper.h b/src/helpers/radiolib/CustomLR1110Wrapper.h index c5b04233..2f2cc24c 100644 --- a/src/helpers/radiolib/CustomLR1110Wrapper.h +++ b/src/helpers/radiolib/CustomLR1110Wrapper.h @@ -19,7 +19,7 @@ public: void onSendFinished() override { RadioLibWrapper::onSendFinished(); - _radio->setPreambleLength(getSpreadingFactor() <= 8 ? 32 : 16); // overcomes weird issues with small and big pkts + _radio->setPreambleLength(preambleLengthForSF(getSpreadingFactor())); // overcomes weird issues with small and big pkts } float getLastRSSI() const override { return ((CustomLR1110 *)_radio)->getRSSI(); } diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index 883cc623..18251e43 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -27,7 +27,7 @@ void setFlag(void) { void RadioLibWrapper::begin() { _radio->setPacketReceivedAction(setFlag); // this is also SentComplete interrupt _preamble_sf = getSpreadingFactor(); - _radio->setPreambleLength(_preamble_sf <= 8 ? 32 : 16); // longer preamble for lower SF improves reliability + _radio->setPreambleLength(preambleLengthForSF(_preamble_sf)); // longer preamble for lower SF improves reliability state = STATE_IDLE; if (_board->getStartupReason() == BD_STARTUP_RX_PACKET) { // received a LoRa packet (while in deep sleep) @@ -147,7 +147,7 @@ bool RadioLibWrapper::startSendRaw(const uint8_t* bytes, int len) { uint8_t sf = getSpreadingFactor(); if (sf != _preamble_sf) { _preamble_sf = sf; - _radio->setPreambleLength(sf <= 8 ? 32 : 16); // update preamble when SF has changed + _radio->setPreambleLength(preambleLengthForSF(sf)); // update preamble when SF has changed } int err = _radio->startTransmit((uint8_t *) bytes, len); if (err == RADIOLIB_ERR_NONE) { diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 0dbc8897..8e266dee 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -40,6 +40,7 @@ public: virtual float getCurrentRSSI() =0; virtual uint8_t getSpreadingFactor() const { return LORA_SF; } + static uint16_t preambleLengthForSF(uint8_t sf) { return sf <= 8 ? 32 : 16; } int getNoiseFloor() const override { return _noise_floor; } void triggerNoiseFloorCalibrate(int threshold) override; From 3843c00f54ba1d977accc7b037bb409296238833 Mon Sep 17 00:00:00 2001 From: overkillfpv Date: Tue, 24 Mar 2026 15:05:15 +1100 Subject: [PATCH 05/46] added the preamble update into get est airtime as a prevention for false airtime calcs. Left update in the startsendraw as a safety, but should not be used under normal circumstances --- src/helpers/radiolib/RadioLibWrappers.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index 18251e43..cc1dc001 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -139,6 +139,11 @@ int RadioLibWrapper::recvRaw(uint8_t* bytes, int sz) { } uint32_t RadioLibWrapper::getEstAirtimeFor(int len_bytes) { + uint8_t sf = getSpreadingFactor(); + if (sf != _preamble_sf) { + _preamble_sf = sf; + _radio->setPreambleLength(preambleLengthForSF(sf)); // sync preamble before airtime estimate + } return _radio->getTimeOnAir(len_bytes) / 1000; } From f0ec5d2ae788d3891625b4323117bffa2079d4ba Mon Sep 17 00:00:00 2001 From: overkillfpv Date: Sun, 29 Mar 2026 21:45:16 +1100 Subject: [PATCH 06/46] changed to set the preamble on radio settings change --- src/helpers/radiolib/RadioLibWrappers.cpp | 10 ---------- src/helpers/radiolib/RadioLibWrappers.h | 1 + variants/ebyte_eora_s3/target.cpp | 1 + variants/generic-e22/target.cpp | 1 + variants/heltec_ct62/target.cpp | 1 + variants/heltec_e213/target.cpp | 1 + variants/heltec_e290/target.cpp | 1 + variants/heltec_mesh_solar/target.cpp | 1 + variants/heltec_t114/target.cpp | 1 + variants/heltec_t190/target.cpp | 1 + variants/heltec_tracker/target.cpp | 1 + variants/heltec_tracker_v2/target.cpp | 1 + variants/heltec_v2/target.cpp | 1 + variants/heltec_v3/target.cpp | 1 + variants/heltec_v4/target.cpp | 1 + variants/heltec_wireless_paper/target.cpp | 1 + variants/ikoka_handheld_nrf/target.cpp | 1 + variants/ikoka_nano_nrf/target.cpp | 1 + variants/ikoka_stick_nrf/target.cpp | 1 + variants/keepteen_lt1/target.cpp | 1 + variants/lilygo_t3s3/target.cpp | 1 + variants/lilygo_t3s3_sx1276/target.cpp | 1 + variants/lilygo_tbeam_1w/target.cpp | 1 + variants/lilygo_tbeam_SX1262/target.cpp | 1 + variants/lilygo_tbeam_SX1276/target.cpp | 1 + variants/lilygo_tbeam_supreme_SX1262/target.cpp | 1 + variants/lilygo_tdeck/target.cpp | 1 + variants/lilygo_techo/target.cpp | 1 + variants/lilygo_techo_lite/target.cpp | 1 + variants/lilygo_tlora_c6/target.cpp | 1 + variants/lilygo_tlora_v2_1/target.cpp | 1 + variants/m5stack_unit_c6l/UnitC6LBoard.cpp | 1 + variants/mesh_pocket/target.cpp | 1 + variants/meshadventurer/target.cpp | 1 + variants/meshtiny/target.cpp | 1 + variants/minewsemi_me25ls01/target.cpp | 1 + variants/nano_g2_ultra/target.cpp | 1 + variants/nibble_screen_connect/target.cpp | 1 + variants/promicro/target.cpp | 1 + variants/rak11310/target.cpp | 1 + variants/rak3112/target.cpp | 1 + variants/rak3401/target.cpp | 1 + variants/rak3x72/target.cpp | 1 + variants/rak4631/target.cpp | 1 + variants/rak_wismesh_tag/target.cpp | 1 + variants/rpi_picow/target.cpp | 1 + variants/sensecap_solar/target.cpp | 1 + variants/station_g2/target.cpp | 1 + variants/t1000-e/target.cpp | 1 + variants/tenstar_c3/target.cpp | 1 + variants/thinknode_m1/target.cpp | 1 + variants/thinknode_m2/target.cpp | 1 + variants/thinknode_m3/target.cpp | 1 + variants/thinknode_m5/target.cpp | 1 + variants/thinknode_m6/target.cpp | 1 + variants/tiny_relay/target.cpp | 1 + variants/waveshare_rp2040_lora/target.cpp | 1 + variants/wio-e5-dev/target.cpp | 1 + variants/wio-e5-mini/target.cpp | 1 + variants/wio-tracker-l1/target.cpp | 1 + variants/wio_wm1110/target.cpp | 1 + variants/xiao_c3/target.cpp | 1 + variants/xiao_c6/XiaoC6Board.cpp | 1 + variants/xiao_nrf52/target.cpp | 1 + variants/xiao_rp2040/target.cpp | 1 + variants/xiao_s3_wio/target.cpp | 1 + 66 files changed, 65 insertions(+), 10 deletions(-) diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index cc1dc001..85f3a935 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -139,21 +139,11 @@ int RadioLibWrapper::recvRaw(uint8_t* bytes, int sz) { } uint32_t RadioLibWrapper::getEstAirtimeFor(int len_bytes) { - uint8_t sf = getSpreadingFactor(); - if (sf != _preamble_sf) { - _preamble_sf = sf; - _radio->setPreambleLength(preambleLengthForSF(sf)); // sync preamble before airtime estimate - } return _radio->getTimeOnAir(len_bytes) / 1000; } bool RadioLibWrapper::startSendRaw(const uint8_t* bytes, int len) { _board->onBeforeTransmit(); - uint8_t sf = getSpreadingFactor(); - if (sf != _preamble_sf) { - _preamble_sf = sf; - _radio->setPreambleLength(preambleLengthForSF(sf)); // update preamble when SF has changed - } int err = _radio->startTransmit((uint8_t *) bytes, len); if (err == RADIOLIB_ERR_NONE) { state = STATE_TX_WAIT; diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 8e266dee..66c8aa62 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -41,6 +41,7 @@ public: virtual float getCurrentRSSI() =0; virtual uint8_t getSpreadingFactor() const { return LORA_SF; } static uint16_t preambleLengthForSF(uint8_t sf) { return sf <= 8 ? 32 : 16; } + void updatePreamble(uint8_t sf) { _preamble_sf = sf; _radio->setPreambleLength(preambleLengthForSF(sf)); } int getNoiseFloor() const override { return _noise_floor; } void triggerNoiseFloorCalibrate(int threshold) override; diff --git a/variants/ebyte_eora_s3/target.cpp b/variants/ebyte_eora_s3/target.cpp index 501f560b..9e656cc2 100644 --- a/variants/ebyte_eora_s3/target.cpp +++ b/variants/ebyte_eora_s3/target.cpp @@ -73,6 +73,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/generic-e22/target.cpp b/variants/generic-e22/target.cpp index f76bb979..6ec1915f 100644 --- a/variants/generic-e22/target.cpp +++ b/variants/generic-e22/target.cpp @@ -36,6 +36,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_ct62/target.cpp b/variants/heltec_ct62/target.cpp index 5cc621a1..fad39a27 100644 --- a/variants/heltec_ct62/target.cpp +++ b/variants/heltec_ct62/target.cpp @@ -25,6 +25,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_e213/target.cpp b/variants/heltec_e213/target.cpp index c9233431..70b6ee35 100644 --- a/variants/heltec_e213/target.cpp +++ b/variants/heltec_e213/target.cpp @@ -42,6 +42,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_e290/target.cpp b/variants/heltec_e290/target.cpp index b0c9630c..856ea0af 100644 --- a/variants/heltec_e290/target.cpp +++ b/variants/heltec_e290/target.cpp @@ -42,6 +42,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_mesh_solar/target.cpp b/variants/heltec_mesh_solar/target.cpp index 9852b68f..776f5813 100644 --- a/variants/heltec_mesh_solar/target.cpp +++ b/variants/heltec_mesh_solar/target.cpp @@ -32,6 +32,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_t114/target.cpp b/variants/heltec_t114/target.cpp index 6a30a4d1..36587177 100644 --- a/variants/heltec_t114/target.cpp +++ b/variants/heltec_t114/target.cpp @@ -52,6 +52,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_t190/target.cpp b/variants/heltec_t190/target.cpp index d22f8b8c..c39ca35c 100644 --- a/variants/heltec_t190/target.cpp +++ b/variants/heltec_t190/target.cpp @@ -42,6 +42,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_tracker/target.cpp b/variants/heltec_tracker/target.cpp index f801bacb..95cd9c9b 100644 --- a/variants/heltec_tracker/target.cpp +++ b/variants/heltec_tracker/target.cpp @@ -46,6 +46,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_tracker_v2/target.cpp b/variants/heltec_tracker_v2/target.cpp index c2e26b20..11ae4a60 100644 --- a/variants/heltec_tracker_v2/target.cpp +++ b/variants/heltec_tracker_v2/target.cpp @@ -48,6 +48,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_v2/target.cpp b/variants/heltec_v2/target.cpp index c5a04752..b29f04e4 100644 --- a/variants/heltec_v2/target.cpp +++ b/variants/heltec_v2/target.cpp @@ -41,6 +41,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_v3/target.cpp b/variants/heltec_v3/target.cpp index cdd2535e..bedd737c 100644 --- a/variants/heltec_v3/target.cpp +++ b/variants/heltec_v3/target.cpp @@ -48,6 +48,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_v4/target.cpp b/variants/heltec_v4/target.cpp index 54fc05e8..242ad606 100644 --- a/variants/heltec_v4/target.cpp +++ b/variants/heltec_v4/target.cpp @@ -48,6 +48,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/heltec_wireless_paper/target.cpp b/variants/heltec_wireless_paper/target.cpp index 06f548fc..4455435f 100644 --- a/variants/heltec_wireless_paper/target.cpp +++ b/variants/heltec_wireless_paper/target.cpp @@ -41,6 +41,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/ikoka_handheld_nrf/target.cpp b/variants/ikoka_handheld_nrf/target.cpp index 48244e17..5d7e8b3f 100644 --- a/variants/ikoka_handheld_nrf/target.cpp +++ b/variants/ikoka_handheld_nrf/target.cpp @@ -34,6 +34,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/ikoka_nano_nrf/target.cpp b/variants/ikoka_nano_nrf/target.cpp index be20cfb4..ca128f7c 100644 --- a/variants/ikoka_nano_nrf/target.cpp +++ b/variants/ikoka_nano_nrf/target.cpp @@ -32,6 +32,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/ikoka_stick_nrf/target.cpp b/variants/ikoka_stick_nrf/target.cpp index 4f6befc6..6b48be67 100644 --- a/variants/ikoka_stick_nrf/target.cpp +++ b/variants/ikoka_stick_nrf/target.cpp @@ -32,6 +32,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/keepteen_lt1/target.cpp b/variants/keepteen_lt1/target.cpp index e2e183a7..4cc16496 100644 --- a/variants/keepteen_lt1/target.cpp +++ b/variants/keepteen_lt1/target.cpp @@ -38,6 +38,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_t3s3/target.cpp b/variants/lilygo_t3s3/target.cpp index 28481188..e3fb363c 100644 --- a/variants/lilygo_t3s3/target.cpp +++ b/variants/lilygo_t3s3/target.cpp @@ -36,6 +36,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_t3s3_sx1276/target.cpp b/variants/lilygo_t3s3_sx1276/target.cpp index e7fe07a0..a62724fb 100644 --- a/variants/lilygo_t3s3_sx1276/target.cpp +++ b/variants/lilygo_t3s3_sx1276/target.cpp @@ -42,6 +42,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_tbeam_1w/target.cpp b/variants/lilygo_tbeam_1w/target.cpp index 8cb6bdfa..22f98cd9 100644 --- a/variants/lilygo_tbeam_1w/target.cpp +++ b/variants/lilygo_tbeam_1w/target.cpp @@ -52,6 +52,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_tbeam_SX1262/target.cpp b/variants/lilygo_tbeam_SX1262/target.cpp index f85049d7..11ceaf74 100644 --- a/variants/lilygo_tbeam_SX1262/target.cpp +++ b/variants/lilygo_tbeam_SX1262/target.cpp @@ -43,6 +43,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_tbeam_SX1276/target.cpp b/variants/lilygo_tbeam_SX1276/target.cpp index 5fe82e11..fca380f1 100644 --- a/variants/lilygo_tbeam_SX1276/target.cpp +++ b/variants/lilygo_tbeam_SX1276/target.cpp @@ -48,6 +48,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_tbeam_supreme_SX1262/target.cpp b/variants/lilygo_tbeam_supreme_SX1262/target.cpp index 6fec6f58..a47e23c4 100644 --- a/variants/lilygo_tbeam_supreme_SX1262/target.cpp +++ b/variants/lilygo_tbeam_supreme_SX1262/target.cpp @@ -40,6 +40,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_tdeck/target.cpp b/variants/lilygo_tdeck/target.cpp index 731ecfd8..0e36206d 100644 --- a/variants/lilygo_tdeck/target.cpp +++ b/variants/lilygo_tdeck/target.cpp @@ -43,6 +43,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_techo/target.cpp b/variants/lilygo_techo/target.cpp index 12d222ff..7db5079d 100644 --- a/variants/lilygo_techo/target.cpp +++ b/variants/lilygo_techo/target.cpp @@ -40,6 +40,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_techo_lite/target.cpp b/variants/lilygo_techo_lite/target.cpp index 40a94526..b4240dd2 100644 --- a/variants/lilygo_techo_lite/target.cpp +++ b/variants/lilygo_techo_lite/target.cpp @@ -39,6 +39,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_tlora_c6/target.cpp b/variants/lilygo_tlora_c6/target.cpp index 3566fbe4..5a1a545d 100644 --- a/variants/lilygo_tlora_c6/target.cpp +++ b/variants/lilygo_tlora_c6/target.cpp @@ -36,6 +36,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/lilygo_tlora_v2_1/target.cpp b/variants/lilygo_tlora_v2_1/target.cpp index ead62e79..3a14abd0 100644 --- a/variants/lilygo_tlora_v2_1/target.cpp +++ b/variants/lilygo_tlora_v2_1/target.cpp @@ -37,6 +37,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/m5stack_unit_c6l/UnitC6LBoard.cpp b/variants/m5stack_unit_c6l/UnitC6LBoard.cpp index 6538ef48..9a71d9a8 100644 --- a/variants/m5stack_unit_c6l/UnitC6LBoard.cpp +++ b/variants/m5stack_unit_c6l/UnitC6LBoard.cpp @@ -37,6 +37,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(uint8_t dbm) { diff --git a/variants/mesh_pocket/target.cpp b/variants/mesh_pocket/target.cpp index 6fabb317..ee01f668 100644 --- a/variants/mesh_pocket/target.cpp +++ b/variants/mesh_pocket/target.cpp @@ -32,6 +32,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/meshadventurer/target.cpp b/variants/meshadventurer/target.cpp index 0edd4403..ddcb29eb 100644 --- a/variants/meshadventurer/target.cpp +++ b/variants/meshadventurer/target.cpp @@ -39,6 +39,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/meshtiny/target.cpp b/variants/meshtiny/target.cpp index 9188db17..ad57feb9 100644 --- a/variants/meshtiny/target.cpp +++ b/variants/meshtiny/target.cpp @@ -35,6 +35,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/minewsemi_me25ls01/target.cpp b/variants/minewsemi_me25ls01/target.cpp index fcec1941..c67663d6 100644 --- a/variants/minewsemi_me25ls01/target.cpp +++ b/variants/minewsemi_me25ls01/target.cpp @@ -86,6 +86,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/nano_g2_ultra/target.cpp b/variants/nano_g2_ultra/target.cpp index aad10c50..b7b77f19 100644 --- a/variants/nano_g2_ultra/target.cpp +++ b/variants/nano_g2_ultra/target.cpp @@ -34,6 +34,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/nibble_screen_connect/target.cpp b/variants/nibble_screen_connect/target.cpp index 6edaaad7..9cebae0d 100644 --- a/variants/nibble_screen_connect/target.cpp +++ b/variants/nibble_screen_connect/target.cpp @@ -36,6 +36,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/promicro/target.cpp b/variants/promicro/target.cpp index 61eab91c..5db29f28 100644 --- a/variants/promicro/target.cpp +++ b/variants/promicro/target.cpp @@ -38,6 +38,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/rak11310/target.cpp b/variants/rak11310/target.cpp index 67432998..f0cb3e61 100644 --- a/variants/rak11310/target.cpp +++ b/variants/rak11310/target.cpp @@ -27,6 +27,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/rak3112/target.cpp b/variants/rak3112/target.cpp index 6cddfce5..61b2201e 100644 --- a/variants/rak3112/target.cpp +++ b/variants/rak3112/target.cpp @@ -48,6 +48,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/rak3401/target.cpp b/variants/rak3401/target.cpp index ec4fc28c..e9ae88df 100644 --- a/variants/rak3401/target.cpp +++ b/variants/rak3401/target.cpp @@ -46,6 +46,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/rak3x72/target.cpp b/variants/rak3x72/target.cpp index 48e7f422..161c0145 100644 --- a/variants/rak3x72/target.cpp +++ b/variants/rak3x72/target.cpp @@ -64,6 +64,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/rak4631/target.cpp b/variants/rak4631/target.cpp index ea6a2bd4..4d6ff30b 100644 --- a/variants/rak4631/target.cpp +++ b/variants/rak4631/target.cpp @@ -46,6 +46,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/rak_wismesh_tag/target.cpp b/variants/rak_wismesh_tag/target.cpp index 9646375e..284aa40e 100644 --- a/variants/rak_wismesh_tag/target.cpp +++ b/variants/rak_wismesh_tag/target.cpp @@ -42,6 +42,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/rpi_picow/target.cpp b/variants/rpi_picow/target.cpp index e3d4bf09..87583553 100644 --- a/variants/rpi_picow/target.cpp +++ b/variants/rpi_picow/target.cpp @@ -27,6 +27,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/sensecap_solar/target.cpp b/variants/sensecap_solar/target.cpp index 2c2ff0dc..8a2bad06 100644 --- a/variants/sensecap_solar/target.cpp +++ b/variants/sensecap_solar/target.cpp @@ -27,6 +27,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/station_g2/target.cpp b/variants/station_g2/target.cpp index 026b25de..dd74ae41 100644 --- a/variants/station_g2/target.cpp +++ b/variants/station_g2/target.cpp @@ -49,6 +49,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/t1000-e/target.cpp b/variants/t1000-e/target.cpp index da8fa48b..bbf453ca 100644 --- a/variants/t1000-e/target.cpp +++ b/variants/t1000-e/target.cpp @@ -83,6 +83,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/tenstar_c3/target.cpp b/variants/tenstar_c3/target.cpp index d4f189b5..2b7aa00c 100644 --- a/variants/tenstar_c3/target.cpp +++ b/variants/tenstar_c3/target.cpp @@ -36,6 +36,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/thinknode_m1/target.cpp b/variants/thinknode_m1/target.cpp index ec2438d4..83c9f7e3 100644 --- a/variants/thinknode_m1/target.cpp +++ b/variants/thinknode_m1/target.cpp @@ -33,6 +33,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/thinknode_m2/target.cpp b/variants/thinknode_m2/target.cpp index e7e36d05..a7b873a6 100644 --- a/variants/thinknode_m2/target.cpp +++ b/variants/thinknode_m2/target.cpp @@ -44,6 +44,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/thinknode_m3/target.cpp b/variants/thinknode_m3/target.cpp index ca2b0aa0..547584ea 100644 --- a/variants/thinknode_m3/target.cpp +++ b/variants/thinknode_m3/target.cpp @@ -87,6 +87,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/thinknode_m5/target.cpp b/variants/thinknode_m5/target.cpp index a7a049ef..f617e0e4 100644 --- a/variants/thinknode_m5/target.cpp +++ b/variants/thinknode_m5/target.cpp @@ -51,6 +51,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/thinknode_m6/target.cpp b/variants/thinknode_m6/target.cpp index 36ca8618..346e9c2d 100644 --- a/variants/thinknode_m6/target.cpp +++ b/variants/thinknode_m6/target.cpp @@ -37,6 +37,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/tiny_relay/target.cpp b/variants/tiny_relay/target.cpp index 313dfaa9..c05f552e 100644 --- a/variants/tiny_relay/target.cpp +++ b/variants/tiny_relay/target.cpp @@ -68,6 +68,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) diff --git a/variants/waveshare_rp2040_lora/target.cpp b/variants/waveshare_rp2040_lora/target.cpp index a9121b0c..9773f9b5 100644 --- a/variants/waveshare_rp2040_lora/target.cpp +++ b/variants/waveshare_rp2040_lora/target.cpp @@ -37,6 +37,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/wio-e5-dev/target.cpp b/variants/wio-e5-dev/target.cpp index 3e59b6ce..8d8069eb 100644 --- a/variants/wio-e5-dev/target.cpp +++ b/variants/wio-e5-dev/target.cpp @@ -61,6 +61,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/wio-e5-mini/target.cpp b/variants/wio-e5-mini/target.cpp index 2e95ad6d..338f398d 100644 --- a/variants/wio-e5-mini/target.cpp +++ b/variants/wio-e5-mini/target.cpp @@ -59,6 +59,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/wio-tracker-l1/target.cpp b/variants/wio-tracker-l1/target.cpp index 4575a76c..40bf61ae 100644 --- a/variants/wio-tracker-l1/target.cpp +++ b/variants/wio-tracker-l1/target.cpp @@ -42,6 +42,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/wio_wm1110/target.cpp b/variants/wio_wm1110/target.cpp index 457d5bda..9be3061c 100644 --- a/variants/wio_wm1110/target.cpp +++ b/variants/wio_wm1110/target.cpp @@ -79,6 +79,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/xiao_c3/target.cpp b/variants/xiao_c3/target.cpp index f8ee3d92..ee0fc049 100644 --- a/variants/xiao_c3/target.cpp +++ b/variants/xiao_c3/target.cpp @@ -44,6 +44,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/xiao_c6/XiaoC6Board.cpp b/variants/xiao_c6/XiaoC6Board.cpp index 5710c4cc..dc62c20e 100644 --- a/variants/xiao_c6/XiaoC6Board.cpp +++ b/variants/xiao_c6/XiaoC6Board.cpp @@ -37,6 +37,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/xiao_nrf52/target.cpp b/variants/xiao_nrf52/target.cpp index a8f4162e..1236b935 100644 --- a/variants/xiao_nrf52/target.cpp +++ b/variants/xiao_nrf52/target.cpp @@ -32,6 +32,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/xiao_rp2040/target.cpp b/variants/xiao_rp2040/target.cpp index 6c9a9143..8a0f6508 100644 --- a/variants/xiao_rp2040/target.cpp +++ b/variants/xiao_rp2040/target.cpp @@ -37,6 +37,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { diff --git a/variants/xiao_s3_wio/target.cpp b/variants/xiao_s3_wio/target.cpp index 50981ab6..82f870a9 100644 --- a/variants/xiao_s3_wio/target.cpp +++ b/variants/xiao_s3_wio/target.cpp @@ -44,6 +44,7 @@ void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { radio.setSpreadingFactor(sf); radio.setBandwidth(bw); radio.setCodingRate(cr); + radio_driver.updatePreamble(sf); } void radio_set_tx_power(int8_t dbm) { From c7be216f275df51bd28aed736a935bc0ba574f51 Mon Sep 17 00:00:00 2001 From: Nick Dunklee Date: Fri, 17 Apr 2026 22:00:38 -0600 Subject: [PATCH 07/46] fix(sensors): improve sensor initialization and handling to prevent hangs and handle growth MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a medium-ish refactor to attempt to clean up sensor handling logic both for board stability and future potential growth before the code becomes all spaghetti and meatballs. I'd be curious to see if anyone running sensors out there that knows how to build and flash MeshCore code could give this a try and see how it behaves. It is working fine on my end on multiple nodes. PR notes are gigantic because it is a fundamental behavior repair for sensors, so I wanted to over-explain. Also, if it hadn't been mentioned previously, push-back is always welcome. I'm just spending my time trying to clean up / fix / enhance this corner of the firmware, and want to contribute my improvements back to the project. **Problem:** Current MeshCore code makes no attempt to see what sensors are actually available on the I2C bus at startup and blindly tries to interact with sensors. This has some very bad side-effects, like if a sensor that is unsupported, or has a weird initialization process, the MeshCore node will just hang at boot and never successfully start up and ostensibly looks bricked, or the INA226 and SHT4X both sharing the same address and the code just silently fighting. The current implementation also gloms sensor readouts from the MCU and environment sensors onto the same telemetry channel, with some arbitrary exceptions for incrementing channels based on certain behavioral situations. The MCU temperature and external temperature sensors would appear on channel 1, and it wouldn't be possible to tell which sensor the temperature value was coming from. Per [CayenneLPP](https://github.com/myDevicesIoT/CayenneLPP): *Data Channel: Uniquely identifies each sensor in the device across frames, eg. “indoor sensor”* So this channel division implementation falls inline with what CayenneLPP intended. There are up to 256 channels available. So I tried to model this change in that behavioral style. **Proposed Improvement:** This implementation scans the I2C bus for what devices are present, sets each sensor to its own CayenneLPP channel, and keeps MCU telemetry on channel 1 only. So Channel 1 is always "self" and no confusion can result. Details: - Channel 1 is always the MCU and things about it, so you always know that telemetry is from the board itself. Exception is GPS, GPS stays on channel 1 as well since it is "about the board" even though it's a bit gray-area as GPS can often be a secondary chip. - Each sensor board is allocated to a dedicated CayenneLPP channel, so if you are reading from that channel, you know the data is from that sensor only. (Sensors emitting more than one of the same type of measurement are exceptions.) - `scanI2CBus()` probes addresses 0x08–0x77 with raw `beginTransmission`/`endTransmission`. No sensor library is touched until after this completes. This will prevent sensor-based boot hangs, unknown or unresponsive devices never reach a library init call. - Created `SENSOR_TABLE` a compile-time array that is gated by the existing `ENV_INCLUDE_*` macros. A sentinel `{ 0, nullptr, nullptr, nullptr }` at the end keeps the array non-empty regardless of which sensors are enabled, avoiding zero-length array warnings. - When `begin()` is called, scan first, then loop: skip if address not detected, skip if `init()` returns 0, otherwise register one ActiveSensor entry per sub-channel. - `querySensors()` I replaced the entire #ifdef chain with a 3-line loop. - T1000-E has its own T1000SensorManager, so it should be completely unaffected by this change. - SHT4X quirky initialization behavior is retained. - MLX90614 - git commits around this didn't have any notes as to why it is reporting ambient temperature on a separate channel as well as the object temperature, as the ambient temperature is used internally to compute the object temperature and not really needed for the sensor's purpose - just the same, kept the existing behavior of reporting the ambient temperature one channel above the channel assigned to the sensor - All `bool *_initialized` fields are gone, replaced with `ActiveSensor _active_sensors[16]` (query function pointer and sub-channel index) and `_active_sensor_count. SensorDef` lives entirely in the `.cpp` so the header has no dependency on it. - Details on the INA226 and SHT4X: both default to address 0x44, the old code had a bug and would have both begin() calls fire and they would just fight each other silently. In the new code, the respective sensor code is only called if the device is actually present, however, if both were present simultaneously, SHT4X comes first in the table and would win, and INA226 would return false and be skipped. The INA226 has 16 possible addresses that are configurable in the hardware itself, so in a potential scenario where both sensors would be present, the person implementing that design could take that into account. - BME680 gas resistance will now transmit on the same channel as the rest of BME680 telemetry which is inline with CayenneLPP standards. Coupling this PR with https://github.com/meshcore-dev/MeshCore/pull/2146 streamline the whole sensor telemetry, and with https://github.com/meshcore-dev/MeshCore/pull/2149 will overall improve BME680 handling. The gas resistance sensor actually has a binary library to make it more useful, calibration, accounting for age of sensor, and other improvements, but since that adds more flash consumption, I have omitted that in PRs thus far. - RAK12035 and other current upstream dev branch changes integrated. --- .../sensors/EnvironmentSensorManager.cpp | 745 +++++++++--------- .../sensors/EnvironmentSensorManager.h | 34 +- 2 files changed, 398 insertions(+), 381 deletions(-) diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index 19472406..f61978e9 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -6,6 +6,10 @@ #define TELEM_WIRE &Wire // Use default I2C bus for Environment Sensors #endif +// ============================================================ +// Sensor library includes and static driver instances +// ============================================================ + #ifdef ENV_INCLUDE_BME680 #ifndef TELEM_BME680_ADDRESS #define TELEM_BME680_ADDRESS 0x76 @@ -31,7 +35,7 @@ static Adafruit_AHTX0 AHTX0; #ifndef TELEM_BME280_ADDRESS #define TELEM_BME280_ADDRESS 0x76 // BME280 environmental sensor I2C address #endif -#define TELEM_BME280_SEALEVELPRESSURE_HPA (1013.25) // Athmospheric pressure at sea level +#define TELEM_BME280_SEALEVELPRESSURE_HPA (1013.25) // Atmospheric pressure at sea level #include static Adafruit_BME280 BME280; #endif @@ -40,7 +44,7 @@ static Adafruit_BME280 BME280; #ifndef TELEM_BMP280_ADDRESS #define TELEM_BMP280_ADDRESS 0x76 // BMP280 environmental sensor I2C address #endif -#define TELEM_BMP280_SEALEVELPRESSURE_HPA (1013.25) // Athmospheric pressure at sea level +#define TELEM_BMP280_SEALEVELPRESSURE_HPA (1013.25) // Atmospheric pressure at sea level #include static Adafruit_BMP280 BMP280(TELEM_WIRE); #endif @@ -51,7 +55,7 @@ static Adafruit_SHTC3 SHTC3; #endif #if ENV_INCLUDE_SHT4X -#define TELEM_SHT4X_ADDRESS 0x44 //0x44 - 0x46 +#define TELEM_SHT4X_ADDRESS 0x44 #include static SensirionI2cSht4x SHT4X; #endif @@ -63,7 +67,7 @@ LPS22HBClass LPS22HB(*TELEM_WIRE); #if ENV_INCLUDE_INA3221 #ifndef TELEM_INA3221_ADDRESS -#define TELEM_INA3221_ADDRESS 0x42 // INA3221 3 channel current sensor I2C address +#define TELEM_INA3221_ADDRESS 0x42 // INA3221 3 channel current sensor I2C address #endif #ifndef TELEM_INA3221_SHUNT_VALUE #define TELEM_INA3221_SHUNT_VALUE 0.100 // most variants will have a 0.1 ohm shunts @@ -88,9 +92,9 @@ static Adafruit_INA260 INA260; #endif #if ENV_INCLUDE_INA226 -#define TELEM_INA226_ADDRESS 0x44 +#define TELEM_INA226_ADDRESS 0x44 #define TELEM_INA226_SHUNT_VALUE 0.100 -#define TELEM_INA226_MAX_AMP 0.8 +#define TELEM_INA226_MAX_AMP 0.8 #include static INA226 INA226(TELEM_INA226_ADDRESS, TELEM_WIRE); #endif @@ -161,10 +165,352 @@ public: static RAK12500LocationProvider RAK12500_provider; #endif +// ============================================================ +// I2C bus scanner +// Probes every valid address and records which ones ACK. +// This runs before any sensor library is touched, so a missing +// or misbehaving device cannot stall or crash the boot sequence. +// ============================================================ + +static void scanI2CBus(TwoWire* wire, bool found[128]) { + for (uint8_t addr = 0x08; addr < 0x78; addr++) { + wire->beginTransmission(addr); + found[addr] = (wire->endTransmission() == 0); + } +} + +// ============================================================ +// Per-sensor init and query functions +// +// init(wire, address) — called only when the address was seen +// on the bus. Returns 0 on failure, or the number of +// telemetry channels the sensor will consume (1 for all +// single-output sensors; INA3221 returns one per enabled +// hardware channel; MLX90614 and RAK12035+calibration +// return 2). +// +// query(channel, sub_channel, lpp) — called once per active +// sensor entry during querySensors(). sub_channel is always +// 0 for single-output sensors. +// ============================================================ + +#if ENV_INCLUDE_AHTX0 +static uint8_t init_ahtx0(TwoWire* wire, uint8_t addr) { + return AHTX0.begin(wire, 0, addr) ? 1 : 0; +} +static void query_ahtx0(uint8_t ch, uint8_t, CayenneLPP& lpp) { + sensors_event_t humidity, temp; + AHTX0.getEvent(&humidity, &temp); + lpp.addTemperature(ch, temp.temperature); + lpp.addRelativeHumidity(ch, humidity.relative_humidity); +} +#endif + +#ifdef ENV_INCLUDE_BME680 +static uint8_t init_bme680(TwoWire*, uint8_t addr) { + // Wire was set in the static constructor; begin() takes address only. + return BME680.begin(addr) ? 1 : 0; +} +static void query_bme680(uint8_t ch, uint8_t, CayenneLPP& lpp) { + if (BME680.performReading()) { + lpp.addTemperature(ch, BME680.temperature); + lpp.addRelativeHumidity(ch, BME680.humidity); + lpp.addBarometricPressure(ch, BME680.pressure / 100); + lpp.addAltitude(ch, 44330.0 * (1.0 - pow((BME680.pressure / 100) / TELEM_BME680_SEALEVELPRESSURE_HPA, 0.1903))); + lpp.addAnalogInput(ch, BME680.gas_resistance); + } +} +#endif + +#if ENV_INCLUDE_BME280 +static uint8_t init_bme280(TwoWire* wire, uint8_t addr) { + if (!BME280.begin(addr, wire)) return 0; + BME280.setSampling(Adafruit_BME280::MODE_FORCED, + Adafruit_BME280::SAMPLING_X1, + Adafruit_BME280::SAMPLING_X1, + Adafruit_BME280::SAMPLING_X1, + Adafruit_BME280::FILTER_OFF, + Adafruit_BME280::STANDBY_MS_1000); + return 1; +} +static void query_bme280(uint8_t ch, uint8_t, CayenneLPP& lpp) { + if (BME280.takeForcedMeasurement()) { + lpp.addTemperature(ch, BME280.readTemperature()); + lpp.addRelativeHumidity(ch, BME280.readHumidity()); + lpp.addBarometricPressure(ch, BME280.readPressure() / 100); + lpp.addAltitude(ch, BME280.readAltitude(TELEM_BME280_SEALEVELPRESSURE_HPA)); + } +} +#endif + +#if ENV_INCLUDE_BMP280 +static uint8_t init_bmp280(TwoWire*, uint8_t addr) { + // BMP280 static instance was constructed with TELEM_WIRE; begin() uses it. + return BMP280.begin(addr) ? 1 : 0; +} +static void query_bmp280(uint8_t ch, uint8_t, CayenneLPP& lpp) { + lpp.addTemperature(ch, BMP280.readTemperature()); + lpp.addBarometricPressure(ch, BMP280.readPressure() / 100); + lpp.addAltitude(ch, BMP280.readAltitude(TELEM_BMP280_SEALEVELPRESSURE_HPA)); +} +#endif + +#if ENV_INCLUDE_SHTC3 +static uint8_t init_shtc3(TwoWire* wire, uint8_t) { + // Adafruit_SHTC3::begin() does not accept an address (fixed at 0x70). + return SHTC3.begin(wire) ? 1 : 0; +} +static void query_shtc3(uint8_t ch, uint8_t, CayenneLPP& lpp) { + sensors_event_t humidity, temp; + SHTC3.getEvent(&humidity, &temp); + lpp.addTemperature(ch, temp.temperature); + lpp.addRelativeHumidity(ch, humidity.relative_humidity); +} +#endif + +#if ENV_INCLUDE_SHT4X +static uint8_t init_sht4x(TwoWire* wire, uint8_t addr) { + // SensirionI2cSht4x::begin() does not probe the hardware; use serialNumber() + // as the actual presence check since it performs a real I2C transaction. + SHT4X.begin(*wire, addr); + uint32_t serial = 0; + return (SHT4X.serialNumber(serial) == 0) ? 1 : 0; +} +static void query_sht4x(uint8_t ch, uint8_t, CayenneLPP& lpp) { + float temperature, humidity; + if (SHT4X.measureLowestPrecision(temperature, humidity) == 0) { + lpp.addTemperature(ch, temperature); + lpp.addRelativeHumidity(ch, humidity); + } +} +#endif + +#if ENV_INCLUDE_LPS22HB +static uint8_t init_lps22hb(TwoWire*, uint8_t) { + // LPS22HBClass is constructed with the wire reference; begin() uses it. + return LPS22HB.begin() ? 1 : 0; +} +static void query_lps22hb(uint8_t ch, uint8_t, CayenneLPP& lpp) { + lpp.addTemperature(ch, LPS22HB.readTemperature()); + lpp.addBarometricPressure(ch, LPS22HB.readPressure() * 10); // convert kPa to hPa +} +#endif + +#if ENV_INCLUDE_INA3221 +static uint8_t init_ina3221(TwoWire* wire, uint8_t addr) { + if (!INA3221.begin(addr, wire)) return 0; + for (int i = 0; i < TELEM_INA3221_NUM_CHANNELS; i++) { + INA3221.setShuntResistance(i, TELEM_INA3221_SHUNT_VALUE); + } + // Each enabled hardware channel becomes its own telemetry channel. + uint8_t enabled = 0; + for (int i = 0; i < TELEM_INA3221_NUM_CHANNELS; i++) { + if (INA3221.isChannelEnabled(i)) enabled++; + } + return enabled > 0 ? enabled : 1; +} +static void query_ina3221(uint8_t ch, uint8_t sub_ch, CayenneLPP& lpp) { + // sub_ch is the index of the nth enabled hardware channel. + uint8_t seen = 0; + for (int i = 0; i < TELEM_INA3221_NUM_CHANNELS; i++) { + if (INA3221.isChannelEnabled(i)) { + if (seen == sub_ch) { + float v = INA3221.getBusVoltage(i); + float c = INA3221.getCurrentAmps(i); + lpp.addVoltage(ch, v); + lpp.addCurrent(ch, c); + lpp.addPower(ch, v * c); + return; + } + seen++; + } + } +} +#endif + +#if ENV_INCLUDE_INA219 +static uint8_t init_ina219(TwoWire* wire, uint8_t) { + // INA219 static instance was constructed with the address; begin() uses it. + return INA219.begin(wire) ? 1 : 0; +} +static void query_ina219(uint8_t ch, uint8_t, CayenneLPP& lpp) { + lpp.addVoltage(ch, INA219.getBusVoltage_V()); + lpp.addCurrent(ch, INA219.getCurrent_mA() / 1000.0f); + lpp.addPower(ch, INA219.getPower_mW() / 1000.0f); +} +#endif + +#if ENV_INCLUDE_INA260 +static uint8_t init_ina260(TwoWire* wire, uint8_t addr) { + return INA260.begin(addr, wire) ? 1 : 0; +} +static void query_ina260(uint8_t ch, uint8_t, CayenneLPP& lpp) { + lpp.addVoltage(ch, INA260.readBusVoltage() / 1000.0f); + lpp.addCurrent(ch, INA260.readCurrent() / 1000.0f); + lpp.addPower(ch, INA260.readPower() / 1000.0f); +} +#endif + +#if ENV_INCLUDE_INA226 +static uint8_t init_ina226(TwoWire*, uint8_t) { + // INA226 static instance was constructed with address and wire. + if (!INA226.begin()) return 0; + INA226.setMaxCurrentShunt(TELEM_INA226_MAX_AMP, TELEM_INA226_SHUNT_VALUE); + return 1; +} +static void query_ina226(uint8_t ch, uint8_t, CayenneLPP& lpp) { + lpp.addVoltage(ch, INA226.getBusVoltage()); + lpp.addCurrent(ch, INA226.getCurrent_mA() / 1000.0f); + lpp.addPower(ch, INA226.getPower_mW() / 1000.0f); +} +#endif + +#if ENV_INCLUDE_MLX90614 +static uint8_t init_mlx90614(TwoWire* wire, uint8_t addr) { + return MLX90614.begin(addr, wire) ? 2 : 0; // 2 channels: object temp, ambient temp +} +static void query_mlx90614(uint8_t ch, uint8_t sub_ch, CayenneLPP& lpp) { + if (sub_ch == 0) + lpp.addTemperature(ch, MLX90614.readObjectTempC()); + else + lpp.addTemperature(ch, MLX90614.readAmbientTempC()); +} +#endif + +#if ENV_INCLUDE_VL53L0X +static uint8_t init_vl53l0x(TwoWire* wire, uint8_t addr) { + return VL53L0X.begin(addr, false, wire) ? 1 : 0; +} +static void query_vl53l0x(uint8_t ch, uint8_t, CayenneLPP& lpp) { + VL53L0X_RangingMeasurementData_t measure; + VL53L0X.rangingTest(&measure, false); + lpp.addDistance(ch, measure.RangeStatus != 4 ? measure.RangeMilliMeter / 1000.0f : 0.0f); +} +#endif + +#ifdef ENV_INCLUDE_BMP085 +static uint8_t init_bmp085(TwoWire* wire, uint8_t) { + return BMP085.begin(0, wire) ? 1 : 0; // mode 0 = ULTRALOWPOWER +} +static void query_bmp085(uint8_t ch, uint8_t, CayenneLPP& lpp) { + lpp.addTemperature(ch, BMP085.readTemperature()); + lpp.addBarometricPressure(ch, BMP085.readPressure() / 100); + lpp.addAltitude(ch, BMP085.readAltitude(TELEM_BMP085_SEALEVELPRESSURE_HPA * 100)); +} +#endif + +#if ENV_INCLUDE_RAK12035 +static uint8_t init_rak12035(TwoWire* wire, uint8_t addr) { + // RAK12035 requires setup() before begin(). + RAK12035.setup(*wire); + if (!RAK12035.begin(addr)) return 0; +#ifdef ENABLE_RAK12035_CALIBRATION + return 2; // moisture channel + calibration channel +#else + return 1; +#endif +} +static void query_rak12035(uint8_t ch, uint8_t sub_ch, CayenneLPP& lpp) { + if (sub_ch == 0) { + lpp.addTemperature(ch, RAK12035.get_sensor_temperature()); + lpp.addPercentage(ch, RAK12035.get_sensor_moisture()); + } else { +#ifdef ENABLE_RAK12035_CALIBRATION + float cap = RAK12035.get_sensor_capacitance(); + float wet = RAK12035.get_humidity_full(); + float dry = RAK12035.get_humidity_zero(); + lpp.addFrequency(ch, cap); + lpp.addTemperature(ch, wet); + lpp.addPower(ch, dry); + if (cap > dry) RAK12035.set_humidity_zero(cap); + if (cap < wet) RAK12035.set_humidity_full(cap); +#endif + } +} +#endif + +// ============================================================ +// Sensor descriptor table +// +// Each entry maps an I2C address to a sensor's init and query +// functions. Only entries whose ENV_INCLUDE_* guard is defined +// are compiled in. The sentinel at the end keeps the array +// non-empty regardless of which sensors are enabled. +// +// Ordering here determines channel assignment at runtime: +// the first detected+initialized sensor gets channel 2, the +// next gets channel 3, and so on. +// ============================================================ + +struct SensorDef { + uint8_t address; + const char* name; + uint8_t (*init)(TwoWire* wire, uint8_t address); + void (*query)(uint8_t channel, uint8_t sub_channel, CayenneLPP& telemetry); +}; + +static const SensorDef SENSOR_TABLE[] = { +#if ENV_INCLUDE_AHTX0 + { TELEM_AHTX_ADDRESS, "AHT10/AHT20", init_ahtx0, query_ahtx0 }, +#endif +#ifdef ENV_INCLUDE_BME680 + { TELEM_BME680_ADDRESS, "BME680", init_bme680, query_bme680 }, +#endif +#if ENV_INCLUDE_BME280 + { TELEM_BME280_ADDRESS, "BME280", init_bme280, query_bme280 }, +#endif +#if ENV_INCLUDE_BMP280 + { TELEM_BMP280_ADDRESS, "BMP280", init_bmp280, query_bmp280 }, +#endif +#if ENV_INCLUDE_SHTC3 + { 0x70, "SHTC3", init_shtc3, query_shtc3 }, +#endif +#if ENV_INCLUDE_SHT4X + { TELEM_SHT4X_ADDRESS, "SHT4X", init_sht4x, query_sht4x }, +#endif +#if ENV_INCLUDE_LPS22HB + { 0x5C, "LPS22HB", init_lps22hb, query_lps22hb }, +#endif +#if ENV_INCLUDE_INA3221 + { TELEM_INA3221_ADDRESS, "INA3221", init_ina3221, query_ina3221 }, +#endif +#if ENV_INCLUDE_INA219 + { TELEM_INA219_ADDRESS, "INA219", init_ina219, query_ina219 }, +#endif +#if ENV_INCLUDE_INA260 + { TELEM_INA260_ADDRESS, "INA260", init_ina260, query_ina260 }, +#endif +#if ENV_INCLUDE_INA226 + { TELEM_INA226_ADDRESS, "INA226", init_ina226, query_ina226 }, +#endif +#if ENV_INCLUDE_MLX90614 + { TELEM_MLX90614_ADDRESS,"MLX90614", init_mlx90614, query_mlx90614 }, +#endif +#if ENV_INCLUDE_VL53L0X + { TELEM_VL53L0X_ADDRESS, "VL53L0X", init_vl53l0x, query_vl53l0x }, +#endif +#ifdef ENV_INCLUDE_BMP085 + { 0x77, "BMP085", init_bmp085, query_bmp085 }, +#endif +#if ENV_INCLUDE_RAK12035 + { TELEM_RAK12035_ADDRESS,"RAK12035", init_rak12035, query_rak12035 }, +#endif + { 0, nullptr, nullptr, nullptr } // sentinel — keeps the array non-empty +}; + +static const size_t SENSOR_TABLE_SIZE = (sizeof(SENSOR_TABLE) / sizeof(SENSOR_TABLE[0])) - 1; + +// ============================================================ +// begin() — scan the I2C bus, then initialize only what was +// found. A sensor whose address does not ACK during the scan +// is never touched by a library call, preventing hangs or +// crashes caused by absent or misbehaving hardware. +// ============================================================ + bool EnvironmentSensorManager::begin() { #if ENV_INCLUDE_GPS #ifdef RAK_WISBLOCK_GPS - rakGPSInit(); //probe base board/sockets for GPS + rakGPSInit(); #else initBasicGPS(); #endif @@ -181,361 +527,52 @@ bool EnvironmentSensorManager::begin() { MESH_DEBUG_PRINTLN("Second I2C initialized on pins SDA: %d SCL: %d", ENV_PIN_SDA, ENV_PIN_SCL); #endif - #if ENV_INCLUDE_AHTX0 - if (AHTX0.begin(TELEM_WIRE, 0, TELEM_AHTX_ADDRESS)) { - MESH_DEBUG_PRINTLN("Found AHT10/AHT20 at address: %02X", TELEM_AHTX_ADDRESS); - AHTX0_initialized = true; - } else { - AHTX0_initialized = false; - MESH_DEBUG_PRINTLN("AHT10/AHT20 was not found at I2C address %02X", TELEM_AHTX_ADDRESS); - } - #endif + // Scan the I2C bus before touching any sensor library. + bool detected[128] = {}; + scanI2CBus(TELEM_WIRE, detected); - #if ENV_INCLUDE_BME680 - if (BME680.begin(TELEM_BME680_ADDRESS)) { - MESH_DEBUG_PRINTLN("Found BME680 at address: %02X", TELEM_BME680_ADDRESS); - BME680_initialized = true; - } else { - BME680_initialized = false; - MESH_DEBUG_PRINTLN("BME680 was not found at I2C address %02X", TELEM_BME680_ADDRESS); - } - #endif - - #if ENV_INCLUDE_BME280 - if (BME280.begin(TELEM_BME280_ADDRESS, TELEM_WIRE)) { - MESH_DEBUG_PRINTLN("Found BME280 at address: %02X", TELEM_BME280_ADDRESS); - MESH_DEBUG_PRINTLN("BME sensor ID: %02X", BME280.sensorID()); - // Reduce self-heating: single-shot conversions, light oversampling, long standby. - BME280.setSampling(Adafruit_BME280::MODE_FORCED, - Adafruit_BME280::SAMPLING_X1, // temperature - Adafruit_BME280::SAMPLING_X1, // pressure - Adafruit_BME280::SAMPLING_X1, // humidity - Adafruit_BME280::FILTER_OFF, - Adafruit_BME280::STANDBY_MS_1000); - BME280_initialized = true; - } else { - BME280_initialized = false; - MESH_DEBUG_PRINTLN("BME280 was not found at I2C address %02X", TELEM_BME280_ADDRESS); - } - #endif - - #if ENV_INCLUDE_BMP280 - if (BMP280.begin(TELEM_BMP280_ADDRESS)) { - MESH_DEBUG_PRINTLN("Found BMP280 at address: %02X", TELEM_BMP280_ADDRESS); - MESH_DEBUG_PRINTLN("BMP sensor ID: %02X", BMP280.sensorID()); - BMP280_initialized = true; - } else { - BMP280_initialized = false; - MESH_DEBUG_PRINTLN("BMP280 was not found at I2C address %02X", TELEM_BMP280_ADDRESS); - } - #endif - - #if ENV_INCLUDE_SHTC3 - if (SHTC3.begin(TELEM_WIRE)) { - MESH_DEBUG_PRINTLN("Found sensor: SHTC3"); - SHTC3_initialized = true; - } else { - SHTC3_initialized = false; - MESH_DEBUG_PRINTLN("SHTC3 was not found at I2C address %02X", 0x70); - } - #endif - - - #if ENV_INCLUDE_SHT4X - SHT4X.begin(*TELEM_WIRE, TELEM_SHT4X_ADDRESS); - uint32_t serialNumber = 0; - int16_t sht4x_error; - sht4x_error = SHT4X.serialNumber(serialNumber); - if (sht4x_error == 0) { - MESH_DEBUG_PRINTLN("Found SHT4X at address: %02X", TELEM_SHT4X_ADDRESS); - SHT4X_initialized = true; - } else { - SHT4X_initialized = false; - MESH_DEBUG_PRINTLN("SHT4X was not found at I2C address %02X", TELEM_SHT4X_ADDRESS); - } - #endif - - #if ENV_INCLUDE_LPS22HB - if (LPS22HB.begin()) { - MESH_DEBUG_PRINTLN("Found sensor: LPS22HB"); - LPS22HB_initialized = true; - } else { - LPS22HB_initialized = false; - MESH_DEBUG_PRINTLN("LPS22HB was not found at I2C address %02X", 0x5C); - } - #endif - - #if ENV_INCLUDE_INA3221 - if (INA3221.begin(TELEM_INA3221_ADDRESS, TELEM_WIRE)) { - MESH_DEBUG_PRINTLN("Found INA3221 at address: %02X", TELEM_INA3221_ADDRESS); - MESH_DEBUG_PRINTLN("%04X %04X", INA3221.getDieID(), INA3221.getManufacturerID()); - - for(int i = 0; i < 3; i++) { - INA3221.setShuntResistance(i, TELEM_INA3221_SHUNT_VALUE); + // Walk the sensor table and initialize only detected devices. + _active_sensor_count = 0; + for (size_t i = 0; i < SENSOR_TABLE_SIZE && _active_sensor_count < MAX_ACTIVE_SENSORS; i++) { + const SensorDef& def = SENSOR_TABLE[i]; + if (!detected[def.address]) { + MESH_DEBUG_PRINTLN("%s not detected at I2C address %02X", def.name, def.address); + continue; + } + uint8_t n = def.init(TELEM_WIRE, def.address); + if (n == 0) { + MESH_DEBUG_PRINTLN("%s found at %02X but failed to initialize", def.name, def.address); + continue; + } + MESH_DEBUG_PRINTLN("Found %s at address: %02X", def.name, def.address); + for (uint8_t sub = 0; sub < n && _active_sensor_count < MAX_ACTIVE_SENSORS; sub++) { + _active_sensors[_active_sensor_count++] = { def.query, sub }; } - INA3221_initialized = true; - } else { - INA3221_initialized = false; - MESH_DEBUG_PRINTLN("INA3221 was not found at I2C address %02X", TELEM_INA3221_ADDRESS); } - #endif - - #if ENV_INCLUDE_INA219 - if (INA219.begin(TELEM_WIRE)) { - MESH_DEBUG_PRINTLN("Found INA219 at address: %02X", TELEM_INA219_ADDRESS); - INA219_initialized = true; - } else { - INA219_initialized = false; - MESH_DEBUG_PRINTLN("INA219 was not found at I2C address %02X", TELEM_INA219_ADDRESS); - } - #endif - - #if ENV_INCLUDE_INA260 - if (INA260.begin(TELEM_INA260_ADDRESS, TELEM_WIRE)) { - MESH_DEBUG_PRINTLN("Found INA260 at address: %02X", TELEM_INA260_ADDRESS); - INA260_initialized = true; - } else { - INA260_initialized = false; - MESH_DEBUG_PRINTLN("INA260 was not found at I2C address %02X", TELEM_INA260_ADDRESS); - } - #endif - - #if ENV_INCLUDE_INA226 - if (INA226.begin()) { - MESH_DEBUG_PRINTLN("Found INA226 at address: %02X", TELEM_INA226_ADDRESS); - INA226.setMaxCurrentShunt(TELEM_INA226_MAX_AMP, TELEM_INA226_SHUNT_VALUE); - INA226_initialized = true; - } else { - INA226_initialized = false; - MESH_DEBUG_PRINTLN("INA226 was not found at I2C address %02X", TELEM_INA226_ADDRESS); - } - #endif - - #if ENV_INCLUDE_MLX90614 - if (MLX90614.begin(TELEM_MLX90614_ADDRESS, TELEM_WIRE)) { - MESH_DEBUG_PRINTLN("Found MLX90614 at address: %02X", TELEM_MLX90614_ADDRESS); - MLX90614_initialized = true; - } else { - MLX90614_initialized = false; - MESH_DEBUG_PRINTLN("MLX90614 was not found at I2C address %02X", TELEM_MLX90614_ADDRESS); - } - #endif - - #if ENV_INCLUDE_VL53L0X - if (VL53L0X.begin(TELEM_VL53L0X_ADDRESS, false, TELEM_WIRE)) { - MESH_DEBUG_PRINTLN("Found VL53L0X at address: %02X", TELEM_VL53L0X_ADDRESS); - VL53L0X_initialized = true; - } else { - VL53L0X_initialized = false; - MESH_DEBUG_PRINTLN("VL53L0X was not found at I2C address %02X", TELEM_VL53L0X_ADDRESS); - } - #endif - - #if ENV_INCLUDE_BMP085 - // First argument is MODE (aka oversampling) - // choose ULTRALOWPOWER - if (BMP085.begin(0, TELEM_WIRE)) { - MESH_DEBUG_PRINTLN("Found sensor BMP085"); - BMP085_initialized = true; - } else { - BMP085_initialized = false; - MESH_DEBUG_PRINTLN("BMP085 was not found at I2C address %02X", 0x77); - } - #endif - - #if ENV_INCLUDE_RAK12035 - RAK12035.setup(*TELEM_WIRE); - if (RAK12035.begin(TELEM_RAK12035_ADDRESS)) { - MESH_DEBUG_PRINTLN("Found sensor RAK12035 at address: %02X", TELEM_RAK12035_ADDRESS); - RAK12035_initialized = true; - } else { - RAK12035_initialized = false; - MESH_DEBUG_PRINTLN("RAK12035 was not found at I2C address %02X", TELEM_RAK12035_ADDRESS); - } - #endif return true; } +// ============================================================ +// querySensors() — GPS stays on channel 1; each active sensor +// gets the next available channel in the order it was +// initialized. +// ============================================================ + bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) { next_available_channel = TELEM_CHANNEL_SELF + 1; if (requester_permissions & TELEM_PERM_LOCATION && gps_active) { - telemetry.addGPS(TELEM_CHANNEL_SELF, node_lat, node_lon, node_altitude); // allow lat/lon via telemetry even if no GPS is detected + telemetry.addGPS(TELEM_CHANNEL_SELF, node_lat, node_lon, node_altitude); } if (requester_permissions & TELEM_PERM_ENVIRONMENT) { - - #if ENV_INCLUDE_AHTX0 - if (AHTX0_initialized) { - sensors_event_t humidity, temp; - AHTX0.getEvent(&humidity, &temp); - telemetry.addTemperature(TELEM_CHANNEL_SELF, temp.temperature); - telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, humidity.relative_humidity); - } - #endif - - #if ENV_INCLUDE_BME680 - if (BME680_initialized) { - if (BME680.performReading()) { - telemetry.addTemperature(TELEM_CHANNEL_SELF, BME680.temperature); - telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, BME680.humidity); - telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, BME680.pressure / 100); - telemetry.addAltitude(TELEM_CHANNEL_SELF, 44330.0 * (1.0 - pow((BME680.pressure / 100) / TELEM_BME680_SEALEVELPRESSURE_HPA, 0.1903))); - telemetry.addAnalogInput(next_available_channel, BME680.gas_resistance); - next_available_channel++; - } - } - #endif - - #if ENV_INCLUDE_BME280 - if (BME280_initialized) { - if (BME280.takeForcedMeasurement()) { // trigger a fresh reading in forced mode - telemetry.addTemperature(TELEM_CHANNEL_SELF, BME280.readTemperature()); - telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, BME280.readHumidity()); - telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, BME280.readPressure()/100); - telemetry.addAltitude(TELEM_CHANNEL_SELF, BME280.readAltitude(TELEM_BME280_SEALEVELPRESSURE_HPA)); - } - } - #endif - - #if ENV_INCLUDE_BMP280 - if (BMP280_initialized) { - telemetry.addTemperature(TELEM_CHANNEL_SELF, BMP280.readTemperature()); - telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, BMP280.readPressure()/100); - telemetry.addAltitude(TELEM_CHANNEL_SELF, BMP280.readAltitude(TELEM_BMP280_SEALEVELPRESSURE_HPA)); - } - #endif - - #if ENV_INCLUDE_SHTC3 - if (SHTC3_initialized) { - sensors_event_t humidity, temp; - SHTC3.getEvent(&humidity, &temp); - - telemetry.addTemperature(TELEM_CHANNEL_SELF, temp.temperature); - telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, humidity.relative_humidity); - } - #endif - - #if ENV_INCLUDE_SHT4X - if (SHT4X_initialized) { - float sht4x_humidity, sht4x_temperature; - int16_t sht4x_error; - sht4x_error = SHT4X.measureLowestPrecision(sht4x_temperature, sht4x_humidity); - if (sht4x_error == 0) { - telemetry.addTemperature(TELEM_CHANNEL_SELF, sht4x_temperature); - telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, sht4x_humidity); - } - } - #endif - - #if ENV_INCLUDE_LPS22HB - if (LPS22HB_initialized) { - telemetry.addTemperature(TELEM_CHANNEL_SELF, LPS22HB.readTemperature()); - telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, LPS22HB.readPressure() * 10); // convert kPa to hPa - } - #endif - - #if ENV_INCLUDE_INA3221 - if (INA3221_initialized) { - for(int i = 0; i < TELEM_INA3221_NUM_CHANNELS; i++) { - // add only enabled INA3221 channels to telemetry - if (INA3221.isChannelEnabled(i)) { - float voltage = INA3221.getBusVoltage(i); - float current = INA3221.getCurrentAmps(i); - telemetry.addVoltage(next_available_channel, voltage); - telemetry.addCurrent(next_available_channel, current); - telemetry.addPower(next_available_channel, voltage * current); - next_available_channel++; - } - } - } - #endif - - #if ENV_INCLUDE_INA219 - if (INA219_initialized) { - telemetry.addVoltage(next_available_channel, INA219.getBusVoltage_V()); - telemetry.addCurrent(next_available_channel, INA219.getCurrent_mA() / 1000); - telemetry.addPower(next_available_channel, INA219.getPower_mW() / 1000); + for (int i = 0; i < _active_sensor_count; i++) { + _active_sensors[i].query(next_available_channel, _active_sensors[i].sub_channel, telemetry); next_available_channel++; } - #endif - - #if ENV_INCLUDE_INA260 - if (INA260_initialized) { - telemetry.addVoltage(next_available_channel, INA260.readBusVoltage() / 1000); - telemetry.addCurrent(next_available_channel, INA260.readCurrent() / 1000); - telemetry.addPower(next_available_channel, INA260.readPower() / 1000); - next_available_channel++; - } - #endif - - #if ENV_INCLUDE_INA226 - if (INA226_initialized) { - telemetry.addVoltage(next_available_channel, INA226.getBusVoltage()); - telemetry.addCurrent(next_available_channel, INA226.getCurrent_mA() / 1000.0); - telemetry.addPower(next_available_channel, INA226.getPower_mW() / 1000.0); - next_available_channel++; - } - #endif - - #if ENV_INCLUDE_MLX90614 - if (MLX90614_initialized) { - telemetry.addTemperature(TELEM_CHANNEL_SELF, MLX90614.readObjectTempC()); - telemetry.addTemperature(TELEM_CHANNEL_SELF + 1, MLX90614.readAmbientTempC()); - } - #endif - - #if ENV_INCLUDE_VL53L0X - if (VL53L0X_initialized) { - VL53L0X_RangingMeasurementData_t measure; - VL53L0X.rangingTest(&measure, false); // pass in 'true' to get debug data - if (measure.RangeStatus != 4) { // phase failures - telemetry.addDistance(TELEM_CHANNEL_SELF, measure.RangeMilliMeter / 1000.0f); // convert mm to m - } else { - telemetry.addDistance(TELEM_CHANNEL_SELF, 0.0f); // no valid measurement - } - } - #endif - - #if ENV_INCLUDE_BMP085 - if (BMP085_initialized) { - telemetry.addTemperature(TELEM_CHANNEL_SELF, BMP085.readTemperature()); - telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, BMP085.readPressure() / 100); - telemetry.addAltitude(TELEM_CHANNEL_SELF, BMP085.readAltitude(TELEM_BMP085_SEALEVELPRESSURE_HPA * 100)); - } - #endif - - #if ENV_INCLUDE_RAK12035 - if (RAK12035_initialized) { - - // RAK12035 Telemetry is Channel 2 - telemetry.addTemperature(2, RAK12035.get_sensor_temperature()); - telemetry.addPercentage(2, RAK12035.get_sensor_moisture()); - - // RAK12035 CALIBRATION Telemetry is Channel 3, if enabled - - #ifdef ENABLE_RAK12035_CALIBRATION - // Calibration Data Screen is Channel 3 - float cap = RAK12035.get_sensor_capacitance(); - float _wet = RAK12035.get_humidity_full(); - float _dry = RAK12035.get_humidity_zero(); - - telemetry.addFrequency(3, cap); - telemetry.addTemperature(3, _wet); - telemetry.addPower(3, _dry); - - if(cap > _dry){ - RAK12035.set_humidity_zero(cap); - } - - if(cap < _wet){ - RAK12035.set_humidity_full(cap); - } - #endif - } - #endif } + return true; } @@ -555,8 +592,6 @@ const char* EnvironmentSensorManager::getSettingName(int i) const { return "gps"; } #endif - // convenient way to add params (needed for some tests) -// if (i == settings++) return "param.2"; return NULL; } @@ -567,8 +602,6 @@ const char* EnvironmentSensorManager::getSettingValue(int i) const { return gps_active ? "1" : "0"; } #endif - // convenient way to add params ... -// if (i == settings++) return "2"; return NULL; } @@ -584,11 +617,7 @@ bool EnvironmentSensorManager::setSettingValue(const char* name, const char* val } if (strcmp(name, "gps_interval") == 0) { uint32_t interval_seconds = atoi(value); - if (interval_seconds > 0) { - gps_update_interval_sec = interval_seconds; - } else { - gps_update_interval_sec = 1; // Default to 1 second if 0 - } + gps_update_interval_sec = interval_seconds > 0 ? interval_seconds : 1; return true; } #endif @@ -652,16 +681,10 @@ void EnvironmentSensorManager::rakGPSInit(){ //search for the correct IO standby pin depending on socket used if(gpsIsAwake(WB_IO2)){ - // MESH_DEBUG_PRINTLN("RAK base board is RAK19007/10"); - // MESH_DEBUG_PRINTLN("GPS is installed on Socket A"); } else if(gpsIsAwake(WB_IO4)){ - // MESH_DEBUG_PRINTLN("RAK base board is RAK19003/9"); - // MESH_DEBUG_PRINTLN("GPS is installed on Socket C"); } else if(gpsIsAwake(WB_IO5)){ - // MESH_DEBUG_PRINTLN("RAK base board is RAK19001/11"); - // MESH_DEBUG_PRINTLN("GPS is installed on Socket F"); } else{ MESH_DEBUG_PRINTLN("No GPS found"); @@ -716,7 +739,7 @@ bool EnvironmentSensorManager::gpsIsAwake(uint8_t ioPin){ gps_detected = true; return true; } - + pinMode(ioPin, INPUT); MESH_DEBUG_PRINTLN("GPS did not init with this IO pin... try the next"); return false; diff --git a/src/helpers/sensors/EnvironmentSensorManager.h b/src/helpers/sensors/EnvironmentSensorManager.h index 32413ebc..bb3dded3 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.h +++ b/src/helpers/sensors/EnvironmentSensorManager.h @@ -6,27 +6,22 @@ class EnvironmentSensorManager : public SensorManager { protected: - int next_available_channel = TELEM_CHANNEL_SELF + 1; + static const int MAX_ACTIVE_SENSORS = 16; - bool AHTX0_initialized = false; - bool BME280_initialized = false; - bool BMP280_initialized = false; - bool INA3221_initialized = false; - bool INA219_initialized = false; - bool INA260_initialized = false; - bool INA226_initialized = false; - bool SHTC3_initialized = false; - bool LPS22HB_initialized = false; - bool MLX90614_initialized = false; - bool VL53L0X_initialized = false; - bool SHT4X_initialized = false; - bool BME680_initialized = false; - bool BMP085_initialized = false; - bool RAK12035_initialized = false; + // Query function pointer + sub-channel index (for multi-channel sensors like INA3221). + // Sub-channel is 0 for all single-output sensors. + struct ActiveSensor { + void (*query)(uint8_t channel, uint8_t sub_channel, CayenneLPP& telemetry); + uint8_t sub_channel; + }; - bool gps_detected = false; - bool gps_active = false; - uint32_t gps_update_interval_sec = 1; // Default 1 second + ActiveSensor _active_sensors[MAX_ACTIVE_SENSORS]; + int _active_sensor_count = 0; + uint8_t next_available_channel = TELEM_CHANNEL_SELF + 1; + + bool gps_detected = false; + bool gps_active = false; + uint32_t gps_update_interval_sec = 1; #if ENV_INCLUDE_GPS LocationProvider* _location; @@ -39,7 +34,6 @@ protected: #endif #endif - public: #if ENV_INCLUDE_GPS EnvironmentSensorManager(LocationProvider &location): _location(&location){}; From 3fcf5b548b753d407cef1e364a306e440219231f Mon Sep 17 00:00:00 2001 From: Confi <9595028+Confituurke@users.noreply.github.com> Date: Wed, 25 Mar 2026 22:05:28 +0100 Subject: [PATCH 08/46] fix(sensecap_solar): set P_LORA_TX_LED to 12 after LED remap Align TX activity LED with LED_BLUE / variant.h after LED definition and power-button pin mapping changes. --- variants/sensecap_solar/platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/sensecap_solar/platformio.ini b/variants/sensecap_solar/platformio.ini index aabbcf00..effef38c 100644 --- a/variants/sensecap_solar/platformio.ini +++ b/variants/sensecap_solar/platformio.ini @@ -13,7 +13,7 @@ build_flags = ${nrf52_base.build_flags} -D NRF52_POWER_MANAGEMENT -D RADIO_CLASS=CustomSX1262 -D WRAPPER_CLASS=CustomSX1262Wrapper - -D P_LORA_TX_LED=11 + -D P_LORA_TX_LED=12 -D P_LORA_DIO_1=1 -D P_LORA_RESET=2 -D P_LORA_BUSY=3 From ecd0cfc1c133aad93e65257f002151591f6bcfd9 Mon Sep 17 00:00:00 2001 From: liamcottle Date: Fri, 24 Apr 2026 15:57:34 +1200 Subject: [PATCH 09/46] update discord links --- README.md | 2 +- docs/faq.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ebad1f6f..f8b9e5e0 100644 --- a/README.md +++ b/README.md @@ -117,4 +117,4 @@ There are a number of fairly major features in the pipeline, with no particular - Report bugs and request features on the [GitHub Issues](https://github.com/ripplebiz/MeshCore/issues) page. - Find additional guides and components on [my site](https://buymeacoffee.com/ripplebiz). -- Join [MeshCore Discord](https://discord.gg/BMwCtwHj5V) to chat with the developers and get help from the community. +- Join [MeshCore Discord](https://meshcore.gg) to chat with the developers and get help from the community. diff --git a/docs/faq.md b/docs/faq.md index 9fe1534a..3edc0a69 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -194,7 +194,7 @@ Recently, as of October 2025, many regions have moved to the "narrow" setting, a After extensive testing, many regions have switched or about to switch over to BW62.5 and SF7, 8, or 9. Narrower bandwidth setting and lower SF setting allow MeshCore's radio signals to fit between interference in the ISM band, provide for a lower noise floor, better SNR, and faster transmissions. -If you have consensus from your community in your region to update your region's preset recommendation, please post your update request on the [#meshcore-app](https://discord.com/channels/1343693475589263471/1391681655911088241) channel on the [MeshCore Discord server ](https://discord.gg/cYtQNYCCRK) to let Liam Cottle know. +If you have consensus from your community in your region to update your region's preset recommendation, please post your update request on the [#meshcore-app](https://discord.com/channels/1343693475589263471/1391681655911088241) channel on the [MeshCore Discord server ](https://meshcore.gg) to let Liam Cottle know. @@ -526,7 +526,7 @@ The third character is the capital letter 'O', not zero `0` - Firmware repo: https://github.com/meshcore-dev/MeshCore ### 5.8. Q: How can I support MeshCore? -**A:** Provide your honest feedback on GitHub and on [MeshCore Discord server](https://discord.gg/BMwCtwHj5V). Spread the word of MeshCore to your friends and communities; help them get started with MeshCore. Support Scott's MeshCore development at . +**A:** Provide your honest feedback on GitHub and on [MeshCore Discord server](https://meshcore.gg). Spread the word of MeshCore to your friends and communities; help them get started with MeshCore. Support Scott's MeshCore development at . Support Liam Cottle's smartphone client development by unlocking the server administration wait gate with in-app purchase From 277331381e11ad70e0c62e58488252649e919c0c Mon Sep 17 00:00:00 2001 From: Kevin Le Date: Fri, 24 Apr 2026 11:56:06 +0700 Subject: [PATCH 10/46] Added Xiao S3 variant. This is for Xiao S3 and a normal Wio SX1262 for Xiao shield. --- variants/xiao_s3/XiaoS3Board.h | 13 +++ variants/xiao_s3/platformio.ini | 154 ++++++++++++++++++++++++++++++++ variants/xiao_s3/target.cpp | 56 ++++++++++++ variants/xiao_s3/target.h | 30 +++++++ 4 files changed, 253 insertions(+) create mode 100644 variants/xiao_s3/XiaoS3Board.h create mode 100644 variants/xiao_s3/platformio.ini create mode 100644 variants/xiao_s3/target.cpp create mode 100644 variants/xiao_s3/target.h diff --git a/variants/xiao_s3/XiaoS3Board.h b/variants/xiao_s3/XiaoS3Board.h new file mode 100644 index 00000000..288fcf62 --- /dev/null +++ b/variants/xiao_s3/XiaoS3Board.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + +class XiaoS3Board : public ESP32Board { +public: + XiaoS3Board() { } + + const char* getManufacturerName() const override { + return "Xiao S3"; + } +}; diff --git a/variants/xiao_s3/platformio.ini b/variants/xiao_s3/platformio.ini new file mode 100644 index 00000000..bc000220 --- /dev/null +++ b/variants/xiao_s3/platformio.ini @@ -0,0 +1,154 @@ +[Xiao_S3] +extends = esp32_base +board = seeed_xiao_esp32s3 +board_check = true +board_build.mcu = esp32s3 +build_flags = ${esp32_base.build_flags} + ${sensor_base.build_flags} + -I variants/xiao_s3 + -UENV_INCLUDE_GPS + -D SEEED_XIAO_S3 + -D PIN_VBAT_READ=1 ; D0 + -D P_LORA_DIO_1=2 ; D1 + -D P_LORA_NSS=5 ; D4 + -D P_LORA_RESET=3 ; D2 + -D P_LORA_BUSY=4 ; D3 + -D P_LORA_SCLK=7 ; D8 + -D P_LORA_MISO=8 ; D0 + -D P_LORA_MOSI=9 ; D10 + -D PIN_USER_BTN=-1 ; NC + -D PIN_STATUS_LED=21 ; Orange user led, LOW=On + -D PIN_BOARD_SDA=D6 ; D6=43 + -D PIN_BOARD_SCL=D7 ; D7=44 + -D SX126X_RXEN=6 ; D5 + -D SX126X_TXEN=RADIOLIB_NC + -D SX126X_DIO2_AS_RF_SWITCH=true + -D SX126X_DIO3_TCXO_VOLTAGE=1.8 + -D SX126X_CURRENT_LIMIT=140 + -D RADIO_CLASS=CustomSX1262 + -D WRAPPER_CLASS=CustomSX1262Wrapper + -D LORA_TX_POWER=22 + -D SX126X_RX_BOOSTED_GAIN=1 +build_src_filter = ${esp32_base.build_src_filter} + +<../variants/xiao_s3> + + +lib_deps = + ${esp32_base.lib_deps} + ${sensor_base.lib_deps} + +[env:Xiao_S3_repeater] +extends = Xiao_S3 +build_src_filter = ${Xiao_S3.build_src_filter} + +<../examples/simple_repeater/*.cpp> +build_flags = + ${Xiao_S3.build_flags} + -D ADVERT_NAME='"Xiao S3 Repeater"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=50 +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +lib_deps = + ${Xiao_S3.lib_deps} + ${esp32_ota.lib_deps} + +[env:Xiao_S3_repeater_bridge_espnow] +extends = Xiao_S3 +build_src_filter = ${Xiao_S3.build_src_filter} + + + +<../examples/simple_repeater/*.cpp> +build_flags = + ${Xiao_S3.build_flags} + -D ADVERT_NAME='"ESPNow Bridge"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=50 + -D WITH_ESPNOW_BRIDGE=1 +; -D BRIDGE_DEBUG=1 +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +lib_deps = + ${Xiao_S3.lib_deps} + ${esp32_ota.lib_deps} + +[env:Xiao_S3_room_server] +extends = Xiao_S3 +build_src_filter = ${Xiao_S3.build_src_filter} + +<../examples/simple_room_server> +build_flags = + ${Xiao_S3.build_flags} + -D ADVERT_NAME='"Xiao S3 Room"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D ROOM_PASSWORD='"hello"' +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +lib_deps = + ${Xiao_S3.lib_deps} + ${esp32_ota.lib_deps} + +[env:Xiao_S3_companion_radio_ble] +extends = Xiao_S3 +build_flags = + ${Xiao_S3.build_flags} + -I examples/companion_radio/ui-new + -D MAX_CONTACTS=350 + -D MAX_GROUP_CHANNELS=40 + -D BLE_PIN_CODE=123456 + -D DISPLAY_CLASS=SSD1306Display + -D OFFLINE_QUEUE_SIZE=256 +; -D BLE_DEBUG_LOGGING=1 +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +build_src_filter = ${Xiao_S3.build_src_filter} + + + + + + + +<../examples/companion_radio/*.cpp> + +<../examples/companion_radio/ui-new/*.cpp> +lib_deps = + ${Xiao_S3.lib_deps} + densaugeo/base64 @ ~1.4.0 + adafruit/Adafruit SSD1306 @ ^2.5.13 + +[env:Xiao_S3_companion_radio_usb] +extends = Xiao_S3 +build_flags = + ${Xiao_S3.build_flags} + -I examples/companion_radio/ui-new + -D MAX_CONTACTS=350 + -D MAX_GROUP_CHANNELS=40 + -D DISPLAY_CLASS=SSD1306Display + -D OFFLINE_QUEUE_SIZE=256 +; -D BLE_DEBUG_LOGGING=1 +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +build_src_filter = ${Xiao_S3.build_src_filter} + + + + + + + +<../examples/companion_radio/*.cpp> + +<../examples/companion_radio/ui-new/*.cpp> +lib_deps = + ${Xiao_S3.lib_deps} + densaugeo/base64 @ ~1.4.0 + adafruit/Adafruit SSD1306 @ ^2.5.13 + +[env:Xiao_S3_sensor] +extends = Xiao_S3 +build_src_filter = ${Xiao_S3.build_src_filter} + +<../examples/simple_sensor> +build_flags = + ${Xiao_S3.build_flags} + -D ADVERT_NAME='"Xiao S3 Sensor"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +lib_deps = + ${Xiao_S3.lib_deps} + ${esp32_ota.lib_deps} \ No newline at end of file diff --git a/variants/xiao_s3/target.cpp b/variants/xiao_s3/target.cpp new file mode 100644 index 00000000..014b2552 --- /dev/null +++ b/variants/xiao_s3/target.cpp @@ -0,0 +1,56 @@ +#include +#include "target.h" + +XiaoS3Board board; + +#if defined(P_LORA_SCLK) + static SPIClass spi; + RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi); +#else + RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); +#endif + +WRAPPER_CLASS radio_driver(radio, board); + +ESP32RTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); +EnvironmentSensorManager sensors; + +#ifdef DISPLAY_CLASS + DISPLAY_CLASS display; + MomentaryButton user_btn(PIN_USER_BTN, 1000, true); +#endif + +bool radio_init() { + fallback_clock.begin(); + rtc_clock.begin(Wire); + pinMode(21, INPUT); + pinMode(48, OUTPUT); + + #if defined(P_LORA_SCLK) + spi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI); + return radio.std_init(&spi); +#else + return radio.std_init(); +#endif +} + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(int8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/xiao_s3/target.h b/variants/xiao_s3/target.h new file mode 100644 index 00000000..93b27862 --- /dev/null +++ b/variants/xiao_s3/target.h @@ -0,0 +1,30 @@ +#pragma once + +#define RADIOLIB_STATIC_ONLY 1 +#include +#include +#include +#include +#include +#include +#ifdef DISPLAY_CLASS + #include + #include +#endif +#include "XiaoS3Board.h" + +extern XiaoS3Board board; +extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; +extern EnvironmentSensorManager sensors; + +#ifdef DISPLAY_CLASS + extern DISPLAY_CLASS display; + extern MomentaryButton user_btn; +#endif + +bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(int8_t dbm); +mesh::LocalIdentity radio_new_identity(); From b705d5489f136477a93f13b9e407277903717787 Mon Sep 17 00:00:00 2001 From: zjs81 Date: Fri, 24 Apr 2026 04:24:20 -0700 Subject: [PATCH 11/46] Update companion protocol documentation and enhance data type definitions for clarity --- docs/companion_protocol.md | 135 +++++++++++++++++++++++++++-------- src/helpers/TxtDataHelpers.h | 3 + 2 files changed, 109 insertions(+), 29 deletions(-) diff --git a/docs/companion_protocol.md b/docs/companion_protocol.md index bbad1e40..fc2ad32d 100644 --- a/docs/companion_protocol.md +++ b/docs/companion_protocol.md @@ -283,32 +283,101 @@ Bytes 7+: Message Text (UTF-8, variable length) ### 6. Send Channel Data Datagram -**Purpose**: Send binary datagram data to a channel. +**Purpose**: Send a binary datagram to a channel. Unlike channel text messages, datagrams carry no built-in sender identity and no timestamp — applications needing either must encode them inside the binary payload. **Command Format**: ``` -Byte 0: 0x3E -Bytes 1-2: Data Type (`data_type`, 16-bit little-endian) -Byte 3: Channel Index (0-7) -Bytes 4+: Binary payload bytes (variable length) +Byte 0: 0x3E +Byte 1: Channel Index (0-7) +Byte 2: Path Length (0xFF = flood, otherwise actual path length) +Bytes 3 .. 2+path_len: Path (omitted when path_len == 0xFF) +Next 2 bytes (little-endian): Data Type (`data_type`, uint16) +Remaining bytes: Binary payload (variable length) +``` + +**Example** (flood, `DATA_TYPE_DEV`, payload `A1 B2 C3`, channel 1): +``` +3E 01 FF FF FF A1 B2 C3 ``` **Data Type / Transport Mapping**: -- `0x0000` is invalid for this command. +- `0x0000` (`DATA_TYPE_RESERVED`) is invalid and rejected with `PACKET_ERROR`. - `0xFFFF` (`DATA_TYPE_DEV`) is the developer namespace for experimenting and developing apps. -- Other non-zero values can be used as assigned application/community namespaces. - -**Note**: Applications that need a timestamp should encode it inside the binary payload. +- Values `0x0001`–`0xFFFE` are available for registered application/community namespaces. See the [Registered data_type values](#registered-data_type-values) table below. **Limits**: -- Maximum payload length is `163` bytes. -- Larger payloads are rejected with `PACKET_ERROR`. +- Maximum payload length is `MAX_CHANNEL_DATA_LENGTH = MAX_FRAME_SIZE - 9 = 163` bytes. +- Larger payloads are rejected with `PACKET_ERROR` (`ERR_CODE_ILLEGAL_ARG`). -**Response**: `PACKET_OK` (0x00) on success +**Response**: `PACKET_OK` (0x00) on success, or `PACKET_ERROR` (0x01) with one of: +- `ERR_CODE_NOT_FOUND` (2) — unknown `channel_idx` +- `ERR_CODE_ILLEGAL_ARG` (6) — invalid `path_len`, reserved `data_type` (`0x0000`), or payload larger than `MAX_CHANNEL_DATA_LENGTH` +- `ERR_CODE_TABLE_FULL` (3) — outbound send queue is full; retry later + +**Inbound datagrams** are delivered to the host via `RESP_CODE_CHANNEL_DATA_RECV` (0x1B); see [Receive Channel Data Datagram](#receive-channel-data-datagram). + +#### Registered `data_type` values + +Declared in `src/helpers/TxtDataHelpers.h`. These values have agreed-upon payload schemas so different client apps on the same channel can interoperate. + +| Value | Constant | Purpose | Payload schema | +|--------|----------------------|---------------------------------------------|--------------------------------------------------------------------------------------------------------| +| 0x0000 | `DATA_TYPE_RESERVED` | Reserved; invalid on send | — | +| 0x0001 | `DATA_TYPE_SMAZ_TEXT`| Raw SMAZ-compressed UTF-8 text | `[sender_name_len: u8][sender_name: UTF-8 × sender_name_len][smaz_bytes: remaining]` | +| 0x0002 | `DATA_TYPE_GIPHY_GIF`| Giphy GIF id (avoids base64 tax) | `[sender_name_len: u8][sender_name: UTF-8 × sender_name_len][giphy_id: ASCII, remaining]` | +| 0x0003 | `DATA_TYPE_REACTION` | Emoji reaction targeting a prior message | `[target_hash: 2 bytes LE][emoji_index: u8][sender_name_len: u8][sender_name: UTF-8 × sender_name_len]` | +| 0xFFFF | `DATA_TYPE_DEV` | Developer/experimental namespace | Application-defined | + +The firmware does not inspect the payload contents — `data_type` is transported opaquely, and the schemas above are a client-side contract between cooperating apps. + +To request a new registered value, submit a PR adding a `#define` to `TxtDataHelpers.h` and a row to this table. --- -### 6. Get Message +### Receive Channel Data Datagram + +Inbound group datagrams (radio-level `PAYLOAD_TYPE_GRP_DATA`, 0x06) are forwarded to the host as `RESP_CODE_CHANNEL_DATA_RECV` notifications. + +**Frame Format** (`RESP_CODE_CHANNEL_DATA_RECV`, 0x1B): +``` +Byte 0: 0x1B (packet type) +Byte 1: SNR (signed int8, scaled ×4 — divide by 4.0 to recover dB) +Bytes 2-3: Reserved +Byte 4: Channel Index (0-7) +Byte 5: Path Length (actual path when flooded, otherwise 0xFF) +Bytes 6-7: Data Type (uint16 little-endian) +Byte 8: Data Length +Bytes 9 .. 8+data_len: Payload +``` + +**Note**: The device may also emit `PACKET_MESSAGES_WAITING` (0x83) to notify the host that datagrams are queued; poll with `CMD_SYNC_NEXT_MESSAGE` (0x0A) to retrieve them. + +**Parsing Pseudocode**: +```python +def parse_channel_data_recv(data): + if len(data) < 9: + return None + snr_byte = data[1] + snr = (snr_byte if snr_byte < 128 else snr_byte - 256) / 4.0 + channel_idx = data[4] + path_len = data[5] + data_type = int.from_bytes(data[6:8], 'little') + data_len = data[8] + if 9 + data_len > len(data): + return None + payload = data[9:9 + data_len] + return { + 'snr': snr, + 'channel_idx': channel_idx, + 'path_len': path_len, + 'data_type': data_type, + 'payload': bytes(payload), + } +``` + +--- + +### 7. Get Message **Purpose**: Request the next queued message from the device. @@ -325,13 +394,14 @@ Byte 0: 0x0A **Response**: - `PACKET_CHANNEL_MSG_RECV` (0x08) or `PACKET_CHANNEL_MSG_RECV_V3` (0x11) for channel messages - `PACKET_CONTACT_MSG_RECV` (0x07) or `PACKET_CONTACT_MSG_RECV_V3` (0x10) for contact messages +- `PACKET_CHANNEL_DATA_RECV` (0x1B) for channel data datagrams - `PACKET_NO_MORE_MSGS` (0x0A) if no messages available **Note**: Poll this command periodically to retrieve queued messages. The device may also send `PACKET_MESSAGES_WAITING` (0x83) as a notification when messages are available. --- -### 7. Get Battery and Storage +### 8. Get Battery and Storage **Purpose**: Query device battery voltage and storage usage. @@ -527,6 +597,15 @@ Use the `SEND_CHANNEL_MESSAGE` command (see [Commands](#commands)). ## Response Parsing +### Terminology + +This document uses a spec-level naming convention (`PACKET_*`) for bytes the firmware sends back to the host. In the firmware source these same values are split across two `#define` families by purpose: + +- `RESP_CODE_*` — direct replies to a command (e.g. `RESP_CODE_CHANNEL_DATA_RECV` = `PACKET_CHANNEL_DATA_RECV` = 0x1B). +- `PUSH_CODE_*` — asynchronous notifications not tied to a specific command (e.g. `PUSH_CODE_MSG_WAITING` = `PACKET_MESSAGES_WAITING` = 0x83). + +Byte values are authoritative; names are aliases. When reading firmware source, `RESP_CODE_X` / `PUSH_CODE_X` correspond to this doc's `PACKET_X` of the same numeric value. + ### Packet Types | Value | Name | Description | @@ -547,6 +626,7 @@ Use the `SEND_CHANNEL_MESSAGE` command (see [Commands](#commands)). | 0x10 | PACKET_CONTACT_MSG_RECV_V3 | Contact message (V3 with SNR) | | 0x11 | PACKET_CHANNEL_MSG_RECV_V3 | Channel message (V3 with SNR) | | 0x12 | PACKET_CHANNEL_INFO | Channel information | +| 0x1B | PACKET_CHANNEL_DATA_RECV | Channel data datagram | | 0x80 | PACKET_ADVERTISEMENT | Advertisement packet | | 0x82 | PACKET_ACK | Acknowledgment | | 0x83 | PACKET_MESSAGES_WAITING | Messages waiting notification | @@ -718,22 +798,18 @@ Bytes 1-6: ACK Code (6 bytes, hex) ### Error Codes -**PACKET_ERROR** (0x01) may include an error code in byte 1: +`PACKET_ERROR` (0x01) carries a single-byte error code in byte 1. Values match the `ERR_CODE_*` constants defined in `examples/companion_radio/MyMesh.cpp`: -| Error Code | Description | -|------------|-------------| -| 0x00 | Generic error (no specific code) | -| 0x01 | Invalid command | -| 0x02 | Invalid parameter | -| 0x03 | Channel not found | -| 0x04 | Channel already exists | -| 0x05 | Channel index out of range | -| 0x06 | Secret mismatch | -| 0x07 | Message too long | -| 0x08 | Device busy | -| 0x09 | Not enough storage | +| Code | Constant (firmware) | Description | +|------|----------------------------|------------------------------------------------------------------------------| +| 1 | `ERR_CODE_UNSUPPORTED_CMD` | Unknown or unsupported command byte / sub-command | +| 2 | `ERR_CODE_NOT_FOUND` | Target not found (channel, contact, message, etc.) | +| 3 | `ERR_CODE_TABLE_FULL` | Internal queue or table is full — retry later | +| 4 | `ERR_CODE_BAD_STATE` | Operation not valid in current device state (e.g. iterator already running) | +| 5 | `ERR_CODE_FILE_IO_ERROR` | Filesystem or storage I/O failure | +| 6 | `ERR_CODE_ILLEGAL_ARG` | Invalid argument (bad length, out-of-range value, reserved field, etc.) | -**Note**: Error codes may vary by firmware version. Always check byte 1 of `PACKET_ERROR` response. +**Note**: Error codes may vary by firmware version. Always check byte 1 of `PACKET_ERROR` response, and treat unknown codes as generic errors. ### Frame Handling @@ -765,7 +841,8 @@ BLE implementations enqueue and deliver one protocol frame per BLE write/notific - `GET_CHANNEL` → `PACKET_CHANNEL_INFO` - `SET_CHANNEL` → `PACKET_OK` or `PACKET_ERROR` - `SEND_CHANNEL_MESSAGE` → `PACKET_MSG_SENT` - - `GET_MESSAGE` → `PACKET_CHANNEL_MSG_RECV`, `PACKET_CONTACT_MSG_RECV`, or `PACKET_NO_MORE_MSGS` + - `GET_MESSAGE` → `PACKET_CHANNEL_MSG_RECV`, `PACKET_CONTACT_MSG_RECV`, `PACKET_CHANNEL_DATA_RECV`, or `PACKET_NO_MORE_MSGS` + - `SEND_CHANNEL_DATA` → `PACKET_OK` or `PACKET_ERROR` - `GET_BATTERY` → `PACKET_BATTERY` 4. **Timeout Handling**: diff --git a/src/helpers/TxtDataHelpers.h b/src/helpers/TxtDataHelpers.h index ece494f2..432c0f12 100644 --- a/src/helpers/TxtDataHelpers.h +++ b/src/helpers/TxtDataHelpers.h @@ -7,6 +7,9 @@ #define TXT_TYPE_CLI_DATA 1 // a CLI command #define TXT_TYPE_SIGNED_PLAIN 2 // plain text, signed by sender #define DATA_TYPE_RESERVED 0x0000 // reserved for future use +#define DATA_TYPE_SMAZ_TEXT 0x0001 // raw SMAZ-compressed UTF-8 text meshcore-open Flutter client. +#define DATA_TYPE_GIPHY_GIF 0x0002 // ASCII Giphy GIF id meshcore-open Flutter client. +#define DATA_TYPE_REACTION 0x0003 // 2-byte target message hash + 1-byte emoji index meshcore-open Flutter client. #define DATA_TYPE_DEV 0xFFFF // developer namespace for experimenting with group/channel datagrams and building apps class StrHelper { From 5e03c00397263ef17e8d3c132db13abe3cb3acb8 Mon Sep 17 00:00:00 2001 From: Michael Lynch Date: Sun, 12 Oct 2025 11:11:05 -0400 Subject: [PATCH 12/46] Add unit tests for Utils::toHex --- .github/workflows/run-unit-tests.yml | 31 +++++++++++++++ README.md | 8 ++++ platformio.ini | 14 +++++++ test/mocks/AES.h | 13 +++++++ test/mocks/SHA256.h | 14 +++++++ test/mocks/Stream.h | 10 +++++ test/test_utils/test_tohex.cpp | 57 ++++++++++++++++++++++++++++ 7 files changed, 147 insertions(+) create mode 100644 .github/workflows/run-unit-tests.yml create mode 100644 test/mocks/AES.h create mode 100644 test/mocks/SHA256.h create mode 100644 test/mocks/Stream.h create mode 100644 test/test_utils/test_tohex.cpp diff --git a/.github/workflows/run-unit-tests.yml b/.github/workflows/run-unit-tests.yml new file mode 100644 index 00000000..e3af3aaf --- /dev/null +++ b/.github/workflows/run-unit-tests.yml @@ -0,0 +1,31 @@ +name: Run Unit Tests + +on: + push: + branches: + - main + - master + pull_request: + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + steps: + + - name: Clone Repo + uses: actions/checkout@v4 + + - name: Setup Build Environment + uses: ./.github/actions/setup-build-environment + + - name: Run Unit Tests + run: pio test -e native -vv + + - name: Upload Test Results + # Upload test results even if the test step failed. + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-results + path: .pio/build/native/ diff --git a/README.md b/README.md index ebad1f6f..70007c7b 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,14 @@ Here are some general principals you should try to adhere to: Help us prioritize! Please react with thumbs-up to issues/PRs you care about most. We look at reaction counts when planning work. +### Running unit tests + +To run unit tests, run the following command: + +```bash +pio test --environment native --verbose +``` + ## Road-Map / To-Do There are a number of fairly major features in the pipeline, with no particular time-frames attached yet. In very rough chronological order: diff --git a/platformio.ini b/platformio.ini index 864e5e1f..35b3534e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -151,3 +151,17 @@ lib_deps = stevemarple/MicroNMEA @ ^2.0.6 adafruit/Adafruit BME680 Library @ ^2.0.4 adafruit/Adafruit BMP085 Library @ ^1.2.4 + +; ----------------- TESTING --------------------- + +[env:native] +platform = native +build_flags = -std=c++14 + -I src + -I test/mocks +test_build_src = yes +build_src_filter = + -<*> + +<../src/Utils.cpp> +lib_deps = + google/googletest @ ^1.15.2 diff --git a/test/mocks/AES.h b/test/mocks/AES.h new file mode 100644 index 00000000..678b7c13 --- /dev/null +++ b/test/mocks/AES.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + +// Mock AES128 class for testing +// Provides minimal interface to allow Utils.cpp to compile +class AES128 { +public: + void setKey(const uint8_t* key, size_t keySize) {} + void encryptBlock(uint8_t* output, const uint8_t* input) {} + void decryptBlock(uint8_t* output, const uint8_t* input) {} +}; diff --git a/test/mocks/SHA256.h b/test/mocks/SHA256.h new file mode 100644 index 00000000..b6e551a0 --- /dev/null +++ b/test/mocks/SHA256.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include + +// Mock SHA256 class for testing +// Provides minimal interface to allow Utils.cpp to compile +class SHA256 { +public: + void update(const uint8_t* data, size_t len) {} + void finalize(uint8_t* hash, size_t hashLen) {} + void resetHMAC(const uint8_t* key, size_t keyLen) {} + void finalizeHMAC(const uint8_t* key, size_t keyLen, uint8_t* hash, size_t hashLen) {} +}; diff --git a/test/mocks/Stream.h b/test/mocks/Stream.h new file mode 100644 index 00000000..195a3029 --- /dev/null +++ b/test/mocks/Stream.h @@ -0,0 +1,10 @@ +#pragma once + +// Mock Stream class for native testing +// Provides minimal interface needed by Utils.h + +class Stream { +public: + virtual void print(char c) {} + virtual void print(const char* str) {} +}; diff --git a/test/test_utils/test_tohex.cpp b/test/test_utils/test_tohex.cpp new file mode 100644 index 00000000..fec3ae48 --- /dev/null +++ b/test/test_utils/test_tohex.cpp @@ -0,0 +1,57 @@ +#include +#include "Utils.h" + +using namespace mesh; + +#define HEX_BUFFER_SIZE(input) (sizeof(input) * 2 + 1) + +TEST(UtilsToHex, ConvertSingleByte) { + uint8_t input[] = {0xAB}; + char output[HEX_BUFFER_SIZE(input)]; + + Utils::toHex(output, input, sizeof(input)); + + EXPECT_STREQ("AB", output); +} + +TEST(UtilsToHex, ConvertMultipleBytes) { + uint8_t input[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; + char output[HEX_BUFFER_SIZE(input)]; + + Utils::toHex(output, input, sizeof(input)); + + EXPECT_STREQ("0123456789ABCDEF", output); +} + +TEST(UtilsToHex, ConvertZeroByte) { + uint8_t input[] = {0x00}; + char output[HEX_BUFFER_SIZE(input)]; + + Utils::toHex(output, input, sizeof(input)); + + EXPECT_STREQ("00", output); +} + +TEST(UtilsToHex, ConvertMaxByte) { + uint8_t input[] = {0xFF}; + char output[HEX_BUFFER_SIZE(input)]; + + Utils::toHex(output, input, sizeof(input)); + + EXPECT_STREQ("FF", output); +} + +TEST(UtilsToHex, NullTerminatesOnEmptyInput) { + uint8_t input[] = {0xAB}; + char output[] = "X"; // Pre-fill with X. + + Utils::toHex(output, input, 0); + + // Should just null-terminate at position 0 + EXPECT_EQ('\0', output[0]); +} + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} From b6a3aa1bfe5eed320967efacc8ccc5186a44b0a3 Mon Sep 17 00:00:00 2001 From: Michael Lynch Date: Fri, 24 Apr 2026 16:17:23 -0400 Subject: [PATCH 13/46] Update googletest to use 1.17.0 exactly With the '^x.y.z' semantics, the version can upgrade out from under us and change dependencies, so this pins to an exact version. --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 35b3534e..35a985f0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -156,7 +156,7 @@ lib_deps = [env:native] platform = native -build_flags = -std=c++14 +build_flags = -std=c++17 -I src -I test/mocks test_build_src = yes @@ -164,4 +164,4 @@ build_src_filter = -<*> +<../src/Utils.cpp> lib_deps = - google/googletest @ ^1.15.2 + google/googletest @ 1.17.0 From 7f38e3f145fd758f0bccc8befa7004fcda9bb376 Mon Sep 17 00:00:00 2001 From: zevaryx Date: Fri, 24 Apr 2026 20:24:50 -0600 Subject: [PATCH 14/46] feat: Enable GPS on RAK 1W kit --- variants/rak3401/platformio.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/variants/rak3401/platformio.ini b/variants/rak3401/platformio.ini index 3d2d4a3e..b3693a58 100644 --- a/variants/rak3401/platformio.ini +++ b/variants/rak3401/platformio.ini @@ -6,6 +6,7 @@ build_flags = ${nrf52_base.build_flags} ${sensor_base.build_flags} -I variants/rak3401 -D RAK_3401 + -D RAK_BOARD -D NRF52_POWER_MANAGEMENT -D RADIO_CLASS=CustomSX1262 -D WRAPPER_CLASS=CustomSX1262Wrapper @@ -82,6 +83,7 @@ board_upload.maximum_size = 712704 build_flags = ${rak3401.build_flags} -I examples/companion_radio/ui-new + -D PIN_GPS_EN=-1 -D DISPLAY_CLASS=SSD1306Display -D MAX_CONTACTS=350 -D MAX_GROUP_CHANNELS=40 From 835b0e9114985ed800d67d4f4d52cd8eccee88c5 Mon Sep 17 00:00:00 2001 From: Confi <9595028+Confituurke@users.noreply.github.com> Date: Sat, 25 Apr 2026 09:47:44 +0200 Subject: [PATCH 15/46] fix(sensecap_solar): init LED_WHITE LOW to prevent always-on at boot --- variants/sensecap_solar/SenseCapSolarBoard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/sensecap_solar/SenseCapSolarBoard.cpp b/variants/sensecap_solar/SenseCapSolarBoard.cpp index d713176d..da7964c9 100644 --- a/variants/sensecap_solar/SenseCapSolarBoard.cpp +++ b/variants/sensecap_solar/SenseCapSolarBoard.cpp @@ -49,7 +49,7 @@ void SenseCapSolarBoard::begin() { #ifdef LED_WHITE pinMode(LED_WHITE, OUTPUT); - digitalWrite(LED_WHITE, HIGH); + digitalWrite(LED_WHITE, LOW); #endif #ifdef LED_BLUE pinMode(LED_BLUE, OUTPUT); From b91f127e4ebbdca0fa728e1feed9dc4fca4dc761 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 26 Apr 2026 00:23:09 -0700 Subject: [PATCH 16/46] fix: correct device model name for Heltec Wireless Paper --- variants/heltec_wireless_paper/target.cpp | 2 +- variants/heltec_wireless_paper/target.h | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/variants/heltec_wireless_paper/target.cpp b/variants/heltec_wireless_paper/target.cpp index ffb042cf..83e73332 100644 --- a/variants/heltec_wireless_paper/target.cpp +++ b/variants/heltec_wireless_paper/target.cpp @@ -1,7 +1,7 @@ #include "target.h" #include -HeltecV3Board board; +HeltecWirelessPaperBoard board; #if defined(P_LORA_SCLK) static SPIClass spi; diff --git a/variants/heltec_wireless_paper/target.h b/variants/heltec_wireless_paper/target.h index 661da5e4..47908314 100644 --- a/variants/heltec_wireless_paper/target.h +++ b/variants/heltec_wireless_paper/target.h @@ -4,6 +4,12 @@ #include #include #include <../heltec_v3/HeltecV3Board.h> +class HeltecWirelessPaperBoard : public HeltecV3Board { +public: + const char* getManufacturerName() const override { + return "Heltec Wireless Paper"; + } +}; #include #include #include @@ -12,7 +18,7 @@ #include #endif -extern HeltecV3Board board; +extern HeltecWirelessPaperBoard board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; From b6d0b7a5dd06d3e141e089697ddb44dd154dcc15 Mon Sep 17 00:00:00 2001 From: zjs81 Date: Mon, 27 Apr 2026 10:22:17 -0700 Subject: [PATCH 17/46] Refine data type definitions and update registration process in documentation --- docs/companion_protocol.md | 20 +++++++++----------- docs/number_allocations.md | 1 + src/helpers/TxtDataHelpers.h | 3 --- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/docs/companion_protocol.md b/docs/companion_protocol.md index fc2ad32d..8129bc90 100644 --- a/docs/companion_protocol.md +++ b/docs/companion_protocol.md @@ -318,19 +318,17 @@ Remaining bytes: Binary payload (variable length) #### Registered `data_type` values -Declared in `src/helpers/TxtDataHelpers.h`. These values have agreed-upon payload schemas so different client apps on the same channel can interoperate. +`data_type` is an **application identifier**, not a payload-format identifier. Each registered value identifies an application that owns its own internal payload schemas. The firmware does not inspect payload contents — `data_type` is transported opaquely. -| Value | Constant | Purpose | Payload schema | -|--------|----------------------|---------------------------------------------|--------------------------------------------------------------------------------------------------------| -| 0x0000 | `DATA_TYPE_RESERVED` | Reserved; invalid on send | — | -| 0x0001 | `DATA_TYPE_SMAZ_TEXT`| Raw SMAZ-compressed UTF-8 text | `[sender_name_len: u8][sender_name: UTF-8 × sender_name_len][smaz_bytes: remaining]` | -| 0x0002 | `DATA_TYPE_GIPHY_GIF`| Giphy GIF id (avoids base64 tax) | `[sender_name_len: u8][sender_name: UTF-8 × sender_name_len][giphy_id: ASCII, remaining]` | -| 0x0003 | `DATA_TYPE_REACTION` | Emoji reaction targeting a prior message | `[target_hash: 2 bytes LE][emoji_index: u8][sender_name_len: u8][sender_name: UTF-8 × sender_name_len]` | -| 0xFFFF | `DATA_TYPE_DEV` | Developer/experimental namespace | Application-defined | +| Value | Constant | Purpose | +|-----------------|----------------------|--------------------------------------------------------------------------| +| 0x0000 | `DATA_TYPE_RESERVED` | Reserved; invalid on send | +| 0x0001 – 0x00FF | — | Reserved for internal use | +| 0x0100 – 0xFEFF | — | Registered application namespaces (see [number_allocations.md](number_allocations.md)) | +| 0xFF00 – 0xFFFE | — | Testing/development; no registration required | +| 0xFFFF | `DATA_TYPE_DEV` | Developer/experimental namespace | -The firmware does not inspect the payload contents — `data_type` is transported opaquely, and the schemas above are a client-side contract between cooperating apps. - -To request a new registered value, submit a PR adding a `#define` to `TxtDataHelpers.h` and a row to this table. +To register a new application, submit a PR adding a row to the table in [docs/number_allocations.md](number_allocations.md). Internal sub-formats within an allocated application ID are owned by that application and are not tracked in MeshCore firmware or this document. --- diff --git a/docs/number_allocations.md b/docs/number_allocations.md index 94ad1efd..c4715c5e 100644 --- a/docs/number_allocations.md +++ b/docs/number_allocations.md @@ -15,6 +15,7 @@ Once you have a working app/project, you need to be able to demonstrate it exist | Data-Type range | App name | Contact | |-----------------|-----------------------------|------------------------------------------------------| | 0000 - 00FF | -reserved for internal use- | | +| 0100 | MeshCore Open | zsylvester@monitormx.com — https://github.com/zjs81/meshcore-open | | FF00 - FFFF | -reserved for testing/dev- | | (add rows, inside the range 0100 - FEFF for custom apps) diff --git a/src/helpers/TxtDataHelpers.h b/src/helpers/TxtDataHelpers.h index 432c0f12..ece494f2 100644 --- a/src/helpers/TxtDataHelpers.h +++ b/src/helpers/TxtDataHelpers.h @@ -7,9 +7,6 @@ #define TXT_TYPE_CLI_DATA 1 // a CLI command #define TXT_TYPE_SIGNED_PLAIN 2 // plain text, signed by sender #define DATA_TYPE_RESERVED 0x0000 // reserved for future use -#define DATA_TYPE_SMAZ_TEXT 0x0001 // raw SMAZ-compressed UTF-8 text meshcore-open Flutter client. -#define DATA_TYPE_GIPHY_GIF 0x0002 // ASCII Giphy GIF id meshcore-open Flutter client. -#define DATA_TYPE_REACTION 0x0003 // 2-byte target message hash + 1-byte emoji index meshcore-open Flutter client. #define DATA_TYPE_DEV 0xFFFF // developer namespace for experimenting with group/channel datagrams and building apps class StrHelper { From 9c8eb301a484413c358742f69d37ee32070ec01d Mon Sep 17 00:00:00 2001 From: zjs81 Date: Mon, 27 Apr 2026 10:49:55 -0700 Subject: [PATCH 18/46] Clarify path length semantics and data handling in inbound group datagrams --- docs/companion_protocol.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/companion_protocol.md b/docs/companion_protocol.md index 8129bc90..9cc610ff 100644 --- a/docs/companion_protocol.md +++ b/docs/companion_protocol.md @@ -340,14 +340,25 @@ Inbound group datagrams (radio-level `PAYLOAD_TYPE_GRP_DATA`, 0x06) are forwarde ``` Byte 0: 0x1B (packet type) Byte 1: SNR (signed int8, scaled ×4 — divide by 4.0 to recover dB) -Bytes 2-3: Reserved +Bytes 2-3: Reserved (clients MUST ignore) Byte 4: Channel Index (0-7) -Byte 5: Path Length (actual path when flooded, otherwise 0xFF) +Byte 5: Path Length (actual path length when flooded, otherwise 0xFF for direct) Bytes 6-7: Data Type (uint16 little-endian) Byte 8: Data Length Bytes 9 .. 8+data_len: Payload ``` +**Path bytes are not forwarded**: Only `path_len` is reported in the receive frame — the path itself is not copied to the host. There are no path bytes between byte 5 and the data_type field at bytes 6–7, regardless of `path_len`. + +**Path Length semantics differ between send and receive**: + +| Direction | `path_len = 0xFF` | `path_len ≠ 0xFF` | +|-----------|---------------------------------|-------------------------------------------------------------------------------------| +| Send | Flood the network | Direct route; the encoded path follows (low 6 bits = hash count, top 2 bits + 1 = hash size; on-wire byte count = `hash_count × hash_size`) | +| Receive | Packet arrived via direct route | Packet was flooded; this is the encoded `pkt->path_len` field as observed (no path bytes follow) | + +In other words, the meaning of `0xFF` is inverted between the two directions, and on receive the field carries metadata only — never a routable path. `path_len` is an encoded byte (see `Packet::isValidPathLen` / `Packet::writePath` in `src/Packet.cpp`), not a raw byte count. + **Note**: The device may also emit `PACKET_MESSAGES_WAITING` (0x83) to notify the host that datagrams are queued; poll with `CMD_SYNC_NEXT_MESSAGE` (0x0A) to retrieve them. **Parsing Pseudocode**: From c8d81bc04ce826cd5a4227968aea50e0d8e450aa Mon Sep 17 00:00:00 2001 From: liamcottle Date: Tue, 28 Apr 2026 17:02:20 +1200 Subject: [PATCH 19/46] added website to repeater splash screen --- examples/simple_repeater/UITask.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/simple_repeater/UITask.cpp b/examples/simple_repeater/UITask.cpp index acb46325..6a851438 100644 --- a/examples/simple_repeater/UITask.cpp +++ b/examples/simple_repeater/UITask.cpp @@ -52,17 +52,25 @@ void UITask::renderCurrScreen() { int logoWidth = 128; _display->drawXbm((_display->width() - logoWidth) / 2, 3, meshcore_logo, logoWidth, 13); + // meshcore website + const char* website = "https://meshcore.io"; + _display->setColor(DisplayDriver::LIGHT); + _display->setTextSize(1); + uint16_t websiteWidth = _display->getTextWidth(website); + _display->setCursor((_display->width() - websiteWidth) / 2, 22); + _display->print(website); + // version info _display->setColor(DisplayDriver::LIGHT); _display->setTextSize(1); uint16_t versionWidth = _display->getTextWidth(_version_info); - _display->setCursor((_display->width() - versionWidth) / 2, 22); + _display->setCursor((_display->width() - versionWidth) / 2, 35); _display->print(_version_info); // node type const char* node_type = "< Repeater >"; uint16_t typeWidth = _display->getTextWidth(node_type); - _display->setCursor((_display->width() - typeWidth) / 2, 35); + _display->setCursor((_display->width() - typeWidth) / 2, 48); _display->print(node_type); } else { // home screen // node name From 5f75b90ff9ca504f02f8953edfea29d35c135640 Mon Sep 17 00:00:00 2001 From: liamcottle Date: Tue, 28 Apr 2026 20:37:17 +1200 Subject: [PATCH 20/46] added website to companion splash screen --- examples/companion_radio/ui-new/UITask.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index 94a8ee3e..dd93098c 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -57,13 +57,21 @@ public: int logoWidth = 128; display.drawXbm((display.width() - logoWidth) / 2, 3, meshcore_logo, logoWidth, 13); + // meshcore website + const char* website = "https://meshcore.io"; + display.setColor(DisplayDriver::LIGHT); + display.setTextSize(1); + uint16_t websiteWidth = display.getTextWidth(website); + display.setCursor((display.width() - websiteWidth) / 2, 22); + display.print(website); + // version info display.setColor(DisplayDriver::LIGHT); - display.setTextSize(2); - display.drawTextCentered(display.width()/2, 22, _version_info); + display.setTextSize(1); + display.drawTextCentered(display.width()/2, 35, _version_info); display.setTextSize(1); - display.drawTextCentered(display.width()/2, 42, FIRMWARE_BUILD_DATE); + display.drawTextCentered(display.width()/2, 48, FIRMWARE_BUILD_DATE); return 1000; } From 3cd40902b3d686d43941d8e868b0379757e0aa92 Mon Sep 17 00:00:00 2001 From: liamcottle Date: Tue, 28 Apr 2026 20:39:07 +1200 Subject: [PATCH 21/46] added website to room server splash screen --- examples/simple_room_server/UITask.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/simple_room_server/UITask.cpp b/examples/simple_room_server/UITask.cpp index 42bc14d4..640a1d2d 100644 --- a/examples/simple_room_server/UITask.cpp +++ b/examples/simple_room_server/UITask.cpp @@ -52,17 +52,25 @@ void UITask::renderCurrScreen() { int logoWidth = 128; _display->drawXbm((_display->width() - logoWidth) / 2, 3, meshcore_logo, logoWidth, 13); + // meshcore website + const char* website = "https://meshcore.io"; + _display->setColor(DisplayDriver::LIGHT); + _display->setTextSize(1); + uint16_t websiteWidth = _display->getTextWidth(website); + _display->setCursor((_display->width() - websiteWidth) / 2, 22); + _display->print(website); + // version info _display->setColor(DisplayDriver::LIGHT); _display->setTextSize(1); uint16_t versionWidth = _display->getTextWidth(_version_info); - _display->setCursor((_display->width() - versionWidth) / 2, 22); + _display->setCursor((_display->width() - versionWidth) / 2, 35); _display->print(_version_info); // node type const char* node_type = "< Room Server >"; uint16_t typeWidth = _display->getTextWidth(node_type); - _display->setCursor((_display->width() - typeWidth) / 2, 35); + _display->setCursor((_display->width() - typeWidth) / 2, 48); _display->print(node_type); } else { // home screen // node name From e111f710647727d23a30a14b393b454909927ce3 Mon Sep 17 00:00:00 2001 From: liamcottle Date: Tue, 28 Apr 2026 20:40:13 +1200 Subject: [PATCH 22/46] added website to sensor splash screen --- examples/simple_sensor/UITask.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/simple_sensor/UITask.cpp b/examples/simple_sensor/UITask.cpp index 0e78fee0..757ea1dc 100644 --- a/examples/simple_sensor/UITask.cpp +++ b/examples/simple_sensor/UITask.cpp @@ -52,17 +52,25 @@ void UITask::renderCurrScreen() { int logoWidth = 128; _display->drawXbm((_display->width() - logoWidth) / 2, 3, meshcore_logo, logoWidth, 13); + // meshcore website + const char* website = "https://meshcore.io"; + _display->setColor(DisplayDriver::LIGHT); + _display->setTextSize(1); + uint16_t websiteWidth = _display->getTextWidth(website); + _display->setCursor((_display->width() - websiteWidth) / 2, 22); + _display->print(website); + // version info _display->setColor(DisplayDriver::LIGHT); _display->setTextSize(1); uint16_t versionWidth = _display->getTextWidth(_version_info); - _display->setCursor((_display->width() - versionWidth) / 2, 22); + _display->setCursor((_display->width() - versionWidth) / 2, 35); _display->print(_version_info); // node type const char* node_type = "< Sensor >"; uint16_t typeWidth = _display->getTextWidth(node_type); - _display->setCursor((_display->width() - typeWidth) / 2, 35); + _display->setCursor((_display->width() - typeWidth) / 2, 48); _display->print(node_type); } else { // home screen // node name From 12d9cc37529fa949b7748a610a6e6cc76b59910c Mon Sep 17 00:00:00 2001 From: Rastislav Vysoky Date: Tue, 28 Apr 2026 12:24:45 +0200 Subject: [PATCH 23/46] make g2 more in line with other variants --- variants/nano_g2_ultra/platformio.ini | 65 +++++++++++++++++---------- 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/variants/nano_g2_ultra/platformio.ini b/variants/nano_g2_ultra/platformio.ini index 116a1f25..957c3802 100644 --- a/variants/nano_g2_ultra/platformio.ini +++ b/variants/nano_g2_ultra/platformio.ini @@ -1,20 +1,11 @@ -[nrf52840_g2_ultra] +[Nano_G2_Ultra] extends = nrf52_base -platform_packages = framework-arduinoadafruitnrf52 +board = nano-g2-ultra +board_build.ldscript = boards/nrf52840_s140_v6.ld build_flags = ${nrf52_base.build_flags} -I src/helpers/nrf52 -I lib/nrf52/s140_nrf52_6.1.1_API/include -I lib/nrf52/s140_nrf52_6.1.1_API/include/nrf52 -lib_deps = - ${nrf52_base.lib_deps} - rweather/Crypto @ ^0.4.0 - lewisxhe/PCF8563_Library@^1.0.1 - -[Nano_G2_Ultra] -extends = nrf52840_g2_ultra -board = nano-g2-ultra -board_build.ldscript = boards/nrf52840_s140_v6.ld -build_flags = ${nrf52840_g2_ultra.build_flags} -I variants/nano_g2_ultra -D NANO_G2_ULTRA -D RADIO_CLASS=CustomSX1262 @@ -23,11 +14,47 @@ build_flags = ${nrf52840_g2_ultra.build_flags} -D SX126X_CURRENT_LIMIT=140 -D SX126X_RX_BOOSTED_GAIN=1 -D PIN_USER_BTN=38 -build_src_filter = ${nrf52840_g2_ultra.build_src_filter} +build_src_filter = ${nrf52_base.build_src_filter} + +<../variants/nano_g2_ultra> debug_tool = jlink upload_protocol = nrfutil +lib_deps = ${nrf52_base.lib_deps} + adafruit/Adafruit SH110X @ ~2.1.13 + adafruit/Adafruit GFX Library @ ^1.12.1 + stevemarple/MicroNMEA @ ^2.0.6 + +[env:Nano_G2_Ultra_repeater] +extends = Nano_G2_Ultra +build_flags = + ${Nano_G2_Ultra.build_flags} + -D DISPLAY_CLASS=SH1106Display + -D ADVERT_NAME='"Nano G2 Repeater"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=50 +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +build_src_filter = ${Nano_G2_Ultra.build_src_filter} + + + +<../examples/simple_repeater> + +[env:Nano_G2_Ultra_room_server] +extends = Nano_G2_Ultra +build_flags = + ${Nano_G2_Ultra.build_flags} + -D DISPLAY_CLASS=SH1106Display + -D ADVERT_NAME='"Nano G2 Room"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D ROOM_PASSWORD='"hello"' +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +build_src_filter = ${Nano_G2_Ultra.build_src_filter} + + + +<../examples/simple_room_server> [env:Nano_G2_Ultra_companion_radio_ble] extends = Nano_G2_Ultra @@ -54,12 +81,8 @@ build_src_filter = ${Nano_G2_Ultra.build_src_filter} + +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-new/*.cpp> -lib_deps = - ${Nano_G2_Ultra.lib_deps} +lib_deps = ${Nano_G2_Ultra.lib_deps} densaugeo/base64 @ ~1.4.0 - adafruit/Adafruit SH110X @ ~2.1.13 - adafruit/Adafruit GFX Library @ ^1.12.1 - stevemarple/MicroNMEA @ ^2.0.6 end2endzone/NonBlockingRTTTL@^1.3.0 [env:Nano_G2_Ultra_companion_radio_usb] @@ -84,10 +107,6 @@ build_src_filter = ${Nano_G2_Ultra.build_src_filter} + +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-new/*.cpp> -lib_deps = - ${Nano_G2_Ultra.lib_deps} +lib_deps = ${Nano_G2_Ultra.lib_deps} densaugeo/base64 @ ~1.4.0 - adafruit/Adafruit SH110X @ ~2.1.13 - adafruit/Adafruit GFX Library @ ^1.12.1 - stevemarple/MicroNMEA @ ^2.0.6 end2endzone/NonBlockingRTTTL@^1.3.0 From b9636818300831eb4300c1a708df24a33fdcdf63 Mon Sep 17 00:00:00 2001 From: Rastislav Vysoky Date: Tue, 28 Apr 2026 12:37:30 +0200 Subject: [PATCH 24/46] replace all intendation tabs to spaces in pio ini files --- platformio.ini | 4 ++-- variants/keepteen_lt1/platformio.ini | 2 +- variants/promicro/platformio.ini | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platformio.ini b/platformio.ini index 864e5e1f..b10b3179 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,8 +10,8 @@ [platformio] extra_configs = - variants/*/platformio.ini - platformio.local.ini + variants/*/platformio.ini + platformio.local.ini [arduino_base] framework = arduino diff --git a/variants/keepteen_lt1/platformio.ini b/variants/keepteen_lt1/platformio.ini index b82ceb7e..55ee2157 100644 --- a/variants/keepteen_lt1/platformio.ini +++ b/variants/keepteen_lt1/platformio.ini @@ -17,7 +17,7 @@ build_src_filter = ${nrf52_base.build_src_filter} + +<../variants/keepteen_lt1> lib_deps= ${nrf52_base.lib_deps} - adafruit/Adafruit SSD1306 @ ^2.5.13 + adafruit/Adafruit SSD1306 @ ^2.5.13 stevemarple/MicroNMEA @ ^2.0.6 [env:KeepteenLT1_repeater] diff --git a/variants/promicro/platformio.ini b/variants/promicro/platformio.ini index 317537a9..390b0605 100644 --- a/variants/promicro/platformio.ini +++ b/variants/promicro/platformio.ini @@ -27,7 +27,7 @@ build_src_filter = ${nrf52_base.build_src_filter} + +<../variants/promicro> lib_deps= ${nrf52_base.lib_deps} - adafruit/Adafruit SSD1306 @ ^2.5.13 + adafruit/Adafruit SSD1306 @ ^2.5.13 adafruit/Adafruit INA3221 Library @ ^1.0.1 adafruit/Adafruit INA219 @ ^1.2.3 adafruit/Adafruit AHTX0 @ ^2.0.5 From 04b69e86bee15ba9db24d6e1ed009f809b022961 Mon Sep 17 00:00:00 2001 From: taco Date: Mon, 27 Apr 2026 12:01:24 +1000 Subject: [PATCH 25/46] revert bluefruit patch in preparation to switch to using our own fork of Adafruit NRF52 Arduino with the patch included --- arch/nrf52/extra_scripts/patch_bluefruit.py | 198 -------------------- platformio.ini | 4 +- 2 files changed, 1 insertion(+), 201 deletions(-) delete mode 100644 arch/nrf52/extra_scripts/patch_bluefruit.py diff --git a/arch/nrf52/extra_scripts/patch_bluefruit.py b/arch/nrf52/extra_scripts/patch_bluefruit.py deleted file mode 100644 index b43bffb5..00000000 --- a/arch/nrf52/extra_scripts/patch_bluefruit.py +++ /dev/null @@ -1,198 +0,0 @@ -""" -Bluefruit BLE Patch Script - -Patches Bluefruit library to fix semaphore leak bug that causes device lockup -when BLE central disconnects unexpectedly (e.g., going out of range, supervision timeout). - -Patches applied: -1. BLEConnection.h: Add _hvn_qsize member to track semaphore queue size -2. BLEConnection.cpp: Store hvn_qsize and restore semaphore on disconnect - -Bug description: -- When a BLE central disconnects unexpectedly (reason=8 supervision timeout), - the BLE_GATTS_EVT_HVN_TX_COMPLETE event may never fire -- This leaves the _hvn_sem counting semaphore in a decremented state -- Since BLEConnection objects are reused (destructor never called), the - semaphore count is never restored -- Eventually all semaphore counts are exhausted and notify() blocks/fails - -""" - -from pathlib import Path - -Import("env") # pylint: disable=undefined-variable - - -def _patch_ble_connection_header(source: Path) -> bool: - """ - Add _hvn_qsize member variable to BLEConnection class. - - This is needed to restore the semaphore to its correct count on disconnect. - - Returns True if patch was applied or already applied, False on error. - """ - try: - content = source.read_text() - - # Check if already patched - if "_hvn_qsize" in content: - return True # Already patched - - # Find the location to insert - after _phy declaration - original_pattern = ''' uint8_t _phy; - - uint8_t _role;''' - - patched_pattern = ''' uint8_t _phy; - uint8_t _hvn_qsize; - - uint8_t _role;''' - - if original_pattern not in content: - print("Bluefruit patch: WARNING - BLEConnection.h pattern not found") - return False - - content = content.replace(original_pattern, patched_pattern) - source.write_text(content) - - # Verify - if "_hvn_qsize" not in source.read_text(): - return False - - return True - except Exception as e: - print(f"Bluefruit patch: ERROR patching BLEConnection.h: {e}") - return False - - -def _patch_ble_connection_source(source: Path) -> bool: - """ - Patch BLEConnection.cpp to: - 1. Store hvn_qsize in constructor - 2. Restore _hvn_sem semaphore to full count on disconnect - - Returns True if patch was applied or already applied, False on error. - """ - try: - content = source.read_text() - - # Check if already patched (look for the restore loop) - if "uxSemaphoreGetCount(_hvn_sem)" in content: - return True # Already patched - - # Patch 1: Store queue size in constructor - constructor_original = ''' _hvn_sem = xSemaphoreCreateCounting(hvn_qsize, hvn_qsize);''' - - constructor_patched = ''' _hvn_qsize = hvn_qsize; - _hvn_sem = xSemaphoreCreateCounting(hvn_qsize, hvn_qsize);''' - - if constructor_original not in content: - print("Bluefruit patch: WARNING - BLEConnection.cpp constructor pattern not found") - return False - - content = content.replace(constructor_original, constructor_patched) - - # Patch 2: Restore semaphore on disconnect - disconnect_original = ''' case BLE_GAP_EVT_DISCONNECTED: - // mark as disconnected - _connected = false; - break;''' - - disconnect_patched = ''' case BLE_GAP_EVT_DISCONNECTED: - // Restore notification semaphore to full count - // This fixes lockup when disconnect occurs with notifications in flight - while (uxSemaphoreGetCount(_hvn_sem) < _hvn_qsize) { - xSemaphoreGive(_hvn_sem); - } - // Release indication semaphore if waiting - if (_hvc_sem) { - _hvc_received = false; - xSemaphoreGive(_hvc_sem); - } - // mark as disconnected - _connected = false; - break;''' - - if disconnect_original not in content: - print("Bluefruit patch: WARNING - BLEConnection.cpp disconnect pattern not found") - return False - - content = content.replace(disconnect_original, disconnect_patched) - source.write_text(content) - - # Verify - verify_content = source.read_text() - if "uxSemaphoreGetCount(_hvn_sem)" not in verify_content: - return False - if "_hvn_qsize = hvn_qsize" not in verify_content: - return False - - return True - except Exception as e: - print(f"Bluefruit patch: ERROR patching BLEConnection.cpp: {e}") - return False - - -def _apply_bluefruit_patches(target, source, env): # pylint: disable=unused-argument - framework_path = env.get("PLATFORMFW_DIR") - if not framework_path: - framework_path = env.PioPlatform().get_package_dir("framework-arduinoadafruitnrf52") - - if not framework_path: - print("Bluefruit patch: ERROR - framework directory not found") - env.Exit(1) - return - - framework_dir = Path(framework_path) - bluefruit_lib = framework_dir / "libraries" / "Bluefruit52Lib" / "src" - patch_failed = False - - # Patch BLEConnection.h - conn_header = bluefruit_lib / "BLEConnection.h" - if conn_header.exists(): - before = conn_header.read_text() - success = _patch_ble_connection_header(conn_header) - after = conn_header.read_text() - - if success: - if before != after: - print("Bluefruit patch: OK - Applied BLEConnection.h fix (added _hvn_qsize member)") - else: - print("Bluefruit patch: OK - BLEConnection.h already patched") - else: - print("Bluefruit patch: FAILED - BLEConnection.h") - patch_failed = True - else: - print(f"Bluefruit patch: ERROR - BLEConnection.h not found at {conn_header}") - patch_failed = True - - # Patch BLEConnection.cpp - conn_source = bluefruit_lib / "BLEConnection.cpp" - if conn_source.exists(): - before = conn_source.read_text() - success = _patch_ble_connection_source(conn_source) - after = conn_source.read_text() - - if success: - if before != after: - print("Bluefruit patch: OK - Applied BLEConnection.cpp fix (restore semaphore on disconnect)") - else: - print("Bluefruit patch: OK - BLEConnection.cpp already patched") - else: - print("Bluefruit patch: FAILED - BLEConnection.cpp") - patch_failed = True - else: - print(f"Bluefruit patch: ERROR - BLEConnection.cpp not found at {conn_source}") - patch_failed = True - - if patch_failed: - print("Bluefruit patch: CRITICAL - Patch failed! Build aborted.") - env.Exit(1) - - -# Register the patch to run before build -bluefruit_action = env.VerboseAction(_apply_bluefruit_patches, "Applying Bluefruit BLE patches...") -env.AddPreAction("$BUILD_DIR/${PROGNAME}.elf", bluefruit_action) - -# Also run immediately to patch before any compilation -_apply_bluefruit_patches(None, None, env) diff --git a/platformio.ini b/platformio.ini index b10b3179..cc1518a7 100644 --- a/platformio.ini +++ b/platformio.ini @@ -82,9 +82,7 @@ extends = arduino_base platform = nordicnrf52 platform_packages = framework-arduinoadafruitnrf52 @ 1.10700.0 -extra_scripts = - create-uf2.py - arch/nrf52/extra_scripts/patch_bluefruit.py +extra_scripts = create-uf2.py build_flags = ${arduino_base.build_flags} -D NRF52_PLATFORM -D LFS_NO_ASSERT=1 From f7d8fa342053b17aeff783a63b923641306f6728 Mon Sep 17 00:00:00 2001 From: taco Date: Tue, 28 Apr 2026 21:46:14 +1000 Subject: [PATCH 26/46] use internal fork of Adafruit nRF52 Arduino --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index cc1518a7..6a3c28c3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -81,7 +81,7 @@ platform = https://github.com/pioarduino/platform-espressif32/releases/download/ extends = arduino_base platform = nordicnrf52 platform_packages = - framework-arduinoadafruitnrf52 @ 1.10700.0 + framework-arduinoadafruitnrf52 @ https://github.com/meshcore-dev/Adafruit_nRF52_Arduino#d541301 extra_scripts = create-uf2.py build_flags = ${arduino_base.build_flags} -D NRF52_PLATFORM From 66009069cd14d28777781cb66923254b0a1999e5 Mon Sep 17 00:00:00 2001 From: Rastislav Vysoky Date: Tue, 28 Apr 2026 13:53:35 +0200 Subject: [PATCH 27/46] standardize the minewsemi variant --- variants/minewsemi_me25ls01/platformio.ini | 40 +++++----------------- 1 file changed, 8 insertions(+), 32 deletions(-) diff --git a/variants/minewsemi_me25ls01/platformio.ini b/variants/minewsemi_me25ls01/platformio.ini index dacd8d34..91e62243 100644 --- a/variants/minewsemi_me25ls01/platformio.ini +++ b/variants/minewsemi_me25ls01/platformio.ini @@ -1,23 +1,11 @@ -; ----------------- NRF52 me25ls01--------------------- -[nrf52840_me25ls01] +[me25ls01] extends = nrf52_base -platform_packages = framework-arduinoadafruitnrf52 +board = minewsemi_me25ls01 +board_build.ldscript = boards/nrf52840_s140_v7.ld build_flags = ${nrf52_base.build_flags} -I src/helpers/nrf52 -I lib/nrf52/s140_nrf52_7.3.0_API/include -I lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52 -lib_ignore = - BluetoothOTA - lib5b4 -lib_deps = - ${nrf52_base.lib_deps} - rweather/Crypto @ ^0.4.0 - -[me25ls01] -extends = nrf52840_me25ls01 -board = minewsemi_me25ls01 -board_build.ldscript = boards/nrf52840_s140_v7.ld -build_flags = ${nrf52840_me25ls01.build_flags} -I variants/minewsemi_me25ls01 -D me25ls01 -D PIN_USER_BTN=27 @@ -31,13 +19,14 @@ build_flags = ${nrf52840_me25ls01.build_flags} -D ENV_INCLUDE_BME280=1 -D ENV_INCLUDE_INA3221=1 -D ENV_INCLUDE_INA219=1 -build_src_filter = ${nrf52840_me25ls01.build_src_filter} +build_src_filter = ${nrf52_base.build_src_filter} + +<../variants/minewsemi_me25ls01> + debug_tool = jlink upload_protocol = nrfutil -lib_deps = ${nrf52840_me25ls01.lib_deps} +lib_deps = ${nrf52_base.lib_deps} + adafruit/RTClib @ ^2.1.3 densaugeo/base64 @ ~1.4.0 stevemarple/MicroNMEA @ ^2.0.6 end2endzone/NonBlockingRTTTL@^1.3.0 @@ -45,7 +34,7 @@ lib_deps = ${nrf52840_me25ls01.lib_deps} adafruit/Adafruit INA3221 Library @ ^1.0.1 adafruit/Adafruit INA219 @ ^1.2.3 adafruit/Adafruit AHTX0 @ ^2.0.5 - adafruit/Adafruit BME280 Library @ ^2.3.0 + adafruit/Adafruit BME280 Library @ ^2.3.0 [env:Minewsemi_me25ls01_companion_radio_ble] extends = me25ls01 @@ -64,14 +53,11 @@ build_flags = ${me25ls01.build_flags} -D RF_SWITCH_TABLE -D DISPLAY_CLASS=NullDisplayDriver ;-D PIN_BUZZER=25 - ;-D PIN_BUZZER_EN=37 + ;-D PIN_BUZZER_EN=37 build_src_filter = ${me25ls01.build_src_filter} + +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-orig/*.cpp> -lib_deps = ${me25ls01.lib_deps} - adafruit/RTClib @ ^2.1.3 - [env:Minewsemi_me25ls01_repeater] extends = me25ls01 @@ -93,10 +79,6 @@ build_flags = ${me25ls01.build_flags} -D DISPLAY_CLASS=NullDisplayDriver build_src_filter = ${me25ls01.build_src_filter} +<../examples/simple_repeater> -lib_deps = ${me25ls01.lib_deps} - adafruit/RTClib @ ^2.1.3 - - [env:Minewsemi_me25ls01_room_server] extends = me25ls01 @@ -119,8 +101,6 @@ build_flags = ${me25ls01.build_flags} -D DISPLAY_CLASS=NullDisplayDriver build_src_filter = ${me25ls01.build_src_filter} +<../examples/simple_room_server> -lib_deps = ${me25ls01.lib_deps} - adafruit/RTClib @ ^2.1.3 [env:Minewsemi_me25ls01_terminal_chat] extends = me25ls01 @@ -143,8 +123,6 @@ build_flags = ${me25ls01.build_flags} -D DISPLAY_CLASS=NullDisplayDriver build_src_filter = ${me25ls01.build_src_filter} +<../examples/simple_secure_chat/main.cpp> -lib_deps = ${me25ls01.lib_deps} - adafruit/RTClib @ ^2.1.3 [env:Minewsemi_me25ls01_companion_radio_usb] extends = me25ls01 @@ -166,6 +144,4 @@ build_src_filter = ${me25ls01.build_src_filter} + +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-orig/*.cpp> -lib_deps = ${me25ls01.lib_deps} - adafruit/RTClib @ ^2.1.3 From 5beef490a0794f2969967b5a825bdf739240d886 Mon Sep 17 00:00:00 2001 From: Rastislav Vysoky Date: Tue, 28 Apr 2026 15:09:25 +0200 Subject: [PATCH 28/46] add kiss radio env to most of the variants --- examples/kiss_modem/main.cpp | 5 +- variants/ebyte_eora_s3/platformio.ini | 5 + variants/gat562_30s_mesh_kit/platformio.ini | 4 + variants/gat562_mesh_evb_pro/platformio.ini | 5 + .../gat562_mesh_tracker_pro/platformio.ini | 4 + variants/gat562_mesh_watch13/platformio.ini | 4 + variants/generic-e22/platformio.ini | 5 + variants/heltec_ct62/platformio.ini | 5 + variants/heltec_e213/platformio.ini | 5 + variants/heltec_e290/platformio.ini | 5 + variants/heltec_mesh_solar/platformio.ini | 7 +- variants/heltec_t096/platformio.ini | 9 +- variants/heltec_t114/platformio.ini | 12 +- variants/heltec_t190/platformio.ini | 5 + variants/heltec_tracker/platformio.ini | 5 + variants/heltec_tracker_v2/platformio.ini | 7 +- variants/heltec_v2/platformio.ini | 5 + variants/heltec_v3/platformio.ini | 4 - variants/heltec_v4/platformio.ini | 5 + variants/heltec_wireless_paper/platformio.ini | 5 + variants/ikoka_handheld_nrf/platformio.ini | 13 +- variants/ikoka_nano_nrf/platformio.ini | 15 + variants/ikoka_stick_nrf/platformio.ini | 15 + variants/keepteen_lt1/platformio.ini | 7 +- variants/lilygo_t3s3/platformio.ini | 5 + variants/lilygo_t3s3_sx1276/platformio.ini | 7 +- variants/lilygo_tbeam_1w/platformio.ini | 5 + variants/lilygo_tbeam_SX1262/platformio.ini | 5 + variants/lilygo_tbeam_SX1276/platformio.ini | 5 + .../platformio.ini | 5 + variants/lilygo_tdeck/platformio.ini | 10 +- variants/lilygo_techo/platformio.ini | 5 + variants/lilygo_techo_lite/platformio.ini | 5 + variants/lilygo_tlora_c6/platformio.ini | 5 + variants/lilygo_tlora_v2_1/platformio.ini | 5 + variants/m5stack_unit_c6l/platformio.ini | 5 + variants/mesh_pocket/platformio.ini | 7 +- variants/meshadventurer/platformio.ini | 38 +- variants/meshtiny/platformio.ini | 5 + variants/minewsemi_me25ls01/platformio.ini | 346 +++++++++--------- variants/muziworks_r1_neo/platformio.ini | 5 + variants/nano_g2_ultra/platformio.ini | 5 + variants/nibble_screen_connect/platformio.ini | 5 + variants/promicro/platformio.ini | 5 + variants/rak11310/platformio.ini | 5 + variants/rak3112/platformio.ini | 5 + variants/rak3401/platformio.ini | 5 + variants/rak3x72/platformio.ini | 5 + variants/rak_wismesh_tag/platformio.ini | 7 +- variants/rpi_picow/platformio.ini | 5 + variants/station_g2/platformio.ini | 5 + variants/t1000-e/platformio.ini | 7 + variants/tenstar_c3/platformio.ini | 20 + variants/thinknode_m1/platformio.ini | 7 +- variants/thinknode_m2/platformio.ini | 7 + variants/thinknode_m3/platformio.ini | 11 +- variants/thinknode_m5/platformio.ini | 5 + variants/thinknode_m6/platformio.ini | 7 +- variants/tiny_relay/platformio.ini | 5 + variants/waveshare_rp2040_lora/platformio.ini | 5 + variants/wio-e5-dev/platformio.ini | 7 + variants/wio-e5-mini/platformio.ini | 9 +- variants/wio-tracker-l1-eink/platformio.ini | 5 + variants/wio-tracker-l1/platformio.ini | 5 + variants/wio_wm1110/platformio.ini | 5 + variants/xiao_c3/platformio.ini | 5 + variants/xiao_c6/platformio.ini | 5 + variants/xiao_rp2040/platformio.ini | 5 + variants/xiao_s3_wio/platformio.ini | 5 + 69 files changed, 586 insertions(+), 220 deletions(-) diff --git a/examples/kiss_modem/main.cpp b/examples/kiss_modem/main.cpp index 35079592..bc7508a8 100644 --- a/examples/kiss_modem/main.cpp +++ b/examples/kiss_modem/main.cpp @@ -10,7 +10,10 @@ #include #elif defined(ESP32) #include +#else + #include #endif + #if defined(KISS_UART_RX) && defined(KISS_UART_TX) #include #endif @@ -29,7 +32,7 @@ void halt() { } void loadOrCreateIdentity() { -#if defined(NRF52_PLATFORM) +#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) InternalFS.begin(); IdentityStore store(InternalFS, ""); #elif defined(ESP32) diff --git a/variants/ebyte_eora_s3/platformio.ini b/variants/ebyte_eora_s3/platformio.ini index d807b978..15fe761b 100644 --- a/variants/ebyte_eora_s3/platformio.ini +++ b/variants/ebyte_eora_s3/platformio.ini @@ -135,3 +135,8 @@ build_src_filter = ${Ebyte_EoRa-S3.build_src_filter} lib_deps = ${Ebyte_EoRa-S3.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:Ebyte_EoRa-S3_kiss_modem] +extends = Ebyte_EoRa-S3 +build_src_filter = ${Ebyte_EoRa-S3.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/gat562_30s_mesh_kit/platformio.ini b/variants/gat562_30s_mesh_kit/platformio.ini index 1467f0fa..2baac256 100644 --- a/variants/gat562_30s_mesh_kit/platformio.ini +++ b/variants/gat562_30s_mesh_kit/platformio.ini @@ -112,3 +112,7 @@ lib_deps = densaugeo/base64 @ ~1.4.0 end2endzone/NonBlockingRTTTL@^1.3.0 +[env:GAT562_30S_Mesh_Kit_kiss_modem] +extends = GAT562_30S_Mesh_Kit +build_src_filter = ${GAT562_30S_Mesh_Kit.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/gat562_mesh_evb_pro/platformio.ini b/variants/gat562_mesh_evb_pro/platformio.ini index cede9c97..b3e89417 100644 --- a/variants/gat562_mesh_evb_pro/platformio.ini +++ b/variants/gat562_mesh_evb_pro/platformio.ini @@ -50,3 +50,8 @@ build_flags = ; -D MESH_DEBUG=1 build_src_filter = ${GAT562_Mesh_EVB_Pro.build_src_filter} +<../examples/simple_room_server> + +[env:GAT562_Mesh_EVB_Pro_kiss_modem] +extends = GAT562_Mesh_EVB_Pro +build_src_filter = ${GAT562_Mesh_EVB_Pro.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/gat562_mesh_tracker_pro/platformio.ini b/variants/gat562_mesh_tracker_pro/platformio.ini index 8a947bce..af153b8f 100644 --- a/variants/gat562_mesh_tracker_pro/platformio.ini +++ b/variants/gat562_mesh_tracker_pro/platformio.ini @@ -106,3 +106,7 @@ lib_deps = ${GAT562_Mesh_Tracker_Pro.lib_deps} densaugeo/base64 @ ~1.4.0 +[env:GAT562_Mesh_Tracker_Pro_kiss_modem] +extends = GAT562_Mesh_Tracker_Pro +build_src_filter = ${GAT562_Mesh_Tracker_Pro.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/gat562_mesh_watch13/platformio.ini b/variants/gat562_mesh_watch13/platformio.ini index ef30829d..f3510b74 100644 --- a/variants/gat562_mesh_watch13/platformio.ini +++ b/variants/gat562_mesh_watch13/platformio.ini @@ -87,3 +87,7 @@ lib_deps = ${GAT562_Mesh_Watch13.lib_deps} densaugeo/base64 @ ~1.4.0 +[env:GAT562_Mesh_Watch13_kiss_modem] +extends = GAT562_Mesh_Watch13 +build_src_filter = ${GAT562_Mesh_Watch13.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/generic-e22/platformio.ini b/variants/generic-e22/platformio.ini index 6b7bfd4e..dfa2ff64 100644 --- a/variants/generic-e22/platformio.ini +++ b/variants/generic-e22/platformio.ini @@ -95,6 +95,11 @@ lib_deps = ${Generic_E22.lib_deps} ${esp32_ota.lib_deps} +[env:Generic_E22_kiss_modem] +extends = Generic_E22 +build_src_filter = ${Generic_E22.build_src_filter} + +<../examples/kiss_modem/> + [env:Generic_E22_sx1268_repeater] extends = Generic_E22 build_src_filter = ${Generic_E22.build_src_filter} diff --git a/variants/heltec_ct62/platformio.ini b/variants/heltec_ct62/platformio.ini index 910385ec..0179d965 100644 --- a/variants/heltec_ct62/platformio.ini +++ b/variants/heltec_ct62/platformio.ini @@ -150,3 +150,8 @@ build_src_filter = ${Heltec_ct62.build_src_filter} lib_deps = ${Heltec_ct62.lib_deps} ${esp32_ota.lib_deps} + +[env:Heltec_ct62_kiss_modem] +extends = Heltec_ct62 +build_src_filter = ${Heltec_ct62.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_e213/platformio.ini b/variants/heltec_e213/platformio.ini index 395e22ea..123edd91 100644 --- a/variants/heltec_e213/platformio.ini +++ b/variants/heltec_e213/platformio.ini @@ -166,3 +166,8 @@ lib_deps = ${Heltec_E213_base.lib_deps} ${esp32_ota.lib_deps} bakercp/CRC32 @ ^2.0.0 + +[env:Heltec_E213_kiss_modem] +extends = Heltec_E213_base +build_src_filter = ${Heltec_E213_base.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_e290/platformio.ini b/variants/heltec_e290/platformio.ini index 475ae868..6e0eaffc 100644 --- a/variants/heltec_e290/platformio.ini +++ b/variants/heltec_e290/platformio.ini @@ -162,3 +162,8 @@ lib_deps = ${Heltec_E290_base.lib_deps} ${esp32_ota.lib_deps} bakercp/CRC32 @ ^2.0.0 + +[env:Heltec_E290_kiss_modem] +extends = Heltec_E290_base +build_src_filter = ${Heltec_E290_base.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_mesh_solar/platformio.ini b/variants/heltec_mesh_solar/platformio.ini index 7bfbac85..92d641a3 100644 --- a/variants/heltec_mesh_solar/platformio.ini +++ b/variants/heltec_mesh_solar/platformio.ini @@ -92,4 +92,9 @@ build_src_filter = ${Heltec_mesh_solar.build_src_filter} +<../examples/companion_radio/*.cpp> lib_deps = ${Heltec_mesh_solar.lib_deps} - densaugeo/base64 @ ~1.4.0 \ No newline at end of file + densaugeo/base64 @ ~1.4.0 + +[env:Heltec_mesh_solar_kiss_modem] +extends = Heltec_mesh_solar +build_src_filter = ${Heltec_mesh_solar.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_t096/platformio.ini b/variants/heltec_t096/platformio.ini index 19b05f3c..14155f5e 100644 --- a/variants/heltec_t096/platformio.ini +++ b/variants/heltec_t096/platformio.ini @@ -92,7 +92,7 @@ build_src_filter = ${Heltec_t096.build_src_filter} [env:Heltec_t096_room_server] extends = Heltec_t096 build_src_filter = ${Heltec_t096.build_src_filter} - +<../examples/simple_room_server> + +<../examples/simple_room_server> build_flags = ${Heltec_t096.build_flags} -D ADVERT_NAME='"Heltec_t096 Room"' @@ -145,4 +145,9 @@ build_src_filter = ${Heltec_t096.build_src_filter} +<../examples/companion_radio/ui-new/*.cpp> lib_deps = ${Heltec_t096.lib_deps} - densaugeo/base64 @ ~1.4.0 \ No newline at end of file + densaugeo/base64 @ ~1.4.0 + +[env:Heltec_t096_kiss_modem] +extends = Heltec_t096 +build_src_filter = ${Heltec_t096.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_t114/platformio.ini b/variants/heltec_t114/platformio.ini index b985030f..135babb1 100644 --- a/variants/heltec_t114/platformio.ini +++ b/variants/heltec_t114/platformio.ini @@ -50,7 +50,6 @@ upload_protocol = nrfutil extends = Heltec_t114 build_src_filter = ${Heltec_t114.build_src_filter} +<../examples/simple_repeater> - build_flags = ${Heltec_t114.build_flags} -D ADVERT_NAME='"Heltec_T114 Repeater"' @@ -127,10 +126,6 @@ build_flags = -D DISPLAY_CLASS=NullDisplayDriver -D MAX_CONTACTS=350 -D MAX_GROUP_CHANNELS=40 -; -D BLE_PIN_CODE=123456 -; -D BLE_DEBUG_LOGGING=1 -; -D MESH_PACKET_LOGGING=1 -; -D MESH_DEBUG=1 build_src_filter = ${Heltec_t114.build_src_filter} + +<../examples/companion_radio/*.cpp> @@ -251,4 +246,9 @@ build_src_filter = ${Heltec_t114_with_display.build_src_filter} +<../examples/companion_radio/ui-new/*.cpp> lib_deps = ${Heltec_t114_with_display.lib_deps} - densaugeo/base64 @ ~1.4.0 \ No newline at end of file + densaugeo/base64 @ ~1.4.0 + +[env:Heltec_t114_kiss_modem] +extends = Heltec_t114 +build_src_filter = ${Heltec_t114.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_t190/platformio.ini b/variants/heltec_t190/platformio.ini index 4b034032..411fee85 100644 --- a/variants/heltec_t190/platformio.ini +++ b/variants/heltec_t190/platformio.ini @@ -153,3 +153,8 @@ build_src_filter = ${Heltec_T190_base.build_src_filter} lib_deps = ${Heltec_T190_base.lib_deps} ${esp32_ota.lib_deps} + +[env:Heltec_T190_kiss_modem] +extends = Heltec_T190_base +build_src_filter = ${Heltec_T190_base.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_tracker/platformio.ini b/variants/heltec_tracker/platformio.ini index e0a8f5fa..69293d70 100644 --- a/variants/heltec_tracker/platformio.ini +++ b/variants/heltec_tracker/platformio.ini @@ -186,3 +186,8 @@ build_src_filter = ${Heltec_tracker_base.build_src_filter} lib_deps = ${Heltec_tracker_base.lib_deps} ${esp32_ota.lib_deps} + +[env:Heltec_Wireless_Tracker_kiss_modem] +extends = Heltec_tracker_base +build_src_filter = ${Heltec_tracker_base.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_tracker_v2/platformio.ini b/variants/heltec_tracker_v2/platformio.ini index 956b1ec7..d57c2113 100644 --- a/variants/heltec_tracker_v2/platformio.ini +++ b/variants/heltec_tracker_v2/platformio.ini @@ -187,7 +187,7 @@ build_flags = -D WIFI_DEBUG_LOGGING=1 -D WIFI_SSID='"myssid"' -D WIFI_PWD='"mypwd"' - -D OFFLINE_QUEUE_SIZE=256 + -D OFFLINE_QUEUE_SIZE=256 ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 build_src_filter = ${Heltec_tracker_v2.build_src_filter} @@ -217,3 +217,8 @@ build_src_filter = ${Heltec_tracker_v2.build_src_filter} lib_deps = ${Heltec_tracker_v2.lib_deps} ${esp32_ota.lib_deps} + +[env:heltec_tracker_v2_kiss_modem] +extends = Heltec_tracker_v2 +build_src_filter = ${Heltec_tracker_v2.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_v2/platformio.ini b/variants/heltec_v2/platformio.ini index 99f6f7e1..c103dd8d 100644 --- a/variants/heltec_v2/platformio.ini +++ b/variants/heltec_v2/platformio.ini @@ -195,3 +195,8 @@ build_src_filter = ${Heltec_lora32_v2.build_src_filter} lib_deps = ${Heltec_lora32_v2.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:Heltec_v2_kiss_modem] +extends = Heltec_lora32_v2 +build_src_filter = ${Heltec_lora32_v2.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_v3/platformio.ini b/variants/heltec_v3/platformio.ini index 803ee683..a70a93a5 100644 --- a/variants/heltec_v3/platformio.ini +++ b/variants/heltec_v3/platformio.ini @@ -371,9 +371,5 @@ lib_deps = [env:Heltec_v3_kiss_modem] extends = Heltec_lora32_v3 -build_flags = - ${Heltec_lora32_v3.build_flags} build_src_filter = ${Heltec_lora32_v3.build_src_filter} +<../examples/kiss_modem/> -lib_deps = - ${Heltec_lora32_v3.lib_deps} \ No newline at end of file diff --git a/variants/heltec_v4/platformio.ini b/variants/heltec_v4/platformio.ini index 87632f32..fabf3827 100644 --- a/variants/heltec_v4/platformio.ini +++ b/variants/heltec_v4/platformio.ini @@ -429,3 +429,8 @@ build_src_filter = ${heltec_v4_tft.build_src_filter} lib_deps = ${heltec_v4_tft.lib_deps} ${esp32_ota.lib_deps} + +[env:heltec_v4_kiss_modem] +extends = Heltec_lora32_v4 +build_src_filter = ${Heltec_lora32_v4.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/heltec_wireless_paper/platformio.ini b/variants/heltec_wireless_paper/platformio.ini index c6fe657d..48723d16 100644 --- a/variants/heltec_wireless_paper/platformio.ini +++ b/variants/heltec_wireless_paper/platformio.ini @@ -165,3 +165,8 @@ lib_deps = ${Heltec_Wireless_Paper_base.lib_deps} ${esp32_ota.lib_deps} bakercp/CRC32 @ ^2.0.0 + +[env:Heltec_Wireless_Paper_kiss_modem] +extends = Heltec_Wireless_Paper_base +build_src_filter = ${Heltec_Wireless_Paper_base.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/ikoka_handheld_nrf/platformio.ini b/variants/ikoka_handheld_nrf/platformio.ini index 9f48cd41..51b602e4 100644 --- a/variants/ikoka_handheld_nrf/platformio.ini +++ b/variants/ikoka_handheld_nrf/platformio.ini @@ -86,8 +86,7 @@ build_src_filter = ${ikoka_handheld_nrf_ssd1306_companion.build_src_filter} [env:ikoka_handheld_nrf_e22_30dbm_repeater] extends = ikoka_handheld_nrf -build_flags = - ${ikoka_handheld_nrf.build_flags} +build_flags = ${ikoka_handheld_nrf.build_flags} -D ADVERT_NAME='"ikoka_handheld Repeater"' -D ADVERT_LAT=0.0 -D ADVERT_LON=0.0 @@ -99,8 +98,7 @@ build_src_filter = ${ikoka_handheld_nrf.build_src_filter} [env:ikoka_handheld_nrf_e22_30dbm_room_server] extends = ikoka_handheld_nrf -build_flags = - ${ikoka_handheld_nrf.build_flags} +build_flags = ${ikoka_handheld_nrf.build_flags} -D ADVERT_NAME='"ikoka_handheld Room"' -D ADVERT_LAT=0.0 -D ADVERT_LON=0.0 @@ -108,3 +106,10 @@ build_flags = -D LORA_TX_POWER=20 build_src_filter = ${ikoka_handheld_nrf.build_src_filter} +<../examples/simple_room_server/*.cpp> + +[env:ikoka_handheld_nrf_kiss_modem] +extends = ikoka_handheld_nrf +build_flags = ${ikoka_handheld_nrf.build_flags} + -D LORA_TX_POWER=20 +build_src_filter = ${ikoka_handheld_nrf.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/ikoka_nano_nrf/platformio.ini b/variants/ikoka_nano_nrf/platformio.ini index d631174d..e72f83ce 100644 --- a/variants/ikoka_nano_nrf/platformio.ini +++ b/variants/ikoka_nano_nrf/platformio.ini @@ -279,3 +279,18 @@ build_flags = build_src_filter = ${ikoka_nano_nrf_room_server.build_src_filter} ${ikoka_nano_nrf_e22_33dbm.build_src_filter} + +[env:ikoka_nano_nrf_22dbm_kiss_modem] +extends = ikoka_nano_nrf_e22_22dbm +build_src_filter = ${ikoka_nano_nrf_e22_22dbm.build_src_filter} + +<../examples/kiss_modem/> + +[env:ikoka_nano_nrf_30dbm_kiss_modem] +extends = ikoka_nano_nrf_e22_30dbm +build_src_filter = ${ikoka_nano_nrf_e22_30dbm.build_src_filter} + +<../examples/kiss_modem/> + +[env:ikoka_nano_nrf_33dbm_kiss_modem] +extends = ikoka_nano_nrf_e22_33dbm +build_src_filter = ${ikoka_nano_nrf_e22_33dbm.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/ikoka_stick_nrf/platformio.ini b/variants/ikoka_stick_nrf/platformio.ini index e95c6375..06e39e84 100644 --- a/variants/ikoka_stick_nrf/platformio.ini +++ b/variants/ikoka_stick_nrf/platformio.ini @@ -290,3 +290,18 @@ build_flags = build_src_filter = ${ikoka_stick_nrf_room_server.build_src_filter} ${ikoka_stick_nrf_e22_33dbm.build_src_filter} + +[env:ikoka_stick_nrf_22dbm_kiss_modem] +extends = ikoka_stick_nrf_e22_22dbm +build_src_filter = ${ikoka_stick_nrf_e22_22dbm.build_src_filter} + +<../examples/kiss_modem/> + +[env:ikoka_stick_nrf_30dbm_kiss_modem] +extends = ikoka_stick_nrf_e22_30dbm +build_src_filter = ${ikoka_stick_nrf_e22_30dbm.build_src_filter} + +<../examples/kiss_modem/> + +[env:ikoka_stick_nrf_33dbm_kiss_modem] +extends = ikoka_stick_nrf_e22_33dbm +build_src_filter = ${ikoka_stick_nrf_e22_33dbm.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/keepteen_lt1/platformio.ini b/variants/keepteen_lt1/platformio.ini index b82ceb7e..8aa407a2 100644 --- a/variants/keepteen_lt1/platformio.ini +++ b/variants/keepteen_lt1/platformio.ini @@ -99,4 +99,9 @@ build_src_filter = ${KeepteenLT1.build_src_filter} +<../examples/companion_radio/ui-new/*.cpp> lib_deps = ${KeepteenLT1.lib_deps} adafruit/RTClib @ ^2.1.3 - densaugeo/base64 @ ~1.4.0 \ No newline at end of file + densaugeo/base64 @ ~1.4.0 + +[env:KeepteenLT1_kiss_modem] +extends = KeepteenLT1 +build_src_filter = ${KeepteenLT1.build_src_filter} + +<../examples/kiss_modem/> \ No newline at end of file diff --git a/variants/lilygo_t3s3/platformio.ini b/variants/lilygo_t3s3/platformio.ini index 1fefcece..54990117 100644 --- a/variants/lilygo_t3s3/platformio.ini +++ b/variants/lilygo_t3s3/platformio.ini @@ -173,3 +173,8 @@ build_src_filter = ${LilyGo_T3S3_sx1262.build_src_filter} lib_deps = ${LilyGo_T3S3_sx1262.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:LilyGo_T3S3_sx1262_kiss_modem] +extends = LilyGo_T3S3_sx1262 +build_src_filter = ${LilyGo_T3S3_sx1262.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/lilygo_t3s3_sx1276/platformio.ini b/variants/lilygo_t3s3_sx1276/platformio.ini index 5a7ece2c..5df63202 100644 --- a/variants/lilygo_t3s3_sx1276/platformio.ini +++ b/variants/lilygo_t3s3_sx1276/platformio.ini @@ -168,4 +168,9 @@ build_src_filter = ${LilyGo_T3S3_sx1276.build_src_filter} +<../examples/companion_radio/ui-new/*.cpp> lib_deps = ${LilyGo_T3S3_sx1276.lib_deps} - densaugeo/base64 @ ~1.4.0 \ No newline at end of file + densaugeo/base64 @ ~1.4.0 + +[env:LilyGo_T3S3_sx1276_kiss_modem] +extends = LilyGo_T3S3_sx1276 +build_src_filter = ${LilyGo_T3S3_sx1276.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/lilygo_tbeam_1w/platformio.ini b/variants/lilygo_tbeam_1w/platformio.ini index 7c845307..c7a59552 100644 --- a/variants/lilygo_tbeam_1w/platformio.ini +++ b/variants/lilygo_tbeam_1w/platformio.ini @@ -192,3 +192,8 @@ build_src_filter = ${LilyGo_TBeam_1W.build_src_filter} lib_deps = ${LilyGo_TBeam_1W.lib_deps} ${esp32_ota.lib_deps} + +[env:LilyGo_TBeam_1W_kiss_modem] +extends = LilyGo_TBeam_1W +build_src_filter = ${LilyGo_TBeam_1W.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/lilygo_tbeam_SX1262/platformio.ini b/variants/lilygo_tbeam_SX1262/platformio.ini index d3bc7c99..77b39304 100644 --- a/variants/lilygo_tbeam_SX1262/platformio.ini +++ b/variants/lilygo_tbeam_SX1262/platformio.ini @@ -133,3 +133,8 @@ build_src_filter = ${LilyGo_TBeam_SX1262.build_src_filter} lib_deps = ${LilyGo_TBeam_SX1262.lib_deps} ${esp32_ota.lib_deps} + +[env:Tbeam_SX1262_kiss_modem] +extends = LilyGo_TBeam_SX1262 +build_src_filter = ${LilyGo_TBeam_SX1262.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/lilygo_tbeam_SX1276/platformio.ini b/variants/lilygo_tbeam_SX1276/platformio.ini index 3562c40e..6853a232 100644 --- a/variants/lilygo_tbeam_SX1276/platformio.ini +++ b/variants/lilygo_tbeam_SX1276/platformio.ini @@ -131,3 +131,8 @@ build_src_filter = ${LilyGo_TBeam_SX1276.build_src_filter} lib_deps = ${LilyGo_TBeam_SX1276.lib_deps} ${esp32_ota.lib_deps} + +[env:Tbeam_SX1276_kiss_modem] +extends = LilyGo_TBeam_SX1276 +build_src_filter = ${LilyGo_TBeam_SX1276.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/lilygo_tbeam_supreme_SX1262/platformio.ini b/variants/lilygo_tbeam_supreme_SX1262/platformio.ini index ffee37a9..845dd415 100644 --- a/variants/lilygo_tbeam_supreme_SX1262/platformio.ini +++ b/variants/lilygo_tbeam_supreme_SX1262/platformio.ini @@ -158,3 +158,8 @@ build_src_filter = ${T_Beam_S3_Supreme_SX1262.build_src_filter} lib_deps = ${T_Beam_S3_Supreme_SX1262.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:T_Beam_S3_Supreme_SX1262_kiss_modem] +extends = T_Beam_S3_Supreme_SX1262 +build_src_filter = ${T_Beam_S3_Supreme_SX1262.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/lilygo_tdeck/platformio.ini b/variants/lilygo_tdeck/platformio.ini index a8408afa..745d8ff5 100644 --- a/variants/lilygo_tdeck/platformio.ini +++ b/variants/lilygo_tdeck/platformio.ini @@ -57,6 +57,7 @@ build_flags = build_src_filter = ${esp32_base.build_src_filter} +<../variants/lilygo_tdeck> + + + lib_deps = ${esp32_base.lib_deps} ${sensor_base.lib_deps} @@ -75,7 +76,6 @@ build_src_filter = ${LilyGo_TDeck.build_src_filter} + +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-new/*.cpp> - + lib_deps = ${LilyGo_TDeck.lib_deps} densaugeo/base64 @ ~1.4.0 @@ -94,7 +94,6 @@ build_src_filter = ${LilyGo_TDeck.build_src_filter} + +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-new/*.cpp> - + lib_deps = ${LilyGo_TDeck.lib_deps} densaugeo/base64 @ ~1.4.0 @@ -113,4 +112,9 @@ build_src_filter = ${LilyGo_TDeck.build_src_filter} + lib_deps = ${LilyGo_TDeck.lib_deps} - ${esp32_ota.lib_deps} \ No newline at end of file + ${esp32_ota.lib_deps} + +[env:LilyGo_TDeck_kiss_modem] +extends = LilyGo_TDeck +build_src_filter = ${LilyGo_TDeck.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/lilygo_techo/platformio.ini b/variants/lilygo_techo/platformio.ini index e2172b1d..5df77f95 100644 --- a/variants/lilygo_techo/platformio.ini +++ b/variants/lilygo_techo/platformio.ini @@ -126,3 +126,8 @@ build_src_filter = ${LilyGo_T-Echo.build_src_filter} lib_deps = ${LilyGo_T-Echo.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:LilyGo_T-Echo_kiss_modem] +extends = LilyGo_T-Echo +build_src_filter = ${LilyGo_T-Echo.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/lilygo_techo_lite/platformio.ini b/variants/lilygo_techo_lite/platformio.ini index 88616858..d3408f95 100644 --- a/variants/lilygo_techo_lite/platformio.ini +++ b/variants/lilygo_techo_lite/platformio.ini @@ -140,3 +140,8 @@ build_src_filter = ${nrf52_base.build_src_filter} lib_deps = ${LilyGo_T-Echo-Lite.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:LilyGo_T-Echo-Lite_kiss_modem] +extends = LilyGo_T-Echo-Lite +build_src_filter = ${LilyGo_T-Echo-Lite.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/lilygo_tlora_c6/platformio.ini b/variants/lilygo_tlora_c6/platformio.ini index b06a0b7c..3acfa761 100644 --- a/variants/lilygo_tlora_c6/platformio.ini +++ b/variants/lilygo_tlora_c6/platformio.ini @@ -84,3 +84,8 @@ build_src_filter = ${tlora_c6.build_src_filter} lib_deps = ${tlora_c6.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:LilyGo_Tlora_C6_kiss_modem] +extends = tlora_c6 +build_src_filter = ${tlora_c6.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/lilygo_tlora_v2_1/platformio.ini b/variants/lilygo_tlora_v2_1/platformio.ini index 3641f127..f710d070 100644 --- a/variants/lilygo_tlora_v2_1/platformio.ini +++ b/variants/lilygo_tlora_v2_1/platformio.ini @@ -192,3 +192,8 @@ build_flags = lib_deps = ${LilyGo_TLora_V2_1_1_6.lib_deps} ${esp32_ota.lib_deps} + +[env:LilyGo_TLora_V2_1_1_6_kiss_modem] +extends = LilyGo_TLora_V2_1_1_6 +build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/m5stack_unit_c6l/platformio.ini b/variants/m5stack_unit_c6l/platformio.ini index 84c6562a..94083eb4 100644 --- a/variants/m5stack_unit_c6l/platformio.ini +++ b/variants/m5stack_unit_c6l/platformio.ini @@ -105,3 +105,8 @@ lib_deps = ${M5Stack_Unit_C6L.lib_deps} densaugeo/base64 @ ~1.4.0 end2endzone/NonBlockingRTTTL@^1.3.0 + +[env:M5Stack_Unit_C6L_kiss_modem] +extends = M5Stack_Unit_C6L +build_src_filter = ${M5Stack_Unit_C6L.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/mesh_pocket/platformio.ini b/variants/mesh_pocket/platformio.ini index 015c2ca4..52a0d835 100644 --- a/variants/mesh_pocket/platformio.ini +++ b/variants/mesh_pocket/platformio.ini @@ -109,4 +109,9 @@ build_src_filter = ${Mesh_pocket.build_src_filter} +<../examples/companion_radio/ui-new/*.cpp> lib_deps = ${Mesh_pocket.lib_deps} - densaugeo/base64 @ ~1.4.0 \ No newline at end of file + densaugeo/base64 @ ~1.4.0 + +[env:Mesh_pocket_kiss_modem] +extends = Mesh_pocket +build_src_filter = ${Mesh_pocket.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/meshadventurer/platformio.ini b/variants/meshadventurer/platformio.ini index 18b64ac3..2006a180 100644 --- a/variants/meshadventurer/platformio.ini +++ b/variants/meshadventurer/platformio.ini @@ -29,6 +29,7 @@ build_flags = build_src_filter = ${esp32_base.build_src_filter} +<../variants/meshadventurer> + + + lib_deps = ${esp32_base.lib_deps} stevemarple/MicroNMEA @ ^2.0.6 @@ -38,7 +39,6 @@ lib_deps = extends = Meshadventurer build_src_filter = ${Meshadventurer.build_src_filter} +<../examples/simple_repeater> - + build_flags = ${Meshadventurer.build_flags} -D RADIO_CLASS=CustomSX1262 @@ -60,7 +60,6 @@ lib_deps = ; build_src_filter = ${Meshadventurer.build_src_filter} ; + ; +<../examples/simple_repeater> -; + ; build_flags = ; ${Meshadventurer.build_flags} ; -D RADIO_CLASS=CustomSX1262 @@ -86,7 +85,6 @@ extends = Meshadventurer build_src_filter = ${Meshadventurer.build_src_filter} + +<../examples/simple_repeater> - + build_flags = ${Meshadventurer.build_flags} -D RADIO_CLASS=CustomSX1262 @@ -109,7 +107,6 @@ lib_deps = extends = Meshadventurer build_src_filter = ${Meshadventurer.build_src_filter} +<../examples/simple_repeater> - + build_flags = ${Meshadventurer.build_flags} -D RADIO_CLASS=CustomSX1268 @@ -157,7 +154,6 @@ extends = Meshadventurer build_src_filter = ${Meshadventurer.build_src_filter} + +<../examples/simple_repeater> - + build_flags = ${Meshadventurer.build_flags} -D RADIO_CLASS=CustomSX1268 @@ -179,8 +175,6 @@ lib_deps = [env:Meshadventurer_sx1262_companion_radio_usb] extends = Meshadventurer build_src_filter = ${Meshadventurer.build_src_filter} - +<../examples/companion_radio/*.cpp> - + +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-new/*.cpp> build_flags = @@ -200,9 +194,7 @@ lib_deps = [env:Meshadventurer_sx1262_companion_radio_ble] extends = Meshadventurer build_src_filter = ${Meshadventurer.build_src_filter} - +<../examples/companion_radio/*.cpp> + - + +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-new/*.cpp> build_flags = @@ -235,7 +227,6 @@ build_flags = ; -D MESH_DEBUG=1 build_src_filter = ${Meshadventurer.build_src_filter} +<../examples/simple_secure_chat/main.cpp> - + lib_deps = ${Meshadventurer.lib_deps} densaugeo/base64 @ ~1.4.0 @@ -256,7 +247,6 @@ build_flags = ; -D MESH_DEBUG=1 build_src_filter = ${Meshadventurer.build_src_filter} +<../examples/simple_room_server> - + lib_deps = ${Meshadventurer.lib_deps} ${esp32_ota.lib_deps} @@ -264,8 +254,6 @@ lib_deps = [env:Meshadventurer_sx1268_companion_radio_usb] extends = Meshadventurer build_src_filter = ${Meshadventurer.build_src_filter} - +<../examples/companion_radio/*.cpp> - + +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-new/*.cpp> build_flags = @@ -285,9 +273,7 @@ lib_deps = [env:Meshadventurer_sx1268_companion_radio_ble] extends = Meshadventurer build_src_filter = ${Meshadventurer.build_src_filter} - +<../examples/companion_radio/*.cpp> + - + +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-new/*.cpp> build_flags = @@ -320,7 +306,6 @@ build_flags = ; -D MESH_DEBUG=1 build_src_filter = ${Meshadventurer.build_src_filter} +<../examples/simple_secure_chat/main.cpp> - + lib_deps = ${Meshadventurer.lib_deps} densaugeo/base64 @ ~1.4.0 @@ -341,7 +326,24 @@ build_flags = ; -D MESH_DEBUG=1 build_src_filter = ${Meshadventurer.build_src_filter} +<../examples/simple_room_server> - + lib_deps = ${Meshadventurer.lib_deps} - ${esp32_ota.lib_deps} \ No newline at end of file + ${esp32_ota.lib_deps} + +[env:Meshadventurer_sx1262_kiss_modem] +extends = Meshadventurer +build_src_filter = ${Meshadventurer.build_src_filter} + +<../examples/kiss_modem/> +build_flags = ${Meshadventurer.build_flags} + -D RADIO_CLASS=CustomSX1262 + -D WRAPPER_CLASS=CustomSX1262Wrapper + -D LORA_TX_POWER=22 + +[env:Meshadventurer_sx1268_kiss_modem] +extends = Meshadventurer +build_src_filter = ${Meshadventurer.build_src_filter} + +<../examples/kiss_modem/> +build_flags = ${Meshadventurer.build_flags} + -D RADIO_CLASS=CustomSX1268 + -D WRAPPER_CLASS=CustomSX1268Wrapper + -D LORA_TX_POWER=22 diff --git a/variants/meshtiny/platformio.ini b/variants/meshtiny/platformio.ini index 0d5de517..c5439c88 100644 --- a/variants/meshtiny/platformio.ini +++ b/variants/meshtiny/platformio.ini @@ -67,3 +67,8 @@ build_src_filter = ${Meshtiny.build_src_filter} lib_deps = ${Meshtiny.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:Meshtiny_kiss_modem] +extends = Meshtiny +build_src_filter = ${Meshtiny.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/minewsemi_me25ls01/platformio.ini b/variants/minewsemi_me25ls01/platformio.ini index dacd8d34..ab609882 100644 --- a/variants/minewsemi_me25ls01/platformio.ini +++ b/variants/minewsemi_me25ls01/platformio.ini @@ -1,171 +1,175 @@ -; ----------------- NRF52 me25ls01--------------------- -[nrf52840_me25ls01] -extends = nrf52_base -platform_packages = framework-arduinoadafruitnrf52 -build_flags = ${nrf52_base.build_flags} - -I src/helpers/nrf52 - -I lib/nrf52/s140_nrf52_7.3.0_API/include - -I lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52 -lib_ignore = - BluetoothOTA - lib5b4 -lib_deps = - ${nrf52_base.lib_deps} - rweather/Crypto @ ^0.4.0 - -[me25ls01] -extends = nrf52840_me25ls01 -board = minewsemi_me25ls01 -board_build.ldscript = boards/nrf52840_s140_v7.ld -build_flags = ${nrf52840_me25ls01.build_flags} - -I variants/minewsemi_me25ls01 - -D me25ls01 - -D PIN_USER_BTN=27 - -D PIN_STATUS_LED=39 - -D P_LORA_TX_LED=22 - -D RADIO_CLASS=CustomLR1110 - -D WRAPPER_CLASS=CustomLR1110Wrapper - -D LORA_TX_POWER=22 - -D ENV_INCLUDE_GPS=0 - -D ENV_INCLUDE_AHTX0=1 - -D ENV_INCLUDE_BME280=1 - -D ENV_INCLUDE_INA3221=1 - -D ENV_INCLUDE_INA219=1 -build_src_filter = ${nrf52840_me25ls01.build_src_filter} - + - +<../variants/minewsemi_me25ls01> - + -debug_tool = jlink -upload_protocol = nrfutil -lib_deps = ${nrf52840_me25ls01.lib_deps} - densaugeo/base64 @ ~1.4.0 - stevemarple/MicroNMEA @ ^2.0.6 - end2endzone/NonBlockingRTTTL@^1.3.0 - adafruit/Adafruit SSD1306 @ ^2.5.13 - adafruit/Adafruit INA3221 Library @ ^1.0.1 - adafruit/Adafruit INA219 @ ^1.2.3 - adafruit/Adafruit AHTX0 @ ^2.0.5 - adafruit/Adafruit BME280 Library @ ^2.3.0 - -[env:Minewsemi_me25ls01_companion_radio_ble] -extends = me25ls01 -board_build.ldscript = boards/nrf52840_s140_v7_extrafs.ld -board_upload.maximum_size = 708608 -build_flags = ${me25ls01.build_flags} - -I examples/companion_radio/ui-orig - -D MAX_CONTACTS=350 - -D MAX_GROUP_CHANNELS=40 - -D BLE_PIN_CODE=123456 -; -D BLE_DEBUG_LOGGING=1 - -D MESH_PACKET_LOGGING=1 - -D MESH_DEBUG=1 - -D OFFLINE_QUEUE_SIZE=256 - -D RX_BOOSTED_GAIN=true - -D RF_SWITCH_TABLE - -D DISPLAY_CLASS=NullDisplayDriver - ;-D PIN_BUZZER=25 - ;-D PIN_BUZZER_EN=37 -build_src_filter = ${me25ls01.build_src_filter} - + - +<../examples/companion_radio/*.cpp> - +<../examples/companion_radio/ui-orig/*.cpp> -lib_deps = ${me25ls01.lib_deps} - adafruit/RTClib @ ^2.1.3 - - -[env:Minewsemi_me25ls01_repeater] -extends = me25ls01 -build_flags = ${me25ls01.build_flags} - -D MAX_CONTACTS=100 - -D MAX_GROUP_CHANNELS=8 - -D BLE_PIN_CODE=123456 -; -D BLE_DEBUG_LOGGING=1 - -D MESH_PACKET_LOGGING=1 - -D MESH_DEBUG=1 - -D OFFLINE_QUEUE_SIZE=256 - -D RX_BOOSTED_GAIN=true - -D RF_SWITCH_TABLE - -D ADVERT_NAME='"ME25LS01 Repeater"' - -D ADVERT_LAT=0.0 - -D ADVERT_LON=0.0 - -D ADMIN_PASSWORD='"password"' - -D MAX_NEIGHBOURS=50 - -D DISPLAY_CLASS=NullDisplayDriver -build_src_filter = ${me25ls01.build_src_filter} - +<../examples/simple_repeater> -lib_deps = ${me25ls01.lib_deps} - adafruit/RTClib @ ^2.1.3 - - - -[env:Minewsemi_me25ls01_room_server] -extends = me25ls01 -build_flags = ${me25ls01.build_flags} - -D MAX_CONTACTS=100 - -D MAX_GROUP_CHANNELS=8 -; -D BLE_PIN_CODE=123456 -; -D BLE_DEBUG_LOGGING=1 -; -D MESH_PACKET_LOGGING=1 -; -D MESH_DEBUG=1 - -D OFFLINE_QUEUE_SIZE=256 - -D RX_BOOSTED_GAIN=true - -D RF_SWITCH_TABLE - -D ADVERT_NAME='"ME25LS01 Room"' - -D ADVERT_LAT=0.0 - -D ADVERT_LON=0.0 - -D ADMIN_PASSWORD='"password"' - -D ROOM_PASSWORD='"hello"' - -D MAX_NEIGHBOURS=50 - -D DISPLAY_CLASS=NullDisplayDriver -build_src_filter = ${me25ls01.build_src_filter} - +<../examples/simple_room_server> -lib_deps = ${me25ls01.lib_deps} - adafruit/RTClib @ ^2.1.3 - -[env:Minewsemi_me25ls01_terminal_chat] -extends = me25ls01 -build_flags = ${me25ls01.build_flags} - -D MAX_CONTACTS=100 - -D MAX_GROUP_CHANNELS=8 - -D BLE_PIN_CODE=123456 -; -D BLE_DEBUG_LOGGING=1 - -D MESH_PACKET_LOGGING=1 - -D MESH_DEBUG=1 - -D OFFLINE_QUEUE_SIZE=256 - -D RX_BOOSTED_GAIN=true - -D RF_SWITCH_TABLE - -D ADVERT_NAME='"ME25LS01 Chat"' - -D ADVERT_LAT=0.0 - -D ADVERT_LON=0.0 - -D ADMIN_PASSWORD='"password"' - -D ROOM_PASSWORD='"hello"' - -D MAX_NEIGHBOURS=50 - -D DISPLAY_CLASS=NullDisplayDriver -build_src_filter = ${me25ls01.build_src_filter} - +<../examples/simple_secure_chat/main.cpp> -lib_deps = ${me25ls01.lib_deps} - adafruit/RTClib @ ^2.1.3 - -[env:Minewsemi_me25ls01_companion_radio_usb] -extends = me25ls01 -board_build.ldscript = boards/nrf52840_s140_v7_extrafs.ld -board_upload.maximum_size = 708608 -build_flags = ${me25ls01.build_flags} - -I examples/companion_radio/ui-orig - -D MAX_CONTACTS=350 - -D MAX_GROUP_CHANNELS=40 - ;-D BLE_PIN_CODE=123456 -; -D BLE_DEBUG_LOGGING=1 - -D MESH_PACKET_LOGGING=1 - -D MESH_DEBUG=1 - -D OFFLINE_QUEUE_SIZE=256 - -D RX_BOOSTED_GAIN=true - -D RF_SWITCH_TABLE - -D DISPLAY_CLASS=NullDisplayDriver -build_src_filter = ${me25ls01.build_src_filter} - + - +<../examples/companion_radio/*.cpp> - +<../examples/companion_radio/ui-orig/*.cpp> -lib_deps = ${me25ls01.lib_deps} - adafruit/RTClib @ ^2.1.3 - +; ----------------- NRF52 me25ls01--------------------- +[nrf52840_me25ls01] +extends = nrf52_base +platform_packages = framework-arduinoadafruitnrf52 +build_flags = ${nrf52_base.build_flags} + -I src/helpers/nrf52 + -I lib/nrf52/s140_nrf52_7.3.0_API/include + -I lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52 +lib_ignore = + BluetoothOTA + lib5b4 +lib_deps = + ${nrf52_base.lib_deps} + rweather/Crypto @ ^0.4.0 + +[me25ls01] +extends = nrf52840_me25ls01 +board = minewsemi_me25ls01 +board_build.ldscript = boards/nrf52840_s140_v7.ld +build_flags = ${nrf52840_me25ls01.build_flags} + -I variants/minewsemi_me25ls01 + -D me25ls01 + -D PIN_USER_BTN=27 + -D PIN_STATUS_LED=39 + -D P_LORA_TX_LED=22 + -D RADIO_CLASS=CustomLR1110 + -D WRAPPER_CLASS=CustomLR1110Wrapper + -D LORA_TX_POWER=22 + -D ENV_INCLUDE_GPS=0 + -D ENV_INCLUDE_AHTX0=1 + -D ENV_INCLUDE_BME280=1 + -D ENV_INCLUDE_INA3221=1 + -D ENV_INCLUDE_INA219=1 +build_src_filter = ${nrf52840_me25ls01.build_src_filter} + + + +<../variants/minewsemi_me25ls01> + + +debug_tool = jlink +upload_protocol = nrfutil +lib_deps = ${nrf52840_me25ls01.lib_deps} + densaugeo/base64 @ ~1.4.0 + stevemarple/MicroNMEA @ ^2.0.6 + end2endzone/NonBlockingRTTTL@^1.3.0 + adafruit/Adafruit SSD1306 @ ^2.5.13 + adafruit/Adafruit INA3221 Library @ ^1.0.1 + adafruit/Adafruit INA219 @ ^1.2.3 + adafruit/Adafruit AHTX0 @ ^2.0.5 + adafruit/Adafruit BME280 Library @ ^2.3.0 + +[env:Minewsemi_me25ls01_companion_radio_ble] +extends = me25ls01 +board_build.ldscript = boards/nrf52840_s140_v7_extrafs.ld +board_upload.maximum_size = 708608 +build_flags = ${me25ls01.build_flags} + -I examples/companion_radio/ui-orig + -D MAX_CONTACTS=350 + -D MAX_GROUP_CHANNELS=40 + -D BLE_PIN_CODE=123456 +; -D BLE_DEBUG_LOGGING=1 + -D MESH_PACKET_LOGGING=1 + -D MESH_DEBUG=1 + -D OFFLINE_QUEUE_SIZE=256 + -D RX_BOOSTED_GAIN=true + -D RF_SWITCH_TABLE + -D DISPLAY_CLASS=NullDisplayDriver + ;-D PIN_BUZZER=25 + ;-D PIN_BUZZER_EN=37 +build_src_filter = ${me25ls01.build_src_filter} + + + +<../examples/companion_radio/*.cpp> + +<../examples/companion_radio/ui-orig/*.cpp> +lib_deps = ${me25ls01.lib_deps} + adafruit/RTClib @ ^2.1.3 + + +[env:Minewsemi_me25ls01_repeater] +extends = me25ls01 +build_flags = ${me25ls01.build_flags} + -D MAX_CONTACTS=100 + -D MAX_GROUP_CHANNELS=8 + -D BLE_PIN_CODE=123456 +; -D BLE_DEBUG_LOGGING=1 + -D MESH_PACKET_LOGGING=1 + -D MESH_DEBUG=1 + -D OFFLINE_QUEUE_SIZE=256 + -D RX_BOOSTED_GAIN=true + -D RF_SWITCH_TABLE + -D ADVERT_NAME='"ME25LS01 Repeater"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=50 + -D DISPLAY_CLASS=NullDisplayDriver +build_src_filter = ${me25ls01.build_src_filter} + +<../examples/simple_repeater> +lib_deps = ${me25ls01.lib_deps} + adafruit/RTClib @ ^2.1.3 + + + +[env:Minewsemi_me25ls01_room_server] +extends = me25ls01 +build_flags = ${me25ls01.build_flags} + -D MAX_CONTACTS=100 + -D MAX_GROUP_CHANNELS=8 +; -D BLE_PIN_CODE=123456 +; -D BLE_DEBUG_LOGGING=1 +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 + -D OFFLINE_QUEUE_SIZE=256 + -D RX_BOOSTED_GAIN=true + -D RF_SWITCH_TABLE + -D ADVERT_NAME='"ME25LS01 Room"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D ROOM_PASSWORD='"hello"' + -D MAX_NEIGHBOURS=50 + -D DISPLAY_CLASS=NullDisplayDriver +build_src_filter = ${me25ls01.build_src_filter} + +<../examples/simple_room_server> +lib_deps = ${me25ls01.lib_deps} + adafruit/RTClib @ ^2.1.3 + +[env:Minewsemi_me25ls01_terminal_chat] +extends = me25ls01 +build_flags = ${me25ls01.build_flags} + -D MAX_CONTACTS=100 + -D MAX_GROUP_CHANNELS=8 + -D BLE_PIN_CODE=123456 +; -D BLE_DEBUG_LOGGING=1 + -D MESH_PACKET_LOGGING=1 + -D MESH_DEBUG=1 + -D OFFLINE_QUEUE_SIZE=256 + -D RX_BOOSTED_GAIN=true + -D RF_SWITCH_TABLE + -D ADVERT_NAME='"ME25LS01 Chat"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D ROOM_PASSWORD='"hello"' + -D MAX_NEIGHBOURS=50 + -D DISPLAY_CLASS=NullDisplayDriver +build_src_filter = ${me25ls01.build_src_filter} + +<../examples/simple_secure_chat/main.cpp> +lib_deps = ${me25ls01.lib_deps} + adafruit/RTClib @ ^2.1.3 + +[env:Minewsemi_me25ls01_companion_radio_usb] +extends = me25ls01 +board_build.ldscript = boards/nrf52840_s140_v7_extrafs.ld +board_upload.maximum_size = 708608 +build_flags = ${me25ls01.build_flags} + -I examples/companion_radio/ui-orig + -D MAX_CONTACTS=350 + -D MAX_GROUP_CHANNELS=40 + ;-D BLE_PIN_CODE=123456 +; -D BLE_DEBUG_LOGGING=1 + -D MESH_PACKET_LOGGING=1 + -D MESH_DEBUG=1 + -D OFFLINE_QUEUE_SIZE=256 + -D RX_BOOSTED_GAIN=true + -D RF_SWITCH_TABLE + -D DISPLAY_CLASS=NullDisplayDriver +build_src_filter = ${me25ls01.build_src_filter} + + + +<../examples/companion_radio/*.cpp> + +<../examples/companion_radio/ui-orig/*.cpp> +lib_deps = ${me25ls01.lib_deps} + adafruit/RTClib @ ^2.1.3 + +[env:Minewsemi_me25ls01_kiss_modem] +extends = me25ls01 +build_src_filter = ${me25ls01.build_src_filter} + +<../examples/kiss_modem/> \ No newline at end of file diff --git a/variants/muziworks_r1_neo/platformio.ini b/variants/muziworks_r1_neo/platformio.ini index 39ef8728..3dbecf1e 100644 --- a/variants/muziworks_r1_neo/platformio.ini +++ b/variants/muziworks_r1_neo/platformio.ini @@ -130,3 +130,8 @@ build_flags = -D MESH_DEBUG=1 build_src_filter = ${R1Neo.build_src_filter} +<../examples/simple_sensor> + +[env:R1Neo_kiss_modem] +extends = R1Neo +build_src_filter = ${R1Neo.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/nano_g2_ultra/platformio.ini b/variants/nano_g2_ultra/platformio.ini index 116a1f25..fa1b5ef1 100644 --- a/variants/nano_g2_ultra/platformio.ini +++ b/variants/nano_g2_ultra/platformio.ini @@ -91,3 +91,8 @@ lib_deps = adafruit/Adafruit GFX Library @ ^1.12.1 stevemarple/MicroNMEA @ ^2.0.6 end2endzone/NonBlockingRTTTL@^1.3.0 + +[env:Nano_G2_Ultra_kiss_modem] +extends = Nano_G2_Ultra +build_src_filter = ${Nano_G2_Ultra.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/nibble_screen_connect/platformio.ini b/variants/nibble_screen_connect/platformio.ini index 8a4e63ca..a496a2fe 100644 --- a/variants/nibble_screen_connect/platformio.ini +++ b/variants/nibble_screen_connect/platformio.ini @@ -159,3 +159,8 @@ lib_deps = ${nibble_screen_connect_base.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:nibble_screen_connect_kiss_modem] +extends = nibble_screen_connect_base +build_src_filter = ${nibble_screen_connect_base.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/promicro/platformio.ini b/variants/promicro/platformio.ini index 317537a9..a0477e17 100644 --- a/variants/promicro/platformio.ini +++ b/variants/promicro/platformio.ini @@ -171,3 +171,8 @@ build_src_filter = ${Promicro.build_src_filter} +<../examples/simple_sensor> lib_deps = ${Promicro.lib_deps} + +[env:ProMicro_kiss_modem] +extends = Promicro +build_src_filter = ${Promicro.build_src_filter} + +<../examples/kiss_modem/> \ No newline at end of file diff --git a/variants/rak11310/platformio.ini b/variants/rak11310/platformio.ini index d5537627..3019f9c5 100644 --- a/variants/rak11310/platformio.ini +++ b/variants/rak11310/platformio.ini @@ -132,3 +132,8 @@ build_src_filter = ${rak11310.build_src_filter} +<../examples/simple_secure_chat/main.cpp> lib_deps = ${rak11310.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:RAK_11310_kiss_modem] +extends = rak11310 +build_src_filter = ${rak11310.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/rak3112/platformio.ini b/variants/rak3112/platformio.ini index b4165bb2..9cd32c4b 100644 --- a/variants/rak3112/platformio.ini +++ b/variants/rak3112/platformio.ini @@ -204,3 +204,8 @@ build_src_filter = ${rak3112.build_src_filter} lib_deps = ${rak3112.lib_deps} ${esp32_ota.lib_deps} + +[env:RAK_3112_kiss_modem] +extends = rak3112 +build_src_filter = ${rak3112.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/rak3401/platformio.ini b/variants/rak3401/platformio.ini index 3d2d4a3e..b5014097 100644 --- a/variants/rak3401/platformio.ini +++ b/variants/rak3401/platformio.ini @@ -126,3 +126,8 @@ build_flags = build_src_filter = ${rak3401.build_src_filter} + +<../examples/simple_sensor> + +[env:RAK_3401_kiss_modem] +extends = rak3401 +build_src_filter = ${rak3401.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/rak3x72/platformio.ini b/variants/rak3x72/platformio.ini index 12ea413a..f9667860 100644 --- a/variants/rak3x72/platformio.ini +++ b/variants/rak3x72/platformio.ini @@ -41,3 +41,8 @@ build_src_filter = ${rak3x72.build_src_filter} +<../examples/companion_radio/*.cpp> lib_deps = ${rak3x72.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:RAK_3x72_kiss_modem] +extends = rak3x72 +build_src_filter = ${rak3x72.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/rak_wismesh_tag/platformio.ini b/variants/rak_wismesh_tag/platformio.ini index 081cb0d0..29124daf 100644 --- a/variants/rak_wismesh_tag/platformio.ini +++ b/variants/rak_wismesh_tag/platformio.ini @@ -118,4 +118,9 @@ build_flags = ; -D MESH_PACKET_LOGGING=1 -D MESH_DEBUG=1 build_src_filter = ${rak4631.build_src_filter} - +<../examples/simple_sensor> \ No newline at end of file + +<../examples/simple_sensor> + +[env:RAK_WisMesh_Tag_kiss_modem] +extends = rak_wismesh_tag +build_src_filter = ${rak_wismesh_tag.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/rpi_picow/platformio.ini b/variants/rpi_picow/platformio.ini index 2d261b25..9253d36f 100644 --- a/variants/rpi_picow/platformio.ini +++ b/variants/rpi_picow/platformio.ini @@ -106,3 +106,8 @@ build_src_filter = ${rpi_picow.build_src_filter} +<../examples/simple_secure_chat/main.cpp> lib_deps = ${rpi_picow.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:PicoW_kiss_modem] +extends = rpi_picow +build_src_filter = ${rpi_picow.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/station_g2/platformio.ini b/variants/station_g2/platformio.ini index 87e77152..6432b523 100644 --- a/variants/station_g2/platformio.ini +++ b/variants/station_g2/platformio.ini @@ -238,3 +238,8 @@ build_src_filter = ${Station_G2.build_src_filter} lib_deps = ${Station_G2.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:Station_G2_kiss_modem] +extends = Station_G2 +build_src_filter = ${Station_G2.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/t1000-e/platformio.ini b/variants/t1000-e/platformio.ini index 429390c4..fb88e334 100644 --- a/variants/t1000-e/platformio.ini +++ b/variants/t1000-e/platformio.ini @@ -117,3 +117,10 @@ lib_deps = ${t1000-e.lib_deps} densaugeo/base64 @ ~1.4.0 stevemarple/MicroNMEA @ ^2.0.6 end2endzone/NonBlockingRTTTL@^1.3.0 + +[env:t1000e_kiss_modem] +extends = t1000-e +build_src_filter = ${t1000-e.build_src_filter} + +<../examples/kiss_modem/> +lib_deps = ${t1000-e.lib_deps} + stevemarple/MicroNMEA @ ^2.0.6 diff --git a/variants/tenstar_c3/platformio.ini b/variants/tenstar_c3/platformio.ini index 183a5684..e7988823 100644 --- a/variants/tenstar_c3/platformio.ini +++ b/variants/tenstar_c3/platformio.ini @@ -161,3 +161,23 @@ build_flags = lib_deps = ${Tenstar_esp32_C3.lib_deps} ${esp32_ota.lib_deps} + +[env:Tenstar_C3_sx1262_kiss_modem] +extends = Tenstar_esp32_C3 +build_src_filter = ${Tenstar_esp32_C3.build_src_filter} + +<../examples/kiss_modem/> +build_flags = + ${Tenstar_esp32_C3.build_flags} + -D RADIO_CLASS=CustomSX1262 + -D WRAPPER_CLASS=CustomSX1262Wrapper + -D LORA_TX_POWER=22 + +[env:Tenstar_C3_sx1268_kiss_modem] +extends = Tenstar_esp32_C3 +build_src_filter = ${Tenstar_esp32_C3.build_src_filter} + +<../examples/kiss_modem/> +build_flags = + ${Tenstar_esp32_C3.build_flags} + -D RADIO_CLASS=CustomSX1268 + -D WRAPPER_CLASS=CustomSX1268Wrapper + -D LORA_TX_POWER=22 diff --git a/variants/thinknode_m1/platformio.ini b/variants/thinknode_m1/platformio.ini index 397bf8e3..356edfee 100644 --- a/variants/thinknode_m1/platformio.ini +++ b/variants/thinknode_m1/platformio.ini @@ -127,4 +127,9 @@ lib_deps = densaugeo/base64 @ ~1.4.0 zinggjm/GxEPD2 @ 1.6.2 bakercp/CRC32 @ ^2.0.0 - end2endzone/NonBlockingRTTTL@^1.3.0 \ No newline at end of file + end2endzone/NonBlockingRTTTL@^1.3.0 + +[env:ThinkNode_M1_kiss_modem] +extends = ThinkNode_M1 +build_src_filter = ${ThinkNode_M1.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/thinknode_m2/platformio.ini b/variants/thinknode_m2/platformio.ini index a765d9c7..99015501 100644 --- a/variants/thinknode_m2/platformio.ini +++ b/variants/thinknode_m2/platformio.ini @@ -209,3 +209,10 @@ build_src_filter = ${ThinkNode_M2.build_src_filter} lib_deps = ${ThinkNode_M2.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:ThinkNode_M2_kiss_modem] +extends = ThinkNode_M2 +build_flags = ${ThinkNode_M2.build_flags} + -UPIN_BUZZER +build_src_filter = ${ThinkNode_M2.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/thinknode_m3/platformio.ini b/variants/thinknode_m3/platformio.ini index 88fd487a..0a3d4eda 100644 --- a/variants/thinknode_m3/platformio.ini +++ b/variants/thinknode_m3/platformio.ini @@ -17,11 +17,11 @@ build_flags = ${nrf52_base.build_flags} -D RF_SWITCH_TABLE -D RX_BOOSTED_GAIN=true -D P_LORA_BUSY=43 - -D P_LORA_SCLK=45 + -D P_LORA_SCLK=45 -D P_LORA_NSS=44 -D P_LORA_DIO_1=40 -D P_LORA_MISO=47 - -D P_LORA_MOSI=46 + -D P_LORA_MOSI=46 -D P_LORA_RESET=42 -D P_LORA_TX_LED=PIN_LED_BLUE -D P_LORA_TX_LED_ON=LOW @@ -119,3 +119,10 @@ lib_deps = ${ThinkNode_M3.lib_deps} densaugeo/base64 @ ~1.4.0 stevemarple/MicroNMEA @ ^2.0.6 end2endzone/NonBlockingRTTTL@^1.3.0 + +[env:ThinkNode_M3_kiss_modem] +extends = ThinkNode_M3 +build_src_filter = ${ThinkNode_M3.build_src_filter} + +<../examples/kiss_modem/> +lib_deps = ${ThinkNode_M3.lib_deps} + stevemarple/MicroNMEA @ ^2.0.6 diff --git a/variants/thinknode_m5/platformio.ini b/variants/thinknode_m5/platformio.ini index 16df472a..8572d1eb 100644 --- a/variants/thinknode_m5/platformio.ini +++ b/variants/thinknode_m5/platformio.ini @@ -227,3 +227,8 @@ lib_deps = ${ThinkNode_M5.lib_deps} densaugeo/base64 @ ~1.4.0 end2endzone/NonBlockingRTTTL@^1.3.0 + +[env:ThinkNode_M5_kiss_modem] +extends = ThinkNode_M5 +build_src_filter = ${ThinkNode_M5.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/thinknode_m6/platformio.ini b/variants/thinknode_m6/platformio.ini index 2bd34f31..6fe90436 100644 --- a/variants/thinknode_m6/platformio.ini +++ b/variants/thinknode_m6/platformio.ini @@ -116,4 +116,9 @@ build_src_filter = ${ThinkNode_M6.build_src_filter} lib_deps = ${ThinkNode_M6.lib_deps} densaugeo/base64 @ ~1.4.0 - end2endzone/NonBlockingRTTTL@^1.3.0 \ No newline at end of file + end2endzone/NonBlockingRTTTL@^1.3.0 + +[env:ThinkNode_M6_kiss_modem] +extends = ThinkNode_M6 +build_src_filter = ${ThinkNode_M6.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/tiny_relay/platformio.ini b/variants/tiny_relay/platformio.ini index ed178727..82cb251f 100644 --- a/variants/tiny_relay/platformio.ini +++ b/variants/tiny_relay/platformio.ini @@ -48,3 +48,8 @@ build_src_filter = ${Tiny_Relay.build_src_filter} +<../examples/companion_radio/*.cpp> lib_deps = ${Tiny_Relay.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:Tiny_Relay_kiss_modem] +extends = Tiny_Relay +build_src_filter = ${Tiny_Relay.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/waveshare_rp2040_lora/platformio.ini b/variants/waveshare_rp2040_lora/platformio.ini index 880f238f..36658d82 100644 --- a/variants/waveshare_rp2040_lora/platformio.ini +++ b/variants/waveshare_rp2040_lora/platformio.ini @@ -131,3 +131,8 @@ build_src_filter = ${waveshare_rp2040_lora.build_src_filter} +<../examples/simple_secure_chat/main.cpp> lib_deps = ${waveshare_rp2040_lora.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:waveshare_rp2040_lora_kiss_modem] +extends = waveshare_rp2040_lora +build_src_filter = ${waveshare_rp2040_lora.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/wio-e5-dev/platformio.ini b/variants/wio-e5-dev/platformio.ini index d7e63c83..22bdc3c8 100644 --- a/variants/wio-e5-dev/platformio.ini +++ b/variants/wio-e5-dev/platformio.ini @@ -5,6 +5,8 @@ board_upload.maximum_size = 229376 ; 32kb for FS build_flags = ${stm32_base.build_flags} -D RADIO_CLASS=CustomSTM32WLx -D WRAPPER_CLASS=CustomSTM32WLxWrapper + -D LORA_TX_POWER=22 + -D SX126X_CURRENT_LIMIT=140 -D SPI_INTERFACES_COUNT=0 -D RX_BOOSTED_GAIN=true -D PIN_SERIAL_RX=PB7 @@ -48,3 +50,8 @@ build_src_filter = ${lora_e5.build_src_filter} +<../examples/companion_radio/*.cpp> lib_deps = ${lora_e5.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:wio-e5_kiss_modem] +extends = lora_e5 +build_src_filter = ${lora_e5.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/wio-e5-mini/platformio.ini b/variants/wio-e5-mini/platformio.ini index f589ea03..82f01331 100644 --- a/variants/wio-e5-mini/platformio.ini +++ b/variants/wio-e5-mini/platformio.ini @@ -7,6 +7,8 @@ build_flags = ${stm32_base.build_flags} -D WRAPPER_CLASS=CustomSTM32WLxWrapper -D SPI_INTERFACES_COUNT=0 -D RX_BOOSTED_GAIN=true + -D LORA_TX_POWER=22 + -D SX126X_CURRENT_LIMIT=140 -D P_LORA_TX_LED=LED_RED -D PIN_USER_BTN=USER_BTN -I variants/wio-e5-mini @@ -40,10 +42,15 @@ build_flags = ${lora_e5_mini.build_flags} -I examples/companion_radio/ui-orig -D LORA_TX_POWER=22 -D MAX_CONTACTS=100 - -D MAX_GROUP_CHANNELS=8 + -D MAX_GROUP_CHANNELS=8 -D DISPLAY_CLASS=NullDisplayDriver build_src_filter = ${lora_e5_mini.build_src_filter} +<../examples/companion_radio/*.cpp> +<../examples/companion_radio/ui-orig/*.cpp> lib_deps = ${lora_e5_mini.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:wio-e5-mini_kiss_modem] +extends = lora_e5_mini +build_src_filter = ${lora_e5_mini.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/wio-tracker-l1-eink/platformio.ini b/variants/wio-tracker-l1-eink/platformio.ini index 42c83477..2c74bade 100644 --- a/variants/wio-tracker-l1-eink/platformio.ini +++ b/variants/wio-tracker-l1-eink/platformio.ini @@ -68,3 +68,8 @@ lib_deps = ${WioTrackerL1Eink.lib_deps} densaugeo/base64 @ ~1.4.0 end2endzone/NonBlockingRTTTL@^1.3.0 debug_tool=stlink + +[env:WioTrackerL1Eink_kiss_modem] +extends = WioTrackerL1Eink +build_src_filter = ${WioTrackerL1Eink.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/wio-tracker-l1/platformio.ini b/variants/wio-tracker-l1/platformio.ini index 6c1e8f63..7bb175bb 100644 --- a/variants/wio-tracker-l1/platformio.ini +++ b/variants/wio-tracker-l1/platformio.ini @@ -111,3 +111,8 @@ lib_deps = ${WioTrackerL1.lib_deps} adafruit/RTClib @ ^2.1.3 densaugeo/base64 @ ~1.4.0 end2endzone/NonBlockingRTTTL@^1.3.0 + +[env:WioTrackerL1_kiss_modem] +extends = WioTrackerL1 +build_src_filter = ${WioTrackerL1.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/wio_wm1110/platformio.ini b/variants/wio_wm1110/platformio.ini index ec65e706..a7eac916 100644 --- a/variants/wio_wm1110/platformio.ini +++ b/variants/wio_wm1110/platformio.ini @@ -84,3 +84,8 @@ build_src_filter = ${wio_wm1110.build_src_filter} lib_deps = ${wio_wm1110.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:wio_wm1110_kiss_modem] +extends = wio_wm1110 +build_src_filter = ${wio_wm1110.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/xiao_c3/platformio.ini b/variants/xiao_c3/platformio.ini index c5254b46..c0e8458d 100644 --- a/variants/xiao_c3/platformio.ini +++ b/variants/xiao_c3/platformio.ini @@ -128,3 +128,8 @@ lib_deps = ${Xiao_esp32_C3.lib_deps} ${esp32_ota.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:Xiao_C3_kiss_modem] +extends = Xiao_esp32_C3 +build_src_filter = ${Xiao_esp32_C3.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/xiao_c6/platformio.ini b/variants/xiao_c6/platformio.ini index 717be7b9..9f504b8e 100644 --- a/variants/xiao_c6/platformio.ini +++ b/variants/xiao_c6/platformio.ini @@ -184,3 +184,8 @@ build_src_filter = ${WHY2025_badge.build_src_filter} lib_deps = ${WHY2025_badge.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:Xiao_C6_kiss_modem] +extends = Xiao_C6 +build_src_filter = ${Xiao_C6.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/xiao_rp2040/platformio.ini b/variants/xiao_rp2040/platformio.ini index e5d652c3..9a0fdaf4 100644 --- a/variants/xiao_rp2040/platformio.ini +++ b/variants/xiao_rp2040/platformio.ini @@ -108,3 +108,8 @@ build_src_filter = ${Xiao_rp2040.build_src_filter} +<../examples/simple_secure_chat/main.cpp> lib_deps = ${Xiao_rp2040.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:Xiao_rp2040_kiss_modem] +extends = Xiao_rp2040 +build_src_filter = ${Xiao_rp2040.build_src_filter} + +<../examples/kiss_modem/> diff --git a/variants/xiao_s3_wio/platformio.ini b/variants/xiao_s3_wio/platformio.ini index 13d40679..db8c5a94 100644 --- a/variants/xiao_s3_wio/platformio.ini +++ b/variants/xiao_s3_wio/platformio.ini @@ -234,3 +234,8 @@ build_flags = lib_deps = ${Xiao_S3_WIO.lib_deps} ${esp32_ota.lib_deps} + +[env:Xiao_S3_WIO_kiss_modem] +extends = Xiao_S3_WIO +build_src_filter = ${Xiao_S3_WIO.build_src_filter} + +<../examples/kiss_modem/> From 0265851621b3c0a821a99eaf4d5ab05e811bc623 Mon Sep 17 00:00:00 2001 From: chrisdavis2110 Date: Tue, 28 Apr 2026 21:26:56 -0700 Subject: [PATCH 29/46] added PIN_USER_BTN_ANA for rak3401 companion usb and companion ble --- examples/companion_radio/ui-new/UITask.cpp | 16 ++++++++-------- variants/rak3401/platformio.ini | 2 ++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index 94a8ee3e..e06a6ecc 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -146,7 +146,7 @@ class HomeScreen : public UIScreen { bool sensors_scroll = false; int sensors_scroll_offset = 0; int next_sensors_refresh = 0; - + void refresh_sensors() { if (millis() > next_sensors_refresh) { sensors_lpp.reset(); @@ -170,7 +170,7 @@ class HomeScreen : public UIScreen { public: HomeScreen(UITask* task, mesh::RTCClock* rtc, SensorManager* sensors, NodePrefs* node_prefs) - : _task(task), _rtc(rtc), _sensors(sensors), _node_prefs(node_prefs), _page(0), + : _task(task), _rtc(rtc), _sensors(sensors), _node_prefs(node_prefs), _page(0), _shutdown_init(false), sensors_lpp(200) { } void poll() override { @@ -213,7 +213,7 @@ public: IPAddress ip = WiFi.localIP(); snprintf(tmp, sizeof(tmp), "IP: %d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); display.setTextSize(1); - display.drawTextCentered(display.width() / 2, 54, tmp); + display.drawTextCentered(display.width() / 2, 54, tmp); #endif if (_task->hasConnection()) { display.setColor(DisplayDriver::GREEN); @@ -241,10 +241,10 @@ public: } else { sprintf(tmp, "%dh", secs / (60*60)); } - + int timestamp_width = display.getTextWidth(tmp); int max_name_width = display.width() - timestamp_width - 1; - + char filtered_recent_name[sizeof(a->name)]; display.translateUTF8ToBlocks(filtered_recent_name, a->name, sizeof(filtered_recent_name)); display.drawTextEllipsized(0, y, max_name_width, filtered_recent_name); @@ -310,7 +310,7 @@ public: display.drawTextRightAlign(display.width()-1, y, buf); y = y + 12; display.drawTextLeftAlign(0, y, "pos"); - sprintf(buf, "%.4f %.4f", + sprintf(buf, "%.4f %.4f", nmea->getLatitude()/1000000., nmea->getLongitude()/1000000.); display.drawTextRightAlign(display.width()-1, y, buf); y = y + 12; @@ -741,7 +741,7 @@ void UITask::loop() { #endif #if defined(PIN_USER_BTN_ANA) if (abs(millis() - _analogue_pin_read_millis) > 10) { - ev = analog_btn.check(); + int ev = analog_btn.check(); if (ev == BUTTON_EVENT_CLICK) { c = checkDisplayOn(KEY_NEXT); } else if (ev == BUTTON_EVENT_LONG_PRESS) { @@ -878,7 +878,7 @@ bool UITask::getGPSState() { return !strcmp(_sensors->getSettingValue(i), "1"); } } - } + } return false; } diff --git a/variants/rak3401/platformio.ini b/variants/rak3401/platformio.ini index b3693a58..1246b725 100644 --- a/variants/rak3401/platformio.ini +++ b/variants/rak3401/platformio.ini @@ -64,6 +64,7 @@ board_upload.maximum_size = 712704 build_flags = ${rak3401.build_flags} -I examples/companion_radio/ui-new + -D PIN_USER_BTN_ANA=31 -D DISPLAY_CLASS=SSD1306Display -D MAX_CONTACTS=350 -D MAX_GROUP_CHANNELS=40 @@ -83,6 +84,7 @@ board_upload.maximum_size = 712704 build_flags = ${rak3401.build_flags} -I examples/companion_radio/ui-new + -D PIN_USER_BTN_ANA=31 -D PIN_GPS_EN=-1 -D DISPLAY_CLASS=SSD1306Display -D MAX_CONTACTS=350 From 5fbd473298f0e365e0add4df0c9ff8db5083138c Mon Sep 17 00:00:00 2001 From: chrisdavis2110 Date: Tue, 28 Apr 2026 21:59:10 -0700 Subject: [PATCH 30/46] added PIN_GPS_EN=-1 to rak3401 companion usb --- variants/rak3401/platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/rak3401/platformio.ini b/variants/rak3401/platformio.ini index 1246b725..d94db6a5 100644 --- a/variants/rak3401/platformio.ini +++ b/variants/rak3401/platformio.ini @@ -65,6 +65,7 @@ build_flags = ${rak3401.build_flags} -I examples/companion_radio/ui-new -D PIN_USER_BTN_ANA=31 + -D PIN_GPS_EN=-1 -D DISPLAY_CLASS=SSD1306Display -D MAX_CONTACTS=350 -D MAX_GROUP_CHANNELS=40 From 696aae6ed11d7e4d859a5f0b944ef8fdde43ef0a Mon Sep 17 00:00:00 2001 From: Quency-D Date: Wed, 29 Apr 2026 16:20:21 +0800 Subject: [PATCH 31/46] Heltec boards have LNA disabled by default. --- variants/heltec_t096/LoRaFEMControl.h | 2 +- variants/heltec_tracker_v2/LoRaFEMControl.h | 2 +- variants/heltec_v4/LoRaFEMControl.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/variants/heltec_t096/LoRaFEMControl.h b/variants/heltec_t096/LoRaFEMControl.h index fe61b7e4..2c50b742 100644 --- a/variants/heltec_t096/LoRaFEMControl.h +++ b/variants/heltec_t096/LoRaFEMControl.h @@ -16,6 +16,6 @@ class LoRaFEMControl void setLnaCanControl(bool can_control) { lna_can_control = can_control; } private: - bool lna_enabled = true; + bool lna_enabled = false; bool lna_can_control = false; }; diff --git a/variants/heltec_tracker_v2/LoRaFEMControl.h b/variants/heltec_tracker_v2/LoRaFEMControl.h index fe61b7e4..2c50b742 100644 --- a/variants/heltec_tracker_v2/LoRaFEMControl.h +++ b/variants/heltec_tracker_v2/LoRaFEMControl.h @@ -16,6 +16,6 @@ class LoRaFEMControl void setLnaCanControl(bool can_control) { lna_can_control = can_control; } private: - bool lna_enabled = true; + bool lna_enabled = false; bool lna_can_control = false; }; diff --git a/variants/heltec_v4/LoRaFEMControl.h b/variants/heltec_v4/LoRaFEMControl.h index 75452965..13225bd5 100644 --- a/variants/heltec_v4/LoRaFEMControl.h +++ b/variants/heltec_v4/LoRaFEMControl.h @@ -23,7 +23,7 @@ class LoRaFEMControl LoRaFEMType getFEMType(void) const { return fem_type; } private: LoRaFEMType fem_type=OTHER_FEM_TYPES; - bool lna_enabled=true; + bool lna_enabled=false; bool lna_can_control=false; }; From 293a8a9a84bfdade90c5b9f9b9453c0d20140dae Mon Sep 17 00:00:00 2001 From: Kyle Date: Wed, 29 Apr 2026 14:10:13 -0400 Subject: [PATCH 32/46] docs: add explanatory notes for txdelay, direct.txdelay, and rxdelay CLI commands --- docs/cli_commands.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/cli_commands.md b/docs/cli_commands.md index fb698228..9a2c6fe6 100644 --- a/docs/cli_commands.md +++ b/docs/cli_commands.md @@ -490,6 +490,8 @@ This document provides an overview of CLI commands that can be sent to MeshCore **Default:** `0.5` +**Note:** When multiple nearby repeaters all hear the same flood packet, each waits a random amount of time before retransmitting to avoid simultaneous collisions. This factor scales the size of that random window. Higher values reduce collision risk at the cost of added latency. `0` disables the window entirely. + --- #### View or change the retransmit delay factor for direct traffic @@ -502,6 +504,8 @@ This document provides an overview of CLI commands that can be sent to MeshCore **Default:** `0.2` +**Note:** Same collision-avoidance random window as `txdelay`, but applied to direct (non-flood, routed) traffic. The default is lower because direct packets are addressed to a specific next hop, so far fewer nodes compete to retransmit them. + --- #### [Experimental] View or change the processing delay for received traffic @@ -514,6 +518,8 @@ This document provides an overview of CLI commands that can be sent to MeshCore **Default:** `0.0` +**Note:** When enabled, repeaters that received a flood packet with a weak signal are held in a delay queue before processing, while those that received it with a strong signal process it immediately. This gives strong-signal paths forwarding priority. By the time weak-signal nodes process their copy, the packet may have already propagated and will be suppressed as a duplicate, reducing redundant retransmissions. + --- #### View or change the duty cycle limit From c5bf23f4b1dbf2376dd141b40f21f64b3c623efa Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Thu, 30 Apr 2026 11:12:31 +0200 Subject: [PATCH 33/46] bump simple_sensor version to v1.15.0 --- examples/simple_sensor/SensorMesh.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/simple_sensor/SensorMesh.h b/examples/simple_sensor/SensorMesh.h index ee5d5e02..424b16c1 100644 --- a/examples/simple_sensor/SensorMesh.h +++ b/examples/simple_sensor/SensorMesh.h @@ -34,11 +34,11 @@ #define PERM_RECV_ALERTS_HI (1 << 7) // high priority alerts #ifndef FIRMWARE_BUILD_DATE - #define FIRMWARE_BUILD_DATE "20 Mar 2026" + #define FIRMWARE_BUILD_DATE "19 Apr 2026" #endif #ifndef FIRMWARE_VERSION - #define FIRMWARE_VERSION "v1.14.1" + #define FIRMWARE_VERSION "v1.15.0" #endif #define FIRMWARE_ROLE "sensor" From 2b0f74a7e9e8e72fa398dbc7945b596cb7de8bcc Mon Sep 17 00:00:00 2001 From: liamcottle Date: Thu, 30 Apr 2026 21:36:04 +1200 Subject: [PATCH 34/46] add comments --- platformio.ini | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platformio.ini b/platformio.ini index 6a3c28c3..ba27abb9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -81,6 +81,9 @@ platform = https://github.com/pioarduino/platform-espressif32/releases/download/ extends = arduino_base platform = nordicnrf52 platform_packages = + ; use internal fork that includes patch to ble stack to prevent firmware lockup during rapid connect/disconnect + ; https://github.com/meshcore-dev/MeshCore/pull/1177 + ; https://github.com/meshcore-dev/MeshCore/pull/1295 framework-arduinoadafruitnrf52 @ https://github.com/meshcore-dev/Adafruit_nRF52_Arduino#d541301 extra_scripts = create-uf2.py build_flags = ${arduino_base.build_flags} From 0be082b5f9fef923132efd6a2aa726a56d9b2f07 Mon Sep 17 00:00:00 2001 From: Avi0n <14863961+Avi0n@users.noreply.github.com> Date: Mon, 9 Mar 2026 11:37:58 -0700 Subject: [PATCH 35/46] fix typos --- docs/cli_commands.md | 4 ++-- docs/faq.md | 34 +++++++++++++++++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/cli_commands.md b/docs/cli_commands.md index fb698228..dd2626cc 100644 --- a/docs/cli_commands.md +++ b/docs/cli_commands.md @@ -456,7 +456,7 @@ This document provides an overview of CLI commands that can be sent to MeshCore **Note:** the 'path.hash.mode' sets the low-level ID/hash encoding size used when the repeater adverts. This setting has no impact on what packet ID/hash size this repeater forwards, all sizes should be forwarded on firmware >= 1.14. This feature was added in firmware 1.14 -**Temporary Note:** adverts with ID/hash sizes of 2 or 3 bytes may have limited flood propogation in your network while this feature is new as v1.13.0 firmware and older will drop packets with multibyte path ID/hashes as only 1-byte hashes are suppored. Consider your install base of firmware >=1.14 has reached a criticality for effective network flooding before implementing higher ID/hash sizes. +**Temporary Note:** adverts with ID/hash sizes of 2 or 3 bytes may have limited flood propagation in your network while this feature is new as v1.13.0 firmware and older will drop packets with multibyte path ID/hashes as only 1-byte hashes are supported. Consider your install base of firmware >=1.14 has reached a criticality for effective network flooding before implementing higher ID/hash sizes. --- @@ -927,7 +927,7 @@ region save --- -#### View or change thevalue of a sensor +#### View or change the value of a sensor **Usage:** - `sensor get ` - `sensor set ` diff --git a/docs/faq.md b/docs/faq.md index 3edc0a69..c04eb6aa 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -23,8 +23,8 @@ A list of frequently-asked questions and answers for MeshCore - [3.3. Q: What is the password to administer a repeater or a room server?](#33-q-what-is-the-password-to-administer-a-repeater-or-a-room-server) - [3.4. Q: What is the password to join a room server?](#34-q-what-is-the-password-to-join-a-room-server) - [3.5. Q: Can I retrieve a repeater's private key or set a repeater's private key?](#35-q-can-i-retrieve-a-repeaters-private-key-or-set-a-repeaters-private-key) - - [3.6. Q: The first byte of my repeater's public key collides with an exisitng repeater on the mesh. How do I get a new private key with a matching public key that has its first byte of my choosing?](#36-q-the-first-byte-of-my-repeaters-public-key-collides-with-an-exisitng-repeater-on-the-mesh--how-do-i-get-a-new-private-key-with-a-matching-public-key-that-has-its-first-byte-of-my-choosing) - - [3.7. Q: My repeater maybe suffering from deafness due to high power interference near my mesh's frequency, it is not hearing other in-range MeshCore radios. What can I do?](#37-q-my-repeater-maybe-suffering-from-deafness-due-to-high-power-interference-near-my-meshs-frequency-it-is-not-hearing-other-in-range-meshcore-radios--what-can-i-do) + - [3.6. Q: The first byte of my repeater's public key collides with an existing repeater on the mesh. How do I get a new private key with a matching public key that has its first byte of my choosing?](#36-q-the-first-byte-of-my-repeaters-public-key-collides-with-an-existing-repeater-on-the-mesh--how-do-i-get-a-new-private-key-with-a-matching-public-key-that-has-its-first-byte-of-my-choosing) + - [3.7. Q: My repeater may be suffering from deafness due to high power interference near my mesh's frequency, it is not hearing other in-range MeshCore radios. What can I do?](#37-q-my-repeater-may-be-suffering-from-deafness-due-to-high-power-interference-near-my-meshs-frequency-it-is-not-hearing-other-in-range-meshcore-radios--what-can-i-do) - [3.8. Q: How do I make my repeater an observer on the mesh?](#38-q-how-do-i-make-my-repeater-an-observer-on-the-mesh) - [3.9. Q: What is multi-byte support? What do 1-byte, 2-byte, 3-byte adverts and messages mean?](#39-q-what-is-multi-byte-support--what-do-1-byte-2-byte-3-byte-adverts-and-messages-mean) - [3.9.1. Q: **What path hash sizes will my repeater forward?**](#391-q-what-path-hash-sizes-will-my-repeater-forward) @@ -39,7 +39,7 @@ A list of frequently-asked questions and answers for MeshCore - [4.3. Q: Why is my T-Deck Plus not getting any satellite lock?](#43-q-why-is-my-t-deck-plus-not-getting-any-satellite-lock) - [4.4. Q: Why is my OG (non-Plus) T-Deck not getting any satellite lock?](#44-q-why-is-my-og-non-plus-t-deck-not-getting-any-satellite-lock) - [4.5. Q: What size of SD card does the T-Deck support?](#45-q-what-size-of-sd-card-does-the-t-deck-support) - - [4.6. Q: what is the public key for the default public channel?](#46-q-what-is-the-public-key-for-the-default-public-channel) + - [4.6. Q: What is the public key for the default public channel?](#46-q-what-is-the-public-key-for-the-default-public-channel) - [4.7. Q: How do I get maps on T-Deck?](#47-q-how-do-i-get-maps-on-t-deck) - [4.8. Q: Where do the map tiles go?](#48-q-where-do-the-map-tiles-go) - [4.9. Q: How to unlock deeper map zoom and server management features on T-Deck?](#49-q-how-to-unlock-deeper-map-zoom-and-server-management-features-on-t-deck) @@ -52,9 +52,9 @@ A list of frequently-asked questions and answers for MeshCore - [5.1. Q: What are BW, SF, and CR?](#51-q-what-are-bw-sf-and-cr) - [5.2. Q: Do MeshCore clients repeat?](#52-q-do-meshcore-clients-repeat) - [5.3. Q: What happens when a node learns a route via a mobile repeater, and that repeater is gone?](#53-q-what-happens-when-a-node-learns-a-route-via-a-mobile-repeater-and-that-repeater-is-gone) - - [5.4. Q: How does a node discovery a path to its destination and then use it to send messages in the future, instead of flooding every message it sends like Meshtastic?](#54-q-how-does-a-node-discovery-a-path-to-its-destination-and-then-use-it-to-send-messages-in-the-future-instead-of-flooding-every-message-it-sends-like-meshtastic) + - [5.4. Q: How does a node discover a path to its destination and then use it to send messages in the future, instead of flooding every message it sends like Meshtastic?](#54-q-how-does-a-node-discover-a-path-to-its-destination-and-then-use-it-to-send-messages-in-the-future-instead-of-flooding-every-message-it-sends-like-meshtastic) - [5.5. Q: Do public channels always flood? Do private channels always flood?](#55-q-do-public-channels-always-flood-do-private-channels-always-flood) - - [5.6. Q: what is the public key for the default public channel?](#56-q-what-is-the-public-key-for-the-default-public-channel) + - [5.6. Q: What is the public key for the default public channel?](#56-q-what-is-the-public-key-for-the-default-public-channel) - [5.7. Q: Is MeshCore open source?](#57-q-is-meshcore-open-source) - [5.8. Q: How can I support MeshCore?](#58-q-how-can-i-support-meshcore) - [5.9. Q: How do I build MeshCore firmware from source?](#59-q-how-do-i-build-meshcore-firmware-from-source) @@ -62,7 +62,7 @@ A list of frequently-asked questions and answers for MeshCore - [5.11. Q: Does MeshCore support ATAK](#511-q-does-meshcore-support-atak) - [5.12. Q: How do I add a node to the MeshCore Map](#512-q-how-do-i-add-a-node-to-the-meshcore-map) - [5.13. Q: Can I use a Raspberry Pi to update a MeshCore radio?](#513-q-can-i-use-a-raspberry-pi-to-update-a-meshcore-radio) - - [5.14. Q: Are there are projects built around MeshCore?](#514-q-are-there-are-projects-built-around-meshcore) + - [5.14. Q: Are there projects built around MeshCore?](#514-q-are-there-projects-built-around-meshcore) - [5.15. Q: Are there client applications for Windows or Mac?](#515-q-are-there-client-applications-for-windows-or-mac) - [5.16. Q: Are there any resources that compare MeshCore to other LoRa systems?](#516-q-are-there-any-resources-that-compare-meshcore-to-other-lora-systems) - [6. Troubleshooting](#6-troubleshooting) @@ -188,7 +188,7 @@ The T-Deck firmware is free to download and most features are available without ### 2.3. Q: What frequencies are supported by MeshCore? **A:** It supports the 868MHz range in the UK/EU and the 915MHz range in New Zealand, Australia, and the USA. Countries and regions in these two frequency ranges are also supported. -Use the smartphone client or the repeater setup feature on there web flasher to set your radios' RF settings by choosing the preset for your regions. +Use the smartphone client or the repeater setup feature on the web flasher to set your radios' RF settings by choosing the preset for your regions. Recently, as of October 2025, many regions have moved to the "narrow" setting, aka using BW62.5 and a lower SF number (instead of the original SF11). For example, USA/Canada (Recommended) preset is 910.525MHz, SF7, BW62.5, CR5. @@ -272,7 +272,7 @@ You can get the latitude and longitude from Google Maps by right-clicking the lo Reboot the repeater after `set prv.key ` command for the new private key to take effect. -### 3.6. Q: The first byte of my repeater's public key collides with an exisitng repeater on the mesh. How do I get a new private key with a matching public key that has its first byte of my choosing? +### 3.6. Q: The first byte of my repeater's public key collides with an existing repeater on the mesh. How do I get a new private key with a matching public key that has its first byte of my choosing? **A:** You can generate a new private key and specific the first byte of its public key here: https://gessaman.com/mc-keygen/ @@ -281,7 +281,7 @@ Having multiple repeaters with the same first byte ID does not negatively affect Best practice is when you set up a new repeater, choose a public key that is not in use. If it is not possible to find a unique first byte for your repeater's public key, choose one that is unique within about 10 miles (16 km) to minimize collision with nearby repeaters. -### 3.7. Q: My repeater maybe suffering from deafness due to high power interference near my mesh's frequency, it is not hearing other in-range MeshCore radios. What can I do? +### 3.7. Q: My repeater may be suffering from deafness due to high power interference near my mesh's frequency, it is not hearing other in-range MeshCore radios. What can I do? **A:** This may be due to the SX1262 radio's auto gain control feature. You can use this command to periodically reset its AGC. @@ -380,7 +380,7 @@ GPS on T-Deck is always enabled. You can skip the "GPS clock sync" and the T-De ### 4.5. Q: What size of SD card does the T-Deck support? **A:** Users have had no issues using 16GB or 32GB SD cards. Format the SD card to **FAT32**. -### 4.6. Q: what is the public key for the default public channel? +### 4.6. Q: What is the public key for the default public channel? **A:** T-Deck uses the same key the smartphone apps use but in base64 `izOH6cXN6mrJ5e26oRXNcg==` @@ -499,7 +499,7 @@ In MeshCore, only repeaters and room server with `set repeat on` repeat. In the case if users are moving around frequently, and the paths are breaking, they just see the phone client retries and revert to flood to attempt to re-establish a path. -### 5.4. Q: How does a node discovery a path to its destination and then use it to send messages in the future, instead of flooding every message it sends like Meshtastic? +### 5.4. Q: How does a node discover a path to its destination and then use it to send messages in the future, instead of flooding every message it sends like Meshtastic? Routes are stored in sender's contact list. When you send a message the first time, the message first gets to your destination by flood routing. When your destination node gets the message, it will send back a delivery report to the sender with all repeaters that the original message went through. This delivery report is flood-routed back to you the sender and is a basis for future direct path. When you send the next message, the path will get embedded into the packet and be evaluated by repeaters. If the hop and address of the repeater matches, it will retransmit the message, otherwise it will not retransmit, hence minimizing utilization. @@ -512,7 +512,7 @@ Routes are stored in sender's contact list. When you send a message the first t [Source](https://discord.com/channels/1343693475589263471/1343693475589263474/1350023009527664672) -### 5.6. Q: what is the public key for the default public channel? +### 5.6. Q: What is the public key for the default public channel? **A:** The smartphone app key is in hex: ` 8b3387e9c5cdea6ac9e5edbaa115cd72` @@ -658,11 +658,11 @@ From here, reference repeater and room server command line commands on MeshCore - https://github.com/meshcore-dev/MeshCore/wiki/Repeater-&-Room-Server-CLI-Reference -### 5.14. Q: Are there are projects built around MeshCore? +### 5.14. Q: Are there projects built around MeshCore? -**A:** Yes, there are many. MeshCore's protocol is open source using the MIT license. The MIT license and the open source protocol makes it very easy for the MeshCore community to build new firmware for radios, applications on mobile devices, map tools, and analysis tools, and integration with other projects like Home Asistant. +**A:** Yes, there are many. MeshCore's protocol is open source using the MIT license. The MIT license and the open source protocol makes it very easy for the MeshCore community to build new firmware for radios, applications on mobile devices, map tools, and analysis tools, and integration with other projects like Home Assistant. -As new MeshCore community projects become available on a weekly basis, we have stopped tracking them here in this FAQ. [samuk](https://github.com/samuk) maintains a very exhausive list of MeshCore community project at https://github.com/samuk/awesome-meshcore/blob/main/README.md. samuk accepts PRs and merges them regularly. +As new MeshCore community projects become available on a weekly basis, we have stopped tracking them here in this FAQ. [samuk](https://github.com/samuk) maintains a very exhaustive list of MeshCore community project at https://github.com/samuk/awesome-meshcore/blob/main/README.md. samuk accepts PRs and merges them regularly. ### 5.15. Q: Are there client applications for Windows or Mac? @@ -716,7 +716,7 @@ You can get the epoch time on and use it to se - For RAK, click the reset button **TWICE** - For T1000-e, quickly disconnect and reconnect the magnetic side of the cable from the device **TWICE** - For Heltec T114, click the reset button **TWICE** (the bottom button) - - For Xiao nRF52, click the reset button once. If that doesn't work, quickly double click the reset button twice. If that doesn't work, disconnection the board from your PC and reconnect again ([seeed studio wiki](https://wiki.seeedstudio.com/XIAO_BLE/#access-the-swd-pins-for-debugging-and-reflashing-bootloader)) + - For Xiao nRF52, click the reset button once. If that doesn't work, quickly double click the reset button twice. If that doesn't work, disconnect the board from your PC and reconnect again ([seeed studio wiki](https://wiki.seeedstudio.com/XIAO_BLE/#access-the-swd-pins-for-debugging-and-reflashing-bootloader)) 5. A new folder will appear on your computer's desktop 6. Download the `flash_erase*.uf2` file for your device on https://flasher.meshcore.io - RAK WisBlock and Heltec T114: `Flash_erase-nRF32_softdevice_v6.uf2` @@ -826,7 +826,7 @@ Edit WIFI_SSID and WIFI_PWD in `./variants/heltec_v3/platformio.ini` and then fl ### 7.7. Q: I have a Station G2, or a Heltec V4, or an Ikoka Stick, or a radio with a EByte E22-900M30S or a E22-900M33S module, what should their transmit power be set to? **A:** -For companion radios, you can set these radios' transmit power in the smartphone app. For repeater and room server radios, you can set their transmit power using the command line command `set tx`. You can get their current value using command line comand `get tx` +For companion radios, you can set these radios' transmit power in the smartphone app. For repeater and room server radios, you can set their transmit power using the command line command `set tx`. You can get their current value using command line command `get tx` ⚠️ **WARNING: Set these values at your own risk. Incorrect power settings can permanently damage your radio hardware.** From 0a8a0a49041662c255f019ade12e78e98074beb4 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Fri, 1 May 2026 14:47:07 +1000 Subject: [PATCH 36/46] * Refactor: removed duplicated radio_rng_seed(), radio_set_params(), radio_set_tx_power() --- examples/companion_radio/MyMesh.cpp | 8 +++---- examples/companion_radio/main.cpp | 2 +- examples/kiss_modem/main.cpp | 6 ++--- examples/simple_repeater/MyMesh.cpp | 10 ++++----- examples/simple_repeater/main.cpp | 2 +- examples/simple_room_server/MyMesh.cpp | 10 ++++----- examples/simple_room_server/main.cpp | 2 +- examples/simple_secure_chat/main.cpp | 6 ++--- examples/simple_sensor/SensorMesh.cpp | 10 ++++----- examples/simple_sensor/main.cpp | 2 +- src/helpers/esp32/ESPNOWRadio.cpp | 4 ++++ src/helpers/esp32/ESPNOWRadio.h | 7 ++++++ src/helpers/radiolib/CustomLLCC68Wrapper.h | 9 ++++++++ src/helpers/radiolib/CustomLR1110Wrapper.h | 9 ++++++++ src/helpers/radiolib/CustomSTM32WLxWrapper.h | 9 ++++++++ src/helpers/radiolib/CustomSX1262Wrapper.h | 9 ++++++++ src/helpers/radiolib/CustomSX1268Wrapper.h | 9 ++++++++ src/helpers/radiolib/CustomSX1276Wrapper.h | 9 ++++++++ src/helpers/radiolib/RadioLibWrappers.cpp | 8 +++++++ src/helpers/radiolib/RadioLibWrappers.h | 4 ++++ variants/ebyte_eora_s3/target.cpp | 16 -------------- variants/ebyte_eora_s3/target.h | 3 --- variants/gat562_30s_mesh_kit/target.cpp | 15 ------------- variants/gat562_30s_mesh_kit/target.h | 3 --- variants/gat562_mesh_evb_pro/target.cpp | 15 ------------- variants/gat562_mesh_evb_pro/target.h | 3 --- variants/gat562_mesh_tracker_pro/target.cpp | 15 ------------- variants/gat562_mesh_tracker_pro/target.h | 3 --- variants/gat562_mesh_watch13/target.cpp | 15 ------------- variants/gat562_mesh_watch13/target.h | 3 --- variants/generic-e22/target.cpp | 16 -------------- variants/generic-e22/target.h | 3 --- variants/generic_espnow/target.cpp | 12 ---------- variants/generic_espnow/target.h | 3 --- variants/heltec_ct62/target.cpp | 16 -------------- variants/heltec_ct62/target.h | 3 --- variants/heltec_e213/target.cpp | 16 -------------- variants/heltec_e213/target.h | 3 --- variants/heltec_e290/target.cpp | 16 -------------- variants/heltec_e290/target.h | 3 --- variants/heltec_mesh_solar/target.cpp | 16 -------------- variants/heltec_mesh_solar/target.h | 3 --- variants/heltec_t096/target.cpp | 15 ------------- variants/heltec_t096/target.h | 3 --- variants/heltec_t114/target.cpp | 16 -------------- variants/heltec_t114/target.h | 3 --- variants/heltec_t190/target.cpp | 16 -------------- variants/heltec_t190/target.h | 3 --- variants/heltec_tracker/target.cpp | 16 -------------- variants/heltec_tracker/target.h | 3 --- variants/heltec_tracker_v2/target.cpp | 16 -------------- variants/heltec_tracker_v2/target.h | 3 --- variants/heltec_v2/target.cpp | 16 -------------- variants/heltec_v2/target.h | 3 --- variants/heltec_v3/target.cpp | 16 -------------- variants/heltec_v3/target.h | 3 --- variants/heltec_v4/target.cpp | 16 -------------- variants/heltec_v4/target.h | 3 --- variants/heltec_wireless_paper/target.cpp | 16 -------------- variants/heltec_wireless_paper/target.h | 3 --- variants/ikoka_handheld_nrf/target.cpp | 16 -------------- variants/ikoka_handheld_nrf/target.h | 3 --- variants/ikoka_nano_nrf/target.cpp | 16 -------------- variants/ikoka_nano_nrf/target.h | 3 --- variants/ikoka_stick_nrf/target.cpp | 16 -------------- variants/ikoka_stick_nrf/target.h | 3 --- variants/keepteen_lt1/target.cpp | 16 -------------- variants/keepteen_lt1/target.h | 3 --- variants/lilygo_t3s3/target.cpp | 16 -------------- variants/lilygo_t3s3/target.h | 3 --- variants/lilygo_t3s3_sx1276/target.cpp | 16 -------------- variants/lilygo_t3s3_sx1276/target.h | 3 --- variants/lilygo_tbeam_1w/target.cpp | 16 -------------- variants/lilygo_tbeam_1w/target.h | 3 --- variants/lilygo_tbeam_SX1262/target.cpp | 16 -------------- variants/lilygo_tbeam_SX1262/target.h | 3 --- variants/lilygo_tbeam_SX1276/target.cpp | 16 -------------- variants/lilygo_tbeam_SX1276/target.h | 3 --- .../lilygo_tbeam_supreme_SX1262/target.cpp | 16 -------------- variants/lilygo_tbeam_supreme_SX1262/target.h | 3 --- variants/lilygo_tdeck/target.cpp | 16 -------------- variants/lilygo_tdeck/target.h | 3 --- variants/lilygo_techo/target.cpp | 16 -------------- variants/lilygo_techo/target.h | 3 --- variants/lilygo_techo_lite/target.cpp | 16 -------------- variants/lilygo_techo_lite/target.h | 3 --- variants/lilygo_tlora_c6/target.cpp | 16 -------------- variants/lilygo_tlora_c6/target.h | 3 --- variants/lilygo_tlora_v2_1/target.cpp | 16 -------------- variants/lilygo_tlora_v2_1/target.h | 3 --- variants/m5stack_unit_c6l/UnitC6LBoard.cpp | 16 -------------- variants/m5stack_unit_c6l/target.h | 3 --- variants/mesh_pocket/target.cpp | 16 -------------- variants/mesh_pocket/target.h | 3 --- variants/meshadventurer/target.cpp | 16 -------------- variants/meshadventurer/target.h | 3 --- variants/meshtiny/target.cpp | 16 -------------- variants/meshtiny/target.h | 3 --- variants/minewsemi_me25ls01/target.cpp | 16 -------------- variants/minewsemi_me25ls01/target.h | 3 --- variants/muziworks_r1_neo/target.cpp | 15 ------------- variants/muziworks_r1_neo/target.h | 3 --- variants/nano_g2_ultra/target.cpp | 16 -------------- variants/nano_g2_ultra/target.h | 3 --- variants/nibble_screen_connect/target.cpp | 22 +++---------------- variants/nibble_screen_connect/target.h | 5 +---- variants/promicro/target.cpp | 16 -------------- variants/promicro/target.h | 3 --- variants/rak11310/target.cpp | 18 --------------- variants/rak11310/target.h | 3 --- variants/rak3112/target.cpp | 16 -------------- variants/rak3112/target.h | 3 --- variants/rak3401/target.cpp | 16 -------------- variants/rak3401/target.h | 3 --- variants/rak3x72/target.cpp | 16 -------------- variants/rak3x72/target.h | 3 --- variants/rak4631/target.cpp | 17 -------------- variants/rak4631/target.h | 3 --- variants/rak_wismesh_tag/target.cpp | 16 -------------- variants/rak_wismesh_tag/target.h | 3 --- variants/rpi_picow/target.cpp | 16 -------------- variants/rpi_picow/target.h | 3 --- variants/sensecap_indicator-espnow/target.cpp | 12 ---------- variants/sensecap_indicator-espnow/target.h | 3 --- variants/sensecap_solar/target.cpp | 16 -------------- variants/sensecap_solar/target.h | 3 --- variants/station_g2/target.cpp | 16 -------------- variants/station_g2/target.h | 3 --- variants/t1000-e/target.cpp | 16 -------------- variants/t1000-e/target.h | 3 --- variants/tenstar_c3/target.cpp | 16 -------------- variants/tenstar_c3/target.h | 3 --- variants/thinknode_m1/target.cpp | 16 -------------- variants/thinknode_m1/target.h | 3 --- variants/thinknode_m2/target.cpp | 17 -------------- variants/thinknode_m2/target.h | 3 --- variants/thinknode_m3/target.cpp | 16 -------------- variants/thinknode_m3/target.h | 3 --- variants/thinknode_m5/target.cpp | 17 -------------- variants/thinknode_m5/target.h | 3 --- variants/thinknode_m6/target.cpp | 16 -------------- variants/thinknode_m6/target.h | 3 --- variants/tiny_relay/target.cpp | 19 ---------------- variants/tiny_relay/target.h | 3 --- variants/waveshare_rp2040_lora/target.cpp | 16 -------------- variants/waveshare_rp2040_lora/target.h | 3 --- variants/wio-e5-dev/target.cpp | 16 -------------- variants/wio-e5-dev/target.h | 3 --- variants/wio-e5-mini/target.cpp | 16 -------------- variants/wio-e5-mini/target.h | 3 --- variants/wio-tracker-l1/target.cpp | 16 -------------- variants/wio-tracker-l1/target.h | 3 --- variants/wio_wm1110/target.cpp | 16 -------------- variants/wio_wm1110/target.h | 3 --- variants/xiao_c3/target.cpp | 16 -------------- variants/xiao_c3/target.h | 3 --- variants/xiao_c6/target.h | 3 --- variants/xiao_nrf52/target.cpp | 16 -------------- variants/xiao_nrf52/target.h | 3 --- variants/xiao_rp2040/target.cpp | 16 -------------- variants/xiao_rp2040/target.h | 3 --- variants/xiao_s3/target.cpp | 15 ------------- variants/xiao_s3/target.h | 3 --- variants/xiao_s3_wio/target.cpp | 16 -------------- variants/xiao_s3_wio/target.h | 3 --- 165 files changed, 110 insertions(+), 1397 deletions(-) diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index e8c1914b..71ba4abe 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -951,8 +951,8 @@ void MyMesh::begin(bool has_display) { addChannel("Public", PUBLIC_GROUP_PSK); // pre-configure Andy's public channel _store->loadChannels(this); - radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); - radio_set_tx_power(_prefs.tx_power_dbm); + radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_driver.setTxPower(_prefs.tx_power_dbm); radio_driver.setRxBoostedGainMode(_prefs.rx_boosted_gain); MESH_DEBUG_PRINTLN("RX Boosted Gain Mode: %s", radio_driver.getRxBoostedGainMode() ? "Enabled" : "Disabled"); @@ -1374,7 +1374,7 @@ void MyMesh::handleCmdFrame(size_t len) { _prefs.client_repeat = repeat; savePrefs(); - radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); MESH_DEBUG_PRINTLN("OK: CMD_SET_RADIO_PARAMS: f=%d, bw=%d, sf=%d, cr=%d", freq, bw, (uint32_t)sf, (uint32_t)cr); @@ -1391,7 +1391,7 @@ void MyMesh::handleCmdFrame(size_t len) { } else { _prefs.tx_power_dbm = power; savePrefs(); - radio_set_tx_power(_prefs.tx_power_dbm); + radio_driver.setTxPower(_prefs.tx_power_dbm); writeOKFrame(); } } else if (cmd_frame[0] == CMD_SET_TUNING_PARAMS) { diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 876dc9c3..80e9da34 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -125,7 +125,7 @@ void setup() { if (!radio_init()) { halt(); } - fast_rng.begin(radio_get_rng_seed()); + fast_rng.begin(radio_driver.getRngSeed()); #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) InternalFS.begin(); diff --git a/examples/kiss_modem/main.cpp b/examples/kiss_modem/main.cpp index bc7508a8..e497aa98 100644 --- a/examples/kiss_modem/main.cpp +++ b/examples/kiss_modem/main.cpp @@ -56,11 +56,11 @@ void loadOrCreateIdentity() { } void onSetRadio(float freq, float bw, uint8_t sf, uint8_t cr) { - radio_set_params(freq, bw, sf, cr); + radio_driver.setParams(freq, bw, sf, cr); } void onSetTxPower(uint8_t power) { - radio_set_tx_power(power); + radio_driver.setTxPower(power); } float onGetCurrentRssi() { @@ -82,7 +82,7 @@ void setup() { radio_driver.begin(); - rng.begin(radio_get_rng_seed()); + rng.begin(radio_driver.getRngSeed()); loadOrCreateIdentity(); sensors.begin(); diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index 666f79fc..53f642fd 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -953,8 +953,8 @@ void MyMesh::begin(FILESYSTEM *fs) { } #endif - radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); - radio_set_tx_power(_prefs.tx_power_dbm); + radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_driver.setTxPower(_prefs.tx_power_dbm); radio_driver.setRxBoostedGainMode(_prefs.rx_boosted_gain); MESH_DEBUG_PRINTLN("RX Boosted Gain Mode: %s", @@ -1050,7 +1050,7 @@ void MyMesh::dumpLogFile() { } void MyMesh::setTxPower(int8_t power_dbm) { - radio_set_tx_power(power_dbm); + radio_driver.setTxPower(power_dbm); } #if defined(USE_SX1262) || defined(USE_SX1268) @@ -1279,13 +1279,13 @@ void MyMesh::loop() { if (set_radio_at && millisHasNowPassed(set_radio_at)) { // apply pending (temporary) radio params set_radio_at = 0; // clear timer - radio_set_params(pending_freq, pending_bw, pending_sf, pending_cr); + radio_driver.setParams(pending_freq, pending_bw, pending_sf, pending_cr); MESH_DEBUG_PRINTLN("Temp radio params"); } if (revert_radio_at && millisHasNowPassed(revert_radio_at)) { // revert radio params to orig revert_radio_at = 0; // clear timer - radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); MESH_DEBUG_PRINTLN("Radio params restored"); } diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index e37078ce..7fad801b 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -57,7 +57,7 @@ void setup() { halt(); } - fast_rng.begin(radio_get_rng_seed()); + fast_rng.begin(radio_driver.getRngSeed()); FILESYSTEM* fs; #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index 145fb0fd..16042052 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -691,8 +691,8 @@ void MyMesh::begin(FILESYSTEM *fs) { } } - radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); - radio_set_tx_power(_prefs.tx_power_dbm); + radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_driver.setTxPower(_prefs.tx_power_dbm); updateAdvertTimer(); updateFloodAdvertTimer(); @@ -796,7 +796,7 @@ void MyMesh::dumpLogFile() { } void MyMesh::setTxPower(int8_t power_dbm) { - radio_set_tx_power(power_dbm); + radio_driver.setTxPower(power_dbm); } void MyMesh::saveIdentity(const mesh::LocalIdentity &new_id) { @@ -999,13 +999,13 @@ void MyMesh::loop() { if (set_radio_at && millisHasNowPassed(set_radio_at)) { // apply pending (temporary) radio params set_radio_at = 0; // clear timer - radio_set_params(pending_freq, pending_bw, pending_sf, pending_cr); + radio_driver.setParams(pending_freq, pending_bw, pending_sf, pending_cr); MESH_DEBUG_PRINTLN("Temp radio params"); } if (revert_radio_at && millisHasNowPassed(revert_radio_at)) { // revert radio params to orig revert_radio_at = 0; // clear timer - radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); MESH_DEBUG_PRINTLN("Radio params restored"); } diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index 825fb007..de38c253 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -35,7 +35,7 @@ void setup() { if (!radio_init()) { halt(); } - fast_rng.begin(radio_get_rng_seed()); + fast_rng.begin(radio_driver.getRngSeed()); FILESYSTEM* fs; #if defined(NRF52_PLATFORM) diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index ab14d393..d5066736 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -562,7 +562,7 @@ void setup() { if (!radio_init()) { halt(); } - fast_rng.begin(radio_get_rng_seed()); + fast_rng.begin(radio_driver.getRngSeed()); #if defined(NRF52_PLATFORM) InternalFS.begin(); @@ -577,8 +577,8 @@ void setup() { #error "need to define filesystem" #endif - radio_set_params(the_mesh.getFreqPref(), LORA_BW, LORA_SF, LORA_CR); - radio_set_tx_power(the_mesh.getTxPowerPref()); + radio_driver.setParams(the_mesh.getFreqPref(), LORA_BW, LORA_SF, LORA_CR); + radio_driver.setTxPower(the_mesh.getTxPowerPref()); the_mesh.showWelcome(); diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index b8fe1e57..879fcbf0 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -764,8 +764,8 @@ void SensorMesh::begin(FILESYSTEM* fs) { } } - radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); - radio_set_tx_power(_prefs.tx_power_dbm); + radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_driver.setTxPower(_prefs.tx_power_dbm); updateAdvertTimer(); updateFloodAdvertTimer(); @@ -842,7 +842,7 @@ void SensorMesh::updateFloodAdvertTimer() { } void SensorMesh::setTxPower(int8_t power_dbm) { - radio_set_tx_power(power_dbm); + radio_driver.setTxPower(power_dbm); } void SensorMesh::formatStatsReply(char *reply) { @@ -908,13 +908,13 @@ void SensorMesh::loop() { if (set_radio_at && millisHasNowPassed(set_radio_at)) { // apply pending (temporary) radio params set_radio_at = 0; // clear timer - radio_set_params(pending_freq, pending_bw, pending_sf, pending_cr); + radio_driver.setParams(pending_freq, pending_bw, pending_sf, pending_cr); MESH_DEBUG_PRINTLN("Temp radio params"); } if (revert_radio_at && millisHasNowPassed(revert_radio_at)) { // revert radio params to orig revert_radio_at = 0; // clear timer - radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); MESH_DEBUG_PRINTLN("Radio params restored"); } diff --git a/examples/simple_sensor/main.cpp b/examples/simple_sensor/main.cpp index 330adcc2..cace67a0 100644 --- a/examples/simple_sensor/main.cpp +++ b/examples/simple_sensor/main.cpp @@ -68,7 +68,7 @@ void setup() { if (!radio_init()) { halt(); } - fast_rng.begin(radio_get_rng_seed()); + fast_rng.begin(radio_driver.getRngSeed()); FILESYSTEM* fs; #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) diff --git a/src/helpers/esp32/ESPNOWRadio.cpp b/src/helpers/esp32/ESPNOWRadio.cpp index ced19f91..a7557f14 100644 --- a/src/helpers/esp32/ESPNOWRadio.cpp +++ b/src/helpers/esp32/ESPNOWRadio.cpp @@ -54,6 +54,10 @@ void ESPNOWRadio::init() { } } +uint32_t ESPNOWRadio::getRngSeed() { + return millis() + intID(); // TODO: where to get some entropy? +} + void ESPNOWRadio::setTxPower(uint8_t dbm) { esp_wifi_set_max_tx_power(dbm * 4); } diff --git a/src/helpers/esp32/ESPNOWRadio.h b/src/helpers/esp32/ESPNOWRadio.h index 43772e5e..67b1448e 100644 --- a/src/helpers/esp32/ESPNOWRadio.h +++ b/src/helpers/esp32/ESPNOWRadio.h @@ -9,6 +9,13 @@ protected: public: ESPNOWRadio() { n_recv = n_sent = n_recv_errors = 0; } + uint32_t getRngSeed(); + + void setParams(float freq, float bw, uint8_t sf, uint8_t cr) { + // no-op + } + void powerOff() { /* no-op */ } + void init(); int recvRaw(uint8_t* bytes, int sz) override; uint32_t getEstAirtimeFor(int len_bytes) override; diff --git a/src/helpers/radiolib/CustomLLCC68Wrapper.h b/src/helpers/radiolib/CustomLLCC68Wrapper.h index 793ba335..8861f76d 100644 --- a/src/helpers/radiolib/CustomLLCC68Wrapper.h +++ b/src/helpers/radiolib/CustomLLCC68Wrapper.h @@ -7,6 +7,15 @@ class CustomLLCC68Wrapper : public RadioLibWrapper { public: CustomLLCC68Wrapper(CustomLLCC68& radio, mesh::MainBoard& board) : RadioLibWrapper(radio, board) { } + + void setParams(float freq, float bw, uint8_t sf, uint8_t cr) override { + ((CustomLLCC68 *)_radio)->setFrequency(freq); + ((CustomLLCC68 *)_radio)->setSpreadingFactor(sf); + ((CustomLLCC68 *)_radio)->setBandwidth(bw); + ((CustomLLCC68 *)_radio)->setCodingRate(cr); + updatePreamble(sf); + } + bool isReceivingPacket() override { return ((CustomLLCC68 *)_radio)->isReceiving(); } diff --git a/src/helpers/radiolib/CustomLR1110Wrapper.h b/src/helpers/radiolib/CustomLR1110Wrapper.h index 0445262b..13efd25b 100644 --- a/src/helpers/radiolib/CustomLR1110Wrapper.h +++ b/src/helpers/radiolib/CustomLR1110Wrapper.h @@ -7,6 +7,15 @@ class CustomLR1110Wrapper : public RadioLibWrapper { public: CustomLR1110Wrapper(CustomLR1110& radio, mesh::MainBoard& board) : RadioLibWrapper(radio, board) { } + + void setParams(float freq, float bw, uint8_t sf, uint8_t cr) override { + ((CustomLR1110 *)_radio)->setFrequency(freq); + ((CustomLR1110 *)_radio)->setSpreadingFactor(sf); + ((CustomLR1110 *)_radio)->setBandwidth(bw); + ((CustomLR1110 *)_radio)->setCodingRate(cr); + updatePreamble(sf); + } + void doResetAGC() override { lr11x0ResetAGC((LR11x0 *)_radio, ((CustomLR1110 *)_radio)->getFreqMHz()); } bool isReceivingPacket() override { return ((CustomLR1110 *)_radio)->isReceiving(); diff --git a/src/helpers/radiolib/CustomSTM32WLxWrapper.h b/src/helpers/radiolib/CustomSTM32WLxWrapper.h index cccdc043..97bf6820 100644 --- a/src/helpers/radiolib/CustomSTM32WLxWrapper.h +++ b/src/helpers/radiolib/CustomSTM32WLxWrapper.h @@ -8,6 +8,15 @@ class CustomSTM32WLxWrapper : public RadioLibWrapper { public: CustomSTM32WLxWrapper(CustomSTM32WLx& radio, mesh::MainBoard& board) : RadioLibWrapper(radio, board) { } + + void setParams(float freq, float bw, uint8_t sf, uint8_t cr) override { + ((CustomSTM32WLx *)_radio)->setFrequency(freq); + ((CustomSTM32WLx *)_radio)->setSpreadingFactor(sf); + ((CustomSTM32WLx *)_radio)->setBandwidth(bw); + ((CustomSTM32WLx *)_radio)->setCodingRate(cr); + updatePreamble(sf); + } + bool isReceivingPacket() override { return ((CustomSTM32WLx *)_radio)->isReceiving(); } diff --git a/src/helpers/radiolib/CustomSX1262Wrapper.h b/src/helpers/radiolib/CustomSX1262Wrapper.h index e13561a4..cc7bb223 100644 --- a/src/helpers/radiolib/CustomSX1262Wrapper.h +++ b/src/helpers/radiolib/CustomSX1262Wrapper.h @@ -11,6 +11,15 @@ class CustomSX1262Wrapper : public RadioLibWrapper { public: CustomSX1262Wrapper(CustomSX1262& radio, mesh::MainBoard& board) : RadioLibWrapper(radio, board) { } + + void setParams(float freq, float bw, uint8_t sf, uint8_t cr) override { + ((CustomSX1262 *)_radio)->setFrequency(freq); + ((CustomSX1262 *)_radio)->setSpreadingFactor(sf); + ((CustomSX1262 *)_radio)->setBandwidth(bw); + ((CustomSX1262 *)_radio)->setCodingRate(cr); + updatePreamble(sf); + } + bool isReceivingPacket() override { return ((CustomSX1262 *)_radio)->isReceiving(); } diff --git a/src/helpers/radiolib/CustomSX1268Wrapper.h b/src/helpers/radiolib/CustomSX1268Wrapper.h index f24ab41c..9ddea78f 100644 --- a/src/helpers/radiolib/CustomSX1268Wrapper.h +++ b/src/helpers/radiolib/CustomSX1268Wrapper.h @@ -11,6 +11,15 @@ class CustomSX1268Wrapper : public RadioLibWrapper { public: CustomSX1268Wrapper(CustomSX1268& radio, mesh::MainBoard& board) : RadioLibWrapper(radio, board) { } + + void setParams(float freq, float bw, uint8_t sf, uint8_t cr) override { + ((CustomSX1268 *)_radio)->setFrequency(freq); + ((CustomSX1268 *)_radio)->setSpreadingFactor(sf); + ((CustomSX1268 *)_radio)->setBandwidth(bw); + ((CustomSX1268 *)_radio)->setCodingRate(cr); + updatePreamble(sf); + } + bool isReceivingPacket() override { return ((CustomSX1268 *)_radio)->isReceiving(); } diff --git a/src/helpers/radiolib/CustomSX1276Wrapper.h b/src/helpers/radiolib/CustomSX1276Wrapper.h index afe2cc04..9d75ce12 100644 --- a/src/helpers/radiolib/CustomSX1276Wrapper.h +++ b/src/helpers/radiolib/CustomSX1276Wrapper.h @@ -10,6 +10,15 @@ class CustomSX1276Wrapper : public RadioLibWrapper { public: CustomSX1276Wrapper(CustomSX1276& radio, mesh::MainBoard& board) : RadioLibWrapper(radio, board) { } + + void setParams(float freq, float bw, uint8_t sf, uint8_t cr) override { + ((CustomSX1276 *)_radio)->setFrequency(freq); + ((CustomSX1276 *)_radio)->setSpreadingFactor(sf); + ((CustomSX1276 *)_radio)->setBandwidth(bw); + ((CustomSX1276 *)_radio)->setCodingRate(cr); + updatePreamble(sf); + } + bool isReceivingPacket() override { return ((CustomSX1276 *)_radio)->isReceiving(); } diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index 85f3a935..b6519aef 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -42,6 +42,14 @@ void RadioLibWrapper::begin() { _floor_sample_sum = 0; } +uint32_t RadioLibWrapper::getRngSeed() { + return _radio->random(0x7FFFFFFF); +} + +void RadioLibWrapper::setTxPower(int8_t dbm) { + _radio->setOutputPower(dbm); +} + void RadioLibWrapper::idle() { _radio->standby(); state = STATE_IDLE; // need another startReceive() diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index ff951aaa..efd3e179 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -38,6 +38,10 @@ public: return isChannelActive(); } + virtual void setParams(float freq, float bw, uint8_t sf, uint8_t cr) = 0; + uint32_t getRngSeed(); + void setTxPower(int8_t dbm); + virtual float getCurrentRSSI() =0; virtual uint8_t getSpreadingFactor() const { return LORA_SF; } static uint16_t preambleLengthForSF(uint8_t sf) { return sf <= 8 ? 32 : 16; } diff --git a/variants/ebyte_eora_s3/target.cpp b/variants/ebyte_eora_s3/target.cpp index 9e656cc2..91d851ff 100644 --- a/variants/ebyte_eora_s3/target.cpp +++ b/variants/ebyte_eora_s3/target.cpp @@ -64,22 +64,6 @@ bool radio_init() { return true; // success } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/ebyte_eora_s3/target.h b/variants/ebyte_eora_s3/target.h index 892c3de3..b64694f5 100644 --- a/variants/ebyte_eora_s3/target.h +++ b/variants/ebyte_eora_s3/target.h @@ -23,7 +23,4 @@ extern SensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/gat562_30s_mesh_kit/target.cpp b/variants/gat562_30s_mesh_kit/target.cpp index 66723b44..8f84a7a1 100644 --- a/variants/gat562_30s_mesh_kit/target.cpp +++ b/variants/gat562_30s_mesh_kit/target.cpp @@ -38,21 +38,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/gat562_30s_mesh_kit/target.h b/variants/gat562_30s_mesh_kit/target.h index c112fd6c..d526a5d0 100644 --- a/variants/gat562_30s_mesh_kit/target.h +++ b/variants/gat562_30s_mesh_kit/target.h @@ -24,7 +24,4 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/gat562_mesh_evb_pro/target.cpp b/variants/gat562_mesh_evb_pro/target.cpp index 368b5fa1..8dc203de 100644 --- a/variants/gat562_mesh_evb_pro/target.cpp +++ b/variants/gat562_mesh_evb_pro/target.cpp @@ -37,21 +37,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/gat562_mesh_evb_pro/target.h b/variants/gat562_mesh_evb_pro/target.h index 2a3c6f87..9111704f 100644 --- a/variants/gat562_mesh_evb_pro/target.h +++ b/variants/gat562_mesh_evb_pro/target.h @@ -23,7 +23,4 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/gat562_mesh_tracker_pro/target.cpp b/variants/gat562_mesh_tracker_pro/target.cpp index 8ef0ecd3..d16b4538 100644 --- a/variants/gat562_mesh_tracker_pro/target.cpp +++ b/variants/gat562_mesh_tracker_pro/target.cpp @@ -38,21 +38,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/gat562_mesh_tracker_pro/target.h b/variants/gat562_mesh_tracker_pro/target.h index d43c5f25..0d3b7d76 100644 --- a/variants/gat562_mesh_tracker_pro/target.h +++ b/variants/gat562_mesh_tracker_pro/target.h @@ -24,7 +24,4 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/gat562_mesh_watch13/target.cpp b/variants/gat562_mesh_watch13/target.cpp index 87f65dd9..95bcf6dc 100644 --- a/variants/gat562_mesh_watch13/target.cpp +++ b/variants/gat562_mesh_watch13/target.cpp @@ -29,21 +29,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/gat562_mesh_watch13/target.h b/variants/gat562_mesh_watch13/target.h index a9a71ce4..9ed5cda7 100644 --- a/variants/gat562_mesh_watch13/target.h +++ b/variants/gat562_mesh_watch13/target.h @@ -25,7 +25,4 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/generic-e22/target.cpp b/variants/generic-e22/target.cpp index ea9664fd..26bba1c0 100644 --- a/variants/generic-e22/target.cpp +++ b/variants/generic-e22/target.cpp @@ -27,22 +27,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/generic-e22/target.h b/variants/generic-e22/target.h index 6504078c..16612f67 100644 --- a/variants/generic-e22/target.h +++ b/variants/generic-e22/target.h @@ -15,8 +15,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/generic_espnow/target.cpp b/variants/generic_espnow/target.cpp index f42085c0..f447523e 100644 --- a/variants/generic_espnow/target.cpp +++ b/variants/generic_espnow/target.cpp @@ -17,18 +17,6 @@ bool radio_init() { return true; // success } -uint32_t radio_get_rng_seed() { - return millis() + radio_driver.intID(); // TODO: where to get some entropy? -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - // no-op -} - -void radio_set_tx_power(int8_t dbm) { - radio_driver.setTxPower(dbm); -} - // NOTE: as we are using the WiFi radio, the ESP_IDF will have enabled hardware RNG: // https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/random.html class ESP_RNG : public mesh::RNG { diff --git a/variants/generic_espnow/target.h b/variants/generic_espnow/target.h index 1ebd0837..884f4969 100644 --- a/variants/generic_espnow/target.h +++ b/variants/generic_espnow/target.h @@ -10,7 +10,4 @@ extern ESP32RTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_ct62/target.cpp b/variants/heltec_ct62/target.cpp index cd8bd507..522c3199 100644 --- a/variants/heltec_ct62/target.cpp +++ b/variants/heltec_ct62/target.cpp @@ -16,22 +16,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_ct62/target.h b/variants/heltec_ct62/target.h index 1bd525e1..214a6e0f 100644 --- a/variants/heltec_ct62/target.h +++ b/variants/heltec_ct62/target.h @@ -14,7 +14,4 @@ extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_e213/target.cpp b/variants/heltec_e213/target.cpp index 859cd9fa..6914769d 100644 --- a/variants/heltec_e213/target.cpp +++ b/variants/heltec_e213/target.cpp @@ -33,22 +33,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_e213/target.h b/variants/heltec_e213/target.h index c23ac1fa..6f2c291b 100644 --- a/variants/heltec_e213/target.h +++ b/variants/heltec_e213/target.h @@ -23,7 +23,4 @@ extern MomentaryButton user_btn; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_e290/target.cpp b/variants/heltec_e290/target.cpp index 8196ff7d..f2327954 100644 --- a/variants/heltec_e290/target.cpp +++ b/variants/heltec_e290/target.cpp @@ -33,22 +33,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_e290/target.h b/variants/heltec_e290/target.h index b0900302..d78521fc 100644 --- a/variants/heltec_e290/target.h +++ b/variants/heltec_e290/target.h @@ -23,7 +23,4 @@ extern MomentaryButton user_btn; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_mesh_solar/target.cpp b/variants/heltec_mesh_solar/target.cpp index 08d29e15..d140864c 100644 --- a/variants/heltec_mesh_solar/target.cpp +++ b/variants/heltec_mesh_solar/target.cpp @@ -23,22 +23,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_mesh_solar/target.h b/variants/heltec_mesh_solar/target.h index f1921abf..1956f50e 100644 --- a/variants/heltec_mesh_solar/target.h +++ b/variants/heltec_mesh_solar/target.h @@ -40,7 +40,4 @@ extern SolarSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_t096/target.cpp b/variants/heltec_t096/target.cpp index 09609b87..30509977 100644 --- a/variants/heltec_t096/target.cpp +++ b/variants/heltec_t096/target.cpp @@ -43,21 +43,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_t096/target.h b/variants/heltec_t096/target.h index 8c704b23..137d8db5 100644 --- a/variants/heltec_t096/target.h +++ b/variants/heltec_t096/target.h @@ -27,7 +27,4 @@ extern MomentaryButton user_btn; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_t114/target.cpp b/variants/heltec_t114/target.cpp index 36587177..cb8f75db 100644 --- a/variants/heltec_t114/target.cpp +++ b/variants/heltec_t114/target.cpp @@ -43,22 +43,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_t114/target.h b/variants/heltec_t114/target.h index 612161fe..5aac84db 100644 --- a/variants/heltec_t114/target.h +++ b/variants/heltec_t114/target.h @@ -29,7 +29,4 @@ extern MomentaryButton user_btn; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_t190/target.cpp b/variants/heltec_t190/target.cpp index c39ca35c..6a2eab7d 100644 --- a/variants/heltec_t190/target.cpp +++ b/variants/heltec_t190/target.cpp @@ -33,22 +33,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_t190/target.h b/variants/heltec_t190/target.h index 9a6e4d96..cde63220 100644 --- a/variants/heltec_t190/target.h +++ b/variants/heltec_t190/target.h @@ -23,7 +23,4 @@ extern MomentaryButton user_btn; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_tracker/target.cpp b/variants/heltec_tracker/target.cpp index 95cd9c9b..f32c41ff 100644 --- a/variants/heltec_tracker/target.cpp +++ b/variants/heltec_tracker/target.cpp @@ -37,22 +37,6 @@ bool radio_init() { } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_tracker/target.h b/variants/heltec_tracker/target.h index 29099f46..2931eda8 100644 --- a/variants/heltec_tracker/target.h +++ b/variants/heltec_tracker/target.h @@ -42,7 +42,4 @@ extern HWTSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_tracker_v2/target.cpp b/variants/heltec_tracker_v2/target.cpp index 6de866fb..c48a29f6 100644 --- a/variants/heltec_tracker_v2/target.cpp +++ b/variants/heltec_tracker_v2/target.cpp @@ -39,22 +39,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_tracker_v2/target.h b/variants/heltec_tracker_v2/target.h index 62f31c95..240d9d4c 100644 --- a/variants/heltec_tracker_v2/target.h +++ b/variants/heltec_tracker_v2/target.h @@ -24,8 +24,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_v2/target.cpp b/variants/heltec_v2/target.cpp index d327d78b..2bc57b8c 100644 --- a/variants/heltec_v2/target.cpp +++ b/variants/heltec_v2/target.cpp @@ -32,22 +32,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_v2/target.h b/variants/heltec_v2/target.h index 788dac72..cdffc18a 100644 --- a/variants/heltec_v2/target.h +++ b/variants/heltec_v2/target.h @@ -23,7 +23,4 @@ extern SensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_v3/target.cpp b/variants/heltec_v3/target.cpp index 56356833..e6af466a 100644 --- a/variants/heltec_v3/target.cpp +++ b/variants/heltec_v3/target.cpp @@ -39,22 +39,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_v3/target.h b/variants/heltec_v3/target.h index 21a209f9..2944b384 100644 --- a/variants/heltec_v3/target.h +++ b/variants/heltec_v3/target.h @@ -24,7 +24,4 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_v4/target.cpp b/variants/heltec_v4/target.cpp index e0b6a1d4..8483f276 100644 --- a/variants/heltec_v4/target.cpp +++ b/variants/heltec_v4/target.cpp @@ -39,22 +39,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_v4/target.h b/variants/heltec_v4/target.h index 47d493cb..5d668186 100644 --- a/variants/heltec_v4/target.h +++ b/variants/heltec_v4/target.h @@ -28,8 +28,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_wireless_paper/target.cpp b/variants/heltec_wireless_paper/target.cpp index 52ef9fb5..be21695e 100644 --- a/variants/heltec_wireless_paper/target.cpp +++ b/variants/heltec_wireless_paper/target.cpp @@ -32,22 +32,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/heltec_wireless_paper/target.h b/variants/heltec_wireless_paper/target.h index 47908314..72066781 100644 --- a/variants/heltec_wireless_paper/target.h +++ b/variants/heltec_wireless_paper/target.h @@ -29,7 +29,4 @@ extern MomentaryButton user_btn; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/ikoka_handheld_nrf/target.cpp b/variants/ikoka_handheld_nrf/target.cpp index e23fd8d8..6c53c5e3 100644 --- a/variants/ikoka_handheld_nrf/target.cpp +++ b/variants/ikoka_handheld_nrf/target.cpp @@ -25,22 +25,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/ikoka_handheld_nrf/target.h b/variants/ikoka_handheld_nrf/target.h index 9afe937a..18f7c9c5 100644 --- a/variants/ikoka_handheld_nrf/target.h +++ b/variants/ikoka_handheld_nrf/target.h @@ -23,8 +23,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/ikoka_nano_nrf/target.cpp b/variants/ikoka_nano_nrf/target.cpp index 00294d5a..baf02c3d 100644 --- a/variants/ikoka_nano_nrf/target.cpp +++ b/variants/ikoka_nano_nrf/target.cpp @@ -23,22 +23,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/ikoka_nano_nrf/target.h b/variants/ikoka_nano_nrf/target.h index b85b8d93..30ee5cb6 100644 --- a/variants/ikoka_nano_nrf/target.h +++ b/variants/ikoka_nano_nrf/target.h @@ -22,8 +22,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/ikoka_stick_nrf/target.cpp b/variants/ikoka_stick_nrf/target.cpp index d07dc345..bb140505 100644 --- a/variants/ikoka_stick_nrf/target.cpp +++ b/variants/ikoka_stick_nrf/target.cpp @@ -23,22 +23,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/ikoka_stick_nrf/target.h b/variants/ikoka_stick_nrf/target.h index b36c8393..46b05e8b 100644 --- a/variants/ikoka_stick_nrf/target.h +++ b/variants/ikoka_stick_nrf/target.h @@ -22,8 +22,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/keepteen_lt1/target.cpp b/variants/keepteen_lt1/target.cpp index 71652b37..f1879ac5 100644 --- a/variants/keepteen_lt1/target.cpp +++ b/variants/keepteen_lt1/target.cpp @@ -29,22 +29,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/keepteen_lt1/target.h b/variants/keepteen_lt1/target.h index a37ac8ff..5b73bb66 100644 --- a/variants/keepteen_lt1/target.h +++ b/variants/keepteen_lt1/target.h @@ -24,8 +24,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_t3s3/target.cpp b/variants/lilygo_t3s3/target.cpp index 73c19e06..34df31c3 100644 --- a/variants/lilygo_t3s3/target.cpp +++ b/variants/lilygo_t3s3/target.cpp @@ -27,22 +27,6 @@ bool radio_init() { return radio.std_init(&spi); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/lilygo_t3s3/target.h b/variants/lilygo_t3s3/target.h index 7db1b664..965cdd1a 100644 --- a/variants/lilygo_t3s3/target.h +++ b/variants/lilygo_t3s3/target.h @@ -23,8 +23,5 @@ extern SensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_t3s3_sx1276/target.cpp b/variants/lilygo_t3s3_sx1276/target.cpp index a62724fb..020ef54a 100644 --- a/variants/lilygo_t3s3_sx1276/target.cpp +++ b/variants/lilygo_t3s3_sx1276/target.cpp @@ -33,22 +33,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/lilygo_t3s3_sx1276/target.h b/variants/lilygo_t3s3_sx1276/target.h index 2df4b3ed..460b7ac1 100644 --- a/variants/lilygo_t3s3_sx1276/target.h +++ b/variants/lilygo_t3s3_sx1276/target.h @@ -23,7 +23,4 @@ extern SensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); \ No newline at end of file diff --git a/variants/lilygo_tbeam_1w/target.cpp b/variants/lilygo_tbeam_1w/target.cpp index b6a10257..6755df09 100644 --- a/variants/lilygo_tbeam_1w/target.cpp +++ b/variants/lilygo_tbeam_1w/target.cpp @@ -43,22 +43,6 @@ bool radio_init() { return success; } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); diff --git a/variants/lilygo_tbeam_1w/target.h b/variants/lilygo_tbeam_1w/target.h index a521332f..d6cd61b4 100644 --- a/variants/lilygo_tbeam_1w/target.h +++ b/variants/lilygo_tbeam_1w/target.h @@ -21,8 +21,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_tbeam_SX1262/target.cpp b/variants/lilygo_tbeam_SX1262/target.cpp index 943dcd65..6e5292a7 100644 --- a/variants/lilygo_tbeam_SX1262/target.cpp +++ b/variants/lilygo_tbeam_SX1262/target.cpp @@ -34,22 +34,6 @@ bool radio_init() { return radio.std_init(&spi); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/lilygo_tbeam_SX1262/target.h b/variants/lilygo_tbeam_SX1262/target.h index 691c01d4..c532a73a 100644 --- a/variants/lilygo_tbeam_SX1262/target.h +++ b/variants/lilygo_tbeam_SX1262/target.h @@ -23,8 +23,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_tbeam_SX1276/target.cpp b/variants/lilygo_tbeam_SX1276/target.cpp index b6733a4f..94cc3d6d 100644 --- a/variants/lilygo_tbeam_SX1276/target.cpp +++ b/variants/lilygo_tbeam_SX1276/target.cpp @@ -39,22 +39,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/lilygo_tbeam_SX1276/target.h b/variants/lilygo_tbeam_SX1276/target.h index ad385645..1c709905 100644 --- a/variants/lilygo_tbeam_SX1276/target.h +++ b/variants/lilygo_tbeam_SX1276/target.h @@ -23,7 +23,4 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); \ No newline at end of file diff --git a/variants/lilygo_tbeam_supreme_SX1262/target.cpp b/variants/lilygo_tbeam_supreme_SX1262/target.cpp index bebd4ed0..a0b765bf 100644 --- a/variants/lilygo_tbeam_supreme_SX1262/target.cpp +++ b/variants/lilygo_tbeam_supreme_SX1262/target.cpp @@ -31,22 +31,6 @@ bool radio_init() { return radio.std_init(&spi); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/lilygo_tbeam_supreme_SX1262/target.h b/variants/lilygo_tbeam_supreme_SX1262/target.h index 901c0715..25caa711 100644 --- a/variants/lilygo_tbeam_supreme_SX1262/target.h +++ b/variants/lilygo_tbeam_supreme_SX1262/target.h @@ -21,7 +21,4 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_tdeck/target.cpp b/variants/lilygo_tdeck/target.cpp index c78d2973..d20c56a3 100644 --- a/variants/lilygo_tdeck/target.cpp +++ b/variants/lilygo_tdeck/target.cpp @@ -34,22 +34,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/lilygo_tdeck/target.h b/variants/lilygo_tdeck/target.h index 75247734..9d35af9b 100644 --- a/variants/lilygo_tdeck/target.h +++ b/variants/lilygo_tdeck/target.h @@ -25,7 +25,4 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_techo/target.cpp b/variants/lilygo_techo/target.cpp index 1807621d..278fc76d 100644 --- a/variants/lilygo_techo/target.cpp +++ b/variants/lilygo_techo/target.cpp @@ -31,22 +31,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/lilygo_techo/target.h b/variants/lilygo_techo/target.h index 12b67c1c..2b8a1783 100644 --- a/variants/lilygo_techo/target.h +++ b/variants/lilygo_techo/target.h @@ -25,8 +25,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_techo_lite/target.cpp b/variants/lilygo_techo_lite/target.cpp index 7a602c6f..95a62fcd 100644 --- a/variants/lilygo_techo_lite/target.cpp +++ b/variants/lilygo_techo_lite/target.cpp @@ -30,22 +30,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/lilygo_techo_lite/target.h b/variants/lilygo_techo_lite/target.h index 12b67c1c..2b8a1783 100644 --- a/variants/lilygo_techo_lite/target.h +++ b/variants/lilygo_techo_lite/target.h @@ -25,8 +25,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_tlora_c6/target.cpp b/variants/lilygo_tlora_c6/target.cpp index 1f6cf9c3..d70e9b79 100644 --- a/variants/lilygo_tlora_c6/target.cpp +++ b/variants/lilygo_tlora_c6/target.cpp @@ -27,22 +27,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/lilygo_tlora_c6/target.h b/variants/lilygo_tlora_c6/target.h index 0946b58b..81e99ee3 100644 --- a/variants/lilygo_tlora_c6/target.h +++ b/variants/lilygo_tlora_c6/target.h @@ -14,8 +14,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_tlora_v2_1/target.cpp b/variants/lilygo_tlora_v2_1/target.cpp index 81b1d74c..8c120161 100644 --- a/variants/lilygo_tlora_v2_1/target.cpp +++ b/variants/lilygo_tlora_v2_1/target.cpp @@ -28,22 +28,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/lilygo_tlora_v2_1/target.h b/variants/lilygo_tlora_v2_1/target.h index 75823113..fa954b32 100644 --- a/variants/lilygo_tlora_v2_1/target.h +++ b/variants/lilygo_tlora_v2_1/target.h @@ -23,7 +23,4 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); \ No newline at end of file diff --git a/variants/m5stack_unit_c6l/UnitC6LBoard.cpp b/variants/m5stack_unit_c6l/UnitC6LBoard.cpp index 5a70e979..ab192ebe 100644 --- a/variants/m5stack_unit_c6l/UnitC6LBoard.cpp +++ b/variants/m5stack_unit_c6l/UnitC6LBoard.cpp @@ -28,22 +28,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(uint8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/m5stack_unit_c6l/target.h b/variants/m5stack_unit_c6l/target.h index 665850dd..0a959b97 100644 --- a/variants/m5stack_unit_c6l/target.h +++ b/variants/m5stack_unit_c6l/target.h @@ -15,7 +15,4 @@ extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(uint8_t dbm); mesh::LocalIdentity radio_new_identity(); \ No newline at end of file diff --git a/variants/mesh_pocket/target.cpp b/variants/mesh_pocket/target.cpp index 22f14e79..ee8f944d 100644 --- a/variants/mesh_pocket/target.cpp +++ b/variants/mesh_pocket/target.cpp @@ -23,22 +23,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/mesh_pocket/target.h b/variants/mesh_pocket/target.h index 233721fe..244fe7d2 100644 --- a/variants/mesh_pocket/target.h +++ b/variants/mesh_pocket/target.h @@ -24,9 +24,6 @@ extern AutoDiscoverRTCClock rtc_clock; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); extern SensorManager sensors; diff --git a/variants/meshadventurer/target.cpp b/variants/meshadventurer/target.cpp index d8ccbe2f..8795a4cb 100644 --- a/variants/meshadventurer/target.cpp +++ b/variants/meshadventurer/target.cpp @@ -30,22 +30,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/meshadventurer/target.h b/variants/meshadventurer/target.h index f91d2fa7..d59b3aee 100644 --- a/variants/meshadventurer/target.h +++ b/variants/meshadventurer/target.h @@ -43,8 +43,5 @@ extern MASensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/meshtiny/target.cpp b/variants/meshtiny/target.cpp index c0f1b1fa..50d67826 100644 --- a/variants/meshtiny/target.cpp +++ b/variants/meshtiny/target.cpp @@ -26,22 +26,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/meshtiny/target.h b/variants/meshtiny/target.h index 6dadd566..3987e18c 100644 --- a/variants/meshtiny/target.h +++ b/variants/meshtiny/target.h @@ -27,8 +27,5 @@ extern MomentaryButton back_btn; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/minewsemi_me25ls01/target.cpp b/variants/minewsemi_me25ls01/target.cpp index c67663d6..9944a38b 100644 --- a/variants/minewsemi_me25ls01/target.cpp +++ b/variants/minewsemi_me25ls01/target.cpp @@ -77,22 +77,6 @@ bool radio_init() { return true; // success } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/minewsemi_me25ls01/target.h b/variants/minewsemi_me25ls01/target.h index ea7383e2..f8d42863 100644 --- a/variants/minewsemi_me25ls01/target.h +++ b/variants/minewsemi_me25ls01/target.h @@ -23,7 +23,4 @@ extern VolatileRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/muziworks_r1_neo/target.cpp b/variants/muziworks_r1_neo/target.cpp index de889d43..68655c5d 100644 --- a/variants/muziworks_r1_neo/target.cpp +++ b/variants/muziworks_r1_neo/target.cpp @@ -26,21 +26,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/muziworks_r1_neo/target.h b/variants/muziworks_r1_neo/target.h index 53d7e03b..5bf3f268 100644 --- a/variants/muziworks_r1_neo/target.h +++ b/variants/muziworks_r1_neo/target.h @@ -16,7 +16,4 @@ extern DISPLAY_CLASS display; extern MomentaryButton user_btn; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/nano_g2_ultra/target.cpp b/variants/nano_g2_ultra/target.cpp index c5e7ebdf..69a2772c 100644 --- a/variants/nano_g2_ultra/target.cpp +++ b/variants/nano_g2_ultra/target.cpp @@ -25,22 +25,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - void NanoG2UltraSensorManager::start_gps() { MESH_DEBUG_PRINTLN("Starting GPS"); if (!gps_active) { diff --git a/variants/nano_g2_ultra/target.h b/variants/nano_g2_ultra/target.h index dcd63791..5c6ebee1 100644 --- a/variants/nano_g2_ultra/target.h +++ b/variants/nano_g2_ultra/target.h @@ -43,8 +43,5 @@ extern MomentaryButton user_btn; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/nibble_screen_connect/target.cpp b/variants/nibble_screen_connect/target.cpp index 248a788b..ceb9fe49 100644 --- a/variants/nibble_screen_connect/target.cpp +++ b/variants/nibble_screen_connect/target.cpp @@ -27,24 +27,8 @@ bool radio_init() { return radio.std_init(&spi); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); } -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - -mesh::LocalIdentity radio_new_identity() { - RadioNoiseListener rng(radio); - return mesh::LocalIdentity(&rng); -} - diff --git a/variants/nibble_screen_connect/target.h b/variants/nibble_screen_connect/target.h index 020cd434..dcbcf8e1 100644 --- a/variants/nibble_screen_connect/target.h +++ b/variants/nibble_screen_connect/target.h @@ -23,8 +23,5 @@ extern SensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); -mesh::LocalIdentity radio_new_identity(); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/promicro/target.cpp b/variants/promicro/target.cpp index ddcc2a53..b5a74c90 100644 --- a/variants/promicro/target.cpp +++ b/variants/promicro/target.cpp @@ -29,22 +29,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/promicro/target.h b/variants/promicro/target.h index 4b3de981..e577ab4e 100644 --- a/variants/promicro/target.h +++ b/variants/promicro/target.h @@ -24,8 +24,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/rak11310/target.cpp b/variants/rak11310/target.cpp index c66a2e44..1edd315e 100644 --- a/variants/rak11310/target.cpp +++ b/variants/rak11310/target.cpp @@ -12,24 +12,6 @@ VolatileRTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); SensorManager sensors; -bool radio_init() { - rtc_clock.begin(Wire); - - return radio.std_init(&SPI1); -} - -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - void radio_set_tx_power(int8_t dbm) { radio.setOutputPower(dbm); } diff --git a/variants/rak11310/target.h b/variants/rak11310/target.h index c21274b9..fd38e7ca 100644 --- a/variants/rak11310/target.h +++ b/variants/rak11310/target.h @@ -14,8 +14,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/rak3112/target.cpp b/variants/rak3112/target.cpp index 23be3ef8..9df1bf8f 100644 --- a/variants/rak3112/target.cpp +++ b/variants/rak3112/target.cpp @@ -39,22 +39,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/rak3112/target.h b/variants/rak3112/target.h index 72f13f32..f93cd539 100644 --- a/variants/rak3112/target.h +++ b/variants/rak3112/target.h @@ -24,8 +24,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/rak3401/target.cpp b/variants/rak3401/target.cpp index b9cb1ecc..5309e6b2 100644 --- a/variants/rak3401/target.cpp +++ b/variants/rak3401/target.cpp @@ -37,22 +37,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/rak3401/target.h b/variants/rak3401/target.h index 215be38c..00653e90 100644 --- a/variants/rak3401/target.h +++ b/variants/rak3401/target.h @@ -24,8 +24,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/rak3x72/target.cpp b/variants/rak3x72/target.cpp index 161c0145..e55543a3 100644 --- a/variants/rak3x72/target.cpp +++ b/variants/rak3x72/target.cpp @@ -55,22 +55,6 @@ bool radio_init() { return true; // success } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/rak3x72/target.h b/variants/rak3x72/target.h index 3ba1cf42..566f4fa0 100644 --- a/variants/rak3x72/target.h +++ b/variants/rak3x72/target.h @@ -50,7 +50,4 @@ extern VolatileRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/rak4631/target.cpp b/variants/rak4631/target.cpp index d2377c12..a41ba720 100644 --- a/variants/rak4631/target.cpp +++ b/variants/rak4631/target.cpp @@ -37,24 +37,7 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity } - diff --git a/variants/rak4631/target.h b/variants/rak4631/target.h index 51337c53..1529f904 100644 --- a/variants/rak4631/target.h +++ b/variants/rak4631/target.h @@ -24,8 +24,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/rak_wismesh_tag/target.cpp b/variants/rak_wismesh_tag/target.cpp index e52a12b2..cdf81f4f 100644 --- a/variants/rak_wismesh_tag/target.cpp +++ b/variants/rak_wismesh_tag/target.cpp @@ -33,22 +33,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/rak_wismesh_tag/target.h b/variants/rak_wismesh_tag/target.h index bc5a4921..fbe18d2d 100644 --- a/variants/rak_wismesh_tag/target.h +++ b/variants/rak_wismesh_tag/target.h @@ -21,8 +21,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/rpi_picow/target.cpp b/variants/rpi_picow/target.cpp index 568987ba..9318b7f0 100644 --- a/variants/rpi_picow/target.cpp +++ b/variants/rpi_picow/target.cpp @@ -18,22 +18,6 @@ bool radio_init() { return radio.std_init(&SPI1); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/rpi_picow/target.h b/variants/rpi_picow/target.h index 255d3067..eb918441 100644 --- a/variants/rpi_picow/target.h +++ b/variants/rpi_picow/target.h @@ -14,8 +14,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/sensecap_indicator-espnow/target.cpp b/variants/sensecap_indicator-espnow/target.cpp index 6674c180..c84d1883 100644 --- a/variants/sensecap_indicator-espnow/target.cpp +++ b/variants/sensecap_indicator-espnow/target.cpp @@ -29,18 +29,6 @@ bool radio_init() { return true; // success } -uint32_t radio_get_rng_seed() { - return millis() + radio_driver.intID(); // TODO: where to get some entropy? -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - // no-op -} - -void radio_set_tx_power(int8_t dbm) { - radio_driver.setTxPower(dbm); -} - // NOTE: as we are using the WiFi radio, the ESP_IDF will have enabled hardware RNG: // https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/random.html class ESP_RNG : public mesh::RNG { diff --git a/variants/sensecap_indicator-espnow/target.h b/variants/sensecap_indicator-espnow/target.h index a56dec7b..dab4575e 100644 --- a/variants/sensecap_indicator-espnow/target.h +++ b/variants/sensecap_indicator-espnow/target.h @@ -23,7 +23,4 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/sensecap_solar/target.cpp b/variants/sensecap_solar/target.cpp index 8b506cc6..46641517 100644 --- a/variants/sensecap_solar/target.cpp +++ b/variants/sensecap_solar/target.cpp @@ -25,22 +25,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/sensecap_solar/target.h b/variants/sensecap_solar/target.h index 243c4440..a1c01f13 100644 --- a/variants/sensecap_solar/target.h +++ b/variants/sensecap_solar/target.h @@ -15,8 +15,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/station_g2/target.cpp b/variants/station_g2/target.cpp index 65cc388d..8018c20e 100644 --- a/variants/station_g2/target.cpp +++ b/variants/station_g2/target.cpp @@ -40,22 +40,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/station_g2/target.h b/variants/station_g2/target.h index 9a361025..b4eadbba 100644 --- a/variants/station_g2/target.h +++ b/variants/station_g2/target.h @@ -24,8 +24,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/t1000-e/target.cpp b/variants/t1000-e/target.cpp index bbf453ca..42532827 100644 --- a/variants/t1000-e/target.cpp +++ b/variants/t1000-e/target.cpp @@ -74,22 +74,6 @@ bool radio_init() { return true; // success } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/t1000-e/target.h b/variants/t1000-e/target.h index d4e3c02c..db003cc5 100644 --- a/variants/t1000-e/target.h +++ b/variants/t1000-e/target.h @@ -41,7 +41,4 @@ extern VolatileRTCClock rtc_clock; extern T1000SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/tenstar_c3/target.cpp b/variants/tenstar_c3/target.cpp index 7a1794e6..909625ed 100644 --- a/variants/tenstar_c3/target.cpp +++ b/variants/tenstar_c3/target.cpp @@ -27,22 +27,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/tenstar_c3/target.h b/variants/tenstar_c3/target.h index b228b04e..b3ee6d17 100644 --- a/variants/tenstar_c3/target.h +++ b/variants/tenstar_c3/target.h @@ -15,8 +15,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/thinknode_m1/target.cpp b/variants/thinknode_m1/target.cpp index 934040e1..69306fc0 100644 --- a/variants/thinknode_m1/target.cpp +++ b/variants/thinknode_m1/target.cpp @@ -24,22 +24,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/thinknode_m1/target.h b/variants/thinknode_m1/target.h index 3882202b..ec1297be 100644 --- a/variants/thinknode_m1/target.h +++ b/variants/thinknode_m1/target.h @@ -43,8 +43,5 @@ extern ThinkNodeM1SensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/thinknode_m2/target.cpp b/variants/thinknode_m2/target.cpp index a8919034..ff0dd6cf 100644 --- a/variants/thinknode_m2/target.cpp +++ b/variants/thinknode_m2/target.cpp @@ -34,23 +34,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/thinknode_m2/target.h b/variants/thinknode_m2/target.h index ddaaeff7..37ede89e 100644 --- a/variants/thinknode_m2/target.h +++ b/variants/thinknode_m2/target.h @@ -24,9 +24,6 @@ extern SensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/thinknode_m3/target.cpp b/variants/thinknode_m3/target.cpp index 63ecdf76..1e6c2ad1 100644 --- a/variants/thinknode_m3/target.cpp +++ b/variants/thinknode_m3/target.cpp @@ -78,22 +78,6 @@ bool radio_init() { return true; // success } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/thinknode_m3/target.h b/variants/thinknode_m3/target.h index 4124761c..f2d34328 100644 --- a/variants/thinknode_m3/target.h +++ b/variants/thinknode_m3/target.h @@ -23,7 +23,4 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/thinknode_m5/target.cpp b/variants/thinknode_m5/target.cpp index e5908fdf..be534f67 100644 --- a/variants/thinknode_m5/target.cpp +++ b/variants/thinknode_m5/target.cpp @@ -41,23 +41,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/thinknode_m5/target.h b/variants/thinknode_m5/target.h index d10760e2..a613e390 100644 --- a/variants/thinknode_m5/target.h +++ b/variants/thinknode_m5/target.h @@ -27,9 +27,6 @@ extern PCA9557 expander; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/thinknode_m6/target.cpp b/variants/thinknode_m6/target.cpp index 01957362..de167194 100644 --- a/variants/thinknode_m6/target.cpp +++ b/variants/thinknode_m6/target.cpp @@ -28,22 +28,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/thinknode_m6/target.h b/variants/thinknode_m6/target.h index 221e0a7c..76188e58 100644 --- a/variants/thinknode_m6/target.h +++ b/variants/thinknode_m6/target.h @@ -25,8 +25,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/tiny_relay/target.cpp b/variants/tiny_relay/target.cpp index c05f552e..aed8a67c 100644 --- a/variants/tiny_relay/target.cpp +++ b/variants/tiny_relay/target.cpp @@ -57,25 +57,6 @@ bool radio_init() return true; // success } -uint32_t radio_get_rng_seed() -{ - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) -{ - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) -{ - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); diff --git a/variants/tiny_relay/target.h b/variants/tiny_relay/target.h index d1583712..4e2e4afa 100644 --- a/variants/tiny_relay/target.h +++ b/variants/tiny_relay/target.h @@ -53,7 +53,4 @@ extern VolatileRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/waveshare_rp2040_lora/target.cpp b/variants/waveshare_rp2040_lora/target.cpp index 907a37f5..ef47708f 100644 --- a/variants/waveshare_rp2040_lora/target.cpp +++ b/variants/waveshare_rp2040_lora/target.cpp @@ -28,22 +28,6 @@ bool radio_init() { return radio.std_init(NULL); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/waveshare_rp2040_lora/target.h b/variants/waveshare_rp2040_lora/target.h index 4590f0d1..a090931c 100644 --- a/variants/waveshare_rp2040_lora/target.h +++ b/variants/waveshare_rp2040_lora/target.h @@ -15,8 +15,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/wio-e5-dev/target.cpp b/variants/wio-e5-dev/target.cpp index 8d8069eb..680da631 100644 --- a/variants/wio-e5-dev/target.cpp +++ b/variants/wio-e5-dev/target.cpp @@ -52,22 +52,6 @@ bool radio_init() { return true; // success } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/wio-e5-dev/target.h b/variants/wio-e5-dev/target.h index 1d1fc5cb..5cb2a840 100644 --- a/variants/wio-e5-dev/target.h +++ b/variants/wio-e5-dev/target.h @@ -27,7 +27,4 @@ extern VolatileRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/wio-e5-mini/target.cpp b/variants/wio-e5-mini/target.cpp index 338f398d..92775d55 100644 --- a/variants/wio-e5-mini/target.cpp +++ b/variants/wio-e5-mini/target.cpp @@ -50,22 +50,6 @@ bool radio_init() { return true; // success } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/wio-e5-mini/target.h b/variants/wio-e5-mini/target.h index a4e5fb60..4807e0f7 100644 --- a/variants/wio-e5-mini/target.h +++ b/variants/wio-e5-mini/target.h @@ -58,7 +58,4 @@ extern VolatileRTCClock rtc_clock; extern WIOE5SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/wio-tracker-l1/target.cpp b/variants/wio-tracker-l1/target.cpp index 76626551..7a573258 100644 --- a/variants/wio-tracker-l1/target.cpp +++ b/variants/wio-tracker-l1/target.cpp @@ -33,22 +33,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/wio-tracker-l1/target.h b/variants/wio-tracker-l1/target.h index 72766e77..05bc7ff1 100644 --- a/variants/wio-tracker-l1/target.h +++ b/variants/wio-tracker-l1/target.h @@ -31,8 +31,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/wio_wm1110/target.cpp b/variants/wio_wm1110/target.cpp index 9be3061c..1bb7cec8 100644 --- a/variants/wio_wm1110/target.cpp +++ b/variants/wio_wm1110/target.cpp @@ -70,22 +70,6 @@ bool radio_init() { return true; // success } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/wio_wm1110/target.h b/variants/wio_wm1110/target.h index 8712a0ef..79504ab8 100644 --- a/variants/wio_wm1110/target.h +++ b/variants/wio_wm1110/target.h @@ -14,8 +14,5 @@ extern VolatileRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/xiao_c3/target.cpp b/variants/xiao_c3/target.cpp index 300ff60e..7f30dc8b 100644 --- a/variants/xiao_c3/target.cpp +++ b/variants/xiao_c3/target.cpp @@ -35,22 +35,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/xiao_c3/target.h b/variants/xiao_c3/target.h index 54a389f0..32f11862 100644 --- a/variants/xiao_c3/target.h +++ b/variants/xiao_c3/target.h @@ -14,8 +14,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/xiao_c6/target.h b/variants/xiao_c6/target.h index 4ec06ee1..c4cec063 100644 --- a/variants/xiao_c6/target.h +++ b/variants/xiao_c6/target.h @@ -15,8 +15,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/xiao_nrf52/target.cpp b/variants/xiao_nrf52/target.cpp index 9efe0015..ab6fe279 100644 --- a/variants/xiao_nrf52/target.cpp +++ b/variants/xiao_nrf52/target.cpp @@ -23,22 +23,6 @@ bool radio_init() { return radio.std_init(&SPI); } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/xiao_nrf52/target.h b/variants/xiao_nrf52/target.h index 956e8362..bb3d2a81 100644 --- a/variants/xiao_nrf52/target.h +++ b/variants/xiao_nrf52/target.h @@ -20,8 +20,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern EnvironmentSensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/xiao_rp2040/target.cpp b/variants/xiao_rp2040/target.cpp index 67a09fcc..fe2c62c3 100644 --- a/variants/xiao_rp2040/target.cpp +++ b/variants/xiao_rp2040/target.cpp @@ -28,22 +28,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/xiao_rp2040/target.h b/variants/xiao_rp2040/target.h index 94629b7c..6f035bda 100644 --- a/variants/xiao_rp2040/target.h +++ b/variants/xiao_rp2040/target.h @@ -15,8 +15,5 @@ extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/xiao_s3/target.cpp b/variants/xiao_s3/target.cpp index 014b2552..a7ae7dd8 100644 --- a/variants/xiao_s3/target.cpp +++ b/variants/xiao_s3/target.cpp @@ -35,21 +35,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/xiao_s3/target.h b/variants/xiao_s3/target.h index 93b27862..27eddd84 100644 --- a/variants/xiao_s3/target.h +++ b/variants/xiao_s3/target.h @@ -24,7 +24,4 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); diff --git a/variants/xiao_s3_wio/target.cpp b/variants/xiao_s3_wio/target.cpp index ca824d38..8a975959 100644 --- a/variants/xiao_s3_wio/target.cpp +++ b/variants/xiao_s3_wio/target.cpp @@ -35,22 +35,6 @@ bool radio_init() { #endif } -uint32_t radio_get_rng_seed() { - return radio.random(0x7FFFFFFF); -} - -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { - radio.setFrequency(freq); - radio.setSpreadingFactor(sf); - radio.setBandwidth(bw); - radio.setCodingRate(cr); - radio_driver.updatePreamble(sf); -} - -void radio_set_tx_power(int8_t dbm) { - radio.setOutputPower(dbm); -} - mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity diff --git a/variants/xiao_s3_wio/target.h b/variants/xiao_s3_wio/target.h index d8502863..29c5f281 100644 --- a/variants/xiao_s3_wio/target.h +++ b/variants/xiao_s3_wio/target.h @@ -24,8 +24,5 @@ extern EnvironmentSensorManager sensors; #endif bool radio_init(); -uint32_t radio_get_rng_seed(); -void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); -void radio_set_tx_power(int8_t dbm); mesh::LocalIdentity radio_new_identity(); From 5a509752a7b60d1c792fca61e10ebbf49fb1272e Mon Sep 17 00:00:00 2001 From: liamcottle Date: Sat, 2 May 2026 01:47:35 +1200 Subject: [PATCH 37/46] don't play startup tune if buzzer pref disabled --- examples/companion_radio/ui-new/UITask.cpp | 1 + examples/companion_radio/ui-orig/UITask.cpp | 1 + src/helpers/ui/buzzer.cpp | 1 - 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index 49c75a5b..6f363d7f 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -575,6 +575,7 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no #ifdef PIN_BUZZER buzzer.begin(); buzzer.quiet(_node_prefs->buzzer_quiet); + buzzer.startup(); #endif #ifdef PIN_VIBRATION diff --git a/examples/companion_radio/ui-orig/UITask.cpp b/examples/companion_radio/ui-orig/UITask.cpp index 3ad36fb0..12a374d9 100644 --- a/examples/companion_radio/ui-orig/UITask.cpp +++ b/examples/companion_radio/ui-orig/UITask.cpp @@ -57,6 +57,7 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no #ifdef PIN_BUZZER buzzer.begin(); buzzer.quiet(_node_prefs->buzzer_quiet); + buzzer.startup(); #endif // Initialize digital button if available diff --git a/src/helpers/ui/buzzer.cpp b/src/helpers/ui/buzzer.cpp index ca469d17..eb9b695b 100644 --- a/src/helpers/ui/buzzer.cpp +++ b/src/helpers/ui/buzzer.cpp @@ -12,7 +12,6 @@ void genericBuzzer::begin() { quiet(false); pinMode(PIN_BUZZER, OUTPUT); digitalWrite(PIN_BUZZER, LOW); // need to pull low by default to avoid extreme power draw - startup(); } void genericBuzzer::play(const char *melody) { From e56c1b3d5875c64edb939dc2041d2680e3e0ffac Mon Sep 17 00:00:00 2001 From: Josiah VanderZee Date: Sun, 3 May 2026 18:34:19 -0500 Subject: [PATCH 38/46] Do not perform redundant reset on ST7789 displays The `::init` method in the Adafruit ST7789 library is responsible to initialize the device. This includes performing a reset, which can be found in the Adafruit source for `Adafruit_SPITFT`. Before this change, MeshCore performed its own ST7789 display reset sequence, which consisted of three steps. * Pull reset low * Wait 10ms * Pull reset high Importantly, there was no fixed delay after pulling reset high. The ST7789 driver requires a delay (TRT) of 5ms in Sleep In Mode and 120ms in Sleep Out Mode before it will properly receive commands. When `Adafruit_SPITFT` resets the device after MeshCore has already reset it, the mandatory time may not have elapsed, leading to strange behavior. In the author's case, this issue caused the initial `fillScreen` to fail, such that the display showed an uninitialized framebuffer. This removes the MeshCore delay, leaving the responsibility of reset to `Adafruit_SPITFT`, where they have the correct delays in place with extra safety margin. The change was briefly tested by Josiah VanderZee and Ben Zignego on a custom hardware build using an nRF52840 Dongle and an Adafruit 4311 TFT display. The user button seemed to behave strangely, but the display looked correct. --- src/helpers/ui/ST7789LCDDisplay.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/helpers/ui/ST7789LCDDisplay.cpp b/src/helpers/ui/ST7789LCDDisplay.cpp index 9fd0b23d..dc75e963 100644 --- a/src/helpers/ui/ST7789LCDDisplay.cpp +++ b/src/helpers/ui/ST7789LCDDisplay.cpp @@ -27,12 +27,6 @@ bool ST7789LCDDisplay::begin() { pinMode(PIN_TFT_LEDA_CTL, OUTPUT); digitalWrite(PIN_TFT_LEDA_CTL, HIGH); } - if (PIN_TFT_RST != -1) { - pinMode(PIN_TFT_RST, OUTPUT); - digitalWrite(PIN_TFT_RST, LOW); - delay(10); - digitalWrite(PIN_TFT_RST, HIGH); - } // Im not sure if this is just a t-deck problem or not, if your display is slow try this. #if defined(LILYGO_TDECK) || defined(HELTEC_LORA_V4_TFT) @@ -166,4 +160,4 @@ uint16_t ST7789LCDDisplay::getTextWidth(const char* str) { void ST7789LCDDisplay::endFrame() { // display.display(); -} \ No newline at end of file +} From 235706a22a654ae3678a6f4d39146484e56d7d53 Mon Sep 17 00:00:00 2001 From: Kenneth Privitt Date: Tue, 5 May 2026 11:20:36 -0700 Subject: [PATCH 39/46] Incorrect time_t TypeDef in RAK12035_SoilMoisture --- src/helpers/sensors/RAK12035_SoilMoisture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/sensors/RAK12035_SoilMoisture.cpp b/src/helpers/sensors/RAK12035_SoilMoisture.cpp index 4daeaade..4a17a1b2 100644 --- a/src/helpers/sensors/RAK12035_SoilMoisture.cpp +++ b/src/helpers/sensors/RAK12035_SoilMoisture.cpp @@ -431,7 +431,7 @@ bool RAK12035_SoilMoisture::sensor_on() delay(10); // Wait for the sensor code to complete initialization */ uint8_t v = 0; - time_t timeout = millis(); + uint32_t timeout = millis(); while ((!query_sensor())) //Wait for sensor to respond to I2C commands, { //indicating it is ready if ((millis() - timeout) > 50){ //0.5 second timeout for sensor to respond From 68ab882cd59e8fbed508c2a0594e63dda0b5bc3b Mon Sep 17 00:00:00 2001 From: taco Date: Wed, 6 May 2026 23:53:35 +1000 Subject: [PATCH 40/46] fix CustomLFS version pinning --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 5c6072b4..b079cec9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -92,7 +92,7 @@ build_flags = ${arduino_base.build_flags} -D EXTRAFS=1 lib_deps = ${arduino_base.lib_deps} - https://github.com/oltaco/CustomLFS @ 0.2.1 + https://github.com/oltaco/CustomLFS#0.2.1 ; ----------------- RP2040 --------------------- [rp2040_base] From 3bde089bdb15cc9a676341ddf9d96bfa2f762d9c Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Thu, 7 May 2026 00:31:15 +0200 Subject: [PATCH 41/46] Gate PIN_GPS_EN Do not reference it unconditionally --- src/helpers/sensors/EnvironmentSensorManager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index 19472406..78a71211 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -708,9 +708,11 @@ bool EnvironmentSensorManager::gpsIsAwake(uint8_t ioPin){ return true; } else if (Serial1.available()) { MESH_DEBUG_PRINTLN("Serial GPS init correctly and is turned on"); +#ifdef PIN_GPS_EN if(PIN_GPS_EN){ gpsResetPin = PIN_GPS_EN; } +#endif serialGPSFlag = true; gps_active = true; gps_detected = true; From 314d777b42b63e8ff98d82665ac51d038f0d5293 Mon Sep 17 00:00:00 2001 From: tuzzmaniandevil Date: Thu, 7 May 2026 00:03:09 +0000 Subject: [PATCH 42/46] Enhance KissModem frame processing and timeout handling --- examples/kiss_modem/KissModem.cpp | 23 +++++++++++++++++++++-- examples/kiss_modem/KissModem.h | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/examples/kiss_modem/KissModem.cpp b/examples/kiss_modem/KissModem.cpp index 5e8b00d5..03ea7d6b 100644 --- a/examples/kiss_modem/KissModem.cpp +++ b/examples/kiss_modem/KissModem.cpp @@ -129,6 +129,9 @@ void KissModem::processFrame() { memcpy(_pending_tx, data, data_len); _pending_tx_len = data_len; _has_pending_tx = true; + } else if (_has_pending_tx) { + uint8_t result = 0x00; + writeHardwareFrame(HW_RESP_TX_DONE, &result, 1); } break; @@ -257,6 +260,7 @@ void KissModem::processTx() { _tx_timer = millis(); _tx_state = TX_DELAY; } else { + _tx_timer = millis(); _tx_state = TX_WAIT_CLEAR; } } @@ -273,19 +277,28 @@ void KissModem::processTx() { _tx_timer = millis(); _tx_state = TX_SLOT_WAIT; } + } else if (millis() - _tx_timer >= _radio.getEstAirtimeFor(KISS_MAX_PACKET_SIZE) * KISS_TX_TIMEOUT_FACTOR) { + _tx_timer = millis(); + _tx_state = TX_DELAY; } break; case TX_SLOT_WAIT: if (millis() - _tx_timer >= (uint32_t)_slottime * 10) { + _tx_timer = millis(); _tx_state = TX_WAIT_CLEAR; } break; case TX_DELAY: if (millis() - _tx_timer >= (uint32_t)_txdelay * 10) { - _radio.startSendRaw(_pending_tx, _pending_tx_len); - _tx_state = TX_SENDING; + if (_radio.startSendRaw(_pending_tx, _pending_tx_len)) { + _tx_timer = millis(); + _tx_state = TX_SENDING; + } else { + _has_pending_tx = false; + _tx_state = TX_IDLE; + } } break; @@ -296,6 +309,12 @@ void KissModem::processTx() { writeHardwareFrame(HW_RESP_TX_DONE, &result, 1); _has_pending_tx = false; _tx_state = TX_IDLE; + } else if (millis() - _tx_timer >= _radio.getEstAirtimeFor(_pending_tx_len) * KISS_TX_TIMEOUT_FACTOR) { + _radio.onSendFinished(); + uint8_t result = 0x00; + writeHardwareFrame(HW_RESP_TX_DONE, &result, 1); + _has_pending_tx = false; + _tx_state = TX_IDLE; } break; } diff --git a/examples/kiss_modem/KissModem.h b/examples/kiss_modem/KissModem.h index 60566add..66ce4424 100644 --- a/examples/kiss_modem/KissModem.h +++ b/examples/kiss_modem/KissModem.h @@ -26,6 +26,7 @@ #define KISS_DEFAULT_TXDELAY 50 #define KISS_DEFAULT_PERSISTENCE 63 #define KISS_DEFAULT_SLOTTIME 10 +#define KISS_TX_TIMEOUT_FACTOR 3/2 // 1.5x estimated airtime #define HW_CMD_GET_IDENTITY 0x01 #define HW_CMD_GET_RANDOM 0x02 From 6979326340c3ff800d9a20642ccfa006f03a2a63 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Thu, 7 May 2026 16:51:03 +1000 Subject: [PATCH 43/46] * CMD_SET_FLOOD_SCOPE_KEY, now with second variant for explicitly sending un-scoped * FIRMWARE_VER_CODE bumped to 12 --- examples/companion_radio/MyMesh.cpp | 33 ++++++++++++++++++++--------- examples/companion_radio/MyMesh.h | 3 ++- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index 71ba4abe..d439b2cb 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -495,19 +495,27 @@ void MyMesh::sendFloodScoped(const TransportKey& scope, mesh::Packet* pkt, uint3 void MyMesh::sendFloodScoped(const ContactInfo& recipient, mesh::Packet* pkt, uint32_t delay_millis) { // TODO: dynamic send_scope, depending on recipient and current 'home' Region - TransportKey default_scope; - memcpy(&default_scope.key, _prefs.default_scope_key, sizeof(default_scope.key)); + if (send_unscoped) { + sendFlood(pkt, delay_millis, _prefs.path_hash_mode + 1); // app has explicitly requested un-scoped + } else { + TransportKey default_scope; + memcpy(&default_scope.key, _prefs.default_scope_key, sizeof(default_scope.key)); - auto scope = send_scope.isNull() ? &default_scope : &send_scope; - sendFloodScoped(*scope, pkt, delay_millis); + auto scope = send_scope.isNull() ? &default_scope : &send_scope; + sendFloodScoped(*scope, pkt, delay_millis); + } } void MyMesh::sendFloodScoped(const mesh::GroupChannel& channel, mesh::Packet* pkt, uint32_t delay_millis) { // TODO: have per-channel send_scope - TransportKey default_scope; - memcpy(&default_scope.key, _prefs.default_scope_key, sizeof(default_scope.key)); + if (send_unscoped) { + sendFlood(pkt, delay_millis, _prefs.path_hash_mode + 1); // app has explicitly requested un-scoped + } else { + TransportKey default_scope; + memcpy(&default_scope.key, _prefs.default_scope_key, sizeof(default_scope.key)); - auto scope = send_scope.isNull() ? &default_scope : &send_scope; - sendFloodScoped(*scope, pkt, delay_millis); + auto scope = send_scope.isNull() ? &default_scope : &send_scope; + sendFloodScoped(*scope, pkt, delay_millis); + } } void MyMesh::onMessageRecv(const ContactInfo &from, mesh::Packet *pkt, uint32_t sender_timestamp, @@ -856,6 +864,7 @@ MyMesh::MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMe dirty_contacts_expiry = 0; memset(advert_paths, 0, sizeof(advert_paths)); memset(send_scope.key, 0, sizeof(send_scope.key)); + send_unscoped = false; // defaults memset(&_prefs, 0, sizeof(_prefs)); @@ -1885,10 +1894,14 @@ void MyMesh::handleCmdFrame(size_t len) { } } else if (cmd_frame[0] == CMD_SET_FLOOD_SCOPE_KEY && len >= 2 && cmd_frame[1] == 0) { if (len >= 2 + 16) { - memcpy(send_scope.key, &cmd_frame[2], sizeof(send_scope.key)); // set curr scope TransportKey + memcpy(send_scope.key, &cmd_frame[2], sizeof(send_scope.key)); // set scope override TransportKey } else { - memset(send_scope.key, 0, sizeof(send_scope.key)); // set scope to null + memset(send_scope.key, 0, sizeof(send_scope.key)); // reset scope override } + send_unscoped = false; + writeOKFrame(); + } else if (cmd_frame[0] == CMD_SET_FLOOD_SCOPE_KEY && len >= 2 && cmd_frame[1] == 1) { // ver 12+ + send_unscoped = true; writeOKFrame(); } else if (cmd_frame[0] == CMD_SET_DEFAULT_FLOOD_SCOPE && len >= 1) { if (len >= 1+31+16) { diff --git a/examples/companion_radio/MyMesh.h b/examples/companion_radio/MyMesh.h index aeff591c..f6a4ce40 100644 --- a/examples/companion_radio/MyMesh.h +++ b/examples/companion_radio/MyMesh.h @@ -5,7 +5,7 @@ #include "AbstractUITask.h" /*------------ Frame Protocol --------------*/ -#define FIRMWARE_VER_CODE 11 +#define FIRMWARE_VER_CODE 12 #ifndef FIRMWARE_BUILD_DATE #define FIRMWARE_BUILD_DATE "19 Apr 2026" @@ -215,6 +215,7 @@ private: uint32_t _active_ble_pin; bool _iter_started; bool _cli_rescue; + bool send_unscoped; // force un-scoped flood (instead of using send_scope) char cli_command[80]; uint8_t app_target_ver; uint8_t *sign_data; From 4b6b8abe7af77d1295a271a2db1a850227ee39dd Mon Sep 17 00:00:00 2001 From: Josiah VanderZee Date: Thu, 7 May 2026 07:13:16 -0500 Subject: [PATCH 44/46] Add missing Wire.h include for sensors This slipped through in PR #2327 and I noticed because the TechoBoard.h for my variant doesn't include the Wire header, so the source file in question does not coincidentally obtain a copy. --- src/helpers/sensors/EnvironmentSensorManager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index c85d6f83..ea9234c0 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -1,5 +1,7 @@ #include "EnvironmentSensorManager.h" +#include + #if ENV_PIN_SDA && ENV_PIN_SCL #define TELEM_WIRE &Wire1 // Use Wire1 as the I2C bus for Environment Sensors #else From ffa76016ff7cef85de4e7d32c5b7f205fe8e0c4a Mon Sep 17 00:00:00 2001 From: tuzzmaniandevil Date: Fri, 8 May 2026 11:14:22 +1200 Subject: [PATCH 45/46] Address two comments from PR --- examples/kiss_modem/KissModem.cpp | 5 +++-- examples/kiss_modem/KissModem.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/kiss_modem/KissModem.cpp b/examples/kiss_modem/KissModem.cpp index 03ea7d6b..eeab1501 100644 --- a/examples/kiss_modem/KissModem.cpp +++ b/examples/kiss_modem/KissModem.cpp @@ -130,8 +130,7 @@ void KissModem::processFrame() { _pending_tx_len = data_len; _has_pending_tx = true; } else if (_has_pending_tx) { - uint8_t result = 0x00; - writeHardwareFrame(HW_RESP_TX_DONE, &result, 1); + writeHardwareError(HW_ERR_TX_BUSY); } break; @@ -296,6 +295,8 @@ void KissModem::processTx() { _tx_timer = millis(); _tx_state = TX_SENDING; } else { + uint8_t result = 0x00; + writeHardwareFrame(HW_RESP_TX_DONE, &result, 1); _has_pending_tx = false; _tx_state = TX_IDLE; } diff --git a/examples/kiss_modem/KissModem.h b/examples/kiss_modem/KissModem.h index 66ce4424..bbe99d6d 100644 --- a/examples/kiss_modem/KissModem.h +++ b/examples/kiss_modem/KissModem.h @@ -72,6 +72,7 @@ #define HW_ERR_MAC_FAILED 0x04 #define HW_ERR_UNKNOWN_CMD 0x05 #define HW_ERR_ENCRYPT_FAILED 0x06 +#define HW_ERR_TX_BUSY 0x07 #define KISS_FIRMWARE_VERSION 1 From 841db565958633257346fa2dd774e27e7e7ca5ef Mon Sep 17 00:00:00 2001 From: liamcottle Date: Fri, 8 May 2026 20:16:45 +1200 Subject: [PATCH 46/46] add build flag to configure allowed repeat freq range --- examples/companion_radio/MyMesh.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index d439b2cb..c67bb68c 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -982,9 +982,13 @@ struct FreqRange { }; static FreqRange repeat_freq_ranges[] = { + #ifdef ALLOWED_REPEAT_FREQ_RANGE + ALLOWED_REPEAT_FREQ_RANGE + #else { 433000, 433000 }, { 869000, 869000 }, { 918000, 918000 } + #endif }; bool MyMesh::isValidClientRepeatFreq(uint32_t f) const {