Merge pull request 'fix(main): Make upgrade from tag directories more ergonomical' (#47) from fix-no-db into main
All checks were successful
Build RPi Pico firmware image / Build-Firmware (push) Successful in 3m20s
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 5s
Run unit tests on host / Run-Unit-Tests (push) Successful in 8s
Run pytests / Check-Pytest (push) Successful in 11s

Reviewed-on: #47
Reviewed-by: Stefan Kratochwil <kratochwil-la@gmx.de>
This commit was merged in pull request #47.
This commit is contained in:
2025-11-02 17:31:57 +00:00

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