fix: Block certain requests during playback
All checks were successful
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m42s
Check code formatting / Check-C-Format (push) Successful in 9s
Check code formatting / Check-Python-Flake8 (push) Successful in 12s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 7s
Run unit tests on host / Run-Unit-Tests (push) Successful in 10s
Run pytests / Check-Pytest (push) Successful in 13s
All checks were successful
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m42s
Check code formatting / Check-C-Format (push) Successful in 9s
Check code formatting / Check-Python-Flake8 (push) Successful in 12s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 7s
Run unit tests on host / Run-Unit-Tests (push) Successful in 10s
Run pytests / Check-Pytest (push) Successful in 13s
Probably due to memory/stack overrun, some more involved web API requests cause the system to hang if performed during playback. For now, block these requests during playback. Signed-off-by: Matthias Blankertz <matthias@blankertz.org>
This commit is contained in:
@@ -58,6 +58,7 @@ class PlayerApp:
|
|||||||
self.mp3file = None
|
self.mp3file = None
|
||||||
self.volume_pos = 3
|
self.volume_pos = 3
|
||||||
self.paused = False
|
self.paused = False
|
||||||
|
self.playing = False
|
||||||
self.player.set_volume(VOLUME_CURVE[self.volume_pos])
|
self.player.set_volume(VOLUME_CURVE[self.volume_pos])
|
||||||
self._onIdle()
|
self._onIdle()
|
||||||
|
|
||||||
@@ -115,6 +116,9 @@ class PlayerApp:
|
|||||||
# Check again in a minute
|
# Check again in a minute
|
||||||
self.timer_manager.schedule(time.ticks_ms() + self.idle_timeout_ms, self.onIdleTimeout)
|
self.timer_manager.schedule(time.ticks_ms() + self.idle_timeout_ms, self.onIdleTimeout)
|
||||||
|
|
||||||
|
def is_playing(self) -> bool:
|
||||||
|
return self.playing
|
||||||
|
|
||||||
def _set_playlist(self, tag: bytes):
|
def _set_playlist(self, tag: bytes):
|
||||||
if self.playlist is not None:
|
if self.playlist is not None:
|
||||||
pos = self.player.stop()
|
pos = self.player.stop()
|
||||||
@@ -176,7 +180,9 @@ class PlayerApp:
|
|||||||
def _onIdle(self):
|
def _onIdle(self):
|
||||||
self.timer_manager.schedule(time.ticks_ms() + self.idle_timeout_ms, self.onIdleTimeout)
|
self.timer_manager.schedule(time.ticks_ms() + self.idle_timeout_ms, self.onIdleTimeout)
|
||||||
self.leds.set_state(self.leds.IDLE)
|
self.leds.set_state(self.leds.IDLE)
|
||||||
|
self.playing = False
|
||||||
|
|
||||||
def _onActive(self):
|
def _onActive(self):
|
||||||
self.timer_manager.cancel(self.onIdleTimeout)
|
self.timer_manager.cancel(self.onIdleTimeout)
|
||||||
self.leds.set_state(self.leds.PLAYING)
|
self.leds.set_state(self.leds.PLAYING)
|
||||||
|
self.playing = True
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ def run():
|
|||||||
|
|
||||||
# Wifi with default config
|
# Wifi with default config
|
||||||
setup_wifi()
|
setup_wifi()
|
||||||
start_webserver(config)
|
|
||||||
|
|
||||||
# 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,
|
||||||
@@ -96,6 +95,7 @@ def run():
|
|||||||
config=lambda _: config)
|
config=lambda _: config)
|
||||||
the_app = app.PlayerApp(deps)
|
the_app = app.PlayerApp(deps)
|
||||||
|
|
||||||
|
start_webserver(config, the_app)
|
||||||
# Start
|
# Start
|
||||||
asyncio.create_task(aiorepl.task({'timer_manager': TimerManager(),
|
asyncio.create_task(aiorepl.task({'timer_manager': TimerManager(),
|
||||||
'app': the_app}))
|
'app': the_app}))
|
||||||
|
|||||||
@@ -10,12 +10,14 @@ from microdot import Microdot
|
|||||||
webapp = Microdot()
|
webapp = Microdot()
|
||||||
server = None
|
server = None
|
||||||
config = None
|
config = None
|
||||||
|
app = None
|
||||||
|
|
||||||
|
|
||||||
def start_webserver(config_):
|
def start_webserver(config_, app_):
|
||||||
global server, config
|
global server, config, app
|
||||||
server = asyncio.create_task(webapp.start_server(port=80))
|
server = asyncio.create_task(webapp.start_server(port=80))
|
||||||
config = config_
|
config = config_
|
||||||
|
app = app_
|
||||||
|
|
||||||
|
|
||||||
@webapp.route('/')
|
@webapp.route('/')
|
||||||
@@ -50,6 +52,8 @@ async def config_get(request):
|
|||||||
|
|
||||||
@webapp.route('/api/v1/config', methods=['PUT'])
|
@webapp.route('/api/v1/config', methods=['PUT'])
|
||||||
async def config_put(request):
|
async def config_put(request):
|
||||||
|
if app.is_playing():
|
||||||
|
return 503
|
||||||
try:
|
try:
|
||||||
config.set_config(request.json)
|
config.set_config(request.json)
|
||||||
except ValueError as ex:
|
except ValueError as ex:
|
||||||
|
|||||||
Reference in New Issue
Block a user