From 534a0c97a7f36fe2caffd1ac111e3f38f6d7fdd4 Mon Sep 17 00:00:00 2001 From: overkillfpv Date: Thu, 5 Mar 2026 21:39:14 +1100 Subject: [PATCH 01/49] 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 2216ca8f39..9cc7318af5 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/49] 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 9e783a955b..e62acaffe9 100644 --- a/src/helpers/radiolib/CustomLLCC68Wrapper.h +++ b/src/helpers/radiolib/CustomLLCC68Wrapper.h @@ -20,6 +20,7 @@ class CustomLLCC68Wrapper : public RadioLibWrapper { 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 b1f68080b5..8cfb0906d5 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 be3a9f8dd6..c5b0423396 100644 --- a/src/helpers/radiolib/CustomLR1110Wrapper.h +++ b/src/helpers/radiolib/CustomLR1110Wrapper.h @@ -19,10 +19,11 @@ class CustomLR1110Wrapper : public RadioLibWrapper { 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 e3e5202949..cccdc0437c 100644 --- a/src/helpers/radiolib/CustomSTM32WLxWrapper.h +++ b/src/helpers/radiolib/CustomSTM32WLxWrapper.h @@ -21,6 +21,7 @@ class CustomSTM32WLxWrapper : public RadioLibWrapper { 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 5856720b9e..ad140b6618 100644 --- a/src/helpers/radiolib/CustomSX1262Wrapper.h +++ b/src/helpers/radiolib/CustomSX1262Wrapper.h @@ -20,6 +20,7 @@ class CustomSX1262Wrapper : public RadioLibWrapper { 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 5149fc431f..0c97752efe 100644 --- a/src/helpers/radiolib/CustomSX1268Wrapper.h +++ b/src/helpers/radiolib/CustomSX1268Wrapper.h @@ -20,6 +20,7 @@ class CustomSX1268Wrapper : public RadioLibWrapper { 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 282579906a..fa613c8e78 100644 --- a/src/helpers/radiolib/CustomSX1276Wrapper.h +++ b/src/helpers/radiolib/CustomSX1276Wrapper.h @@ -19,4 +19,5 @@ class CustomSX1276Wrapper : public RadioLibWrapper { 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 9cc7318af5..9260e6df54 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 b338b03a48..c9791a4b1e 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -38,6 +38,7 @@ class RadioLibWrapper : public mesh::Radio { } 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/49] 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 9260e6df54..883cc62315 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 c9791a4b1e..0dbc88973c 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -11,6 +11,7 @@ class RadioLibWrapper : public mesh::Radio { 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 @@ class RadioLibWrapper : public mesh::Radio { 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/49] 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 c5b0423396..2f2cc24c99 100644 --- a/src/helpers/radiolib/CustomLR1110Wrapper.h +++ b/src/helpers/radiolib/CustomLR1110Wrapper.h @@ -19,7 +19,7 @@ class CustomLR1110Wrapper : public RadioLibWrapper { 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 883cc62315..18251e435a 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 0dbc88973c..8e266deefa 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -40,6 +40,7 @@ class RadioLibWrapper : public mesh::Radio { 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/49] 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 18251e435a..cc1dc00143 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/49] 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 cc1dc00143..85f3a935db 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 8e266deefa..66c8aa62da 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -41,6 +41,7 @@ class RadioLibWrapper : public mesh::Radio { 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 501f560be8..9e656cc2dc 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 f76bb979ab..6ec1915f8b 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 5cc621a13a..fad39a27f4 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 c9233431cb..70b6ee35d7 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 b0c9630cf2..856ea0afe8 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 9852b68f8d..776f581348 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 6a30a4d18e..3658717795 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 d22f8b8cfc..c39ca35c59 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 f801bacb94..95cd9c9b86 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 c2e26b20d7..11ae4a600d 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 c5a0475281..b29f04e4a5 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 cdd2535e86..bedd737c65 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 54fc05e891..242ad60631 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 06f548fc0e..4455435f5c 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 48244e1722..5d7e8b3fac 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 be20cfb436..ca128f7c44 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 4f6befc609..6b48be6791 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 e2e183a709..4cc164960c 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 284811881c..e3fb363ca0 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 e7fe07a0c4..a62724fbdd 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 8cb6bdfa31..22f98cd9c5 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 f85049d7c9..11ceaf742b 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 5fe82e111d..fca380f1cc 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 6fec6f5831..a47e23c47b 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 731ecfd86b..0e36206dee 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 12d222ff78..7db5079dc6 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 40a94526ed..b4240dd2a0 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 3566fbe482..5a1a545d4f 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 ead62e7978..3a14abd02a 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 6538ef4840..9a71d9a833 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 6fabb31742..ee01f668fc 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 0edd440309..ddcb29eb0a 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 9188db1741..ad57feb925 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 fcec194190..c67663d64d 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 aad10c5050..b7b77f19e1 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 6edaaad7ac..9cebae0de3 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 61eab91c29..5db29f281d 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 67432998a0..f0cb3e616b 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 6cddfce519..61b2201eb0 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 ec4fc28c00..e9ae88df3b 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 48e7f42284..161c0145e5 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 ea6a2bd4a5..4d6ff30b52 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 9646375e60..284aa40e5c 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 e3d4bf0900..8758355387 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 2c2ff0dc70..8a2bad06f7 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 026b25de72..dd74ae4123 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 da8fa48bb3..bbf453caf7 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 d4f189b52f..2b7aa00c0d 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 ec2438d404..83c9f7e396 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 e7e36d05f1..a7b873a6e3 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 ca2b0aa067..547584ea13 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 a7a049ef4f..f617e0e44f 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 36ca861805..346e9c2d1b 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 313dfaa941..c05f552efd 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 a9121b0c35..9773f9b5c4 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 3e59b6cee7..8d8069ebf3 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 2e95ad6d1f..338f398dfe 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 4575a76c85..40bf61ae1c 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 457d5bda2c..9be3061c3d 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 f8ee3d92c9..ee0fc049fa 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 5710c4ccb6..dc62c20ecc 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 a8f4162eab..1236b935d5 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 6c9a91434b..8a0f650801 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 50981ab64a..82f870a9ac 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/49] 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 | 729 +++++++++--------- .../sensors/EnvironmentSensorManager.h | 34 +- 2 files changed, 390 insertions(+), 373 deletions(-) diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index 19472406d8..f61978e98d 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,381 +165,414 @@ class RAK12500LocationProvider : public LocationProvider { static RAK12500LocationProvider RAK12500_provider; #endif -bool EnvironmentSensorManager::begin() { - #if ENV_INCLUDE_GPS - #ifdef RAK_WISBLOCK_GPS - rakGPSInit(); //probe base board/sockets for GPS - #else - initBasicGPS(); - #endif - #endif - - #if ENV_PIN_SDA && ENV_PIN_SCL - #ifdef NRF52_PLATFORM - Wire1.setPins(ENV_PIN_SDA, ENV_PIN_SCL); - Wire1.setClock(100000); - Wire1.begin(); - #else - Wire1.begin(ENV_PIN_SDA, ENV_PIN_SCL, 100000); - #endif - 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); +// ============================================================ +// 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); } - #endif +} - #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 +// ============================================================ +// 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_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_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 - #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); +#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 +} +#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); +#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 +} +#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_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_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_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); +#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 +} +#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()); +#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 - for(int i = 0; i < 3; i++) { - INA3221.setShuntResistance(i, TELEM_INA3221_SHUNT_VALUE); +#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++; } - INA3221_initialized = true; - } else { - INA3221_initialized = false; - MESH_DEBUG_PRINTLN("INA3221 was not found at I2C address %02X", TELEM_INA3221_ADDRESS); } - #endif +} +#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_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 - 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_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 - 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_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 - 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_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 - 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_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 - #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 +#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 - 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; +#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 { - RAK12035_initialized = false; - MESH_DEBUG_PRINTLN("RAK12035 was not found at I2C address %02X", TELEM_RAK12035_ADDRESS); +#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 - - return true; } +#endif -bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) { - next_available_channel = TELEM_CHANNEL_SELF + 1; +// ============================================================ +// 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); +}; - 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 - } +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 +}; - if (requester_permissions & TELEM_PERM_ENVIRONMENT) { +static const size_t SENSOR_TABLE_SIZE = (sizeof(SENSOR_TABLE) / sizeof(SENSOR_TABLE[0])) - 1; - #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 +// ============================================================ +// 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. +// ============================================================ - #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 +bool EnvironmentSensorManager::begin() { + #if ENV_INCLUDE_GPS + #ifdef RAK_WISBLOCK_GPS + rakGPSInit(); + #else + initBasicGPS(); + #endif + #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)); - } - } + #if ENV_PIN_SDA && ENV_PIN_SCL + #ifdef NRF52_PLATFORM + Wire1.setPins(ENV_PIN_SDA, ENV_PIN_SCL); + Wire1.setClock(100000); + Wire1.begin(); + #else + Wire1.begin(ENV_PIN_SDA, ENV_PIN_SCL, 100000); #endif + MESH_DEBUG_PRINTLN("Second I2C initialized on pins SDA: %d SCL: %d", ENV_PIN_SDA, ENV_PIN_SCL); + #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)); + // Scan the I2C bus before touching any sensor library. + bool detected[128] = {}; + scanI2CBus(TELEM_WIRE, detected); + + // 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; } - #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); + 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; } - #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); - } + 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 }; } - #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 + return true; +} - #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 +// ============================================================ +// querySensors() — GPS stays on channel 1; each active sensor +// gets the next available channel in the order it was +// initialized. +// ============================================================ - #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); - next_available_channel++; - } - #endif +bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) { + next_available_channel = TELEM_CHANNEL_SELF + 1; - #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 (requester_permissions & TELEM_PERM_LOCATION && gps_active) { + telemetry.addGPS(TELEM_CHANNEL_SELF, node_lat, node_lon, node_altitude); + } - #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); + if (requester_permissions & TELEM_PERM_ENVIRONMENT) { + 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_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 32413ebc03..bb3dded3f1 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 @@ class EnvironmentSensorManager : public SensorManager { #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/49] 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 aabbcf000b..effef38ccd 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 277331381e11ad70e0c62e58488252649e919c0c Mon Sep 17 00:00:00 2001 From: Kevin Le Date: Fri, 24 Apr 2026 11:56:06 +0700 Subject: [PATCH 09/49] 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 0000000000..288fcf6262 --- /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 0000000000..bc00022048 --- /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 0000000000..014b25529d --- /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 0000000000..93b2786295 --- /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 10/49] 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 bbad1e40f0..fc2ad32da6 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, 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. + +--- + +### 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 +``` -**Response**: `PACKET_OK` (0x00) on success +**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), + } +``` --- -### 6. Get Message +### 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 ece494f291..432c0f1233 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 11/49] 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 0000000000..e3af3aafbf --- /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 ebad1f6f59..70007c7b80 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 864e5e1ffe..35b3534e80 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 0000000000..678b7c13b1 --- /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 0000000000..b6e551a077 --- /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 0000000000..195a302973 --- /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 0000000000..fec3ae4877 --- /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 12/49] 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 35b3534e80..35a985f006 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 13/49] 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 3d2d4a3ec5..b3693a58be 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 14/49] 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 d713176d67..da7964c9e6 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 15/49] 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 ffb042cfba..83e73332cd 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 661da5e4e4..479083149b 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 16/49] 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 fc2ad32da6..8129bc903e 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 94ad1efda1..c4715c5eb6 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 432c0f1233..ece494f291 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 17/49] 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 8129bc903e..9cc610ff39 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 18/49] 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 acb4632581..6a85143887 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 19/49] 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 94a8ee3efa..dd93098c0f 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -57,13 +57,21 @@ class SplashScreen : public UIScreen { 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 20/49] 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 42bc14d4a5..640a1d2d10 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 21/49] 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 0e78fee005..757ea1dc60 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 22/49] 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 116a1f2598..957c38025b 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 23/49] 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 864e5e1ffe..b10b317926 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 b82ceb7ea8..55ee21576e 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 317537a9e7..390b060530 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 24/49] 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 b43bffb5db..0000000000 --- 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 b10b317926..cc1518a727 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 25/49] 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 cc1518a727..6a3c28c367 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 26/49] 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 dacd8d34e5..91e62243c1 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 27/49] 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 3507959297..bc7508a871 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 d807b9782b..15fe761ba5 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 1467f0fa3d..2baac2561b 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 cede9c97c0..b3e894174a 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 8a947bce74..af153b8fc2 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 ef30829d5c..f3510b74aa 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 6b7bfd4eab..dfa2ff641f 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 910385ecdf..0179d9658c 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 395e22ea54..123edd91c4 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 475ae86805..6e0eaffc48 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 7bfbac85a7..92d641a357 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 19b05f3ce4..14155f5ead 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 b985030f79..135babb1a2 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 4b03403284..411fee8518 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 e0a8f5fab6..69293d7070 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 956b1ec771..d57c2113f0 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 99f6f7e13c..c103dd8d53 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 803ee683e0..a70a93a508 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 87632f32eb..fabf38272d 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 c6fe657d47..48723d169a 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 9f48cd41d0..51b602e403 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 d631174d90..e72f83ce0d 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 e95c637500..06e39e84c3 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 b82ceb7ea8..8aa407a206 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 1fefceceb3..54990117cc 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 5a7ece2cbd..5df632020e 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 7c8453077f..c7a595520e 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 d3bc7c9978..77b39304ab 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 3562c40e94..6853a232bd 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 ffee37a969..845dd41500 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 a8408afa43..745d8ff53d 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 e2172b1dab..5df77f95cb 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 8861685824..d3408f95a3 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 b06a0b7cb9..3acfa7615d 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 3641f12705..f710d0700f 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 84c6562afa..94083eb486 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 015c2ca4be..52a0d83523 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 18b64ac329..2006a1801f 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 0d5de517d4..c5439c88f4 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 dacd8d34e5..ab60988233 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 39ef8728fd..3dbecf1e84 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 116a1f2598..fa1b5ef1c7 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 8a4e63cabc..a496a2fe68 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 317537a9e7..a0477e1710 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 d55376270a..3019f9c55c 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 b4165bb2b4..9cd32c4b4d 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 3d2d4a3ec5..b50140977b 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 12ea413ab9..f966786087 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 081cb0d077..29124daf49 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 2d261b25ae..9253d36f65 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 87e77152b8..6432b52386 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 429390c486..fb88e3347a 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 183a56840b..e798882366 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 397bf8e30f..356edfee69 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 a765d9c7e5..9901550178 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 88fd487aa6..0a3d4eda92 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 16df472a22..8572d1ebe0 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 2bd34f3186..6fe9043668 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 ed17872759..82cb251fdb 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 880f238f2f..36658d824d 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 d7e63c83e3..22bdc3c837 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 f589ea0323..82f01331bb 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 42c83477b7..2c74baded3 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 6c1e8f634a..7bb175bb9a 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 ec65e706b3..a7eac916b0 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 c5254b46c9..c0e8458d0e 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 717be7b9a0..9f504b8ed0 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 e5d652c327..9a0fdaf4a2 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 13d406792b..db8c5a9486 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 28/49] 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 94a8ee3efa..e06a6ecc3b 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 @@ class HomeScreen : public UIScreen { 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 @@ class HomeScreen : public UIScreen { } 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 @@ class HomeScreen : public UIScreen { 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 b3693a58be..1246b72588 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 29/49] 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 1246b72588..d94db6a598 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 30/49] 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 fe61b7e441..2c50b74289 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 fe61b7e441..2c50b74289 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 7545296503..13225bd56b 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 31/49] 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 fb698228ed..9a2c6fe699 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 32/49] 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 ee5d5e025a..424b16c175 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 33/49] add comments --- platformio.ini | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platformio.ini b/platformio.ini index 6a3c28c367..ba27abb9c2 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 34/49] 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 fb698228ed..dd2626ccc1 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 3edc0a6953..c04eb6aa22 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 35/49] * 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 e8c1914bad..71ba4abeb6 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 876dc9c33c..80e9da3472 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 bc7508a871..e497aa98f4 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 666f79fc5c..53f642fdf6 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 e37078ce5f..7fad801b98 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 145fb0fd9f..1604205277 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 825fb007d5..de38c25325 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 ab14d3933f..d50667368c 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 b8fe1e579c..879fcbf026 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 330adcc2e4..cace67a08c 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 ced19f9110..a7557f14e9 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 43772e5e24..67b1448e89 100644 --- a/src/helpers/esp32/ESPNOWRadio.h +++ b/src/helpers/esp32/ESPNOWRadio.h @@ -9,6 +9,13 @@ class ESPNOWRadio : public mesh::Radio { 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 793ba335bd..8861f76d24 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 0445262b57..13efd25b57 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 cccdc0437c..97bf6820d6 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 e13561a4a9..cc7bb2238b 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 f24ab41caa..9ddea78f3f 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 afe2cc044e..9d75ce12a1 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 85f3a935db..b6519aefa7 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 ff951aaa47..efd3e17931 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -38,6 +38,10 @@ class RadioLibWrapper : public mesh::Radio { 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 9e656cc2dc..91d851ff3e 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 892c3de3f3..b64694f5d3 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 66723b4477..8f84a7a19e 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 c112fd6cc2..d526a5d037 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 368b5fa19d..8dc203de97 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 2a3c6f87c9..9111704fca 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 8ef0ecd34d..d16b453810 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 d43c5f25a6..0d3b7d76ea 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 87f65dd98c..95bcf6dc28 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 a9a71ce4c4..9ed5cda717 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 ea9664fd5f..26bba1c075 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 6504078c52..16612f67b6 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 f42085c041..f447523e8d 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 1ebd0837b1..884f4969fa 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 cd8bd50761..522c319922 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 1bd525e16a..214a6e0f0b 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 859cd9fa82..6914769d9c 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 c23ac1fa07..6f2c291bb8 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 8196ff7d5d..f23279548f 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 b0900302fb..d78521fcfb 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 08d29e154d..d140864cd1 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 f1921abfa3..1956f50ebd 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 09609b878f..30509977ee 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 8c704b23ac..137d8db5ec 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 3658717795..cb8f75db51 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 612161fef3..5aac84dbe2 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 c39ca35c59..6a2eab7d84 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 9a6e4d9602..cde63220a8 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 95cd9c9b86..f32c41ff47 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 29099f46a3..2931eda816 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 6de866fbce..c48a29f6a0 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 62f31c9584..240d9d4c58 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 d327d78b5e..2bc57b8c26 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 788dac7238..cdffc18a17 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 5635683362..e6af466a84 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 21a209f993..2944b38435 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 e0b6a1d45f..8483f27689 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 47d493cb92..5d668186b2 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 52ef9fb595..be21695ec4 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 479083149b..7206678181 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 e23fd8d81b..6c53c5e324 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 9afe937a62..18f7c9c5ee 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 00294d5a1b..baf02c3d12 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 b85b8d9375..30ee5cb69e 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 d07dc34512..bb140505a8 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 b36c839380..46b05e8b2e 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 71652b3787..f1879ac569 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 a37ac8ff57..5b73bb6684 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 73c19e0621..34df31c3b1 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 7db1b66460..965cdd1a2e 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 a62724fbdd..020ef54a56 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 2df4b3edb5..460b7ac1e7 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 b6a1025739..6755df09f5 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 a521332f80..d6cd61b4cc 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 943dcd650b..6e5292a77e 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 691c01d427..c532a73af9 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 b6733a4f35..94cc3d6d88 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 ad3856455e..1c70990523 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 bebd4ed010..a0b765bf6d 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 901c07150c..25caa71169 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 c78d297395..d20c56a3e9 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 75247734d3..9d35af9b13 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 1807621d6e..278fc76dad 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 12b67c1c7b..2b8a1783f0 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 7a602c6fb7..95a62fcd25 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 12b67c1c7b..2b8a1783f0 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 1f6cf9c3dd..d70e9b7917 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 0946b58bb4..81e99ee3ab 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 81b1d74cb1..8c12016150 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 7582311374..fa954b329b 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 5a70e97944..ab192ebeff 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 665850dd3d..0a959b97dc 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 22f14e790a..ee8f944de4 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 233721fec2..244fe7d2d5 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 d8ccbe2f6a..8795a4cbe7 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 f91d2fa7c1..d59b3aee8d 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 c0f1b1fad2..50d678266e 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 6dadd566a9..3987e18c29 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 c67663d64d..9944a38b93 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 ea7383e254..f8d42863b2 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 de889d4355..68655c5d78 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 53d7e03bec..5bf3f26850 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 c5e7ebdf62..69a2772ccb 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 dcd63791bd..5c6ebee11d 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 248a788b9c..ceb9fe49cf 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 020cd43409..dcbcf8e1df 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 ddcc2a53f7..b5a74c90dc 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 4b3de9816e..e577ab4e97 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 c66a2e443f..1edd315e00 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 c21274b937..fd38e7ca75 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 23be3ef866..9df1bf8f8c 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 72f13f32a3..f93cd53996 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 b9cb1ecca1..5309e6b22b 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 215be38c16..00653e90e5 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 161c0145e5..e55543a324 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 3ba1cf421d..566f4fa0e1 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 d2377c1281..a41ba72075 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 51337c5337..1529f90424 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 e52a12b2e5..cdf81f4f5b 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 bc5a4921f7..fbe18d2d11 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 568987ba67..9318b7f0f7 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 255d3067ee..eb918441ee 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 6674c180d8..c84d1883e7 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 a56dec7bd6..dab4575e5c 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 8b506cc6a5..466415176f 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 243c44400e..a1c01f1368 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 65cc388d14..8018c20eb8 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 9a3610252c..b4eadbba31 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 bbf453caf7..4253282708 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 d4e3c02c52..db003cc5fa 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 7a1794e69b..909625edfc 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 b228b04e54..b3ee6d177f 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 934040e1f2..69306fc0e1 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 3882202bb7..ec1297beff 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 a8919034df..ff0dd6cf4d 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 ddaaeff7ec..37ede89e55 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 63ecdf76a6..1e6c2ad13c 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 4124761cfb..f2d34328da 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 e5908fdf76..be534f67d7 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 d10760e2c6..a613e39090 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 01957362e5..de167194e4 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 221e0a7ce7..76188e584e 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 c05f552efd..aed8a67c64 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 d158371210..4e2e4afa75 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 907a37f50d..ef47708fb3 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 4590f0d190..a090931cd5 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 8d8069ebf3..680da631a4 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 1d1fc5cb9a..5cb2a840bb 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 338f398dfe..92775d5511 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 a4e5fb60c2..4807e0f791 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 766265519f..7a573258e6 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 72766e775f..05bc7ff1ca 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 9be3061c3d..1bb7cec8cb 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 8712a0ef0b..79504ab8d2 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 300ff60ea1..7f30dc8b60 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 54a389f067..32f118622d 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 4ec06ee1c0..c4cec06393 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 9efe001543..ab6fe279ac 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 956e836265..bb3d2a81ff 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 67a09fcc7b..fe2c62c3dc 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 94629b7c28..6f035bda0d 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 014b25529d..a7ae7dd8e0 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 93b2786295..27eddd844e 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 ca824d38c1..8a975959fa 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 d85028632e..29c5f28144 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 36/49] 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 49c75a5b8e..6f363d7f96 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 3ad36fb000..12a374d91d 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 ca469d17c7..eb9b695b88 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 37/49] 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 9fd0b23dea..dc75e96310 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 38/49] 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 4daeaadeaf..4a17a1b28a 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 39/49] fix CustomLFS version pinning --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 5c6072b405..b079cec939 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 40/49] 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 19472406d8..78a712114f 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 41/49] 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 5e8b00d521..03ea7d6bd1 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 60566add92..66ce44242b 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 42/49] * 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 71ba4abeb6..d439b2cbc4 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 aeff591cf4..f6a4ce40e9 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 @@ class MyMesh : public BaseChatMesh, public DataStoreHost { 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 43/49] 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 c85d6f83ad..ea9234c097 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 44/49] 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 03ea7d6bd1..eeab1501d5 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 66ce44242b..bbe99d6de4 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 45/49] 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 d439b2cbc4..c67bb68c9e 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 { From ff031f48bb9b35afb44a0d36b00e1940c5f4ee37 Mon Sep 17 00:00:00 2001 From: agessaman Date: Sat, 9 May 2026 17:06:00 -0700 Subject: [PATCH 46/49] Refactor MQTT origin handling to use effective origin logic Updated MyMesh implementations in simple_repeater and simple_room_server to set mqtt_origin to an empty string, allowing the effective origin to follow node_name during publishing. Introduced new functions in MQTTBridge to manage effective origin retrieval and refresh from preferences, ensuring consistent behavior across MQTT operations. This change simplifies the origin management and enhances clarity in the codebase. --- examples/simple_repeater/MyMesh.cpp | 8 ++--- examples/simple_room_server/MyMesh.cpp | 8 ++--- src/helpers/CommonCLI.cpp | 4 ++- src/helpers/bridges/MQTTBridge.cpp | 41 ++++++++++++++++++++++---- src/helpers/bridges/MQTTBridge.h | 3 ++ 5 files changed, 46 insertions(+), 18 deletions(-) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index 34b6c46912..ecad3cd67f 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -965,8 +965,8 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc _prefs.gps_interval = 0; _prefs.advert_loc_policy = ADVERT_LOC_PREFS; - // MQTT defaults - StrHelper::strncpy(_prefs.mqtt_origin, "MeshCore-Repeater", sizeof(_prefs.mqtt_origin)); + // MQTT defaults (mqtt_origin empty => effective origin follows node_name at publish time) + _prefs.mqtt_origin[0] = '\0'; StrHelper::strncpy(_prefs.mqtt_iata, "SEA", sizeof(_prefs.mqtt_iata)); _prefs.mqtt_status_enabled = 1; // enabled _prefs.mqtt_packets_enabled = 1; // enabled @@ -1010,10 +1010,6 @@ void MyMesh::begin(FILESYSTEM *fs) { // load persisted prefs _cli.loadPrefs(_fs); - // Set MQTT origin to actual device name (not build-time ADVERT_NAME) - StrHelper::strncpy(_prefs.mqtt_origin, _prefs.node_name, sizeof(_prefs.mqtt_origin)); - MESH_DEBUG_PRINTLN("MQTT origin set to device name: %s", _prefs.mqtt_origin); - acl.load(_fs, self_id); // TODO: key_store.begin(); region_map.load(_fs); diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index b9ac92b267..fe2af05353 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -682,8 +682,8 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc _prefs.bridge_baud = 115200; // baud rate _prefs.bridge_channel = 1; // channel 1 - // MQTT defaults (same as repeater) - StrHelper::strncpy(_prefs.mqtt_origin, "MeshCore-RoomServer", sizeof(_prefs.mqtt_origin)); + // MQTT defaults (same as repeater; empty mqtt_origin follows node_name when publishing) + _prefs.mqtt_origin[0] = '\0'; StrHelper::strncpy(_prefs.mqtt_iata, "SEA", sizeof(_prefs.mqtt_iata)); _prefs.mqtt_status_enabled = 1; // enabled _prefs.mqtt_packets_enabled = 1; // enabled @@ -755,10 +755,6 @@ void MyMesh::begin(FILESYSTEM *fs) { applyGpsPrefs(); #endif #ifdef WITH_MQTT_BRIDGE - // Set MQTT origin to actual device name (not build-time ADVERT_NAME) - same as repeater - StrHelper::strncpy(_prefs.mqtt_origin, _prefs.node_name, sizeof(_prefs.mqtt_origin)); - MESH_DEBUG_PRINTLN("MQTT origin set to device name: %s", _prefs.mqtt_origin); - if (_prefs.bridge_enabled) { // Defer construction to avoid static init crashes on ESP32 classic bridge = new MQTTBridge(&_prefs, _mgr, getRTCClock(), &self_id); diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index d75a3c944c..991e199353 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -1660,7 +1660,9 @@ void CommonCLI::handleGetCmd(uint32_t sender_timestamp, char* command, char* rep #endif #ifdef WITH_MQTT_BRIDGE } else if (memcmp(config, "mqtt.origin", 11) == 0) { - sprintf(reply, "> %s", _prefs->mqtt_origin); + char effective_origin[32]; + MQTTBridge::getEffectiveMqttOrigin(_prefs, effective_origin, sizeof(effective_origin)); + sprintf(reply, "> %s", effective_origin); } else if (memcmp(config, "mqtt.iata", 9) == 0) { sprintf(reply, "> %s", _prefs->mqtt_iata); } else if (memcmp(config, "mqtt.presets", 12) == 0 && (config[12] == '\0' || config[12] == ' ')) { diff --git a/src/helpers/bridges/MQTTBridge.cpp b/src/helpers/bridges/MQTTBridge.cpp index 2872117654..dae7e05348 100644 --- a/src/helpers/bridges/MQTTBridge.cpp +++ b/src/helpers/bridges/MQTTBridge.cpp @@ -37,6 +37,32 @@ static void stripQuotes(char* str, size_t max_len) { } } +// Effective MQTT origin: empty mqtt_origin follows node_name; otherwise mqtt_origin override (quotes stripped). +static void applyEffectiveOrigin(const NodePrefs* prefs, char* dest, size_t dest_size) { + if (!prefs || !dest || dest_size == 0) return; + if (prefs->mqtt_origin[0] == '\0') { + strncpy(dest, prefs->node_name, dest_size - 1); + } else { + strncpy(dest, prefs->mqtt_origin, dest_size - 1); + } + dest[dest_size - 1] = '\0'; + stripQuotes(dest, dest_size); +} + +void MQTTBridge::refreshOriginFromPrefs() { + if (!_prefs) return; + applyEffectiveOrigin(_prefs, _origin, sizeof(_origin)); +} + +void MQTTBridge::getEffectiveMqttOrigin(const NodePrefs* prefs, char* buf, size_t buf_size) { + if (!buf || buf_size == 0) return; + if (!prefs) { + buf[0] = '\0'; + return; + } + applyEffectiveOrigin(prefs, buf, buf_size); +} + // Helper function to check if WiFi credentials are valid static bool isWiFiConfigValid(const NodePrefs* prefs) { // Check if WiFi SSID is configured (not empty) @@ -457,14 +483,11 @@ void MQTTBridge::begin() { return; } - // Update origin and IATA from preferences - strncpy(_origin, _prefs->mqtt_origin, sizeof(_origin) - 1); - _origin[sizeof(_origin) - 1] = '\0'; + refreshOriginFromPrefs(); + strncpy(_iata, _prefs->mqtt_iata, sizeof(_iata) - 1); _iata[sizeof(_iata) - 1] = '\0'; - // Strip quotes from origin and IATA if present - stripQuotes(_origin, sizeof(_origin)); stripQuotes(_iata, sizeof(_iata)); // Convert IATA code to uppercase (IATA codes are conventionally uppercase) @@ -1650,6 +1673,8 @@ void MQTTBridge::publishStatusToSlot(int index) { MQTTSlot& slot = _slots[index]; if (!slot.client || !slot.connected) return; + refreshOriginFromPrefs(); + // Build per-slot topic (handles IATA check for meshcore, token check for meshrank) char status_topic[128]; if (!buildTopicForSlot(index, MSG_STATUS, status_topic, sizeof(status_topic))) { @@ -2344,6 +2369,8 @@ bool MQTTBridge::publishStatus() { return false; } + refreshOriginFromPrefs(); + // Reuse pre-allocated buffer to avoid heap alloc/free churn under memory pressure. // _status_json_buffer and _last_raw_data are both Core 0-owned; no mutex needed. char fallback_status_buffer[STATUS_JSON_BUFFER_SIZE]; @@ -2432,6 +2459,8 @@ bool MQTTBridge::publishPacket(mesh::Packet* packet, bool is_tx, float snr, float rssi) { if (!packet) return false; + refreshOriginFromPrefs(); + // Memory pressure check: Skip publishes when there's not enough contiguous // heap for the publish itself (JSON buffer + esp-mqtt outbox frame + WiFi TX // path). Headroom only — NOT an mbedTLS preflight: persistent clients keep @@ -2537,6 +2566,8 @@ bool MQTTBridge::publishPacket(mesh::Packet* packet, bool is_tx, bool MQTTBridge::publishRaw(mesh::Packet* packet) { if (!packet) return false; + refreshOriginFromPrefs(); + // Use pre-allocated buffer; fallback to single stack buffer if not available char json_buffer_stack[PUBLISH_JSON_BUFFER_SIZE]; char* active_buffer; diff --git a/src/helpers/bridges/MQTTBridge.h b/src/helpers/bridges/MQTTBridge.h index 785812bae3..e633e1dea5 100644 --- a/src/helpers/bridges/MQTTBridge.h +++ b/src/helpers/bridges/MQTTBridge.h @@ -333,6 +333,7 @@ class MQTTBridge : public BridgeBase { void optimizeMqttClientConfig(PsychicMqttClient* client, bool needs_large_buffer = false); void getClientVersion(char* buffer, size_t buffer_size) const; void logMemoryStatus(); + void refreshOriginFromPrefs(); public: MQTTBridge(NodePrefs *prefs, mesh::PacketManager *mgr, mesh::RTCClock *rtc, mesh::LocalIdentity *identity); @@ -380,6 +381,8 @@ class MQTTBridge : public BridgeBase { bool isReady() const; static unsigned long getWifiConnectedAtMillis(); + /** Resolved origin for MQTT JSON: node_name when mqtt_origin is empty, else mqtt_origin (with quote stripping). */ + static void getEffectiveMqttOrigin(const NodePrefs* prefs, char* buf, size_t buf_size); static void formatMqttStatusReply(char* buf, size_t bufsize, const NodePrefs* prefs); /** True when WiFi is set and at least one MQTT slot can run (preset + custom host if needed). */ static bool isConfigValid(const NodePrefs* prefs); From 303cf8c2bdd431020864abd37135325ae14e2528 Mon Sep 17 00:00:00 2001 From: agessaman Date: Sat, 9 May 2026 17:40:00 -0700 Subject: [PATCH 47/49] Enhance MQTT status message to include repeat status Updated the MQTT message structure to add a new field for repeat status, allowing the indication of forwarding status as "on" or "off". This change includes modifications to the MQTTMessageBuilder and related documentation to reflect the new parameter. Additionally, updated CLI command documentation to clarify flooding behavior in different firmware versions. --- MQTT_IMPLEMENTATION.md | 3 ++- docs/cli_commands.md | 2 ++ src/helpers/MQTTMessageBuilder.cpp | 8 ++++++-- src/helpers/MQTTMessageBuilder.h | 4 +++- src/helpers/bridges/MQTTBridge.cpp | 6 ++++-- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/MQTT_IMPLEMENTATION.md b/MQTT_IMPLEMENTATION.md index 5cbc7cbdc2..0053223dbd 100644 --- a/MQTT_IMPLEMENTATION.md +++ b/MQTT_IMPLEMENTATION.md @@ -478,7 +478,8 @@ Minimal raw packet data for map integration. "model": "device_model", "firmware_version": "firmware_version", "radio": "radio_info", - "client_version": "meshcore-custom-repeater/{build_date}" + "client_version": "meshcore-custom-repeater/{build_date}", + "repeat": "on|off" } ``` diff --git a/docs/cli_commands.md b/docs/cli_commands.md index 05c7b4c579..c54038615a 100644 --- a/docs/cli_commands.md +++ b/docs/cli_commands.md @@ -766,6 +766,8 @@ This document provides an overview of CLI commands that can be sent to MeshCore - `name`: Region name - `parent_name`: Parent region name (optional, defaults to wildcard) +**Note:** In firmware **v1.15.0** and later, `region put` enables flooding for that region by default (you do not need a separate `region allowf ` after each `put`). On **v1.14.0** and earlier, new regions may still require `region allowf` for flooding—see [`region allowf`](#allow-a-region). + --- #### Remove a region diff --git a/src/helpers/MQTTMessageBuilder.cpp b/src/helpers/MQTTMessageBuilder.cpp index b784f595ae..d4e9ae8643 100644 --- a/src/helpers/MQTTMessageBuilder.cpp +++ b/src/helpers/MQTTMessageBuilder.cpp @@ -24,7 +24,8 @@ int MQTTMessageBuilder::buildStatusMessage( int tx_air_secs, int rx_air_secs, int recv_errors, - int internal_heap + int internal_heap, + const char* repeat ) { // doc is provided by the caller (heap-allocated DynamicJsonDocument in MQTTBridge), // keeping this 768-byte scratch space off the MQTT task stack. @@ -39,7 +40,10 @@ int MQTTMessageBuilder::buildStatusMessage( root["firmware_version"] = firmware_version; root["radio"] = radio; root["client_version"] = client_version; - + if (repeat != nullptr) { + root["repeat"] = repeat; + } + // Add stats object if any stats are provided if (battery_mv >= 0 || uptime_secs >= 0 || errors >= 0 || queue_len >= 0 || noise_floor > -999 || tx_air_secs >= 0 || rx_air_secs >= 0 || recv_errors >= 0 || diff --git a/src/helpers/MQTTMessageBuilder.h b/src/helpers/MQTTMessageBuilder.h index 4930bbaa7b..17c649bcf4 100644 --- a/src/helpers/MQTTMessageBuilder.h +++ b/src/helpers/MQTTMessageBuilder.h @@ -39,6 +39,7 @@ class MQTTMessageBuilder { * @param rx_air_secs RX air time in seconds (optional, -1 to omit) * @param recv_errors Radio receive/CRC errors (optional, -1 to omit) * @param internal_heap Internal heap free bytes (optional, -1 to omit) + * @param repeat Repeat/forwarding status ("on" or "off"); nullptr omits the field * @return Length of JSON string, or 0 on error */ static int buildStatusMessage( @@ -61,7 +62,8 @@ class MQTTMessageBuilder { int tx_air_secs = -1, int rx_air_secs = -1, int recv_errors = -1, - int internal_heap = -1 + int internal_heap = -1, + const char* repeat = nullptr ); /** diff --git a/src/helpers/bridges/MQTTBridge.cpp b/src/helpers/bridges/MQTTBridge.cpp index dae7e05348..a706f45ad9 100644 --- a/src/helpers/bridges/MQTTBridge.cpp +++ b/src/helpers/bridges/MQTTBridge.cpp @@ -1736,7 +1736,8 @@ void MQTTBridge::publishStatusToSlot(int index) { _origin, origin_id, _board_model, _firmware_version, radio_info, client_version, "online", timestamp, json_buffer, STATUS_JSON_BUFFER_SIZE, battery_mv, uptime_secs, errors, _queue_count, noise_floor, - tx_air_secs, rx_air_secs, recv_errors, internal_heap_free + tx_air_secs, rx_air_secs, recv_errors, internal_heap_free, + _prefs->disable_fwd ? "off" : "on" ); if (len > 0) { @@ -2425,7 +2426,8 @@ bool MQTTBridge::publishStatus() { _origin, origin_id, _board_model, _firmware_version, radio_info, client_version, "online", timestamp, json_buffer, STATUS_JSON_BUFFER_SIZE, battery_mv, uptime_secs, errors, _queue_count, noise_floor, - tx_air_secs, rx_air_secs, recv_errors, internal_heap_free + tx_air_secs, rx_air_secs, recv_errors, internal_heap_free, + _prefs->disable_fwd ? "off" : "on" ); if (len > 0) { From b9f478c9898a662b1c338e1bb71ad3a71d6191de Mon Sep 17 00:00:00 2001 From: agessaman Date: Sat, 9 May 2026 18:06:18 -0700 Subject: [PATCH 48/49] Add MQTT origin handling and string utility function Implemented a new function to strip surrounding quotes from strings in TxtDataHelpers, enhancing string manipulation capabilities. Updated CommonCLI to handle MQTT origin configuration, allowing for both setting and clearing of the mqtt.origin preference. This change improves the flexibility of MQTT origin management in the CLI. --- src/helpers/CommonCLI.cpp | 5 +++++ src/helpers/TxtDataHelpers.cpp | 14 ++++++++++++++ src/helpers/TxtDataHelpers.h | 2 ++ src/helpers/bridges/MQTTBridge.cpp | 24 +++--------------------- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index 991e199353..39ef6eb8fb 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -1275,8 +1275,13 @@ void CommonCLI::handleSetCmd(uint32_t sender_timestamp, char* command, char* rep strcpy(reply, "OK"); #endif #ifdef WITH_MQTT_BRIDGE + } else if (strcmp(config, "mqtt.origin") == 0) { + _prefs->mqtt_origin[0] = '\0'; + savePrefs(); + strcpy(reply, "OK"); } else if (memcmp(config, "mqtt.origin ", 12) == 0) { StrHelper::strncpy(_prefs->mqtt_origin, &config[12], sizeof(_prefs->mqtt_origin)); + StrHelper::stripSurroundingQuotes(_prefs->mqtt_origin, sizeof(_prefs->mqtt_origin)); savePrefs(); strcpy(reply, "OK"); } else if (memcmp(config, "mqtt.iata ", 10) == 0) { diff --git a/src/helpers/TxtDataHelpers.cpp b/src/helpers/TxtDataHelpers.cpp index d327931fde..f994c9decc 100644 --- a/src/helpers/TxtDataHelpers.cpp +++ b/src/helpers/TxtDataHelpers.cpp @@ -1,4 +1,18 @@ #include "TxtDataHelpers.h" +#include + +void StrHelper::stripSurroundingQuotes(char* str, size_t buf_sz) { + if (!str || buf_sz == 0) return; + size_t len = strlen(str); + if (len == 0) return; + if (str[0] == '"' || str[0] == '\'') { + memmove(str, str + 1, len); + len--; + } + if (len > 0 && (str[len - 1] == '"' || str[len - 1] == '\'')) { + str[len - 1] = '\0'; + } +} void StrHelper::strncpy(char* dest, const char* src, size_t buf_sz) { while (buf_sz > 1 && *src) { diff --git a/src/helpers/TxtDataHelpers.h b/src/helpers/TxtDataHelpers.h index ece494f291..d9e82b23a1 100644 --- a/src/helpers/TxtDataHelpers.h +++ b/src/helpers/TxtDataHelpers.h @@ -13,6 +13,8 @@ class StrHelper { public: static void strncpy(char* dest, const char* src, size_t buf_sz); static void strzcpy(char* dest, const char* src, size_t buf_sz); // pads with trailing nulls + /** Remove one leading and one trailing ASCII " or ' if present (in-place). No-op if empty. */ + static void stripSurroundingQuotes(char* str, size_t buf_sz); static const char* ftoa(float f); static const char* ftoa3(float f); //Converts float to string with 3 decimal places static bool isBlank(const char* str); diff --git a/src/helpers/bridges/MQTTBridge.cpp b/src/helpers/bridges/MQTTBridge.cpp index a706f45ad9..e43ee162df 100644 --- a/src/helpers/bridges/MQTTBridge.cpp +++ b/src/helpers/bridges/MQTTBridge.cpp @@ -1,5 +1,6 @@ #include "MQTTBridge.h" #include "../MQTTMessageBuilder.h" +#include "../TxtDataHelpers.h" #include #include #include @@ -18,25 +19,6 @@ #include #endif -// Helper function to strip quotes from strings (both single and double quotes) -static void stripQuotes(char* str, size_t max_len) { - if (!str || max_len == 0) return; - - size_t len = strlen(str); - if (len == 0) return; - - // Remove leading quote (single or double) - if (str[0] == '"' || str[0] == '\'') { - memmove(str, str + 1, len); - len--; - } - - // Remove trailing quote (single or double) - if (len > 0 && (str[len-1] == '"' || str[len-1] == '\'')) { - str[len-1] = '\0'; - } -} - // Effective MQTT origin: empty mqtt_origin follows node_name; otherwise mqtt_origin override (quotes stripped). static void applyEffectiveOrigin(const NodePrefs* prefs, char* dest, size_t dest_size) { if (!prefs || !dest || dest_size == 0) return; @@ -46,7 +28,7 @@ static void applyEffectiveOrigin(const NodePrefs* prefs, char* dest, size_t dest strncpy(dest, prefs->mqtt_origin, dest_size - 1); } dest[dest_size - 1] = '\0'; - stripQuotes(dest, dest_size); + StrHelper::stripSurroundingQuotes(dest, dest_size); } void MQTTBridge::refreshOriginFromPrefs() { @@ -488,7 +470,7 @@ void MQTTBridge::begin() { strncpy(_iata, _prefs->mqtt_iata, sizeof(_iata) - 1); _iata[sizeof(_iata) - 1] = '\0'; - stripQuotes(_iata, sizeof(_iata)); + StrHelper::stripSurroundingQuotes(_iata, sizeof(_iata)); // Convert IATA code to uppercase (IATA codes are conventionally uppercase) for (int i = 0; _iata[i]; i++) { From 08847342c5148ff68ac7d38f3f1cbd83661b7f8a Mon Sep 17 00:00:00 2001 From: agessaman Date: Sun, 10 May 2026 09:35:13 -0700 Subject: [PATCH 49/49] Update MQTT implementation to include ColoradoMesh preset Added ColoradoMesh as a new built-in preset in the MQTT bridge documentation. Updated relevant sections to reflect this addition, including command examples and notes on topic templates. This enhances the flexibility and options available for MQTT connections. --- MQTT_IMPLEMENTATION.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/MQTT_IMPLEMENTATION.md b/MQTT_IMPLEMENTATION.md index 0053223dbd..c562179df8 100644 --- a/MQTT_IMPLEMENTATION.md +++ b/MQTT_IMPLEMENTATION.md @@ -77,7 +77,7 @@ get mqtt.status The MQTT bridge implementation provides: - Up to 6 MQTT connection slots with built-in presets -- Built-in presets for LetsMesh Analyzer (US/EU), MeshMapper, MeshRank, Waev, Meshomatic, CascadiaMesh, EastIdahoMesh, and TennMesh +- Built-in presets for LetsMesh Analyzer (US/EU), MeshMapper, MeshRank, Waev, Meshomatic, CascadiaMesh, EastIdahoMesh, ColoradoMesh, and TennMesh - Custom broker support with username/password authentication - JWT (Ed25519 device signing) authentication for most preset brokers; TennMesh uses a fixed username/password (plain MQTT) - WSS (WebSocket Secure), direct MQTT/TLS, and plain MQTT (TennMesh) transport @@ -108,6 +108,7 @@ The MQTT bridge uses a slot-based architecture with up to 6 concurrent connectio | `chimesh` | wss://mqtt.chimesh.org:443 | JWT (Ed25519) | WSS | | `meshat.se` | mqtts://mqtt.meshat.se:8883 | Username/password (fixed in firmware) | MQTT over TLS | | `eastidahomesh` | wss://broker.eastidahomesh.net:443 | None | WSS | +| `coloradomesh` | wss://mqtt.meshcore.coloradomesh.org:1883 | JWT (Ed25519) | WSS | | `custom` | User-configured | Username/Password | MQTT or WSS | | `none` | (disabled) | — | — | @@ -254,6 +255,7 @@ Each slot (1-6) supports the following commands: - `set mqttN.preset chimesh` - Set slot N to ChicagolandMesh - `set mqttN.preset meshat.se` - Set slot N to Meshat.se - `set mqttN.preset eastidahomesh` - Set slot N to EastIdahoMesh (WSS/TLS, no auth; packets on `meshcore/{IATA}/{PUBLIC_KEY}/packets`) +- `set mqttN.preset coloradomesh` - Set slot N to ColoradoMesh - `set mqttN.preset custom` - Set slot N to custom broker (configure server/port/username/password) - `set mqttN.preset none` - Disable slot N - `set mqttN.server ` - Set custom server hostname for slot N @@ -330,7 +332,7 @@ When a slot's preset is `custom`, you can define a custom topic template using p If no custom topic is set, custom slots default to: `meshcore/{iata}/{device}/{type}` -**Note:** Topic templates only apply to `custom` preset slots. Built-in presets (analyzer-us, analyzer-eu, meshmapper, meshrank, eastidahomesh, tennmesh, etc.) always use their hardcoded topic format. +**Note:** Topic templates only apply to `custom` preset slots. Built-in presets (analyzer-us, analyzer-eu, meshmapper, meshrank, eastidahomesh, coloradomesh, tennmesh, etc.) always use their hardcoded topic format. ### MQTT Shared Commands @@ -524,7 +526,7 @@ Minimal raw packet data for map integration. ### Slot-Based Preset System - Up to 6 concurrent MQTT connections (with PSRAM), 2 without PSRAM -- Built-in presets for LetsMesh Analyzer (US/EU), MeshMapper, MeshRank, Waev, Meshomatic, CascadiaMesh, EastIdahoMesh, and TennMesh +- Built-in presets for LetsMesh Analyzer (US/EU), MeshMapper, MeshRank, Waev, Meshomatic, CascadiaMesh, EastIdahoMesh, ColoradoMesh, and TennMesh - Custom broker support with username/password auth and custom topic templates - JWT (Ed25519) for most preset brokers; MeshRank uses token-in-topic; TennMesh uses fixed username/password over plain MQTT - WSS (WebSocket Secure), direct MQTT over TLS, and plain MQTT (TennMesh) @@ -665,7 +667,7 @@ get mqtt1.diag # Last slot error details (TLS/sock/time) get mqtt2.diag get mqtt3.diag get mqtt1.preset # Verify slots are configured -get mqtt.iata # IATA must be set for MeshCore-topic presets (e.g. Analyzer, TennMesh) +get mqtt.iata # IATA must be set for MeshCore-topic presets (e.g. Analyzer, ColoradoMesh, TennMesh) ``` #### Timezone Issues