diff --git a/python_payload/control.py b/python_payload/control.py index 897f1bc03f9474eef6e5a8c3043b1c86b9394d4f..c3660aa77cccdd47907cd68d7428e8eb636975d8 100644 --- a/python_payload/control.py +++ b/python_payload/control.py @@ -1,46 +1,70 @@ import ui -class ControlKnob(): - def __init__(self,name,action=None,default=0.5): +class Control(): + def __init__(self,name, default=0, on_set=None): #TODO inheritance from Control() self.name=name - self.action=action - self.value = default - self.ui = ui.IconValue(label=self.name,size=60, value=self.value) - + self.on_set = on_set + self._value = default + self.ui = ui.IconValue(label=self.name,size=60, value=self.get_value()) + def draw(self): self.ui.draw() - def enter(self,data={}): - self.value = 0.8 - self.ui.value = self.value - if self.action: - self.action(self.value) + def get_value(self): + return self._value + def set_value(self, value, do_trigger=True): + self._value = value + self.ui.value = value + if do_trigger: + if self.on_set: + self.on_set(value) + + def enter(self): + pass + def scroll(self,delta): - self.value = max(0,min(1,self.value+delta*0.05)) - self.ui.value = self.value - print (self.value) - self.draw() - if self.action: - self.action(self.value) - -class ControlSwitch(): - def __init__(self,name,action,default): - #TODO inheritance from Control() - self.name=name - self.action=action - self.value = default - self.ui = ui.IconValue(label=self.name,size=60, value=self.value) + pass + + def touch_1d(self,x,z): + pass - def draw(self): - self.ui.draw() +class ControlSwitch(Control): + def enter(self): + self.set_value(not self.get_value()) + +class ControlFloat(Control): + def __init__(self, min=0.0,max=1.0,step=0.1, *args, **kwargs): + self.min=min + self.max=max + self.step=step + super().__init__(*args, **kwargs) +class ControlKnob(ControlFloat): def enter(self): - self.value = not self.value - self.ui.value = self.value - if self.action: - self.action(self.value) + #repeat action with current value + self.set_value(self.get_value()) def scroll(self,delta): - pass + v = self.get_value() + v_new = max(self.min,min(self.max,v+delta*self.step)) + self.set_value(v_new) + +class ControlSlide(ControlFloat): + def __init__(self, do_reset=True, *args, **kwargs): + self.do_reset=do_reset + super().__init__(*args, **kwargs) + + def touch_1d(self,x,z): + if z>0: #Inital Contact + self._saved_value = self.get_value() + + if z==0: #Continous contact + v = (self.max-self.min)*x + self.set_value(v) + + if z<0: #Release + if self.do_reset: + self.set_value(self._saved_value) + \ No newline at end of file diff --git a/python_payload/demo_menu.py b/python_payload/demo_menu.py index 133b0fff52a8ffb6005d5e99f7c4337eee3b14a0..b72d86be4de015c671adf35310b2edf00916838a 100644 --- a/python_payload/demo_menu.py +++ b/python_payload/demo_menu.py @@ -5,7 +5,7 @@ import control import audio import application -import demo_worms,demo_sparabo,cap_touch_demo, melodic_demo, harmonic_demo +#import demo_worms,demo_sparabo,cap_touch_demo, melodic_demo, harmonic_demo import menu_settings,menu_tinysynth import time @@ -13,12 +13,17 @@ import time hardware.captouch_autocalib() audio.set_volume_dB(0) +menu_main = menu.Menu("flow3r",has_back=False) +menu_badge = menu.Menu("badge") +menu_apps = menu.Menu("apps") +menu_music = menu.Menu("music") -menu_demo = menu.Menu("demo") -for app_module in [demo_worms,demo_sparabo,cap_touch_demo,melodic_demo,harmonic_demo]: - menu_demo.add(menu.MenuItemApp(app_module.app)) +#for app_module in [demo_sparabo,melodic_demo,harmonic_demo]: +# menu_music.add(menu.MenuItemApp(app_module.app)) +#for app_module in [demo_worms,cap_touch_demo,]: +# menu_apps.add(menu.MenuItemApp(app_module.app)) testmenu = menu.Menu("test") @@ -33,11 +38,16 @@ testmenu.add(item_foo) testmenu.add(item_sub) testmenu.add(item_add) -menu_main = menu.Menu("flow3r",has_back=False) -menu_main.add(menu.MenuItemSubmenu(testmenu)) -menu_main.add(menu.MenuItemSubmenu(menu_demo)) -menu_main.add(menu.MenuItemSubmenu(menu_settings.get_menu())) -menu_main.add(menu.MenuItemSubmenu(menu_tinysynth.get_menu())) + +menu_badge.add(menu.MenuItemSubmenu(testmenu)) +menu_badge.add(menu.MenuItemSubmenu(menu_settings.get_menu())) + +menu_main.add(menu.MenuItemSubmenu(menu_badge)) +menu_main.add(menu.MenuItemSubmenu(menu_apps)) +menu_main.add(menu.MenuItemSubmenu(menu_music)) + + +menu_music.add(menu.MenuItemSubmenu(menu_tinysynth.get_menu())) menu.set_active_menu(menu_main) menu.render() diff --git a/python_payload/menu.py b/python_payload/menu.py index 1125267c41198d3b25cb565eaae0d4ef3d4e7266..a5aafda48386a4aaa484f8a92d4ce80ea886a697 100644 --- a/python_payload/menu.py +++ b/python_payload/menu.py @@ -48,6 +48,9 @@ class Menu(): def rotate_to(self, angle): self.angle = angle%(math.pi*2) self.ui.angle_offset = self.angle + #for child in self.ui.children: + # child.angle_offset = self.angle*2 + self.icon.phi_offset = self.angle def rotate_steps(self, steps=1): @@ -142,6 +145,9 @@ class MenuItemControl(MenuItem): def scroll(self,delta): self.control.scroll(delta) + def touch_1d(self,x,z): + self.control.touch_1d(x,z) + def on_scroll(d): if active_menu is None: return @@ -149,6 +155,7 @@ def on_scroll(d): if d["index"]==0:#right button hovered=active_menu.get_hovered_item() if hasattr(hovered, "scroll"): + print("has_scroll") hovered.scroll(d["value"]) else: #index=1, #left button @@ -162,8 +169,12 @@ def on_scroll(d): render() def on_scroll_captouch(d): + if active_menu is None: return + + render() + return if abs(d["radius"]) < 10000: return print(d["angle"]) @@ -177,6 +188,24 @@ def on_release(d): active_menu.angle_step = 0.2 render() + +def on_touch_1d(d): + if active_menu is None: + return + v = min(1.0,max(0.0,((d["radius"]+25000.0)/50000.0))) + z = 0 + if d["change"]: + if d["value"] == 1: z=1 + else: z=-1 + + print("menu: touch_1d",v,z) + hovered=active_menu.get_hovered_item() + if hasattr(hovered, "touch_1d"): + print("hastouch") + hovered.touch_1d(v,z) + + render() + def on_enter(d): if active_menu is None: @@ -199,14 +228,20 @@ event.Event(name="menu rotation button",group_id="menu", event.Event(name="menu rotation captouch",group_id="menu", condition=lambda e: e["type"] =="captouch" and not e["change"] and abs(e["value"])==1 and e["index"]==2, - action=on_scroll_captouch, enabled=False + action=on_scroll_captouch, enabled=True ) + event.Event(name="menu rotation button release",group_id="menu", condition=lambda e: e["type"] =="button" and e["change"] and e["value"] ==0, action=on_release, enabled=True ) +event.Event(name="menu 1d captouch",group_id="menu", + condition=lambda e: e["type"] =="captouch" and (e["value"]==1 or e["change"]) and e["index"]==9, + action=on_touch_1d, enabled=True +) + event.Event(name="menu button enter",group_id="menu", condition=lambda e: e["type"] =="button" and e["change"] and e["from"] == 2, action=on_enter, enabled=True @@ -217,7 +252,7 @@ def render(): if active_menu is None: return - ui.the_ctx.rectangle(-120,-120,240,240).rgb(0,0,0).fill() + ui.the_ctx.rectangle(-120,-120,240,240).rgb(*ui.GO_GREEN).fill() active_menu.draw() #hardware.display_update() diff --git a/python_payload/menu_settings.py b/python_payload/menu_settings.py index 6e4b9857241a1f44ffd620b82172684ff5d10bda..c99e3c80c3f41bbf54e0dffbcc67f264fbbac058 100644 --- a/python_payload/menu_settings.py +++ b/python_payload/menu_settings.py @@ -37,14 +37,14 @@ def get_menu(): control_debug_input=control.ControlSwitch( name="show inputs", - action=set_controls_overlay, + on_set=set_controls_overlay, default=False ) item_input_overlay = menu.MenuItemControl("input overlay", control_debug_input) m.add(item_input_overlay) - c = control.ControlKnob(name="Volume",default=0.5,action=set_volume) + c = control.ControlKnob(name="Volume",default=0.5,on_set=set_volume) m.add(menu.MenuItemControl("volume",c)) return m diff --git a/python_payload/menu_tinysynth.py b/python_payload/menu_tinysynth.py index a77d1388968551418196625e57715c87951834e9..3f2d95b418b18f480adea3ed5976009b60f7088b 100644 --- a/python_payload/menu_tinysynth.py +++ b/python_payload/menu_tinysynth.py @@ -27,18 +27,27 @@ def set_frequency(value): f = 440+value*440 synth.freq(f) +def set_pitch(value): + p = 440 + print("p:",p) + synth.freq(value) + def get_menu(): m = menu.Menu("tinysynth") - freq=control.ControlKnob(name="freq",action=set_frequency,default=0.0) + freq=control.ControlKnob(name="freq",on_set=set_frequency,default=0.0) m.add(menu.MenuItemControl("freq",freq)) - vol = control.ControlKnob(name="vol",action=set_volume,default=0.0) + pitch = control.ControlSlide(name="pitch",on_set=set_frequency,default=0) + m.add(menu.MenuItemControl("pitch",pitch)) + + vol = control.ControlKnob(name="vol",on_set=set_volume,default=0.0) m.add(menu.MenuItemControl("volume",vol)) - play = control.ControlSwitch(name="play",action=set_play,default=False) + play = control.ControlSwitch(name="play",on_set=set_play,default=False) m.add(menu.MenuItemControl("play",play)) + return m synth = tinysynth(440,0) diff --git a/python_payload/ui.py b/python_payload/ui.py index cd1c451c536928d17b0f404005f122c3037900c7..36616f789576f41f9cd695f786f6507cb6162486 100644 --- a/python_payload/ui.py +++ b/python_payload/ui.py @@ -118,31 +118,36 @@ class Icon(UIElement): class IconFlower(Icon): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.petal_count= random.randint(4,8) + self.petal_count= 0 #random.randint(4,8) self.petal_color = (random.random(),random.random(),random.random()) self.phi_offset = random.random() self.size_offset = random.randint(0,20) + #self.bg=PUSH_RED def _draw(self,pos): + self.ctx.text_align = self.ctx.CENTER + self.ctx.text_baseline = self.ctx.MIDDLE (x,y)=pos - petal_size=2.3*self.size/self.petal_count+self.size_offset + petal_size=0 + if self.petal_count: + petal_size=2.3*self.size/self.petal_count+self.size_offset self.ctx.font_size=self.size/3 - hs = 3 for i in range(self.petal_count): phi = math.pi*2 / self.petal_count * i + self.phi_offset r = self.size/2 (x_,y_) = xy_from_polar(r, phi) + size_rnd = random.randint(-3,3) if self.has_highlight: - self.ctx.move_to(x+x_,y+y_).rgb(1,1,1).arc(x+x_,y+y_, petal_size/2+hs,-math.pi,math.pi,True).fill() - self.ctx.move_to(x+x_,y+y_).rgb(*self.petal_color).arc(x+x_,y+y_, petal_size/2,-math.pi,math.pi,True).fill() + self.ctx.move_to(x+x_,y+y_).rgb(1,1,1).arc(x+x_,y+y_, petal_size/2+hs+size_rnd,-math.pi,math.pi,True).fill() + self.ctx.move_to(x+x_,y+y_).rgb(*self.petal_color).arc(x+x_,y+y_, petal_size/2+size_rnd,-math.pi,math.pi,True).fill() #if self.has_highlight: # self.ctx.rgb(1,1,1).arc(x,y, self.size/2+hs,-math.pi,math.pi,True).fill() self.ctx.move_to(x,y).rgb(*self.bg).arc(x,y,self.size/2,-math.pi,math.pi,True).fill() - self.ctx.rgb(*GO_GREEN).move_to(x,y).text(self.label) + self.ctx.rgb(*WHITE).move_to(x,y).text(self.label)