From 0642c39dea3507319ad17f1d7af41755b73ff5ab Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Tue, 17 Jun 2025 11:23:45 +0200 Subject: [PATCH] Add Restart to Bootloader setting --- CHANGELOG.md | 3 ++- .../assets/settings.py | 22 +++++++++--------- internal_filesystem/builtin/system/button.py | 23 +++---------------- 3 files changed, 16 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f69cc88d..9f0b98e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ ===== - Tweak button size in drawer and add "Settings" button - Show "Brightness" text in drawer -- Add builtin "Settings" app with settings for dark/light theme, theme color +- Save and restore "Brightness" setting +- Add builtin "Settings" app with settings for Light/Dark Theme, Theme Color, Restart to Bootloader 0.0.5 ===== diff --git a/internal_filesystem/builtin/apps/com.micropythonos.settings/assets/settings.py b/internal_filesystem/builtin/apps/com.micropythonos.settings/assets/settings.py index 066dd216..cf020cbd 100644 --- a/internal_filesystem/builtin/apps/com.micropythonos.settings/assets/settings.py +++ b/internal_filesystem/builtin/apps/com.micropythonos.settings/assets/settings.py @@ -1,16 +1,8 @@ -from mpos.apps import Activity, Intent +from mpos.apps import Activity, ActivityNavigator, Intent + import mpos.config import mpos.ui -class Hello(Activity): - - def onCreate(self): - screen = lv.obj() - label = lv.label(screen) - label.set_text('Hello World!') - label.center() - self.setContentView(screen) - # Used to list and edit all settings: class SettingsActivity(Activity): @@ -20,9 +12,10 @@ class SettingsActivity(Activity): self.settings = [ {"title": "Light/Dark Theme", "key": "theme_light_dark", "value_label": None, "cont": None}, {"title": "Theme Color", "key": "theme_primary_color", "value_label": None, "cont": None, "placeholder": "HTML hex color, like: EC048C"}, + {"title": "Restart to Bootloader", "key": "boot_mode", "value_label": None, "cont": None}, # special that doesn't get saved + # This is currently only in the drawer but would make sense to have it here for completeness: #{"title": "Display Brightness", "key": "display_brightness", "value_label": None, "cont": None, "placeholder": "A value from 0 to 100."}, # Maybe also add font size (but ideally then all fonts should scale up/down) - #{"title": "Reboot into Bootloader", "key": "boot_mode", "value_label": None, "cont": None}, # special that doesn't get saved #{"title": "Timezone", "key": "timezone", "value_label": None, "cont": None, "placeholder": "Example: Europe/Prague"}, ] @@ -238,6 +231,13 @@ class SettingActivity(Activity): self.startActivityForResult(Intent(activity_class=CameraApp).putExtra("scanqr_mode", True), self.gotqr_result_callback) def save_setting(self, setting): + if setting["key"] == "boot_mode" and self.radio_container: + if self.active_radio_index == 1: + from mpos.bootloader import ResetIntoBootloader + intent = Intent(activity_class=ResetIntoBootloader) + ActivityNavigator.startActivity(intent) + return + if ( setting["key"] =="theme_light_dark" or setting["key"] == "boot_mode" ) and self.radio_container: if setting["key"] == "boot_mode": options = [("Normal", "normal"), ("Bootloader", "bootloader")] diff --git a/internal_filesystem/builtin/system/button.py b/internal_filesystem/builtin/system/button.py index ff4f5b0f..737bbd6d 100644 --- a/internal_filesystem/builtin/system/button.py +++ b/internal_filesystem/builtin/system/button.py @@ -8,6 +8,8 @@ import _thread from mpos.apps import Activity, ActivityNavigator, Intent +from mpos.bootloader import ResetIntoBootloader + #import mpos.config #import mpos.ui @@ -24,26 +26,7 @@ is_pressed = False # Timer for checking long press timer = Timer(-1) -message = "Bootloader mode activated.\nYou can now install firmware over USB.\n\nReset the device to cancel." -class Bootloader(Activity): - - def onCreate(self): - print(message) - screen = lv.obj() - label = lv.label(screen) - label.set_text(message) - label.center() - self.setContentView(screen) - - def onResume(self, screen): - # Use a timer, otherwise the UI won't have time to update: - timer = lv.timer_create(self.start_bootloader, 1000, None) # give it some time (at least 500ms) for the new screen animation - timer.set_repeat_count(1) - - def start_bootloader(self, timer): - import machine - machine.bootloader() def on_long_press(t): # Callback for when long press duration is reached. print("button.py: long press detected") @@ -54,7 +37,7 @@ def on_long_press(t): # Callback for when long press duration is reached. #_thread.stack_size(mpos.apps.good_stack_size()) #_thread.start_new_thread(handle_long_press, ()) #lv.async_call(lambda l: handle_long_press(), None) - intent = Intent(activity_class=Bootloader) + intent = Intent(activity_class=ResetIntoBootloader) ActivityNavigator.startActivity(intent) else: is_pressed = False