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