From a83742a4b8b0af209f930b6a26a19ae36eec011a Mon Sep 17 00:00:00 2001 From: Serge Bazanski <q3k@q3k.org> Date: Sun, 11 Jun 2023 18:48:57 +0200 Subject: [PATCH] sim: update for new badge payload --- sim/fakes/ctx.py | 27 +++++++++++++++---- sim/fakes/gc.py | 2 ++ sim/fakes/hardware.py | 29 +++++++++++++++++--- sim/fakes/time.py | 7 +++-- sim/run.py | 61 ++++++++++++++++++++++++------------------ sim/wasm/build.sh | 2 +- sim/wasm/ctx.wasm | Bin 684647 -> 684769 bytes 7 files changed, 90 insertions(+), 38 deletions(-) create mode 100644 sim/fakes/gc.py diff --git a/sim/fakes/ctx.py b/sim/fakes/ctx.py index f5606dbd73..d9f809ac4c 100644 --- a/sim/fakes/ctx.py +++ b/sim/fakes/ctx.py @@ -61,6 +61,17 @@ class Wasm: args = [float(a) for a in args] return self._i.exports.ctx_apply_transform(ctx, *args) + def ctx_text_width(self, ctx, text): + s = text.encode('utf-8') + slen = len(s) + 1 + p = self.malloc(slen) + mem = self._i.exports.memory.uint8_view(p) + mem[0:slen-1] = s + mem[slen-1] = 0 + res = self._i.exports.ctx_text_width(ctx, p) + self.free(p) + return res + _wasm = Wasm() class Ctx: @@ -84,6 +95,7 @@ class Ctx: self.text_align = 'start' self.text_baseline = 'alphabetic' + self.font_size = 10.0 def _get_fb(self): return _wasm._i.exports.memory.uint8_view(self._fb) @@ -92,7 +104,7 @@ class Ctx: _wasm.ctx_parse(self._ctx, text) def move_to(self, x, y): - self._emit(f"moveTo {x} {x}") + self._emit(f"moveTo {int(x)} {int(y)}") return self def rgb(self, r, g, b): @@ -102,17 +114,18 @@ class Ctx: r /= 255.0 g /= 255.0 b /= 255.0 - self._emit(f"rgb {r} {g} {b}") + self._emit(f"rgb {r:.3f} {g:.3f} {b:.3f}") return self def text(self, s): self._emit(f"textAlign {self.text_align}") self._emit(f"textBaseline {self.text_baseline}") + self._emit(f"fontSize {self.font_size}") self._emit(f"text \"{s}\"") return self def round_rectangle(self, x, y, width, height, radius): - self._emit(f"roundRectangle {x} {y} {width} {height} {radius}") + self._emit(f"roundRectangle {int(x)} {int(y)} {int(width)} {int(height)} {radius}") return self def rectangle(self, x, y, width, height): @@ -124,5 +137,9 @@ class Ctx: return self def arc(self, x, y , radius, arc_from, arc_to, direction): - self._emit(f"arc {x} {y} {radius} {arc_from} {arc_to} {direction}") - return self \ No newline at end of file + self._emit(f"arc {int(x)} {int(y)} {int(radius)} {arc_from:.4f} {arc_to:.4f} {1 if direction else 0}") + return self + + def text_width(self, text): + self._emit(f"fontSize {self.font_size}") + return _wasm.ctx_text_width(self._ctx, text) \ No newline at end of file diff --git a/sim/fakes/gc.py b/sim/fakes/gc.py new file mode 100644 index 0000000000..965169876c --- /dev/null +++ b/sim/fakes/gc.py @@ -0,0 +1,2 @@ +def mem_free(): + return 1337 diff --git a/sim/fakes/hardware.py b/sim/fakes/hardware.py index 3afd56558c..9221eb499f 100644 --- a/sim/fakes/hardware.py +++ b/sim/fakes/hardware.py @@ -347,15 +347,14 @@ def update_leds(): def set_global_volume_dB(a): pass - -def get_button(a): +def get_button_state(left): _sim.process_events() _sim.render_gui_lazy() state = _sim.buttons.state() - if a == 1: + if left == 1: sub = state[:3] - elif a == 0: + elif left == 0: sub = state[3:6] else: return 0 @@ -369,6 +368,28 @@ def get_button(a): return 0 +menu_button_left = 0 + +def menu_button_get(): + return get_button_state(menu_button_left) + +def application_button_get(): + return get_button_state(1 - menu_button_left) + +def left_button_get(): + return get_button_state(1) + +def right_button_get(): + return get_button_state(0) + +def menu_button_set_left(_broken): + global menu_button_left + menu_button_left = 1 + +def menu_button_get_left(): + return menu_button_left + + def get_captouch(a): _sim.process_events() _sim.render_gui_lazy() diff --git a/sim/fakes/time.py b/sim/fakes/time.py index 82a7ceeae8..62c6c33efa 100644 --- a/sim/fakes/time.py +++ b/sim/fakes/time.py @@ -1,8 +1,11 @@ +import importlib +_time = importlib.import_module('_time') def sleep_ms(ms): - import _time _time.sleep(ms * 0.001) def ticks_ms(): - import _time return int(_time.time() * 1000) + +def ticks_diff(a, b): + return a - b \ No newline at end of file diff --git a/sim/run.py b/sim/run.py index 28a5d14da9..978df24502 100644 --- a/sim/run.py +++ b/sim/run.py @@ -8,37 +8,46 @@ import sys projectpath = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) -class Hook: - """ - Hook implements a importlib.abc.Finder which overwrites resolution order to - more closely match the resolution order on the badge's Micropython - environment. - """ +import random +import pygame +import cmath +import wasmer +import wasmer_compiler_cranelift + + +class UnderscoreFinder(importlib.abc.MetaPathFinder): + def __init__(self, builtin): + self.builtin = builtin + def find_spec(self, fullname, path, target=None): - # Attempt to load from python_payload, then python_modules then - # sim/fakes. Afterwards, the normal import resolution order kicks in. - paths = [ - os.path.join(projectpath, 'python_payload', fullname+'.py'), - os.path.join(projectpath, 'python_payload', fullname), - os.path.join(projectpath, 'python_modules', fullname+'.py'), - os.path.join(projectpath, 'python_modules', fullname), - os.path.join(projectpath, 'sim', 'fakes', fullname+'.py'), - ] - for p in paths: - if os.path.exists(p): - root = os.path.split(p)[:-1] - return PathFinder.find_spec(fullname, root) - # As we provide our own micropython-compatible time library, allow - # resolving the original CPython time through _time if fullname == '_time': - return BuiltinImporter.find_spec('time') - return None + return self.builtin.find_spec('time', path, target) + if fullname in ['random']: + print(fullname, path, target) + return self.builtin.find_spec(fullname, path, target) -sys.meta_path.insert(0, Hook()) -sys.path_importer_cache.clear() + +#sys.meta_path.insert(0, Hook()) + +sys.path = [ + os.path.join(projectpath, 'python_payload'), + os.path.join(projectpath, 'sim', 'fakes'), +] + +builtin = BuiltinImporter() +pathfinder = PathFinder() +underscore = UnderscoreFinder(builtin) +sys.meta_path = [pathfinder, underscore] # Clean up whatever might have already been imported as `time`. import time +print('aaaa', time) importlib.reload(time) +print('bbbb', time) + +sys.path_importer_cache.clear() +importlib.invalidate_caches() + +sys.modules['time'] = time -import main +import main \ No newline at end of file diff --git a/sim/wasm/build.sh b/sim/wasm/build.sh index 4981d3a244..72ccec89d0 100755 --- a/sim/wasm/build.sh +++ b/sim/wasm/build.sh @@ -17,7 +17,7 @@ fi emcc ctx.c \ -I ../../usermodule/uctx/uctx/ \ -I ../../usermodule/uctx/fonts/ \ - -s EXPORTED_FUNCTIONS=_ctx_new_for_framebuffer,_ctx_parse,_ctx_apply_transform,_malloc,_free \ + -s EXPORTED_FUNCTIONS=_ctx_new_for_framebuffer,_ctx_parse,_ctx_apply_transform,_ctx_text_width,_malloc,_free \ --no-entry -flto -O3 \ -o ctx.wasm diff --git a/sim/wasm/ctx.wasm b/sim/wasm/ctx.wasm index 6e5300ff9f43b2f99051d670f5be14adbf4e08a5..75f892015ae30b6bdc3cc2189dad129e4c4b5d4f 100755 GIT binary patch delta 2625 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 D($D() delta 2520 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 -- GitLab