From 7b65ec73017495abbcf0fc499275d51e14c5540f Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Fri, 23 Jan 2026 23:25:22 +0100 Subject: [PATCH] Simplify --- internal_filesystem/lib/mpos/main.py | 83 ++++++++++++++----- .../lib/mpos/ui/camera_settings.py | 2 +- internal_filesystem/lib/mpos/ui/display.py | 47 ----------- .../lib/mpos/ui/gesture_navigation.py | 2 +- .../lib/mpos/ui/setting_activity.py | 2 +- internal_filesystem/lib/mpos/ui/topmenu.py | 2 +- 6 files changed, 65 insertions(+), 73 deletions(-) delete mode 100644 internal_filesystem/lib/mpos/ui/display.py diff --git a/internal_filesystem/lib/mpos/main.py b/internal_filesystem/lib/mpos/main.py index b01fb7e5..8252559d 100644 --- a/internal_filesystem/lib/mpos/main.py +++ b/internal_filesystem/lib/mpos/main.py @@ -5,31 +5,70 @@ import mpos import mpos.apps import mpos.config import mpos.ui -from . import ui + from .content.package_manager import PackageManager -from mpos.ui.display import init_rootscreen -from mpos.ui.appearance_manager import AppearanceManager +from .ui.appearance_manager import AppearanceManager +from .ui.display_metrics import DisplayMetrics import mpos.ui.topmenu -# Auto-detect and initialize hardware -import sys -if sys.platform == "linux" or sys.platform == "darwin": # linux and macOS - board = "linux" -elif sys.platform == "esp32": - from machine import Pin, I2C - i2c0 = I2C(0, sda=Pin(48), scl=Pin(47)) - if {0x15, 0x6B} <= set(i2c0.scan()): # touch screen and IMU (at least, possibly more) - board = "waveshare_esp32_s3_touch_lcd_2" - else: - i2c0 = I2C(0, sda=Pin(9), scl=Pin(18)) - if {0x6B} <= set(i2c0.scan()): # IMU (plus possibly the Communicator's LANA TNY at 0x38) - board = "fri3d_2024" - elif {0x6A} <= set(i2c0.scan()): # IMU (plus a few others, to be added later, but this should work) - board = "fri3d_2026" - else: - print("Unable to identify board, defaulting...") - board = "fri3d_2024" # default fallback + +# White text on black logo works (for dark mode) and can be inverted (for light mode) +logo_white = "M:builtin/res/mipmap-mdpi/MicroPythonOS-logo-white-long-w296.png" # from the MPOS-logo repo + +# Black text on transparent logo works (for light mode) but can't be inverted (for dark mode) +# Even when trying different blend modes (SUBTRACTIVE, ADDITIVE, MULTIPLY) +# Even when it's on a white (instead of transparent) background +#logo_black = "M:builtin/res/mipmap-mdpi/MicroPythonOS-logo-black-long-w240.png" + + +def init_rootscreen(): + """Initialize the root screen and set display metrics.""" + screen = lv.screen_active() + disp = screen.get_display() + width = disp.get_horizontal_resolution() + height = disp.get_vertical_resolution() + dpi = disp.get_dpi() + + # Initialize DisplayMetrics with actual display values + DisplayMetrics.set_resolution(width, height) + DisplayMetrics.set_dpi(dpi) + + print(f"init_rootscreen set resolution to {width}x{height} at {dpi} DPI") + + try: + img = lv.image(screen) + img.set_src(logo_white) + img.set_blend_mode(lv.BLEND_MODE.DIFFERENCE) + img.center() + except Exception as e: # if image loading fails + print(f"ERROR: logo image failed, LVGL will be in a bad state and the UI will hang: {e}") + import sys + sys.print_exception(e) + print("Trying to fall back to a simple text-based 'logo' but it won't showup because the UI broke...") + label = lv.label(screen) + label.set_text("MicroPythonOS") + label.set_style_text_font(lv.font_montserrat_20, lv.PART.MAIN) + label.center() + +def detect_board(): + import sys + if sys.platform == "linux" or sys.platform == "darwin": # linux and macOS + return "linux" + elif sys.platform == "esp32": + from machine import Pin, I2C + i2c0 = I2C(0, sda=Pin(48), scl=Pin(47)) + if {0x15, 0x6B} <= set(i2c0.scan()): # touch screen and IMU (at least, possibly more) + return "waveshare_esp32_s3_touch_lcd_2" + else: + i2c0 = I2C(0, sda=Pin(9), scl=Pin(18)) + if {0x6A} <= set(i2c0.scan()): # IMU (plus a few others, to be added later, but this should work) + return "fri3d_2026" + else: # if {0x6B} <= set(i2c0.scan()): # IMU (plus possibly the Communicator's LANA TNY at 0x38) + return "fri3d_2024" + + +board = detect_board() print(f"Initializing {board} hardware") import mpos.info mpos.info.set_hardware_id(board) @@ -45,7 +84,7 @@ prefs = mpos.config.SharedPreferences("com.micropythonos.settings") AppearanceManager.init(prefs) init_rootscreen() mpos.ui.topmenu.create_notification_bar() -mpos.ui.topmenu.create_drawer(mpos.ui.display) +mpos.ui.topmenu.create_drawer() mpos.ui.handle_back_swipe() mpos.ui.handle_top_swipe() diff --git a/internal_filesystem/lib/mpos/ui/camera_settings.py b/internal_filesystem/lib/mpos/ui/camera_settings.py index f3598f03..83db9d2b 100644 --- a/internal_filesystem/lib/mpos/ui/camera_settings.py +++ b/internal_filesystem/lib/mpos/ui/camera_settings.py @@ -2,7 +2,7 @@ import lvgl as lv from ..config import SharedPreferences from ..app.activity import Activity -from .display import DisplayMetrics +from .display_metrics import DisplayMetrics from .widget_animator import WidgetAnimator class CameraSettingsActivity(Activity): diff --git a/internal_filesystem/lib/mpos/ui/display.py b/internal_filesystem/lib/mpos/ui/display.py deleted file mode 100644 index 3ae1f6ff..00000000 --- a/internal_filesystem/lib/mpos/ui/display.py +++ /dev/null @@ -1,47 +0,0 @@ -# lib/mpos/ui/display.py -""" -Display initialization module. - -Handles LVGL display initialization and sets up DisplayMetrics. -""" - -import lvgl as lv -from .display_metrics import DisplayMetrics - -# White text on black logo works (for dark mode) and can be inverted (for light mode) -logo_white = "M:builtin/res/mipmap-mdpi/MicroPythonOS-logo-white-long-w296.png" # from the MPOS-logo repo - -# Black text on transparent logo works (for light mode) but can't be inverted (for dark mode) -# Even when trying different blend modes (SUBTRACTIVE, ADDITIVE, MULTIPLY) -# Even when it's on a white (instead of transparent) background -#logo_black = "M:builtin/res/mipmap-mdpi/MicroPythonOS-logo-black-long-w240.png" - - -def init_rootscreen(): - """Initialize the root screen and set display metrics.""" - screen = lv.screen_active() - disp = screen.get_display() - width = disp.get_horizontal_resolution() - height = disp.get_vertical_resolution() - dpi = disp.get_dpi() - - # Initialize DisplayMetrics with actual display values - DisplayMetrics.set_resolution(width, height) - DisplayMetrics.set_dpi(dpi) - - print(f"init_rootscreen set resolution to {width}x{height} at {dpi} DPI") - - try: - img = lv.image(screen) - img.set_src(logo_white) - img.set_blend_mode(lv.BLEND_MODE.DIFFERENCE) - img.center() - except Exception as e: # if image loading fails - print(f"ERROR: logo image failed, LVGL will be in a bad state and the UI will hang: {e}") - import sys - sys.print_exception(e) - print("Trying to fall back to a simple text-based 'logo' but it won't showup because the UI broke...") - label = lv.label(screen) - label.set_text("MicroPythonOS") - label.set_style_text_font(lv.font_montserrat_20, lv.PART.MAIN) - label.center() diff --git a/internal_filesystem/lib/mpos/ui/gesture_navigation.py b/internal_filesystem/lib/mpos/ui/gesture_navigation.py index 968a956f..12c53cf2 100644 --- a/internal_filesystem/lib/mpos/ui/gesture_navigation.py +++ b/internal_filesystem/lib/mpos/ui/gesture_navigation.py @@ -3,7 +3,7 @@ from lvgl import LvReferenceError from .widget_animator import WidgetAnimator from .view import back_screen from mpos.ui import topmenu as topmenu -from .display import DisplayMetrics +from .display_metrics import DisplayMetrics from .appearance_manager import AppearanceManager downbutton = None diff --git a/internal_filesystem/lib/mpos/ui/setting_activity.py b/internal_filesystem/lib/mpos/ui/setting_activity.py index 94555a4f..16f621ec 100644 --- a/internal_filesystem/lib/mpos/ui/setting_activity.py +++ b/internal_filesystem/lib/mpos/ui/setting_activity.py @@ -2,7 +2,7 @@ import lvgl as lv from ..app.activity import Activity from .camera_activity import CameraActivity -from .display import DisplayMetrics +from .display_metrics import DisplayMetrics from .widget_animator import WidgetAnimator from ..camera_manager import CameraManager diff --git a/internal_filesystem/lib/mpos/ui/topmenu.py b/internal_filesystem/lib/mpos/ui/topmenu.py index 27f35e40..1c81e849 100644 --- a/internal_filesystem/lib/mpos/ui/topmenu.py +++ b/internal_filesystem/lib/mpos/ui/topmenu.py @@ -217,7 +217,7 @@ def create_notification_bar(): -def create_drawer(display=None): +def create_drawer(): global drawer drawer=lv.obj(lv.layer_top()) drawer.set_size(lv.pct(100),lv.pct(90))