Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
120 commits
Select commit Hold shift + click to select a range
776fef4
Add radio statistics commands and UI updates for noise floor display
MrAlders0n Jan 4, 2026
2e54498
Add radio statistics commands and update workflows for improved telem…
MrAlders0n Jan 4, 2026
0a2470c
Add debug logging for device info updates and radio stats retrieval
MrAlders0n Jan 4, 2026
3a9aaa4
Increase timeout for radio stats retrieval and enhance device model f…
MrAlders0n Jan 4, 2026
5e4cd15
Refactor connection status display by removing duplicate Bluetooth in…
MrAlders0n Jan 4, 2026
f556e88
Update device model display style for improved readability
MrAlders0n Jan 4, 2026
3a4d7b9
Enhance debug logging for radio stats retrieval during ping and conne…
MrAlders0n Jan 4, 2026
3dac215
Improve radio stats retrieval by adding firmware support checks and r…
MrAlders0n Jan 4, 2026
da3ea4f
Update noise display message to indicate firmware version requirement
MrAlders0n Jan 4, 2026
a1aa07c
Add periodic noise floor updates and improve UI display for noise inf…
MrAlders0n Jan 4, 2026
b995afd
Add device model database and implement auto-power selection feature
MrAlders0n Jan 4, 2026
36885a1
Update device power settings and documentation for improved accuracy
MrAlders0n Jan 4, 2026
c7be288
Update CNAME to point to new mesh mapping service
MrAlders0n Jan 4, 2026
09760de
Update title and metadata for MeshMapper branding
MrAlders0n Jan 4, 2026
f1c1b8e
Enhance device status display by adding noise and model information
MrAlders0n Jan 4, 2026
0b6da65
Update title to simplify branding and enhance clarity
MrAlders0n Jan 5, 2026
70b0f6a
Fix release version retrieval URL in deployment workflow
MrAlders0n Jan 5, 2026
9eaa897
Enhance connection workflow and device model mapping
MrAlders0n Jan 7, 2026
58bca7b
Refactor power selection UI to enhance user experience with auto-conf…
MrAlders0n Jan 7, 2026
010d8a8
Fix power level logging to display one decimal place for consistency
MrAlders0n Jan 7, 2026
8bdc030
Refactor power display logic to improve visibility and consistency in UI
MrAlders0n Jan 7, 2026
13d271b
Add power placeholder and update display logic for connection states
MrAlders0n Jan 7, 2026
75349dc
Add custom modal for power setting override confirmation
MrAlders0n Jan 7, 2026
e52678d
Enhance override modal functionality and visibility in UI
MrAlders0n Jan 7, 2026
cf1bce7
Add debug logging for modal display and element existence checks
MrAlders0n Jan 7, 2026
bec8c93
Refactor override modal styles for improved layout and consistency
MrAlders0n Jan 7, 2026
e5999a0
Refactor override modal styles for improved readability and consistency
MrAlders0n Jan 7, 2026
100941b
Refactor device model error logging and dynamic status handling in co…
MrAlders0n Jan 7, 2026
2d6c7e2
Enhance connection status handling for unknown devices in wardrive
MrAlders0n Jan 7, 2026
f4bbd96
Refactor dynamic status handling during device connection process
MrAlders0n Jan 7, 2026
cc3ee51
Refactor connection status handling to improve clarity and logging fo…
MrAlders0n Jan 7, 2026
3dd978a
Refactor connection status display to enhance clarity and detail for …
MrAlders0n Jan 7, 2026
472c7fc
Refactor connection status display for improved clarity and consistency
MrAlders0n Jan 7, 2026
9f08fc7
Improve error logging for unknown devices during power level auto-con…
MrAlders0n Jan 7, 2026
8b12882
Clear all logs on new connection to ensure fresh session data
MrAlders0n Jan 7, 2026
882a03c
Remove RX log clearing on disconnect to retain log entries for better…
MrAlders0n Jan 7, 2026
b87a7a0
Add Elecrow ThinkNode M1 device model with specifications
MrAlders0n Jan 7, 2026
205ed79
Add noise display to connection status UI for improved clarity
MrAlders0n Jan 7, 2026
2d4dc5e
Remove unnecessary check for deviceInfoEl in updateDeviceInfoDisplay …
MrAlders0n Jan 7, 2026
52c1a50
Refactor SVG markup for settings button in connection bar
MrAlders0n Jan 7, 2026
851c2e9
Reduce console noise by shortening timeout for radio stats updates an…
MrAlders0n Jan 7, 2026
6b6209a
Increase timeout for radio stats updates to reduce race conditions an…
MrAlders0n Jan 7, 2026
dd31a79
Remove timeout from getRadioStats calls to avoid library timeout bug
MrAlders0n Jan 7, 2026
28296db
Reduce logging spam by tracking last connection status in setConnStat…
MrAlders0n Jan 7, 2026
c464d04
Update Geo-Auth design document to reflect endpoint changes and add n…
MrAlders0n Jan 7, 2026
9829651
Enhance status messaging and UI for geo-auth zone checks
MrAlders0n Jan 7, 2026
6a85e41
Refactor connection button handling and improve UI status indicators
MrAlders0n Jan 7, 2026
4320d37
Fix GPS coordinate terminology from 'lng' to 'lon' in zone checking f…
MrAlders0n Jan 7, 2026
955420d
Add persistent outside zone error handling to status messages
MrAlders0n Jan 7, 2026
6361b97
Refactor geo-auth error logging to simplify message format
MrAlders0n Jan 7, 2026
a87800d
Refactor zone check logic to handle valid outside zone responses and …
MrAlders0n Jan 7, 2026
1e0fe1b
Fix iframe reference in performAppLaunchZoneCheck to use coverageFram…
MrAlders0n Jan 7, 2026
d9aeaeb
Add persistent error handling for outdated app version in zone status UI
MrAlders0n Jan 7, 2026
d684a8b
Remove zone status display from connection bar and update documentati…
MrAlders0n Jan 7, 2026
81ef53f
Update Connect button state logic to include zone status and handle p…
MrAlders0n Jan 7, 2026
ded7019
Update Connect button logic to consider external antenna selection in…
MrAlders0n Jan 7, 2026
c8d808d
Update disconnect function to re-check zone and antenna requirements …
MrAlders0n Jan 7, 2026
ba064bf
Enhance slot availability handling in UI: show error message and disa…
MrAlders0n Jan 7, 2026
2c41b48
Update error message for wardriving slots to specify TX availability
MrAlders0n Jan 7, 2026
a872305
Update slot display color for full capacity indication
MrAlders0n Jan 7, 2026
285b116
Refactor slot display logic and enhance slot refresh timer handling f…
MrAlders0n Jan 7, 2026
6fa2774
Add updateMapOnZoneCheck function to refresh GPS overlay and map afte…
MrAlders0n Jan 7, 2026
e2c092b
Update location display color based on slot availability in updateSlo…
MrAlders0n Jan 7, 2026
2f918a3
Update accuracy parameter in updateMapOnZoneCheck function to use acc…
MrAlders0n Jan 7, 2026
04c2006
Refactor capacity check to authentication request and update related …
MrAlders0n Jan 7, 2026
ab2577d
Sanitize device model string by removing null characters and enhance …
MrAlders0n Jan 7, 2026
fa024fe
Update status message during authentication request to improve clarity
MrAlders0n Jan 7, 2026
cb7d393
Refactor updateSlotsDisplay function to remove redundant status updat…
MrAlders0n Jan 7, 2026
a1e2d51
Update getDeviceIdentifier function to use state.deviceName for impro…
MrAlders0n Jan 7, 2026
61020cb
Enhance zone status handling in slot refresh timer to update UI when …
MrAlders0n Jan 7, 2026
5793796
Improve zone status handling in slot refresh timer to detect zone re-…
MrAlders0n Jan 7, 2026
34a581a
Enhance slot refresh timer to improve zone status detection and updat…
MrAlders0n Jan 7, 2026
a70ec7d
Refactor wardrive API documentation and error handling
MrAlders0n Jan 8, 2026
4d7615f
Refactor auto ping scheduling to prevent duplicate timers and improve…
MrAlders0n Jan 8, 2026
24f3473
Fix ping state management to ensure proper UI updates during cooldown…
MrAlders0n Jan 8, 2026
d7c3193
Fix auto ping timer management to prevent premature firing during man…
MrAlders0n Jan 8, 2026
4ed0afd
Refactor auto ping scheduling to always restart the timer after any p…
MrAlders0n Jan 8, 2026
a8075a9
Refactor code structure for improved readability and maintainability
MrAlders0n Jan 9, 2026
f481d3e
Fix typo in image class attribute for consistent styling
MrAlders0n Jan 9, 2026
ca28cf8
Update logo size for improved visibility in header
MrAlders0n Jan 9, 2026
c54ddd0
Reduce logo size for improved layout consistency in header
MrAlders0n Jan 9, 2026
9791223
Increase logo size for improved visibility in header
MrAlders0n Jan 9, 2026
2c78e6c
Add height and width utilities for 7 spacing units
MrAlders0n Jan 9, 2026
044ca0c
Increase logo size for improved visibility in header
MrAlders0n Jan 9, 2026
fdb3fda
Add height and width utilities for 10 and 12 spacing units; update lo…
MrAlders0n Jan 9, 2026
3570504
Refactor header layout for improved aesthetics and readability
MrAlders0n Jan 9, 2026
a3d41c0
Refactor header layout for improved structure and styling
MrAlders0n Jan 9, 2026
a9ada48
Add height and width utilities for 14 spacing units; update logo size…
MrAlders0n Jan 9, 2026
efb964f
Add slate-800 background color utility; adjust spacing in main and he…
MrAlders0n Jan 9, 2026
b49cca5
Update app version display style for improved aesthetics
MrAlders0n Jan 9, 2026
577949c
Update app version display style for consistency and improved aesthetics
MrAlders0n Jan 9, 2026
e70c8e2
Update app version display padding for improved aesthetics
MrAlders0n Jan 9, 2026
134136f
Update favicon and adjust header markup for consistency
MrAlders0n Jan 9, 2026
37ad0e3
Add double-buffered iframe for seamless coverage updates
MrAlders0n Jan 9, 2026
c74bfe4
Update header layout and app version display for improved aesthetics
MrAlders0n Jan 9, 2026
7cc45ff
Update header styles for improved layout and app version display
MrAlders0n Jan 9, 2026
9820de5
Update spacing in main container for improved layout
MrAlders0n Jan 9, 2026
3255461
Implement double-buffered iframes for seamless coverage map updates
MrAlders0n Jan 9, 2026
990ff0a
Set fixed height for map section to enhance iframe display
MrAlders0n Jan 9, 2026
abeb6d8
Update coverage embed URL to use current zone code for improved accuracy
MrAlders0n Jan 9, 2026
6172b68
Enhance iframe loading by adding a delay for smoother visibility swap…
MrAlders0n Jan 9, 2026
a9c5596
Refactor iframe visibility handling to use opacity transitions for sm…
MrAlders0n Jan 9, 2026
96adc41
Skip map refresh during auto mode to optimize performance
MrAlders0n Jan 9, 2026
1aff786
Initialize double-buffered iframe references to ensure proper loading…
MrAlders0n Jan 9, 2026
b718c47
Refactor CSS and JavaScript: Remove unused styles and streamline HTML…
MrAlders0n Jan 9, 2026
d880980
Remove device name display update on connection failure for cleaner UI
MrAlders0n Jan 9, 2026
3ba73d5
Enhance error handling in Wardrive API: add cases for invalid session…
MrAlders0n Jan 9, 2026
71a912e
Enhance Wardrive API error handling: add new session and authorizatio…
MrAlders0n Jan 9, 2026
672ea51
Remove YOW region note and footer attribution for cleaner UI
MrAlders0n Jan 9, 2026
953b828
Remove location sharing note for improved clarity in usage instructions
MrAlders0n Jan 9, 2026
5a0556a
Enhance disconnect error handling: preserve error status when applica…
MrAlders0n Jan 10, 2026
719504f
Enhance BLE disconnect handling: guard against duplicate disconnect e…
MrAlders0n Jan 10, 2026
9bdb93f
Update RX Log display: change observation and drop count format for c…
MrAlders0n Jan 10, 2026
5408c73
Update log display format for clarity: change "pings" and "errors" to…
MrAlders0n Jan 10, 2026
69675e6
Enhance channel key handling: unify retrieval for Public and hashtag …
MrAlders0n Jan 10, 2026
889057d
Refactor parseAdvertName function: update ADVERT structure documentat…
MrAlders0n Jan 10, 2026
4b0ef84
Clarify RX logging behavior: update comments to indicate direct packe…
MrAlders0n Jan 10, 2026
63c3b94
Update RX batch configuration: increase distance trigger for flushing…
MrAlders0n Jan 10, 2026
258cc60
Update version in README: change from 1.7.0 to 1.8.0
MrAlders0n Jan 10, 2026
d124aba
Merge branch 'main' into dev
MrAlders0n Jan 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 26 additions & 6 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ Browser-based Progressive Web App for wardriving with MeshCore mesh network devi
**Tech Stack**: Vanilla JavaScript (ES6 modules), Web Bluetooth API, Geolocation API, Tailwind CSS v4

**Critical Files**:
- `content/wardrive.js` (4500+ lines) - Main application logic
- `content/wardrive.js` (5200+ lines) - Main application logic
- `content/device-models.json` - Device model database for auto-power selection
- `content/mc/` - MeshCore BLE protocol library (Connection classes, Packet parsing, Buffer utilities)
- `index.html` - Single-page UI with embedded Leaflet map
- `docs/` - Comprehensive workflow documentation (CONNECTION_WORKFLOW.md, PING_WORKFLOW.md, etc.)
- `docs/` - Comprehensive workflow documentation (CONNECTION_WORKFLOW.md, PING_WORKFLOW.md, DEVICE_MODEL_MAPPING.md, etc.)

## Architecture & Data Flow

Expand All @@ -22,9 +23,19 @@ Three-layer connection system:
- **Protocol Layer**: `Connection.js` (2200+ lines) implements MeshCore companion protocol - packet framing, encryption, channel management, device queries
- **App Layer**: `wardrive.js` orchestrates connect/disconnect workflows with 10-step sequences (see `docs/CONNECTION_WORKFLOW.md`)

**Connect Sequence**: BLE GATT → Protocol Handshake → Device Info → Time Sync → Capacity Check (API slot acquisition) → Channel Setup → GPS Init → Connected
**Connect Sequence**: BLE GATT → Protocol Handshake → Device Info → Device Model Auto-Power → Time Sync → Capacity Check (API slot acquisition) → Channel Setup → GPS Init → Connected

### 2. Ping Lifecycle & API Queue System
### 2. Device Model Auto-Power Selection (NEW)
Automatic power configuration based on detected hardware:
- **Database**: `device-models.json` contains 32+ MeshCore device variants with recommended power levels
- **Detection**: `deviceQuery()` returns manufacturer string (e.g., "Ikoka Stick-E22-30dBm (Xiao_nrf52)nightly-e31c46f")
- **Parsing**: `parseDeviceModel()` strips build suffix ("nightly-COMMIT") for database matching
- **Lookup**: `findDeviceConfig()` searches database for exact/partial match
- **Auto-Set**: `autoSetPowerLevel()` configures radio power after successful deviceQuery()
- **Critical Safety**: PA amplifier models (33dBm, 30dBm) require specific input power to avoid hardware damage
- See `docs/DEVICE_MODEL_MAPPING.md` for complete architecture

### 3. Ping Lifecycle & API Queue System
Two independent data flows merge into a unified API batch queue:

**TX Flow** (Transmit):
Expand All @@ -51,14 +62,18 @@ Two independent data flows merge into a unified API batch queue:
- **Ottawa Geofence**: 150km radius from Parliament Hill (45.4215, -75.6972) - hard boundary
- **Min Distance Filter**: 25m between pings (prevents spam, separate from 25m RX batch trigger)

### 4. State Management
### 5. State Management
Global `state` object tracks:
- `connection`: Active BLE connection instance
- `wardrivingChannel`: Channel object for ping sends
- `txRxAutoRunning` / `autoTimerId` / `nextAutoPingTime`: Auto-ping state
- `lastPingLat/Lon`: For distance validation
- `cooldownEndTime`: 7-second cooldown after each ping
- `sessionId`: UUID for correlating TX/RX events per wardrive session
- `deviceModel`: Full manufacturer string from deviceQuery()
- `autoPowerSet`: Boolean tracking if power was automatically configured

**Device Model Database**: `DEVICE_MODELS` global array loaded from JSON on page load

**RX Batch Buffer**: `Map` keyed by repeater node ID → `{rxEvents: [], bufferedSince, lastFlushed, flushTimerId}`

Expand Down Expand Up @@ -105,9 +120,14 @@ Used by `startAutoCountdown()`, `startRxListeningCountdown()`, cooldown logic.
### 2. Channel Hash & Decryption
**Pre-computed at startup**:
```javascript
WARDRIVING_CHANNEL_KEY = await deriveChannelKey("#wardriving"); // PBKDF2 SHA-256
WARDRIVING_CHANNEL_KEY = await deriveChannelKey("#wardriving"); // SHA-256 for hashtag channels
WARDRIVING_CHANNEL_HASH = await computeChannelHash(key); // PSK channel identifier
```

**Channel Key Types**:
- **Hashtag channels** (`#wardriving`, `#testing`, `#ottawa`): Keys derived via SHA-256 of channel name
- **Public channel** (`Public`, no hashtag): Uses fixed key `8b3387e9c5cdea6ac9e5edbaa115cd72` (default MeshCore channel)

Used for:
- Repeater echo detection (match `channelHash` in received packets)
- Message decryption (AES-ECB via aes-js library)
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
cp -r main-content/* _site/ 2>/dev/null || true

# MAIN: inject release version into root site
sed -i 's|<span id="appVersion"[^>]*>[^<]*</span>|<span id="appVersion" class="text-sm text-slate-400">'"${RELEASE_VERSION}"'</span>|' _site/index.html
sed -i 's|<span id="appVersion"[^>]*>[^<]*</span>|<span id="appVersion" class="text-xs bg-slate-800 border border-slate-700 px-3 py-1 rounded-full text-slate-400 flex-shrink-0">'"${RELEASE_VERSION}"'</span>|' _site/index.html
sed -i 's|const APP_VERSION = "UNKNOWN";|const APP_VERSION = "'"${RELEASE_VERSION}"'";|' _site/content/wardrive.js

# DEV: copy dev site under /dev
Expand All @@ -59,7 +59,7 @@ jobs:

# DEV: inject DEV-EPOCH
DEV_EPOCH=$(date -u +%s)
sed -i 's|<span id="appVersion"[^>]*>[^<]*</span>|<span id="appVersion" class="text-sm text-slate-400">DEV-'"${DEV_EPOCH}"'</span>|' _site/dev/index.html
sed -i 's|<span id="appVersion"[^>]*>[^<]*</span>|<span id="appVersion" class="text-xs bg-slate-800 border border-slate-700 px-3 py-1 rounded-full text-slate-400 flex-shrink-0">DEV-'"${DEV_EPOCH}"'</span>|' _site/dev/index.html
sed -i 's|const APP_VERSION = "UNKNOWN";|const APP_VERSION = "DEV-'"${DEV_EPOCH}"'";|' _site/dev/content/wardrive.js

find _site -name ".git" -exec rm -rf {} + 2>/dev/null || true
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# MeshCore GOME WarDriver

[![Version](https://img.shields.io/badge/version-1.7.0-blue.svg)](https://github.com/MrAlders0n/MeshCore-GOME-WarDriver/releases/tag/v1.7.0)
[![Version](https://img.shields.io/badge/version-1.8.0-blue.svg)](https://github.com/MrAlders0n/MeshCore-GOME-WarDriver/releases/tag/v1.8.0)
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
[![Platform](https://img.shields.io/badge/platform-Android%20%7C%20iOS-orange.svg)](#platform-support)

Expand Down
277 changes: 277 additions & 0 deletions content/device-models.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,277 @@
{
"version": "1.0.0",
"generated": "2026-01-04",
"source": "MeshCore firmware repository - github.com/meshcore-dev/MeshCore",
"devices": [
{
"manufacturer": "Ikoka Stick-E22-22dBm (Xiao_nrf52)",
"shortName": "Ikoka Stick",
"power": 0.3,
"platform": "nrf52",
"txPower": 22,
"notes": "EBYTE E22-900M22S, no PA amplifier"
},
{
"manufacturer": "Ikoka Stick-E22-30dBm (Xiao_nrf52)",
"shortName": "Ikoka Stick",
"power": 1.0,
"platform": "nrf52",
"txPower": 20,
"notes": "EBYTE E22-900M30S, 1W PA: 20dBm input → 30dBm output"
},
{
"manufacturer": "Ikoka Stick-E22-33dBm (Xiao_nrf52)",
"shortName": "Ikoka Stick",
"power": 2.0,
"platform": "nrf52",
"txPower": 9,
"notes": "EBYTE E22-900M33S, 2W PA: 9dBm input → 33dBm output (avoid hardware damage)"
},
{
"manufacturer": "Ikoka Nano-E22-22dBm (Xiao_nrf52)",
"shortName": "Ikoka Nano",
"power": 0.3,
"platform": "nrf52",
"txPower": 22,
"notes": "EBYTE E22-900M22S, no PA amplifier"
},
{
"manufacturer": "Ikoka Nano-E22-30dBm (Xiao_nrf52)",
"shortName": "Ikoka Nano",
"power": 1.0,
"platform": "nrf52",
"txPower": 20,
"notes": "EBYTE E22-900M30S, 1W PA: 20dBm input → 30dBm output"
},
{
"manufacturer": "Ikoka Nano-E22-33dBm (Xiao_nrf52)",
"shortName": "Ikoka Nano",
"power": 2.0,
"platform": "nrf52",
"txPower": 9,
"notes": "EBYTE E22-900M33S, 2W PA: 9dBm input → 33dBm output (avoid hardware damage)"
},
{
"manufacturer": "Ikoka Handheld E22 30dBm (Xiao_nrf52)",
"shortName": "Ikoka Handheld",
"power": 1.0,
"platform": "nrf52",
"txPower": 20,
"notes": "EBYTE E22-900M30S, 1W PA: 20dBm input → 30dBm output"
},
{
"manufacturer": "Elecrow ThinkNode-M1",
"shortName": "Elecrow ThinkNode M1",
"power": 0.3,
"platform": "nrf52",
"txPower": 22,
"notes": "Elecrow ThinkNode M1"
},
{
"manufacturer": "Heltec V2",
"shortName": "Heltec V2",
"power": 0.3,
"platform": "esp32",
"txPower": 20,
"notes": "Heltec WiFi LoRa 32 V2"
},
{
"manufacturer": "Heltec V3",
"shortName": "Heltec V3",
"power": 0.3,
"platform": "esp32-s3",
"txPower": 22,
"notes": "Heltec WiFi LoRa 32 V3"
},
{
"manufacturer": "Heltec V4",
"shortName": "Heltec V4",
"power": 0.6,
"platform": "esp32-s3",
"txPower": 10,
"notes": "Firmware power 10dBm, PA amplifier to 22dBm actual output"
},
{
"manufacturer": "Heltec E213",
"shortName": "Heltec E213",
"power": 0.3,
"platform": "esp32-s3",
"txPower": 22,
"notes": "Heltec E-Ink display variant"
},
{
"manufacturer": "Heltec E290",
"shortName": "Heltec E290",
"power": 0.3,
"platform": "esp32-s3",
"txPower": 22,
"notes": "Heltec E-Ink display variant"
},
{
"manufacturer": "Heltec T190",
"shortName": "Heltec T190",
"power": 0.3,
"platform": "esp32-s3",
"txPower": 22,
"notes": "Heltec T190 tracker variant"
},
{
"manufacturer": "Heltec T114",
"shortName": "Heltec T114",
"power": 0.3,
"platform": "nrf52",
"txPower": 22,
"notes": "Heltec T114 tracker variant"
},
{
"manufacturer": "Heltec Tracker V2",
"shortName": "Heltec Tracker V2",
"power": 0.3,
"platform": "esp32-s3",
"txPower": 10,
"notes": "Firmware power 10dBm, PA amplifier to 22dBm actual output"
},
{
"manufacturer": "Heltec Mesh Solar",
"shortName": "Heltec Mesh Solar",
"power": 0.3,
"platform": "nrf52",
"txPower": 22,
"notes": "Solar-powered variant"
},
{
"manufacturer": "Heltec MeshPocket",
"shortName": "Heltec MeshPocket",
"power": 0.3,
"platform": "nrf52",
"txPower": 22,
"notes": "Pocket-sized handheld"
},
{
"manufacturer": "Heltec CT62",
"shortName": "Heltec CT62",
"power": 0.3,
"platform": "esp32-c3",
"txPower": 22,
"notes": "ESP32-C3 based variant"
},
{
"manufacturer": "RAK 4631",
"shortName": "RAK 4631",
"power": 0.3,
"platform": "nrf52",
"txPower": 22,
"notes": "RAKwireless WisBlock Core"
},
{
"manufacturer": "RAK 3x72",
"shortName": "RAK 3x72",
"power": 0.3,
"platform": "stm32",
"txPower": 22,
"notes": "RAKwireless STM32WLE5 module"
},
{
"manufacturer": "LilyGo T-Echo",
"shortName": "LilyGo T-Echo",
"power": 0.3,
"platform": "nrf52",
"txPower": 22,
"notes": "E-Ink display variant (both T-Echo and T-Echo Lite)"
},
{
"manufacturer": "LilyGo T-Deck",
"shortName": "LilyGo T-Deck",
"power": 0.3,
"platform": "esp32-s3",
"txPower": 22,
"notes": "Full keyboard handheld"
},
{
"manufacturer": "LilyGo T-Beam",
"shortName": "LilyGo T-Beam",
"power": 0.3,
"platform": "esp32",
"txPower": 22,
"notes": "GPS tracker variant"
},
{
"manufacturer": "LILYGO T-LoRa V2.1-1.6",
"shortName": "LILYGO T-LoRa V2.1",
"power": 0.3,
"platform": "esp32",
"txPower": 20,
"notes": "OLED display variant"
},
{
"manufacturer": "Seeed Wio E5 Dev Board",
"shortName": "Wio E5 Dev Board",
"power": 0.3,
"platform": "stm32",
"txPower": 22,
"notes": "STM32WLE5 integrated LoRa"
},
{
"manufacturer": "Xiao C3",
"shortName": "Xiao C3",
"power": 0.3,
"platform": "esp32-c3",
"txPower": 22,
"notes": "Seeed Xiao ESP32-C3"
},
{
"manufacturer": "Xiao C6",
"shortName": "Xiao C6",
"power": 0.3,
"platform": "esp32-c6",
"txPower": 22,
"notes": "Seeed Xiao ESP32-C6"
},
{
"manufacturer": "Xiao S3 WIO",
"shortName": "Xiao S3 WIO",
"power": 0.3,
"platform": "esp32-s3",
"txPower": 22,
"notes": "Seeed Xiao ESP32-S3 with WIO expansion"
},
{
"manufacturer": "Tiny Relay",
"shortName": "Tiny Relay",
"power": 0.3,
"platform": "stm32",
"txPower": 22,
"notes": "STM32-based relay control board"
},
{
"manufacturer": "Minewsemi",
"shortName": "Minewsemi",
"power": 0.3,
"platform": "nrf52",
"txPower": 22,
"notes": "Minewsemi ME25LS01 tracker"
},
{
"manufacturer": "Station G2",
"shortName": "Station G2",
"power": 1.0,
"platform": "esp32-s3",
"txPower": 19,
"notes": "Custom power 19dBm (RX boosted gain disabled for RF performance)"
}
],
"powerMapping": {
"0.3": "24 dBm and below - Standard devices without PA",
"0.6": "28 dBm - Heltek v4",
"1.0": "30 dBm - 1W PA modules (E22-900M30S): 20dBm input → 30dBm output",
"2.0": "33 dBm - 2W PA modules (E22-900M33S): 9dBm input → 33dBm output"
},
"notes": [
"Build suffix (e.g., 'nightly-e31c46f') is appended at compile time and should be stripped for matching",
"Power values are wardrive.js radio power settings (0.3, 0.6, 1.0, 2.0)",
"txPower values are firmware LORA_TX_POWER settings in dBm",
"PA (Power Amplifier) modules boost input power to higher output power",
"Some devices may report different strings based on firmware version",
"For unknown devices, default to power 0.3 (safest conservative setting)"
]
}
Loading
Loading