@@ -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
317367def init (mpstate ):
318368 '''initialise module'''
0 commit comments