diff --git a/apps/com.example.launcher/META-INF/MANIFEST.MF b/apps/com.example.launcher/META-INF/MANIFEST.MF new file mode 100644 index 00000000..78bd472c --- /dev/null +++ b/apps/com.example.launcher/META-INF/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Name: Launcher diff --git a/launcher.py b/apps/com.example.launcher/assets/main.py similarity index 94% rename from launcher.py rename to apps/com.example.launcher/assets/main.py index e5400860..c6dd0b50 100644 --- a/launcher.py +++ b/apps/com.example.launcher/assets/main.py @@ -1,5 +1,4 @@ import uos -#import ufs import uio import machine @@ -39,8 +38,6 @@ def on_app_click(event, app_name, main_script, app_dir): print(f"Launching app: {app_name} by starting {main_script} in {app_dir})") run_app(main_script, True) - -# Create the app launcher def create_app_launcher(): # Get list of app directories apps_dir = "/apps" @@ -89,15 +86,4 @@ def create_app_launcher(): app_cont.add_event_cb(lambda e, name=app_name, main_script=main_script, dir=app_dir: on_app_click(e, name, main_script, dir), lv.EVENT.CLICKED, None) - -# Run the app launcher create_app_launcher() - -#import time -#while True: -# lv.task_handler() -# machine.idle() # Allow other tasks to run -# time.sleep_ms(100) - - - diff --git a/apps/com.example.launcher/res/mipmap-mdpi/launcher_icon.png b/apps/com.example.launcher/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 00000000..f28f284c Binary files /dev/null and b/apps/com.example.launcher/res/mipmap-mdpi/launcher_icon.png differ diff --git a/install.sh b/install.sh index e2f37748..7ef95f82 100755 --- a/install.sh +++ b/install.sh @@ -1,6 +1,6 @@ ~/sources/lvgl_micropython/lib/micropython/tools/mpremote/mpremote.py fs cp boot.py :/boot.py ~/sources/lvgl_micropython/lib/micropython/tools/mpremote/mpremote.py fs cp main.py :/main.py -~/sources/lvgl_micropython/lib/micropython/tools/mpremote/mpremote.py fs cp launcher.py :/launcher.py + ~/sources/lvgl_micropython/lib/micropython/tools/mpremote/mpremote.py fs cp -r apps :/ ~/sources/lvgl_micropython/lib/micropython/tools/mpremote/mpremote.py reset diff --git a/main.py b/main.py index ddd80ad1..e0bc8acc 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ import time + # Constants TFT_HOR_RES=320 TFT_VER_RES=240 @@ -79,31 +80,39 @@ notification_bar.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) notification_bar.set_scroll_dir(lv.DIR.VER) notification_bar.set_style_border_width(0, 0) notification_bar.set_style_radius(0, 0) + # Time label time_label = lv.label(notification_bar) time_label.set_text("12:00") time_label.align(lv.ALIGN.LEFT_MID, PADDING_TINY, 0) time_label.set_style_text_color(COLOR_TEXT_WHITE, 0) + # Notification icon (bell) notif_icon = lv.label(notification_bar) notif_icon.set_text(lv.SYMBOL.BELL) notif_icon.align_to(time_label, lv.ALIGN.OUT_RIGHT_MID, PADDING_LARGE, 0) notif_icon.set_style_text_color(COLOR_TEXT_WHITE, 0) + # WiFi icon wifi_icon = lv.label(notification_bar) wifi_icon.set_text(lv.SYMBOL.WIFI) wifi_icon.align(lv.ALIGN.RIGHT_MID, OFFSET_WIFI_ICON, 0) wifi_icon.set_style_text_color(COLOR_TEXT_WHITE, 0) + # Battery icon battery_icon = lv.label(notification_bar) battery_icon.set_text(lv.SYMBOL.BATTERY_FULL) battery_icon.align(lv.ALIGN.RIGHT_MID, OFFSET_BATTERY_ICON, 0) battery_icon.set_style_text_color(COLOR_TEXT_WHITE, 0) + # Battery percentage battery_label = lv.label(notification_bar) battery_label.set_text("100%") battery_label.align(lv.ALIGN.RIGHT_MID, 0, 0) battery_label.set_style_text_color(COLOR_TEXT_WHITE, 0) + +#import time + # Timer to update time every second def update_time(timer): ticks = time.ticks_ms() @@ -223,11 +232,9 @@ create_drawer() -# uasyncio and _thread aren't available on web - import _thread -# Function to execute the child script as a coroutine + def execute_script(script_source, is_file, lvgl_obj, return_to_launcher): thread_id = _thread.get_ident(); print(f"Thread {thread_id}: executing script") @@ -236,6 +243,7 @@ def execute_script(script_source, is_file, lvgl_obj, return_to_launcher): 'lv': lv, 'subwindow': lvgl_obj, 'run_app': run_app + #'run_launcher' : run_launcher } if is_file: print(f"Thread {thread_id}: reading script from file: {script_source}") @@ -246,7 +254,8 @@ def execute_script(script_source, is_file, lvgl_obj, return_to_launcher): print(f"Thread {thread_id}: script finished") if return_to_launcher: print(f"Thread {thread_id}: running launcher_script") - run_app("/launcher.py",True,False) + run_app("/apps/com.example.launcher/assets/main.py",True,False) + #run_launcher() except Exception as e: print(f"Thread {thread_id}: error ", e) @@ -258,7 +267,6 @@ def run_app(scriptname,is_file,return_to_launcher=True): subwindow.clean() # 168KB maximum at startup but 136KB after loading display, drivers, LVGL gui etc so let's go for 128KB for now, still a lot... # But then no additional threads can be created. So 32KB seems like a good balance, allowing for 4 threads in apps... - #_thread.stack_size(32768) _thread.stack_size(16384) _thread.start_new_thread(execute_script, (scriptname, is_file, subwindow, return_to_launcher)) print("Event loop started in background thread") @@ -266,6 +274,7 @@ def run_app(scriptname,is_file,return_to_launcher=True): print("Error starting event loop thread:", e) -run_app("/launcher.py",True,False) - +def run_launcher(): + run_app("/apps/com.example.launcher/assets/main.py",True,False) +run_launcher()