Skip to content
Snippets Groups Projects
Commit cdb38cd9 authored by iggy's avatar iggy
Browse files

py: logging, bugfixes

parent b5d26b81
No related branches found
No related tags found
No related merge requests found
...@@ -72,7 +72,7 @@ class AppWorms(application.Application): ...@@ -72,7 +72,7 @@ class AppWorms(application.Application):
self.last_render = now self.last_render = now
def handle_input(self,data): def handle_input(self,data):
worms = app.worms worms = self.worms
worms.append(Worm(data.get("index",0)*2*math.pi/10+math.pi )) worms.append(Worm(data.get("index",0)*2*math.pi/10+math.pi ))
if len(worms)>10: if len(worms)>10:
worms.pop(0) worms.pop(0)
......
from st3m.application import Application,menu from st3m import logging
log = logging.Log(__name__,level=logging.INFO)
log.info(f"running {__name__}")
from st3m.application import Application
log.info(f"import app")
from . import menu_main from . import menu_main
log.info(f"import menu")
class myApp(Application): class myApp(Application):
def on_init(self): def on_init(self):
self.menu = menu_main.get_menu() self.menu = menu_main.get_menu()
def on_foreground(self): def on_foreground(self):
menu.set_active_menu(self.menu) self.menu.start()
app=myApp("flow3r") app=myApp("flow3r", exit_on_menu_enter=False)
...@@ -13,7 +13,7 @@ def get_menu(): ...@@ -13,7 +13,7 @@ def get_menu():
menu_apps = menu.Menu("apps") menu_apps = menu.Menu("apps")
menu_music = menu.Menu("music") menu_music = menu.Menu("music")
#Skipping for mem constraints
#for app_module in [demo_sparabo,melodic_demo,harmonic_demo]: #for app_module in [demo_sparabo,melodic_demo,harmonic_demo]:
# menu_music.add(menu.MenuItemApp(app_module.app)) # menu_music.add(menu.MenuItemApp(app_module.app))
......
from st3m.system import hardware,audio import gc,time
from st3m import logging
log = logging.Log(__name__,level=logging.INFO)
log.info(f"starting main")
from st3m import control,application,ui,menu
gc.collect()
time.sleep_ms(100)
log.info(f"free memory: {gc.mem_free()}")
from apps import flow3r from apps import flow3r
log.info(f"free memory: {gc.mem_free()}")
log.info("import apps done")
gc.collect()
#TODO persistent settings #TODO persistent settings
from st3m.system import hardware,audio
log.info("calibrating captouch, reset volume")
hardware.captouch_autocalib() hardware.captouch_autocalib()
audio.set_volume_dB(0) audio.set_volume_dB(0)
#Start default app #Start default app
flow3r.app.run() default_app = flow3r.app
\ No newline at end of file
#log.info(f"running default app '{default_app.title}'")
default_app.run()
\ No newline at end of file
from st3m import logging
log = logging.Log(__name__,level=logging.INFO)
log.info("import")
from . import ui,event,menu from . import ui,event,menu
STATE_OFF = 0 STATE_OFF = 0
...@@ -6,9 +9,10 @@ STATE_BACKGROUND = 200 ...@@ -6,9 +9,10 @@ STATE_BACKGROUND = 200
STATE_FOREGROUND = 300 STATE_FOREGROUND = 300
STATE_ERROR = 500 STATE_ERROR = 500
log.info("setting up application")
class Application(): class Application():
def __init__(self,title="badge23 app", author="someone@earth"): def __init__(self,title="badge23 app", author="someone@earth", exit_on_menu_enter=True):
log.info(f"__init__ app '{title}'")
self.title = title self.title = title
self.author = author self.author = author
self.state = STATE_OFF self.state = STATE_OFF
...@@ -20,7 +24,7 @@ class Application(): ...@@ -20,7 +24,7 @@ class Application():
self.icon = ui.Icon(label=self.title, size=100) self.icon = ui.Icon(label=self.title, size=100)
self.engine = event.the_engine self.engine = event.the_engine
self.menu = None self.menu = None
if exit_on_menu_enter:
self.add_event(event.Event( self.add_event(event.Event(
name="exit", name="exit",
action=self.exit, action=self.exit,
...@@ -30,11 +34,9 @@ class Application(): ...@@ -30,11 +34,9 @@ class Application():
def __repr__(self): def __repr__(self):
return "App "+self.title return "App "+self.title
def init(self): def init(self):
print("INIT") log.info(f"init app '{self.title}'")
self.state = STATE_INIT self.state = STATE_INIT
print("before on_init")
self.on_init() self.on_init()
print("after on_init")
if self.has_background: if self.has_background:
if self._events_background: if self._events_background:
self._set_events(self._events_background,True) self._set_events(self._events_background,True)
...@@ -42,25 +44,25 @@ class Application(): ...@@ -42,25 +44,25 @@ class Application():
def run(self): def run(self):
print ("RUN from",self.state) log.info(f"run app '{self.title}' from state {self.state}")
if self.state == STATE_OFF: if self.state == STATE_OFF:
print("go init") log.info("from STATE_OFF, doing init()")
self.init() self.init()
if self.has_foreground: if self.has_foreground:
self._to_foreground() self._to_foreground()
elif self.has_background: elif self.has_background:
self._to_background() self._to_background()
print ("App {} has no foreground, running in background".format(self.title))
else: else:
print("App has neither foreground nor background, not doing anything") log.warning(f"App {self.title} has neither foreground nor background, not doing anything")
#start the eventloop if it is not already running #start the eventloop if it is not already running
if not event.the_engine.is_running:
log.info("eventloop not yet running, starting")
event.the_engine.eventloop() event.the_engine.eventloop()
def exit(self,data={}): def exit(self,data={}):
print("EXIT") log.info(f"exit app '{self.title}' from state {self.state}")
self.on_exit() self.on_exit()
if self.state == STATE_FOREGROUND: if self.state == STATE_FOREGROUND:
self._to_background() self._to_background()
...@@ -68,6 +70,7 @@ class Application(): ...@@ -68,6 +70,7 @@ class Application():
def kill(self): def kill(self):
#disable all events #disable all events
log.info(f"kill app '{self.title}' from state {self.state}")
engine.register_service_loop(self.main_always,False) engine.register_service_loop(self.main_always,False)
engine.foreground_app = None engine.foreground_app = None
...@@ -92,9 +95,9 @@ class Application(): ...@@ -92,9 +95,9 @@ class Application():
return self.state == STATE_FOREGROUND return self.state == STATE_FOREGROUND
def _to_foreground(self): def _to_foreground(self):
print ("to foreground", self) log.info(f"to_foreground app '{self.title}' from state {self.state}")
if not self.has_foreground: if not self.has_foreground:
#TODO log log.error(f"app has no foreground!")
return return
if self._events_background: if self._events_background:
...@@ -105,10 +108,10 @@ class Application(): ...@@ -105,10 +108,10 @@ class Application():
self._set_events(self._events_foreground,True) self._set_events(self._events_foreground,True)
self.on_foreground() self.on_foreground()
#self.engine.register_main_loop(self.main_foreground,True)
self.engine.foreground_app = self self.engine.foreground_app = self
def _to_background(self): def _to_background(self):
log.info(f"to_background app '{self.title}' from state {self.state}")
self.state = STATE_BACKGROUND self.state = STATE_BACKGROUND
if self._events_foreground: if self._events_foreground:
self._set_events(self._events_foreground,False) self._set_events(self._events_foreground,False)
...@@ -123,25 +126,24 @@ class Application(): ...@@ -123,25 +126,24 @@ class Application():
e.set_enabled(enabled) e.set_enabled(enabled)
def on_init(self): def on_init(self):
print("nothing to init") log.info(f"app {self.title}: on_init()")
pass
def on_foreground(self): def on_foreground(self):
pass log.info(f"app {self.title}: on_foreground()")
def on_background(self): def on_background(self):
pass log.info(f"app {self.title}: on_background()")
def on_exit(self): def on_exit(self):
pass log.info(f"app {self.title}: on_exit()")
def on_kill(self): def on_kill(self):
pass log.info(f"app {self.title}: on_kill()")
def on_draw(self): def on_draw(self):
#self.ui.ctx.rgb(*ui.RED).rectangle(-120,-120,120,120).fill() #self.ui.ctx.rgb(*ui.RED).rectangle(-120,-120,120,120).fill()
#self.icon.draw() #self.icon.draw()
pass log.debug(f"app {self.title}: on_draw()")
def main_foreground(self): def main_foreground(self):
pass pass
......
from st3m import logging
log = logging.Log(__name__,level=logging.INFO)
log.info("import")
from . import ui from . import ui
class Control(): class Control():
...@@ -15,7 +19,6 @@ class Control(): ...@@ -15,7 +19,6 @@ class Control():
def draw(self): def draw(self):
self.ui.value = self.get_value() self.ui.value = self.get_value()
print("draw: value", self.get_value())
self.ui.draw() self.ui.draw()
def get_normal_value(self): def get_normal_value(self):
...@@ -70,10 +73,14 @@ class ControlFloat(Control): ...@@ -70,10 +73,14 @@ class ControlFloat(Control):
def get_normal_value(self): def get_normal_value(self):
v = self.get_value() v = self.get_value()
n = (v-self.min)/(self.max-self.min) n = (v-self.min)/(self.max-self.min)
#print("normal:",v,n)
return n return n
class ControlKnob(ControlFloat): class ControlKnob(ControlFloat):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._x_init = 0
self._touch_started_here = False
def enter(self): def enter(self):
#repeat action with current value #repeat action with current value
self.set_value(self.get_value()) self.set_value(self.get_value())
...@@ -93,13 +100,16 @@ class ControlKnob(ControlFloat): ...@@ -93,13 +100,16 @@ class ControlKnob(ControlFloat):
def touch_1d(self,x,z): def touch_1d(self,x,z):
if z>0: #Inital Contact if z>0: #Inital Contact
self._x_init = x self._x_init = x
self._touch_started_here=True
if z==0: #Continous contact if z==0: #Continous contact
if not self._touch_started_here:
return
diff = self._x_init-x diff = self._x_init-x
self.scroll(5*diff) self.scroll(5*diff)
if z<0: #Release if z<0: #Release
pass self._touch_started_here = False
class ControlSlide(ControlFloat): class ControlSlide(ControlFloat):
...@@ -114,7 +124,7 @@ class ControlSlide(ControlFloat): ...@@ -114,7 +124,7 @@ class ControlSlide(ControlFloat):
if z==0: #Continous contact if z==0: #Continous contact
v = (self.max-self.min)*x+self.min v = (self.max-self.min)*x+self.min
self.set_value(v) self.set_value(v)
print("c",x,v,self.max,self.min) #print("c",x,v,self.max,self.min)
if z<0: #Release if z<0: #Release
if self.do_reset: if self.do_reset:
......
import hardware from st3m import logging
log = logging.Log(__name__,level=logging.INFO)
log.info("import")
from st3m.system import hardware
import time import time
import math import math
import random import random
...@@ -47,15 +52,6 @@ class Engine(): ...@@ -47,15 +52,6 @@ class Engine():
def remove_input(self,group_id): def remove_input(self,group_id):
self.events_input = [event for event in self.events_input if event.group_id!=group_id] self.events_input = [event for event in self.events_input if event.group_id!=group_id]
def register_main_loop(self,loop,enable=True):
if enable:
#print ("new userloop",loop)
#loop()
self.userloop = loop
elif self.userloop == loop:
#print ("removed userloop")
self.userloop = None
def _sort_timed(self): def _sort_timed(self):
self.events_timed = sorted(self.events_timed, key = lambda event: event.deadline) self.events_timed = sorted(self.events_timed, key = lambda event: event.deadline)
...@@ -149,11 +145,10 @@ class Engine(): ...@@ -149,11 +145,10 @@ class Engine():
def eventloop(self): def eventloop(self):
log.info("starting eventloop")
if self.is_running: if self.is_running:
print ("eventloop already running") log.warning("eventloop already running, doing nothing")
return return
else:
print("eventloop started")
self.is_running=True self.is_running=True
last_draw = 0 last_draw = 0
while self.is_running: while self.is_running:
...@@ -190,7 +185,7 @@ class Event(): ...@@ -190,7 +185,7 @@ class Event():
def trigger(self,triggerdata={}): def trigger(self,triggerdata={}):
print ("triggered {} (with {})".format(self.name,triggerdata)) log.debug("triggered {} (with {})".format(self.name,triggerdata))
if not self.action is None: if not self.action is None:
triggerdata.update(self.data) triggerdata.update(self.data)
self.action(triggerdata) self.action(triggerdata)
...@@ -203,12 +198,12 @@ class Event(): ...@@ -203,12 +198,12 @@ class Event():
self.remove() self.remove()
def remove(self): def remove(self):
print ("remove",self) log.info(f"remove {self}")
while self in the_engine.events_input: while self in the_engine.events_input:
print ("from input") #print ("from input")
the_engine.events_input.remove(self) the_engine.events_input.remove(self)
while self in the_engine.events_timed: while self in the_engine.events_timed:
print("from timed") #print("from timed")
the_engine.events_timed.remove(self) the_engine.events_timed.remove(self)
the_engine._sort_timed() the_engine._sort_timed()
...@@ -245,7 +240,7 @@ class Sequence(): ...@@ -245,7 +240,7 @@ class Sequence():
self.is_running = False self.is_running = False
if not action: if not action:
self.action = lambda data: print("step {}".format(data.get("step"))) self.action = lambda data: log.info("step {}".format(data.get("step")))
else: else:
self.action = action self.action = action
...@@ -253,7 +248,7 @@ class Sequence(): ...@@ -253,7 +248,7 @@ class Sequence():
if self.is_running: self.stop() if self.is_running: self.stop()
stepsize_ms = int(60*1000/self.bpm) stepsize_ms = int(60*1000/self.bpm)
for i in range(self.steps): for i in range(self.steps):
print("adding sequence event ", i) log.debug("adding sequence event ", i)
self.events.append(EventTimed(stepsize_ms*i,name="seq{}".format(i),action=self.action, data={'step':i}, group_id=self.group_id,enabled=True)) self.events.append(EventTimed(stepsize_ms*i,name="seq{}".format(i),action=self.action, data={'step':i}, group_id=self.group_id,enabled=True))
if self.loop: if self.loop:
self.repeat_event=EventTimed(stepsize_ms*self.steps,name="loop", group_id=self.group_id, enabled=True, action=on_restart, data={"object":self}) self.repeat_event=EventTimed(stepsize_ms*self.steps,name="loop", group_id=self.group_id, enabled=True, action=on_restart, data={"object":self})
...@@ -261,7 +256,7 @@ class Sequence(): ...@@ -261,7 +256,7 @@ class Sequence():
def stop(self): def stop(self):
#for e in self.events: e.remove() #for e in self.events: e.remove()
print("sequence stop") log.info("sequence stop")
the_engine.remove_timed(group_id=self.group_id) the_engine.remove_timed(group_id=self.group_id)
self.events = [] self.events = []
if self.repeat_event: self.repeat_event.remove() if self.repeat_event: self.repeat_event.remove()
......
from st3m import logging
log = logging.Log(__name__,level=logging.INFO)
log.info("import")
from . import ui,event from . import ui,event
import hardware
import time import time
...@@ -41,7 +44,7 @@ class Menu(): ...@@ -41,7 +44,7 @@ class Menu():
self.ui.children.pop() self.ui.children.pop()
def start(self): def start(self):
print(self) log.info(f"starting menu {self.name}")
set_active_menu(self) set_active_menu(self)
def scroll(self, n=0): def scroll(self, n=0):
...@@ -119,7 +122,7 @@ class MenuItem(): ...@@ -119,7 +122,7 @@ class MenuItem():
return "item: {} (action: {})".format(self.name,"?") return "item: {} (action: {})".format(self.name,"?")
def enter(self,data={}): def enter(self,data={}):
print("Enter MenuItem {}".format(self.name)) log.info("enter MenuItem {}".format(self.name))
if self.action: if self.action:
self.action(data) self.action(data)
...@@ -142,8 +145,9 @@ class MenuItemSubmenu(MenuItem): ...@@ -142,8 +145,9 @@ class MenuItemSubmenu(MenuItem):
self.target = submenu self.target = submenu
def enter(self,data={}): def enter(self,data={}):
print("Enter Submenu {}".format(self.target.name))
menu_stack.append(get_active_menu()) menu_stack.append(get_active_menu())
log.info(f"enter submenu {self.target.name} (Stack: {len(menu_stack)})")
set_active_menu(self.target) set_active_menu(self.target)
class MenuItemBack(MenuItem): class MenuItemBack(MenuItem):
...@@ -161,7 +165,7 @@ class MenuItemControl(MenuItem): ...@@ -161,7 +165,7 @@ class MenuItemControl(MenuItem):
self.ui=control.ui self.ui=control.ui
def enter(self): def enter(self):
print("menu enter") log.info(f"item {self.name} (MenuItemControl): enter")
self.control.enter() self.control.enter()
def scroll(self,delta): def scroll(self,delta):
...@@ -178,7 +182,6 @@ def on_scroll(d): ...@@ -178,7 +182,6 @@ def on_scroll(d):
if d["index"]==0:#right button if d["index"]==0:#right button
hovered=active_menu.get_hovered_item() hovered=active_menu.get_hovered_item()
if hasattr(hovered, "scroll"): if hasattr(hovered, "scroll"):
print("has_scroll")
hovered.scroll(d["value"]) hovered.scroll(d["value"])
else: #index=1, #left button else: #index=1, #left button
...@@ -199,7 +202,6 @@ def on_scroll_captouch(d): ...@@ -199,7 +202,6 @@ def on_scroll_captouch(d):
return return
if abs(d["radius"]) < 10000: if abs(d["radius"]) < 10000:
return return
print(d["angle"])
active_menu.rotate_to(d["angle"]+math.pi) active_menu.rotate_to(d["angle"]+math.pi)
def on_release(d): def on_release(d):
...@@ -217,14 +219,14 @@ def on_touch_1d(d): ...@@ -217,14 +219,14 @@ def on_touch_1d(d):
if active_menu is None: if active_menu is None:
return return
#print(d["radius"])
v = min(1.0,max(0.0,((d["radius"]+25000.0)/50000.0))) v = min(1.0,max(0.0,((d["radius"]+25000.0)/50000.0)))
z = 0 z = 0
if d["change"]: if d["change"]:
if d["value"] == 1: z=1 if d["value"] == 1: z=1
else: z=-1 else: z=-1
print("menu: touch_1d",v,z) log.debug(f"menu: touch_1d ({v},{z})")
hovered=active_menu.get_hovered_item() hovered=active_menu.get_hovered_item()
...@@ -235,7 +237,6 @@ def on_touch_1d(d): ...@@ -235,7 +237,6 @@ def on_touch_1d(d):
if hasattr(hovered, "touch_1d"): if hasattr(hovered, "touch_1d"):
print("hastouch")
hovered.touch_1d(v,z) hovered.touch_1d(v,z)
...@@ -243,13 +244,12 @@ def on_enter(d): ...@@ -243,13 +244,12 @@ def on_enter(d):
active_menu = get_active_menu() active_menu = get_active_menu()
if active_menu is None: if active_menu is None:
log.info("menu enter without active menu, opening last menu")
#TODO this should not bee needed...
event.the_engine.userloop=None
menu_back() menu_back()
return return
if active_menu: if active_menu:
log.info("menu enter, opening item")
active_menu.get_hovered_item().enter() active_menu.get_hovered_item().enter()
...@@ -279,16 +279,6 @@ event.Event(name="menu button enter",group_id="menu", ...@@ -279,16 +279,6 @@ event.Event(name="menu button enter",group_id="menu",
action=on_enter, enabled=True action=on_enter, enabled=True
) )
def old_render():
print (active_menu)
return
if active_menu is None:
return
ui.the_ctx.rectangle(-120,-120,240,240).rgb(*ui.BLACK).fill()
active_menu.draw()
#hardware.display_update()
def set_active_menu(menu): def set_active_menu(menu):
event.the_engine.active_menu = menu event.the_engine.active_menu = menu
...@@ -296,16 +286,9 @@ def set_active_menu(menu): ...@@ -296,16 +286,9 @@ def set_active_menu(menu):
def get_active_menu(): def get_active_menu():
return event.the_engine.active_menu return event.the_engine.active_menu
#def menu_disable():
# global active_menu
# if active_menu:
# menu_stack.append(active_menu)
# active_menu=None
def menu_back(): def menu_back():
if not menu_stack:
return
previous = menu_stack.pop() previous = menu_stack.pop()
log.info(f"back to previous menu {previous.name} (Stack: {len(menu_stack)})")
set_active_menu(previous) set_active_menu(previous)
\ No newline at end of file
...@@ -26,5 +26,15 @@ except ModuleNotFoundError: ...@@ -26,5 +26,15 @@ except ModuleNotFoundError:
print("no real audio, using mock module") print("no real audio, using mock module")
_audio = MockObject("audio") _audio = MockObject("audio")
try:
import audio as _audio
except ModuleNotFoundError:
print("no real audio, using mock module")
_audio = MockObject("audio")
hardware = _hardware hardware = _hardware
audio = _audio audio = _audio
ctx =hardware.get_ctx()
\ No newline at end of file
import hardware from st3m import logging
log = logging.Log(__name__,level=logging.INFO)
log.info("import")
from st3m.system import ctx
import random import random
import math import math
import time import time
...@@ -19,7 +23,7 @@ GREY = (0.5,0.5,0.5) ...@@ -19,7 +23,7 @@ GREY = (0.5,0.5,0.5)
GO_GREEN = (63/255,255/255,33/53) GO_GREEN = (63/255,255/255,33/53)
PUSH_RED = (251/255,72/255,196/255) PUSH_RED = (251/255,72/255,196/255)
the_ctx = hardware.get_ctx() the_ctx = ctx
# Utility functions # Utility functions
def xy_from_polar(r,phi): def xy_from_polar(r,phi):
......
from st3m import logging
log = logging.Log(__name__,level=logging.INFO)
log.info("import")
import time import time
from hardware import * from hardware import *
from st3m.system import audio from st3m.system import audio
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment