From 7829c51898a620a929a4f9753f93ea66beaca743 Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Mon, 9 Mar 2026 14:31:40 +0100 Subject: [PATCH 1/7] Bump to RadioLib 7.6.0 --- library.json | 2 +- platformio.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.json b/library.json index aa37cb6e..8504793c 100644 --- a/library.json +++ b/library.json @@ -4,7 +4,7 @@ "dependencies": { "SPI": "*", "Wire": "*", - "jgromes/RadioLib": "^7.3.0", + "jgromes/RadioLib": "^7.6.0", "rweather/Crypto": "^0.4.0", "adafruit/RTClib": "^2.1.3", "melopero/Melopero RV3028": "^1.1.0", diff --git a/platformio.ini b/platformio.ini index ba601c26..f2ef9247 100644 --- a/platformio.ini +++ b/platformio.ini @@ -18,7 +18,7 @@ monitor_speed = 115200 lib_deps = SPI Wire - jgromes/RadioLib @ ^7.3.0 + jgromes/RadioLib @ ^7.6.0 rweather/Crypto @ ^0.4.0 adafruit/RTClib @ ^2.1.3 melopero/Melopero RV3028 @ ^1.1.0 From cd6c09a0d9ab01d90eb9d3486c880bd73cf38abe Mon Sep 17 00:00:00 2001 From: MGJ <62177301+MGJ520@users.noreply.github.com> Date: Tue, 24 Mar 2026 14:16:44 +0800 Subject: [PATCH 2/7] Support for GAT562 Mesh Watch13 device --- docs/nrf52_power_management.md | 2 + .../GAT56MeshWatch13Board.cpp | 46 ++++ .../GAT56MeshWatch13Board.h | 44 ++++ variants/gat562_mesh_watch13/platformio.ini | 88 ++++++++ variants/gat562_mesh_watch13/target.cpp | 51 +++++ variants/gat562_mesh_watch13/target.h | 32 +++ variants/gat562_mesh_watch13/variant.cpp | 44 ++++ variants/gat562_mesh_watch13/variant.h | 201 ++++++++++++++++++ 8 files changed, 508 insertions(+) create mode 100644 variants/gat562_mesh_watch13/GAT56MeshWatch13Board.cpp create mode 100644 variants/gat562_mesh_watch13/GAT56MeshWatch13Board.h create mode 100644 variants/gat562_mesh_watch13/platformio.ini create mode 100644 variants/gat562_mesh_watch13/target.cpp create mode 100644 variants/gat562_mesh_watch13/target.h create mode 100644 variants/gat562_mesh_watch13/variant.cpp create mode 100644 variants/gat562_mesh_watch13/variant.h diff --git a/docs/nrf52_power_management.md b/docs/nrf52_power_management.md index 9c7416b3..58818edd 100644 --- a/docs/nrf52_power_management.md +++ b/docs/nrf52_power_management.md @@ -33,11 +33,13 @@ Shutdown reason codes (stored in GPREGRET2): ## Supported Boards + | Board | Implemented | LPCOMP wake | VBUS wake | |-------|-------------|-------------|-----------| | Seeed Studio XIAO nRF52840 (`xiao_nrf52`) | Yes | Yes | Yes | | RAK4631 (`rak4631`) | Yes | Yes | Yes | | Heltec T114 (`heltec_t114`) | Yes | Yes | Yes | +| GAT562 Mesh Watch13 | Yes | Yes | Yes | | Promicro nRF52840 | No | No | No | | RAK WisMesh Tag | No | No | No | | Heltec Mesh Solar | No | No | No | diff --git a/variants/gat562_mesh_watch13/GAT56MeshWatch13Board.cpp b/variants/gat562_mesh_watch13/GAT56MeshWatch13Board.cpp new file mode 100644 index 00000000..5a24b541 --- /dev/null +++ b/variants/gat562_mesh_watch13/GAT56MeshWatch13Board.cpp @@ -0,0 +1,46 @@ +#include +#include + +#include "GAT56MeshWatch13Board.h" + + +#ifdef NRF52_POWER_MANAGEMENT +// Static configuration for power management +// Values set in variant.h defines +const PowerMgtConfig power_config = { + .lpcomp_ain_channel = PWRMGT_LPCOMP_AIN, + .lpcomp_refsel = PWRMGT_LPCOMP_REFSEL, + .voltage_bootlock = PWRMGT_VOLTAGE_BOOTLOCK +}; + + +void GAT56MeshWatch13Board::initiateShutdown(uint8_t reason) { + if (reason == SHUTDOWN_REASON_LOW_VOLTAGE || + reason == SHUTDOWN_REASON_BOOT_PROTECT) { + configureVoltageWake(power_config.lpcomp_ain_channel, power_config.lpcomp_refsel); + } + enterSystemOff(reason); +} +#endif // NRF52_POWER_MANAGEMENT + + +void GAT56MeshWatch13Board::begin() { + NRF52BoardDCDC::begin(); + pinMode(PIN_VBAT_READ, INPUT); + + +#if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL) + Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL); +#endif + + Wire.begin(); + + pinMode(SX126X_POWER_EN, OUTPUT); +#ifdef NRF52_POWER_MANAGEMENT + // Boot voltage protection check (may not return if voltage too low) + // We need to call this after we configure SX126X_POWER_EN as output but before we pull high + checkBootVoltage(&power_config); +#endif + digitalWrite(SX126X_POWER_EN, HIGH); + delay(10); // give sx1262 some time to power up +} \ No newline at end of file diff --git a/variants/gat562_mesh_watch13/GAT56MeshWatch13Board.h b/variants/gat562_mesh_watch13/GAT56MeshWatch13Board.h new file mode 100644 index 00000000..34437f42 --- /dev/null +++ b/variants/gat562_mesh_watch13/GAT56MeshWatch13Board.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include + + +class GAT56MeshWatch13Board : public NRF52BoardDCDC { +protected: +#ifdef NRF52_POWER_MANAGEMENT + void initiateShutdown(uint8_t reason) override; +#endif + +public: + GAT56MeshWatch13Board() : NRF52Board("GAT562_OTA") {} + void begin(); + + #define BATTERY_SAMPLES 8 + + uint16_t getBattMilliVolts() override { + analogReadResolution(12); + + uint32_t raw = 0; + for (int i = 0; i < BATTERY_SAMPLES; i++) { + raw += analogRead(PIN_VBAT_READ); + } + raw = raw / BATTERY_SAMPLES; + + return (ADC_MULTIPLIER * raw) / 4096; + } + + const char* getManufacturerName() const override { + return "GAT562 Mesh Watch 13"; + } + + + void powerOff() override { + uint32_t button_pin = PIN_BUTTON2; + nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP); + nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW); + sd_power_system_off(); + } + +}; diff --git a/variants/gat562_mesh_watch13/platformio.ini b/variants/gat562_mesh_watch13/platformio.ini new file mode 100644 index 00000000..16ecf84a --- /dev/null +++ b/variants/gat562_mesh_watch13/platformio.ini @@ -0,0 +1,88 @@ +[GAT562_Mesh_Watch13] +extends = nrf52_base +board = rak4631 +board_check = true +build_flags = ${nrf52_base.build_flags} + ${sensor_base.build_flags} + -UENV_INCLUDE_GPS + -I variants/gat562_mesh_watch13 + -D RAK_4631 + -D RAK_BOARD + -D NRF52_POWER_MANAGEMENT + -D PIN_BOARD_SCL=14 + -D PIN_BOARD_SDA=13 + -D PIN_OLED_RESET=-1 + -D RADIO_CLASS=CustomSX1262 + -D WRAPPER_CLASS=CustomSX1262Wrapper + -D LORA_TX_POWER=19 + -D SX126X_CURRENT_LIMIT=140 + -D SX126X_RX_BOOSTED_GAIN=1 + -D QSPIFLASH=1 +build_src_filter = ${nrf52_base.build_src_filter} + +<../variants/gat562_mesh_watch13> + + + + + + +lib_deps = + ${nrf52_base.lib_deps} + ${sensor_base.lib_deps} + adafruit/Adafruit SSD1306 @ ^2.5.13 + +[env:GAT562_Mesh_Watch13_repeater] +extends = GAT562_Mesh_Watch13 +build_flags = + ${GAT562_Mesh_Watch13.build_flags} + -D DISPLAY_CLASS=SSD1306Display + -D ADVERT_NAME='"GAT562 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 = ${GAT562_Mesh_Watch13.build_src_filter} + + + +<../examples/simple_repeater> + +[env:GAT562_Mesh_Watch13_room_server] +extends = GAT562_Mesh_Watch13 +build_flags = + ${GAT562_Mesh_Watch13.build_flags} + -D DISPLAY_CLASS=SSD1306Display + -D ADVERT_NAME='"GAT562 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 = ${GAT562_Mesh_Watch13.build_src_filter} + + + +<../examples/simple_room_server> + +[env:GAT562_Mesh_Watch13_companion_radio_ble] +extends = GAT562_Mesh_Watch13 +board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld +board_upload.maximum_size = 712704 +build_flags = + ${GAT562_Mesh_Watch13.build_flags} + -I examples/companion_radio/ui-new + -D DISPLAY_CLASS=SSD1306Display + -D MAX_CONTACTS=350 + -D MAX_GROUP_CHANNELS=40 + -D BLE_PIN_CODE=123456 + -D BLE_DEBUG_LOGGING=1 + -D OFFLINE_QUEUE_SIZE=256 +; -D PIN_VIBRATION=36 +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +build_src_filter = ${GAT562_Mesh_Watch13.build_src_filter} + + + + + + + +<../examples/companion_radio/*.cpp> + +<../examples/companion_radio/ui-new/*.cpp> +lib_deps = + ${GAT562_Mesh_Watch13.lib_deps} + densaugeo/base64 @ ~1.4.0 + diff --git a/variants/gat562_mesh_watch13/target.cpp b/variants/gat562_mesh_watch13/target.cpp new file mode 100644 index 00000000..6c6548d7 --- /dev/null +++ b/variants/gat562_mesh_watch13/target.cpp @@ -0,0 +1,51 @@ +#include +#include "target.h" +#include + +GAT56MeshWatch13Board board; + +#ifndef PIN_USER_BTN + #define PIN_USER_BTN (-1) +#endif + + +#ifdef DISPLAY_CLASS + DISPLAY_CLASS display; + MomentaryButton user_btn(PIN_USER_BTN, 1000, true, false, false); + MomentaryButton back_btn(PIN_BACK_BTN, 1000, true, false, true); +#endif + + +RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI); + +WRAPPER_CLASS radio_driver(radio, board); + +VolatileRTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); +EnvironmentSensorManager sensors; + + +bool radio_init() { + rtc_clock.begin(Wire); + 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 new file mode 100644 index 00000000..cbeec48b --- /dev/null +++ b/variants/gat562_mesh_watch13/target.h @@ -0,0 +1,32 @@ +#pragma once + +#define RADIOLIB_STATIC_ONLY 1 +#include +#include +#include +#include +#include +#include + +#ifdef DISPLAY_CLASS + #include + extern DISPLAY_CLASS display; + #include + extern MomentaryButton user_btn; + extern MomentaryButton back_btn; +#endif + +#ifdef PIN_VIBRATION + #include +#endif + +extern GAT56MeshWatch13Board board; +extern WRAPPER_CLASS radio_driver; +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/variant.cpp b/variants/gat562_mesh_watch13/variant.cpp new file mode 100644 index 00000000..9f9c19d8 --- /dev/null +++ b/variants/gat562_mesh_watch13/variant.cpp @@ -0,0 +1,44 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "wiring_constants.h" +#include "wiring_digital.h" +#include "nrf.h" + +const uint32_t g_ADigitalPinMap[] = +{ + // P0 + 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , + 8 , 9 , 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + + // P1 + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47 +}; + + +void initVariant() +{ + +} + diff --git a/variants/gat562_mesh_watch13/variant.h b/variants/gat562_mesh_watch13/variant.h new file mode 100644 index 00000000..f79c9970 --- /dev/null +++ b/variants/gat562_mesh_watch13/variant.h @@ -0,0 +1,201 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_RAK4630_ +#define _VARIANT_RAK4630_ + +#define RAK4630 + +/** Master clock frequency */ +#define VARIANT_MCK (64000000ul) + +#define USE_LFXO // Board uses 32khz crystal for LF +// define USE_LFRC // Board uses RC for LF + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + + /* + * WisBlock Base GPIO definitions + */ + static const uint8_t WB_IO1 = 17; // SLOT_A SLOT_B + static const uint8_t WB_IO2 = 34; // SLOT_A SLOT_B + static const uint8_t WB_IO3 = 21; // SLOT_C + static const uint8_t WB_IO4 = 4; // SLOT_C + static const uint8_t WB_IO5 = 9; // SLOT_D + static const uint8_t WB_IO6 = 10; // SLOT_D + static const uint8_t WB_SW1 = 33; // IO_SLOT + static const uint8_t WB_A0 = 5; // IO_SLOT + static const uint8_t WB_A1 = 31; // IO_SLOT + static const uint8_t WB_I2C1_SDA = 13; // SENSOR_SLOT IO_SLOT + static const uint8_t WB_I2C1_SCL = 14; // SENSOR_SLOT IO_SLOT + static const uint8_t WB_I2C2_SDA = 24; // IO_SLOT + static const uint8_t WB_I2C2_SCL = 25; // IO_SLOT + static const uint8_t WB_SPI_CS = 26; // IO_SLOT + static const uint8_t WB_SPI_CLK = 3; // IO_SLOT + static const uint8_t WB_SPI_MISO = 29; // IO_SLOT + static const uint8_t WB_SPI_MOSI = 30; // IO_SLOT + +// Number of pins defined in PinDescription array +#define PINS_COUNT (48) +#define NUM_DIGITAL_PINS (48) +#define NUM_ANALOG_INPUTS (6) +#define NUM_ANALOG_OUTPUTS (0) + +// LEDs +#define PIN_LED (-1) +#define LED_BUILTIN PIN_LED +#define LED_CONN PIN_LED +#define LED_GREEN PIN_LED +#define LED_BLUE PIN_LED +#define LED_STATE_ON 1 // State when LED is litted + + +/* + * Buttons + */ +#define PIN_BUTTON1 (9) +#define PIN_BUTTON2 (10) +#define PIN_USER_BTN PIN_BUTTON1 +#define PIN_BACK_BTN PIN_BUTTON2 + + +// Analog pins +#define PIN_VBAT_READ (5) +#define ADC_MULTIPLIER (3 * 1.75 * 1.187 * 1000) + + +/* + * Analog pins + */ +#define PIN_A0 (5) //(3) +#define PIN_A1 (31) //(4) +#define PIN_A2 (28) +#define PIN_A3 (29) +#define PIN_A4 (30) +#define PIN_A5 (31) +#define PIN_A6 (0xff) +#define PIN_A7 (0xff) + + static const uint8_t A0 = PIN_A0; + static const uint8_t A1 = PIN_A1; + static const uint8_t A2 = PIN_A2; + static const uint8_t A3 = PIN_A3; + static const uint8_t A4 = PIN_A4; + static const uint8_t A5 = PIN_A5; + static const uint8_t A6 = PIN_A6; + static const uint8_t A7 = PIN_A7; +#define ADC_RESOLUTION 14 + +// Power management boot protection threshold (millivolts) +// Set to 0 to disable boot protection +#define PWRMGT_VOLTAGE_BOOTLOCK 3300 // Won't boot below this voltage (mV) +// LPCOMP wake configuration (voltage recovery from SYSTEMOFF) +// AIN3 = P0.05 = PIN_A0 / PIN_VBAT_READ +#define PWRMGT_LPCOMP_AIN 3 +#define PWRMGT_LPCOMP_REFSEL 4 // 5/8 VDD (~3.13-3.44V) + +// Other pins +#define PIN_AREF (2) +#define PIN_NFC1 (9) +#define PIN_NFC2 (10) + + static const uint8_t AREF = PIN_AREF; + +/* + * Serial interfaces + */ +// TXD1 RXD1 on Base Board +#define PIN_SERIAL1_RX (15) +#define PIN_SERIAL1_TX (16) + +// TXD0 RXD0 on Base Board +#define PIN_SERIAL2_RX (19) +#define PIN_SERIAL2_TX (20) + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 1 + +#define PIN_SPI_MISO (29) +#define PIN_SPI_MOSI (30) +#define PIN_SPI_SCK (3) + + static const uint8_t SS = 26; + static const uint8_t MOSI = PIN_SPI_MOSI; + static const uint8_t MISO = PIN_SPI_MISO; + static const uint8_t SCK = PIN_SPI_SCK; + +// LoRa radio module pins for RAK4631 + +#define SX126X_POWER_EN (37) +#define P_LORA_RESET (38) +#define P_LORA_NSS (42) +#define P_LORA_SCLK (43) +#define P_LORA_MOSI (44) +#define P_LORA_MISO (45) +#define P_LORA_BUSY (46) +#define P_LORA_DIO_1 (47) + +#define SX126X_DIO2_AS_RF_SWITCH true +#define SX126X_DIO3_TCXO_VOLTAGE 1.8 + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 2 + +#define PIN_WIRE_SDA (13) +#define PIN_WIRE_SCL (14) + +#define PIN_WIRE1_SDA (24) +#define PIN_WIRE1_SCL (25) + +// QSPI Pins +// QSPI occupied by GPIO's +#define PIN_QSPI_SCK 3 // 19 +#define PIN_QSPI_CS 26 // 17 +#define PIN_QSPI_IO0 30 // 20 +#define PIN_QSPI_IO1 29 // 21 +#define PIN_QSPI_IO2 28 // 22 +#define PIN_QSPI_IO3 2 // 23 + +// On-board QSPI Flash +#define EXTERNAL_FLASH_DEVICES W25Q16JV_IQ +#define EXTERNAL_FLASH_USE_QSPI + + + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#endif From 76be69dcde11ff332ec6f4793bb906dc67098619 Mon Sep 17 00:00:00 2001 From: MGJ <62177301+MGJ520@users.noreply.github.com> Date: Thu, 26 Mar 2026 16:31:58 +0800 Subject: [PATCH 3/7] Reduce unnecessary compilation time --- variants/gat562_mesh_watch13/platformio.ini | 61 +++++++++++---------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/variants/gat562_mesh_watch13/platformio.ini b/variants/gat562_mesh_watch13/platformio.ini index 16ecf84a..ef30829d 100644 --- a/variants/gat562_mesh_watch13/platformio.ini +++ b/variants/gat562_mesh_watch13/platformio.ini @@ -28,37 +28,38 @@ lib_deps = ${sensor_base.lib_deps} adafruit/Adafruit SSD1306 @ ^2.5.13 -[env:GAT562_Mesh_Watch13_repeater] -extends = GAT562_Mesh_Watch13 -build_flags = - ${GAT562_Mesh_Watch13.build_flags} - -D DISPLAY_CLASS=SSD1306Display - -D ADVERT_NAME='"GAT562 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 = ${GAT562_Mesh_Watch13.build_src_filter} - + - +<../examples/simple_repeater> -[env:GAT562_Mesh_Watch13_room_server] -extends = GAT562_Mesh_Watch13 -build_flags = - ${GAT562_Mesh_Watch13.build_flags} - -D DISPLAY_CLASS=SSD1306Display - -D ADVERT_NAME='"GAT562 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 = ${GAT562_Mesh_Watch13.build_src_filter} - + - +<../examples/simple_room_server> +;[env:GAT562_Mesh_Watch13_repeater] +;extends = GAT562_Mesh_Watch13 +;build_flags = +; ${GAT562_Mesh_Watch13.build_flags} +; -D DISPLAY_CLASS=SSD1306Display +; -D ADVERT_NAME='"GAT562 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 = ${GAT562_Mesh_Watch13.build_src_filter} +; + +; +<../examples/simple_repeater> + +;[env:GAT562_Mesh_Watch13_room_server] +;extends = GAT562_Mesh_Watch13 +;build_flags = +; ${GAT562_Mesh_Watch13.build_flags} +; -D DISPLAY_CLASS=SSD1306Display +; -D ADVERT_NAME='"GAT562 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 = ${GAT562_Mesh_Watch13.build_src_filter} +; + +; +<../examples/simple_room_server> [env:GAT562_Mesh_Watch13_companion_radio_ble] extends = GAT562_Mesh_Watch13 From 6fb8e60b5fc855e391721e74b6e083509ceb1ffc Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Mon, 30 Mar 2026 11:53:27 +1100 Subject: [PATCH 4/7] * number_allocations.md data-type range changes --- docs/number_allocations.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/number_allocations.md b/docs/number_allocations.md index ea36f830..7f7e9372 100644 --- a/docs/number_allocations.md +++ b/docs/number_allocations.md @@ -8,9 +8,11 @@ The `PAYLOAD_TYPE_GRP_DATA` payloads have a 16-bit data-type field, which identi To make sure multiple applications can function without interfering with each other, the table below is for reserving various ranges of data-type values. Just modify this table, adding a row, then submit a PR to have it authorised/merged. -The 16-bit types are allocated in blocks of 16, ie. the lower 4-bits is the range. +NOTE: the range FF00 - FFFF is for use while you're developing, doing POC, and for these you don't need to request to use/allocate. -| Data-Type range | App name | Contact | -|-----------------|--------------------------|------------------------------------------------------| -| 000x | -reserved- | | -| FFFx | -reserved- | | +(add rows, using the range 0100 - FEFF for custom apps) + +| Data-Type range | App name | Contact | +|-----------------|-----------------------------|------------------------------------------------------| +| 0000 - 00FF | -reserved for internal use- | | +| FF00 - FFFF | -reserved for testing/dev- | | From efc875b1b6701e0b8389f2294755787f6864a667 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Mon, 30 Mar 2026 13:53:16 +1100 Subject: [PATCH 5/7] * more notes about number_allocations --- docs/number_allocations.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/number_allocations.md b/docs/number_allocations.md index 7f7e9372..94ad1efd 100644 --- a/docs/number_allocations.md +++ b/docs/number_allocations.md @@ -10,9 +10,11 @@ To make sure multiple applications can function without interfering with each ot NOTE: the range FF00 - FFFF is for use while you're developing, doing POC, and for these you don't need to request to use/allocate. -(add rows, using the range 0100 - FEFF for custom apps) +Once you have a working app/project, you need to be able to demonstrate it exists/works, and THEN request type IDs. So, just use the testing/dev range while developing, then request IDs before you transition to publishing your project. | Data-Type range | App name | Contact | |-----------------|-----------------------------|------------------------------------------------------| | 0000 - 00FF | -reserved for internal use- | | | FF00 - FFFF | -reserved for testing/dev- | | + +(add rows, inside the range 0100 - FEFF for custom apps) From 811ac1cd023693f5125955918955a7384eaf52cd Mon Sep 17 00:00:00 2001 From: Brian Widdas Date: Mon, 30 Mar 2026 04:25:08 +0100 Subject: [PATCH 6/7] Add missing methods in ESPNOWRadio() ESP-NOW radios (ie, Generic_ESPNOW_* variants) do not compile due to missing methods Changes in January 2026 (019bbf74) to add additional stats (receive errors) to CMD_GET_STATS was not implemented in the ESPNOWRadio() class Changes in March 2026 (9a95e25e) to add setRxBoostedGainMode to all devices rather than just SX1262/SX1268 were not applied to the ESPNowRadio() driver Specifically, this change adds the following to ESPNOWRadio() * getPacketsRecvErrors() - always returns 0 * getRxBoostedGainMode() - always returns false * setRxBoostedGainMode() - does nothing --- src/helpers/esp32/ESPNOWRadio.h | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/helpers/esp32/ESPNOWRadio.h b/src/helpers/esp32/ESPNOWRadio.h index c696da3a..43772e5e 100644 --- a/src/helpers/esp32/ESPNOWRadio.h +++ b/src/helpers/esp32/ESPNOWRadio.h @@ -4,10 +4,10 @@ class ESPNOWRadio : public mesh::Radio { protected: - uint32_t n_recv, n_sent; + uint32_t n_recv, n_sent, n_recv_errors; public: - ESPNOWRadio() { n_recv = n_sent = 0; } + ESPNOWRadio() { n_recv = n_sent = n_recv_errors = 0; } void init(); int recvRaw(uint8_t* bytes, int sz) override; @@ -19,12 +19,21 @@ public: uint32_t getPacketsRecv() const { return n_recv; } uint32_t getPacketsSent() const { return n_sent; } - void resetStats() { n_recv = n_sent = 0; } + uint32_t getPacketsRecvErrors() const { return n_recv_errors; } + void resetStats() { n_recv = n_sent = n_recv_errors = 0; } virtual float getLastRSSI() const override; virtual float getLastSNR() const override; float packetScore(float snr, int packet_len) override { return 0; } + + /** + * These two functions do nothing for ESP-NOW, but are needed for the + * Radio interface. + */ + virtual void setRxBoostedGainMode(bool) { } + virtual bool getRxBoostedGainMode() const { return false; } + uint32_t intID(); void setTxPower(uint8_t dbm); }; From 08de3fb01feca9ca11cff222e22b499ebf0f62af Mon Sep 17 00:00:00 2001 From: terminalvelocity23 Date: Mon, 30 Mar 2026 22:35:05 +0300 Subject: [PATCH 7/7] Make sendNodeDiscoverReq() public for post-boot discovery --- examples/simple_repeater/MyMesh.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/simple_repeater/MyMesh.h b/examples/simple_repeater/MyMesh.h index 92958448..88729ea7 100644 --- a/examples/simple_repeater/MyMesh.h +++ b/examples/simple_repeater/MyMesh.h @@ -119,7 +119,6 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { #endif void putNeighbour(const mesh::Identity& id, uint32_t timestamp, float snr); - void sendNodeDiscoverReq(); uint8_t handleLoginReq(const mesh::Identity& sender, const uint8_t* secret, uint32_t sender_timestamp, const uint8_t* data, bool is_flood); uint8_t handleAnonRegionsReq(const mesh::Identity& sender, uint32_t sender_timestamp, const uint8_t* data); uint8_t handleAnonOwnerReq(const mesh::Identity& sender, uint32_t sender_timestamp, const uint8_t* data); @@ -177,7 +176,7 @@ public: MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables); void begin(FILESYSTEM* fs); - + void sendNodeDiscoverReq(); const char* getFirmwareVer() override { return FIRMWARE_VERSION; } const char* getBuildDate() override { return FIRMWARE_BUILD_DATE; } const char* getRole() override { return FIRMWARE_ROLE; }