From ec3edf867ff8fce97ed5183d799df30bc3c00158 Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Thu, 5 Jun 2025 09:27:42 +0200 Subject: [PATCH] osupdate: remove sleep(10) --- .../META-INF/MANIFEST.JSON | 13 - .../assets/bitcoin_price.py | 228 ------------------ .../apps/com.example.btcticker/assets/echo.py | 24 -- .../res/mipmap-mdpi/icon_64x64.png | Bin 447 -> 0 bytes .../META-INF/MANIFEST.JSON | 13 - .../com.example.cputest/assets/cputest.py | 118 --------- .../res/mipmap-mdpi/icon_64x64.png | Bin 3038 -> 0 bytes .../com.example.draw/META-INF/MANIFEST.JSON | 13 - .../apps/com.example.draw/assets/draw.py | 88 ------- .../res/mipmap-mdpi/icon_64x64.png | Bin 6187 -> 0 bytes .../META-INF/MANIFEST.JSON | 12 - .../com.example.helloworld/assets/hello.py | 25 -- .../res/mipmap-mdpi/icon_64x64.png | Bin 5378 -> 0 bytes .../META-INF/MANIFEST.JSON | 12 - .../com.example.imutest/assets/imutest.py | 86 ------- .../res/mipmap-mdpi/icon_64x64.png | Bin 6013 -> 0 bytes .../META-INF/MANIFEST.JSON | 13 - .../com.example.lvgltest/assets/lvgltest.py | 46 ---- .../res/mipmap-mdpi/icon_64x64.png | Bin 6180 -> 0 bytes .../assets/osupdate.py | 3 - 20 files changed, 694 deletions(-) delete mode 100644 internal_filesystem/apps/com.example.btcticker/META-INF/MANIFEST.JSON delete mode 100644 internal_filesystem/apps/com.example.btcticker/assets/bitcoin_price.py delete mode 100644 internal_filesystem/apps/com.example.btcticker/assets/echo.py delete mode 100644 internal_filesystem/apps/com.example.btcticker/res/mipmap-mdpi/icon_64x64.png delete mode 100644 internal_filesystem/apps/com.example.cputest/META-INF/MANIFEST.JSON delete mode 100644 internal_filesystem/apps/com.example.cputest/assets/cputest.py delete mode 100644 internal_filesystem/apps/com.example.cputest/res/mipmap-mdpi/icon_64x64.png delete mode 100644 internal_filesystem/apps/com.example.draw/META-INF/MANIFEST.JSON delete mode 100644 internal_filesystem/apps/com.example.draw/assets/draw.py delete mode 100644 internal_filesystem/apps/com.example.draw/res/mipmap-mdpi/icon_64x64.png delete mode 100644 internal_filesystem/apps/com.example.helloworld/META-INF/MANIFEST.JSON delete mode 100644 internal_filesystem/apps/com.example.helloworld/assets/hello.py delete mode 100644 internal_filesystem/apps/com.example.helloworld/res/mipmap-mdpi/icon_64x64.png delete mode 100644 internal_filesystem/apps/com.example.imutest/META-INF/MANIFEST.JSON delete mode 100644 internal_filesystem/apps/com.example.imutest/assets/imutest.py delete mode 100644 internal_filesystem/apps/com.example.imutest/res/mipmap-mdpi/icon_64x64.png delete mode 100644 internal_filesystem/apps/com.example.lvgltest/META-INF/MANIFEST.JSON delete mode 100644 internal_filesystem/apps/com.example.lvgltest/assets/lvgltest.py delete mode 100644 internal_filesystem/apps/com.example.lvgltest/res/mipmap-mdpi/icon_64x64.png diff --git a/internal_filesystem/apps/com.example.btcticker/META-INF/MANIFEST.JSON b/internal_filesystem/apps/com.example.btcticker/META-INF/MANIFEST.JSON deleted file mode 100644 index 9745982b..00000000 --- a/internal_filesystem/apps/com.example.btcticker/META-INF/MANIFEST.JSON +++ /dev/null @@ -1,13 +0,0 @@ -{ -"name": "BTC Ticker", -"publisher": "ACME Inc", -"short_description": "Bitcoin Price Ticker", -"long_description": "Uses a websocket to show the current price of Bitcoin in US Dollar.", -"icon_url": "http://demo.lnpiggy.com:2121/apps/com.example.btcticker_0.0.1.mpk_icon_64x64.png", -"download_url": "http://demo.lnpiggy.com:2121/apps/com.example.btcticker_0.0.1.mpk", -"fullname": "com.example.btcticker", -"version": "0.0.1", -"entrypoint": "assets/bitcoin_price.py", -"category": "money" -} - diff --git a/internal_filesystem/apps/com.example.btcticker/assets/bitcoin_price.py b/internal_filesystem/apps/com.example.btcticker/assets/bitcoin_price.py deleted file mode 100644 index cb8475cc..00000000 --- a/internal_filesystem/apps/com.example.btcticker/assets/bitcoin_price.py +++ /dev/null @@ -1,228 +0,0 @@ -import usocket -import ssl -import ubinascii -import ujson -import urandom -import uhashlib -import time - -def compute_accept_key(key): - GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - hash_obj = uhashlib.sha1(key + GUID) - return ubinascii.b2a_base64(hash_obj.digest())[:-1].decode() - -def ws_handshake(host, port, path="/"): - print(f"Connecting to {host}:{port}") - sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) - addr = usocket.getaddrinfo(host, port)[0][-1] - print(f"Resolved: {addr}") - sock.connect(addr) - - ssl_sock = ssl.wrap_socket(sock, server_hostname=host) - print("SSL handshake complete") - - key_bytes = bytearray() - for _ in range(4): - key_bytes.extend(urandom.getrandbits(32).to_bytes(4, 'big')) - key = ubinascii.b2a_base64(key_bytes)[:-1].decode() - expected_accept = compute_accept_key(key) - print(f"Key: {key}") - print(f"Expected Sec-WebSocket-Accept: {expected_accept}") - - handshake = ( - f"GET {path} HTTP/1.1\r\n" - f"Host: {host}\r\n" - f"Upgrade: websocket\r\n" - f"Connection: Upgrade\r\n" - f"Sec-WebSocket-Key: {key}\r\n" - f"Sec-WebSocket-Version: 13\r\n" - f"\r\n" - ) - print(f"Handshake:\n{handshake}") - ssl_sock.write(handshake.encode()) - - response = ssl_sock.readline() - print(f"Response: {response.decode()}") - if b"101" not in response: - ssl_sock.close() - raise ValueError(f"Handshake failed: {response.decode()}") - - accept_key = None - while True: - line = ssl_sock.readline() - print(f"Header: {line.decode()}") - if line == b"\r\n": - break - if line.lower().startswith(b"sec-websocket-accept:"): - accept_key = line.decode().split(":")[1].strip() - - if not accept_key: - ssl_sock.close() - raise ValueError("No Sec-WebSocket-Accept header received") - if accept_key != expected_accept: - ssl_sock.close() - raise ValueError(f"Invalid Sec-WebSocket-Accept: got {accept_key}, expected {expected_accept}") - - # Set non-blocking read - ssl_sock.setblocking(False) - return ssl_sock - -def ws_send_text(sock, message): - #print(f"Sending: {message}") - data = message.encode() - #print(f"Data: {data}") - length = len(data) - - frame = bytearray() - frame.append(0x81) # FIN=1, opcode=0x1 (text) - mask_bit = 0x80 - mask_key = bytearray(urandom.getrandbits(32).to_bytes(4, 'big')) - #print(f"Mask key: {mask_key}") - - if length <= 125: - frame.append(mask_bit | length) - elif length <= 65535: - frame.append(mask_bit | 126) - frame.extend(length.to_bytes(2, 'big')) - else: - frame.append(mask_bit | 127) - frame.extend(length.to_bytes(8, 'big')) - - frame.extend(mask_key) - masked_data = bytearray(data) - for i in range(len(data)): - masked_data[i] ^= mask_key[i % 4] - frame.extend(masked_data) - #print(f"Frame: {frame}") - sock.write(frame) - -def ws_read_frame(sock): - try: - data = sock.read(2) # Read header (FIN/opcode, length) - except OSError as e: - print(f"Read error: {e}") - return None - if not data: - print("Read: empty") - return None - #print(f"Raw header: {data}") - - if len(data) < 2: - print("Frame too short") - return None - - fin = (data[0] & 0x80) >> 7 - opcode = data[0] & 0x0F - masked = (data[1] & 0x80) >> 7 - payload_len = data[1] & 0x7F - #print(f"FIN: {fin} Opcode: {opcode} Masked: {masked} Len: {payload_len}") - - if payload_len == 126: - len_data = sock.read(2) - payload_len = int.from_bytes(len_data, 'big') - #print(f"Extended len: {payload_len}") - elif payload_len == 127: - len_data = sock.read(8) - payload_len = int.from_bytes(len_data, 'big') - #print(f"Extended len: {payload_len}") - - mask_key = None - if masked: - mask_key = sock.read(4) - #print(f"Mask key: {mask_key}") - - payload = sock.read(payload_len) - #print(f"Raw payload: {payload}") - if masked and mask_key: - payload = bytearray(payload) - for i in range(len(payload)): - payload[i] ^= mask_key[i % 4] - #print(f"Payload: {payload}") - - if opcode == 0x1: - return payload.decode() - elif opcode == 0x9: - print("Ping frame received") - return None - elif opcode == 0xA: - print("Pong frame received") - return None - elif opcode == 0x8: - print("Close frame received") - return None - else: - print(f"Unknown opcode: {opcode}") - return None - -def get_price(json_str): - try: - # Parse the JSON string into a Python dictionary - data = ujson.loads(json_str) - # Check if 'price' exists in the dictionary - if "price" in data: - price = data["price"] - return price # Return the price as a string - # If you need it as a float, use: return float(price) - else: - print("Error: 'price' field not found in JSON") - return None - except ValueError: - # Handle invalid JSON - print("Error: Invalid JSON string") - return None - except Exception as e: - # Handle any other unexpected errors - print(f"Error: An unexpected error occurred - {str(e)}") - return None - -def refresh_price(timer): - global summary, status - data = ws_read_frame(sock) - if data: - print(f"Response: {data}") - price = get_price(data) - if price: - print(f"Price: {price}") - summary += f"{price}\n" - status.set_text(summary) - -def janitor_cb(timer): - if lv.screen_active() != appscreen: - print("bitcoin_price.py backgrounded, cleaning up...") - janitor.delete() - sock.close() - get_price_timer.delete() - -appscreen = lv.screen_active() -janitor = lv.timer_create(janitor_cb, 500, None) - -status = lv.label(appscreen) -status.align(lv.ALIGN.TOP_LEFT, 5, 10) -status.set_style_text_color(lv.color_hex(0xFFFFFF), 0) -summary = "Bitcoin USD price\nfrom Coinbase's Websocket API:\n\n" -status.set_text(summary) - - -port = 443 -host = "ws-feed.exchange.coinbase.com" -path = "/" - -try: - sock = ws_handshake(host, port, path) - print("Reading a bit...") # echo.websocket.org sends a reply - for _ in range(3): - time.sleep(1) - data = ws_read_frame(sock) - if data: - print(f"Response: {data}") - break - print("Subscribing to price updates...") - ws_send_text(sock, ujson.dumps({"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker_batch"]})) - get_price_timer = lv.timer_create(refresh_price, 1000, None) -except Exception as e: - print(f"Error: {str(e)}") - try: - sock.close() - except: - pass - diff --git a/internal_filesystem/apps/com.example.btcticker/assets/echo.py b/internal_filesystem/apps/com.example.btcticker/assets/echo.py deleted file mode 100644 index c8eb4533..00000000 --- a/internal_filesystem/apps/com.example.btcticker/assets/echo.py +++ /dev/null @@ -1,24 +0,0 @@ -import ssl -import aiohttp -import asyncio - -sslctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) -sslctx.verify_mode = ssl.CERT_NONE -#sslctx.verify_mode = ssl.CERT_REQUIRED # doesn't work because OSError: (-30336, 'MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED') - -async def ws_test_echo(session): - async with session.ws_connect("wss://echo.websocket.events", ssl=sslctx) as ws: - await ws.send_str("hello world!\r\n") - async for msg in ws: - if msg.type == aiohttp.WSMsgType.TEXT: - print(msg.data) - if "close" in msg.data: - break - await ws.send_str("close\r\n") - await ws.close() - -async def main(): - async with aiohttp.ClientSession() as session: - await ws_test_echo(session) - -asyncio.run(main()) diff --git a/internal_filesystem/apps/com.example.btcticker/res/mipmap-mdpi/icon_64x64.png b/internal_filesystem/apps/com.example.btcticker/res/mipmap-mdpi/icon_64x64.png deleted file mode 100644 index bec40db57cc2f80ea7edcd8abc28b5a5590481c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#R*a!H8xH5o&dx6jYDPm-x z9=?`f1_lPkk|4ie28U-i(ij*R^*mi1Ln02Zo$f7kM1jL)<*VQKE5js(-?oXRPBr@E z5@;tF^a& zckjXH!pt8oB{XEdiEMdg%w)l!so;EW`gDDXW6Q3vE)#q2GUe%+rMpER8Bbt3q8-Kf z^Q=(Ik%pV04R+g2>N4(|Gu~inVf+x6{;2&KU)v&92XTYAtvk*!B|Kfq*5ISXkZESf zkh$k9!y)!shb!p}ujRT|q%kOcRAPLY%Q~loCICQ-yg2{> diff --git a/internal_filesystem/apps/com.example.cputest/META-INF/MANIFEST.JSON b/internal_filesystem/apps/com.example.cputest/META-INF/MANIFEST.JSON deleted file mode 100644 index 3b5f3670..00000000 --- a/internal_filesystem/apps/com.example.cputest/META-INF/MANIFEST.JSON +++ /dev/null @@ -1,13 +0,0 @@ -{ -"name": "Benchmark", -"publisher": "ACME Inc", -"short_description": "Testing the CPU speed", -"long_description": "Experimentally determines how many idle loops and sha256-hashing loops the CPU can perform per second.", -"icon_url": "http://demo.lnpiggy.com:2121/apps/com.example.cputest_0.0.1.mpk_icon_64x64.png", -"download_url": "http://demo.lnpiggy.com:2121/apps/com.example.cputest_0.0.1.mpk", -"fullname": "com.example.cputest", -"version": "0.0.1", -"entrypoint": "assets/cputest.py", -"category": "benchmarking" -} - diff --git a/internal_filesystem/apps/com.example.cputest/assets/cputest.py b/internal_filesystem/apps/com.example.cputest/assets/cputest.py deleted file mode 100644 index e319e21d..00000000 --- a/internal_filesystem/apps/com.example.cputest/assets/cputest.py +++ /dev/null @@ -1,118 +0,0 @@ -# Example results for ESP32-S3 with 8MB SPIRAM: -# -# Test Summary: -# Busy loop: 153018.20 iterations/second -# Busy loop with yield: 40303.37 iterations/second -# SHA-256 (1KB): 7357.60 iterations/second -# -# Adding the appscreen == lv.screen_active() test reduces the results to: -# Busy loop: 22289 iterations/second -# Busy loop with yield: 15923 iterations/second -# SHA-256 (1KB): 5269 iterations/second -# -# New way, with the tests in a thread, replacing appscreen == lv.screen_active() with keeprunning: -# Busy loop: 127801 iterations/second -# Busy loop with yield: 38394 iterations/second -# SHA-256 (1KB): 5012 iterations/second -# -# New way, but now with 10 in a loop and 10 second tests for more stability: -# Busy loop: 127000 iterations/second -# Busy loop with yield: 46000 iterations/second => this went up 25% -# SHA-256 (1KB): 5100 iterations/second -# -# When the nostr thing is hanging: -# Busy loop: 102000 iterations/second -# Busy loop with yield: 12000 iterations/second => this went down 70%! -# SHA-256 (1KB): 5100 iterations/second -# -# Results on desktop: -# Busy loop: 15 997 000 => 125x faster -# Busy loop with yield: 10 575 000 => 229x faster -# SHA-256 (1KB): 291 000 => 57x faster - - -import time -import hashlib -import os -import _thread - -import mpos.apps -import mpos.ui - -keeprunning = True -summary = "Running 3 CPU tests...\n\n" - -# Configuration -START_SPACING = 2000 # Wait for system to settle -TEST_DURATION = 10000 # Duration of each test (ms) -TEST_SPACING = 1000 # Wait between tests (ms) - -def stress_test_thread(): - DATA_SIZE = 1024 # 1KB of data for SHA-256 test - DATA = os.urandom(DATA_SIZE) # Generate 1KB of random data for SHA-256 - print("stress_test_thread running") - global summary, keeprunning - summary += "Waiting for system to settle...\n\n" - time.sleep_ms(START_SPACING) - summary += "Busy loop without yield: " - iterations = 0 - start_time = time.ticks_ms() - end_time = start_time + TEST_DURATION - while time.ticks_ms() < end_time and keeprunning: - iterations += 1 - duration_ms = time.ticks_diff(time.ticks_ms(), start_time) - iterations_per_second = (iterations / duration_ms) * 1000 - print(f"Busy loop test ran duration: {duration_ms}, average: {iterations_per_second:.2f} iterations/second") - summary += f"{iterations_per_second:.2f}/s\n" - # - time.sleep_ms(TEST_SPACING) - print("\nStarting busy loop with yield (sleep_ms(0)) stress test...") - summary += "Busy loop with yield: " - iterations = 0 - start_time = time.ticks_ms() - end_time = start_time + TEST_DURATION - while time.ticks_ms() < end_time and keeprunning: - for _ in range(10): - time.sleep_ms(0) # Yield to other tasks - iterations += 10 - duration_ms = time.ticks_diff(time.ticks_ms(), start_time) - iterations_per_second = (iterations / duration_ms) * 1000 - print(f"Busy loop with yield test completed: {iterations_per_second:.2f} iterations/second") - summary += f"{iterations_per_second:.2f}/s\n" - # - time.sleep_ms(TEST_SPACING) - print("\nStarting SHA-256 stress test (1KB data)...") - summary += "Busy loop with SHA-256 (1KB): " - iterations = 0 - start_time = time.ticks_ms() - end_time = start_time + TEST_DURATION - while time.ticks_ms() < end_time and keeprunning: - for _ in range(10): - hashlib.sha256(DATA).digest() # Compute SHA-256 on 1KB data - iterations += 10 - duration_ms = time.ticks_diff(time.ticks_ms(), start_time) - iterations_per_second = (iterations / duration_ms) * 1000 - print(f"SHA-256 test completed: {iterations_per_second:.2f} iterations/second") - summary += f" {iterations_per_second:.2f}/s\n" - summary += "\nAll tests completed." - - -def janitor_cb(timer): - global keeprunning - if lv.screen_active() != main_screen: - print("cputest.py backgrounded, cleaning up...") - janitor.delete() - keeprunning = False - update_status_timer.delete() - -main_screen = lv.obj() -janitor = lv.timer_create(janitor_cb, 1000, None) -update_status_timer = lv.timer_create(lambda timer: status.set_text(summary), 750, None) - -status = lv.label(main_screen) -status.align(lv.ALIGN.TOP_LEFT, 5, 10) -status.set_text(summary) -mpos.ui.load_screen(main_screen) - -_thread.stack_size(mpos.apps.good_stack_size()) -_thread.start_new_thread(stress_test_thread, ()) diff --git a/internal_filesystem/apps/com.example.cputest/res/mipmap-mdpi/icon_64x64.png b/internal_filesystem/apps/com.example.cputest/res/mipmap-mdpi/icon_64x64.png deleted file mode 100644 index d94b46205fe2d534171cbd37d1752b47f09031b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3038 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 b|M`EWgTe~DWM4f7E!b< diff --git a/internal_filesystem/apps/com.example.draw/META-INF/MANIFEST.JSON b/internal_filesystem/apps/com.example.draw/META-INF/MANIFEST.JSON deleted file mode 100644 index dee9499f..00000000 --- a/internal_filesystem/apps/com.example.draw/META-INF/MANIFEST.JSON +++ /dev/null @@ -1,13 +0,0 @@ -{ -"name": "Draw", -"publisher": "ACME Inc", -"short_description": "Simple drawing app", -"long_description": "Draw simple shapes on the screen.", -"icon_url": "http://demo.lnpiggy.com:2121/apps/com.example.draw_0.0.1.mpk_icon_64x64.png", -"download_url": "http://demo.lnpiggy.com:2121/apps/com.example.draw_0.0.1.mpk", -"fullname": "com.example.draw", -"version": "0.0.1", -"entrypoint": "assets/draw.py", -"category": "art" -} - diff --git a/internal_filesystem/apps/com.example.draw/assets/draw.py b/internal_filesystem/apps/com.example.draw/assets/draw.py deleted file mode 100644 index 5af77b4e..00000000 --- a/internal_filesystem/apps/com.example.draw/assets/draw.py +++ /dev/null @@ -1,88 +0,0 @@ -import mpos.ui - -indev_error_x = 160 -indev_error_y = 120 - -DARKPINK = lv.color_hex(0xEC048C) - -# doesnt work: -def draw_line(x, y): - global canvas - # Line drawing like this doesn't work: - layer = lv.layer_t() - canvas.init_layer(layer) - dsc = lv.draw_line_dsc_t() - dsc.color = DARKPINK - dsc.width = 4 - dsc.round_end = 1 - dsc.round_start = 1 - dsc.p1 = lv.point_precise_t() - dsc.p1.x = x - dsc.p1.y = y - dsc.p2 = lv.point_precise_t() - dsc.p2.x = 100 - dsc.p2.y = 200 - #layer.draw_line(dsc) doesnt exist! - lv.draw_line(layer,dsc) # doesnt do anything! - canvas.finish_layer(layer) - - -def touch_cb(event): - global canvas - event_code=event.get_code() - # Ignore: - # ======= - # 19: HIT_TEST - # COVER_CHECK - # DRAW_MAIN - # DRAW_MAIN_BEGIN - # DRAW_MAIN_END - # DRAW_POST - # DRAW_POST_BEGIN - # DRAW_POST_END - # GET_SELF_SIZE - if event_code not in [19,23,25,26,27,28,29,30,49]: - name = mpos.ui.get_event_name(event_code) - #print(f"lv_event_t: code={event_code}, name={name}") # target={event.get_target()}, user_data={event.get_user_data()}, param={event.get_param()} - if event_code == lv.EVENT.PRESSING: # this is probably enough - #if event_code in [lv.EVENT.PRESSED, lv.EVENT.PRESSING, lv.EVENT.LONG_PRESSED, lv.EVENT.LONG_PRESSED_REPEAT]: - x, y = mpos.ui.get_pointer_xy() - # drawing a point works: - #canvas.set_px(x,y,lv.color_black(),lv.OPA.COVER) - # - # drawing a square like this works: - #for dx in range(-5,5): - # for dy in range(-5,5): - # canvas.set_px(x+dx,y+dy,DARKPINK,lv.OPA.COVER) - # - # drawing a circle works: - radius = 7 # Set desired radius - if x == indev_error_x and y == indev_error_y: - radius = 25 # in case of indev error - square = radius * radius - for dx in range(-radius, radius): - for dy in range(-radius, radius): - if dx * dx + dy * dy <= square: - newx, newy = x + dx, y + dy - if 0 <= newx <= hor_res and 0 <= newy <= ver_res: # don't draw outside of canvas because that may crash - canvas.set_px(x + dx, y + dy, DARKPINK, lv.OPA.COVER) - - -main_screen = lv.obj() -canvas = lv.canvas(main_screen) - -disp = lv.display_get_default() -hor_res = disp.get_horizontal_resolution() -ver_res = disp.get_vertical_resolution() - -canvas.set_size(hor_res, ver_res) -canvas.set_style_bg_color(lv.color_white(), 0) - -buffer = bytearray(hor_res * ver_res * 4) - -canvas.set_buffer(buffer, hor_res, ver_res, lv.COLOR_FORMAT.NATIVE) -canvas.fill_bg(lv.color_white(), lv.OPA.COVER) -canvas.add_flag(lv.obj.FLAG.CLICKABLE) -canvas.add_event_cb(touch_cb, lv.EVENT.ALL, None) - -mpos.ui.load_screen(main_screen) diff --git a/internal_filesystem/apps/com.example.draw/res/mipmap-mdpi/icon_64x64.png b/internal_filesystem/apps/com.example.draw/res/mipmap-mdpi/icon_64x64.png deleted file mode 100644 index ac0877f0cdab13fbc0d4e280962633ffc2c5869c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6187 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 diff --git a/internal_filesystem/apps/com.example.helloworld/META-INF/MANIFEST.JSON b/internal_filesystem/apps/com.example.helloworld/META-INF/MANIFEST.JSON deleted file mode 100644 index 870b0f75..00000000 --- a/internal_filesystem/apps/com.example.helloworld/META-INF/MANIFEST.JSON +++ /dev/null @@ -1,12 +0,0 @@ -{ -"name": "HelloWorld", -"publisher": "ACME Inc", -"short_description": "Minimal app", -"long_description": "Demonstrates the simplest app.", -"icon_url": "http://demo.lnpiggy.com:2121/apps/com.example.helloworld_0.0.1.mpk_icon_64x64.png", -"download_url": "http://demo.lnpiggy.com:2121/apps/com.example.helloworld_0.0.1.mpk", -"fullname": "com.example.helloworld", -"version": "0.0.1", -"entrypoint": "assets/hello.py", -"category": "development" -} diff --git a/internal_filesystem/apps/com.example.helloworld/assets/hello.py b/internal_filesystem/apps/com.example.helloworld/assets/hello.py deleted file mode 100644 index 0fd76550..00000000 --- a/internal_filesystem/apps/com.example.helloworld/assets/hello.py +++ /dev/null @@ -1,25 +0,0 @@ -import mpos.ui - -def button_click(e): - print("Button clicked!") - -scr = lv.obj() - -# Create a button with a label -btn = lv.button(scr) -btn.align(lv.ALIGN.CENTER, 0, 0) -#btn.set_size(lv.pct(100),lv.pct(100)) -btn.add_event_cb(button_click,lv.EVENT.CLICKED,None) -label = lv.label(btn) -label.set_text('Hello World!') - -mpos.ui.load_screen(scr) - -# Optional janitor that cleans up when the app is backgrounded: -def janitor_cb(timer): - if lv.screen_active() != scr: - print("app backgrounded, cleaning up...") - janitor.delete() - # No cleanups to do, but in a real app, you might stop timers, deinitialize hardware devices you used, close network connections, etc. - -janitor = lv.timer_create(janitor_cb, 1000, None) diff --git a/internal_filesystem/apps/com.example.helloworld/res/mipmap-mdpi/icon_64x64.png b/internal_filesystem/apps/com.example.helloworld/res/mipmap-mdpi/icon_64x64.png deleted file mode 100644 index cac4a6f27a110dd0060adf12b8942a43ffd7a436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5378 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 diff --git a/internal_filesystem/apps/com.example.imutest/META-INF/MANIFEST.JSON b/internal_filesystem/apps/com.example.imutest/META-INF/MANIFEST.JSON deleted file mode 100644 index 2a2571b9..00000000 --- a/internal_filesystem/apps/com.example.imutest/META-INF/MANIFEST.JSON +++ /dev/null @@ -1,12 +0,0 @@ -{ -"name": "Accelero", -"publisher": "ACME Inc", -"short_description": "Test the Inertial Measurement Unit", -"long_description": "It is always good to make sure the accelerometer is working properly. How else can you measure acceleration and position?", -"icon_url": "http://demo.lnpiggy.com:2121/apps/com.example.imutest_0.0.1.mpk_icon_64x64.png", -"download_url": "http://demo.lnpiggy.com:2121/apps/com.example.imutest_0.0.1.mpk", -"fullname": "com.example.imutest", -"version": "0.0.1", -"entrypoint": "assets/imutest.py", -"category": "benchmarking" -} diff --git a/internal_filesystem/apps/com.example.imutest/assets/imutest.py b/internal_filesystem/apps/com.example.imutest/assets/imutest.py deleted file mode 100644 index 0112a17f..00000000 --- a/internal_filesystem/apps/com.example.imutest/assets/imutest.py +++ /dev/null @@ -1,86 +0,0 @@ -import mpos.ui - -# screens: - -main_screen = None - -def map_nonlinear(value: float) -> int: - # Preserve sign and work with absolute value - sign = 1 if value >= 0 else -1 - abs_value = abs(value) - # Apply non-linear transformation (square root) to absolute value - # Scale input range [0, 200] to [0, sqrt(200)] first - sqrt_value = (abs_value ** 0.5) - # Scale to output range [0, 100] - # Map [0, sqrt(200)] to [50, 100] for positive, [0, 50] for negative - max_sqrt = 200.0 ** 0.5 # Approx 14.142 - scaled = (sqrt_value / max_sqrt) * 50.0 # Scale to [0, 50] - return int(50.0 + (sign * scaled)) # Shift to [0, 100] - -def refresh(timer): - if have_imu: - #print(f"""{sensor.temperature=} {sensor.acceleration=} {sensor.gyro=}""") - temp = sensor.temperature - ax = sensor.acceleration[0] - axp = int((ax * 100 + 100)/2) - ay = sensor.acceleration[1] - ayp = int((ay * 100 + 100)/2) - az = sensor.acceleration[2] - azp = int((az * 100 + 100)/2) - # values between -200 and 200 => /4 becomes -50 and 50 => +50 becomes 0 and 100 - gx = map_nonlinear(sensor.gyro[0]) - gy = map_nonlinear(sensor.gyro[1]) - gz = map_nonlinear(sensor.gyro[2]) - else: - temp = 12.34 - axp = 25 - ayp = 50 - azp = 75 - gx = 45 - gy = 50 - gz = 55 - templabel.set_text(f"IMU chip temperature: {temp:.2f}°C") - sliderx.set_value(axp, lv.ANIM.OFF) - slidery.set_value(ayp, lv.ANIM.OFF) - sliderz.set_value(azp, lv.ANIM.OFF) - slidergx.set_value(gx, lv.ANIM.OFF) - slidergy.set_value(gy, lv.ANIM.OFF) - slidergz.set_value(gz, lv.ANIM.OFF) - - -def janitor_cb(timer): - if lv.screen_active() != main_screen: - print("imutest.py backgrounded, cleaning up...") - janitor.delete() - refresh_timer.delete() - -have_imu = True -try: - from machine import Pin, I2C - from qmi8658 import QMI8658 - import machine - sensor = QMI8658(I2C(0, sda=machine.Pin(48), scl=machine.Pin(47))) -except Exception as e: - print(f"Warning: could not initialize IMU hardware: {e}") - have_imu=False - - -main_screen = lv.obj() -templabel = lv.label(main_screen) -templabel.align(lv.ALIGN.TOP_MID, 0, 10) -sliderx = lv.slider(main_screen) -sliderx.align(lv.ALIGN.CENTER, 0, -60) -slidery = lv.slider(main_screen) -slidery.align(lv.ALIGN.CENTER, 0, -30) -sliderz = lv.slider(main_screen) -sliderz.align(lv.ALIGN.CENTER, 0, 0) -slidergx = lv.slider(main_screen) -slidergx.align(lv.ALIGN.CENTER, 0, 30) -slidergy = lv.slider(main_screen) -slidergy.align(lv.ALIGN.CENTER, 0, 60) -slidergz = lv.slider(main_screen) -slidergz.align(lv.ALIGN.CENTER, 0, 90) -mpos.ui.load_screen(main_screen) - -refresh_timer = lv.timer_create(refresh, 100, None) -janitor = lv.timer_create(janitor_cb, 500, None) diff --git a/internal_filesystem/apps/com.example.imutest/res/mipmap-mdpi/icon_64x64.png b/internal_filesystem/apps/com.example.imutest/res/mipmap-mdpi/icon_64x64.png deleted file mode 100644 index 334a8777e97a9fda7abcc7e6e6a197f1d52aa56e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6013 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 diff --git a/internal_filesystem/apps/com.example.lvgltest/META-INF/MANIFEST.JSON b/internal_filesystem/apps/com.example.lvgltest/META-INF/MANIFEST.JSON deleted file mode 100644 index 80d5c85b..00000000 --- a/internal_filesystem/apps/com.example.lvgltest/META-INF/MANIFEST.JSON +++ /dev/null @@ -1,13 +0,0 @@ -{ -"name": "Graphics", -"publisher": "ACME Inc", -"short_description": "Testing on-display spinner animations", -"long_description": "Stress testing multiple concurrent animations on the display by adding more and more spinners", -"icon_url": "http://demo.lnpiggy.com:2121/apps/com.example.lvgltest_0.0.1.mpk_icon_64x64.png", -"download_url": "http://demo.lnpiggy.com:2121/apps/com.example.lvgltest_0.0.1.mpk", -"fullname": "com.example.lvgltest", -"version": "0.0.1", -"entrypoint": "assets/lvgltest.py", -"category": "benchmarking" -} - diff --git a/internal_filesystem/apps/com.example.lvgltest/assets/lvgltest.py b/internal_filesystem/apps/com.example.lvgltest/assets/lvgltest.py deleted file mode 100644 index b7ba7001..00000000 --- a/internal_filesystem/apps/com.example.lvgltest/assets/lvgltest.py +++ /dev/null @@ -1,46 +0,0 @@ -import time -import random - -# Configuration -SPINNER_SIZE = 40 # Size of each spinner in pixels - -# Global variables -spinner_count = 0 -metrics_label = None - -def add_spinner(timer): - global spinner_count, metrics_label - try: - x = random.randint(0, appscreen.get_width() - SPINNER_SIZE) - y = random.randint(0, appscreen.get_height() - SPINNER_SIZE) - spinner_count += 1 - print(f"Placing spinner {spinner_count} with size {SPINNER_SIZE} at {x},{y}") - spinner = lv.spinner(appscreen) - spinner.set_size(SPINNER_SIZE, SPINNER_SIZE) - spinner.set_pos(x, y) - except Exception as e: - print(f"Failed to create spinner {spinner_count}: {e}") - return - - metrics_label.set_text(f"Spinners: {spinner_count}") - print(f"Finished adding spinner {spinner_count}") - - -def janitor_cb(timer): - if lv.screen_active() != appscreen: - print("lvgltest.py backgrounded, cleaning up...") - janitor.delete() - add_spinner_timer.delete() - -appscreen = lv.screen_active() -metrics_label = lv.label(appscreen) -metrics_label.set_style_text_color(lv.color_white(), 0) -metrics_label.set_style_bg_color(lv.color_black(), 0) -metrics_label.set_style_bg_opa(lv.OPA.COVER, 0) -metrics_label.set_pos(10, 10) -metrics_label.set_text("Spinners: 0") - -print("Starting LVGL spinner benchmark...") -janitor = lv.timer_create(janitor_cb, 400, None) -add_spinner_timer = lv.timer_create(add_spinner, 2000, None) - diff --git a/internal_filesystem/apps/com.example.lvgltest/res/mipmap-mdpi/icon_64x64.png b/internal_filesystem/apps/com.example.lvgltest/res/mipmap-mdpi/icon_64x64.png deleted file mode 100644 index bc18da5c7b07144d992773268db561b00eb60258..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6180 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 QFfcH9y85}Sb4q9e0L3o!WdHyG diff --git a/internal_filesystem/builtin/apps/com.micropythonos.osupdate/assets/osupdate.py b/internal_filesystem/builtin/apps/com.micropythonos.osupdate/assets/osupdate.py index 0e828fe5..78cb35de 100644 --- a/internal_filesystem/builtin/apps/com.micropythonos.osupdate/assets/osupdate.py +++ b/internal_filesystem/builtin/apps/com.micropythonos.osupdate/assets/osupdate.py @@ -39,12 +39,9 @@ class OSUpdate(Activity): if not network_connected: self.status_label.set_text("Error: WiFi is not connected.") - time.sleep(10) else: print("Showing update info...") self.show_update_info() - - print("osupdate.py finished") def onStop(self, screen): self.keep_running = False # this is checked by the update_with_lvgl thread