From c6467bf0877476a6025d2519009d95143b0b0c27 Mon Sep 17 00:00:00 2001
From: iggy <iggy@muc.ccc.de>
Date: Thu, 8 Jun 2023 12:30:43 +0200
Subject: [PATCH] py: major code restructre, now we have 'st3m/' (think lib)
 and 'apps/' (also some mock imports for the sim)

---
 python_payload/apps/__init__.py               |  0
 python_payload/{ => apps}/cap_touch_demo.py   |  7 +++--
 python_payload/apps/demo_mandelbrot.py        | 31 +++++++++++++++++++
 python_payload/{ => apps}/demo_sparabo.py     |  8 ++---
 python_payload/{ => apps}/demo_worms.py       |  5 +--
 python_payload/apps/flow3r/__init__.py        |  0
 .../{ => apps/flow3r}/menu_settings.py        |  8 ++---
 .../{ => apps/flow3r}/menu_tinysynth.py       |  8 ++---
 python_payload/apps/flow3roids.py             | 22 +++++++++++++
 python_payload/{ => apps}/harmonic_demo.py    |  2 +-
 python_payload/{ => apps}/melodic_demo.py     |  2 +-
 python_payload/demo_menu.py                   | 15 +++------
 python_payload/main.py                        |  5 +++
 python_payload/st3m/__init__.py               |  0
 python_payload/{ => st3m}/application.py      |  4 +--
 python_payload/{ => st3m}/control.py          | 10 ++++--
 python_payload/{ => st3m}/event.py            |  0
 python_payload/{ => st3m}/menu.py             |  7 +++--
 python_payload/st3m/system/__init__.py        | 30 ++++++++++++++++++
 python_payload/{ => st3m}/ui.py               |  0
 python_payload/{ => st3m}/utils.py            |  2 +-
 21 files changed, 119 insertions(+), 47 deletions(-)
 create mode 100644 python_payload/apps/__init__.py
 rename python_payload/{ => apps}/cap_touch_demo.py (92%)
 create mode 100644 python_payload/apps/demo_mandelbrot.py
 rename python_payload/{ => apps}/demo_sparabo.py (94%)
 rename python_payload/{ => apps}/demo_worms.py (98%)
 create mode 100644 python_payload/apps/flow3r/__init__.py
 rename python_payload/{ => apps/flow3r}/menu_settings.py (97%)
 rename python_payload/{ => apps/flow3r}/menu_tinysynth.py (94%)
 create mode 100644 python_payload/apps/flow3roids.py
 rename python_payload/{ => apps}/harmonic_demo.py (97%)
 rename python_payload/{ => apps}/melodic_demo.py (97%)
 create mode 100644 python_payload/st3m/__init__.py
 rename python_payload/{ => st3m}/application.py (99%)
 rename python_payload/{ => st3m}/control.py (96%)
 rename python_payload/{ => st3m}/event.py (100%)
 rename python_payload/{ => st3m}/menu.py (99%)
 create mode 100644 python_payload/st3m/system/__init__.py
 rename python_payload/{ => st3m}/ui.py (100%)
 rename python_payload/{ => st3m}/utils.py (96%)

diff --git a/python_payload/apps/__init__.py b/python_payload/apps/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/python_payload/cap_touch_demo.py b/python_payload/apps/cap_touch_demo.py
similarity index 92%
rename from python_payload/cap_touch_demo.py
rename to python_payload/apps/cap_touch_demo.py
index 3bbac30b5e..85fb4bfd2c 100644
--- a/python_payload/cap_touch_demo.py
+++ b/python_payload/apps/cap_touch_demo.py
@@ -1,9 +1,10 @@
-import hardware
-import utils
 import cmath
 import math
 import time
 
+import hardware
+from st3m import utils
+
 ctx = hardware.get_ctx()
 
 def init():
@@ -29,7 +30,7 @@ def foreground():
     pass
 
 
-from application import Application
+from st3m.application import Application
 
 app = Application("cap touch")
 app.main_foreground = run
diff --git a/python_payload/apps/demo_mandelbrot.py b/python_payload/apps/demo_mandelbrot.py
new file mode 100644
index 0000000000..1528d7aab3
--- /dev/null
+++ b/python_payload/apps/demo_mandelbrot.py
@@ -0,0 +1,31 @@
+from application import Application
+import ui
+
+class MandelbrotApp(Application):
+    def on_init(self):
+        pass
+
+    def on_foreground(self):
+        print("on foreground")
+        ctx = self.ui.ctx
+
+        #center the text horizontally and vertically
+        ctx.text_align = ctx.CENTER
+        ctx.text_baseline = ctx.MIDDLE
+
+        #ctx.rgb() expects individual values for the channels, so unpack a list/tuple with *
+        #operations on ctx can be chained
+        #create a blue background
+        ctx.rgb(*ui.RED).rectangle(-ui.WIDTH/2,-ui.HEIGHT/2,ui.WIDTH,ui.HEIGHT).fill()
+
+        #Write some text
+        ctx.move_to(0,0).rgb(*ui.WHITE).text("Mandelbrot")
+
+    def main_forground():
+        
+        for x in range(-240,240):
+            for y in range(-240,240):
+                
+
+app=MandelbrotApp("Mandelbrot")
+app.run()
\ No newline at end of file
diff --git a/python_payload/demo_sparabo.py b/python_payload/apps/demo_sparabo.py
similarity index 94%
rename from python_payload/demo_sparabo.py
rename to python_payload/apps/demo_sparabo.py
index f22a12a6aa..e4cf06b0a9 100644
--- a/python_payload/demo_sparabo.py
+++ b/python_payload/apps/demo_sparabo.py
@@ -2,13 +2,9 @@
 import math
 
 #badge23
-import event
-import hardware
+from st3m import event,application,ui
+from st3m.system import hardware,audio
 from synth import tinysynth
-import application
-import ui
-
-import audio
 
 popcorn = [9,7,9,5,0,5,-3,999]
 
diff --git a/python_payload/demo_worms.py b/python_payload/apps/demo_worms.py
similarity index 98%
rename from python_payload/demo_worms.py
rename to python_payload/apps/demo_worms.py
index b1a2c4cf25..d45ed1d552 100644
--- a/python_payload/demo_worms.py
+++ b/python_payload/apps/demo_worms.py
@@ -4,10 +4,7 @@ import time
 import math
 
 #flow3r imports
-import event
-import application
-import ui
-
+from st3m import event,application,ui
 
 # Subclass Application
 class AppWorms(application.Application):
diff --git a/python_payload/apps/flow3r/__init__.py b/python_payload/apps/flow3r/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/python_payload/menu_settings.py b/python_payload/apps/flow3r/menu_settings.py
similarity index 97%
rename from python_payload/menu_settings.py
rename to python_payload/apps/flow3r/menu_settings.py
index aa74f8ddac..5436d933d5 100644
--- a/python_payload/menu_settings.py
+++ b/python_payload/apps/flow3r/menu_settings.py
@@ -1,9 +1,5 @@
-import menu
-import event
-import audio
-import control
-import ui
-import hardware
+from st3m import menu,event,control,ui
+from st3m.system import audio,hardware
 
 
 ui_input = ui.Icon("")
diff --git a/python_payload/menu_tinysynth.py b/python_payload/apps/flow3r/menu_tinysynth.py
similarity index 94%
rename from python_payload/menu_tinysynth.py
rename to python_payload/apps/flow3r/menu_tinysynth.py
index de60b01357..70c67a3a82 100644
--- a/python_payload/menu_tinysynth.py
+++ b/python_payload/apps/flow3r/menu_tinysynth.py
@@ -1,11 +1,7 @@
 from synth import tinysynth
 
-import menu
-import event
-import control
-import ui
-import hardware
-import audio
+from st3m import menu,event,control,ui
+from st3m.system import hardware,audio
 
 synth = tinysynth(440,0)
 
diff --git a/python_payload/apps/flow3roids.py b/python_payload/apps/flow3roids.py
new file mode 100644
index 0000000000..2cd1398735
--- /dev/null
+++ b/python_payload/apps/flow3roids.py
@@ -0,0 +1,22 @@
+from application import SimpleApplication
+
+app = SimpleApplication("flow3rdroids")
+
+def on_init():
+    ship_position = complex(0,0)
+    ship_direction = complex(0,0)
+
+def on_tick():
+    if abs(ship_position.real)>240: ship_position.real*=-1
+    if abs(ship_position.imag)>240: ship_position.imag*=-1
+    
+    ship_position += ship_direction
+
+def on_draw():
+    ui.Pointer(x=ship_position.imag,y=ship_position.real)
+
+def on_scroll_step(direction):
+    #TODO: ship_direction += direction * angle
+
+def def on_enter():
+    #TODO:ship_direction += speed
diff --git a/python_payload/harmonic_demo.py b/python_payload/apps/harmonic_demo.py
similarity index 97%
rename from python_payload/harmonic_demo.py
rename to python_payload/apps/harmonic_demo.py
index 372c6e5016..e211bd9265 100644
--- a/python_payload/harmonic_demo.py
+++ b/python_payload/apps/harmonic_demo.py
@@ -59,7 +59,7 @@ def foreground():
     chord_index = -1
     set_chord(tmp)
 
-from application import Application
+from st3m.application import Application
 class HarmonicApp(Application):
     def on_init(self):
         init()
diff --git a/python_payload/melodic_demo.py b/python_payload/apps/melodic_demo.py
similarity index 97%
rename from python_payload/melodic_demo.py
rename to python_payload/apps/melodic_demo.py
index 06878ead5d..6460bb623f 100644
--- a/python_payload/melodic_demo.py
+++ b/python_payload/apps/melodic_demo.py
@@ -66,7 +66,7 @@ def init():
 def foreground():
     adjust_playing_field_to_octave()
 
-from application import Application
+from st3m.application import Application
 
 class MelodicApp(Application):
     def on_init(self):
diff --git a/python_payload/demo_menu.py b/python_payload/demo_menu.py
index d247069e40..6e92a9f126 100644
--- a/python_payload/demo_menu.py
+++ b/python_payload/demo_menu.py
@@ -1,19 +1,12 @@
-import menu
-import event
-import hardware
-import control
-import audio
-import application
+from st3m import menu,event,control,application
 
-import demo_worms, cap_touch_demo
-import demo_sparabo, melodic_demo, harmonic_demo
-import menu_settings,menu_tinysynth
+from apps import demo_worms, cap_touch_demo
+from apps import demo_sparabo, melodic_demo, harmonic_demo
+from apps.flow3r import menu_settings,menu_tinysynth
 
 
 import time
 
-hardware.captouch_autocalib()
-audio.set_volume_dB(0)
 
 menu_main = menu.Menu("flow3r",has_back=False)
 menu_badge = menu.Menu("badge")
diff --git a/python_payload/main.py b/python_payload/main.py
index 4371fafc77..a89d95269a 100644
--- a/python_payload/main.py
+++ b/python_payload/main.py
@@ -1 +1,6 @@
+from st3m.system import hardware,audio
+
 import demo_menu
+
+hardware.captouch_autocalib()
+audio.set_volume_dB(0)
\ No newline at end of file
diff --git a/python_payload/st3m/__init__.py b/python_payload/st3m/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/python_payload/application.py b/python_payload/st3m/application.py
similarity index 99%
rename from python_payload/application.py
rename to python_payload/st3m/application.py
index 9751a9a7f3..23fe9f9a41 100644
--- a/python_payload/application.py
+++ b/python_payload/st3m/application.py
@@ -1,6 +1,4 @@
-import ui
-import event
-import menu
+from . import ui,event,menu
 
 STATE_OFF = 0
 STATE_INIT = 10
diff --git a/python_payload/control.py b/python_payload/st3m/control.py
similarity index 96%
rename from python_payload/control.py
rename to python_payload/st3m/control.py
index c1fabf6be6..fe3febc9a6 100644
--- a/python_payload/control.py
+++ b/python_payload/st3m/control.py
@@ -1,4 +1,4 @@
-import ui
+from . import ui
 
 class Control():
     def __init__(self,name, default=0, on_set=None, on_get=None, on_mod=None):
@@ -119,4 +119,10 @@ class ControlSlide(ControlFloat):
         if z<0: #Release
             if self.do_reset:
                 self.set_value(self._saved_value)
-        self.draw()
\ No newline at end of file
+        self.draw()
+
+class ControlString(Control):
+    pass
+
+class ControlTextField():
+    pass
\ No newline at end of file
diff --git a/python_payload/event.py b/python_payload/st3m/event.py
similarity index 100%
rename from python_payload/event.py
rename to python_payload/st3m/event.py
diff --git a/python_payload/menu.py b/python_payload/st3m/menu.py
similarity index 99%
rename from python_payload/menu.py
rename to python_payload/st3m/menu.py
index 27319bea5e..31d7f762ae 100644
--- a/python_payload/menu.py
+++ b/python_payload/st3m/menu.py
@@ -1,8 +1,9 @@
-import ui
-import time
+from . import ui,event
 import hardware
+
+
+import time
 import math
-import event
 
 menu_stack = []
 active_menu = None
diff --git a/python_payload/st3m/system/__init__.py b/python_payload/st3m/system/__init__.py
new file mode 100644
index 0000000000..93c01cec08
--- /dev/null
+++ b/python_payload/st3m/system/__init__.py
@@ -0,0 +1,30 @@
+import hardware as _hardware
+
+class NamedObject():
+    def __init__(self,name="foo"):
+        self.__name = name
+    
+    def __repr__(self):
+        return self.__name
+
+class MockObject(NamedObject):
+    
+    def __getattr__(self,attr):
+        attr_name = "{}.{}".format(str(self),attr)
+        print ("mock attr", attr_name)
+        return MockObject(attr_name)
+
+    def __call__(self,*args,**kwargs):
+        call_name = "{}({}{})".format(str(self),args,kwargs)
+        print ("mock call",call_name)
+        return MockObject(call_name)
+
+
+try:
+    import audio as _audio
+except ModuleNotFoundError:
+    print("no real audio, using mock module")
+    _audio = MockObject("audio")
+
+hardware = _hardware
+audio = _audio
\ No newline at end of file
diff --git a/python_payload/ui.py b/python_payload/st3m/ui.py
similarity index 100%
rename from python_payload/ui.py
rename to python_payload/st3m/ui.py
diff --git a/python_payload/utils.py b/python_payload/st3m/utils.py
similarity index 96%
rename from python_payload/utils.py
rename to python_payload/st3m/utils.py
index 060d754b65..0be418b9e6 100644
--- a/python_payload/utils.py
+++ b/python_payload/st3m/utils.py
@@ -1,6 +1,6 @@
 import time
 from hardware import *
-import audio
+from st3m.system import audio
 
 RED = 0b1111100000000000
 GREEN = 0b0000011111100000
-- 
GitLab