Browse Source

Merge branch 'dev' into minewsemi-refactor

pull/2428/head
Rastislav Vysoky 1 month ago
committed by GitHub
parent
commit
d7e3a9ddba
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      README.md
  2. 198
      arch/nrf52/extra_scripts/patch_bluefruit.py
  3. 144
      docs/companion_protocol.md
  4. 4
      docs/faq.md
  5. 1
      docs/number_allocations.md
  6. 30
      examples/companion_radio/ui-new/UITask.cpp
  7. 5
      examples/kiss_modem/main.cpp
  8. 12
      examples/simple_repeater/UITask.cpp
  9. 12
      examples/simple_room_server/UITask.cpp
  10. 4
      examples/simple_sensor/SensorMesh.h
  11. 12
      examples/simple_sensor/UITask.cpp
  12. 13
      platformio.ini
  13. 1
      src/helpers/radiolib/CustomLLCC68Wrapper.h
  14. 2
      src/helpers/radiolib/CustomLR1110.h
  15. 4
      src/helpers/radiolib/CustomLR1110Wrapper.h
  16. 1
      src/helpers/radiolib/CustomSTM32WLxWrapper.h
  17. 1
      src/helpers/radiolib/CustomSX1262Wrapper.h
  18. 1
      src/helpers/radiolib/CustomSX1268Wrapper.h
  19. 1
      src/helpers/radiolib/CustomSX1276Wrapper.h
  20. 2
      src/helpers/radiolib/RadioLibWrappers.cpp
  21. 6
      src/helpers/radiolib/RadioLibWrappers.h
  22. 5
      variants/ebyte_eora_s3/platformio.ini
  23. 1
      variants/ebyte_eora_s3/target.cpp
  24. 4
      variants/gat562_30s_mesh_kit/platformio.ini
  25. 5
      variants/gat562_mesh_evb_pro/platformio.ini
  26. 4
      variants/gat562_mesh_tracker_pro/platformio.ini
  27. 4
      variants/gat562_mesh_watch13/platformio.ini
  28. 5
      variants/generic-e22/platformio.ini
  29. 1
      variants/generic-e22/target.cpp
  30. 5
      variants/heltec_ct62/platformio.ini
  31. 1
      variants/heltec_ct62/target.cpp
  32. 5
      variants/heltec_e213/platformio.ini
  33. 1
      variants/heltec_e213/target.cpp
  34. 5
      variants/heltec_e290/platformio.ini
  35. 1
      variants/heltec_e290/target.cpp
  36. 7
      variants/heltec_mesh_solar/platformio.ini
  37. 1
      variants/heltec_mesh_solar/target.cpp
  38. 2
      variants/heltec_t096/LoRaFEMControl.h
  39. 9
      variants/heltec_t096/platformio.ini
  40. 12
      variants/heltec_t114/platformio.ini
  41. 1
      variants/heltec_t114/target.cpp
  42. 5
      variants/heltec_t190/platformio.ini
  43. 1
      variants/heltec_t190/target.cpp
  44. 5
      variants/heltec_tracker/platformio.ini
  45. 1
      variants/heltec_tracker/target.cpp
  46. 2
      variants/heltec_tracker_v2/LoRaFEMControl.h
  47. 7
      variants/heltec_tracker_v2/platformio.ini
  48. 1
      variants/heltec_tracker_v2/target.cpp
  49. 5
      variants/heltec_v2/platformio.ini
  50. 1
      variants/heltec_v2/target.cpp
  51. 4
      variants/heltec_v3/platformio.ini
  52. 1
      variants/heltec_v3/target.cpp
  53. 2
      variants/heltec_v4/LoRaFEMControl.h
  54. 5
      variants/heltec_v4/platformio.ini
  55. 1
      variants/heltec_v4/target.cpp
  56. 5
      variants/heltec_wireless_paper/platformio.ini
  57. 1
      variants/heltec_wireless_paper/target.cpp
  58. 13
      variants/ikoka_handheld_nrf/platformio.ini
  59. 1
      variants/ikoka_handheld_nrf/target.cpp
  60. 15
      variants/ikoka_nano_nrf/platformio.ini
  61. 1
      variants/ikoka_nano_nrf/target.cpp
  62. 15
      variants/ikoka_stick_nrf/platformio.ini
  63. 1
      variants/ikoka_stick_nrf/target.cpp
  64. 9
      variants/keepteen_lt1/platformio.ini
  65. 1
      variants/keepteen_lt1/target.cpp
  66. 5
      variants/lilygo_t3s3/platformio.ini
  67. 1
      variants/lilygo_t3s3/target.cpp
  68. 7
      variants/lilygo_t3s3_sx1276/platformio.ini
  69. 1
      variants/lilygo_t3s3_sx1276/target.cpp
  70. 5
      variants/lilygo_tbeam_1w/platformio.ini
  71. 1
      variants/lilygo_tbeam_1w/target.cpp
  72. 5
      variants/lilygo_tbeam_SX1262/platformio.ini
  73. 1
      variants/lilygo_tbeam_SX1262/target.cpp
  74. 5
      variants/lilygo_tbeam_SX1276/platformio.ini
  75. 1
      variants/lilygo_tbeam_SX1276/target.cpp
  76. 5
      variants/lilygo_tbeam_supreme_SX1262/platformio.ini
  77. 1
      variants/lilygo_tbeam_supreme_SX1262/target.cpp
  78. 10
      variants/lilygo_tdeck/platformio.ini
  79. 1
      variants/lilygo_tdeck/target.cpp
  80. 5
      variants/lilygo_techo/platformio.ini
  81. 1
      variants/lilygo_techo/target.cpp
  82. 5
      variants/lilygo_techo_lite/platformio.ini
  83. 1
      variants/lilygo_techo_lite/target.cpp
  84. 5
      variants/lilygo_tlora_c6/platformio.ini
  85. 1
      variants/lilygo_tlora_c6/target.cpp
  86. 5
      variants/lilygo_tlora_v2_1/platformio.ini
  87. 1
      variants/lilygo_tlora_v2_1/target.cpp
  88. 1
      variants/m5stack_unit_c6l/UnitC6LBoard.cpp
  89. 5
      variants/m5stack_unit_c6l/platformio.ini
  90. 7
      variants/mesh_pocket/platformio.ini
  91. 1
      variants/mesh_pocket/target.cpp
  92. 38
      variants/meshadventurer/platformio.ini
  93. 1
      variants/meshadventurer/target.cpp
  94. 5
      variants/meshtiny/platformio.ini
  95. 1
      variants/meshtiny/target.cpp
  96. 4
      variants/minewsemi_me25ls01/platformio.ini
  97. 1
      variants/minewsemi_me25ls01/target.cpp
  98. 5
      variants/muziworks_r1_neo/platformio.ini
  99. 70
      variants/nano_g2_ultra/platformio.ini
  100. 1
      variants/nano_g2_ultra/target.cpp

2
README.md

@ -117,4 +117,4 @@ There are a number of fairly major features in the pipeline, with no particular
- Report bugs and request features on the [GitHub Issues](https://github.com/ripplebiz/MeshCore/issues) page.
- Find additional guides and components on [my site](https://buymeacoffee.com/ripplebiz).
- Join [MeshCore Discord](https://discord.gg/BMwCtwHj5V) to chat with the developers and get help from the community.
- Join [MeshCore Discord](https://meshcore.gg) to chat with the developers and get help from the community.

198
arch/nrf52/extra_scripts/patch_bluefruit.py

@ -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)

144
docs/companion_protocol.md

@ -283,32 +283,110 @@ 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
`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 |
|-----------------|----------------------|--------------------------------------------------------------------------|
| 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 |
**Response**: `PACKET_OK` (0x00) on success
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.
---
### 6. Get Message
### Receive Channel Data Datagram
Inbound group datagrams (radio-level `PAYLOAD_TYPE_GRP_DATA`, 0x06) are forwarded to the host as `RESP_CODE_CHANNEL_DATA_RECV` notifications.
**Frame Format** (`RESP_CODE_CHANNEL_DATA_RECV`, 0x1B):
```
Byte 0: 0x1B (packet type)
Byte 1: SNR (signed int8, scaled ×4 — divide by 4.0 to recover dB)
Bytes 2-3: Reserved (clients MUST ignore)
Byte 4: Channel Index (0-7)
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**:
```python
def parse_channel_data_recv(data):
if len(data) < 9:
return None
snr_byte = data[1]
snr = (snr_byte if snr_byte < 128 else snr_byte - 256) / 4.0
channel_idx = data[4]
path_len = data[5]
data_type = int.from_bytes(data[6:8], 'little')
data_len = data[8]
if 9 + data_len > len(data):
return None
payload = data[9:9 + data_len]
return {
'snr': snr,
'channel_idx': channel_idx,
'path_len': path_len,
'data_type': data_type,
'payload': bytes(payload),
}
```
---
### 7. Get Message
**Purpose**: Request the next queued message from the device.
@ -325,13 +403,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 +606,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 +635,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 +807,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 +850,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**:

4
docs/faq.md

@ -194,7 +194,7 @@ Recently, as of October 2025, many regions have moved to the "narrow" setting, a
After extensive testing, many regions have switched or about to switch over to BW62.5 and SF7, 8, or 9. Narrower bandwidth setting and lower SF setting allow MeshCore's radio signals to fit between interference in the ISM band, provide for a lower noise floor, better SNR, and faster transmissions.
If you have consensus from your community in your region to update your region's preset recommendation, please post your update request on the [#meshcore-app](https://discord.com/channels/1343693475589263471/1391681655911088241) channel on the [MeshCore Discord server ](https://discord.gg/cYtQNYCCRK) to let Liam Cottle know.
If you have consensus from your community in your region to update your region's preset recommendation, please post your update request on the [#meshcore-app](https://discord.com/channels/1343693475589263471/1391681655911088241) channel on the [MeshCore Discord server ](https://meshcore.gg) to let Liam Cottle know.
@ -526,7 +526,7 @@ The third character is the capital letter 'O', not zero `0`
- Firmware repo: https://github.com/meshcore-dev/MeshCore
### 5.8. Q: How can I support MeshCore?
**A:** Provide your honest feedback on GitHub and on [MeshCore Discord server](https://discord.gg/BMwCtwHj5V). Spread the word of MeshCore to your friends and communities; help them get started with MeshCore. Support Scott's MeshCore development at <https://buymeacoffee.com/ripplebiz>.
**A:** Provide your honest feedback on GitHub and on [MeshCore Discord server](https://meshcore.gg). Spread the word of MeshCore to your friends and communities; help them get started with MeshCore. Support Scott's MeshCore development at <https://buymeacoffee.com/ripplebiz>.
Support Liam Cottle's smartphone client development by unlocking the server administration wait gate with in-app purchase

1
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 | [email protected] — https://github.com/zjs81/meshcore-open |
| FF00 - FFFF | -reserved for testing/dev- | |
(add rows, inside the range 0100 - FEFF for custom apps)

30
examples/companion_radio/ui-new/UITask.cpp

@ -57,13 +57,21 @@ public:
int logoWidth = 128;
display.drawXbm((display.width() - logoWidth) / 2, 3, meshcore_logo, logoWidth, 13);
// meshcore website
const char* website = "https://meshcore.io";
display.setColor(DisplayDriver::LIGHT);
display.setTextSize(1);
uint16_t websiteWidth = display.getTextWidth(website);
display.setCursor((display.width() - websiteWidth) / 2, 22);
display.print(website);
// version info
display.setColor(DisplayDriver::LIGHT);
display.setTextSize(2);
display.drawTextCentered(display.width()/2, 22, _version_info);
display.setTextSize(1);
display.drawTextCentered(display.width()/2, 35, _version_info);
display.setTextSize(1);
display.drawTextCentered(display.width()/2, 42, FIRMWARE_BUILD_DATE);
display.drawTextCentered(display.width()/2, 48, FIRMWARE_BUILD_DATE);
return 1000;
}
@ -146,7 +154,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 +178,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 +221,7 @@ public:
IPAddress ip = WiFi.localIP();
snprintf(tmp, sizeof(tmp), "IP: %d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
display.setTextSize(1);
display.drawTextCentered(display.width() / 2, 54, tmp);
display.drawTextCentered(display.width() / 2, 54, tmp);
#endif
if (_task->hasConnection()) {
display.setColor(DisplayDriver::GREEN);
@ -241,10 +249,10 @@ public:
} else {
sprintf(tmp, "%dh", secs / (60*60));
}
int timestamp_width = display.getTextWidth(tmp);
int max_name_width = display.width() - timestamp_width - 1;
char filtered_recent_name[sizeof(a->name)];
display.translateUTF8ToBlocks(filtered_recent_name, a->name, sizeof(filtered_recent_name));
display.drawTextEllipsized(0, y, max_name_width, filtered_recent_name);
@ -310,7 +318,7 @@ public:
display.drawTextRightAlign(display.width()-1, y, buf);
y = y + 12;
display.drawTextLeftAlign(0, y, "pos");
sprintf(buf, "%.4f %.4f",
sprintf(buf, "%.4f %.4f",
nmea->getLatitude()/1000000., nmea->getLongitude()/1000000.);
display.drawTextRightAlign(display.width()-1, y, buf);
y = y + 12;
@ -741,7 +749,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 +886,7 @@ bool UITask::getGPSState() {
return !strcmp(_sensors->getSettingValue(i), "1");
}
}
}
}
return false;
}

5
examples/kiss_modem/main.cpp

@ -10,7 +10,10 @@
#include <LittleFS.h>
#elif defined(ESP32)
#include <SPIFFS.h>
#else
#include <InternalFileSystem.h>
#endif
#if defined(KISS_UART_RX) && defined(KISS_UART_TX)
#include <HardwareSerial.h>
#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)

12
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

12
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

4
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"

12
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

13
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
@ -81,10 +81,11 @@ platform = https://github.com/pioarduino/platform-espressif32/releases/download/
extends = arduino_base
platform = nordicnrf52
platform_packages =
framework-arduinoadafruitnrf52 @ 1.10700.0
extra_scripts =
create-uf2.py
arch/nrf52/extra_scripts/patch_bluefruit.py
; 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}
-D NRF52_PLATFORM
-D LFS_NO_ASSERT=1

1
src/helpers/radiolib/CustomLLCC68Wrapper.h

@ -20,6 +20,7 @@ public:
int sf = ((CustomLLCC68 *)_radio)->spreadingFactor;
return packetScoreInt(snr, sf, packet_len);
}
uint8_t getSpreadingFactor() const override { return ((CustomLLCC68 *)_radio)->spreadingFactor; }
void doResetAGC() override { sx126xResetAGC((SX126x *)_radio); }

2
src/helpers/radiolib/CustomLR1110.h

@ -36,4 +36,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; }
};

4
src/helpers/radiolib/CustomLR1110Wrapper.h

@ -19,12 +19,14 @@ public:
void onSendFinished() override {
RadioLibWrapper::onSendFinished();
_radio->setPreambleLength(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(); }
float getLastSNR() const override { return ((CustomLR1110 *)_radio)->getSNR(); }
uint8_t getSpreadingFactor() const override { return ((CustomLR1110 *)_radio)->getSpreadingFactor(); }
void setRxBoostedGainMode(bool en) override {
((CustomLR1110 *)_radio)->setRxBoostedGainMode(en);
}

1
src/helpers/radiolib/CustomSTM32WLxWrapper.h

@ -21,6 +21,7 @@ public:
int sf = ((CustomSTM32WLx *)_radio)->spreadingFactor;
return packetScoreInt(snr, sf, packet_len);
}
uint8_t getSpreadingFactor() const override { return ((CustomSTM32WLx *)_radio)->spreadingFactor; }
void doResetAGC() override { sx126xResetAGC((SX126x *)_radio); }
};

1
src/helpers/radiolib/CustomSX1262Wrapper.h

@ -24,6 +24,7 @@ public:
int sf = ((CustomSX1262 *)_radio)->spreadingFactor;
return packetScoreInt(snr, sf, packet_len);
}
uint8_t getSpreadingFactor() const override { return ((CustomSX1262 *)_radio)->spreadingFactor; }
virtual void powerOff() override {
((CustomSX1262 *)_radio)->sleep(false);
}

1
src/helpers/radiolib/CustomSX1268Wrapper.h

@ -24,6 +24,7 @@ public:
int sf = ((CustomSX1268 *)_radio)->spreadingFactor;
return packetScoreInt(snr, sf, packet_len);
}
uint8_t getSpreadingFactor() const override { return ((CustomSX1268 *)_radio)->spreadingFactor; }
void doResetAGC() override { sx126xResetAGC((SX126x *)_radio); }

1
src/helpers/radiolib/CustomSX1276Wrapper.h

@ -23,4 +23,5 @@ public:
int sf = ((CustomSX1276 *)_radio)->spreadingFactor;
return packetScoreInt(snr, sf, packet_len);
}
uint8_t getSpreadingFactor() const override { return ((CustomSX1276 *)_radio)->spreadingFactor; }
};

2
src/helpers/radiolib/RadioLibWrappers.cpp

@ -26,6 +26,8 @@ void setFlag(void) {
void RadioLibWrapper::begin() {
_radio->setPacketReceivedAction(setFlag); // this is also SentComplete interrupt
_preamble_sf = getSpreadingFactor();
_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)

6
src/helpers/radiolib/RadioLibWrappers.h

@ -11,6 +11,7 @@ protected:
int16_t _noise_floor, _threshold;
uint16_t _num_floor_samples;
int32_t _floor_sample_sum;
uint8_t _preamble_sf;
void idle();
void startRecv();
@ -19,7 +20,7 @@ protected:
virtual void doResetAGC();
public:
RadioLibWrapper(PhysicalLayer& radio, mesh::MainBoard& board) : _radio(&radio), _board(&board) { n_recv = n_sent = 0; }
RadioLibWrapper(PhysicalLayer& radio, mesh::MainBoard& board) : _radio(&radio), _board(&board), _preamble_sf(0) { n_recv = n_sent = 0; }
void begin() override;
virtual void powerOff() { _radio->sleep(); }
@ -38,6 +39,9 @@ public:
}
virtual float getCurrentRSSI() =0;
virtual uint8_t getSpreadingFactor() const { return LORA_SF; }
static uint16_t preambleLengthForSF(uint8_t sf) { return sf <= 8 ? 32 : 16; }
void updatePreamble(uint8_t sf) { _preamble_sf = sf; _radio->setPreambleLength(preambleLengthForSF(sf)); }
int getNoiseFloor() const override { return _noise_floor; }
void triggerNoiseFloorCalibrate(int threshold) override;

5
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/>

1
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) {

4
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/>

5
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/>

4
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/>

4
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/>

5
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}

1
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) {

5
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/>

1
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) {

5
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/>

1
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) {

5
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/>

1
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) {

7
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
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/>

1
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) {

2
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;
};

9
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
densaugeo/base64 @ ~1.4.0
[env:Heltec_t096_kiss_modem]
extends = Heltec_t096
build_src_filter = ${Heltec_t096.build_src_filter}
+<../examples/kiss_modem/>

12
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}
+<helpers/nrf52/*.cpp>
+<../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
densaugeo/base64 @ ~1.4.0
[env:Heltec_t114_kiss_modem]
extends = Heltec_t114
build_src_filter = ${Heltec_t114.build_src_filter}
+<../examples/kiss_modem/>

1
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) {

5
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/>

1
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) {

5
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/>

1
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) {

2
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;
};

7
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/>

1
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) {

5
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/>

1
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) {

4
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}

1
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) {

2
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;
};

5
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/>

1
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) {

5
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/>

1
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) {

13
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/>

1
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) {

15
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/>

1
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) {

15
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/>

1
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) {

9
variants/keepteen_lt1/platformio.ini

@ -17,7 +17,7 @@ build_src_filter = ${nrf52_base.build_src_filter}
+<helpers/sensors>
+<../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]
@ -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
densaugeo/base64 @ ~1.4.0
[env:KeepteenLT1_kiss_modem]
extends = KeepteenLT1
build_src_filter = ${KeepteenLT1.build_src_filter}
+<../examples/kiss_modem/>

1
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) {

5
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/>

1
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) {

7
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
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/>

1
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) {

5
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/>

1
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) {

5
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/>

1
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) {

5
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/>

1
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) {

5
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/>

1
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) {

10
variants/lilygo_tdeck/platformio.ini

@ -57,6 +57,7 @@ build_flags =
build_src_filter = ${esp32_base.build_src_filter}
+<../variants/lilygo_tdeck>
+<helpers/sensors/*.cpp>
+<helpers/ui/ST7789LCDDisplay.cpp>
lib_deps =
${esp32_base.lib_deps}
${sensor_base.lib_deps}
@ -75,7 +76,6 @@ build_src_filter = ${LilyGo_TDeck.build_src_filter}
+<helpers/ui/MomentaryButton.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
+<helpers/ui/ST7789LCDDisplay.cpp>
lib_deps =
${LilyGo_TDeck.lib_deps}
densaugeo/base64 @ ~1.4.0
@ -94,7 +94,6 @@ build_src_filter = ${LilyGo_TDeck.build_src_filter}
+<helpers/ui/MomentaryButton.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
+<helpers/ui/ST7789LCDDisplay.cpp>
lib_deps =
${LilyGo_TDeck.lib_deps}
densaugeo/base64 @ ~1.4.0
@ -113,4 +112,9 @@ build_src_filter = ${LilyGo_TDeck.build_src_filter}
+<helpers/ui/ST7789LCDDisplay.cpp>
lib_deps =
${LilyGo_TDeck.lib_deps}
${esp32_ota.lib_deps}
${esp32_ota.lib_deps}
[env:LilyGo_TDeck_kiss_modem]
extends = LilyGo_TDeck
build_src_filter = ${LilyGo_TDeck.build_src_filter}
+<../examples/kiss_modem/>

1
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) {

5
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/>

1
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) {

5
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/>

1
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) {

5
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/>

1
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) {

5
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/>

1
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) {

1
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) {

5
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/>

7
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
densaugeo/base64 @ ~1.4.0
[env:Mesh_pocket_kiss_modem]
extends = Mesh_pocket
build_src_filter = ${Mesh_pocket.build_src_filter}
+<../examples/kiss_modem/>

1
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) {

38
variants/meshadventurer/platformio.ini

@ -29,6 +29,7 @@ build_flags =
build_src_filter = ${esp32_base.build_src_filter}
+<../variants/meshadventurer>
+<helpers/ui/MomentaryButton.cpp>
+<helpers/ui/SSD1306Display.cpp>
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>
+<helpers/ui/SSD1306Display.cpp>
build_flags =
${Meshadventurer.build_flags}
-D RADIO_CLASS=CustomSX1262
@ -60,7 +60,6 @@ lib_deps =
; build_src_filter = ${Meshadventurer.build_src_filter}
; +<helpers/bridges/RS232Bridge.cpp>
; +<../examples/simple_repeater>
; +<helpers/ui/SSD1306Display.cpp>
; build_flags =
; ${Meshadventurer.build_flags}
; -D RADIO_CLASS=CustomSX1262
@ -86,7 +85,6 @@ extends = Meshadventurer
build_src_filter = ${Meshadventurer.build_src_filter}
+<helpers/bridges/ESPNowBridge.cpp>
+<../examples/simple_repeater>
+<helpers/ui/SSD1306Display.cpp>
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>
+<helpers/ui/SSD1306Display.cpp>
build_flags =
${Meshadventurer.build_flags}
-D RADIO_CLASS=CustomSX1268
@ -157,7 +154,6 @@ extends = Meshadventurer
build_src_filter = ${Meshadventurer.build_src_filter}
+<helpers/bridges/ESPNowBridge.cpp>
+<../examples/simple_repeater>
+<helpers/ui/SSD1306Display.cpp>
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>
+<helpers/ui/SSD1306Display.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>
+<helpers/esp32/*.cpp>
+<helpers/ui/SSD1306Display.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>
+<helpers/ui/SSD1306Display.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>
+<helpers/ui/SSD1306Display.cpp>
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>
+<helpers/ui/SSD1306Display.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>
+<helpers/esp32/*.cpp>
+<helpers/ui/SSD1306Display.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>
+<helpers/ui/SSD1306Display.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>
+<helpers/ui/SSD1306Display.cpp>
lib_deps =
${Meshadventurer.lib_deps}
${esp32_ota.lib_deps}
${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

1
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) {

5
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/>

1
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) {

4
variants/minewsemi_me25ls01/platformio.ini

@ -145,3 +145,7 @@ build_src_filter = ${me25ls01.build_src_filter}
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-orig/*.cpp>
[env:Minewsemi_me25ls01_kiss_modem]
extends = me25ls01
build_src_filter = ${me25ls01.build_src_filter}
+<../examples/kiss_modem/>

1
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) {

5
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/>

70
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}
+<helpers/*.cpp>
+<../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}
+<helpers/ui/SH1106Display.cpp>
+<../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}
+<helpers/ui/SH1106Display.cpp>
+<../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}
+<helpers/ui/MomentaryButton.cpp>
+<../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,11 @@ build_src_filter = ${Nano_G2_Ultra.build_src_filter}
+<helpers/ui/MomentaryButton.cpp>
+<../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_kiss_modem]
extends = Nano_G2_Ultra
build_src_filter = ${Nano_G2_Ultra.build_src_filter}
+<../examples/kiss_modem/>

1
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) {

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save