diff --git a/software/src/app.py b/software/src/app.py index fc29d88..35abf48 100644 --- a/software/src/app.py +++ b/software/src/app.py @@ -195,3 +195,9 @@ class PlayerApp: def get_playlist_db(self): return self.playlist_db + + def get_timer_manager(self): + return self.timer_manager + + def get_leds(self): + return self.leds diff --git a/software/src/utils/leds.py b/software/src/utils/leds.py index 3598c6d..621c1f4 100644 --- a/software/src/utils/leds.py +++ b/software/src/utils/leds.py @@ -10,6 +10,7 @@ import time class LedManager: IDLE = const(0) PLAYING = const(1) + REBOOTING = const(2) def __init__(self, np): self.led_state = LedManager.IDLE @@ -19,7 +20,7 @@ class LedManager: asyncio.create_task(self.run()) def set_state(self, state): - assert state in [LedManager.IDLE, LedManager.PLAYING] + assert state in [LedManager.IDLE, LedManager.PLAYING, LedManager.REBOOTING] self.led_state = state def _gamma(self, value, X=2.2): @@ -50,6 +51,8 @@ class LedManager: self._pulse(time_, (0, 1, 0), 3) elif self.led_state == LedManager.PLAYING: self._rainbow(time_) + elif self.led_state == LedManager.REBOOTING: + self._pulse(time_, (1, 0, 1), 0.2) time_ += 0.02 before = time.ticks_ms() await self.np.async_write() diff --git a/software/src/webserver.py b/software/src/webserver.py index 2347a7b..c8df31f 100644 --- a/software/src/webserver.py +++ b/software/src/webserver.py @@ -5,10 +5,13 @@ Copyright (c) 2024-2025 Stefan Kratochwil import asyncio import json +import machine import os +import time from array import array from microdot import Microdot, redirect, send_file, Request +from utils import TimerManager, LedManager webapp = Microdot() server = None @@ -16,17 +19,21 @@ config = None app = None nfc = None playlist_db = None +leds = None +timer_manager = None Request.max_content_length = 128 * 1024 * 1024 # 128MB requests allowed def start_webserver(config_, app_): - global server, config, app, nfc, playlist_db + global server, config, app, nfc, playlist_db, leds, timer_manager server = asyncio.create_task(webapp.start_server(port=80)) config = config_ app = app_ nfc = app.get_nfc() playlist_db = app.get_playlist_db() + leds = app.get_leds() + timer_manager = app.get_timer_manager() @webapp.before_request @@ -246,3 +253,16 @@ async def audiofile_delete(request): path = fsroot + '/' + request.args['location'] recursive_delete(path) return '', 204 + + +@webapp.route('/api/v1/reboot/', methods=['POST']) +async def reboot(request, method): + if method == 'bootloader': + leds.set_state(LedManager.REBOOTING) + timer_manager.schedule(time.ticks_ms() + 1500, machine.bootloader) + elif method =='application': + leds.set_state(LedManager.REBOOTING) + timer_manager.schedule(time.ticks_ms() + 1500, machine.reset) + else: + return 'method not supported', 400 + return '', 204