Use context managers to ensure deinit of audiocore and sd

This commit is contained in:
2025-03-23 21:13:11 +01:00
parent d02776eea8
commit f0c3fe4db8
3 changed files with 69 additions and 27 deletions

View File

@@ -5,9 +5,11 @@ from asyncio import ThreadSafeFlag
class Audiocore: class Audiocore:
def __init__(self, pin, sideset): def __init__(self, pin, sideset):
self.notify = ThreadSafeFlag() self.notify = ThreadSafeFlag()
self._audiocore = _audiocore.Audiocore(pin, sideset, self._interrupt) self.pin = pin
self.sideset = sideset
self._audiocore = _audiocore.Audiocore(self.pin, self.sideset, self._interrupt)
def __del__(self): def deinit(self):
self._audiocore.deinit() self._audiocore.deinit()
def _interrupt(self, _): def _interrupt(self, _):
@@ -35,3 +37,16 @@ class Audiocore:
if pos >= len(buffer): if pos >= len(buffer):
return (pos, buf_space, underruns) return (pos, buf_space, underruns)
await self.notify.wait() await self.notify.wait()
class AudioContext:
def __init__(self, pin, sideset):
self.pin = pin
self.sideset = sideset
def __enter__(self):
self._audiocore = Audiocore(self.pin, self.sideset)
return self._audiocore
def __exit__(self, exc_type, exc_value, traceback):
self._audiocore.deinit()

View File

@@ -96,6 +96,7 @@ static MP_DEFINE_CONST_FUN_OBJ_3(sdcard_ioctl_obj, sdcard_ioctl);
static const mp_rom_map_elem_t sdcard_locals_dict_table[] = { static const mp_rom_map_elem_t sdcard_locals_dict_table[] = {
{MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&sdcard_deinit_obj)}, {MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&sdcard_deinit_obj)},
{MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&sdcard_deinit_obj)},
{MP_ROM_QSTR(MP_QSTR_ioctl), MP_ROM_PTR(&sdcard_ioctl_obj)}, {MP_ROM_QSTR(MP_QSTR_ioctl), MP_ROM_PTR(&sdcard_ioctl_obj)},
{MP_ROM_QSTR(MP_QSTR_readblocks), MP_ROM_PTR(&sdcard_readblocks_obj)}, {MP_ROM_QSTR(MP_QSTR_readblocks), MP_ROM_PTR(&sdcard_readblocks_obj)},
}; };

View File

@@ -12,7 +12,8 @@ from math import pi, sin, pow
# Own modules # Own modules
from app import TimerManager, TagPlaybackManager from app import TimerManager, TagPlaybackManager
from audiocore import Audiocore from audiocore import AudioContext
from mfrc522 import MFRC522
from mp3player import MP3Player from mp3player import MP3Player
from nfc import Nfc from nfc import Nfc
from rp2_neopixel import NeoPixel from rp2_neopixel import NeoPixel
@@ -52,32 +53,57 @@ machine.mem32[0x4001c004 + 8*4] = 0x67
machine.mem32[0x40030000 + 0x00] = 0x10 machine.mem32[0x40030000 + 0x00] = 0x10
# Setup SD card class SDContext:
try: def __init__(self, mosi, miso, sck, ss, baudrate):
sd = SDCard(mosi=Pin(3), miso=Pin(4), sck=Pin(2), ss=Pin(5), baudrate=15000000) self.mosi = mosi
os.mount(sd, '/sd') self.miso = miso
except OSError as ex: self.sck = sck
print(f'Failed to setup SD card: {ex}') self.ss = ss
self.baudrate = baudrate
# Setup LEDs def __enter__(self):
pin = Pin.board.GP16 self.sdcard = SDCard(self.mosi, self.miso, self.sck, self.ss, self.baudrate)
np = NeoPixel(pin, 10, sm=1) try:
asyncio.create_task(rainbow(np)) os.mount(self.sdcard, '/sd')
except Exception:
self.sdcard.deinit()
raise
return self
# Setup MP3 player def __exit__(self, exc_type, exc_value, traceback):
audioctx = Audiocore(Pin(8), Pin(6)) try:
player = MP3Player(audioctx) os.umount('/sd')
player.set_volume(128) finally:
asyncio.create_task(player.task()) self.sdcard.deinit()
# Setup app
timer_manager = TimerManager(True)
playback_manager = TagPlaybackManager(timer_manager, player)
# Setup NFC def run():
nfc = Nfc(playback_manager.onTagChange) asyncio.new_event_loop()
# Setup LEDs
pin = Pin.board.GP16
np = NeoPixel(pin, 10, sm=1)
asyncio.create_task(rainbow(np))
# Start # Setup MP3 player
asyncio.create_task(aiorepl.task({'player': player, 'timer_manager': timer_manager, with SDContext(mosi=Pin(3), miso=Pin(4), sck=Pin(2), ss=Pin(5), baudrate=15000000), \
'playback_manager': playback_manager})) AudioContext(Pin(8), Pin(6)) as audioctx:
asyncio.get_event_loop().run_forever() player = MP3Player(audioctx)
player.set_volume(128)
asyncio.create_task(player.task())
# Setup app
timer_manager = TimerManager(True)
playback_manager = TagPlaybackManager(timer_manager, player)
# Setup NFC
reader = MFRC522(spi_id=1, sck=10, miso=12, mosi=11, cs=13, rst=9, tocard_retries=20)
nfc = Nfc(reader, playback_manager.onTagChange)
# Start
asyncio.create_task(aiorepl.task({'player': player, 'timer_manager': timer_manager,
'playback_manager': playback_manager, 'nfc': nfc}))
asyncio.get_event_loop().run_forever()
if __name__ == '__main__':
run()