@@ -2296,44 +2296,86 @@ class RemoteControl(object):
22962296 11 : ['blue_up' , 'blue_down' ]
22972297 }
22982298
2299+ on_red_up = None
2300+ on_red_down = None
2301+ on_blue_up = None
2302+ on_blue_down = None
2303+ on_beacon = None
2304+ on_change = None
2305+
22992306 def __init__ (self , sensor = None , channel = 1 ):
23002307 if sensor is None :
23012308 self ._sensor = InfraredSensor ()
23022309 else :
23032310 self ._sensor = sensor
23042311
23052312 self ._channel = max (1 , min (4 , channel )) - 1
2313+ self ._state = set ([])
23062314
23072315 if self ._sensor .connected :
23082316 self ._sensor .mode = 'IR-REMOTE'
23092317
23102318 @property
23112319 def buttons_pressed (self ):
2320+ """
2321+ Returns list of currently pressed buttons.
2322+ """
23122323 return RemoteControl ._BUTTON_VALUES .get (self ._sensor .value (self ._channel ), [])
23132324
23142325 @property
23152326 def any (self ):
2327+ """
2328+ Checks if any button is pressed.
2329+ """
23162330 return bool (self .buttons_pressed )
23172331
23182332 def check_buttons (self , buttons = []):
23192333 return set (self .buttons_pressed ) == set (buttons )
23202334
23212335 @property
23222336 def red_up (self ):
2337+ """
2338+ Checks if `red_up` button is pressed
2339+ """
23232340 return 'red_up' in self .buttons_pressed
23242341
23252342 @property
23262343 def red_down (self ):
2344+ """
2345+ Checks if `red_down` button is pressed
2346+ """
23272347 return 'red_down' in self .buttons_pressed
23282348
23292349 @property
23302350 def blue_up (self ):
2351+ """
2352+ Checks if `blue_up` button is pressed
2353+ """
23312354 return 'blue_up' in self .buttons_pressed
23322355
23332356 @property
23342357 def blue_down (self ):
2358+ """
2359+ Checks if `blue_down` button is pressed
2360+ """
23352361 return 'blue_down' in self .buttons_pressed
23362362
23372363 @property
23382364 def beacon (self ):
2365+ """
2366+ Checks if `beacon` button is pressed
2367+ """
23392368 return 'beacon' in self .buttons_pressed
2369+
2370+ def process (self ):
2371+ new_state = set (self .buttons_pressed )
2372+ old_state = self ._state
2373+ self ._state = new_state
2374+
2375+ state_diff = new_state .symmetric_difference (old_state )
2376+ for button in state_diff :
2377+ handler = getattr (self , 'on_' + button )
2378+ if handler is not None : handler (button in new_state )
2379+
2380+ if self .on_change is not None and state_diff :
2381+ self .on_change ([(button , button in new_state ) for button in state_diff ])
0 commit comments