sweetlilmre / TapuinoNext

The evolution of the Tapuino project
Other
22 stars 7 forks source link

Tapuino + touch GUI #12

Open dejwk opened 1 year ago

dejwk commented 1 year ago

Hi Peter,

I see that you are porting Tapuino to ESP32. It's very cool, since ESP32 is so much more capable!

Anyway - my name is Dawid, and I wrote a GUI library for the ESP32. As a proof-of-concept, I wrote a GUI app for Tapuino. I made a short YouTube demo video, here:

https://www.youtube.com/watch?v=Aub32NOzwNY

In addition to the GUI part, it's probably worth noting that it supports loading directly from ZIP files, and it can handle SD cards with thousands of TAPs.

If you were interested, I'd be happy to contribute that app to be part of your project.

The GUI lib is still somewhat experimental (e.g. no documentation); with that caveat, you can find it here: https://github.com/dejwk/roo_windows. I didn't upload the app itself to Github just yet.

The TFT I used isn't great (it has a resistive touch, and it needs a stylus), but it's cheap and it has a built-in SD card reader. Hence, for my prototype build, I only needed two active components (ESP32 + display), and just a few passive elements. There are better TFTs, though. I have good experience with Waveshare ILI9486-based; I also ordered something with capacitive touch to experiment with.

sweetlilmre commented 1 year ago

Hi Dawid, I was sure I had responded to you, but must have forgot to send the response.

This looks like a really nice GUI and I'd be keen to support something like this. What I do need to do first is some abstraction work on the current UI handling so that multiple UIs could be integrated depending on hardware choice. I'd be interested to see how you wove your UI into the current project.

Apologies for getting back to you so late.

dejwk commented 1 year ago

Thanks Peter!

I dumped the PoC here if you'd like to take a look: https://github.com/dejwk/tapuino2

(It depends on a number of libs from https://github.com/dejwk; I didn't yet do anything to make it easy to build, so if you'd like to build it, you'll need to manually fetch roo_time, roo_scheduler, roo_display, roo_windows, roo_material_icons, and roo_dashboard - by cloning them into the lib/ subdirectory. It also needs unzipLIB to handle ZIP files.)

It is a proof-of-concept; it doesn't support seek, updates, and writes - but all possible to add. I also intended to implement a search-as-you-type interface; the index is prepared for that but the UI isn't implemented yet.

The most recent implementation uses a MakerFabs display (based on ili9488), which I am very pleased with - it has very good resolution (480x320), an excellent capacitive touch panel, and ESP32 and SD card reader on board - so really the only bits needed to make a functional Tapuino out of that single component are a few passive elements (voltage dividers and a capacitor on the power line). That said, the underlying UI library supports a number of TFT display drivers so there's some flexibility built-in.

Re: how to refactor the project so that it can work with different UX interfaces: I think the way to go is to make the core event-driven. That is, the 'main loop' needs to be outside of the core, and controlled by the specific UI implementation. Then, you can have completely different UX on top of the same core. (By core, I mean the code that handles the filesystem, TAP playback, etc.)

This is how my PoC is currently implemented, so you can see what I mean in the code. Basically, the UX is the app, and it calls to the core when needed, e.g. when something is pressed, as well as periodically during playback (to replenish the read buffer).