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