Use context managers to ensure deinit of audiocore and sd
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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)},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user