diff --git a/python_payload/demo_worms.py b/python_payload/demo_worms.py index d0bc1ba429e20a2d520e73fd3b0ab3db3c6c2057..9fdedef50bf565bf5e29041f73aac3449fbb2fd7 100644 --- a/python_payload/demo_worms.py +++ b/python_payload/demo_worms.py @@ -4,21 +4,7 @@ import time import math import event -<<<<<<< HEAD -def xy_from_polar(r,deg): - #rad = deg/180*math.pi - - return( ( - r * math.sin(deg), #x - r * math.cos(deg) #y - ) ) -def randrgb(): - return ((random.random(),random.random(),random.random())) - - -======= ->>>>>>> events WIDTH = 240 HEIGHT = 240 @@ -30,33 +16,6 @@ BLUE = (0,0,1) WHITE = (1,1,1) GREY = (0.5,0.5,0.5) -<<<<<<< HEAD -# Get the global context (representing the whole screen) -global 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(*BLUE).rectangle(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT).fill() - -#Write some text -ctx.move_to(0,0).rgb(*WHITE).text("Hi :)") -hardware.display_update() -''' - -class Worm(): - def __init__(self): - self.color = randrgb() - self.direction = random.random()*math.pi*2 - self.size = 10 - self.speed = self.size/5 - (x,y) = xy_from_polar(40, self.direction+90) -======= def xy_from_polar(r,deg): #rad = deg/180*math.pi @@ -82,17 +41,12 @@ class Worm(): self.size = 50 self.speed = self.size/5 (x,y) = xy_from_polar(100, self.direction) ->>>>>>> events self.x = x self.y= y #(self.dx,self.dy) = xy_from_polar(1,self.direction) self._lastdist = 0.0 def draw(self): -<<<<<<< HEAD - global ctx -======= ->>>>>>> events ctx.rgb(*self.color) ctx.round_rectangle( self.x-self.size/2, @@ -102,24 +56,17 @@ class Worm(): def mutate(self): self.color = ([max(0,min(1,x+((random.random()-0.5)*0.3))) for x in self.color]) -<<<<<<< HEAD -======= self.size = 20 ->>>>>>> events def move(self): dist = math.sqrt(self.x**2+self.y**2) -<<<<<<< HEAD - self.size = (120-dist)/3 -======= target_size = (130-dist)/3 if self.size>target_size: self.size-=1 if self.size<target_size: self.size+=1 ->>>>>>> events self.speed = self.size/5 self.direction += (random.random()-0.5)*math.pi/4 @@ -129,42 +76,13 @@ class Worm(): self.y+=dy -<<<<<<< HEAD - if dist>110-self.size/2 and dist>self._lastdist: -======= if dist>120-self.size/2 and dist>self._lastdist: ->>>>>>> events polar_position=math.atan2(self.y,self.x) dx=dx*-abs(math.cos(polar_position)) dy=dy*-abs(math.sin(polar_position)) self.direction=-math.atan2(dy,dx) self.mutate() self._lastdist = dist -<<<<<<< HEAD - - -global worms - -def init(): - global worms - global ctx - worms = [] - for i in range(23): - worms.append(Worm()) - ctx = hardware.get_ctx() - -def run(): - global worms - for w in worms: - w.draw() - w.move() - hardware.display_update() - time.sleep(0.001) - - -def foreground(): - pass -======= def handle_input(data): @@ -172,7 +90,6 @@ def handle_input(data): if len(worms)>10: worms.pop(0) ->>>>>>> events def init(data={}): # Get the global context (representing the whole screen) diff --git a/python_payload/event.py b/python_payload/event.py index 4c176ae308a84b5ee6a473b1d0904848801c7b67..8c1d2e66a2c9bec2718163768b94da6c5c73a80b 100644 --- a/python_payload/event.py +++ b/python_payload/event.py @@ -28,16 +28,24 @@ class Engine(): def add_timed(self,event): self.events_timed.append(event) self._sort_timed() - + + def add_input(self,event): + self.events_input.append(event) + + def remove(self,group_id): + self.remove_input(group_id) + self.remove_timed(group_id) + def remove_timed(self,group_id): - self.events_timed = [event for event in self.events_timed if event.group_id==group_id] + self.events_timed = [event for event in self.events_timed if event.group_id!=group_id] self._sort_timed() + def remove_input(self,group_id): + self.events_input = [event for event in self.events_input if event.group_id!=group_id] + def _sort_timed(self): self.events_timed = sorted(self.events_timed, key = lambda event: event.deadline) - def add_input(self,event): - self.events_input.append(event) def _handle_timed(self): if not self.next_timed and self.events_timed: @@ -52,48 +60,53 @@ class Engine(): self.next_timed = None def _handle_input(self): - input_state={ - "b0":(hardware.get_button(0),"button",0), - "b1":(hardware.get_button(1),"button",1) - } - + input_state = [] + + #buttons + for i in [0,1]: + input_state.append({ + "type" : "button", + "index" : i, + "value" : hardware.get_button(i) + }) + + #captouch for i in range(0,10): - input_state["c"+str(i)]=(hardware.get_captouch(i),"captouch",i) - + input_state.append({ + "type" : "captouch", + "index" : i, + "value" : hardware.get_captouch(i), + "radius" : hardware.captouch_get_petal_rad(i), + "angle" : hardware.captouch_get_petal_phi(i)/10000 + }) + if not self.last_input_state: self.last_input_state=input_state + #tprint (input_state) return - diff=[] - for key in input_state: - if input_state[key][0] != self.last_input_state[key][0]: - diff.append({ - "type" : input_state[key][1], - "index" : input_state[key][2], - "value" : input_state[key][0], - "from" : self.last_input_state[key][0], - "ticks_ms": time.ticks_ms(), - "change": True - }) + for i in range(len(input_state)): + entry = input_state[i] + last_entry = self.last_input_state[i] + + #update for all + entry["ticks_ms"] = time.ticks_ms() + + if entry["value"] != last_entry["value"]: + #update only when value changed + entry["change"] = True + entry["from"] = last_entry["value"] else: - diff.append({ - "type" : input_state[key][1], - "index" : input_state[key][2], - "value" : input_state[key][0], - "ticks_ms": time.ticks_ms(), - "change": False - }) - - if diff: - #print(diff) - for d in diff: - triggered_events = list(filter(lambda e: e.condition(d),self.events_input)) - #print (triggered_events) - #map(lambda e: e.trigger(d), triggered_events) - for e in triggered_events: - e.trigger(d) - + #update only when value did not change + entry["change"] = False + + #find and trigger the events q + triggered_events = list(filter(lambda e: e.condition(entry),self.events_input)) + #print (triggered_events) + #map(lambda e: e.trigger(d), triggered_events) + for e in triggered_events: + e.trigger(entry) self.last_input_state=input_state @@ -105,6 +118,7 @@ class Engine(): self._handle_timed() self._handle_input() self._handle_userloop() + hardware.display_update() def eventloop(self):