This is the one I'm quietly proud of! Until now, updating meant pulling the repo or dragging a .uf2 onto both sides. The usual procedure: Boothloader mode, copy .uf2, wait for reboot, unplug and plug the other side, and repeat... no more!
1: My host app now checks GitHub on startup and tells you when there's a new version for the host app and the firmware.


2: The best part: The keyboard can now update itself in place!
So it first downloads the firmware and puts it into a staging area in the flash memory on both halves. If the checksum matches, it applies the new firmware and reboots. So no more unplugging or bootloader mode, just click the update and ... done!

It's brand new, so I'm still shaking out the edge cases — but the basic loop, "there's an update, click & done", works end to end. It took quite some time, and I made heavy use of AI assistance to find out the details for this feature, but now as it works, it is really cool.
Hardware in the loop (HIL)
Since this new firmware update feature needed a lot of actual testing on the hardware, I thought about a way to get automated testing on the hardware without me always pressing buttons and plugging in cables. As there is no complete RP2040 hardware emulator, I built a little hardware test station out of a Raspberry Pi 4 (in its own repo now). Both keyboard halves, so the real hardware is wired to it, and it can press the reset / BOOTSEL pads electronically — no fingers required (in case needed): https://github.com/thpoll83/polykybd-ctnd
There is a GitHub action on the firmware repo, so that every push kicks off a cloud build, and the Pi takes that firmware, flashes both halves on real hardware, and runs a whole suite of HID tests on its own — while I'm off doing something else! It cannot yet verify the rendering (I need a camera) on the keys, but that is maybe the next logical step.
New Uniode Emoji handling

Before, I used 2 hard-coded layers for the most common Unicode emojis, but I wasn't that happy, as it left little room for expansion.
There's now a single dedicated emoji layer: more than a thousand emojis, sorted into a dozen categories — Smileys, Gestures, People & Jobs, Animals, Nature, Weather, Food, Travel, Sports, Tools & Objects, and more. The top row of keys turns into category tabs (each tab shows the first emoji of its group), with arrow keys on the left and right to walk through multiple pages (for the bigger categories). Tap a key, and it types that emoji via Unicode input 🥰
Not every emoji on earth 🌍 made it in yet, but the common ones are there — and adding more is now just a configuration thing (as long as the Noto Emoji font supports it). Some things do not make a lot of sense for me at this moment: E.g. skin tone shading and color stuff doesn't look great on b/w OLED displays indeed.
On top of that, the pixel font organization got an overhaul — the ~99 hand-written font-conversion commands are now a single config file, and glyphs use full 32-bit codepoints (instead of 16-bit with shifts to keep the actual 32-bit codepoint in the 2-byte character). That's why growing the emoji/symbol set is a one-liner now instead of an afternoon.
That's it - a bit more to show than last time. And as mentioned before, a lot of this came together fast thanks to AI pair-coding.
Thanks for reading, and for the support 🙏
Thomas
thpoll
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.