All entries#02

Display module day

The display module showed up today. That sounds small, but it’s the first time Glnce felt like a real thing I could hold, not a repo and a pile of “should work” notes.

It’s a small portrait screen with touch, ESP32-S3, PSRAM. Good enough for a HUD you’d actually mount on a bike or wear on your wrist without taping a phone to something.


What’s running on it

Firmware is Glnce v3: LVGL 9 for UI, a graphics layer driving the panel with full-frame buffers in PSRAM (partial updates were doing weird things), and BLE with a Nordic UART-style service so a phone app can send JSON later.

Boot goes splash, then the nav screen. The device advertises as Glnce. I lean on Serial at 115200 when something’s off. It paid off all day.


Touch was the hard part

The touch controller shows up on I2C fine. Chip ID checks out. Cool.

Getting taps to actually hit buttons took most of the day. Wrong registers, Arduino I2C fighting the display stack, waking the chip on every read (which made it look dead), polling touch from the wrong task, and a stack overflow when a button tried to redraw the whole screen from a tiny worker thread. Fun.

What finally worked:

After that, Answer and Decline on the call screen actually fired. Serial showed TOUCH: lines and CALL btn clicked. That’s when it clicked for me.

I still don’t have a nice pulsing phone icon on incoming calls. Full-screen refresh mode and “just invalidate this label” don’t play nice. Tried a few hacks. Parked it.


Three screens

Navigation started as black background, white text, very plain. Redid it as a dark HUD: card, turn hint, colored arrow, distance, street, optional speed in the corner. Matches the rest of the UI now.

Calls come in over BLE as JSON. Incoming is red with Answer / Decline. Active call is green with a timer and hangup. Decline shows a short message then drops back to nav. Taps on the device send call actions back over BLE so the phone app can hook real telephony later.

Music has title, album, artist, a progress bar with times, and prev / play-pause / next. Taps send PLAY, PAUSE, PREV, NEXT notifications. Same story as calls: the UI is there; Spotify is not, yet.


Honest status

On the bench, with nRF Connect and hand-pasted JSON:

What’s missing is the companion app. Maps, calls, media session. All of that lives on the phone. I’m working on that separately. I wrote a BLE protocol doc for that session and a testing cheat sheet for myself so I’m not guessing field names at 11pm.


Where this leaves the project

Before today, Glnce was firmware in progress. After today, it’s a small display that can show a fake turn onto Main Street, Alice calling, and a song title, and when I hit Decline it yells ENDED into the void and goes back to nav.

Next up isn’t more UI polish for its own sake. It’s the companion app, one real end-to-end loop (music or calls first), and some rules so the HUD doesn’t jump screens every time a progress update ticks in.

More when the phone side catches up.