From 6d667d8bcaded8d3af391a2662025da46a17509d Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 7 Aug 2026 19:21:12 +0200 Subject: [PATCH] fix(release): publish ESP32 solo binaries, add screenshot to Heltec envs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The solo release job only attached *.uf2 and *.zip, which covered every solo board back when they were all nRF52. The Heltec V3/V4 .bin images were built and then silently dropped, so tagging a release produced nothing downloadable for those two boards. Releases now carry a single -merged.bin per ESP32 board (bootloader + partition table + app at 0x0). build.sh also writes an app-only .bin, but that one needs offset 0x10000 and a bootloader already on the chip, so it's deleted before upload rather than shipped next to the merged image — flashing it at 0x0 looks exactly like a bricked device. Also adds -D ENABLE_SCREENSHOT to both Heltec solo envs. Every other solo env already had it, so Solo Tools couldn't capture these two boards' displays and the README's "no special build flags required" was untrue for them. Both envs rebuilt clean (V3: RAM 58.8%, Flash 43.2%). Co-Authored-By: Claude Opus 5 --- .github/workflows/build-solo-firmwares.yml | 8 ++++++++ release-notes.md | 2 ++ variants/heltec_v3/platformio.ini | 1 + variants/heltec_v4/platformio.ini | 1 + 4 files changed, 12 insertions(+) diff --git a/.github/workflows/build-solo-firmwares.yml b/.github/workflows/build-solo-firmwares.yml index b1376f26..3938bc01 100644 --- a/.github/workflows/build-solo-firmwares.yml +++ b/.github/workflows/build-solo-firmwares.yml @@ -65,6 +65,13 @@ jobs: mv out/*.uf2 "out/solo-${{ env.BUILD_VERSION }}-${DEVICE_NAME}.uf2" 2>/dev/null || true # nRF52 DFU package (adafruit-nrfutil) — used for OTA / BLE-DFU updates. mv out/*.zip "out/solo-${{ env.BUILD_VERSION }}-${DEVICE_NAME}-ota.zip" 2>/dev/null || true + # ESP32 boards produce .bin instead of .uf2. Only the merged image + # (bootloader + partitions + app, flashed at 0x0) is published: build.sh also + # writes an app-only .bin, but that one needs offset 0x10000 and a bootloader + # already on the chip, so shipping it next to the merged image would only + # invite bricked-looking flashes. Anyone who wants it can build it locally. + mv out/${{ matrix.env }}-*-merged.bin "out/solo-${{ env.BUILD_VERSION }}-${DEVICE_NAME}-merged.bin" 2>/dev/null || true + rm -f out/${{ matrix.env }}-*.bin - name: Upload Firmware uses: actions/upload-artifact@v4 @@ -97,3 +104,4 @@ jobs: files: | out/*.uf2 out/*.zip + out/*-merged.bin diff --git a/release-notes.md b/release-notes.md index f29187bc..002ae083 100644 --- a/release-notes.md +++ b/release-notes.md @@ -10,10 +10,12 @@ - **Optional CardKB support (Wio Tracker L1, Grove I2C) — full keyboard-only navigation.** Plug an M5Stack CardKB into the Grove connector and it's auto-detected at boot — no setting to flip. Typing goes straight into the message/name field instead of navigating the on-screen keyboard grid, always as plain Latin text regardless of the Settings › Keyboard language/type — arrows and Esc work as expected everywhere else too (including inside the placeholder and accent popups). Enter acts like the physical centre button (advances the on-screen grid selection) rather than submitting, so **Fn+Enter** sends the message/confirms the field from anywhere, and **Fn+``** opens that letter's accent popup directly (no arrow-hunting needed — handy for Polish/Czech/etc. diacritics — and works no matter what language/keyboard type is configured, since CardKB always types Latin either way). **Tab** is the Hold-Enter equivalent everywhere, including message reply/navigate and the Bot/Admin/Repeater menus — same single shortcut whether or not the on-screen keyboard is showing. - **Solo builds for Heltec V3 and V4** (`Heltec_v3_companion_solo_dual`, `heltec_v4_companion_solo_dual`) — the full standalone on-device UI instead of a screen that only mirrors the phone app, with dual transport so the companion app can attach over BLE or USB serial (BLE wins while both are live), same as the Wio Tracker L1 solo builds. Dual transport had only ever been built for nRF52, so ESP32 got its own `DualSerialInterface` to match. Both boards ship with a single button, which the solo UI can't be driven from, so each env enables both supported input devices with default pins picked from what that board leaves free: a **CardKB** on a second I2C bus (pair it with Ext. KB = Compact and no joystick is needed at all) and a **wired joystick** (four direction pins plus a Back button, wired straight to GND — the firmware enables the internal pull-ups). Either is enough on its own, and pins with nothing attached read as not-pressed, so the unused half costs nothing. The env comments list which GPIOs each board has already claimed, for anyone wiring theirs differently. - **GAT562 30S solo builds now use the same OLED font as the Wio Tracker L1.** The misc-fixed 6x9 font (full Latin, Greek and Cyrillic) had only ever reached the SH1106 and e-ink drivers, so on this board every keyboard alphabet beyond ASCII, and every accented contact name, was still being transliterated (`Łódź` → `Lodz`) or drawn as a filled block. Solo builds only — the font costs ~14 KB of flash and the repeater/companion builds have no keyboard to type those alphabets on; they keep the built-in font and are byte-for-byte unchanged. +- **Screenshot support on the Heltec V3/V4 solo builds.** `ENABLE_SCREENSHOT` was set on every other solo env but these two, so [Solo Tools](https://marekzegare4.github.io/Solo-tools/) couldn't capture their display. Now consistent across all five solo builds. - **Settings › Keyboard gets an "Ext. KB" row** (boards that support CardKB, above). Switching it to **Compact** hides the on-screen letter grid, special-row icons, and status line entirely — a CardKB typist never looks at any of it, and none of it (script/page, T9-vs-ABC, caps) is actually actionable from CardKB anyway — replacing them with just a reminder of the Tab/Fn+letter shortcuts; the accent and placeholder popups still show normally. With the grid hidden, arrows and Tab take on more useful direct meanings instead of driving an invisible grid selection: **arrows** move the text cursor immediately (no more entering cursor mode first), **plain Enter** submits the message/field (same as Fn+Enter — there's no grid cell to commit), and **plain Tab** opens the placeholder picker directly. Compact is designed to need no joystick/physical button at all, and reclaims the freed space for extra message-preview lines. Off (**Full**) by default. ### Fixes +- **ESP32 solo firmware was built by CI but never published.** The release job only attached `*.uf2` and `*.zip`, which covered every solo board back when they were all nRF52 — the Heltec V3/V4 `.bin` images were produced and then silently dropped, so there was nothing to download for those boards. Releases now carry a single `-merged.bin` per ESP32 board (bootloader + partition table + app, flashed at `0x0`); the app-only `.bin` is deliberately left out, since flashing that one at `0x0` looks exactly like a bricked device. - **DM/room replies sometimes didn't show who they were addressed to, and room messages could wrap incorrectly.** The reply-prefix (`@[nick] `) was being stripped at the wrong point for room posts and DMs feeding the fullscreen message view, so a DM reply's "To:" header could go missing while a room reply showed the raw `@[nick] ` marker as literal message text; a related mismatch meant the history list's scrollbar/box-height sizing pass wrapped room messages with their sender name still attached, disagreeing with the actual rendered text. - **Remote Bot Actions (`!buzz`/`!gps`/`!advert`/`!gpio1`..`!gpio4`) ran immediately on every matching message, before quiet hours/cooldown/per-contact throttle were checked** — those gates only suppressed the reply text, not the actual buzz/GPS toggle/advert/pin write, so e.g. `!buzz` still audibly buzzed during configured quiet hours, and repeating a command wasn't rate-limited at all. Actions now only run once those checks have passed. - **A channel's or DM/room's unread badge could claim messages the history no longer held** — e.g. showing "7 unread" on a conversation that opens to an empty list, and opening it only knocked the count down by one instead of clearing it. Every unread badge is now capped at what its message ring actually still holds; a channel's counter only decrements on eviction when the dropped message was itself unread (previously it decremented regardless, undercounting newer unread messages), and a DM sender's badge now self-heals (and frees up for a new sender) once their messages have left the shared 32-slot DM ring. diff --git a/variants/heltec_v3/platformio.ini b/variants/heltec_v3/platformio.ini index 8465058d..cd0d6a8e 100644 --- a/variants/heltec_v3/platformio.ini +++ b/variants/heltec_v3/platformio.ini @@ -232,6 +232,7 @@ build_flags = -D FIRMWARE_SOLO_BUILD=1 -D UI_SENSORS_PAGE=1 -D OLED_MISC_FIXED_FONT=1 ; full Latin/Greek/Cyrillic 6x9 font, ~14 KB flash + -D ENABLE_SCREENSHOT ; same as the other solo builds — Solo Tools reads the framebuffer over USB ; CardKB on the second I2C bus. Harmless with nothing plugged in. -D ENV_PIN_SDA=3 -D ENV_PIN_SCL=4 diff --git a/variants/heltec_v4/platformio.ini b/variants/heltec_v4/platformio.ini index 6259be62..4cdd8037 100644 --- a/variants/heltec_v4/platformio.ini +++ b/variants/heltec_v4/platformio.ini @@ -282,6 +282,7 @@ build_flags = -D FIRMWARE_SOLO_BUILD=1 -D UI_SENSORS_PAGE=1 -D OLED_MISC_FIXED_FONT=1 ; full Latin/Greek/Cyrillic 6x9 font, ~14 KB flash + -D ENABLE_SCREENSHOT ; same as the other solo builds — Solo Tools reads the framebuffer over USB ; CardKB on the second I2C bus. Harmless with nothing plugged in. -D ENV_PIN_SDA=3 -D ENV_PIN_SCL=4