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