diff --git a/python_payload/control.py b/python_payload/control.py index 3f6b5ae6abdc003494d844dd86cd4df4b8e66d70..c1fabf6be6d23510c01ce5fc479172e11a765bd0 100644 --- a/python_payload/control.py +++ b/python_payload/control.py @@ -55,6 +55,11 @@ class ControlSwitch(Control): def scroll(self,delta): self.enter() + def touch_1d(self,x,z): + if z<0: #Release + self.enter() + + class ControlFloat(Control): def __init__(self, min=0.0,max=1.0,step=0.1, *args, **kwargs): self.min=min @@ -85,6 +90,18 @@ class ControlKnob(ControlFloat): self.set_value(v_new) self.draw() + def touch_1d(self,x,z): + if z>0: #Inital Contact + self._x_init = x + + if z==0: #Continous contact + diff = self._x_init-x + self.scroll(5*diff) + + if z<0: #Release + pass + + class ControlSlide(ControlFloat): def __init__(self, do_reset=True, *args, **kwargs): self.do_reset=do_reset @@ -95,8 +112,9 @@ class ControlSlide(ControlFloat): self._saved_value = self.get_value() if z==0: #Continous contact - v = (self.max-self.min)*x + v = (self.max-self.min)*x+self.min self.set_value(v) + print("c",x,v,self.max,self.min) if z<0: #Release if self.do_reset: diff --git a/python_payload/demo_menu.py b/python_payload/demo_menu.py index 84974dd652e52d15515c568db44558bde604733c..d247069e4073f127a92925d6175bc24ff2c59883 100644 --- a/python_payload/demo_menu.py +++ b/python_payload/demo_menu.py @@ -5,9 +5,11 @@ import control import audio import application -import demo_worms,demo_sparabo,cap_touch_demo, melodic_demo, harmonic_demo +import demo_worms, cap_touch_demo +import demo_sparabo, melodic_demo, harmonic_demo import menu_settings,menu_tinysynth + import time hardware.captouch_autocalib() @@ -19,35 +21,35 @@ menu_apps = menu.Menu("apps") menu_music = menu.Menu("music") -for app_module in [demo_sparabo,melodic_demo,harmonic_demo]: - menu_music.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") +#testmenu = menu.Menu("test") -item_add = menu.MenuItem("+") -item_add.action = lambda x: testmenu.add(menu.MenuItem("new {}".format(len(testmenu.items)))) +#item_add = menu.MenuItem("+") +#item_add.action = lambda x: testmenu.add(menu.MenuItem("new {}".format(len(testmenu.items)))) -item_sub = menu.MenuItem("-") -item_sub.action = lambda x: testmenu.pop() if len(testmenu.items) > 4 else None +#item_sub = menu.MenuItem("-") +#item_sub.action = lambda x: testmenu.pop() if len(testmenu.items) > 4 else None -item_foo = menu.MenuItem("foo") -testmenu.add(item_foo) -testmenu.add(item_sub) -testmenu.add(item_add) +#item_foo = menu.MenuItem("foo") +#testmenu.add(item_foo) +#testmenu.add(item_sub) +#testmenu.add(item_add) -menu_badge.add(menu.MenuItemSubmenu(testmenu)) +#menu_badge.add(menu.MenuItemSubmenu(testmenu)) menu_main.add(menu.MenuItemSubmenu(menu_badge)) menu_main.add(menu.MenuItemSubmenu(menu_apps)) -menu_main.add(menu.MenuItemSubmenu(menu_music)) +#menu_main.add(menu.MenuItemSubmenu(menu_music)) menu_main.add(menu.MenuItemSubmenu(menu_settings.get_menu())) -menu_music.add(menu.MenuItemSubmenu(menu_tinysynth.get_menu())) +menu_main.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 ab88d6ca6090e6e7221af9bd3cddaac36a44bb8b..27319bea5e3a8dd59df6d212eb38852ede4d04db 100644 --- a/python_payload/menu.py +++ b/python_payload/menu.py @@ -11,8 +11,10 @@ class Menu(): def __init__(self,name="menu",has_back=True): self.name=name self.items=[] + self.items_petal=[None for i in range(10)] self.__index = 0 self.ui = ui.GroupRing(r=80) + self.ui2 = ui.GroupPetals(r=100) #TODO(iggy) hack, this should be composed together in ui self.icon = ui.IconFlower(label=name,size=80) self.ui.element_center = self.icon @@ -29,6 +31,10 @@ class Menu(): self.items.append(item) self.ui.add(item.ui) + def add_petal(self, item, petal_index): + self.items_petal[petal_index]=item + self.ui2.children[petal_index]=item.ui + def pop(self): self.items.pop() self.ui.children.pop() @@ -54,7 +60,7 @@ class Menu(): self.icon.phi_offset = self.angle def rotate_steps(self, steps=1): - self.rotate_by(self.angle_step*steps) + self.rotate_by(-self.angle_step*steps) def _get_hovered_index(self): index = round(-self.angle/(math.pi*2)*len(self.items)) @@ -88,7 +94,10 @@ class Menu(): else: item.ui.has_highlight=False item.ui.size=30+my_extra + + self.ui2.draw() self.ui.draw() + class MenuItem(): @@ -193,6 +202,7 @@ def on_release(d): def on_touch_1d(d): if active_menu is None: return + #print(d["radius"]) v = min(1.0,max(0.0,((d["radius"]+25000.0)/50000.0))) z = 0 if d["change"]: @@ -201,6 +211,14 @@ def on_touch_1d(d): print("menu: touch_1d",v,z) hovered=active_menu.get_hovered_item() + + + petal_idx = d["index"] + petal_item = active_menu.items_petal[petal_idx] + if petal_item: + petal_item.touch_1d(v,z) + + if hasattr(hovered, "touch_1d"): print("hastouch") hovered.touch_1d(v,z) @@ -239,7 +257,7 @@ event.Event(name="menu rotation button release",group_id="menu", ) 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, + condition=lambda e: e["type"] =="captouch" and (e["value"]==1 or e["change"]) and e["index"]%2==1, action=on_touch_1d, enabled=True ) diff --git a/python_payload/menu_tinysynth.py b/python_payload/menu_tinysynth.py index f186c5ab8a75f9115c0c6e4b5b85bcaaf71a6b43..de60b013570d40a764495b349bd1cbd7e82be3ea 100644 --- a/python_payload/menu_tinysynth.py +++ b/python_payload/menu_tinysynth.py @@ -7,9 +7,7 @@ import ui import hardware import audio - -ui_input = ui.Icon("") - +synth = tinysynth(440,0) def set_play(value): print ("set_controls_overlay") @@ -18,42 +16,54 @@ def set_play(value): else: synth.stop() -def set_volume(value): - db = int(value*60-40) - print("DB",db) - audio.set_volume_dB(db) +the_freq = 440 def set_frequency(value): - f = 440+value*440 - synth.freq(f) + global the_freq + the_freq = value + synth.freq(the_freq) def set_pitch(value): - p = 440 - print("p:",p) - synth.freq(value) - + synth.freq(the_freq+the_freq*value) + print("value") + def get_menu(): m = menu.Menu("tinysynth") - freq=control.ControlKnob(name="freq",on_set=set_frequency,default=0.0) - m.add(menu.MenuItemControl("freq",freq)) + freq=control.ControlKnob( + name="freq", + on_set=set_frequency, + default=the_freq, + min=220,max=440*4,step=10 + ) + m.add_petal(menu.MenuItemControl("freq",freq), petal_index=7) + + + pitch = control.ControlSlide( + name="pitch", + on_set=set_pitch, + default=0, + min=-0.5,max=0.5 + ) + m.add_petal(menu.MenuItemControl("pitch",pitch), petal_index=9) - 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 on_mod=audio.adjust_volume_dB, on_get=audio.get_volume_relative ) - m.add(menu.MenuItemControl("volume",vol)) + + mi_vol = menu.MenuItemControl("volume",vol) + + #m.add(mi_vol) + m.add_petal(mi_vol,1) play = control.ControlSwitch(name="play",on_set=set_play,default=False) - m.add(menu.MenuItemControl("play",play)) + m.add_petal(menu.MenuItemControl("play",play), petal_index=5) return m -synth = tinysynth(440,0) + m = get_menu() diff --git a/python_payload/ui.py b/python_payload/ui.py index 541e688817d8b3469dbc909c08b213b25c3b5e3f..de027f4e3e75026c308805ae108a0306f4f5f7d4 100644 --- a/python_payload/ui.py +++ b/python_payload/ui.py @@ -224,8 +224,11 @@ class GroupRing(UIElement): for index in range(len(self.children)): #print("child",index) child = self.children[index] + if not child: + continue angle = 2*math.pi/len(self.children)*index+self.angle_offset - x = math.sin(angle)*self.r+pos[0] + #print(angle,self.r,pos[0]) + x = -math.sin(angle)*self.r+pos[0] y = -math.cos(angle)*self.r+pos[1] #print("pos",(x,y)) child.draw(offset=(x,y)) @@ -234,3 +237,8 @@ class GroupRing(UIElement): if self.element_center: self.element_center.has_highlight = False self.element_center._draw(pos) + +class GroupPetals(GroupRing): + def __init__(self,*args,**kwargs): + super().__init__(*args,**kwargs) + self.children = [None for i in range(10)] \ No newline at end of file