|
|
@@ -93,6 +93,8 @@ class FlightCommandHandlers:
|
|
|
self.bridge.register_handler(2054, self.takeoff)
|
|
|
self.bridge.register_handler(2055, self.land)
|
|
|
self.bridge.register_handler(2070, self.reposition)
|
|
|
+ self.bridge.register_handler(2073, self.emergency_stop_with_parachute)
|
|
|
+ self.bridge.register_handler(2074, self.emergency_stop_motors)
|
|
|
|
|
|
def _target(self) -> tuple[int, int]:
|
|
|
source = self.bridge.mavlink_target
|
|
|
@@ -177,6 +179,18 @@ class FlightCommandHandlers:
|
|
|
1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
|
))
|
|
|
|
|
|
+ def emergency_stop_with_parachute(self, command: BaseMessage, bridge: Bridge) -> None:
|
|
|
+ """DataType 2073: high-altitude emergency motor stop, then parachute release."""
|
|
|
+ if command.data is not None:
|
|
|
+ raise ValueError("DataType 2073 Data must be null")
|
|
|
+ system, component = self._target()
|
|
|
+ # VKFly MAV_CMD_DO_PARACHUTE with PARACHUTE_RELEASE means
|
|
|
+ # "Release parachute and kill motors", i.e. stop propellers and deploy.
|
|
|
+ self._send(self.encoder.command_long_encode(
|
|
|
+ system, component, VKFly.MAV_CMD_DO_PARACHUTE, 0,
|
|
|
+ float(VKFly.PARACHUTE_RELEASE), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
|
+ ))
|
|
|
+
|
|
|
def takeoff(self, command: BaseMessage, bridge: Bridge) -> None:
|
|
|
if command.data is not None:
|
|
|
raise ValueError("DataType 2054 Data must be null")
|
|
|
@@ -187,6 +201,18 @@ class FlightCommandHandlers:
|
|
|
raise ValueError("DataType 2055 Data must be null")
|
|
|
self._send_command_long(VKFly.MAV_CMD_NAV_LAND)
|
|
|
|
|
|
+ def emergency_stop_motors(self, command: BaseMessage, bridge: Bridge) -> None:
|
|
|
+ """DataType 2074: ground emergency motor stop without parachute."""
|
|
|
+ if command.data is not None:
|
|
|
+ raise ValueError("DataType 2074 Data must be null")
|
|
|
+ system, component = self._target()
|
|
|
+ # Forced disarm (MAV_CMD_COMPONENT_ARM_DISARM param2=21196) kills the
|
|
|
+ # motors without triggering the parachute that DataType 2073 uses.
|
|
|
+ self._send(self.encoder.command_long_encode(
|
|
|
+ system, component, VKFly.MAV_CMD_COMPONENT_ARM_DISARM, 0,
|
|
|
+ 0.0, 21196.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
|
+ ))
|
|
|
+
|
|
|
def _send_command_long(self, mav_command: int, *, param7: float = math.nan) -> None:
|
|
|
system, component = self._target()
|
|
|
nan = math.nan
|