Skip to content
Snippets Groups Projects
Select Git revision
  • patch-1
  • master default protected
  • mh/blecentral
  • patch-2
  • filenames-blacklist
  • rahix/ble-fix
  • genofire/ble-rewrite
  • koalo/bhi160-works-but-dirty
  • ch3/splashscreen
  • m
  • rahix/simple_menu
  • ios-workarounds
  • koalo/wip/i2c-for-python
  • renze/safe_mode
  • renze/hatchery_apps
  • schneider/fundamental-test
  • koalo/factory-reset
  • msgctl/gfx_rle
  • msgctl/faultscreen
  • msgctl/textbuffer_api
  • v1.2
  • v1.1
  • v1.0
  • release-1
  • bootloader-v1
  • v0.0
26 results

README.md

Blame
  • Forked from card10 / firmware
    Source project has a limited visibility.
    event.py 3.21 KiB
    import hardware
    import time 
    import math
    
    
    EVENTTYPE_TIMED = 1
    EVENTTYPE_INPUT = 2
    #EVENTTYPE_BUTTON = 2
    #EVENTTYPE_CAPTOUCH = 3
    #EVENTTYPE_CAPCROSS = 4
    
    class Engine():
    	def __init__(self):
    		self.events_timed = []
    		self.events_input = []
    		self.next_timed = None
    		self.last_input_state = None
    	
    	def add(self,event):
    		if isinstance(event,EventTimed):
    			self.add_timed(event)
    		elif isinstance(event,Event):
    			self.add_input(event)
    			
    	def add_timed(self,event):
    		self.events_timed.append(event)
    		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:
    			self.next_timed = self.events_timed.pop(0)
    	
    		now = time.ticks_ms()
    		
    		if self.next_timed:
    			diff = time.ticks_diff(self.next_timed.deadline, now)
    			if diff <= 0:
    				self.next_timed.trigger({"ticks_ms":now, "ticks_delay": -diff})
    				self.next_timed = None
    				
    	def _handle_input(self):
    		input_state={
    			"b0":(hardware.get_button(0),"button",0),
    			"b1":(hardware.get_button(1),"button",1)
    		}
    		
    		for i in range(0,10):
    			input_state["c"+str(i)]=(hardware.get_captouch(i),"captouch",i)
    			
    		
    		if not self.last_input_state:
    			self.last_input_state=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],
    					"to" : input_state[key][0],
    					"from" : self.last_input_state[key][0],
    					"ticks_ms": time.ticks_ms()
    				})
    				
    		
    		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)
    					
    			
    		self.last_input_state=input_state		
    		
    		
    		
    	def _eventloop_single(self):
    		self._handle_timed()
    		self._handle_input()
    			
    	def eventloop(self):
    		while True:
    			self._eventloop_single()
    			time.sleep(0.005)
    		
    class Event():
    	def __init__(self,name="unknown",data={},action=None,condition=None):
    		#print (action)
    		self.name = name
    		self.eventtype = None
    		self.data = data
    		self.action = action
    		self.condition = condition
    		if not condition:
    			self.condition = lambda x: True
    		
    		the_engine.add(self)
    			
    		#print (data)
    		
    	def trigger(self,triggerdata={}):
    		print ("triggered {} (with {})".format(self.name,triggerdata))
    		if not self.action is None:
    			triggerdata.update(self.data)
    			#print("trigger")
    			self.action(triggerdata)
    	
    
    class EventTimed(Event):
    	def __init__(self,ms,name="timer", *args, **kwargs):
    		#super().__init__(name,data,action)
    		self.deadline = time.ticks_add(time.ticks_ms(),ms)
    		
    		super().__init__(*args, **kwargs)
    		self.name=name
    		self.type=EVENTTYPE_TIMED
    		
    	def __repr__(self):
    		return ("event on tick {} ({})".format(self.deadline,self.name))
    
    global the_engine
    the_engine = Engine()
    
    EventTimed(200,name="bar",action=lambda data: print("GNANGNAGNA"))
    EventTimed(100,name="foo")
    Event(name="baz",
    	action=lambda data: print(data),
    	condition=lambda data: data.get('type')=="captouch"
    )
    
    print (the_engine.events_timed)
    #e.eventloop()