<feed xmlns='http://www.w3.org/2005/Atom'>
<title>npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/main/display.c, branch feature/display-fix</title>
<subtitle>[no description]</subtitle>
<id>https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/atom?h=feature%2Fdisplay-fix</id>
<link rel='self' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/atom?h=feature%2Fdisplay-fix'/>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/'/>
<updated>2026-05-19T08:14:57+00:00</updated>
<entry>
<title>feat: add WiFi QR code to BOOT and ERROR screens</title>
<updated>2026-05-19T08:14:57+00:00</updated>
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<published>2026-05-19T08:14:57+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/commit/?id=cf4ac1bc04a19110bca26f969245dcc9ef265890'/>
<id>urn:sha1:cf4ac1bc04a19110bca26f969245dcc9ef265890</id>
<content type='text'>
BOOT screen now shows QR code for AP WiFi + SSID + status text.
ERROR screen reorganized with QR code at top, NO UPSTREAM banner,
setup URL, and 'Scan QR to connect' hint.
</content>
</entry>
<entry>
<title>feat: web-based WiFi setup via captive portal, portrait-only display</title>
<updated>2026-05-18T22:51:14+00:00</updated>
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<published>2026-05-18T22:51:14+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/commit/?id=aa58b47996083f36e3587b8e10f9bbb681610491'/>
<id>urn:sha1:aa58b47996083f36e3587b8e10f9bbb681610491</id>
<content type='text'>
- Remove touchscreen WiFi setup (touch.c, keyboard.c, wifi_setup.c from build)
- Remove offscreen buffer and landscape rotation from axs15231b driver
- Add /setup HTML page with WiFi scan/connect via captive portal
- Add /wifi/scan, /wifi/connect, /wifi/status HTTP endpoints
- Display shows SETUP_PENDING (QR + SSID + setup URL) when unconfigured
- Display shows ERROR with setup URL when upstream is down
- All 101 unit tests pass, builds and flashes to Board C
</content>
</entry>
<entry>
<title>Dynamic layout for WiFi setup: landscape rotation, responsive render, highlight feedback</title>
<updated>2026-05-18T20:14:11+00:00</updated>
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<published>2026-05-18T20:14:11+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/commit/?id=58a0b5fd115d9687a1292e5e82e6b9fa8454b930'/>
<id>urn:sha1:58a0b5fd115d9687a1292e5e82e6b9fa8454b930</id>
<content type='text'>
- Render functions use axs15231b_get_width/height() instead of hardcoded coords
- render_wifi_setup_list: dynamic item widths, screen-relative cancel button
- render_wifi_setup_password: dynamic field/eye/keyboard from kb_get_layout()
- render_wifi_setup_result: centered on screen, dynamic button placement
- handle_wifi_setup_touch: matching dynamic hit areas, highlight_rect() feedback
- Rotation lifecycle: enter_wifi_setup_rotation/exit wired into all entry/exit paths
- display_enter_wifi_setup + READY/ERROR touch + SUCCESS auto-return + LIST cancel
- Added kb_result_t typedef to keyboard.h (was only in .c)
- Fixed test_keyboard.c: use computed offsets from kb_layout_t defaults
- All 101 unit tests pass (touch:19, keyboard:46, wifi_setup:36)
</content>
</entry>
<entry>
<title>fix: keyboard KB_START_Y must match render position (70), simplify row 3 layout</title>
<updated>2026-05-18T18:11:19+00:00</updated>
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<published>2026-05-18T18:11:19+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/commit/?id=699fc6c03899c3b1ff853d8c7c6cf32173436354'/>
<id>urn:sha1:699fc6c03899c3b1ff853d8c7c6cf32173436354</id>
<content type='text'>
- KB_START_Y was 310 but keyboard rendered at y=70 — touch hits never matched
- Row 3 simplified to 3 keys: [layer/shift, space, done]
- All 362 unit tests pass
</content>
</entry>
<entry>
<title>fix: prevent IntegerDivideByZero in config_get_next_wifi when no networks</title>
<updated>2026-05-18T18:06:29+00:00</updated>
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<published>2026-05-18T18:06:29+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/commit/?id=9ff7cffcff11237288cfddecee2684f499d23ddf'/>
<id>urn:sha1:9ff7cffcff11237288cfddecee2684f499d23ddf</id>
<content type='text'>
- Check network_count == 0 before modulo operation
- Disconnect STA before WiFi scan to avoid 'STA is connecting, scan not allowed'
- Add error handling for failed WiFi scans
- This fixes the crash/restart loop on Board C with no configured WiFi
</content>
</entry>
<entry>
<title>feat: integrate touchscreen WiFi setup into display UI</title>
<updated>2026-05-18T17:25:37+00:00</updated>
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<published>2026-05-18T17:25:37+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/commit/?id=46e7dabaf80333ca045061ff480377a4186e5deb'/>
<id>urn:sha1:46e7dabaf80333ca045061ff480377a4186e5deb</id>
<content type='text'>
- Add DISPLAY_WIFI_SETUP state with full rendering pipeline
- Touch init on display_init(), touch polling in display task
- WiFi scan triggered on setup entry, sorted AP list
- On-screen keyboard for password entry
- Connect result via WiFi event notifications
- Setup button on READY and ERROR screens
- Auto-enter WiFi setup on first boot with no credentials
- Save new WiFi credentials to SPIFFS config.json
</content>
</entry>
<entry>
<title>Sync display with live TollGate state</title>
<updated>2026-05-18T14:28:12+00:00</updated>
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<published>2026-05-18T14:28:12+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/commit/?id=7820837d79ebc8e00221b5206bdd8e3ca0ae4c15'/>
<id>urn:sha1:7820837d79ebc8e00221b5206bdd8e3ca0ae4c15</id>
<content type='text'>
- Periodic refresh: wallet balance + client count every 5s from main loop
- display_notify_payment() API: passes payment amount and time allotment
- tollgate_api.c: triggers PAYMENT_RECEIVED state after wallet receive
- AP station events update client count in real-time
- Config data (price, mint) passed to display during boot phase
- Payment screen shows actual sats paid and time purchased
- Updated DISPLAY_UI_PLAN.md with state-sync audit and checklist
</content>
</entry>
<entry>
<title>Implement full TollGate display UI</title>
<updated>2026-05-18T13:55:32+00:00</updated>
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<published>2026-05-18T13:55:32+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/commit/?id=e1da6ffc0221abf4d0fb3a8c3e6be0b90d69397a'/>
<id>urn:sha1:e1da6ffc0221abf4d0fb3a8c3e6be0b90d69397a</id>
<content type='text'>
- BOOT screen: centered title + WiFi status line
- READY screen: QR cycling (WiFi/Portal), price, mint domain,
  wallet balance (color-coded), client count
- PAYMENT screen: green banner 'ACCESS GRANTED', paid amount, time
- ERROR screen: red banner 'NO UPSTREAM', guidance, AP reassurance
- Enhanced display_update() API with mint_url, price, wifi_status
- Extract domain helper for clean mint URL display
- Render interval: 2s (reduced SPI load)
- Color palette: cyan, yellow, orange, green, red, dim gray
- WiFi events update display status and trigger ERROR state
- Board C now on /dev/ttyACM3
</content>
</entry>
<entry>
<title>Fix display: add RAMWR before pixel data, correct colors, smaller text</title>
<updated>2026-05-18T13:43:23+00:00</updated>
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<published>2026-05-18T13:43:23+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/commit/?id=f0f8cca10196b265c3b453f71322239d2ecaf4ae'/>
<id>urn:sha1:f0f8cca10196b265c3b453f71322239d2ecaf4ae</id>
<content type='text'>
Root cause: missing RAMWR (0x2C) command before pixel data transfer.
Without RAMWR, the display didn't know to write data into the RAM window
set by CASET/RASET, causing wrapping and double-vision artifacts.

- Add qspi_write_command(RAMWR) before pixel data in flush()
- Use internal DMA byte-swap buffer (MALLOC_CAP_DMA) for correct colors
- Reduce font scale: TollGate scale 2, starting... scale 1
- Centered text positions for 320x480 portrait

Display now shows: blue TollGate + yellow starting... on black
</content>
</entry>
<entry>
<title>Fix display colors with internal DMA byte-swap buffer</title>
<updated>2026-05-18T13:17:54+00:00</updated>
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<published>2026-05-18T13:17:54+00:00</published>
<link rel='alternate' type='text/html' href='https://upleb.uk/npub12m5exm2uk3xa674cc5r0hlyvccs5xxn7qv83ezuteefv5972nquq4j4szl/esp32-tollgate/commit/?id=a02a0dbbf4e945ad00433e3fc9fd2b40550d3e82'/>
<id>urn:sha1:a02a0dbbf4e945ad00433e3fc9fd2b40550d3e82</id>
<content type='text'>
- Allocate 4KB internal DMA buffer (MALLOC_CAP_DMA) for pixel byte-swap
- Byte-swap from PSRAM framebuffer into DMA buffer in 2048-pixel chunks
- Matches ArduinoGFX approach: separate DMA buffer avoids PSRAM cache issues
- Restore render-on-change logic (only redraw on state/QR mode change)
- Use saturated colors: cyan 0x07FF for title, yellow 0xFFE0 for subtitle
- Remove debug flush log message
</content>
</entry>
</feed>
