diff --git a/config.json b/config.json index f077dc3..449b949 100644 --- a/config.json +++ b/config.json @@ -1,6 +1,10 @@ { "staticPath": "/firmware", "role": { + "meshos": { + "icon": "dashboard", + "title": "MeshOS" + }, "gui": { "icon": "gradient", "title": "Ripple GUI", @@ -34,6 +38,10 @@ "tooltip": "Special role for local room server. Configured via Config/Console on flasher main page" } }, + "notice": { + "otafixRecommended": "
We strongly recommend installing OTAFIX bootloader for more reliable Bluetooth OTA DFU. Read more
", + "otafixNeeded": "
WARNING: We strongly recommend installing OTAFIX bootloader if you plan to update firmware via OTA bluetooth, as factory bootloader does not support it! Read more
" + }, "maker": { "elecrow": { "name": "Elecrow" @@ -58,6 +66,51 @@ } }, "device": [ + { + "maker": "heltec", + "class": "ripple", + "name": "Heltec v4 + Expansion Kit (Touch)", + "tooltip": "", + "icon": "/img/lora.svg", + "type": "esp32", + "firmware": [ + { + "role": "gui", + "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-HeltecV4-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-HeltecV4-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* faster map rendering\n* Bandwidth 500 support\n\nFull changelog" + }, + "v8.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-HeltecV4-ExpKit-v8.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-HeltecV4-ExpKit-v8.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog" + } + } + } + ] + }, { "maker": "lilygo", "class": "ripple", @@ -69,6 +122,36 @@ { "role": "gui", "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TDeck-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TDeck-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* faster map rendering\n* Bandwidth 500 support\n* trackball crash fix\n\nFull changelog" + }, + "v8.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TDeck-v8.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TDeck-v8.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog" + }, "v7.14": { "files": [ { @@ -372,6 +455,36 @@ { "role": "guiSD", "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TDeck-SD-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TDeck-SD-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* faster map rendering\n* Bandwidth 500 support\n* trackball crash fix\n\nFull changelog" + }, + "v8.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TDeck-SD-v8.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TDeck-SD-v8.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog" + }, "v7.14": { "files": [ { @@ -685,6 +798,36 @@ { "role": "gui", "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TDeckPro-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TDeckPro-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nv9.0 changes:\n*support for v1.0 and v1.1 hardware models (separate .bin files in zip)\n* Discover list now overwrites oldest entry if full\n* new UI: customisable home icon grid, and new icon grid menus\n\nFull changelog" + }, + "v8.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TDeckPro-v8.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TDeckPro-v8.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog" + }, "v7.14": { "files": [ { @@ -795,6 +938,21 @@ { "role": "guiSD", "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TDeckPro-SD-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TDeckPro-SD-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nv9.0 changes:\n*support for v1.0 and v1.1 hardware models (separate .bin files in zip)\n* Discover list now overwrites oldest entry if full\n* new UI: customisable home icon grid, and new icon grid menus\n\nFull changelog" + }, "v7.14": { "files": [ { @@ -901,13 +1059,55 @@ "notes": "* Initial release" } } + }, + { + "role": "gui", + "title": "Ripple GUI (T-Deck Pro v1.1)", + "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TDeckProV11-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TDeckProV11-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nv9.0 changes:\n*support for v1.0 and v1.1 hardware models (separate .bin files in zip)\n* Discover list now overwrites oldest entry if full\n* new UI: customisable home icon grid, and new icon grid menus\n\nFull changelog" + } + } + }, + { + "role": "guiSD", + "title": "Ripple GUI: data on SD card (T-Deck Pro v1.1)", + "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TDeckProV11-SD-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TDeckProV11-SD-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nv9.0 changes:\n*support for v1.0 and v1.1 hardware models (separate .bin files in zip)\n* Discover list now overwrites oldest entry if full\n* new UI: customisable home icon grid, and new icon grid menus\n\nFull changelog" + } + } } ] }, { "maker": "lilygo", "class": "ripple", - "name": "LilyGo T5 E-Paper S3 Pro (non-gps, only rev. H752)", + "name": "LilyGo T5 E-Paper S3 Pro (H752-XX)", "tooltip": "", "icon": "/img/lora.svg", "type": "esp32", @@ -915,139 +1115,35 @@ { "role": "gui", "version": { - "v7.1": { + "v9.2": { "files": [ { "type": "flash-wipe", - "name": "Ultra-T5-epaper-UKStore-v7.1-merged.bin", + "name": "Ultra-T5Pro-v9.2-merged.bin", "title": "Combined app+partition+bootloader firmware bin" }, { "type": "flash-update", - "name": "Ultra-T5-epaper-UKStore-v7.1.bin", + "name": "Ultra-T5Pro-v9.2.bin", "title": "App firmware bin (use with m5 booloader)" } ], - "notes": "* Channel details hex or base64 input\n* MeshCore lib updates/fixes" + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nfull changelog" }, - "v7.0": { + "v8.2": { "files": [ { "type": "flash-wipe", - "name": "Ultra-T5-epaper-UKStore-v7.0-merged.bin", + "name": "Ultra-T5Pro-v8.2-merged.bin", "title": "Combined app+partition+bootloader firmware bin" }, { "type": "flash-update", - "name": "Ultra-T5-epaper-UKStore-v7.0.bin", + "name": "Ultra-T5Pro-v8.2.bin", "title": "App firmware bin (use with m5 booloader)" } ], - "notes": "* Saved paths, manual set path,\n* Trackball press is now select, long press for screen off,\n* Room keep-alive packets now not sent,\n* Discover screen, max now 140,\n* New customisable sounds: new-advert.mp3, existing-advert.mp3" - }, - "v6.9": { - "files": [ - { - "type": "flash-wipe", - "name": "Ultra-T5-epaper-UKStore-v6.9-merged.bin", - "title": "Combined app+partition+bootloader firmware bin" - }, - { - "type": "flash-update", - "name": "Ultra-T5-epaper-UKStore-v6.9.bin", - "title": "App firmware bin (use with m5 booloader)" - } - ], - "notes": "* Sound and other prefs now persisted\n* New “Show on Map” conversation menu\n* MeshCore lib fixes" - }, - "v6.8": { - "files": [ - { - "type": "flash-wipe", - "name": "Ultra-T5-epaper-UKStore-v6.8-merged.bin", - "title": "Combined app+partition+bootloader firmware bin" - }, - { - "type": "flash-update", - "name": "Ultra-T5-epaper-UKStore-v6.8.bin", - "title": "App firmware bin (use with m5 booloader)" - } - ], - "notes": "* Repeater & Room UI redesign\n* Room, admin CLI now from menu" - }, - "v6.7": { - "files": [ - { - "type": "flash-wipe", - "name": "RippleUltra-T5-epaper-v6.7-merged.bin", - "title": "Combined app+partition+bootloader firmware bin" - }, - { - "type": "flash-update", - "name": "RippleUltra-T5-epaper-v6.7.bin", - "title": "App firmware bin (use with m5 booloader)" - } - ], - "notes": "* Public channel auto-configured (new profiles)\n* Telemetry support (location, ‘online’ indicator)\n* Rooms, unsynced counter (green)\n* Room stats dialog\n* Discover, ‘Send ID Broadcast’ menu" - }, - "v6.6": { - "files": [ - { - "type": "flash-wipe", - "name": "RippleUltra-T5-epaper-v6.6-merged.bin", - "title": "Combined app+partition+bootloader firmware bin" - }, - { - "type": "flash-update", - "name": "RippleUltra-T5-epaper-v6.6.bin", - "title": "App firmware bin (use with m5 booloader)" - } - ], - "notes": "* now saves repeater and room server passwords.\n* New 'auto advert ON/OFF' option" - }, - "v6.5": { - "files": [ - { - "type": "flash-wipe", - "name": "RippleUltra-T5-epaper-v6.5-merged.bin", - "title": "Combined app+partition+bootloader firmware bin" - }, - { - "type": "flash-update", - "name": "RippleUltra-T5-epaper-v6.5.bin", - "title": "App firmware bin (use with m5 booloader)" - } - ], - "notes": "* Existing profiles have SF editable" - }, - "v6.3": { - "files": [ - { - "type": "flash-wipe", - "name": "RippleUltra-T5-epaper-v6.3-merged.bin", - "title": "Combined app+partition+bootloader firmware bin" - }, - { - "type": "flash-update", - "name": "RippleUltra-T5-epaper-v6.3.bin", - "title": "App firmware bin (use with m5 booloader)" - } - ], - "notes": "* BUG Fix: advert verify caused memory corruption" - }, - "v6.0-beta22": { - "files": [ - { - "type": "flash-wipe", - "name": "RippleUltra-T5-epaper-v6.0-beta21-merged.bin", - "title": "Combined app+partition+bootloader firmware bin" - }, - { - "type": "flash-update", - "name": "RippleUltra-T5-epaper-v6.0-beta21.bin", - "title": "App firmware bin (use with m5 booloader)" - } - ] + "notes": "v8.2 changes:\n* updated UI colour scheme\n* new Regions screen, with 'Scan Local' menu\n* new 'Owner Info' menu, from Discover > Scan Local\nFull changelog" } } } @@ -1065,6 +1161,36 @@ "role": "gui", "title": "[SX1262] Ripple GUI", "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TPager-SX1262-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TPager-SX1262-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nfull changelog" + }, + "v8.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TPager-sx1262-v8.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TPager-sx1262-v8.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog" + }, "v7.14": { "files": [ { @@ -1251,6 +1377,36 @@ "role": "guiSD", "title": "[SX1262] Ripple GUI: data on SD card", "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TPager-SX1262-SD-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TPager-SX1262-SD-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nfull changelog" + }, + "v8.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TPager-SD-sx1262-v8.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TPager-SD-sx1262-v8.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog" + }, "v7.14": { "files": [ { @@ -1422,6 +1578,36 @@ "role": "gui", "title": "[LR1121] Ripple GUI", "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TPager-LR1121-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TPager-LR1121-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nfull changelog" + }, + "v8.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TPager-LR1121-v8.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TPager-LR1121-v8.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog" + }, "v7.14": { "files": [ { @@ -1443,6 +1629,36 @@ "role": "guiSD", "title": "[LR1121] Ripple GUI: data on SD card", "version": { + "v9.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TPager-LR1121-SD-v9.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TPager-LR1121-SD-v9.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nfull changelog" + }, + "v8.2": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TPager-SD-LR1121-v8.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TPager-SD-LR1121-v8.2.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog" + }, "v7.14": { "files": [ { @@ -1507,6 +1723,36 @@ } ] }, + { + "maker": "lilygo", + "class": "ripple", + "name": "LilyGo T-Watch S3 Plus", + "tooltip": "", + "icon": "/img/lora.svg", + "type": "esp32", + "firmware": [ + { + "role": "gui", + "version": { + "v9.3": { + "files": [ + { + "type": "flash-wipe", + "name": "Ultra-TWatchS3Plus-v9.3.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "Ultra-TWatchS3Plus-v9.3.bin", + "title": "App firmware bin (use with m5 booloader)" + } + ], + "notes": "* Power saving added (battery life from ~12 hr to ~20 hr)\n* Stopwatch and countdown Timer home screen widgets\n* Help tutorial screens" + } + } + } + ] + }, { "maker": "seeed", "class": "ripple", @@ -1515,10 +1761,26 @@ "tooltip": "", "type": "nrf52", "erase": "WioTrackerL1_QSPIFlash_Format-v1.2.zip", + "bootloader": "wio_tracker_l1_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "gui", "version": { + "v8.2": { + "files": [ + { + "type": "download", + "name": "Ultra-WioTrackerL1-v8.2.uf2", + "title": "UF2 file for manual USB DFU mass storage update" + }, + { + "type": "flash-update", + "name": "Ultra-WioTrackerL1-v8.2.zip", + "title": "App firmware" + } + ], + "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog" + }, "v7.14": { "files": [ { @@ -1568,6 +1830,353 @@ } ] }, + { + "maker": "lilygo", + "class": "meshos", + "name": "LilyGo T-Deck", + "tooltip": "", + "icon": "/img/lora.svg", + "type": "esp32", + "firmware": [ + { + "role": "meshos", + "version": { + "v1.1.8": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDeck-1.1.8-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDeck-1.1.8.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TDeck-1.1.8.zip", + "title": "SD Update zip" + } + ], + "notes": "* Better compatibility with MeshCore app\n* Channels increased to 20 when used with the app\n* Low memory messages fix\n* other bug fixes" + }, + "v1.1.7": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDeck-1.1.7-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDeck-1.1.7.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TDeck-1.1.7.zip", + "title": "SD Update zip" + } + ], + "notes": "* Bluetooth companion (Beta)\n* Improved heard list\n* bug fixes\n* SD card discovery/heard storage" + }, + "v1.1.6": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDeck-1.1.6-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDeck-1.1.6.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TDeck-1.1.6.zip", + "title": "SD Update zip" + } + ], + "notes": "* Bluetooth companion (Beta)\n* Improved heard list\n* bug fixes\n* SD card discovery/heard storage" + }, + "v1.1.3": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDeck-1.1.3-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDeck-1.1.3.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TDeck-1.1.3.zip", + "title": "SD Update zip" + } + ], + "notes": "* UI Optimsiations\n* PSK Channel entry (channel 5)\n* Bugfixes" + }, + "v1.1.2": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDeck-1.1.2-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDeck-1.1.2.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TDeck-1.1.2.zip", + "title": "SD Update zip" + } + ], + "notes": "* Timezone fixes\n* Home & Lock Screen Wallpaper settings\n* Terminal buffer increased\n* Bugfixes" + }, + "v1.1.1": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDeck-1.1.1-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDeck-1.1.1.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TDeck-1.1.1.zip", + "title": "SD Update zip" + } + ], + "notes": "* Map Fixes\n* Notification optimisations\n* Other fixes" + }, + "v1.1.0": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDeck-1.1.0-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDeck-1.1.0.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TDeck-1.1.0.zip", + "title": "SD Update zip" + } + ], + "notes": "* DM UI updated for easier DM chat, badge message notifications.\n* DM notifications on homescreen.\n* Emoji fixes.\n* 179 extra glyphs added to the main font to support text display for 9 countries/regions.\n* International keyboard support for 9 countries/regions.\n* GPS Time Sync update.\n* Tile support for maps in zoom view.\n* Lots of bug fixes, tweaks etc." + }, + "v1.0.10": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDeck-1.0.10-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDeck-1.0.10.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TDeck-1.0.10.zip", + "title": "SD Update zip" + } + ], + "notes": "* Path set for contacts fixed.\n* Added delete contacts, repeaters, rooms from the contact details panel.\n* Bulk delete repeaters, rooms, chat with /clearcontacts repeaters|rooms|chat\n* Radio Profiles updated to match most recent MeshCore App profiles.\n* Map bug that showed wierd UK outline when no GPS was set.\n* Keyboard backlight fix when AOD off and device wakes. (T-Deck + with new KB only)\n* Low entropy key fix." + }, + "v1.0.8": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDeck-1.0.8-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDeck-1.0.8.bin", + "title": "App firmware bin" + } + ], + "notes": "* Initial release" + } + } + } + ] + }, + { + "maker": "lilygo", + "class": "meshos", + "name": "LilyGo T-Lora Pager", + "tooltip": "", + "icon": "/img/lora.svg", + "type": "esp32", + "firmware": [ + { + "role": "meshos", + "version": { + "v1.1.8": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TPager-1.1.8-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TPager-1.1.8.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TPager-1.1.8.zip", + "title": "SD Update zip" + } + ], + "notes": "* Better compatibility with MeshCore app\n* Channels increased to 20 when used with the app\n* Low memory messages fix\n* other bug fixes" + }, + "v1.1.7": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TPager-1.1.7-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TPager-1.1.7.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TPager-1.1.7.zip", + "title": "SD Update zip" + } + ], + "notes": "* Bug fixes\n* Update compatibility with MeshOS android app\n* Contacts fixed for official MeshCore app" + }, + "v1.1.6": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TPager-1.1.6-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TPager-1.1.6.bin", + "title": "App firmware bin" + }, + { + "type": "download", + "name": "MeshOS-TPager-1.1.6.zip", + "title": "SD Update zip" + } + ], + "notes": "* Initial release" + } + } + } + ] + }, + { + "maker": "lilygo", + "class": "meshos", + "name": "LilyGo T-Display P4", + "tooltip": "", + "icon": "/img/lora.svg", + "type": "esp32", + "firmware": [ + { + "role": "meshos", + "title": "MeshOS (AMOLED Version)", + "version": { + "v1.0.1": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDisplay-P4-1.0.1-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDisplay-P4-1.0.1.bin", + "title": "App firmware bin" + } + ], + "notes": "* Channel Delete\n* Multibyte Path setting\n* GPS Manual Position\n* PTT app" + }, + "v1.0.0": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-V1.0.0-Tdisplay-p4-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-V1.0.0-Tdisplay-p4.bin", + "title": "App firmware bin" + } + ], + "notes": "* Initial release" + } + } + }, + { + "role": "meshos", + "title": "MeshOS (LCD Version)", + "version": { + "v1.0.1": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-TDisplay-P4-LCD-1.0.1-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-TDisplay-P4-LCD-1.0.1.bin", + "title": "App firmware bin" + } + ], + "notes": "* Channel Delete\n* Multibyte Path setting\n* GPS Manual Position\n* PTT app" + }, + "v1.0.0": { + "files": [ + { + "type": "flash-wipe", + "name": "MeshOS-V1.0.0-Tdisplay-p4-LCD-merged.bin", + "title": "Combined app+partition+bootloader firmware bin" + }, + { + "type": "flash-update", + "name": "MeshOS-V1.0.0-Tdisplay-p4-LCD.bin", + "title": "App firmware bin" + } + ], + "notes": "* Initial release" + } + } + } + ] + }, { "maker": "lilygo", "class": "community", @@ -2025,6 +2634,210 @@ } ] }, + { + "maker": "gat-iot", + "class": "community", + "name": "GAT-IoT GAT562 Tracker", + "icon": "/img/lora.svg", + "tooltip": "", + "type": "nrf52", + "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip", + "bootloader":"wiscore_rak4631_board_bootloader-0.9.2-OTAFIX2.1.uf2", + "firmware": [ + { + "role": "companionBle", + "github": { + "type": "companion", + "files": { + "flash": "GAT562_Mesh_Tracker_Pro_companion_radio_ble.*?\\.zip", + "download": "GAT562_Mesh_Tracker_Pro_companion_radio_ble.*?\\.uf2" + } + } + }, + { + "role": "companionUsb", + "github": { + "type": "companion", + "files": { + "flash": "GAT562_Mesh_Tracker_Pro_companion_radio_usb.*?\\.zip", + "download": "GAT562_Mesh_Tracker_Pro_companion_radio_usb.*?\\.uf2" + } + } + }, + { + "role": "repeater", + "github": { + "type": "repeater", + "files": { + "flash": "GAT562_Mesh_Tracker_Pro_[rR]epeater.*?\\.zip", + "download": "GAT562_Mesh_Tracker_Pro_[rR]epeater.*?\\.uf2" + } + } + }, + { + "role": "roomServer", + "github": { + "type": "room-server", + "files": { + "flash": "GAT562_Mesh_Tracker_Pro_room_server.*?\\.zip", + "download": "GAT562_Mesh_Tracker_Pro_room_server.*?\\.uf2" + } + } + } + ] + }, + { + "maker": "gat-iot", + "class": "community", + "name": "GAT-IoT GAT562 30s", + "icon": "/img/lora.svg", + "tooltip": "", + "type": "nrf52", + "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip", + "bootloader":"wiscore_rak4631_board_bootloader-0.9.2-OTAFIX2.1.uf2", + "firmware": [ + { + "role": "companionBle", + "github": { + "type": "companion", + "files": { + "flash": "GAT562_30S_Mesh_Kit_companion_radio_ble.*?\\.zip", + "download": "GAT562_30S_Mesh_Kit_companion_radio_ble.*?\\.uf2" + } + } + }, + { + "role": "companionUsb", + "github": { + "type": "companion", + "files": { + "flash": "GAT562_30S_Mesh_Kit_companion_radio_usb.*?\\.zip", + "download": "GAT562_30S_Mesh_Kit_companion_radio_usb.*?\\.uf2" + } + } + }, + { + "role": "repeater", + "github": { + "type": "repeater", + "files": { + "flash": "GAT562_30S_Mesh_Kit_[rR]epeater.*?\\.zip", + "download": "GAT562_30S_Mesh_Kit_[rR]epeater.*?\\.uf2" + } + } + }, + { + "role": "roomServer", + "github": { + "type": "room-server", + "files": { + "flash": "GAT562_Mesh_Tracker_Pro_room_server.*?\\.zip", + "download": "GAT562_Mesh_Tracker_Pro_room_server.*?\\.uf2" + } + } + } + ] + }, + { + "maker": "heltec", + "class": "community", + "name": "Heltec Vision Master E213", + "icon": "/img/lora.svg", + "type": "esp32", + "tooltip": "", + "firmware": [ + { + "role": "companionBle", + "github": { + "type": "companion", + "files": { + "flash-wipe": "Heltec_E213_companion_radio_ble.*?-merged\\.bin", + "flash-update": "Heltec_E213_companion_radio_ble.*?-[a-f0-9]{7}\\.bin" + } + } + }, + { + "role": "companionUsb", + "github": { + "type": "companion", + "files": { + "flash-wipe": "Heltec_E213_companion_radio_usb.*?-merged\\.bin", + "flash-update": "Heltec_E213_companion_radio_usb.*?-[a-f0-9]{7}\\.bin" + } + } + }, + { + "role": "repeater", + "github": { + "type": "repeater", + "files": { + "flash-wipe": "Heltec_E213_[rR]epeater.*?-merged\\.bin", + "flash-update": "Heltec_E213_[rR]epeater.*?-[a-f0-9]{7}\\.bin" + } + } + }, + { + "role": "roomServer", + "github": { + "type": "room-server", + "files": { + "flash-wipe": "Heltec_E213_room_server.*?-merged\\.bin", + "flash-update": "Heltec_E213_room_server.*?-[a-f0-9]{7}\\.bin" + } + } + } + ] + }, + { + "maker": "heltec", + "class": "community", + "name": "Heltec Vision Master E290", + "icon": "/img/lora.svg", + "type": "esp32", + "tooltip": "", + "firmware": [ + { + "role": "companionBle", + "github": { + "type": "companion", + "files": { + "flash-wipe": "Heltec_E290_companion_radio_ble.*?-merged\\.bin", + "flash-update": "Heltec_E290_companion_radio_ble.*?-[a-f0-9]{7}\\.bin" + } + } + }, + { + "role": "companionUsb", + "github": { + "type": "companion", + "files": { + "flash-wipe": "Heltec_E290_companion_radio_usb.*?-merged\\.bin", + "flash-update": "Heltec_E290_companion_radio_usb.*?-[a-f0-9]{7}\\.bin" + } + } + }, + { + "role": "repeater", + "github": { + "type": "repeater", + "files": { + "flash-wipe": "Heltec_E290_[rR]epeater.*?-merged\\.bin", + "flash-update": "Heltec_E290_[rR]epeater.*?-[a-f0-9]{7}\\.bin" + } + } + }, + { + "role": "roomServer", + "github": { + "type": "room-server", + "files": { + "flash-wipe": "Heltec_E290_room_server.*?-merged\\.bin", + "flash-update": "Heltec_E290_room_server.*?-[a-f0-9]{7}\\.bin" + } + } + } + ] + }, { "maker": "heltec", "class": "community", @@ -2182,6 +2995,7 @@ "icon": "/img/lora.svg", "type": "nrf52", "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip", + "bootloader":"heltec_t114_board_bootloader-0.9.2-OTAFIX2.1.uf2", "tooltip": "", "firmware": [ { @@ -2204,6 +3018,28 @@ } } }, + { + "role": "repeater", + "notice":"otafixRecommended", + "github": { + "type": "repeater", + "files": { + "flash": "Heltec_t114_[rR]epeater.*?\\.zip", + "download": "Heltec_t114_[rR]epeater.*?\\.uf2" + } + } + }, + { + "role": "roomServer", + "notice":"otafixRecommended", + "github": { + "type": "room-server", + "files": { + "flash": "Heltec_t114_room_server.*?\\.zip", + "download": "Heltec_t114_room_server.*?\\.uf2" + } + } + }, { "role": "companionBle", "title": "Companion", @@ -2216,13 +3052,79 @@ } } }, + { + "role": "companionUsb", + "title": "Companion", + "subTitle": "USB [no display]", + "github": { + "type": "companion", + "files": { + "flash": "Heltec_t114_without_display_companion_radio_ble.*?\\.zip", + "download": "Heltec_t114_without_display_companion_radio_ble.*?\\.uf2" + } + } + }, + { + "role": "repeater", + "notice":"otafixRecommended", + "subTitle": "[no display]", + "github": { + "type": "repeater", + "files": { + "flash": "Heltec_t114_without_display_[rR]epeater.*?\\.zip", + "download": "Heltec_t114_without_display_[rR]epeater.*?\\.uf2" + } + } + }, + { + "role": "roomServer", + "notice":"otafixRecommended", + "subTitle": "[no display]", + "github": { + "type": "room-server", + "files": { + "flash": "Heltec_t114_without_display_room_server.*?\\.zip", + "download": "Heltec_t114_without_display_room_server.*?\\.uf2" + } + } + } + ] + }, + { + "maker": "heltec", + "class": "community", + "name": "Heltec Wireless Tracker v2", + "icon": "/img/lora.svg", + "type": "esp32", + "tooltip": "", + "firmware": [ + { + "role": "companionBle", + "github": { + "type": "companion", + "files": { + "flash-wipe": "heltec_tracker_v2_companion_radio_ble.*?-merged\\.bin", + "flash-update": "heltec_tracker_v2_companion_radio_ble.*?-[a-f0-9]{7}\\.bin" + } + } + }, + { + "role": "companionUsb", + "github": { + "type": "companion", + "files": { + "flash-wipe": "heltec_tracker_v2_companion_radio_usb.*?-merged\\.bin", + "flash-update": "heltec_tracker_v2_companion_radio_usb.*?-[a-f0-9]{7}\\.bin" + } + } + }, { "role": "repeater", "github": { "type": "repeater", "files": { - "flash": "Heltec_t114_[rR]epeater.*?\\.zip", - "download": "Heltec_t114_[rR]epeater.*?\\.uf2" + "flash-wipe": "heltec_tracker_v2_[rR]epeater.*?-merged\\.bin", + "flash-update": "heltec_tracker_v2_[rR]epeater.*?-[a-f0-9]{7}\\.bin" } } }, @@ -2231,8 +3133,8 @@ "github": { "type": "room-server", "files": { - "flash": "Heltec_t114_room_server.*?\\.zip", - "download": "Heltec_t114_room_server.*?\\.uf2" + "flash-wipe": "heltec_tracker_v2_room_server.*?-merged\\.bin", + "flash-update": "heltec_tracker_v2_room_server.*?-[a-f0-9]{7}\\.bin" } } } @@ -2498,6 +3400,7 @@ "tooltip": "", "type": "nrf52", "erase": "FLASH_ERASE_nrf52_softdevice_v7.zip", + "bootloader":"xiao_nrf52840_ble_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "companionBle", @@ -2523,6 +3426,7 @@ }, { "role": "repeater", + "notice":"otafixNeeded", "title": "Repeater - 22dBm", "github": { "type": "repeater", @@ -2534,6 +3438,7 @@ }, { "role": "roomServer", + "notice":"otafixNeeded", "title": "Room Server - 22dBm", "github": { "type": "room-server", @@ -2567,6 +3472,7 @@ }, { "role": "repeater", + "notice":"otafixNeeded", "title": "Repeater - 30dBm", "github": { "type": "repeater", @@ -2578,6 +3484,7 @@ }, { "role": "roomServer", + "notice":"otafixNeeded", "title": "Room Server - 30dBm", "github": { "type": "room-server", @@ -2611,6 +3518,7 @@ }, { "role": "repeater", + "notice":"otafixNeeded", "title": "Repeater - 33dBm", "github": { "type": "repeater", @@ -2622,6 +3530,7 @@ }, { "role": "roomServer", + "notice":"otafixNeeded", "title": "Room Server - 33dBm", "github": { "type": "room-server", @@ -2641,6 +3550,7 @@ "tooltip": "", "type": "nrf52", "erase": "FLASH_ERASE_nrf52_softdevice_v7.zip", + "bootloader":"xiao_nrf52840_ble_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "companionBle", @@ -2666,6 +3576,7 @@ }, { "role": "repeater", + "notice":"otafixNeeded", "title": "Repeater - 22dBm", "github": { "type": "repeater", @@ -2677,6 +3588,7 @@ }, { "role": "roomServer", + "notice":"otafixNeeded", "title": "Room Server - 22dBm", "github": { "type": "room-server", @@ -2710,6 +3622,7 @@ }, { "role": "repeater", + "notice":"otafixNeeded", "title": "Repeater - 30dBm", "github": { "type": "repeater", @@ -2721,6 +3634,7 @@ }, { "role": "roomServer", + "notice":"otafixNeeded", "title": "Room Server - 30dBm", "github": { "type": "room-server", @@ -2754,6 +3668,7 @@ }, { "role": "repeater", + "notice":"otafixNeeded", "title": "Repeater - 33dBm", "github": { "type": "repeater", @@ -2765,6 +3680,7 @@ }, { "role": "roomServer", + "notice":"otafixNeeded", "title": "Room Server - 33dBm", "github": { "type": "room-server", @@ -2784,6 +3700,7 @@ "tooltip": "", "type": "nrf52", "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip", + "bootloader":"wiscore_rak4631_board_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "companionBle", @@ -2830,11 +3747,62 @@ { "maker": "rak", "class": "community", - "name": "RAK Wireless WisBlock / WisMesh (RAK 4631)", + "name": "RAK WisBlock 3112", + "icon": "/img/lora.svg", + "tooltip": "", + "type": "esp32", + "firmware": [ + { + "role": "companionBle", + "github": { + "type": "companion", + "files": { + "flash-wipe": "RAK3112_companion_radio_ble.*?-merged\\.bin", + "flash-update": "RAK3112_companion_radio_ble.*?-[a-f0-9]{7}\\.bin" + } + } + }, + { + "role": "companionUsb", + "github": { + "type": "companion", + "files": { + "flash-wipe": "RAK3112_companion_radio_usb.*?-merged\\.bin", + "flash-update": "RAK3112_companion_radio_usb.*?-[a-f0-9]{7}\\.bin" + } + } + }, + { + "role": "repeater", + "github": { + "type": "repeater", + "files": { + "flash-wipe": "RAK3112_[rR]epeater.*?-merged\\.bin", + "flash-update": "RAK3112_[rR]epeater.*?-[a-f0-9]{7}\\.bin" + } + } + }, + { + "role": "roomServer", + "github": { + "type": "room-server", + "files": { + "flash-wipe": "RAK3112_room_server.*?-merged\\.bin", + "flash-update": "RAK3112_room_server.*?-[a-f0-9]{7}\\.bin" + } + } + } + ] + }, + { + "maker": "rak", + "class": "community", + "name": "RAK WisBlock / WisMesh (RAK 4631)", "icon": "/img/lora.svg", "tooltip": "", "type": "nrf52", "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip", + "bootloader":"wiscore_rak4631_board_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "companionBle", @@ -2858,6 +3826,7 @@ }, { "role": "repeater", + "notice": "otafixRecommended", "github": { "type": "repeater", "files": { @@ -2868,6 +3837,7 @@ }, { "role": "roomServer", + "notice": "otafixRecommended", "github": { "type": "room-server", "files": { @@ -2878,6 +3848,60 @@ } ] }, + { + "maker": "rak", + "class": "community", + "name": "RAK WisMesh 1W Booster (3401 + 13302)", + "icon": "/img/lora.svg", + "tooltip": "", + "type": "nrf52", + "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip", + "bootloader":"wiscore_rak4631_board_bootloader-0.9.2-OTAFIX2.1.uf2", + "firmware": [ + { + "role": "companionBle", + "github": { + "type": "companion", + "files": { + "flash": "RAK_3401_companion_radio_ble.*?\\.zip", + "download": "RAK_3401_companion_radio_ble.*?\\.uf2" + } + } + }, + { + "role": "companionUsb", + "github": { + "type": "companion", + "files": { + "flash": "RAK_3401_companion_radio_usb.*?\\.zip", + "download": "RAK_3401_companion_radio_usb.*?\\.uf2" + } + } + }, + { + "role": "repeater", + "notice": "otafixRecommended", + "github": { + "type": "repeater", + "files": { + "flash": "RAK_3401_[rR]epeater.*?\\.zip", + "download": "RAK_3401_[rR]epeater.*?\\.uf2" + } + } + }, + { + "role": "roomServer", + "notice": "otafixRecommended", + "github": { + "type": "room-server", + "files": { + "flash": "RAK_3401_room_server.*?\\.zip", + "download": "RAK_3401_room_server.*?\\.uf2" + } + } + } + ] + }, { "maker": "rak", "class": "community", @@ -2886,6 +3910,7 @@ "tooltip": "", "type": "nrf52", "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip", + "bootloader":"wismesh_tag_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "companionBle", @@ -2909,6 +3934,7 @@ }, { "role": "repeater", + "notice": "otafixRecommended", "github": { "type": "repeater", "files": { @@ -2919,6 +3945,7 @@ }, { "role": "roomServer", + "notice": "otafixRecommended", "github": { "type": "room-server", "files": { @@ -2937,6 +3964,7 @@ "tooltip": "", "type": "nrf52", "erase": "FLASH_ERASE_nrf52_softdevice_v7.zip", + "bootloader":"sensecap_solar_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "companionBle", @@ -2960,6 +3988,7 @@ }, { "role": "repeater", + "notice": "otafixNeeded", "github": { "type": "repeater", "files": { @@ -2970,6 +3999,7 @@ }, { "role": "roomServer", + "notice": "otafixNeeded", "github": { "type": "room-server", "files": { @@ -2988,6 +4018,7 @@ "tooltip": "", "type": "nrf52", "erase": "FLASH_ERASE_nrf52_softdevice_v7.zip", + "bootloader":"t1000_e_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "companionBle", @@ -3039,6 +4070,7 @@ "tooltip": "", "type": "nrf52", "erase": "WioTrackerL1_QSPIFlash_Format-v1.2.zip", + "bootloader": "wio_tracker_l1_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "companionBle", @@ -3062,6 +4094,7 @@ }, { "role": "repeater", + "notice": "otafixNeeded", "github": { "type": "repeater", "files": { @@ -3072,6 +4105,7 @@ }, { "role": "roomServer", + "notice": "otafixNeeded", "github": { "type": "room-server", "files": { @@ -3088,6 +4122,7 @@ "name": "Seeed Studio Wio Tracker L1 EINK", "icon": "/img/lora.svg", "tooltip": "", + "bootloader": "wio_tracker_l1_bootloader-0.9.2-OTAFIX2.1.uf2", "type": "nrf52", "erase": "WioTrackerL1_QSPIFlash_Format-v1.2.zip", "firmware": [ @@ -3113,6 +4148,7 @@ }, { "role": "repeater", + "notice": "otafixNeeded", "github": { "type": "repeater", "files": { @@ -3123,6 +4159,7 @@ }, { "role": "roomServer", + "notice": "otafixNeeded", "github": { "type": "room-server", "files": { @@ -3243,6 +4280,7 @@ "tooltip": "", "type": "nrf52", "erase": "Xiao_nrf52_QSPIFlash_Format-v1.2.zip", + "bootloader": "xiao_nrf52840_ble_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "companionBle", @@ -3266,6 +4304,7 @@ }, { "role": "repeater", + "notice": "otafixNeeded", "github": { "type": "repeater", "files": { @@ -3276,6 +4315,7 @@ }, { "role": "roomServer", + "notice": "otafixNeeded", "github": { "type": "room-server", "files": { @@ -3618,6 +4658,7 @@ "tooltip": "", "type": "nrf52", "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip", + "bootloader":"promicro_nrf52840_bootloader-0.9.2-OTAFIX2.1.uf2", "firmware": [ { "role": "companionBle", @@ -3641,6 +4682,7 @@ }, { "role": "repeater", + "notice":"otafixRecommended", "github": { "type": "repeater", "files": { @@ -3651,6 +4693,7 @@ }, { "role": "roomServer", + "notice":"otafixRecommended", "github": { "type": "room-server", "files": { @@ -3664,7 +4707,7 @@ { "maker": "raspberry", "class": "community", - "name": "Raspberry Pi Pico RP2040 + WaveShare SX1262", + "name": "RPI Pico 2040 + WaveShare SX1262", "icon": "/img/lora.svg", "type": "noflash", "tooltip":"", diff --git a/css/flasher.css b/css/flasher.css index 48c0d90..d7252e0 100644 --- a/css/flasher.css +++ b/css/flasher.css @@ -102,6 +102,10 @@ body:has([v-cloak]):after { white-space-collapse: preserve; min-width: 300px; } +#app a { + text-decoration: underline; +} + #app .version { flex-wrap: wrap; } diff --git a/flasher.js b/flasher.js index e293edd..2145149 100644 --- a/flasher.js +++ b/flasher.js @@ -1,10 +1,12 @@ -import "./lib/beer.min.js"; -import { createApp, reactive, ref, nextTick, watch, computed } from "./lib/vue.min.js"; -import { Dfu } from "./lib/dfu.js"; -import { ESPLoader, Transport, HardReset } from "./lib/esp32.js"; -import { SerialConsole } from './lib/console.js'; +import "/lib/beer.min.js"; +import { createApp, reactive, ref, nextTick, watch, computed } from "/lib/vue.min.js"; +import { Dfu } from "/lib/dfu.js"; +import { ESPLoader, Transport, HardReset } from "/lib/esp32.js"; +import { SerialConsole } from '/lib/console.js'; -const configRes = await fetch('./config.json'); +const searchParams = new URLSearchParams(location.search); +const configName = searchParams.get('config')?.replaceAll(/[^a-z_-]/g, '') ?? 'config'; +const configRes = await fetch(`/${configName}.json`); const config = await configRes.json(); const githubRes = await fetch('/releases'); @@ -45,6 +47,12 @@ async function delay(milis) { return await new Promise((resolve) => setTimeout(resolve, milis)); } +function toSlug(text) { + return String(text).toLowerCase() + .replace(/[^a-z0-9.]+/g, '-') + .replace(/^-|-$/g, ''); +} + function getGithubReleases(roleType, files) { const versions = {}; for(const [fileType, matchRE] of Object.entries(files)) { @@ -129,6 +137,7 @@ function setup() { firmware: null, version: null, wipe: false, + espFlashAddress: 0x10000, nrfEraserFlashingPercent: 0, nrfEraserFlashing: false, port: null, @@ -146,6 +155,26 @@ function setup() { return fwVersion ? fwVersion[key] || '' : ''; } + const getNotice = (selected) => { + let notice = config.notice[selected.firmware.notice] || selected.firmware.notice || ''; + + if(notice) { + notice = notice.replaceAll(/\$\{(\w+)\}/g, (_, varName) => selected.device[varName] || ''); + } + + return notice; + } + + const formatChangeLog = (changelog) => { + return changelog + .replace(/change log:\r?\n/i, '') + .replace(/^[-*] /mg, '') + .replace(/#(\d+)$/gm, `#$1`) +// .split(/\r?\n/) +// .map(l => `* ${l}`) +// .join('\n') + } + const flashing = reactive({ supported: 'Serial' in window || 'serial' in window.navigator, instance: null, @@ -198,6 +227,87 @@ function setup() { return firmware.version[firstVersion].files.length > 0; } + // --- URL Routing --- + // NOTE: the server must serve index.html for all paths (catch-all / try_files). + + const deviceToSlug = (device) => toSlug([device.class, device.name].join('-')); + + const firmwareToSlug = (firmware) => { + const title = getRoleFwValue(firmware, 'title'); + const subTitle = getRoleFwValue(firmware, 'subTitle'); + return toSlug(subTitle ? `${title}-${subTitle}` : title); + }; + + let initializingFromUrl = false; + + const buildUrl = () => { + if (serialCon.opened) return '/console'; + if (!selected.device) return '/'; + let path = '/' + deviceToSlug(selected.device) + '/'; + if (!selected.firmware) return path; + path += firmwareToSlug(selected.firmware) + '/'; + if (selected.version) path += toSlug(selected.version); + return path; + }; + + const updateUrl = (replace = false) => { + if (initializingFromUrl) return; + const path = buildUrl(); + if (window.location.pathname !== path) { + replace ? history.replaceState(null, '', path) : history.pushState(null, '', path); + } + }; + + const applyUrlPath = (path) => { + initializingFromUrl = true; + const segments = path.replace(/^\/|\/$/g, '').split('/').filter(Boolean); + + if (segments.length === 0 || segments[0] === 'console') { + nextTick(() => { initializingFromUrl = false; }); + return; + } + + const [deviceSlug, roleSlug, versionSlug] = segments; + const matchingDevices = config.device.filter(d => deviceToSlug(d) === deviceSlug); + if (matchingDevices.length === 0) { + nextTick(() => { initializingFromUrl = false; }); + return; + } + + // When multiple devices share the same slug, use the firmware slug to pick the right one + let device, firmware; + if (roleSlug && matchingDevices.length > 1) { + for (const d of matchingDevices) { + const f = d.firmware.find(f => firmwareToSlug(f) === roleSlug && firmwareHasData(f)); + if (f) { device = d; firmware = f; break; } + } + } + if (!device) device = matchingDevices[0]; + selected.device = device; + + if (!roleSlug) { + nextTick(() => { initializingFromUrl = false; }); + return; + } + + if (!firmware) firmware = device.firmware.find(f => firmwareToSlug(f) === roleSlug && firmwareHasData(f)); + if (!firmware) { + nextTick(() => { initializingFromUrl = false; }); + return; + } + selected.firmware = firmware; + + // Use nextTick so the firmware watcher sets the default version first, + // then we override it with the version from the URL. + nextTick(() => { + if (versionSlug) { + const versionName = Object.keys(firmware.version).find(v => toSlug(v) === versionSlug); + if (versionName) selected.version = versionName; + } + initializingFromUrl = false; + }); + }; + const stepBack = () => { if(selected.device && selected.firmware) { if(selected.firmware.version[selected.version].customFile) { @@ -215,11 +325,6 @@ function setup() { } } - watch(() => selected.firmware, (firmware) => { - if(firmware == null) return; - selected.version = Object.keys(firmware.version)[0]; - }); - const flasherCleanup = async () => { flashing.active = false; flashing.log = ''; @@ -302,6 +407,7 @@ function setup() { ); selected.wipe = true; + selected.espFlashAddress = 0; } selected.firmware = { @@ -378,8 +484,6 @@ function setup() { return; } - console.log({flashFiles}); - let flashData; if(flashFiles[0].file) { flashData = flashFiles[0].file; @@ -387,6 +491,7 @@ function setup() { let flashFile; if(device.type === 'esp32') { flashFile = flashFiles.find(f => f.type === (selected.wipe ? 'flash-wipe' : 'flash-update')); + if(selected.wipe) selected.espFlashAddress = 0x00000; } else { flashFile = flashFiles[0]; @@ -422,7 +527,7 @@ function setup() { enableTracing: false, fileArray: [{ data: await blobToBinaryString(flashData), - address: selected.wipe ? 0x00000 : 0x10000 + address: selected.espFlashAddress }], reportProgress: async (_, written, total) => { flashing.percent = (written / total) * 100; @@ -481,12 +586,13 @@ function setup() { }; const devices = computed(() => { - const classSortPrefix = (d) => d.class === 'ripple' ? '1' : '2'; + const classes = ['ripple', 'meshos', 'community']; const deviceGroups = {}; - for(const cls of ['ripple', 'community']) { + let index = 0; + for(const cls of classes) { const devices = config.device.toSorted( - (a, b) => (classSortPrefix(a) + a.maker + a.name).localeCompare(classSortPrefix(b) + b.maker + b.name) + (a, b) => (index + a.maker + a.name).localeCompare(index + b.maker + b.name) ).filter( d => d.class === cls && (deviceFilterText.value == '' || d.name.toLowerCase().includes(deviceFilterText.value?.toLowerCase())) ) @@ -516,6 +622,29 @@ function setup() { consoleEditBox.value.focus(); } + watch(() => selected.firmware, (firmware) => { + if(firmware == null) return; + selected.version = Object.keys(firmware.version)[0]; + }); + + watch(() => selected.device, updateUrl); + watch(() => selected.firmware, updateUrl); + watch(() => selected.version, () => updateUrl(true)); // replace: version is a refinement, not a new nav step + watch(() => serialCon.opened, updateUrl); + + window.addEventListener('popstate', () => { + if (serialCon.opened) closeSerialCon(); + flashing.active = false; + flashing.log = ''; + flashing.error = ''; + selected.firmware = null; + selected.version = null; + selected.device = null; + applyUrlPath(window.location.pathname); + }); + + applyUrlPath(window.location.pathname); + return { snackbar, consoleEditBox, consoleWindow, consoleMouseUp, @@ -525,7 +654,8 @@ function setup() { sendCommand, openSerialGUI, retry, close, commandReference, stepBack, - customFirmwareLoad, getFirmwarePath, getSelFwValue, getRoleFwValue, + customFirmwareLoad, getFirmwarePath, + getSelFwValue, getRoleFwValue, getNotice, formatChangeLog, firmwareHasData, canFlash, nrfErase } diff --git a/img/gatiot_gat562.svg b/img/gatiot_gat562.svg new file mode 100644 index 0000000..359d93e --- /dev/null +++ b/img/gatiot_gat562.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/gatiot_gat562_30s.svg b/img/gatiot_gat562_30s.svg new file mode 100644 index 0000000..78058cb --- /dev/null +++ b/img/gatiot_gat562_30s.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/heltec_e213.svg b/img/heltec_e213.svg new file mode 100644 index 0000000..c5160e0 --- /dev/null +++ b/img/heltec_e213.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/heltec_e290.svg b/img/heltec_e290.svg new file mode 100644 index 0000000..766545b --- /dev/null +++ b/img/heltec_e290.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/heltec_v4_exp.svg b/img/heltec_v4_exp.svg new file mode 100644 index 0000000..3dc5eb4 --- /dev/null +++ b/img/heltec_v4_exp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/heltec_wt2.svg b/img/heltec_wt2.svg new file mode 100644 index 0000000..19f4077 --- /dev/null +++ b/img/heltec_wt2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/lilygo_meshos.svg b/img/lilygo_meshos.svg new file mode 100644 index 0000000..e00e408 --- /dev/null +++ b/img/lilygo_meshos.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/lilygo_tdisplay_p4.svg b/img/lilygo_tdisplay_p4.svg new file mode 100644 index 0000000..a533f6f --- /dev/null +++ b/img/lilygo_tdisplay_p4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/lilygo_twatch_plus.svg b/img/lilygo_twatch_plus.svg new file mode 100644 index 0000000..4799f64 --- /dev/null +++ b/img/lilygo_twatch_plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/lilygo_twatch_ultra.svg b/img/lilygo_twatch_ultra.svg new file mode 100644 index 0000000..90ef040 --- /dev/null +++ b/img/lilygo_twatch_ultra.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/rak_13302.svg b/img/rak_13302.svg new file mode 100644 index 0000000..709c9d9 --- /dev/null +++ b/img/rak_13302.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/rak_3112.svg b/img/rak_3112.svg new file mode 100644 index 0000000..9a4772a --- /dev/null +++ b/img/rak_3112.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/wio_tracker_l1.svg b/img/wio_tracker_l1.svg index 72179df..68761b4 100644 --- a/img/wio_tracker_l1.svg +++ b/img/wio_tracker_l1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/img/xiao_nrf52.svg b/img/xiao_nrf52.svg index 5f8feb9..bc40b55 100644 --- a/img/xiao_nrf52.svg +++ b/img/xiao_nrf52.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/index.html b/index.html index 147447e..d25d8e2 100644 --- a/index.html +++ b/index.html @@ -5,9 +5,9 @@ MeshCore flasher - - - + + + @@ -97,6 +97,7 @@ +