fix(main): Make upgrade from tag directories more ergonomical
All checks were successful
Build RPi Pico firmware image / Build-Firmware (push) Successful in 3m21s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s

As we don't have an API to upload files and create playlists yet, we
used the convention "tag uid as directory name" to allow testing
playback. With the introduction of the database in #39 "Add playlist db"
a builddb() function to initialize the database from the tag directories
was added, but it is not automatically called. To make the developer
experience more ergonomical, add a check for that automatically runs
builddb() when no database exists.

Signed-off-by: Matthias Blankertz <matthias@blankertz.org>
This commit is contained in:
2025-11-02 14:24:15 +01:00
parent 9ba6e698b9
commit b56e4f36b4

View File

@@ -3,9 +3,11 @@
import aiorepl # type: ignore import aiorepl # type: ignore
import asyncio import asyncio
from errno import ENOENT
import machine import machine
import micropython import micropython
import network import network
import os
import time import time
from math import pi, sin, pow from math import pi, sin, pow
@@ -62,6 +64,9 @@ def setup_wifi():
wlan.active(True) wlan.active(True)
DB_PATH = '/sd/tonberry.db'
def run(): def run():
asyncio.new_event_loop() asyncio.new_event_loop()
# Setup LEDs # Setup LEDs
@@ -73,27 +78,36 @@ def run():
# Setup MP3 player # Setup MP3 player
with SDContext(mosi=hwconfig.SD_DI, miso=hwconfig.SD_DO, sck=hwconfig.SD_SCK, ss=hwconfig.SD_CS, with SDContext(mosi=hwconfig.SD_DI, miso=hwconfig.SD_DO, sck=hwconfig.SD_SCK, ss=hwconfig.SD_CS,
baudrate=hwconfig.SD_CLOCKRATE), \ baudrate=hwconfig.SD_CLOCKRATE):
BTreeFileManager('/sd/tonberry.db') as playlistdb, \ # Temporary hack: build database from folders if no database exists
AudioContext(hwconfig.I2S_DIN, hwconfig.I2S_DCLK, hwconfig.I2S_LRCLK) as audioctx: # Can be removed once playlists can be created via API
try:
_ = os.stat(DB_PATH)
except OSError as ex:
if ex.errno == ENOENT:
print("No playlist DB found, trying to build DB from tag dirs")
builddb()
# Setup NFC with BTreeFileManager(DB_PATH) as playlistdb, \
reader = MFRC522(spi_id=hwconfig.RC522_SPIID, sck=hwconfig.RC522_SCK, miso=hwconfig.RC522_MISO, AudioContext(hwconfig.I2S_DIN, hwconfig.I2S_DCLK, hwconfig.I2S_LRCLK) as audioctx:
mosi=hwconfig.RC522_MOSI, cs=hwconfig.RC522_SS, rst=hwconfig.RC522_RST, tocard_retries=20)
# Setup app # Setup NFC
deps = app.Dependencies(mp3player=lambda the_app: MP3Player(audioctx, the_app), reader = MFRC522(spi_id=hwconfig.RC522_SPIID, sck=hwconfig.RC522_SCK, miso=hwconfig.RC522_MISO,
nfcreader=lambda the_app: Nfc(reader, the_app), mosi=hwconfig.RC522_MOSI, cs=hwconfig.RC522_SS, rst=hwconfig.RC522_RST, tocard_retries=20)
buttons=lambda the_app: Buttons(the_app, pin_volup=hwconfig.BUTTON_VOLUP,
pin_voldown=hwconfig.BUTTON_VOLDOWN,
pin_next=hwconfig.BUTTON_NEXT),
playlistdb=lambda _: playlistdb)
the_app = app.PlayerApp(deps)
# Start # Setup app
asyncio.create_task(aiorepl.task({'timer_manager': TimerManager(), deps = app.Dependencies(mp3player=lambda the_app: MP3Player(audioctx, the_app),
'app': the_app})) nfcreader=lambda the_app: Nfc(reader, the_app),
asyncio.get_event_loop().run_forever() buttons=lambda the_app: Buttons(the_app, pin_volup=hwconfig.BUTTON_VOLUP,
pin_voldown=hwconfig.BUTTON_VOLDOWN,
pin_next=hwconfig.BUTTON_NEXT),
playlistdb=lambda _: playlistdb)
the_app = app.PlayerApp(deps)
# Start
asyncio.create_task(aiorepl.task({'timer_manager': TimerManager(),
'app': the_app}))
asyncio.get_event_loop().run_forever()
def builddb(): def builddb():
@@ -101,10 +115,11 @@ def builddb():
For testing, build a playlist db based on the previous tag directory format. For testing, build a playlist db based on the previous tag directory format.
Can be removed once uploading files / playlist via the web api is possible. Can be removed once uploading files / playlist via the web api is possible.
""" """
import os try:
os.unlink(DB_PATH)
os.unlink('/sd/tonberry.db') except OSError:
with BTreeFileManager('/sd/tonberry.db') as db: pass
with BTreeFileManager(DB_PATH) as db:
for name, type_, _, _ in os.ilistdir(b'/sd'): for name, type_, _, _ in os.ilistdir(b'/sd'):
if type_ != 0x4000: if type_ != 0x4000:
continue continue