Skip to content

Commit 3d7c2da

Browse files
committed
Restores RC capability.
1 parent c6b0298 commit 3d7c2da

1 file changed

Lines changed: 51 additions & 17 deletions

File tree

dronekit/lib/__init__.py

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
399445
class 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

Comments
 (0)