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
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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user