Skip to content

Commit 61a4e08

Browse files
committed
mavproxy_arm: try to use mavlink command to set/unset safety switch
1 parent 3cc0d38 commit 61a4e08

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

MAVProxy/modules/mavproxy_arm.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ def __init__(self, mpstate):
6767
self.add_command('disarm', self.cmd_disarm, 'disarm motors')
6868
self.was_armed = False
6969

70+
# support for setting safety switch position via COMMAND_*
71+
# rather than the "set_mode" message:
72+
self.accepts_DO_SET_SAFETY_SWITCH_STATE = {} # keyed by (sysid, compid)
73+
7074
def checkables(self):
7175
return "<" + "|".join(arming_masks.keys()) + ">"
7276

@@ -182,6 +186,14 @@ def cmd_arm(self, args):
182186
return
183187

184188
if args[0] == "safetyon":
189+
key = (self.target_system, self.target_component)
190+
supports = self.accepts_DO_SET_SAFETY_SWITCH_STATE.get(key, None)
191+
if supports or supports is None:
192+
self.send_DO_SET_SAFETY_SWITCH_STATE(mavutil.mavlink.SAFETY_SWITCH_STATE_SAFE)
193+
194+
if supports is True:
195+
return
196+
185197
self.master.mav.set_mode_send(self.target_system,
186198
mavutil.mavlink.MAV_MODE_FLAG_DECODE_POSITION_SAFETY,
187199
1)
@@ -200,6 +212,14 @@ def cmd_arm(self, args):
200212
return
201213

202214
if args[0] == "safetyoff":
215+
key = (self.target_system, self.target_component)
216+
supports = self.accepts_DO_SET_SAFETY_SWITCH_STATE.get(key, None)
217+
if supports or supports is None:
218+
self.send_DO_SET_SAFETY_SWITCH_STATE(mavutil.mavlink.SAFETY_SWITCH_STATE_DANGEROUS)
219+
220+
if supports is True:
221+
return
222+
203223
self.master.mav.set_mode_send(self.target_system,
204224
mavutil.mavlink.MAV_MODE_FLAG_DECODE_POSITION_SAFETY,
205225
0)
@@ -252,6 +272,21 @@ def arm_skip(self, args):
252272
def arm_unskip(self, args):
253273
return self._arm_skip("unskip", args)
254274

275+
def send_DO_SET_SAFETY_SWITCH_STATE(self, state):
276+
self.master.mav.command_long_send(
277+
self.target_system, # target_system
278+
self.target_component,
279+
mavutil.mavlink.MAV_CMD_DO_SET_SAFETY_SWITCH_STATE, # command
280+
0, # confirmation
281+
state, # param1
282+
0, # param2 (all other params meaningless)
283+
0, # param3
284+
0, # param4
285+
0, # param5
286+
0, # param6
287+
0 # param7
288+
)
289+
255290
def cmd_disarm(self, args):
256291
'''disarm motors'''
257292
p2 = 0
@@ -312,7 +347,22 @@ def mavlink_packet(self, m):
312347
v = getattr(rc, 'chan%u_raw' % v)
313348
if v <= 1300:
314349
self.say("ICE Disabled")
350+
return
315351

352+
if mtype == "COMMAND_ACK":
353+
# check to see if the vehicle has bounced our attempts to
354+
# change vehicle state via mavlink command (as opposed to
355+
# old messages which changed state):
356+
accepts_dict = None
357+
if m.command == mavutil.mavlink.MAV_CMD_DO_SET_SAFETY_SWITCH_STATE:
358+
accepts_dict = self.accepts_DO_SET_SAFETY_SWITCH_STATE
359+
if accepts_dict is not None:
360+
key = (m.get_srcSystem(), m.get_srcComponent())
361+
if m.result == mavutil.mavlink.MAV_RESULT_UNSUPPORTED:
362+
# stop sending the commands:
363+
accepts_dict[key] = False
364+
elif m.result in [mavutil.mavlink.MAV_RESULT_ACCEPTED]:
365+
accepts_dict[key] = True
316366

317367
def init(mpstate):
318368
'''initialise module'''

0 commit comments

Comments
 (0)