diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4b92ab57..e68b09d3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -180,9 +180,14 @@ jobs: matrix: include: - arch: x86 + host_arch: x64 wheel_arch: win32 - arch: x64 + host_arch: x64 wheel_arch: win_amd64 + - arch: arm64 + host_arch: x64 + wheel_arch: win_arm64 steps: - uses: actions/checkout@v4 @@ -195,7 +200,7 @@ jobs: uses: actions/setup-python@v5 with: python-version: 3.x - architecture: ${{ matrix.arch }} + architecture: ${{ matrix.host_arch }} - name: Install prerequisites run: | @@ -204,6 +209,7 @@ jobs: - name: Create wheel run: | + set MAVSDK_SERVER_ARCH=${{ matrix.arch }} python3 setup.py bdist_wheel Dir "dist/" | rename-item -NewName {$_.name -replace '-any.whl','-${{ matrix.wheel_arch }}.whl'} diff --git a/MANIFEST.in b/MANIFEST.in index 230caf22..6e64f2ba 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,3 @@ include mavsdk/bin include mavsdk/bin/mavsdk_server +include mavsdk/bin/mavsdk_server.exe diff --git a/MAVSDK_SERVER_VERSION b/MAVSDK_SERVER_VERSION index 130165bc..40c06ccb 100644 --- a/MAVSDK_SERVER_VERSION +++ b/MAVSDK_SERVER_VERSION @@ -1 +1 @@ -v3.6.0 +v3.8.0 diff --git a/mavsdk/action_server.py b/mavsdk/action_server.py index 794a6643..bdcf46a5 100644 --- a/mavsdk/action_server.py +++ b/mavsdk/action_server.py @@ -567,7 +567,7 @@ async def arm_disarm(self): raise ActionServerError(result, "arm_disarm()") if result.result == ActionServerResult.Result.SUCCESS: - arm_disarm_stream.cancel() + arm_disarm_stream.cancel(); return @@ -606,7 +606,7 @@ async def flight_mode_change(self): raise ActionServerError(result, "flight_mode_change()") if result.result == ActionServerResult.Result.SUCCESS: - flight_mode_change_stream.cancel() + flight_mode_change_stream.cancel(); return @@ -645,7 +645,7 @@ async def takeoff(self): raise ActionServerError(result, "takeoff()") if result.result == ActionServerResult.Result.SUCCESS: - takeoff_stream.cancel() + takeoff_stream.cancel(); return @@ -684,7 +684,7 @@ async def land(self): raise ActionServerError(result, "land()") if result.result == ActionServerResult.Result.SUCCESS: - land_stream.cancel() + land_stream.cancel(); return @@ -723,7 +723,7 @@ async def reboot(self): raise ActionServerError(result, "reboot()") if result.result == ActionServerResult.Result.SUCCESS: - reboot_stream.cancel() + reboot_stream.cancel(); return @@ -762,7 +762,7 @@ async def shutdown(self): raise ActionServerError(result, "shutdown()") if result.result == ActionServerResult.Result.SUCCESS: - shutdown_stream.cancel() + shutdown_stream.cancel(); return @@ -801,7 +801,7 @@ async def terminate(self): raise ActionServerError(result, "terminate()") if result.result == ActionServerResult.Result.SUCCESS: - terminate_stream.cancel() + terminate_stream.cancel(); return diff --git a/mavsdk/calibration.py b/mavsdk/calibration.py index e4f4f538..52a5f80a 100644 --- a/mavsdk/calibration.py +++ b/mavsdk/calibration.py @@ -368,7 +368,7 @@ async def calibrate_gyro(self): raise CalibrationError(result, "calibrate_gyro()") if result.result == CalibrationResult.Result.SUCCESS: - calibrate_gyro_stream.cancel() + calibrate_gyro_stream.cancel(); return @@ -408,7 +408,7 @@ async def calibrate_accelerometer(self): raise CalibrationError(result, "calibrate_accelerometer()") if result.result == CalibrationResult.Result.SUCCESS: - calibrate_accelerometer_stream.cancel() + calibrate_accelerometer_stream.cancel(); return @@ -448,7 +448,7 @@ async def calibrate_magnetometer(self): raise CalibrationError(result, "calibrate_magnetometer()") if result.result == CalibrationResult.Result.SUCCESS: - calibrate_magnetometer_stream.cancel() + calibrate_magnetometer_stream.cancel(); return @@ -488,7 +488,7 @@ async def calibrate_level_horizon(self): raise CalibrationError(result, "calibrate_level_horizon()") if result.result == CalibrationResult.Result.SUCCESS: - calibrate_level_horizon_stream.cancel() + calibrate_level_horizon_stream.cancel(); return @@ -528,7 +528,7 @@ async def calibrate_gimbal_accelerometer(self): raise CalibrationError(result, "calibrate_gimbal_accelerometer()") if result.result == CalibrationResult.Result.SUCCESS: - calibrate_gimbal_accelerometer_stream.cancel() + calibrate_gimbal_accelerometer_stream.cancel(); return diff --git a/mavsdk/ftp.py b/mavsdk/ftp.py index ecb1b2ec..336bb671 100644 --- a/mavsdk/ftp.py +++ b/mavsdk/ftp.py @@ -432,7 +432,7 @@ async def download(self, remote_file_path, local_dir, use_burst): raise FtpError(result, "download()", remote_file_path, local_dir, use_burst) if result.result == FtpResult.Result.SUCCESS: - download_stream.cancel() + download_stream.cancel(); return @@ -482,7 +482,7 @@ async def upload(self, local_file_path, remote_dir): raise FtpError(result, "upload()", local_file_path, remote_dir) if result.result == FtpResult.Result.SUCCESS: - upload_stream.cancel() + upload_stream.cancel(); return diff --git a/mavsdk/log_files.py b/mavsdk/log_files.py index 11f416ca..a608159d 100644 --- a/mavsdk/log_files.py +++ b/mavsdk/log_files.py @@ -422,7 +422,7 @@ async def download_log_file(self, entry, path): raise LogFilesError(result, "download_log_file()", entry, path) if result.result == LogFilesResult.Result.SUCCESS: - download_log_file_stream.cancel() + download_log_file_stream.cancel(); return diff --git a/mavsdk/mavlink_direct.py b/mavsdk/mavlink_direct.py new file mode 100644 index 00000000..8feb4b37 --- /dev/null +++ b/mavsdk/mavlink_direct.py @@ -0,0 +1,430 @@ +# -*- coding: utf-8 -*- +# DO NOT EDIT! This file is auto-generated from +# https://github.com/mavlink/MAVSDK-Python/tree/main/other/templates/py +from ._base import AsyncBase +from . import mavlink_direct_pb2, mavlink_direct_pb2_grpc +from enum import Enum + + +class MavlinkMessage: + """ + A complete MAVLink message with all header information and fields + + Parameters + ---------- + message_name : std::string + MAVLink message name (e.g., "HEARTBEAT", "GLOBAL_POSITION_INT") + + system_id : uint32_t + System ID of the sender (for received messages) + + component_id : uint32_t + Component ID of the sender (for received messages) + + target_system : uint32_t + Target system ID (for sending, 0 for broadcast) + + target_component : uint32_t + Target component ID (for sending, 0 for broadcast) + + fields_json : std::string + All message fields as single JSON object + + """ + + + + def __init__( + self, + message_name, + system_id, + component_id, + target_system, + target_component, + fields_json): + """ Initializes the MavlinkMessage object """ + self.message_name = message_name + self.system_id = system_id + self.component_id = component_id + self.target_system = target_system + self.target_component = target_component + self.fields_json = fields_json + + def __eq__(self, to_compare): + """ Checks if two MavlinkMessage are the same """ + try: + # Try to compare - this likely fails when it is compared to a non + # MavlinkMessage object + return \ + (self.message_name == to_compare.message_name) and \ + (self.system_id == to_compare.system_id) and \ + (self.component_id == to_compare.component_id) and \ + (self.target_system == to_compare.target_system) and \ + (self.target_component == to_compare.target_component) and \ + (self.fields_json == to_compare.fields_json) + + except AttributeError: + return False + + def __str__(self): + """ MavlinkMessage in string representation """ + struct_repr = ", ".join([ + "message_name: " + str(self.message_name), + "system_id: " + str(self.system_id), + "component_id: " + str(self.component_id), + "target_system: " + str(self.target_system), + "target_component: " + str(self.target_component), + "fields_json: " + str(self.fields_json) + ]) + + return f"MavlinkMessage: [{struct_repr}]" + + @staticmethod + def translate_from_rpc(rpcMavlinkMessage): + """ Translates a gRPC struct to the SDK equivalent """ + return MavlinkMessage( + + rpcMavlinkMessage.message_name, + + + rpcMavlinkMessage.system_id, + + + rpcMavlinkMessage.component_id, + + + rpcMavlinkMessage.target_system, + + + rpcMavlinkMessage.target_component, + + + rpcMavlinkMessage.fields_json + ) + + def translate_to_rpc(self, rpcMavlinkMessage): + """ Translates this SDK object into its gRPC equivalent """ + + + + + rpcMavlinkMessage.message_name = self.message_name + + + + + + rpcMavlinkMessage.system_id = self.system_id + + + + + + rpcMavlinkMessage.component_id = self.component_id + + + + + + rpcMavlinkMessage.target_system = self.target_system + + + + + + rpcMavlinkMessage.target_component = self.target_component + + + + + + rpcMavlinkMessage.fields_json = self.fields_json + + + + + +class MavlinkDirectResult: + """ + Result type. + + Parameters + ---------- + result : Result + Result enum value + + result_str : std::string + Human-readable English string describing the result + + """ + + + + class Result(Enum): + """ + Possible results returned for action requests. + + Values + ------ + UNKNOWN + Unknown result + + SUCCESS + Request succeeded + + ERROR + Error + + INVALID_MESSAGE + Invalid MAVLink message + + INVALID_FIELD + Invalid field name or value + + CONNECTION_ERROR + Connection error + + NO_SYSTEM + No system connected + + TIMEOUT + Request timed out + + """ + + + UNKNOWN = 0 + SUCCESS = 1 + ERROR = 2 + INVALID_MESSAGE = 3 + INVALID_FIELD = 4 + CONNECTION_ERROR = 5 + NO_SYSTEM = 6 + TIMEOUT = 7 + + def translate_to_rpc(self): + if self == MavlinkDirectResult.Result.UNKNOWN: + return mavlink_direct_pb2.MavlinkDirectResult.RESULT_UNKNOWN + if self == MavlinkDirectResult.Result.SUCCESS: + return mavlink_direct_pb2.MavlinkDirectResult.RESULT_SUCCESS + if self == MavlinkDirectResult.Result.ERROR: + return mavlink_direct_pb2.MavlinkDirectResult.RESULT_ERROR + if self == MavlinkDirectResult.Result.INVALID_MESSAGE: + return mavlink_direct_pb2.MavlinkDirectResult.RESULT_INVALID_MESSAGE + if self == MavlinkDirectResult.Result.INVALID_FIELD: + return mavlink_direct_pb2.MavlinkDirectResult.RESULT_INVALID_FIELD + if self == MavlinkDirectResult.Result.CONNECTION_ERROR: + return mavlink_direct_pb2.MavlinkDirectResult.RESULT_CONNECTION_ERROR + if self == MavlinkDirectResult.Result.NO_SYSTEM: + return mavlink_direct_pb2.MavlinkDirectResult.RESULT_NO_SYSTEM + if self == MavlinkDirectResult.Result.TIMEOUT: + return mavlink_direct_pb2.MavlinkDirectResult.RESULT_TIMEOUT + + @staticmethod + def translate_from_rpc(rpc_enum_value): + """ Parses a gRPC response """ + if rpc_enum_value == mavlink_direct_pb2.MavlinkDirectResult.RESULT_UNKNOWN: + return MavlinkDirectResult.Result.UNKNOWN + if rpc_enum_value == mavlink_direct_pb2.MavlinkDirectResult.RESULT_SUCCESS: + return MavlinkDirectResult.Result.SUCCESS + if rpc_enum_value == mavlink_direct_pb2.MavlinkDirectResult.RESULT_ERROR: + return MavlinkDirectResult.Result.ERROR + if rpc_enum_value == mavlink_direct_pb2.MavlinkDirectResult.RESULT_INVALID_MESSAGE: + return MavlinkDirectResult.Result.INVALID_MESSAGE + if rpc_enum_value == mavlink_direct_pb2.MavlinkDirectResult.RESULT_INVALID_FIELD: + return MavlinkDirectResult.Result.INVALID_FIELD + if rpc_enum_value == mavlink_direct_pb2.MavlinkDirectResult.RESULT_CONNECTION_ERROR: + return MavlinkDirectResult.Result.CONNECTION_ERROR + if rpc_enum_value == mavlink_direct_pb2.MavlinkDirectResult.RESULT_NO_SYSTEM: + return MavlinkDirectResult.Result.NO_SYSTEM + if rpc_enum_value == mavlink_direct_pb2.MavlinkDirectResult.RESULT_TIMEOUT: + return MavlinkDirectResult.Result.TIMEOUT + + def __str__(self): + return self.name + + + def __init__( + self, + result, + result_str): + """ Initializes the MavlinkDirectResult object """ + self.result = result + self.result_str = result_str + + def __eq__(self, to_compare): + """ Checks if two MavlinkDirectResult are the same """ + try: + # Try to compare - this likely fails when it is compared to a non + # MavlinkDirectResult object + return \ + (self.result == to_compare.result) and \ + (self.result_str == to_compare.result_str) + + except AttributeError: + return False + + def __str__(self): + """ MavlinkDirectResult in string representation """ + struct_repr = ", ".join([ + "result: " + str(self.result), + "result_str: " + str(self.result_str) + ]) + + return f"MavlinkDirectResult: [{struct_repr}]" + + @staticmethod + def translate_from_rpc(rpcMavlinkDirectResult): + """ Translates a gRPC struct to the SDK equivalent """ + return MavlinkDirectResult( + + MavlinkDirectResult.Result.translate_from_rpc(rpcMavlinkDirectResult.result), + + + rpcMavlinkDirectResult.result_str + ) + + def translate_to_rpc(self, rpcMavlinkDirectResult): + """ Translates this SDK object into its gRPC equivalent """ + + + + + rpcMavlinkDirectResult.result = self.result.translate_to_rpc() + + + + + + rpcMavlinkDirectResult.result_str = self.result_str + + + + + + +class MavlinkDirectError(Exception): + """ Raised when a MavlinkDirectResult is a fail code """ + + def __init__(self, result, origin, *params): + self._result = result + self._origin = origin + self._params = params + + def __str__(self): + return f"{self._result.result}: '{self._result.result_str}'; origin: {self._origin}; params: {self._params}" + + +class MavlinkDirect(AsyncBase): + """ + Enable direct MAVLink communication using libmav. + + Generated by dcsdkgen - MAVSDK MavlinkDirect API + """ + + # Plugin name + name = "MavlinkDirect" + + def _setup_stub(self, channel): + """ Setups the api stub """ + self._stub = mavlink_direct_pb2_grpc.MavlinkDirectServiceStub(channel) + + + def _extract_result(self, response): + """ Returns the response status and description """ + return MavlinkDirectResult.translate_from_rpc(response.mavlink_direct_result) + + + async def send_message(self, message): + """ + Send a MAVLink message directly to the system. + + This allows sending any MAVLink message with full control over the message content. + + Parameters + ---------- + message : MavlinkMessage + The MAVLink message to send + + Raises + ------ + MavlinkDirectError + If the request fails. The error contains the reason for the failure. + """ + + request = mavlink_direct_pb2.SendMessageRequest() + + message.translate_to_rpc(request.message) + + + response = await self._stub.SendMessage(request) + + + result = self._extract_result(response) + + if result.result != MavlinkDirectResult.Result.SUCCESS: + raise MavlinkDirectError(result, "send_message()", message) + + + async def message(self, message_name): + """ + Subscribe to incoming MAVLink messages. + + This provides direct access to incoming MAVLink messages. Use an empty string + in message_name to subscribe to all messages, or specify a message name + (e.g., "HEARTBEAT") to filter for specific message types. + + Parameters + ---------- + message_name : std::string + MAVLink message name to filter for (e.g., "HEARTBEAT"), empty string = all messages + + Yields + ------- + message : MavlinkMessage + The received MAVLink message + + + """ + + request = mavlink_direct_pb2.SubscribeMessageRequest() + request.message_name = message_name + message_stream = self._stub.SubscribeMessage(request) + + try: + async for response in message_stream: + + + + yield MavlinkMessage.translate_from_rpc(response.message) + finally: + message_stream.cancel() + + async def load_custom_xml(self, xml_content): + """ + Load custom MAVLink message definitions from XML. + + This allows loading custom MAVLink message definitions at runtime, + extending the available message types beyond the built-in definitions. + + Parameters + ---------- + xml_content : std::string + The custom MAVLink XML definition content + + Raises + ------ + MavlinkDirectError + If the request fails. The error contains the reason for the failure. + """ + + request = mavlink_direct_pb2.LoadCustomXmlRequest() + request.xml_content = xml_content + response = await self._stub.LoadCustomXml(request) + + + result = self._extract_result(response) + + if result.result != MavlinkDirectResult.Result.SUCCESS: + raise MavlinkDirectError(result, "load_custom_xml()", xml_content) + \ No newline at end of file diff --git a/mavsdk/mavlink_direct_pb2.py b/mavsdk/mavlink_direct_pb2.py new file mode 100644 index 00000000..6c63ccce --- /dev/null +++ b/mavsdk/mavlink_direct_pb2.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: mavlink_direct/mavlink_direct.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'mavlink_direct/mavlink_direct.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from . import mavsdk_options_pb2 as mavsdk__options__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#mavlink_direct/mavlink_direct.proto\x12\x19mavsdk.rpc.mavlink_direct\x1a\x14mavsdk_options.proto\"P\n\x12SendMessageRequest\x12:\n\x07message\x18\x01 \x01(\x0b\x32).mavsdk.rpc.mavlink_direct.MavlinkMessage\"d\n\x13SendMessageResponse\x12M\n\x15mavlink_direct_result\x18\x01 \x01(\x0b\x32..mavsdk.rpc.mavlink_direct.MavlinkDirectResult\"/\n\x17SubscribeMessageRequest\x12\x14\n\x0cmessage_name\x18\x01 \x01(\t\"M\n\x0fMessageResponse\x12:\n\x07message\x18\x01 \x01(\x0b\x32).mavsdk.rpc.mavlink_direct.MavlinkMessage\"+\n\x14LoadCustomXmlRequest\x12\x13\n\x0bxml_content\x18\x01 \x01(\t\"f\n\x15LoadCustomXmlResponse\x12M\n\x15mavlink_direct_result\x18\x01 \x01(\x0b\x32..mavsdk.rpc.mavlink_direct.MavlinkDirectResult\"\x95\x01\n\x0eMavlinkMessage\x12\x14\n\x0cmessage_name\x18\x01 \x01(\t\x12\x11\n\tsystem_id\x18\x02 \x01(\r\x12\x14\n\x0c\x63omponent_id\x18\x03 \x01(\r\x12\x15\n\rtarget_system\x18\x04 \x01(\r\x12\x18\n\x10target_component\x18\x05 \x01(\r\x12\x13\n\x0b\x66ields_json\x18\x06 \x01(\t\"\xb2\x02\n\x13MavlinkDirectResult\x12\x45\n\x06result\x18\x01 \x01(\x0e\x32\x35.mavsdk.rpc.mavlink_direct.MavlinkDirectResult.Result\x12\x12\n\nresult_str\x18\x02 \x01(\t\"\xbf\x01\n\x06Result\x12\x12\n\x0eRESULT_UNKNOWN\x10\x00\x12\x12\n\x0eRESULT_SUCCESS\x10\x01\x12\x10\n\x0cRESULT_ERROR\x10\x02\x12\x1a\n\x16RESULT_INVALID_MESSAGE\x10\x03\x12\x18\n\x14RESULT_INVALID_FIELD\x10\x04\x12\x1b\n\x17RESULT_CONNECTION_ERROR\x10\x05\x12\x14\n\x10RESULT_NO_SYSTEM\x10\x06\x12\x12\n\x0eRESULT_TIMEOUT\x10\x07\x32\x80\x03\n\x14MavlinkDirectService\x12r\n\x0bSendMessage\x12-.mavsdk.rpc.mavlink_direct.SendMessageRequest\x1a..mavsdk.rpc.mavlink_direct.SendMessageResponse\"\x04\x80\xb5\x18\x01\x12z\n\x10SubscribeMessage\x12\x32.mavsdk.rpc.mavlink_direct.SubscribeMessageRequest\x1a*.mavsdk.rpc.mavlink_direct.MessageResponse\"\x04\x80\xb5\x18\x00\x30\x01\x12x\n\rLoadCustomXml\x12/.mavsdk.rpc.mavlink_direct.LoadCustomXmlRequest\x1a\x30.mavsdk.rpc.mavlink_direct.LoadCustomXmlResponse\"\x04\x80\xb5\x18\x01\x42.\n\x18io.mavsdk.mavlink_directB\x12MavlinkDirectProtob\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'mavlink_direct.mavlink_direct_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\030io.mavsdk.mavlink_directB\022MavlinkDirectProto' + _globals['_MAVLINKDIRECTSERVICE'].methods_by_name['SendMessage']._loaded_options = None + _globals['_MAVLINKDIRECTSERVICE'].methods_by_name['SendMessage']._serialized_options = b'\200\265\030\001' + _globals['_MAVLINKDIRECTSERVICE'].methods_by_name['SubscribeMessage']._loaded_options = None + _globals['_MAVLINKDIRECTSERVICE'].methods_by_name['SubscribeMessage']._serialized_options = b'\200\265\030\000' + _globals['_MAVLINKDIRECTSERVICE'].methods_by_name['LoadCustomXml']._loaded_options = None + _globals['_MAVLINKDIRECTSERVICE'].methods_by_name['LoadCustomXml']._serialized_options = b'\200\265\030\001' + _globals['_SENDMESSAGEREQUEST']._serialized_start=88 + _globals['_SENDMESSAGEREQUEST']._serialized_end=168 + _globals['_SENDMESSAGERESPONSE']._serialized_start=170 + _globals['_SENDMESSAGERESPONSE']._serialized_end=270 + _globals['_SUBSCRIBEMESSAGEREQUEST']._serialized_start=272 + _globals['_SUBSCRIBEMESSAGEREQUEST']._serialized_end=319 + _globals['_MESSAGERESPONSE']._serialized_start=321 + _globals['_MESSAGERESPONSE']._serialized_end=398 + _globals['_LOADCUSTOMXMLREQUEST']._serialized_start=400 + _globals['_LOADCUSTOMXMLREQUEST']._serialized_end=443 + _globals['_LOADCUSTOMXMLRESPONSE']._serialized_start=445 + _globals['_LOADCUSTOMXMLRESPONSE']._serialized_end=547 + _globals['_MAVLINKMESSAGE']._serialized_start=550 + _globals['_MAVLINKMESSAGE']._serialized_end=699 + _globals['_MAVLINKDIRECTRESULT']._serialized_start=702 + _globals['_MAVLINKDIRECTRESULT']._serialized_end=1008 + _globals['_MAVLINKDIRECTRESULT_RESULT']._serialized_start=817 + _globals['_MAVLINKDIRECTRESULT_RESULT']._serialized_end=1008 + _globals['_MAVLINKDIRECTSERVICE']._serialized_start=1011 + _globals['_MAVLINKDIRECTSERVICE']._serialized_end=1395 +# @@protoc_insertion_point(module_scope) diff --git a/mavsdk/mavlink_direct_pb2_grpc.py b/mavsdk/mavlink_direct_pb2_grpc.py new file mode 100644 index 00000000..7e36c55d --- /dev/null +++ b/mavsdk/mavlink_direct_pb2_grpc.py @@ -0,0 +1,201 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + +from . import mavlink_direct_pb2 as mavlink__direct_dot_mavlink__direct__pb2 + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in mavlink_direct/mavlink_direct_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class MavlinkDirectServiceStub(object): + """Enable direct MAVLink communication using libmav. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.SendMessage = channel.unary_unary( + '/mavsdk.rpc.mavlink_direct.MavlinkDirectService/SendMessage', + request_serializer=mavlink__direct_dot_mavlink__direct__pb2.SendMessageRequest.SerializeToString, + response_deserializer=mavlink__direct_dot_mavlink__direct__pb2.SendMessageResponse.FromString, + _registered_method=True) + self.SubscribeMessage = channel.unary_stream( + '/mavsdk.rpc.mavlink_direct.MavlinkDirectService/SubscribeMessage', + request_serializer=mavlink__direct_dot_mavlink__direct__pb2.SubscribeMessageRequest.SerializeToString, + response_deserializer=mavlink__direct_dot_mavlink__direct__pb2.MessageResponse.FromString, + _registered_method=True) + self.LoadCustomXml = channel.unary_unary( + '/mavsdk.rpc.mavlink_direct.MavlinkDirectService/LoadCustomXml', + request_serializer=mavlink__direct_dot_mavlink__direct__pb2.LoadCustomXmlRequest.SerializeToString, + response_deserializer=mavlink__direct_dot_mavlink__direct__pb2.LoadCustomXmlResponse.FromString, + _registered_method=True) + + +class MavlinkDirectServiceServicer(object): + """Enable direct MAVLink communication using libmav. + """ + + def SendMessage(self, request, context): + """ + Send a MAVLink message directly to the system. + + This allows sending any MAVLink message with full control over the message content. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SubscribeMessage(self, request, context): + """ + Subscribe to incoming MAVLink messages. + + This provides direct access to incoming MAVLink messages. Use an empty string + in message_name to subscribe to all messages, or specify a message name + (e.g., "HEARTBEAT") to filter for specific message types. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def LoadCustomXml(self, request, context): + """ + Load custom MAVLink message definitions from XML. + + This allows loading custom MAVLink message definitions at runtime, + extending the available message types beyond the built-in definitions. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_MavlinkDirectServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'SendMessage': grpc.unary_unary_rpc_method_handler( + servicer.SendMessage, + request_deserializer=mavlink__direct_dot_mavlink__direct__pb2.SendMessageRequest.FromString, + response_serializer=mavlink__direct_dot_mavlink__direct__pb2.SendMessageResponse.SerializeToString, + ), + 'SubscribeMessage': grpc.unary_stream_rpc_method_handler( + servicer.SubscribeMessage, + request_deserializer=mavlink__direct_dot_mavlink__direct__pb2.SubscribeMessageRequest.FromString, + response_serializer=mavlink__direct_dot_mavlink__direct__pb2.MessageResponse.SerializeToString, + ), + 'LoadCustomXml': grpc.unary_unary_rpc_method_handler( + servicer.LoadCustomXml, + request_deserializer=mavlink__direct_dot_mavlink__direct__pb2.LoadCustomXmlRequest.FromString, + response_serializer=mavlink__direct_dot_mavlink__direct__pb2.LoadCustomXmlResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'mavsdk.rpc.mavlink_direct.MavlinkDirectService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('mavsdk.rpc.mavlink_direct.MavlinkDirectService', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class MavlinkDirectService(object): + """Enable direct MAVLink communication using libmav. + """ + + @staticmethod + def SendMessage(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/mavsdk.rpc.mavlink_direct.MavlinkDirectService/SendMessage', + mavlink__direct_dot_mavlink__direct__pb2.SendMessageRequest.SerializeToString, + mavlink__direct_dot_mavlink__direct__pb2.SendMessageResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SubscribeMessage(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/mavsdk.rpc.mavlink_direct.MavlinkDirectService/SubscribeMessage', + mavlink__direct_dot_mavlink__direct__pb2.SubscribeMessageRequest.SerializeToString, + mavlink__direct_dot_mavlink__direct__pb2.MessageResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def LoadCustomXml(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/mavsdk.rpc.mavlink_direct.MavlinkDirectService/LoadCustomXml', + mavlink__direct_dot_mavlink__direct__pb2.LoadCustomXmlRequest.SerializeToString, + mavlink__direct_dot_mavlink__direct__pb2.LoadCustomXmlResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/mavsdk/mission.py b/mavsdk/mission.py index c60d8d45..9e407116 100644 --- a/mavsdk/mission.py +++ b/mavsdk/mission.py @@ -1054,7 +1054,7 @@ async def upload_mission_with_progress(self, mission_plan): raise MissionError(result, "upload_mission_with_progress()", mission_plan) if result.result == MissionResult.Result.SUCCESS: - upload_mission_with_progress_stream.cancel() + upload_mission_with_progress_stream.cancel(); return @@ -1148,7 +1148,7 @@ async def download_mission_with_progress(self): raise MissionError(result, "download_mission_with_progress()") if result.result == MissionResult.Result.SUCCESS: - download_mission_with_progress_stream.cancel() + download_mission_with_progress_stream.cancel(); return diff --git a/mavsdk/mission_raw.py b/mavsdk/mission_raw.py index 998c2a10..ba270c22 100644 --- a/mavsdk/mission_raw.py +++ b/mavsdk/mission_raw.py @@ -520,6 +520,12 @@ class Result(Enum): INT_MESSAGES_NOT_SUPPORTED The system does not support the MISSION_INT protocol + FAILED_TO_OPEN_MISSION_PLANNER_PLAN + Failed to open the Mission Planner plan + + FAILED_TO_PARSE_MISSION_PLANNER_PLAN + Failed to parse the Mission Planner plan + """ @@ -542,6 +548,8 @@ class Result(Enum): CURRENT_INVALID = 16 PROTOCOL_ERROR = 17 INT_MESSAGES_NOT_SUPPORTED = 18 + FAILED_TO_OPEN_MISSION_PLANNER_PLAN = 19 + FAILED_TO_PARSE_MISSION_PLANNER_PLAN = 20 def translate_to_rpc(self): if self == MissionRawResult.Result.UNKNOWN: @@ -582,6 +590,10 @@ def translate_to_rpc(self): return mission_raw_pb2.MissionRawResult.RESULT_PROTOCOL_ERROR if self == MissionRawResult.Result.INT_MESSAGES_NOT_SUPPORTED: return mission_raw_pb2.MissionRawResult.RESULT_INT_MESSAGES_NOT_SUPPORTED + if self == MissionRawResult.Result.FAILED_TO_OPEN_MISSION_PLANNER_PLAN: + return mission_raw_pb2.MissionRawResult.RESULT_FAILED_TO_OPEN_MISSION_PLANNER_PLAN + if self == MissionRawResult.Result.FAILED_TO_PARSE_MISSION_PLANNER_PLAN: + return mission_raw_pb2.MissionRawResult.RESULT_FAILED_TO_PARSE_MISSION_PLANNER_PLAN @staticmethod def translate_from_rpc(rpc_enum_value): @@ -624,6 +636,10 @@ def translate_from_rpc(rpc_enum_value): return MissionRawResult.Result.PROTOCOL_ERROR if rpc_enum_value == mission_raw_pb2.MissionRawResult.RESULT_INT_MESSAGES_NOT_SUPPORTED: return MissionRawResult.Result.INT_MESSAGES_NOT_SUPPORTED + if rpc_enum_value == mission_raw_pb2.MissionRawResult.RESULT_FAILED_TO_OPEN_MISSION_PLANNER_PLAN: + return MissionRawResult.Result.FAILED_TO_OPEN_MISSION_PLANNER_PLAN + if rpc_enum_value == mission_raw_pb2.MissionRawResult.RESULT_FAILED_TO_PARSE_MISSION_PLANNER_PLAN: + return MissionRawResult.Result.FAILED_TO_PARSE_MISSION_PLANNER_PLAN def __str__(self): return self.name @@ -1200,4 +1216,116 @@ async def import_qgroundcontrol_mission_from_string(self, qgc_plan): return MissionImportData.translate_from_rpc(response.mission_import_data) - \ No newline at end of file + + + async def import_mission_planner_mission(self, mission_planner_path): + """ + Import a Mission Planner mission in QGC WPL 110 format, from a file. + + Supported: + - Waypoints + - ArduPilot home position handling + + Parameters + ---------- + mission_planner_path : std::string + File path of the Mission Planner mission file + + Returns + ------- + mission_import_data : MissionImportData + The imported mission data + + Raises + ------ + MissionRawError + If the request fails. The error contains the reason for the failure. + """ + + request = mission_raw_pb2.ImportMissionPlannerMissionRequest() + + + request.mission_planner_path = mission_planner_path + + response = await self._stub.ImportMissionPlannerMission(request) + + + result = self._extract_result(response) + + if result.result != MissionRawResult.Result.SUCCESS: + raise MissionRawError(result, "import_mission_planner_mission()", mission_planner_path) + + + return MissionImportData.translate_from_rpc(response.mission_import_data) + + + async def import_mission_planner_mission_from_string(self, mission_planner_mission): + """ + Import a Mission Planner mission in QGC WPL 110 format, from a string. + + Supported: + - Waypoints + - ArduPilot home position handling + + Parameters + ---------- + mission_planner_mission : std::string + Mission Planner mission as string + + Returns + ------- + mission_import_data : MissionImportData + The imported mission data + + Raises + ------ + MissionRawError + If the request fails. The error contains the reason for the failure. + """ + + request = mission_raw_pb2.ImportMissionPlannerMissionFromStringRequest() + + + request.mission_planner_mission = mission_planner_mission + + response = await self._stub.ImportMissionPlannerMissionFromString(request) + + + result = self._extract_result(response) + + if result.result != MissionRawResult.Result.SUCCESS: + raise MissionRawError(result, "import_mission_planner_mission_from_string()", mission_planner_mission) + + + return MissionImportData.translate_from_rpc(response.mission_import_data) + + + async def is_mission_finished(self): + """ + Check if the mission is finished. + + Returns true if the mission is finished, false otherwise. + + Returns + ------- + is_finished : bool + True if the mission is finished, false otherwise + + Raises + ------ + MissionRawError + If the request fails. The error contains the reason for the failure. + """ + + request = mission_raw_pb2.IsMissionFinishedRequest() + response = await self._stub.IsMissionFinished(request) + + + result = self._extract_result(response) + + if result.result != MissionRawResult.Result.SUCCESS: + raise MissionRawError(result, "is_mission_finished()") + + + return response.is_finished + \ No newline at end of file diff --git a/mavsdk/mission_raw_pb2.py b/mavsdk/mission_raw_pb2.py index 1722e0b4..d3364d4e 100644 --- a/mavsdk/mission_raw_pb2.py +++ b/mavsdk/mission_raw_pb2.py @@ -25,7 +25,7 @@ from . import mavsdk_options_pb2 as mavsdk__options__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmission_raw/mission_raw.proto\x12\x16mavsdk.rpc.mission_raw\x1a\x14mavsdk_options.proto\"R\n\x14UploadMissionRequest\x12:\n\rmission_items\x18\x01 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"]\n\x15UploadMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"S\n\x15UploadGeofenceRequest\x12:\n\rmission_items\x18\x01 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"^\n\x16UploadGeofenceResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"V\n\x18UploadRallyPointsRequest\x12:\n\rmission_items\x18\x01 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"a\n\x19UploadRallyPointsResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"\x1c\n\x1a\x43\x61ncelMissionUploadRequest\"c\n\x1b\x43\x61ncelMissionUploadResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"\x18\n\x16\x44ownloadMissionRequest\"\x9b\x01\n\x17\x44ownloadMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12:\n\rmission_items\x18\x02 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"\x19\n\x17\x44ownloadGeofenceRequest\"\x9d\x01\n\x18\x44ownloadGeofenceResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12;\n\x0egeofence_items\x18\x02 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"\x1c\n\x1a\x44ownloadRallypointsRequest\"\xa2\x01\n\x1b\x44ownloadRallypointsResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12=\n\x10rallypoint_items\x18\x02 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"\x1e\n\x1c\x43\x61ncelMissionDownloadRequest\"e\n\x1d\x43\x61ncelMissionDownloadResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"\x15\n\x13StartMissionRequest\"\\\n\x14StartMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"\x15\n\x13PauseMissionRequest\"\\\n\x14PauseMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"\x15\n\x13\x43learMissionRequest\"\\\n\x14\x43learMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"-\n\x1cSetCurrentMissionItemRequest\x12\r\n\x05index\x18\x01 \x01(\x05\"e\n\x1dSetCurrentMissionItemResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"!\n\x1fSubscribeMissionProgressRequest\"\\\n\x17MissionProgressResponse\x12\x41\n\x10mission_progress\x18\x01 \x01(\x0b\x32\'.mavsdk.rpc.mission_raw.MissionProgress\" \n\x1eSubscribeMissionChangedRequest\"1\n\x16MissionChangedResponse\x12\x17\n\x0fmission_changed\x18\x01 \x01(\x08\";\n\"ImportQgroundcontrolMissionRequest\x12\x15\n\rqgc_plan_path\x18\x01 \x01(\t\"\xb3\x01\n#ImportQgroundcontrolMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12\x46\n\x13mission_import_data\x18\x02 \x01(\x0b\x32).mavsdk.rpc.mission_raw.MissionImportData\"@\n,ImportQgroundcontrolMissionFromStringRequest\x12\x10\n\x08qgc_plan\x18\x01 \x01(\t\"\xbd\x01\n-ImportQgroundcontrolMissionFromStringResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12\x46\n\x13mission_import_data\x18\x02 \x01(\x0b\x32).mavsdk.rpc.mission_raw.MissionImportData\"1\n\x0fMissionProgress\x12\x0f\n\x07\x63urrent\x18\x01 \x01(\x05\x12\r\n\x05total\x18\x02 \x01(\x05\"\xd8\x01\n\x0bMissionItem\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\r\n\x05\x66rame\x18\x02 \x01(\r\x12\x0f\n\x07\x63ommand\x18\x03 \x01(\r\x12\x0f\n\x07\x63urrent\x18\x04 \x01(\r\x12\x14\n\x0c\x61utocontinue\x18\x05 \x01(\r\x12\x0e\n\x06param1\x18\x06 \x01(\x02\x12\x0e\n\x06param2\x18\x07 \x01(\x02\x12\x0e\n\x06param3\x18\x08 \x01(\x02\x12\x0e\n\x06param4\x18\t \x01(\x02\x12\t\n\x01x\x18\n \x01(\x05\x12\t\n\x01y\x18\x0b \x01(\x05\x12\t\n\x01z\x18\x0c \x01(\x02\x12\x14\n\x0cmission_type\x18\r \x01(\r\"\xc6\x01\n\x11MissionImportData\x12:\n\rmission_items\x18\x01 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\x12;\n\x0egeofence_items\x18\x02 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\x12\x38\n\x0brally_items\x18\x03 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"\xfe\x04\n\x10MissionRawResult\x12?\n\x06result\x18\x01 \x01(\x0e\x32/.mavsdk.rpc.mission_raw.MissionRawResult.Result\x12\x12\n\nresult_str\x18\x02 \x01(\t\"\x94\x04\n\x06Result\x12\x12\n\x0eRESULT_UNKNOWN\x10\x00\x12\x12\n\x0eRESULT_SUCCESS\x10\x01\x12\x10\n\x0cRESULT_ERROR\x10\x02\x12!\n\x1dRESULT_TOO_MANY_MISSION_ITEMS\x10\x03\x12\x0f\n\x0bRESULT_BUSY\x10\x04\x12\x12\n\x0eRESULT_TIMEOUT\x10\x05\x12\x1b\n\x17RESULT_INVALID_ARGUMENT\x10\x06\x12\x16\n\x12RESULT_UNSUPPORTED\x10\x07\x12\x1f\n\x1bRESULT_NO_MISSION_AVAILABLE\x10\x08\x12\x1d\n\x19RESULT_TRANSFER_CANCELLED\x10\t\x12\"\n\x1eRESULT_FAILED_TO_OPEN_QGC_PLAN\x10\n\x12#\n\x1fRESULT_FAILED_TO_PARSE_QGC_PLAN\x10\x0b\x12\x14\n\x10RESULT_NO_SYSTEM\x10\x0c\x12\x11\n\rRESULT_DENIED\x10\r\x12&\n\"RESULT_MISSION_TYPE_NOT_CONSISTENT\x10\x0e\x12\x1b\n\x17RESULT_INVALID_SEQUENCE\x10\x0f\x12\x1a\n\x16RESULT_CURRENT_INVALID\x10\x10\x12\x19\n\x15RESULT_PROTOCOL_ERROR\x10\x11\x12%\n!RESULT_INT_MESSAGES_NOT_SUPPORTED\x10\x12\x32\xbb\x10\n\x11MissionRawService\x12n\n\rUploadMission\x12,.mavsdk.rpc.mission_raw.UploadMissionRequest\x1a-.mavsdk.rpc.mission_raw.UploadMissionResponse\"\x00\x12q\n\x0eUploadGeofence\x12-.mavsdk.rpc.mission_raw.UploadGeofenceRequest\x1a..mavsdk.rpc.mission_raw.UploadGeofenceResponse\"\x00\x12z\n\x11UploadRallyPoints\x12\x30.mavsdk.rpc.mission_raw.UploadRallyPointsRequest\x1a\x31.mavsdk.rpc.mission_raw.UploadRallyPointsResponse\"\x00\x12\x84\x01\n\x13\x43\x61ncelMissionUpload\x12\x32.mavsdk.rpc.mission_raw.CancelMissionUploadRequest\x1a\x33.mavsdk.rpc.mission_raw.CancelMissionUploadResponse\"\x04\x80\xb5\x18\x01\x12t\n\x0f\x44ownloadMission\x12..mavsdk.rpc.mission_raw.DownloadMissionRequest\x1a/.mavsdk.rpc.mission_raw.DownloadMissionResponse\"\x00\x12w\n\x10\x44ownloadGeofence\x12/.mavsdk.rpc.mission_raw.DownloadGeofenceRequest\x1a\x30.mavsdk.rpc.mission_raw.DownloadGeofenceResponse\"\x00\x12\x80\x01\n\x13\x44ownloadRallypoints\x12\x32.mavsdk.rpc.mission_raw.DownloadRallypointsRequest\x1a\x33.mavsdk.rpc.mission_raw.DownloadRallypointsResponse\"\x00\x12\x8a\x01\n\x15\x43\x61ncelMissionDownload\x12\x34.mavsdk.rpc.mission_raw.CancelMissionDownloadRequest\x1a\x35.mavsdk.rpc.mission_raw.CancelMissionDownloadResponse\"\x04\x80\xb5\x18\x01\x12k\n\x0cStartMission\x12+.mavsdk.rpc.mission_raw.StartMissionRequest\x1a,.mavsdk.rpc.mission_raw.StartMissionResponse\"\x00\x12k\n\x0cPauseMission\x12+.mavsdk.rpc.mission_raw.PauseMissionRequest\x1a,.mavsdk.rpc.mission_raw.PauseMissionResponse\"\x00\x12k\n\x0c\x43learMission\x12+.mavsdk.rpc.mission_raw.ClearMissionRequest\x1a,.mavsdk.rpc.mission_raw.ClearMissionResponse\"\x00\x12\x86\x01\n\x15SetCurrentMissionItem\x12\x34.mavsdk.rpc.mission_raw.SetCurrentMissionItemRequest\x1a\x35.mavsdk.rpc.mission_raw.SetCurrentMissionItemResponse\"\x00\x12\x88\x01\n\x18SubscribeMissionProgress\x12\x37.mavsdk.rpc.mission_raw.SubscribeMissionProgressRequest\x1a/.mavsdk.rpc.mission_raw.MissionProgressResponse\"\x00\x30\x01\x12\x89\x01\n\x17SubscribeMissionChanged\x12\x36.mavsdk.rpc.mission_raw.SubscribeMissionChangedRequest\x1a..mavsdk.rpc.mission_raw.MissionChangedResponse\"\x04\x80\xb5\x18\x00\x30\x01\x12\x9c\x01\n\x1bImportQgroundcontrolMission\x12:.mavsdk.rpc.mission_raw.ImportQgroundcontrolMissionRequest\x1a;.mavsdk.rpc.mission_raw.ImportQgroundcontrolMissionResponse\"\x04\x80\xb5\x18\x01\x12\xba\x01\n%ImportQgroundcontrolMissionFromString\x12\x44.mavsdk.rpc.mission_raw.ImportQgroundcontrolMissionFromStringRequest\x1a\x45.mavsdk.rpc.mission_raw.ImportQgroundcontrolMissionFromStringResponse\"\x04\x80\xb5\x18\x01\x42(\n\x15io.mavsdk.mission_rawB\x0fMissionRawProtob\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmission_raw/mission_raw.proto\x12\x16mavsdk.rpc.mission_raw\x1a\x14mavsdk_options.proto\"R\n\x14UploadMissionRequest\x12:\n\rmission_items\x18\x01 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"]\n\x15UploadMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"S\n\x15UploadGeofenceRequest\x12:\n\rmission_items\x18\x01 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"^\n\x16UploadGeofenceResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"V\n\x18UploadRallyPointsRequest\x12:\n\rmission_items\x18\x01 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"a\n\x19UploadRallyPointsResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"\x1c\n\x1a\x43\x61ncelMissionUploadRequest\"c\n\x1b\x43\x61ncelMissionUploadResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"\x18\n\x16\x44ownloadMissionRequest\"\x9b\x01\n\x17\x44ownloadMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12:\n\rmission_items\x18\x02 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"\x19\n\x17\x44ownloadGeofenceRequest\"\x9d\x01\n\x18\x44ownloadGeofenceResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12;\n\x0egeofence_items\x18\x02 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"\x1c\n\x1a\x44ownloadRallypointsRequest\"\xa2\x01\n\x1b\x44ownloadRallypointsResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12=\n\x10rallypoint_items\x18\x02 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"\x1e\n\x1c\x43\x61ncelMissionDownloadRequest\"e\n\x1d\x43\x61ncelMissionDownloadResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"\x15\n\x13StartMissionRequest\"\\\n\x14StartMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"\x15\n\x13PauseMissionRequest\"\\\n\x14PauseMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"\x15\n\x13\x43learMissionRequest\"\\\n\x14\x43learMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"-\n\x1cSetCurrentMissionItemRequest\x12\r\n\x05index\x18\x01 \x01(\x05\"e\n\x1dSetCurrentMissionItemResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\"!\n\x1fSubscribeMissionProgressRequest\"\\\n\x17MissionProgressResponse\x12\x41\n\x10mission_progress\x18\x01 \x01(\x0b\x32\'.mavsdk.rpc.mission_raw.MissionProgress\" \n\x1eSubscribeMissionChangedRequest\"1\n\x16MissionChangedResponse\x12\x17\n\x0fmission_changed\x18\x01 \x01(\x08\";\n\"ImportQgroundcontrolMissionRequest\x12\x15\n\rqgc_plan_path\x18\x01 \x01(\t\"\xb3\x01\n#ImportQgroundcontrolMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12\x46\n\x13mission_import_data\x18\x02 \x01(\x0b\x32).mavsdk.rpc.mission_raw.MissionImportData\"@\n,ImportQgroundcontrolMissionFromStringRequest\x12\x10\n\x08qgc_plan\x18\x01 \x01(\t\"\xbd\x01\n-ImportQgroundcontrolMissionFromStringResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12\x46\n\x13mission_import_data\x18\x02 \x01(\x0b\x32).mavsdk.rpc.mission_raw.MissionImportData\"B\n\"ImportMissionPlannerMissionRequest\x12\x1c\n\x14mission_planner_path\x18\x01 \x01(\t\"\xb3\x01\n#ImportMissionPlannerMissionResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12\x46\n\x13mission_import_data\x18\x02 \x01(\x0b\x32).mavsdk.rpc.mission_raw.MissionImportData\"O\n,ImportMissionPlannerMissionFromStringRequest\x12\x1f\n\x17mission_planner_mission\x18\x01 \x01(\t\"\xbd\x01\n-ImportMissionPlannerMissionFromStringResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12\x46\n\x13mission_import_data\x18\x02 \x01(\x0b\x32).mavsdk.rpc.mission_raw.MissionImportData\"\x1a\n\x18IsMissionFinishedRequest\"v\n\x19IsMissionFinishedResponse\x12\x44\n\x12mission_raw_result\x18\x01 \x01(\x0b\x32(.mavsdk.rpc.mission_raw.MissionRawResult\x12\x13\n\x0bis_finished\x18\x02 \x01(\x08\"1\n\x0fMissionProgress\x12\x0f\n\x07\x63urrent\x18\x01 \x01(\x05\x12\r\n\x05total\x18\x02 \x01(\x05\"\xd8\x01\n\x0bMissionItem\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\r\n\x05\x66rame\x18\x02 \x01(\r\x12\x0f\n\x07\x63ommand\x18\x03 \x01(\r\x12\x0f\n\x07\x63urrent\x18\x04 \x01(\r\x12\x14\n\x0c\x61utocontinue\x18\x05 \x01(\r\x12\x0e\n\x06param1\x18\x06 \x01(\x02\x12\x0e\n\x06param2\x18\x07 \x01(\x02\x12\x0e\n\x06param3\x18\x08 \x01(\x02\x12\x0e\n\x06param4\x18\t \x01(\x02\x12\t\n\x01x\x18\n \x01(\x05\x12\t\n\x01y\x18\x0b \x01(\x05\x12\t\n\x01z\x18\x0c \x01(\x02\x12\x14\n\x0cmission_type\x18\r \x01(\r\"\xc6\x01\n\x11MissionImportData\x12:\n\rmission_items\x18\x01 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\x12;\n\x0egeofence_items\x18\x02 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\x12\x38\n\x0brally_items\x18\x03 \x03(\x0b\x32#.mavsdk.rpc.mission_raw.MissionItem\"\xdf\x05\n\x10MissionRawResult\x12?\n\x06result\x18\x01 \x01(\x0e\x32/.mavsdk.rpc.mission_raw.MissionRawResult.Result\x12\x12\n\nresult_str\x18\x02 \x01(\t\"\xf5\x04\n\x06Result\x12\x12\n\x0eRESULT_UNKNOWN\x10\x00\x12\x12\n\x0eRESULT_SUCCESS\x10\x01\x12\x10\n\x0cRESULT_ERROR\x10\x02\x12!\n\x1dRESULT_TOO_MANY_MISSION_ITEMS\x10\x03\x12\x0f\n\x0bRESULT_BUSY\x10\x04\x12\x12\n\x0eRESULT_TIMEOUT\x10\x05\x12\x1b\n\x17RESULT_INVALID_ARGUMENT\x10\x06\x12\x16\n\x12RESULT_UNSUPPORTED\x10\x07\x12\x1f\n\x1bRESULT_NO_MISSION_AVAILABLE\x10\x08\x12\x1d\n\x19RESULT_TRANSFER_CANCELLED\x10\t\x12\"\n\x1eRESULT_FAILED_TO_OPEN_QGC_PLAN\x10\n\x12#\n\x1fRESULT_FAILED_TO_PARSE_QGC_PLAN\x10\x0b\x12\x14\n\x10RESULT_NO_SYSTEM\x10\x0c\x12\x11\n\rRESULT_DENIED\x10\r\x12&\n\"RESULT_MISSION_TYPE_NOT_CONSISTENT\x10\x0e\x12\x1b\n\x17RESULT_INVALID_SEQUENCE\x10\x0f\x12\x1a\n\x16RESULT_CURRENT_INVALID\x10\x10\x12\x19\n\x15RESULT_PROTOCOL_ERROR\x10\x11\x12%\n!RESULT_INT_MESSAGES_NOT_SUPPORTED\x10\x12\x12.\n*RESULT_FAILED_TO_OPEN_MISSION_PLANNER_PLAN\x10\x13\x12/\n+RESULT_FAILED_TO_PARSE_MISSION_PLANNER_PLAN\x10\x14\x32\x97\x14\n\x11MissionRawService\x12n\n\rUploadMission\x12,.mavsdk.rpc.mission_raw.UploadMissionRequest\x1a-.mavsdk.rpc.mission_raw.UploadMissionResponse\"\x00\x12q\n\x0eUploadGeofence\x12-.mavsdk.rpc.mission_raw.UploadGeofenceRequest\x1a..mavsdk.rpc.mission_raw.UploadGeofenceResponse\"\x00\x12z\n\x11UploadRallyPoints\x12\x30.mavsdk.rpc.mission_raw.UploadRallyPointsRequest\x1a\x31.mavsdk.rpc.mission_raw.UploadRallyPointsResponse\"\x00\x12\x84\x01\n\x13\x43\x61ncelMissionUpload\x12\x32.mavsdk.rpc.mission_raw.CancelMissionUploadRequest\x1a\x33.mavsdk.rpc.mission_raw.CancelMissionUploadResponse\"\x04\x80\xb5\x18\x01\x12t\n\x0f\x44ownloadMission\x12..mavsdk.rpc.mission_raw.DownloadMissionRequest\x1a/.mavsdk.rpc.mission_raw.DownloadMissionResponse\"\x00\x12w\n\x10\x44ownloadGeofence\x12/.mavsdk.rpc.mission_raw.DownloadGeofenceRequest\x1a\x30.mavsdk.rpc.mission_raw.DownloadGeofenceResponse\"\x00\x12\x80\x01\n\x13\x44ownloadRallypoints\x12\x32.mavsdk.rpc.mission_raw.DownloadRallypointsRequest\x1a\x33.mavsdk.rpc.mission_raw.DownloadRallypointsResponse\"\x00\x12\x8a\x01\n\x15\x43\x61ncelMissionDownload\x12\x34.mavsdk.rpc.mission_raw.CancelMissionDownloadRequest\x1a\x35.mavsdk.rpc.mission_raw.CancelMissionDownloadResponse\"\x04\x80\xb5\x18\x01\x12k\n\x0cStartMission\x12+.mavsdk.rpc.mission_raw.StartMissionRequest\x1a,.mavsdk.rpc.mission_raw.StartMissionResponse\"\x00\x12k\n\x0cPauseMission\x12+.mavsdk.rpc.mission_raw.PauseMissionRequest\x1a,.mavsdk.rpc.mission_raw.PauseMissionResponse\"\x00\x12k\n\x0c\x43learMission\x12+.mavsdk.rpc.mission_raw.ClearMissionRequest\x1a,.mavsdk.rpc.mission_raw.ClearMissionResponse\"\x00\x12\x86\x01\n\x15SetCurrentMissionItem\x12\x34.mavsdk.rpc.mission_raw.SetCurrentMissionItemRequest\x1a\x35.mavsdk.rpc.mission_raw.SetCurrentMissionItemResponse\"\x00\x12\x88\x01\n\x18SubscribeMissionProgress\x12\x37.mavsdk.rpc.mission_raw.SubscribeMissionProgressRequest\x1a/.mavsdk.rpc.mission_raw.MissionProgressResponse\"\x00\x30\x01\x12\x89\x01\n\x17SubscribeMissionChanged\x12\x36.mavsdk.rpc.mission_raw.SubscribeMissionChangedRequest\x1a..mavsdk.rpc.mission_raw.MissionChangedResponse\"\x04\x80\xb5\x18\x00\x30\x01\x12\x9c\x01\n\x1bImportQgroundcontrolMission\x12:.mavsdk.rpc.mission_raw.ImportQgroundcontrolMissionRequest\x1a;.mavsdk.rpc.mission_raw.ImportQgroundcontrolMissionResponse\"\x04\x80\xb5\x18\x01\x12\xba\x01\n%ImportQgroundcontrolMissionFromString\x12\x44.mavsdk.rpc.mission_raw.ImportQgroundcontrolMissionFromStringRequest\x1a\x45.mavsdk.rpc.mission_raw.ImportQgroundcontrolMissionFromStringResponse\"\x04\x80\xb5\x18\x01\x12\x9c\x01\n\x1bImportMissionPlannerMission\x12:.mavsdk.rpc.mission_raw.ImportMissionPlannerMissionRequest\x1a;.mavsdk.rpc.mission_raw.ImportMissionPlannerMissionResponse\"\x04\x80\xb5\x18\x01\x12\xba\x01\n%ImportMissionPlannerMissionFromString\x12\x44.mavsdk.rpc.mission_raw.ImportMissionPlannerMissionFromStringRequest\x1a\x45.mavsdk.rpc.mission_raw.ImportMissionPlannerMissionFromStringResponse\"\x04\x80\xb5\x18\x01\x12~\n\x11IsMissionFinished\x12\x30.mavsdk.rpc.mission_raw.IsMissionFinishedRequest\x1a\x31.mavsdk.rpc.mission_raw.IsMissionFinishedResponse\"\x04\x80\xb5\x18\x01\x42(\n\x15io.mavsdk.mission_rawB\x0fMissionRawProtob\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -43,6 +43,12 @@ _globals['_MISSIONRAWSERVICE'].methods_by_name['ImportQgroundcontrolMission']._serialized_options = b'\200\265\030\001' _globals['_MISSIONRAWSERVICE'].methods_by_name['ImportQgroundcontrolMissionFromString']._loaded_options = None _globals['_MISSIONRAWSERVICE'].methods_by_name['ImportQgroundcontrolMissionFromString']._serialized_options = b'\200\265\030\001' + _globals['_MISSIONRAWSERVICE'].methods_by_name['ImportMissionPlannerMission']._loaded_options = None + _globals['_MISSIONRAWSERVICE'].methods_by_name['ImportMissionPlannerMission']._serialized_options = b'\200\265\030\001' + _globals['_MISSIONRAWSERVICE'].methods_by_name['ImportMissionPlannerMissionFromString']._loaded_options = None + _globals['_MISSIONRAWSERVICE'].methods_by_name['ImportMissionPlannerMissionFromString']._serialized_options = b'\200\265\030\001' + _globals['_MISSIONRAWSERVICE'].methods_by_name['IsMissionFinished']._loaded_options = None + _globals['_MISSIONRAWSERVICE'].methods_by_name['IsMissionFinished']._serialized_options = b'\200\265\030\001' _globals['_UPLOADMISSIONREQUEST']._serialized_start=79 _globals['_UPLOADMISSIONREQUEST']._serialized_end=161 _globals['_UPLOADMISSIONRESPONSE']._serialized_start=163 @@ -107,16 +113,28 @@ _globals['_IMPORTQGROUNDCONTROLMISSIONFROMSTRINGREQUEST']._serialized_end=2480 _globals['_IMPORTQGROUNDCONTROLMISSIONFROMSTRINGRESPONSE']._serialized_start=2483 _globals['_IMPORTQGROUNDCONTROLMISSIONFROMSTRINGRESPONSE']._serialized_end=2672 - _globals['_MISSIONPROGRESS']._serialized_start=2674 - _globals['_MISSIONPROGRESS']._serialized_end=2723 - _globals['_MISSIONITEM']._serialized_start=2726 - _globals['_MISSIONITEM']._serialized_end=2942 - _globals['_MISSIONIMPORTDATA']._serialized_start=2945 - _globals['_MISSIONIMPORTDATA']._serialized_end=3143 - _globals['_MISSIONRAWRESULT']._serialized_start=3146 - _globals['_MISSIONRAWRESULT']._serialized_end=3784 - _globals['_MISSIONRAWRESULT_RESULT']._serialized_start=3252 - _globals['_MISSIONRAWRESULT_RESULT']._serialized_end=3784 - _globals['_MISSIONRAWSERVICE']._serialized_start=3787 - _globals['_MISSIONRAWSERVICE']._serialized_end=5894 + _globals['_IMPORTMISSIONPLANNERMISSIONREQUEST']._serialized_start=2674 + _globals['_IMPORTMISSIONPLANNERMISSIONREQUEST']._serialized_end=2740 + _globals['_IMPORTMISSIONPLANNERMISSIONRESPONSE']._serialized_start=2743 + _globals['_IMPORTMISSIONPLANNERMISSIONRESPONSE']._serialized_end=2922 + _globals['_IMPORTMISSIONPLANNERMISSIONFROMSTRINGREQUEST']._serialized_start=2924 + _globals['_IMPORTMISSIONPLANNERMISSIONFROMSTRINGREQUEST']._serialized_end=3003 + _globals['_IMPORTMISSIONPLANNERMISSIONFROMSTRINGRESPONSE']._serialized_start=3006 + _globals['_IMPORTMISSIONPLANNERMISSIONFROMSTRINGRESPONSE']._serialized_end=3195 + _globals['_ISMISSIONFINISHEDREQUEST']._serialized_start=3197 + _globals['_ISMISSIONFINISHEDREQUEST']._serialized_end=3223 + _globals['_ISMISSIONFINISHEDRESPONSE']._serialized_start=3225 + _globals['_ISMISSIONFINISHEDRESPONSE']._serialized_end=3343 + _globals['_MISSIONPROGRESS']._serialized_start=3345 + _globals['_MISSIONPROGRESS']._serialized_end=3394 + _globals['_MISSIONITEM']._serialized_start=3397 + _globals['_MISSIONITEM']._serialized_end=3613 + _globals['_MISSIONIMPORTDATA']._serialized_start=3616 + _globals['_MISSIONIMPORTDATA']._serialized_end=3814 + _globals['_MISSIONRAWRESULT']._serialized_start=3817 + _globals['_MISSIONRAWRESULT']._serialized_end=4552 + _globals['_MISSIONRAWRESULT_RESULT']._serialized_start=3923 + _globals['_MISSIONRAWRESULT_RESULT']._serialized_end=4552 + _globals['_MISSIONRAWSERVICE']._serialized_start=4555 + _globals['_MISSIONRAWSERVICE']._serialized_end=7138 # @@protoc_insertion_point(module_scope) diff --git a/mavsdk/mission_raw_pb2_grpc.py b/mavsdk/mission_raw_pb2_grpc.py index 2c718efe..9582d773 100644 --- a/mavsdk/mission_raw_pb2_grpc.py +++ b/mavsdk/mission_raw_pb2_grpc.py @@ -115,6 +115,21 @@ def __init__(self, channel): request_serializer=mission__raw_dot_mission__raw__pb2.ImportQgroundcontrolMissionFromStringRequest.SerializeToString, response_deserializer=mission__raw_dot_mission__raw__pb2.ImportQgroundcontrolMissionFromStringResponse.FromString, _registered_method=True) + self.ImportMissionPlannerMission = channel.unary_unary( + '/mavsdk.rpc.mission_raw.MissionRawService/ImportMissionPlannerMission', + request_serializer=mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionRequest.SerializeToString, + response_deserializer=mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionResponse.FromString, + _registered_method=True) + self.ImportMissionPlannerMissionFromString = channel.unary_unary( + '/mavsdk.rpc.mission_raw.MissionRawService/ImportMissionPlannerMissionFromString', + request_serializer=mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionFromStringRequest.SerializeToString, + response_deserializer=mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionFromStringResponse.FromString, + _registered_method=True) + self.IsMissionFinished = channel.unary_unary( + '/mavsdk.rpc.mission_raw.MissionRawService/IsMissionFinished', + request_serializer=mission__raw_dot_mission__raw__pb2.IsMissionFinishedRequest.SerializeToString, + response_deserializer=mission__raw_dot_mission__raw__pb2.IsMissionFinishedResponse.FromString, + _registered_method=True) class MissionRawServiceServicer(object): @@ -279,6 +294,40 @@ def ImportQgroundcontrolMissionFromString(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def ImportMissionPlannerMission(self, request, context): + """ + Import a Mission Planner mission in QGC WPL 110 format, from a file. + + Supported: + - Waypoints + - ArduPilot home position handling + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ImportMissionPlannerMissionFromString(self, request, context): + """ + Import a Mission Planner mission in QGC WPL 110 format, from a string. + + Supported: + - Waypoints + - ArduPilot home position handling + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def IsMissionFinished(self, request, context): + """ + Check if the mission is finished. + + Returns true if the mission is finished, false otherwise. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_MissionRawServiceServicer_to_server(servicer, server): rpc_method_handlers = { @@ -362,6 +411,21 @@ def add_MissionRawServiceServicer_to_server(servicer, server): request_deserializer=mission__raw_dot_mission__raw__pb2.ImportQgroundcontrolMissionFromStringRequest.FromString, response_serializer=mission__raw_dot_mission__raw__pb2.ImportQgroundcontrolMissionFromStringResponse.SerializeToString, ), + 'ImportMissionPlannerMission': grpc.unary_unary_rpc_method_handler( + servicer.ImportMissionPlannerMission, + request_deserializer=mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionRequest.FromString, + response_serializer=mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionResponse.SerializeToString, + ), + 'ImportMissionPlannerMissionFromString': grpc.unary_unary_rpc_method_handler( + servicer.ImportMissionPlannerMissionFromString, + request_deserializer=mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionFromStringRequest.FromString, + response_serializer=mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionFromStringResponse.SerializeToString, + ), + 'IsMissionFinished': grpc.unary_unary_rpc_method_handler( + servicer.IsMissionFinished, + request_deserializer=mission__raw_dot_mission__raw__pb2.IsMissionFinishedRequest.FromString, + response_serializer=mission__raw_dot_mission__raw__pb2.IsMissionFinishedResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'mavsdk.rpc.mission_raw.MissionRawService', rpc_method_handlers) @@ -805,3 +869,84 @@ def ImportQgroundcontrolMissionFromString(request, timeout, metadata, _registered_method=True) + + @staticmethod + def ImportMissionPlannerMission(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/mavsdk.rpc.mission_raw.MissionRawService/ImportMissionPlannerMission', + mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionRequest.SerializeToString, + mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ImportMissionPlannerMissionFromString(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/mavsdk.rpc.mission_raw.MissionRawService/ImportMissionPlannerMissionFromString', + mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionFromStringRequest.SerializeToString, + mission__raw_dot_mission__raw__pb2.ImportMissionPlannerMissionFromStringResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def IsMissionFinished(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/mavsdk.rpc.mission_raw.MissionRawService/IsMissionFinished', + mission__raw_dot_mission__raw__pb2.IsMissionFinishedRequest.SerializeToString, + mission__raw_dot_mission__raw__pb2.IsMissionFinishedResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/mavsdk/mission_raw_server.py b/mavsdk/mission_raw_server.py index d44562ec..0de20d11 100644 --- a/mavsdk/mission_raw_server.py +++ b/mavsdk/mission_raw_server.py @@ -658,7 +658,7 @@ async def incoming_mission(self): raise MissionRawServerError(result, "incoming_mission()") if result.result == MissionRawServerResult.Result.SUCCESS: - incoming_mission_stream.cancel() + incoming_mission_stream.cancel(); return diff --git a/mavsdk/source/plugins/index.rst b/mavsdk/source/plugins/index.rst index da4df86d..53dcc038 100644 --- a/mavsdk/source/plugins/index.rst +++ b/mavsdk/source/plugins/index.rst @@ -47,3 +47,4 @@ Plugins component_metadata_server log_streaming events + mavlink_direct diff --git a/mavsdk/source/plugins/mavlink_direct.rst b/mavsdk/source/plugins/mavlink_direct.rst new file mode 100644 index 00000000..44619f83 --- /dev/null +++ b/mavsdk/source/plugins/mavlink_direct.rst @@ -0,0 +1,8 @@ +MavlinkDirect +==== + +.. automodule:: mavsdk.mavlink_direct + :members: + :undoc-members: + :show-inheritance: + :exclude-members: translate_from_rpc, translate_to_rpc \ No newline at end of file diff --git a/proto b/proto index 20aa335e..61b1b1a1 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 20aa335ef85b50d844ffb3d3a53420c6fbcc289b +Subproject commit 61b1b1a197966faed181f8c7c5f2fa57d832cf1f diff --git a/setup.py b/setup.py index 6aea6d4f..d6b1a832 100644 --- a/setup.py +++ b/setup.py @@ -64,8 +64,10 @@ def platform_suffix(self): raise NotImplementedError( "Error: unknown MAVSDK_SERVER_ARCH: " f"{os.environ['MAVSDK_SERVER_ARCH']}") + elif platform.system() == 'Linux': return 'musl_x86_64' + elif platform.system() == 'Darwin': if platform.processor() == 'i386': return 'macos_x64' @@ -73,9 +75,24 @@ def platform_suffix(self): return 'macos_arm64' raise NotImplementedError( f"Error: unknown macOS processor: {platform.processor()}") + + elif platform.system() == 'Windows' and 'MAVSDK_SERVER_ARCH' in os.environ: + if os.environ['MAVSDK_SERVER_ARCH'] == "x86": + return 'win_x86' + elif os.environ['MAVSDK_SERVER_ARCH'] == "x64": + return 'win_x64' + elif os.environ['MAVSDK_SERVER_ARCH'] == "arm64": + return 'win_arm64' + else: + raise NotImplementedError( + "Error: unknown MAVSDK_SERVER_ARCH: " + f"{os.environ['MAVSDK_SERVER_ARCH']}") + elif platform.system() == 'Windows' \ - and platform.processor().startswith('AMD64'): - return 'win32.exe' + and (platform.processor().startswith('AMD64') or + platform.processor().startswith('Intel64')): + # Fallback + return 'win_x64.exe' else: raise NotImplementedError( "Error: mavsdk_server is not distributed for platform "