From ddca99c4ed0dd1814f45186c259f168e84eaafa6 Mon Sep 17 00:00:00 2001
From: Serge Bazanski <q3k@q3k.org>
Date: Thu, 3 Aug 2023 19:06:14 +0200
Subject: [PATCH] py: st4m -> st3m

---
 python_payload/apps/cap_touch_demo.py         |   8 +-
 python_payload/apps/demo_worms4.py            |  10 +-
 python_payload/apps/harmonic_demo.py          |   8 +-
 python_payload/apps/melodic_demo.py           |   8 +-
 python_payload/apps/nick.py                   |  10 +-
 python_payload/main.py                        |  16 +-
 python_payload/main_st4m.py                   | 275 ------------------
 python_payload/mypystubs/hardware.pyi         |   2 +-
 python_payload/st3m/__init__.py               |  11 +
 python_payload/{st4m => st3m}/application.py  |   6 +-
 python_payload/{st4m => st3m}/goose.py        |   2 +-
 python_payload/{st4m => st3m}/input.py        |   4 +-
 python_payload/{st4m => st3m}/logging.py      |   2 +-
 python_payload/{st4m => st3m}/property.py     |   0
 python_payload/{st4m => st3m}/reactor.py      |   8 +-
 python_payload/{st4m => st3m}/system.py       |   0
 python_payload/{st4m => st3m}/ui/__init__.py  |   0
 python_payload/{st4m => st3m}/ui/ctx.py       |   6 +-
 .../{st4m => st3m}/ui/elements/__init__.py    |   0
 .../{st4m => st3m}/ui/elements/menus.py       |  12 +-
 .../{st4m => st3m}/ui/elements/visuals.py     |   8 +-
 .../{st4m => st3m}/ui/interactions.py         |  10 +-
 python_payload/{st4m => st3m}/ui/menu.py      |  14 +-
 python_payload/{st4m => st3m}/ui/view.py      |   8 +-
 python_payload/{st4m => st3m}/utils.py        |   0
 python_payload/st4m/README.md                 |  24 --
 python_payload/st4m/__init__.py               |  11 -
 27 files changed, 82 insertions(+), 381 deletions(-)
 delete mode 100644 python_payload/main_st4m.py
 create mode 100644 python_payload/st3m/__init__.py
 rename python_payload/{st4m => st3m}/application.py (81%)
 rename python_payload/{st4m => st3m}/goose.py (99%)
 rename python_payload/{st4m => st3m}/input.py (99%)
 rename python_payload/{st4m => st3m}/logging.py (97%)
 rename python_payload/{st4m => st3m}/property.py (100%)
 rename python_payload/{st4m => st3m}/reactor.py (95%)
 rename python_payload/{st4m => st3m}/system.py (100%)
 rename python_payload/{st4m => st3m}/ui/__init__.py (100%)
 rename python_payload/{st4m => st3m}/ui/ctx.py (98%)
 rename python_payload/{st4m => st3m}/ui/elements/__init__.py (100%)
 rename python_payload/{st4m => st3m}/ui/elements/menus.py (92%)
 rename python_payload/{st4m => st3m}/ui/elements/visuals.py (96%)
 rename python_payload/{st4m => st3m}/ui/interactions.py (98%)
 rename python_payload/{st4m => st3m}/ui/menu.py (93%)
 rename python_payload/{st4m => st3m}/ui/view.py (97%)
 rename python_payload/{st4m => st3m}/utils.py (100%)
 delete mode 100644 python_payload/st4m/README.md
 delete mode 100644 python_payload/st4m/__init__.py

diff --git a/python_payload/apps/cap_touch_demo.py b/python_payload/apps/cap_touch_demo.py
index 1252fbae2e..a3dea8fa3c 100644
--- a/python_payload/apps/cap_touch_demo.py
+++ b/python_payload/apps/cap_touch_demo.py
@@ -1,7 +1,7 @@
-from st4m import application, logging
-from st4m.goose import List
-from st4m.ui.ctx import Ctx
-from st4m.input import InputState
+from st3m import application, logging
+from st3m.goose import List
+from st3m.ui.ctx import Ctx
+from st3m.input import InputState
 
 log = logging.Log(__name__, level=logging.INFO)
 log.info("import")
diff --git a/python_payload/apps/demo_worms4.py b/python_payload/apps/demo_worms4.py
index b0d9de8c66..f121b01d45 100644
--- a/python_payload/apps/demo_worms4.py
+++ b/python_payload/apps/demo_worms4.py
@@ -4,11 +4,11 @@ import time
 import math
 
 # flow3r imports
-from st4m import application
-from st4m import Ctx, InputState
-from st4m.property import BLUE, WHITE
-from st4m.goose import Optional
-from st4m.utils import xy_from_polar
+from st3m import application
+from st3m import Ctx, InputState
+from st3m.property import BLUE, WHITE
+from st3m.goose import Optional
+from st3m.utils import xy_from_polar
 
 
 tau = 2 * math.pi
diff --git a/python_payload/apps/harmonic_demo.py b/python_payload/apps/harmonic_demo.py
index 46398229f4..4f5c3ac541 100644
--- a/python_payload/apps/harmonic_demo.py
+++ b/python_payload/apps/harmonic_demo.py
@@ -3,9 +3,9 @@ import captouch
 import leds
 import hardware
 
-from st4m.ui.ctx import Ctx
-from st4m.goose import List
-from st4m.input import InputState
+from st3m.ui.ctx import Ctx
+from st3m.goose import List
+from st3m.input import InputState
 
 chords = [
     [-4, 0, 3, 8, 10],
@@ -16,7 +16,7 @@ chords = [
 ]
 
 
-from st4m.application import Application
+from st3m.application import Application
 
 
 class HarmonicApp(Application):
diff --git a/python_payload/apps/melodic_demo.py b/python_payload/apps/melodic_demo.py
index 78000e5dd3..5c3d2110ac 100644
--- a/python_payload/apps/melodic_demo.py
+++ b/python_payload/apps/melodic_demo.py
@@ -3,9 +3,9 @@ from hardware import *
 import captouch
 import leds
 
-from st4m.goose import List
-from st4m.input import InputState
-from st4m.ui.ctx import Ctx
+from st3m.goose import List
+from st3m.input import InputState
+from st3m.ui.ctx import Ctx
 
 octave = 0
 synths: List[tinysynth] = []
@@ -78,7 +78,7 @@ def foreground() -> None:
     adjust_playing_field_to_octave()
 
 
-from st4m.application import Application
+from st3m.application import Application
 
 
 # TODO(q3k): properly port this app
diff --git a/python_payload/apps/nick.py b/python_payload/apps/nick.py
index 085f6cdfb4..476fabc022 100644
--- a/python_payload/apps/nick.py
+++ b/python_payload/apps/nick.py
@@ -1,8 +1,8 @@
-from st4m.application import Application
-from st4m.property import PUSH_RED, GO_GREEN, BLACK
-from st4m.goose import Dict, Any
-from st4m.ui.ctx import Ctx
-from st4m.input import InputState
+from st3m.application import Application
+from st3m.property import PUSH_RED, GO_GREEN, BLACK
+from st3m.goose import Dict, Any
+from st3m.ui.ctx import Ctx
+from st3m.input import InputState
 import leds
 
 import json
diff --git a/python_payload/main.py b/python_payload/main.py
index b8c9d4de6e..44d5374854 100644
--- a/python_payload/main.py
+++ b/python_payload/main.py
@@ -2,23 +2,23 @@ import time, gc
 
 ts_start = time.time()
 
-from st4m import logging
+from st3m import logging
 
 log = logging.Log(__name__, level=logging.INFO)
 log.info(f"starting main")
 log.info(f"free memory: {gc.mem_free()}")
 
-import st4m
+import st3m
 
-from st4m.goose import Optional, List, ABCBase, abstractmethod
-from st4m.ui.view import View, ViewManager, ViewTransitionBlend
-from st4m.ui.menu import (
+from st3m.goose import Optional, List, ABCBase, abstractmethod
+from st3m.ui.view import View, ViewManager, ViewTransitionBlend
+from st3m.ui.menu import (
     MenuItemBack,
     MenuItemForeground,
     MenuItemNoop,
 )
 
-from st4m.ui.elements.menus import FlowerMenu, SimpleMenu, SunMenu
+from st3m.ui.elements.menus import FlowerMenu, SimpleMenu, SunMenu
 
 log.info("import apps done")
 log.info(f"free memory: {gc.mem_free()}")
@@ -26,7 +26,7 @@ ts_end = time.time()
 log.info(f"boot took {ts_end-ts_start} seconds")
 
 # TODO persistent settings
-from st4m.system import audio, captouch
+from st3m.system import audio, captouch
 
 log.info("calibrating captouch, reset volume")
 captouch.calibration_request()
@@ -95,7 +95,7 @@ menu_main = SunMenu(
 
 vm.push(menu_main)
 
-reactor = st4m.Reactor()
+reactor = st3m.Reactor()
 reactor.set_top(vm)
 # reactor.set_top(pr)
 reactor.run()
diff --git a/python_payload/main_st4m.py b/python_payload/main_st4m.py
deleted file mode 100644
index 437e8e2b02..0000000000
--- a/python_payload/main_st4m.py
+++ /dev/null
@@ -1,275 +0,0 @@
-"""
-Experimental/Research UI/UX framework (st4m).
-
-To run, rename this file to main.py.
-
-See st4m/README.md for more information.
-"""
-
-
-import st4m
-
-from st4m.goose import Optional, List, ABCBase, abstractmethod
-from st4m.ui.view import View, ViewManager, ViewTransitionBlend
-from st4m.ui.menu import (
-    MenuItem,
-    MenuController,
-    MenuItemBack,
-    MenuItemForeground,
-    MenuItemNoop,
-)
-from st4m import Responder, InputState, Ctx
-
-import math, hardware
-
-from st4m.ui.elements.menus import SunMenu, SimpleMenu
-
-vm = ViewManager(ViewTransitionBlend())
-
-menu_music = SimpleMenu(
-    [
-        MenuItemBack(),
-        MenuItemNoop("Harmonic"),
-        MenuItemNoop("Melodic"),
-        MenuItemNoop("TinySynth"),
-        MenuItemNoop("CrazySynth"),
-        MenuItemNoop("Sequencer"),
-    ],
-    vm,
-)
-
-menu_apps = SimpleMenu(
-    [
-        MenuItemBack(),
-        MenuItemNoop("captouch"),
-        MenuItemNoop("worms"),
-    ],
-    vm,
-)
-
-
-class USBIcon(Responder):
-    """
-    Found in the bargain bin at an Aldi Süd.
-    """
-
-    def draw(self, ctx: Ctx) -> None:
-        ctx.gray(1.0)
-        ctx.arc(-90, 0, 20, 0, 6.28, 0).fill()
-        ctx.line_width = 10.0
-        ctx.move_to(-90, 0).line_to(90, 0).stroke()
-        ctx.move_to(100, 0).line_to(70, 15).line_to(70, -15).line_to(100, 0).fill()
-        ctx.move_to(-50, 0).line_to(-10, -40).line_to(20, -40).stroke()
-        ctx.arc(20, -40, 15, 0, 6.28, 0).fill()
-        ctx.move_to(-30, 0).line_to(10, 40).line_to(40, 40).stroke()
-        ctx.rectangle(40 - 15, 40 - 15, 30, 30).fill()
-
-    def think(self, ins: InputState, delta_ms: int) -> None:
-        pass
-
-
-class REPLIcon(Responder):
-    def draw(self, ctx: Ctx) -> None:
-        ctx.gray(1.0)
-        ctx.line_width = 10.0
-        for i in range(3):
-            x = i * 40
-            ctx.move_to(-60 + x, -60).line_to(0 + x, 0).line_to(-60 + x, 60).stroke()
-
-    def think(self, ins: InputState, delta_ms: int) -> None:
-        pass
-
-
-class Sun(Responder):
-    """
-    A rotating sun widget.
-    """
-
-    def __init__(self) -> None:
-        self.x = 0.0
-        self.y = 0.0
-        self.size = 50.0
-        self.ts = 1.0
-
-    def think(self, ins: InputState, delta_ms: int) -> None:
-        self.ts += delta_ms
-        pass
-
-    def draw(self, ctx: Ctx) -> None:
-        nrays = 10
-        angle_per_ray = 6.28 / nrays
-        for i in range(nrays):
-            angle = i * angle_per_ray + self.ts / 4000
-            angle %= 3.14159 * 2
-
-            if angle > 2 and angle < 4:
-                continue
-
-            ctx.save()
-            ctx.rgb(0.5, 0.5, 0)
-            ctx.line_width = 30
-            ctx.translate(-120, 0).rotate(angle)
-            ctx.move_to(20, 0)
-            ctx.line_to(260, 0)
-            ctx.stroke()
-            ctx.restore()
-
-        ctx.save()
-        ctx.rgb(0.92, 0.89, 0)
-        ctx.translate(-120, 0)
-
-        ctx.arc(self.x, self.y, self.size, 0, 6.29, 0)
-        ctx.fill()
-        ctx.restore()
-
-
-class MainMenu(MenuController):
-    """
-    A circular menu with a rotating sun.
-    """
-
-    __slots__ = (
-        "_ts",
-        "_sun",
-    )
-
-    def __init__(self, items: List[MenuItem], vm: ViewManager) -> None:
-        self._ts = 0
-        self._sun = Sun()
-        super().__init__(items, vm)
-
-    def think(self, ins: InputState, delta_ms: int) -> None:
-        super().think(ins, delta_ms)
-        self._sun.think(ins, delta_ms)
-        self._ts += delta_ms
-
-    def _draw_text_angled(
-        self, ctx: Ctx, text: str, angle: float, activity: float
-    ) -> None:
-        size = lerp(20, 40, activity)
-        color = lerp(0, 1, activity)
-        if color < 0.01:
-            return
-
-        ctx.save()
-        ctx.translate(-120, 0).rotate(angle).translate(140, 0)
-        ctx.font_size = size
-        ctx.rgba(1.0, 1.0, 1.0, color).move_to(0, 0).text(text)
-        ctx.restore()
-
-    def draw(self, ctx: Ctx) -> None:
-        ctx.gray(0)
-        ctx.rectangle(-120, -120, 240, 240).fill()
-
-        self._sun.draw(ctx)
-
-        ctx.font_size = 40
-        ctx.text_align = ctx.CENTER
-        ctx.text_baseline = ctx.MIDDLE
-
-        angle_per_item = 0.4
-
-        current = self._scroll_controller.current_position()
-
-        for ix, item in enumerate(self._items):
-            rot = (ix - current) * angle_per_item
-            self._draw_text_angled(ctx, item.label(), rot, 1 - abs(rot))
-
-
-class SimpleMenu(MenuController):
-    """
-    A simple line-by-line menu.
-    """
-
-    def draw(self, ctx: Ctx) -> None:
-        ctx.gray(0)
-        ctx.rectangle(-120, -120, 240, 240).fill()
-
-        ctx.text_align = ctx.CENTER
-        ctx.text_baseline = ctx.MIDDLE
-
-        current = self._scroll_controller.current_position()
-
-        ctx.gray(1)
-        for ix, item in enumerate(self._items):
-            offs = (ix - current) * 30
-            size = lerp(30, 20, abs(offs / 20))
-            ctx.font_size = size
-            ctx.move_to(0, offs).text(item.label())
-
-
-menu_music = SimpleMenu(
-    [
-        MenuItemBack(),
-        MenuItemNoop("Harmonic"),
-        MenuItemNoop("Melodic"),
-        MenuItemNoop("TinySynth"),
-        MenuItemNoop("CrazySynth"),
-        MenuItemNoop("Sequencer"),
-    ],
-    vm,
-)
-
-menu_apps = SimpleMenu(
-    [
-        MenuItemBack(),
-        MenuItemNoop("captouch"),
-        MenuItemNoop("worms"),
-    ],
-    vm,
-)
-
-menu_main = SunMenu(
-    [
-        MenuItemForeground("Music", menu_music),
-        MenuItemForeground("Apps", menu_apps),
-        MenuItemNoop("Settings"),
-    ],
-    vm,
-)
-
-vm.push(menu_main)
-
-
-class Viewport(Responder):
-    def __init__(self, vm: ViewManager) -> None:
-        self.vm = vm
-        self.usb = USBIcon()
-        self.repl = REPLIcon()
-        self.visible: List[Responder] = []
-
-    def think(self, ins: InputState, delta_ms: int) -> None:
-        self.vm.think(ins, delta_ms)
-
-        self.visible = []
-        usb = hardware.usb_connected()
-        console = hardware.usb_console_active()
-        if not usb:
-            console = False
-        if usb:
-            self.visible.append(self.usb)
-        # if console:
-        #    self.visible.append(self.repl)
-
-        for v in self.visible:
-            v.think(ins, delta_ms)
-
-    def draw(self, ctx: Ctx) -> None:
-        self.vm.draw(ctx)
-
-        nicons = len(self.visible)
-        dist = 20
-        width = (nicons - 1) * dist
-        x0 = width / -2
-        for i, v in enumerate(self.visible):
-            x = x0 + i * dist
-            ctx.save()
-            ctx.translate(x, -100)
-            ctx.scale(0.1, 0.1)
-            v.draw(ctx)
-            ctx.restore()
-
-
-reactor = st4m.Reactor()
-reactor.set_top(Viewport(vm))
-reactor.run()
diff --git a/python_payload/mypystubs/hardware.pyi b/python_payload/mypystubs/hardware.pyi
index e6aab870e8..267e3628a7 100644
--- a/python_payload/mypystubs/hardware.pyi
+++ b/python_payload/mypystubs/hardware.pyi
@@ -1,6 +1,6 @@
 import time
 
-from st4m.ui.ctx import Ctx
+from st3m.ui.ctx import Ctx
 
 def freertos_sleep(ms: int) -> None: ...
 def get_ctx() -> Ctx: ...
diff --git a/python_payload/st3m/__init__.py b/python_payload/st3m/__init__.py
new file mode 100644
index 0000000000..d10e648325
--- /dev/null
+++ b/python_payload/st3m/__init__.py
@@ -0,0 +1,11 @@
+from st3m.reactor import Reactor, Responder
+from st3m.ui.ctx import Ctx
+from st3m.input import InputState, InputController
+
+__all__ = [
+    "Reactor",
+    "Responder",
+    "InputState",
+    "InputController",
+    "Ctx",
+]
diff --git a/python_payload/st4m/application.py b/python_payload/st3m/application.py
similarity index 81%
rename from python_payload/st4m/application.py
rename to python_payload/st3m/application.py
index 165ab5fccc..0ea4e0372b 100644
--- a/python_payload/st4m/application.py
+++ b/python_payload/st3m/application.py
@@ -1,6 +1,6 @@
-from st4m.ui.view import ViewWithInputState, ViewTransitionSwipeRight, ViewManager
-from st4m.input import InputState
-from st4m.goose import Optional
+from st3m.ui.view import ViewWithInputState, ViewTransitionSwipeRight, ViewManager
+from st3m.input import InputState
+from st3m.goose import Optional
 
 
 class Application(ViewWithInputState):
diff --git a/python_payload/st4m/goose.py b/python_payload/st3m/goose.py
similarity index 99%
rename from python_payload/st4m/goose.py
rename to python_payload/st3m/goose.py
index 8fb29609b4..979cba2e71 100644
--- a/python_payload/st4m/goose.py
+++ b/python_payload/st3m/goose.py
@@ -1,5 +1,5 @@
 """
-Goose implements Goose Typing (tm), a set of shims which allows the st4m
+Goose implements Goose Typing (tm), a set of shims which allows the st3m
 codebase to use both Python type annotations, Abstract Base Classes and run
 under Micropython.
 """
diff --git a/python_payload/st4m/input.py b/python_payload/st3m/input.py
similarity index 99%
rename from python_payload/st4m/input.py
rename to python_payload/st3m/input.py
index b85f918a76..6842b50839 100644
--- a/python_payload/st4m/input.py
+++ b/python_payload/st3m/input.py
@@ -1,5 +1,5 @@
-from st4m.goose import List, Optional, Enum, Tuple
-from st4m.ui.ctx import Ctx
+from st3m.goose import List, Optional, Enum, Tuple
+from st3m.ui.ctx import Ctx
 
 import hardware
 import captouch
diff --git a/python_payload/st4m/logging.py b/python_payload/st3m/logging.py
similarity index 97%
rename from python_payload/st4m/logging.py
rename to python_payload/st3m/logging.py
index a5e3764984..64fce19d93 100644
--- a/python_payload/st4m/logging.py
+++ b/python_payload/st3m/logging.py
@@ -1,6 +1,6 @@
 import sys
 import time
-from st4m.goose import Enum
+from st3m.goose import Enum
 
 
 class Level(Enum):
diff --git a/python_payload/st4m/property.py b/python_payload/st3m/property.py
similarity index 100%
rename from python_payload/st4m/property.py
rename to python_payload/st3m/property.py
diff --git a/python_payload/st4m/reactor.py b/python_payload/st3m/reactor.py
similarity index 95%
rename from python_payload/st4m/reactor.py
rename to python_payload/st3m/reactor.py
index 30f1e22436..0957f7f99d 100644
--- a/python_payload/st4m/reactor.py
+++ b/python_payload/st3m/reactor.py
@@ -1,6 +1,6 @@
-from st4m.goose import ABCBase, abstractmethod, List, Optional
-from st4m.input import InputState
-from st4m.ui.ctx import Ctx
+from st3m.goose import ABCBase, abstractmethod, List, Optional
+from st3m.input import InputState
+from st3m.ui.ctx import Ctx
 
 import time, hardware
 
@@ -50,7 +50,7 @@ class Responder(ABCBase):
 
 class Reactor:
     """
-    The Reactor is the main Micropython scheduler of the st4m system and any
+    The Reactor is the main Micropython scheduler of the st3m system and any
     running payloads.
 
     It will attempt to run a top Responder with a fixed tickrate a framerate
diff --git a/python_payload/st4m/system.py b/python_payload/st3m/system.py
similarity index 100%
rename from python_payload/st4m/system.py
rename to python_payload/st3m/system.py
diff --git a/python_payload/st4m/ui/__init__.py b/python_payload/st3m/ui/__init__.py
similarity index 100%
rename from python_payload/st4m/ui/__init__.py
rename to python_payload/st3m/ui/__init__.py
diff --git a/python_payload/st4m/ui/ctx.py b/python_payload/st3m/ui/ctx.py
similarity index 98%
rename from python_payload/st4m/ui/ctx.py
rename to python_payload/st3m/ui/ctx.py
index 7119f205d3..094e336084 100644
--- a/python_payload/st4m/ui/ctx.py
+++ b/python_payload/st3m/ui/ctx.py
@@ -1,14 +1,14 @@
-from st4m.goose import ABCBase, abstractmethod, List
+from st3m.goose import ABCBase, abstractmethod, List
 
 
 class Ctx(ABCBase):
     """
-    Ctx is the rendering/rasterization API used by st4m.
+    Ctx is the rendering/rasterization API used by st3m.
 
     It's a WebCanvas-style vector API, with an implicit pen which can be moved
     and can draw lines, arcs, text, etc.
 
-    In st4m, the Ctx object is backed by a drawlist generator. That is, any
+    In st3m, the Ctx object is backed by a drawlist generator. That is, any
     operation performed on the ctx object will cause an entry to be added to an
     in-memory draw list. Then, when the rasterizer is ready, it will rasterize
     said drawlist to pixels in a separate thread.
diff --git a/python_payload/st4m/ui/elements/__init__.py b/python_payload/st3m/ui/elements/__init__.py
similarity index 100%
rename from python_payload/st4m/ui/elements/__init__.py
rename to python_payload/st3m/ui/elements/__init__.py
diff --git a/python_payload/st4m/ui/elements/menus.py b/python_payload/st3m/ui/elements/menus.py
similarity index 92%
rename from python_payload/st4m/ui/elements/menus.py
rename to python_payload/st3m/ui/elements/menus.py
index 7afab42b61..69f3414daf 100644
--- a/python_payload/st4m/ui/elements/menus.py
+++ b/python_payload/st3m/ui/elements/menus.py
@@ -1,11 +1,11 @@
-from st4m.goose import Optional, List, ABCBase, abstractmethod
-from st4m.ui.view import ViewManager
-from st4m.ui.elements.visuals import Sun, GroupRing, FlowerIcon
-from st4m.ui.menu import MenuController, MenuItem
+from st3m.goose import Optional, List, ABCBase, abstractmethod
+from st3m.ui.view import ViewManager
+from st3m.ui.elements.visuals import Sun, GroupRing, FlowerIcon
+from st3m.ui.menu import MenuController, MenuItem
 
-from st4m import Ctx, InputState
+from st3m import Ctx, InputState
 
-from st4m.utils import lerp, tau
+from st3m.utils import lerp, tau
 import math
 
 
diff --git a/python_payload/st4m/ui/elements/visuals.py b/python_payload/st3m/ui/elements/visuals.py
similarity index 96%
rename from python_payload/st4m/ui/elements/visuals.py
rename to python_payload/st3m/ui/elements/visuals.py
index 64f68d045e..760801a864 100644
--- a/python_payload/st4m/ui/elements/visuals.py
+++ b/python_payload/st3m/ui/elements/visuals.py
@@ -1,7 +1,7 @@
-from st4m.utils import xy_from_polar, tau
-from st4m.property import PUSH_RED, GO_GREEN, BLACK
-from st4m.goose import List, Optional
-from st4m import Responder, Ctx, InputState
+from st3m.utils import xy_from_polar, tau
+from st3m.property import PUSH_RED, GO_GREEN, BLACK
+from st3m.goose import List, Optional
+from st3m import Responder, Ctx, InputState
 
 
 import random
diff --git a/python_payload/st4m/ui/interactions.py b/python_payload/st3m/ui/interactions.py
similarity index 98%
rename from python_payload/st4m/ui/interactions.py
rename to python_payload/st3m/ui/interactions.py
index 0bfcb74ef3..488d4648e6 100644
--- a/python_payload/st4m/ui/interactions.py
+++ b/python_payload/st3m/ui/interactions.py
@@ -1,11 +1,11 @@
-import st4m
+import st3m
 
-from st4m.input import InputState
-from st4m.ui.ctx import Ctx
-from st4m import Responder
+from st3m.input import InputState
+from st3m.ui.ctx import Ctx
+from st3m import Responder
 
 
-class ScrollController(st4m.Responder):
+class ScrollController(st3m.Responder):
     """
     ScrolLController is a controller for physically scrollable one-dimensional
     lists.
diff --git a/python_payload/st4m/ui/menu.py b/python_payload/st3m/ui/menu.py
similarity index 93%
rename from python_payload/st4m/ui/menu.py
rename to python_payload/st3m/ui/menu.py
index e076dedd52..329e90e55b 100644
--- a/python_payload/st4m/ui/menu.py
+++ b/python_payload/st3m/ui/menu.py
@@ -1,17 +1,17 @@
-import st4m
+import st3m
 
-from st4m import Responder
-from st4m.goose import ABCBase, abstractmethod, List, Optional
-from st4m.input import InputState, InputController
-from st4m.ui.view import (
+from st3m import Responder
+from st3m.goose import ABCBase, abstractmethod, List, Optional
+from st3m.input import InputState, InputController
+from st3m.ui.view import (
     ViewWithInputState,
     View,
     ViewManager,
     ViewTransitionSwipeLeft,
     ViewTransitionSwipeRight,
 )
-from st4m.ui.interactions import ScrollController
-from st4m.ui.ctx import Ctx
+from st3m.ui.interactions import ScrollController
+from st3m.ui.ctx import Ctx
 
 
 class MenuItem(ABCBase):
diff --git a/python_payload/st4m/ui/view.py b/python_payload/st3m/ui/view.py
similarity index 97%
rename from python_payload/st4m/ui/view.py
rename to python_payload/st3m/ui/view.py
index da19488744..752f9d63bc 100644
--- a/python_payload/st4m/ui/view.py
+++ b/python_payload/st3m/ui/view.py
@@ -1,7 +1,7 @@
-from st4m.reactor import Responder
-from st4m.goose import ABCBase, abstractmethod, Optional, List
-from st4m.input import InputState, InputController
-from st4m.ui.ctx import Ctx
+from st3m.reactor import Responder
+from st3m.goose import ABCBase, abstractmethod, Optional, List
+from st3m.input import InputState, InputController
+from st3m.ui.ctx import Ctx
 
 
 class View(Responder):
diff --git a/python_payload/st4m/utils.py b/python_payload/st3m/utils.py
similarity index 100%
rename from python_payload/st4m/utils.py
rename to python_payload/st3m/utils.py
diff --git a/python_payload/st4m/README.md b/python_payload/st4m/README.md
deleted file mode 100644
index f1aafcbdb4..0000000000
--- a/python_payload/st4m/README.md
+++ /dev/null
@@ -1,24 +0,0 @@
-st4m
-====
-
-Experimental, heavily-typed flow3r UI/UX framework.
-
-Proof of concept of:
- 1. Strongly typed Python (using MyPy) which is also used as docs.
- 2. A deep class hierarchy that is still performant enough.
- 3. Pretty UX.
-
-Does not implement application lifecycle, but that could be built upon
-View/ViewWithInput.
-
-Should be trickle-merged into st3m.
-
-Typechecking
-------------
-
-    MYPYPATH=$(pwd)/python_payload/mypystubs mypy python_payload/main_st4m.py --strict
-
-Running
--------
-
-Move `main_st4m.py` to `main.py` then either run on badge or in simulator.
diff --git a/python_payload/st4m/__init__.py b/python_payload/st4m/__init__.py
deleted file mode 100644
index 2aaabd2b50..0000000000
--- a/python_payload/st4m/__init__.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from st4m.reactor import Reactor, Responder
-from st4m.ui.ctx import Ctx
-from st4m.input import InputState, InputController
-
-__all__ = [
-    "Reactor",
-    "Responder",
-    "InputState",
-    "InputController",
-    "Ctx",
-]
-- 
GitLab