Skip to content

New Apps + Fixes and more - #64

Merged
KenVanHoeylandt merged 5 commits into
TactilityProject:mainfrom
Shadowtrance:wip-sort
Oct 29, 2026
Merged

KenVanHoeylandt merged 5 commits into
TactilityProject:mainfrom
Shadowtrance:wip-sort

Conversation

@Shadowtrance

@Shadowtrance Shadowtrance commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

TactilityApps General

  • LVGL 9.6 sweep (flag set/clear/add/remove deprecations).
  • Makeovers: Diceware, Magic8Ball (responsive ball, recessed answer window); Snake/TwoEleven/TodoList now use lvgl_toolbar_add_text_button_action.
  • TamaTac rebuilt: shared Layout.h size classes, content-filling MainView with integer pet scaling, chip-based settings, responsive mini-games, zero-RAM day/night scenery; timer/achievement/cooldown fixes.
  • MystifyDemo and GraphicsDemo are stop-cooperative (poll APP_EVENT_CLOSE, not just touch).
  • SfxEngine: each play() gets its own sequence slot and voice stride, so concurrent/layered sounds no longer clobber each other.
  • SfxEngine/DoomAudio: stream is owned by the audio task and reopens on write errors, so USB audio hotplug recovers instead of going silent.
  • Doom boolean crash fix; DoomAudio no longer advances MIDI/SFX while the output is down.
  • app_start_for_result AlertDialog ID fix across seven apps.
  • New Scripts/check-app-symbols.py for unresolved/inactive module symbols.

New apps

  • AirMouse: BLE air mouse from the internal IMU or an external MPU6886; scales from Tab5 to StickS3/Cardputer; own Bluetooth identity and bond.
  • MidiController: 15 performance modes plus a HOME grid, USB/BLE transport chosen up front, 8Encoder + Unit LCD over PaHub, shared UiKit.h, draw-time rendering with region invalidation.
  • GfxBenchmark: PDQ-style benchmark of the Libraries/Gfx stack; 15 primitive phases plus sprites and polygons, display-adaptive sizes, table/serial results, APP_EVENT_CLOSE aware.
  • UnitLcdGfxDemo: M5Stack LCD Unit over I2C via SinkTarget + UnitLcdSink, partial 228×72 frame with graceful fallbacks, dirty-region updates, no-PSRAM friendly.

MediaKeys

  • Own Bluetooth identity (pairs separately from Air Mouse/MIDI, bond survives reboot).
  • Stops HID when the app closes or the radio goes away; switches on with the radio; README added.

M5UnitTest / M5UnitModules

  • Identity transactions replace address probing (8Encoder, LCD, Scroll/ByteButton/Joystick2, CardKB2, RFID2/WS1850S).
  • Probe hardening (retries, STM32 delay) and begin() re-verification.
  • PaHub documented as 6 software channels with verified select/deselect; scanner dedupes ghosts.
  • RFID2/WS1850S reset/antenna fixes; CardKB2 exposes firmware version without eating a key.
  • UI rebuilt without lv_list; docs updated.

MystifySpiDemo (new app package)

  • One package, five binaries: kernel module ili9341-panel-module, demo, settings app, dashboard and ili9341panel CLI.
  • The module owns the driver, an esp32-spi controller created from saved pins, and the display device; it loads at boot and exports a settings API. LVGL binds the panel as a secondary display.
  • Settings app edits every setting and applies live with rollback; the enable switch mirrors Kernel settings; numbers use mesh-style rows + Input Dialog.
  • Driver moved out of Libraries/Ili9341Spi into the module and ported to the kernel SPI controller API: half-duplex peripheral, CS/DC/RESET as GPIO descriptors, manual CS.
  • 320×240 RGB565_SWAPPED frame in PSRAM, read by the SPI DMA engine directly (SPI_TRANS_DMA_USE_PSRAM); 80 MHz is flicker-free.
  • Firmware exports the SPI controller/GPIO-descriptor and LVGL display entry points; SpiDeviceConfig.half_duplex is a kernel API/ABI change.
  • Primary mirror uses Target::set_transform() (PPA on Tab5) at 640×360; the panel also runs the dashboard and CLI.
  • Frame budget: mirror on its own task, no full-panel clear, per-edge polygon dirty bounds — ~20 fps to the 30 fps cap.

Libraries/Gfx

  • Surface is a public view over any PixelBuffer (whole buffer or sub-view, clip rect, non-owning).
  • UnitLCD-parity primitives plus images/composition: blit, colour-key, 1bpp/8bpp masks, blend, polygons, Canvas.
  • Fonts/layout: FONT_8X16 (OFL-1.1), proportional widths, tabs, ellipsis, wrap/measure; data-driven TextStyle API with alignment and scaling.
  • Presentation sinks: Sink/SinkInfo/SinkTarget/DisplaySink, DMA-aware frame_buffer_policy(), Target::release(), and UnitLcdSink in Libraries/UnitLcdGfx.
  • Rect and DirtyRegions merged/intersect support; per-primitive clipping.
  • DESIGN.md added; step 5 (pixel_buffer helpers) deferred until further discussion.

@coderabbitai

coderabbitai Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 238 files, which is 138 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5955d5e3-f2ad-40e9-b1ff-2b4746b61069
Commits

Reviewing files that changed from the base of the PR and between f8ba7f4 and 2b76c86.

Files ignored due to path filters: 3
  • Apps/MidiController/docs/MIDI-Control-Change-Messages_Another-Producer.pdf is excluded by !**/*.pdf
  • Apps/TamaTac/decor/scene_day.png is excluded by !**/*.png
  • Apps/TamaTac/decor/scene_night.png is excluded by !**/*.png
Files selected for processing: 238
  • Apps/AirMouse/CMakeLists.txt
  • Apps/AirMouse/README.md
  • Apps/AirMouse/main/CMakeLists.txt
  • Apps/AirMouse/main/Source/AirMouse.cpp
  • Apps/AirMouse/main/Source/AirMouse.h
  • Apps/AirMouse/main/Source/MainView.cpp
  • Apps/AirMouse/main/Source/Motion.h
  • Apps/AirMouse/main/Source/SettingsView.cpp
  • Apps/AirMouse/main/Source/main.cpp
  • Apps/AirMouse/manifest.properties
  • Apps/Brainfuck/main/Source/Brainfuck.cpp
  • Apps/Brainfuck/manifest.properties
  • Apps/Breakout/README.md
  • Apps/Breakout/main/Source/Breakout.cpp
  • Apps/Breakout/manifest.properties
  • Apps/Calculator/main/Source/Calculator.cpp
  • Apps/Calculator/manifest.properties
  • Apps/Diceware/main/Source/Diceware.cpp
  • Apps/Diceware/manifest.properties
  • Apps/Doom/main/Source/DoomAudio.cpp
  • Apps/Doom/main/doomgeneric/doomgeneric/doomtype.h
  • Apps/Doom/manifest.properties
  • Apps/EpubReader/main/Source/EpubReader.cpp
  • Apps/EpubReader/main/Source/EpubReaderUI.cpp
  • Apps/EpubReader/manifest.properties
  • Apps/EspNowBridge/main/Source/EspNowBridge.cpp
  • Apps/EspNowBridge/manifest.properties
  • Apps/GfxBenchmark/CMakeLists.txt
  • Apps/GfxBenchmark/README.md
  • Apps/GfxBenchmark/main/CMakeLists.txt
  • Apps/GfxBenchmark/main/Include/Application.h
  • Apps/GfxBenchmark/main/Source/Application.cpp
  • Apps/GfxBenchmark/main/Source/Main.cpp
  • Apps/GfxBenchmark/manifest.properties
  • Apps/GraphicsDemo/main/CMakeLists.txt
  • Apps/GraphicsDemo/main/Include/Application.h
  • Apps/GraphicsDemo/main/Include/PixelBuffer.h
  • Apps/GraphicsDemo/main/Include/drivers/Colors.h
  • Apps/GraphicsDemo/main/Include/drivers/DisplayDriver.h
  • Apps/GraphicsDemo/main/Include/drivers/TouchDriver.h
  • Apps/GraphicsDemo/main/Source/Application.cpp
  • Apps/GraphicsDemo/main/Source/Main.cpp
  • Apps/GraphicsDemo/manifest.properties
  • Apps/M5UnitTest/main/Source/M5UnitTest.cpp
  • Apps/M5UnitTest/main/Source/TestListView.cpp
  • Apps/M5UnitTest/main/Source/TestUnit8Encoder.cpp
  • Apps/M5UnitTest/main/Source/TestUnit8Encoder.h
  • Apps/M5UnitTest/main/Source/TestUnitByteButton.cpp
  • Apps/M5UnitTest/main/Source/TestUnitByteButton.h
  • Apps/M5UnitTest/main/Source/TestUnitCardKB2.cpp
  • Apps/M5UnitTest/main/Source/TestUnitCardKB2.h
  • Apps/M5UnitTest/main/Source/TestUnitJoystick2.cpp
  • Apps/M5UnitTest/main/Source/TestUnitJoystick2.h
  • Apps/M5UnitTest/main/Source/TestUnitLcd.cpp
  • Apps/M5UnitTest/main/Source/TestUnitLcd.h
  • Apps/M5UnitTest/main/Source/TestUnitLcdGfx.cpp
  • Apps/M5UnitTest/main/Source/TestUnitLcdGfx.h
  • Apps/M5UnitTest/main/Source/TestUnitPaHub.cpp
  • Apps/M5UnitTest/main/Source/TestUnitPaHub.h
  • Apps/M5UnitTest/main/Source/TestUnitRfid2.cpp
  • Apps/M5UnitTest/main/Source/TestUnitRfid2.h
  • Apps/M5UnitTest/main/Source/TestUnitScroll.cpp
  • Apps/M5UnitTest/main/Source/TestUnitScroll.h
  • Apps/M5UnitTest/main/Source/TestViewBase.cpp
  • Apps/M5UnitTest/main/Source/UiKit.h
  • Apps/M5UnitTest/main/Source/UiScale.h
  • Apps/M5UnitTest/manifest.properties
  • Apps/Magic8Ball/main/Source/Magic8Ball.cpp
  • Apps/Magic8Ball/main/Source/Magic8Ball.h
  • Apps/Magic8Ball/manifest.properties
  • Apps/MediaKeys/README.md
  • Apps/MediaKeys/main/Source/MediaKeys.cpp
  • Apps/MediaKeys/manifest.properties
  • Apps/MidiController/CMakeLists.txt
  • Apps/MidiController/README.md
  • Apps/MidiController/docs/architecture.md
  • Apps/MidiController/docs/encoder.md
  • Apps/MidiController/docs/hardware.md
  • Apps/MidiController/docs/lcd.md
  • Apps/MidiController/docs/modes.md
  • Apps/MidiController/docs/scales.md
  • Apps/MidiController/docs/units.md
  • Apps/MidiController/main/CMakeLists.txt
  • Apps/MidiController/main/Source/EncoderInput.cpp
  • Apps/MidiController/main/Source/GroveLookup.cpp
  • Apps/MidiController/main/Source/GroveLookup.h
  • Apps/MidiController/main/Source/LcdDisplay.cpp
  • Apps/MidiController/main/Source/LcdDisplay.h
  • Apps/MidiController/main/Source/MidiController.cpp
  • Apps/MidiController/main/Source/MidiController.h
  • Apps/MidiController/main/Source/MidiScales.h
  • Apps/MidiController/main/Source/Sequencer.cpp
  • Apps/MidiController/main/Source/Sequencer.h
  • Apps/MidiController/main/Source/UiKit.h
  • Apps/MidiController/main/Source/ViewArp.cpp
  • Apps/MidiController/main/Source/ViewBaby8.cpp
  • Apps/MidiController/main/Source/ViewBeats.cpp
  • Apps/MidiController/main/Source/ViewChord.cpp
  • Apps/MidiController/main/Source/ViewDimensions.cpp
  • Apps/MidiController/main/Source/ViewDrop.cpp
  • Apps/MidiController/main/Source/ViewEuclid.cpp
  • Apps/MidiController/main/Source/ViewGrid.cpp
  • Apps/MidiController/main/Source/ViewKeys.cpp
  • Apps/MidiController/main/Source/ViewLfo.cpp
  • Apps/MidiController/main/Source/ViewRaga.cpp
  • Apps/MidiController/main/Source/ViewRng.cpp
  • Apps/MidiController/main/Source/ViewTb3po.cpp
  • Apps/MidiController/main/Source/ViewXYPad.cpp
  • Apps/MidiController/main/Source/ViewZen.cpp
  • Apps/MidiController/main/Source/main.cpp
  • Apps/MidiController/manifest.properties
  • Apps/MystifyDemo/main/CMakeLists.txt
  • Apps/MystifyDemo/main/Include/Application.h
  • Apps/MystifyDemo/main/Include/MystifyDemo.h
  • Apps/MystifyDemo/main/Include/PixelBuffer.h
  • Apps/MystifyDemo/main/Include/drivers/Colors.h
  • Apps/MystifyDemo/main/Include/drivers/DisplayDriver.h
  • Apps/MystifyDemo/main/Include/drivers/TouchDriver.h
  • Apps/MystifyDemo/main/Source/Application.cpp
  • Apps/MystifyDemo/main/Source/Main.cpp
  • Apps/MystifyDemo/manifest.properties
  • Apps/MystifySpiDemo/README.md
  • Apps/MystifySpiDemo/common/ili9341panel.h
  • Apps/MystifySpiDemo/common/panel_display.h
  • Apps/MystifySpiDemo/ili9341-panel-module/CMakeLists.txt
  • Apps/MystifySpiDemo/ili9341-panel-module/main/CMakeLists.txt
  • Apps/MystifySpiDemo/ili9341-panel-module/main/Source/Esp32SpiConfig.h
  • Apps/MystifySpiDemo/ili9341-panel-module/main/Source/Ili9341Spi.cpp
  • Apps/MystifySpiDemo/ili9341-panel-module/main/Source/Ili9341Spi.h
  • Apps/MystifySpiDemo/ili9341-panel-module/main/Source/Panel.cpp
  • Apps/MystifySpiDemo/ili9341-panel-module/main/Source/Panel.h
  • Apps/MystifySpiDemo/ili9341-panel-module/main/Source/Settings.cpp
  • Apps/MystifySpiDemo/ili9341-panel-module/main/Source/Settings.h
  • Apps/MystifySpiDemo/ili9341-panel-module/main/Source/module.cpp
  • Apps/MystifySpiDemo/ili9341-panel-settings/CMakeLists.txt
  • Apps/MystifySpiDemo/ili9341-panel-settings/main/CMakeLists.txt
  • Apps/MystifySpiDemo/ili9341-panel-settings/main/Source/main.cpp
  • Apps/MystifySpiDemo/ili9341panel/CMakeLists.txt
  • Apps/MystifySpiDemo/ili9341panel/main/CMakeLists.txt
  • Apps/MystifySpiDemo/ili9341panel/main/Source/main.cpp
  • Apps/MystifySpiDemo/manifest.properties
  • Apps/MystifySpiDemo/mystifyspidemo/CMakeLists.txt
  • Apps/MystifySpiDemo/mystifyspidemo/main/CMakeLists.txt
  • Apps/MystifySpiDemo/mystifyspidemo/main/Include/Application.h
  • Apps/MystifySpiDemo/mystifyspidemo/main/Source/Application.cpp
  • Apps/MystifySpiDemo/mystifyspidemo/main/Source/Main.cpp
  • Apps/MystifySpiDemo/paneldashboard/CMakeLists.txt
  • Apps/MystifySpiDemo/paneldashboard/main/CMakeLists.txt
  • Apps/MystifySpiDemo/paneldashboard/main/Source/main.cpp
  • Apps/SerialConsole/main/Source/ConnectView.cpp
  • Apps/SerialConsole/main/Source/SerialConsole.cpp
  • Apps/SerialConsole/manifest.properties
  • Apps/Snake/main/Source/Snake.cpp
  • Apps/Snake/main/Source/SnakeUi.c
  • Apps/Snake/manifest.properties
  • Apps/TamaTac/README.md
  • Apps/TamaTac/main/Source/Achievements.cpp
  • Apps/TamaTac/main/Source/CemeteryView.cpp
  • Apps/TamaTac/main/Source/Decor.h
  • Apps/TamaTac/main/Source/Layout.h
  • Apps/TamaTac/main/Source/MainView.cpp
  • Apps/TamaTac/main/Source/MainView.h
  • Apps/TamaTac/main/Source/MenuView.cpp
  • Apps/TamaTac/main/Source/PatternGame.cpp
  • Apps/TamaTac/main/Source/PetStats.h
  • Apps/TamaTac/main/Source/ReactionGame.cpp
  • Apps/TamaTac/main/Source/ReactionGame.h
  • Apps/TamaTac/main/Source/SettingsView.cpp
  • Apps/TamaTac/main/Source/SettingsView.h
  • Apps/TamaTac/main/Source/StatsView.cpp
  • Apps/TamaTac/main/Source/TamaTac.cpp
  • Apps/TamaTac/main/Source/main.cpp
  • Apps/TamaTac/manifest.properties
  • Apps/TodoList/main/Source/TodoList.cpp
  • Apps/TodoList/manifest.properties
  • Apps/Tone/main/Source/ToneUi.cpp
  • Apps/Tone/manifest.properties
  • Apps/TwoEleven/main/Source/TwoEleven.cpp
  • Apps/TwoEleven/main/Source/TwoElevenUi.c
  • Apps/TwoEleven/manifest.properties
  • Apps/UnitLcdGfxDemo/CMakeLists.txt
  • Apps/UnitLcdGfxDemo/README.md
  • Apps/UnitLcdGfxDemo/main/CMakeLists.txt
  • Apps/UnitLcdGfxDemo/main/Include/Application.h
  • Apps/UnitLcdGfxDemo/main/Include/GroveLookup.h
  • Apps/UnitLcdGfxDemo/main/Source/Application.cpp
  • Apps/UnitLcdGfxDemo/main/Source/GroveLookup.cpp
  • Apps/UnitLcdGfxDemo/main/Source/Main.cpp
  • Apps/UnitLcdGfxDemo/manifest.properties
  • Libraries/Gfx/DESIGN.md
  • Libraries/Gfx/Include/gfx/Canvas.h
  • Libraries/Gfx/Include/gfx/DirtyRegions.h
  • Libraries/Gfx/Include/gfx/DisplaySink.h
  • Libraries/Gfx/Include/gfx/Font.h
  • Libraries/Gfx/Include/gfx/Gfx.h
  • Libraries/Gfx/Include/gfx/Rect.h
  • Libraries/Gfx/Include/gfx/Sink.h
  • Libraries/Gfx/Include/gfx/Surface.h
  • Libraries/Gfx/Include/gfx/Target.h
  • Libraries/Gfx/Include/gfx/Text.h
  • Libraries/Gfx/LICENSE.md
  • Libraries/Gfx/Licenses/Terminus-OFL.txt
  • Libraries/Gfx/README.md
  • Libraries/Gfx/Source/Canvas.cpp
  • Libraries/Gfx/Source/ColorUtils.h
  • Libraries/Gfx/Source/DisplaySink.cpp
  • Libraries/Gfx/Source/FontTerminus16.cpp
  • Libraries/Gfx/Source/Fonts.cpp
  • Libraries/Gfx/Source/Images.cpp
  • Libraries/Gfx/Source/Polygon.cpp
  • Libraries/Gfx/Source/Shapes.cpp
  • Libraries/Gfx/Source/SinkTarget.cpp
  • Libraries/Gfx/Source/Surface.cpp
  • Libraries/Gfx/Source/Target.cpp
  • Libraries/Gfx/Source/Text.cpp
  • Libraries/Input/Include/input/AnyInput.h
  • Libraries/Input/LICENSE.md
  • Libraries/Input/Source/AnyInput.cpp
  • Libraries/M5UnitModules/Include/Unit8Encoder.h
  • Libraries/M5UnitModules/Include/UnitCardKB2.h
  • Libraries/M5UnitModules/Include/UnitCommon.h
  • Libraries/M5UnitModules/Include/UnitPaHub.h
  • Libraries/M5UnitModules/Include/UnitRfid2.h
  • Libraries/M5UnitModules/README.md
  • Libraries/M5UnitModules/Source/Unit8Encoder.cpp
  • Libraries/M5UnitModules/Source/UnitCardKB2.cpp
  • Libraries/M5UnitModules/Source/UnitLcd.cpp
  • Libraries/M5UnitModules/Source/UnitPaHub.cpp
  • Libraries/M5UnitModules/Source/UnitRfid2.cpp
  • Libraries/M5UnitModules/UnitReferences.md
  • Libraries/SfxEngine/Include/SfxDefinitions.h
  • Libraries/SfxEngine/Include/SfxEngine.h
  • Libraries/SfxEngine/README.md
  • Libraries/SfxEngine/Source/SfxEngine.cpp
  • Libraries/UnitLcdGfx/Include/UnitLcdSink.h
  • Libraries/UnitLcdGfx/README.md
  • Scripts/check-app-symbols.py
  • Scripts/sprite_tools/gen_bgdecor.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Shadowtrance

Shadowtrance commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor Author

MystifySpiDemo still needs to be updated with the kernel spi api changes for it to work

updated... needs new sdk for spi controller half duplex

@Shadowtrance Shadowtrance changed the title Wip sort New Apps + Fixes and more Oct 29, 2026
@KenVanHoeylandt
KenVanHoeylandt merged commit 5cf76a5 into TactilityProject:main Oct 29, 2026
69 of 73 checks passed
@Shadowtrance
Shadowtrance deleted the wip-sort branch October 29, 2026 19:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants