Explorar el Código

Initial commit with t-beam supreme sx1262 additions

cod3doomy hace 1 año
padre
commit
6092f5737c

+ 51 - 0
boards/t_beams3_supreme.json

@@ -0,0 +1,51 @@
+{
+    "build": {
+      "arduino":{
+        "ldscript": "esp32s3_out.ld",
+        "partitions": "default.csv",
+        "memory_type": "qio_qspi"
+      },
+      "core": "esp32",
+      "extra_flags": [
+        "-DARDUINO_USB_MODE=1",
+        "-DARDUINO_USB_CDC_ON_BOOT=1",
+        "-DARDUINO_RUNNING_CORE=1",
+        "-DARDUINO_EVENT_RUNNING_CORE=1"
+      ],
+      "f_cpu": "240000000L",
+      "f_flash": "80000000L",
+      "flash_mode": "qio",
+      "hwids": [
+        [
+          "0x303A",
+          "0x1001"
+        ]
+      ],
+      "mcu": "esp32s3",
+      "variant": "esp32s3"
+    },
+    "connectivity": [
+      "wifi"
+    ],
+    "debug": {
+      "default_tool": "esp-builtin",
+      "onboard_tools": [
+        "esp-builtin"
+      ],
+      "openocd_target": "esp32s3.cfg"
+    },
+    "frameworks": [
+      "arduino",
+      "espidf"
+    ],
+    "name": "LilyGo T-Beam supreme (8MB Flash 8MB PSRAM)",
+    "upload": {
+      "flash_size": "8MB",
+      "maximum_ram_size": 327680,
+      "maximum_size": 8388608,
+      "require_upload_port": true,
+      "speed": 460800
+    },
+    "url": "https://www.lilygo.cc/products/t-beamsupreme-m",
+    "vendor": "LilyGo"
+  }

+ 1376 - 26
platformio.ini

@@ -9,28 +9,26 @@
 ; https://docs.platformio.org/page/projectconf.html
 
 [platformio]
-extra_configs =
+extra_configs = 
 	variants/*/platformio.ini
 
 [arduino_base]
 framework = arduino
 monitor_speed = 115200
-lib_deps =
-  SPI
-  Wire
-  jgromes/RadioLib @ ^7.1.2
-  rweather/Crypto @ ^0.4.0
-  adafruit/RTClib @ ^2.1.3
-  melopero/Melopero RV3028 @ ^1.1.0
+lib_deps = 
+	SPI
+	Wire
+	jgromes/RadioLib @ ^7.1.2
+	rweather/Crypto @ ^0.4.0
+	adafruit/RTClib @ ^2.1.3
+	melopero/Melopero RV3028 @ ^1.1.0
 build_flags = -w -DNDEBUG -DRADIOLIB_STATIC_ONLY=1 -DRADIOLIB_GODMODE=1
-  -D LORA_FREQ=869.525
-  -D LORA_BW=250
-  -D LORA_SF=10
-build_src_filter =
-  +<*.cpp>
-  +<helpers/*.cpp>
-
-; ----------------- ESP32 ---------------------
+	-D LORA_FREQ=869.525
+	-D LORA_BW=250
+	-D LORA_SF=10
+build_src_filter = 
+	+<*.cpp>
+	+<helpers/*.cpp>
 
 [esp32_base]
 extends = arduino_base
@@ -38,25 +36,1377 @@ platform = espressif32
 monitor_filters = esp32_exception_decoder
 extra_scripts = merge-bin.py
 build_flags = ${arduino_base.build_flags}
-;  -D ESP32_CPU_FREQ=80          ; change it to your need
 build_src_filter = ${arduino_base.build_src_filter}
 
 [esp32_ota]
-lib_deps =
-  me-no-dev/ESPAsyncWebServer @ ^3.6.0
-  file://arch/esp32/AsyncElegantOTA
+lib_deps = 
+	me-no-dev/ESPAsyncWebServer @ ^3.6.0
+	file://arch/esp32/AsyncElegantOTA
 
-; ----------------- NRF52 ---------------------
 [nrf52_base]
 extends = arduino_base
 platform = nordicnrf52
 build_flags = ${arduino_base.build_flags}
-  -D NRF52_PLATFORM
+	-D NRF52_PLATFORM
 
 [nrf52840_base]
 extends = nrf52_base
 build_flags = ${nrf52_base.build_flags}
-lib_deps =
-  ${nrf52_base.lib_deps}
-  rweather/Crypto @ ^0.4.0
-  https://github.com/adafruit/Adafruit_nRF52_Arduino
+lib_deps = 
+	${nrf52_base.lib_deps}
+	rweather/Crypto @ ^0.4.0
+	https://github.com/adafruit/Adafruit_nRF52_Arduino
+
+[Generic_ESPNOW]
+extends = esp32_base
+board = esp32-c3-devkitm-1
+build_flags = 
+	${esp32_base.build_flags}
+	-I variants/generic_espnow
+	-D PIN_BOARD_SDA=-1
+	-D PIN_BOARD_SCL=-1
+	-D PIN_USER_BTN=0
+build_src_filter = ${esp32_base.build_src_filter}
+	+<helpers/esp32/ESPNowRadio.cpp>
+	+<../variants/generic_espnow>
+
+[env:Generic_ESPNOW_terminal_chat]
+extends = Generic_ESPNOW
+build_flags = 
+	${Generic_ESPNOW.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=1
+build_src_filter = ${Generic_ESPNOW.build_src_filter}
+	+<../examples/simple_secure_chat/main.cpp>
+lib_deps = 
+	${Generic_ESPNOW.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Generic_ESPNOW_repeatr]
+extends = Generic_ESPNOW
+build_flags = 
+	${Generic_ESPNOW.build_flags}
+	-D ADVERT_NAME='"ESPNOW Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+build_src_filter = ${Generic_ESPNOW.build_src_filter}
+	+<../examples/simple_repeater/main.cpp>
+lib_deps = 
+	${Generic_ESPNOW.lib_deps}
+	${esp32_ota.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Generic_ESPNOW_comp_radio_usb]
+extends = Generic_ESPNOW
+build_flags = 
+	${Generic_ESPNOW.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+build_src_filter = ${Generic_ESPNOW.build_src_filter}
+	+<../examples/companion_radio/main.cpp>
+lib_deps = 
+	${Generic_ESPNOW.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Generic_ESPNOW_room_svr]
+extends = Generic_ESPNOW
+build_flags = 
+	${Generic_ESPNOW.build_flags}
+	-D ADVERT_NAME='"Heltec Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D ROOM_PASSWORD='"hello"'
+build_src_filter = ${Generic_ESPNOW.build_src_filter}
+	+<../examples/simple_room_server/main.cpp>
+lib_deps = 
+	${Generic_ESPNOW.lib_deps}
+	${esp32_ota.lib_deps}
+
+[Heltec_lora32_v2]
+extends = esp32_base
+board = heltec_wifi_lora_32_V2
+build_flags = 
+	${esp32_base.build_flags}
+	-I variants/heltec_v2
+	-D HELTEC_LORA_V2
+	-D PIN_BOARD_SDA=4
+	-D PIN_BOARD_SCL=15
+	-D PIN_USER_BTN=0
+	-D PIN_OLED_RESET=16
+	-D RADIO_CLASS=CustomSX1276
+	-D WRAPPER_CLASS=CustomSX1276Wrapper
+	-D LORA_TX_POWER=20
+	-D P_LORA_TX_LED=25
+build_src_filter = ${esp32_base.build_src_filter}
+	+<../variants/heltec_v2>
+lib_deps = 
+	${esp32_base.lib_deps}
+	adafruit/Adafruit SSD1306 @ ^2.5.13
+
+[env:Heltec_v2_repeater]
+extends = Heltec_lora32_v2
+build_flags = 
+	${Heltec_lora32_v2.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D ADVERT_NAME='"Heltec Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+build_src_filter = ${Heltec_lora32_v2.build_src_filter}
+	+<../examples/simple_repeater>
+	+<helpers/ui/*.cpp>
+lib_deps = 
+	${Heltec_lora32_v2.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:Heltec_v2_room_server]
+extends = Heltec_lora32_v2
+build_flags = 
+	${Heltec_lora32_v2.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D ADVERT_NAME='"Heltec Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D ROOM_PASSWORD='"hello"'
+build_src_filter = ${Heltec_lora32_v2.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_room_server>
+lib_deps = 
+	${Heltec_lora32_v2.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:Heltec_v2_terminal_chat]
+extends = Heltec_lora32_v2
+build_flags = 
+	${Heltec_lora32_v2.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=1
+build_src_filter = ${Heltec_lora32_v2.build_src_filter}
+	+<../examples/simple_secure_chat/main.cpp>
+lib_deps = 
+	${Heltec_lora32_v2.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Heltec_v2_companion_radio_usb]
+extends = Heltec_lora32_v2
+build_flags = 
+	${Heltec_lora32_v2.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+build_src_filter = ${Heltec_lora32_v2.build_src_filter}
+	+<helpers/esp32/*.cpp>
+	+<helpers/ui/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${Heltec_lora32_v2.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Heltec_v2_companion_radio_ble]
+extends = Heltec_lora32_v2
+build_flags = 
+	${Heltec_lora32_v2.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D BLE_PIN_CODE=0
+	-D BLE_DEBUG_LOGGING=1
+build_src_filter = ${Heltec_lora32_v2.build_src_filter}
+	+<helpers/esp32/*.cpp>
+	+<helpers/ui/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${Heltec_lora32_v2.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[Heltec_lora32_v3]
+extends = esp32_base
+board = esp32-s3-devkitc-1
+build_flags = 
+	${esp32_base.build_flags}
+	-I variants/heltec_v3
+	-D HELTEC_LORA_V3
+	-D RADIO_CLASS=CustomSX1262
+	-D WRAPPER_CLASS=CustomSX1262Wrapper
+	-D LORA_TX_POWER=22
+	-D P_LORA_TX_LED=35
+	-D PIN_BOARD_SDA=17
+	-D PIN_BOARD_SCL=18
+	-D PIN_USER_BTN=0
+	-D SX126X_DIO2_AS_RF_SWITCH=true
+	-D SX126X_DIO3_TCXO_VOLTAGE=1.8
+	-D SX126X_CURRENT_LIMIT=130.0f
+	-D SX126X_RX_BOOSTED_GAIN=1
+build_src_filter = ${esp32_base.build_src_filter}
+	+<../variants/heltec_v3>
+lib_deps = 
+	${esp32_base.lib_deps}
+	adafruit/Adafruit SSD1306 @ ^2.5.13
+
+[env:Heltec_v3_repeater]
+extends = Heltec_lora32_v3
+build_flags = 
+	${Heltec_lora32_v3.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D ADVERT_NAME='"Heltec Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D MESH_PACKET_LOGGING=1
+build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_repeater>
+lib_deps = 
+	${Heltec_lora32_v3.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:Heltec_v3_room_server]
+extends = Heltec_lora32_v3
+build_flags = 
+	${Heltec_lora32_v3.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D ADVERT_NAME='"Heltec Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D ROOM_PASSWORD='"hello"'
+build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_room_server>
+lib_deps = 
+	${Heltec_lora32_v3.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:Heltec_v3_terminal_chat]
+extends = Heltec_lora32_v3
+build_flags = 
+	${Heltec_lora32_v3.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=1
+build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+	+<../examples/simple_secure_chat/main.cpp>
+lib_deps = 
+	${Heltec_lora32_v3.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Heltec_v3_companion_radio_usb]
+extends = Heltec_lora32_v3
+build_flags = 
+	${Heltec_lora32_v3.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D DISPLAY_CLASS=SSD1306Display
+build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${Heltec_lora32_v3.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Heltec_v3_companion_radio_ble]
+extends = Heltec_lora32_v3
+build_flags = 
+	${Heltec_lora32_v3.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D DISPLAY_CLASS=SSD1306Display
+	-D BLE_PIN_CODE=0
+	-D BLE_DEBUG_LOGGING=1
+build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<helpers/esp32/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${Heltec_lora32_v3.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Heltec_v3_companion_radio_wifi]
+extends = Heltec_lora32_v3
+build_flags = 
+	${Heltec_lora32_v3.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D DISPLAY_CLASS=SSD1306Display
+	-D WIFI_DEBUG_LOGGING=1
+	-D WIFI_SSID='"myssid"'
+	-D WIFI_PWD='"mypwd"'
+build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<helpers/esp32/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${Heltec_lora32_v3.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Heltec_WSL3_repeater]
+extends = Heltec_lora32_v3
+build_flags = 
+	${Heltec_lora32_v3.build_flags}
+	-D ADVERT_NAME='"Heltec Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D MESH_PACKET_LOGGING=1
+build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+	+<../examples/simple_repeater>
+lib_deps = 
+	${Heltec_lora32_v3.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:Heltec_WSL3_room_server]
+extends = Heltec_lora32_v3
+build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+	+<../examples/simple_room_server>
+build_flags = 
+	${Heltec_lora32_v3.build_flags}
+	-D ADVERT_NAME='"Heltec Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D ROOM_PASSWORD='"hello"'
+lib_deps = 
+	${Heltec_lora32_v3.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:Heltec_WSL3_companion_radio_ble]
+extends = Heltec_lora32_v3
+build_flags = 
+	${Heltec_lora32_v3.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D BLE_PIN_CODE=123456
+	-D BLE_DEBUG_LOGGING=1
+build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+	+<helpers/esp32/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${Heltec_lora32_v3.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[LilyGo_T3S3_sx1262]
+extends = esp32_base
+board = t3_s3_v1_x
+build_flags = 
+	${esp32_base.build_flags}
+	-I variants/lilygo_t3s3
+	-D LILYGO_T3S3
+	-D P_LORA_DIO_1=33
+	-D P_LORA_NSS=7
+	-D P_LORA_RESET=8
+	-D P_LORA_BUSY=34
+	-D P_LORA_SCLK=5
+	-D P_LORA_MISO=3
+	-D P_LORA_MOSI=6
+	-D P_LORA_TX_LED=37
+	-D PIN_VBAT_READ=1
+	-D PIN_USER_BTN=0
+	-D PIN_BOARD_SDA=18
+	-D PIN_BOARD_SCL=17
+	-D P_LORA_TX_LED=37
+	-D PIN_OLED_RESET=21
+	-D SX126X_DIO2_AS_RF_SWITCH=true
+	-D SX126X_DIO3_TCXO_VOLTAGE=1.8
+	-D SX126X_CURRENT_LIMIT=130
+	-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/lilygo_t3s3>
+lib_deps = 
+	${esp32_base.lib_deps}
+	adafruit/Adafruit SSD1306 @ ^2.5.13
+
+[env:LilyGo_T3S3_sx1262_Repeater]
+extends = LilyGo_T3S3_sx1262
+build_flags = 
+	${LilyGo_T3S3_sx1262.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D ADVERT_NAME='"T3S3-1262 Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+build_src_filter = ${LilyGo_T3S3_sx1262.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_repeater>
+lib_deps = 
+	${LilyGo_T3S3_sx1262.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:LilyGo_T3S3_sx1262_terminal_chat]
+extends = LilyGo_T3S3_sx1262
+build_flags = 
+	${LilyGo_T3S3_sx1262.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=1
+build_src_filter = ${LilyGo_T3S3_sx1262.build_src_filter}
+	+<../examples/simple_secure_chat/main.cpp>
+lib_deps = 
+	${LilyGo_T3S3_sx1262.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:LilyGo_T3S3_sx1262_room_server]
+extends = LilyGo_T3S3_sx1262
+build_flags = 
+	${LilyGo_T3S3_sx1262.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D ADVERT_NAME='"T3S3-1262 Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D ROOM_PASSWORD='"hello"'
+build_src_filter = ${LilyGo_T3S3_sx1262.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_room_server>
+lib_deps = 
+	${LilyGo_T3S3_sx1262.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:LilyGo_T3S3_sx1262_companion_radio_usb]
+extends = LilyGo_T3S3_sx1262
+build_flags = 
+	${LilyGo_T3S3_sx1262.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+build_src_filter = ${LilyGo_T3S3_sx1262.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${LilyGo_T3S3_sx1262.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:LilyGo_T3S3_sx1262_companion_radio_ble]
+extends = LilyGo_T3S3_sx1262
+build_flags = 
+	${LilyGo_T3S3_sx1262.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D BLE_PIN_CODE=123456
+	-D BLE_DEBUG_LOGGING=1
+build_src_filter = ${LilyGo_T3S3_sx1262.build_src_filter}
+	+<helpers/esp32/*.cpp>
+	+<helpers/ui/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${LilyGo_T3S3_sx1262.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[LilyGo_TBeam]
+extends = esp32_base
+board = ttgo-t-beam
+build_flags = 
+	${esp32_base.build_flags}
+	-I variants/lilygo_tbeam
+	-D LILYGO_TBEAM
+	-D RADIO_CLASS=CustomSX1276
+	-D WRAPPER_CLASS=CustomSX1276Wrapper
+	-D LORA_TX_POWER=20
+	-D P_LORA_TX_LED=4
+	-D PIN_BOARD_SDA=21
+	-D PIN_BOARD_SCL=22
+	-D PIN_USER_BTN=38
+build_src_filter = ${esp32_base.build_src_filter}
+	+<../variants/lilygo_tbeam>
+board_build.partitions = min_spiffs.csv
+lib_deps = 
+	${esp32_base.lib_deps}
+	lewisxhe/XPowersLib@^0.2.7
+	adafruit/Adafruit SSD1306 @ ^2.5.13
+
+[env:Tbeam_companion_radio_ble]
+extends = LilyGo_TBeam
+board_build.upload.maximum_ram_size = 2000000
+build_flags = 
+	${LilyGo_TBeam.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=1
+	-D BLE_PIN_CODE=123456
+	-D BLE_DEBUG_LOGGING=1
+	-D MESH_PACKET_LOGGING=1
+	-D MESH_DEBUG=1
+	-D RADIOLIB_DEBUG_BASIC=1
+build_src_filter = ${LilyGo_TBeam.build_src_filter}
+	+<helpers/esp32/*.cpp>
+	+<helpers/ui/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${LilyGo_TBeam.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Tbeam_repeater]
+extends = LilyGo_TBeam
+build_flags = 
+	${LilyGo_TBeam.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D ADVERT_NAME='"Tbeam Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D MESH_PACKET_LOGGING=1
+build_src_filter = ${LilyGo_TBeam.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_repeater>
+lib_deps = 
+	${LilyGo_TBeam.lib_deps}
+	${esp32_ota.lib_deps}
+
+[T_Beam_S3_Supreme_SX1262]
+extends = esp32_base
+board = t_beams3_supreme
+build_flags = 
+	${esp32_base.build_flags}
+	-I variants/lilygo_tbeam_supreme_SX1262
+	-D T_BEAM_S3_SUPREME_SX1262
+	-D BOARD_HAS_PSRAM
+	-D LORA_TX_POWER=22
+	-D SX126X_DIO2_AS_RF_SWITCH=true
+	-D SX126X_DIO3_TCXO_VOLTAGE=1.8
+	-D SX126X_CURRENT_LIMIT=130
+	-D RADIO_CLASS=CustomSX1262
+	-D WRAPPER_CLASS=CustomSX1262Wrapper
+	-D DISPLAY_CLASS=SSD1306Display
+	-D SX126X_RX_BOOSTED_GAIN=1
+lib_deps = 
+	${esp32_base.lib_deps}
+	adafruit/Adafruit SSD1306 @ ^2.5.13
+
+[env:T_Beam_S3_Supreme_SX1262_Repeater]
+extends = T_Beam_S3_Supreme_SX1262
+build_src_filter = ${T_Beam_S3_Supreme_SX1262.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_repeater>
+build_flags = 
+	${T_Beam_S3_Supreme_SX1262.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D ADVERT_NAME='"T-Beam S3 Supreme SX1262 Repeater"'
+	-D ADVERT_LAT=0
+	-D ADVERT_LON=0
+	-D ADMIN_PASSWORD='"password"'
+lib_deps = 
+	esphome/AsyncTCP-esphome@^2.1.4
+	esphome/ESPAsyncWebServer-esphome@^3.3.0
+	wolfssl/wolfssl@^5.7.2
+	rweather/Crypto@^0.4.0
+	jgromes/RadioLib@^7.1.2
+	adafruit/RTClib@^2.1.4
+	adafruit/Adafruit GFX Library@^1.12.0
+	melopero/Melopero RV3028@^1.1.0
+	adafruit/Adafruit SSD1306@^2.5.13
+
+[LilyGo_TLora_V2_1_1_6]
+extends = esp32_base
+board = ttgo-lora32-v1
+build_unflags = -Os
+build_type = release
+board_build.partitions = min_spiffs.csv
+build_flags = 
+	${esp32_base.build_flags}
+	-I variants/lilygo_tlora_v2_1
+	-Os -ffunction-sections -fdata-sections
+	-D LILYGO_TLORA
+	-D P_LORA_DIO_0=26
+	-D P_LORA_DIO_1=33
+	-D P_LORA_NSS=18
+	-D P_LORA_RESET=14
+	-D P_LORA_SCLK=5
+	-D P_LORA_MISO=19
+	-D P_LORA_MOSI=27
+	-D P_LORA_TX_LED=2
+	-D PIN_VBAT_READ=35
+	-D PIN_USER_BTN=0
+	-D RADIO_CLASS=CustomSX1276
+	-D ARDUINO_LOOP_STACK_SIZE=16384
+	-D DISPLAY_CLASS=SSD1306Display
+	-D WRAPPER_CLASS=CustomSX1276Wrapper
+	-D LORA_TX_POWER=20
+build_src_filter = ${esp32_base.build_src_filter}
+	+<../variants/lilygo_tlora_v2_1>
+lib_deps = 
+	${esp32_base.lib_deps}
+	adafruit/Adafruit SSD1306 @ ^2.5.13
+
+[env:LilyGo_TLora_V2_1_1_6_Repeater]
+extends = LilyGo_TLora_V2_1_1_6
+build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_repeater>
+build_flags = 
+	${LilyGo_TLora_V2_1_1_6.build_flags}
+	-D ADVERT_NAME='"TLora-V2.1-1.6 Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+lib_deps = 
+	${LilyGo_TLora_V2_1_1_6.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:LilyGo_TLora_V2_1_1_6_terminal_chat]
+extends = LilyGo_TLora_V2_1_1_6
+build_flags = 
+	${LilyGo_TLora_V2_1_1_6.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_repeater>
+lib_deps = 
+	${LilyGo_TLora_V2_1_1_6.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:LilyGo_TLora_V2_1_1_6_companion_radio_usb]
+extends = LilyGo_TLora_V2_1_1_6
+build_flags = 
+	${LilyGo_TLora_V2_1_1_6.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${LilyGo_TLora_V2_1_1_6.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:LilyGo_TLora_V2_1_1_6_companion_radio_ble]
+extends = LilyGo_TLora_V2_1_1_6
+build_flags = 
+	${LilyGo_TLora_V2_1_1_6.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D BLE_PIN_CODE=123456
+build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+	+<helpers/esp32/*.cpp>
+	+<helpers/ui/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${LilyGo_TLora_V2_1_1_6.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:LilyGo_TLora_V2_1_1_6_room_server]
+extends = LilyGo_TLora_V2_1_1_6
+build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_room_server>
+build_flags = 
+	${LilyGo_TLora_V2_1_1_6.build_flags}
+	-D ADVERT_NAME='"TLora-V2.1-1.6 Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D ROOM_PASSWORD='"hello"'
+lib_deps = 
+	${LilyGo_TLora_V2_1_1_6.lib_deps}
+	${esp32_ota.lib_deps}
+
+[Faketec]
+extends = nrf52840_base
+board = promicro_nrf52840
+build_flags = ${nrf52840_base.build_flags}
+	-I variants/promicro
+	-D FAKETEC
+	-D RADIO_CLASS=CustomSX1262
+	-D WRAPPER_CLASS=CustomSX1262Wrapper
+	-D LORA_TX_POWER=22
+	-D SX126X_CURRENT_LIMIT=130
+	-D SX126X_RX_BOOSTED_GAIN=1
+	-D DISPLAY_CLASS=SSD1306Display
+	-D PIN_BOARD_SCL=7
+	-D PIN_BOARD_SDA=8
+	-D PIN_OLED_RESET=-1
+	-D PIN_USER_BTN=6
+build_src_filter = ${nrf52840_base.build_src_filter}
+	+<helpers/nrf52/PromicroBoard.cpp>
+	+<../variants/promicro>
+lib_deps = 
+	${nrf52840_base.lib_deps}
+	adafruit/Adafruit SSD1306 @ ^2.5.13
+
+[env:Faketec_Repeater]
+extends = Faketec
+build_src_filter = ${Faketec.build_src_filter} +<../examples/simple_repeater> +<helpers/ui/*.cpp>
+build_flags = 
+	${Faketec.build_flags}
+	-D ADVERT_NAME="\"Faketec Repeater\""
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD="\"password\""
+lib_deps = 
+	${Faketec.lib_deps}
+	adafruit/RTClib @ ^2.1.3
+
+[env:Faketec_room_server]
+extends = Faketec
+build_src_filter = ${Faketec.build_src_filter} +<../examples/simple_room_server> +<helpers/ui/*.cpp>
+build_flags = 
+	${Faketec.build_flags}
+	-D ADVERT_NAME="\"Test Room\""
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD="\"password\""
+	-D ROOM_PASSWORD="\"hello\""
+lib_deps = 
+	${Faketec.lib_deps}
+	adafruit/RTClib @ ^2.1.3
+
+[env:Faketec_terminal_chat]
+extends = Faketec
+build_flags = 
+	${Faketec.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=1
+build_src_filter = ${Faketec.build_src_filter} +<../examples/simple_secure_chat/main.cpp>
+lib_deps = 
+	${Faketec.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+	adafruit/RTClib @ ^2.1.3
+
+[env:Faketec_companion_radio_usb]
+extends = Faketec
+build_flags = 
+	${Faketec.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+build_src_filter = ${Faketec.build_src_filter} +<../examples/companion_radio>  +<../examples/companion_radio> +<helpers/ui/*.cpp>
+lib_deps = 
+	${Faketec.lib_deps}
+	adafruit/RTClib @ ^2.1.3
+	densaugeo/base64 @ ~1.4.0
+
+[env:Faketec_companion_radio_ble]
+extends = Faketec
+build_flags = 
+	${Faketec.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D BLE_PIN_CODE=123456
+	-D BLE_DEBUG_LOGGING=1
+	-D ENABLE_PRIVATE_KEY_EXPORT=1
+	-D ENABLE_PRIVATE_KEY_IMPORT=1
+build_src_filter = ${Faketec.build_src_filter} +<helpers/nrf52/SerialBLEInterface.cpp> +<../examples/companion_radio> +<helpers/ui/*.cpp>
+lib_deps = 
+	${Faketec.lib_deps}
+	adafruit/RTClib @ ^2.1.3
+	densaugeo/base64 @ ~1.4.0
+
+[ProMicroLLCC68]
+extends = nrf52840_base
+board = promicro_nrf52840
+build_flags = ${nrf52840_base.build_flags}
+	-I variants/promicro
+	-D PROMICROLLCC68
+	-D RADIO_CLASS=CustomLLCC68
+	-D WRAPPER_CLASS=CustomLLCC68Wrapper
+	-D LORA_TX_POWER=22
+	-D SX126X_CURRENT_LIMIT=130
+	-D SX126X_RX_BOOSTED_GAIN=1
+build_src_filter = ${nrf52840_base.build_src_filter}
+	+<helpers/nrf52/PromicroBoard.cpp>
+	+<../variants/promicro>
+
+[env:ProMicroLLCC68_Repeater]
+extends = ProMicroLLCC68
+build_src_filter = ${ProMicroLLCC68.build_src_filter} +<../examples/simple_repeater/main.cpp>
+build_flags = 
+	${ProMicroLLCC68.build_flags}
+	-D ADVERT_NAME="\"ProMicroLLCC68 Repeater\""
+	-D ADMIN_PASSWORD="\"password\""
+lib_deps = 
+	${ProMicroLLCC68.lib_deps}
+	adafruit/RTClib @ ^2.1.3
+
+[env:ProMicroLLCC68_room_server]
+extends = ProMicroLLCC68
+build_src_filter = ${ProMicroLLCC68.build_src_filter} +<../examples/simple_room_server/main.cpp>
+build_flags = 
+	${ProMicroLLCC68.build_flags}
+	-D ADVERT_NAME="\"ProMicroLLCC68 Room\""
+	-D ADMIN_PASSWORD="\"password\""
+	-D ROOM_PASSWORD="\"hello\""
+lib_deps = 
+	${ProMicroLLCC68.lib_deps}
+	adafruit/RTClib @ ^2.1.3
+
+[env:ProMicroLLCC68_terminal_chat]
+extends = ProMicroLLCC68
+build_flags = 
+	${ProMicroLLCC68.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=1
+build_src_filter = ${ProMicroLLCC68.build_src_filter} +<../examples/simple_secure_chat/main.cpp>
+lib_deps = 
+	${ProMicroLLCC68.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+	adafruit/RTClib @ ^2.1.3
+
+[env:ProMicroLLCC68_companion_radio_usb]
+extends = ProMicroLLCC68
+build_flags = 
+	${ProMicroLLCC68.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+build_src_filter = ${ProMicroLLCC68.build_src_filter} +<../examples/companion_radio/main.cpp>
+lib_deps = 
+	${ProMicroLLCC68.lib_deps}
+	adafruit/RTClib @ ^2.1.3
+	densaugeo/base64 @ ~1.4.0
+
+[env:ProMicroLLCC68_companion_radio_ble]
+extends = ProMicroLLCC68
+build_flags = 
+	${ProMicroLLCC68.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D BLE_PIN_CODE=123456
+	-D BLE_DEBUG_LOGGING=1
+	-D ENABLE_PRIVATE_KEY_EXPORT=1
+	-D ENABLE_PRIVATE_KEY_IMPORT=1
+build_src_filter = ${ProMicroLLCC68.build_src_filter} +<helpers/nrf52/SerialBLEInterface.cpp> +<../examples/companion_radio/main.cpp>
+lib_deps = 
+	${ProMicroLLCC68.lib_deps}
+	adafruit/RTClib @ ^2.1.3
+	densaugeo/base64 @ ~1.4.0
+
+[rak4631]
+extends = nrf52840_base
+platform = https://github.com/maxgerhardt/platform-nordicnrf52.git#rak
+board = wiscore_rak4631
+board_check = true
+build_flags = ${nrf52840_base.build_flags}
+	-I variants/rak4631
+	-D RAK_4631
+	-D PIN_USER_BTN=9
+	-D RADIO_CLASS=CustomSX1262
+	-D WRAPPER_CLASS=CustomSX1262Wrapper
+	-D LORA_TX_POWER=22
+	-D SX126X_CURRENT_LIMIT=130
+	-D SX126X_RX_BOOSTED_GAIN=1
+build_src_filter = ${nrf52840_base.build_src_filter}
+	+<helpers/nrf52/*.cpp>
+	+<../variants/rak4631>
+lib_deps = 
+	${nrf52840_base.lib_deps}
+	adafruit/Adafruit SSD1306 @ ^2.5.13
+
+[env:RAK_4631_Repeater]
+extends = rak4631
+build_flags = 
+	${rak4631.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D ADVERT_NAME='"RAK4631 Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+build_src_filter = ${rak4631.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_repeater>
+lib_deps = 
+	esphome/AsyncTCP-esphome@^2.1.4
+	esphome/ESPAsyncWebServer-esphome@^3.3.0
+	wolfssl/wolfssl@^5.7.2
+	rweather/Crypto@^0.4.0
+	jgromes/RadioLib@^7.1.2
+	adafruit/RTClib@^2.1.4
+	adafruit/Adafruit GFX Library@^1.12.0
+	melopero/Melopero RV3028@^1.1.0
+	adafruit/Adafruit SSD1306@^2.5.13
+
+[env:RAK_4631_room_server]
+extends = rak4631
+build_flags = 
+	${rak4631.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D ADVERT_NAME='"Test Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D ROOM_PASSWORD='"hello"'
+build_src_filter = ${rak4631.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/simple_room_server>
+lib_deps = 
+	esphome/AsyncTCP-esphome@^2.1.4
+	esphome/ESPAsyncWebServer-esphome@^3.3.0
+	wolfssl/wolfssl@^5.7.2
+	rweather/Crypto@^0.4.0
+	jgromes/RadioLib@^7.1.2
+	adafruit/RTClib@^2.1.4
+	adafruit/Adafruit GFX Library@^1.12.0
+	melopero/Melopero RV3028@^1.1.0
+	adafruit/Adafruit SSD1306@^2.5.13
+
+[env:RAK_4631_companion_radio_usb]
+extends = rak4631
+build_flags = 
+	${rak4631.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+build_src_filter = ${rak4631.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${rak4631.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:RAK_4631_companion_radio_ble]
+extends = rak4631
+build_flags = 
+	${rak4631.build_flags}
+	-D DISPLAY_CLASS=SSD1306Display
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D BLE_PIN_CODE=123456
+	-D BLE_DEBUG_LOGGING=1
+build_src_filter = ${rak4631.build_src_filter}
+	+<helpers/ui/*.cpp>
+	+<helpers/nrf52/*.cpp>
+	+<../examples/companion_radio>
+lib_deps = 
+	${rak4631.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:RAK_4631_terminal_chat]
+extends = rak4631
+build_flags = 
+	${rak4631.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=1
+	-D MESH_PACKET_LOGGING=1
+	-D MESH_DEBUG=1
+build_src_filter = ${rak4631.build_src_filter}
+	+<../examples/simple_secure_chat/main.cpp>
+lib_deps = 
+	${rak4631.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[Station_G2]
+extends = esp32_base
+board = station-g2
+build_flags = 
+	${esp32_base.build_flags}
+	-I variants/station_g2
+	-D STATION_G2
+	-D RADIO_CLASS=CustomSX1262
+	-D WRAPPER_CLASS=CustomSX1262Wrapper
+	-D LORA_TX_POWER=7
+	-D PIN_USER_BTN=0
+	-D SX126X_DIO2_AS_RF_SWITCH=true
+	-D SX126X_DIO3_TCXO_VOLTAGE=1.8
+	-D SX126X_CURRENT_LIMIT=130.0f
+build_src_filter = ${esp32_base.build_src_filter}
+	+<../variants/station_g2>
+lib_deps = 
+	${esp32_base.lib_deps}
+
+[env:Station_G2_repeater]
+extends = Station_G2
+build_flags = 
+	${Station_G2.build_flags}
+	-D ADVERT_NAME='"Station G2 Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D MESH_PACKET_LOGGING=1
+build_src_filter = ${Station_G2.build_src_filter}
+	+<../examples/simple_repeater>
+lib_deps = 
+	${Station_G2.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:Station_G2_room_server]
+extends = Station_G2
+build_src_filter = ${Station_G2.build_src_filter}
+	+<../examples/simple_room_server>
+build_flags = 
+	${Station_G2.build_flags}
+	-D ADVERT_NAME='"Station G2 Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D ROOM_PASSWORD='"hello"'
+lib_deps = 
+	${Station_G2.lib_deps}
+	${esp32_ota.lib_deps}
+
+[nrf52840_t1000e]
+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
+	lvgl
+	lib5b4
+lib_deps = 
+	${nrf52_base.lib_deps}
+	rweather/Crypto @ ^0.4.0
+
+[t1000-e]
+extends = nrf52840_t1000e
+board = tracker-t1000-e
+board_build.ldscript = boards/nrf52840_s140_v7.ld
+build_flags = ${nrf52840_t1000e.build_flags}
+	-I variants/t1000-e
+	-D T1000_E
+	-D PIN_USER_BTN=6
+	-D USER_BTN_PRESSED=HIGH
+	-D PIN_STATUS_LED=24
+	-D RADIO_CLASS=CustomLR1110
+	-D WRAPPER_CLASS=CustomLR1110Wrapper
+	-D LORA_TX_POWER=22
+build_src_filter = ${nrf52840_t1000e.build_src_filter}
+	+<helpers/*.cpp>
+	+<helpers/nrf52/T1000eBoard.cpp>
+	+<../variants/t1000-e>
+debug_tool = jlink
+upload_protocol = nrfutil
+
+[env:t1000e_companion_radio_ble]
+extends = t1000-e
+build_flags = ${t1000-e.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 RX_BOOSTED_GAIN=true
+	-D RF_SWITCH_TABLE
+	-D HAS_UI
+build_src_filter = ${t1000-e.build_src_filter}
+	+<helpers/nrf52/SerialBLEInterface.cpp>
+	+<../examples/companion_radio/*.cpp>
+lib_deps = ${t1000-e.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[nrf52840_t114]
+extends = nrf52_base
+platform_packages = framework-arduinoadafruitnrf52
+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
+
+[Heltec_t114]
+extends = nrf52840_t114
+board = heltec_t114
+board_build.ldscript = boards/nrf52840_s140_v6.ld
+build_flags = ${nrf52840_t114.build_flags}
+	-I variants/t114
+	-DHELTEC_T114
+	-D P_LORA_TX_LED=35
+	-D RADIO_CLASS=CustomSX1262
+	-D WRAPPER_CLASS=CustomSX1262Wrapper
+	-D LORA_TX_POWER=22
+	-D SX126X_CURRENT_LIMIT=130
+	-D SX126X_RX_BOOSTED_GAIN=1
+build_src_filter = ${nrf52840_t114.build_src_filter}
+	+<helpers/*.cpp>
+	+<helpers/nrf52/T114Board.cpp>
+	+<../variants/t114>
+debug_tool = jlink
+upload_protocol = nrfutil
+
+[env:Heltec_t114_repeater]
+extends = Heltec_t114
+build_src_filter = ${Heltec_t114.build_src_filter}
+	+<../examples/simple_repeater/main.cpp>
+build_flags = 
+	${Heltec_t114.build_flags}
+	-D ADVERT_NAME='"Heltec_T114 Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+lib_deps = 
+	esphome/AsyncTCP-esphome@^2.1.4
+	esphome/ESPAsyncWebServer-esphome@^3.3.0
+	wolfssl/wolfssl@^5.7.2
+	rweather/Crypto@^0.4.0
+	jgromes/RadioLib@^7.1.2
+	adafruit/RTClib@^2.1.4
+	adafruit/Adafruit GFX Library@^1.12.0
+	melopero/Melopero RV3028@^1.1.0
+	adafruit/Adafruit SSD1306@^2.5.13
+
+[env:Heltec_t114_room_server]
+extends = Heltec_t114
+build_src_filter = ${Heltec_t114.build_src_filter}
+	+<../examples/simple_room_server>
+build_flags = 
+	${Heltec_t114.build_flags}
+	-D ADVERT_NAME='"Heltec_T114 Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D ROOM_PASSWORD='"hello"'
+lib_deps = 
+	esphome/AsyncTCP-esphome@^2.1.4
+	esphome/ESPAsyncWebServer-esphome@^3.3.0
+	wolfssl/wolfssl@^5.7.2
+	rweather/Crypto@^0.4.0
+	jgromes/RadioLib@^7.1.2
+	adafruit/RTClib@^2.1.4
+	adafruit/Adafruit GFX Library@^1.12.0
+	melopero/Melopero RV3028@^1.1.0
+	adafruit/Adafruit SSD1306@^2.5.13
+
+[env:Heltec_t114_companion_radio_ble]
+extends = Heltec_t114
+build_flags = 
+	${Heltec_t114.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D BLE_PIN_CODE=123456
+	-D BLE_DEBUG_LOGGING=1
+build_src_filter = ${Heltec_t114.build_src_filter}
+	+<helpers/nrf52/*.cpp>
+	+<../examples/companion_radio/main.cpp>
+lib_deps = 
+	${Heltec_t114.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[nrf52840_techo]
+extends = nrf52_base
+platform_packages = framework-arduinoadafruitnrf52
+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
+
+[LilyGo_Techo]
+extends = nrf52840_techo
+board = t-echo
+board_build.ldscript = boards/nrf52840_s140_v6.ld
+build_flags = ${nrf52840_techo.build_flags}
+	-I variants/techo
+	-DLILYGO_TECHO
+	-D RADIO_CLASS=CustomSX1262
+	-D WRAPPER_CLASS=CustomSX1262Wrapper
+	-D LORA_TX_POWER=22
+	-D SX126X_CURRENT_LIMIT=130
+	-D SX126X_RX_BOOSTED_GAIN=1
+build_src_filter = ${nrf52840_techo.build_src_filter}
+	+<helpers/*.cpp>
+	+<helpers/nrf52/TechoBoard.cpp>
+	+<../variants/techo>
+debug_tool = jlink
+upload_protocol = nrfutil
+
+[env:LilyGo_T-Echo_repeater]
+extends = LilyGo_Techo
+build_src_filter = ${LilyGo_Techo.build_src_filter} +<../examples/simple_repeater/main.cpp>
+build_flags = 
+	${LilyGo_Techo.build_flags}
+	-D ADVERT_NAME='"T-Echo Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+lib_deps = 
+	esphome/AsyncTCP-esphome@^2.1.4
+	esphome/ESPAsyncWebServer-esphome@^3.3.0
+	wolfssl/wolfssl@^5.7.2
+	rweather/Crypto@^0.4.0
+	jgromes/RadioLib@^7.1.2
+	adafruit/RTClib@^2.1.4
+	adafruit/Adafruit GFX Library@^1.12.0
+	melopero/Melopero RV3028@^1.1.0
+	adafruit/Adafruit SSD1306@^2.5.13
+
+[env:LilyGo_T-Echo_room_server]
+extends = LilyGo_Techo
+build_src_filter = ${LilyGo_Techo.build_src_filter} +<../examples/simple_room_server/main.cpp>
+build_flags = 
+	${LilyGo_Techo.build_flags}
+	-D ADVERT_NAME='"T-Echo Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+lib_deps = 
+	esphome/AsyncTCP-esphome@^2.1.4
+	esphome/ESPAsyncWebServer-esphome@^3.3.0
+	wolfssl/wolfssl@^5.7.2
+	rweather/Crypto@^0.4.0
+	jgromes/RadioLib@^7.1.2
+	adafruit/RTClib@^2.1.4
+	adafruit/Adafruit GFX Library@^1.12.0
+	melopero/Melopero RV3028@^1.1.0
+	adafruit/Adafruit SSD1306@^2.5.13
+
+[env:LilyGo_T-Echo_companion_radio_ble]
+extends = LilyGo_Techo
+build_flags = 
+	${LilyGo_Techo.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D BLE_PIN_CODE=123456
+	-D BLE_DEBUG_LOGGING=1
+build_src_filter = ${LilyGo_Techo.build_src_filter}
+	+<helpers/nrf52/*.cpp>
+	+<../examples/companion_radio/main.cpp>
+lib_deps = 
+	${LilyGo_Techo.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[Xiao_esp32_C3]
+extends = esp32_base
+board = seeed_xiao_esp32c3
+build_flags = 
+	${esp32_base.build_flags}
+	-I variants/xiao_c3
+	-D LORA_TX_BOOST_PIN=D3
+	-D P_LORA_TX_LED=D5
+	-D PIN_VBAT_READ=D0
+	-D P_LORA_DIO_1=D2
+	-D P_LORA_NSS=D4
+	-D P_LORA_RESET=RADIOLIB_NC
+	-D P_LORA_BUSY=D1
+	-D PIN_BOARD_SDA=D6
+	-D PIN_BOARD_SCL=D7
+	-D SX126X_DIO2_AS_RF_SWITCH=true
+	-D SX126X_DIO3_TCXO_VOLTAGE=1.8
+	-D SX126X_CURRENT_LIMIT=130.0f
+build_src_filter = ${esp32_base.build_src_filter}
+	+<../variants/xiao_c3>
+
+[env:Xiao_C3_Repeater_sx1262]
+extends = Xiao_esp32_C3
+build_src_filter = ${Xiao_esp32_C3.build_src_filter}
+	+<../examples/simple_repeater/main.cpp>
+build_flags = 
+	${Xiao_esp32_C3.build_flags}
+	-D RADIO_CLASS=CustomSX1262
+	-D WRAPPER_CLASS=CustomSX1262Wrapper
+	-D SX126X_RX_BOOSTED_GAIN=1
+	-D LORA_TX_POWER=22
+	-D ADVERT_NAME='"Xiao Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+lib_deps = 
+	${Xiao_esp32_C3.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:Xiao_C3_Repeater_sx1268]
+extends = Xiao_esp32_C3
+build_src_filter = ${Xiao_esp32_C3.build_src_filter}
+	+<../examples/simple_repeater/main.cpp>
+build_flags = 
+	${Xiao_esp32_C3.build_flags}
+	-D RADIO_CLASS=CustomSX1268
+	-D WRAPPER_CLASS=CustomSX1268Wrapper
+	-D LORA_TX_POWER=22
+	-D ADVERT_NAME='"Xiao Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+lib_deps = 
+	${Xiao_esp32_C3.lib_deps}
+	${esp32_ota.lib_deps}
+
+[Xiao_S3_WIO]
+extends = esp32_base
+board = seeed_xiao_esp32s3
+board_check = true
+board_build.mcu = esp32s3
+build_flags = ${esp32_base.build_flags}
+	-I variants/xiao_s3_wio
+	-D SEEED_XIAO_S3
+	-D P_LORA_DIO_1=39
+	-D P_LORA_NSS=41
+	-D P_LORA_RESET=42
+	-D P_LORA_BUSY=40
+	-D P_LORA_SCLK=7
+	-D P_LORA_MISO=8
+	-D P_LORA_MOSI=9
+	-D SX126X_DIO2_AS_RF_SWITCH=true
+	-D SX126X_DIO3_TCXO_VOLTAGE=1.8
+	-D SX126X_CURRENT_LIMIT=130
+	-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_wio>
+
+[env:Xiao_S3_WIO_Repeater]
+extends = Xiao_S3_WIO
+build_src_filter = ${Xiao_S3_WIO.build_src_filter}
+	+<../examples/simple_repeater/main.cpp>
+build_flags = 
+	${Xiao_S3_WIO.build_flags}
+	-D ADVERT_NAME='"XiaoS3 Repeater"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+lib_deps = 
+	${Xiao_S3_WIO.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:Xiao_S3_WIO_room_server]
+extends = Xiao_S3_WIO
+build_src_filter = ${Xiao_S3_WIO.build_src_filter}
+	+<../examples/simple_room_server>
+build_flags = 
+	${Xiao_S3_WIO.build_flags}
+	-D ADVERT_NAME='"XiaoS3 Room"'
+	-D ADVERT_LAT=0.0
+	-D ADVERT_LON=0.0
+	-D ADMIN_PASSWORD='"password"'
+	-D ROOM_PASSWORD='"hello"'
+lib_deps = 
+	${Xiao_S3_WIO.lib_deps}
+	${esp32_ota.lib_deps}
+
+[env:Xiao_S3_WIO_terminal_chat]
+extends = Xiao_S3_WIO
+build_flags = 
+	${Xiao_S3_WIO.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+build_src_filter = ${Xiao_S3_WIO.build_src_filter}
+	+<../examples/simple_secure_chat/main.cpp>
+lib_deps = 
+	${Xiao_S3_WIO.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Xiao_S3_WIO_companion_radio_ble]
+extends = Xiao_S3_WIO
+build_flags = 
+	${Xiao_S3_WIO.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D BLE_PIN_CODE=123456
+build_src_filter = ${Xiao_S3_WIO.build_src_filter}
+	+<helpers/esp32/*.cpp>
+	+<../examples/companion_radio/main.cpp>
+lib_deps = 
+	${Xiao_S3_WIO.lib_deps}
+	densaugeo/base64 @ ~1.4.0
+
+[env:Xiao_S3_WIO_companion_radio_serial]
+extends = Xiao_S3_WIO
+build_flags = 
+	${Xiao_S3_WIO.build_flags}
+	-D MAX_CONTACTS=100
+	-D MAX_GROUP_CHANNELS=8
+	-D SERIAL_TX=D6
+	-D SERIAL_RX=D7
+build_src_filter = ${Xiao_S3_WIO.build_src_filter}
+	+<helpers/esp32/*.cpp>
+	+<../examples/companion_radio/main.cpp>
+lib_deps = 
+	${Xiao_S3_WIO.lib_deps}
+	densaugeo/base64 @ ~1.4.0

+ 99 - 0
src/helpers/TBeamS3SupremeBoard.h

@@ -0,0 +1,99 @@
+#pragma once
+
+#include "ESP32Board.h"
+#include <driver/rtc_io.h>
+#include <Wire.h>
+#include <Arduino.h>
+//#include "XPowersLib.h"
+
+// Defined using AXP2102
+//#define XPOWERS_CHIP_AXP2101
+
+// LoRa radio module pins for TBeam S3 Supreme
+#define  P_LORA_DIO_1   1   //SX1262 IRQ pin
+#define  P_LORA_NSS     10  //SX1262 SS pin
+#define  P_LORA_RESET   5   //SX1262 Rest pin
+#define  P_LORA_BUSY    4   //SX1262 Busy pin
+#define  P_LORA_SCLK    12  //SX1262 SCLK pin
+#define  P_LORA_MISO    13  //SX1262 MISO pin
+#define  P_LORA_MOSI    11  //SX1262 MOSI pin
+
+#define PIN_BOARD_SDA_1 42  //SDA for PMU and PFC8563 (RTC)
+#define PIN_BOARD_SCL_1 41  //SCL for PMU and PFC8563 (RTC)
+
+#define PIN_USER_BTN 0
+
+#define P_BOARD_SPI_MOSI 35  //SPI for SD Card and QMI8653 (IMU)
+#define P_BOARD_SPI_MISO 37  //SPI for SD Card and QMI8653 (IMU)
+#define P_BOARD_SPI_SCK  36  //SPI for SD Card and QMI8653 (IMU)
+#define P_BPARD_SPI_CS   47  //SPI for SD Card and QMI8653 (IMU)
+#define P_BOARD_IMU_CS   34  //Pin for QMI8653 (IMU) CS
+
+#define P_BOARD_IMU_INT  33  //IMU Int pin
+#define P_BOARD_RTC_INT  14  //RTC Int pin
+
+#define P_GPS_RX    9   //GPS RX pin
+#define P_GPS_TX    8   //GPS TX pin
+#define P_GPS_WAKE  7   //GPS Wakeup pin
+#define P_GPS_1PPS  6   //GPS 1PPS pin
+
+
+class TBeamS3SupremeBoard : public ESP32Board {
+  //XPowersAXP2101 PMU;
+
+public:
+  void begin() {
+    ESP32Board::begin();
+    
+    //Manually set voltage rails
+    //PMU.setProtectedChannel(XPOWERS_DCDC3); //Set protected DCDC for esp32
+    //PMU.setALDO2Voltage(3300);  //Set LDO for LoRa module
+    //PMU.setALDO3Voltage(3300);  //Set LDO for GPS module
+    //PMU.setDC1Voltage(3300);    //Set DCDC for OLED
+    //PMU.enableALDO2();          //Enable LDO2 for LoRa
+    //PMU.enableALDO3();          //Enable LDO3 for GPS
+
+
+    esp_reset_reason_t reason = esp_reset_reason();
+    if (reason == ESP_RST_DEEPSLEEP) {
+      long wakeup_source = esp_sleep_get_ext1_wakeup_status();
+      if (wakeup_source & (1 << P_LORA_DIO_1)) {  // received a LoRa packet (while in deep sleep)
+        startup_reason = BD_STARTUP_RX_PACKET;
+      }
+
+      rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS);
+      rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1);
+    }
+  }
+
+  void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) {
+    esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
+
+    // Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
+    rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
+    rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
+
+    rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
+
+    if (pin_wake_btn < 0) {
+      esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH);  // wake up on: recv LoRa packet
+    } else {
+      esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH);  // wake up on: recv LoRa packet OR wake btn
+    }
+
+    if (secs > 0) {
+      esp_sleep_enable_timer_wakeup(secs * 1000000);
+    }
+
+    // Finally set ESP32 into sleep
+    esp_deep_sleep_start();   // CPU halts here and never returns!
+  }
+
+  uint16_t getBattMilliVolts() override {
+    return 0;
+  }
+
+  const char* getManufacturerName() const override {
+    return "LilyGo T-Beam S3 Supreme SX1262";
+  }
+};

+ 34 - 0
variants/lilygo_tbeam_supreme_SX1262/platformio.ini

@@ -0,0 +1,34 @@
+[T_Beam_S3_Supreme_SX1262]
+extends = esp32_base
+board = t_beams3_supreme  ; LILYGO T-Beam Supreme ESP32S3 with SX1262
+build_flags =
+  ${esp32_base.build_flags}
+  -I variants/lilygo_tbeam_supreme_SX1262
+  -D LORA_TX_POWER=22
+  -D RADIO_CLASS=CustomSX1262
+  -D WRAPPER_CLASS=CustomSX1262Wrapper
+  -D DISPLAY_CLASS=SSD1306Display
+  -D SX126X_RX_BOOSTED_GAIN=1
+lib_deps =
+  ${esp32_base.lib_deps}
+  adafruit/Adafruit SSD1306 @ ^2.5.13
+  ;lewisxhe/XPowersLib @ ^0.2.7
+
+; === LILYGO T-Beam S3 Supreme with SX1262 environments ===
+[env:T_Beam_S3_Supreme_SX1262_Repeater]
+extends = T_Beam_S3_Supreme_SX1262
+build_flags =
+  ${T_Beam_S3_Supreme_SX1262.build_flags}
+  -D DISPLAY_CLASS=SSD1306Display
+  -D ADVERT_NAME='"T-Beam S3 Supreme SX1262 Repeater"'
+  -D ADVERT_LAT=0
+  -D ADVERT_LON=0
+  -D ADMIN_PASSWORD='"password"'
+;  -D MESH_PACKET_LOGGING=1
+;  -D MESH_DEBUG=1
+build_src_filter = ${T_Beam_S3_Supreme_SX1262.build_src_filter}
+  +<helpers/ui/*.cpp>
+  +<../examples/simple_repeater>
+  lib_deps =
+  ${T_Beam_S3_Supreme_SX1262.lib_deps}
+  ${esp32_ota.lib_deps}

+ 65 - 0
variants/lilygo_tbeam_supreme_SX1262/target.cpp

@@ -0,0 +1,65 @@
+#include <Arduino.h>
+#include "target.h"
+
+TBeamS3SupremeBoard 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);
+
+#ifndef LORA_CR
+  #define LORA_CR      5
+#endif
+
+bool radio_init() {
+  fallback_clock.begin();
+  rtc_clock.begin(Wire);
+  
+#ifdef SX126X_DIO3_TCXO_VOLTAGE
+  float tcxo = SX126X_DIO3_TCXO_VOLTAGE;
+#else
+  float tcxo = 1.6f;
+#endif
+
+#if defined(P_LORA_SCLK)
+  spi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI);
+#endif
+  int status = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8, tcxo);
+  if (status != RADIOLIB_ERR_NONE) {
+    Serial.print("ERROR: radio init failed: ");
+    Serial.println(status);
+    return false;  // fail
+  }
+
+  radio.setCRC(1);
+  
+  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);
+}
+
+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
+}

+ 17 - 0
variants/lilygo_tbeam_supreme_SX1262/target.h

@@ -0,0 +1,17 @@
+#pragma once
+
+#include <RadioLib.h>
+#include <helpers/RadioLibWrappers.h>
+#include <helpers/TBeamS3SupremeBoard.h>
+#include <helpers/CustomSX1262Wrapper.h>
+#include <helpers/AutoDiscoverRTCClock.h>
+
+extern TBeamS3SupremeBoard board;
+extern WRAPPER_CLASS radio_driver;
+extern AutoDiscoverRTCClock rtc_clock;
+
+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();