@@ -396,6 +396,52 @@ def decorator(fn):
396396 self .add_attribute_listener (name , fn )
397397 return decorator
398398
399+ class Channels (dict ):
400+ """
401+ Implements RC object.
402+ """
403+
404+ def __init__ (self , vehicle , count ):
405+ self ._count = count
406+ self ._readonly = False
407+ self ._overrides = {}
408+ for k in range (0 , count ):
409+ self [k + 1 ] = None
410+ self ._readonly = True
411+
412+ @property
413+ def count (self ):
414+ return self ._count
415+
416+ def __setitem__ (self , key , value ):
417+ if self ._readonly :
418+ raise TypeError ('__setitem__ is not supported on Channels object' )
419+ return dict .__setitem__ (self , key , value )
420+
421+ def __len__ (self ):
422+ return self ._count
423+
424+ def _update_channel (self , channel , value ):
425+ # If we have channels on different ports, we expand the Channels
426+ # object to support them.
427+ channel = str (channel )
428+ self ._readonly = False
429+ self [channel ] = value
430+ self ._readonly = True
431+ self ._count = max (self ._count , int (channel ))
432+
433+ @property
434+ def overrides (self ):
435+ return copy .copy (self ._overrides )
436+
437+ @overrides .setter
438+ def overrides (self , newch ):
439+ self ._overrides = {}
440+ for k , v in newch .iteritems ():
441+ if v :
442+ self ._overrides [str (k )] = v
443+ self ._master .mav .rc_channels_override_send (0 , 0 , * list (self ._overrides .values ()))
444+
399445class Vehicle (HasObservers ):
400446 """
401447 The main vehicle API
@@ -672,14 +718,15 @@ def listener(self, name, m):
672718 self ._mount_yaw = m .pointing_c / 100
673719 self .notify_attribute_listeners ('mount' , self .mount_status )
674720
675- self ._rc_readback = {}
721+ # All keys are strings.
722+ self ._channels = Channels (self , 8 )
676723
677724 @self .on_message ('RC_CHANNELS_RAW' )
678725 def listener (self , name , m ):
679726 def set_rc (chnum , v ):
680727 '''Private utility for handling rc channel messages'''
681728 # use port to allow ch nums greater than 8
682- self ._rc_readback [ str (m .port * 8 + chnum )] = v
729+ self ._channels . _update_channel ( str (m .port * 8 + chnum ), v )
683730
684731 set_rc (1 , m .chan1_raw )
685732 set_rc (2 , m .chan2_raw )
@@ -1099,21 +1146,8 @@ def ekf_ok(self):
10991146 return self ._ekf_poshorizabs or self ._ekf_predposhorizabs
11001147
11011148 @property
1102- def channel_override (self ):
1103- overrides = self .__rc .override
1104- # Only return entries that have a non zero override
1105- return dict ((str (num + 1 ), overrides [num ]) for num in range (8 ) if overrides [num ] != 0 )
1106-
1107- @channel_override .setter
1108- def channel_override (self , newch ):
1109- overrides = self .__rc .override
1110- for k , v in newch .iteritems ():
1111- overrides [int (k ) - 1 ] = v
1112- self .__rc .set_override (overrides )
1113-
1114- @property
1115- def channel_readback (self ):
1116- return copy .copy (self ._rc_readback )
1149+ def channels (self ):
1150+ return self ._channels
11171151
11181152 @property
11191153 def home_location (self ):
0 commit comments