From 257708ae4289a7e50ceebbaa8e6fce99a4fcd91e Mon Sep 17 00:00:00 2001 From: xin Date: Wed, 24 Dec 2025 09:10:08 +0800 Subject: [PATCH] =?UTF-8?q?M350b=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + Source/M300/PSDK_Qt/ZZ_Types_DJI.h | 49 + .../{ZZ_Types_M300.h => ZZ_Types_M300.hbac} | 0 .../psdk_lib/include/dji_aircraft_info.h | 106 + .../psdk_lib/include/dji_camera_manager.h | 1674 ++++++++++ .../M300/PSDK_Qt/psdk_lib/include/dji_core.h | 118 + .../M300/PSDK_Qt/psdk_lib/include/dji_error.h | 1374 +++++++++ .../psdk_lib/include/dji_fc_subscription.h | 1349 +++++++++ .../psdk_lib/include/dji_flight_controller.h | 657 ++++ .../PSDK_Qt/psdk_lib/include/dji_gimbal.h | 322 ++ .../psdk_lib/include/dji_gimbal_manager.h | 136 + .../include/dji_high_speed_data_channel.h | 103 + .../M300/PSDK_Qt/psdk_lib/include/dji_hms.h | 50 + .../psdk_lib/include/dji_hms_customization.h | 133 + .../psdk_lib/include/dji_hms_info_table.h | 735 +++++ .../psdk_lib/include/dji_hms_manager.h | 80 + .../psdk_lib/include/dji_interest_point.h | 74 + .../PSDK_Qt/psdk_lib/include/dji_liveview.h | 127 + .../PSDK_Qt/psdk_lib/include/dji_logger.h | 119 + .../include/dji_low_speed_data_channel.h | 111 + .../psdk_lib/include/dji_mop_channel.h | 156 + .../psdk_lib/include/dji_payload_camera.h | 906 ++++++ .../PSDK_Qt/psdk_lib/include/dji_perception.h | 167 + .../PSDK_Qt/psdk_lib/include/dji_platform.h | 383 +++ .../psdk_lib/include/dji_positioning.h | 163 + .../psdk_lib/include/dji_power_management.h | 117 + .../PSDK_Qt/psdk_lib/include/dji_time_sync.h | 99 + .../PSDK_Qt/psdk_lib/include/dji_typedef.h | 435 +++ .../PSDK_Qt/psdk_lib/include/dji_upgrade.h | 216 ++ .../PSDK_Qt/psdk_lib/include/dji_version.h | 51 + .../psdk_lib/include/dji_waypoint_v2.h | 124 + .../psdk_lib/include/dji_waypoint_v2_type.h | 1150 +++++++ .../psdk_lib/include/dji_waypoint_v3.h | 159 + .../PSDK_Qt/psdk_lib/include/dji_widget.h | 307 ++ .../M300/PSDK_Qt/psdk_lib/include/dji_xport.h | 222 ++ .../legacy_psdk2.x/psdk_aircraft_info.h | 126 + .../include/legacy_psdk2.x/psdk_core.h | 72 + .../legacy_psdk2.x/psdk_data_channel.h | 72 + .../legacy_psdk2.x/psdk_data_subscription.h | 434 +++ .../legacy_psdk2.x/psdk_data_transmission.h | 222 ++ .../include/legacy_psdk2.x/psdk_error.h | 208 ++ .../include/legacy_psdk2.x/psdk_gimbal.h | 166 + .../include/legacy_psdk2.x/psdk_logger.h | 113 + .../include/legacy_psdk2.x/psdk_mop_channel.h | 150 + .../legacy_psdk2.x/psdk_payload_camera.h | 421 +++ .../psdk_payload_collaboration.h | 116 + .../include/legacy_psdk2.x/psdk_platform.h | 216 ++ .../include/legacy_psdk2.x/psdk_positioning.h | 113 + .../legacy_psdk2.x/psdk_power_management.h | 105 + .../legacy_psdk2.x/psdk_product_info.h | 63 + .../include/legacy_psdk2.x/psdk_time_sync.h | 92 + .../include/legacy_psdk2.x/psdk_typedef.h | 88 + .../include/legacy_psdk2.x/psdk_upgrade.h | 140 + .../include/legacy_psdk2.x/psdk_version.h | 54 + .../include/legacy_psdk2.x/psdk_widget.h | 171 ++ .../include/legacy_psdk2.x/psdk_xport.h | 223 ++ .../lib/aarch64-linux-gnu-gcc/libpayloadsdk.a | Bin 0 -> 2934032 bytes .../lib/arm-linux-gnueabi-gcc/libpayloadsdk.a | Bin 0 -> 2286752 bytes .../arm-linux-gnueabihf-gcc/libpayloadsdk.a | Bin 0 -> 1800008 bytes .../lib/armcc_cortex-m4/libpayload.lib | Bin 0 -> 2186852 bytes .../lib/x86_64-linux-gnu-gcc/libpayloadsdk.a | Bin 0 -> 2666368 bytes Source/M300/PSDK_Qt/utils/cJSON.c | 2688 +++++++++++++++++ Source/M300/PSDK_Qt/utils/cJSON.h | 290 ++ .../M300/PSDK_Qt/utils/dji_config_manager.c | 339 +++ .../M300/PSDK_Qt/utils/dji_config_manager.h | 88 + Source/M300/PSDK_Qt/{ => utils}/util_buffer.c | 0 Source/M300/PSDK_Qt/{ => utils}/util_buffer.h | 0 Source/M300/PSDK_Qt/{ => utils}/util_file.c | 4 +- Source/M300/PSDK_Qt/{ => utils}/util_file.h | 4 +- Source/M300/PSDK_Qt/utils/util_link_list.c | 218 ++ Source/M300/PSDK_Qt/utils/util_link_list.h | 94 + Source/M300/PSDK_Qt/{ => utils}/util_md5.c | 0 Source/M300/PSDK_Qt/{ => utils}/util_md5.h | 0 Source/M300/PSDK_Qt/{ => utils}/util_misc.c | 0 Source/M300/PSDK_Qt/{ => utils}/util_misc.h | 0 Source/M300/PSDK_Qt/{ => utils}/util_time.c | 0 Source/M300/PSDK_Qt/{ => utils}/util_time.h | 0 othersoft/co2correct/CMakeLists.txt | 20 + othersoft/co2correct/README.md | 136 + othersoft/co2correct/build.sh | 29 + othersoft/co2correct/calibrator.cpp | 478 +++ othersoft/co2correct/calibrator.h | 71 + othersoft/co2correct/main.cpp | 99 + 83 files changed, 19895 insertions(+), 4 deletions(-) create mode 100644 Source/M300/PSDK_Qt/ZZ_Types_DJI.h rename Source/M300/PSDK_Qt/{ZZ_Types_M300.h => ZZ_Types_M300.hbac} (100%) create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_aircraft_info.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_camera_manager.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_core.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_error.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_fc_subscription.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_flight_controller.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_gimbal.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_gimbal_manager.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_high_speed_data_channel.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_hms.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_customization.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_info_table.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_manager.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_interest_point.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_liveview.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_logger.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_low_speed_data_channel.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_mop_channel.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_payload_camera.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_perception.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_platform.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_positioning.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_power_management.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_time_sync.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_typedef.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_upgrade.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_version.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v2.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v2_type.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v3.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_widget.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/dji_xport.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_aircraft_info.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_core.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_channel.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_subscription.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_transmission.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_error.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_gimbal.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_logger.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_mop_channel.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_payload_camera.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_payload_collaboration.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_platform.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_positioning.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_power_management.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_product_info.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_time_sync.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_typedef.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_upgrade.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_version.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_widget.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_xport.h create mode 100644 Source/M300/PSDK_Qt/psdk_lib/lib/aarch64-linux-gnu-gcc/libpayloadsdk.a create mode 100644 Source/M300/PSDK_Qt/psdk_lib/lib/arm-linux-gnueabi-gcc/libpayloadsdk.a create mode 100644 Source/M300/PSDK_Qt/psdk_lib/lib/arm-linux-gnueabihf-gcc/libpayloadsdk.a create mode 100644 Source/M300/PSDK_Qt/psdk_lib/lib/armcc_cortex-m4/libpayload.lib create mode 100644 Source/M300/PSDK_Qt/psdk_lib/lib/x86_64-linux-gnu-gcc/libpayloadsdk.a create mode 100644 Source/M300/PSDK_Qt/utils/cJSON.c create mode 100644 Source/M300/PSDK_Qt/utils/cJSON.h create mode 100644 Source/M300/PSDK_Qt/utils/dji_config_manager.c create mode 100644 Source/M300/PSDK_Qt/utils/dji_config_manager.h rename Source/M300/PSDK_Qt/{ => utils}/util_buffer.c (100%) rename Source/M300/PSDK_Qt/{ => utils}/util_buffer.h (100%) rename Source/M300/PSDK_Qt/{ => utils}/util_file.c (98%) rename Source/M300/PSDK_Qt/{ => utils}/util_file.h (96%) create mode 100644 Source/M300/PSDK_Qt/utils/util_link_list.c create mode 100644 Source/M300/PSDK_Qt/utils/util_link_list.h rename Source/M300/PSDK_Qt/{ => utils}/util_md5.c (100%) rename Source/M300/PSDK_Qt/{ => utils}/util_md5.h (100%) rename Source/M300/PSDK_Qt/{ => utils}/util_misc.c (100%) rename Source/M300/PSDK_Qt/{ => utils}/util_misc.h (100%) rename Source/M300/PSDK_Qt/{ => utils}/util_time.c (100%) rename Source/M300/PSDK_Qt/{ => utils}/util_time.h (100%) create mode 100644 othersoft/co2correct/CMakeLists.txt create mode 100644 othersoft/co2correct/README.md create mode 100755 othersoft/co2correct/build.sh create mode 100644 othersoft/co2correct/calibrator.cpp create mode 100644 othersoft/co2correct/calibrator.h create mode 100644 othersoft/co2correct/main.cpp diff --git a/.gitignore b/.gitignore index cc1ad7a..b717c04 100644 --- a/.gitignore +++ b/.gitignore @@ -401,3 +401,7 @@ FodyWeavers.xsd # JetBrains Rider *.sln.iml +/cmake-build-debug-nanopico2/ +/cmake-build-debug/ +/cmake-build-debug-airborn_co2/ +/PSDKback/ diff --git a/Source/M300/PSDK_Qt/ZZ_Types_DJI.h b/Source/M300/PSDK_Qt/ZZ_Types_DJI.h new file mode 100644 index 0000000..3f22cc6 --- /dev/null +++ b/Source/M300/PSDK_Qt/ZZ_Types_DJI.h @@ -0,0 +1,49 @@ +#pragma once +#include "pch.h" +#include "dji_typedef.h" +namespace ZZ +{ + namespace Device + { + namespace DJI + { + enum HardwareConnectionMode + { + UartOnly = 0, + UartAndUSBBulk, + UartAndNetwork + }; + + typedef struct tagAppRegInfo + { + QString qstrUserAppName; + QString qstrUserAppID; + QString qstrUserAppKey; + QString qstrUserAppLic; + QString qstrUserAppAcc; + }AppRegInfo; + + typedef struct tagHardwareInfo + { + HardwareConnectionMode enumHCM; + QString qstrBaudRate; + }HardwareInfo; + + // typedef struct tagSensorPort + // { + // QString qstrWindSensorPort; + // QString qstrGasSensorPort; + // }SensorPort; + + typedef struct tagUIConfig + { + short sCaptureMode = 0; + short sSamplingRate = 0; + short sDecisionHeight = 1; + }UIConfig; + }; + }; +}; + + + diff --git a/Source/M300/PSDK_Qt/ZZ_Types_M300.h b/Source/M300/PSDK_Qt/ZZ_Types_M300.hbac similarity index 100% rename from Source/M300/PSDK_Qt/ZZ_Types_M300.h rename to Source/M300/PSDK_Qt/ZZ_Types_M300.hbac diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_aircraft_info.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_aircraft_info.h new file mode 100644 index 0000000..79a513b --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_aircraft_info.h @@ -0,0 +1,106 @@ +/** + ******************************************************************** + * @file dji_aircraft_info.h + * @brief This is the header file for "dji_aircraft_info.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_AIRCRAFT_INFO_H +#define DJI_AIRCRAFT_INFO_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Information related to mobile APP. + */ +typedef struct { + E_DjiMobileAppLanguage appLanguage; /*!< Mobile APP system language */ + E_DjiMobileAppScreenType appScreenType; /*!< Mobile APP screen size type. */ +} T_DjiMobileAppInfo; + +/** + * @brief Basic information about the aircraft system, mainly including some constant parameters information. + */ +typedef struct { + E_DjiAircraftSeries aircraftSeries; /*!< Aircraft series. */ + E_DjiMountPositionType mountPositionType; /*!< Mount position type. */ + E_DjiAircraftType aircraftType; /*!< Aircraft type. */ + E_DjiSdkAdapterType djiAdapterType; /*!< DJI adapter type. */ + E_DjiMountPosition mountPosition; /*!< Payload mount position. */ +} T_DjiAircraftInfoBaseInfo; + +/** + * @brief Aircraft version information. + */ +typedef struct { + uint8_t debugVersion; + uint8_t modifyVersion; + uint8_t minorVersion; + uint8_t majorVersion; +} T_DjiAircraftVersion; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Basic information about the aircraft system, including aircraft type and DJI adapter type. + * @param baseInfo: Pointer to a memory space where the aircraft's basic information will be stored. + * @return Execution result. + */ +T_DjiReturnCode DjiAircraftInfo_GetBaseInfo(T_DjiAircraftInfoBaseInfo *baseInfo); + +/** + * @brief Get information related to mobile app. + * @note Returns unknown for app language and screen type if the RC or app is not connected to the aircraft system. + * @param mobileAppInfo: Pointer to a memory space where the mobile app information will be stored. + * @return Execution result. + */ +T_DjiReturnCode DjiAircraftInfo_GetMobileAppInfo(T_DjiMobileAppInfo *mobileAppInfo); + +/** + * @brief Get connection status between the payload and the aircraft. + * @note Update period: 1Hz + * @param isConnected: Pointer to connection status. + * @return Execution result. + */ +T_DjiReturnCode DjiAircraftInfo_GetConnectionStatus(bool *isConnected); + +/** + * @brief Get version of the aircraft. + * @param aircraftVersion: Pointer to aircraft version. + * @return Execution result. + */ +T_DjiReturnCode DjiAircraftInfo_GetAircraftVersion(T_DjiAircraftVersion *aircraftVersion); + +#ifdef __cplusplus +} +#endif + +#endif //DJI_AIRCRAFT_INFO_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_camera_manager.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_camera_manager.h new file mode 100644 index 0000000..9e0c182 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_camera_manager.h @@ -0,0 +1,1674 @@ +/** + ******************************************************************** + * @file dji_camera_manager.h + * @brief This is the header file for "dji_camera_manager.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_CAMERA_MANAGER_H +#define DJI_CAMERA_MANAGER_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/*! @brief CameraModule work modes. + */ +typedef enum { + /*! + - Capture mode. In this mode, the user can capture pictures. + */ + DJI_CAMERA_MANAGER_WORK_MODE_SHOOT_PHOTO = 0, + /*! + - Record mode. In this mode, the user can record videos. + */ + DJI_CAMERA_MANAGER_WORK_MODE_RECORD_VIDEO = 1, + /*! + - Playback mode. In this mode, the user can preview photos and videos, and + can delete files. It is supported by Phantom 3 Professional camera, X3, X5 + and X5R cameras on aircraft and Phantom 4 camera. Playback mode is not + supported by Z30, X5S, X4S, Phantom 4 Pro, Mavic Pro, Phantom 3 Standard, + Phantom 3 Advanced, Phantom 3 4K and Osmo series. + */ + DJI_CAMERA_MANAGER_WORK_MODE_PLAYBACK = 2, + /*! + - In this mode, the user can download media to the Mobile Device. Not + supported by X5 camera nor X5R camera while mounted on aircraft. + */ + DJI_CAMERA_MANAGER_WORK_MODE_MEDIA_DOWNLOAD = 3, + /*! + - In this mode, live stream resolution and frame rate will be 1080i50 (PAL) + or 720p60 (NTSC). In this mode videos can be recorded. Still photos can + also be taken only when video is recording. The only way to exit broadcast + mode is to change modes to RECORD_VIDEO. Only supported by Inspire 2. + */ + DJI_CAMERA_MANAGER_WORK_MODE_BROADCAST = 4, + /*! + * The camera work mode is unknown. + */ + DJI_CAMERA_MANAGER_WORK_MODE_WORK_MODE_UNKNOWN = 0xFF, +} E_DjiCameraManagerWorkMode; + +/*! @brief The ShootPhoto mode itself can have several modes. The default + * value is SINGLE. + */ +typedef enum { + /*! + - Sets the camera to take a single photo. + */ + DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_SINGLE = 0x01, + /*! + - Sets the camera to take an HDR photo. X5 camera, X5R camera, XT camera, + Z30 camera, Phantom 4 Pro camera, X4S camera and X5S camera do not support + HDR mode. + */ + DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_HDR = 0x02, + /*! + - Set the camera to take multiple photos at once. XT camera does not + support Burst mode. + */ + DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_BURST = 0x04, + /*! + - Automatic Exposure Bracketing (AEB) capture. In this mode you can quickly + take multiple shots (the default is 3) at different exposures without + having to manually change any settings between frames. XT camera and Z30 + camera does not support AEB mode. + */ + DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_AEB = 0x05, + /*! + - Sets the camera to take a picture (or multiple pictures) continuously at + a set time interval. The minimum interval for JPEG format of any quality is + 2s. For all cameras except X4S, X5S and Phantom 4 Pro camera: The minimum + interval for RAW or RAW+JPEG format is 10s. For the X4S, X5S and Phantom 4 + Pro cameras the minimum interval for RAW or RAW+JPEG dformat is 5s. + */ + DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_INTERVAL = 0x06, + /*! + - Sets the camera to take a burst of RAW photos. Use getRAWPhotoBurstCount + to check how many photos have been shot. Only supported by X5S. + */ + DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_RAW_BURST = 0x09, + /*! + - Sets the camera to take an regional photos. It is supported by H20/H20T. + */ + DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_REGIONAL_SR = 0x16, + /*! + - The shoot photo mode is unknown. + */ + DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_UNKNOWN = 0xFF, +} E_DjiCameraManagerShootPhotoMode; + +/*! @brief the photo action of INTERVAL shooting photo mode + */ +typedef enum { + DJI_CAMERA_MANAGER_EXPOSURE_MODE_PROGRAM_AUTO = 1, /*!< Program mode */ + DJI_CAMERA_MANAGER_EXPOSURE_MODE_SHUTTER_PRIORITY = 2, /*!< Shutter priority mode */ + DJI_CAMERA_MANAGER_EXPOSURE_MODE_APERTURE_PRIORITY = 3, /*!< Aperture priority mode */ + DJI_CAMERA_MANAGER_EXPOSURE_MODE_EXPOSURE_MANUAL = 4, /*!< Manual mode */ + DJI_CAMERA_MANAGER_EXPOSURE_MODE_EXPOSURE_UNKNOWN = 0xFF /*!< The camera exposure mode is unknown. */ +} E_DjiCameraManagerExposureMode; + +/*! @brief CameraModule focus mode. If the physical AF switch on the camera is + * set to auto. + */ +typedef enum { + /*! + - The camera's focus mode is set to manual. In this mode, user sets the + focus ring value to adjust the focal distance. + */ + DJI_CAMERA_MANAGER_FOCUS_MODE_MANUAL = 0, + /*! + - The camera's focus mode is set to auto. For the Z30 camera, the focus is + calculated completely automatically. For all other cameras, a focus target + can be set by the user, which is used to calculate focus automatically. + */ + DJI_CAMERA_MANAGER_FOCUS_MODE_AUTO = 1, + /*! + - The camera's focus mode is set to Continuous AF. It is only supported by + Mavic Pro with firmware version V01.03.0000 or above, X4S camera, Mavic 2 + Zoom camera and Mavic 2 Pro camera. + */ + DJI_CAMERA_MANAGER_FOCUS_MODE_AFC = 2, + /*! + - The camera's focus mode is unknown. + */ + DJI_CAMERA_MANAGER_FOCUS_MODE_UNKNOWN = 0xFF, +} E_DjiCameraManagerFocusMode; + +/*! @brief CameraModule shutter mode. + */ +typedef enum { + /*! The shutter mode of camera is automatical */ + DJI_CAMERA_MANAGER_SHUTTER_AUTO_MODE = 0x00, + /*! The shutter mode of camera is manual, the shutter speed setting is + valid. */ + DJI_CAMERA_MANAGER_SHUTTER_MANUAL_MODE = 0x01, +} E_DjiCameraManagerShutterMode; + +/*! @brief CameraModule shutter speed values. + */ +typedef enum { + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_8000 = 0, /*!< 1/8000 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_6400 = 1, /*!< 1/6400 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_6000 = 2, /*!< 1/6000 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_5000 = 3, /*!< 1/5000 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_4000 = 4, /*!< 1/4000 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_3200 = 5, /*!< 1/3200 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_3000 = 6, /*!< 1/3000 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_2500 = 7, /*!< 1/2500 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_2000 = 8, /*!< 1/2000 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_1600 = 9, /*!< 1/1600 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_1500 = 10, /*!< 1/1500 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_1250 = 11, /*!< 1/1250 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_1000 = 12, /*!< 1/1000 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_800 = 13, /*!< 1/800 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_725 = 14, /*!< 1/725 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_640 = 15, /*!< 1/640 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_500 = 16, /*!< 1/500 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_400 = 17, /*!< 1/400 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_350 = 18, /*!< 1/350 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_320 = 19, /*!< 1/320 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_250 = 20, /*!< 1/250 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_240 = 21, /*!< 1/240 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_200 = 22, /*!< 1/200 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_180 = 23, /*!< 1/180 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_160 = 24, /*!< 1/160 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_125 = 25, /*!< 1/125 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_120 = 26, /*!< 1/120 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_100 = 27, /*!< 1/100 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_90 = 28, /*!< 1/90 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_80 = 29, /*!< 1/80 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_60 = 30, /*!< 1/60 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_50 = 31, /*!< 1/50 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_40 = 32, /*!< 1/40 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_30 = 33, /*!< 1/30 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_25 = 34, /*!< 1/25 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_20 = 35, /*!< 1/20 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_15 = 36, /*!< 1/15 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_12DOT5 = 37, /*!< 1/12.5 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_10 = 38, /*!< 1/10 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_8 = 39, /*!< 1/8 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_6DOT25 = 40, /*!< 1/6.25 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_5 = 41, /*!< 1/5 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_4 = 42, /*!< 1/4 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_3 = 43, /*!< 1/3 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_2DOT5 = 44, /*!< 1/2.5 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_2 = 45, /*!< 1/2 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_1DOT67 = 46, /*!< 1/1.67 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1_1DOT25 = 47, /*!< 1/1.25 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1 = 48, /*!< 1.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1DOT3 = 49, /*!< 1.3 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_1DOT6 = 50, /*!< 1.6 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_2 = 51, /*!< 2.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_2DOT5 = 52, /*!< 2.5 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_3 = 53, /*!< 3.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_3DOT2 = 54, /*!< 3.2 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_4 = 55, /*!< 4.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_5 = 56, /*!< 5.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_6 = 57, /*!< 6.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_7 = 58, /*!< 7.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_8 = 59, /*!< 8.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_9 = 60, /*!< 9.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_10 = 61, /*!< 10.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_13 = 62, /*!< 13.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_15 = 63, /*!< 15.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_20 = 64, /*!< 20.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_25 = 65, /*!< 25.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_30 = 66, /*!< 30.0 s */ + DJI_CAMERA_MANAGER_SHUTTER_SPEED_UNKNOWN = 0xFF, /*!< Unknown */ +} E_DjiCameraManagerShutterSpeed; + +/*! @brief CameraModule ISO values. + */ +typedef enum { + /*! The ISO value is automatically set. This cannot be used for all cameras + when in Manual mode. */ + DJI_CAMERA_MANAGER_ISO_AUTO = 0x00, + /*! The ISO value is set to 100. */ + DJI_CAMERA_MANAGER_ISO_100 = 0x03, + /*! The ISO value is set to 200. */ + DJI_CAMERA_MANAGER_ISO_200 = 0x04, + /*! The ISO value is set to 400.*/ + DJI_CAMERA_MANAGER_ISO_400 = 0x05, + /*! The ISO value is set to 800.*/ + DJI_CAMERA_MANAGER_ISO_800 = 0x06, + /*! The ISO value is set to 1600.*/ + DJI_CAMERA_MANAGER_ISO_1600 = 0x07, + /*! The ISO value is set to 3200.*/ + DJI_CAMERA_MANAGER_ISO_3200 = 0x08, + /*! The ISO value is set to 6400.*/ + DJI_CAMERA_MANAGER_ISO_6400 = 0x09, + /*! The ISO value is set to 12800.*/ + DJI_CAMERA_MANAGER_ISO_12800 = 0x0A, + /*! The ISO value is set to 25600.*/ + DJI_CAMERA_MANAGER_ISO_25600 = 0x0B, + /*! ISO value is fixed by the camera firmware. When the camera color is set + to D_LOG, camera will fix the ISO to a specific value in order to optimize + the performance. + */ + DJI_CAMERA_MANAGER_ISO_FIXED = 0xFF, +} E_DjiCameraManagerISO; + +/*! @brief CameraModule exposure compensation. + */ +typedef enum { + /*! The camera's exposure compensation is -5.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_5_0 = 1, + /*! The camera's exposure compensation is -4.7ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_4_7 = 2, + /*! The camera's exposure compensation is -4.3ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_4_3 = 3, + /*! The camera's exposure compensation is -4.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_4_0 = 4, + /*! The camera's exposure compensation is -3.7ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_3_7 = 5, + /*! The camera's exposure compensation is -3.3ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_3_3 = 6, + /*! The camera's exposure compensation is -3.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_3_0 = 7, + /*! The camera's exposure compensation is -2.7ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_2_7 = 8, + /*! The camera's exposure compensation is -2.3ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_2_3 = 9, + /*! The camera's exposure compensation is -2.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_2_0 = 10, + /*! The camera's exposure compensation is -1.7ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_1_7 = 11, + /*! The camera's exposure compensation is -1.3ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_1_3 = 12, + /*! The camera's exposure compensation is -1.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_1_0 = 13, + /*! The camera's exposure compensation is -0.7ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_0_7 = 14, + /*! The camera's exposure compensation is -0.3ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_0_3 = 15, + /*! The camera's exposure compensation is 0.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_N_0_0 = 16, + /*! The camera's exposure compensation is +0.3ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_0_3 = 17, + /*! The camera's exposure compensation is +0.7ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_0_7 = 18, + /*! The camera's exposure compensation is +1.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_1_0 = 19, + /*! The camera's exposure compensation is +1.3ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_1_3 = 20, + /*! The camera's exposure compensation is +1.7ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_1_7 = 21, + /*! The camera's exposure compensation is +2.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_2_0 = 22, + /*! The camera's exposure compensation is +2.3ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_2_3 = 23, + /*! The camera's exposure compensation is +2.7ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_2_7 = 24, + /*! The camera's exposure compensation is +3.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_3_0 = 25, + /*! The camera's exposure compensation is +3.3ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_3_3 = 26, + /*! The camera's exposure compensation is +3.7ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_3_7 = 27, + /*! The camera's exposure compensation is +4.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_4_0 = 28, + /*! The camera's exposure compensation is +4.3ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_4_3 = 29, + /*! The camera's exposure compensation is +4.7ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_4_7 = 30, + /*! The camera's exposure compensation is +5.0ev.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_P_5_0 = 31, + /*! The camera's exposure compensation is fixed by the camera.*/ + DJI_CAMERA_MANAGER_EXPOSURE_COMPENSATION_FIXED = 0xFF, +} E_DjiCameraManagerExposureCompensation; + +/*! @brief CameraModule aperture values. + * @note X5, X5R, Z30, Phantom 4 Pro camera, X4S and X5S support this + * setting. + */ +typedef enum { + /*! The Aperture value is f/1.6. It is only supported by Z30 + camera.*/ + DJI_CAMERA_MANAGER_APERTURE_F_1_DOT_6 = 160, + /*! The Aperture value is f/1.7.*/ + DJI_CAMERA_MANAGER_APERTURE_F_1_DOT_7 = 170, + /*! The Aperture value is f/1.8.*/ + DJI_CAMERA_MANAGER_APERTURE_F_1_DOT_8 = 180, + /*! The Aperture value is f/2.*/ + DJI_CAMERA_MANAGER_APERTURE_F_2 = 200, + /*! The Aperture value is f/2.2.*/ + DJI_CAMERA_MANAGER_APERTURE_F_2_DOT_2 = 220, + /*! The Aperture value is f/2.4. It is only supported by Z30 camera.*/ + DJI_CAMERA_MANAGER_APERTURE_F_2_DOT_4 = 240, + /*! The Aperture value is f/2.5.*/ + DJI_CAMERA_MANAGER_APERTURE_F_2_DOT_5 = 250, + /*! The Aperture value is f/2.6.*/ + DJI_CAMERA_MANAGER_APERTURE_F_2_DOT_6 = 260, + /*! The Aperture value is f/2.8.*/ + DJI_CAMERA_MANAGER_APERTURE_F_2_DOT_8 = 280, + /*! The Aperture value is f/3.2.*/ + DJI_CAMERA_MANAGER_APERTURE_F_3_DOT_2 = 320, + /*! The Aperture value is f/3.4.*/ + DJI_CAMERA_MANAGER_APERTURE_F_3_DOT_4 = 340, + /*! The Aperture value is f/3.5.*/ + DJI_CAMERA_MANAGER_APERTURE_F_3_DOT_5 = 350, + /*! The Aperture value is f/4.*/ + DJI_CAMERA_MANAGER_APERTURE_F_4 = 400, + /*! The Aperture value is f/4.5.*/ + DJI_CAMERA_MANAGER_APERTURE_F_4_DOT_5 = 450, + /*! The Aperture value is f/4.8.*/ + DJI_CAMERA_MANAGER_APERTURE_F_4_DOT_8 = 480, + /*! The Aperture value is f/5.*/ + DJI_CAMERA_MANAGER_APERTURE_F_5 = 500, + /*! The Aperture value is f/5.6.*/ + DJI_CAMERA_MANAGER_APERTURE_F_5_DOT_6 = 560, + /*! The Aperture value is f/6.3.*/ + DJI_CAMERA_MANAGER_APERTURE_F_6_DOT_3 = 630, + /*! The Aperture value is f/6.8.*/ + DJI_CAMERA_MANAGER_APERTURE_F_6_DOT_8 = 680, + /*! The Aperture value is f/7.1.*/ + DJI_CAMERA_MANAGER_APERTURE_F_7_DOT_1 = 710, + /*! The Aperture value is f/8.*/ + DJI_CAMERA_MANAGER_APERTURE_F_8 = 800, + /*! The Aperture value is f/9.*/ + DJI_CAMERA_MANAGER_APERTURE_F_9 = 900, + /*! The Aperture value is f/9.6.*/ + DJI_CAMERA_MANAGER_APERTURE_F_9_DOT_6 = 960, + /*! The Aperture value is f/10.*/ + DJI_CAMERA_MANAGER_APERTURE_F_10 = 1000, + /*! The Aperture value is f/11.*/ + DJI_CAMERA_MANAGER_APERTURE_F_11 = 1100, + /*! The Aperture value is f/13.*/ + DJI_CAMERA_MANAGER_APERTURE_F_13 = 1300, + /*! The Aperture value is f/14.*/ + DJI_CAMERA_MANAGER_APERTURE_F_14 = 1400, + /*! The Aperture value is f/16.*/ + DJI_CAMERA_MANAGER_APERTURE_F_16 = 1600, + /*! The Aperture value is f/18.*/ + DJI_CAMERA_MANAGER_APERTURE_F_18 = 1800, + /*! The Aperture value is f/19.*/ + DJI_CAMERA_MANAGER_APERTURE_F_19 = 1900, + /*! The Aperture value is f/20.*/ + DJI_CAMERA_MANAGER_APERTURE_F_20 = 2000, + /*! The Aperture value is f/22.*/ + DJI_CAMERA_MANAGER_APERTURE_F_22 = 2200, + /*! The Aperture value is Unknown. */ + DJI_CAMERA_MANAGER_APERTURE_F_UNKNOWN = 0xFFFF, +} E_DjiCameraManagerAperture; + +typedef enum { + DJI_CAMERA_MANAGER_RECORDING_CONTROL_STOP = 0, + DJI_CAMERA_MANAGER_RECORDING_CONTROL_BEGIN = 1, + DJI_CAMERA_MANAGER_RECORDING_CONTROL_PAUSE = 2, + DJI_CAMERA_MANAGER_RECORDING_CONTROL_RESUME = 3, +} E_DjiCameraManagerRecordingControl; + +typedef enum { + DJI_CAMERA_MANAGER_FILE_LIST_COUNT_60_PER_SLICE = 60, + DJI_CAMERA_MANAGER_FILE_LIST_COUNT_120_PER_SLICE = 120, + DJI_CAMERA_MANAGER_FILE_LIST_COUNT_ALL_PER_SLICE = 0xFFFF, +} E_DjiCameraManagerFileListCountPerSlice; + +typedef enum { + DJI_CAMERA_MANAGER_SOURCE_DEFAULT_CAM = 0x0, + DJI_CAMERA_MANAGER_SOURCE_WIDE_CAM = 0x1, + DJI_CAMERA_MANAGER_SOURCE_ZOOM_CAM = 0x2, + DJI_CAMERA_MANAGER_SOURCE_IR_CAM = 0x3, + DJI_CAMERA_MANAGER_SOURCE_VISIBLE_CAM = 0x7, +} E_DjiCameraManagerStreamSource, E_DjiCameraManagerStreamStorage; + +typedef enum { + DJI_CAMERA_MANAGER_NIGHT_SCENE_MODE_DISABLE = 0, + DJI_CAMERA_MANAGER_NIGHT_SCENE_MODE_ENABLE = 1, + DJI_CAMERA_MANAGER_NIGHT_SCENE_MODE_AUTO = 2, +} E_DjiCameraManagerNightSceneMode; + +typedef enum { + DJI_CAMERA_MANAGER_CAPTURE_OR_RECORDING_CAPTURE = 0, + DJI_CAMERA_MANAGER_CAPTURE_OR_RECORDING_RECORDING = 1, +} E_DjiCameraManagerCaptureOrRecording; + +typedef enum { + DJI_CAMERA_MANAGER_EXPAND_NAME_TYPE_FILE = 1, + DJI_CAMERA_MANAGER_EXPAND_NAME_TYPE_DIR = 2, +} E_DjiCameraManagerExpandNameType; + +typedef enum { + DJI_CAMERA_MANAGER_PHOTO_RATIO_4X3 = 0, + DJI_CAMERA_MANAGER_PHOTO_RATIO_16X9 = 1, + DJI_CAMERA_MANAGER_PHOTO_RATIO_3X2 = 2, + DJI_CAMERA_MANAGER_PHOTO_RATIO_1X1 = 3, + DJI_CAMERA_MANAGER_PHOTO_RATIO_18X3 = 4, + DJI_CAMERA_MANAGER_PHOTO_RATIO_5X4 = 5, +} E_DjiCameraManagerPhotoRatio; + +typedef struct { + uint8_t firmware_version[4]; +} T_DjiCameraManagerFirmwareVersion; + +/*! @brief Tap zoom target point data struct, used by user. + */ +typedef T_DjiCameraPointInScreen T_DjiCameraManagerTapZoomPosData; + +/*! @brief Tap focus target point data struct, used by user. + */ +typedef T_DjiCameraPointInScreen T_DjiCameraManagerFocusPosData; + +typedef struct { + dji_f32_t currentOpticalZoomFactor; + dji_f32_t maxOpticalZoomFactor; +} T_DjiCameraManagerOpticalZoomParam; + +typedef struct { + uint8_t second; + uint8_t minute; + uint8_t hour; + uint8_t day; + uint8_t month; + uint16_t year; +} T_DjiCameraManagerFileCreateTime; + +typedef struct { + union { + struct { + uint32_t attributePhotoReserved: 22; + uint32_t attributePhotoRatio: 8; + uint32_t attributePhotoRotation: 2; + uint8_t reserved[12]; + } photoAttribute; + struct { + uint32_t attributeVideoDuration: 16; + uint32_t attributeVideoFramerate: 6; + uint32_t attributeVideoRotation: 2; + uint32_t attributeVideoResolution: 8; + uint8_t reserved[12]; + } videoAttribute; + }; +} T_DjiCameraManagerFileAttributeData; + +typedef struct { + char fileName[DJI_FILE_NAME_SIZE_MAX]; + uint32_t fileSize; + uint32_t fileIndex; + T_DjiCameraManagerFileCreateTime createTime; + E_DjiCameraMediaFileSubType type; + T_DjiCameraManagerFileAttributeData attributeData; +} T_DjiCameraManagerSubFileListInfo; + +typedef struct { + char fileName[DJI_FILE_NAME_SIZE_MAX]; + uint32_t fileSize; + uint32_t fileIndex; + T_DjiCameraManagerFileCreateTime createTime; + E_DjiCameraMediaFileType type; + T_DjiCameraManagerFileAttributeData attributeData; + uint8_t subFileListTotalNum; + T_DjiCameraManagerSubFileListInfo* subFileListInfo; +} T_DjiCameraManagerFileListInfo; + +typedef struct { + uint16_t totalCount; + T_DjiCameraManagerFileListInfo *fileListInfo; +} T_DjiCameraManagerFileList; + +typedef struct { + uint16_t sliceStartIndex; + E_DjiCameraManagerFileListCountPerSlice countPerSlice; +} T_DjiCameraManagerSliceConfig; + +typedef enum { + DJI_DOWNLOAD_FILE_EVENT_START, + DJI_DOWNLOAD_FILE_EVENT_TRANSFER, + DJI_DOWNLOAD_FILE_EVENT_END, + DJI_DOWNLOAD_FILE_EVENT_START_TRANSFER_END, +} E_DjiDownloadFileEvent; + +typedef enum { + DJI_CAMERA_MANAGER_VIDEO_RESOLUTION_640X480P = 0, // 640X480P + DJI_CAMERA_MANAGER_VIDEO_RESOLUTION_1280X640P = 2, // 1280X640P + DJI_CAMERA_MANAGER_VIDEO_RESOLUTION_1280X720P = 4, // 1280X720P + DJI_CAMERA_MANAGER_VIDEO_RESOLUTION_1920X1080P = 10, // 1920X1080P + DJI_CAMERA_MANAGER_VIDEO_RESOLUTION_3840X2160P = 16, // 3840X2160P +} E_DjiCameraManagerVideoResolution; + +typedef enum { + DJI_CAMERA_MANAGER_VIDEO_FRAME_RATE_15FPS = 0, // 14.985 + DJI_CAMERA_MANAGER_VIDEO_FRAME_RATE_25FPS = 2, // 25.000 + DJI_CAMERA_MANAGER_VIDEO_FRAME_RATE_30FPS = 3, // 29.970 + DJI_CAMERA_MANAGER_VIDEO_FRAME_RATE_60FPS = 6, // 59.940 +} E_DjiCameraManagerVideoFrameRate; + +typedef enum { + DJI_CAMERA_MANAGER_PHOTO_STORAGE_FORMAT_RAW = 0, + DJI_CAMERA_MANAGER_PHOTO_STORAGE_FORMAT_JPEG = 1, + DJI_CAMERA_MANAGER_PHOTO_STORAGE_FORMAT_RAW_JPEG = 2, + DJI_CAMERA_MANAGER_PHOTO_STORAGE_FORMAT_YUV = 3, // Save as YUV format image + DJI_CAMERA_MANAGER_PHOTO_STORAGE_FORMAT_RJPEG = 7, // Radiometric JPEG +} E_DjiCameraManagerPhotoStorageFormat; + +typedef enum { + DJI_CAMERA_MANAGER_VIDEO_STORAGE_FORMAT_MOV = 0, + DJI_CAMERA_MANAGER_VIDEO_STORAGE_FORMAT_MP4 = 1, +} E_DjiCameraManagerVideoStorageFormat; + +typedef enum { + DJI_CAMERA_MANAGER_METERING_MODE_CENTRAL = 0, + DJI_CAMERA_MANAGER_METERING_MODE_AVERAGE = 1, + DJI_CAMERA_MANAGER_METERING_MODE_SPOT = 2, +} E_DjiCameraManagerMeteringMode; + +typedef enum { + DJI_CAMERA_MANAGER_FFC_MODE_MANUAL = 0, + DJI_CAMERA_MANAGER_FFC_MODE_AUTO = 1, +} E_DjiCameraManagerFfcMode; + +typedef enum { + DJI_CAMERA_MANAGER_IR_GAIN_MODE_AUTO = 0, + DJI_CAMERA_MANAGER_IR_GAIN_MODE_LOW = 1, + DJI_CAMERA_MANAGER_IR_GAIN_MODE_HIGH = 2, +} E_DjiCameraManagerIrGainMode; + +typedef enum { + /* Camera is not capturing photos*/ + DJI_CAMERA_MANAGER_CAPTURING_STATE_IDLE = 0, + + /* Camera is capturing a single photo */ + DJI_CAMERA_MANAGER_CAPTURING_STATE_SINGLE = 1, + + /* Camera is capturing multiple photos */ + DJI_CAMERA_MANAGER_CAPTURING_STATE_MULTI = 2, +} E_DjiCameraManagerCapturingState; + +typedef enum { + DJI_CAMERA_MANAGER_RECORDING_STATE_IDLE = 0, + DJI_CAMERA_MANAGER_RECORDING_STATE_STARTING = 1, + DJI_CAMERA_MANAGER_RECORDING_STATE_RECORDING = 2, + DJI_CAMERA_MANAGER_RECORDING_STATE_STOPPING = 3, +} E_DjiCameraManagerRecordingState; + +/*! @brief: when the remote control is in split-screen mode, the coordinate range of the x-axis is 0-0.5. + */ +typedef struct { + dji_f32_t pointX; /*! x-coordinate of point thermometry, range: 0-1 */ + dji_f32_t pointY; /*! y-coordinate of point thermometry, range: 0-1 */ +} T_DjiCameraManagerPointThermometryCoordinate; + +typedef struct { + dji_f32_t areaTempLtX; /*! x-coordinate of the upper left corner of the area thermometry, range: 0-1 */ + dji_f32_t areaTempLtY; /*! y-coordinate of the upper left corner of the area thermometry, range: 0-1 */ + dji_f32_t areaTempRbX; /*! x-coordinate of the lower right corner of the area thermometry, range: 0-1 */ + dji_f32_t areaTempRbY; /*! y-coordinate of the lower right corner of the area thermometry, range: 0-1 */ +} T_DjiCameraManagerAreaThermometryCoordinate; + +//result of point thermometry +typedef struct { + dji_f32_t pointX; /*! x-coordinate of point thermometry, range: 0-1 */ + dji_f32_t pointY; /*! y-coordinate of point thermometry, range: 0-1 */ + dji_f32_t pointTemperature; /*! The temperature of the current point */ +} T_DjiCameraManagerPointThermometryData; + +//result of area thermometry +typedef struct { + dji_f32_t areaTempLtX; /*! x_coordinate of the upper left corner of the current thermometry area */ + dji_f32_t areaTempLtY; /*! y_coordinate of the upper left corner of the current thermometry area */ + dji_f32_t areaTempRbX; /*! x_coordinate of the lower right corner of the current thermometry area */ + dji_f32_t areaTempRbY; /*! y_coordinate of the lower right corner of the current thermometry area */ + dji_f32_t areaAveTemp; /*! The average temperature of the current thermometry area */ + dji_f32_t areaMinTemp; /*! The minimum temperature of the current thermometry area */ + dji_f32_t areaMaxTemp; /*! The maximum temperature of the current thermometry area */ + dji_f32_t areaMinTempPointX; /*! x_coordinate of the minimum temperature in the thermometry area */ + dji_f32_t areaMinTempPointY; /*! y_coordinate of the minimum temperature in the thermometry area */ + dji_f32_t areaMaxTempPointX; /*! x_coordinate of the maximum temperature in the thermometry area */ + dji_f32_t areaMaxTempPointY; /*! y_coordinate of the maximum temperature in the thermometry area */ +} T_DjiCameraManagerAreaThermometryData; + +typedef struct { + E_DjiDownloadFileEvent downloadFileEvent; + uint8_t fileType; + uint32_t fileIndex; + uint32_t fileSize; + dji_f32_t progressInPercent; +} T_DjiDownloadFilePacketInfo; + +typedef struct { + dji_f64_t longitude; /*! Range: [-180,180] */ + dji_f64_t latitude; /*! Range: [-90,90] */ + int32_t altitude; /*! Unit: 0.1m */ + int32_t distance; /*! Unit: 0.1m */ + int16_t screenX; /*! Unit: 0.1% */ + int16_t screenY; /*! Unit: 0.1% */ + bool enable_lidar; + uint8_t exception; +} T_DjiCameraManagerLaserRangingInfo; + +typedef struct { + uint32_t size; + E_DjiCameraManagerStreamSource streamSource[4]; + E_DjiCameraManagerStreamStorage streamStorage[4]; +} T_DjiCameraManagerStreamList; + +typedef struct { + E_DjiCameraManagerVideoResolution videoResolution; + E_DjiCameraManagerVideoFrameRate videoFrameRate; +} T_DjiCameraManagerVideoFormat; + +typedef struct { + uint8_t size; + union { + E_DjiCameraManagerPhotoStorageFormat photoStorageFormat[16]; + E_DjiCameraManagerVideoStorageFormat videoStorageFormat[16]; + E_DjiCameraManagerPhotoRatio photoRatioFormat[16]; + E_DjiCameraManagerStreamSource streamSource[16]; + E_DjiCameraManagerStreamStorage streamStorage[16]; + E_DjiCameraManagerNightSceneMode nightSceneMode[16]; + }; + uint32_t minValue; + uint32_t maxValue; +} T_DjiCameraManagerRangeList; + +typedef struct { + double lowGainTempMin; + double lowGainTempMax; + double highGainTempMin; + double highGainTempMax; +} T_DjiCameraManagerIrTempMeterRange; + +typedef struct { + uint32_t totalCapacity; /* MByte */ + uint32_t remainCapacity; /* MByte */ +} T_DjiCameraManagerStorageInfo; + +typedef struct { + uint32_t flag; /* 0xFFFFFFFF */ + uint32_t seqNum; + uint64_t timestamp; + uint32_t dataByte; /* actual num of bytes used for points */ +} __attribute__((packed)) T_DjiCameraManagerPointCloudHeader; + +typedef struct { + dji_f32_t x; /* the x-axis of NED coordinate system */ + dji_f32_t y; /* the y-axis of NED coordinate system */ + dji_f32_t z; /* the z-axis of NED coordinate system */ + uint8_t intensity; + uint8_t r; + uint8_t g; + uint8_t b; +}__attribute__((packed)) T_DjiCameraManagerPointXYZRGBInfo; + +typedef struct { + T_DjiCameraManagerPointCloudHeader pointCloudHeader; + uint32_t crc_header; + uint32_t crc_rest; + T_DjiCameraManagerPointXYZRGBInfo points[1]; +}__attribute__((packed)) T_DjiCameraManagerColorPointCloud; + +typedef T_DjiReturnCode (*DjiCameraManagerDownloadFileDataCallback)(T_DjiDownloadFilePacketInfo packetInfo, + const uint8_t *data, + uint16_t dataLen); + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise camera manager module, and user should call this function + * before using camera manager features. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_Init(void); + +/** + * @brief Deinitialise camera manager module. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_DeInit(void); + +/** + * @brief Get camera type of the selected camera mounted position. + * @param position: camera mounted position + * @param cameraType: refer to E_DjiCameraType. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetCameraType(E_DjiMountPosition position, E_DjiCameraType *cameraType); + +/** + * @brief Get camera firmware version of the selected camera mounted position. + * @param position: camera mounted position + * @param firmwareVersion: refer to T_DjiCameraManagerFirmwareVersion. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetFirmwareVersion(E_DjiMountPosition position, + T_DjiCameraManagerFirmwareVersion *firmwareVersion); + +/** + * @brief Get camera connection status. + * @param position: camera mounted position + * @param connectStatus: returned value of connection status + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetCameraConnectStatus(E_DjiMountPosition position, + bool *connectStatus); + +/** + * @brief Set camera working mode of the selected camera mounted position. + * @note Set the camera's work mode to options such as taking pictures, recording video, + * playback, or downloading. Please note that you cannot change the mode when a certain + * task is executing. This action takes about 1-2 s. + * @param position: camera mounted position + * @param workMode: refer to E_DjiCameraManagerWorkMode. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetMode(E_DjiMountPosition position, + E_DjiCameraManagerWorkMode workMode); + +/** + * @brief Get camera working mode of the selected camera mounted position. + * @param position: camera mounted position + * @param workMode: refer to E_DjiCameraManagerWorkMode. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetMode(E_DjiMountPosition position, + E_DjiCameraManagerWorkMode *workMode); + +/** +* @brief Set camera shoot mode of the selected camera mounted position. +* @param position: camera mounted position +* @param mode: refer to E_DjiCameraManagerShootPhotoMode. +* @return Execution result. +*/ +T_DjiReturnCode DjiCameraManager_SetShootPhotoMode(E_DjiMountPosition position, + E_DjiCameraManagerShootPhotoMode mode); + +/** +* @brief Get camera shoot mode of the selected camera mounted position. +* @param position: camera mounted position +* @param mode: refer to E_DjiCameraManagerShootPhotoMode. +* @return Execution result. +*/ +T_DjiReturnCode DjiCameraManager_GetShootPhotoMode(E_DjiMountPosition position, + E_DjiCameraManagerShootPhotoMode *takePhotoMode); + +/** + * @brief Start shooting photo. + * @note Camera must be in ShootPhoto mode. For thermal imaging cameras, + * it is allowed to take a single photo while recording video. Check the SD + * card's capacity before using this method to ensure there is enough space. + * @param position: camera mounted position + * @param mode: refer to E_DjiCameraManagerShootPhotoMode. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_StartShootPhoto(E_DjiMountPosition position, + E_DjiCameraManagerShootPhotoMode mode); + +/** + * @brief Stop shooting photo. + * @note Camera must be in ShootPhoto mode and the shoot mode is either + * Interval or Time-lapse. If set to single shot mode, the camera will + * automatically stop after taking the photo. + * @param position: camera mounted position + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_StopShootPhoto(E_DjiMountPosition position); + +/** + * @brief Get camera capturing state. + * @note This API is not supported by L1/P1/M3D/M3TD models. + * @param position: camera mounted position + * @param capturingState: result of getting, see E_DjiCameraManagerCapturingState. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetCapturingState(E_DjiMountPosition position, + E_DjiCameraManagerCapturingState *capturingState); + +/** + * @brief Set the burst count for burst shooting mode. + * @param position: camera mounted position + * @param count: refer to E_DjiCameraBurstCount. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetPhotoBurstCount(E_DjiMountPosition position, + E_DjiCameraBurstCount count); + +/** + * @brief Set the parameters for INTERVAL shooting mode. + * @note In this mode, the camera captures a photo, waits a specified interval + * of time, then captures another photo, continuing until the set number of + * photos is reached. Supported by thermal imaging cameras, too. + * @param position: camera mounted position + * @param intervalSetting: refer to T_DjiCameraPhotoTimeIntervalSettings. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetPhotoTimeIntervalSettings(E_DjiMountPosition position, + T_DjiCameraPhotoTimeIntervalSettings intervalSetting); + +/** + * @brief Get the parameters for INTERVAL shooting mode. + * @param position: camera mounted position + * @param intervalSetting: refer to T_DjiCameraPhotoTimeIntervalSettings. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetPhotoTimeIntervalSettings(E_DjiMountPosition position, + T_DjiCameraPhotoTimeIntervalSettings *intervalSetting); + +/** + * @brief Get the remaining time of interval shooting. + * @note Not supported by L1/P1/M3D/M3TD models. + * @param position: camera mounted position + * @param remainTime: time in seconds. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetIntervalShootingRemainTime(E_DjiMountPosition position, + uint8_t *remainTime); + +/** + * @brief Set camera focus mode of the selected camera mounted position. + * @note Set the lens focus mode. In auto focus mode, the target + * point is the focal point. In manual focus mode, if focus assist is + * enabled, it adjusts focus in the zoomed-out area. + * @param position: camera mounted position + * @param focusMode: refer to E_DjiCameraManagerFocusMode. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetFocusMode(E_DjiMountPosition position, + E_DjiCameraManagerFocusMode focusMode); +/** + * @brief Get camera focus mode of the selected camera mounted position. + * @param position: camera mounted position + * @param focusMode: refer to E_DjiCameraManagerFocusMode. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetFocusMode(E_DjiMountPosition position, + E_DjiCameraManagerFocusMode *focusMode); + +/** + * @brief Set camera focus point of the selected camera mounted position. + * @note Sets the target point for focusing. In auto mode, this is the focal + * point. In manual mode with focus assist enabled, it's the zoomed-out area. + * @param position: camera mounted position + * @param focusPosData: refer to T_DjiCameraManagerFocusPosData. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetFocusTarget(E_DjiMountPosition position, + T_DjiCameraManagerFocusPosData focusPosData); + +/** + * @brief Get camera focus point of the selected camera mounted position. + * @param position: camera mounted position + * @param focusPosData: refer to T_DjiCameraManagerFocusPosData. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetFocusTarget(E_DjiMountPosition position, + T_DjiCameraManagerFocusPosData *tapFocusPos); + +/** + * @brief Start camera optical zooming of the selected camera mounted position. + * @note Changes the lens's focal length in the specified direction at a specified + * speed. Zooming stops at the lens's max or min focal length or when + * StopContinuousOpticalZoom is called. + * @param position: camera mounted position + * @param zoomDirection: optical zoom direction, refer to E_DjiCameraZoomDirection. + * @param zoomSpeed: optical zoom direction, refer to E_DjiCameraZoomSpeed. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_StartContinuousOpticalZoom(E_DjiMountPosition position, + E_DjiCameraZoomDirection zoomDirection, + E_DjiCameraZoomSpeed zoomSpeed); + +/** + * @brief Stop the ongoing optical zoom operation of the selected camera mounted position. + * @note Should be called to halt the focal length change initiated by + * DjiCameraManager_StartContinuousOpticalZoom. + * @param position: camera mounted position + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_StopContinuousOpticalZoom(E_DjiMountPosition position); + +/** + * @brief Set target zoom factor for optical zooming of the selected camera mounted position. + * @note This interface sets the zoom to the specified target value. + * @param position: camera mounted position + * @param zoomDirection: optical zoom direction, refer to E_DjiCameraZoomDirection. + * @param factor: target zoom factor. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetOpticalZoomParam(E_DjiMountPosition position, + E_DjiCameraZoomDirection zoomDirection, + dji_f32_t factor); + +/** + * @brief Get parameters for camera optical zooming of the selected camera mounted position. + * @param position: camera mounted position + * @param opticalZoomParam: refer to T_DjiCameraManagerOpticalZoomParam. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetOpticalZoomParam(E_DjiMountPosition position, + T_DjiCameraManagerOpticalZoomParam *opticalZoomParam); + +/** + * @brief Set target zoom factor for infrared zooming of the selected camera mounted position. + * @param position: camera mounted position + * @param factor: target zoom factor. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetInfraredZoomParam(E_DjiMountPosition position, + dji_f32_t factor); + +/** + * @brief Enable/Disable the tap-zoom function for the selected camera mounted position. + * @note TapZoomAtTarget can only be called when tap-zoom is enabled. + * @param position: camera mounted position + * @param param: enable/disable + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetTapZoomEnabled(E_DjiMountPosition position, + bool param); + +/** + * @brief Get status of camera's tap-zoom function of the selected camera mounted position. + * @param position: camera mounted position + * @param param: enable/disable + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetTapZoomEnabled(E_DjiMountPosition position, bool *param); + +/** + * @brief Set camera's tap-zoom multiplier of the selected camera mounted position. + * @note The final zoom scale during a tap-zoom action will be: + * Current Zoom Scale x Multiplier. + * @param position: camera mounted position + * @param tapZoomMultiplier: The multiplier range is [1,5]. A multiplier of 1 will not change the zoom. + * hen the multiplier is 1, the zoom scale will not change during TapZoom. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetTapZoomMultiplier(E_DjiMountPosition position, uint8_t tapZoomMultiplier); + +/** + * @brief Get camera's tap-zoom multiplier of the selected camera mounted position. + * @param position: camera mounted position + * @param tapZoomMultiplier: The multiplier range is [1,5]. A multiplier of 1 will not change the zoom. + * When the multiplier is 1, the zoom scale will not change during TapZoom. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetTapZoomMultiplier(E_DjiMountPosition position, uint8_t *tapZoomMultiplier); + +/** + * @brief Set camera's tap-zoom point of the selected camera mounted position. + * @note Only available when tap-zoom is enabled. Sets a new target, + * reorienting the gimbal to locate the target on the screen center and + * applying the tap-zoom multiplier. + * @param position: camera mounted position + * @param tapZoomPos: refer to T_DjiCameraManagerTapZoomPosData. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_TapZoomAtTarget(E_DjiMountPosition position, + T_DjiCameraManagerTapZoomPosData tapZoomPos); + +/** + * @brief Get camera focus ring value range. + * @param position: camera mounted position + * @param rangeList: returned value of range. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetFocusRingRange(E_DjiMountPosition position, + T_DjiCameraManagerRangeList *rangeList); + +/** + * @brief Set camera focus ring value. + * @param position: camera mounted position + * @param value: focus ring value. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetFocusRingValue(E_DjiMountPosition position, + uint16_t value); + +/** + * @brief Get camera focus ring value. + * @param position: camera mounted position + * @param value: focus ring value to be returned. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetFocusRingValue(E_DjiMountPosition position, + uint16_t *value); + +/** + * @brief Set camera's exposure mode of the selected camera mounted position. + * @note Different exposure modes define whether settings like aperture, shutter + * speed, and ISO are set automatically or manually. Exposure compensation is + * adjustable in all modes except the manual mode. + * @param position: camera mounted position + * @param mode: refer to E_DjiCameraManagerExposureMode. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetExposureMode(E_DjiMountPosition position, + E_DjiCameraManagerExposureMode mode); + +/** + * @brief Get camera's exposure mode of the selected camera mounted position. + * @note Different exposure modes define whether settings like aperture, shutter + * speed, and ISO are set automatically or manually. Exposure compensation is + * adjustable in all modes except the manual mode. + * @param position: camera mounted position + * @param mode: refer to E_DjiCameraManagerExposureMode. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetExposureMode(E_DjiMountPosition position, + E_DjiCameraManagerExposureMode *mode); + +/** + * @brief Set camera's iso value of the selected camera mounted position. + * @note ISO value can only be set when the camera exposure mode is in + * manual mode. + * @param position: camera mounted position + * @param iso: refer to E_DjiCameraManagerISO. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetISO(E_DjiMountPosition position, + E_DjiCameraManagerISO iso); + +/** + * @brief Get camera's iso value of the selected camera mounted position. + * @param position: camera mounted position + * @param iso: refer to E_DjiCameraManagerISO. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetISO(E_DjiMountPosition position, + E_DjiCameraManagerISO *iso); + +/** + * @brief Set camera's aperture size value of the selected camera mounted position. + * @note The exposure mode must be on DJI_CAMERA_MANAGER_EXPOSURE_MODE_EXPOSURE_MANUAL or + * DJI_CAMERA_MANAGER_EXPOSURE_MODE_APERTURE_PRIORITY. + * @param position: camera mounted position + * @param aperture: refer to E_DjiCameraManagerAperture. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetAperture(E_DjiMountPosition position, + E_DjiCameraManagerAperture aperture); + +/** + * @brief Get camera's aperture size value of the selected camera mounted position. + * @param position: camera mounted position + * @param aperture: refer to E_DjiCameraManagerAperture. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetAperture(E_DjiMountPosition position, + E_DjiCameraManagerAperture *aperture); + +/** + * @brief Set camera's shutter speed value of the selected camera mounted position. + * @note Set the camera shutter speed. Ensure the shutter speed is not set + * slower than the video frame rate when the camera's mode is RECORD_VIDEO. + * For example, if the video frame rate is 30fps, the shutterSpeed must be <= + * 1/30. Precondition: The shutter speed can be set only when the camera + * exposure mode is DJI_CAMERA_MANAGER_EXPOSURE_MODE_EXPOSURE_MANUAL mode or + * DJI_CAMERA_MANAGER_EXPOSURE_MODE_SHUTTER_PRIORITY + * @param position: camera mounted position + * @param shutterSpeed: refer to E_DjiCameraManagerShutterSpeed. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetShutterSpeed(E_DjiMountPosition position, + E_DjiCameraManagerShutterSpeed shutterSpeed); + +/** + * @brief Get camera's shutter value of the selected camera mounted position. + * @param position: camera mounted position + * @param shutterSpeed: refer to E_DjiCameraManagerShutterSpeed. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetShutterSpeed(E_DjiMountPosition position, + E_DjiCameraManagerShutterSpeed *shutterSpeed); + +/** + * @brief Set camera's EV value of the selected camera mounted position. + * @note This function is available in program, shutter, or aperture + * exposure modes. Enums are DJI_CAMERA_MANAGER_EXPOSURE_MODE_EXPOSURE_MANUAL, + * DJI_CAMERA_MANAGER_EXPOSURE_MODE_SHUTTER_PRIORITY, and + * DJI_CAMERA_MANAGER_EXPOSURE_APERTURE_PRIORITY + * @param position: camera mounted position + * @param ev: refer to E_DjiCameraManagerExposureCompensation. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetExposureCompensation(E_DjiMountPosition position, + E_DjiCameraManagerExposureCompensation ev); + +/** + * @brief Get camera's EV value of the selected camera mounted position. + * @param position: camera mounted position + * @param ev: refer to E_DjiCameraManagerExposureCompensation. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetExposureCompensation(E_DjiMountPosition position, + E_DjiCameraManagerExposureCompensation *ev); + +/** + * @brief Set AE lock mode. + * @param position: camera mounted position + * @param enable: true to enable, false to disable AE lock. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetAELockEnabled(E_DjiMountPosition position, + bool enable); + +/** + * @brief Get AE lock mode. + * @note This API is not supported by L1/P1/M3D/M3TD models. + * @param position: camera mounted position + * @param enable: result of AE lock mode. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetAELockEnabled(E_DjiMountPosition position, + bool *enable); + +/** + * @brief Reset camera settings. + * @param position: camera mounted position + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_ResetCameraSettings(E_DjiMountPosition position); + +/** + * @brief Start to take video of the selected camera mounted position. + * @note Camera must be in RECORD_VIDEO mode. For thermal imaging camera, + * user can take a single photo when recording video. + * @param position: camera mounted position + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_StartRecordVideo(E_DjiMountPosition position); + +/** + * @brief Stop to take video of the selected camera mounted position. + * @note Precondition: The camera is recording currently. + * @param position: camera mounted position + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_StopRecordVideo(E_DjiMountPosition position); + +/** + * @brief Get camera recording state. + * @param position: camera mounted position + * @param recordingState: result of getting, see E_DjiCameraManagerRecordingState. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetRecordingState(E_DjiMountPosition position, + E_DjiCameraManagerRecordingState *recordingState); + +/** + * @brief Get camera recording time. + * @note This API is not supported by L1/P1/M3D/M3TD models. + * @param position: camera mounted position + * @param recordingTime: result of getting, unit is seconds. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetRecordingTime(E_DjiMountPosition position, + uint16_t *recordingTime); +/** + * @brief Get camera stream source range. + * @param position: camera mounted position + * @param rangeList: pointer to the result. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetStreamSourceRange(E_DjiMountPosition position, + T_DjiCameraManagerRangeList *rangeList); + +/** + * @brief Choose camera stream source. + * @param position: camera mounted position + * @param streamSource: stream source to be chose. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetStreamSource(E_DjiMountPosition position, + E_DjiCameraManagerStreamSource streamSource); + +/** + * @brief Get photo storage format range. + * @param position: camera mounted position + * @param rangeList: range list returned value + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetPhotoStorageFormatRange(E_DjiMountPosition position, + T_DjiCameraManagerRangeList *rangeList); + +/** + * @brief Set photo storage format. + * @param position: camera mounted position + * @param format: storage format. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetPhotoFormat(E_DjiMountPosition position, + E_DjiCameraManagerPhotoStorageFormat format); + +/** + * @brief Get photo storage format. + * @param position: camera mounted position + * @param format: returned value of storage format. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetPhotoFormat(E_DjiMountPosition position, + E_DjiCameraManagerPhotoStorageFormat *format); + +/** + * @brief Get video storage format range. + * @param position: camera mounted position + * @param rangeList: range list returned value + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetVideoFormatRange(E_DjiMountPosition position, + T_DjiCameraManagerRangeList *rangeList); + +/** + * @brief Set video storage format. + * @param position: camera mounted position + * @param format: storage format. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetVideoStorageFormat(E_DjiMountPosition position, + E_DjiCameraManagerVideoStorageFormat format); + +/** + * @brief Get video storage format. + * @param position: camera mounted position + * @param format: returned value of storage format. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetVideoFormat(E_DjiMountPosition position, + E_DjiCameraManagerVideoStorageFormat *format); + +/** + * @brief Get photo ratio range + * @param position: camera mounted position + * @param rangeList: range list returned value + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetPhotoRatioRange(E_DjiMountPosition position, + T_DjiCameraManagerRangeList *rangeList); + +/** + * @brief Set camera photo ratio + * @param position: camera mounted position + * @param photoRatio: ratio to be set + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetPhotoRatio(E_DjiMountPosition position, + E_DjiCameraManagerPhotoRatio photoRatio); + +/** + * @brief Get camera photo ratio + * @param position: camera mounted position + * @param photoRatio: returned value of photo ratio + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetPhotoRatio(E_DjiMountPosition position, + E_DjiCameraManagerPhotoRatio *photoRatio); + +/** + * @brief Get camera video resolution and frame rate + * @param position: camera mounted position + * @param photoRatio: returned value of video resolution and frame rate + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetVideoResolutionFrameRate(E_DjiMountPosition position, + T_DjiCameraManagerVideoFormat *videoParam); + +/** + * @brief Get night scene mode range. + * @param position: camera mounted position. + * @param tempRange: returned valued of night scene mode range. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetNightSceneModeRange(E_DjiMountPosition position, + T_DjiCameraManagerRangeList *rangeList); + +/** + * @brief Set night scene mode. + * @note Make sure that stream source is zoom or wide camera. + * @param position: camera mounted position + * @param nightSceneMode: night scene mode. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetNightSceneMode(E_DjiMountPosition position, + E_DjiCameraManagerNightSceneMode nightSceneMode); + +/** + * @brief Get night scene mode. + * @param position: camera mounted position + * @param nightSceneMode: pointer to night scene mode. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetNightSceneMode(E_DjiMountPosition position, + E_DjiCameraManagerNightSceneMode *nightSceneMode); + +/** + * @brief Get range of stream source(s) can be stored when capturing or recording. + * @param position: camera mounted position. + * @param rangeList: returned value of range, in member streamStorage. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetStreamStorageRange(E_DjiMountPosition position, + T_DjiCameraManagerRangeList *rangeList); + +/** + * @brief Select capture or recording stream(s) to store. + * @note Precondition: set camera's work corresponding to streamType + * @param position: camera mounted position. + * @param streamType: capture mode or recording mode. + * @param streamStorageList: Pointer to the struct that contains stream list. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetCaptureRecordingStreams(E_DjiMountPosition position, + E_DjiCameraManagerCaptureOrRecording streamType, + T_DjiCameraManagerStreamList *streamStorageList); + +/** + * @brief Get the stream(s) of capture or recording mode to be stored. + * @param position: camera mounted position. + * @param streamType: capture mode or recording mode. + * @param streamSourceList: the real return value. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetCaptureRecordingStreams(E_DjiMountPosition position, + E_DjiCameraManagerCaptureOrRecording streamType, + T_DjiCameraManagerStreamList *streamStorageList); + +/** + * @brief Turn on/off synchronized split screen zoom function. + * @param position: camera mounted position. + * @param enable: set true to turn on, false to turn off. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetSynchronizedSplitScreenZoomEnabled(E_DjiMountPosition position, bool enable); + + +/** + * @brief Set suffix name of directory or file. + * @note This setting applies only once for file names. + * @param position: camera mounted position. + * @param nameType: see E_DjiCameraManagerExpandNameType, select to set name of directory or file. + * @param nameSize: Length of the name string, between 1 and 239 characters. + * @param nameStr: Content of custom suffix name. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetCustomExpandName(E_DjiMountPosition position, + E_DjiCameraManagerExpandNameType nameType, + const uint8_t *nameStr, + uint32_t nameSize); + +/** + * @brief Get the custom suffix of the most recent directory or file name. + * @param position: camera mounted position + * @param nameType: to choose directory or file to get custom name + * @param nameStr: name string buffer + * @param nameSize: On input, indicates the maximum size of nameStr; on output, + * the actual size of the name string. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetCustomExpandName(E_DjiMountPosition position, + E_DjiCameraManagerExpandNameType nameType, + uint8_t *nameStr, + uint32_t *nameSize); + + +/** + * @brief Downloads a list of media files from the selected camera. + * @note This synchronous interface may lead to higher CPU usage. + * Times out after 3 seconds if the download fails. + * @param position: the mount position of the camera + * @param fileList: the pointer to the downloaded camera file list + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_DownloadFileList(E_DjiMountPosition position, T_DjiCameraManagerFileList *fileList); + +/** + * @brief Download selected camera media file list by slices. + * @note This synchronous interface may lead to higher CPU usage. + * Times out after 3 seconds if the download fails. + * @param position: the mount position of the camera + * @param sliceConfig: the slices config for downloading file list + * @param fileList: the pointer to the downloaded camera file list + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_DownloadFileListBySlices(E_DjiMountPosition position, + T_DjiCameraManagerSliceConfig sliceConfig, + T_DjiCameraManagerFileList *fileList); +/** + * @brief Registers a callback for downloading file data. + * @param position: the mount position of the camera + * @param callback: the download file data callback + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_RegDownloadFileDataCallback(E_DjiMountPosition position, + DjiCameraManagerDownloadFileDataCallback callback); + +/** + * @brief Downloads a media file specified by its index. + * @note Supports downloading one file at a time. Wait for a download to finish before starting another. + * This synchronous interface may lead to higher CPU usage. + * Times out after 3 seconds if the download fails. + * @param position: the mount position of the camera + * @param fileIndex: the index of the camera media file + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_DownloadFileByIndex(E_DjiMountPosition position, uint32_t fileIndex); + +/** + * @brief Download selected camera media file by file index and file type. + * @note This API only supports L2 camera. + * Supports downloading one file at a time. Wait for a download to finish before starting another. + * This synchronous interface may lead to higher CPU usage. + * Times out after 3 seconds if the download fails. + * @param position: the mount position of the camera + * @param fileIndex: the index of the camera media file + * @param fileType: the sub type of the camera media file + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_DownloadSubFileByIndexAndSubType(E_DjiMountPosition position, uint32_t index, E_DjiCameraMediaFileSubType fileType); +/** + * @brief Obtains the rights to download media files before downloading media files + * @param position: the mount position of the camera + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_ObtainDownloaderRights(E_DjiMountPosition position); + +/** + * @brief Releases the rights to download media files after downloading media files + * @note Failure to release downloader rights may restrict access to the camera album + * by the pilot app. + * @param position: the mount position of the camera + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_ReleaseDownloaderRights(E_DjiMountPosition position); + +/** + * @brief Format SD card. + * @param position: the mount position of the camera + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_FormatStorage(E_DjiMountPosition position); + +/** + * @brief Get storage info of SD card. + * @note This API doesn't support L1/P1/M3D/M3TD models. + * @param position: the mount position of the camera + * @param storageInfo: Result of SD Card storage information + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetStorageInfo(E_DjiMountPosition position, + T_DjiCameraManagerStorageInfo *storageInfo); + +/** + * @brief Delete selected camera media file by file index. + * @param position: the mount position of the camera + * @param fileIndex: the index of the camera media file + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_DeleteFileByIndex(E_DjiMountPosition position, uint32_t fileIndex); + +/** + * @brief Get the camera laser ranging info of the selected camera mounted position. + * @note Maximum data update frequency: 5Hz. + * @param position: the mount position of the camera + * @param laserRangingInfo: the pointer to the camera laser ranging info + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetLaserRangingInfo(E_DjiMountPosition position, + T_DjiCameraManagerLaserRangingInfo *laserRangingInfo); + +/** + * @brief Set point thermometry coordinates of the selected camera mounted position. + * @param position: camera mounted position + * @param pointCoordinate: point thermometry coordinates + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetPointThermometryCoordinate(E_DjiMountPosition position, + T_DjiCameraManagerPointThermometryCoordinate pointCoordinate); + +/** + * @brief Get point thermometry result. + * @note Before get point thermometry data from camera, DjiCameraManager_SetPointThermometryCoordinate() + * function has to be called. + * @param position: camera mounted position + * @param pointThermometryData: point thermometry result + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetPointThermometryData(E_DjiMountPosition position, + T_DjiCameraManagerPointThermometryData *pointThermometryData); + +/** + * @brief Set area thermometry coordinates of the selected camera mounted position. + * @param position: camera mounted position + * @param areaCoordinate: area thermometry coordinates + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetAreaThermometryCoordinate(E_DjiMountPosition position, + T_DjiCameraManagerAreaThermometryCoordinate areaCoordinate); + +/** + * @brief Get area thermometry result. + * @note Before get area thermometry data from camera, DjiCameraManager_SetAreaThermometryCoordinate() + * function has to be called. + * @param position: camera mounted position + * @param areaThermometryData: area thermometry result + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetAreaThermometryData(E_DjiMountPosition position, + T_DjiCameraManagerAreaThermometryData *areaThermometryData); + +/** + * @brief Set FFC mode. + * @param position: camera mounted position. + * @param ffcMode: mode to be set. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetFfcMode(E_DjiMountPosition position, E_DjiCameraManagerFfcMode ffcMode); + +/** + * @brief Trigger FFC one time. + * @param position: camera mounted position. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_TriggerFfc(E_DjiMountPosition position); + +/** + * @brief Set infrared camera gain mode. + * @param position: camera mounted position. + * @param gainMode: gain mode to set. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetInfraredCameraGainMode(E_DjiMountPosition position, + E_DjiCameraManagerIrGainMode gainMode); + +/** + * @brief Get temperature range of infrared camera. + * @param position: camera mounted position. + * @param tempRange: returned valued of temperature range. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetInfraredCameraGainModeTemperatureRange(E_DjiMountPosition position, + T_DjiCameraManagerIrTempMeterRange *tempRange); + +/** + * @brief Set camera metering mode. + * @param position: camera mounted position + * @param meteringMode: metering mode + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetMeteringMode(E_DjiMountPosition position, + E_DjiCameraManagerMeteringMode meteringMode); + +/** + * @brief Get camera metering mode. + * @param position: camera mounted position + * @param meteringMode: pointer to returned value of metering mode + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetMeteringMode(E_DjiMountPosition position, + E_DjiCameraManagerMeteringMode *meteringMode); + +/** + * @brief Get range of metering point. + * @param position: camera mounted position + * @param hrzNum: returned value, horizontal range. + * @param vtcNum: returned value, vertical range. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetMeteringPointRegionRange(E_DjiMountPosition position, + uint8_t *hrzNum, uint8_t *vtcNum); +/** + * @brief Set metering point. + * @param position: camera mounted position + * @param x: Horizontal coordinate value, should be no greater than hrzNum - 1. + * @param y: Horizontal coordinate value, should be no greater than vtcNum - 1. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_SetMeteringPoint(E_DjiMountPosition position, + uint8_t x, uint8_t y); + +/** + * @brief Get camera metering mode. + * @param position: camera mounted position + * @param x: returned valued, current metering point in horizontal coordinate. + * @param y: returned valued, current metering point in vertical coordinate. + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_GetMeteringPoint(E_DjiMountPosition position, + uint8_t *x, uint8_t *y); + + +/** + * @brief Start to record point cloud of the selected camera mounted position. + * @param position: camera mounted position + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_StartRecordPointCloud(E_DjiMountPosition position); + +/** + * @brief Stop to record point cloud of the selected camera mounted position. + * @note Precondition: The camera is recording currently. + * @param position: camera mounted position + * @return Execution result. + */ +T_DjiReturnCode DjiCameraManager_StopRecordPointCloud(E_DjiMountPosition position); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_CAMERA_MANAGER_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_core.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_core.h new file mode 100644 index 0000000..7f23e10 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_core.h @@ -0,0 +1,118 @@ +/** + ******************************************************************** + * @file dij_core.h + * @brief This is the header file for "dij_core.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_CORE_H +#define DJI_CORE_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_platform.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef struct { + char appName[32]; /*!< Specifies DJI SDK app name. This info can be obtained by logging in to the + developer website https://developer.dji.com/user/apps/#all. End with '\0'. */ + char appId[16]; /*!< Specifies DJI SDK app ID. This info can be obtained by logging in to the + developer website https://developer.dji.com/user/apps/#all. */ + char appKey[32]; /*!< Specifies DJI SDK app key. This info can be obtained by logging in to the + developer website https://developer.dji.com/user/apps/#all. */ + char appLicense[512]; /*!< Specifies DJI SDK app license. This info can be obtained by logging in to the + developer website https://developer.dji.com/user/apps/#all. */ + char developerAccount[64]; /*!< Specifies DJI SDK developer account email. This info can be obtained by + logging in to the developer website https://developer.dji.com/user/apps/#all. + Developer's account and other related information need to be able to correspond. + End with '\0'. */ + char baudRate[7]; /*!< Specifies DJI SDK communication serial port baud rate. */ +} T_DjiUserInfo; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialize the Payload SDK core in blocking mode. + * @note The order of calling this call is crucial. It must be done after registering console/OSAL/HAL handler functions + * It must be done after registering console/OSAL/HAL handler functions and before using other functional module + * interfaces. Correctly fill in the developer information to ensure successful initialization. See the + * See the "PSDK Initialization" tutorial for more. + * This function does not return until the correct aircraft type and PSDK adapter type is obtained. The logic ensures + * that aircraft and PSDK adapter have been started up normally before PSDK functional module and user's program run. + * General execution time of this function is 2-4 seconds. + * @param userInfo: pointer to the PSDK application information. + * @return Execution result. + */ +T_DjiReturnCode DjiCore_Init(const T_DjiUserInfo *userInfo); + +/** + * @brief Sets an alias for a DJI application or product that meets the condition for DJI application or product. + * If an alias exists, it will be displayed in DJI Pilot. + * @note Still need to pass in correct DJI APP name that is obtained from DJI SDK developer website to DjiCore_Init() + * interface. The DJI APP name will be used to bind and verification. + * The alias will take effect after a short delay, up to a maximum of 1 second. + * @param productAlias: A pointer to the product alias string, which must end with '\0'. The maximum length of the string is 31 characters. + * If the alias string exceeds 31 characters, it will be truncated before being passed in. + * @return Execution result. + */ +T_DjiReturnCode DjiCore_SetAlias(const char *productAlias); + +/** + * @brief Set custom firmware version for DJI application or product. + * @details Payload firmware version will always display in DJI Pilot payload settings interface. + * @param version: the custom firmware version to be set. + * @return Execution result. + */ +T_DjiReturnCode DjiCore_SetFirmwareVersion(T_DjiFirmwareVersion version); + +/** + * @brief Set custom serial number for DJI application or product. + * @details Payload custom serial number will always display in DJI Pilot payload settings interface. + * @param productSerialNumber: the custom serial number to be set, needs to be no larger than 32 bytes. + * @return Execution result. + */ +T_DjiReturnCode DjiCore_SetSerialNumber(const char *productSerialNumber); + +/** + * @brief Notify that the Payload SDK core application starts. + * @note The order of calling this interface requires special attention, The call needs to be completed after all the + * module initialize and register interfaces. + * @return Execution result. + */ +T_DjiReturnCode DjiCore_ApplicationStart(void); + +/** + * @brief DeInitialize the Payload SDK core in blocking mode. + * @return Execution result. + */ +T_DjiReturnCode DjiCore_DeInit(void); + +#ifdef __cplusplus +} +#endif + +#endif // DIJ_CORE_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_error.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_error.h new file mode 100644 index 0000000..23ca4a1 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_error.h @@ -0,0 +1,1374 @@ +/** + ******************************************************************** + * @file dji_error.h + * @brief This is the header file for "dji_error.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_ERROR_H +#define DJI_ERROR_H + +/* Includes ------------------------------------------------------------------*/ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +#define DJI_ERROR_MODULE_INDEX_OFFSET 32u +#define DJI_ERROR_MODULE_INDEX_MASK 0x000000FF00000000u +#define DJI_ERROR_RAW_CODE_OFFSET 0u +#define DJI_ERROR_RAW_CODE_MASK 0x00000000FFFFFFFFu + +#define DJI_ERROR_CODE(moduleIndex, rawErrCode) \ +((uint64_t)0 | \ +((((uint64_t)(moduleIndex)) << (DJI_ERROR_MODULE_INDEX_OFFSET)) & (DJI_ERROR_MODULE_INDEX_MASK)) | \ +((((uint64_t)(rawErrCode)) << (DJI_ERROR_RAW_CODE_OFFSET)) & (DJI_ERROR_RAW_CODE_MASK))) + +/** + * @brief Error objects, specifying error code, error description, error reason and error recovery suggestion below. + * @attention Require arrange by error code from small to large. + */ +#define DJI_ERROR_OBJECTS \ +/* system module error message */ \ +{DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS, "Execution successfully.", NULL}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_REQUEST_PARAMETER, "Request parameters are invalid.", "Please double-check requested parameters."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_EXECUTING_HIGHER_PRIORITY_TASK, "A higher priority task is being executed.", "Please stop the higher priority task or try again later."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT, "Operation is not supported.", "Please check input parameters or contact DJI for help."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_TIMEOUT, "Execution timeout.", "Please contact DJI for help."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED, "Memory allocation failed.", "Please check system configure."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER, "Input parameters are invalid.", "Please double-check requested parameters."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT_IN_CURRENT_STATE, "Operation is not supported in current state.", "Please try again later."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR, "System error.", "Please contact DJI for help."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_HARDWARE_ERR, "Hardware error.", "Please contact DJI for help."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_INSUFFICIENT_ELECTRICITY, "Low battery.", "Please replacement battery for machine and try again."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN, "Unknown error.", NULL}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_NOT_FOUND, "Parameters are not found.", NULL}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_OUT_OF_RANGE, "Out of range.", "Please check parameters."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_BUSY, "System is busy.", "Please try again later."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_DUPLICATE, "Have existed the same object.", "Please input valid parameters."}, \ +{DJI_ERROR_SYSTEM_MODULE_CODE_ADAPTER_NOT_MATCH, "PSDK adapter do not meet requirements.", "Please try again after replacing PSDK adapter."}, \ + \ +/* gimbal module error message */ \ +{DJI_ERROR_GIMBAL_MODULE_CODE_PITCH_REACH_POSITIVE_LIMIT, "Pitch axis gimbal reach positive limit.", "Please do not rotate towards positive direction."}, \ +{DJI_ERROR_GIMBAL_MODULE_CODE_PITCH_REACH_NEGATIVE_LIMIT, "Pitch axis gimbal reach negative limit.", "Please do not rotate towards negative direction."}, \ +{DJI_ERROR_GIMBAL_MODULE_CODE_ROLL_REACH_POSITIVE_LIMIT, "Roll axis gimbal reach positive limit.", "Please do not rotate towards positive direction."}, \ +{DJI_ERROR_GIMBAL_MODULE_CODE_ROLL_REACH_NEGATIVE_LIMIT, "Roll axis gimbal reach negative limit.", "Please do not rotate towards negative direction."}, \ +{DJI_ERROR_GIMBAL_MODULE_CODE_YAW_REACH_POSITIVE_LIMIT, "Yaw axis gimbal reach positive limit.", "Please do not rotate towards positive direction."}, \ +{DJI_ERROR_GIMBAL_MODULE_CODE_YAW_REACH_NEGATIVE_LIMIT, "Yaw axis gimbal reach negative limit.", "Please do not rotate towards negative direction."}, \ +{DJI_ERROR_GIMBAL_MODULE_CODE_NON_CONTROL_AUTHORITY, "Current device do not have control authority of the gimbal.", "Please do not control gimbal with other devices that have high control priority simultaneously."}, \ + \ +/* payload collaboration module error message */ \ +{DJI_ERROR_PAYLOAD_COLLABORATION_MODULE_CODE_POSITION_NOT_MATCH, "Payload mount position do not meet requirements.", "Please read API and user documentation, ensuring input parameters satisfy requirements."}, \ +\ +/* activation error message of identity module */ \ +{DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_PARAMETER_ERROR, "Activation parameter error.", "Please check the validity of the activation parameters."}, \ +{DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_ENCODE_ERROR, "Activation encode error", "Please check the validity of the activation parameters"}, \ +{DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_NEW_DEVICE_ERROR, "Activate a new device error", \ +"\r\n* Double-check your app_id and app_key. Does it match with your DJI developer account?\r\n"\ +"* If this is a new device or has been previously activated with another app_id and app_key, you need to activate it through the DJI Assistant 2 with Internet.\r\n"\ +"* Please make sure you download the correct version of DJI Assistant 2 for your drone.\r\n"\ +}, \ +{DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_SOFTWARE_NOT_CONNECTED, "Not connection to DJI Assistant 2.", "Please connect your drone to DJI Assistant 2 while activating the new device at first time."}, \ +{DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_NETWORK_ERROR, "DJI Assistant 2 not connected to the internet.", "Please activate through the DJI Assistant 2 with Internet"}, \ +{DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_SERVER_ACCESS_REFUSED, "DJI server refuse this activation request.", "Please check the validity of the activation parameters."}, \ +{DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_ACCESS_LEVEL_ERROR, "Activate level error.", "Please check your app_id level."}, \ +{DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_OSDK_VERSION_ERROR, "Activate a wrong osdk version", "Please check your OSDK version whether match the drone or not."}, \ +\ +/* subscription module error message */ \ +{DJI_ERROR_SUBSCRIPTION_MODULE_CODE_INVALID_TOPIC_FREQ, "Frequency of topic is invalid.", "Please read API and user documentation, ensuring input parameters satisfy requirements."}, \ +{DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_DUPLICATE, "Topic is subscribed repeatedly.", "Please do not subscribe a topic repeatedly."}, \ +{DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_NOT_SUBSCRIBED, "Requested topic have not been subscribed.", "Please try to get value after subscribing topic."}, \ +{DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TIMESTAMP_NOT_ENABLE, "Requested topic do not have timestamp data. Did not enable timestamp when subscribe topic.", "Please subscribe topic enabled timestamp."},\ +{DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_NOT_SUPPORTED, "Requested topic is not supported.", "Please check the topic is supported or not on current aircraft version."}, \ +\ +/* mop channel module error message */ \ +{DJI_ERROR_MOP_CHANNEL_MODULE_CODE_CONNECTION_CLOSE, "Connection of channel is closed. The peer channel do not work or abnormally be closed.", "Please confirm state of the peer channel and reaccept the connection request of MSDK/OSDK"}, \ +\ +/* flight controller module error message */ \ +{DJI_ERROR_FC_MODULE_CODE_RC_MODE_ERROR, "RC_MODE_ERROR", "Please check the RC mode"}, \ +{DJI_ERROR_FC_MODULE_CODE_RELEASE_CONTROL_SUCCESS, "RELEASE_CONTROL_SUCCESS", NULL} ,\ +{DJI_ERROR_FC_MODULE_CODE_OBTAIN_CONTROL_SUCCESS, "OBTAIN_CONTROL_SUCCESS", NULL} ,\ +{DJI_ERROR_FC_MODULE_CODE_OBTAIN_CONTROL_IN_PROGRESS, "OBTAIN_CONTROL_IN_PROGRESS", NULL} ,\ +{DJI_ERROR_FC_MODULE_CODE_RELEASE_CONTROL_IN_PROGRESS, "RELEASE_CONTROL_IN_PROGRESS", NULL} ,\ +{DJI_ERROR_FC_MODULE_CODE_RC_NEED_MODE_P, "RC_NEED_MODE_P", NULL} ,\ +{DJI_ERROR_FC_MODULE_CODE_RC_NEED_MODE_F, "RC_NEED_MODE_F", NULL} ,\ +{DJI_ERROR_FC_MODULE_CODE_PARAM_READ_WRITE_INVALID_PARAM, "read or write invalid param", "Please check hash value and param value"} ,\ +{DJI_ERROR_FC_MODULE_CODE_IOC_OBTAIN_CONTROL_ERROR, "IOC_OBTAIN_CONTROL_ERROR", NULL} ,\ +{DJI_ERROR_FC_MODULE_CODE_KEY_ERROR, "Activate key error", NULL} ,\ +{DJI_ERROR_FC_MODULE_CODE_NO_AUTHORIZATION_ERROR, "No authorization", "Please finish activation firstly"} ,\ +{DJI_ERROR_FC_MODULE_CODE_NO_RIGHTS_ERROR, "No rights error", NULL} ,\ +{DJI_ERROR_FC_MODULE_CODE_SYSTEM_ERROR, "Unknown system error", NULL} ,\ +\ +/* flight controller action module error message */\ +{DJI_ERROR_FC_JOYSTICK_MODULE_OBTAIN_RELEASE_JOYSTICK_AUTH_SUCCESS, "Obtain/Release joystick authority success", NULL} ,\ +{DJI_ERROR_FC_JOYSTICK_MODULE_DEVICE_NOT_ALLOW, "The requesting device is not allowed to obtain/release joystick control authority, only support OSDK/MSDK", "Please use right devices(OSDK/MSDK)"} ,\ +{DJI_ERROR_FC_JOYSTICK_MODULE_TAKING_OFF, "Not allowed to obtain/release joystick control authority when drone is taking off ", "Please do it before or after taking off"} ,\ +{DJI_ERROR_FC_JOYSTICK_MODULE_LANDING, "Not allowed to obtain/release joystick control authority when drone is landing", "Please do it before or after landing"} ,\ +{DJI_ERROR_FC_JOYSTICK_MODULE_CMD_INVALID, "Invalid input command", "Please check your input command which only support 0/1"} ,\ +{DJI_ERROR_FC_JOYSTICK_MODULE_RC_NOT_P_MODE, "Not allowed to obtain/release joystick control authority when rc is not in P_MODE", "Please switch RC to P_MODE"} ,\ +{DJI_ERROR_FC_JOYSTICK_MODULE_CMD_LENGTH_ERROR, "Invalid length of input command", "Please input valid length command"} ,\ +{DJI_ERROR_FC_JOYSTICK_MODULE_HAS_NO_JOYSTICK_AUTHORITY, "Not allowed to release joystick control authority when drone has no joystick authority", "Please obtain joystick authority first"} ,\ +{DJI_ERROR_FC_JOYSTICK_MODULE_IN_RC_LOST_ACTION, "Not allowed to obtain/release joystick control authority when drone is executing rc lost action", "Please change battery"} ,\ +\ +/* flight controller action module error message */\ +{DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_MOTOR_ON, "now motor is on", "Please check motor status"} ,\ +{DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_MOTOR_OFF, "now motor is off", "Please check motor status"} ,\ +{DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_IN_AIR, "aircraft is in air", "Please check aircraft flight status"} ,\ +{DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_NOT_IN_AIR, "aircraft is not in air", "Please check aircraft flight status"} ,\ +{DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_HOME_POINT_NOT_SET, "home point not set", "Please set home point"} ,\ +{DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_BAD_GPS, "bad GPS", "Please fly where the GPS signal is good"} ,\ +{DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_IN_SIMULATION, "in simulation", "Please exit simulation first"} ,\ +{DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_CANNOT_START_MOTOR, "can not start motor", "Please check motor status"} ,\ +{DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_LOW_VOLTAGE, "low voltage", "Please change battery"} ,\ +{DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_SPEED_TOO_LARGE, "speed too large", "Please slow down"} ,\ + \ +/* flight controller arrest flying module error message */\ +{DJI_ERROR_FC_ARREST_FLYING_MODULE_REGISTER_LOGOUT_SET_SUCCESS, "register/logout/execute arrest-flying success", NULL} ,\ +{DJI_ERROR_FC_ARREST_FLYING_MODULE_REGISTER_LOGOUT_NULL_POINTER, "null pointer when register/logout arrest-flying", NULL} ,\ +{DJI_ERROR_FC_ARREST_FLYING_MODULE_HMS_CODE_HAS_REGISTED, "duplicate hms code", NULL} ,\ +{DJI_ERROR_FC_ARREST_FLYING_MODULE_HMS_CODE_NOT_FIND, "invalid hms code", NULL} ,\ +{DJI_ERROR_FC_ARREST_FLYING_MODULE_ADD_ITEM_NO_DECRIPTION, "no description when register arrest-flying", NULL} ,\ +{DJI_ERROR_FC_ARREST_FLYING_MODULE_REGISTER_ID_INVALID, "invalid request id", NULL} ,\ +{DJI_ERROR_FC_ARREST_FLYING_MODULE_STOP_IN_AIR_HMSCODE_NOT_IN_WHITE_TABLE, "hms code is not in white list for allowing stop motor in the air", NULL} ,\ +{DJI_ERROR_FC_ARREST_FLYING_MODULE_INVALID_FORMAT_HMSCODE, "invalid hms code format", NULL} ,\ +{DJI_ERROR_FC_ARREST_FLYING_MODULE_HMSCODE_NOT_IN_WHITE_TABLE, "hms code is not in arrest-flying white list",NULL} ,\ +\ +/* flight controller home location module error message */\ +{DJI_ERROR_FC_HOME_LOCATION_MODULE_UNKNOWN_FAILED_REASON, "set home location fail, unknown reason", NULL} ,\ +{DJI_ERROR_FC_HOME_LOCATION_MODULE_INVALID_GPS_COORDINATE, "invalid GPS coordinate when set APP or RC to be home location", NULL} ,\ +{DJI_ERROR_FC_HOME_LOCATION_MODULE_NOT_BE_RECORD, "home location is not inited", "Please waiting for aircraft recording home location"} ,\ +{DJI_ERROR_FC_HOME_LOCATION_MODULE_GPS_NOT_READY, "GPS level < 4", NULL} ,\ +{DJI_ERROR_FC_HOME_LOCATION_MODULE_DIS_TOO_FAR, "new home location is more than 20km away from current home locaton(APP/RC)", NULL} ,\ +\ +/* flight controller emergency stop motor module error message */\ +{DJI_ERROR_FC_EMERGENCY_STOP_MOTOR_MODULE_VERSION_NOT_MATCH, "emergency stop motor version not match", NULL} ,\ +{DJI_ERROR_FC_EMERGENCY_STOP_MOTOR_MODULE_CMD_INVALID, "emergency stop motor cmd invalid", NULL} ,\ +/* camera manager module error message */\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_UNSUPPORTED_COMMAND, "Command not supported", "Check the firmware or command validity"} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_TIMEOUT, "Camera's execution of this action has timed out", "Try again or check the firmware or command"} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_RAM_ALLOCATION_FAILED, "Camera's execution of this action is out of memory", "Please contact for help."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_INVALID_COMMAND_PARAMETER, "Camera received invalid parameters", "Check the validity of the parameter"} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_UNSUPPORTED_COMMAND_IN_CUR_STATE, "Camera is busy or the command is not supported in the Camera's current state", "Check current camera state is if appropriate fot the CMD"} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_CAMERA_TIME_NOT_SYNCHRONIZED, "The time stamp of the camera is not sync", "Please contact for help."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_PARAMETER_SET_FAILED, "Camera failed to set the parameters it received", "Please check the parameter to set is if supported in your devices."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_PARAMETER_GET_FAILED, "Camera param get failed", "Please check the parameter to get is if supported in your devices."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_SD_CARD_MISSING, "Camera has no SD Card", "Please install SD card."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_SD_CARD_FULL, "The Camera's SD Card is full", "Please make sure the SD card has enough space."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_SD_CARD_ERROR, "Error accessing the SD Card", "Please check the validity of the SD card."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_SENSOR_ERROR, "Camera sensor error", "Please contact for help."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_SYSTEM_ERROR, "Camera system error", "Please recheck all the running conditions or contact for help."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_PARAMETER_TOTAL_TOO_LONG, "Camera param get failed", "Please check the validity of the parameter length"} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_MODULE_INACTIVATED, "Camera module is not activated", "Please activate the module first."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_FIRMWARE_DATA_NUM_DISCONTINUOUS, "The seq number of Firmware data is invalid", "Please check the validity of the camera firmware."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_FIRMWARE_VERIFICATION_ERROR, "Firmware check error", "Please check the validity of the camera firmware."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_FLASH_WRITE_ERROR, "Camera flash write error", "Please contact for help."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_FIRMWARE_TYPE_MISMATCH, "Firmware type is invalid", "Please check the validity of the camera firmware."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_REMOTE_CONTROL_UNCONNECTED, "Remote Control is disconnected now", "Please check the connection with remote control is if OK."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_HARDWARE_ERROR, "Camera hardware error", "Please contact for help."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_AIRCRAFT_UNCONNECTED, "Disconnect with aircraft", "Please check the connection with aircraft is if OK."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_CANNOT_UPGRADE_IN_CUR_STATE, "Camera cannot not upgrade in current status", "Please contact for help."} ,\ +{DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_UNDEFINE_ERROR, "Undefined error", "Please contact for help."} ,\ +\ +/* gimbal manager module error message */\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_UNSUPPORTED_COMMAND, "Command not supported", "Check the firmware or command validity"} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_TIMEOUT, "Camera's execution of this action has timed out", "Try again or check the firmware or command"} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_RAM_ALLOCATION_FAILED, "Camera's execution of this action is out of memory", "Please contact for help."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_INVALID_COMMAND_PARAMETER, "Camera received invalid parameters", "Check the validity of the parameter"} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_UNSUPPORTED_COMMAND_IN_CUR_STATE, "Camera is busy or the command is not supported in the Camera's current state", "Check current camera state is if appropriate fot the CMD"} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_CAMERA_TIME_NOT_SYNCHRONIZED, "The time stamp of the camera is not sync", "Please contact for help."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_PARAMETER_SET_FAILED, "Camera failed to set the parameters it received", "Please check the parameter to set is if supported in your devices."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_PARAMETER_GET_FAILED, "Camera param get failed", "Please check the parameter to get is if supported in your devices."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_SD_CARD_MISSING, "Camera has no SD Card", "Please install SD card."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_SD_CARD_FULL, "The Camera's SD Card is full", "Please make sure the SD card has enough space."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_SD_CARD_ERROR, "Error accessing the SD Card", "Please check the validity of the SD card."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_SENSOR_ERROR, "Camera sensor error", "Please contact for help."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_SYSTEM_ERROR, "Camera system error", "Please recheck all the running conditions or contact for help."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_PARAMETER_TOTAL_TOO_LONG, "Camera param get failed", "Please check the validity of the parameter length"} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_MODULE_INACTIVATED, "Camera module is not activated", "Please activate the module first."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_FIRMWARE_DATA_NUM_DISCONTINUOUS, "The seq number of Firmware data is invalid", "Please check the validity of the camera firmware."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_FIRMWARE_VERIFICATION_ERROR, "Firmware check error", "Please check the validity of the camera firmware."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_FLASH_WRITE_ERROR, "Camera flash write error", "Please contact for help."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_FIRMWARE_TYPE_MISMATCH, "Firmware type is invalid", "Please check the validity of the camera firmware."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_REMOTE_CONTROL_UNCONNECTED, "Remote Control is disconnected now", "Please check the connection with remote control is if OK."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_HARDWARE_ERROR, "Camera hardware error", "Please contact for help."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_AIRCRAFT_UNCONNECTED, "Disconnect with aircraft", "Please check the connection with aircraft is if OK."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_CANNOT_UPGRADE_IN_CUR_STATE, "Camera cannot not upgrade in current status", "Please contact for help."} ,\ +{DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_UNDEFINE_ERROR, "Undefined error", "Please contact for help."} ,\ +\ +/* waypoint v2 module error message */ \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_COMMON_SUCCESS, "Execute waypoint v2 cmd successfully", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_COMMON_INVALID_DATA_LENGTH, "The length of the data is illegal based on the protocol ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_COMMON_INVALD_FLOAT_NUM, "Invalid float number (NAN or INF) ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WP_VERSION_NO_MATCH, "Waypoint mission version can't match with firmware ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_COMMON_UNKNOWN, "Fatal error Unexpected result ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_RESV, "Reserved", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_WP_NUM_TOO_MANY, "Min_initial_waypoint_num is large than permitted_max_waypoint_num ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_WP_NUM_TOO_FEW, "Min_initial_waypoint_num is less than permitted_min_waypoint_num ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_END_INDEX, "Waypoint_end_index is equal or large than total_waypoint_num ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_START_ID_GT_END_ID, "The start index is greater than end index of upload wps ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_END_ID_GT_TOTAL_NUM, "The end index of uplod wps is greater than inited total numbers ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_DOWNLOAD_WPS_NOT_IN_STORED_RAGNE, "The index of first and end waypoint expected to download is not in range of stored in FC ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_CUR_POS_IS_FAR_AWAY_FROM_FIRST_WP, "Current position is far away from the first waypoint. ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_ADJ_WPS_TOO_CLOSE, "It is too close from two adjacent waypoints",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_ADJ_WPS_TOO_FAR, "The distance betwween two adjacent waypoints is not in[0.5m, 5000m]",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_MAX_VEL_GT_GLOBAL, "The max vel of uplod wp is greater than global max vel ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_LOCAL_CRUISE_VEL_GT_LOCAL_MAX, "The local cruise vel of upload wp is greater than local max vel ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_LOCAL_CRUISE_VEL_GT_GLOBAL_MAX, "The local cruise vel of upload wp is greater than global max vel ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_GLOBAL_MAX_VEL, "Global_max_vel is greater than permitted_max_vel or less than permitted_min_vel ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GLOBAL_CRUISE_VEL_GT_MAX_VEL, "Global_cruise_vel is greater than global_max_vel ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_GOTO_FIRST_FLAG, "Goto_first_point_mode is out of range of waypoint_goto_first_flag_t_enum ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_FINISHED_ACTION, "Finished_action is out of range of wp_plan_finish_action_t_enum ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_RC_LOST_ACTION, "Rc_lost_action is out of range of wp_plan_rc_lost_action_t_enum ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_YAW_MODE_INVALID, "The yaw mode of upload wp is invalid. reference to waypoint2_yaw_mode_t defined in math_waypoint_planner.h ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_YAW_CMD_NOT_IN_RANGE, "The yaw command of upload wp is not in range. the range for MR:[-180 180]",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_YAW_TURN_DIRECTION_INVALID, "The yaw turn direction of upload wp is invalid. it should be 0:clockwise or 1:anti-clockwise ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_WP_TYPE_INVALID, "The wp type of upload wp is invalid. reference to waypoint_type_t defined in math_waypoint_planner.h ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GO_STOP_CMD_INVALID, "Go/stop command is invalid. ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INVALID_PAUSE_RECOVERY_CMD, "The command of pause/recovery is not equal to any of the command enum ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INVALID_BREAK_RESTORE_CMD, "The command of break/restore is not equal to any of the command enum ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_REF_POINT, "Initial reference point position coordinate exceed set range ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_DAMPING_DIS_GE_DIS_OF_ADJ_POINTS, "The damping dis is greater than or equal the distance of adjacent point ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_CANNT_SET_WP_LINE_EXIT_TYPE, "Cann't set wp_line_exit type to wp ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INFO_NOT_UPLOADED, "The init info of Ground Station is not uploaded yet ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WP_HAS_NOT_UPLOADED, "The wp has not uploaded yet ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOADED_WP_NOT_ENOUGH, "Min_initial_waypoint_num is not uploaded. ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GS_HAS_STARTED, "Waypoint plan has started when received go command. ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GS_NOT_RUNNING, "Waypoint plan not running when received stop command. ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GS_NOT_RUNNING_FOR_PAUSE_RECOVERY, "Ground station(GS) is not started(used by pause/recovery) ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GS_NOT_RUNNING_FOR_BREAK_RESTORE, "Ground station(GS) is not started(used by break/restore) ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_NOT_IN_WP_MIS, "Not in the waypoint mission(MIS)(cannot pause/recovery or break/restore) ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_MIS_HAS_BEEN_PAUSED, "The current status is paused",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_MIS_NOT_PAUSED, "Not in paused status",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_MIS_HAS_BEEN_BROKEN, "The current status is broken",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_MIS_NOT_BROKEN, "Not in break status",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_PAUSE_RECOVERY_NOT_SUPPORTED, "The configuration forbid using pause/recovery API ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_BREAK_RESTORE_NOT_SUPPORTED, "The configuration forbid using break/restore API ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_NO_BREAK_POINT, "No break point is recorded for restore ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_NO_CUR_TRAJ_PROJECT, "No current trajectory project point is recorded for restore ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_NO_NXT_TRAJ_PROJECT, "No next trajectory project point is recorded for restore ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_NO_NNT_TRAJ_PROJECT, "No next the next trajectory project point is recorded for restore ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_WP_ID_NOT_CONTINUE, "The index of upload wp is not continue after the store wp ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WP_LINE_ENTER_NOT_SET_TO_START_WP, "The WP_LINE_ENTER wp_type set to a wp which is not the init start waypoint ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_WP_WHEN_PLAN_HAS_STARTED, "The waypoint plan has started when initializing waypoint ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_DAMPING_DIS_EXCEED_RANGE, "Waypoint damping distance exceed set range ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WAYPOINT_COOR_EXCEED_RANGE, "Waypoint position coordinate exceed rational range ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_FIRST_WP_TYPE_IS_WP_TURN_NO, "First waypoint type error",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WP_EXCEED_RADIUS_LIMIT, "Waypoint position exceed radius limit ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WP_EXCEED_HEIGHT_LIMIT, "Waypoint position exceed height limit ",NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_STATUS_RESV, "Reserved error code", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_STATUS_WP_MIS_CHECK_FAIL, "Head_node is null or atti_not_healthy or gyro_not_healthy or horiz_vel_not healthy or horiz_abs_pos_not_healthy. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_STATUS_HOME_NOT_RECORDED, "The home point is no recorded yet which will be executed at the first time of GPS level > 3(MR FW). ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_STATUS_LOW_LOCATION_ACCURACY, "Current location accuracy is low for bad GPS signal. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_STATUS_RTK_CONDITION_IS_NOT_READY, "Use rtk_data but rtk is not connected or rtk_data is invalid ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_SECURE_RESV, "Reserved error code", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_SECURE_CROSS_NFZ, "The trajectory cross the NFZ ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_SECURE_BAT_LOW, "Current capacity of smart battery or voltage of non-smart battery is lower than level 1 or level 2 threshold ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_RESV, "Reserved error code", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_ACTION_ID_DUPLICATED, "The ID of Action is duplicated. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_ACTION_ITEMS_SPACE_NOT_ENOUGH, "There is no enough memory space for new Action Item ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_ACTION_SIZE_GT_BUF_SIZE, "The size of buffer used to get the info of Action is less than the size of Action. Normally users can not get this. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_ACTION_ID_NOT_FOUND, "The ID of Action is not found. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_DOWNLOAD_ACTION_ID_RANGE_ERROR, "The download action start id is bigger than the action end id ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_NO_ACTION_ITEMS_STORED, "Can not download or get min-max action ID for no action items stored in action kernel ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_RESV, "Reserved error code", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_TYPE_INVALID, "The type ID of Trigger is invalid. It might not defined or the information is empty. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_REACH_WP_END_INDEX_LT_START_INDEX, "Wp_end_index is less than wp_start_index in reach_waypoint_trigger. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_REACH_WP_INVALID_INTERVAL_WP_NUM, "Interval_wp_num is large than the difference of wp_start_index and wp_end_index in reach_waypoint_trigger. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_REACH_WP_INVALID_AUTO_TERMINATE_WP_NUM , "Auto_terminate_wp_num is large than interval_wp_num in reach_waypoint_trigger. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_ASSOCIATE_INVALID_TYPE, "The associate_type is greater than the maximum value. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_SIMPLE_INTERVAL_INVALID_TYPE, "The interval type is greater than the maximum value. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_COMMON_RESV, "Reserved error code", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_COMMON_ACTUATOR_EXEC_NON_SUPPORTED, "The execution of Actuator is not supported e.g. try to stop camera shooting. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_COMMON_ACTUATOR_TYPE_INVALID, "The type ID of Actuator is invalid. It might not defined or the information is empty. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_COMMON_ACTUATOR_FUNC_INVALID, "The Function ID of Actuator is invalid. It might not defined or the information is empty. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_RESV, "Reserved error code", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_SEND_SINGLE_SHOT_CMD_TO_CAMERA_FAIL, "Fail to send shot cmd to camera for no camera or camera is busy. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_SEND_VIDEO_START_CMD_TO_CAMERA_FAIL, "Fail to send video start cmd to camera for no camera or camera is busy. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_SEND_VIDEO_STOP_CMD_TO_CAMERA_FAIL, "Fail to send video stop cmd to camera for no camera or camera is not busy. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_FOCUS_PARAM_XY_INVALID, "Camera focus param xy exceed valid range (0 1). ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_SEND_FOCUS_CMD_TO_CAMERA_FAIL, "Fail to send focus cmd to camera for no camera or camera is busy. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_SEND_FOCALIZE_CMD_TO_CAMERA_FAIL, "Fail to send focalize cmd to camera for no camera or camera is busy. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_FOCAL_DISTANCE_INVALID, "Focal distance of camera focalize function exceed valid range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_EXEC_FAIL, "This err code indicate camera fail to exec coressponding cmd and the low 8 bit", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_RESV, "Reserved error code", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_INVALID_RPY_ANGLE_CTRL_CMD, "Gimbal roll pitch yaw angle ctrl cmd param invalid ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_INVALID_DURATION_CMD, "Gimbal duration param invalid unable to exec. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_FAIL_TO_ARRIVE_TGT_ANGLE, "Gimbal fail to arrive target angle . ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_FAIL_TO_SEND_CMD_TO_GIMBAL, "Fail to send cmd to gimbal for gimbal is busy or no gimbal. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_THIS_INDEX_OF_GIMBAL_NOT_DOING_UNIFORM_CTRL , "Fail to stop gimbal uniform ctrl because index error. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_FLIGHT_RESV, "Reserved error code", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_FLIGHT_YAW_INVALID_YAW_ANGLE, "Yaw angle is lager max yaw angle. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_FLIGHT_YAW_TO_TGT_ANGLE_TIMEOUT, "Failed to target yaw angle because of timeout. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_FLIGHT_ACTION_YAW_OCCUPIED, "Failed to target yaw angle because of timeout. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_FLIGHT_CUR_AND_TGT_VEL_CLE_STATUE_EQUAL, "Failed to current and target vel not equal. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_PAYLOAD_RESV, "Failed to payload reserved error code. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_PAYLOAD_FAIL_TO_SEND_CMD_TO_PAYLOAD, "Failed to sned cmd to payload. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_PAYLOAD_EXEC_FAILED, "Failed to execute payload actuator. ", NULL}, \ +/* waypoint v3 module error message */ \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_COMMON_SUCCESS, "Execute waypoint v3 cmd successfully. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_MISSION_ID_NOT_EXIST, "Execute waypoint v3 mission id not match. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_WAYLINE_INFO_ERROR , "Execute waypoint v3 wayline info error. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_WPMZ_FILE_VERSION_NOT_MATCH, "Execute waypoint v3 wpmz file not match. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_WPMZ_FILE_LOAD_ERROR, "Load waypoint v3 wpmz file error. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_NO_BREAK_INFO, "Execute waypoint v3 no break info error. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CMD_INVALID, "Execute waypoint v3 cmd invalid. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_START_WAYLINE_WHEN_WAYLINE_RUNNING, "Cannot start wayline when wayline running. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_BREAK_WAYLINE_IN_CUR_STATE, "Cannot break wayline in current state. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_STOP_WAYLINE_WHEN_WAYLINE_NOT_RUNNING, "Cannot stop wayline when wayline not running. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_BREAK_WAYLINE_WHEN_WAYLINE_NOT_RUNNING, "Cannot break wayline when wayline not running. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_REQUEST_DRONE_CONTROL, "Flight mission conflict, unable to obtain control auth of the aircraft. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_RESUME_WAYLINE_IN_CUR_STATE, "Failed to resume wayline in current state. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_HEIGHT_LIMIT, "Execute waypoint v3 failed due to height limit. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RADIUS_LIMIT, "Execute waypoint v3 failed due to radius limit. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CROSS_FLYLIMIT_AERA, "Execute waypoint v3 failed due to cross flylimit area. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_LOW_LIMIT, "Execute waypoint v3 failed due to low limit. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_OBSTACAL_STOP, "Execute waypoint v3 failed due to obstacal stop. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RTK_DISCONNECT, "Execute waypoint v3 failed due to rtk disconnect. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_BOUNDARY_LIMIT, "Execute waypoint v3 failed due to boundary limit. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RC_PITCH_ROLL_BREAK, "Execute waypoint v3 failed due to rc pitch roll break. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_AIRPORT_HEIGHT_LIMIT, "Execute waypoint v3 failed due to airport height limit. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_REQUEST_TAKEOFF_FAIL, "Failed to request take off. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_AUTOTAKEOFF_RUN_FAIL, "Failed to run auto take off. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_REQUEST_WAYLINE_FAIL, "Failed to request wayline. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_AGRO_PLAN_FAIL, "Failed to agro plan. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_REQUEST_QUICK_TAKEOFF_ASSIST_FAIL, "Failed to request quick take off assist. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_QUICK_TAKEOFF_ASSIST_RUN_FAIL, "Failed to run quick takeoff assist. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_VFENCE_LIMIT, "Execute waypoint v3 failed due to vfence limit. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_GPS_INVALID, "Execute waypoint v3 failed due to gps invalid. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_START_AT_CURRENT_RC_MODE, "Failed to start at current rc mode. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_HOME_POINT_NOT_RECORDED, "Execute waypoint v3 failed due to homepoint not recorded. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_LOWER_BATTERY, "Execute waypoint v3 failed due to lower battery. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RETURN_HOME, "Execute waypoint v3 failed due to return home. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ADSB_ERROR, "Execute waypoint v3 failed due to adsb error. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RC_LOST, "Execute waypoint v3 failed due to rc lost. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RTK_NOT_READY, "Execute waypoint v3 failed due to rtk not ready. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_DRONE_IS_MOVING, "Execute waypoint v3 failed due to drone is moving. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_DRONE_ON_GROUND_MOTOR_ON, "Execute waypoint v3 failed due to drone on ground motor on. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_SURFACE_FOLLOW_CAMERA_INVALID, "Execute waypoint v3 failed due to surface follow camera invalid. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_SURFACE_FOLLOW_HEIGHT_INVALID, "Execute waypoint v3 failed due to surface follow height invalid.", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_SURFACE_FOLLOW_MAP_WRONG, "Execute waypoint v3 failed due to surface follow map wrong. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_HOMEPOINT_NOT_MATCH_RTK, "Execute waypoint v3 failed due to homepoint not match rtk. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_STRONG_WIND_GOHOME, "Execute waypoint v3 failed due to strong wind gohome. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_DRONE_CRITICAL_ERROR, "Execute waypoint v3 failed due to drone critical error. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_FIND_PAYLOAD, "Execute waypoint v3 failed due to cannot find payload. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_EXECUTION_FAILED, "Execute waypoint v3 failed due to action execution failed. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_FARM_NO_PESTICIDE, "Execute waypoint v3 failed due to farm no pesticide. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RADAR_DISCONNECT, "Execute waypoint v3 failed due to radar disconnect. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_USER_EXIT, "Execute waypoint v3 failed due to user exit. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_USER_BREAK, "Execute waypoint v3 failed due to user break. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_USER_SET_GOHOME, "Execute waypoint v3 failed due to user set gohome. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_USER_AGRO_PLANNER_STATE_CHANGE, "Execute waypoint v3 failed due to user agro panner state change. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_USER_SWITCH_RC_MODE, "Execute waypoint v3 failed due to user switch rc mode. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INIT_FAIL, "Execute waypoint v3 failed due to traj init failed. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_JOB_EXIT_BUT_MIS_RUNNING, "Execute waypoint v3 failed due to traj job exit but mis running. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_ON_GROUND_MOTOR_ON_CANNOT_GO, "Execute waypoint v3 failed due to traj on ground motor is turn on. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_START_INDEX_OR_PROG, "Execute waypoint v3 failed due to traj invalid start index. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_CSYS_MODE, "Execute waypoint v3 failed due to traj invalid csys mode. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_HEIGHT_MODE, "Execute waypoint v3 failed due to traj invalid height mode. ", NULL},\ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_FLY_WP_MODE, "Execute waypoint v3 failed due to traj invalid fly wp mode. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_YAW_MODE, "Execute waypoint v3 failed due to traj invalid yaw mode. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_TURN_DIR_MODE, "Execute waypoint v3 failed due to traj invalid turn dir mode. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_WP_TYPE, "Execute waypoint v3 failed due to traj invalid wp type. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_FIR_LAS_WP_TYPE_ERROR, "Execute waypoint v3 failed due to fir las wp type error. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_GLOB_VEL_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj wp global vel out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_NUM_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj wp num out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_LAT_LONG_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj lat or lon out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_DAMP_DIS_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj damp dis out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_MAX_VEL_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj max vel out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_VEL_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj vel out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_YAW_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj wp yaw out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_YAW_MODE_IN_VERT_SEGM, "Execute waypoint v3 failed due to traj invalid yaw mode in vert segm. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_BREAK_INFO_MISSION_ID_CHANGED, "Execute waypoint v3 failed due to traj wp break info mission id changed. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_BREAK_INFO_PROGRESS_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj wp break info progress out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_BREAK_INFO_INVALID_MISSION_STATE, "Execute waypoint v3 failed due to traj wp break info invalid mission state. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_BREAK_INFO_WP_INDEX_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj wp break info wp index out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_BREAK_LAT_LONG_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj break lat or lon out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_BREAK_INFO_WP_YAW_OUT_OF_RANGE, "Execute waypoint v3 failed due to traj break info wp yaw out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_BREAK_INFO_FLAG , "Execute waypoint v3 failed due to traj invalid break info flag. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_GET_TRAJ_INFO_FAILED, "Execute waypoint v3 failed due to traj get info failed. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_GENERATE_FAIL, "Execute waypoint v3 failed due to traj generate failed. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_LIB_RUN_FAIL, "Execute waypoint v3 failed due to traj lib run failed. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_LIB_EMERGENCY_BRAKE, "Execute waypoint v3 failed due to traj lib emergency brake. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_NOT_FOUND, "Execute waypoint v3 failed due to action not found. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_INDEX_REPEATED, "Execute waypoint v3 failed due to action index repeated. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_INFO_SIZE_TOO_LONG_OR_TOO_SHORT, "Execute waypoint v3 failed due to size too long or too short. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_EMPTY, "Execute waypoint v3 failed due to action tree empty. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_LAYER_EMPTY, "Execute waypoint v3 failed due to action tree layer empty. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_ID_REPEATED, "Execute waypoint v3 failed due to action repeated. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_NODE_CHILDREN_NUM_LT_2, "Execute waypoint v3 failed due to action mode children num less than 2. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_INDEX_OUT_OF_RANGE, "Execute waypoint v3 failed due to action index out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_ID_IS_65535, "Execute waypoint v3 failed due to action id is 65535. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_NODE_CHILDNUM_SUM_NOT_EQ_NEXT_LAYER_SIZE, "Execute waypoint v3 failed due to action node child sum not equal next layer size. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_LAYER_NUM_TOO_MORE, "Execute waypoint v3 failed due to action tree layer num too more. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_LAYER_NUM_TOO_LESS, "Execute waypoint v3 failed due to action tree layer num too less. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_GROUP_NUM_OUT_OF_RANGE, "Execute waypoint v3 failed due to action group num out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_GROUP_VALID_RANGE_ERROR, "Execute waypoint v3 failed due to action group valid range error. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_ROOT_STATUS_INVALID, "Execute waypoint v3 failed due to action tree root status invalid. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_NODE_STATUS_INVALID, "Execute waypoint v3 failed due to action tree mode status invalid. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_BREAK_INFO_ACTION_GROUP_ID_OUT_OF_RANGE, "Execute waypoint v3 failed due to break info action group id out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_STATUS_TREE_SIZE_ERROR, "Execute waypoint v3 failed due to action status tree size error. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_BREAK_INFO_TRIGGER_RUN_RESULT_INVALID, "Execute waypoint v3 failed due to break info trigger run result invalid. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_BREAK_INFO_ACTION_GROUP_ID_REPEATED, "Execute waypoint v3 failed due to break info action group id repeated. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_BREAK_INFO_ACTION_LOCATION_REPEATED, "Execute waypoint v3 failed due to break info action location repeated. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_BREAK_INFO_ACTION_LOCATION_OUT_OF_RANGE, "Execute waypoint v3 failed due to break info action location out of range. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_RESUME_ID_NOT_IN_BREAK_INFO, "Execute waypoint v3 failed due to resume id not in break info. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_RESUME_INFO_MODIFY_ACTION_STATUS_FROM_NO_INTERRUPT_TO_INTERRUPT, "Execute waypoint v3 failed due to modify action status from no interrupt to interrupt. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_RESUME_FAIL_FOR_INVALID_RESUME_INFO, "Execute waypoint v3 failed due to action resume failed for invalid resume info. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTUATOR_COMMON_ACTUATOR_NOT_FOUND, "Execute waypoint v3 failed due to actuator not found. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRIGGER_NOT_FOUND, "Execute waypoint v3 failed due to trigger not found. ", NULL}, \ +{DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRIGGER_SINGLE_TIME_CHECK_FAIL, "Execute waypoint v3 failed due to single time check failed. ", NULL}, \ + +#define DJI_RETURN_CODE_OK DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS /*!< Payload SDK return code represents as status is ok. */ +#define DJI_RETURN_CODE_ERR_ALLOC DJI_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED /*!< Payload SDK return code represents as status alloc error. */ +#define DJI_RETURN_CODE_ERR_TIMEOUT DJI_ERROR_SYSTEM_MODULE_CODE_TIMEOUT /*!< Payload SDK return code represents as status timeout error. */ +#define DJI_RETURN_CODE_ERR_NOT_FOUND DJI_ERROR_SYSTEM_MODULE_CODE_NOT_FOUND /*!< Payload SDK return code represents as status not found error. */ +#define DJI_RETURN_CODE_ERR_OUT_OF_RANGE DJI_ERROR_SYSTEM_MODULE_CODE_OUT_OF_RANGE /*!< Payload SDK return code represents as status out of range error. */ +#define DJI_RETURN_CODE_ERR_PARAM DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER /*!< Payload SDK return code represents as status parameter error. */ +#define DJI_RETURN_CODE_ERR_SYSTEM DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR /*!< Payload SDK return code represents as status system error. */ +#define DJI_RETURN_CODE_ERR_BUSY DJI_ERROR_SYSTEM_MODULE_CODE_BUSY /*!< Payload SDK return code represents as status busy error. */ +#define DJI_RETURN_CODE_ERR_UNSUPPORT DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT /*!< Payload SDK return code represents as status nonsupport error. */ +#define DJI_RETURN_CODE_ERR_UNKNOWN DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN /*!< Payload SDK return code represents as status unknown error. */ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief DJI module enum for defining error code. + */ +typedef enum { + DJI_ERROR_MODULE_SYSTEM = 0, + DJI_ERROR_MODULE_PLATFORM, + DJI_ERROR_MODULE_LOGGER, + DJI_ERROR_MODULE_TIME_SYNC, + DJI_ERROR_MODULE_COMMAND, + DJI_ERROR_MODULE_CAMERA, + DJI_ERROR_MODULE_GIMBAL, + DJI_ERROR_MODULE_XPORT, + DJI_ERROR_MODULE_PAYLOAD_COLLABORATION, + DJI_ERROR_MODULE_WIDGET, + DJI_ERROR_MODULE_CORE, + DJI_ERROR_MODULE_IDENTITY, + DJI_ERROR_MODULE_TRANSMISSION, + DJI_ERROR_MODULE_DATA_CHANNEL, + DJI_ERROR_MODULE_SUBSCRIPTION, + DJI_ERROR_MODULE_MOP_CHANNEL, + DJI_ERROR_MODULE_POSITIONING, + DJI_ERROR_MODULE_POWER_MANAGEMENT, + DJI_ERROR_MODULE_AIRCRAFTINFO, + DJI_ERROR_MODULE_PRODUCTINFO, + DJI_ERROR_MODULE_FLOWCONTROLLER, + DJI_ERROR_MODULE_DOWNLOADER, + DJI_ERROR_MODULE_PARAMETER, + DJI_ERROR_MODULE_UTIL, + DJI_ERROR_MODULE_USER, + DJI_ERROR_MODULE_NEGOTIATE, + DJI_ERROR_MODULE_UPGRADE, + DJI_ERROR_MODULE_FC_BASIC, + DJI_ERROR_MODULE_FC_JOYSTICK, + DJI_ERROR_MODULE_FC_ACTION, + DJI_ERROR_MODULE_FC_ARREST_FLYING, + DJI_ERROR_MODULE_FC_HOME_LOCATION, + DJI_ERROR_MODULE_FC_EMERGENCY_STOP_MOTOR, + DJI_ERROR_MODULE_CAMERA_MANAGER, + DJI_ERROR_MODULE_GIMBAL_MANAGER, + DJI_ERROR_MODULE_WAYPOINT_V2, + DJI_ERROR_MODULE_WAYPOINT_V3, + DJI_ERROR_MODULE_ERROR, +} E_DjiErrorModule; + +/** + * @brief Raw error code of system module. + */ +typedef enum { + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_SUCCESS = 0x000, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_INVALID_REQUEST_PARAMETER = 0x0D4, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_EXECUTING_HIGHER_PRIORITY_TASK = 0x0D7, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_NONSUPPORT = 0x0E0, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_TIMEOUT = 0x0E1, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_MEMORY_ALLOC_FAILED = 0x0E2, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_INVALID_PARAMETER = 0x0E3, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_NONSUPPORT_IN_CURRENT_STATE = 0x0E4, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_SYSTEM_ERROR = 0x0EC, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_MODULE_INACTIVATED = 0xEE, /*!< Module is too not activated yet */ + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_HARDWARE_ERR = 0x0FA, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_INSUFFICIENT_ELECTRICITY = 0x0FB, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_UNKNOWN = 0x0FF, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_NOT_FOUND = 0x100, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_OUT_OF_RANGE = 0x101, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_BUSY = 0x102, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_DUPLICATE = 0x103, + DJI_ERROR_SYSTEM_MODULE_RAW_CODE_ADAPTER_NOT_MATCH = 0x104, +} E_DjiErrorSystemModuleRawCode; + +/** + * @brief Raw error code of activation of identity module. + */ +typedef enum { + DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_PARAMETER_ERROR = 0x0001, + DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_ENCODE_ERROR = 0x0002, + DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_NEW_DEVICE_ERROR = 0x0003, + DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_SOFTWARE_NOT_CONNECTED = 0x0004, + DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_NETWORK_ERROR = 0x0005, + DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_SERVER_ACCESS_REFUSED = 0x0006, + DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_ACCESS_LEVEL_ERROR = 0x0007, + DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_OSDK_VERSION_ERROR = 0x0008, +} E_DjiErrorIdentityModuleActivationRawCode; + +/** + * @brief Raw error code of gimbal module. + */ +typedef enum { + DJI_ERROR_GIMBAL_MODULE_RAW_CODE_PITCH_REACH_POSITIVE_LIMIT = 0x000, + DJI_ERROR_GIMBAL_MODULE_RAW_CODE_PITCH_REACH_NEGATIVE_LIMIT = 0x001, + DJI_ERROR_GIMBAL_MODULE_RAW_CODE_ROLL_REACH_POSITIVE_LIMIT = 0x002, + DJI_ERROR_GIMBAL_MODULE_RAW_CODE_ROLL_REACH_NEGATIVE_LIMIT = 0x003, + DJI_ERROR_GIMBAL_MODULE_RAW_CODE_YAW_REACH_POSITIVE_LIMIT = 0x004, + DJI_ERROR_GIMBAL_MODULE_RAW_CODE_YAW_REACH_NEGATIVE_LIMIT = 0x005, + DJI_ERROR_GIMBAL_MODULE_RAW_CODE_NON_CONTROL_AUTHORITY = 0x006, +} E_DjiErrorGimbalModuleRawCode; + +/** + * @brief Raw error code of payload collaboration module. + */ +typedef enum { + DJI_ERROR_PAYLOAD_COLLABORATION_MODULE_RAW_CODE_POSITION_NOT_MATCH = 0x000, +} E_DjiErrorPayloadCollaborationModuleRawCode; + +/** + * @brief Raw error code of subscription module. + */ +typedef enum { + DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_INVALID_TOPIC_FREQ = 0x000, + DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_DUPLICATE = 0x001, + DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_NOT_SUBSCRIBED = 0x002, + DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TIMESTAMP_NOT_ENABLE = 0x003, + DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_NOT_SUPPORTED = 0x004, +} E_DjiErrorSubscriptionModuleRawCode; + +/** + * @brief Raw error code of mop channel module. + */ +typedef enum { + DJI_ERROR_MOP_CHANNEL_MODULE_RAW_CODE_CONNECTION_CLOSE = 0x00B, +} E_DjiErrorMopChannelModuleRawCode; + +/** + * @brief Raw error code of flight controller module. + */ +typedef enum { + DJI_ERROR_FC_MODULE_RAW_CODE_RC_MODE_ERROR = 0x0000, + DJI_ERROR_FC_MODULE_RAW_CODE_RELEASE_CONTROL_SUCCESS = 0x0001, + DJI_ERROR_FC_MODULE_RAW_CODE_OBTAIN_CONTROL_SUCCESS = 0x0002, + DJI_ERROR_FC_MODULE_RAW_CODE_OBTAIN_CONTROL_IN_PROGRESS = 0x0003, + DJI_ERROR_FC_MODULE_RAW_CODE_RELEASE_CONTROL_IN_PROGRESS = 0x0004, + DJI_ERROR_FC_MODULE_RAW_CODE_RC_NEED_MODE_P = 0x0005, + DJI_ERROR_FC_MODULE_RAW_CODE_RC_NEED_MODE_F = 0x0006, + DJI_ERROR_FC_MODULE_RAW_CODE_PARAM_READ_WRITE_INVALID_PARAM = 0x0007, + DJI_ERROR_FC_MODULE_RAW_CODE_IOC_OBTAIN_CONTROL_ERROR = 0x00C9, + DJI_ERROR_FC_MODULE_RAW_CODE_KEY_ERROR = 0xFF00, + DJI_ERROR_FC_MODULE_RAW_CODE_NO_AUTHORIZATION_ERROR = 0xFF01, + DJI_ERROR_FC_MODULE_RAW_CODE_NO_RIGHTS_ERROR = 0xFF02, + DJI_ERROR_FC_MODULE_RAW_CODE_SYSTEM_ERROR = 0xFF03, +} E_DjiErrorFCModuleRawCode; + +/** + * @brief Raw error code of flight controller joystick module. + */ +typedef enum { + DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_SUCCESS = 0x00, + DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_DEVICE_NOT_ALLOW = 0x01, + DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_ENGINE_STARTING = 0x02, + DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_TAKING_OFF = 0x03, + DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_LANDING = 0x04, + DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_CMD_INVALID = 0x05, + DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_RC_NOT_P_MODE = 0x06, + DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_CMD_LENGTH_ERROR = 0x07, + DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_HAS_NO_JOYSTICK_AUTHORITY = 0x08, + DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_IN_RC_LOST_ACTION = 0x09, +} E_DjiErrorFCJoystickModuleRawCode; + +/** + * @brief Raw error code of flight controller action module. + */ +typedef enum { + DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_MOTOR_ON = 0x01, + DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_MOTOR_OFF = 0x02, + DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_IN_AIR = 0x03, + DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_NOT_IN_AIR = 0x04, + DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_HOME_POINT_NOT_SET = 0x05, + DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_BAD_GPS = 0x06, + DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_IN_SIMULATION = 0x07, + DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_CANNOT_START_MOTOR = 0x11, + DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_LOW_VOLTAGE = 0x12, + DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_SPEED_TOO_LARGE = 0x14, +} E_DjiErrorFCActionModuleRawCode; + +/** + * @brief Raw error code of flight controller arrest flying module. + */ +typedef enum { + DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_REGISTER_LOGOUT_SET_SUCCESS = 0x00, + DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_REGISTER_LOGOUT_NULL_POINTER = 0x01, + DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_HMS_CODE_HAS_REGISTED = 0x02, + DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_HMS_CODE_NOT_FIND = 0x03, + DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_ADD_ITEM_NO_DECRIPTION = 0x04, + DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_REGISTER_ID_INVALID = 0x05, + DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_STOP_IN_AIR_HMSCODE_NOT_IN_WHITE_TABLE = 0x06, + DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_INVALID_FORMAT_HMSCODE = 0x07, + DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_HMSCODE_NOT_IN_WHITE_TABLE = 0x08, +} E_DjiErrorFCArrestFlyingModuleRawCode; + +/** + * @brief Raw error code of flight controller home location module. + */ +typedef enum { + DJI_ERROR_FC_HOME_LOCATION_MODULE_RAW_CODE_UNKNOWN_FAILED_REASON = 0x01, + DJI_ERROR_FC_HOME_LOCATION_MODULE_RAW_CODE_INVALID_GPS_COORDINATE = 0x02, + DJI_ERROR_FC_HOME_LOCATION_MODULE_RAW_CODE_NOT_BE_RECORD = 0x03, + DJI_ERROR_FC_HOME_LOCATION_MODULE_RAW_CODE_GPS_NOT_READY = 0x04, + DJI_ERROR_FC_HOME_LOCATION_MODULE_RAW_CODE_DIS_TOO_FAR = 0x05, +} E_DjiErrorFCHomeLocationModuleRawCode; + +/** + * @brief Raw error code of flight controller emergency stop motor module. + */ +typedef enum { + DJI_ERROR_FC_EMERGENCY_STOP_MOTOR_MODULE_RAW_CODE_VERSION_NOT_MATCH = 0x01, + DJI_ERROR_FC_EMERGENCY_STOP_MOTOR_MODULE_RAW_CODE_CMD_INVALID = 0x02, +} E_DjiErrorFCKillSwitchModuleRawCode; + +/** + * @brief Raw error code of camera manager + */ +typedef enum { + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_UNSUPPORTED_COMMAND = 0xE0, /*!< Do not support this command */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_TIMEOUT = 0xE1, /*!< Execution timeout */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_RAM_ALLOCATION_FAILED = 0xE2, /*!< Memory alloc failed */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_INVALID_COMMAND_PARAMETER = 0xE3, /*!< Invalid parameter for the command */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_UNSUPPORTED_COMMAND_IN_CUR_STATE = 0xE4, /*!< Do not support this command in the current state */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_CAMERA_TIME_NOT_SYNCHRONIZED = 0xE5, /*!< Timestamp of camera is not synchronized */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_PARAMETER_SET_FAILED = 0xE6, /*!< Setting parameter failed */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_PARAMETER_GET_FAILED = 0xE7, /*!< Getting parameter failed */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_SD_CARD_MISSING = 0xE8, /*!< SD card is not installed */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_SD_CARD_FULL = 0xE9, /*!< SD card is full */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_SD_CARD_ERROR = 0xEA, /*!< Error accessing the SD Card */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_SENSOR_ERROR = 0xEB, /*!< Sensor go wrong */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_SYSTEM_ERROR = 0xEC, /*!< System error */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_PARAMETER_TOTAL_TOO_LONG = 0xED, /*!< Length of the parameter is too long */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_FIRMWARE_DATA_NUM_DISCONTINUOUS = 0xF0, /*!< Fireware data number is a discontinuous number */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_FIRMWARE_VERIFICATION_ERROR = 0xF2, /*!< Error verifying fireware */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_FLASH_WRITE_ERROR = 0xF4, /*!< Error writing flash */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_FIRMWARE_TYPE_MISMATCH = 0xF6, /*!< Firmware type don't match */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_REMOTE_CONTROL_UNCONNECTED = 0xF8, /*!< Not connect remote control yet */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_HARDWARE_ERROR = 0xFA, /*!< Hardware fault */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_AIRCRAFT_UNCONNECTED = 0xFC, /*!< Aircraft is not connected yet */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_CANNOT_UPGRADE_IN_CUR_STATE = 0xFE, /*!< Cannot upgrade in current status (Please reboot or contact with DJI support */ + DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_UNDEFINE_ERROR = 0xFF, /*!< Undefined error */ +} E_DjiErrorCameraManagerModuleRawCode; + +/** + * @brief Raw error code of gimbal manager + */ +typedef enum { + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_UNSUPPORTED_COMMAND = 0xE0, /*!< Do not support this command */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_TIMEOUT = 0xE1, /*!< Execution timeout */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_RAM_ALLOCATION_FAILED = 0xE2, /*!< Memory alloc failed */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_INVALID_COMMAND_PARAMETER = 0xE3, /*!< Invalid parameter for the command */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_UNSUPPORTED_COMMAND_IN_CUR_STATE = 0xE4, /*!< Do not support this command in the current state */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_CAMERA_TIME_NOT_SYNCHRONIZED = 0xE5, /*!< Timestamp of camera is not synchronized */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_PARAMETER_SET_FAILED = 0xE6, /*!< Setting parameter failed */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_PARAMETER_GET_FAILED = 0xE7, /*!< Getting parameter failed */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_SD_CARD_MISSING = 0xE8, /*!< SD card is not installed */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_SD_CARD_FULL = 0xE9, /*!< SD card is full */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_SD_CARD_ERROR = 0xEA, /*!< Error accessing the SD Card */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_SENSOR_ERROR = 0xEB, /*!< Sensor go wrong */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_SYSTEM_ERROR = 0xEC, /*!< System error */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_PARAMETER_TOTAL_TOO_LONG = 0xED, /*!< Length of the parameter is too long */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_FIRMWARE_DATA_NUM_DISCONTINUOUS = 0xF0, /*!< Fireware data number is a discontinuous number */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_FIRMWARE_VERIFICATION_ERROR = 0xF2, /*!< Error verifying fireware */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_FLASH_WRITE_ERROR = 0xF4, /*!< Error writing flash */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_FIRMWARE_TYPE_MISMATCH = 0xF6, /*!< Firmware type don't match */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_REMOTE_CONTROL_UNCONNECTED = 0xF8, /*!< Not connect remote control yet */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_HARDWARE_ERROR = 0xFA, /*!< Hardware fault */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_AIRCRAFT_UNCONNECTED = 0xFC, /*!< Aircraft is not connected yet */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_CANNOT_UPGRADE_IN_CUR_STATE = 0xFE, /*!< Cannot upgrade in current status (Please reboot or contact with DJI support */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_UNDEFINE_ERROR = 0xFF, /*!< Undefined error */ +} E_DjiErrorGimbalManagerModuleRawCode; + +/** + * @brief Waypoint v2 total error raw code. + */ +typedef enum { + /* Waypoint v2 common error raw code */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_COMMON_SUCCESS = 0x00000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_COMMON_INVALID_DATA_LENGTH = 0x00001, /*!< the length of the data is illegal based on the protocol */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_COMMON_INVALD_FLOAT_NUM = 0x00002, /*!< invalid float number (NAN or INF) */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WP_VERSION_NO_MATCH = 0x00003, /*!< waypoint mission version can't match with firmware*/ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_COMMON_UNKNOWN = 0x0ffff, /*!< Fatal error! Unexpected result! */ + + /* The enum that defines the detail error code of flight-trajectory module */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_RESV = 0x10000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_WP_NUM_TOO_MANY = 0x10001, /*!< min_initial_waypoint_num is large than permitted_max_waypoint_num */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_WP_NUM_TOO_FEW = 0x10002, /*!< min_initial_waypoint_num is less than permitted_min_waypoint_num */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_END_INDEX = 0x10003, /*!< waypoint_end_index is equal or large than total_waypoint_num */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_START_ID_GT_END_ID = 0x10004, /*!< the start index is greater than end index of upload wps */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_END_ID_GT_TOTAL_NUM = 0x10005, /*!< the end index of uplod wps is greater than inited total numbers */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_DOWNLOAD_WPS_NOT_IN_STORED_RAGNE = 0x10006, /*!< the index of first and end waypoint expected to download is not in range of stored in FC */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_CUR_POS_IS_FAR_AWAY_FROM_FIRST_WP = 0x10008, /*!< current position is far away from the first waypoint. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_ADJ_WPS_TOO_CLOSE = 0x1000a, /*!< it is too close from two adjacent waypoints, the value of which might be distinguish from products */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_ADJ_WPS_TOO_FAR = 0x1000b, /*!< the distance betwween two adjacent waypoints is not in[0.5m, 5000m] the value of which might be distinguish from products */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_MAX_VEL_GT_GLOBAL = 0x1000c, /*!< the max vel of uplod wp is greater than global max vel */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_LOCAL_CRUISE_VEL_GT_LOCAL_MAX = 0x1000d, /*!< the local cruise vel of upload wp is greater than local max vel */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_LOCAL_CRUISE_VEL_GT_GLOBAL_MAX = 0x1000e, /*!< the local cruise vel of upload wp is greater than global max vel */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_GLOBAL_MAX_VEL = 0x1000f, /*!< global_max_vel is greater than permitted_max_vel or less than permitted_min_vel */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GLOBAL_CRUISE_VEL_GT_MAX_VEL = 0x10010, /*!< global_cruise_vel is greater than global_max_vel */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_GOTO_FIRST_FLAG = 0x10011, /*!< goto_first_point_mode is out of range of waypoint_goto_first_flag_t_enum */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_FINISHED_ACTION = 0x10012, /*!< finished_action is out of range of wp_plan_finish_action_t_enum */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_RC_LOST_ACTION = 0x10013, /*!< rc_lost_action is out of range of wp_plan_rc_lost_action_t_enum */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_YAW_MODE_INVALID = 0x10014, /*!< the yaw mode of upload wp is invalid. reference to waypoint2_yaw_mode_t defined in math_waypoint_planner.h */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_YAW_CMD_NOT_IN_RANGE = 0x10015, /*!< the yaw command of upload wp is not in range. the range for MR:[-180 180],unit:degree */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_YAW_TURN_DIRECTION_INVALID = 0x10016, /*!< the yaw turn direction of upload wp is invalid. it should be 0:clockwise or 1:anti-clockwise */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_WP_TYPE_INVALID = 0x10017, /*!< the wp type of upload wp is invalid. reference to waypoint_type_t defined in math_waypoint_planner.h */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GO_STOP_CMD_INVALID = 0x10018, /*!< go/stop command is invalid. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INVALID_PAUSE_RECOVERY_CMD = 0x10019, /*!< the command of pause/recovery is not equal to any of the command enum */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INVALID_BREAK_RESTORE_CMD = 0x1001a, /*!< the command of break/restore is not equal to any of the command enum */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_REF_POINT = 0x1001b, /*!< initial reference point position coordinate exceed set range */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_DAMPING_DIS_GE_DIS_OF_ADJ_POINTS = 0x1001c, /*!< the damping dis is greater than or equal the distance of adjacent point */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_CANNT_SET_WP_LINE_EXIT_TYPE = 0x1001d, /*!< cann't set wp_line_exit type to wp */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INFO_NOT_UPLOADED = 0x1001e, /*!< the init info of Ground Station is not uploaded yet */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WP_HAS_NOT_UPLOADED = 0x1001f, /*!< the wp has not uploaded yet */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOADED_WP_NOT_ENOUGH = 0x10020, /*!< min_initial_waypoint_num is not uploaded. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GS_HAS_STARTED = 0x10021, /*!< waypoint plan has started when received go command. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GS_NOT_RUNNING = 0x10022, /*!< waypoint plan not running when received stop command. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GS_NOT_RUNNING_FOR_PAUSE_RECOVERY = 0x10023, /*!< ground station(GS) is not started(used by pause/recovery) */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GS_NOT_RUNNING_FOR_BREAK_RESTORE = 0x10024, /*!< ground station(GS) is not started(used by break/restore) */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_NOT_IN_WP_MIS = 0x10025, /*!< not in the waypoint mission(MIS)(cannot pause/recovery or break/restore) */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_MIS_HAS_BEEN_PAUSED = 0x10026, /*!< the current status is paused, cannot command pause again */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_MIS_NOT_PAUSED = 0x10027, /*!< not in paused status, cannot command recovery */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_MIS_HAS_BEEN_BROKEN = 0x10028, /*!< the current status is broken, cannot command break again */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_MIS_NOT_BROKEN = 0x10029, /*!< not in break status, cannot command restore */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_PAUSE_RECOVERY_NOT_SUPPORTED = 0x1002a, /*!< the configuration forbid using pause/recovery API */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_BREAK_RESTORE_NOT_SUPPORTED = 0x1002b, /*!< the configuration forbid using break/restore API */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_NO_BREAK_POINT = 0x1002c, /*!< no break point is recorded for restore */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_NO_CUR_TRAJ_PROJECT = 0x1002d, /*!< no current trajectory project point is recorded for restore */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_NO_NXT_TRAJ_PROJECT = 0x1002e, /*!< no next trajectory project point is recorded for restore */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_NO_NNT_TRAJ_PROJECT = 0x1002f, /*!< no next the next trajectory project point is recorded for restore */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_WP_ID_NOT_CONTINUE = 0x10030, /*!< the index of upload wp is not continue after the store wp */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WP_LINE_ENTER_NOT_SET_TO_START_WP = 0x10031, /*!< the WP_LINE_ENTER wp_type set to a wp which is not the init start waypoint */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_WP_WHEN_PLAN_HAS_STARTED = 0x10032, /*!< the waypoint plan has started when initializing waypoint */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_DAMPING_DIS_EXCEED_RANGE = 0x10033, /*!< waypoint damping distance exceed set range */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WAYPOINT_COOR_EXCEED_RANGE = 0x10034, /*!< waypoint position coordinate exceed rational range */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_FIRST_WP_TYPE_IS_WP_TURN_NO = 0x10035, /*!< first waypoint type error, it can not be WP_TURN_NO */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WP_EXCEED_RADIUS_LIMIT = 0x10038, /*!< waypoint position exceed radius limit */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WP_EXCEED_HEIGHT_LIMIT = 0x10039, /*!< waypoint position exceed height limit */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOADED_WP_EXCEED_HEIGHT_LIMIT = 0x10040, /*!< the uploaded waypoint exceed height limit */ + + /* The enum that defines the detail error code of flight-status module */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_STATUS_RESV = 0x20000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_STATUS_WP_MIS_CHECK_FAIL = 0x20001, /*!< head_node is null or atti_not_healthy or gyro_not_healthy or horiz_vel_not healthy or horiz_abs_pos_not_healthy. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_STATUS_HOME_NOT_RECORDED = 0x20002, /*!< the home point is no recorded yet, which will be executed at the first time of GPS level > 3(MR/FW). */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_STATUS_LOW_LOCATION_ACCURACY = 0x20003, /*!< current location accuracy is low for bad GPS signal. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_STATUS_RTK_CONDITION_IS_NOT_READY = 0x20005, /*!< use rtk_data, but rtk is not connected or rtk_data is invalid */ + + /* The enum that defines the detail error code of flight-secure module */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_SECURE_RESV = 0x30000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_SECURE_CROSS_NFZ = 0x30001, /*!< the trajectory cross the NFZ */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_SECURE_BAT_LOW = 0x30002, /*!< current capacity of smart battery or voltage of non-smart battery is lower than level 1 or level 2 threshold */ + + /* The enum that defines the detail error code of action-common module */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_RESV = 0x400000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_ACTION_ID_DUPLICATED = 0x400001, /*!< the ID of Action is duplicated. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_ACTION_ITEMS_SPACE_NOT_ENOUGH = 0x400002, /*!< there is no enough memory space for new Action Item */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_ACTION_SIZE_GT_BUF_SIZE = 0x400003, /*!< the size of buffer used to get the info of Action is less than the size of Action. Normally users can not get this. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_ACTION_ID_NOT_FOUND = 0x400004, /*!< the ID of Action is not found. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_DOWNLOAD_ACTION_ID_RANGE_ERROR = 0x400005, /*!< the download action start id is bigger than the action end id */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_NO_ACTION_ITEMS_STORED = 0x400006, /*!< can not download or get min-max action ID for no action items stored in action kernel */ + + /* The enum that defines the detail error code of trigger module */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_RESV = 0x410000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_TYPE_INVALID = 0x410001, /*!< the type ID of Trigger is invalid. It might not defined or the information is empty. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_REACH_WP_END_INDEX_LT_START_INDEX = 0x410021, /*!< wp_end_index is less than wp_start_index in reach_waypoint_trigger. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_REACH_WP_INVALID_INTERVAL_WP_NUM = 0x410022, /*!< interval_wp_num is large than the difference of wp_start_index and wp_end_index in reach_waypoint_trigger. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_REACH_WP_INVALID_AUTO_TERMINATE_WP_NUM = 0x410023, /*!< auto_terminate_wp_num is large than interval_wp_num in reach_waypoint_trigger. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_ASSOCIATE_INVALID_TYPE = 0x410041, /*!< the associate_type is greater than the maximum value. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_SIMPLE_INTERVAL_INVALID_TYPE = 0x410081, /*!< the interval type is greater than the maximum value. */ + + /* The enum that defines the detail error code of actuator-common module */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_COMMON_RESV = 0x420000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_COMMON_ACTUATOR_EXEC_NON_SUPPORTED = 0x420001, /*!< the execution of Actuator is not supported, e.g., try to stop camera shooting. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_COMMON_ACTUATOR_TYPE_INVALID = 0x420002, /*!< the type ID of Actuator is invalid. It might not defined or the information is empty. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_COMMON_ACTUATOR_FUNC_INVALID = 0x420003, /*!< the Function ID of Actuator is invalid. It might not defined or the information is empty. */ + + /* The enum that defines the detail error code of action-camera module */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_RESV = 0x430000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_SEND_SINGLE_SHOT_CMD_TO_CAMERA_FAIL = 0x430001, /*!< fail to send shot cmd to camera for no camera or camera is busy. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_SEND_VIDEO_START_CMD_TO_CAMERA_FAIL = 0x430002, /*!< fail to send video start cmd to camera for no camera or camera is busy. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_SEND_VIDEO_STOP_CMD_TO_CAMERA_FAIL = 0x430003, /*!< fail to send video stop cmd to camera for no camera or camera is not busy. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_FOCUS_PARAM_XY_INVALID = 0x430004, /*!< camera focus param xy exceed valid range (0, 1). */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_SEND_FOCUS_CMD_TO_CAMERA_FAIL = 0x430005, /*!< fail to send focus cmd to camera for no camera or camera is busy. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_SEND_FOCALIZE_CMD_TO_CAMERA_FAIL = 0x430006, /*!< fail to send focalize cmd to camera for no camera or camera is busy. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_FOCAL_DISTANCE_INVALID = 0x430007, /*!< focal distance of camera focalize function exceed valid range. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_EXEC_FAIL = 0x430100, /*!< this err code indicate camera fail to exec coressponding cmd, and the low 8 bit + will be replaced by the return code from camera, for example: 0x01E0 means current cmd + is not supported, 0x01E8 means SD card is not inserted and so on, the detailed camera + return code could be found in camera protocal. */ + + /* The enum that defines the detail error code of action-gimbal module */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_RESV = 0x440000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_INVALID_RPY_ANGLE_CTRL_CMD = 0x440001, /*!< gimbal roll/pitch/yaw angle ctrl cmd param invalid, unable to exec. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_INVALID_DURATION_CMD = 0x440002, /*!< gimbal duration param invalid, unable to exec. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_FAIL_TO_ARRIVE_TGT_ANGLE = 0x440003, /*!< gimbal fail to arrive target angle . */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_FAIL_TO_SEND_CMD_TO_GIMBAL = 0x440004, /*!< fail to send cmd to gimbal for gimbal is busy or no gimbal. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_THIS_INDEX_OF_GIMBAL_NOT_DOING_UNIFORM_CTRL = 0x440005, /*!< fail to stop gimbal uniform ctrl because index error.*/ + + /* The enum that defines the detail error code of action-flight module */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_FLIGHT_RESV = 0x460000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_FLIGHT_YAW_INVALID_YAW_ANGLE = 0x460001, /*!< yaw angle is lager max yaw angle. */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_FLIGHT_YAW_TO_TGT_ANGLE_TIMEOUT = 0x460002, /*!< faile to target yaw angle, because of timeout.*/ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_FLIGHT_ACTION_YAW_OCCUPIED = 0x460003, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_FLIGHT_CUR_AND_TGT_VEL_CLE_STATUE_EQUAL = 0x460004, + + /* The enum that defines the detail error code of payload module */ + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_PAYLOAD_RESV = 0x470000, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_PAYLOAD_FAIL_TO_SEND_CMD_TO_PAYLOAD = 0x470001, + DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_PAYLOAD_EXEC_FAILED = 0x470002, +} E_DjiErrorWaypointV2ModuleRawCode; + +typedef enum { + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_SUCCESS = 0x0000, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_MISSION_ID_NOT_EXIST = 1, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_WAYLINE_INFO_ERROR = 2, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_WPMZ_FILE_VERSION_NOT_MATCH = 3, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_WPMZ_FILE_LOAD_ERROR = 4, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_NO_BREAK_INFO = 5, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CMD_INVALID = 6, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_START_WAYLINE_WHEN_WAYLINE_RUNNING = 257, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_BREAK_WAYLINE_IN_CUR_STATE = 258, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_STOP_WAYLINE_WHEN_WAYLINE_NOT_RUNNING = 259, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_BREAK_WAYLINE_WHEN_WAYLINE_NOT_RUNNING = 260, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_REQUEST_DRONE_CONTROL = 261, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_RESUME_WAYLINE_IN_CUR_STATE = 262, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_HEIGHT_LIMIT = 513, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RADIUS_LIMIT = 514, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CROSS_FLYLIMIT_AERA = 515, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_LOW_LIMIT = 516, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_OBSTACAL_STOP = 517, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RTK_DISCONNECT = 518, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_BOUNDARY_LIMIT = 519, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RC_PITCH_ROLL_BREAK = 520, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_AIRPORT_HEIGHT_LIMIT = 521, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_REQUEST_TAKEOFF_FAIL = 522, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_AUTOTAKEOFF_RUN_FAIL = 523, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_REQUEST_WAYLINE_FAIL = 524, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_AGRO_PLAN_FAIL = 525, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_REQUEST_QUICK_TAKEOFF_ASSIST_FAIL = 526, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_QUICK_TAKEOFF_ASSIST_RUN_FAIL = 527, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_VFENCE_LIMIT = 528, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_GPS_INVALID = 769, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_START_AT_CURRENT_RC_MODE = 770, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_HOME_POINT_NOT_RECORDED = 771, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_LOWER_BATTERY = 772, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RETURN_HOME = 773, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ADSB_ERROR = 774, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RC_LOST = 775, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RTK_NOT_READY = 776, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_DRONE_IS_MOVING = 777, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_DRONE_ON_GROUND_MOTOR_ON = 778, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_SURFACE_FOLLOW_CAMERA_INVALID = 779, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_SURFACE_FOLLOW_HEIGHT_INVALID = 780, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_SURFACE_FOLLOW_MAP_WRONG = 781, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_HOMEPOINT_NOT_MATCH_RTK = 782, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_STRONG_WIND_GOHOME = 784, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_DRONE_CRITICAL_ERROR = 1023, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_FIND_PAYLOAD = 1025, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_EXECUTION_FAILED = 1026, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_FARM_NO_PESTICIDE = 1027, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RADAR_DISCONNECT = 1028, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_USER_EXIT = 1281, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_USER_BREAK = 1282, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_USER_SET_GOHOME = 1283, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_USER_AGRO_PLANNER_STATE_CHANGE = 1284, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_USER_SWITCH_RC_MODE = 1285, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INIT_FAIL = 1536, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_JOB_EXIT_BUT_MIS_RUNNING = 1537, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_ON_GROUND_MOTOR_ON_CANNOT_GO = 1538, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_START_INDEX_OR_PROG = 1539, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_CSYS_MODE = 1540, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_HEIGHT_MODE = 1541, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_FLY_WP_MODE = 1542, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_YAW_MODE = 1543, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_TURN_DIR_MODE = 1544, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_WP_TYPE = 1545, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_FIR_LAS_WP_TYPE_ERROR = 1546, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_GLOB_VEL_OUT_OF_RANGE = 1547, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_NUM_OUT_OF_RANGE = 1548, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_LAT_LONG_OUT_OF_RANGE = 1549, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_DAMP_DIS_OUT_OF_RANGE = 1550, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_MAX_VEL_OUT_OF_RANGE = 1551, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_VEL_OUT_OF_RANGE = 1552, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_YAW_OUT_OF_RANGE = 1553, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_YAW_MODE_IN_VERT_SEGM = 1554, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_BREAK_INFO_MISSION_ID_CHANGED = 1555, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_BREAK_INFO_PROGRESS_OUT_OF_RANGE = 1556, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_BREAK_INFO_INVALID_MISSION_STATE = 1557, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_BREAK_INFO_WP_INDEX_OUT_OF_RANGE = 1558, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_BREAK_LAT_LONG_OUT_OF_RANGE = 1559, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_BREAK_INFO_WP_YAW_OUT_OF_RANGE = 1560, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_BREAK_INFO_FLAG = 1561, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_GET_TRAJ_INFO_FAILED = 1562, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_GENERATE_FAIL = 1563, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_LIB_RUN_FAIL = 1564, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_LIB_EMERGENCY_BRAKE = 1565, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_NOT_FOUND = 1588, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_INDEX_REPEATED = 1591, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_INFO_SIZE_TOO_LONG_OR_TOO_SHORT = 1592, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_EMPTY = 1593, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_LAYER_EMPTY = 1594, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_ID_REPEATED = 1595, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_NODE_CHILDREN_NUM_LT_2 = 1596, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_INDEX_OUT_OF_RANGE = 1597, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_ID_IS_65535 = 1598, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_NODE_CHILDNUM_SUM_NOT_EQ_NEXT_LAYER_SIZE = 1599, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_LAYER_NUM_TOO_MORE = 1600, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_LAYER_NUM_TOO_LESS = 1601, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_GROUP_NUM_OUT_OF_RANGE = 1602, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_GROUP_VALID_RANGE_ERROR = 1603, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_ROOT_STATUS_INVALID = 1604, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_NODE_STATUS_INVALID = 1605, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_BREAK_INFO_ACTION_GROUP_ID_OUT_OF_RANGE = 1606, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_STATUS_TREE_SIZE_ERROR = 1607, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_BREAK_INFO_TRIGGER_RUN_RESULT_INVALID = 1608, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_BREAK_INFO_ACTION_GROUP_ID_REPEATED = 1609, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_BREAK_INFO_ACTION_LOCATION_REPEATED = 1610, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_BREAK_INFO_ACTION_LOCATION_OUT_OF_RANGE = 1611, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_RESUME_ID_NOT_IN_BREAK_INFO = 1612, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_RESUME_INFO_MODIFY_ACTION_STATUS_FROM_NO_INTERRUPT_TO_INTERRUPT = 1613, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_RESUME_FAIL_FOR_INVALID_RESUME_INFO = 1614, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTUATOR_COMMON_ACTUATOR_NOT_FOUND = 1634, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRIGGER_NOT_FOUND = 1649, + DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRIGGER_SINGLE_TIME_CHECK_FAIL = 1650, +} E_DjiErrorWaypoint3ModuleRawCode; + +//@formatter:off +/** + * @brief DJI error code complete works. Users can search all error messages here. + * @details Please get error description, error reason and error recovery suggestion of every error code from + * ::DJI_ERROR_OBJECTS macro. + */ +enum DjiErrorCode { + /* system module error code, including some common error code */ + DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_SUCCESS), + DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_REQUEST_PARAMETER = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_INVALID_REQUEST_PARAMETER), + DJI_ERROR_SYSTEM_MODULE_CODE_EXECUTING_HIGHER_PRIORITY_TASK = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_EXECUTING_HIGHER_PRIORITY_TASK), + DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_NONSUPPORT), + DJI_ERROR_SYSTEM_MODULE_CODE_TIMEOUT = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_TIMEOUT), + DJI_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_MEMORY_ALLOC_FAILED), + DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_INVALID_PARAMETER), + DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT_IN_CURRENT_STATE = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_NONSUPPORT_IN_CURRENT_STATE), + DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_SYSTEM_ERROR), + DJI_ERROR_SYSTEM_MODULE_CODE_HARDWARE_ERR = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_HARDWARE_ERR), + DJI_ERROR_SYSTEM_MODULE_CODE_INSUFFICIENT_ELECTRICITY = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_INSUFFICIENT_ELECTRICITY), + DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_UNKNOWN), + DJI_ERROR_SYSTEM_MODULE_CODE_NOT_FOUND = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_NOT_FOUND), + DJI_ERROR_SYSTEM_MODULE_CODE_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_OUT_OF_RANGE), + DJI_ERROR_SYSTEM_MODULE_CODE_BUSY = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_BUSY), + DJI_ERROR_SYSTEM_MODULE_CODE_DUPLICATE = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_DUPLICATE), + DJI_ERROR_SYSTEM_MODULE_CODE_ADAPTER_NOT_MATCH = DJI_ERROR_CODE(DJI_ERROR_MODULE_SYSTEM, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_ADAPTER_NOT_MATCH), + + /* gimbal module error code */ + DJI_ERROR_GIMBAL_MODULE_CODE_PITCH_REACH_POSITIVE_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL, DJI_ERROR_GIMBAL_MODULE_RAW_CODE_PITCH_REACH_POSITIVE_LIMIT), + DJI_ERROR_GIMBAL_MODULE_CODE_PITCH_REACH_NEGATIVE_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL, DJI_ERROR_GIMBAL_MODULE_RAW_CODE_PITCH_REACH_NEGATIVE_LIMIT), + DJI_ERROR_GIMBAL_MODULE_CODE_ROLL_REACH_POSITIVE_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL, DJI_ERROR_GIMBAL_MODULE_RAW_CODE_ROLL_REACH_POSITIVE_LIMIT), + DJI_ERROR_GIMBAL_MODULE_CODE_ROLL_REACH_NEGATIVE_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL, DJI_ERROR_GIMBAL_MODULE_RAW_CODE_ROLL_REACH_NEGATIVE_LIMIT), + DJI_ERROR_GIMBAL_MODULE_CODE_YAW_REACH_POSITIVE_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL, DJI_ERROR_GIMBAL_MODULE_RAW_CODE_YAW_REACH_POSITIVE_LIMIT), + DJI_ERROR_GIMBAL_MODULE_CODE_YAW_REACH_NEGATIVE_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL, DJI_ERROR_GIMBAL_MODULE_RAW_CODE_YAW_REACH_NEGATIVE_LIMIT), + DJI_ERROR_GIMBAL_MODULE_CODE_NON_CONTROL_AUTHORITY = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL, DJI_ERROR_GIMBAL_MODULE_RAW_CODE_NON_CONTROL_AUTHORITY), + + /* payload collaboration module error code */ + DJI_ERROR_PAYLOAD_COLLABORATION_MODULE_CODE_POSITION_NOT_MATCH = DJI_ERROR_CODE(DJI_ERROR_MODULE_PAYLOAD_COLLABORATION, DJI_ERROR_PAYLOAD_COLLABORATION_MODULE_RAW_CODE_POSITION_NOT_MATCH), + + /* activation error code of identity module */ + DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_PARAMETER_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_IDENTITY, DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_PARAMETER_ERROR), + DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_ENCODE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_IDENTITY, DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_ENCODE_ERROR), + DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_NEW_DEVICE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_IDENTITY, DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_NEW_DEVICE_ERROR), + DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_SOFTWARE_NOT_CONNECTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_IDENTITY, DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_SOFTWARE_NOT_CONNECTED), + DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_NETWORK_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_IDENTITY, DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_NETWORK_ERROR), + DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_SERVER_ACCESS_REFUSED = DJI_ERROR_CODE(DJI_ERROR_MODULE_IDENTITY, DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_SERVER_ACCESS_REFUSED), + DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_ACCESS_LEVEL_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_IDENTITY, DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_ACCESS_LEVEL_ERROR), + DJI_ERROR_IDENTITY_MODULE_CODE_ACTIVATE_OSDK_VERSION_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_IDENTITY, DJI_ERROR_IDENTITY_MODULE_RAW_CODE_ACTIVATE_OSDK_VERSION_ERROR), + + /* subscription module error code */ + DJI_ERROR_SUBSCRIPTION_MODULE_CODE_INVALID_TOPIC_FREQ = DJI_ERROR_CODE(DJI_ERROR_MODULE_SUBSCRIPTION, DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_INVALID_TOPIC_FREQ), + DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_DUPLICATE = DJI_ERROR_CODE(DJI_ERROR_MODULE_SUBSCRIPTION, DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_DUPLICATE), + DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_NOT_SUBSCRIBED = DJI_ERROR_CODE(DJI_ERROR_MODULE_SUBSCRIPTION, DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_NOT_SUBSCRIBED), + DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TIMESTAMP_NOT_ENABLE = DJI_ERROR_CODE(DJI_ERROR_MODULE_SUBSCRIPTION, DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TIMESTAMP_NOT_ENABLE), + DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_NOT_SUPPORTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_SUBSCRIPTION, DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_NOT_SUPPORTED), + + /* mop channel module error code */ + DJI_ERROR_MOP_CHANNEL_MODULE_CODE_CONNECTION_CLOSE = DJI_ERROR_CODE(DJI_ERROR_MODULE_MOP_CHANNEL, DJI_ERROR_MOP_CHANNEL_MODULE_RAW_CODE_CONNECTION_CLOSE), + + /* Flight controller basic errors */ + DJI_ERROR_FC_MODULE_CODE_RC_MODE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_RC_MODE_ERROR), + DJI_ERROR_FC_MODULE_CODE_RELEASE_CONTROL_SUCCESS= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_RELEASE_CONTROL_SUCCESS), + DJI_ERROR_FC_MODULE_CODE_OBTAIN_CONTROL_SUCCESS= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_OBTAIN_CONTROL_SUCCESS), + DJI_ERROR_FC_MODULE_CODE_OBTAIN_CONTROL_IN_PROGRESS= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_OBTAIN_CONTROL_IN_PROGRESS), + DJI_ERROR_FC_MODULE_CODE_RELEASE_CONTROL_IN_PROGRESS= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_RELEASE_CONTROL_IN_PROGRESS), + DJI_ERROR_FC_MODULE_CODE_RC_NEED_MODE_P= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_RC_NEED_MODE_P), + DJI_ERROR_FC_MODULE_CODE_RC_NEED_MODE_F= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_RC_NEED_MODE_F), + DJI_ERROR_FC_MODULE_CODE_PARAM_READ_WRITE_INVALID_PARAM= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_PARAM_READ_WRITE_INVALID_PARAM), + DJI_ERROR_FC_MODULE_CODE_IOC_OBTAIN_CONTROL_ERROR= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_IOC_OBTAIN_CONTROL_ERROR), + DJI_ERROR_FC_MODULE_CODE_KEY_ERROR= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_KEY_ERROR), + DJI_ERROR_FC_MODULE_CODE_NO_AUTHORIZATION_ERROR= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_NO_AUTHORIZATION_ERROR), + DJI_ERROR_FC_MODULE_CODE_NO_RIGHTS_ERROR= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_NO_RIGHTS_ERROR), + DJI_ERROR_FC_MODULE_CODE_SYSTEM_ERROR= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_BASIC, DJI_ERROR_FC_MODULE_RAW_CODE_SYSTEM_ERROR), + + /* Flight controller joystick errors */ + DJI_ERROR_FC_JOYSTICK_MODULE_OBTAIN_RELEASE_JOYSTICK_AUTH_SUCCESS = DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_JOYSTICK, DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_SUCCESS), + DJI_ERROR_FC_JOYSTICK_MODULE_DEVICE_NOT_ALLOW= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_JOYSTICK, DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_DEVICE_NOT_ALLOW), + DJI_ERROR_FC_JOYSTICK_MODULE_TAKING_OFF= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_JOYSTICK, DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_TAKING_OFF), + DJI_ERROR_FC_JOYSTICK_MODULE_LANDING= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_JOYSTICK, DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_LANDING), + DJI_ERROR_FC_JOYSTICK_MODULE_CMD_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_JOYSTICK, DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_CMD_INVALID), + DJI_ERROR_FC_JOYSTICK_MODULE_RC_NOT_P_MODE = DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_JOYSTICK, DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_RC_NOT_P_MODE), + DJI_ERROR_FC_JOYSTICK_MODULE_CMD_LENGTH_ERROR= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_JOYSTICK, DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_CMD_LENGTH_ERROR), + DJI_ERROR_FC_JOYSTICK_MODULE_HAS_NO_JOYSTICK_AUTHORITY= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_JOYSTICK, DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_HAS_NO_JOYSTICK_AUTHORITY), + DJI_ERROR_FC_JOYSTICK_MODULE_IN_RC_LOST_ACTION= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_JOYSTICK, DJI_ERROR_FC_JOYSTICK_MODULE_RAW_CODE_IN_RC_LOST_ACTION), + + /* Flight controller action errors */ + DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_MOTOR_ON= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ACTION, DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_MOTOR_ON), + DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_MOTOR_OFF= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ACTION, DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_MOTOR_OFF), + DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_IN_AIR= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ACTION, DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_IN_AIR), + DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_NOT_IN_AIR= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ACTION, DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_NOT_IN_AIR), + DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_HOME_POINT_NOT_SET= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ACTION, DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_HOME_POINT_NOT_SET), + DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_BAD_GPS= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ACTION, DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_BAD_GPS), + DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_IN_SIMULATION= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ACTION, DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_IN_SIMULATION), + DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_CANNOT_START_MOTOR= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ACTION, DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_CANNOT_START_MOTOR), + DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_LOW_VOLTAGE= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ACTION, DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_LOW_VOLTAGE), + DJI_ERROR_FC_ACTION_MODULE_TRIGGER_ERROR_SPEED_TOO_LARGE= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ACTION, DJI_ERROR_FC_ACTION_MODULE_RAW_CODE_TRIGGER_ERROR_SPEED_TOO_LARGE), + + /* Flight controller arrest flying errors */ + DJI_ERROR_FC_ARREST_FLYING_MODULE_REGISTER_LOGOUT_SET_SUCCESS = DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ARREST_FLYING, DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_REGISTER_LOGOUT_SET_SUCCESS), + DJI_ERROR_FC_ARREST_FLYING_MODULE_REGISTER_LOGOUT_NULL_POINTER= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ARREST_FLYING, DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_REGISTER_LOGOUT_NULL_POINTER), + DJI_ERROR_FC_ARREST_FLYING_MODULE_HMS_CODE_HAS_REGISTED= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ARREST_FLYING, DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_HMS_CODE_HAS_REGISTED), + DJI_ERROR_FC_ARREST_FLYING_MODULE_HMS_CODE_NOT_FIND = DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ARREST_FLYING, DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_HMS_CODE_NOT_FIND), + DJI_ERROR_FC_ARREST_FLYING_MODULE_ADD_ITEM_NO_DECRIPTION = DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ARREST_FLYING, DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_ADD_ITEM_NO_DECRIPTION), + DJI_ERROR_FC_ARREST_FLYING_MODULE_REGISTER_ID_INVALID= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ARREST_FLYING, DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_REGISTER_ID_INVALID), + DJI_ERROR_FC_ARREST_FLYING_MODULE_STOP_IN_AIR_HMSCODE_NOT_IN_WHITE_TABLE= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ARREST_FLYING, DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_STOP_IN_AIR_HMSCODE_NOT_IN_WHITE_TABLE), + DJI_ERROR_FC_ARREST_FLYING_MODULE_INVALID_FORMAT_HMSCODE= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ARREST_FLYING, DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_INVALID_FORMAT_HMSCODE), + DJI_ERROR_FC_ARREST_FLYING_MODULE_HMSCODE_NOT_IN_WHITE_TABLE= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_ARREST_FLYING, DJI_ERROR_FC_ARREST_FLYING_MODULE_RAW_CODE_HMSCODE_NOT_IN_WHITE_TABLE), + + /* Flight controller home location errors */ + DJI_ERROR_FC_HOME_LOCATION_MODULE_UNKNOWN_FAILED_REASON= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_HOME_LOCATION, DJI_ERROR_FC_HOME_LOCATION_MODULE_RAW_CODE_UNKNOWN_FAILED_REASON), + DJI_ERROR_FC_HOME_LOCATION_MODULE_INVALID_GPS_COORDINATE= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_HOME_LOCATION, DJI_ERROR_FC_HOME_LOCATION_MODULE_RAW_CODE_INVALID_GPS_COORDINATE), + DJI_ERROR_FC_HOME_LOCATION_MODULE_NOT_BE_RECORD = DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_HOME_LOCATION, DJI_ERROR_FC_HOME_LOCATION_MODULE_RAW_CODE_NOT_BE_RECORD), + DJI_ERROR_FC_HOME_LOCATION_MODULE_GPS_NOT_READY = DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_HOME_LOCATION, DJI_ERROR_FC_HOME_LOCATION_MODULE_RAW_CODE_GPS_NOT_READY), + DJI_ERROR_FC_HOME_LOCATION_MODULE_DIS_TOO_FAR = DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_HOME_LOCATION, DJI_ERROR_FC_HOME_LOCATION_MODULE_RAW_CODE_DIS_TOO_FAR), + + /* Flight controller emergency stop motor errors */ + DJI_ERROR_FC_EMERGENCY_STOP_MOTOR_MODULE_VERSION_NOT_MATCH= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_EMERGENCY_STOP_MOTOR, DJI_ERROR_FC_EMERGENCY_STOP_MOTOR_MODULE_RAW_CODE_VERSION_NOT_MATCH), + DJI_ERROR_FC_EMERGENCY_STOP_MOTOR_MODULE_CMD_INVALID= DJI_ERROR_CODE(DJI_ERROR_MODULE_FC_EMERGENCY_STOP_MOTOR, DJI_ERROR_FC_EMERGENCY_STOP_MOTOR_MODULE_RAW_CODE_CMD_INVALID), + + /* Camera manager errors */ + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_UNSUPPORTED_COMMAND = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_UNSUPPORTED_COMMAND), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_TIMEOUT = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_TIMEOUT ), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_RAM_ALLOCATION_FAILED = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_RAM_ALLOCATION_FAILED), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_INVALID_COMMAND_PARAMETER = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_INVALID_COMMAND_PARAMETER), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_UNSUPPORTED_COMMAND_IN_CUR_STATE = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_UNSUPPORTED_COMMAND_IN_CUR_STATE), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_CAMERA_TIME_NOT_SYNCHRONIZED = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_CAMERA_TIME_NOT_SYNCHRONIZED), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_PARAMETER_SET_FAILED = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_PARAMETER_SET_FAILED), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_PARAMETER_GET_FAILED = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_PARAMETER_GET_FAILED), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_SD_CARD_MISSING = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_SD_CARD_MISSING), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_SD_CARD_FULL = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_SD_CARD_FULL), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_SD_CARD_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_SD_CARD_ERROR), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_SENSOR_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_SENSOR_ERROR), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_SYSTEM_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_SYSTEM_ERROR), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_PARAMETER_TOTAL_TOO_LONG = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_PARAMETER_TOTAL_TOO_LONG), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_MODULE_INACTIVATED = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_MODULE_INACTIVATED), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_FIRMWARE_DATA_NUM_DISCONTINUOUS = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_FIRMWARE_DATA_NUM_DISCONTINUOUS), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_FIRMWARE_VERIFICATION_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_FIRMWARE_VERIFICATION_ERROR), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_FLASH_WRITE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_FLASH_WRITE_ERROR), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_FIRMWARE_TYPE_MISMATCH = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_FIRMWARE_TYPE_MISMATCH), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_REMOTE_CONTROL_UNCONNECTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_REMOTE_CONTROL_UNCONNECTED), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_HARDWARE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_HARDWARE_ERROR), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_AIRCRAFT_UNCONNECTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_AIRCRAFT_UNCONNECTED), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_CANNOT_UPGRADE_IN_CUR_STATE = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_CANNOT_UPGRADE_IN_CUR_STATE), + DJI_ERROR_CAMERA_MANAGER_MODULE_CODE_UNDEFINE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_CAMERA_MANAGER, DJI_ERROR_CAMERA_MANAGER_MODULE_RAW_CODE_UNDEFINE_ERROR), + + /* Gimbal manager errors */ + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_UNSUPPORTED_COMMAND = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_UNSUPPORTED_COMMAND), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_TIMEOUT = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_TIMEOUT ), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_RAM_ALLOCATION_FAILED = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_RAM_ALLOCATION_FAILED), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_INVALID_COMMAND_PARAMETER = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_INVALID_COMMAND_PARAMETER), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_UNSUPPORTED_COMMAND_IN_CUR_STATE = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_UNSUPPORTED_COMMAND_IN_CUR_STATE), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_CAMERA_TIME_NOT_SYNCHRONIZED = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_CAMERA_TIME_NOT_SYNCHRONIZED), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_PARAMETER_SET_FAILED = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_PARAMETER_SET_FAILED), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_PARAMETER_GET_FAILED = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_PARAMETER_GET_FAILED), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_SD_CARD_MISSING = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_SD_CARD_MISSING), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_SD_CARD_FULL = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_SD_CARD_FULL), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_SD_CARD_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_SD_CARD_ERROR), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_SENSOR_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_SENSOR_ERROR), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_SYSTEM_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_SYSTEM_ERROR), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_PARAMETER_TOTAL_TOO_LONG = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_PARAMETER_TOTAL_TOO_LONG), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_MODULE_INACTIVATED = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_SYSTEM_MODULE_RAW_CODE_MODULE_INACTIVATED), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_FIRMWARE_DATA_NUM_DISCONTINUOUS = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_FIRMWARE_DATA_NUM_DISCONTINUOUS), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_FIRMWARE_VERIFICATION_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_FIRMWARE_VERIFICATION_ERROR), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_FLASH_WRITE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_FLASH_WRITE_ERROR), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_FIRMWARE_TYPE_MISMATCH = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_FIRMWARE_TYPE_MISMATCH), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_REMOTE_CONTROL_UNCONNECTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_REMOTE_CONTROL_UNCONNECTED), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_HARDWARE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_HARDWARE_ERROR), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_AIRCRAFT_UNCONNECTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_AIRCRAFT_UNCONNECTED), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_CANNOT_UPGRADE_IN_CUR_STATE = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_CANNOT_UPGRADE_IN_CUR_STATE), + DJI_ERROR_GIMBAL_MANAGER_MODULE_CODE_UNDEFINE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_GIMBAL_MANAGER, DJI_ERROR_GIMBAL_MANAGER_MODULE_RAW_CODE_UNDEFINE_ERROR), + + /* Waypoint v2 total errors */ + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_COMMON_SUCCESS = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_COMMON_SUCCESS), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_COMMON_INVALID_DATA_LENGTH = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_COMMON_INVALID_DATA_LENGTH), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_COMMON_INVALD_FLOAT_NUM = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_COMMON_INVALD_FLOAT_NUM), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WP_VERSION_NO_MATCH = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WP_VERSION_NO_MATCH), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_COMMON_UNKNOWN = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_COMMON_UNKNOWN), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_RESV = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_RESV), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_WP_NUM_TOO_MANY = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_WP_NUM_TOO_MANY), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_WP_NUM_TOO_FEW = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_WP_NUM_TOO_FEW ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_END_INDEX = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_END_INDEX ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_START_ID_GT_END_ID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_START_ID_GT_END_ID), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_END_ID_GT_TOTAL_NUM = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_END_ID_GT_TOTAL_NUM), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_DOWNLOAD_WPS_NOT_IN_STORED_RAGNE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_DOWNLOAD_WPS_NOT_IN_STORED_RAGNE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_CUR_POS_IS_FAR_AWAY_FROM_FIRST_WP = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_CUR_POS_IS_FAR_AWAY_FROM_FIRST_WP), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_ADJ_WPS_TOO_CLOSE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_ADJ_WPS_TOO_CLOSE ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_ADJ_WPS_TOO_FAR = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_ADJ_WPS_TOO_FAR ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_MAX_VEL_GT_GLOBAL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_MAX_VEL_GT_GLOBAL ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_LOCAL_CRUISE_VEL_GT_LOCAL_MAX = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_LOCAL_CRUISE_VEL_GT_LOCAL_MAX), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_LOCAL_CRUISE_VEL_GT_GLOBAL_MAX = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_LOCAL_CRUISE_VEL_GT_GLOBAL_MAX), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_GLOBAL_MAX_VEL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_GLOBAL_MAX_VEL ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GLOBAL_CRUISE_VEL_GT_MAX_VEL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GLOBAL_CRUISE_VEL_GT_MAX_VEL ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_GOTO_FIRST_FLAG = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_GOTO_FIRST_FLAG ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_FINISHED_ACTION = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_FINISHED_ACTION ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_RC_LOST_ACTION = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_RC_LOST_ACTION), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_YAW_MODE_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_YAW_MODE_INVALID), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_YAW_CMD_NOT_IN_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_YAW_CMD_NOT_IN_RANGE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_YAW_TURN_DIRECTION_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_YAW_TURN_DIRECTION_INVALID), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_WP_TYPE_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_WP_TYPE_INVALID), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GO_STOP_CMD_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GO_STOP_CMD_INVALID), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INVALID_PAUSE_RECOVERY_CMD = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INVALID_PAUSE_RECOVERY_CMD), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INVALID_BREAK_RESTORE_CMD = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INVALID_BREAK_RESTORE_CMD), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INVALID_REF_POINT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INVALID_REF_POINT), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_DAMPING_DIS_GE_DIS_OF_ADJ_POINTS = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_DAMPING_DIS_GE_DIS_OF_ADJ_POINTS), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_CANNT_SET_WP_LINE_EXIT_TYPE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_CANNT_SET_WP_LINE_EXIT_TYPE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_INFO_NOT_UPLOADED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_INFO_NOT_UPLOADED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WP_HAS_NOT_UPLOADED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WP_HAS_NOT_UPLOADED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOADED_WP_NOT_ENOUGH = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOADED_WP_NOT_ENOUGH), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GS_HAS_STARTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GS_HAS_STARTED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GS_NOT_RUNNING = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GS_NOT_RUNNING), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GS_NOT_RUNNING_FOR_PAUSE_RECOVERY = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GS_NOT_RUNNING_FOR_PAUSE_RECOVERY), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_GS_NOT_RUNNING_FOR_BREAK_RESTORE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_GS_NOT_RUNNING_FOR_BREAK_RESTORE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_NOT_IN_WP_MIS = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_NOT_IN_WP_MIS ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_MIS_HAS_BEEN_PAUSED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_MIS_HAS_BEEN_PAUSED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_MIS_NOT_PAUSED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_MIS_NOT_PAUSED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_MIS_HAS_BEEN_BROKEN = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_MIS_HAS_BEEN_BROKEN), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_MIS_NOT_BROKEN = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_MIS_NOT_BROKEN), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_PAUSE_RECOVERY_NOT_SUPPORTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_PAUSE_RECOVERY_NOT_SUPPORTED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_BREAK_RESTORE_NOT_SUPPORTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_BREAK_RESTORE_NOT_SUPPORTED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_NO_BREAK_POINT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_NO_BREAK_POINT ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_NO_CUR_TRAJ_PROJECT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_NO_CUR_TRAJ_PROJECT), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_NO_NXT_TRAJ_PROJECT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_NO_NXT_TRAJ_PROJECT), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_NO_NNT_TRAJ_PROJECT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_NO_NNT_TRAJ_PROJECT), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_UPLOAD_WP_ID_NOT_CONTINUE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_UPLOAD_WP_ID_NOT_CONTINUE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WP_LINE_ENTER_NOT_SET_TO_START_WP = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WP_LINE_ENTER_NOT_SET_TO_START_WP ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_INIT_WP_WHEN_PLAN_HAS_STARTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_INIT_WP_WHEN_PLAN_HAS_STARTED ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_DAMPING_DIS_EXCEED_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_DAMPING_DIS_EXCEED_RANGE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WAYPOINT_COOR_EXCEED_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WAYPOINT_COOR_EXCEED_RANGE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_FIRST_WP_TYPE_IS_WP_TURN_NO = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_FIRST_WP_TYPE_IS_WP_TURN_NO), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WP_EXCEED_RADIUS_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WP_EXCEED_RADIUS_LIMIT ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRAJ_WP_EXCEED_HEIGHT_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRAJ_WP_EXCEED_HEIGHT_LIMIT ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_STATUS_RESV = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_STATUS_RESV), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_STATUS_WP_MIS_CHECK_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_STATUS_WP_MIS_CHECK_FAIL), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_STATUS_HOME_NOT_RECORDED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_STATUS_HOME_NOT_RECORDED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_STATUS_LOW_LOCATION_ACCURACY = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_STATUS_LOW_LOCATION_ACCURACY), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_STATUS_RTK_CONDITION_IS_NOT_READY = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_STATUS_RTK_CONDITION_IS_NOT_READY), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_SECURE_RESV = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_SECURE_RESV), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_SECURE_CROSS_NFZ = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_SECURE_CROSS_NFZ), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_SECURE_BAT_LOW = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_SECURE_BAT_LOW), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_RESV = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_RESV), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_ACTION_ID_DUPLICATED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_ACTION_ID_DUPLICATED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_ACTION_ITEMS_SPACE_NOT_ENOUGH = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_ACTION_ITEMS_SPACE_NOT_ENOUGH), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_ACTION_SIZE_GT_BUF_SIZE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_ACTION_SIZE_GT_BUF_SIZE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_ACTION_ID_NOT_FOUND = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_ACTION_ID_NOT_FOUND), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_DOWNLOAD_ACTION_ID_RANGE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_DOWNLOAD_ACTION_ID_RANGE_ERROR), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTION_COMMON_NO_ACTION_ITEMS_STORED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTION_COMMON_NO_ACTION_ITEMS_STORED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_RESV = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_RESV), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_TYPE_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_TYPE_INVALID), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_REACH_WP_END_INDEX_LT_START_INDEX = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_REACH_WP_END_INDEX_LT_START_INDEX), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_REACH_WP_INVALID_INTERVAL_WP_NUM = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_REACH_WP_INVALID_INTERVAL_WP_NUM), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_REACH_WP_INVALID_AUTO_TERMINATE_WP_NUM = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_REACH_WP_INVALID_AUTO_TERMINATE_WP_NUM), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_ASSOCIATE_INVALID_TYPE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_ASSOCIATE_INVALID_TYPE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_TRIGGER_SIMPLE_INTERVAL_INVALID_TYPE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_TRIGGER_SIMPLE_INTERVAL_INVALID_TYPE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_COMMON_RESV = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_COMMON_RESV), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_COMMON_ACTUATOR_EXEC_NON_SUPPORTED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_COMMON_ACTUATOR_EXEC_NON_SUPPORTED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_COMMON_ACTUATOR_TYPE_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_COMMON_ACTUATOR_TYPE_INVALID), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_COMMON_ACTUATOR_FUNC_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_COMMON_ACTUATOR_FUNC_INVALID), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_RESV = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_RESV), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_SEND_SINGLE_SHOT_CMD_TO_CAMERA_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_SEND_SINGLE_SHOT_CMD_TO_CAMERA_FAIL), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_SEND_VIDEO_START_CMD_TO_CAMERA_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_SEND_VIDEO_START_CMD_TO_CAMERA_FAIL), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_SEND_VIDEO_STOP_CMD_TO_CAMERA_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_SEND_VIDEO_STOP_CMD_TO_CAMERA_FAIL), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_FOCUS_PARAM_XY_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_FOCUS_PARAM_XY_INVALID), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_SEND_FOCUS_CMD_TO_CAMERA_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_SEND_FOCUS_CMD_TO_CAMERA_FAIL), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_SEND_FOCALIZE_CMD_TO_CAMERA_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_SEND_FOCALIZE_CMD_TO_CAMERA_FAIL), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_FOCAL_DISTANCE_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_FOCAL_DISTANCE_INVALID), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_CAMERA_EXEC_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_CAMERA_EXEC_FAIL), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_RESV = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_RESV), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_INVALID_RPY_ANGLE_CTRL_CMD = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_INVALID_RPY_ANGLE_CTRL_CMD), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_INVALID_DURATION_CMD = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_INVALID_DURATION_CMD), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_FAIL_TO_ARRIVE_TGT_ANGLE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_FAIL_TO_ARRIVE_TGT_ANGLE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_FAIL_TO_SEND_CMD_TO_GIMBAL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_FAIL_TO_SEND_CMD_TO_GIMBAL), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_GIMBAL_THIS_INDEX_OF_GIMBAL_NOT_DOING_UNIFORM_CTRL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_GIMBAL_THIS_INDEX_OF_GIMBAL_NOT_DOING_UNIFORM_CTRL), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_FLIGHT_RESV = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_FLIGHT_RESV), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_FLIGHT_YAW_INVALID_YAW_ANGLE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_FLIGHT_YAW_INVALID_YAW_ANGLE), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_FLIGHT_YAW_TO_TGT_ANGLE_TIMEOUT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_FLIGHT_YAW_TO_TGT_ANGLE_TIMEOUT), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_FLIGHT_ACTION_YAW_OCCUPIED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_FLIGHT_ACTION_YAW_OCCUPIED), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_FLIGHT_CUR_AND_TGT_VEL_CLE_STATUE_EQUAL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_FLIGHT_CUR_AND_TGT_VEL_CLE_STATUE_EQUAL), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_PAYLOAD_RESV = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_PAYLOAD_RESV), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_PAYLOAD_FAIL_TO_SEND_CMD_TO_PAYLOAD = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_PAYLOAD_FAIL_TO_SEND_CMD_TO_PAYLOAD), + DJI_ERROR_WAYPOINT_V2_MODULE_CODE_ACTUATOR_PAYLOAD_EXEC_FAILED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V2, DJI_ERROR_WAYPOINT_V2_MODULE_RAW_CODE_ACTUATOR_PAYLOAD_EXEC_FAILED), + + /* Waypoint v3 total errors */ + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_COMMON_SUCCESS = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_SUCCESS), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_MISSION_ID_NOT_EXIST = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_MISSION_ID_NOT_EXIST), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_WAYLINE_INFO_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_WAYLINE_INFO_ERROR), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_WPMZ_FILE_VERSION_NOT_MATCH = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_WPMZ_FILE_VERSION_NOT_MATCH), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_WPMZ_FILE_LOAD_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_WPMZ_FILE_LOAD_ERROR), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_NO_BREAK_INFO = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_NO_BREAK_INFO), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CMD_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CMD_INVALID), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_START_WAYLINE_WHEN_WAYLINE_RUNNING = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_START_WAYLINE_WHEN_WAYLINE_RUNNING), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_BREAK_WAYLINE_IN_CUR_STATE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_BREAK_WAYLINE_IN_CUR_STATE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_STOP_WAYLINE_WHEN_WAYLINE_NOT_RUNNING = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_STOP_WAYLINE_WHEN_WAYLINE_NOT_RUNNING), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_BREAK_WAYLINE_WHEN_WAYLINE_NOT_RUNNING = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_BREAK_WAYLINE_WHEN_WAYLINE_NOT_RUNNING), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_REQUEST_DRONE_CONTROL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_REQUEST_DRONE_CONTROL), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_RESUME_WAYLINE_IN_CUR_STATE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_RESUME_WAYLINE_IN_CUR_STATE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_HEIGHT_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_HEIGHT_LIMIT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RADIUS_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RADIUS_LIMIT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CROSS_FLYLIMIT_AERA = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CROSS_FLYLIMIT_AERA), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_LOW_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_LOW_LIMIT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_OBSTACAL_STOP = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_OBSTACAL_STOP), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RTK_DISCONNECT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RTK_DISCONNECT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_BOUNDARY_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_BOUNDARY_LIMIT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RC_PITCH_ROLL_BREAK = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RC_PITCH_ROLL_BREAK), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_AIRPORT_HEIGHT_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_AIRPORT_HEIGHT_LIMIT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_REQUEST_TAKEOFF_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_REQUEST_TAKEOFF_FAIL), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_AUTOTAKEOFF_RUN_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_AUTOTAKEOFF_RUN_FAIL), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_REQUEST_WAYLINE_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_REQUEST_WAYLINE_FAIL), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_AGRO_PLAN_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_AGRO_PLAN_FAIL), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_REQUEST_QUICK_TAKEOFF_ASSIST_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_REQUEST_QUICK_TAKEOFF_ASSIST_FAIL), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_QUICK_TAKEOFF_ASSIST_RUN_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_QUICK_TAKEOFF_ASSIST_RUN_FAIL), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_VFENCE_LIMIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_VFENCE_LIMIT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_GPS_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_GPS_INVALID), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_START_AT_CURRENT_RC_MODE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_START_AT_CURRENT_RC_MODE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_HOME_POINT_NOT_RECORDED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_HOME_POINT_NOT_RECORDED), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_LOWER_BATTERY = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_LOWER_BATTERY), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RETURN_HOME = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RETURN_HOME), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ADSB_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ADSB_ERROR), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RC_LOST = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RC_LOST), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RTK_NOT_READY = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RTK_NOT_READY), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_DRONE_IS_MOVING = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_DRONE_IS_MOVING), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_DRONE_ON_GROUND_MOTOR_ON = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_DRONE_ON_GROUND_MOTOR_ON), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_SURFACE_FOLLOW_CAMERA_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_SURFACE_FOLLOW_CAMERA_INVALID), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_SURFACE_FOLLOW_HEIGHT_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_SURFACE_FOLLOW_HEIGHT_INVALID), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_SURFACE_FOLLOW_MAP_WRONG = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_SURFACE_FOLLOW_MAP_WRONG), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_HOMEPOINT_NOT_MATCH_RTK = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_HOMEPOINT_NOT_MATCH_RTK), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_STRONG_WIND_GOHOME = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_STRONG_WIND_GOHOME), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_DRONE_CRITICAL_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_DRONE_CRITICAL_ERROR), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_CANNOT_FIND_PAYLOAD = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_CANNOT_FIND_PAYLOAD), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_EXECUTION_FAILED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_EXECUTION_FAILED), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_FARM_NO_PESTICIDE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_FARM_NO_PESTICIDE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_RADAR_DISCONNECT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_RADAR_DISCONNECT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_USER_EXIT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_USER_EXIT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_USER_BREAK = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_USER_BREAK), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_USER_SET_GOHOME = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_USER_SET_GOHOME), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_USER_AGRO_PLANNER_STATE_CHANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_USER_AGRO_PLANNER_STATE_CHANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_USER_SWITCH_RC_MODE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_USER_SWITCH_RC_MODE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INIT_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INIT_FAIL), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_JOB_EXIT_BUT_MIS_RUNNING = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_JOB_EXIT_BUT_MIS_RUNNING), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_ON_GROUND_MOTOR_ON_CANNOT_GO = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_ON_GROUND_MOTOR_ON_CANNOT_GO), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_START_INDEX_OR_PROG = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_START_INDEX_OR_PROG), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_CSYS_MODE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_CSYS_MODE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_HEIGHT_MODE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_HEIGHT_MODE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_FLY_WP_MODE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_FLY_WP_MODE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_YAW_MODE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_YAW_MODE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_TURN_DIR_MODE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_TURN_DIR_MODE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_WP_TYPE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_WP_TYPE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_FIR_LAS_WP_TYPE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_FIR_LAS_WP_TYPE_ERROR), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_GLOB_VEL_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_GLOB_VEL_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_NUM_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_NUM_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_LAT_LONG_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_LAT_LONG_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_DAMP_DIS_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_DAMP_DIS_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_MAX_VEL_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_MAX_VEL_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_VEL_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_VEL_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_YAW_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_YAW_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_YAW_MODE_IN_VERT_SEGM = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_YAW_MODE_IN_VERT_SEGM), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_BREAK_INFO_MISSION_ID_CHANGED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_BREAK_INFO_MISSION_ID_CHANGED), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_BREAK_INFO_PROGRESS_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_BREAK_INFO_PROGRESS_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_BREAK_INFO_INVALID_MISSION_STATE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_BREAK_INFO_INVALID_MISSION_STATE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_WP_BREAK_INFO_WP_INDEX_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_WP_BREAK_INFO_WP_INDEX_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_BREAK_LAT_LONG_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_BREAK_LAT_LONG_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_BREAK_INFO_WP_YAW_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_BREAK_INFO_WP_YAW_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_INVALID_BREAK_INFO_FLAG = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_INVALID_BREAK_INFO_FLAG), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_GET_TRAJ_INFO_FAILED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_GET_TRAJ_INFO_FAILED), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_GENERATE_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_GENERATE_FAIL), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_LIB_RUN_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_LIB_RUN_FAIL), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRAJ_LIB_EMERGENCY_BRAKE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRAJ_LIB_EMERGENCY_BRAKE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_NOT_FOUND = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_NOT_FOUND), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_INDEX_REPEATED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_INDEX_REPEATED), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_INFO_SIZE_TOO_LONG_OR_TOO_SHORT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_INFO_SIZE_TOO_LONG_OR_TOO_SHORT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_EMPTY = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_EMPTY), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_LAYER_EMPTY = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_LAYER_EMPTY), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_ID_REPEATED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_ID_REPEATED), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_NODE_CHILDREN_NUM_LT_2 = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_NODE_CHILDREN_NUM_LT_2), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_INDEX_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_INDEX_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_ID_IS_65535 = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_ID_IS_65535), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_NODE_CHILDNUM_SUM_NOT_EQ_NEXT_LAYER_SIZE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_NODE_CHILDNUM_SUM_NOT_EQ_NEXT_LAYER_SIZE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_LAYER_NUM_TOO_MORE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_LAYER_NUM_TOO_MORE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_LAYER_NUM_TOO_LESS = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_LAYER_NUM_TOO_LESS), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_GROUP_NUM_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_GROUP_NUM_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_GROUP_VALID_RANGE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_GROUP_VALID_RANGE_ERROR), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_ROOT_STATUS_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_ROOT_STATUS_INVALID), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_TREE_NODE_STATUS_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_TREE_NODE_STATUS_INVALID), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_BREAK_INFO_ACTION_GROUP_ID_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_BREAK_INFO_ACTION_GROUP_ID_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_STATUS_TREE_SIZE_ERROR = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_STATUS_TREE_SIZE_ERROR), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_BREAK_INFO_TRIGGER_RUN_RESULT_INVALID = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_BREAK_INFO_TRIGGER_RUN_RESULT_INVALID), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_BREAK_INFO_ACTION_GROUP_ID_REPEATED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_BREAK_INFO_ACTION_GROUP_ID_REPEATED), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_BREAK_INFO_ACTION_LOCATION_REPEATED = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_BREAK_INFO_ACTION_LOCATION_REPEATED), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_BREAK_INFO_ACTION_LOCATION_OUT_OF_RANGE = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_BREAK_INFO_ACTION_LOCATION_OUT_OF_RANGE), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_RESUME_ID_NOT_IN_BREAK_INFO = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_RESUME_ID_NOT_IN_BREAK_INFO), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_RESUME_INFO_MODIFY_ACTION_STATUS_FROM_NO_INTERRUPT_TO_INTERRUPT = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_RESUME_INFO_MODIFY_ACTION_STATUS_FROM_NO_INTERRUPT_TO_INTERRUPT), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTION_COMMON_ACTION_RESUME_FAIL_FOR_INVALID_RESUME_INFO = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTION_COMMON_ACTION_RESUME_FAIL_FOR_INVALID_RESUME_INFO), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_ACTUATOR_COMMON_ACTUATOR_NOT_FOUND = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_ACTUATOR_COMMON_ACTUATOR_NOT_FOUND), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRIGGER_NOT_FOUND = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRIGGER_NOT_FOUND), + DJI_ERROR_WAYPOINT_V3_MODULE_CODE_TRIGGER_SINGLE_TIME_CHECK_FAIL = DJI_ERROR_CODE(DJI_ERROR_MODULE_WAYPOINT_V3, DJI_ERROR_WAYPOINT_V3_MODULE_RAW_CODE_TRIGGER_SINGLE_TIME_CHECK_FAIL), +}; +//@formatter:on + +/* Exported functions --------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif // DJI_ERROR_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_fc_subscription.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_fc_subscription.h new file mode 100644 index 0000000..c687c2f --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_fc_subscription.h @@ -0,0 +1,1349 @@ +/** + ******************************************************************** + * @file dji_fc_subscription.h + * @brief This is the header file for "dji_fc_subscription.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_FC_SUBSCRIPTION_H +#define DJI_FC_SUBSCRIPTION_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Name of topics that can be subscribed. Topic is minimum data item subscribed. + */ +typedef enum { + /*! + * @brief Quaternion of aircraft topic name. Quaternion topic provides aircraft body frame (FRD) to ground frame + * (NED) rotation. Please refer to ::T_DjiFcSubscriptionQuaternion for information about data structure. + * @details The DJI quaternion follows Hamilton convention (q0 = w, q1 = x, q2 = y, q3 = z). + * | Angle | Unit | Accuracy | Notes | + |--------------|------|------------|-------------------------------------------------| + | pitch, roll | deg | <1 | in NON-AHRS mode | + | yaw | deg | <3 | in well-calibrated compass with fine aligned | + | yaw with rtk | deg | around 1.2 | in RTK heading fixed mode with 1 meter baseline | + * @datastruct \ref T_DjiFcSubscriptionQuaternion + */ + DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 0), + /*! + * @brief Provides aircraft's acceleration w.r.t a ground-fixed \b NEU frame @ up to 200Hz + * @warning Please note that this data is not in a conventional right-handed frame of reference. + * @details This is a fusion output from the flight control system. The output is in a right-handed NED frame, but the + * sign of the Z-axis acceleration is flipped before publishing to this topic. So if you are looking to get acceleration + * in an NED frame, simply flip the sign of the z-axis value. Beyond that, you can convert using rotations to + * any right-handed frame of reference. + * @units m/s2 + * @datastruct \ref T_DjiFcSubscriptionAccelerationGround + */ + DJI_FC_SUBSCRIPTION_TOPIC_ACCELERATION_GROUND = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 1), + /*! + * @brief Provides aircraft's acceleration w.r.t a body-fixed \b FRU frame @ up to 200Hz + * @warning Please note that this data is not in a conventional right-handed frame of reference. + * @details This is a fusion output from the flight control system. + * @units m/s2 + * @datastruct \ref T_DjiFcSubscriptionAccelerationBody + */ + DJI_FC_SUBSCRIPTION_TOPIC_ACCELERATION_BODY = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 2), + /*! + * @brief Provides aircraft's acceleration in an IMU-centered, body-fixed \b FRD frame @ up to 400Hz + * @details This is a filtered output from the IMU on board the flight control system. + * @sensors IMU + * @units m/s2 + * @datastruct \ref T_DjiFcSubscriptionAccelerationRaw + */ + DJI_FC_SUBSCRIPTION_TOPIC_ACCELERATION_RAW = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 3), + /*! + * @brief Velocity of aircraft topic name. Velocity topic provides aircraft's velocity in a ground-fixed NEU frame. + * Please refer to ::T_DjiFcSubscriptionVelocity for information about data structure. + * @warning Please note that this data is not in a conventional right-handed frame of reference. + * @details This velocity data is a fusion output from the aircraft. Original output is in a right-handed NED frame, but the + * sign of the Z-axis velocity is flipped before publishing to this topic. So if you are looking to get velocity + * in an NED frame, simply flip the sign of the z-axis value. Beyond that, you can convert using rotations to + * any right-handed frame of reference. + * | Axis | Unit | Accuracy | + |----------|------|---------------------------------------------------------------------------------------------| + | vgx, vgy | m/s | Around 5cm/s for GNSS navigation. Around 3cm/s with VO at 1 meter height | + | vgz | m/s | 10cm/s only with barometer in steady air. 3cm/s with VO at 1 meter height with 8cm baseline | + * @datastruct \ref T_DjiFcSubscriptionVelocity + */ + DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 4), + /*! + * @brief Provides aircraft's angular velocity in a ground-fixed \b NED frame @ up to 200Hz + * @details This is a fusion output from the flight control system. + * @units rad/s + * @datastruct \ref T_DjiFcSubscriptionAngularRateFusioned + */ + DJI_FC_SUBSCRIPTION_TOPIC_ANGULAR_RATE_FUSIONED = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 5), + /*! + * @brief Provides aircraft's angular velocity in an IMU-centered, body-fixed \b FRD frame @ up to 400Hz + * @details This is a filtered output from the IMU on board the flight control system. + * @sensors IMU + * @units rad/s + * @datastruct \ref T_DjiFcSubscriptionAngularRateRaw + */ + DJI_FC_SUBSCRIPTION_TOPIC_ANGULAR_RATE_RAW = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 6), + /*! + * @brief Fused altitude of aircraft topic name. Fused altitude topic provides aircraft's fused altitude from sea + * level. Please refer to ::T_DjiFcSubscriptionAltitudeFused for information about data structure. + * @units m + * @datastruct \ref T_DjiFcSubscriptionAltitudeFused + */ + DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_FUSED = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 7), + /*! + * @brief Provides aircraft's pressure altitude from sea level using the ICAO model @ up to 200Hz + * @details + * This is a filetered output from the barometer without any further fusion. + * + * The ICAO model gives an MSL altitude of 1013.25mBar at 15° C and a temperature lapse rate of -6.5° C + * per 1000m. In your case, it may be possible that the take off altitude of the aircraft is recording a higher pressure + * than 1013.25mBar. Let's take an example - a weather station shows that SFO (San Francisco International Airport) had + * recently recorded a pressure of 1027.1mBar. SFO is 4m above MSL, yet, if you calculate the Pressure Altitude using + * the ICAO model, it relates to -114m. You can use an online calculator to similarly calculate the Pressure Altitude + * in your area. + * + * Another factor that may affect your altitude reading is manufacturing differences in the barometer - it is not + * uncommon to have a variation of ±30m readings at the same physical location with two different aircraft. For a given + * aircraft, these readings will be consistent, so you will need to calibrate the offset of your system if your code + * relies on the accuracy of the absolute value of altitude. + * @sensors GPS, Barometer, IMU + * @units m + * @datastruct \ref T_DjiFcSubscriptionAltitudeBarometer + */ + DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_BAROMETER = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 8), + /*! + * @brief Provides the altitude from sea level when the aircraft last took off. + * @details + * This is a fusion output from the flight control system, and also uses the ICAO model. + * + * The ICAO model gives an MSL altitude of 1013.25mBar at 15° C and a temperature lapse rate of -6.5° C + * per 1000m. In your case, it may be possible that the take off altitude of the aircraft is recording a higher pressure + * than 1013.25mBar. Let's take an example - a weather station shows that SFO (San Francisco International Airport) had + * recently recorded a pressure of 1027.1mBar. SFO is 4m above MSL, yet, if you calculate the Pressure Altitude using + * the ICAO model, it relates to -114m. You can use an online calculator to similarly calculate the Pressure Altitude + * in your area. + * + * Another factor that may affect your altitude reading is manufacturing differences in the barometer - it is not + * uncommon to have a variation of ±30m readings at the same physical location with two different aircraft. For a given + * aircraft, these readings will be consistent, so you will need to calibrate the offset of your system if your code + * relies on the accuracy of the absolute value of altitude. + * + * @note This value is updated each time the drone takes off. + * + * @units m + * @datastruct \ref T_DjiFcSubscriptionAltitudeOfHomePoint + */ + DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 9), + /*! + * @brief Provides the relative height above ground at up to 100Hz. + * @details + * This is a fusion output from the flight control system. The height is a direct estimate of the closest large object below the aircraft's ultrasonic sensors. + * A large object is something that covers the ultrasonic sensor for an extended duration of time. + * + * @warning This topic does not come with a 'valid' flag - so if the aircraft is too far from an object for the + * ultrasonic sensors/VO to provide any meaningful data, the values will latch and there is no way for user code to + * determine if the data is valid or not. Use with caution. + * @sensors Visual Odometry, Ultrasonic + * @units m + * @datastruct \ref T_DjiFcSubscriptionHeightFusion + */ + DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_FUSION = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 10), + /*! + * @brief Relative height above ground of aircraft topic name. Please refer to + * ::T_DjiFcSubscriptionHeightRelative for information about data structure. + * @details This data is a fusion output from aircraft. The height is a direct estimate of the closest large object + * below the aircraft's ultrasonic sensors. + * @warning This topic does not come with a 'valid' flag - so if the aircraft is too far from an object for the + * ultrasonic sensors/VO to provide any meaningful data, the values will latch and there is no way for user to + * determine if the data is valid or not. Please use with caution. + * @datastruct \ref T_DjiFcSubscriptionHeightRelative + */ + DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_RELATIVE = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 11), + + /*! + * Fused position of aircraft topic name. Please refer to ::T_DjiFcSubscriptionPositionFused for information + * about data structure. + * @warning Please note that if GPS signal is weak (low visibleSatelliteNumber, see below), the + * latitude/longitude values won't be updated but the altitude might still be. There is currently no way to know if + * the lat/lon update is healthy. + * @details The most important component of this topic is the T_DjiFcSubscriptionPositionFused::visibleSatelliteNumber. + * Use this to track your GPS satellite coverage and build some heuristics for when you might expect to lose GPS updates. + * | Axis | Unit | Position Sensor | Accuracy | + |------|------|-----------------|--------------------------------------------------| + | x, y | m | GPS | <3m with open sky without multipath | + | z | m | GPS | <5m with open sky without multipath | + * @datastruct \ref T_DjiFcSubscriptionPositionFused + */ + DJI_FC_SUBSCRIPTION_TOPIC_POSITION_FUSED = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 12), + + /*! + * @brief GPS date topic name. Please refer to ::T_DjiFcSubscriptionGpsDate for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionGpsDate + */ + DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 13), + + /*! + * @brief GPS time topic name. Please refer to ::T_DjiFcSubscriptionGpsTime for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionGpsTime + */ + DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 14), + + /*! + * @brief GPS position topic name. Please refer to ::T_DjiFcSubscriptionGpsPosition for information about data structure. + * @details + * | Axis | Accuracy | + |------|--------------------------------------------------| + | x, y | <3m with open sky without multipath | + | z | <5m with open sky without multipath | + * @datastruct \ref T_DjiFcSubscriptionGpsPosition + */ + DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 15), + + /*! + * @brief GPS velocity topic name. Please refer to ::T_DjiFcSubscriptionGpsVelocity for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionGpsVelocity + */ + DJI_FC_SUBSCRIPTION_TOPIC_GPS_VELOCITY = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 16), + + /*! + * @brief GPS details topic name. GPS details topic provides GPS state and other detail information. Please refer + * to ::T_DjiFcSubscriptionGpsDetail for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionGpsDetails + */ + DJI_FC_SUBSCRIPTION_TOPIC_GPS_DETAILS = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 17), + + /*! + * @brief GPS signal level topic name. This topic provides a measure of the quality of GPS signal. Please refer to + * ::T_DjiFcSubscriptionGpsSignalLevel for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionGpsSignalLevel + */ + DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 18), + + /*! + * @brief RTK position topic name. Please refer to ::T_DjiFcSubscriptionRtkPosition for information about data structure. + * @details + * | Axis | Accuracy | + |------|--------------------------------------------------| + | x, y | ~2cm with fine alignment and fix condition | + | z | ~3cm with fine alignment and fix condition | + * @datastruct \ref T_DjiFcSubscriptionRtkPosition + */ + DJI_FC_SUBSCRIPTION_TOPIC_RTK_POSITION = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 19), + + /*! + * @brief RTK velocity topic name. Please refer to ::T_DjiFcSubscriptionRtkVelocity for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionRtkVelocity + */ + DJI_FC_SUBSCRIPTION_TOPIC_RTK_VELOCITY = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 20), + + /*! + * @brief RTK yaw topic name. Please refer to ::T_DjiFcSubscriptionRtkYaw for information about data structure. + * @details The RTK yaw will provide the vector from ANT1 to ANT2 as configured in DJI Assistant 2. This + * means that the value of RTK yaw will be 90deg offset from the yaw of the aircraft. + * @datastruct \ref T_DjiFcSubscriptionRtkYaw + */ + DJI_FC_SUBSCRIPTION_TOPIC_RTK_YAW = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 21), + + /*! + * @brief RTK position information topic name. RTK position information topic provides a state of RTK position + * solution. Please refer to ::T_DjiFcSubscriptionRtkPositionInfo for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionRtkPositionInfo + */ + DJI_FC_SUBSCRIPTION_TOPIC_RTK_POSITION_INFO = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 22), + + /*! + * @brief RTK yaw topic name. RTK yaw information topic provides a state of RTK yaw solution. Please refer to + * ::T_DjiFcSubscriptionRtkYawInfo for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionRtkYawInfo + */ + DJI_FC_SUBSCRIPTION_TOPIC_RTK_YAW_INFO = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 23), + /*! + * @brief Provides aircraft's magnetometer reading, fused with IMU and GPS @ up to 100Hz + * @details This reading is the magnetic field recorded by the magnetometer in x,y,z axis, calibrated such that + * 1000 < |m| < 2000, and fused with IMU and GPS for robustness + * @sensors Magnetometer, IMU, GPS + * @units N/A + * @datastruct \ref T_DjiFcSubscriptionCompass + */ + DJI_FC_SUBSCRIPTION_TOPIC_COMPASS = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 24), + /*! + * @brief Provides remote controller stick inputs @ up to 100Hz + * @details This topic will give you: + * - Stick inputs (R,P,Y,Thr) + * - Mode switch (P/A/F) + * - Landing gear switch (Up/Down) + * + * @datastruct \ref T_DjiFcSubscriptionRC + * @also \ref TOPIC_RC_WITH_FLAG_DATA + */ + DJI_FC_SUBSCRIPTION_TOPIC_RC = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 25), + /*! + * @brief Provides gimbal pitch, roll, yaw @ up to 50Hz + * @details + * The reference frame for gimbal angles is a NED frame attached to the gimbal. + * This topic uses a data structure, Vector3f, that is too generic for the topic. The order of angles is : + * |Data Structure Element| Meaning| + * |----------------------|--------| + * |Vector3f.x |pitch | + * |Vector3f.y |roll | + * |Vector3f.z |yaw | + * + * @perf + * 0.1 deg accuracy in all axes + * + * @sensors Gimbal Encoder, IMU, Magnetometer + * @units deg + * @datastruct \ref T_DjiFcSubscriptionGimbalAngles + * @also \ref TOPIC_GIMBAL_STATUS, \ref TOPIC_GIMBAL_CONTROL_MODE + */ + DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_ANGLES = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 26), + /*! + * @brief Provides gimbal status and error codes @ up to 50Hz + * @details Please see the \ref GimbalStatus struct for the details on what data you can receive. + * + * @datastruct \ref T_DjiFcSubscriptionGimbalStatus + * @also \ref TOPIC_GIMBAL_ANGLES, \ref TOPIC_GIMBAL_CONTROL_MODE + */ + DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_STATUS = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 27), + /*! + * @brief Flight status topic name. Please refer to ::T_DjiFcSubscriptionFlightStatus for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionFlightStatus + */ + DJI_FC_SUBSCRIPTION_TOPIC_STATUS_FLIGHT = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 28), + /*! + * @brief Provides a granular state representation for various tasks/flight modes @ up to 50Hz + * @details Typically, use this topic together with \ref TOPIC_STATUS_FLIGHT to get a + * better understanding of the overall status of the aircraft. + * + * @datastruct \ref T_DjiFcSubscriptionDisplaymode + * @also \ref TOPIC_STATUS_FLIGHT + */ + DJI_FC_SUBSCRIPTION_TOPIC_STATUS_DISPLAYMODE = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 29), + /*! + * @brief Provides status for the landing gear state @ up to 50Hz + * + * @datastruct \ref T_DjiFcSubscriptionLandinggear + */ + DJI_FC_SUBSCRIPTION_TOPIC_STATUS_LANDINGGEAR = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 30), + /*! + * @brief If motors failed to start, this topic provides reasons why. Available @ up to 50Hz + * @datastruct \ref T_DjiFcSubscriptionMotorStartError + * \note These enumerations show up in the ErrorCode class because they can also be returned as acknowledgements + * for APIs that start the motors, such as \ref Control::takeoff "Takeoff" or \ref Control::armMotors "Arm" + */ + DJI_FC_SUBSCRIPTION_TOPIC_STATUS_MOTOR_START_ERROR = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, + 31), + /*! + * @brief Battery information topic name. Please refer to ::T_DjiFcSubscriptionWholeBatteryInfo for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionWholeBatteryInfo + */ + DJI_FC_SUBSCRIPTION_TOPIC_BATTERY_INFO = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 32), + /*! + * @brief Provides states of the aircraft related to SDK/RC control + * @details The following information is available in this topic: + * |Data Structure Element| Meaning| + * |----------------------|--------| + * |controlMode |The modes in which the aircraft is being controlled (control loops being applied on horizontal, vertical and yaw axes of the aircraft)| + * |deviceStatus |Which device is controlling the motion of the aircraft: RC (Manual control), MSDK (Missions kicked off through mobile), OSDK (Missions kicked off through onboard/ low-level flight control) | + * |flightStatus |Has the OSDK been granted control authority? Since MSDK and RC have precedence, it is possible that deviceStatus shows RC or MSDK actually controlling the aircraft but this value is 1. | + * |vrcStatus |Deprecated| + * @datastruct \ref T_DjiFcSubscriptionControlDevice + */ + DJI_FC_SUBSCRIPTION_TOPIC_CONTROL_DEVICE = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 33), + /*! + * @brief Provides IMU and quaternion data time-synced with a hardware clock signal @ up to 400Hz. + * @details This is the only data which can be synchronized with external software or hardware systems. If you want to + * fuse an external sensor's data with the aircraft's IMU, this data along with a hardware trigger from the A3/N3's + * expansion ports is how you would do it. You can see detailed documentation on how this process works in the [Hardware + * Sync Guide](https://developer.dji.com/onboard-sdk/documentation/guides/component-guide-hardware-sync.html). + * @sensors IMU, sensor fusion output + * @units + * |Data Structure Element| Units| + * |----------------------|--------| + * |Timestamp |2.5ms, 1ns (See \ref SyncTimestamp)| + * |Quaternion |rad (after converting to rotation matrix)| + * |Acceleration |g| + * |Gyroscope |rad/sec| + * @datastruct \ref T_DjiFcSubscriptionHardSync + */ + DJI_FC_SUBSCRIPTION_TOPIC_HARD_SYNC = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 34), + /*! + * @brief Provides a measure of the quality of GPS signal, with a mechanism for guarding against unset homepoint @ up to 50Hz + * @details The level varies from 0 to 5, with 0 being the worst and 5 the best GPS signal. The key difference between + * this and TOPIC_GPS_SIGNAL_LEVEL is that this topic always returns 0 if the homepoint is not set. Once the home point is + * set, the behavior is exactly the same as TOPIC_GPS_SIGNAL_LEVEL. + * @sensors GPS + * @datastruct \ref T_DjiFcSubscriptionGpsControlLevel + * @also \ref TOPIC_GPS_SIGNAL_LEVEL + */ + DJI_FC_SUBSCRIPTION_TOPIC_GPS_CONTROL_LEVEL = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 35), + /*! + * @brief Provides normalized remote controller stick input data, along with connection status @ up to 50Hz + * @note This topic was added in August 2018. Your aircraft may require a FW update to enable this feature. + * @details This topic will give you: + * - Stick inputs (R,P,Y,Thr) + * - Mode switch (P/A/F) + * - Landing gear switch (Up/Down) + * - Connection status for air system, ground system and MSDK apps. The connection status also includes a + * logicConnected element, which will change to false if either the air system or the ground system radios + * are disconnected for >3s. + * - Deadzones near the center of the stick positions are also handled in this topic. + * + * @datastruct \ref T_DjiFcSubscriptionRCWithFlagData + * @also \ref TOPIC_RC + */ + DJI_FC_SUBSCRIPTION_TOPIC_RC_WITH_FLAG_DATA = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 36), + /*! + * @brief Provides raw data from the ESCs @ up to 50Hz + * @note This topic was added in August 2018. Your aircraft may require a FW update to enable this feature. + * @details This topic supports reporting data for up to 8 ESCs; note that only DJI Intelligent ESCs are supported + * for this reporting feature. Use this topic to get data on elements close to the hardware - e.g. motor speeds, + * ESC current and voltage, error flags at the ESC level etc. + * @datastruct \ref T_DjiFcSubscriptionEscData + */ + DJI_FC_SUBSCRIPTION_TOPIC_ESC_DATA = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 37), + /*! + * @brief Provides RTK connection status @ up to 50Hz + * @note This topic was added in August 2018. Your aircraft may require a FW update to enable this feature. + * @details This topic will update in real time whether the RTK GPS system is connected or not; typical uses + * include app-level logic to switch between GPS and RTK sources of positioning based on this flag. + * @datastruct \ref T_DjiFcSubscriptionRTKConnectStatus + */ + DJI_FC_SUBSCRIPTION_TOPIC_RTK_CONNECT_STATUS = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 38), + /*! + * @brief Provides the mode in which the gimbal will interpret control commands @ up to 50Hz + * @note This topic was added in August 2018. Your aircraft may require a FW update to enable this feature. + * @details This topic will report the current control mode which can be set in the + * DJI Go app, MSDK apps, or through Onboard SDK gimbal control APIs (see \ref Gimbal::AngleData "AngleData" struct + * for more information) + * @datastruct \ref T_DjiFcSubscriptionGimbalControlMode + */ + DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_CONTROL_MODE = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 39), + /*! + * @brief Provides a number of flags which report different errors the aircraft may encounter in flight @ up to 50Hz + * @note This topic was added in August 2018. Your aircraft may require a FW update to enable this feature. + * @warning Most of the errors reported by this topic are cases where immediate action is required; you can use these + * as a baseline for implementing safety-related error-handling routines. + * @datastruct \ref T_DjiFcSubscriptionFlightAnomaly + */ + DJI_FC_SUBSCRIPTION_TOPIC_FLIGHT_ANOMALY = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 40), + /*! + * @brief Provides aircraft's position in a Cartesian frame @ up to 50Hz, without the need for GPS + * @warning This topic does not follow a standard co-ordinate convention. Please read the details below for usage. + * @details This is the only topic which can provide positioning information without having a GPS fix; though this + * can be a big enabler please note the caveats of using this topic: + * - The topic will use an origin that does not have a global reference, and is not published to the SDK. + * - The topic uses a combination of VO and compass heading to identify the X-Y axes of its reference frame. This means + * that if your compass performance is not good in an environment, there is no guarantee the X-Y axes will point to + * North and East. + * - The actual directions of the X-Y axes are currently not published to the SDK. + * - If during a flight the compass performance were to change dramatically, the orientation of the X-Y axes may change + * to re-align with North-East. The aircraft's position in X and Y may exhibit discontinuities in these cases. + * - The reference frame is referred to as the Navigation Frame - Cartesian X,Y axes aligned with N,E directions on a best-effort + * basis, and Z aligned to D (down) direction. + * - A health flag for each axis provides some granularity on whether this data is valid or not. + * + * The key takeaway from these details is that this topic provides a best-effort attempt at providing position + * information in the absence of absolute references (GPS, compass etc.), without guarantees of consistency if + * environmental conditions change. So if your application is confined to a stable environment, or if you will + * have GPS and compass available at all times, this topic can still provide useful data that cannot be otherwise + * had. If using for control, make sure to have guards checking for the continuity of data. + * + * @note Since this topic relies on visual features and/or GPS, if your environment does not provide any of these + * sources of data, the quality of this topic will reduce significantly. VO data quality will reduce if you are too high + * above the ground. Make sure that the Vision Positioning System is enabled in DJI Go 4 before using this topic + * (by default it is enabled). + * @sensors IMU, VO, GPS(if available), RTK (if available), ultrasonic, magnetometer, barometer + * @units m + * @datastruct \ref T_DjiFcSubscriptionPositionVO + */ + DJI_FC_SUBSCRIPTION_TOPIC_POSITION_VO = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 41), + /*! + * @brief Provides obstacle info around the vehicle @ up to 100Hz + * @datastruct \ref T_DjiFcSubscriptionAvoidData + */ + DJI_FC_SUBSCRIPTION_TOPIC_AVOID_DATA = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 42), + /*! + * @brief Provides status of whether the home point was set or not + * @datastruct \ref T_DjiFcSubscriptionHomePointSetStatus + */ + DJI_FC_SUBSCRIPTION_TOPIC_HOME_POINT_SET_STATUS = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 43), + /*! + * @brief Provides homepoint information, the valid of the home point infomation can ref to the + * topic DJI_FC_SUBSCRIPTION_TOPIC_HOME_POINT_SET_STATUS + * @datastruct \ref T_DjiFcSubscriptionHomePointInfo + */ + DJI_FC_SUBSCRIPTION_TOPIC_HOME_POINT_INFO = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 44), + /*! + * @brief Provides three gimbal information, used for M300 + * @datastruct \ref T_DjiFcSubscriptionThreeGimbalData + */ + DJI_FC_SUBSCRIPTION_TOPIC_THREE_GIMBAL_DATA = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 45), + + /*! + * @brief Battery information topic name. Please refer to ::T_DjiFcSubscriptionSingleBatteryInfo for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionSingleBatteryInfo + */ + DJI_FC_SUBSCRIPTION_TOPIC_BATTERY_SINGLE_INFO_INDEX1 = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, + 46), + /*! + * @brief Battery information topic name. Please refer to ::T_DjiFcSubscriptionSingleBatteryInfo for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionSingleBatteryInfo + */ + DJI_FC_SUBSCRIPTION_TOPIC_BATTERY_SINGLE_INFO_INDEX2 = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, + 47), + + /*! + * @brief Please refer to ::T_DjiFcSubscriptionImuAttiNaviDataWithTimestamp for information about data structure. + * @datastruct \ref T_DjiFcSubscriptionImuAttiNaviDataWithTimestamp + */ + DJI_FC_SUBSCRIPTION_TOPIC_IMU_ATTI_NAVI_DATA_WITH_TIMESTAMP = DJI_DATA_SUBSCRIPTION_TOPIC(DJI_DATA_SUBSCRIPTION_MODULE_FC, 48), + + /*! Total number of topics that can be subscribed. */ + DJI_FC_SUBSCRIPTION_TOPIC_TOTAL_NUMBER, +} E_DjiFcSubscriptionTopic; + +/** + * @brief Health state of data subscribed. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_DATA_NOT_HEALTH = 0, /*!< Data subscribed is healthy and can be used. */ + DJI_FC_SUBSCRIPTION_DATA_HEALTH = 1, /*!< Data subscribed is not healthy and recommend not to use it. */ +} E_DjiFcSubscriptionDataHealthFlag; + +/** + * @brief Position solution property. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_NOT_AVAILABLE = 0, /*!< Position solution is not available. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FIX_POSITION = 1, /*!< Position has been fixed by the FIX POSITION command. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FIX_HEIGHT_AUTO = 2, /*!< Position has been fixed by the FIX HEIGHT/AUTO command. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_INSTANTANEOUS_DOPPLER_COMPUTE_VELOCITY = 8, /*!< Velocity computed using instantaneous Doppler. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_SINGLE_PNT_SOLUTION = 16, /*!< Single point position solution. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_PSEUDORANGE_DIFFERENTIAL_SOLUTION = 17, /*!< Pseudorange differential solution. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_SBAS_CORRECTION_CALCULATED = 18, /*!< Solution calculated using corrections from an SBAS. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_KALMAN_FILTER_WITHOUT_OBSERVATION_PROPAGATED = 19, /*!< Propagated by a Kalman filter without new observations. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_OMNISTAR_VBS_POSITION = 20, /*!< OmniSTAR VBS position (L1 sub-metre). */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FLOAT_L1_AMBIGUITY = 32, /*!< Floating L1 ambiguity solution. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FLOAT_IONOSPHERIC_FREE_AMBIGUITY = 33, /*!< Floating ionospheric-free ambiguity solution. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FLOAT_SOLUTION = 34, /*!< Float position solution. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_L1_AMBIGUITY_INT = 48, /*!< Integer L1 ambiguity solution. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_WIDE_LANE_AMBIGUITY_INT = 49, /*!< Integer wide-lane ambiguity solution. */ + DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_NARROW_INT = 50, /*!< Narrow fixed point position solution. */ +} E_DjiFcSubscriptionPositionSolutionProperty; + +/** + * @brief GPS fix state. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_NO_FIX = 0, /*!< GPS position has not been fixed. */ + DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_DEAD_RECKONING_ONLY = 1, /*!< GPS position is dead reckoned only. */ + DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_2D_FIX = 2, /*!< The horizontal position with latitude/longitude (or northing/easting or X/Y) is fixed. */ + DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_3D_FIX = 3, /*!< The horizontal and vertical position with latitude/longitude/altitude (northing/easting/altitude or X/Y/Z) is fixed. */ + DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_GPS_PLUS_DEAD_RECKONING = 4, /*!< Position is calculated by GPS and combined with dead reckoning. */ + DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_TIME_ONLY_FIX = 5, /*!< Only time is fixed. */ +} E_DjiFcSubscriptionGpsFixState; + +/** + * @brief Flight status of aircraft. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_STOPED = 0, /*!< Aircraft is on ground and motors are still. */ + DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_ON_GROUND = 1, /*!< Aircraft is on ground but motors are rotating. */ + DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR = 2, /*!< Aircraft is in air. */ +} E_DjiFcSubscriptionFlightStatus; + +/*! + * @brief "Mode" of the vehicle's state machine, as displayed on DJI Go + * @details Available through Telemetry::TOPIC_STATUS_DISPLAYMODE + */ +typedef enum { + /*! This mode requires the user to manually + * control the aircraft to remain stable in air. */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_MANUAL_CTRL = 0, + /*! In this mode, the aircraft can keep + * attitude stabilization and only use the + * barometer for positioning to control the altitude.
+ * The aircraft can not autonomously locate and hover stably.*/ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ATTITUDE = 1, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_2 = 2, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_3 = 3, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_4 = 4, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_5 = 5, + /*! The aircraft is in normal GPS mode.
+ * In normal GPS mode, the aircraft can + * autonomously locate and hover stably.
+ * The sensitivity of the aircraft to the + * command response is moderate. + */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_P_GPS = 6, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_7 = 7, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_8 = 8, + /*! In hotpoint mode */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_HOTPOINT_MODE = 9, + /*! In this mode, user can push the throttle + * stick to complete stable take-off. */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ASSISTED_TAKEOFF = 10, + /*! In this mode, the aircraft will autonomously + * start motor, ascend and finally hover. */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_TAKEOFF = 11, + /*! In this mode, the aircraft can land autonomously. */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_LANDING = 12, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_13 = 13, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_14 = 14, + /*! In this mode, the aircraft can antonomously return the + * last recorded Home Point.
+ * There are three types of this mode: Smart RTH(Return-to-Home), + * Low Batterry RTH, and Failsafe RTTH. */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_NAVI_GO_HOME = 15, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_16 = 16, + /*! In this mode, the aircraft is controled by SDK API.
+ * User can directly define the control mode of horizon + * and vertical directions and send control datas to aircraft. */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_NAVI_SDK_CTRL = 17, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_18 = 18, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_19 = 19, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_20 = 20, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_21 = 21, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_22 = 22, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_23 = 23, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_24 = 24, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_25 = 25, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_26 = 26, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_27 = 27, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_28 = 28, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_29 = 29, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_30 = 30, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_31 = 31, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_32 = 32, + /*! drone is forced to land, might due to low battery */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_FORCE_AUTO_LANDING = 33, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_34 = 34, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_35 = 35, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_36 = 36, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_37 = 37, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_38 = 38, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_39 = 39, + /*! drone will search for the last position where the rc is not lost */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_SEARCH_MODE = 40, + /*! Mode for motor starting.
+ * Every time user unlock the motor, this will be the first mode. */ + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ENGINE_START = 41, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_42 = 42, + DJI_FC_SUBSCRIPTION_DISPLAY_MODE_RESERVED_43 = 42, +} E_DjiFcSubscriptionDisplayMode; + +/** + * @brief Setting status of homepoint. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_HOME_POINT_SET_STATUS_FAILED = 0, /*!< The home point was not set yet. */ + DJI_FC_SUBSCRIPTION_HOME_POINT_SET_STATUS_SUCCESS = 1, /*!< The home point was set successfully. */ +} E_DjiFcSubscriptionHomePointSetStatus; + +/** + * @brief Smart battery self-check result. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_BATTERY_SELF_CHECK_NORMAL = 0, /*!< Battery self-check is normal. */ + DJI_FC_SUBSCRIPTION_BATTERY_SELF_CHECK_NTC_ABNORMAL = 1, /*!< Battery self-check NTC is abnormal. */ + DJI_FC_SUBSCRIPTION_BATTERY_SELF_CHECK_MOS_ABNORMAL = 2, /*!< Battery self-check MOS is abnormal. */ + DJI_FC_SUBSCRIPTION_BATTERY_SELF_CHECK_R_ABNORMAL = 3, /*!< Battery self-check sampling resistance is abnormal. */ + DJI_FC_SUBSCRIPTION_BATTERY_SELF_CHECK_CELL_DAMAGE = 4, /*!< Battery cell self-check is damaged. */ + DJI_FC_SUBSCRIPTION_BATTERY_SELF_CHECK_CAL_EXP = 5, /*!< Battery self-check is not calibrated. */ + DJI_FC_SUBSCRIPTION_BATTERY_SELF_CHECK_GAUGE_PARM_EXP = 6, /*!< Battery self-check fuel gauge parameters is abnormal. */ +} E_DJIFcSubscriptionBatterySelfCheck; + +/** + * @brief Smart battery closed reason. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_NORMAL = 0, /*!< Battery closed reason is normal shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_FORCED = 1, /*!< Battery closed reason is forced by flight controller shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_SCD = 2, /*!< Battery closed reason is discharge short circuit shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_OLD = 3, /*!< Battery closed reason is discharge overload shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_OCD = 4, /*!< Battery closed reason is discharge over current shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_UVD = 5, /*!< Battery closed reason is discharge under voltage shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_OTD = 6, /*!< Battery closed reason is discharge over temperature shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_SCC = 16, /*!< Battery closed reason is charging short circuit shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_OCC = 17, /*!< Battery closed reason is charging over current shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_OVC = 18, /*!< Battery closed reason is charging over voltage shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_CHARGER_OVC = 19, /*!< Battery closed reason is charger over voltage shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_LTC = 20, /*!< Battery closed reason is charging low temperature shutdown. */ + DJI_FC_SUBSCRIPTION_BATTERY_CLOSED_HTC = 21, /*!< Battery closed reason is charging high temperature shutdown. */ +} E_DJIFcSubscriptionBatteryClosedReason; + +/** + * @brief Smart battery SOH state. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_BATTERY_SOH_NORMAL = 0, /*!< Battery SOH state is normal. */ + DJI_FC_SUBSCRIPTION_BATTERY_SOH_ALERT = 1, /*!< Battery SOH state is alert. */ + DJI_FC_SUBSCRIPTION_BATTERY_SOH_SAFE = 2, /*!< Battery SOH state is safe. */ +} E_DJIFcSubscriptionBatterySohState; + +/** + * @brief Smart battery heart state. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_BATTERY_NO_HEAT = 0, /*!< Battery is in no heat state. */ + DJI_FC_SUBSCRIPTION_BATTERY_IN_HEAT = 1, /*!< Battery is in heat state. */ + DJI_FC_SUBSCRIPTION_BATTERY_KEEP_WARM = 2, /*!< Battery is in keep warm state. */ +} E_DJIFcSubscriptionBatteryHeatState; + +/** + * @brief Smart battery SOC state. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_BATTERY_SOC_NORMAL = 0, /*!< Battery SOC state is normal. */ + DJI_FC_SUBSCRIPTION_BATTERY_SOC_ABNORMAL_HIGH = 1, /*!< Battery SOC state is abnormal high. */ + DJI_FC_SUBSCRIPTION_BATTERY_SOC_JUMP_DOWN = 2, /*!< Battery SOC state is jump down. */ + DJI_FC_SUBSCRIPTION_BATTERY_SOC_JUMP_UP = 3, /*!< Battery SOC state is jump up. */ + DJI_FC_SUBSCRIPTION_BATTERY_SOC_INVALID = 4, /*!< Battery SOC state is invalid. */ +} E_DJIFcSubscriptionBatterySocState; + +/** + * @brief Flight control mode. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_CONTROL_MODE_UNKNOWN = 0, + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_ANG_VER_VEL_YAW_ANG = 1, /*!< Horizontal mode is angle, vertical mode is velocity, yaw mode is angle. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_ANG_VER_VEL_YAW_RAT = 2, /*!< Horizontal mode is angle, vertical mode is velocity, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_VEL_VER_VEL_YAW_ANG = 3, /*!< Horizontal mode is velocity, vertical mode is velocity, yaw mode is angle. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_VEL_VER_VEL_YAW_RAT = 4, /*!< Horizontal mode is velocity, vertical mode is velocity, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_POS_VER_VEL_YAW_ANG = 5, /*!< Horizontal mode is position, vertical mode is velocity, yaw mode is angle. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_POS_VER_VEL_YAW_RAT = 6, /*!< Horizontal mode is position, vertical mode is velocity, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_ANG_VER_POS_YAW_ANG = 7, /*!< Horizontal mode is angle, vertical mode is position, yaw mode is angle. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_ANG_VER_POS_YAW_RAT = 8, /*!< Horizontal mode is angle, vertical mode is position, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_VEL_VER_POS_YAW_ANG = 9, /*!< Horizontal mode is velocity, vertical mode is position, yaw mode is angle. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_VEL_VER_POS_YAW_RAT = 10, /*!< Horizontal mode is velocity, vertical mode is position, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_POS_VER_POS_YAW_ANG = 11, /*!< Horizontal mode is position, vertical mode is position, yaw mode is angle. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_POS_VER_POS_YAW_RAT = 12, /*!< Horizontal mode is position, vertical mode is position, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_ANG_VER_THR_YAW_ANG = 13, /*!< Horizontal mode is angle, vertical mode is thrust, yaw mode is angle. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_ANG_VER_THR_YAW_RAT = 14, /*!< Horizontal mode is angle, vertical mode is thrust, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_VEL_VER_THR_YAW_ANG = 15, /*!< Horizontal mode is velocity, vertical mode is thrust, yaw mode is angle. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_VEL_VER_THR_YAW_RAT = 16, /*!< Horizontal mode is velocity, vertical mode is thrust, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_POS_VER_THR_YAW_ANG = 17, /*!< Horizontal mode is position, vertical mode is thrust, yaw mode is angle. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_POS_VER_THR_YAW_RAT = 18, /*!< Horizontal mode is position, vertical mode is thrust, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_AEL_VER_VEL_YAW_RAT = 19, /*!< Horizontal mode is angle-rate, vertical mode is velocity, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_AEL_VER_POS_YAW_RAT = 20, /*!< Horizontal mode is angle-rate, vertical mode is thrust, yaw mode is rate. */ + DJI_FC_SUBSCRIPTION_CONTROL_MODE_HOR_AEL_VER_THR_YAW_RAT = 21, /*!< Horizontal mode is angle-rate, vertical mode is velocity, yaw mode is rate. */ +} E_DJIFcSubscriptionControlMode; + +/** + * @brief Flight control authority. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_CONTROL_AUTHORITY_RC = 0, /*!< Authority is in remote control */ + DJI_FC_SUBSCRIPTION_CONTROL_AUTHORITY_MSDK = 1, /*!< Authority is in MSDK */ + DJI_FC_SUBSCRIPTION_CONTROL_AUTHORITY_PSDK = 4, /*!< Authority is in PSDK */ + DJI_FC_SUBSCRIPTION_CONTROL_AUTHORITY_DOCK = 5, /*!< Authority is in dock */ +} E_DJIFcSubscriptionControlAuthority; + +/** + * @brief Flight control authority change reason. + */ +typedef enum { + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_UNKNOWN = 0, /*!< Reason unknown */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_MSDK_REQUEST = 1, /*!< Contro authority changed by MSDK request. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_USER_REQUEST = 2, /*!< Contro authority changed by user request. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_PSDK_REQUEST = 3, /*!< Contro authority changed by PSDK request. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_RC_LOST = 4, /*!< Contro authority changed for remote control lost. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_RC_NOT_P_MODE = 5, /*!< Contro authority changed for remote control not in P mode. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_RC_SWITCH = 6, /*!< Contro authority changed for remote control switching mode. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_RC_PAUSE_STOP = 7, /*!< Contro authority changed for remote control stop key paused. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_RC_ONE_KEY_GO_HOME = 8, /*!< Contro authority changed for remote control go-home key paused. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_BATTERY_LOW_GO_HOME = 9, /*!< Contro authority changed for remote control go-home key paused. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_BATTERY_SUPER_LOW_LANDING = 10, /*!< Contro authority changed for going home caused by low batter power. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_PSDK_LOST = 11, /*!< Contro authority changed for PSDK lost. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_NEAR_BOUNDARY = 13, /*!< Contro authority changed for nearing boundary. */ + DJI_FC_SUBSCRIPTION_AUTHORITY_CHANGE_REASON_AIRPORT_REQUEST = 14, /*!< Contro authority changed by airport request. */ +} E_DJIFcSubscriptionAuthorityChangeReason; + +#pragma pack(1) + +/** + * @brief Quaternion topic data structure. + */ +typedef struct Quaternion { + dji_f32_t q0; /*!< w, rad (when converted to a rotation matrix or Euler angles). */ + dji_f32_t q1; /*!< x, rad (when converted to a rotation matrix or Euler angles). */ + dji_f32_t q2; /*!< y, rad (when converted to a rotation matrix or Euler angles). */ + dji_f32_t q3; /*!< z, rad (when converted to a rotation matrix or Euler angles). */ +} T_DjiFcSubscriptionQuaternion; + +/** + * @brief DJI_FC_SUBSCRIPTION_TOPIC_ACCELERATION_GROUND topic data structure. + */ +typedef T_DjiVector3f T_DjiFcSubscriptionAccelerationGround; + +/** + * @brief DJI_FC_SUBSCRIPTION_TOPIC_ACCELERATION_BODY topic data structure. + */ +typedef T_DjiVector3f T_DjiFcSubscriptionAccelerationBody; + +/** + * @brief DJI_FC_SUBSCRIPTION_TOPIC_ACCELERATION_RAW topic data structure. + */ +typedef T_DjiVector3f T_DjiFcSubscriptionAccelerationRaw; + +/** + * @brief DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY topic data structure. + */ +typedef struct Velocity { + /*! Velocity of aircraft. */ + T_DjiVector3f data; + /*! Health state of aircraft velocity data. It can be any value of ::E_DjiFcSubscriptionDataHealthFlag. */ + uint8_t health: 1; + /*! Reserved. */ + uint8_t reserve: 7; +} T_DjiFcSubscriptionVelocity; + +/** + * @brief DJI_FC_SUBSCRIPTION_TOPIC_ANGULAR_RATE_FUSIONED topic data structure. + */ +typedef T_DjiVector3f T_DjiFcSubscriptionAngularRateFusioned; + +/** + * @brief DJI_FC_SUBSCRIPTION_TOPIC_ANGULAR_RATE_RAW topic data structure. + */ +typedef T_DjiVector3f T_DjiFcSubscriptionAngularRateRaw; + +/** + * @brief DJI_FC_SUBSCRIPTION_TOPIC_ANGULAR_RATE_RAW topic data structure. + */ +typedef dji_f32_t T_DjiFcSubscriptionAltitudeFused; + +/** + * @brief DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_BAROMETER topic data structure. + */ +typedef dji_f32_t T_DjiFcSubscriptionAltitudeBarometer; + +/** + * @brief DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT topic data structure. + */ +typedef dji_f32_t T_DjiFcSubscriptionAltitudeOfHomePoint; + +/** + * @brief DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_FUSION topic data structure. + */ +typedef dji_f32_t T_DjiFcSubscriptionHeightFusion; + +/** + * @brief Relative height above ground topic data structure, unit: m. + */ +typedef dji_f32_t T_DjiFcSubscriptionHeightRelative; + +/** + * @brief Fused position topic data structure. + */ +typedef struct PositionFused { + dji_f64_t longitude; /*!< Longitude, unit: rad. */ + dji_f64_t latitude; /*!< Latitude, unit: rad. */ + dji_f32_t altitude; /*!< Altitude, WGS 84 reference ellipsoid, unit: m. */ + uint16_t visibleSatelliteNumber; /*!< Number of visible satellites. */ +} T_DjiFcSubscriptionPositionFused; + +/** + * @brief GPS date topic data structure, format: yyyymmdd. + */ +typedef uint32_t T_DjiFcSubscriptionGpsDate; + +/** + * @brief GPS time topic data structure, format: hhmmss. + */ +typedef uint32_t T_DjiFcSubscriptionGpsTime; + +/** + * @brief GPS position topic data structure. x = Longitude, y = Latitude, z = Altitude, unit: deg*10-7 + * (Lat,Lon), mm (Alt) + */ +typedef T_DjiVector3d T_DjiFcSubscriptionGpsPosition; + +/** + * @brief GPS velocity topic data structure, unit: cm/s. + */ +typedef T_DjiVector3f T_DjiFcSubscriptionGpsVelocity; + +/** + * @brief GPS details topic data structure. + */ +typedef struct GpsDetail { + dji_f32_t hdop; /*!< Horizontal dilution of precision, unit: 0.01, eg: 100 = 1.00, <1: ideal, 1-2: excellent, 2-5: good, 5-10: moderate, 10-20: fair, >20: poor. */ + dji_f32_t pdop; /*!< Position dilution of precision, unit: 0.01, eg: 100 = 1.00, <1: ideal, 1-2: excellent, 2-5: good, 5-10: moderate, 10-20: fair, >20: poor. */ + dji_f32_t fixState; /*!< GPS fix state, and can be any value of ::E_DjiFcSubscriptionGpsFixState. Value other than ::E_DjiFcSubscriptionGpsFixState is invalid. */ + dji_f32_t vacc; /*!< Vertical position accuracy (mm), the smaller, the better. */ + dji_f32_t hacc; /*!< Horizontal position accuracy (mm), the smaller, the better. */ + dji_f32_t sacc; /*!< Speed accuracy (cm/s), the smaller, the better. */ + uint32_t gpsSatelliteNumberUsed; /*!< Number of GPS satellites used for fixing position. */ + uint32_t glonassSatelliteNumberUsed; /*!< Number of GLONASS satellites used for fixing position. */ + uint16_t totalSatelliteNumberUsed; /*!< Total number of satellites used for fixing position. */ + uint16_t gpsCounter; /*!< Accumulated times of sending GPS data. */ +} T_DjiFcSubscriptionGpsDetails; + +/** + * @brief GPS signal level topic data structure. Signal level of GPS. The level varies from 0 to 5, with 0 being the + * worst and 5 the best GPS signal. + */ +typedef uint8_t T_DjiFcSubscriptionGpsSignalLevel; + +/** + * @brief RTK position topic data structure. + */ +typedef struct PositionData { + dji_f64_t longitude; /*!< Longitude, unit: deg. */ + dji_f64_t latitude; /*!< Latitude, unit: deg. */ + dji_f32_t hfsl; /*!< Height above mean sea level, unit: m. */ +} T_DjiFcSubscriptionRtkPosition; + +/** + * @brief RTK velocity topic data structure, unit: cm/s. + */ +typedef T_DjiVector3f T_DjiFcSubscriptionRtkVelocity; + +/** + * @brief RTK yaw topic data structure, unit: deg. + */ +typedef int16_t T_DjiFcSubscriptionRtkYaw; + +/** + * @brief RTK position information topic data structure. Specifies RTK position solution state, it can be any value of + * ::E_DjiFcSubscriptionPositionSolutionProperty. + */ +typedef uint8_t T_DjiFcSubscriptionRtkPositionInfo; + +/** + * @brief RTK yaw information topic data structure. Specifies RTK yaw solution state, it can be any value of + * ::E_DjiFcSubscriptionPositionSolutionProperty. + */ +typedef uint8_t T_DjiFcSubscriptionRtkYawInfo; + +/*! + * @brief struct for data broadcast, return magnetometer reading + * + * @note returned value is calibrated mag data, + * 1000 < |mag| < 2000 for normal operation + */ +typedef struct Mag { + int16_t x; + int16_t y; + int16_t z; +} T_DjiFcSubscriptionCompass; + +/*! + * @brief struct for data broadcast and data subscription, return RC reading + */ +typedef struct RC { + int16_t roll; /*!< [-10000,10000] */ + int16_t pitch; /*!< [-10000,10000] */ + int16_t yaw; /*!< [-10000,10000] */ + int16_t throttle; /*!< [-10000,10000] */ + int16_t mode; /*!< [-10000,10000] */ + /*!< M100 [P: -8000, A: 0, F: 8000] */ + int16_t gear; /*!< [-10000,10000] */ + /*!< M100 [Up: -10000, Down: -4545] */ +} T_DjiFcSubscriptionRC; + +typedef T_DjiVector3f T_DjiFcSubscriptionGimbalAngles; + +/*! + * @brief struct for TOPIC_GIMBAL_STATUS + */ +typedef struct GimbalStatus { + uint32_t mountStatus: 1; /*!< 1 - gimbal mounted, 0 - gimbal not mounted*/ + uint32_t isBusy: 1; + uint32_t pitchLimited: 1; /*!< 1 - axis reached limit, 0 - no */ + uint32_t rollLimited: 1; /*!< 1 - axis reached limit, 0 - no */ + uint32_t yawLimited: 1; /*!< 1 - axis reached limit, 0 - no */ + uint32_t calibrating: 1; /*!< 1 - calibrating, 0 - no */ + uint32_t prevCalibrationgResult: 1; /*!< 1 - success, 0 - fail */ + uint32_t installedDirection: 1; /*!< 1 - reversed for OSMO, 0 - normal */ + uint32_t disabled_mvo: 1; + uint32_t gear_show_unable: 1; + uint32_t gyroFalut: 1; /*!< 1 - fault, 0 - normal */ + uint32_t escPitchStatus: 1; /*!< 1 - Pitch data is normal, 0 - fault */ + uint32_t escRollStatus: 1; /*!< 1 - Roll data is normal, 0 - fault */ + uint32_t escYawStatus: 1; /*!< 1 - Yaw data is normal , 0 - fault */ + uint32_t droneDataRecv: 1; /*!< 1 - normal , 0 - at fault */ + uint32_t initUnfinished: 1; /*!< 1 - init complete, 0 - not complete */ + uint32_t FWUpdating: 1; /*!< 1 - updating, 0 - not updating */ + uint32_t reserved2: 15; +} T_DjiFcSubscriptionGimbalStatus; + +/** + * @brief Flight status information topic data structure. It can be any value of ::E_DjiFcSubscriptionFlightStatus. + */ +typedef uint8_t T_DjiFcSubscriptionFlightStatus; + +typedef uint8_t T_DjiFcSubscriptionDisplaymode; + +typedef uint8_t T_DjiFcSubscriptionLandinggear; + +typedef uint16_t T_DjiFcSubscriptionMotorStartError; + +typedef struct { + uint32_t reserved: 12; + uint32_t cellBreak: 5; /*!< 0: normal; other: under voltage core index(0x01-0x1F). */ + uint32_t selfCheckError: 3; /*!< enum-type: E_DJIFcSubscriptionBatterySelfCheck. */ + uint32_t reserved1: 7; + uint32_t batteryClosedReason: 5; /*!< enum-type: E_DJIFcSubscriptionBatteryClosedReason. */ + uint8_t reserved2: 6; /*!< 0: CHG state; 1: DSG state; 2: ORING state. */ + uint8_t batSOHState: 2; /*!< enum-type: E_DJIFcSubscriptionBatterySohState. */ + uint8_t maxCycleLimit: 6; /*!< APP: cycle_limit*10. */ + uint8_t reserved3: 2; + uint16_t lessBattery: 1; + uint16_t batteryCommunicationAbnormal: 1; + uint16_t reserved4: 3; + uint16_t hasCellBreak: 1; + uint16_t reserved5: 4; + uint16_t isBatteryEmbed: 1; /*!< 0:embed; 1:not embed. */ + uint16_t heatState: 2; /*!< enum-type: E_DJIFcSubscriptionBatteryHeatState. */ + uint16_t socState: 3; /*!< enum-type: E_DJIFcSubscriptionBatterySocState. */ +} T_DjiFcSubscriptionSingleBatteryState; + +/** + * @brief Battery information topic data structure. + */ +typedef struct BatteryWholeInfo { + uint32_t capacity; /*!< Battery capacity, unit: mAh. */ + int32_t voltage; /*!< Battery voltage, unit: mV. */ + int32_t current; /*!< Battery current, unit: mA. */ + uint8_t percentage; /*!< Battery capacity percentage, unit: 1%. */ +} T_DjiFcSubscriptionWholeBatteryInfo; + +typedef struct BatterySingleInfo { + uint8_t reserve; + uint8_t batteryIndex; + int32_t currentVoltage; /*!< uint: mV. */ + int32_t currentElectric; /*!< uint: mA. */ + uint32_t fullCapacity; /*!< uint: mAh. */ + uint32_t remainedCapacity; /*!< uint: mAh. */ + int16_t batteryTemperature; /*!< uint: 0.1℃. */ + uint8_t cellCount; + uint8_t batteryCapacityPercent; /*!< uint: %. */ + T_DjiFcSubscriptionSingleBatteryState batteryState; + uint8_t reserve1; + uint8_t reserve2; + uint8_t SOP; /*!< Relative power percentage. */ +} T_DjiFcSubscriptionSingleBatteryInfo; + +/*! + * @brief struct for TOPIC_CONTROL_DEVICE and data broadcast, return SDK info + */ +typedef struct SDKCtrlInfo { + union { + /* Used by M300 & M350 */ + struct { + uint8_t controlMode; /*!< enum-type: E_DJIFcSubscriptionControlMode. */ + uint8_t deviceStatus: 3; /*!< 0->rc 1->app 4->psdk */ + uint8_t flightStatus: 1; /*!< 1->open 0->closed */ + uint8_t vrcStatus: 1; + uint8_t reserved: 3; + }; + + /* Used by other aircrafts */ + struct { + uint8_t controlAuthority; /*!< enum-type: E_DJIFcSubscriptionControlAuthority. */ + uint8_t controlAuthorityChangeReason; /*!< enum-type: E_DJIFcSubscriptionAuthorityChangeReason. */ + }; + }; +} T_DjiFcSubscriptionControlDevice; // pack(1) + +/*! + * @brief sub struct for TOPIC_HARD_SYNC + */ +typedef struct SyncTimestamp { + uint32_t time2p5ms; /*!< clock time in multiples of 2.5ms. Sync timer runs at + 400Hz, this field increments in integer steps */ + uint32_t time1ns; /*!< nanosecond time offset from the 2.5ms pulse */ + uint32_t resetTime2p5ms; /*!< clock time in multiple of 2.5ms elapsed since the + hardware sync started */ + uint16_t index; /*!< This is the tag field you filled out when using the + setSyncFreq API above; use it to identify the packets that + have sync data. This is useful when you call the + setSyncFreq API with freqInHz = 0, so you get a single + pulse that can be uniquely identified with a tag - allowing + you to create your own pulse train with uniquely + identifiable pulses. */ + uint8_t flag; /*!< This is true when the packet corresponds to a hardware + pulse and false otherwise. This is useful because you can + request the software packet to be sent at a higher frequency + that the hardware line.*/ +} SyncTimestamp; // pack(1) + +/*! + * @brief struct for TOPIC_HARD_SYNC + */ +typedef struct HardSyncData { + SyncTimestamp ts; /*!< time stamp for the incoming data */ + struct Quaternion q; /*!< quaternion */ + T_DjiVector3f a; /*!< accelerometer reading unit: g */ + T_DjiVector3f w; /*!< gyro reading unit: rad/sec */ +} T_DjiFcSubscriptionHardSync; + +typedef uint8_t T_DjiFcSubscriptionGpsControlLevel; + +/*! + * @brief struct for TOPIC_RC_WITH_FLAG_DATA + */ +typedef struct RCWithFlagData { + dji_f32_t pitch; /*!< down = -0.999, middle = 0.000, up =0.999 */ + dji_f32_t roll; /*!< left = -0.999, middle = 0.000, right=0.999 */ + dji_f32_t yaw; /*!< left = -0.999, middle = 0.000, right=0.999 */ + dji_f32_t throttle; /*!< down = -0.999, middle = 0.000, up =0.999 */ + struct { + uint8_t logicConnected: 1; /*!< 0 if sky or ground side is disconnected for 3 seconds */ + uint8_t skyConnected: 1; /*!< Sky side is connected, i.e., receiver is connected to FC */ + uint8_t groundConnected: 1; /*!< Ground side is connected, i.e., RC is on and connected to FC */ + uint8_t appConnected: 1; /*!< Mobile App is connected to RC */ + uint8_t reserved: 4; + } flag; +} T_DjiFcSubscriptionRCWithFlagData; + +/*! + * @brief struct for status of each individual esc + */ +typedef struct ESCStatusIndividual { + int16_t current; /*!< ESC current, unit: mA */ + int16_t speed; /*!< ESC speed, unit: rpm */ + uint16_t voltage; /*!< Input power from battery to ESC, unit: mV */ + int16_t temperature; /*!< ESC temperature, unit: degree C */ + uint16_t stall: 1; /*!< Motor is stall */ + uint16_t empty: 1; /*!< Motor has no load */ + uint16_t unbalanced: 1; /*!< Motor speed is unbalanced */ + uint16_t escDisconnected: 1; /*!< ESC is disconnected */ + uint16_t temperatureHigh: 1; /*!< Temperature is high */ + uint16_t reserved: 11; +} ESCStatusIndividual; + +/*! + * @brief struct for TOPIC_ESC_DATA + */ +typedef struct EscData { + ESCStatusIndividual esc[8]; +} T_DjiFcSubscriptionEscData; + +/*! + * @brief struct indicating RTK GPS Connection + */ +typedef struct RTKConnectStatus { + uint16_t rtkConnected: 1; + uint16_t reserve: 15; +} T_DjiFcSubscriptionRTKConnectStatus; + +typedef uint8_t T_DjiFcSubscriptionGimbalControlMode; + +/*! + * @brief struct for TOPIC_FLIGHT_ANOMALY + */ +typedef struct FlightAnomaly { + uint32_t impactInAir: 1; /*!< 0: No impact, 1: Impact happens in Air */ + uint32_t randomFly: 1; /*!< 0: Normal, 1: Randomly fly in GPS mode without stick input*/ + uint32_t heightCtrlFail: 1; /*!< 0: Height control normal, 1: Height control failed */ + uint32_t rollPitchCtrlFail: 1; /*!< 0: Tilt control normal, 1: Tilt control failed */ + uint32_t yawCtrlFail: 1; /*!< 0: Yaw control normal, 1: Yaw control failed */ + uint32_t aircraftIsFalling: 1; /*!< 0: Aircraft is not falling, 1: Aircraft is falling */ + uint32_t strongWindLevel1: 1; /*!< 0: Wind is under big wind level 1, 1: wind is stronger than big wind level 1*/ + uint32_t strongWindLevel2: 1; /*!< 0: Wind is under big wind level 2, 1: wind is stronger than big wind level 2*/ + uint32_t compassInstallationError: 1; /*!< 0: Compass install right, 1: Compass install error */ + uint32_t imuInstallationError: 1; /*!< 0: IMU install right, 1: IMU install error */ + uint32_t escTemperatureHigh: 1; /*!< 0: ESC temperature is normal, 1: ESC temperature is high */ + uint32_t atLeastOneEscDisconnected: 1; /*!< 0: No ESC disconnected, 1: At least one ESC is disconnected */ + uint32_t gpsYawError: 1; /*!< 0: No GPS yaw error, 1: GPS yaw error */ + uint32_t reserved: 19; +} T_DjiFcSubscriptionFlightAnomaly; + +/*! + * @brief struct for TOPIC_POSITION_VO + */ +typedef struct PositionVO { + dji_f32_t x; /*!< North (best effort), unit: m */ + dji_f32_t y; /*!< East (best effort), unit: m */ + dji_f32_t z; /*!< Down, unit: m */ + uint8_t xHealth: 1; + uint8_t yHealth: 1; + uint8_t zHealth: 1; + uint8_t reserved: 5; +} T_DjiFcSubscriptionPositionVO; + +/*! + * @brief struct for data broadcast and subscription, return obstacle info around the vehicle + * + */ +typedef struct RelativePosition { + dji_f32_t down; /*!< distance from obstacle (m) */ + dji_f32_t front; /*!< distance from obstacle (m) */ + dji_f32_t right; /*!< distance from obstacle (m) */ + dji_f32_t back; /*!< distance from obstacle (m) */ + dji_f32_t left; /*!< distance from obstacle (m) */ + dji_f32_t up; /*!< distance from obstacle (m) */ + uint8_t downHealth: 1; /*!< Down sensor flag: 0 - not working, 1 - working */ + uint8_t frontHealth: 1; /*!< Front sensor flag: 0 - not working, 1 - working */ + uint8_t rightHealth: 1; /*!< Right sensor flag: 0 - not working, 1 - working */ + uint8_t backHealth: 1; /*!< Back sensor flag: 0 - not working, 1 - working */ + uint8_t leftHealth: 1; /*!< Left sensor flag: 0 - not working, 1 - working */ + uint8_t upHealth: 1; /*!< Up sensor health flag: 0 - not working, 1 - working */ + uint8_t reserved: 2; /*!< Reserved sensor health flag*/ +} T_DjiFcSubscriptionAvoidData; + +/** + * @brief Struct for the topic DJI_FC_SUBSCRIPTION_TOPIC_HOME_POINT_SET_STATUS. Specifies homepoint was set or not, + * it can be any value of ::E_DjiFcSubscriptionHomePointSetStatus. + */ +typedef uint8_t T_DjiFcSubscriptionHomePointSetStatus; + +/** + * @brief Struct for the topic DJI_FC_SUBSCRIPTION_TOPIC_HOME_POINT_INFO. Specifies homepoint. + */ +typedef struct HomeLocationData { + dji_f64_t latitude; /*!< unit: rad */ + dji_f64_t longitude; /*!< unit: rad */ +} T_DjiFcSubscriptionHomePointInfo; // pack(1) + +typedef struct GimbalSingleData { + dji_f32_t roll; + dji_f32_t pitch; + dji_f32_t yaw; +} GimbalAnglesData; + +/** + * @brief Struct for the topic DJI_FC_SUBSCRIPTION_TOPIC_THREE_GIMBAL_DATA. Used in M300 + */ +typedef struct GimbalThreeData { + GimbalAnglesData anglesData[3]; +} T_DjiFcSubscriptionThreeGimbalData; + +/** + * @brief Struct for the topic DJI_FC_SUBSCRIPTION_TOPIC_IMU_ATTI_NAVI_DATA_WITH_TIMESTAMP. Used in M300 + */ +typedef struct ImuAttiNaviDataWithTimestamp { + uint16_t version; + uint16_t flag; + dji_f32_t pn_x; + dji_f32_t pn_y; + dji_f32_t pn_z; + dji_f32_t vn_x; + dji_f32_t vn_y; + dji_f32_t vn_z; + dji_f32_t an_x; + dji_f32_t an_y; + dji_f32_t an_z; + dji_f32_t q[4]; + uint16_t resv; + uint16_t cnt; + uint32_t timestamp; +} T_DjiFcSubscriptionImuAttiNaviDataWithTimestamp; + +#pragma pack() + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise data subscription module in blocking mode. This function has to be called before subscribing any + * data, to initialize run environment of data subscription module, if need to subscribe data from aircraft. + * @note Max execution time of this function is slightly larger than 500ms. + * @note This function has to be called in user task, rather than main() function, and after scheduler being started. + * @return Execution result. + */ +T_DjiReturnCode DjiFcSubscription_Init(void); + +/** + * @brief Deinitialize data subscription module. When data subscription will no longer be used, can call this function + * to deinitialize the data subscription module. Deinitialization function will help to release all system resource data + * subscription has occupied. + * @return Execution result. + */ +T_DjiReturnCode DjiFcSubscription_DeInit(void); + +/** + * @brief Subscribe a topic in blocking mode. Before subscribing any data from aircraft, DjiFcSubscription_Init() + * function has to be called. + * @details User can subscribe a topic by specifying topic name, push frequency and callback function used to receive + * data of topic (if needed). After subscribing successfully, the user can call + * DjiFcSubscription_GetLatestValueOfTopic() function to get the latest data of the topic have been + * subscribed and the corresponding timestamp when aircraft sends the data out, and the callback function will be called to + * push data of the topic and corresponding timestamp if the callback function is specified. + * @note Max execution time of this function is slightly larger than 1200ms. + * @note Topic to be subscribed can not have been subscribed, that is, one topic can not be subscribed repeatedly. + * @note User must ensure that types of subscription frequency of all topics have been subscribed is less than or + * equal to 4. Otherwise, the subscribing topic will fail. + * @note User must ensure that the data length sum of all topics of the same subscription frequency is less than or equal to 242. + * @param topic: topic name to be subscribed. + * @param frequency: subscription frequency of topic to be subscribed. Subscription frequency can not beyond max + * frequency limitation of the topic and must be the value of enum E_DjiFcSubscriptionTopicFreq. And, subscription + * frequency has to be larger than 0. Users can find max frequency of topics in data subscription part of documentation + * on developer website (developer.dji.com). + * @param callback: callback function used to receive data of topic to be subscribed. If the callback function is not needed, + * this item can be set as NULL. + * @return Execution result. + */ +T_DjiReturnCode DjiFcSubscription_SubscribeTopic(E_DjiFcSubscriptionTopic topic, + E_DjiDataSubscriptionTopicFreq frequency, + DjiReceiveDataOfTopicCallback callback); + +/** + * @brief Unsubscribe a topic in blocking mode. Before unsubscribing any data from aircraft, DjiFcSubscription_Init() + * and DjiFcSubscription_SubscribeTopic() function has to be called, + * @details User can unsubscribe a topic by specifying topic name, but the topic must be unsubscribed in the order of subscription. + * @note Topic to be unsubscribed must have been subscribed. + * @note Topic to be unsubscribed must be in the order of subscription, similar to a queue, subscription is similar to enqueue, + * unsubscription is similar to dequeue. + * @param topic: topic name to be unsubscribed. + * @return Execution result. + */ +T_DjiReturnCode DjiFcSubscription_UnSubscribeTopic(E_DjiFcSubscriptionTopic topic); + +/** + * @brief Get the latest data value and timestamp in aircraft time system when sending the data from aircraft of specified + * topic. If the specified topic has not been subscribed successfully, this function will return the error code. + * @note After calling this function, user need transfer type of data pointer that pointer to data of topic to + * corresponding data structure pointer for getting every item of the topic conveniently. + * @param topicName: topic name to be gotten value. + * @param data: pointer to memory space used to store data of the topic. The memory space used to store data of topic + * have to have been allocated correctly and should ensure its size is equal to data structure size corresponding to + * the topic, otherwise, this function will not be able to return data and timestamp (return error code). + * @param dataSizeOfTopic: the size of memory space used to store data of topic. Normally, this size is equal to data + * structure size corresponding to the topic. If this size is not equal to the size of the memory space, may cause memory + * overflow event + * @param timestamp: pointer to memory space used to store timestamps. The memory space used to store timestamps + * have to have been allocated correctly, and should ensure its size is equal to data structure size of timestamp, + * otherwise, this function will not be able to return data and timestamp (return error code) or even cause memory + * overflow event. If the user does not need timestamp information, can fill in NULL. Use flight controller power-on + * timestamp on M300 RTK. Use payload local timestamp on M30/M30T. + * @return Execution result. + */ +T_DjiReturnCode DjiFcSubscription_GetLatestValueOfTopic(E_DjiFcSubscriptionTopic topic, + uint8_t *data, uint16_t dataSizeOfTopic, + T_DjiDataTimestamp *timestamp); +#ifdef __cplusplus +} +#endif + +#endif // DJI_FC_SUBSCRIPTION_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_flight_controller.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_flight_controller.h new file mode 100644 index 0000000..3df46c1 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_flight_controller.h @@ -0,0 +1,657 @@ +/** + ******************************************************************** + * @file dji_flight_controller.h + * @brief This is the header file for "dji_flight_controller.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_FLIGHT_CONTROLLER_H +#define DJI_FLIGHT_CONTROLLER_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +#define EMERGENCY_STOP_MOTOR_MSG_MAX_LENGTH 10 /*!< Max length of emergency stop motor message. */ + +/* Exported types ------------------------------------------------------------*/ +typedef uint16_t E_DjiFlightControllerGoHomeAltitude; /*!< Unit:meter, range 20~500 */ + +/** + * @brief The aircraft's actions when RC is lost. + */ +typedef enum { + DJI_FLIGHT_CONTROLLER_RC_LOST_ACTION_HOVER = 0, /*!< Aircraft will execute hover action when RC is lost. */ + DJI_FLIGHT_CONTROLLER_RC_LOST_ACTION_LANDING = 1, /*!< Aircraft will execute land action when RC is lost. */ + DJI_FLIGHT_CONTROLLER_RC_LOST_ACTION_GOHOME = 2, /*!< Aircraft will execute go-home action when RC is lost. */ +} E_DjiFlightControllerRCLostAction; + +/** + * @brief Enable/Disable RTK position enum + */ +typedef enum { + DJI_FLIGHT_CONTROLLER_DISABLE_RTK_POSITION = 0, /*!< 0: The aircraft will use GPS data instead of RTK data to execute + * actions which requires location information(waypoint, go home...) + */ + DJI_FLIGHT_CONTROLLER_ENABLE_RTK_POSITION = 1, /*!< 1:The aircraft will use RTK data instead of GPS data to execute + * actions which requires location information(waypoint, go home...)*/ +} E_DjiFlightControllerRtkPositionEnableStatus; + +/** + * @brief Enable/Disable obstacle sensing enum + */ +typedef enum { + DJI_FLIGHT_CONTROLLER_DISABLE_OBSTACLE_AVOIDANCE = 0, /*!< 0: The aircraft will not perform obstacle sensing in + * the specified direction */ + DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE = 1, /*!< 0: The aircraft will perform obstacle sensing in the + * specified direction */ +} E_DjiFlightControllerObstacleAvoidanceEnableStatus; + +/** + * @brief Enable/Disable emergency stop motor function enum + * @note Enable emergency-stop-motor function is very dangerous in the air. It will make the aircraft crash!!! + */ +typedef enum { + DJI_FLIGHT_CONTROLLER_ENABLE_EMERGENCY_STOP_MOTOR = 0x01, /*!< Execute emergency-stop-motor action */ +} E_DjiFlightControllerEmergencyStopMotor; + +/** + * @brief Obtain/Release joystick control permission command enum + * @note You have obtained joystick control permission successfully before using joystick. + */ +typedef enum { + DJI_FLIGHT_CONTROLLER_RELEASE_JOYSTICK_CTRL_AUTHORITY = 0, /*!< Obtain joystick permission */ + DJI_FLIGHT_CONTROLLER_OBTAIN_JOYSTICK_CTRL_AUTHORITY = 1, /*!< Release joystick permission */ +} E_DjiFlightControllerJoystickCtrlAuthorityAction; + +/** + * @brief The aircraft's joystick control permission owner enum + */ +typedef enum { + DJI_FLIGHT_CONTROLLER_JOYSTICK_CTRL_AUTHORITY_RC = 0, /*!< RC could control aircraft with joystick. */ + DJI_FLIGHT_CONTROLLER_JOYSTICK_CTRL_AUTHORITY_MSDK = 1, /*!< MSDK could control aircraft with joystick. */ + DJI_FLIGHT_CONTROLLER_JOYSTICK_CTRL_AUTHORITY_INTERNAL = 2, /*!< Special Internal modules could control aircraft + * with joystick. */ + DJI_FLIGHT_CONTROLLER_JOYSTICK_CTRL_AUTHORITY_OSDK = 4, /*!< PSDK could control aircraft with joystick. */ +} E_DjiFlightControllerJoystickCtrlAuthority; + +/** + * @brief The aircraft's joystick control permission switch reason enum + */ +typedef enum { + DJI_FLIGHT_CONTROLLER_MSDK_GET_JOYSTICK_CTRL_AUTH_EVENT = 1, /*!< MSDK gets the joystick control permission. */ + DJI_FLIGHT_CONTROLLER_INTERNAL_GET_JOYSTICK_CTRL_AUTH_EVENT = 2, /*!< A specific internal modules gets the joystick control permission. */ + DJI_FLIGHT_CONTROLLER_OSDK_GET_JOYSTICK_CTRL_AUTH_EVENT = 3, /*!< PSDK gets the joystick control permission. */ + DJI_FLIGHT_CONTROLLER_RC_LOST_GET_JOYSTICK_CTRL_AUTH_EVENT = 4, /*!< Reset the joystick control permission to RC when executing RC lost action */ + DJI_FLIGHT_CONTROLLER_RC_NOT_P_MODE_RESET_JOYSTICK_CTRL_AUTH_EVENT = 5, /*!< Reset the joystick control permission to RC when RC is not in P mode */ + DJI_FLIGHT_CONTROLLER_RC_SWITCH_MODE_GET_JOYSTICK_CTRL_AUTH_EVENT = 6, /*!< Set the joystick control permission to RC when RC switches control mode(T/APS) */ + DJI_FLIGHT_CONTROLLER_RC_PAUSE_GET_JOYSTICK_CTRL_AUTH_EVENT = 7, /*!< Reset the joystick control permission to RC when RC pauses */ + DJI_FLIGHT_CONTROLLER_RC_REQUEST_GO_HOME_GET_JOYSTICK_CTRL_AUTH_EVENT = 8, /*!< Reset the joystick control permission to RC when RC requests to go home*/ + DJI_FLIGHT_CONTROLLER_LOW_BATTERY_GO_HOME_RESET_JOYSTICK_CTRL_AUTH_EVENT = 9, /*!< Reset the joystick control permission to RC when aircraft is executing low-battery-go-home*/ + DJI_FLIGHT_CONTROLLER_LOW_BATTERY_LANDING_RESET_JOYSTICK_CTRL_AUTH_EVENT = 10, /*!< Reset the joystick control permission to RC when aircraft is executing low-battery-landing*/ + DJI_FLIGHT_CONTROLLER_OSDK_LOST_GET_JOYSTICK_CTRL_AUTH_EVENT = 11, /*!< Reset the joystick control permission to RC when PSDK is lost*/ + DJI_FLIGHT_CONTROLLER_NERA_FLIGHT_BOUNDARY_RESET_JOYSTICK_CTRL_AUTH_EVENT = 12, /*!< Reset the joystick control permission to RC when aircraft is near boundary.*/ +} E_DjiFlightControllerJoystickCtrlAuthoritySwitchEvent; + +/** + * @brief The aircraft's joystick control permission switch event info enum + */ +typedef struct { + E_DjiFlightControllerJoystickCtrlAuthority curJoystickCtrlAuthority; /*!< The aircraft's joystick control permission owner */ + E_DjiFlightControllerJoystickCtrlAuthoritySwitchEvent joystickCtrlAuthoritySwitchEvent; /*!< The aircraft's joystick control permission switch reason */ +} T_DjiFlightControllerJoystickCtrlAuthorityEventInfo; + +/** + * @brief Prototype of callback function used to get joystick control permission switch event info. + * @return Execution result. + */ +typedef T_DjiReturnCode (*JoystickCtrlAuthorityEventCbFunc)( + T_DjiFlightControllerJoystickCtrlAuthorityEventInfo eventData); + +/** + * @brief Prototype of callback function used to get the trigger FTS event. + * @return Execution result. + */ +typedef T_DjiReturnCode (*TriggerFtsEventCallback)(void); + +/** + * @brief Horizon control mode in joystick mode enum + * @note Only when the GPS signal is good (health_flag >=3),horizontal position control (DJI_FLIGHT_CONTROLLER_HORIZONTAL_POSITION_CONTROL_MODE) + * related control modes can be used. Only when GPS signal is good (health_flag >=3),or advanced sensing system is working properly with Autopilot, + * horizontal velocity control(DJI_FLIGHT_CONTROLLER_HORIZONTAL_VELOCITY_CONTROL_MODE) related control modes can be used. + */ +typedef enum { + /** + * @brief Control pitch & roll & angle of the aircraft. + * @note Need to be referenced to either the ground or body frame by E_DjiFlightControllerHorizontalCoordinate setting. + * Limit: -35 degree to 35 degree + */ + DJI_FLIGHT_CONTROLLER_HORIZONTAL_ANGLE_CONTROL_MODE = 0, + /** + * @brief Set the control mode to control horizontal vehicle velocities. + * @note Need to be referenced to either the ground or body frame by E_DjiFlightControllerHorizontalCoordinate setting + * Limit: -30m/s to 30 m/s + */ + DJI_FLIGHT_CONTROLLER_HORIZONTAL_VELOCITY_CONTROL_MODE = 1, + /** + * @brief Set the control mode to control position offsets of pitch & roll directions. + * @note Need to be referenced to either the ground or body frame by E_DjiFlightControllerHorizontalCoordinate setting + * Limit: N/A + */ + DJI_FLIGHT_CONTROLLER_HORIZONTAL_POSITION_CONTROL_MODE = 2, + /** + * @brief Set the control mode to control rate of change of the vehicle's attitude. + * @note Need to be referenced to either the ground or body frame by E_DjiFlightControllerHorizontalCoordinate setting + * Limit: -150deg/s to 150.0 deg/s + */ + DJI_FLIGHT_CONTROLLER_HORIZONTAL_ANGULAR_RATE_CONTROL_MODE = 3 +} E_DjiFlightControllerHorizontalControlMode; + +/** + * @brief Vertical control mode enum in joystick mode + * @note We don not recommend using VERTICAL_POSITION control mode indoors when the aircraft's flying height exceeds 3 meters. + * This is because barometer can be inaccurate indoors, and the vertical controller may fail to keep the height of the aircraft. + */ +typedef enum { + /** + * @brief Set the control mode to control the vertical speed of aircraft, setting the upward as positive/ + * @note Limit: -5 m/s to 5 m/s + */ + DJI_FLIGHT_CONTROLLER_VERTICAL_VELOCITY_CONTROL_MODE = 0, + + /** + * @brief Set the control mode to control the height of aircraft + * @note Limit: 0 m to 120 m + */ + DJI_FLIGHT_CONTROLLER_VERTICAL_POSITION_CONTROL_MODE = 1, + + /** + * @brief Set the control mode to directly control the thrust + * @note Range: 0 % to 100 % + */ + DJI_FLIGHT_CONTROLLER_VERTICAL_THRUST_CONTROL_MODE = 2, +} E_DjiFlightControllerVerticalControlMode; + +/** + * @brief Yaw control mode enum in joystick mode + */ +typedef enum { + /** + * @brief Set the control mode to control yaw angle. + * @note Yaw angle is referenced to the ground frame. In this control mode, Ground frame is enforced in Autopilot. + */ + DJI_FLIGHT_CONTROLLER_YAW_ANGLE_CONTROL_MODE = 0x00, + + /** + * @brief Set the control-mode to control yaw angular velocity + * @note Same reference frame as YAW_ANGLE. + * Limit: -150 deg/s to 150 deg/s + */ + DJI_FLIGHT_CONTROLLER_YAW_ANGLE_RATE_CONTROL_MODE = 1 +} E_DjiFlightControllerYawControlMode; + +/** + * @brief Horizontal coordinate enum in joystick mode + */ +typedef enum { + DJI_FLIGHT_CONTROLLER_HORIZONTAL_GROUND_COORDINATE = 0, /*!< Set the x-y of ground frame as the horizontal frame (NEU) */ + DJI_FLIGHT_CONTROLLER_HORIZONTAL_BODY_COORDINATE = 1 /*!< Set the x-y of body frame as the horizontal frame (FRU) */ +} E_DjiFlightControllerHorizontalCoordinate; + +/*! + * @brief Stable mode enum in joystick mode + * @note Only works in horizontal velocity control mode. In velocity stable mode, aircraft will brake and hover at one position once + * the input command is zero. In velocity non-stable mode, aircraft will follow the velocity command and not hover when the command is zero. + * That means aircraft will drift with the wind. + */ +typedef enum { + DJI_FLIGHT_CONTROLLER_STABLE_CONTROL_MODE_DISABLE = 0, /*!< Disable the stable mode */ + DJI_FLIGHT_CONTROLLER_STABLE_CONTROL_MODE_ENABLE = 1 /*!< Enable the stable mode */ +} E_DjiFlightControllerStableControlMode; + +typedef enum { + DJI_FLIGHT_CONTROLLER_ENABLE_RC_LOST_ACTION = 0, + DJI_FLIGHT_CONTROLLER_DISABLE_RC_LOST_ACTION = 1, +} E_DjiFlightControllerRCLostActionEnableStatus; + +/** + * @brief Joystick mode. + * @note You need to set joystick mode first before start to send joystick command to aircraft. + */ +typedef struct { + E_DjiFlightControllerHorizontalControlMode horizontalControlMode; /*!< See reference of E_DjiFlightControllerHorizontalControlMode*/ + E_DjiFlightControllerVerticalControlMode verticalControlMode; /*!< See reference of E_DjiFlightControllerVerticalControlMode*/ + E_DjiFlightControllerYawControlMode yawControlMode; /*!< See reference of E_DjiFlightControllerYawControlMode*/ + E_DjiFlightControllerHorizontalCoordinate horizontalCoordinate; /*!< See reference of E_DjiFlightControllerHorizontalCoordinate*/ + E_DjiFlightControllerStableControlMode stableControlMode; /*!< See reference of E_DjiFlightControllerStableControlMode*/ +} T_DjiFlightControllerJoystickMode; + +#pragma pack(1) +typedef struct { + dji_f32_t x; /*!< Controls the x axis.*/ + dji_f32_t y; /*!< Controls the y axis.*/ + dji_f32_t z; /*!< Controls the z axis, setting upward as positive. */ + dji_f32_t yaw; /*!< Yaw position/velocity control w.r.t. the ground frame.*/ +} T_DjiFlightControllerJoystickCommand;// pack(1) + +typedef struct { + dji_f64_t latitude; /*!< unit: rad */ + dji_f64_t longitude; /*!< unit: rad */ +} T_DjiFlightControllerHomeLocation; // pack(1) + +typedef struct { + char serialNum[32]; +} T_DjiFlightControllerGeneralInfo; + +typedef struct { + dji_f64_t latitude; /*!< unit: rad */ + dji_f64_t longitude; /*!< unit: rad */ + uint16_t altitude; +} T_DjiFlightControllerRidInfo; + +#pragma pack() + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise flight controller module + * @param ridInfo: Must report the correct RID information before using PSDK to control the aircraft. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_Init(T_DjiFlightControllerRidInfo ridInfo); + +/** + * @brief DeInitialise flight controller module. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_DeInit(void); + +/** + * @brief Enable/Disable RTK position function. + * @details Enabling RTK means that RTK data will be used instead of GPS during flight. + * @param rtkEnableStatus: refer to "E_DjiFlightControllerRtkPositionEnableStatus", inheriting from Pilot. + * @return Execution result. + */ +T_DjiReturnCode +DjiFlightController_SetRtkPositionEnableStatus(E_DjiFlightControllerRtkPositionEnableStatus rtkEnableStatus); + +/** + * @brief Get RTK enable status. + * @note Enabling RTK means that RTK data will be used during intelligent flight. + * @param rtkEnableStatus: refer to "E_DjiFlightControllerRtkPositionEnableStatus", inheriting from Pilot. + * @return Execution result. + */ +T_DjiReturnCode +DjiFlightController_GetRtkPositionEnableStatus(E_DjiFlightControllerRtkPositionEnableStatus *rtkEnableStatus); + +/** + * @brief Set RC lost action. + * @note Valid when RC and PSDK are both lost. It only supports M30. + * @param rcLostAction: actions when RC is lost.(hover/landing/go home).It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_SetRCLostAction(E_DjiFlightControllerRCLostAction rcLostAction); + +/** + * @brief Get RC lost action(hover/landing/gohome). + * @note Valid when RC and PSDK are both lost. It only supports M30. + * @param rcLostAction: see reference of E_DjiFlightControllerRCLostAction.It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_GetRCLostAction(E_DjiFlightControllerRCLostAction *rcLostAction); + +/** + * @brief Enable/Disable horizontal visual(forwards,backwards,left,right) obstacle sensing. + * @note For detailed parameters of obstacle sensing, it is recommended to read the official user manual in + * https://www.dji.com. + * @param horizontalObstacleAvoidanceEnableStatus: see reference of E_DjiFlightControllerObstacleAvoidanceEnableStatus. + * It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_SetHorizontalVisualObstacleAvoidanceEnableStatus( + E_DjiFlightControllerObstacleAvoidanceEnableStatus horizontalObstacleAvoidanceEnableStatus); + +/** + * @brief Get the switch status of horizontal visual(forwards,backwards,left,right) obstacle sensing. + * @note For detailed parameters of obstacle sensing, it is recommended to read the official user manual in + * https://www.dji.com. + * @param horizontalObstacleAvoidanceEnableStatus: see reference of E_DjiFlightControllerObstacleAvoidanceEnableStatus. + * It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_GetHorizontalVisualObstacleAvoidanceEnableStatus( + E_DjiFlightControllerObstacleAvoidanceEnableStatus *horizontalObstacleAvoidanceEnableStatus); + +/** + * @brief Enable/Disable horizontal radar obstacle sensing. + * @note It will be valid only if you install CSM radar successfully.For detailed parameters of obstacle sensing, + * it is recommended to read the official user manual in https://www.dji.com. + * @param horizontalObstacleAvoidanceEnableStatus: see reference of E_DjiFlightControllerObstacleAvoidanceEnableStatus. + * It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_SetHorizontalRadarObstacleAvoidanceEnableStatus( + E_DjiFlightControllerObstacleAvoidanceEnableStatus horizontalObstacleAvoidanceEnableStatus); + +/** + * @brief Get the switch status of horizontal radar obstacle sensing. + * @note It will be valid only if you install CSM radar successfully.For detailed parameters of obstacle sensing, + * it is recommended to read the official user manual in https://www.dji.com/uk/matrice-300/downloads. + * @param horizontalObstacleAvoidanceEnableStatus: see reference of E_DjiFlightControllerObstacleAvoidanceEnableStatus. + * It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_GetHorizontalRadarObstacleAvoidanceEnableStatus( + E_DjiFlightControllerObstacleAvoidanceEnableStatus *horizontalObstacleAvoidanceEnableStatus); + +/** + * @brief Enable/Disable upwards visual obstacle sensing. + * @note For detailed parameters of obstacle sensing, it is recommended to read the official user manual in + * https://www.dji.com. + * @param upwardsObstacleAvoidanceEnableStatus: see reference of E_DjiFlightControllerObstacleAvoidanceEnableStatus. + * It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_SetUpwardsVisualObstacleAvoidanceEnableStatus( + E_DjiFlightControllerObstacleAvoidanceEnableStatus upwardsObstacleAvoidanceEnableStatus); + +/** + * @brief Get the switch status of upwards visual obstacle sensing. + * @note For detailed parameters of obstacle sensing, it is recommended to read the official user manual in + * https://www.dji.com. + * @param upwardsObstacleAvoidanceEnableStatus: see reference of E_DjiFlightControllerObstacleAvoidanceEnableStatus. + * It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_GetUpwardsVisualObstacleAvoidanceEnableStatus( + E_DjiFlightControllerObstacleAvoidanceEnableStatus *upwardsObstacleAvoidanceEnableStatus); + +/** + * @brief Enable/Disable upwards radar obstacle sensing. + * @note It will be valid only if you install CSM radar successfully.For detailed parameters of obstacle sensing, + * it is recommended to read the official user manual in https://www.dji.com. + * @param upwardsObstacleAvoidanceEnableStatus: see reference of E_DjiFlightControllerObstacleAvoidanceEnableStatus. + * It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_SetUpwardsRadarObstacleAvoidanceEnableStatus( + E_DjiFlightControllerObstacleAvoidanceEnableStatus upwardsObstacleAvoidanceEnableStatus); + +/** + * @brief Get the switch status of upwards radar obstacle sensing. + * @note For detailed parameters of obstacle sensing, it is recommended to read the official user manual in + * https://www.dji.com. + * @param upwardsObstacleAvoidanceEnableStatus: see reference of E_DjiFlightControllerObstacleAvoidanceEnableStatus. + * It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_GetUpwardsRadarObstacleAvoidanceEnableStatus( + E_DjiFlightControllerObstacleAvoidanceEnableStatus *upwardsObstacleAvoidanceEnableStatus); + +/** + * @brief Enable/Disable downwards visual obstacle sensing. + * @note For detailed parameters of obstacle sensing, it is recommended to read the official user manual in + * https://www.dji.com. + * @param downwardsObstacleAvoidanceEnableStatus: see reference of E_DjiFlightControllerObstacleAvoidanceEnableStatus. + * It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_SetDownwardsVisualObstacleAvoidanceEnableStatus( + E_DjiFlightControllerObstacleAvoidanceEnableStatus downwardsObstacleAvoidanceEnableStatus); + +/** + * @brief Get the switch status of downwards visual obstacle sensing. + * @note For detailed parameters of obstacle sensing, it is recommended to read the official user manual in + * https://www.dji.com. + * @param downwardsObstacleAvoidanceEnableStatus: see reference of E_DjiFlightControllerObstacleAvoidanceEnableStatus. + * It inherits from Pilot's param. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_GetDownwardsVisualObstacleAvoidanceEnableStatus( + E_DjiFlightControllerObstacleAvoidanceEnableStatus *downwardsObstacleAvoidanceEnableStatus); + +/** + * @brief Arrest flying means emergency braking + * @note When the aircraft is on the ground, it will stop motors and display "hms description" on App. when the aircraft is + * in the air, it will continue flying and display "hms description" on App only. + * If you use this interface, you need to use "DjiFlightController_CancelArrestFlying" to quit arrest-flying status, then + * then the aircraft can fly again. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_ArrestFlying(void); + +/** + * @brief Quit status of arrest-flying. + * @note The aircraft need to quit status of arrest-flying to continue flying after arresting flying. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_CancelArrestFlying(void); + +/** + * @brief Turn on motors when the aircraft is on the ground. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_TurnOnMotors(void); + +/** + * @brief Turn off motors when the aircraft is on the ground. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_TurnOffMotors(void); + +/** + * @brief Emergency stop motor in any case. + * @note If you want to turn on motor after emergency stopping motor, you need to use the interface to send disable + * command to quit lock-motor status. + * @param cmd: see reference of E_DjiFlightControllerEmergencyStopMotor + * @param debugMsg:inject debug message to flight control FW for logging, size limit: 10 bytes + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_EmergencyStopMotor(E_DjiFlightControllerEmergencyStopMotor cmd, + char debugMsg[EMERGENCY_STOP_MOTOR_MSG_MAX_LENGTH]); +/** + * @brief Request taking off action when the aircraft is on the ground. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_StartTakeoff(void); + +/** + * @brief Request landing action when the aircraft is in the air. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_StartLanding(void); + +/** + * @brief Request cancelling landing action when the aircraft is landing + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_CancelLanding(void); + +/** + * @brief Confirm the landing when the aircraft is 0.7 m above the ground. + * @note When the clearance between the aircraft and the ground is less than 0.7m, the aircraft will pause landing and + * wait for user's confirmation. This API is for confirm landing. If the ground is not suitable for landing, user + * must use RC to control it landing manually or force landing. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_StartConfirmLanding(void); + +/** + * @brief Force landing in any case. + * @note This API will ignore the smart landing function. When using this API, it will landing directly (would not stop + * at 0.7m and wait user's command). Attention: it may make the aircraft crash!!! + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_StartForceLanding(void); + +/** + * @brief Set customized GPS(not RTK) home location. + * @note Set customized home location failed reason may as follows: + * 1. The distance between new home location and last home location is larger than MAX_FLY_RADIUS(20 km). + * 2. Record initial home location failed after start aircraft. + * @param homeLocation: homeLocation include latitude and longitude + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_SetHomeLocationUsingGPSCoordinates(T_DjiFlightControllerHomeLocation homeLocation); + +/** + * @brief Set home location using current aircraft GPS (not RTK) location. + * @note Set home location failed reasons may as follows: + * 1. Aircraft's gps level can't reach the condition of recording home location. + * 2. Record initial home location failed after start aircraft. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_SetHomeLocationUsingCurrentAircraftLocation(void); + +/** + * @brief Set go home altitude. + * @note If aircraft's current altitude is higher than the setting value of go home altitude, aircraft will go home + * using current altitude. Otherwise, it will climb to setting of go home altitude ,and then execute go home action. + * Go home altitude setting is 20-1500 m. + * @param altitude: go home altitude, unit: meter + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_SetGoHomeAltitude(E_DjiFlightControllerGoHomeAltitude altitude); + +/** + * @brief Get go home altitude. + * @param altitude: go home altitude, unit: meter + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_GetGoHomeAltitude(E_DjiFlightControllerGoHomeAltitude *altitude); + +/** + * @brief Get country code. + * @param countryCode: Pointer of buffer to return country code. The country code indicates the current country or + * region where the aircraft is located. Please refer to the ISO 3166-1 code table for the specific meaning of the + * country code. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_GetCountryCode(uint16_t *countryCode); + +/** + * @brief Request go home action when the aircraft is in the air + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_StartGoHome(void); + +/** + * @brief Request cancel go home action when the aircraft is going home + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_CancelGoHome(void); + +/** + * @brief Obtain aircraft's joystick control permission. + * @note 1.You have to obtain joystick control permission successfully before you using joystick to control aircraft. + * 2. RC must be in p-mode. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_ObtainJoystickCtrlAuthority(void); + +/** + * @brief Release aircraft's joystick control permission. + * @note RC must be in p-mode. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_ReleaseJoystickCtrlAuthority(void); + +/** + * @brief Subscribe to joystick control permission switch event with a callback function. + * @note it will be triggered once the joystick control permission switch event occurs. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_RegJoystickCtrlAuthorityEventCallback(JoystickCtrlAuthorityEventCbFunc callback); + +/** + * @brief Set expected joystick mode before requesting joystick. + * @param joystickMode: include horizontal/vertical/yaw control mode, stable control mode. + */ +void DjiFlightController_SetJoystickMode(T_DjiFlightControllerJoystickMode joystickMode); + +/** + * @brief Request execute joystick action. + * @param joystickCommand: include x/y/z/yaw. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_ExecuteJoystickAction(T_DjiFlightControllerJoystickCommand joystickCommand); + +/** + * @brief Request emergency brake action. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_ExecuteEmergencyBrakeAction(void); + +/** + * @brief Request cancel emergency brake action. + * @note It is only support on M30.If you use DjiFlightController_ExecuteEmergencyBrakeAction(), you need to use + * "DjiFlightController_CancelEmergencyBrakeAction()" to allow aircraft to execute aircraft action again. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_CancelEmergencyBrakeAction(void); + +/** + * @brief Get general info of the aircraft. + * @param generalInfo: the struct stored the serial num which contains a array of chars var in case the user gives an + * illegal length character pointer + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_GetGeneralInfo(T_DjiFlightControllerGeneralInfo *generalInfo); + +/*! @brief The command decides whether execute RC lost action or not when PSDK is running + * @note This setting only affects the behavior of the aircraft when the RC lost and the PSDK is connected. + * if the command is enable, the aircraft will not execute RC lost action when RC is lost but PSDK is running; + * if the command is disable, the aircraft will execute RC lost action when RC is lost but PSDK is running + * the aircraft will execute RC lost action when RC is lost and PSDK is lost whatever the command is. + * default command is disable. + * @param executeRCLostActionOrNotWhenOnboardOn enable:1;disable:0 + * @return T_DjiReturnCode error code + */ +T_DjiReturnCode +DjiFlightController_SetRCLostActionEnableStatus(E_DjiFlightControllerRCLostActionEnableStatus command); + +/*! @brief get RC lost action enable status(enable or disable) + * @param command executeRCLostActionOrNotWhenOnboardOn, enable:1;disable:0 + * @return T_DjiReturnCode error code + */ +T_DjiReturnCode +DjiFlightController_GetEnableRCLostActionStatus(E_DjiFlightControllerRCLostActionEnableStatus *command); + +/** + * @brief Register callback function for the trigger FTS event. + * @note The timing of the trigger of the callback function of the FTS is determined by the aircraft, and the trigger + * execution action of the FTS needs to be implemented in the callback function and the correct return value +* must be returned, otherwise the aircraft will always be triggered. + * @param callback: the callback for the trigger FTS event. + * @return Execution result. + */ +T_DjiReturnCode DjiFlightController_RegTriggerFtsEventCallback(TriggerFtsEventCallback callback); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_FLIGHT_CONTROLLER_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_gimbal.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_gimbal.h new file mode 100644 index 0000000..8abaf1c --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_gimbal.h @@ -0,0 +1,322 @@ +/** + ******************************************************************** + * @file dji_gimbal.h + * @brief DJI gimbal module is used to achieve the third gimbal for developer. The module can be used only when the DJI + * adapter is Skyport, rather than XPort. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_GIMBAL_H +#define DJI_GIMBAL_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Gimbal calibration stage and result. + */ +typedef enum { + DJI_GIMBAL_CALIBRATION_STAGE_COMPLETE = 0, /*!< Calibration have been completed and the result is successful. */ + DJI_GIMBAL_CALIBRATION_STAGE_PROCRESSING = 1, /*!< Gimbal is calibrating. */ + DJI_GIMBAL_CALIBRATION_STAGE_FAILED = 3, /*!< Calibration have been completed and the result is failure. */ +} E_DjiGimbalCalibrationStage; + +/** + * @brief Axis of gimbal. + */ +typedef enum { + DJI_GIMBAL_AXIS_PITCH = 0, /*!< Pitch axis. */ + DJI_GIMBAL_AXIS_ROLL = 1, /*!< Roll axis. */ + DJI_GIMBAL_AXIS_YAW = 2, /*!< Yaw axis. */ +} E_DjiGimbalAxis; + +/** + * @brief Reset mode of gimbal. + */ +typedef enum { + /*! Only reset yaw axis of gimbal. Reset angle of yaw axis to the sum of yaw axis angle of aircraft and fine tune angle + * of yaw axis of gimbal. */ + DJI_GIMBAL_RESET_MODE_YAW = 1, + /*! Reset yaw axis and pitch axis of gimbal. Reset angle of yaw axis to sum of yaw axis angle of aircraft and fine tune + * angle of yaw axis of gimbal, and reset pitch axis angle to the fine tune angle. */ + DJI_GIMBAL_RESET_MODE_PITCH_AND_YAW = 3, + /*! Reset only pitch axis of gimbal. */ + DJI_GIMBAL_RESET_MODE_PITCH_ONLY = 4, + /*! Reset only roll axis of gimbal. */ + DJI_GIMBAL_RESET_MODE_ROLL_ONLY = 5, + /*! Reset only yaw axis of gimbal. */ + DJI_GIMBAL_RESET_MODE_YAW_ONLY = 6, + /*! Reset yaw axis and pitch axis of gimbal. Reset angle of yaw axis to sum of yaw axis angle of aircraft and fine tune + * angle of yaw axis of gimbal, and reset pitch axis angle to sum of -90 degree and fine tune angle if gimbal + * downward, sum of 90 degree and fine tune angle if upward. */ + DJI_GIMBAL_RESET_MODE_PITCH_DOWNWARD_UPWARD_AND_YAW = 11, + /*! Reset pitch axis of gimbal. Reset pitch axis angle to sum of -90 degree and fine tune angle if gimbal downward, + * sum of 90 degree and fine tune angle if upward. */ + DJI_GIMBAL_RESET_MODE_PITCH_DOWNWARD_UPWARD = 12, +} E_DjiGimbalResetMode; + +/** + * @brief Smooth factor of gimbal controller. + */ +typedef struct { + uint8_t pitch; /*!< Smooth factor of pitch axis, range from 0 to 30. */ + uint8_t yaw; /*!< Smooth factor of yaw axis, range from 0 to 30. */ +} T_DjiGimbalControllerSmoothFactor; + +/** + * @brief Max speed percentage of every axis of gimbal. + */ +typedef struct { + uint8_t pitch; /*!< Max speed percentage of pitch axis, range from 1 to 100. */ + uint8_t yaw; /*!< Max speed percentage of yaw axis, range from 1 to 100. */ +} T_DjiGimbalControllerMaxSpeedPercentage; + +/** + * @brief Data structure describes gimbal system state. + */ +typedef struct { + bool resettingFlag; /*!< Specifies whether gimbal is resetting now or not. */ + bool mountedUpward; /*!< Specifies whether gimbal is upward or not. */ + bool blockingFlag; /*!< Specifies whether gimbal is stuck or not. */ + bool pitchRangeExtensionEnabledFlag; /*!< Specifies whether extended angle range of gimbal pitch axis is enabled or not. */ + E_DjiGimbalMode gimbalMode; /*!< Gimbal mode. */ + T_DjiAttitude3d fineTuneAngle; /*!< Fine tune angles, unit: 0.1 degree. */ + T_DjiGimbalControllerSmoothFactor smoothFactor; /*!< Smooth factor of gimbal controller. */ + T_DjiGimbalControllerMaxSpeedPercentage maxSpeedPercentage; /*!< Max speed percentage of gimbal controller. */ +} T_DjiGimbalSystemState; + +/** + * @brief Reach limit flag. + */ +typedef struct { + bool pitch; /*!< Specifies whether gimbal has reached angle limit of pitch axis, if true, reached the limit. */ + bool roll; /*!< Specifies whether gimbal has reached angle limit of roll axis, if true, reached the limit. */ + bool yaw; /*!< Specifies whether gimbal has reached angle limit of yaw axis, if true, reached the limit. */ +} T_DjiGimbalReachLimitFlag; + +/** + * @brief Gimbal attitude related information. + */ +typedef struct { + T_DjiAttitude3d attitude; /*!< Gimbal attitude in the ground coordinate, unit: 0.1 degree. */ + T_DjiGimbalReachLimitFlag reachLimitFlag; /*!< Reach limit flag, being set when the joint angles of gimbal reach limits. */ +} T_DjiGimbalAttitudeInformation; + +/** + * @brief Gimbal calibration state. + */ +typedef struct { + bool calibratingFlag; /*!< Specifies whether gimbal is calibrating now or not. */ + bool lastCalibrationResult; /*!< Result of the last calibration, and true specifies success. */ + uint8_t currentCalibrationProgress; /*!< Progress percentage of current calibration. If gimbal is calibrating now and fill in real progress percentage, if not, fill in zero. The item ranges from 0 to 100. */ + E_DjiGimbalCalibrationStage currentCalibrationStage; /*!< Current calibration stage and result. If gimbal is calibrating now and fill in ::DJI_GIMBAL_CALIBRATION_STAGE_PROCRESSING, if not, fill in result of the last calibration. */ +} T_DjiGimbalCalibrationState; + +/** + * @brief Gimbal rotation command property. + */ +typedef struct { + struct { + bool pitch; /*!< Specifies whether ignore rotation command of pitch axis, and true specifies ignoring. */ + bool roll; /*!< Specifies whether ignore rotation command of roll axis, and true specifies ignoring. */ + bool yaw; /*!< Specifies whether ignore rotation command of yaw axis, and true specifies ignoring. */ + } rotationValueInvalidFlag; /*!< Specifies whether ignore rotation command of some axis, including pitch, roll and yaw. */ + + union { + struct { + uint16_t actionTime; /*!< Action time during which gimbal move to target angles, unit: 0.01s. */ + } relativeAngleRotation; /*!< Property of relative angle rotation command. */ + struct { + uint16_t actionTime; /*!< Action time during which gimbal move to target angles, unit: 0.01s. */ + /*! Joint angle valid flag, specifying whether + * T_DjiGimbalRotationProperty::absoluteAngleRotation::jointAngle is valid when absolute angle control. */ + bool jointAngleValid; + /*! Joint angles of gimbal, unit: 0.1 degree. If + * T_DjiGimbalRotationProperty::absoluteAngleRotation::jointAngleValid is false, specifying here joint + * angles are invalid, and please ignore the joint angles. If joint angles are valid, users should ensure + * that target joint angles of gimbal is approximately the same as the specified value. */ + T_DjiAttitude3d jointAngle; + } absoluteAngleRotation; /*!< Property of absolute angle rotation command. */ + }; +} T_DjiGimbalRotationProperty; + +/** + * @brief Common handler function prototypes of gimbal, that is, some common callback function prototypes of gimbal. + * @warning User can not execute blocking style operations or functions in callback function, because that will block DJI + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef struct { + /*! + * @brief Prototype of callback function used to report system state of gimbal. + * @param systemState: pointer to memory space used to store gimbal system state. + * @return Execution result. + */ + T_DjiReturnCode (*GetSystemState)(T_DjiGimbalSystemState *systemState); + + /*! + * @brief Prototype of callback function used to report attitude information of gimbal. + * @param attitudeInformation: pointer to memory space used to store gimbal attitude information. + * @return Execution result. + */ + T_DjiReturnCode (*GetAttitudeInformation)(T_DjiGimbalAttitudeInformation *attitudeInformation); + + /*! + * @brief Prototype of callback function used to report calibration state of gimbal. + * @param calibrationState: pointer to memory space used to store gimbal calibration state. + * @return Execution result. + */ + T_DjiReturnCode (*GetCalibrationState)(T_DjiGimbalCalibrationState *calibrationState); + + /*! + * @brief Prototype of callback function used to rotate gimbal. Rotation callback function will be called when + * other modules control gimbal. + * @warning User should control execution time of the callback function to be short, because this callback function + * may be called at very high frequency in some scenarios, just like 200Hz. + * @param rotationMode: mode of rotation command. + * @param rotationProperty: property of rotation command. + * @param rotationValue: value of rotation command, unit: 0.1 degree (if rotation mode is + * ::DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE or ::DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE), 0.1 degree/s + * (if rotation mode is ::DJI_GIMBAL_ROTATION_MODE_SPEED). + * @return Execution result. + */ + T_DjiReturnCode (*Rotate)(E_DjiGimbalRotationMode rotationMode, T_DjiGimbalRotationProperty rotationProperty, + T_DjiAttitude3d rotationValue); + + /*! + * @brief Prototype of callback function used to start calibrating gimbal. + * @note Maximum allowable time of gimbal calibration is 120s. If gimbal has not completed calibration during + * 120s, DJI Pilot believe calibration failed. + * @return Execution result. + */ + T_DjiReturnCode (*StartCalibrate)(void); + + /** + * @brief Set smooth factor for gimbal controller, using to smooth control. + * @param smoothingFactor: smooth factor. The larger the value, the smaller the acceleration of gimbal. Recommended + * calculation formula is "acc = 10000 * (0.8 ^ (1 + x)) deg/s^2", x is smooth factor. Range from 0 to 30. + * @param axis: axis to be set. + * @return Execution result. + */ + T_DjiReturnCode (*SetControllerSmoothFactor)(uint8_t smoothingFactor, E_DjiGimbalAxis axis); + + /*! + * @brief Prototype of callback function used to enable or disable extended pitch axis angle range. + * @details Switching the gimbal limit euler angle of pitch axis to the extended limit angle or the default limit + * angle. + * @param enabledFlag: flag specified whether enable or disable extended pitch axis angle range. + * @return Execution result. + */ + T_DjiReturnCode (*SetPitchRangeExtensionEnabled)(bool enabledFlag); + + /** + * @brief Set max speed percentage for gimbal controller. + * @param maxSpeedPercentage: max speed value. Recommended calculation formula is "spd = default_max_spd * x / 100", + * x is default max speed value. Range from 1 to 100. + * @param axis: axis to be set. + * @return Execution result. + */ + T_DjiReturnCode (*SetControllerMaxSpeedPercentage)(uint8_t maxSpeedPercentage, E_DjiGimbalAxis axis); + + /** + * @brief Restore factory settings of gimbal, including fine tune angle, pitch angle extension enable flag and max + * speed etc. + * @return Execution result. + */ + T_DjiReturnCode (*RestoreFactorySettings)(void); + + /*! + * @brief Prototype of callback function used to set gimbal work mode. + * @param mode: gimbal work mode. + * @return Execution result. + */ + T_DjiReturnCode (*SetMode)(E_DjiGimbalMode mode); + + /*! + * @brief Prototype of callback function used to reset gimbal. + * @note Reset command will interrupt rotation process. + * @param mode: Reset mode. + * @return Execution result. + */ + T_DjiReturnCode (*Reset)(E_DjiGimbalResetMode mode); + + /*! + * @brief Prototype of callback function used to fine tune angle of gimbal. + * @param fineTuneAngle: fine tune angle, unit: 0.1 degree. Angle value of greater than 0 specifies rotation + * towards the positive direction of body coordinate. + * @return Execution result. + */ + T_DjiReturnCode (*FineTuneAngle)(T_DjiAttitude3d fineTuneAngle); + + /** + * @brief Prototype of callback function used to report rotation speed of gimbal. + * @note The callback function will be called at 50 Hz. Developers should ensure that, the average rotation speed + * of gimbal within 20 ms after the callback function is called is approximately equal to the reported rotation + * speed. + * @param rotationSpeed: pointer to memory space used to store rotation speed, in body coordinate, unit: + * 0.1 degree/s. + * @return Execution result. + */ + T_DjiReturnCode (*GetRotationSpeed)(T_DjiAttitude3d *rotationSpeed); + + /** + * @brief Prototype of callback function used to report joint angle of gimbal. + * @param jointAngle: pointer to memory space used to store joint angles, unit: 0.1 degree. + * @return Execution result. + */ + T_DjiReturnCode (*GetJointAngle)(T_DjiAttitude3d *jointAngle); +} T_DjiGimbalCommonHandler; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise gimbal module, and user should call this function before using gimbal features. + * @return Execution result. + */ +T_DjiReturnCode DjiGimbal_Init(void); + +/** + * @brief Deinitialise gimbal module. + * @return Execution result. + */ +T_DjiReturnCode DjiGimbal_DeInit(void); + +/** + * @brief Register common handler functions/callback functions of gimbal. After registering, callback functions will be + * called automatically. + * @param commonHandler: pointer to common handler functions of gimbal. + * @return Execution result. + */ +T_DjiReturnCode DjiGimbal_RegCommonHandler(const T_DjiGimbalCommonHandler *commonHandler); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_GIMBAL_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_gimbal_manager.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_gimbal_manager.h new file mode 100644 index 0000000..f38f6b2 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_gimbal_manager.h @@ -0,0 +1,136 @@ +/** + ******************************************************************** + * @file dji_gimbal_manager.h + * @brief This is the header file for "dji_gimbal_manager.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_GIMBAL_MANAGER_H +#define DJI_GIMBAL_MANAGER_H + +/* Includes ------------------------------------------------------------------*/ +#include +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Gimbal manager rotation command property. + */ +typedef struct { + E_DjiGimbalRotationMode rotationMode; /*!< Rotation gimbal mode. */ + dji_f32_t pitch; /*!< Pitch angle in degree, unit: deg */ + dji_f32_t roll; /*!< Roll angle in degree, unit: deg */ + dji_f32_t yaw; /*!< Yaw angle in degree, unit: deg */ + dji_f64_t time; /*!< Expected execution time for gimbal rotation, in seconds. */ +} T_DjiGimbalManagerRotation; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialize the gimbal manager module. + * @note This interface must be initialized after DjiCore_Init. + * @return Execution result. + */ +T_DjiReturnCode DjiGimbalManager_Init(void); + +/** + * @brief DeInitialize the gimbal manager module. + * @return Execution result. + */ +T_DjiReturnCode DjiGimbalManager_Deinit(void); + +/** + * @brief Set the work mode of the gimbal. + * @param mountPosition: gimbal mount position, input limit see enum E_DjiMountPosition + * @param mode: gimbal work mode, input limit see enum E_DjiGimbalMode + * @return Execution result. + */ +T_DjiReturnCode DjiGimbalManager_SetMode(E_DjiMountPosition mountPosition, E_DjiGimbalMode mode); + +/** + * @brief Reset the pitch and yaw of the gimbal. + * @param mountPosition: gimbal mount position, input limit see enum E_DjiMountPosition + * @param mode: reset mode, input limit see enum E_DjiGimbalResetMode + * @return Execution result. + */ +T_DjiReturnCode DjiGimbalManager_Reset(E_DjiMountPosition mountPosition, E_DjiGimbalResetMode resetMode); + +/** + * @brief Rotate the angle of the gimbal. + * @param mountPosition: gimbal mount position, input limit see enum E_DjiMountPosition + * @param rotation: the rotation parameters to be executed on the target gimbal, including the rotation mode, target + * angle value and executed time, refer to T_DjiGimbalManagerRotation + * @return Execution result. + */ +T_DjiReturnCode DjiGimbalManager_Rotate(E_DjiMountPosition mountPosition, T_DjiGimbalManagerRotation rotation); + +/*! + * @brief Prototype of callback function used to enable or disable extended pitch axis angle range. + * @note Switching the gimbal limit euler angle of pitch axis to the extended limit angle or the default limit + * angle. + * @param mountPosition: gimbal mount position, input limit see enum E_DjiMountPosition + * @param enabledFlag: flag specifying whether to enable or disable the extended pitch axis angle range.. + * @return Execution result. + */ +T_DjiReturnCode DjiGimbalManager_SetPitchRangeExtensionEnabled(E_DjiMountPosition mountPosition, bool enabledFlag); + +/** + * @brief Set max speed percentage for gimbal controller. + * @param mountPosition: gimbal mount position, input limit see enum E_DjiMountPosition + * @param axis: axis to be set. + * @param maxSpeedPercentage: max speed value. Recommended calculation formula is "spd = default_max_spd * x / 100", + * where 'x' is the default maximum speed value. Range from 1 to 100. + * @return Execution result. + */ +T_DjiReturnCode DjiGimbalManager_SetControllerMaxSpeedPercentage(E_DjiMountPosition mountPosition, E_DjiGimbalAxis axis, + uint8_t maxSpeedPercentage); + +/** + * @brief Set smooth factor for gimbal controller, using for smooth control. + * @param mountPosition: gimbal mount position, input limit see enum E_DjiMountPosition + * @param axis: axis to be set. + * @param smoothingFactor: smooth factor. A larger value results in slower gimbal acceleration. Recommended + * calculation formula is "acc = 10000 * (0.8 ^ (1 + x)) deg/s^2", x is smooth factor. Range from 0 to 30. + * @return Execution result. + */ +T_DjiReturnCode DjiGimbalManager_SetControllerSmoothFactor(E_DjiMountPosition mountPosition, E_DjiGimbalAxis axis, + uint8_t smoothingFactor); + +/** + * @brief Restore factory settings of gimbal, including fine tune angle, pitch angle extension enable flag and max + * speed etc. + * @param mountPosition: gimbal mount position, input limit see enum E_DjiMountPosition + * @return Execution result. + */ +T_DjiReturnCode DjiGimbalManager_RestoreFactorySettings(E_DjiMountPosition mountPosition); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_GIMBAL_MANAGER_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_high_speed_data_channel.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_high_speed_data_channel.h new file mode 100644 index 0000000..ca22dba --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_high_speed_data_channel.h @@ -0,0 +1,103 @@ + +/** + ******************************************************************** + * @file dji_high_speed_data_channel.h + * @brief This is the header file for "dji_high_speed_data_channel.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_HIGH_SPEED_DATA_CHANNEL_H +#define DJI_HIGH_SPEED_DATA_CHANNEL_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef struct { + uint8_t dataStream; /*!< Bandwidth proportion of data stream, range from 0 to 100. */ + uint8_t videoStream; /*!< Bandwidth proportion of video stream, range from 0 to 100. */ + uint8_t downloadStream; /*!< Bandwidth proportion of download stream, range from 0 to 100. */ +} T_DjiDataChannelBandwidthProportionOfHighspeedChannel; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Set bandwidth proportion for the data stream, video stream and download stream of high-speed channel. + * @details Self-defined bandwidth distribution mechanism allows that user can control bandwidth limitation + * freely. System multiplies total bandwidth limitation of the high-speed channel by a proportion of the corresponding stream to + * get realtime bandwidth limitation of the specified stream. Realtime bandwidth limitation of data and video stream can be + * gotten by PsdkDataTransmission_GetDataStreamState() and PsdkPayloadCamera_GetVideoStreamState() interfaces. Total + * bandwidth of the high-speed channel is determined by the environment in which the system located and loading of system. If + * user does not set bandwidth proportion for each stream, the default proportion is 33% (data stream), 33% (video + * stream) and 34% (download stream). + * @note The bandwidth proportion will be effective after a while, the max value is 1s. If you want use this interface, should calling + * PsdkPlatform_RegHalNetworkHandler interface firstly, otherwise this interface will not work. + * @param bandwidthProportion: bandwidth proportion of each stream of high-speed channel. The Sum of bandwidth proportion + * must equal 100. + * @return Execution result. + */ +T_DjiReturnCode DjiHighSpeedDataChannel_SetBandwidthProportion( + T_DjiDataChannelBandwidthProportionOfHighspeedChannel bandwidthProportion); + +/** + * @brief Get the network remote address for sending data stream. + * @note The interface is used to get the network remote address for sending data stream. You can get this info for another + * heterogeneous system to do somethings. This interface should be used after calling PsdkCore_Init function. + * @param ipAddr: the remote ip address for sending data stream. + * @param port: the remote port for sending data stream. + * @return Execution result. + */ +T_DjiReturnCode DjiHighSpeedDataChannel_GetDataStreamRemoteAddress(char *ipAddr, uint16_t *port); + +/** + * @brief Send data to mobile end via data stream of the data channel. + * @note This function can be used only in Linux operating system. + * @note Must ensure actual bandwidth is less than bandwidth limitation of corresponding channel or stream, please + * refer to developer documentation and state of channel/stream for details related to bandwidth limitation. User can + * get state of "dataStream" channel via PsdkDataTransmission_GetDataStreamState() function. If actual bandwidth + * exceeds the limitation or busy state is set, the user should stop transmitting data or decrease amount of data to be + * sent. Otherwise, data may be discarded. + * @param data: pointer to data to be sent. + * @param len: length of data to be sent via data stream, and it must be less than or equal to 65000, unit: byte. + * @return Execution result. + */ +T_DjiReturnCode DjiHighSpeedDataChannel_SendDataStreamData(const uint8_t *data, uint16_t len); + +/** + * @brief Get data transmission state of "dataStream" channel. User can use the state as base for controlling data + * transmission of data stream. This function exists and can be used only in Linux operation system. + * @param state: pointer to "dataStream" channel state. + * @return Execution result. + */ +T_DjiReturnCode DjiHighSpeedDataChannel_GetDataStreamState(T_DjiDataChannelState *state); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_HIGH_SPEED_DATA_CHANNEL_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms.h new file mode 100644 index 0000000..feef9cc --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms.h @@ -0,0 +1,50 @@ +/** + ******************************************************************** + * @file dji_hms.h + * @brief This is the header file for "dji_hms.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_HMS_H +#define DJI_HMS_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" +#include "dji_hms_customization.h" +#include "dji_hms_manager.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif // DJI_HMS_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_customization.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_customization.h new file mode 100644 index 0000000..287e697 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_customization.h @@ -0,0 +1,133 @@ +/** + ******************************************************************** + * @file dji_hms_customization.h + * @brief This is the header file for "dji_hms_customization.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2018 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_HMS_CUSTOMIZATION_H +#define DJI_HMS_CUSTOMIZATION_H + +/* Includes ------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef enum { + DJI_HMS_ERROR_LEVEL_NONE = 0, + DJI_HMS_ERROR_LEVEL_HINT, + DJI_HMS_ERROR_LEVEL_WARN, + DJI_HMS_ERROR_LEVEL_CRITICAL, + DJI_HMS_ERROR_LEVEL_FATAL, +} E_DjiHmsErrorLevel; + +typedef struct { + char *fileName; /*!< The file name of the hms text config file */ + uint32_t fileSize; /*!< The file size of the hms text config file, uint : byte */ + const uint8_t *fileBinaryArray; /*!< The binary C array of the hms text config file */ +} T_DjiHmsFileBinaryArray; + +typedef struct { + uint16_t binaryArrayCount; /*!< Binary array count. */ + T_DjiHmsFileBinaryArray *fileBinaryArrayList; /*!< Pointer to binary array list */ +} T_DjiHmsBinaryArrayConfig; + + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise hms customization module, and user should call this function + * before using hms customization features. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsCustomization_Init(void); + +/** + * @brief DeInitialize hms manager module. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsCustomization_DeInit(void); + +/** + * @brief Inject custom hms error code to APP. + * @note: For the same hms error code, a single call is enough, no need to call repeatedly. + * @param errorCode: hms error code, value range: [0x1E020000 ~ 0x1E02FFFF]. + * @param errorLevel: hms error level, see reference of E_DjiHmsErrorLevel. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsCustomization_InjectHmsErrorCode(uint32_t errorCode, E_DjiHmsErrorLevel errorLevel); + +/** + * @brief Eliminate custom hms error code to APP. + * @note: For the same hms error code, a single call is enough, no need to call repeatedly. + * @param errorCode: hms error code, value range: [0x1E020000 ~ 0x1E02FFFF]. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsCustomization_EliminateHmsErrorCode(uint32_t errorCode); + +/** + * @brief Register default hms text configuration file by directory path. + * @param configDirPath: the hms text configuration by directory path. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsCustomization_RegDefaultHmsTextConfigByDirPath(const char *configDirPath); + +/** + * @brief Register hms text configuration file by directory path. + * @note Different hms text configurations for several language require the same hms config. + * @param appLanguage: mobile app language type. + * @param configDirPath: the hms text configuration by directory path. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsCustomization_RegHmsTextConfigByDirPath(E_DjiMobileAppLanguage appLanguage, + const char *configDirPath); + +/** + * @brief Register default hms text configuration config by binary array. + * @note In RTOS, most likely there is no file system. The hms text config file content can use C array express. Use this + * function and DjiHms_RegDefaultHmsTextConfigByBinaryArray set hms text configuration. When the language is not cover in + * your setting by DjiHms_RegHmsTextConfigByBinaryArray, the hms text configuration uses setting by this function. + * @param binaryArrayConfig: the binary array config for hms text configuration. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsCustomization_RegDefaultHmsTextConfigByBinaryArray(const T_DjiHmsBinaryArrayConfig + *binaryArrayConfig); + +/** + * @brief Register hms text config by binary array configuration. + * @note Different hms text configurations for several language require the same hms config. + * @param appLanguage: mobile app language type. + * @param binaryArrayConfig: the binary array config for hms text configuration. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsCustomization_RegHmsTextConfigByBinaryArray(E_DjiMobileAppLanguage appLanguage, + const T_DjiHmsBinaryArrayConfig *binaryArrayConfig); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_HMS_CUSTOMIZATION_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_info_table.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_info_table.h new file mode 100644 index 0000000..7c8462a --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_info_table.h @@ -0,0 +1,735 @@ +/** + ******************************************************************** + * @file dji_hms_info_table.h + * @brief This is the header file for "dji_hms_info_table.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_HMS_INFO_TABLE_H +#define DJI_HMS_INFO_TABLE_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef struct { + uint32_t alarmId; /*! error code*/ + const char *groundAlarmInfo; /*! alarm information when the flight is on the ground*/ + const char *flyAlarmInfo; /*! alarm information when the flight is in the air*/ +} T_DjiHmsErrCodeInfo; + +/*! Note: This api header file will not be maintained in the future, please refer to the latest hms error code file in + * the hms sample. + */ +const T_DjiHmsErrCodeInfo hmsErrCodeInfoTbl[] = { + {0x16070035, "Aircraft D-RTK antenna error. Fly with caution", ""}, + {0x16070034, "RTK flight heading inconsistent with other sources. Fly with caution", ""}, + {0x16070033, "D-RTK mobile station moved. Check mobile station and restart aircraft", ""}, + {0x16070032, "D-RTK mobile station detached. Check mobile station and restart aircraft", ""}, + {0x16070031, "D-RTK mobile station switched signal source. Restart aircraft", ""}, + {0x16070030, "RTK firmware version does not match. Update required", ""}, + {0x16070029, "RTK position data changed slightly while aircraft was stationary. Restart aircraft", ""}, + {0x16070028, "RTK and GPS positions do not match. Restart aircraft", ""}, + {0x16070027, "RTK and sensor altitude data inconsistent. Restart aircraft", ""}, + {0x16070026, "Sudden RTK position data change. Restart aircraft", ""}, + {0x16070025, "Unable to refresh RTK position data. Restart aircraft", ""}, + {0x16070024, "RTK data error. Fly with caution", ""}, + {0x16070023, "RTK data refresh frequency error. Fly with caution", ""}, + {0x16070021, "RTK data error. Restart aircraft", ""}, + {0x16070020, "RTK data not received by aircraft. Restart aircraft", ""}, + {0x1a010040, "Downward-left vision sensor connection error", ""}, + {0x1a010041, "Downward-right vision sensor connection error", ""}, + {0x1a010042, "Forward-left vision sensor connection error", ""}, + {0x1a010043, "Forward-right vision sensor connection error", ""}, + {0x1a010044, "Backward-left vision sensor connection error", ""}, + {0x1a010045, "Backward-right vision sensor connection error", ""}, + {0x1a010046, "Upward-left vision sensor connection error", ""}, + {0x1a010047, "Upward-right vision sensor connection error", ""}, + {0x1a010048, "Left-rear vision sensor connection error. Fly with caution", ""}, + {0x1a010049, "Left-front vision sensor connection error. Fly with caution", ""}, + {0x1a01004a, "Right-front vision sensor connection error. Fly with caution", ""}, + {0x1a01004b, "Right-rear vision sensor connection error. Fly with caution", ""}, + {0x1a010080, "Downward-left vision sensor connection error ", ""}, + {0x1a010081, "Downward-right vision sensor connection error", ""}, + {0x1a010082, "Forward-left vision sensor connection error ", ""}, + {0x1a010083, "Forward-right vision sensor connection error ", ""}, + {0x1a010084, "Backward-left vision sensor connection error ", ""}, + {0x1a010085, "Backward-right vision sensor connection error", ""}, + {0x1a010086, "Upward-left vision sensor connection error ", ""}, + {0x1a010087, "Upward-right vision sensor connection error", ""}, + {0x1a010088, "Left-rear vision sensor connection error. Fly with caution", ""}, + {0x1a010089, "Left-front vision sensor connection error. Fly with caution", ""}, + {0x1a01008a, "Right-front vision sensor connection error. Fly with caution", ""}, + {0x1a01008b, "Right-rear vision sensor connection error. Fly with caution", ""}, + {0x1a0100c0, "Downward-left vision sensor connection error ", ""}, + {0x1a0100c1, "Downward-right vision sensor connection error", ""}, + {0x1a0100c2, "Forward-left vision sensor connection error ", ""}, + {0x1a0100c3, "Forward-right vision sensor connection error ", ""}, + {0x1a0100c4, "Backward-left vision sensor connection error ", ""}, + {0x1a0100c5, "Backward-right vision sensor connection error", ""}, + {0x1a0100c6, "Upward-left vision sensor connection error ", ""}, + {0x1a0100c7, "Upward-right vision sensor connection error", ""}, + {0x1a0100c8, "Left-rear vision sensor connection error. Fly with caution", ""}, + {0x1a0100c9, "Left-front vision sensor connection error. Fly with caution", ""}, + {0x1a0100ca, "Right-front vision sensor connection error. Fly with caution", ""}, + {0x1a0100cb, "Right-rear vision sensor connection error. Fly with caution", ""}, + {0x1a020040, "Downward infrared sensor connection error", ""}, + {0x1a020041, "Forward infrared sensor connection error", ""}, + {0x1a020042, "Right infrared sensor connection error", ""}, + {0x1a020043, "Backward infrared sensor connection error", ""}, + {0x1a020044, "Left infrared sensor connection error", ""}, + {0x1a020045, "Upward infrared sensor connection error", ""}, + {0x1a020080, "Downward Infrared Sensor Connection Error", ""}, + {0x1a020081, "Forward infrared sensor connection error", ""}, + {0x1a020082, "Right infrared sensor connection error", ""}, + {0x1a020083, "Backward infrared sensor connection error", ""}, + {0x1a020084, "Left infrared sensor connection error", ""}, + {0x1a020085, "Upward infrared sensor connection error", ""}, + {0x1a0200c0, "Downward Infrared Sensor Connection Error", ""}, + {0x1a0200c1, "Forward infrared sensor connection error", ""}, + {0x1a0200c2, "Right infrared sensor connection error", ""}, + {0x1a0200c3, "Backward infrared sensor connection error", ""}, + {0x1a0200c4, "Left infrared sensor connection error", ""}, + {0x1a0200c5, "Upward infrared sensor connection error", ""}, + {0x1a020100, "Downward infrared sensor calibration error", ""}, + {0x1a020101, "Forward infrared sensor calibration error", ""}, + {0x1a020102, "Right infrared sensor calibration error", ""}, + {0x1a020103, "Backward infrared sensor calibration error", ""}, + {0x1a020104, "Left infrared sensor calibration error", ""}, + {0x1a020105, "Upward infrared sensor calibration error", ""}, + {0x1a020140, "Infrared sensors blocked", ""}, + {0x1a310980, "Vision positioning system error", ""}, + {0x1a310981, "Vision positioning system error", ""}, + {0x1a420040, "Downward obstacle sensing system error", ""}, + {0x1a420041, "Forward obstacle sensing system error", ""}, + {0x1a420042, "Right obstacle sensing system error", ""}, + {0x1a420043, "Backward obstacle sensing system error", ""}, + {0x1a420044, "Left obstacle sensing system error", ""}, + {0x1a420045, "Upward obstacle sensing system error", ""}, + {0x1a420440, "Obstacle sensing system error", ""}, + {0x1a4205c0, "Obstacle sensing system error", ""}, + {0x1a420680, "Obstacle sensing system error", ""}, + {0x1a510380, "Downward vision sensor calibration error", ""}, + {0x1a510381, "Forward vision sensor calibration error", ""}, + {0x1a510382, "Backward vision sensor calibration error", ""}, + {0x1a510383, "Upward vision sensor calibration error", ""}, + {0x1a510384, "Left vision sensor calibration error", ""}, + {0x1a510385, "Right vision sensor calibration error", ""}, + {0x1a5103c0, "Downward vision sensor calibration error", ""}, + {0x1a5103c1, "Forward vision sensor calibration error", ""}, + {0x1a5103c2, "Backward vision sensor calibration error", ""}, + {0x1a5103c3, "Upward vision sensor calibration error", ""}, + {0x1a5103c4, "Left vision sensor calibration error", ""}, + {0x1a5103c5, "Right vision sensor calibration error", ""}, + {0x1a020180, "Infrared sensors overheated. Return to home or land promptly. Move away from high-temperature environment", ""}, + {0x1a420bc0, "Downward ambient light too low. Obstacle avoidance unavailable. Fly with caution", ""}, + {0x1a420bc1, "Forward ambient light too low. Obstacle avoidance unavailable. Fly with caution", ""}, + {0x1a420bc2, "Backward ambient light too low. Backward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420bc3, "Rightward ambient light too low. Rightward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420bc4, "Leftward ambient light too low. Leftward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420bc5, "Upward ambient light too low. Upward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420bc6, "Horizontal ambient light too low. Horizontal obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c00, "Downward ambient light too bright. Downward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c01, "Forward ambient light too bright. Forward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c02, "Backward ambient light too bright. Backward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c03, "Rightward ambient light too bright. Rightward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c04, "Leftward ambient light too bright. Leftward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c05, "Upward ambient light too bright. Upward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c06, "Horizontal ambient light too bright. Horizontal obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c40, "Downward sensor(s) blocked. Downward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c41, "Forward sensor(s) blocked. Forward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c42, "Backward sensor(s) blocked. Backward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c43, "Rightward sensor(s) blocked. Rightward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c44, "Leftward sensor(s) blocked. Leftward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c45, "Upward sensor(s) blocked. Upward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c80, "Downward sensor(s) blurry. Downward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c81, "Forward sensor(s) blurry. Forward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c82, "Backward sensor(s) blurry. Backward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c83, "Right sensor(s) blurry. Rightward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c84, "Left sensor(s) blurry. Leftward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420c85, "Upward sensor(s) blurry. Upward obstacle avoidance unavailable. Only infrared sensors available. Fly with caution", ""}, + {0x1a420cc0, "Aircraft attitude angle too large. Obstacle avoidance unavailable. Fly with caution", ""}, + {0x1a420d00, "Aircraft attitude angle too large. Landing protection unavailable. Land manually", ""}, + {0x1a420d40, "Aircraft approaching obstacle sensing blind spot and may be unable to detect obstacles. Fly with caution", ""}, + {0x1afe0040, "Vision system overloaded. Fly to open area", ""}, + {0x11000020, "Gimbal %index payload voltage too high", ""}, + {0x11000021, "Gimbal %index payload voltage too low", ""}, + {0x11000022, "Gimbal %index battery module overheated", ""}, + {0x11000023, "Gimbal %index battery module temperature too low", ""}, + {0x11000024, "Total payload power too high", ""}, + {0x11000025, "Gimbal %index payload transmission error", ""}, + {0x11000029, "OSDK voltage too high", ""}, + {0x1100002a, "OSDK voltage too low", ""}, + {0x1100002b, "OSDK battery module overheated", ""}, + {0x1100002c, "OSDK battery module temperature too low", ""}, + {0x1100002d, "Total payload power too high", ""}, + {0x16010001, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x16010005, "Sensor system initializing. Wait for initialization to complete", "Sensor system error. Return to home or land"}, + {0x16010007, "Sensor system error. Land promptly", "Sensor system error. Return to home or land"}, + {0x1601000a, "Sensor system initializing. Wait for initialization to complete", "Sensor system error. Return to home or land"}, + {0x1601000d, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x16010010, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x16010016, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x16010019, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x16010041, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x16010032, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x1601002f, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x16010013, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x1601001c, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x1601001f, "Sensor system error. Restart aircraft", "Not Applicable. This string has been deleted"}, + {0x16010022, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x16010025, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x16010028, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x1601002b, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x16020001, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x16020004, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x16020007, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x1602000a, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x1602000d, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x16020016, "IMU bias too large. Calibrate IMU", "IMU error. Return to home or land"}, + {0x1602002a, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x16020027, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x16030004, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x16030007, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x1603000d, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x16030016, "IMU bias too large. Calibrate IMU", "IMU error. Return to home or land"}, + {0x16030001, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x16030013, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x1603000a, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x16030010, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x1603001c, "IMU error. Restart aircraft", "IMU error. Return to home or land"}, + {0x16040001, "Barometer error. Restart aircraft", "Barometer error. Return to home or land"}, + {0x16040004, "Barometer error. Restart aircraft", "Barometer error. Return to home or land"}, + {0x16040007, "Barometer error. Restart aircraft", "Barometer error. Return to home or land"}, + {0x1604000a, "Barometer error. Restart aircraft", "Barometer error. Return to home or land"}, + {0x16040010, "Barometer error. Restart aircraft", "Barometer error. Return to home or land"}, + {0x16040013, "Barometer error. Restart aircraft", "Barometer error. Return to home or land"}, + {0x16040016, "Barometer error. Restart aircraft", "Barometer error. Return to home or land"}, + {0x16040019, "Barometer error. Restart aircraft", "Barometer error. Return to home or land"}, + {0x16050019, "GPS error. Restart aircraft", "GPS error. Return to home or land"}, + {0x16050001, "GPS error. Restart aircraft", "GPS error. Return to home or land"}, + {0x16050004, "GPS error. Restart aircraft", "GPS error. Return to home or land"}, + {0x1605001c, "GPS error. Restart aircraft", "GPS error. Return to home or land"}, + {0x16060001, "Compass error. Restart aircraft", "Compass error. Return to home or land"}, + {0x16060007, "Compass error. Restart aircraft", "Compass error. Return to home or land"}, + {0x1606000a, "Compass error. Restart aircraft", "Compass error. Return to home or land"}, + {0x1606000d, "Compass interference. Calibrate compass", "Compass interference. Move aircraft away from interference source"}, + {0x16060010, "Compass interference. Calibrate compass", "Compass interference. Move aircraft away from interference source"}, + {0x16100001, "Compass error. Unable to take off. Restart aircraft", "Compass error. Return to home or land"}, + {0x16100002, "DJI Assistant connected. Unable to take off. Disconnect before taking off", "DJI Assistant connected. Disconnect before taking off"}, + {0x16100003, "Aircraft not activated or firmware out-of-date. Unable to take off. Activate aircraft or update to latest firmware version", "Device activation or firmware update required"}, + {0x16100006, "Invalid IMU serial number. Unable to take off. Maintenance required", "Invalid IMU serial number. Return to home or land"}, + {0x16100008, "Compass calibrating. Unable to take off. Wait for calibration to complete before taking off(%alarmid)", "Compass calibrating. Wait for calibration to complete before taking off"}, + {0x16100009, "Sensor system initializing. Unable to take off. Wait for initialization to complete before taking off", "Sensor system initializing. Return to home or land"}, + {0x1610000a, "Aircraft in Beginner mode. Unable to take off. Take off in an open outdoor area when in Beginner mode", "Beginner mode enabled. When using Beginner mode, take off in an open, outdoor area"}, + {0x1610000b, "Battery cell error. Unable to take off. Contact DJI Support", "Battery cell error. Return to home or land"}, + {0x1610000c, "Battery communication error. Unable to take off. Reinstall battery", "Battery communication error. Return to home"}, + {0x1610000d, "Critical low battery voltage. Unable to take off. Charge promptly", "Critical low battery voltage. Return to home or land promptly"}, + {0x1610000e, "Critical low battery. Unable to take off. Charge promptly", "Critical low battery. Return to home or land promptly"}, + {0x1610000f, "Critical low battery voltage. Unable to take off. Charge promptly", "Critical low battery voltage. Return to home or land promptly"}, + {0x16100010, "Battery output power insufficient. Unable to take off. Charge promptly", "Battery power output insufficient. Return to home or land"}, + {0x16100011, "Critical low battery. Unable to take off. Charge promptly", "Critical low battery. Return to home or land promptly"}, + {0x16100012, "Battery initializing. Unable to take off. Wait for initialization to complete before taking off", "Battery initialization error. Return to home or land"}, + {0x16100013, "Running Flight Simulator. Unable to take off. Restart aircraft before taking off", "Running Flight Simulator. Restart aircraft before taking off"}, + {0x16100015, "Aircraft pitch angle too large. Unable to take off. Ensure aircraft is level before taking off", "Aircraft pitch angle too large. Ensure aircraft is level before taking off"}, + {0x16100016, "Aircraft not activated. Unable to take off. Restart DJI Pilot and activate aircraft", "Aircraft not activated. Restart DJI Pilot and activate aircraft"}, + {0x16100017, "Aircraft in GEO Zone. Unable to take off. Check map to find Recommended Zones", "Aircraft in GEO Zone. Check map to find Recommended Zones"}, + {0x16100018, "IMU error. Unable to take off. Calibrate IMU", "IMU initialization error. Return to home or land"}, + {0x16100019, "ESC error. Unable to take off. Contact DJI Support", "ESC error. Land immediately"}, + {0x1610001a, "Sensor system initializing. Unable to take off. Wait for initialization to complete before taking off", "Sensor system initializing. Return to home or land"}, + {0x1610001b, "System updating. Unable to take off. Wait for update to complete", "System updating. Wait for update to complete before taking off"}, + {0x1610001c, "Running Flight Simulator. Unable to take off. Restart aircraft before taking off", "Running Flight Simulator. Restart aircraft before taking off"}, + {0x1610001d, "IMU calibrating. Unable to take off. Wait for calibration to complete before takeoff", "Calibrating IMU. Wait for calibration to complete before taking off"}, + {0x1610001e, "Aircraft pitch angle too large. Unable to take off. Ensure aircraft is level before taking off", "Aircraft pitch angle too large. Ensure aircraft is level before taking off"}, + {0x16100029, "Invalid aircraft serial number. Unable to take off. Contact your local dealer or DJI Support", "Invalid aircraft serial number. Return to home or land"}, + {0x1610002d, "GPS disconnected. Unable to take off. Restart aircraft", "GPS disconnected. Return to home or land"}, + {0x1610002f, "Data recorder error. Unable to take off. Restart aircraft", "Data recorder error. Return to home or land"}, + {0x16100030, "Aircraft model and firmware version do not match. Unable to take off. Contact your local dealer or DJI Support.", "Aircraft model and firmware version do not match. Return to home or land"}, + {0x1610003d, "Sensor system disconnected. Unable to take off. Restart aircraft", "Sensor system disconnected. Return to home or land"}, + {0x1610004a, "Sensor system error. Unable to take off. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x1610004b, "Sensor system error. Unable to take off. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x1610004d, "Flight controller data error. Unable to take off. Restart aircraft", "Flight controller data error. Return to home or land"}, + {0x1610004e, "Not enough batteries installed. Unable to take off. Insert two batteries before taking off", "Insufficient batteries. Install two batteries before taking off"}, + {0x1610004f, "Battery authentication failed. Unable to take off. Replace with DJI battery", "Battery authentication failed. Replace with standard DJI battery"}, + {0x16100051, "Large voltage difference between batteries. Unable to take off. Replace batteries with new ones of a similar capacity", "Large voltage difference between batteries. Return to home or land. Replace batteries with new ones of a similar capacity and try again"}, + {0x16100053, "Aircraft module firmware versions do not match. Unable to take off. Update to latest firmware versions.", "Aircraft module firmware versions do not match. Update to latest firmware versions"}, + {0x16100054, "Gimbal error. Unable to take off. Contact DJI Support", "Gimbal error. Return to home or land"}, + {0x16100055, "Gimbal error. Unable to take off. Contact DJI Support", "Gimbal error. Return to home or land"}, + {0x16100056, "Gimbal error. Unable to take off. Contact DJI Support", "Gimbal error. Return to home or land"}, + {0x16100057, "Gimbal error. Unable to take off. Contact DJI Support", "Gimbal error. Return to home or land"}, + {0x16100058, "Gimbal firmware updating. Unable to take off...", "Gimbal firmware update in progress"}, + {0x1610005d, "IMU calibration successful. Unable to take off. Restarting aircraft required", "IMU calibration error. Return to home or land"}, + {0x1610005e, "Aircraft rolled during takeoff. Unable to take off. Check whether propellers were installed correctly", "Aircraft rolled during takeoff. Check whether propellers are installed correctly"}, + {0x1610005f, "Motor stalled. Unable to take off. Power off aircraft and check whether motor can rotate freely", "Motor stalled. Land promptly. Power off airfcraft and check whether motor can rotate freely"}, + {0x16100060, "Motor rotation speed error. Unable to take off. Restart aircraft", "Motor rotation speed error. Land and restart aircraft"}, + {0x16100061, "Motor idle. Unable to take off. Check whether propellers are detached or installed incorrectly", "Motor idle. Unable to take off. Check whether propellers are detached or installed incorrectly"}, + {0x16100062, "Unable to turn on motor. Unable to take off. Check aircraft status and restart", "Unable to turn on aircraft motor(s). Check aircraft status and restart"}, + {0x16100063, "Auto Takeoff failed. Unable to take off", "Auto Takeoff failed"}, + {0x16100064, "Aircraft rolled over. Unable to take off. Restart aircraft and ensure it is level before taking off", "Aircraft rolled over. Return to home or land"}, + {0x16100065, "Battery firmware version error. Unable to take off. Replace battery or update battery firmware to latest version", "Battery firmware version error. Replace battery or update to the latest firmware version"}, + {0x16100066, "RTK signal weak. Unable to take off. Move to an open area for takeoff or turn off RTK", "RTK signal weak. Move to an open area for takeoff or turn off RTK"}, + {0x16100067, "Compass interference. Unable to take off. Calibrate compass", "Compass interference. Move away from interference source"}, + {0x16100068, "ESC short-circuited. Unable to take off. Restart aircraft", "ESC short-circuited. Restart aircraft"}, + {0x16100069, "ESC auto-check error. Unable to take off. Restart aircraft", "ESC auto-check error. Return to home or land"}, + {0x16100071, "GPS error. Unable to take off. Restart aircraft", "GPS error. Return to home or land"}, + {0x16100072, "Gimbal calibrating. Unable to take off", "Gimbal calibration error. Return to home or land"}, + {0x16100073, "Takeoff conditions not met. Unable to take off. Firmware out-of-date or flight route uploading to aircraft", "Firmware out of date or flight route uploading to aircraft. Return to home or land"}, + {0x16100074, "Takeoff altitude error. Unable to take off. Restart aircraft", "Takeoff altitude error. Restart aircraft"}, + {0x16100075, "ESC firmware versions do not match. Unable to take off. Update to latest firmware version", "ESC firmware versions do not match. Update to latest firmware versions"}, + {0x16100076, "IMU error. Unable to take off. Contact DJI Support", "IMU error. Return to home or land"}, + {0x16100078, "Compass error. Unable to take off. Contact DJI Support", "Compass error. Return to home or land"}, + {0x1610007a, "ESC beeping. Unable to take off. Restart aircraft before taking off", "ESC beeping. Return to home or land"}, + {0x1610007b, "ESC overheated. Unable to take off. Power off aircraft and wait for temperature to return to normal", "ESC overheated. Land promptly. Power off aircraft and wait for temperature to return to normal"}, + {0x1610007d, "Impact detected. Takeoff failed and aircraft landed. Unable to take off. Restart aircraft", "Impact detected. Aircraft landed. Restart aircraft"}, + {0x1610007f, "Impact detected. Unable to take off. Restart aircraft", "Impact detected. Return to home or land"}, + {0x16100080, "Aircraft altitude control error. Unable to take off. Restart aircraft", "Aircraft altitude control error. RTH or land"}, + {0x16100081, "Battery firmware out-of-date. Unable to take off. Update to latest firmware version", "Battery firmware version out of date. Return to home or land. Update to latest firmware version"}, + {0x16100082, "Large voltage different between battery cells. Unable to take off. Battery maintenance required", "Large difference in battery cell voltage detected. Return to home or land. Battery maintenance required"}, + {0x16100083, "Battery installed incorrectly. Unable to take off. Turn battery locker to its limit and ensure both batteries are installed correctly", "Battery installed incorrectly. Return to home or land. Turn battery locker to its limit and ensure both batteries are installed correctly"}, + {0x16100084, "Upper fan error. Unable to take off. Check whether fan is stalled or making strange noises", "Upper fan error. Return to home or land. Check whether fan is stalled or making strange noises"}, + {0x16100085, "Aircraft overheated. Unable to take off. Power off aircraft and wait for temperature to return to normal", "Aircraft overheated. Return to home or land. Power off aircraft and wait for temperature to return to normal"}, + {0x16100087, "Emergency Propeller Stop triggered. Unable to take off", "Emergency Propeller Stop triggered"}, + {0x16100088, " Control sticks not centered. Unable to take off. Ensure control sticks are centered", "Takeoff failed. Control sticks not centered. Ensure control sticks are centered"}, + {0x16100089, "Security code verification failed. Unable to take off. Re-enter code", "Security code verification failed. Unable to take off. Re-enter verification code"}, + {0x1610008a, "Flight controller unit error. Unable to take off. Restart aircraft", "Flight controller unit error. Return to home or land"}, + {0x1610008f, "Aircraft antenna satellite signal searching error. Unable to take off. Move to an open area for takeoff", "Aircraft antenna satellite signal searching error. Fly with caution"}, + {0x16100091, "Flight prohibited in current area. Unable to take off", "Flying prohibited in current area. Return to home or land"}, + {0x16100092, "Battery capacity error. Unable to take off. Battery maintenance required", "Battery capacity error. Return to home or land. Battery maintenance required"}, + {0x16100099, "Gimbal starting error. Unable to take off. Check whether gimbal can rotate freely and restart aircraft", "Gimbal startup error. Return to home or land. Check whether gimbal can rotate freely and restart aircraft"}, + {0x1610009a, "Excessive gimbal vibration. Unable to take off. Check whether gimbal can rotate freely or is damaged. Restart aircraft", "Excessive gimbal vibration. Return to home or land. Check whether gimbal can rotate freely or is damaged. Restart aircraft"}, + {0x1610009f, "Flight controller unit error. Unable to take off. Restart aircraft", "Flight controller unit error. Return to home or land"}, + {0x161000c8, "Unable to take off. Check whether aircraft is connected to DJI Assistant or system is updating", "Check whether aircraft is connected to DJI Assistant or system is updating"}, + {0x161000c9, "Unable to take off. Check whether aircraft is connected to DJI Assistant or system is updating", "Check whether aircraft is connected to DJI Assistant or system is updating"}, + {0x16000001, "Flight controller overloaded. Unable to take off. Restart aircraft", "Flight controller overloaded. If the issue persists, land aircraft promptly"}, + {0x16100090, "Sensor system error. Restart aircraft", "Sensor system error. Return to home or land"}, + {0x161000a1, "Unable to take off. Check whether frame arm sleeves are tightened securely", "Land promptly and check whether frame arm sleeves are tightened securely"}, + {0x161000a2, "Lower fan error. Unable to take off. Check whether fan is stalled or making strange noises", "Lower fan error. Land promptly and check whether fan is stalled or making strange noises"}, + {0x161000a6, "Remote controller battery low. Unable to take off. Recharge battery", "Remote controller battery low. Return to home or land promptly"}, + {0x16000002, "Flight data record abnorma.If the warning persists, contact your local dealer or DJI Support.", "Flight data record abnorma.If the warning persists, contact your local dealer or DJI Support."}, + {0x1d010001, "Gimbal stuck", ""}, + {0x1d010002, "Gimbal auto-check failed", ""}, + {0x1d010003, "Gimbal motor overloaded", ""}, + {0x1d020001, "Gimbal calibration error", ""}, + {0x1d030001, "Gimbal unable to retrieve aircraft data", ""}, + {0x1d040001, "Excessive gimbal vibration", ""}, + {0x1d040002, "Gimbal sensor error", ""}, + {0x1d040004, "Gimbal ESC malfunctioned", ""}, + {0x1d040003, "Gimbal ESC malfunctioned", ""}, + {0x1d040005, "Gimbal ESC malfunctioned", ""}, + {0x1d050003, "Gimbal %component_index pan axis endpoint reached", ""}, + {0x1d050002, "Gimbal %component_index pitch axis endpoint reached", ""}, + {0x1d050001, "Gimbal %component_index roll axis endpoint reached", ""}, + {0x1d001001, "Gimbal unresponsive after power on", ""}, + {0x1d100002, "Gimbal unresponsive after power on", ""}, + {0x1d100006, "Gimbal unresponsive after power on", ""}, + {0x1d001101, "Gimbal unable to complete auto check", ""}, + {0x1d110002, "Gimbal unable to complete auto check", ""}, + {0x1d110005, "Gimbal unable to complete auto check", ""}, + {0x1d120001, "Error detected during gimbal auto check", ""}, + {0x1d120002, "Error detected during gimbal auto check", ""}, + {0x1d120004, "Error detected during gimbal auto check", ""}, + {0x1d120006, "Error detected during gimbal auto check", ""}, + {0x1d130003, "Excessive gimbal vibration", ""}, + {0x1d130005, "Excessive gimbal vibration", ""}, + {0x1d13000a, "Excessive gimbal vibration", ""}, + {0x1d140001, "Gimbal motor overloaded", ""}, + {0x1d150002, "Gimbal drifting", ""}, + {0x1d150003, "Gimbal drifting", ""}, + {0x1d150004, "Gimbal drifting", ""}, + {0x1d150005, "Gimbal drifting", ""}, + {0x1d160004, "Camera tilted", ""}, + {0x1d170001, "Gimbal error", ""}, + {0x1d180001, "Gimbal calibration data error", ""}, + {0x1d190002, "Gimbal update failed", ""}, + {0x1d010003, "Gimbal motor overloaded", ""}, + {0x1d050a01, "Gimbal voltage too low", ""}, + {0x1d05030f, "Gimbal rotation count approaching max limit", ""}, + {0x1d050301, "Gimbal operation retry attempts limit exceeded", ""}, + {0x1d050302, "Camera exposure error", ""}, + {0x1d050a02, "Gimbal time synchronization error", ""}, + {0x110b0001, "Battery %index overcurrent. Check for heavy payload and reduce excessive motion during flight", ""}, + {0x110b0002, "Battery %index overheated. Return to home promptly and wait for battery temperature to return to normal before use", ""}, + {0x110b0003, "Battery %index temperature too low. Warm up battery to 5°C or higher", ""}, + {0x110b0006, "Battery %index cell damaged. Stop using this battery and contact DJI Support", ""}, + {0x110b0011, "Battery %index data communication error. Reinstall battery. If the issue persists, replace battery", ""}, + {0x110b0004, "Battery %index short-circuited during discharge. Replace battery", ""}, + {0x110b0005, "Battery %index cell voltage low. Replace battery", ""}, + {0x110b0012, "Battery %index requires maintenance", ""}, + {0x110b0015, "Battery %index requires maintenance to ensure flight safety", ""}, + {0x110b0016, "Battery %index requires maintenance to ensure flight safety", ""}, + {0x110b0017, "Battery %index requires maintenance to ensure flight safety", ""}, + {0x110b0018, "Battery %index requires maintenance to ensure flight safety", ""}, + {0x110b0019, "Battery %index requires maintenance to ensure flight safety", ""}, + {0x110b001a, "Battery %index requires maintenance to ensure flight safety", ""}, + {0x110b001b, "Battery %index requires maintenance to ensure flight safety", ""}, + {0x110b0007, "Battery %index damaged. Stop using this battery and contact DJI Support", ""}, + {0x110b0008, "Battery %index damaged. Stop using this battery and contact DJI Support", ""}, + {0x110b0009, "Battery %index damaged. Stop using this battery and contact DJI Support", ""}, + {0x110b000a, "Battery %index damaged. Stop using this battery and contact DJI Support", ""}, + {0x110b000b, "Battery %index damaged. Stop using this battery and contact DJI Support", ""}, + {0x110b000c, "Battery %index damaged. Stop using this battery and contact DJI Support", ""}, + {0x110b000d, "Battery %index damaged. Stop using this battery and contact DJI Support", ""}, + {0x110b000f, "Battery %index capacity significantly decreased. Continuing use poses serious safety risks", ""}, + {0x110b0010, "Safety requirements not met. Dispose of Battery %index properly", ""}, + {0x110b0013, "Battery not detected in slot %index. Insert or replace battery", "Battery not detected in slot %index. Return to home or land promptly "}, + {0x110b001c, "Batteries do not match. Replace with matching batteries", ""}, + {0x110b0014, "Battery %index auto-heating", ""}, + {0x110b000e, "Battery %index self-discharged during storage", ""}, + {0x110b001d, "Discharge error detected for battery in slot %index. Return to home or land promptly", ""}, + {0x110b001e, "Discharge error detected for battery in slot %index. Return to home or land promptly", ""}, + {0x16080020, "Motor %index stalled. Land aircraft immediately", ""}, + {0x16080021, "ESC %index short-circuited. Land immediately and restart aircraft", ""}, + {0x16080022, "ESC %index overloaded. Land aircraft immediately", ""}, + {0x16080023, "Motor %index communication error. Land immediately and restart aircraft", ""}, + {0x16080024, "Motor %index over-accelerating. Stop pressing control stick", ""}, + {0x16080025, "Motor %index communication error", ""}, + {0x16080026, "Motor %index communication error", ""}, + {0x16080027, "Motor %index communication error", ""}, + {0x16080028, "Motor %index communication error", ""}, + {0x16080029, "Motor %index propeller detached or installed incorrectly", ""}, + {0x1608002a, "ESC %index overheated", ""}, + {0x1608002b, "ESC %index overheated", ""}, + {0x1608002c, "ESC %index voltage too high", ""}, + {0x1608002d, "ESC %index voltage too low", ""}, + {0x1608002e, "ESC %index flash memory error", ""}, + {0x1608002f, "ESC %index auto-check error", ""}, + {0x16080030, "ESC %index auto-check error", ""}, + {0x16080031, "ESC %index auto-check error", ""}, + {0x16080032, "ESC %index auto-check error", ""}, + {0x16080033, "ESC %index auto-check error", ""}, + {0x16080034, "ESC %index auto-check error", ""}, + {0x16080035, "ESC %index auto-check error", ""}, + {0x16080036, "ESC %index auto-check error", ""}, + {0x16080037, "ESC %index auto-check error", ""}, + {0x16080038, "ESC %index auto-check error", ""}, + {0x16080039, "ESC %index auto-check error", ""}, + {0x16080040, "ESC %index auto-check error", ""}, + {0x16080041, "ESC %index auto-check error", ""}, + {0x16080042, "ESC %index auto-check error", ""}, + {0x16080043, "ESC %index auto-check error", ""}, + {0x16080044, "ESC %index voltage too low", ""}, + {0x16080045, "ESC %index voltage too high", ""}, + {0x16080046, "ESC %index auto-check error", ""}, + {0x16080047, "ESC %index auto-check error", ""}, + {0x16080048, "ESC %index auto-check error", ""}, + {0x16080049, "ESC %index auto-check error", ""}, + {0x1e000001, "Payload %component_index startup error", ""}, + {0x1e000002, "Payload %component_index communication error", ""}, + {0x1e000003, "Payload %component_index overheated", ""}, + {0x1e000004, "Payload %component_index hardware error", ""}, + {0x1b010001, "Navigation system error. Restart aircraft", ""}, + {0x1b010002, "Smart Track unavailable for current payload", ""}, + {0x1b010003, "Camera mode error. Smart Track unavailable", ""}, + {0x1b010004, "Target too close", ""}, + {0x1b010005, "Target lost. Smart Track stopped", ""}, + {0x1b010006, "Switched to gimbal free mode. Use the RC to control aircraft yaw.", ""}, + {0x1b010007, "Smart Track stopped. Switch to P mode", ""}, + {0x1b010008, "Enabling Smart Track failed", ""}, + {0x1b010009, "Obstacle detected. Circling stopped. Manually control aircraft to avoid obstacle", ""}, + {0x1b01000a, "GEO Zone nearby. Circling stopped. Manually control aircraft to avoid GEO Zone", ""}, + {0x1b01000b, "Smart Track paused", ""}, + {0x1b01000c, "Target moving too fast. Circling stopped", ""}, + {0x1b010401, "Target too far away. Smart Track stopped", ""}, + {0x1b010402, "Camera data sending error. Smart Track paused. Restart camera", ""}, + {0x1b010403, "Camera data sending error. Smart Track paused. Restart camera", ""}, + {0x1b010404, "Camera data sending error. Smart Track paused. Restart camera", ""}, + {0x1b010405, "Camera data sending error. Smart Track paused. Restart camera", ""}, + {0x1b010406, "Camera data sending error. Smart Track paused. Restart camera", ""}, + {0x1b010407, "Camera data sending error. Smart Track paused. Restart camera", ""}, + {0x1b010408, "Camera data sending error. Smart Track paused. Restart camera", ""}, + {0x1b010801, "Camera parameters changed. Smart Track stopped", ""}, + {0x1b010802, "DJI Pilot error. Smart Track paused. Restart DJI Pilot", ""}, + {0x1b010803, "DJI Pilot error. Smart Track paused. Restart DJI Pilot", ""}, + {0x1b010c01, "Target lost. Smart Track stopped", ""}, + {0x1b010c02, "Flight Controller data sending error. Smart Track paused. Restart aircraft", ""}, + {0x1b010c03, "Flight Controller data sending error. Smart Track paused. Restart aircraft", ""}, + {0x1b011001, "Gimbal data sending error. Smart Track stopped. Reinstall payload", ""}, + {0x1b011002, "Gimbal data sending error. Smart Track paused. Reinstall payload", ""}, + {0x1b011003, "Gimbal data sending error. Smart Track paused. Reinstall payload", ""}, + {0x1b011801, "Remote controller data sending error. Smart Track stopped. Restart RC", ""}, + {0x1b011802, "Remote controller data sending error. Smart Track stopped. Check connection between RC and aircraft", ""}, + {0x1b030001, "Obstacle detected. RTH stopped. Manually control aircraft to avoid obstacle", ""}, + {0x1b030002, "GEO Zone nearby. RTH stopped. Manually control aircraft to avoid GEO Zone", ""}, + {0x1b030003, "RTH error. Fly aircraft manually", ""}, + {0x1b030004, "Remote controller disconnected. Failsafe RTH in progress", ""}, + {0x1b030005, "Enabling RTH Obstacle Check failed. Control aircraft to return to home manually", ""}, + {0x1b030c02, "GPS signal weak. RTH accuracy affected. Manual RTH recommended", ""}, + {0x1b033001, "RTH Obstacle Check error. Control aircraft to return to home manually", ""}, + {0x1b040001, "AI Spot-Check unavailable with current payload", ""}, + {0x1b040002, "AI Spot-Check failed. Switched to normal shooting mode", ""}, + {0x1b040003, "AI Spot-Check failed. Switched to normal shooting mode", ""}, + {0x1b040004, "Camera not mounted. AI Spot-Check failed", ""}, + {0x1b040401, "Camera focusing timed out. AI Spot-Check failed. Restart camera", ""}, + {0x1b040402, "Switching shooting modes failed. AI Spot-Check failed. Restart camera", ""}, + {0x1b040403, "Camera zoom timed out. AI Spot-Check failed. Restart camera", ""}, + {0x1b040801, "Unable to locate AI Spot-Check sample. Reupload flight route", ""}, + {0x1b040802, "Target box parameter error. Readjust target box", ""}, + {0x1b041001, "Gimbal error. AI Spot-Check failed. Reinstall payload", ""}, + {0x1b090001, "Smart Track stopped", ""}, + {0x1b090002, "Target tracking stopped", ""}, + {0x1b090003, "Target tracking stopped", ""}, + {0x1b092c01, "Target identification error", ""}, + {0x1b092c02, "Target identification error", ""}, + {0x1b092c03, "Target identification error", ""}, + {0x1b092c04, "Target identification error", ""}, + {0x1b092c05, "Target identification error", ""}, + {0x1b092c06, "Target identification error", ""}, + {0x1b092c07, "Target identification error", ""}, + {0x1b092c08, "Target identification error", ""}, + {0x1b092c09, "Target identification error", ""}, + {0x1b092c0a, "Target identification error", ""}, + {0x1b092c0b, "Target identification error", ""}, + {0x1b092c0c, "Target identification error", ""}, + {0x1b092c0d, "Target identification error", ""}, + {0x1b092c0e, "Target identification error", ""}, + {0x1b092c0f, "Target identification error", ""}, + {0x1b092c10, "Target identification error", ""}, + {0x1b092c11, "Target identification error", ""}, + {0x1b092c12, "Target identification error", ""}, + {0x1b092c13, "Target identification error", ""}, + {0x1b092c14, "Target identification error", ""}, + {0x1b092c15, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c16, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c17, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c18, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c19, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c1a, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c1b, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c1c, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c1d, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c1e, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c1f, "Enabling Smart Track failed. Ensure selected target is valid", ""}, + {0x1b092c20, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b092c21, "Enabling Smart Track failed. Reduce selected area", ""}, + {0x1b092c22, "Enabling Smart Track failed. Increase selected area", ""}, + {0x1b092c23, "Enabling Smart Track failed. Ensure selected target is valid", ""}, + {0x1b092c24, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093001, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093002, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093003, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093004, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093005, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093006, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093007, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093008, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093009, "Enabling Smart Track failed. Increase selected area", ""}, + {0x1b09300a, "Enabling Smart Track failed. Ensure selected target is valid", ""}, + {0x1b09300b, "Target lost. Smart Track stopped", ""}, + {0x1b09300c, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b09300d, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b09300e, "Camera parameters changed. Smart Track stopped", ""}, + {0x1b09300f, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093010, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093011, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093012, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093013, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093014, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093015, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093016, "Target lost. Exited Smart Track", ""}, + {0x1b093017, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b093018, "Target too far away. Smart Track stopped", ""}, + {0x1b093019, "Camera parameters changed. Exited Smart Track", ""}, + {0x1b09301a, "Enabling Smart Track failed. Check and try again", ""}, + {0x1b01000d, "Unusual target movement. Drag-select target again", ""}, + {0x1b01000e, "GPS signal weak and vision positioning unavailable. Aircraft switched to A mode. Control aircraft manually", ""}, + {0x1b01000f, "Target lost. Searching...", ""}, + {0x1b010010, "During Smart Track, you can control gimbals within a certain limit", ""}, + {0x1b010011, "During Smart Track, you can control lens zoom within a certain limit", ""}, + {0x1f0b0001, "Aircraft unable to use LTE Transmission. Network connection unstable or SIM card unable to connect to network", ""}, + {0x1f0b0002, "Remote controller unable to use LTE Transmission. Network connection unstable or SIM card unable to connect to network", ""}, + {0x1f0b0003, "LTE Server and LTE Transmission unavailable", ""}, + {0x1f0b0004, "LTE Server and LTE Transmission unavailable", ""}, + {0x1f0b0005, "LTE Transmission unavailable. Check and ensure remote controller and aircraft are linked properly", ""}, + {0x1f0b0006, "LTE Transmission unavailable. Restart remote controller", ""}, + {0x1f0b0007, "LTE Transmission unavailable. Check aircraft 4G Dongle network connectivity", ""}, + {0x1f0b0008, "LTE Transmission unavailable. Restart aircraft and remote controller", ""}, + {0x1f0b0009, "LTE Transmission unavailable. Restart remote controller", ""}, + {0x1f0b001a, "LTE Transmission unavailable. Check aircraft 4G Dongle network connectivity", ""}, + {0x1f0b001b, "LTE Transmission unavailable. Restart aircraft and remote controller", ""}, + {0x1f0b0016, "LTE Transmission unavailable. Check remote controller network connectivity", ""}, + {0x1f0b0017, "LTE Transmission unavailable. Check remote controller network connectivity", ""}, + {0x1f0b0018, "LTE Transmission unavailable. Restart aircraft and remote controller", ""}, + {0x1c200001, "Camera %component_index overheated. Wait for temperature to return to normal before use", ""}, + {0x1c100001, "Camera %component_index overheated. Wait for temperature to return to normal before use", ""}, + {0x1c300001, "Camera %component_index overheated. Wait for temperature to return to normal before use", ""}, + {0x1c200101, "Camera %component_index error. Restart camera", ""}, + {0x1c200102, "Camera %component_index error. Restart camera", ""}, + {0x1c200103, "Camera chip overheated. Power off aircraft and wait for temperature to return to normal before use", "Camera processor overheated. Return to home or land promptly. Wait for temperature to return to normal before use"}, + {0x1c200104, "Camera chip overheated. Power off aircraft and wait for temperature to return to normal before use", "Camera processor overheated. Return to home or land promptly. Wait for temperature to return to normal before use"}, + {0x1c200105, "Camera %component_index error. Restart camera", ""}, + {0x1c100101, "Camera %component_index error. Restart camera", ""}, + {0x1c100102, "Camera %component_index error. Restart camera", ""}, + {0x1c100103, "Camera chip overheated. Power off aircraft and wait for temperature to return to normal before use", "Camera processor overheated. Return to home or land promptly. Wait for temperature to return to normal before use"}, + {0x1c100104, "Camera chip overheated. Power off aircraft and wait for temperature to return to normal before use", "Camera processor overheated. Return to home or land promptly. Wait for temperature to return to normal before use"}, + {0x1c100105, "Camera %component_index error. Restart camera", ""}, + {0x1c300101, "Camera %component_index error. Restart camera", ""}, + {0x1c300102, "Camera %component_index error. Restart camera", ""}, + {0x1c300103, "Camera chip overheated. Power off aircraft and wait for temperature to return to normal before use", "Camera processor overheated. Return to home or land promptly. Wait for temperature to return to normal before use"}, + {0x1c300104, "Camera chip overheated. Power off aircraft and wait for temperature to return to normal before use", "Camera processor overheated. Return to home or land promptly. Wait for temperature to return to normal before use"}, + {0x1c300105, "Camera %component_index error. Restart camera", ""}, + {0x1c200201, "Camera %component_index error. Restart camera", ""}, + {0x1c200202, "Camera %component_index error. Restart camera", ""}, + {0x1c200203, "Camera chip overheated. Power off aircraft and wait for temperature to return to normal before use", "Camera processor overheated. Return to home or land promptly. Wait for temperature to return to normal before use"}, + {0x1c200204, "H20 camera image transmission sensor processor error", ""}, + {0x1c100201, "H20 camera image transmission sensor processor error", ""}, + {0x1c100202, "H20 camera image transmission sensor processor error", ""}, + {0x1c100203, "Camera chip overheated. Power off aircraft and wait for temperature to return to normal before use", "Camera processor overheated. Return to home or land promptly. Wait for temperature to return to normal before use"}, + {0x1c100204, "H20 camera image transmission sensor processor error", ""}, + {0x1c200301, "H20 camera lens error. Restart camera", ""}, + {0x1c200302, "H20 camera lens error. Restart camera", ""}, + {0x1c200303, "H20 camera lens error. Restart camera", ""}, + {0x1c200304, "H20 camera lens error. Restart camera", ""}, + {0x1c100301, "H20 camera lens error. Restart camera", ""}, + {0x1c100302, "H20 camera lens error. Restart camera", ""}, + {0x1c100303, "H20 camera lens error. Restart camera", ""}, + {0x1c100304, "H20 camera lens error. Restart camera", ""}, + {0x1c300301, "H20 camera lens error. Restart camera", ""}, + {0x1c300302, "H20 camera lens error. Restart camera", ""}, + {0x1c300303, "H20 camera lens error. Restart camera", ""}, + {0x1c300304, "H20 camera lens error. Restart camera", ""}, + {0x1c200401, "Invalid SD card. Replace card", ""}, + {0x1c200403, "SD card error. Replace card", ""}, + {0x1c100401, "Invalid SD card. Replace SD card", ""}, + {0x1c100403, "SD card error. Change card", ""}, + {0x1c300401, "Invalid SD card. Replace SD card", ""}, + {0x1c300403, "SD card error. Change card", ""}, + {0x1c300601, "Temperature of current environment too low. Enable temperature measurement when temperature is within normal range", ""}, + {0x1c300602, "Temperature of current evironment too high. Only enable temperature measurement when temperature is within normal range", ""}, + {0x1c300603, "Zenmuse H20T infrared thermal camera switching modes...", ""}, + {0x1c300604, "Zenmuse H20T infrared thermal camera calibration data missing", ""}, + {0x1c300605, "Zenmuse H20T infrared thermal camera initialization error. Restart camera", ""}, + {0x1c300606, "Temperature measurement failed. Adjust camera parameters and try again", ""}, + {0x1c300701, "Sensor protection enabled. Infrared thermal camera shutter closed", ""}, + {0x1c100405, "Confirm SD card read and write permissions", ""}, + {0x1c200405, "Confirm SD card read and write permissions", ""}, + {0x1c300405, "Confirm SD card read and write permissions", ""}, + {0x1c100406, "SD card not formatted. Format SD card before use", ""}, + {0x1c200406, "SD card not formatted. Format SD card before use", ""}, + {0x1c300406, "SD card not formatted. Format SD card before use", ""}, + {0x1c100407, "SD card formatting. Please wait", ""}, + {0x1c200407, "SD card formatting. Please wait", ""}, + {0x1c300407, "SD card formatting. Please wait", ""}, + {0x1c100408, "SD card file system not supported. Format card and try again", ""}, + {0x1c200408, "SD card file system not supported. Format card and try again", ""}, + {0x1c300408, "SD card file system not supported. Format card and try again", ""}, + {0x1c100409, "SD card refreshing. Please wait", ""}, + {0x1c200409, "SD card refreshing. Please wait", ""}, + {0x1c300409, "SD card refreshing. Please wait", ""}, + {0x1c10040a, "SD card full. Clear space", ""}, + {0x1c20040a, "SD card full. Clear space", ""}, + {0x1c30040a, "SD card full. Clear space", ""}, + {0x1c10040b, "SD card memory overflow. Format SD card and restart camera", ""}, + {0x1c20040b, "SD card memory overflow. Format SD card and restart camera", ""}, + {0x1c30040b, "SD card memory overflow. Format SD card and restart camera", ""}, + {0x1c10040c, "SD card initializing. Please wait", ""}, + {0x1c20040c, "SD card initializing. Please wait", ""}, + {0x1c30040c, "SD card initializing. Please wait", ""}, + {0x1c10040d, "SD card error. Format SD card before use", ""}, + {0x1c20040d, "SD card error. Format SD card before use", ""}, + {0x1c30040d, "SD card error. Format SD card before use", ""}, + {0x1c10040e, "SD card repair in progress. Please wait", ""}, + {0x1c20040e, "SD card repair in progress. Please wait", ""}, + {0x1c30040e, "SD card repair in progress. Please wait", ""}, + {0x1c10040f, "SD card read and write speed low. Please wait", ""}, + {0x1c20040f, "SD card read and write speed low. Please wait", ""}, + {0x1c30040f, "SD card read and write speed low. Please wait", ""}, + {0x1c000103, "Camera processor overheated. Power off aircraft. Wait for processor to cool down before use", "Camera processor overheated. Return to home or land promptly. Wait for processor to cool down before use"}, + {0x1c000401, "Invalid SD card. Replace card", ""}, + {0x1c000402, "SD card speed low. Replace with faster SD card", ""}, + {0x1c000403, "SD card error. Replace card", ""}, + {0x1c000404, "No SD card", ""}, + {0x1c000405, "Confirm SD card read and write permissions ", ""}, + {0x1c00040e, "SD card write speed slow", ""}, + {0x1c000407, "SD card formatting. Please wait ", ""}, + {0x1c000408, "SD card file system not supported. Format card before use ", ""}, + {0x1c00040a, "SD card full. Clear space ", ""}, + {0x1c00040b, "SD card memory overflow. Format card and restart camera ", ""}, + {0x1c00040c, "SD card initializing. Please wait ", ""}, + {0x1c00040d, "SD card error. Format card before use ", ""}, + {0x1c000303, "Camera lens error. Restart camera ", ""}, + {0x1c000305, "Shutter trigger count reached 100K design limit", ""}, + {0x1c000306, "Certain features unavailable for current camera", ""}, + {0x1c000d01, "Focusing failed", ""}, + {0x1c000204, "Camera image sensor overheated", ""}, + {0x1c000d03, "Infinity focus calibration data expired. Recalibrate", ""}, + {0x1c000d02, "Loading camera calibration file failed", ""}, + {0x1c000e01, "Calibration parameters do not match camera or lens", ""}, + {0x1c000e02, "Update camera intrinsic parameter calibration data", ""}, + {0x1c000901, "PPS signal sending error", ""}, + {0x1c000902, "Camera time synchronization error", ""}, + {0x14010042, "Payload IMU warming up. Wait until IMU is warmed up", ""}, + {0x14010043, "Payload IMU temperature controlling processor error. Restart payload", ""}, + {0x14010044, "Payload IMU overheated. Restart payload", ""}, + {0x14010045, "Payload IMU overheated. Restart payload", ""}, + {0x19000001, "Avionics system overloaded. Check whether logs are being transmitted. Restart aircraft to restore", "Avionics system overloaded. Fly with caution"}, + {0x19000002, "Avionics system overloaded. Check whether logs are being transmitted. Restart aircraft to restore", "Avionics system overloaded. Fly with caution"}, + {0x17000001, "Avionics system overloaded. Restart aircraft to restore", "Avionics system overloaded. Fly with caution"}, + {0x19000011, "Avionics system memory insufficient. Restart aircraft to restore", "Avionics system memory insufficient. Fly with caution"}, + {0x19000012, "Avionics system memory insufficient. Restart aircraft to restore", "Avionics system memory insufficient. Fly with caution"}, + {0x17000011, "Avionics system memory insufficient. Restart aircraft to restore", "Avionics system memory insufficient. Fly with caution"}, + {0x19000021, "Avionics system error. Restart aircraft to restore", "Avionics system error. Fly with caution"}, + {0x19000022, "Avionics system error. Restart aircraft to restore", "Avionics system error. Fly with caution"}, + {0x15000020, "Radar temperature too low. Check and make sure temperature of current environment is within normal range", ""}, + {0x15000021, "Radar overheated. Check and make sure temperature of current environment is within normal range", ""}, + {0x15080020, "Radar overheated. Check and make sure temperature of current environment is within normal range", ""}, + {0x15090020, "Radar overheated. Check and make sure temperature of current environment is within normal range", ""}, + {0x15020020, "Radar motor error. Check whether radar motor is blocked", ""}, + {0x15020021, "Radar motor error. Check whether radar motor is blocked", ""}, + {0x15020022, "Radar motor error. Check whether radar motor is blocked", ""}, + {0x15040020, "Radar motor error. Check whether radar motor is blocked", ""}, + {0x15040021, "Radar motor error. Check whether radar motor is blocked", ""}, + {0x15110020, "Radar motor error. Check whether radar motor is blocked", ""}, + {0x15060020, "Radar motor error. Check whether radar motor is blocked", ""}, + {0x15010020, "Radar internal power supply error. Restart radar", ""}, + {0x15010021, "Radar internal power supply error. Restart radar", ""}, + {0x15010022, "Radar internal power supply error. Restart radar", ""}, + {0x15010023, "Radar internal power supply error. Restart radar", ""}, + {0x15030020, "Radar communication link unstable. Check for strong interference in the surrounding area", ""}, + {0x15030021, "Radar communication link unstable. Check for strong interference in the surrounding area", ""}, + {0x15030022, "Radar communication link unstable. Check for strong interference in the surrounding area", ""}, + {0x15030023, "Starting radar timed out. Check for strong interference in the surrounding area", ""}, + {0x15030024, "Radar communication link unstable. Check for strong interference in the surrounding area", ""}, + {0x15030025, "Radar communication link unstable. Check for strong interference in the surrounding area", ""}, + {0x15030026, "Radar communication link unstable. Check for strong interference in the surrounding area", ""}, + {0x15100020, "Radar communication link unstable. Check for strong interference in the surrounding area", ""}, + {0x15100021, "Radar communication link unstable. Check for strong interference in the surrounding area", ""}, + {0x15100022, "Radar communication link unstable. Check for strong interference in the surrounding area", ""}, + {0x15070020, "Radar communication link unstable. Check for strong interference in the surrounding area", ""}, + {0x15140020, "Radar RF clock error. Return to home immediately and check radar", ""}, + {0x15020023, "Radar detection capability error. Check firmware version", ""}, + {0x15130021, "Radar detection capability error. Check firmware version", ""}, + {0x15090021, "Radar firmware error. Restart radar", ""}, +}; + +/* Exported functions --------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif + +#endif // DJI_HMS_INFO_TABLE_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_manager.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_manager.h new file mode 100644 index 0000000..d86faa5 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_hms_manager.h @@ -0,0 +1,80 @@ +/** + ******************************************************************** + * @file dji_hms_manager.h + * @brief This is the header file for "dji_hms_manager.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2018 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_HMS_MANAGER_H +#define DJI_HMS_MANAGER_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef struct { + uint32_t errorCode; + uint8_t componentIndex; + uint8_t errorLevel; +} T_DjiHmsInfo; + +typedef struct { + T_DjiHmsInfo *hmsInfo; + uint32_t hmsInfoNum; +} T_DjiHmsInfoTable; + +typedef T_DjiReturnCode (*DjiHmsInfoCallback)(T_DjiHmsInfoTable hmsInfoTable); + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise hms manager module, and user should call this function + * before using hms manager features. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsManager_Init(void); + +/** + * @brief DeInitialize hms manager module. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsManager_DeInit(void); + +/** + * @brief Register callback to get hms info. + * @note: Data is pushed with a frequency of 1Hz. + * @param callback: see reference of DjiHmsInfoCallback. + * @return Execution result. + */ +T_DjiReturnCode DjiHmsManager_RegHmsInfoCallback(DjiHmsInfoCallback callback); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_HMS_MANAGER_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_interest_point.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_interest_point.h new file mode 100644 index 0000000..00f3d9c --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_interest_point.h @@ -0,0 +1,74 @@ +/** + ******************************************************************** + * @file dji_interest_point.h + * @version V1.0.0 + * @date 2020/11/19 + * @brief This is the header file for "dji_interest_point.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_INTEREST_POINT_H +#define DJI_INTEREST_POINT_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_platform.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef struct { + dji_f32_t curSpeed; + dji_f32_t radius; + uint8_t state; +} T_DjiInterestPointMissionState; + +typedef struct { + dji_f64_t latitude; + dji_f64_t longitude; + dji_f32_t speed; +} T_DjiInterestPointSettings; + +typedef T_DjiReturnCode (*InterestPointMissionStateCallback)(T_DjiInterestPointMissionState missionState); + +/* Exported functions --------------------------------------------------------*/ +T_DjiReturnCode DjiInterestPoint_Init(void); + +T_DjiReturnCode DjiInterestPoint_DeInit(void); + +T_DjiReturnCode DjiInterestPoint_Start(T_DjiInterestPointSettings settings); + +T_DjiReturnCode DjiInterestPoint_Stop(void); + +T_DjiReturnCode DjiInterestPoint_SetSpeed(dji_f32_t speed); + +T_DjiReturnCode DjiInterestPoint_RegMissionStateCallback(InterestPointMissionStateCallback callback); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_INTEREST_POINT_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_liveview.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_liveview.h new file mode 100644 index 0000000..d4ec109 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_liveview.h @@ -0,0 +1,127 @@ +/** + ******************************************************************** + * @file dji_liveview.h + * @brief This is the header file for "dji_liveview.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_LIVEVIEW_H +#define DJI_LIVEVIEW_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Liveview camera mount position. + */ +typedef enum { + DJI_LIVEVIEW_CAMERA_POSITION_NO_1 = DJI_MOUNT_POSITION_PAYLOAD_PORT_NO1, + DJI_LIVEVIEW_CAMERA_POSITION_NO_2 = DJI_MOUNT_POSITION_PAYLOAD_PORT_NO2, + DJI_LIVEVIEW_CAMERA_POSITION_NO_3 = DJI_MOUNT_POSITION_PAYLOAD_PORT_NO3, + DJI_LIVEVIEW_CAMERA_POSITION_FPV = 7 +} E_DjiLiveViewCameraPosition; + +/** + * @brief Liveview camera stream source. + */ +typedef enum { + DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT = 0, + DJI_LIVEVIEW_CAMERA_SOURCE_H20_WIDE = 1, + DJI_LIVEVIEW_CAMERA_SOURCE_H20_ZOOM = 2, + DJI_LIVEVIEW_CAMERA_SOURCE_H20T_WIDE = 1, + DJI_LIVEVIEW_CAMERA_SOURCE_H20T_ZOOM = 2, + DJI_LIVEVIEW_CAMERA_SOURCE_H20T_IR = 3, + DJI_LIVEVIEW_CAMERA_SOURCE_H20N_WIDE = 1, + DJI_LIVEVIEW_CAMERA_SOURCE_H20N_ZOOM = 2, + DJI_LIVEVIEW_CAMERA_SOURCE_H20N_IR = 3, + DJI_LIVEVIEW_CAMERA_SOURCE_M30_ZOOM = 1, + DJI_LIVEVIEW_CAMERA_SOURCE_M30_WIDE = 2, + DJI_LIVEVIEW_CAMERA_SOURCE_M30T_ZOOM = 1, + DJI_LIVEVIEW_CAMERA_SOURCE_M30T_WIDE = 2, + DJI_LIVEVIEW_CAMERA_SOURCE_M30T_IR = 3, + DJI_LIVEVIEW_CAMERA_SOURCE_M3E_VIS = 1, + DJI_LIVEVIEW_CAMERA_SOURCE_M3T_VIS = 1, + DJI_LIVEVIEW_CAMERA_SOURCE_M3T_IR = 2, + DJI_LIVEVIEW_CAMERA_SOURCE_M3D_VIS = 1, + DJI_LIVEVIEW_CAMERA_SOURCE_M3TD_VIS = 1, + DJI_LIVEVIEW_CAMERA_SOURCE_M3TD_IR = 2, +} E_DjiLiveViewCameraSource; + +/** + * @brief Liveview camera h264 stream callback. + */ +typedef void (*DjiLiveview_H264Callback)(E_DjiLiveViewCameraPosition position, const uint8_t *buf, uint32_t len); + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialize the liveview module. + * @note Must be called after DjiCore_Init. + * @return Execution result. + */ +T_DjiReturnCode DjiLiveview_Init(void); + +/** + * @brief Deinitialize the liveview module. + * @return Execution result. + */ +T_DjiReturnCode DjiLiveview_Deinit(void); + +/** + * @brief Start the FPV or camera H264 stream from the specified position. + * @param position: Camera position for the H264 stream output. + * @param source: sub-camera source for the H264 stream output. + * @param callback: Callback function in a callback thread when a new h264 frame is received + * @return Execution result. + */ +T_DjiReturnCode DjiLiveview_StartH264Stream(E_DjiLiveViewCameraPosition position, E_DjiLiveViewCameraSource source, + DjiLiveview_H264Callback callback); + +/** + * @brief Stop the FPV or Camera H264 Stream from the specified position. + * @param position: Camera position for the H264 stream output. + * @param source: sub-camera source for the H264 stream output. + * @return Execution result. + */ +T_DjiReturnCode DjiLiveview_StopH264Stream(E_DjiLiveViewCameraPosition position, E_DjiLiveViewCameraSource source); + +/** + * @brief Request the intraframe Frame of camera H264 stream from the specified position. + * @param position: Camera position for the H264 stream output. + * @param source: sub-camera source for the H264 stream output. + * @return Execution result. + */ +T_DjiReturnCode DjiLiveview_RequestIntraframeFrameData(E_DjiLiveViewCameraPosition position, + E_DjiLiveViewCameraSource source); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_LIVEVIEW_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_logger.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_logger.h new file mode 100644 index 0000000..0ee2142 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_logger.h @@ -0,0 +1,119 @@ +/** + ******************************************************************** + * @file dji_logger.h + * @brief This is the header file for "dji_logger.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_LOGGER_H +#define DJI_LOGGER_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_platform.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/** +* @brief The console method that needs to be registered. +* @note Before registering the console method, you need to test the methods that need to be registered to ensure +* that they can be used normally. +*/ +typedef T_DjiReturnCode (*ConsoleFunc)(const uint8_t *data, uint16_t dataLen); + +/** + * @brief Logger console level. + */ +typedef enum { + DJI_LOGGER_CONSOLE_LOG_LEVEL_ERROR = 0, /*!< Logger console error level. The method and level of the console are + associated with each other. If the level of the registered console + method is lower than this level, the level interface will not be + printed successfully. */ + DJI_LOGGER_CONSOLE_LOG_LEVEL_WARN = 1, /*!< Logger console warning level.The method and level of the console are + associated with each other. If the level of the registered console + method is lower than this level, the level interface will not be + printed successfully. */ + DJI_LOGGER_CONSOLE_LOG_LEVEL_INFO = 2, /*!< Logger console info level. The method and level of the console are + associated with each other. If the level of the registered console + method is lower than this level, the level interface will not be + printed successfully. */ + DJI_LOGGER_CONSOLE_LOG_LEVEL_DEBUG = 3, /*!< Logger console debug level. The method and level of the console are + associated with each other. If the level of the registered console + method is lower than this level, the level interface will not be + printed successfully. */ +} E_DjiLoggerConsoleLogLevel; + +/** + * @brief Logger console content. + */ +typedef struct { + ConsoleFunc func; + uint8_t consoleLevel; + bool isSupportColor; +} T_DjiLoggerConsole; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Add the console function and level for Payload SDK. + * @note When registering the console, you need to provide the method of the console and the level corresponding to + * the method. Log levels from high to low are Debug, Info, Warn, and Error, the log function module can print all + * logs not higher than the specified level. Maximum support for registering eight different console methods at the + * same time.Before registering the console method, you should test the registration method ensure that all the method + * are normally. If you registered multiple methods at the same time, all the methods will be print. + * @param console: pointer to the console function. + * @return Execution result. + */ +T_DjiReturnCode DjiLogger_AddConsole(T_DjiLoggerConsole *console); + +/** + * @brief Remove the console function and level for Payload SDK. + * @param console: pointer to the console function. + * @return Execution result. + */ +T_DjiReturnCode DjiLogger_RemoveConsole(T_DjiLoggerConsole *console); +/** + * @brief Print out the selected level log of the specified format by the registration method. + * @note The registered method is printed according to the corresponding level. If the level of the console is lower + * than the level at which the log needs to be printed, it will not be printed successfully. + * @param fmt: pointer to the format string that needs print out. + * @param ...: Variable parameters, consistent with the use of the system interface print out. + */ +void DjiLogger_UserLogOutput(E_DjiLoggerConsoleLogLevel level, const char *fmt, ...); + +/* Exported constants --------------------------------------------------------*/ +#define USER_LOG_DEBUG(fmt, ...) \ + DjiLogger_UserLogOutput(DJI_LOGGER_CONSOLE_LOG_LEVEL_DEBUG, "[%s:%d) " fmt, __FUNCTION__, __LINE__ , ##__VA_ARGS__) +#define USER_LOG_INFO(fmt, ...) \ + DjiLogger_UserLogOutput(DJI_LOGGER_CONSOLE_LOG_LEVEL_INFO, "[%s:%d) " fmt, __FUNCTION__, __LINE__ , ##__VA_ARGS__) +#define USER_LOG_WARN(fmt, ...) \ + DjiLogger_UserLogOutput(DJI_LOGGER_CONSOLE_LOG_LEVEL_WARN, "[%s:%d) " fmt, __FUNCTION__, __LINE__ , ##__VA_ARGS__) +#define USER_LOG_ERROR(fmt, ...) \ + DjiLogger_UserLogOutput(DJI_LOGGER_CONSOLE_LOG_LEVEL_ERROR, "[%s:%d) " fmt, __FUNCTION__, __LINE__ , ##__VA_ARGS__) + +#ifdef __cplusplus +} +#endif + +#endif // DJI_LOGGER_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_low_speed_data_channel.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_low_speed_data_channel.h new file mode 100644 index 0000000..cb70b01 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_low_speed_data_channel.h @@ -0,0 +1,111 @@ +/** + ******************************************************************** + * @file dji_low_speed_data_channel.h + * @brief This is the header file for "dji_low_speed_data_channel.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_LOW_SPEED_DATA_CHANNEL_H +#define DJI_LOW_SPEED_DATA_CHANNEL_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Prototype of callback function used to receive data that come from selected channel address. + * @warning User can not execute blocking style operations or functions in callback function, because that will block + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param data: pointer to data. + * @param len: length of data. + * @return Execution result. + */ +typedef T_DjiReturnCode (*DjiLowSpeedDataChannelRecvDataCallback)(const uint8_t *data, uint16_t len); + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialize the low speed data channel module. + * @note The interface initialization needs to be after DjiCore_Init. + * @return Execution result. + */ +T_DjiReturnCode DjiLowSpeedDataChannel_Init(void); + +/** + * @brief Deinitialize the low speed data channel module. + * @return Execution result. + */ +T_DjiReturnCode DjiLowSpeedDataChannel_DeInit(void); + +/** + * @brief Send data to selected channel address end via command channel. + * @warning If actual bandwidth is below limitation, data can be sent to the endpoint directly. If exceeds the limitation, + * firstly data will be stored to buffer of the flow controller and be sent to endpoint after a period (an integer multiple of + * 1s, the exact time depends on bandwidth limitation and buffer size). If the buffer is full, data be will discarded. The + * capacity of flow controller buffer is 512 bytes. + * @note Must ensure actual bandwidth is less than bandwidth limitation of corresponding channel or stream, please + * refer to developer documentation or state of channel/stream for details related to bandwidth limitation. User can + * get state of "sendDataChannel" command channel via DjiLowSpeedDataChannel_GetSendDataState() function. If actual + * bandwidth exceeds the limitation or busy state is set, the user should stop transmitting data or decrease amount of data + * to be sent. + * @note Max size of data package sent to selected channel address end on a physical link of command channel is 128. + * If the length of data to be sent is greater than 128, data to be sent will be divided into multiple packages to send, + * and the user will also receive multiple data packages on the selected channel address end. + * @param channelAddress: the channel address of the low speed channel + * @param data: pointer to data to be sent. + * @param len: length of data to be sent, unit: byte. + * @return Execution result. + */ +T_DjiReturnCode DjiLowSpeedDataChannel_SendData(E_DjiChannelAddress channelAddress, const uint8_t *data, + uint8_t len); + +/** + * @brief Get data transmission state of "sendToOsdk" command channel. User can use the state as base for controlling data + * transmission between selected channel address and onboard computer. + * @param channelAddress: the channel address of the low speed channel + * @param state: pointer to low speed channel state. + * @return Execution result. + */ +T_DjiReturnCode DjiLowSpeedDataChannel_GetSendDataState(E_DjiChannelAddress channelAddress, + T_DjiDataChannelState *state); + +/** + * @brief Register callback function used to receive data from selected channel address. After registering this callback + * function, callback function will be called automatically when system receive data from selected channel address. + * @param channelAddress: the channel address of the low speed channel + * @param callback: pointer to callback function. + * @return Execution result. + */ +T_DjiReturnCode DjiLowSpeedDataChannel_RegRecvDataCallback(E_DjiChannelAddress channelAddress, + DjiLowSpeedDataChannelRecvDataCallback callback); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_LOW_SPEED_DATA_CHANNEL_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_mop_channel.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_mop_channel.h new file mode 100644 index 0000000..7dc0b99 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_mop_channel.h @@ -0,0 +1,156 @@ +/** + ******************************************************************** + * @file dji_mop_channel.h + * @brief This is the header file for "dji_mop_channel.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_MOP_CHANNEL_H +#define DJI_MOP_CHANNEL_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" +#include "dji_low_speed_data_channel.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Mop channel handle. + */ +typedef void *T_DjiMopChannelHandle; + +/** + * @brief Mop channel transmission type. + */ +typedef enum { + DJI_MOP_CHANNEL_TRANS_RELIABLE = 0, /*!< Reliable transmission type. */ + DJI_MOP_CHANNEL_TRANS_UNRELIABLE, /*!< Unreliable transmission type. */ +} E_DjiMopChannelTransType; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialize the mop channel for operation about mop channel handle later. + * @note This interface needs to be called before calling other mop channel interfaces. Please make sure the network port + * is connected properly before calling this interface. Mop channel feature currently only supports linux platform. + * @return Execution result. + */ +T_DjiReturnCode DjiMopChannel_Init(void); + +/** + * @brief Create the mop channel handle by specified transmission type. + * @note After calling this interface, you should follow below cases: + * 1. When mop channel handle created successfully, you need bind channel id to this created mop channel handle and + * accept other client device connections, such as MSDK or OSDK device; + * 2. When mop channel accept successfully, you can use send or receive data interface to write or read data by accepted + * output channel handle; + * 3. When the mop channel handle do not used, you can use close or destroy interface to release the resource; + * @param channelHandle: pointer to the created mop channel. + * @param transType: the transmission type for mop channel ::E_DjiMopChannelTransType. + * @return Execution result. + */ +T_DjiReturnCode DjiMopChannel_Create(T_DjiMopChannelHandle *channelHandle, E_DjiMopChannelTransType transType); + +/** + * @brief Destroy the created mop channel and release the resource that referenced by the channel handle. + * @note After calling this interface, we can not do any operation about this channel handle expect create channel handle. + * @param channelHandle: pointer to the created mop channel. + * @return Execution result. + */ +T_DjiReturnCode DjiMopChannel_Destroy(T_DjiMopChannelHandle channelHandle); + +/** + * @brief Bind the channel id to the created mop channel handle. + * @note When mop channel handle created successfully, you can bind channel id to this created mop handle and calling + * interface ::DjiMopChannel_Accept, then other client device can use this binded channel id to connect created mop handle. + * @param channelHandle: pointer to the created mop channel handle. + * @param channelId: the channel id of mop handle for accepting client device connection. + * @return Execution result. + */ +T_DjiReturnCode DjiMopChannel_Bind(T_DjiMopChannelHandle channelHandle, + uint16_t channelId); + +/** + * @brief Accept the connection by binded channel id for created mop channel. + * @note The mop accept channel extracts the connection request on the queue of pennding connections for listening channel + * handle ::channelHandle. Create a new connected channel handle and return to user ::outChannelHandle by referrng to a new + * connection. Payload can be a server that allow multiple client connections by binded channel id. + * @param channelHandle: pointer to the created mop channel. + * @param outChannelHandle: pointer to the accepted output mop channel. + * @return Execution result. + */ +T_DjiReturnCode DjiMopChannel_Accept(T_DjiMopChannelHandle channelHandle, + T_DjiMopChannelHandle *outChannelHandle); + +T_DjiReturnCode DjiMopChannel_Connect(T_DjiMopChannelHandle channelHandle, E_DjiChannelAddress channelAddress, + uint16_t channelId); + +/** + * @brief Close the created mop channel. + * @note After calling this interface, we can not do any operation about this channel handle expect destroy channel handle. + * @param channelHandle: pointer to the created mop channel. + * @return Execution result. + */ +T_DjiReturnCode DjiMopChannel_Close(T_DjiMopChannelHandle channelHandle); + +/** + * @brief Send data by the accepted output mop channel. + * @note This interface should be called after successfully calling the interface ::DjiMopChannel_Accept. It is recommended + * to send more bytes of data at a time to improve read and write efficiency. Need to determine whether the send is + * successful according to the return code and the actual sent data length. + * @param channelHandle: pointer to accepted output mop handle ::outChannelHandle by calling interface ::DjiMopChannel_Accept. + * @param data: pointer to data to be sent. + * @param len: length of data to be sent via accepted output mop handle, unit: byte. + * @param realLen: pointer to real length of data that already sent. + * @return Execution result. + */ +T_DjiReturnCode DjiMopChannel_SendData(T_DjiMopChannelHandle channelHandle, + uint8_t *data, + uint32_t len, + uint32_t *realLen); + +/** + * @brief Receive data from the accepted output mop channel. + * @note This interface should be called after successfully calling the interface ::DjiMopChannel_Accept. It is recommended + * to receive more bytes of data at a time to improve read and write efficiency. Need to determine whether the receive + * is successful according to the return code and the actual received data length. + * @param channelHandle: pointer to accepted output mop handle ::outChannelHandle by calling interface ::DjiMopChannel_Accept. + * @param data: pointer to data to store the received data. + * @param len: length of data to be received via accepted output mop handle, unit: byte. + * @param realLen: pointer to real length of data that already received. + * @return Execution result. + */ +T_DjiReturnCode DjiMopChannel_RecvData(T_DjiMopChannelHandle channelHandle, + uint8_t *data, + uint32_t len, + uint32_t *realLen); +#ifdef __cplusplus +} +#endif + +#endif + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ + diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_payload_camera.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_payload_camera.h new file mode 100644 index 0000000..6bec055 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_payload_camera.h @@ -0,0 +1,906 @@ +/** + ******************************************************************** + * @file dji_payload_camera.h + * @brief This is the header file for "dji_payload_camera.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_PAYLOAD_CAMERA_H +#define DJI_PAYLOAD_CAMERA_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Camera work mode. + */ +typedef enum { + DJI_CAMERA_MODE_SHOOT_PHOTO = 0, /*!< Shoot photo work mode. */ + DJI_CAMERA_MODE_RECORD_VIDEO = 1, /*!< Record video work mode. */ + DJI_CAMERA_MODE_PLAYBACK = 2, /*!< Media playback work mode. */ +} E_DjiCameraMode; + +/** + * @brief Camera shoot photo mode. + */ +typedef enum { + DJI_CAMERA_SHOOT_PHOTO_MODE_SINGLE = 1, /*!< Single photographing mode. */ + DJI_CAMERA_SHOOT_PHOTO_MODE_BURST = 4, /*!< Burst photographing mode. */ + DJI_CAMERA_SHOOT_PHOTO_MODE_INTERVAL = 6, /*!< Interval photographing mode. */ +} E_DjiCameraShootPhotoMode; + +/** + * @brief Camera shooting state when photographing. + */ +typedef enum { + DJI_CAMERA_SHOOTING_PHOTO_IDLE = 0, /*!< Photographing in idle state. */ + DJI_CAMERA_SHOOTING_SINGLE_PHOTO = 1, /*!< Photographing in single photograph state . */ + DJI_CAMERA_SHOOTING_BURST_PHOTO = 2, /*!< Photographing in burst photograph state. */ + DJI_CAMERA_SHOOTING_INTERVAL_PHOTO = 6, /*!< Photographing in interval photograph state. */ +} E_DjiCameraShootingState; + +/** + * @brief Camera metering mode. + */ +typedef enum { + DJI_CAMERA_METERING_MODE_CENTER = 0, /*!< Center metering mode. */ + DJI_CAMERA_METERING_MODE_AVERAGE = 1, /*!< Average metering mode. */ + DJI_CAMERA_METERING_MODE_SPOT = 2, /*!< Spot metering mode. */ +} E_DjiCameraMeteringMode; + +/** + * @brief Camera focus mode. + */ +typedef enum { + DJI_CAMERA_FOCUS_MODE_MANUAL = 0, /*!< Manual focus mode. */ + DJI_CAMERA_FOCUS_MODE_AUTO = 1, /*!< Auto focus mode. */ +} E_DjiCameraFocusMode; + +/** + * @brief Camera playback mode in playback process. + */ +typedef enum { + DJI_CAMERA_PLAYBACK_MODE_PLAY = 2, /*!< Play playbacking mode. */ + DJI_CAMERA_PLAYBACK_MODE_PAUSE = 3, /*!< Pause playbacking mode. */ + DJI_CAMERA_PLAYBACK_MODE_STOP = 7, /*!< Stop playbacking mode. */ +} E_DjiCameraPlaybackMode; + +/** + * @brief Camera supported video frames when working in playback mode. + */ +typedef enum { + DJI_CAMERA_VIDEO_FRAME_RATE_24_FPS = 13, /*!< The camera's video frame rate is 24fps (frames per second) */ + DJI_CAMERA_VIDEO_FRAME_RATE_25_FPS = 2, /*!< The camera's video frame rate is 25fps (frames per second) */ + DJI_CAMERA_VIDEO_FRAME_RATE_30_FPS = 14, /*!< The camera's video frame rate is 30fps (frames per second) */ + DJI_CAMERA_VIDEO_FRAME_RATE_UNKNOWN = 0, /*!< The camera's video frame rate is unknown (frames per second) */ +} E_DjiCameraVideoFrameRate; + +/** + * @brief Camera supported video resolutions when working in playback mode. + */ +typedef enum { + DJI_CAMERA_VIDEO_RESOLUTION_640x480 = 0, /*!< /The camera's video resolution is 640x480. */ + DJI_CAMERA_VIDEO_RESOLUTION_1280x720 = 4, /*!< /The camera's video resolution is 1280x720. */ + DJI_CAMERA_VIDEO_RESOLUTION_1920x1080 = 10, /*!< /The camera's video resolution is 1920x1080. */ + DJI_CAMERA_VIDEO_RESOLUTION_2048x1080 = 37, /*!< /The camera's video resolution is 2048x1080. */ + DJI_CAMERA_VIDEO_RESOLUTION_3840x2160 = 41, /*!< /The camera's video resolution is 3840x2160. */ + DJI_CAMERA_VIDEO_RESOLUTION_UNKNOWN = 255, /*!< /The camera's video resolution is unknown. */ +} E_DjiCameraVideoResolution; + +/** + * @brief Camera zoom state in tap zoom process. + */ +typedef enum { + DJI_CAMERA_TAP_ZOOM_STATE_IDLE = 0, /*!< Camera is not in tap zoom process. */ + DJI_CAMERA_TAP_ZOOM_STATE_ZOOM_IN = 1, /*!< Camera is zooming in. */ + DJI_CAMERA_TAP_ZOOM_STATE_ZOOM_OUT = 2, /*!< Camera is zooming out. */ + DJI_CAMERA_TAP_ZOOM_STATE_ZOOM_LIMITED = 3, /*!< Camera has reached zoom limit. */ +} E_DjiCameraTapZoomState; + +/** + * @brief Camera video stream type. + */ +typedef enum { + /*! Camera video stream by h264 custom format, which needs to comply with the user document Custom-H264 video stream format standard. + * When using this format to send a video stream, the bit rate of the video stream needs must not exceed the real-time bandwidth + * limit of the channel that feedback by interface #DjiPayloadCamera_GetVideoStreamState.*/ + DJI_CAMERA_VIDEO_STREAM_TYPE_H264_CUSTOM_FORMAT = 0, + /*! Camera video stream by h264 DJI format, which needs to comply with the user document DJI-H264 video stream format standard. + * When using this format to send a video stream, the video stream will be recoded by aircraft. No need to dynamically adjust + * the bit rate to ensure the quality of transmission. But the bit rate of video stream can not exceed 8Mbps. */ + DJI_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT = 1, +} E_DjiCameraVideoStreamType; + +/** + * @brief Camera sdcard state. + */ +typedef struct { + bool isInserted; /*!< Specifies if the SD card is inserted in the camera. This parameter is boolean type. */ + bool isVerified; /*!< Specifies if the SD card is verified as genuine. This parameter is boolean type. */ + bool isInitializing; /*!< Specifies if the SD card is initializing. This parameter is boolean type. */ + bool isReadOnly; /*!< Specifies if the SD card is read only type. This parameter is boolean type. */ + bool isFormatting; /*!< Specifies if the SD card is in formatting process. This parameter is boolean type. */ + bool isFull; /*!< Specifies if the SD card's capacity is full. This parameter is boolean type. */ + bool isInvalidFormat;/*!< Specifies if the SD card is invalid formatted. This parameter is boolean type. */ + bool hasError; /*!< Specifies if the SD card has error. This parameter is boolean type. */ + uint32_t totalSpaceInMB; /*!< SD card total capacity, unit: MB. */ + uint32_t remainSpaceInMB; /*!< SD card remaining capacity, unit: MB. */ + uint32_t availableCaptureCount; /*!< Available capture photo count. */ + uint32_t availableRecordingTimeInSeconds; /*!< Available video recording second time, unit: s. */ +} T_DjiCameraSDCardState; + +/** + * @brief Camera metering target when in spot metering mode. + */ +typedef struct { + uint8_t col; /*!< Specifies column coordinate. This parameter is between 0 and 11. */ + uint8_t row; /*!< Specifies row coordinate. This parameter is between 0 and 7. */ +} T_DjiCameraSpotMeteringTarget; + +/** + * @brief Camera system state. + */ +typedef struct { + E_DjiCameraMode cameraMode; /*!< Specifies the camera current work mode, #E_DjiCameraMode. */ + E_DjiCameraShootingState shootingState; /*!< Specifies the camera state of shooting, #E_DjiCameraShootingState. */ + bool isStoring;/*!< Specifies if the camera is in storing status. This parameter is boolean type. */ + bool isShootingIntervalStart; /*!< Specifies if the camera is in interval shooting start status. This parameter is boolean type. */ + uint16_t currentPhotoShootingIntervalTimeInSeconds; /*!< Specifies the current interval shoot countdown time, the value is decreasing, + * when the value equals to zero trigger the interval take photo, uint:s. */ + uint16_t currentPhotoShootingIntervalCount; /*!< Specifies the current interval photo count, the value is decreasing step by one from + * the setted count when interval taking photo */ + bool isRecording; /*!< Specifies if the camera is in recording status. This parameter is boolean type. */ + uint16_t currentVideoRecordingTimeInSeconds; /*!< Specifies the current recording process time, uint:s. */ + bool isOverheating; /*!< Specifies if the camera is in overheating status. This parameter is boolean type. */ + bool hasError; /*!< Specifies if the camera in error status. This parameter is boolean type. */ +} T_DjiCameraSystemState; + +/** + * @brief Camera focus assistant settings. + */ +typedef struct { + bool isEnabledMF; /*!< Specifies if the lens focus assistant is enabled for manual focusing. This parameter is boolean type. */ + bool isEnabledAF; /*!< Specifies if the lens focus assistant is enabled for auto focusing. This parameter is boolean type. */ +} T_DjiCameraFocusAssistantSettings; + +/** + * @brief Camera playback status. + */ +typedef struct { + E_DjiCameraPlaybackMode playbackMode; /*!< Specifies the duration of video media file, #E_DjiCameraPlaybackMode. */ + uint8_t videoPlayProcess; /*!< Specifies the current play process of video media file. This parameter is between 0 and 100. */ + uint32_t videoLengthMs; /*!< Specifies the total duration of video media file, uint:ms. */ + uint32_t playPosMs; /*!< Specifies the current play position of video media file, uint:ms. */ +} T_DjiCameraPlaybackStatus; + +/** + * @brief Camera focus assistant settings. + */ +typedef struct { + uint16_t attrVideoDuration; /*!< Specifies the playback duration of video media file, uint:s. */ + uint16_t attrVideoFrameRate; /*!< Specifies the frame rate of video media file, uint:fps. */ + uint16_t attrVideoResolution; /*!< Specifies the resolution of video media file, uint:px. */ +} T_DjiCameraMediaFileAttr; + +/** + * @brief Camera media file info. + */ +typedef struct { + E_DjiCameraMediaFileType type; /*!< Specifies the type of media file, #E_DjiCameraMediaFileType. */ + T_DjiCameraMediaFileAttr mediaFileAttr; /*!< Specifies the attributes of media file. */ + uint32_t fileSize; /*!< Specifies the size of media file, uint:byte. */ +} T_DjiCameraMediaFileInfo; + +/** + * @brief Camera tap zoom state. + */ +typedef struct { + E_DjiCameraTapZoomState zoomState; /*!< Camera zoom state. */ + bool isGimbalMoving; /*!< Flag that specifies whether gimbal is moving for tap zoom. */ +} T_DjiCameraTapZoomState; + +/** + * @brief Camera common features handler. + * @warning User can not execute blocking style operations or functions in callback function, because that will block dji + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef struct { + /** + * @brief Prototype of callback function used to get camera system state. + * @param systemState: pointer to memory space used to store camera system state. + * @return Execution result. + */ + T_DjiReturnCode (*GetSystemState)(T_DjiCameraSystemState *systemState); + + /** + * @brief Prototype of callback function used to set camera work mode. + * @note Sets the camera's work mode to taking pictures, video, playback. Please note that you cannot change the mode + * when a certain taskHandle is executing, such as taking photo(s), recording video, or downloading and saving files. Also + * supported by thermal imaging camera. + * @param mode: camera work mode. + * @return Execution result. + */ + T_DjiReturnCode (*SetMode)(E_DjiCameraMode mode); + + /** + * @brief Prototype of callback function used to get camera current work mode. + * @param mode: pointer to memory space used to store camera work mode. + * @return Execution result. + */ + T_DjiReturnCode (*GetMode)(E_DjiCameraMode *mode); + + /** + * @brief Prototype of callback function used to start record video. + * @return Execution result. + */ + T_DjiReturnCode (*StartRecordVideo)(void); + + /** + * @brief Prototype of callback function used to stop record video. + * @return Execution result. + */ + T_DjiReturnCode (*StopRecordVideo)(void); + + /** + * @brief Prototype of callback function used to start shoot photo. + * @return Execution result. + */ + T_DjiReturnCode (*StartShootPhoto)(void); + + /** + * @brief Prototype of callback function used to stop shoot photo. + * @return Execution result. + */ + T_DjiReturnCode (*StopShootPhoto)(void); + + /** + * @brief Prototype of callback function used to set camera shoot photo mode. + * @param mode: camera shoot photo mode. + * @return Execution result. + */ + T_DjiReturnCode (*SetShootPhotoMode)(E_DjiCameraShootPhotoMode mode); + + /** + * @brief Prototype of callback function used to get camera current shoot photo mode. + * @param mode: pointer to memory space used to store camera shoot photo mode. + * @return Execution result. + */ + T_DjiReturnCode (*GetShootPhotoMode)(E_DjiCameraShootPhotoMode *mode); + + /** + * @brief Prototype of callback function used to set camera shoot burst count. + * @param burstCount: camera shoot burst count. + * @return Execution result. + */ + T_DjiReturnCode (*SetPhotoBurstCount)(E_DjiCameraBurstCount burstCount); + + /** + * @brief Prototype of callback function used to get camera current burst count. + * @param burstCount: pointer to memory space used to store camera shoot burst count. + * @return Execution result. + */ + T_DjiReturnCode (*GetPhotoBurstCount)(E_DjiCameraBurstCount *burstCount); + + /** + * @brief Prototype of callback function used to set camera shoot time interval settings. + * @note The value range of interval photograph count is [2, 255]. If 255 is selected, then the camera will continue + * to take pictures until StopShootPhoto is called. + * @param settings: camera shoot time interval settings. + * @return Execution result. + */ + T_DjiReturnCode (*SetPhotoTimeIntervalSettings)(T_DjiCameraPhotoTimeIntervalSettings settings); + + /** + * @brief Prototype of callback function used to get camera shoot time interval settings. + * @param settings: pointer to memory space used to store camera shoot time interval settings. + * @return Execution result. + */ + T_DjiReturnCode (*GetPhotoTimeIntervalSettings)(T_DjiCameraPhotoTimeIntervalSettings *settings); + + /** + * @brief Prototype of callback function used to get camera current SDCard state. + * @param sdCardState: pointer to memory space used to store camera SDCard state. + * @return Execution result. + */ + T_DjiReturnCode (*GetSDCardState)(T_DjiCameraSDCardState *sdCardState); + + /** + * @brief Prototype of callback function used to format the SDCard inserted. + * @return Execution result. + */ + T_DjiReturnCode (*FormatSDCard)(void); +} T_DjiCameraCommonHandler; + +/** + * @brief Camera metering feature handler. + * @warning User can not execute blocking style operations or functions in callback function, because that will block dji + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef struct { + /** + * @brief Prototype of callback function used to set camera metering mode. + * @param mode: camera metering mode. + * @return Execution result. + */ + T_DjiReturnCode (*SetMeteringMode)(E_DjiCameraMeteringMode mode); + + /** + * @brief Prototype of callback function used to get camera current metering mode. + * @param mode: pointer to memory space used to store camera metering mode. + * @return Execution result. + */ + T_DjiReturnCode (*GetMeteringMode)(E_DjiCameraMeteringMode *mode); + + /** + * @brief Prototype of callback function used to set camera spot metering target area. + * @param target: camera spot metering target area. + * @return Execution result. + */ + T_DjiReturnCode (*SetSpotMeteringTarget)(T_DjiCameraSpotMeteringTarget target); + + /** + * @brief Prototype of callback function used to get camera spot metering target area. + * @param target: pointer to memory space used to store camera spot metering target area. + * @return Execution result. + */ + T_DjiReturnCode (*GetSpotMeteringTarget)(T_DjiCameraSpotMeteringTarget *target); +} T_DjiCameraExposureMeteringHandler; + +/** + * @brief Camera focus feature handler. + * @warning User can not execute blocking style operations or functions in callback function, because that will block dji + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef struct { + /** + * @brief Prototype of callback function used to set camera focus mode. + * @param mode: camera focus mode. + * @return Execution result. + */ + T_DjiReturnCode (*SetFocusMode)(E_DjiCameraFocusMode mode); + + /** + * @brief Prototype of callback function used to get camera current focus mode. + * @param mode: pointer to memory space used to store camera focus mode. + * @return Execution result. + */ + T_DjiReturnCode (*GetFocusMode)(E_DjiCameraFocusMode *mode); + + /** + * @brief Prototype of callback function used to set camera focus target area. + * @param target: camera focus target area. + * @return Execution result. + */ + T_DjiReturnCode (*SetFocusTarget)(T_DjiCameraPointInScreen target); + + /** + * @brief Prototype of callback function used to get camera focus target area. + * @param target: pointer to memory space used to store camera focus target area. + * @return Execution result. + */ + T_DjiReturnCode (*GetFocusTarget)(T_DjiCameraPointInScreen *target); + + /** + * @brief Prototype of callback function used to set camera focus assistant settings. + * @param settings: camera focus assistant settings. + * @return Execution result. + */ + T_DjiReturnCode (*SetFocusAssistantSettings)(T_DjiCameraFocusAssistantSettings settings); + + /** + * @brief Prototype of callback function used to get camera focus assistant settings. + * @param settings: pointer to memory space used to store camera focus assistant settings. + * @return Execution result. + */ + T_DjiReturnCode (*GetFocusAssistantSettings)(T_DjiCameraFocusAssistantSettings *settings); + + /** + * @brief Prototype of callback function used to set camera focus ring value. + * @param value: camera focus ring value. + * @return Execution result. + */ + T_DjiReturnCode (*SetFocusRingValue)(uint32_t value); + + /** + * @brief Prototype of callback function used to get camera focus ring value. + * @param value: pointer to memory space used to store camera focus ring value. + * @return Execution result. + */ + T_DjiReturnCode (*GetFocusRingValue)(uint32_t *value); + + /** + * @brief Prototype of callback function used to get camera focus upper bound ring value. + * @param value: pointer to memory space used to store camera focus upper bound value. + * @return Execution result. + */ + T_DjiReturnCode (*GetFocusRingValueUpperBound)(uint32_t *value); +} T_DjiCameraFocusHandler; + +/** + * @brief Camera digital zoom feature handler. + * @warning User can not execute blocking style operations or functions in callback function, because that will block dji + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef struct { + /** + * @brief Prototype of callback function used to set camera digital zoom factor. + * @param factor: camera digital zoom factor. + * @return Execution result. + */ + T_DjiReturnCode (*SetDigitalZoomFactor)(dji_f32_t factor); + + /** + * @brief Prototype of callback function used to get camera current digital zoom factor. + * @param factor: pointer to memory space used to store camera current digital zoom factor. + * @return Execution result. + */ + T_DjiReturnCode (*GetDigitalZoomFactor)(dji_f32_t *factor); +} T_DjiCameraDigitalZoomHandler; + +/** + * @brief Camera optical zoom feature handler. + * @warning User can not execute blocking style operations or functions in callback function, because that will block dji + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef struct { + /** + * @brief Prototype of callback function used to set camera optical zoom focal length. + * @param focalLength: camera optical zoom focal length. + * @return Execution result. + */ + T_DjiReturnCode (*SetOpticalZoomFocalLength)(uint32_t focalLength); + + /** + * @brief Prototype of callback function used to get camera optical zoom focal length. + * @param focalLength: pointer to memory space used to store camera optical zoom focal length. + * @return Execution result. + */ + T_DjiReturnCode (*GetOpticalZoomFocalLength)(uint32_t *focalLength); + + /** + * @brief Prototype of callback function used to get camera optical zoom factor. + * @param factor: pointer to memory space used to store camera optical zoom factor. + * @return Execution result. + */ + T_DjiReturnCode (*GetOpticalZoomFactor)(dji_f32_t *factor); + + /** + * @brief Prototype of callback function used to get camera optical zoom specifies. + * @param spec: pointer to memory space used to store camera optical zoom specifies. + * @return Execution result. + */ + T_DjiReturnCode (*GetOpticalZoomSpec)(T_DjiCameraOpticalZoomSpec *spec); + + /** + * @brief Prototype of callback function used to start continuous optical zoom. + * @param direction: camera zoom direction. + * @param speed: camera zoom speed. + * @return Execution result. + */ + T_DjiReturnCode (*StartContinuousOpticalZoom)(E_DjiCameraZoomDirection direction, E_DjiCameraZoomSpeed speed); + + /** + * @brief Prototype of callback function used to stop continuous optical zoom. + * @return Execution result. + */ + T_DjiReturnCode (*StopContinuousOpticalZoom)(void); +} T_DjiCameraOpticalZoomHandler; + +/** + * @brief Prototype of handler functions for media file download and playback. + * @warning User can not execute blocking style operations or functions in callback function, because that will block dji + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef struct { + /** + * @brief Prototype of callback function used to get camera media file path. + * @warning The maximum length of path that users can pass in is 256, including end character '\0'. + * @param dirPath: pointer to memory space used to store camera media file path. + * @return Execution result. + */ + T_DjiReturnCode (*GetMediaFileDir)(char *dirPath); + + /** + * @brief Prototype of callback function used to get the file info of the selected origin media file. + * @param dirPath: pointer to memory space used to store camera current media file path. + * @param fileInfo: pointer to memory space used to store file info of the selected origin media file. + * @return Execution result. + */ + T_DjiReturnCode (*GetMediaFileOriginInfo)(const char *filePath, T_DjiCameraMediaFileInfo *fileInfo); + + /** + * @brief Prototype of callback function used to get the data of the selected origin media file. + * @param dirPath: pointer to memory space used to store camera current media file path. + * @param offset: the offset of origin file data that need get from the selected media file. + * @param length: the length of origin file data that need get from the selected media file. + * @param data: pointer to memory space used to store the selected origin media file. + * @return Execution result. + */ + T_DjiReturnCode (*GetMediaFileOriginData)(const char *filePath, uint32_t offset, uint32_t length, uint8_t *data); + + /** + * @brief Prototype of callback function used to create the thumb nail of selected media file. + * @param dirPath: pointer to memory space used to store camera current media file path. + * @return Execution result. + */ + T_DjiReturnCode (*CreateMediaFileThumbNail)(const char *filePath); + + /** + * @brief Prototype of callback function used to get the file info of the created thumbnail. + * @param dirPath: pointer to memory space used to store camera current media file path. + * @param fileInfo: pointer to memory space used to store file info of the created thumbnail. + * @return Execution result. + */ + T_DjiReturnCode (*GetMediaFileThumbNailInfo)(const char *filePath, T_DjiCameraMediaFileInfo *fileInfo); + + /** + * @brief Prototype of callback function used to get the data of the created thumbnail. + * @param dirPath: pointer to memory space used to store camera current media file path. + * @param offset: the offset of thumb nail data that need get from the selected media file. + * @param length: the length of thumb nail data that need get from the selected media file. + * @param data: pointer to memory space used to store the created thumbnail data. + * @return Execution result. + */ + T_DjiReturnCode (*GetMediaFileThumbNailData)(const char *filePath, uint32_t offset, uint32_t length, + uint8_t *data); + + /** + * @brief Prototype of callback function used to destroy the created thumb nail of selected media file. + * @param dirPath: pointer to memory space used to store camera current media file path. + * @return Execution result. + */ + T_DjiReturnCode (*DestroyMediaFileThumbNail)(const char *filePath); + + /** + * @brief Prototype of callback function used to create the screen nail of selected media file. + * @param dirPath: pointer to memory space used to store camera current media file path. + * @return Execution result. + */ + T_DjiReturnCode (*CreateMediaFileScreenNail)(const char *filePath); + + /** + * @brief Prototype of callback function used to get the data of the created screen nail. + * @param dirPath: pointer to memory space used to store camera current media file path. + * @param offset: the offset of screen nail data that need get from selected media file. + * @param length: the length of screen nail data that need get from selected media file. + * @param data: pointer to memory space used to store the created screen nail data. + * @return Execution result. + */ + T_DjiReturnCode (*GetMediaFileScreenNailData)(const char *filePath, uint32_t offset, uint32_t length, + uint8_t *data); + + /** + * @brief Prototype of callback function used to get the file info of the created screen nail. + * @param dirPath: pointer to memory space used to store camera current media file path. + * @param fileInfo: pointer to memory space used to store file info of the created screen nail. + * @return Execution result. + */ + T_DjiReturnCode (*GetMediaFileScreenNailInfo)(const char *filePath, T_DjiCameraMediaFileInfo *fileInfo); + + /** + * @brief Prototype of callback function used to destroy the created screen nail of selected media file. + * @param dirPath: pointer to memory space used to store camera current media file path. + * @return Execution result. + */ + T_DjiReturnCode (*DestroyMediaFileScreenNail)(const char *filePath); + + /** + * @brief Prototype of callback function used to notification when download starting. + * @note You can adjust the bandwidth proportion of each high speed channel in the notification callback. + * @return Execution result. + */ + T_DjiReturnCode (*StartDownloadNotification)(void); + + /** + * @brief Prototype of callback function used to notification when download stoping. + * @note You can adjust the bandwidth proportion of each high speed channel in the notification callback. + * @return Execution result. + */ + T_DjiReturnCode (*StopDownloadNotification)(void); + + /** + * @brief Prototype of callback function used to delete the user's media files. + * @param filePath: pointer to memory space used to store camera current media file path. + * @return Execution result. + */ + T_DjiReturnCode (*DeleteMediaFile)(char *filePath); + + /** + * @brief Prototype of callback function used to get camera media playback status. + * @param status: pointer to memory space used to store camera media file path. + * @return Execution result. + */ + T_DjiReturnCode (*GetMediaPlaybackStatus)(T_DjiCameraPlaybackStatus *status); + + /** + * @brief Prototype of callback function used to set the file path of media file that need playback. + * @param filePath: pointer to memory space used to store the file path of media file that need playback. + * @return Execution result. + */ + T_DjiReturnCode (*SetMediaPlaybackFile)(const char *filePath); + + /** + * @brief Prototype of callback function used to start media video playback when camera work in playback mode. + * @return Execution result. + */ + T_DjiReturnCode (*StartMediaPlayback)(void); + + /** + * @brief Prototype of callback function used to stop media video playback when camera work in playback mode. + * @return Execution result. + */ + T_DjiReturnCode (*StopMediaPlayback)(void); + + /** + * @brief Prototype of callback function used to pause media video playback when camera work in playback mode. + * @return Execution result. + */ + T_DjiReturnCode (*PauseMediaPlayback)(void); + + /** + * @brief Prototype of callback function used to seek to the playback position of media video when camera work in playback mode. + * @param playbackPosition: playback position of video media, unit: ms. + * @return Execution result. + */ + T_DjiReturnCode (*SeekMediaPlayback)(uint32_t playbackPosition); +} T_DjiCameraMediaDownloadPlaybackHandler; + +/** + * @brief Prototype of handler functions for tap zooming. + * @note User can not execute blocking style operations or functions in callback function, like djiXPort_RotateSync() + * function, because that will block dji root thread, causing problems such as slow system response, payload + * disconnection or infinite loop. + */ +typedef struct { + /** + * @brief Prototype of callback function used to get tap zoom state. + * @param state: pointer to memory space used to store tap zoom state. + * @return Execution result. + */ + T_DjiReturnCode (*GetTapZoomState)(T_DjiCameraTapZoomState *state); + + /** + * @brief Prototype of callback function used to enable or disable tap zoom function. + * @details dji application should response tap zoom command only if tap zoom function is enabled. + * @param enabledFlag: enabled flag. + * @return Execution result. + */ + T_DjiReturnCode (*SetTapZoomEnabled)(bool enabledFlag); + + /** + * @brief Prototype of callback function used to get the flag that specifies whether tap zoom function has been + * enabled, + * @param enabledFlag: pointer to memory space used to store enabled flag. + * @return Execution result. + */ + T_DjiReturnCode (*GetTapZoomEnabled)(bool *enabledFlag); + + /** + * @brief Prototype of callback function used to set multiplier of single tap zoom. + * @param multiplier: multiplier of single tap zoom. + * @return Execution result. + */ + T_DjiReturnCode (*SetTapZoomMultiplier)(uint8_t multiplier); + + /** + * @brief Prototype of callback function used to get multiplier of single tap zoom. + * @param multiplier: pointer to memory space use to store multiplier of single tap zoom. + * @return Execution result. + */ + T_DjiReturnCode (*GetTapZoomMultiplier)(uint8_t *multiplier); + + /** + * @brief Prototype of callback function used to trigger tap zoom. + * @details Users trigger tap zoom in screen of mobile end, this callback function will be called. Then, dji + * application should rotate gimbal to orientation of target point and zoom by specified multiplier. + * @param target: position information of target point in screen. + * @return Execution result. + */ + T_DjiReturnCode (*TapZoomAtTarget)(T_DjiCameraPointInScreen target); +} T_DjiCameraTapZoomHandler; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialize the payload camera module. + * @note The interface is the total initialization interface of the camera module. The following interfaces are optional + * functions and can be freely selected according to the actual load device condition of the user. Before registering + * the optional interface, the interface must be initialized before the system can work normally. Interface initialization + * needs to be after djiCore_Init. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_Init(void); + +/** + * @brief Register the handler for payload camera common function interfaces. + * @note This interface registers the camera's basic function interface, including camera camera, video, mode settings, + * SD card operation, camera status interface. Registration of this interface needs to be after DjiPayloadCamera_Init. + * @param cameraCommonHandler: pointer to the handler for payload camera common functions. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_RegCommonHandler(const T_DjiCameraCommonHandler *cameraCommonHandler); + +/** + * @brief Register the handler for payload camera exposure and metering function interfaces. + * @note This interface registers the spot metering and exposure interface of the camera. It currently includes + * setting and acquiring the metering mode and metering area. Special attention must be paid to the limitations + * of the interface parameters. Registration of this interface needs to be after DjiPayloadCamera_Init. + * @param cameraExposureMeteringHandler: pointer to the handler for payload camera exposure and metering functions. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_RegExposureMeteringHandler(const T_DjiCameraExposureMeteringHandler + *cameraExposureMeteringHandler); + +/** + * @brief Register the handler for payload camera focus function interfaces. + * @note This interface registers the camera's focus interface, which includes setting and acquiring the focus mode, + * focus area, and focus settings. Special attention must be paid to the interface parameters. Registration of + * this interface needs to be after DjiPayloadCamera_Init. + * @param cameraFocusHandler: pointer to the handler for payload camera focus functions. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_RegFocusHandler(const T_DjiCameraFocusHandler *cameraFocusHandler); + +/** + * @brief Register the handler for payload camera digital zoom function interfaces. + * @note This interface registers the camera's digital zoom interface, which includes setting and obtaining the digital + * zoom zoom factor. Registering the load on this interface requires digital zoom. Registration of this interface + * needs to be after DjiPayloadCamera_Init. + * @param cameraDigitalZoomHandler: pointer to the handler for payload camera digital zoom functions. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_RegDigitalZoomHandler(const T_DjiCameraDigitalZoomHandler + *cameraDigitalZoomHandler); + +/** + * @brief Register the handler for payload camera optical zoom function interfaces. + * @note This interface registers the camera's optical zoom interface, which includes setting and acquiring optical zoom + * parameters, and a continuous zoom interface. Registering the load on this interface requires support for optical + * zoom. Registration of this interface needs to be after DjiPayloadCamera_Init. + * @param cameraOpticalZoomHandler: pointer to the handler for payload camera optical zoom functions. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_RegOpticalZoomHandler(const T_DjiCameraOpticalZoomHandler + *cameraOpticalZoomHandler); + +/** + * @brief Register handler functions for tap zoom function. + * @details Registration specifies dji application support tap zoom function. + * @param cameraTapZoomHandler: pointer to structure of handler functions for tap zoom function. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_RegTapZoomHandler(const T_DjiCameraTapZoomHandler *cameraTapZoomHandler); + +/** + * @brief Set the type of camera video stream. + * @note The interface is used to set the camera video stream type. Must ensure the format of video stream conforms to + * the specified type in E_DjiCameraVideoStreamType, please refer to developer documentation for more details. + * @attention Set video stream type must before calling djiCore_ApplicationStart function, when calling this interface + * the thread will be blocked, and the maximum blocking time is 10s. If this interface is not called, the default video + * stream type ::DJI_CAMERA_VIDEO_STREAM_TYPE_H264_CUSTOM_FORMAT will be used. + * @param videoStreamType: camera video stream type. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_SetVideoStreamType(E_DjiCameraVideoStreamType videoStreamType); + +/** + * @brief Get the network remote address for sending camera video stream. + * @note The interface is used to get the network remote address for sending camera video stream. You can get this info for another + * heterogeneous system to do somethings. This interface should be used after calling djiCore_Init function. + * @attention If you want use this interface, should call djiPlatform_RegHalNetworkHandler interface firstly, otherwise + * this interface will not work. + * @param ipAddr: the remote ip address for sending camera video stream. + * @param port: the remote port for sending camera video stream. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_GetVideoStreamRemoteAddress(char *ipAddr, uint16_t *port); + +/** + * @brief Register the handler for payload camera media download and playback function interfaces. + * @note Registering the camera playback and downloading related interfaces, mainly able to operate the media files of + * the user storage device online through the playback interface of the pilot. It can playback and download files + * of pictures and videos`. Currently, only media files in MP4 and JPG formats are supported. + * @param cameraMediaHandler: pointer to the handler for payload camera media download and playback functions. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_RegMediaDownloadPlaybackHandler(const T_DjiCameraMediaDownloadPlaybackHandler + *cameraMediaHandler); +/** + * @brief Send the video to mobile end via video stream of the data channel. This function exists and can be used only in Linux. + * @note Must ensure actual bandwidth is less than bandwidth limitation of corresponding channel or stream, please + * refer to developer documentation and state of channel/stream for details related to bandwidth limitation. User can + * get state of "videoStream" channel via DjiPayloadCamera_GetVideoStreamState() function. If actual bandwidth + * exceeds the limitation or busy state is set, the user should stop transmitting data or decrease amount of data to be + * sent. Otherwise, data may be discarded. + * @param data: pointer to data to be sent. + * @param len: length of data to be sent via data stream, and it must be less than or equal to 65000, unit: byte. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_SendVideoStream(const uint8_t *data, uint16_t len); + +/** + * @brief Get data transmission state of "videoStream" channel. User can use the state as base for controlling data + * transmission of video stream. This function exists and can be used only in Linux operation system. + * @param state: pointer to "videoStream" channel state. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_GetVideoStreamState(T_DjiDataChannelState *state); + +/** + * @brief Push added media file information to aircraft system. + * @details After photography or recording video, users must push information of created media file immediately using + * this interface. + * @param filePath: pointer to path of added media file. Guaranteed to end with '\0'. Length of path have to be less + * than ::dji_FILE_PATH_SIZE_MAX bytes. + * @param mediaFileInfo: information of added media file. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_PushAddedMediaFileInfo(const char *filePath, T_DjiCameraMediaFileInfo mediaFileInfo); + +/** + * @brief Get camera type of other payloads mounted on aircraft. + * @note Please refer to DJI documentation in DJI SDK developer website for details of conditions of use. + * @note If there is empty in requested position or payload do not have camera type, the interface will return error. + * @param payloadPosition: position where payload mounted on. + * @param cameraType: Pointer to camera type of payload. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_GetCameraTypeOfPayload(E_DjiMountPosition payloadPosition, + E_DjiCameraType *cameraType); + +/** + * @brief Get optical zoom specification of other camera payloads mounted on aircraft. + * @note Please refer to DJI documentation in DJI SDK developer website for details of conditions of use. + * @note If there is empty in requested position or payload do not have related information, the interface will return + * error. + * @param payloadPosition: position where payload mounted on. + * @param opticalZoomSpec: pointer to optical zoom specification. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_GetCameraOpticalZoomSpecOfPayload(E_DjiMountPosition payloadPosition, + T_DjiCameraOpticalZoomSpec *opticalZoomSpec); + +/** + * @brief Get hybrid zoom focal length of other camera payloads mounted on aircraft. + * @note Please refer to DJI documentation in DJI SDK developer website for details of conditions of use. + * @note If there is empty in requested position or payload do not have related information, the interface will return + * error. + * @param payloadPosition: position where payload mounted on. + * @param focalLength: Pointer to optical focal length, unit: 0.1mm. + * @return Execution result. + */ +T_DjiReturnCode DjiPayloadCamera_GetCameraHybridZoomFocalLengthOfPayload(E_DjiMountPosition payloadPosition, + uint16_t *focalLength); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_PAYLOAD_CAMERA_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_perception.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_perception.h new file mode 100644 index 0000000..3dfd258 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_perception.h @@ -0,0 +1,167 @@ +/** + ******************************************************************** + * @file dji_perception.h + * @brief This is the header file for "dji_perception.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_PERCEPTION_H +#define DJI_PERCEPTION_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +#define IMAGE_MAX_DIRECTION_NUM 6 +#define DJI_PERCEPTION_INTRINSICS_PARAM_ARRAY_NUM 9 +#define DJI_PERCEPTION_ROTATION_PARAM_ARRAY_NUM 9 +#define DJI_PERCEPTION_TRANSLATION_PARAM_ARRAY_NUM 3 + +/* Exported types ------------------------------------------------------------*/ +/** + * @bref Perception camera direction + */ +typedef enum { + DJI_PERCEPTION_RECTIFY_DOWN = 0, + DJI_PERCEPTION_RECTIFY_FRONT = 1, + DJI_PERCEPTION_RECTIFY_REAR = 2, + DJI_PERCEPTION_RECTIFY_UP = 3, + DJI_PERCEPTION_RECTIFY_LEFT = 4, + DJI_PERCEPTION_RECTIFY_RIGHT = 5 +} E_DjiPerceptionDirection; + +/** + * @bref Perception camera design location + */ +typedef enum { + RECTIFY_DOWN_LEFT = 1, + RECTIFY_DOWN_RIGHT = 2, + RECTIFY_FRONT_LEFT = 3, + RECTIFY_FRONT_RIGHT = 4, + RECTIFY_REAR_LEFT = 5, + RECTIFY_REAR_RIGHT = 6, + RECTIFY_UP_LEFT = 21, + RECTIFY_UP_RIGHT = 22, + RECTIFY_LEFT_LEFT = 23, + RECTIFY_LEFT_RIGHT = 24, + RECTIFY_RIGHT_LEFT = 25, + RECTIFY_RIGHT_RIGHT = 26 +} E_DjiPerceptionCameraPosition; + +#pragma pack(1) +/** + * @bref Perception camera ram image info + */ +typedef struct { + uint32_t index; + uint8_t direction; + uint8_t bpp; + uint32_t width; + uint32_t height; +} T_DjiPerceptionRawImageInfo; + +/** + * @bref Perception camera image info + */ +typedef struct { + T_DjiPerceptionRawImageInfo rawInfo; + uint16_t dataId; + uint16_t sequence; + //see enum E_DjiPerceptionCamPosition + uint32_t dataType; + uint64_t timeStamp; +} T_DjiPerceptionImageInfo; + +/** + * @bref Perception camera parameters + */ +typedef struct { + uint8_t direction; + float leftIntrinsics[DJI_PERCEPTION_INTRINSICS_PARAM_ARRAY_NUM]; + float rightIntrinsics[DJI_PERCEPTION_INTRINSICS_PARAM_ARRAY_NUM]; + float rotationLeftInRight[DJI_PERCEPTION_ROTATION_PARAM_ARRAY_NUM]; + float translationLeftInRight[DJI_PERCEPTION_TRANSLATION_PARAM_ARRAY_NUM]; +} T_DjiPerceptionCameraParameters; + +/** + * @bref Perception camera parameters packet + */ +typedef struct { + uint32_t timeStamp; + uint32_t directionNum; + T_DjiPerceptionCameraParameters cameraParameters[IMAGE_MAX_DIRECTION_NUM]; +} T_DjiPerceptionCameraParametersPacket; +#pragma pack() + +/** + * @bref Callback type to receive stereo camera image + */ +typedef void(*DjiPerceptionImageCallback)(T_DjiPerceptionImageInfo imageInfo, uint8_t *imageRawBuffer, + uint32_t bufferLen); + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialize the perception module. + * @note The interface initialization needs to be after DjiCore_Init. + * @return Execution result. + */ +T_DjiReturnCode DjiPerception_Init(void); + +/** + * @brief Deinitialize the perception module. + * @return Execution result. + */ +T_DjiReturnCode DjiPerception_Deinit(void); + +/** + * @brief Subscribe the raw images of both stereo cameras in the same direction. Default frequency at 20 Hz. + * @param direction: direction to specify the direction of the subscription. Ref to E_DjiPerceptionDirection + * @param callback callback to observer the stereo camera image and info. + * @return Execution result. + */ +T_DjiReturnCode DjiPerception_SubscribePerceptionImage(E_DjiPerceptionDirection direction, + DjiPerceptionImageCallback callback); + +/** + * @brief Unsubscribe the raw image of both stereo cameras in the same direction. + * @param direction: direction to specify the direction of the subscription. Ref to E_DjiPerceptionDirection + * @return Execution result. + */ +T_DjiReturnCode DjiPerception_UnsubscribePerceptionImage(E_DjiPerceptionDirection direction); + + +/** + * @brief Get the internal and external parameters of all stereo cameras. + * @return Execution result. + */ +T_DjiReturnCode DjiPerception_GetStereoCameraParameters(T_DjiPerceptionCameraParametersPacket *packet); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_PERCEPTION_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_platform.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_platform.h new file mode 100644 index 0000000..171e146 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_platform.h @@ -0,0 +1,383 @@ +/** + ******************************************************************** + * @file dji_platform.h + * @brief This is the header file for "dji_platform.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_PLATFORM_H +#define DJI_PLATFORM_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** +* @brief Platform handle of uart operation. +*/ +typedef void *T_DjiUartHandle; + +/** +* @brief Platform handle of usb bulk operation. +*/ +typedef void *T_DjiUsbBulkHandle; + +/** +* @brief Platform handle of network operation. +*/ +typedef void *T_DjiNetworkHandle; + +/** +* @brief Platform handle of thread task operation. +*/ +typedef void *T_DjiTaskHandle; + +/** +* @brief Platform handle of mutex operation. +*/ +typedef void *T_DjiMutexHandle; + +/** +* @brief Platform handle of semaphore operation. +*/ +typedef void *T_DjiSemaHandle; + +/** +* @brief Platform handle of file operation. +*/ +typedef void *T_DjiFileHandle; + +/** +* @brief Platform handle of dir operation. +*/ +typedef void *T_DjiDirHandle; + +/** +* @brief Platform handle of socket operation. +*/ +typedef void *T_DjiSocketHandle; + +typedef enum { + /** + * All aircraft type support,users can connect via chip serial port or USB to TTL serial port. + * Baud rate support list on M300 RTK Payload Port: 115200, 230400, 460800, 921600. + * Baud rate support list on M300 RTK Extension Port: 115200, 230400, 460800, 921600, 1000000. + * Baud rate support list on M30/M30T: 115200, 230400, 460800, 921600, 1000000. + * Baud rate support list on M3E/M3T: 921600. + * Baud rate support list on M350 RTK Payload Port: 115200, 230400, 460800, 921600. + * Baud rate support list on M350 RTK Extension Port: 115200, 230400, 460800, 921600, 1000000. + * */ + DJI_HAL_UART_NUM_0, + /** + * Only support on M300/M350 RTK Extension Port by USB virtual serial port, such as /dev/ttyACM0. + * Baud rate support list on M300 RTK Extension Port: 921600. + * Baud rate support list on M350 RTK Extension Port: 921600. + * */ + DJI_HAL_UART_NUM_1, +} E_DjiHalUartNum; + +typedef enum { + DJI_HAL_USB_BULK_NUM_0 = 0, + DJI_HAL_USB_BULK_NUM_1, + DJI_HAL_USB_BULK_NUM_MAX, +} E_DjiHalUsbBulkNum; + +typedef enum { + DJI_SOCKET_MODE_UDP, + DJI_SOCKET_MODE_TCP, +} E_DjiSocketMode; + +typedef struct { + bool isConnect; +} T_DjiUartStatus; + +typedef struct { + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t minute; + uint8_t second; +} T_DjiTime; + +typedef struct { + uint32_t size; + T_DjiTime createTime; + T_DjiTime modifyTime; + char path[DJI_FILE_PATH_SIZE_MAX]; + bool isDir; +} T_DjiFileInfo; + +typedef struct { + T_DjiReturnCode (*UartInit)(E_DjiHalUartNum uartNum, uint32_t baudRate, T_DjiUartHandle *uartHandle); + + T_DjiReturnCode (*UartDeInit)(T_DjiUartHandle uartHandle); + + T_DjiReturnCode (*UartWriteData)(T_DjiUartHandle uartHandle, const uint8_t *buf, uint32_t len, uint32_t *realLen); + + T_DjiReturnCode (*UartReadData)(T_DjiUartHandle uartHandle, uint8_t *buf, uint32_t len, uint32_t *realLen); + + T_DjiReturnCode (*UartGetStatus)(E_DjiHalUartNum uartNum, T_DjiUartStatus *status); +} T_DjiHalUartHandler; + +typedef struct { + uint16_t interfaceNum; + uint16_t endPointIn; + uint16_t endPointOut; +} T_DjiHalUsbBulkChannelInfo; + +typedef struct { + bool isUsbHost; + // attention: if 'isUsbHost' equals false, the following parameters is not valid. + uint16_t pid; + uint16_t vid; + T_DjiHalUsbBulkChannelInfo channelInfo; +} T_DjiHalUsbBulkInfo; + +typedef struct { + uint16_t pid; + uint16_t vid; + T_DjiHalUsbBulkChannelInfo channelInfo[DJI_HAL_USB_BULK_NUM_MAX]; +} T_DjiHalUsbBulkDeviceInfo; + +typedef struct { + struct { + uint16_t vid; + uint16_t pid; + } usbNetAdapter; +} T_DjiHalNetworkDeviceInfo; + +typedef struct { + T_DjiReturnCode (*UsbBulkInit)(T_DjiHalUsbBulkInfo usbBulkInfo, T_DjiUsbBulkHandle *usbBulkHandle); + + T_DjiReturnCode (*UsbBulkDeInit)(T_DjiUsbBulkHandle usbBulkHandle); + + T_DjiReturnCode (*UsbBulkWriteData)(T_DjiUsbBulkHandle usbBulkHandle, const uint8_t *buf, + uint32_t len, uint32_t *realLen); + + T_DjiReturnCode (*UsbBulkReadData)(T_DjiUsbBulkHandle usbBulkHandle, uint8_t *buf, + uint32_t len, uint32_t *realLen); + + T_DjiReturnCode (*UsbBulkGetDeviceInfo)(T_DjiHalUsbBulkDeviceInfo *deviceInfo); +} T_DjiHalUsbBulkHandler; + +typedef struct { + T_DjiReturnCode (*NetworkInit)(const char *ipAddr, const char *netMask, T_DjiNetworkHandle *networkHandle); + + T_DjiReturnCode (*NetworkDeInit)(T_DjiNetworkHandle networkHandle); + + T_DjiReturnCode (*NetworkGetDeviceInfo)(T_DjiHalNetworkDeviceInfo *deviceInfo); +} T_DjiHalNetworkHandler; + +typedef struct { + T_DjiReturnCode (*TaskCreate)(const char *name, void *(*taskFunc)(void *), + uint32_t stackSize, void *arg, T_DjiTaskHandle *task); + + T_DjiReturnCode (*TaskDestroy)(T_DjiTaskHandle task); + + T_DjiReturnCode (*TaskSleepMs)(uint32_t timeMs); + + T_DjiReturnCode (*MutexCreate)(T_DjiMutexHandle *mutex); + + T_DjiReturnCode (*MutexDestroy)(T_DjiMutexHandle mutex); + + T_DjiReturnCode (*MutexLock)(T_DjiMutexHandle mutex); + + T_DjiReturnCode (*MutexUnlock)(T_DjiMutexHandle mutex); + + T_DjiReturnCode (*SemaphoreCreate)(uint32_t initValue, T_DjiSemaHandle *semaphore); + + T_DjiReturnCode (*SemaphoreDestroy)(T_DjiSemaHandle semaphore); + + T_DjiReturnCode (*SemaphoreWait)(T_DjiSemaHandle semaphore); + + T_DjiReturnCode (*SemaphoreTimedWait)(T_DjiSemaHandle semaphore, uint32_t waitTimeMs); + + T_DjiReturnCode (*SemaphorePost)(T_DjiSemaHandle semaphore); + + T_DjiReturnCode (*GetTimeMs)(uint32_t *ms); + + T_DjiReturnCode (*GetTimeUs)(uint64_t *us); + + T_DjiReturnCode (*GetRandomNum)(uint16_t *randomNum); + + void *(*Malloc)(uint32_t size); + + void (*Free)(void *ptr); +} T_DjiOsalHandler; + +typedef struct { + T_DjiReturnCode (*FileOpen)(const char *fileName, const char *fileMode, T_DjiFileHandle *fileObj); + + T_DjiReturnCode (*FileClose)(T_DjiFileHandle fileObj); + + T_DjiReturnCode (*FileWrite)(T_DjiFileHandle fileObj, const uint8_t *buf, uint32_t len, uint32_t *realLen); + + T_DjiReturnCode (*FileRead)(T_DjiFileHandle fileObj, uint8_t *buf, uint32_t len, uint32_t *realLen); + + T_DjiReturnCode (*FileSeek)(T_DjiFileHandle fileObj, uint32_t offset); + + T_DjiReturnCode (*FileSync)(T_DjiFileHandle fileObj); + + T_DjiReturnCode (*DirOpen)(const char *filePath, T_DjiDirHandle *dirObj); + + T_DjiReturnCode (*DirClose)(T_DjiDirHandle dirObj); + + T_DjiReturnCode (*DirRead)(T_DjiDirHandle dirObj, T_DjiFileInfo *fileInfo); + + T_DjiReturnCode (*Mkdir)(const char *filePath); + + T_DjiReturnCode (*Unlink)(const char *filePath); + + T_DjiReturnCode (*Rename)(const char *oldFilePath, const char *newFilePath); + + T_DjiReturnCode (*Stat)(const char *filePath, T_DjiFileInfo *fileInfo); +} T_DjiFileSystemHandler; + +typedef struct { + T_DjiReturnCode (*Socket)(E_DjiSocketMode mode, T_DjiSocketHandle *socketHandle); + + T_DjiReturnCode (*Close)(T_DjiSocketHandle socketHandle); + + T_DjiReturnCode (*Bind)(T_DjiSocketHandle socketHandle, const char *ipAddr, uint32_t port); + + T_DjiReturnCode (*UdpSendData)(T_DjiSocketHandle socketHandle, const char *ipAddr, uint32_t port, + const uint8_t *buf, uint32_t len, uint32_t *realLen); + + T_DjiReturnCode (*UdpRecvData)(T_DjiSocketHandle socketHandle, char *ipAddr, uint32_t *port, + uint8_t *buf, uint32_t len, uint32_t *realLen); + + T_DjiReturnCode (*TcpListen)(T_DjiSocketHandle socketHandle); + + T_DjiReturnCode (*TcpAccept)(T_DjiSocketHandle socketHandle, char *ipAddr, uint32_t *port, + T_DjiSocketHandle *outSocketHandle); + + T_DjiReturnCode (*TcpConnect)(T_DjiSocketHandle socketHandle, const char *ipAddr, uint32_t port); + + T_DjiReturnCode (*TcpSendData)(T_DjiSocketHandle socketHandle, + const uint8_t *buf, uint32_t len, uint32_t *realLen); + + T_DjiReturnCode (*TcpRecvData)(T_DjiSocketHandle socketHandle, + uint8_t *buf, uint32_t len, uint32_t *realLen); +} T_DjiSocketHandler; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Register the handler for hal uart interfaces by your platform. + * @note It should be noted that the interface in hal is written and tested well. Users need to implement all the + * interfaces. Otherwise, the user interface cannot be successfully registered, and then the user interface is registered + * through the interface. If the registration fails, it needs to be based on the return code. To judge the problem. Make + * sure that the feature is available after a successful registration. The interface needs to be called at the beginning of + * the application for registration, otherwise, the subsequent functions will not work properly. + * @param halUartHandler: pointer to the handler for hal uart interfaces by your platform. + * @return Execution result. + */ +T_DjiReturnCode DjiPlatform_RegHalUartHandler(const T_DjiHalUartHandler *halUartHandler); + +/** + * @brief Register the handler for usb bulk interfaces by your platform. + * @param fileSystemHandler: pointer to the handler for usb bulk interfaces by your platform. + * @return Execution result. + */ +T_DjiReturnCode DjiPlatform_RegHalUsbBulkHandler(const T_DjiHalUsbBulkHandler *halUsbBulkHandler); + +/** + * @brief Register the handler for hal network interfaces by your platform. + * @note It should be noted that the interface in hal is written and tested well. Users need to implement all the + * interfaces. Otherwise, the user interface cannot be successfully registered, and then the user interface is registered + * through the interface. If the registration fails, it needs to be based on the return code. To judge the problem. Make + * sure that the feature is available after a successful registration. + * @attention The interface needs to be called at the beginning of the application for registration, otherwise, the + * subsequent functions will not work properly. + * @param osalHandler: pointer to the handler for network handler interfaces by your platform. + * @return Execution result. + */ +T_DjiReturnCode DjiPlatform_RegHalNetworkHandler(const T_DjiHalNetworkHandler *halNetworkHandler); + +/** + * @brief Register the handler for osal interfaces by your platform. + * @note It should be noted that the interface in osal is written and tested well. Users need to implement all the + * interfaces. Otherwise, the user interface cannot be successfully registered, and then the user interface is registered + * through the interface. If the registration fails, it needs to be based on the return code. To judge the problem. Make + * sure that the feature is available after a successful registration. The interface needs to be called at the beginning of + * the application for registration, otherwise, the subsequent functions will not work properly. + * @param osalHandler: pointer to the handler for osal interfaces by your platform. + * @return Execution result. + */ +T_DjiReturnCode DjiPlatform_RegOsalHandler(const T_DjiOsalHandler *osalHandler); + +/** + * @brief Register the handler for file-system interfaces by your platform. + * @param fileSystemHandler: pointer to the handler for file-system interfaces by your platform. + * @return Execution result. + */ +T_DjiReturnCode DjiPlatform_RegFileSystemHandler(const T_DjiFileSystemHandler *fileSystemHandler); + +/** + * @brief Register the handler for socket interfaces by your platform. + * @param fileSystemHandler: pointer to the handler for socket interfaces by your platform. + * @return Execution result. + */ +T_DjiReturnCode DjiPlatform_RegSocketHandler(const T_DjiSocketHandler *socketHandler); + +/** + * @brief Get the handler of osal interfaces. + * @return Pointer to osal handler. + */ +T_DjiOsalHandler *DjiPlatform_GetOsalHandler(void); + +/** + * @brief Get the handler of usb bulk interfaces. + * @return Pointer to usb bulk handler. + */ +T_DjiHalUsbBulkHandler *DjiPlatform_GetHalUsbBulkHandler(void); + +/** + * @brief Get the handler of network interfaces. + * @return Pointer to network handler. + */ +T_DjiHalNetworkHandler *DjiPlatform_GetHalNetworkHandler(void); + +/** + * @brief Get the handler of file-system interfaces. + * @return Pointer to file-system handler. + */ +T_DjiFileSystemHandler *DjiPlatform_GetFileSystemHandler(void); + +/** + * @brief Get the handler of socket interfaces. + * @return Pointer to socket handler. + */ +T_DjiSocketHandler *DjiPlatform_GetSocketHandler(void); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_PLATFORM_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_positioning.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_positioning.h new file mode 100644 index 0000000..bf50eda --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_positioning.h @@ -0,0 +1,163 @@ +/** + ******************************************************************** + * @file dji_positioning.h + * @brief This is the header file for "dji_positioning.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_POSITIONING_H +#define DJI_POSITIONING_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" +#include "dji_time_sync.h" +#include "dji_fc_subscription.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Positioning rtcm data type. + */ +typedef enum { + DJI_POSITIONING_RTCM_DATA_TYPE_RTK_ON_AIRCRAFT = 0, + DJI_POSITIONING_RTCM_DATA_TYPE_RTK_BASE_STATION = 1, +} E_DjiPositioningRtcmDataType; + +/** + * @brief Data structure that describes a positioning event. + */ +typedef struct { + /*! Index of event set in which positioning event is located. The item will be written to mark file in aircraft for + * some post-precess work. If not needed, fill in 0. */ + uint16_t eventSetIndex; + /*! Index of target point in payload whose position user is requesting. The item will be written to mark file in + * aircraft for some post-precess work. If not needed, fill in 0. */ + uint8_t targetPointIndex; + /*! Timestamp in aircraft time system when the positioning event occur. Users should transfer time in local time + * system to time in aircraft time system by DjiTimeSync_TransferToAircraftTime() interface in time + * synchronization module. */ + T_DjiTimeSyncAircraftTime eventTime; +} T_DjiPositioningEventInfo; + +/** + * @brief Data structure that describes position of a point. + */ +typedef struct { + dji_f64_t longitude; /*!< Specifies longitude, unit: degree. */ + dji_f64_t latitude; /*!< Specifies latitude, unit: degree. */ + dji_f64_t height; /*!< Specifies height above sea level, unit: m. */ +} T_DjiPositioningPosition; + +/** + * @brief Position value standard deviation. + */ +typedef struct { + dji_f32_t longitude; /*!< Specifies longitude standard deviation, unit: degree. */ + dji_f32_t latitude; /*!< Specifies latitude standard deviation, unit: degree. */ + dji_f32_t height; /*!< Specifies height standard deviation, unit: m. */ +} T_DjiPositioningPositionStandardDeviation; + +/** + * @brief Position of target point and other details returned by interface of requesting position. + */ +typedef struct { + E_DjiFcSubscriptionPositionSolutionProperty positionSolutionProperty; /*!< Property of position solution. */ + T_DjiAttitude3d uavAttitude; /*!< Specifies UAV attitude, unit: degree. */ + T_DjiVector3d offsetBetweenMainAntennaAndTargetPoint; /*!< Specifies position offset from RTK main antenna to target points in NED coordinate system, unit: mm. */ + T_DjiPositioningPosition targetPointPosition; /*!< Specifies position of target points in GROUND coordinate system. */ + T_DjiPositioningPositionStandardDeviation targetPointPositionStandardDeviation; /*!< Specifies position standard deviation of target points. */ +} T_DjiPositioningPositionInfo; + +/** + * @brief Prototype of callback function used to receive the rtk rtcm raw data. + * @param index: the index of rtcm data package. + * @param data: pointer to receive rtk rtcm data from aircraft. + * @param dataLen: receive data length of rtcm data from aircraft. + * @return Execution result. + */ +typedef T_DjiReturnCode (*DjiReceiveRtkRtcmDataCallback)(uint8_t index, const uint8_t *data, uint16_t dataLen); + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise positioning module in blocking mode. User should call this function before all other positioning + * operations, just like setting task index, register callback function and requesting positions. + * @note Max execution time of this function is slightly larger than 500ms. + * @note This function has to be called in user task, rather than main() function, and after scheduler being started. + * @return Execution result. + */ +T_DjiReturnCode DjiPositioning_Init(void); + +/** + * @brief Set task index, specifying a sequence number of operations, using to write to mark the file for some post-process + * flows. + * @details One operation may be a precise surveying and mapping task or ten exposures of camera. The default task index + * is 0. + * @param index: task index. + */ +void DjiPositioning_SetTaskIndex(uint8_t index); + +/** + * @brief The interface is used to get the position of target points and other information (refer to + * ::T_DjiPositioningPositionInfo) based on the timestamp in aircraft time system when some events (positioning events) are + * triggered. The function uses blocking mode. + * @details Users can request positions for multiple events (event set) conveniently, such as sync exposure of + * multiple cameras. User must register callback function used to get the newest PPS triggered timestamp (refer to + * DjiPositioning_RegGetNewestPpsTriggerTimeCallback()) before requesting position. When users have set structure + * parameters of payload and interest points (the points whose position user hope to get, e.g. center point of the camera + * image sensor), the target points are interest points, otherwise the target points are main gimbal interface center. + * Users can use position information of gimbal interface center, position offset between gimbal interface center and + * RTK main antenna, UAV attitude, gimbal structure parameters ,and gimbal attitude to calculate the position of interest + * points in the payload. + * @note Max execution time of this function is slightly larger than 600ms. + * @note All requested timestamp have to be between the time point 2 seconds earlier than the newest synchronized + * timestamp and the time point 1 seconds earlier than the newest synchronized timestamp. + * @param eventCount: count of positioning event set specified by eventInfo parameter. Please ensure the count is less + * than 5. + * @param eventInfo: pointer to positioning event information array. + * @param positionInfo: the position of target points. In Matrice 210 RTK V2 and Matrice 300 RTK aircraft system, it is + * the position of the main gimbal interface always. + * @return Execution result. + */ +T_DjiReturnCode DjiPositioning_GetPositionInformationSync(uint8_t eventCount, T_DjiPositioningEventInfo *eventInfo, + T_DjiPositioningPositionInfo *positionInfo); + +/** + * @brief Register callback function used to receive rtk rtcm raw data by data type. + * @note The callback function will be called after registering. The call frequency depends on the number of satellites. + * @param callback: pointer to the callback function. + * @return Execution result. + */ +T_DjiReturnCode DjiPositioning_RegReceiveRtcmDataCallback(E_DjiPositioningRtcmDataType dataType, + DjiReceiveRtkRtcmDataCallback callback); + +#ifdef __cplusplus +} +#endif + +#endif //DJI_POSITIONING_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_power_management.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_power_management.h new file mode 100644 index 0000000..8961535 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_power_management.h @@ -0,0 +1,117 @@ +/** + ******************************************************************** + * @file dji_power_management.h + * @brief This is the header file for "dji_power_management.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_POWER_MANAGEMENT_H +#define DJI_POWER_MANAGEMENT_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Pin state. + */ +typedef enum { + DJI_POWER_MANAGEMENT_PIN_STATE_RESET = 0, /*!< Specifies pin is in low level state. */ + DJI_POWER_MANAGEMENT_PIN_STATE_SET = 1, /*!< Specifies pin is in high level state. */ +} E_DjiPowerManagementPinState; + +/** + * @brief Prototype of callback function used to set level of high power application pin. + * @param pinState: level state of pin to be set. + * @return Execution result. + */ +typedef T_DjiReturnCode (*DjiWriteHighPowerApplyPinCallback)(E_DjiPowerManagementPinState pinState); + +/** + * @brief Prototype of callback function used to notify payload that the aircraft will power off soon and get state + * whether the payload is ready to power off or not. + * @warning User can not execute blocking style operations or functions in a callback function, because that will block DJI + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param powerOffPreparationFlag: pointer to memory space used to store power off preparation flag. True represents + * that payload has completed all work and is ready to power off. False represents that payload is not ready to power + * off. + * @return Execution result. + */ +typedef T_DjiReturnCode (*DjiPowerOffNotificationCallback)(bool *powerOffPreparationFlag); + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise power management module, and user should call this function before using power management features. + * @return Execution result. + */ +T_DjiReturnCode DjiPowerManagement_Init(void); + +/** + * @brief DeInitialise power management module, and user should call this function before using power management features. + * @return Execution result. + */ +T_DjiReturnCode DjiPowerManagement_DeInit(void); + +/** + * @brief Apply high power from aircraft in blocking mode. + * @details Before applying, user should register callback function used to set level state of high power application + * pin using DjiPowerManagement_RegWriteHighPowerApplyPinCallback() function. After applying high power, power pin of + * DJI adapter will output high power based predetermined specification. + * @note Max execution time of this function is slightly larger than 600ms. + * @return Execution result. + */ +T_DjiReturnCode DjiPowerManagement_ApplyHighPowerSync(void); + +/** + * @brief Register callback function used to set level state of high power application pin. Must be called before + * applying high power. + * @param callback: pointer to the callback function. + * @return Execution result. + */ +T_DjiReturnCode DjiPowerManagement_RegWriteHighPowerApplyPinCallback(DjiWriteHighPowerApplyPinCallback callback); + +/** + * @brief Register callback function used to notify payload that the aircraft will power off soon and get state + * whether the payload is ready to power off or not. + * @details After registering, the callback function will be called at a fixed frequency when aircraft will power off. + * User fill in the power off preparation flag, and once the payload is ready to power off, the callback function will not + * be called. After a specified time, if the payload is not ready to power off, the aircraft will power off immediately. The + * specified time is 10s. + * @param callback: pointer to callback function used to notify aircraft power off message and get payload power off + * preparation flag. + * @return Execution result. + */ +T_DjiReturnCode DjiPowerManagement_RegPowerOffNotificationCallback(DjiPowerOffNotificationCallback callback); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_POWER_MANAGEMENT_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_time_sync.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_time_sync.h new file mode 100644 index 0000000..fbe899b --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_time_sync.h @@ -0,0 +1,99 @@ +/** + ******************************************************************** + * @file dji_time_sync.h + * @brief This is the header file for "dji_time_sync.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_TIME_SYNC_H +#define DJI_TIME_SYNC_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Prototype of callback function used to get the newest PPS triggered timestamp. + * @warning User can not execute blocking style operations or functions in callback function, because that will block DJI + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param localTimeUs: pointer to memory space used to store PPS triggered timestamp. + * @return Execution result. + */ +typedef T_DjiReturnCode (*DjiGetNewestPpsTriggerLocalTimeUsCallback)(uint64_t *localTimeUs); + +/** + * @brief Data structure of time in aircraft time system. + */ +typedef struct { + uint16_t year; /*!< Specifies year. */ + uint8_t month; /*!< Specifies month, range from 1 to 12. */ + uint8_t day; /*!< Specifies day, range from 1 to 31. */ + uint8_t hour; /*!< Specifies hour, range from 0 to 23. */ + uint8_t minute; /*!< Specifies minute, range from 0 to 59. */ + uint8_t second; /*!< Specifies second, range from 0 to 59. */ + uint32_t microsecond; /*!< Specifies microsecond, range from 0 to 999999. */ +} T_DjiTimeSyncAircraftTime; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise time synchronization module in blocking mode. User should call this function before all other time + * synchronization operations, just like transferring time. + * @note Max execution time of this function is slightly larger than 2000ms. + * @note This function have to be called in user task, rather than main() function, and after scheduler being started. + * @return Execution result. + */ +T_DjiReturnCode DjiTimeSync_Init(void); + +/** + * @brief Register callback function used to get the newest timestamp in local time system when PPS rising edge signal + * is detected. + * @details DJI uses the timestamp information to synchronise time of local time system and RTK navigation and + * positioning system. + * @param callback: pointer to the callback function. + * @return Execution result. + */ +T_DjiReturnCode DjiTimeSync_RegGetNewestPpsTriggerTimeCallback(DjiGetNewestPpsTriggerLocalTimeUsCallback callback); + +/** + * @brief Transfer local time to time in aircraft time system. + * @note Before calling the interface, users must call DjiTimeSync_RegGetNewestPpsTriggerTimeCallback() to register + * callback function used to report the latest triggered time of PPS signal. + * @param localTimeUs: local time, unit: microsecond. + * @param aircraftTime: pointer to memory space used to store time in aircraft time system. + * @return Execution result. + */ +T_DjiReturnCode DjiTimeSync_TransferToAircraftTime(uint64_t localTimeUs, T_DjiTimeSyncAircraftTime *aircraftTime); + +#ifdef __cplusplus +} +#endif + +#endif //DJI_TIME_SYNC_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_typedef.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_typedef.h new file mode 100644 index 0000000..fe80642 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_typedef.h @@ -0,0 +1,435 @@ +/** + ******************************************************************** + * @file dji_typedef.h + * @brief This is the header file for "dji_typedef.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_TYPEDEF_H +#define DJI_TYPEDEF_H + +/* Includes ------------------------------------------------------------------*/ +#include +#include +#include +#include +#include +#include +#include +#include "dji_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +#define DJI_PI (3.14159265358979323846f) +#define DJI_FILE_NAME_SIZE_MAX 256 +#define DJI_FILE_PATH_SIZE_MAX (DJI_FILE_NAME_SIZE_MAX + 256) +#define DJI_IP_ADDR_STR_SIZE_MAX 15 +#define DJI_MD5_BUFFER_LEN 16 + +#define DJI_SUBSCRIPTION_MODULE_INDEX_OFFSET 24u +#define DJI_SUBSCRIPTION_MODULE_INDEX_MASK 0xFF000000u +#define DJI_SUBSCRIPTION_TOPIC_CODE_OFFSET 0u +#define DJI_SUBSCRIPTION_TOPIC_CODE_MASK 0x00FFFFFFu + +#define DJI_DATA_SUBSCRIPTION_TOPIC(subscriptionModule, topicCode) \ + (uint32_t)\ + (((((uint32_t)(subscriptionModule)) << (DJI_SUBSCRIPTION_MODULE_INDEX_OFFSET)) & (DJI_SUBSCRIPTION_MODULE_INDEX_MASK)) | \ + ((((uint32_t)(topicCode)) << (DJI_SUBSCRIPTION_TOPIC_CODE_OFFSET)) & (DJI_SUBSCRIPTION_TOPIC_CODE_MASK))) + +/** + * @brief Type define double as dji_f64_t. + */ +typedef double dji_f64_t; +/** + * @brief Type define float as dji_f32_t. + */ +typedef float dji_f32_t; +/** + * @brief Type define uint64 as T_DjiReturnCode. + * @details The type can be any value of ::DjiErrorCode. + */ +typedef uint64_t T_DjiReturnCode; + +typedef enum { + DJI_MOUNT_POSITION_TYPE_UNKNOWN = 0, + DJI_MOUNT_POSITION_TYPE_PAYLOAD_PORT = 1, + DJI_MOUNT_POSITION_TYPE_EXTENSION_PORT = 2, + DJI_MOUNT_POSITION_TYPE_EXTENSION_LITE_PORT = 3 +} E_DjiMountPositionType; + +typedef enum { + DJI_MOUNT_POSITION_UNKNOWN = 0, + DJI_MOUNT_POSITION_PAYLOAD_PORT_NO1 = 1, + DJI_MOUNT_POSITION_PAYLOAD_PORT_NO2 = 2, + DJI_MOUNT_POSITION_PAYLOAD_PORT_NO3 = 3, + DJI_MOUNT_POSITION_EXTENSION_PORT = 4, + DJI_MOUNT_POSITION_EXTENSION_LITE_PORT = 5, +} E_DjiMountPosition; + +typedef enum { + DJI_AIRCRAFT_SERIES_UNKNOWN = 0, + DJI_AIRCRAFT_SERIES_M200_V2 = 1, + DJI_AIRCRAFT_SERIES_M300 = 2, + DJI_AIRCRAFT_SERIES_M30 = 3, + DJI_AIRCRAFT_SERIES_M3 = 4, + DJI_AIRCRAFT_SERIES_M350 = 5, + DJI_AIRCRAFT_SERIES_M3D = 6, + DJI_AIRCRAFT_SERIES_FC30 = 7, +} E_DjiAircraftSeries; + +typedef enum { + DJI_AIRCRAFT_TYPE_UNKNOWN = 0, /*!< Aircraft type is unknown. */ + DJI_AIRCRAFT_TYPE_M200_V2 = 44, /*!< Aircraft type is Matrice 200 V2. */ + DJI_AIRCRAFT_TYPE_M210_V2 = 45, /*!< Aircraft type is Matrice 220 V2. */ + DJI_AIRCRAFT_TYPE_M210RTK_V2 = 46, /*!< Aircraft type is Matrice 210 RTK V2. */ + DJI_AIRCRAFT_TYPE_M300_RTK = 60, /*!< Aircraft type is Matrice 300 RTK. */ + DJI_AIRCRAFT_TYPE_M30 = 67, /*!< Aircraft type is Matrice 30. */ + DJI_AIRCRAFT_TYPE_M30T = 68, /*!< Aircraft type is Matrice 30T. */ + DJI_AIRCRAFT_TYPE_M3E = 77, /*!< Aircraft type is Mavic 3E. */ + DJI_AIRCRAFT_TYPE_FC30 = 78, /* ! */ + DJI_AIRCRAFT_TYPE_M3T = 79, /*!< Aircraft type is Mavic 3T. */ + DJI_AIRCRAFT_TYPE_M350_RTK = 89, /*!< Aircraft type is Matrice 350 RTK. */ + DJI_AIRCRAFT_TYPE_M3D = 91, /*!< Aircraft type is Matrice 3D. */ + DJI_AIRCRAFT_TYPE_M3TD = 93, /*!< Aircraft type is Matrice 3TD. */ +} E_DjiAircraftType; + +/** + * @brief Camera type. + */ +typedef enum { + DJI_CAMERA_TYPE_UNKNOWN = 0, /*!< Camera type is unknown. */ + DJI_CAMERA_TYPE_Z30 = 20, /*!< Camera type is Z30. */ + DJI_CAMERA_TYPE_XT2 = 26, /*!< Camera type is XT2. */ + DJI_CAMERA_TYPE_PSDK = 31, /*!< Camera type is third party camera based on Payload SDK. */ + DJI_CAMERA_TYPE_XTS = 41, /*!< Camera type is XT S. */ + DJI_CAMERA_TYPE_H20 = 42, /*!< Camera type is H20. */ + DJI_CAMERA_TYPE_H20T = 43, /*!< Camera type is H20T. */ + DJI_CAMERA_TYPE_H20N = 61, /*!< Camera type is H20N. */ + DJI_CAMERA_TYPE_P1 = 50, /*!< Camera type is P1. */ + DJI_CAMERA_TYPE_L1, /*!< Camera type is L1. */ + DJI_CAMERA_TYPE_L2 = 84, /*!< Camera type is L2. */ + DJI_CAMERA_TYPE_M30 = 52, /*!< Camera type is M30. */ + DJI_CAMERA_TYPE_M30T = 53, /*!< Camera type is M30T. */ + DJI_CAMERA_TYPE_M3E = 66, /*!< Camera type is M3E. */ + DJI_CAMERA_TYPE_M3T = 67, /*!< Camera type is M3T. */ + DJI_CAMERA_TYPE_M3D = 80, /*!< Camera type is Matrice 3D. */ + DJI_CAMERA_TYPE_M3TD = 81, /*!< Camera type is Matrice 3TD. */ + DJI_CAMERA_TYPE_H30 = 82, /*!< Camera type is H30. */ + DJI_CAMERA_TYPE_H30T = 83, /*!< Camera type is H30T. */ +} E_DjiCameraType; + +/** + * @brief Camera supported media file subtype. + */ +typedef enum +{ + DJI_DOWNLOAD_FILE_ORG = 0, /*!< Media sub file origin data type. */ + DJI_DOWNLOAD_FILE_LDR = 21, /*!< Media sub file cloud point raw data type. */ + DJI_DOWNLOAD_FILE_SIG = 22, /*!< Media sub file point cloud signature type. */ + DJI_DOWNLOAD_FILE_RTK = 23, /*!< Media sub file point cloud real-time kinematic type. */ + DJI_DOWNLOAD_FILE_CLC = 25, /*!< Media sub file radar-camera external reference type. */ + DJI_DOWNLOAD_FILE_CLI = 26, /*!< Media sub file radar-IMU external reference type. */ + DJI_DOWNLOAD_FILE_IMU = 27, /*!< Media sub file IMU data type. */ + DJI_DOWNLOAD_FILE_RTL = 28, /*!< Media sub file RTK boom data type. */ + DJI_DOWNLOAD_FILE_RTB = 29, /*!< Media sub file RTK base station data type. */ + DJI_DOWNLOAD_FILE_RTS = 30, /*!< Media sub file RTK secondary antenna data type. */ + DJI_DOWNLOAD_FILE_RPOS = 31, /*!< Media sub file real-time fusion of attitude and position data type. */ +} E_DjiCameraMediaFileSubType; + +/** + * @brief Camera supported media file type. + */ +typedef enum { + DJI_CAMERA_FILE_TYPE_JPEG = 0, /*!< Media file JPEG type. */ + DJI_CAMERA_FILE_TYPE_DNG = 1, /*!< Media file DNG type. */ + DJI_CAMERA_FILE_TYPE_MOV = 2, /*!< Media file MOV type. */ + DJI_CAMERA_FILE_TYPE_MP4 = 3, /*!< Media file MP4 type. */ + DJI_CAMERA_FILE_TYPE_TIFF = 5, /*!< Media file TIFF type. */ + DJI_CAMERA_FILE_TYPE_LDRT = 24, /*!< Media file LDRT type. */ + DJI_CAMERA_FILE_TYPE_RPT = 25, /*!< Media file RPT type. */ + DJI_CAMERA_FILE_TYPE_UNKNOWN = 255, /*!< Media file unknown type. */ +} E_DjiCameraMediaFileType; + +/** + * @brief Camera optical zoom specifies. + */ +typedef struct { + uint16_t maxFocalLength; /*!< The maximum focal length of the lens, unit: 0.1mm. */ + uint16_t minFocalLength; /*!< The minimum focal length of the lens, unit: 0.1mm. */ + uint16_t focalLengthStep; /*!< The minimum interval of focal length change, unit: 0.1mm. */ +} T_DjiCameraOpticalZoomSpec; + +/** + * @brief Gimbal work mode, specifies how gimbal follow aircraft movement. + */ +typedef enum { + DJI_GIMBAL_MODE_FREE = 0, /*!< Free mode, fix gimbal attitude in the ground coordinate, ignoring movement of aircraft. */ + DJI_GIMBAL_MODE_FPV = 1, /*!< FPV (First Person View) mode, only control roll and yaw angle of gimbal in the ground coordinate to follow aircraft. */ + DJI_GIMBAL_MODE_YAW_FOLLOW = 2, /*!< Yaw follow mode, only control yaw angle of gimbal in the ground coordinate to follow aircraft. */ +} E_DjiGimbalMode; + +/** + * @brief Gimbal rotation mode, specifies control style. + */ +typedef enum { + DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE = 0, /*!< Relative angle rotation mode, represents rotating gimbal specified angles based on current angles. */ + DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE = 1, /*!< Absolute angle rotation mode, represents rotating gimbal to specified angles in the ground coordinate. */ + DJI_GIMBAL_ROTATION_MODE_SPEED = 2, /*!< Speed rotation mode, specifies rotation speed of gimbal in the ground coordinate. */ +} E_DjiGimbalRotationMode; + +/** + * @brief Mobile APP system language. + */ +typedef enum { + DJI_MOBILE_APP_LANGUAGE_UNKNOWN = 255, /*!< The system language of the mobile app is unknown */ + DJI_MOBILE_APP_LANGUAGE_ENGLISH = 0, /*!< The system language of the mobile app is English */ + DJI_MOBILE_APP_LANGUAGE_CHINESE = 1, /*!< The system language of the mobile app is Chinese */ + DJI_MOBILE_APP_LANGUAGE_JAPANESE = 2, /*!< The system language of the mobile app is Japanese */ + DJI_MOBILE_APP_LANGUAGE_FRENCH = 3, /*!< The system language of the mobile app is French */ +} E_DjiMobileAppLanguage; + +/** + * @brief Mobile APP screen size type. + */ +typedef enum { + DJI_MOBILE_APP_SCREEN_TYPE_UNKNOWN = 255, /*!< Mobile APP screen type is unknown. */ + DJI_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN = 0, /*!< Screen size is 6 inches or larger. */ + DJI_MOBILE_APP_SCREEN_TYPE_LITTLE_SCREEN = 1, /*!< Screen size is less than 6 inches. */ +} E_DjiMobileAppScreenType; + +/** + * @brief Subscription frequency type. + */ +typedef enum { + DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ = 1, + DJI_DATA_SUBSCRIPTION_TOPIC_5_HZ = 5, + DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ = 10, + DJI_DATA_SUBSCRIPTION_TOPIC_50_HZ = 50, + DJI_DATA_SUBSCRIPTION_TOPIC_100_HZ = 100, + DJI_DATA_SUBSCRIPTION_TOPIC_200_HZ = 200, + DJI_DATA_SUBSCRIPTION_TOPIC_400_HZ = 400, +} E_DjiDataSubscriptionTopicFreq; + +/** + * @brief DJI module enum for defining data subscription module. + */ +typedef enum { + DJI_DATA_SUBSCRIPTION_MODULE_FC = 0, + DJI_DATA_SUBSCRIPTION_MODULE_CAMERA, + DJI_DATA_SUBSCRIPTION_MODULE_ERROR, +} E_DjiDataSubscriptionModule; + +/** + * @brief SDK adapter type. + */ +typedef enum { + DJI_SDK_ADAPTER_TYPE_UNKNOWN = 0, /*!< SDK adapter type is unknown. */ + DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 = 1, /*!< SDK adapter type is Skyport V2. */ + DJI_SDK_ADAPTER_TYPE_XPORT = 2, /*!< SDK adapter type is X-Port. */ + DJI_SDK_ADAPTER_TYPE_NONE = 3, /*!< No external adapter is connected. */ +} E_DjiSdkAdapterType; + +typedef enum { + DJI_CHANNEL_ADDRESS_UNKNOWN = 0, + DJI_CHANNEL_ADDRESS_PAYLOAD_PORT_NO1, + DJI_CHANNEL_ADDRESS_PAYLOAD_PORT_NO2, + DJI_CHANNEL_ADDRESS_PAYLOAD_PORT_NO3, + DJI_CHANNEL_ADDRESS_EXTENSION_PORT, + DJI_CHANNEL_ADDRESS_MASTER_RC_APP, + DJI_CHANNEL_ADDRESS_SLAVE_RC_APP, + DJI_CHANNEL_ADDRESS_CLOUD_API, +} E_DjiChannelAddress; + +/** + * @brief Camera focus target point when in focus mode. + */ +typedef struct { + dji_f32_t focusX; /*!< Specifies the horizontal coordinate within the zone. Range: 0 to 1. + The point [0.0, 0.0] represents the top-left corner of the screen.*/ + dji_f32_t focusY; /*!< Specifies vertical zone coordinate. Range: 0 to 1. */ +} T_DjiCameraPointInScreen; + +/** + * @brief Camera time interval settings for interval shoot-photo mode. + */ +typedef struct { + uint8_t captureCount; /*!< Specifies the total capture count of interval settings. + * 0: reserved, 1-254: specific number, 255: continuous capture until stopped. */ + uint16_t timeIntervalSeconds; /*!< Specifies the interval time between two captures, unit: s*/ +} T_DjiCameraPhotoTimeIntervalSettings; + +/** + * @brief Camera zoom speeds. + */ +typedef enum { + DJI_CAMERA_ZOOM_SPEED_SLOWEST = 72, /*!< Slowest zoom speed. */ + DJI_CAMERA_ZOOM_SPEED_SLOW = 73, /*!< Slow zoom speed. */ + DJI_CAMERA_ZOOM_SPEED_MODERATELY_SLOW = 74, /*!< Slightly slower than normal zoom speed. */ + DJI_CAMERA_ZOOM_SPEED_NORMAL = 75, /*!< Normal zoom speed. */ + DJI_CAMERA_ZOOM_SPEED_MODERATELY_FAST = 76, /*!< Slightly faster than normal zoom speed. */ + DJI_CAMERA_ZOOM_SPEED_FAST = 77, /*!< Fast zoom speed. */ + DJI_CAMERA_ZOOM_SPEED_FASTEST = 78, /*!< Fastest zoom speed. */ +} E_DjiCameraZoomSpeed; + +typedef enum { + /*! The burst mode can capture 2 pictures per trigger. */ + DJI_CAMERA_BURST_COUNT_2 = 2, + /*! The burst mode can capture 3 pictures per trigger. */ + DJI_CAMERA_BURST_COUNT_3 = 3, + /*! The burst mode can capture 5 pictures per trigger. */ + DJI_CAMERA_BURST_COUNT_5 = 5, + /*! The burst mode can capture 7 pictures per trigger. */ + DJI_CAMERA_BURST_COUNT_7 = 7, + /*! Supports capturing 10 pictures per trigger, only supported by X4S, X5S cameras, and Phantom 4 Pro. */ + DJI_CAMERA_BURST_COUNT_10 = 10, + /*! Supports capturing 14 pictures per trigger, only supported by X4S, X5S cameras, and Phantom 4 Pro. */ + DJI_CAMERA_BURST_COUNT_14 = 14, + /*! Unknown burst count. */ + DJI_CAMERA_BURST_COUNT_KNOWN = 0xFF, +} E_DjiCameraBurstCount; + +/** + * @brief Camera zoom direction. + */ +typedef enum { + DJI_CAMERA_ZOOM_DIRECTION_OUT = 0, /*!< Zooms out, reducing the zoom factor. */ + DJI_CAMERA_ZOOM_DIRECTION_IN = 1, /*!< Zooms in, increasing the zoom factor. */ +} E_DjiCameraZoomDirection; +#pragma pack (1) + +/** + * @brief Data channel state. + */ +typedef struct { + /*! Realtime bandwidth limitation, varying with link status of aircraft system for some channels, such as data + * stream, video stream and download stream. Must ensure actual bandwidth of data transmission is less than + * realtime bandwidth limitation, unit: byte/s. */ + int32_t realtimeBandwidthLimit; + + /*! Realtime actual transmission bandwidth of data transmission channel calculated before flow controller, unit: byte/s. */ + int32_t realtimeBandwidthBeforeFlowController; + + /*! Realtime actual transmission bandwidth of data transmission channel calculated after flow controller, unit: + * byte/s. If specified channel without flow controller. the value is equal to + * ::realtimeBandwidthBeforeFlowController. */ + int32_t realtimeBandwidthAfterFlowController; + + /*! State specified whether the channel is busy or not. When data can not be sent to the endpoint directly, instead be + * sent to buffer of flow controller or discarded, the busy state will be set. At this time, the user should stop + * transmitting data or decrease the amount of data to be transmitted via this channel. When data bandwidth restore to + * normal, this state will be clear again. */ + bool busyState; +} T_DjiDataChannelState; + +/** + * @brief Represents a vector using int32 coordinates. + */ +typedef struct Vector3d{ + int32_t x; /*!< X-coordinate of the vector. */ + int32_t y; /*!< Y-coordinate of the vector. */ + int32_t z; /*!< Z-coordinate of the vector. */ +} T_DjiVector3d; + +/** + * @brief Represents a vector using floating-point coordinates. + */ +typedef struct Vector3f{ + dji_f32_t x; /*!< X-coordinate of the vector. */ + dji_f32_t y; /*!< Y-coordinate of the vector. */ + dji_f32_t z; /*!< Z-coordinate of the vector. */ +} T_DjiVector3f; + +/** + * @brief Represents an attitude using int32 values for pitch, roll, and yaw. + */ +typedef struct { + int32_t pitch; /*!< Pitch angle in degrees. */ + int32_t roll; /*!< Roll angle in degrees. */ + int32_t yaw; /*!< Yaw angle in degrees. */ +} T_DjiAttitude3d; + +/** + * @brief Represents an attitude using floating-point values for pitch, roll, and yaw. + */ +typedef struct { + dji_f32_t pitch; /*!< Pitch angle in degrees. */ + dji_f32_t roll; /*!< Roll angle in degrees. */ + dji_f32_t yaw; /*!< Yaw angle in degrees. */ +} T_DjiAttitude3f; + +/** + * @brief Represents a quaternion, when converted to a rotation matrix or Euler angles. + */ +typedef struct { + dji_f32_t q0; /*!< Quaternion component w. */ + dji_f32_t q1; /*!< Quaternion component x. */ + dji_f32_t q2; /*!< Quaternion component y. */ + dji_f32_t q3; /*!< Quaternion component z. */ +} T_DjiQuaternion4f; + +/** + * @brief Timestamp data structure. + */ +typedef struct { + uint32_t millisecond; + uint32_t microsecond; +} T_DjiDataTimestamp; + +/** + * @brief The firmware version of payload. + * @note The firmware version is displayed as AA.BB.CC.DD where AA is majorVersion, + * BB is minorVersion, CC is modifyVersion, and DD is debugVersion. + */ +typedef struct { + uint8_t majorVersion; /*!< Major version number, ranging from 0 to 99. */ + uint8_t minorVersion; /*!< Minor version number, ranging from 0 to 99. */ + uint8_t modifyVersion; /*!< Modification version number, ranging from 0 to 99. */ + uint8_t debugVersion; /*!< Debug version number, ranging from 0 to 99. */ +} T_DjiFirmwareVersion; + +#pragma pack () +/** + * @brief Prototype of callback function used to receive data of topic. + * @warning User can not execute blocking style operations or functions in the callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param data: pointer to data of the topic, user need transfer type of this pointer to the corresponding data structure + * pointer for getting every item of the topic conveniently. + * @param dataSize: the size of memory space pointed by data argument, equal to data structure size corresponding to the topic. + * @param timestamp: pointer to timestamp corresponding this data. Use flight controller power-on timestamp on M300 RTK. + * Use payload local timestamp on M30/M30T. + * @return Execution result. + */ +typedef T_DjiReturnCode (*DjiReceiveDataOfTopicCallback)(const uint8_t *data, uint16_t dataSize, + const T_DjiDataTimestamp *timestamp); + +/* Exported functions --------------------------------------------------------*/ + + +#ifdef __cplusplus +} +#endif + +#endif // DJI_TYPEDEF_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_upgrade.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_upgrade.h new file mode 100644 index 0000000..4497478 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_upgrade.h @@ -0,0 +1,216 @@ +/** + ******************************************************************** + * @file dji_upgrade.h + * @brief This is the header file for "dji_upgrade.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_UPGRADE_H +#define DJI_UPGRADE_H + +/* Includes ------------------------------------------------------------------*/ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef enum { + /*! + * @brief FTP firmware transfer type. + * @note This transfer type only support linux platform and use network port. Users need to deploy FTP service on + * payload. The ftp user info used to transfer upgrade firmware is : + * username:dji_payload_ftp + * password:DJi_#$31 + * You can get guide about FTP service deployment on https://developer.dji.com/payload-sdk/documentation + */ + DJI_FIRMWARE_TRANSFER_TYPE_FTP = 0, + /*! + * @brief DCFTP firmware transfer type. + * @details DCFTP (DJI Common File Transfer Protocol) is a private protocol used to transfer file on DJI Product. + * Users can get file data by command callbacks, see :: T_DjiUpgradeDcftpFileTransferOpt. + * @note This transfer type is used to support RTOS platform or payload don't have network port. The transfer speed + * is very slow compare to FTP because it uses low speed transfer channel. + */ + DJI_FIRMWARE_TRANSFER_TYPE_DCFTP, +} E_DjiFirmwareTransferType; + +typedef enum { + DJI_UPGRADE_STAGE_IDLE = 0, /*!< Idle stage means not in upgrade mode. */ + DJI_UPGRADE_STAGE_ONGOING = 3, /*!< Ongoing stage means payload is upgrading. */ + DJI_UPGRADE_STAGE_DEVICE_REBOOT = 6, /*!< Device reboot stage means device is rebooting. */ + DJI_UPGRADE_STAGE_END = 4, /*!< End Stage means upgrade finish and reporting upgrade result to the terminal APP. */ +} E_DjiUpgradeStage; + +typedef enum { + DJI_UPGRADE_END_STATE_SUCCESS = 1, /*!< Upgrade success. */ + DJI_UPGRADE_END_STATE_UNKNOWN_ERROR = 2, /*!< Upgrade failure due to unknown reason. */ +} E_DjiUpgradeEndState; + +typedef struct { + uint8_t upgradeProgress; /*!< The upgrade progress, the range is 0 ~ 100. */ +} T_DjiUpgradeOngoingInfo; + +typedef struct { + uint8_t rebootTimeout; /*!< The timeout value of rebooting device. unit: s */ +} T_DjiUpgradeRebootInfo; + +typedef struct { + E_DjiUpgradeEndState upgradeEndState; /*!< The upgrade end state */ +} T_DjiUpgradeEndInfo; + +typedef struct { + uint32_t port; /*!< FTP port used to transfer file, default is 21 */ +} T_DjiUpgradeFtpFileTransferInfo; + +typedef struct { + uint32_t fileSize; /*! The size of file. */ + char fileName[DJI_FILE_NAME_SIZE_MAX]; /*! The name of file. */ +} T_DjiUpgradeFileInfo; + +typedef struct { + /** + * @brief Prototype of callback function used to start file transfer. + * @param fileInfo: the file info about the file to be transferred. + * @return Execution result. + */ + T_DjiReturnCode (*start)(const T_DjiUpgradeFileInfo *fileInfo); + /** + * @brief Prototype of callback function used to transfer file data. + * @details After start transfer, this callback function will be called several times to transfer file data sequentially. + * @param data: pointer to memory space used to store file data. + * @param dataLen: the data length of data. + * @return Execution result. + */ + T_DjiReturnCode (*transfer)(const uint8_t *data, uint16_t dataLen); + /** + * @brief Prototype of callback function used to finish file transfer. + * @param md5: the md5 value of file, used to check the correctness of the file transfer . + * @return Execution result. + */ + T_DjiReturnCode (*finish)(const uint8_t md5[DJI_MD5_BUFFER_LEN]); +} T_DjiUpgradeDcftpFileTransferOpt; + +typedef struct { + /*! The firmware transfer type for upgrade. */ + E_DjiFirmwareTransferType transferType; + + /*! If transferType is DJI_FIRMWARE_TRANSFER_TYPE_FTP, need support ftpTransferInfo. */ + T_DjiUpgradeFtpFileTransferInfo ftpTransferInfo; + /*! If transferType is DJI_FIRMWARE_TRANSFER_TYPE_DCFTP, need support dcftpFileTransferOpt. */ + T_DjiUpgradeDcftpFileTransferOpt dcftpFileTransferOpt; +} T_DjiFirmwareTransferInfo; + +typedef struct { + /*! The upgrade stage in upgrade process. */ + E_DjiUpgradeStage upgradeStage; + + union { + /*! If upgradeStage is DJI_UPGRADE_STAGE_ONGOING, need support upgradeOngoingInfo. */ + T_DjiUpgradeOngoingInfo upgradeOngoingInfo; + /*! If upgradeStage is DJI_UPGRADE_STAGE_DEVICE_REBOOT, need support upgradeRebootInfo. */ + T_DjiUpgradeRebootInfo upgradeRebootInfo; + /*! If upgradeStage is DJI_UPGRADE_STAGE_END, need support upgradeEndInfo. */ + T_DjiUpgradeEndInfo upgradeEndInfo; + }; +} T_DjiUpgradeState; + +typedef struct { + T_DjiFirmwareVersion currentFirmwareVersion; /*!< The current firmware version of payload. */ + T_DjiFirmwareTransferInfo firmwareTransferInfo; /*!< The firmware transfer info of payload. */ +} T_DjiUpgradeConfig; + +typedef struct { + /** + * @brief Prototype of callback function used to enter upgrade mode. + * @param waitTime: the wait time for enter upgrade mode. The terminal APP will wait these time before do other + * upgrade actions. You can use this time to prepare for firmware upgrade in other task, such as clean firmware + * store area. unit: s + * @return Execution result. + */ + T_DjiReturnCode (*EnterUpgradeMode)(uint16_t *waitTime); + /** + * @brief Prototype of callback function used to check transferred firmware. + * @details You can verify signature and decrypt firmware in this callback function. + * @return Execution result. + */ + T_DjiReturnCode (*CheckFirmware)(void); + /** + * @brief Prototype of callback function used to start firmware upgrade. + * @note After start upgrade, the upgrade stage need change to ::DJI_UPGRADE_STAGE_ONGOING + * @return Execution result. + */ + T_DjiReturnCode (*StartUpgrade)(void); + /** + * @brief Prototype of callback function used to finish firmware upgrade. + * @note After call finish upgrade, the upgrade stage need change from ::DJI_UPGRADE_STAGE_END to ::DJI_UPGRADE_STAGE_IDLE + * @return Execution result. + */ + T_DjiReturnCode (*FinishUpgrade)(void); +} T_DjiUpgradeHandler; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise upgrade module, and user should call this function before using upgrade features. + * @param upgradeConfig: upgrade init configuration. + * @return Execution result. + */ +T_DjiReturnCode DjiUpgrade_Init(const T_DjiUpgradeConfig *upgradeConfig); + +/** + * @brief Enable local upgrade mode. + * @details After enable local upgrade mode, DJI Assistant 2 will display payload upgrade interface. Users can choose + * firmware file to upgrade payload. + * @return Execution result. + */ +T_DjiReturnCode DjiUpgrade_EnableLocalUpgrade(void); + +/** + * @brief Register the handler for upgrade process. + * @param upgradeHandler: pointer to structure of handler functions for upgrade process. + * @return Execution result. + */ +T_DjiReturnCode DjiUpgrade_RegHandler(const T_DjiUpgradeHandler *upgradeHandler); + +/** + * @brief Push upgrade state to terminal app. + * @param upgradeState: upgrade state in upgrade process. + * @note When start upgrade, you need push upgrade state until finish upgrade. The upgrade state push logic is : + * 1. StartUpgrade callback called; + * 2. The upgrade stage change to :: DJI_UPGRADE_STAGE_ONGOING. Push upgrade state upgradeOngoingInfo when upgradeOngoingInfo changed; + * 3. After upgrade ongoing, change upgrade stage to DJI_UPGRADE_STAGE_DEVICE_REBOOT and push upgrade state upgradeRebootInfo; + * 4. Device reboot; + * 4. After device reboot, change upgrade stage to DJI_UPGRADE_STAGE_END and continuous push upgrade state upgradeEndInfo (recommended 1Hz); + * 5. FinishUpgrade Callback called, stop push upgrade state. The upgrade process finished. + * @return Execution result. + */ +T_DjiReturnCode DjiUpgrade_PushUpgradeState(const T_DjiUpgradeState *upgradeState); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_UPGRADE_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_version.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_version.h new file mode 100644 index 0000000..12d39b0 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_version.h @@ -0,0 +1,51 @@ +/** + ******************************************************************** + * @file dji_version.h + * @brief This is the header file for "dji_version.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_VERSION_H +#define DJI_VERSION_H + +/* Includes ------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +#define DJI_VERSION_MAJOR 3 /*!< DJI SDK major version num, when have incompatible API changes. Range from 0 to 99. */ +#define DJI_VERSION_MINOR 9 /*!< DJI SDK minor version num, when add functionality in a backwards compatible manner changes. Range from 0 to 99. */ +#define DJI_VERSION_MODIFY 1 /*!< DJI SDK modify version num, when have backwards compatible bug fixes changes. Range from 0 to 99. */ +#define DJI_VERSION_BETA 0 /*!< DJI SDK version beta info, release version will be 0, when beta version release changes. Range from 0 to 255. */ +#define DJI_VERSION_BUILD 2090 /*!< DJI SDK version build info, when jenkins trigger build changes. Range from 0 to 65535. */ + +/* Exported types ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif // DJI_VERSION_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v2.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v2.h new file mode 100644 index 0000000..6918b26 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v2.h @@ -0,0 +1,124 @@ +/** + ******************************************************************** + * @file dji_waypoint_v2.h + * @brief This is the header file for "dji_waypoint_v2.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_WAYPOINT_V2_H +#define DJI_WAYPOINT_V2_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" +#include "dji_waypoint_v2_type.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef T_DjiReturnCode (*WaypointV2EventCbFunc)(T_DjiWaypointV2MissionEventPush eventData); +typedef T_DjiReturnCode (*WaypointV2StateCbFunc)(T_DjiWaypointV2MissionStatePush stateData); + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise waypoint v2 module, and user should call this function + * before using waypoint v2 features. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_Init(void); + +/** + * @brief Deinitialise waypoint v2 module. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_Deinit(void); + +/** + * @brief Init waypoint v2 mission settings + * @param info: see reference of T_DjiWayPointV2MissionSettings. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_UploadMission(const T_DjiWayPointV2MissionSettings *info); + +/** + * @brief Start execute waypoint v2 mission + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_Start(void); + +/** + * @brief Stop execute waypoint v2 mission + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_Stop(void); + +/** + * @brief Pause execute waypoint v2 mission + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_Pause(void); + +/** + * @brief Resume execute waypoint v2 mission + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_Resume(void); + +/** + * @brief Get the global cruise speed setting from flight controller + * @param cruiseSpeed: see references of T_DjiWaypointV2GlobalCruiseSpeed. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_GetGlobalCruiseSpeed(T_DjiWaypointV2GlobalCruiseSpeed *cruiseSpeed); + +/** + * @brief Set the global cruise speed setting to flight controller + * @param cruiseSpeed: see references of T_DjiWaypointV2GlobalCruiseSpeed. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_SetGlobalCruiseSpeed(T_DjiWaypointV2GlobalCruiseSpeed cruiseSpeed); + +/** + * @brief Subscribe to waypointV2 event with a callback function. + * @note There will be data when the event is triggered. + * @param callback: see references of WaypointV2EventCbFunc. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_RegisterMissionEventCallback(WaypointV2EventCbFunc callback); + +/** + * @brief Subscribe to waypointV2 mission state with a callback function. + * @note Data is pushed with a frequency of 10Hz. + * @param callback: see references of WaypointV2StateCbFunc. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV2_RegisterMissionStateCallback(WaypointV2StateCbFunc callback); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_WAYPOINT_V2_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v2_type.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v2_type.h new file mode 100644 index 0000000..2591e0c --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v2_type.h @@ -0,0 +1,1150 @@ +/** + ******************************************************************** + * @file dji_waypoint_v2_type.h + * @brief This is the header file for "dji_waypoint_v2_type.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_WAYPOINT_V2_TYPE_H +#define DJI_WAYPOINT_V2_TYPE_H + +/* Includes ------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Type define dji_f32_t as T_DjiWaypointV2GlobalCruiseSpeed. + * @details Type used for global cruise speed of waypoint mission, unit: m/s. + */ +typedef dji_f32_t T_DjiWaypointV2GlobalCruiseSpeed; + +/** +* Actions will be taken when the waypoint mission is finished. +*/ +typedef enum { + + /** + * No further action will be taken. + * The aircraft can be controlled by the remote controller. + */ + DJI_WAYPOINT_V2_FINISHED_NO_ACTION, + + /** + * Goes home when the mission is finished. The aircraft will + * land directly if it is within 20 meters away from the home point. + */ + DJI_WAYPOINT_V2_FINISHED_GO_HOME, + + /** + * The aircraft will land automatically at the last waypoint. + */ + DJI_WAYPOINT_V2_FINISHED_AUTO_LANDING, + + /** + * The aircraft will go back to the first waypoint and hover. + */ + DJI_WAYPOINT_V2_FINISHED_GO_TO_FIRST_WAYPOINT, + + /** + * When the aircraft reaches its final waypoint, it will hover without ending the + * mission. The joystick can still be used to pull the aircraft back along its + * previous waypoints. The only way this mission can end is if stopMission is + * called. + */ + DJI_WAYPOINT_V2_FINISHED_CONTINUE_UNTIL_STOP +} E_DJIWaypointV2MissionFinishedAction; + +typedef enum { + /** + * Stops current mission when the remote controller signal(RC) is lost. + * And execute rc lost action which is choosed by users on APP. + * note:the option can be invalid only if you didn't obtain joystick authority + * (DjiFlightController_ObtainJoystickCtrlAuthority).Or it will continue executing + * the mission + */ + DJI_WAYPOINT_V2_MISSION_STOP_WAYPOINT_V2_AND_EXECUTE_RC_LOST_ACTION, + + /** + * Continue executing the mission when the remote controller signal(RC) is lost.. + */ + DJI_WAYPOINT_V2_MISSION_KEEP_EXECUTE_WAYPOINT_V2, +} E_DJIWaypointV2MissionActionWhenRcLost; + +typedef enum { + + /** + * Go to the waypoint safely. The aircraft will rise to the same altitude of the + * waypoint if the current altitude is lower then the waypoint altitude. It then + * goes to the waypoint coordinate from the current altitude, and proceeds to the + * altitude of the waypoint. + */ + DJI_WAYPOINT_V2_MISSION_GO_TO_FIRST_WAYPOINT_MODE_SAFELY, + + /** + * Go to the waypoint from the current aircraft point to the waypoint directly. + */ + DJI_WAYPOINT_V2_MISSION_GO_TO_FIRST_WAYPOINT_MODE_POINT_TO_POINT, +} E_DJIWaypointV2MissionGotoFirstWaypointMode; + +/** +* Waypoint flight path mode. +*/ +typedef enum { + + /** + * In the mission, the aircraft will go to the waypoint along a curve and fly past the waypoint. + */ + DJI_WAYPOINT_V2_FLIGHT_PATH_MODE_GO_TO_POINT_ALONG_CURVE, + + /** + * In the mission, the aircraft will go to the waypoint along a curve and stop at the waypoint. + */ + DJI_WAYPOINT_V2_FLIGHT_PATH_MODE_GO_TO_POINT_ALONG_CURVE_AND_STOP, + + /** + * In the mission, the aircraft will go to the waypoint along a straight line and stop at the waypoint. + */ + DJI_WAYPOINT_V2_FLIGHT_PATH_MODE_GO_TO_POINT_IN_STRAIGHT_AND_STOP, + + /** + * In the mission, the aircraft will fly from the previous waypoint to the next waypoint along a smooth curve without stopping at this waypoint. + * the next in a curved motion, adhering to the ``DJIWaypointV2_dampingDistance``, which is + * set in ``DJIWaypointV2``. + */ + DJI_WAYPOINT_V2_FLIGHT_PATH_MODE_COORDINATE_TURN, + + /** + * In the mission, the aircraft will go to the first waypoint along a straight line. + * This is only valid for the first waypoint. + */ + DJI_WAYPOINT_V2_FLIGHT_PATH_MODE_GO_TO_FIRST_POINT_ALONG_STRAIGHT_LINE, + + /** + * Straight exit the Last waypoint, Only valid for last waypoint. + */ + DJI_WAYPOINT_V2_FLIGHT_PATH_MODE_STRAIGHT_OUT, + + /** + * Unknown + */ + DJI_WAYPOINT_V2_FLIGHT_PATH_MODE_UNKNOWN = 0xFF, +} E_DJIWaypointV2FlightPathMode; + +/** +* Represents current aircraft's heading mode on current waypoint. +*/ +typedef enum { + + /** + * Aircraft's heading will always be in the direction of flight. + */ + DJI_WAYPOINT_V2_HEADING_MODE_AUTO, + + /** + * Aircraft's heading will be set to the heading when reaching the first waypoint. + * Before reaching the first waypoint, the aircraft's heading can be controlled by + * the remote controller. When the aircraft reaches the first waypoint, its + * heading will be fixed. + */ + DJI_WAYPOINT_V2_HEADING_FIXED, + + /** + * The aircraft's heading in the mission can be controlled by the remote controller. + */ + DJI_WAYPOINT_V2_HEADING_MANUAL, + + /** + * In the mission, the aircraft's heading will change dynamically and adapt to the heading set at the next waypoint. + * See ``DJIWaypointV2_heading`` to preset the heading. + */ + DJI_WAYPOINT_V2_HEADING_WAYPOINT_CUSTOM, + + /** + * Aircraft's heading will always toward point of interest. + * using ``DJIWaypointV2_pointOfInterest`` setting point of interest coordiate and ``DJIWaypointV2_pointOfInterestAltitude`` + * setting point of interset altitute. + */ + DJI_WAYPOINT_V2_HEADING_TOWARDS_POINT_OF_INTEREST, + + /** + * The aircraft's heading rotate simultaneously with its gimbal's yaw. + */ + DJI_WAYPOINT_V2_HEADING_GIMBAL_YAW_FOLLOW, + + /** + * Unknown. + */ + DJI_WAYPOINT_V2_HEADING_UNKNOWN = 0xFF, +} E_DJIWaypointV2HeadingMode; + +/** +* The direction when the aircraft changes its heading to adapt to the heading at the waypoint. +*/ +typedef enum { + + /** + * The aircraft's heading rotates clockwise. + */ + DJI_WAYPOINT_V2_TURN_MODE_CLOCK_WISE, + + /** + * The aircraft's heading rotates counterclockwise. + */ + DJI_WAYPOINT_V2_TURN_MODE_COUNTER_CLOCK_WISE, + + /** + * Changes the heading of the aircraft by rotating the aircraft anti-clockwise. + */ + DJI_WAYPOINT_V2_TURN_MODE_UNKNOWN = 0xFF, +} E_DJIWaypointV2TurnMode; + +/** + * All the possible state of ``WaypointV2MissionOperator``. + */ +typedef enum { + /** + * Waypoint mission state is ground station not start. + */ + DJI_WAYPOINT_V2_MISSION_STATE_GROUND_STATION_NOT_START = 0, + + /** + * Waypoint mission state is mission prepared. + */ + DJI_WAYPOINT_V2_MISSION_STATE_MISSION_PREPARED = 1, + + /** + * Waypoint mission state is enter mission. + */ + DJI_WAYPOINT_V2_MISSION_STATE_ENTER_MISSION = 2, + + /** + * Waypoint mission state is execute flying route mission. + */ + DJI_WAYPOINT_V2_MISSION_STATE_EXECUTING = 3, + + /** + * Waypoint mission state is pause state. + */ + DJI_WAYPOINT_V2_MISSION_STATE_PAUSED = 4, + + /** + * Waypoint mission state is enter mission after ending pause. + */ + DJI_WAYPOINT_V2_MISSION_STATE_ENTER_MISSION_AFTER_ENDING_PAUSE = 5, + + /** + * Waypoint mission state is exit mission. + */ + DJI_WAYPOINT_V2_MISSION_STATE_EXIT_MISSION = 6, +} E_DJIWaypointV2MissionState; + +/*! waypoint position relative to WayPointV2InitSettings's reference point + * unit: m + */ +typedef struct { + dji_f32_t positionX; /*! X distance to reference point, North is positive*/ + dji_f32_t positionY; /*! Y distance to reference point, East is positive*/ + dji_f32_t positionZ; /*! Z distance to reference point, UP is positive*/ +} T_DjiWaypointV2RelativePosition; + +/** + * Represents current waypoint's speed config. + */ +typedef struct { + /*! 0: set local waypoint's cruise speed, + * 1: unset local waypoint's cruise speed*/ + uint16_t useLocalCruiseVel; + + /*! 0: set local waypoint's max speed, + * 1: unset local waypoint's max speed*/ + uint16_t useLocalMaxVel; +} T_DjiWaypointV2Config; + +typedef struct { + /*! waypoint position relative to WayPointV2InitSettings's reference point + * unit: m + */ + dji_f64_t longitude; + dji_f64_t latitude; + dji_f32_t relativeHeight; /*! relative to takeoff height*/ + + /** + * Waypoint flight path mode. + */ + E_DJIWaypointV2FlightPathMode waypointType; + + /** + * Represents current aircraft's heading mode on current waypoint. + */ + E_DJIWaypointV2HeadingMode headingMode; + + /** + * Represents current waypoint's speed config. + */ + T_DjiWaypointV2Config config; + + uint16_t dampingDistance; + + /** + * The heading to which the aircraft will rotate by the time it reaches the + * waypoint. The aircraft heading will gradually change between two waypoints with + * different headings if the waypoint mission's `headingMode` is set to + * `DJIWaypointV2_DJIWaypointV2HeadingMode_WaypointCustom`. A heading has a range of + * [-180, 180] degrees, where 0 represents True North. + */ + dji_f32_t heading; + + /** + * Determines whether the aircraft will turn clockwise or anticlockwise when + * changing its heading. + */ + E_DJIWaypointV2TurnMode turnMode; + + /** + * Property is used when ``DJIWaypointV2_headingMode`` is + * ``DJIWaypointV2_DJIWaypointV2HeadingMode_TowardPointOfInterest``. + * Aircraft will always be heading to point while executing mission. Default is + * "kCLLocationCoordinate2DInvalid". + */ + T_DjiWaypointV2RelativePosition pointOfInterest; + + /** + * While the aircraft is travelling between waypoints, you can offset its speed by + * using the throttle joystick on the remote controller. "maxFlightSpeed" is this + * offset when the joystick is pushed to maximum deflection. For example, If + * maxFlightSpeed is 10 m/s, then pushing the throttle joystick all the way up will + * add 10 m/s to the aircraft speed, while pushing down will subtract 10 m/s from + * the aircraft speed. If the remote controller stick is not at maximum deflection, + * then the offset speed will be interpolated between "[0, maxFlightSpeed]"" with a + * resolution of 1000 steps. If the offset speed is negative, then the aircraft + * will fly backwards to previous waypoints. When it reaches the first waypoint, it + * will then hover in place until a positive speed is applied. "maxFlightSpeed" has + * a range of [2,15] m/s. + * + * unit: m/s + */ + dji_f32_t maxFlightSpeed; + + /** + * The base automatic speed of the aircraft as it moves between waypoints with + * range [-15, 15] m/s. The aircraft's actual speed is a combination of the base + * automatic speed, and the speed control given by the throttle joystick on the + * remote controller. If "autoFlightSpeed >0": Actual speed is "autoFlightSpeed" + + * Joystick Speed (with combined max of "maxFlightSpeed") If "autoFlightSpeed =0": + * Actual speed is controlled only by the remote controller joystick. If + * "autoFlightSpeed <0" and the aircraft is at the first waypoint, the aircraft + * will hover in place until the speed is made positive by the remote controller + * joystick. In flight controller firmware 3.2.10.0 or above, different speeds + * between individual waypoints can also be set in waypoint objects which will + * overwrite "autoFlightSpeed". + * + * unit: m/s. + */ + dji_f32_t autoFlightSpeed; +} T_DjiWaypointV2; + +typedef struct { + T_DjiWaypointV2 *waypointV2; + uint16_t waypointV2Num; +} T_DjiWaypointV2List; + +/** +* Possible types of action trigger. +*/ +typedef enum { + /** + * The action will be triggered when action associated executes. + * The parameters should be defined by ``DJIWaypointV2Action_E_DJIWaypointV2AssociateTriggerParam``. + */ + DJI_WAYPOINT_V2_ACTION_TRIGGER_ACTION_ASSOCIATED = 2, + + /** + * The action will be triggered when the aircraft flies from one waypoint to the next. + * The parameters should be defined by ``DJIWaypointV2Action_T_DJIWaypointV2TrajectoryTriggerParam``. + */ + DJI_WAYPOINT_V2_ACTION_TRIGGER_TYPE_TRAJECTORY, + + /** + * The action will be triggered when the aircraft flies between two waypoints + * The parameters should be defined by ``DJIWaypointV2Action_T_DJIWaypointV2IntervalTriggerParam``. + */ + DJI_WAYPOINT_V2_ACTION_TRIGGER_TYPE_INTERVAL, + + /** + * The action will be trigger when the aircraft reach the waypoint point. + * The parameters should be setting by ``DJIWaypointV2SampleReachPointTriggerParam``. + */ + DJI_WAYPOINT_V2_ACTION_TRIGGER_TYPE_SAMPLE_REACH_POINT, + + /** + * Unknown + */ + DJI_WAYPOINT_V2_ACTION_TRIGGER_TYPE_UNKNOWN = 0xFF +} E_DJIWaypointV2ActionTriggerType; + +/** +* The type of ``DJIWaypointV2Action_E_DJIWaypointV2AssociateTriggerParam``, +* Determines the time to execute the trigger associated with another one. +*/ +typedef enum { + + /** + * The trigger starts simultaneously with the trigger that is associated. + */ + DJI_WAYPOINT_V2_TRIGGER_ASSOCIATED_TIMING_TYPE_SIMULTANEOUSLY = 1, + + /** + * The trigger starts after the trigger associated has finished. + */ + DJI_WAYPOINT_V2_TRIGGER_ASSOCIATED_TIMING_TYPE_AFTER_FINISHED, + + /** + * Unkown timing type. + */ + DJI_WAYPOINT_V2_TRIGGER_ASSOCIATED_TIMING_TYPE_UNKNOWN = 0xFF, +} E_DJIWaypointV2TriggerAssociatedTimingType; + +/** +* The type of ``DJIWaypointV2Action_DJIWaypointV2IntervalTriggerParam``, +* Determines the interval type of how action repeats. +*/ +typedef enum { + /** + * The action will be repeated after a particular period of time. + */ + DJI_WAYPOINT_V2_ACTION_INTERVAL_TYPE_TIME = 1, + + /** + * The action will be repeated after a particular distance. + */ + DJI_WAYPOINT_V2_ACTION_INTERVAL_TYPE_DISTANCE, + + /** + * Unknown action trigger type. + */ + DJI_WAYPOINT_V2_ACTION_INTERVAL_TYPE_UNKNOWN = 0xFF, +} E_DJIWaypointV2ActionIntervalType; + +/** +* Possible types of action actuator. +*/ +typedef enum { + + /** + * The action will be executed by the camera. + * The parameters should be defined by ``DJIWaypointV2Action_DJIWaypointV2CameraActuatorParam``. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_TYPE_CAMERA = 1, + + /** + * The action will be executed by the gimbal. + * The parameters should be defined by ``DJIWaypointV2Action_DJIWaypointV2GimbalActuatorParam``. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_TYPE_GIMBAL = 2, + + /** + * The action will executes by control aircraft. + * The parameters should be setting by ``DJIWaypointV2Action_DJIWaypointV2CameraActuatorParam``. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_TYPE_AIRCRAFT_CONTROL = 4, + + /** + * Unknown actuator type. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_TYPE_UNKNOWN = 0xFF +} E_DJIWaypointV2ActionActuatorType; + +/** +* Possible types of camera actuator operation. +*/ +typedef enum { + + /** + * Starts to shoot a photo. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_CAMERA_OPERATION_TYPE_TAKE_PHOTO = 1, + + /** + * Starts to record a video. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_CAMERA_OPERATION_TYPE_START_RECORD_VIDEO, + + /** + * Stops to record a video. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_CAMERA_OPERATION_TYPE_STOP_RECORD_VIDEO, + + /** + * Starts focus. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_CAMERA_OPERATION_TYPE_FOCUS, + + /** + * Starts focal lenth. Only support those support flocal lenth cameras. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_CAMERA_OPERATION_TYPE_FOCUL_LENGTH, + + /** + * Unknown. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_CAMERA_OPERATION_TYPE_UNKNOWN = 0xFF, +} E_DJIWaypointV2ActionActuatorCameraOperationType; + +/** +* The type of gimbal actuator operation. +*/ +typedef enum { + + /** + * Rotates the gimbal. Only valid when the trigger type is + * ``DJIWaypointV2MissionV2_DJIWaypointV2TriggerAssociatedTimingType_ReachPoint``. + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_GIMBAL_OPERATION_TYPE_ROTATE_GIMBAL = 1, + + /** + * Unknown + */ + DJI_WAYPOINT_V2_ACTION_ACTUATOR_GIMBAL_OPERATION_TYPE_UNKNOWN = 0xFF, +} E_DJIWaypointV2ActionActuatorGimbalOperationType; + +/*! Get the remain memory ack data + */ +typedef struct { + uint16_t totalMemory; + uint16_t remainMemory; +} T_DjiWaypointV2GetRemainMemory; + +/*! Get the mission's start and stop index ack data + */ +typedef struct { + uint32_t result; + uint16_t startIndex; + uint16_t endIndex; +} T_DjiWaypointV2GetWaypointStartEndIndex; + +#pragma pack(1) +typedef struct { + /** + * It determines the index of the waypoint at which the action will be + * triggered. + */ + uint16_t waypointIndex; + + uint16_t terminateNum; + +} T_DJIWaypointV2SampleReachPointTriggerParam; + +/** +* This class defines +* ``DJIWaypointV2MissionV2_DJIWaypointV2ActionTriggerType_ActionAssociated``. +*/ +typedef struct { + /** + * The type of assciate trigger.see "E_DJIWaypointV2TriggerAssociatedTimingType" + */ + uint8_t actionAssociatedType: 7; + + /** + * Waiting time uint + * 1:seconds 0:milliseconds + */ + + uint8_t waitTimeUint: 1; + + /** + * Waiting time in seconds after ActionTrigger starts. + */ + uint8_t waitingTime; + + /** + * Associated action ID. + */ + uint16_t actionIdAssociated; +} T_DJIWaypointV2AssociateTriggerParam; + +/** +* This class represents a trajectory trigger action when should be trigger. +*/ +typedef struct { + /** + * It determines the index of the waypoint at which the trigger starts. + */ + uint16_t startIndex; + + /** + * It determines the waypoint when the trigger stops. + */ + uint16_t endIndex; +} T_DJIWaypointV2TrajectoryTriggerParam; + +/** +* This class defines +* ``DJIWaypointV2MissionV2_DJIWaypointV2ActionTriggerType_Trajectory``. +*/ +typedef struct { + /** + * It determines the index of the waypoint at which the trigger starts. + */ + uint16_t startIndex; + + /** + * If the + * ``DJIWaypointV2Action_T_DJIWaypointV2IntervalTriggerParam_actionIntervalType`` + * is ``DJIWaypointV2MissionV2_DJIWaypointV2TriggerAssociatedTimingType_Time`` + * The time interval in 0.01 seconds when two action are executed as the aircraft + * moves + * from the current waypoint to the next waypoint. + * If the + * ``DJIWaypointV2Action_T_DJIWaypointV2IntervalTriggerParam_actionIntervalType`` + * is + * ``DJIWaypointV2MissionV2_DJIWaypointV2TriggerAssociatedTimingType_Distance`` + * The distance interval in 0.01 meters when two action are executed as the + * aircraft + * moves + * from the current waypoint to the next waypoint. + */ + uint16_t interval; + /** + * The type of interval trigger. + * See ``E_DJIWaypointV2ActionIntervalType``. + */ + uint8_t actionIntervalType; + +} T_DJIWaypointV2IntervalTriggerParam; + +typedef struct { + //see "E_DJIWaypointV2ActionTriggerType" + uint8_t actionTriggerType; + union { + T_DJIWaypointV2SampleReachPointTriggerParam sampleReachPointTriggerParam; + T_DJIWaypointV2AssociateTriggerParam associateTriggerParam; + T_DJIWaypointV2TrajectoryTriggerParam trajectoryTriggerParam; + T_DJIWaypointV2IntervalTriggerParam intervalTriggerParam; + }; +} T_DJIWaypointV2Trigger; + +/*! Focus point parameter + */ +typedef struct { + /*! x axis focus point value + * range: [0,1] + */ + dji_f32_t x; + /*! y axis focus point value + * range: [0,1] + */ + dji_f32_t y; +} T_DjiWaypointV2CGPoint; + +/** +* This class defines a camera focus operation for +* ``DJIWaypointV2Action_DJIWaypointV2CameraActuatorParam``. +*/ +typedef struct { + /** + * The lens focus target point. When the focus mode is auto, the target point + * is the focal point. When the focus mode is manual, the target point is the + * zoom + * out area if the focus assistant is enabled for the manual mode. + * The range for x and y is from 0.0 to 1.0. The point [0.0, 0.0] represents + * the top-left angle of the screen. + */ + T_DjiWaypointV2CGPoint focusTarget; + + /** + * focus type: + * 0:point focus + * 1:rectangle focus + */ + uint8_t regionType; + + /** + * Normalized focus area width(0,1) + */ + dji_f32_t width; + + /** + * Normalized focus area height(0,1) + */ + + dji_f32_t height; + + uint32_t reserve; + + /** + * [0,255] + */ + uint8_t retryTimes; +} T_DJIWaypointV2CameraFocusParam; + +/** +* This class defines a camera focal length operation for +* ``DJIWaypointV2Action_DJIWaypointV2CameraActuatorParam``. +*/ +typedef struct { + /** + * Focal length of zoom lens. Valid range is + * [``DJICamera_DJICameraOpticalZoomSpec_minFocalLength``, + * ``DJICamera_DJICameraOpticalZoomSpec_minFocalLength``] + * and must be a multiple of + * ``DJICamera_DJICameraOpticalZoomSpec_focalLengthStep``. + * Only support by those camera + * ``DJICamera_CameraSettings_isOpticalZoomSupported`` return ``TRUE``. + */ + uint16_t focalLength; + + uint8_t retryTimes; + +} T_DJIWaypointV2CameraFocalLengthParam; + +/** +* This class defines the parameters for +* ``DJIWaypointV2Action_DJIWaypointV2Actuator``. +* This determines how the camera will be performed when a waypoint mission is +* executing. +*/ +typedef struct { + /** + * The operation type of camera actuator. + * See + * ``DJIWaypointV2MissionV2_DJIWaypointV2ActionActuatorCameraOperationType``. + */ + uint16_t operationType; + + union { + /** + * The parameters for camera focus operation. It is valid only when + * ``DJIWaypointV2Action_DJIWaypointV2CameraActuatorParam_operationType`` + * is + * ``DJIWaypointV2MissionV2_DJIWaypointV2ActionActuatorCameraOperationType_Focus`` + */ + T_DJIWaypointV2CameraFocusParam focusParam; + + /** + * The parameters for camera focus length operation. It is valid only when + * ``DJIWaypointV2Action_DJIWaypointV2CameraActuatorParam_operationType`` + * is + * ``DJIWaypointV2MissionV2_DJIWaypointV2ActionActuatorCameraOperationType_FocalLength`` + */ + T_DJIWaypointV2CameraFocalLengthParam zoomParam; + }; + +} T_DJIWaypointV2CameraActuatorParam; + +/*! Gimbal rotation parameter + */ +typedef struct { + + int16_t x; /*! gimbal roll angle, unit: 0.1 deg,range:[-3600, 3600]*/ + int16_t y; /*! gimbal pitch angle, unit: 0.1 deg,range:[-3600, 3600]*/ + int16_t z; /*! gimbal yaw angle, unit: 0.1 deg,range:[-3600, 3600]*/ + uint8_t ctrl_mode: 1; /*! 0: absolute position control, 1:relative position control*/ + uint8_t rollCmdIgnore: 1;/*! 0: roll command normal, 1: roll command ignore*/ + uint8_t pitchCmdIgnore: 1;/*! 0: pitch command normal, 1: pitch command ignore*/ + uint8_t yawCmdIgnore: 1; /*! 0: yaw command normal, 1: yaw command ignore*/ + uint8_t absYawModeRef: 1; /*! 0: absoluate rotate yaw relative to aircraft, + * 1: absoluate rotate yaw relative to North*/ + uint8_t reserved: 3; + uint8_t durationTime; /*! 0: rotate time,unit:0.1s, range[1,255]*/ +} T_DJIGimbalRotation; + +/** +* This class defines the parameters for +* ``DJIWaypointV2Action_DJIWaypointV2Actuator``. It determines how the +* gimbal actuator will be performed when a waypoint mission is executed. +*/ +typedef struct { + /** + * The operation type of gimbal actuator. + * See + * ``E_DJIWaypointV2ActionActuatorGimbalOperationType``. + */ + uint16_t operationType; + + /** + * The rotation of gimbal actuator. + */ + T_DJIGimbalRotation rotation; +} T_DJIWaypointV2GimbalActuatorParam; + +/** +* Possible types of aircraft control actuator operation. +*/ +typedef enum { + /** + * Rotates the aircraft's yaw. + */ + DJIWaypointV2ActionActuatorAircraftControlOperationTypeRotateYaw = 1, + + /** + * Keeps the aircraft stop flying or start flying. + */ + DJIWaypointV2ActionActuatorAircraftControlOperationTypeFlyingControl = 2, + + /** + * Unknown + */ + DJIWaypointV2ActionActuatorAircraftControlOperationTypeUnknown = 0xFF, +} E_DJIWaypointV2ActionActuatorAircraftControlOperationType; + +/** +* This class defines how the aircraft rotates on the yaw axis. +*/ +typedef struct { + /** + * Determines the aircraft rotate heading relative. + * if ``TRUE``, when the aircraft is rotating, relative to the current angle. + */ + uint8_t isRelative: 1; + + uint8_t reserved: 7; + + /** + * Determines the direction how aircraft changes its heading. + */ + dji_f32_t yaw; + +} T_DJIWaypointV2AircraftControlRotateHeadingParam; + +/** +* This class defines if the aircraft starts or stops the flight. +*/ +typedef struct { + /** + * Determines the aircraft start flying or stop flying. + * ``TRUE`` for the aircraft to start flying. + */ + uint8_t isStartFlying: 1; + uint8_t reserved: 7; +} T_DJIWaypointV2AircraftControlFlyingParam; + +/** +* This class defines the parameters for +* ``DJIWaypointV2Action_DJIWaypointV2Actuator``. It determines how the +* aircraft control actuator will be performed when a waypoint mission is +* executed. +*/ +typedef struct { + /** + * The operation type of aircraft control actuator. + * See + * ``DJIWaypointV2MissionV2_DJIWaypointV2ActionActuatorAircraftControlOperationType``. + */ + uint16_t operationType; + + union { + /** + * The parameter for rotating the aircraft's heading. It's valid only when + * ``DJIWaypointV2Action_DJIWaypointV2AircraftControlParam_operationType`` + * is + * ``DJIWaypointV2MissionV2_DJIWaypointV2ActionActuatorAircraftControlOperationType_RotateYaw`` + */ + + T_DJIWaypointV2AircraftControlRotateHeadingParam yawRotatingParam; + + /** + * The parameters to control flying behavior. It's valid only when + * ``DJIWaypointV2Action_DJIWaypointV2AircraftControlParam_operationType`` + * is + * ``DJIWaypointV2MissionV2_DJIWaypointV2ActionActuatorAircraftControlOperationType_FlyingControl`` + */ + + T_DJIWaypointV2AircraftControlFlyingParam flyControlParam; + }; +} T_DJIWaypointV2AircraftControlParam; + +/** +* This class defines an actuator for ``DJIWaypointV2Action``. It determines +* how the +* action is performed when a waypoint mission is executed. +*/ +typedef struct { + /** + * The type of Actuator.see "E_DJIWaypointV2ActionActuatorType" + */ + uint8_t actuatorType; + + /** + * The index of actuator. It is valid when the diagnostics is related + * to camera or gimbal and the connected product has multiple gimbals and + * cameras. + */ + uint8_t actuatorIndex; + + union { + /** + * The camera actuator param, It is valid only when the + * ``DJIWaypointV2Action_DJIWaypointV2Actuator_type`` + * is ``DJIWaypointV2MissionV2_DJIWaypointV2ActionActuatorType_Camera``. + */ + T_DJIWaypointV2CameraActuatorParam cameraActuatorParam; + + /** + * Parameters for gimbal actuator. It is valid only when the + * ``DJIWaypointV2Action_DJIWaypointV2Actuator_type`` + * is ``DJIWaypointV2MissionV2_DJIWaypointV2ActionActuatorType_Gimbal``. + */ + T_DJIWaypointV2GimbalActuatorParam gimbalActuatorParam; + + /** + * Parameters for aircraft control actuator. It is valid only when the + * ``DJIWaypointV2Action_DJIWaypointV2Actuator_type`` + * is + * ``DJIWaypointV2MissionV2_DJIWaypointV2ActionActuatorType_AircraftControl``. + */ + T_DJIWaypointV2AircraftControlParam aircraftControlActuatorParam; + }; +} T_DJIWaypointV2Actuator; + +/** +* This class represents an action for ``DJIWaypointV2Mission``. It +* determines how +* action is performed when a waypoint mission is executed. +*/ +typedef struct { + /** + * The ID of Action. + */ + uint16_t actionId; + + /** + * The trigger of action. + */ + T_DJIWaypointV2Trigger trigger; + + /** + * The actuator of action. + */ + T_DJIWaypointV2Actuator actuator; +} T_DJIWaypointV2Action; + +/** + * @brief Waypoint V2 Mission Initialization Settings Internal + * User have no need to use it + */ +typedef struct { + uint16_t version; + uint8_t reserved; + uint32_t missionID; + uint16_t missTotalLen; + uint16_t waypointCount; + uint8_t repeatTimes; + //see "E_DJIWaypointV2MissionFinishedAction" + uint8_t finishedAction; + uint16_t maxFlightSpeed; + uint16_t autoFlightSpeed; + uint16_t startIndex; + uint8_t actionWhenRcLost; + //see "E_DJIWaypointV2MissionGotoFirstWaypointMode" + uint8_t gotoFirstWaypointMode; + dji_f64_t refLati; + dji_f64_t refLong; + dji_f32_t refAlti; +} T_WayPointV2InitSettingsInternal; + +/*! Mission's event data + */ +typedef union { + /*event ID:0x01*/ + uint8_t interruptReason; //0x00:rc triggered interrupt + + /*!event ID:0x02 + * 0x00:Finish recover from pause; + * 0x10:Start recover from break; + * 0x11:Finish recover from break; + * 0x12:Fail recover from break. + */ + uint8_t recoverProcess; + + /*!event ID:0x03 + * 0x00:finished successfully. + * 0x10:External user trigger ended successfully. + * 0x20:Request the route when motors is starting on the ground. + * 0x21:Auto takeoff time out. + * 0x22:Auto takeoff did not reach the predetermined altitude. + * 0x23:AUto takeoff abnormal. + * 0x24:Preempted by high priority tasks. + * 0x25:Unknown reason. + * 0x26:Route planning failure + */ + uint8_t exitReason; + + /*event ID:0x10*/ + uint16_t waypointIndex; + + /*event ID:0x11*/ + struct T_DjiWaypointV2MissionExecEvent { + uint8_t currentMissionExecTimes; + uint8_t finishedAllMissExecTimes: 1; //0:not finished; 1:finished all exec num + uint8_t reserved: 7; + } T_DjiWaypointV2MissionExecEvent; + + /* event ID:0x12*/ + uint8_t avoidState; + + /*ID:0x30*/ + struct T_DjiWaypointV2ActionExecEvent { + uint16_t actionId; + /*! + * 0x00: device id not mounted or identified + * 0x01: is free + * 0x02: is running + * 0x03: be paused + */ + uint8_t preActuatorState; + /*! + * 0x00: device id not mounted or identified + * 0x01: is free + * 0x02: is running + * 0x03: be paused + */ + uint8_t curActuatorState; + /*! + * error code + */ + uint32_t result; + } T_DjiWaypointV2ActionExecEvent; +} U_DjiWaypointV2EventData; + +/*! Mission's event push ack data + */ +typedef struct { + /*! + * 0x01: mission interrupt event + * 0x02: mission resume event + * 0x03: mission stop event + * 0x10: mission arrival event + * 0x11: route finished event + * 0x12: avoid obstacle event + * 0x30: action switch event + */ + uint8_t event; + uint32_t FCTimestamp; + U_DjiWaypointV2EventData data; +} T_DjiWaypointV2MissionEventPush; +#pragma pack() + +/*! Mission's state push data + */ +typedef struct { + uint16_t curWaypointIndex; + uint8_t state; /*!< enum-type: E_DJIWaypointV2MissionState. */ + uint16_t velocity; /*!< Uint:0.01m/s. */ +} T_DjiWaypointV2MissionStatePush; + +typedef struct { + T_DJIWaypointV2Action *actions; + uint16_t actionNum; +} T_DJIWaypointV2ActionList; + +/** + * @brief Waypoint V2 Mission Initialization settings + * @details This is one of the few structs in the OSDK codebase that + * is used in both a sending and a receiving API. + */ +typedef struct { + + /** + * The Mission ID. Use to distinguish different mission + */ + uint32_t missionID; + + /** + * Mission execution can be repeated more than once. A value of 0 means the mission + * only executes once, and does not repeat. A value of 1 means the mission will + * execute a total of two times. + */ + uint8_t repeatTimes; + + /** + * Action the aircraft will take when the waypoint mission is complete. + */ + E_DJIWaypointV2MissionFinishedAction finishedAction; + + /** + * While the aircraft is travelling between waypoints, you can offset its speed by + * using the throttle joystick on the remote controller. `maxFlightSpeed` is this + * offset when the joystick is pushed to maximum deflection. For example, If + * maxFlightSpeed is 10 m/s, then pushing the throttle joystick all the way up + * will add 10 m/s to the aircraft speed, while pushing down will subtract 10 m/s + * from the aircraft speed. If the remote controller stick is not at maximum + * deflection, then the offset speed will be interpolated between [0, + * `maxFlightSpeed`] with a resolution of 1000 steps. If the offset speed is + * negative, then the aircraft will fly backwards to previous waypoints. When it + * reaches the first waypoint, it will then hover in place until a positive speed + * is applied. `maxFlightSpeed` has a range of [2,15] m/s. + * + * unit: m/s + */ + dji_f32_t maxFlightSpeed; + + /** + * The base automatic speed of the aircraft as it moves between waypoints with + * range [-15, 15] m/s. The aircraft's actual speed is a combination of the base + * automatic speed, and the speed control given by the throttle joystick on the + * remote controller. If `autoFlightSpeed` >0: Actual speed is `autoFlightSpeed` + + * Joystick Speed (with combined max of `maxFlightSpeed`) If `autoFlightSpeed` =0: + * Actual speed is controlled only by the remote controller joystick. If + * `autoFlightSpeed` <0 and the aircraft is at the first waypoint, the aircraft + * will hover in place until the speed is made positive by the remote controller + * joystick. + * + * unit: m/s + */ + dji_f32_t autoFlightSpeed; + + /** + * Determines action when connection between the aircraft + * and remote controller is lost. + * + */ + E_DJIWaypointV2MissionActionWhenRcLost actionWhenRcLost; + + /** + * Defines how the aircraft will go to the first waypoint from its current + * position. Default is ``DJIWaypointV2MissionV2_DJIWaypointV2MissionGotoWaypointMode_Safely``. + */ + E_DJIWaypointV2MissionGotoFirstWaypointMode gotoFirstWaypointMode; + + T_DjiWaypointV2 *mission; + /** + * The Mission waypoint total number could not exceed 65535 + */ + uint16_t missTotalLen; + + T_DJIWaypointV2ActionList actionList; +} T_DjiWayPointV2MissionSettings; + +/* Exported functions --------------------------------------------------------*/ + + +#ifdef __cplusplus +} +#endif + +#endif // DJI_WAYPOINT_V2_TYPE_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v3.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v3.h new file mode 100644 index 0000000..b1d411f --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_waypoint_v3.h @@ -0,0 +1,159 @@ +/** + ******************************************************************** + * @file dji_waypoint_v3.h + * @brief This is the header file for "dji_waypoint_v3.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_WAYPOINT_V3_H +#define DJI_WAYPOINT_V3_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** +* @brief Waypoint v3 mission action. +*/ +typedef enum { + DJI_WAYPOINT_V3_ACTION_START = 0, /*!< Waypoint v3 mission start action. */ + DJI_WAYPOINT_V3_ACTION_STOP = 1, /*!< Waypoint v3 mission stop action. */ + DJI_WAYPOINT_V3_ACTION_PAUSE = 2, /*!< Waypoint v3 mission pause action. */ + DJI_WAYPOINT_V3_ACTION_RESUME = 3, /*!< Waypoint v3 mission resume action. */ +} E_DjiWaypointV3Action; + +/** +* Waypoint v3 current mission state. +*/ +typedef enum { + DJI_WAYPOINT_V3_MISSION_STATE_IDLE = 0, /*!< Waypoint v3 mission in idle state. */ + DJI_WAYPOINT_V3_MISSION_STATE_PREPARE = 16, /*!< Waypoint v3 mission in prepare state. */ + DJI_WAYPOINT_V3_MISSION_STATE_TRANS_MISSION = 32, /*!< Waypoint v3 mission in trans mission state. */ + DJI_WAYPOINT_V3_MISSION_STATE_MISSION = 48, /*!< Waypoint v3 mission in mission state. */ + DJI_WAYPOINT_V3_MISSION_STATE_BREAK = 64, /*!< Waypoint v3 mission in break state. */ + DJI_WAYPOINT_V3_MISSION_STATE_RESUME = 80, /*!< Waypoint v3 mission in resume state. */ + DJI_WAYPOINT_V3_MISSION_STATE_RETURN_FIRSTPOINT = 98, /*!< Waypoint v3 mission in return first point state. */ +} E_DjiWaypointV3MissionState; + +/** +* Waypoint v3 current action state. +*/ +typedef enum { + DJI_WAYPOINT_V3_ACTION_STATE_IDLE = 0, /*!< Waypoint v3 action in idle state. */ + DJI_WAYPOINT_V3_ACTION_STATE_RUNNING = 1, /*!< Waypoint v3 action in idle state. */ + DJI_WAYPOINT_V3_ACTION_STATE_FINISHED = 5, /*!< Waypoint v3 action in idle state. */ +} E_DjiWaypointV3ActionState; + +/** +* Waypoint v3 mission state. +*/ +typedef struct { + E_DjiWaypointV3MissionState state; /*!< Waypoint v3 current mission state, #E_DjiWaypointV3MissionState. */ + uint32_t wayLineId; /*!< Waypoint v3 current way line id. */ + uint16_t currentWaypointIndex; /*!< Waypoint v3 current waypoint index. */ +} T_DjiWaypointV3MissionState; + +/** +* Waypoint v3 action state. +*/ +typedef struct { + E_DjiWaypointV3ActionState state; /*!< Waypoint v3 current action state, #E_DjiWaypointV3ActionState. */ + uint32_t wayLineId; /*!< Waypoint v3 current way line id. */ + uint16_t currentWaypointIndex; /*!< Waypoint v3 current waypoint index. */ + uint16_t actionGroupId; /*!< Waypoint v3 current action group index. */ + uint16_t actionId; /*!< Waypoint v3 current action index. */ +} T_DjiWaypointV3ActionState; + +/** + * @brief Prototype of callback function used to receive the waypoint v3 mission state. + * @warning User can not execute blocking style operations or functions in callback function, because that will block + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param missionState: current waypoint v3 mission state. + * @return Execution result. + */ +typedef T_DjiReturnCode (*WaypointV3MissionStateCallback)(T_DjiWaypointV3MissionState missionState); + +/** + * @brief Prototype of callback function used to receive the waypoint v3 mission state. + * @warning User can not execute blocking style operations or functions in callback function, because that will block + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param missionState: current waypoint v3 mission state. + * @return Execution result. + */ +typedef T_DjiReturnCode (*WaypointV3ActionStateCallback)(T_DjiWaypointV3ActionState missionState); + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise waypoint v3 module, and user should call this function. + * before using waypoint v3 features. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV3_Init(void); + +/** + * @brief Deinitialise waypoint v3 module. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV3_DeInit(void); + +/** + * @brief Upload kmz file by raw data. + * @note The size of kmz file is very small, you can use this interface to upload quickly. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV3_UploadKmzFile(const uint8_t *data, uint32_t dataLen); + +/** + * @brief Execute the mission action. + * @note This action should be called after uploading the kmz file. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV3_Action(E_DjiWaypointV3Action action); + +/** + * @brief Register the mission state callback for waypoint mission. + * @note If you want to monitor the state of waypoint mission, this interface should be called before uploading kmz + * file or executing this mission action. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV3_RegMissionStateCallback(WaypointV3MissionStateCallback callback); + +/** + * @brief Register the action state callback for waypoint mission. + * @note If you want to monitor the state of waypoint action, this interface should be called before uploading kmz + * file or executing this mission action. + * @return Execution result. + */ +T_DjiReturnCode DjiWaypointV3_RegActionStateCallback(WaypointV3ActionStateCallback callback); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_WAYPOINT_V3_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_widget.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_widget.h new file mode 100644 index 0000000..66c02e6 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_widget.h @@ -0,0 +1,307 @@ +/** + ******************************************************************** + * @file dji_widget.h + * @brief This is the header file for "dji_widget.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_WIDGET_H +#define DJI_WIDGET_H + +/* Includes ------------------------------------------------------------------*/ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +/*! The maximum length of a message that can be displayed by the mobile app floating window */ +#define DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN 255 + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Widget types. + */ +typedef enum { + DJI_WIDGET_TYPE_BUTTON = 1, /*!< button widget type */ + DJI_WIDGET_TYPE_SWITCH = 2, /*!< switch widget type */ + DJI_WIDGET_TYPE_SCALE = 3, /*!< scale widget type */ + DJI_WIDGET_TYPE_LIST = 4, /*!< list widget type */ + DJI_WIDGET_TYPE_INT_INPUT_BOX = 5, /*!< integer input box widget type */ +} E_DjiWidgetType; + +/** + * @brief Button widget state. + */ +typedef enum { + DJI_WIDGET_BUTTON_STATE_PRESS_DOWN = 1, /*!< Button is pressed down */ + DJI_WIDGET_BUTTON_STATE_RELEASE_UP = 0, /*!< Button is released up */ +} E_DjiWidgetButtonState; + +/** + * @brief Switch widget state. + */ +typedef enum { + DJI_WIDGET_SWITCH_STATE_OFF = 0, /*!< Switch is turned off */ + DJI_WIDGET_SWITCH_STATE_ON = 1 /*!< Switch is turned on */ +} E_DjiWidgetSwitchState; + +/** + * @brief Switch widget speaker work mode. + */ +typedef enum { + DJI_WIDGET_SPEAKER_WORK_MODE_TTS = 0, + DJI_WIDGET_SPEAKER_WORK_MODE_VOICE = 1, +} E_DjiWidgetSpeakerWorkMode; + +/** + * @brief Switch widget speaker play mode. + */ +typedef enum { + DJI_WIDGET_SPEAKER_PLAY_MODE_SINGLE_PLAY = 0, + DJI_WIDGET_SPEAKER_PLAY_MODE_LOOP_PLAYBACK = 1, +} E_DjiWidgetSpeakerPlayMode; + +/** + * @brief Switch widget speaker state. + */ +typedef enum { + DJI_WIDGET_SPEAKER_STATE_IDEL = 0, + DJI_WIDGET_SPEAKER_STATE_TRANSMITTING = 1, + DJI_WIDGET_SPEAKER_STATE_PLAYING = 2, + DJI_WIDGET_SPEAKER_STATE_ERROR = 3, + DJI_WIDGET_SPEAKER_STATE_IN_TTS_CONVERSION = 4, +} E_DjiWidgetSpeakerState; + +/** + * @brief Switch widget transmit data event. + */ +typedef enum { + DJI_WIDGET_TRANSMIT_DATA_EVENT_START, + DJI_WIDGET_TRANSMIT_DATA_EVENT_TRANSMIT, + DJI_WIDGET_TRANSMIT_DATA_EVENT_FINISH, + DJI_WIDGET_TRANSMIT_DATA_EVENT_ABORT, +} E_DjiWidgetTransmitDataEvent; + +/** + * @brief Widget file binary array. + */ +typedef struct { + char *fileName; /*!< The file name of the widget file */ + uint32_t fileSize; /*!< The file size of the widget file, uint : byte */ + const uint8_t *fileBinaryArray; /*!< The binary C array of the widget file */ +} T_DjiWidgetFileBinaryArray; + +/** + * @brief Widget binary array config. + */ +typedef struct { + uint16_t binaryArrayCount; /*!< Binary array count. */ + T_DjiWidgetFileBinaryArray *fileBinaryArrayList; /*!< Pointer to binary array list */ +} T_DjiWidgetBinaryArrayConfig; + +/** + * @brief Widget handler item. + */ +typedef struct { + /*! The index of widget, the index can be numbered starting from 0 and cannot be repeated */ + uint32_t widgetIndex; + + /*! The type of widget, refer to ::E_DjiWidgetType */ + E_DjiWidgetType widgetType; + + /** + * @brief Prototype of callback function used to set widget value, the function will be call when the user triggers + * the widget. + * @param widgetType: the type of widget, refer to ::E_DjiWidgetType. + * @param index: the index of widget. + * @param value: the value of widget, need be set. + * if the widget type is DJI_WIDGET_TYPE_BUTTON, the value is refer to ::E_DjiWidgetButtonState; + * if the widget type is DJI_WIDGET_TYPE_SWITCH, the value is refer to ::E_DjiWidgetSwitchState; + * if the widget type is DJI_WIDGET_TYPE_SCALE, the value is range from 0 to 100, which represents the percentage + * of the scale slider; + * if the Widget type is DJI_WIDGET_TYPE_LIST, the value is range from 0 to N-1 (N is the value of list item + * count), which represents which item is chosen; + * if the widget type is DJI_WIDGET_TYPE_INT_INPUT_BOX, the value is the input value of int input box widget. + * @param userData: the user data need used in callback. + * @return Execution result. + */ + T_DjiReturnCode (*SetWidgetValue)(E_DjiWidgetType widgetType, uint32_t index, int32_t value, void *userData); + + /** + * @brief Prototype of callback function used to get widget value. + * @param widgetType: the type of widget, refer to ::E_DjiWidgetType. + * @param index + * @param value: the value of widget, need be set. + * if the widget type is DJI_WIDGET_TYPE_BUTTON, the value is refer to ::E_DjiWidgetButtonState; + * if the widget type is DJI_WIDGET_TYPE_SWITCH, the value is refer to ::E_DjiWidgetSwitchState; + * if the widget type is DJI_WIDGET_TYPE_SCALE, the value is range from 0 to 100, which represents the percentage + * of the scale slider; + * if the Widget type is DJI_WIDGET_TYPE_LIST, the value is range from 0 to N-1 (N is the value of list item + * count), which represents which item is chosen; + * if the widget type is DJI_WIDGET_TYPE_INT_INPUT_BOX, the value is the input value of int input box widget. + * @param userData: the user data need used in callback function. + * @return Execution result. + */ + T_DjiReturnCode (*GetWidgetValue)(E_DjiWidgetType widgetType, uint32_t index, int32_t *value, void *userData); + + /*! the user data need used in SetWidgetValue and GetWidgetValue callback function. */ + void *userData; +} T_DjiWidgetHandlerListItem; + +typedef struct { + union { + /*! When event is 'DJI_WIDGET_TRANSMIT_DATA_EVENT_START', the buf contains file name, uuid and decoder bitrate. */ + struct { + uint8_t fileName[32]; + uint8_t fileUuid[32]; + uint32_t fileDecodeBitrate; + } transDataStartContent; + + /*! When event is 'DJI_WIDGET_TRANSMIT_DATA_EVENT_START', the buf contains file md5 sum. */ + struct { + uint8_t md5Sum[16]; + } transDataEndContent; + }; +} T_DjiWidgetTransDataContent; + +typedef struct { + E_DjiWidgetSpeakerState state; + E_DjiWidgetSpeakerWorkMode workMode; + E_DjiWidgetSpeakerPlayMode playMode; + uint8_t volume; +} T_DjiWidgetSpeakerState; + +typedef struct { + T_DjiReturnCode (*GetSpeakerState)(T_DjiWidgetSpeakerState *speakerState); + T_DjiReturnCode (*SetWorkMode)(E_DjiWidgetSpeakerWorkMode workMode); + T_DjiReturnCode (*SetPlayMode)(E_DjiWidgetSpeakerPlayMode playMode); + T_DjiReturnCode (*SetVolume)(uint8_t volume); + + T_DjiReturnCode (*StartPlay)(void); + T_DjiReturnCode (*StopPlay)(void); + + T_DjiReturnCode (*ReceiveTtsData)(E_DjiWidgetTransmitDataEvent event, + uint32_t offset, uint8_t *buf, uint16_t size); + T_DjiReturnCode (*ReceiveVoiceData)(E_DjiWidgetTransmitDataEvent event, + uint32_t offset, uint8_t *buf, uint16_t size); +} T_DjiWidgetSpeakerHandler; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise widget module, and user should call this function before using widget features. + * @return Execution result. + */ +T_DjiReturnCode DjiWidget_Init(void); + +/** + * @brief Register default widget UI configuration file directory path. + * @note Under Linux system, there are two functions to set the custom widget configuration directory path, function + * DjiWidget_RegDefaultConfigByDirPath and DjiWidget_RegUiConfigByDirPath. When you don't need multi-language + * and multi-screen size support, you can just use DjiWidget_RegDefaultUiConfigByDirPath function set widget UI + * Config directory path. If you need support multi-language and multi-screen size support, you can use function + * DjiWidget_RegUiConfigByDirPath to specify widget configuration. When the language and screen size is not + * cover in your setting by DjiWidget_RegUiConfigByDirPath, the widget UI configuration uses setting by + * DjiWiget_RegDefaultUiConfigByDirPath function. + * @param widgetConfigDirPath: the widget UI configuration directory path. + * @return Execution result. + */ +T_DjiReturnCode DjiWidget_RegDefaultUiConfigByDirPath(const char *widgetConfigDirPath); + +/** + * @brief Register widget UI configuration file directory path. + * @note Different widget UI configurations for several language and screen size require the same widget type, index and + * count. + * @param appLanguage: mobile app language type. + * @param appScreenType: mobile app screen type. + * @param widgetConfigDirPath: the widget UI configuration directory path. + * @return Execution result. + */ +T_DjiReturnCode DjiWidget_RegUiConfigByDirPath(E_DjiMobileAppLanguage appLanguage, + E_DjiMobileAppScreenType appScreenType, + const char *widgetConfigDirPath); + +/** + * @brief Register default widget UI config by binary array configuration. + * @note In RTOS, most likely there is no file system. The widget config file content can use C array express. Use this + * function and DjiWidget_RegDefaultUiConfigBinaryArray set widget UI configuration. When the language and screen size + * is not cover in your setting by DjiWidget_RegUiConfigByBinaryArray, the widget UI configuration uses setting by this + * function. + * @param binaryArrayConfig: the binary array config for widget UI configuration. + * @return Execution result. + */ +T_DjiReturnCode DjiWidget_RegDefaultUiConfigByBinaryArray(const T_DjiWidgetBinaryArrayConfig *binaryArrayConfig); + +/** + * @brief Register widget UI config by binary array configuration. + * @note Different widget UI configurations for several language and screen size require the same widget type, index and + * count. + * @param appLanguage: mobile app language type. + * @param screenType: mobile app screen type. + * @param binaryArrayConfig: the binary array config for widget UI configuration. + * @return Execution result. + */ +T_DjiReturnCode DjiWidget_RegUiConfigByBinaryArray(E_DjiMobileAppLanguage appLanguage, + E_DjiMobileAppScreenType screenType, + const T_DjiWidgetBinaryArrayConfig *binaryArrayConfig); + +/** + * @brief Register handler list for widgets. + * @param widgetHandlerList: widget handler list for widgets. + * @param itemCount: the item count of widget handler list. + * @return Execution result. + */ +T_DjiReturnCode DjiWidget_RegHandlerList(const T_DjiWidgetHandlerListItem *widgetHandlerList, uint32_t itemCount); + +/** + * @brief Send message to mobile app floating window. + * @note the message length can't more than DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN. The max data bandwidth of floating + * windows message is 2KB/s. + * @param str: pointer to message string. + * @return Execution result. + */ +T_DjiReturnCode DjiWidgetFloatingWindow_ShowMessage(const char *str); + +/** + * @brief Get data transmission state of floating window channel. User can use the state as base for controlling + * floating windows message send. + * @param state: pointer to floating window channel state. + * @return Execution result. + */ +T_DjiReturnCode DjiWidgetFloatingWindow_GetChannelState(T_DjiDataChannelState *state); + +/** + * @brief Register the handler for widget speaker function interfaces. + * @note This interface registers the widget speaker function interface, including speaker settings, play operation, + * speaker status interface. + * @param widgetSpeakerHandler: pointer to the handler for widget speaker functions. + * @return Execution result. + */ +T_DjiReturnCode DjiWidget_RegSpeakerHandler(const T_DjiWidgetSpeakerHandler *widgetSpeakerHandler); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_WIDGET_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/dji_xport.h b/Source/M300/PSDK_Qt/psdk_lib/include/dji_xport.h new file mode 100644 index 0000000..2f51101 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/dji_xport.h @@ -0,0 +1,222 @@ +/** + ******************************************************************** + * @file dji_xport.h + * @brief XPort module provides some interfaces used to control XPort and get states of XPort. The module can be used + * only when the DJI adapter is XPort, rather than Skyport. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef DJI_XPORT_H +#define DJI_XPORT_H + +/* Includes ------------------------------------------------------------------*/ +#include "dji_typedef.h" +#include "dji_gimbal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief XPort limit angle category. + */ +typedef enum { + DJI_XPORT_LIMIT_ANGLE_CATEGORY_ROLL_JOINT_ANGLE = 0, /*!< Joint angle limit of roll axis. */ + DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_JOINT_ANGLE = 1, /*!< Joint angle limit of pitch axis. */ + DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_EULER_ANGLE = 2, /*!< Euler angle limit of pitch axis, just is limitation of angle in ground coordinate. */ + DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_EULER_ANGLE_EXTENSION = 3, /*!< Extended euler angle limit of pitch axis, just is limitation of angle in ground coordinate. Extended euler + angle limit is activated when enable extended pitch axis angle limit. */ + DJI_XPORT_LIMIT_ANGLE_CATEGORY_YAW_JOINT_ANGLE = 4, /*!< Joint angle limit of yaw axis. */ +} E_DjiXPortLimitAngleCategory; + +/** + * @brief Limit angle data structure. + */ +typedef struct { + int16_t upperLimit; /*!< Upper limit of limit angle, unit: 0.1degree. */ + int16_t lowerLimit; /*!< Lower limit of limit angle, unit: 0.1degree. */ +} T_DjiXPortLimitAngle; + +/** + * @brief Prototype of callback function used to receive system state of XPort. + * @warning User can not execute blocking style operations or functions in callback function, because that will block DJI + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param systemState: system state of XPort. + * @return Execution result. + */ +typedef T_DjiReturnCode (*DjiReceiveXPortSystemStateCallback)(T_DjiGimbalSystemState systemState); + +/** + * @brief Prototype of callback function used to receive attitude information of XPort. + * @warning User can not execute blocking style operations or functions in callback function, because that will block DJI + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param attitudeInformation: attitude information of XPort. + * @return Execution result. + */ +typedef T_DjiReturnCode (*DjiReceiveXPortAttitudeInformationCallback)( + T_DjiGimbalAttitudeInformation attitudeInformation); + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise XPort module. + * @note The function have to be called before other functions related to XPort. + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_Init(void); + +/** + * @brief Deinitialize XPort module. + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_DeInit(void); + +/** + * @brief Register callback function used to receive system state of XPort. + * @note The callback function will be called after registering. The call frequency is 1Hz. + * @param callback: pointer to the callback function. + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_RegReceiveSystemStateCallback(DjiReceiveXPortSystemStateCallback callback); + +/** + * @brief Register callback function used to receive attitude information of XPort. + * @note The callback function will be called after registering. The call frequency is 10Hz. + * @param callback: pointer to the callback function. + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_RegReceiveAttitudeInformationCallback(DjiReceiveXPortAttitudeInformationCallback callback); + +/** + * @brief Set gimbal mode of XPort in blocking mode. + * @note Max execution time of this function is slightly larger than 600ms. + * @param mode: gimbal mode. + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_SetGimbalModeSync(E_DjiGimbalMode mode); + +/** + * @brief Rotate gimbal of XPort in blocking mode. + * @note Max execution time of this function is slightly larger than 600ms. + * @note If rotation mode is ::DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE or ::DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, + * range of yaw value in rotation value argument is [-1800, 1800]. Gimbal can rotate to any angle of yaw axis by the + * range. Symbol of yaw value does not determine the rotation direction of the gimbal. + * @note Attitude that gimbal can reach is also determined by angle limitation and angle limitation buffer of the gimbal. + * When the gimbal is upward, angle limitation differs from limitation users set. For angle limitation and angle limitation + * buffer, please refer to DJI documentation for details. If gimbal attitude is within range limitation buffer and + * control gimbal move towards limit direction still, or gimbal attitude is outside the angle limitation buffer but + * control gimbal to the range limitation buffer, the gimbal will return an error. For the former case, the gimbal will not + * move. In the latter case, the gimbal will try to move towards the direction of angle limit but it will stop at + * somewhere in angle limitation buffer. + * @note Rotation speed and rotation duration are also limited by the maximum speed of gimbal and maximum acceleration. The + * maximum acceleration is determined by the smooth factor of the gimbal controller set by APP. The maximum speed is determined + * by default maximum speed and maximum speed percentage set by APP, and the default maximum speed of XPort is + * 90degree/s. For the detailed relationship, please refer to SetControllerSmoothFactor() and + * SetControllerMaxSpeedPercentage() callback function prototype in dji_gimbal.h file. + * @note Only pitch and yaw axis of XPort is controllable. + * @note XPort do not response rotation command in process of control parameters auto-tuning, coaxiality detection, + * balance detection and resetting. And these operations will interrupt rotation of XPort. + * @note Effective time of a speed control command is 500ms, that is, if XPort do not receive other control commands + * within 500ms after speed control, XPort will stop rotation. + * @param rotationMode: mode of rotation command. + * @param rotationProperty: property of rotation command. + * @param rotationValue: value of rotation command, unit: 0.1 degree (if rotation mode is + * ::DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE or ::DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE), 0.1 degree/s + * (if rotation mode is ::DJI_GIMBAL_ROTATION_MODE_SPEED). + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_RotateSync(E_DjiGimbalRotationMode rotationMode, + T_DjiGimbalRotationProperty rotationProperty, T_DjiAttitude3d rotationValue); + +/** + * @brief Release gimbal control permission out in blocking mode. + * @details When DJI application control XPort gimbal, DJI application will capture and gain control permission of + * gimbal if allowable. After DJI application sending a sequence of the gimbal control command, DJI application should + * call this interface to release control permission of gimbal, to allow other modules (like APP, flight + * controller) can control gimbal right now. For example, DJI application can release control permission after tap + * zooming. Of course, if DJI application does not release control permission after controlling gimbal, the gimbal will also + * release control permission automatically at some time point later than the completion of control commands. Undoubtedly, + * this is inefficient. + * @note Max execution time of this function is slightly larger than 600ms. + * @note XPort do not response release control permission command in process of control parameters auto-tuning, + * coaxiality detection and balance detection. + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_ReleaseControlPermissionSync(void); + +/** + * @brief Reset gimbal of XPort in blocking mode. + * @details The interface reset angle of pitch axis to corresponding fine tune value in ground coordinate, and yaw axis + * to superimposed value of yaw axis angle of aircraft and corresponding fine tune value in ground coordinate. + * @note Max execution time of this function is slightly larger than 600ms. + * @note XPort do not response reset command in process of control parameters auto-tuning, coaxiality detection and + * balance detection. + * @param mode: Reset mode. + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_ResetSync(E_DjiGimbalResetMode mode); + +/** + * @brief Set limit angle for XPort in blocking mode. + * @details Please refer to XPort part of developer website for + * details about default limit angle of XPort. + * @note Max execution time of this function is slightly larger than 1200ms. + * @note XPort do not response set limit angle command in process of control parameters auto-tuning, coaxiality + * detection and balance detection. + * @param limitAngleCategory: limit angle category. + * @param limitAngle: limit angle. + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_SetLimitAngleSync(E_DjiXPortLimitAngleCategory limitAngleCategory, + T_DjiXPortLimitAngle limitAngle); + +/** + * @brief Get limit angle of XPort in blocking mode. + * @note Max execution time of this function is slightly larger than 1200ms. + * @param limitAngleCategory: limit angle category. + * @param limitAngle: pointer to memory space used to store limit angle. + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_GetLimitAngleSync(E_DjiXPortLimitAngleCategory limitAngleCategory, + T_DjiXPortLimitAngle *limitAngle); + +/** + * @brief Set speed conversion factor for speed control from joystick and APP. + * @details XPort convert speed control command from joystick and APP to rotation speed based on the speed conversion + * factor. The formula is "speed = maximum rotation speed * conversion factor", and maximum rotation speed is a product of + * default maximum speed and maximum speed percentage. The default maximum rotation speed is 90degree/s. The maximum + * speed percentage is set by APP. The default speed conversion factor is 1.0. + * @note The value will be effective after a while, and the max value is 100ms. + * @param factor: Speed conversion factor and it has to be smaller than or equal to 1.0. + * @return Execution result. + */ +T_DjiReturnCode DjiXPort_SetSpeedConversionFactor(float factor); + +#ifdef __cplusplus +} +#endif + +#endif // DJI_XPORT_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_aircraft_info.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_aircraft_info.h new file mode 100644 index 0000000..24eeee8 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_aircraft_info.h @@ -0,0 +1,126 @@ +/** + ******************************************************************** + * @file psdk_aircraft_info.h + * @brief This is the header file for "psdk_aircraft_info.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_AIRCRAFT_INFO_H +#define PSDK_AIRCRAFT_INFO_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Aircraft type. + */ +typedef E_DjiAircraftType E_PsdkAircraftInfoType; +#define PSDK_AIRCRAFT_INFO_TYPE_UNKNOWN DJI_AIRCRAFT_TYPE_UNKNOWN /*!< Aircraft type is unknown. */ +#define PSDK_AIRCRAFT_INFO_TYPE_M200_V2 DJI_AIRCRAFT_TYPE_M200_V2 /*!< Aircraft type is Matrice 200 V2. */ +#define PSDK_AIRCRAFT_INFO_TYPE_M210_V2 DJI_AIRCRAFT_TYPE_M210_V2 /*!< Aircraft type is Matrice 220 V2. */ +#define PSDK_AIRCRAFT_INFO_TYPE_M210RTK_V2 DJI_AIRCRAFT_TYPE_M210RTK_V2 /*!< Aircraft type is Matrice 210 RTK V2. */ +#define PSDK_AIRCRAFT_INFO_TYPE_M300_RTK DJI_AIRCRAFT_TYPE_M300_RTK /*!< Aircraft type is Matrice 300 RTK. */ + +/** + * @brief PSDK adapter type. + */ +typedef E_DjiSdkAdapterType E_PsdkAircraftInfoPsdkAdapterType; +#define PSDK_AIRCRAFT_INFO_PSDK_ADAPTER_TYPE_UNKNOWN DJI_SDK_ADAPTER_TYPE_UNKNOWN /*!< PSDK adapter type is unknown. */ +#define PSDK_AIRCRAFT_INFO_PSDK_ADAPTER_TYPE_SKYPORT_V2 DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 /*!< PSDK adapter type is Skyport V2. */ +#define PSDK_AIRCRAFT_INFO_PSDK_ADAPTER_TYPE_XPORT DJI_SDK_ADAPTER_TYPE_XPORT /*!< PSDK adapter type is X-Port. */ + +/** + * @brief Payload mount position. + */ +typedef E_DjiMountPosition E_PsdkAircraftInfoPayloadMountPosition; +#define PSDK_AIRCRAFT_INFO_PAYLOAD_MOUNT_POSITION_UNKNOWN DJI_MOUNT_POSITION_UNKNOWN /*!< Payload mount position is unknown.. */ +#define PSDK_AIRCRAFT_INFO_PAYLOAD_MOUNT_POSITION_NO1 DJI_MOUNT_POSITION_PAYLOAD_PORT_NO1 /*!< Payload is mounted on the first gimbal connector of aircraft. */ +#define PSDK_AIRCRAFT_INFO_PAYLOAD_MOUNT_POSITION_NO2 DJI_MOUNT_POSITION_PAYLOAD_PORT_NO2 /*!< Payload is mounted on the second gimbal connector of aircraft. */ +#define PSDK_AIRCRAFT_INFO_PAYLOAD_MOUNT_POSITION_NO3 DJI_MOUNT_POSITION_PAYLOAD_PORT_NO3 /*!< Payload is mounted on the third gimbal connector of aircraft. */ + +/** + * @brief Mobile APP system language. + */ +typedef E_DjiMobileAppLanguage E_PsdkAircraftInfoMobileAppLanguage; +#define PSDK_AIRCRAFT_INFO_MOBILE_APP_LANGUAGE_UNKNOWN DJI_MOBILE_APP_LANGUAGE_UNKNOWN /*!< The system language of the mobile app is unknown */ +#define PSDK_AIRCRAFT_INFO_MOBILE_APP_LANGUAGE_ENGLISH DJI_MOBILE_APP_LANGUAGE_ENGLISH /*!< The system language of the mobile app is English */ +#define PSDK_AIRCRAFT_INFO_MOBILE_APP_LANGUAGE_CHINESE DJI_MOBILE_APP_LANGUAGE_CHINESE /*!< The system language of the mobile app is Chinese */ +#define PSDK_AIRCRAFT_INFO_MOBILE_APP_LANGUAGE_JAPANESE DJI_MOBILE_APP_LANGUAGE_JAPANESE /*!< The system language of the mobile app is Japanese */ +#define PSDK_AIRCRAFT_INFO_MOBILE_APP_LANGUAGE_FRENCH DJI_MOBILE_APP_LANGUAGE_FRENCH /*!< The system language of the mobile app is French */ + +/** + * @brief Mobile APP screen size type. + */ +typedef E_DjiMobileAppScreenType E_PsdkAircraftInfoMobileAppScreenType; +#define PSDK_AIRCRAFT_INFO_MOBILE_APP_SCREEN_TYPE_UNKNOWN DJI_MOBILE_APP_SCREEN_TYPE_UNKNOWN /*!< Mobile APP screen type is unknown. */ +#define PSDK_AIRCRAFT_INFO_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN DJI_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN /*!< The big screen of mobile device refers to a screen + * size greater than or equal to 6 inches. */ +#define PSDK_AIRCRAFT_INFO_MOBILE_APP_SCREEN_TYPE_LITTLE_SCREEN DJI_MOBILE_APP_SCREEN_TYPE_LITTLE_SCREEN /*!< The little screen of mobile device refers to a + * screen size less than 6 inches. */ + +/** + * @brief Some base information of aircraft system, mainly including some constant parameters information of system. + */ +typedef struct { + E_PsdkAircraftInfoType aircraftType; /*!< Aircraft type. */ + E_PsdkAircraftInfoPsdkAdapterType psdkAdapterType; /*!< PSDK adapter type. */ + E_PsdkAircraftInfoPayloadMountPosition payloadMountPosition; /*!< Payload mount position. */ +} T_PsdkAircraftInfoBaseInfo; + +/** + * @brief Information related to mobile APP. + */ +typedef T_DjiMobileAppInfo T_PsdkAircraftInfoMobileAppInfo; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Get base information of aircraft system, including aircraft type and PSDK adapter type. + * @param baseInfo: pointer to memory space used to store base information of the aircraft system. + * @return Execution result. + */ +T_PsdkReturnCode PsdkAircraftInfo_GetBaseInfo(T_PsdkAircraftInfoBaseInfo *baseInfo); + +/** + * @brief Get information related to mobile APP. + * @note The mobile APP language and screen type is unknown if RC or APP is not connected to the aircraft system. + * @param mobileAppInfo: pointer to memory space used to store information related to mobile APP. + * @return Execution result. + */ +T_PsdkReturnCode PsdkAircraftInfo_GetMobileAppInfo(T_PsdkAircraftInfoMobileAppInfo *mobileAppInfo); + +#ifdef __cplusplus +} +#endif + +#endif //PSDK_AIRCRAFT_INFO_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_core.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_core.h new file mode 100644 index 0000000..2c82607 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_core.h @@ -0,0 +1,72 @@ +/** + ******************************************************************** + * @file psdk_core.h + * @brief This is the header file for "psdk_core.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_CORE_H +#define PSDK_CORE_H + +/* Includes ------------------------------------------------------------------*/ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef T_DjiUserInfo T_PsdkUserInfo; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialize the Payload SDK core in blocking mode. + * @note The call location of this interface requires special attention, The call needs to be completed after the + * registration of console/OSAL handler functions/HAL handler functions are completed. At the same time, it must be + * initialized at the beginning of calling other functional module interfaces. You need to fill in the developer + * information correctly to ensure the initialization is successful. For additional instructions, please refer to the + * tutorial“PSDK Initialization”. + * @note This function does not return until the correct aircraft type and PSDK adapter type is obtained. The logic ensures + * that aircraft and PSDK adapter have been started up normally before PSDK functional module and user's program run. + * General execution time of this function is 2~4 seconds. + * @param userInfo: pointer to the PSDK application information. + * @return Execution result. + */ +T_PsdkReturnCode PsdkCore_Init(const T_PsdkUserInfo *userInfo); + +/** + * @brief Notify that the Payload SDK core application starts. + * @note The call location of this interface requires special attention, The call needs to be completed after all the + * module initialize and register interfaces. + * @return Execution result. + */ +T_PsdkReturnCode PsdkCore_ApplicationStart(void); + +#ifdef __cplusplus +} +#endif + +#endif //PSDK_CORE_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_channel.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_channel.h new file mode 100644 index 0000000..cfc63e3 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_channel.h @@ -0,0 +1,72 @@ +/** + ******************************************************************** + * @file psdk_data_channel.h + * @brief This is the header file for "psdk_data_channel.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_DATA_CHANNEL_H +#define PSDK_DATA_CHANNEL_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "dji_high_speed_data_channel.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Percentage of bandwidth proportion of high-speed channel. + */ +typedef T_DjiDataChannelBandwidthProportionOfHighspeedChannel T_PsdkDataChannelBandwidthProportionOfHighspeedChannel; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Set bandwidth proportion for the data stream, video stream and download stream of high-speed channel. + * @details Self-defined bandwidth distribution mechanism allows that user can control bandwidth limitation + * freely. System multiplies total bandwidth limitation of the high-speed channel by a proportion of the corresponding stream to + * get realtime bandwidth limitation of the specified stream. Realtime bandwidth limitation of data and video stream can be + * gotten by PsdkDataTransmission_GetDataStreamState() and PsdkPayloadCamera_GetVideoStreamState() interfaces. Total + * bandwidth of the high-speed channel is determined by the environment in which the system located and loading of system. If + * user does not set bandwidth proportion for each stream, the default proportion is 33% (data stream), 33% (video + * stream) and 34% (download stream). + * @note The bandwidth proportion will be effective after a while, the max value is 1s. If you want use this interface, should calling + * PsdkPlatform_RegHalNetworkHandler interface firstly, otherwise this interface will not work. + * @param bandwidthProportion: bandwidth proportion of each stream of high-speed channel. The Sum of bandwidth proportion + * must equal 100. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataChannel_SetBandwidthProportionForHighspeedChannel( + T_PsdkDataChannelBandwidthProportionOfHighspeedChannel bandwidthProportion); + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_DATA_CHANNEL_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_subscription.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_subscription.h new file mode 100644 index 0000000..16cd364 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_subscription.h @@ -0,0 +1,434 @@ +/** + ******************************************************************** + * @file psdk_data_subscription.h + * @brief This is the header file for "psdk_data_subscription.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_DATA_SUBSCRIPTION_H +#define PSDK_DATA_SUBSCRIPTION_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "dji_fc_subscription.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Name of topics that can be subscribed. Topic is minimum data item subscribed. + */ +typedef E_DjiFcSubscriptionTopic E_PsdkDataSubscriptionTopicName; +/*! + * @brief Quaternion of aircraft topic name. Quaternion topic provides aircraft body frame (FRD) to ground frame + * (NED) rotation. Please refer to ::T_PsdkDataSubscriptionQuaternion for information about data structure. + * @details The DJI quaternion follows Hamilton convention (q0 = w, q1 = x, q2 = y, q3 = z). + * | Angle | Unit | Accuracy | Notes | + |--------------|------|------------|-------------------------------------------------| + | pitch, roll | deg | <1 | in NON-AHRS mode | + | yaw | deg | <3 | in well-calibrated compass with fine aligned | + | yaw with rtk | deg | around 1.2 | in RTK heading fixed mode with 1 meter baseline | + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_QUATERNION DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION + +/*! + * @brief Velocity of aircraft topic name. Velocity topic provides aircraft's velocity in a ground-fixed NEU frame. + * Please refer to ::T_PsdkDataSubscriptionVelocity for information about data structure. + * @warning Please note that this data is not in a conventional right-handed frame of reference. + * @details This velocity data is a fusion output from the aircraft. Original output is in a right-handed NED frame, but the + * sign of the Z-axis velocity is flipped before publishing to this topic. So if you are looking to get velocity + * in an NED frame, simply flip the sign of the z-axis value. Beyond that, you can convert using rotations to + * any right-handed frame of reference. + * | Axis | Unit | Accuracy | + |----------|------|---------------------------------------------------------------------------------------------| + | vgx, vgy | m/s | Around 5cm/s for GNSS navigation. Around 3cm/s with VO at 1 meter height | + | vgz | m/s | 10cm/s only with barometer in steady air. 3cm/s with VO at 1 meter height with 8cm baseline | + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_VELOCITY DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY + +/*! + * @brief Fused altitude of aircraft topic name. Fused altitude topic provides aircraft's fused altitude from sea + * level. Please refer to ::T_PsdkDataSubscriptionAltitudeFused for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_ALTITUDE_FUSED DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_FUSED + +/*! + * @brief Relative height above ground of aircraft topic name. Please refer to + * ::T_PsdkDataSubscriptionHeightRelative for information about data structure. + * @details This data is a fusion output from aircraft. The height is a direct estimate of the closest large object + * below the aircraft's ultrasonic sensors. + * @warning This topic does not come with a 'valid' flag - so if the aircraft is too far from an object for the + * ultrasonic sensors/VO to provide any meaningful data, the values will latch and there is no way for user to + * determine if the data is valid or not. Please use with caution. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_HEIGHT_RELATIVE DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_RELATIVE + +/*! + * Fused position of aircraft topic name. Please refer to ::T_PsdkDataSubscriptionPositionFused for information + * about data structure. + * @warning Please note that if GPS signal is weak (low visibleSatelliteNumber, see below), the + * latitude/longitude values won't be updated but the altitude might still be. There is currently no way to know if + * the lat/lon update is healthy. + * @details The most important component of this topic is the T_PsdkDataSubscriptionPositionFused::visibleSatelliteNumber. + * Use this to track your GPS satellite coverage and build some heuristics for when you might expect to lose GPS updates. + * | Axis | Unit | Position Sensor | Accuracy | + |------|------|-----------------|--------------------------------------------------| + | x, y | m | GPS | <3m with open sky without multipath | + | z | m | GPS | <5m with open sky without multipath | + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_POSITION_FUSED DJI_FC_SUBSCRIPTION_TOPIC_POSITION_FUSED + +/*! + * @brief GPS date topic name. Please refer to ::T_PsdkDataSubscriptionGpsDate for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_GPS_DATE DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE + +/*! + * @brief GPS time topic name. Please refer to ::T_PsdkDataSubscriptionGpsTime for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_GPS_TIME DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME + +/*! + * @brief GPS position topic name. Please refer to ::T_PsdkDataSubscriptionGpsPosition for information about data structure. + * @details + * | Axis | Accuracy | + |------|--------------------------------------------------| + | x, y | <3m with open sky without multipath | + | z | <5m with open sky without multipath | + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_GPS_POSITION DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION + +/*! + * @brief GPS velocity topic name. Please refer to ::T_PsdkDataSubscriptionGpsVelocity for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_GPS_VELOCITY DJI_FC_SUBSCRIPTION_TOPIC_GPS_VELOCITY + +/*! + * @brief GPS details topic name. GPS details topic provides GPS state and other detail information. Please refer + * to ::T_PsdkDataSubscriptionGpsDetail for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_GPS_DETAILS DJI_FC_SUBSCRIPTION_TOPIC_GPS_DETAILS + +/*! + * @brief GPS signal level topic name. This topic provides a measure of the quality of GPS signal. Please refer to + * ::T_PsdkDataSubscriptionGpsSignalLevel for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL + +/*! + * @brief RTK position topic name. Please refer to ::T_PsdkDataSubscriptionRtkPosition for information about data structure. + * @details + * | Axis | Accuracy | + |------|--------------------------------------------------| + | x, y | ~2cm with fine alignment and fix condition | + | z | ~3cm with fine alignment and fix condition | + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_RTK_POSITION DJI_FC_SUBSCRIPTION_TOPIC_RTK_POSITION + +/*! + * @brief RTK velocity topic name. Please refer to ::T_PsdkDataSubscriptionRtkVelocity for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_RTK_VELOCITY DJI_FC_SUBSCRIPTION_TOPIC_RTK_VELOCITY + +/*! + * @brief RTK yaw topic name. Please refer to ::T_PsdkDataSubscriptionRtkYaw for information about data structure. + * @details The RTK yaw will provide the vector from ANT1 to ANT2 as configured in DJI Assistant 2. This + * means that the value of RTK yaw will be 90deg offset from the yaw of the aircraft. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_RTK_YAW DJI_FC_SUBSCRIPTION_TOPIC_RTK_YAW + +/*! + * @brief RTK position information topic name. RTK position information topic provides a state of RTK position + * solution. Please refer to ::T_PsdkDataSubscriptionRtkPositionInfo for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_RTK_POSITION_INFO DJI_FC_SUBSCRIPTION_TOPIC_RTK_POSITION_INFO + +/*! + * @brief RTK yaw topic name. RTK yaw information topic provides a state of RTK yaw solution. Please refer to + * ::T_PsdkDataSubscriptionRtkYawInfo for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_RTK_YAW_INFO DJI_FC_SUBSCRIPTION_TOPIC_RTK_YAW_INFO + +/*! + * @brief Flight status topic name. Please refer to ::T_PsdkDataSubscriptionFlightStatus for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_STATUS_FLIGHT DJI_FC_SUBSCRIPTION_TOPIC_STATUS_FLIGHT + +/*! + * @brief Battery information topic name. Please refer to ::T_PsdkDataSubscriptionBatteryInfo for information about data structure. + */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_BATTERY_INFO DJI_FC_SUBSCRIPTION_TOPIC_BATTERY_INFO + +/*! Total number of topics that can be subscribed. */ +#define PSDK_DATA_SUBSCRIPTION_TOPIC_TOTAL_NUMBER DJI_FC_SUBSCRIPTION_TOPIC_TOTAL_NUMBER + + +/** + * @brief Health state of data subscribed. + */ +typedef E_DjiFcSubscriptionDataHealthFlag E_PsdkDataSubscriptionDataHealthFlag; +#define PSDK_DATA_SUBSCRIPTION_DATA_NOT_HEALTH DJI_FC_SUBSCRIPTION_DATA_NOT_HEALTH /*!< Data subscribed is healthy and can be used. */ +#define PSDK_DATA_SUBSCRIPTION_DATA_HEALTH DJI_FC_SUBSCRIPTION_DATA_HEALTH /*!< Data subscribed is not healthy and recommend not to use it. */ + +/** + * @brief Position solution property. + */ +typedef E_DjiFcSubscriptionPositionSolutionProperty E_PsdkDataSubscriptionPositionSolutionProperty; +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_NOT_AVAILABLE DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_NOT_AVAILABLE /*!< Position solution is not available. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FIX_POSITION DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FIX_POSITION /*!< Position has been fixed by the FIX POSITION command. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FIX_HEIGHT_AUTO DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FIX_HEIGHT_AUTO /*!< Position has been fixed by the FIX HEIGHT/AUTO command. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_INSTANTANEOUS_DOPPLER_COMPUTE_VELOCITY DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_INSTANTANEOUS_DOPPLER_COMPUTE_VELOCITY /*!< Velocity computed using instantaneous Doppler. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_SINGLE_PNT_SOLUTION DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_SINGLE_PNT_SOLUTION /*!< Single point position solution. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_PSEUDORANGE_DIFFERENTIAL_SOLUTION DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_PSEUDORANGE_DIFFERENTIAL_SOLUTION /*!< Pseudorange differential solution. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_SBAS_CORRECTION_CALCULATED DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_SBAS_CORRECTION_CALCULATED /*!< Solution calculated using corrections from an SBAS. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_KALMAN_FILTER_WITHOUT_OBSERVATION_PROPAGATED DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_KALMAN_FILTER_WITHOUT_OBSERVATION_PROPAGATED /*!< Propagated by a Kalman filter without new observations. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_OMNISTAR_VBS_POSITION DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_OMNISTAR_VBS_POSITION /*!< OmniSTAR VBS position (L1 sub-metre). */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FLOAT_L1_AMBIGUITY DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FLOAT_L1_AMBIGUITY /*!< Floating L1 ambiguity solution. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FLOAT_IONOSPHERIC_FREE_AMBIGUITY DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FLOAT_IONOSPHERIC_FREE_AMBIGUITY /*!< Floating ionospheric-free ambiguity solution. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FLOAT_SOLUTION DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_FLOAT_SOLUTION /*!< Float position solution. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_L1_AMBIGUITY_INT DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_L1_AMBIGUITY_INT /*!< Integer L1 ambiguity solution. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_WIDE_LANE_AMBIGUITY_INT DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_WIDE_LANE_AMBIGUITY_INT /*!< Integer wide-lane ambiguity solution. */ +#define PSDK_DATA_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_NARROW_INT DJI_FC_SUBSCRIPTION_POSITION_SOLUTION_PROPERTY_NARROW_INT /*!< Narrow fixed point position solution. */ + +/** + * @brief GPS fix state. + */ +typedef E_DjiFcSubscriptionGpsFixState E_PsdkDataSubscriptionGpsFixState; +#define PSDK_DATA_SUBSCRIPTION_GPS_FIX_STATE_NO_FIX DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_NO_FIX /*!< GPS position has not been fixed. */ +#define PSDK_DATA_SUBSCRIPTION_GPS_FIX_STATE_DEAD_RECKONING_ONLY DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_DEAD_RECKONING_ONLY /*!< GPS position is dead reckoned only. */ +#define PSDK_DATA_SUBSCRIPTION_GPS_FIX_STATE_2D_FIX DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_2D_FIX /*!< The horizontal position with latitude/longitude (or northing/easting or X/Y) is fixed. */ +#define PSDK_DATA_SUBSCRIPTION_GPS_FIX_STATE_3D_FIX DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_3D_FIX /*!< The horizontal and vertical position with latitude/longitude/altitude (northing/easting/altitude or X/Y/Z) is fixed. */ +#define PSDK_DATA_SUBSCRIPTION_GPS_FIX_STATE_GPS_PLUS_DEAD_RECKONING DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_GPS_PLUS_DEAD_RECKONING /*!< Position is calculated by GPS and combined with dead reckoning. */ +#define PSDK_DATA_SUBSCRIPTION_GPS_FIX_STATE_TIME_ONLY_FIX DJI_FC_SUBSCRIPTION_GPS_FIX_STATE_TIME_ONLY_FIX /*!< Only time is fixed. */ +/** + * @brief Flight status of aircraft. + */ +typedef E_DjiFcSubscriptionFlightStatus E_PsdkDataSubscriptionFlightStatus; +#define PSDK_DATA_SUBSCRIPTION_FLIGHT_STATUS_STOPED DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_STOPED /*!< Aircraft is on ground and motors are still. */ +#define PSDK_DATA_SUBSCRIPTION_FLIGHT_STATUS_ON_GROUND DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_ON_GROUND/*!< Aircraft is on ground but motors are rotating. */ +#define PSDK_DATA_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR /*!< Aircraft is in air. */ + +#pragma pack(1) + +/** + * @brief Timestamp data structure. + */ +typedef T_DjiDataTimestamp T_PsdkDataSubscriptiontTimestamp; + +/** + * @brief Quaternion topic data structure. + */ +typedef T_DjiFcSubscriptionQuaternion T_PsdkDataSubscriptionQuaternion; + +/** + * @brief Velocity topic data structure. + */ +typedef T_DjiFcSubscriptionVelocity T_PsdkDataSubscriptionVelocity; + +/** + * @brief Fused altitude topic data structure, unit: m. + */ +typedef T_DjiFcSubscriptionAltitudeFused T_PsdkDataSubscriptionAltitudeFused; + +/** + * @brief Relative height above ground topic data structure, unit: m. + */ +typedef T_DjiFcSubscriptionHeightRelative T_PsdkDataSubscriptionHeightRelative; + +/** + * @brief Fused position topic data structure. + */ +typedef T_DjiFcSubscriptionPositionFused T_PsdkDataSubscriptionPositionFused; + +/** + * @brief GPS date topic data structure, format: yyyymmdd. + */ +typedef T_DjiFcSubscriptionGpsDate T_PsdkDataSubscriptionGpsDate; + +/** + * @brief GPS time topic data structure, format: hhmmss. + */ +typedef T_DjiFcSubscriptionGpsTime T_PsdkDataSubscriptionGpsTime; + +/** + * @brief GPS position topic data structure. x = Longitude, y = Latitude, z = Altitude, unit: deg*10-7 + * (Lat,Lon), mm (Alt) + */ +typedef T_DjiFcSubscriptionGpsPosition T_PsdkDataSubscriptionGpsPosition; + +/** + * @brief GPS velocity topic data structure, unit: cm/s. + */ +typedef T_DjiFcSubscriptionGpsVelocity T_PsdkDataSubscriptionGpsVelocity; + +/** + * @brief GPS details topic data structure. + */ +typedef T_DjiFcSubscriptionGpsDetails T_PsdkDataSubscriptionGpsDetail; + +/** + * @brief GPS signal level topic data structure. Signal level of GPS. The level varies from 0 to 5, with 0 being the + * worst and 5 the best GPS signal. + */ +typedef T_DjiFcSubscriptionGpsSignalLevel T_PsdkDataSubscriptionGpsSignalLevel; + +/** + * @brief RTK position topic data structure. + */ +typedef T_DjiFcSubscriptionRtkPosition T_PsdkDataSubscriptionRtkPosition; + +/** + * @brief RTK velocity topic data structure, unit: cm/s. + */ +typedef T_DjiFcSubscriptionRtkVelocity T_PsdkDataSubscriptionRtkVelocity; + +/** + * @brief RTK yaw topic data structure, unit: deg. + */ +typedef T_DjiFcSubscriptionRtkYaw T_PsdkDataSubscriptionRtkYaw; + +/** + * @brief RTK position information topic data structure. Specifies RTK position solution state, it can be any value of + * ::E_PsdkDataSubscriptionPositionSolutionProperty. + */ +typedef T_DjiFcSubscriptionRtkPositionInfo T_PsdkDataSubscriptionRtkPositionInfo; + +/** + * @brief RTK yaw information topic data structure. Specifies RTK yaw solution state, it can be any value of + * ::E_PsdkDataSubscriptionPositionSolutionProperty. + */ +typedef T_DjiFcSubscriptionRtkYawInfo T_PsdkDataSubscriptionRtkYawInfo; + +/** + * @brief Flight status information topic data structure. It can be any value of ::E_PsdkDataSubscriptionFlightStatus. + */ +typedef T_DjiFcSubscriptionFlightStatus T_PsdkDataSubscriptionFlightStatus; + +/** + * @brief Battery information topic data structure. + */ +typedef T_DjiFcSubscriptionWholeBatteryInfo T_PsdkDataSubscriptionBatteryInfo; + +#pragma pack() + +/** + * @brief Prototype of callback function used to receive data of topic. + * @warning User can not execute blocking style operations or functions in the callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param data: pointer to data of the topic, user need transfer type of this pointer to the corresponding data structure + * pointer for getting every item of the topic conveniently. + * @param dataSize: the size of memory space pointed by data argument, equal to data structure size corresponding to the topic. + * @param timestamp: pointer to timestamp corresponding this data. + * @return Execution result. + */ +typedef DjiReceiveDataOfTopicCallback ReceiveDataOfTopicCallback; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise data subscription module in blocking mode. This function has to be called before subscribing any + * data, to initialize run environment of data subscription module, if need to subscribe data from aircraft. + * @note Max execution time of this function is slightly larger than 500ms. + * @note This function has to be called in user task, rather than main() function, and after scheduler being started. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataSubscription_Init(void); + +/** + * @brief Deinitialize data subscription module. When data subscription will no longer be used, can call this function + * to deinitialize the data subscription module. Deinitialization function will help to release all system resource data + * subscription has occupied. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataSubscription_DeInit(void); + +/** + * @brief Subscribe a topic in blocking mode. Before subscribing any data from aircraft, PsdkDataSubscription_Init() + * function has to be called. + * @details User can subscribe a topic by specifying topic name, push frequency and callback function used to receive + * data of topic (if needed). After subscribing successfully, the user can call + * PsdkDataSubscription_GetValueOfTopicWithTimestamp() function to get the latest data of the topic have been + * subscribed and the corresponding timestamp when aircraft sends the data out, and the callback function will be called to + * push data of the topic and corresponding timestamp if the callback function is specified. + * @note Max execution time of this function is slightly larger than 1200ms. + * @note Topic to be subscribed can not have been subscribed, that is, one topic can not be subscribed repeatedly. + * @note User must ensure that types of subscription frequency of all topics have been subscribed is less than or + * equal to 4. Otherwise, the subscribing topic will fail. + * @note User must ensure that the data length sum of all topics of the same subscription frequency is less than or equal to 242. + * @param topic: topic name to be subscribed. + * @param frequency: subscription frequency of topic to be subscribed. Subscription frequency can not beyond max + * frequency limitation of the topic and must be a divisor of max subscription frequency limitation. And, subscription + * frequency has to be larger than 0. Users can find max frequency of topics in data subscription part of PSDK + * documentation on developer website (developer.dji.com). + * @param callback: callback function used to receive data of topic to be subscribed. If the callback function is not needed, + * this item can be set as NULL. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataSubscription_RegTopicSync(E_PsdkDataSubscriptionTopicName topic, uint16_t frequency, + ReceiveDataOfTopicCallback callback); + +/** + * @brief Unsubscribe a topic in blocking mode. + * @details Users must specify frequency and callback function filled in when subscribe the topic. If frequency or + * callback function is incorrect, unsubscribe operation will fail and the interface return error. + * @note Max execution time of this function is slightly larger than 600ms. + * @param topic: topic name to be unsubscribed. + * @param frequency: subscription frequency filled in when subscribe. + * @param callback: callback function filled in when subscribe. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataSubscription_AntiRegTopicSync(E_PsdkDataSubscriptionTopicName topic, uint16_t frequency, + ReceiveDataOfTopicCallback callback); + +/** + * @brief Get the latest data value and timestamp in aircraft time system when sending the data from aircraft of specified + * topic. If the specified topic has not been subscribed successfully, this function will return the error code. + * @note After calling this function, user need transfer type of data pointer that pointer to data of topic to + * corresponding data structure pointer for getting every item of the topic conveniently. + * @param topicName: topic name to be gotten value. + * @param data: pointer to memory space used to store data of the topic. The memory space used to store data of topic + * have to have been allocated correctly and should ensure its size is equal to data structure size corresponding to + * the topic, otherwise, this function will not be able to return data and timestamp (return error code). + * @param dataSizeOfTopic: the size of memory space used to store data of topic. Normally, this size is equal to data + * structure size corresponding to the topic. If this size is not equal to the size of the memory space, may cause memory + * overflow event + * @param timestamp: pointer to memory space used to store timestamps. The memory space used to store timestamps + * have to have been allocated correctly, and should ensure its size is equal to data structure size of timestamp, + * otherwise, this function will not be able to return data and timestamp (return error code) or even cause memory + * overflow event. If the user does not need timestamp information, can fill in NULL. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataSubscription_GetValueOfTopicWithTimestamp(E_PsdkDataSubscriptionTopicName topicName, + uint8_t *data, uint16_t dataSizeOfTopic, + T_PsdkDataSubscriptiontTimestamp *timestamp); + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_DATA_SUBSCRIPTION_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_transmission.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_transmission.h new file mode 100644 index 0000000..c5fae81 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_data_transmission.h @@ -0,0 +1,222 @@ +/** + ******************************************************************** + * @file psdk_data_transmission.h + * @brief This is the header file for "psdk_data_transmission.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_DATA_TRANSMISSION_H +#define PSDK_DATA_TRANSMISSION_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "dji_low_speed_data_channel.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Prototype of callback function used to receive data that come from mobile end. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param data: pointer to data. + * @param len: length of data. + * @return Execution result. + */ +typedef DjiLowSpeedDataChannelRecvDataCallback ReceiveDataFromMobileCallback; + +/** + * @brief Prototype of callback function used to receive data that come from onboard computer. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param data: pointer to data. + * @param len: length of data. + * @return Execution result. + */ +typedef DjiLowSpeedDataChannelRecvDataCallback ReceiveDataFromOsdkCallback; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise data transmission module in block mode. Should call this function before sending data to mobile + * end/onboard computer or receiving data. + * @note Max execution time of this function is slightly larger than 500ms. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_Init(void); + +/** + * @brief Deinitialize data transmission module. User can call this function to release all resources that data + * transmission module have occupied from the system and restore the state of internal variables when functions of data + * transmission module will no longer be used or exit program. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_DeInit(void); + +/** + * @brief Register callback function used to receive data from mobile end. After registering this callback function, + * callback function will be called automatically when system receive data from mobile end. + * @param callback: pointer to callback function. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_RegReceiveDataFromMobileCallback(ReceiveDataFromMobileCallback callback); + +/** + * @brief Register callback function used to receive data from onboard computer. After registering this callback + * function, callback function will be called automatically when system receive data from onboard computer. + * @param callback: pointer to callback function. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_RegReceiveDataFromOsdkCallback(ReceiveDataFromOsdkCallback callback); + +/** + * @brief Send data to mobile end via command channel. + * @warning If actual bandwidth is below limitation, data can be sent to the endpoint directly. If exceeds the limitation, + * firstly data will be stored to buffer of the flow controller and be sent to endpoint after a period (an integer multiple of + * 1s, the exact time depends on bandwidth limitation and buffer size). If the buffer is full, data be will discarded. The + * capacity of flow controller buffer is 512 bytes. + * @note Must ensure actual bandwidth is less than bandwidth limitation of corresponding channel or stream, please + * refer to developer documentation or state of channel/stream for details related to bandwidth limitation. User can + * get state of "sendToMobile" command channel via PsdkDataTransmission_GetSendToMobileState() function. If actual + * bandwidth exceeds the limitation or busy state is set, the user should stop transmitting data or decrease amount of data + * to be sent. + * @note Max size of data package sent to mobile end on a physical link of command channel is 128. If the length of data to + * be sent is greater than 128, data to be sent will be divided into multiple packages to send, and the user will also + * receive multiple data packages on the mobile end. + * @param data: pointer to data to be sent. + * @param len: length of data to be sent, unit: byte. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_SendDataToMobile(const uint8_t *data, uint8_t len); + +/** + * @brief Send data to the onboard computer via command channel. + * @warning If actual bandwidth is below limitation, data can be sent to the endpoint directly. If exceeds the limitation, + * firstly data will be stored to buffer of the flow controller and be sent to endpoint after a period (an integer multiple of + * 1s, the exact time depends on bandwidth limitation and buffer size). If the buffer is full, data will be discarded. The + * capacity of flow controller buffer is 512 bytes. + * @note Must ensure actual bandwidth is less than bandwidth limitation of corresponding channel or stream, please + * refer to developer documentation or state of channel/stream for details related to bandwidth limitation. User can + * get state of "sendToOsdk" command channel via PsdkDataTransmission_GetSendToOsdkState() function. If actual bandwidth + * exceeds the limitation or busy state is set, the user should stop transmitting data or decrease amount of data to be + * sent. + * @note Max size of data package sent to an onboard computer on the physical link of command channel is 255. If the length of data + * to be sent is greater than 255, data to be sent will be divided into multiple packages to send, and the user will also + * receive multiple data packages on the onboard computer. + * @param data: pointer to data to be sent. + * @param len: length of data to be sent, unit: byte. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_SendDataToOsdk(const uint8_t *data, uint8_t len); + +/** + * @brief Get data transmission state of "sendToMobile" command channel. User can use the state as base for controlling + * data transmission between payload and mobile end. + * @param state: pointer to "sendToMobile" command channel state. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_GetSendToMobileState(T_PsdkDataChannelState *state); + +/** + * @brief Get data transmission state of "sendToOsdk" command channel. User can use the state as base for controlling data + * transmission between payload and onboard computer. + * @param state: pointer to "sendToOsdk" command channel state. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_GetSendToOsdkState(T_PsdkDataChannelState *state); + +/** + * @brief Get the network remote address for sending data stream. + * @note The interface is used to get the network remote address for sending data stream. You can get this info for another + * heterogeneous system to do somethings. This interface should be used after calling PsdkCore_Init function. + * @param ipAddr: the remote ip address for sending data stream. + * @param port: the remote port for sending data stream. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_GetDataStreamRemoteAddress(char *ipAddr, uint16_t *port); + +/** + * @brief Send data to mobile end via data stream of the data channel. + * @note This function can be used only in Linux operating system. + * @note Must ensure actual bandwidth is less than bandwidth limitation of corresponding channel or stream, please + * refer to developer documentation and state of channel/stream for details related to bandwidth limitation. User can + * get state of "dataStream" channel via PsdkDataTransmission_GetDataStreamState() function. If actual bandwidth + * exceeds the limitation or busy state is set, the user should stop transmitting data or decrease amount of data to be + * sent. Otherwise, data may be discarded. + * @param data: pointer to data to be sent. + * @param len: length of data to be sent via data stream, and it must be less than or equal to 65000, unit: byte. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_SendDataStream(const uint8_t *data, uint16_t len); + +/** + * @brief Get data transmission state of "dataStream" channel. User can use the state as base for controlling data + * transmission of data stream. This function exists and can be used only in Linux operation system. + * @param state: pointer to "dataStream" channel state. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_GetDataStreamState(T_PsdkDataChannelState *state); + +/** + * @brief Get the network remote address for sending data stream. + * @note The interface is used to get the network remote address for sending data stream. You can get this info for another + * heterogeneous system to do somethings. This interface should be used after calling PsdkCore_Init function. + * @param ipAddr: the remote ip address for sending data stream. + * @param port: the remote port for sending data stream. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_GetDataStreamRemoteAddress(char *ipAddr, uint16_t *port); + +/** + * @brief Send data to mobile end via data stream of the data channel. + * @note This function can be used only in Linux operating system. + * @note Must ensure actual bandwidth is less than bandwidth limitation of corresponding channel or stream, please + * refer to developer documentation and state of channel/stream for details related to bandwidth limitation. User can + * get state of "dataStream" channel via PsdkDataTransmission_GetDataStreamState() function. If actual bandwidth + * exceeds the limitation or busy state is set, the user should stop transmitting data or decrease amount of data to be + * sent. Otherwise, data may be discarded. + * @param data: pointer to data to be sent. + * @param len: length of data to be sent via data stream, and it must be less than or equal to 65000, unit: byte. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_SendDataStream(const uint8_t *data, uint16_t len); + +/** + * @brief Get data transmission state of "dataStream" channel. User can use the state as base for controlling data + * transmission of data stream. This function exists and can be used only in Linux operation system. + * @param state: pointer to "dataStream" channel state. + * @return Execution result. + */ +T_PsdkReturnCode PsdkDataTransmission_GetDataStreamState(T_PsdkDataChannelState *state); + + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_DATA_TRANSMISSION_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_error.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_error.h new file mode 100644 index 0000000..f9e91e4 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_error.h @@ -0,0 +1,208 @@ +/** + ******************************************************************** + * @file psdk_error.h + * @brief This is the header file for "psdk_error.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_ERROR_H +#define PSDK_ERROR_H + +/* Includes ------------------------------------------------------------------*/ +#include +#include "dji_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +#define PSDK_ERROR_MODULE_INDEX_OFFSET DJI_ERROR_MODULE_INDEX_OFFSET +#define PSDK_ERROR_MODULE_INDEX_MASK DJI_ERROR_MODULE_INDEX_MASK +#define PSDK_ERROR_RAW_CODE_OFFSET DJI_ERROR_RAW_CODE_OFFSET +#define PSDK_ERROR_RAW_CODE_MASK DJI_ERROR_RAW_CODE_MASK + +#define PSDK_ERROR_CODE(moduleIndex, rawErrCode) DJI_ERROR_CODE(moduleIndex, rawErrCode) + +/** + * @brief Error objects, specifying error code, error description, error reason and error recovery suggestion below. + * @attention Require arrange by error code from small to large. + */ +#define PSDK_ERROR_OBJECTS DJI_ERROR_OBJECTS + +#define PSDK_RETURN_CODE_OK DJI_RETURN_CODE_OK /*!< Payload SDK return code represents as status is ok. */ +#define PSDK_RETURN_CODE_ERR_ALLOC DJI_RETURN_CODE_ERR_ALLOC /*!< Payload SDK return code represents as status alloc error. */ +#define PSDK_RETURN_CODE_ERR_TIMEOUT DJI_RETURN_CODE_ERR_TIMEOUT /*!< Payload SDK return code represents as status timeout error. */ +#define PSDK_RETURN_CODE_ERR_NOT_FOUND DJI_RETURN_CODE_ERR_NOT_FOUND /*!< Payload SDK return code represents as status not found error. */ +#define PSDK_RETURN_CODE_ERR_OUT_OF_RANGE DJI_RETURN_CODE_ERR_OUT_OF_RANGE /*!< Payload SDK return code represents as status out of range error. */ +#define PSDK_RETURN_CODE_ERR_PARAM DJI_RETURN_CODE_ERR_PARAM /*!< Payload SDK return code represents as status parameter error. */ +#define PSDK_RETURN_CODE_ERR_SYSTEM DJI_RETURN_CODE_ERR_SYSTEM /*!< Payload SDK return code represents as status system error. */ +#define PSDK_RETURN_CODE_ERR_BUSY DJI_RETURN_CODE_ERR_BUSY /*!< Payload SDK return code represents as status busy error. */ +#define PSDK_RETURN_CODE_ERR_UNSUPPORT DJI_RETURN_CODE_ERR_UNSUPPORT /*!< Payload SDK return code represents as status nonsupport error. */ +#define PSDK_RETURN_CODE_ERR_UNKNOWN DJI_RETURN_CODE_ERR_UNKNOWN /*!< Payload SDK return code represents as status unknown error. */ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief PSDK module enum for defining error code. + */ +typedef E_DjiErrorModule E_PsdkErrorModule; +#define PSDK_ERROR_MODULE_SYSTEM DJI_ERROR_MODULE_SYSTEM +#define PSDK_ERROR_MODULE_PLATFORM DJI_ERROR_MODULE_PLATFORM +#define PSDK_ERROR_MODULE_LOGGER DJI_ERROR_MODULE_LOGGER +#define PSDK_ERROR_MODULE_TIME_SYNC DJI_ERROR_MODULE_TIME_SYNC +#define PSDK_ERROR_MODULE_COMMAND DJI_ERROR_MODULE_COMMAND +#define PSDK_ERROR_MODULE_CAMERA DJI_ERROR_MODULE_CAMERA +#define PSDK_ERROR_MODULE_GIMBAL DJI_ERROR_MODULE_GIMBAL +#define PSDK_ERROR_MODULE_XPORT DJI_ERROR_MODULE_XPORT +#define PSDK_ERROR_MODULE_PAYLOAD_COLLABORATION DJI_ERROR_MODULE_PAYLOAD_COLLABORATION +#define PSDK_ERROR_MODULE_WIDGET DJI_ERROR_MODULE_WIDGET +#define PSDK_ERROR_MODULE_CORE DJI_ERROR_MODULE_CORE +#define PSDK_ERROR_MODULE_IDENTITY DJI_ERROR_MODULE_IDENTITY +#define PSDK_ERROR_MODULE_TRANSMISSION DJI_ERROR_MODULE_TRANSMISSION +#define PSDK_ERROR_MODULE_DATA_CHANNEL DJI_ERROR_MODULE_DATA_CHANNEL +#define PSDK_ERROR_MODULE_SUBSCRIPTION DJI_ERROR_MODULE_SUBSCRIPTION +#define PSDK_ERROR_MODULE_MOP_CHANNEL DJI_ERROR_MODULE_MOP_CHANNEL +#define PSDK_ERROR_MODULE_POSITIONING DJI_ERROR_MODULE_POSITIONING +#define PSDK_ERROR_MODULE_POWER_MANAGEMENT DJI_ERROR_MODULE_POWER_MANAGEMENT +#define PSDK_ERROR_MODULE_AIRCRAFTINFO DJI_ERROR_MODULE_AIRCRAFTINFO +#define PSDK_ERROR_MODULE_PRODUCTINFO DJI_ERROR_MODULE_PRODUCTINFO +#define PSDK_ERROR_MODULE_FLOWCONTROLLER DJI_ERROR_MODULE_FLOWCONTROLLER +#define PSDK_ERROR_MODULE_DOWNLOADER DJI_ERROR_MODULE_DOWNLOADER +#define PSDK_ERROR_MODULE_PARAMETER DJI_ERROR_MODULE_PARAMETER +#define PSDK_ERROR_MODULE_UTIL DJI_ERROR_MODULE_UTIL +#define PSDK_ERROR_MODULE_USER DJI_ERROR_MODULE_USER +#define PSDK_ERROR_MODULE_NEGOTIATE DJI_ERROR_MODULE_NEGOTIATE +#define PSDK_ERROR_MODULE_UPGRADE DJI_ERROR_MODULE_UPGRADE +#define PSDK_ERROR_MODULE_ERROR DJI_ERROR_MODULE_ERROR + +/** + * @brief Raw error code of system module. + */ +typedef E_DjiErrorSystemModuleRawCode E_PsdkErrorSystemModuleRawCode; +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_SUCCESS DJI_ERROR_SYSTEM_MODULE_RAW_CODE_SUCCESS +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_INVALID_REQUEST_PARAMETER DJI_ERROR_SYSTEM_MODULE_RAW_CODE_INVALID_REQUEST_PARAMETER +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_EXECUTING_HIGHER_PRIORITY_TASK DJI_ERROR_SYSTEM_MODULE_RAW_CODE_EXECUTING_HIGHER_PRIORITY_TASK +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_NONSUPPORT DJI_ERROR_SYSTEM_MODULE_RAW_CODE_NONSUPPORT +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_TIMEOUT DJI_ERROR_SYSTEM_MODULE_RAW_CODE_TIMEOUT +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_MEMORY_ALLOC_FAILED DJI_ERROR_SYSTEM_MODULE_RAW_CODE_MEMORY_ALLOC_FAILED +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_INVALID_PARAMETER DJI_ERROR_SYSTEM_MODULE_RAW_CODE_INVALID_PARAMETER +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_NONSUPPORT_IN_CURRENT_STATE DJI_ERROR_SYSTEM_MODULE_RAW_CODE_NONSUPPORT_IN_CURRENT_STATE +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_SYSTEM_ERROR DJI_ERROR_SYSTEM_MODULE_RAW_CODE_SYSTEM_ERROR +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_HARDWARE_ERR DJI_ERROR_SYSTEM_MODULE_RAW_CODE_HARDWARE_ERR +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_INSUFFICIENT_ELECTRICITY DJI_ERROR_SYSTEM_MODULE_RAW_CODE_INSUFFICIENT_ELECTRICITY +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_UNKNOWN DJI_ERROR_SYSTEM_MODULE_RAW_CODE_UNKNOWN +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_NOT_FOUND DJI_ERROR_SYSTEM_MODULE_RAW_CODE_NOT_FOUND +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_OUT_OF_RANGE DJI_ERROR_SYSTEM_MODULE_RAW_CODE_OUT_OF_RANGE +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_BUSY DJI_ERROR_SYSTEM_MODULE_RAW_CODE_BUSY +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_DUPLICATE DJI_ERROR_SYSTEM_MODULE_RAW_CODE_DUPLICATE +#define PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_ADAPTER_NOT_MATCH DJI_ERROR_SYSTEM_MODULE_RAW_CODE_ADAPTER_NOT_MATCH + +/** + * @brief Raw error code of gimbal module. + */ +typedef E_DjiErrorGimbalModuleRawCode E_PsdkErrorGimbalModuleRawCode; +#define PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_PITCH_REACH_POSITIVE_LIMIT DJI_ERROR_GIMBAL_MODULE_RAW_CODE_PITCH_REACH_POSITIVE_LIMIT +#define PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_PITCH_REACH_NEGATIVE_LIMIT DJI_ERROR_GIMBAL_MODULE_RAW_CODE_PITCH_REACH_NEGATIVE_LIMIT +#define PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_ROLL_REACH_POSITIVE_LIMIT DJI_ERROR_GIMBAL_MODULE_RAW_CODE_ROLL_REACH_POSITIVE_LIMIT +#define PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_ROLL_REACH_NEGATIVE_LIMIT DJI_ERROR_GIMBAL_MODULE_RAW_CODE_ROLL_REACH_NEGATIVE_LIMIT +#define PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_YAW_REACH_POSITIVE_LIMIT DJI_ERROR_GIMBAL_MODULE_RAW_CODE_YAW_REACH_POSITIVE_LIMIT +#define PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_YAW_REACH_NEGATIVE_LIMIT DJI_ERROR_GIMBAL_MODULE_RAW_CODE_YAW_REACH_NEGATIVE_LIMIT +#define PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_NON_CONTROL_AUTHORITY DJI_ERROR_GIMBAL_MODULE_RAW_CODE_NON_CONTROL_AUTHORITY + +/** + * @brief Raw error code of payload collaboration module. + */ +typedef E_DjiErrorPayloadCollaborationModuleRawCode E_PsdkErrorPayloadCollaborationModuleRawCode; +#define PSDK_ERROR_PAYLOAD_COLLABORATION_MODULE_RAW_CODE_POSITION_NOT_MATCH DJI_ERROR_PAYLOAD_COLLABORATION_MODULE_RAW_CODE_POSITION_NOT_MATCH + +/** + * @brief Raw error code of subscription module. + */ +typedef E_DjiErrorSubscriptionModuleRawCode E_PsdkErrorSubscriptionModuleRawCode; +#define PSDK_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_INVALID_TOPIC_FREQ DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_INVALID_TOPIC_FREQ +#define PSDK_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_DUPLICATE DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_DUPLICATE +#define PSDK_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_NOT_SUBSCRIBED DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_NOT_SUBSCRIBED +#define PSDK_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TIMESTAMP_NOT_ENABLE DJI_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TIMESTAMP_NOT_ENABLE + +/** + * @brief Raw error code of mop channel module. + */ +typedef E_DjiErrorMopChannelModuleRawCode E_PsdkErrorMopChannelModuleRawCode; +#define PSDK_ERROR_MOP_CHANNEL_MODULE_RAW_CODE_CONNECTION_CLOSE DJI_ERROR_MOP_CHANNEL_MODULE_RAW_CODE_CONNECTION_CLOSE + +//@formatter:off +/** + * @brief PSDK error code complete works. Users can search all error messages here. + * @details Please get error description, error reason and error recovery suggestion of every error code from + * ::PSDK_ERROR_OBJECTS macro. + */ +enum PsdkErrorCode { + /* system module error code, including some common error code */ + PSDK_ERROR_SYSTEM_MODULE_CODE_SUCCESS = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_SUCCESS), + PSDK_ERROR_SYSTEM_MODULE_CODE_INVALID_REQUEST_PARAMETER = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_INVALID_REQUEST_PARAMETER), + PSDK_ERROR_SYSTEM_MODULE_CODE_EXECUTING_HIGHER_PRIORITY_TASK = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_EXECUTING_HIGHER_PRIORITY_TASK), + PSDK_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_NONSUPPORT), + PSDK_ERROR_SYSTEM_MODULE_CODE_TIMEOUT = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_TIMEOUT), + PSDK_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_MEMORY_ALLOC_FAILED), + PSDK_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_INVALID_PARAMETER), + PSDK_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT_IN_CURRENT_STATE = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_NONSUPPORT_IN_CURRENT_STATE), + PSDK_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_SYSTEM_ERROR), + PSDK_ERROR_SYSTEM_MODULE_CODE_HARDWARE_ERR = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_HARDWARE_ERR), + PSDK_ERROR_SYSTEM_MODULE_CODE_INSUFFICIENT_ELECTRICITY = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_INSUFFICIENT_ELECTRICITY), + PSDK_ERROR_SYSTEM_MODULE_CODE_UNKNOWN = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_UNKNOWN), + PSDK_ERROR_SYSTEM_MODULE_CODE_NOT_FOUND = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_NOT_FOUND), + PSDK_ERROR_SYSTEM_MODULE_CODE_OUT_OF_RANGE = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_OUT_OF_RANGE), + PSDK_ERROR_SYSTEM_MODULE_CODE_BUSY = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_BUSY), + PSDK_ERROR_SYSTEM_MODULE_CODE_DUPLICATE = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_DUPLICATE), + PSDK_ERROR_SYSTEM_MODULE_CODE_ADAPTER_NOT_MATCH = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SYSTEM, PSDK_ERROR_SYSTEM_MODULE_RAW_CODE_ADAPTER_NOT_MATCH), + + /* gimbal module error code */ + PSDK_ERROR_GIMBAL_MODULE_CODE_PITCH_REACH_POSITIVE_LIMIT = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_GIMBAL, PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_PITCH_REACH_POSITIVE_LIMIT), + PSDK_ERROR_GIMBAL_MODULE_CODE_PITCH_REACH_NEGATIVE_LIMIT = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_GIMBAL, PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_PITCH_REACH_NEGATIVE_LIMIT), + PSDK_ERROR_GIMBAL_MODULE_CODE_ROLL_REACH_POSITIVE_LIMIT = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_GIMBAL, PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_ROLL_REACH_POSITIVE_LIMIT), + PSDK_ERROR_GIMBAL_MODULE_CODE_ROLL_REACH_NEGATIVE_LIMIT = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_GIMBAL, PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_ROLL_REACH_NEGATIVE_LIMIT), + PSDK_ERROR_GIMBAL_MODULE_CODE_YAW_REACH_POSITIVE_LIMIT = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_GIMBAL, PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_YAW_REACH_POSITIVE_LIMIT), + PSDK_ERROR_GIMBAL_MODULE_CODE_YAW_REACH_NEGATIVE_LIMIT = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_GIMBAL, PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_YAW_REACH_NEGATIVE_LIMIT), + PSDK_ERROR_GIMBAL_MODULE_CODE_NON_CONTROL_AUTHORITY = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_GIMBAL, PSDK_ERROR_GIMBAL_MODULE_RAW_CODE_NON_CONTROL_AUTHORITY), + + /* payload collaboration module error code */ + PSDK_ERROR_PAYLOAD_COLLABORATION_MODULE_CODE_POSITION_NOT_MATCH = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_PAYLOAD_COLLABORATION, PSDK_ERROR_PAYLOAD_COLLABORATION_MODULE_RAW_CODE_POSITION_NOT_MATCH), + + /* subscription module error code */ + PSDK_ERROR_SUBSCRIPTION_MODULE_CODE_INVALID_TOPIC_FREQ = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SUBSCRIPTION, PSDK_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_INVALID_TOPIC_FREQ), + PSDK_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_DUPLICATE = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SUBSCRIPTION, PSDK_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_DUPLICATE), + PSDK_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_NOT_SUBSCRIBED = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SUBSCRIPTION, PSDK_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TOPIC_NOT_SUBSCRIBED), + PSDK_ERROR_SUBSCRIPTION_MODULE_CODE_TIMESTAMP_NOT_ENABLE = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_SUBSCRIPTION, PSDK_ERROR_SUBSCRIPTION_MODULE_RAW_CODE_TIMESTAMP_NOT_ENABLE), + + /* mop channel module error code */ + PSDK_ERROR_MOP_CHANNEL_MODULE_CODE_CONNECTION_CLOSE = PSDK_ERROR_CODE(PSDK_ERROR_MODULE_MOP_CHANNEL, PSDK_ERROR_MOP_CHANNEL_MODULE_RAW_CODE_CONNECTION_CLOSE), +}; +//@formatter:on + +/* Exported functions --------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_ERROR_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_gimbal.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_gimbal.h new file mode 100644 index 0000000..4f3a90e --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_gimbal.h @@ -0,0 +1,166 @@ +/** + ******************************************************************** + * @file psdk_gimbal.h + * @brief PSDK gimbal module is used to achieve the third gimbal for developer. The module can be used only when the PSDK + * adapter is Skyport, rather than XPort. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_GIMBAL_H +#define PSDK_GIMBAL_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "dji_gimbal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Gimbal work mode, specifies how gimbal follow aircraft movement. + */ +typedef E_DjiGimbalMode E_PsdkGimbalMode; +/*!< Free mode, fix gimbal attitude in the ground coordinate, ignoring movement of aircraft. */ +#define PSDK_GIMBAL_MODE_FREE DJI_GIMBAL_MODE_FREE +/*!< FPV (First Person View) mode, only control roll and yaw angle of gimbal in the ground coordinate to follow aircraft. */ +#define PSDK_GIMBAL_MODE_FPV DJI_GIMBAL_MODE_FPV +/*!< Yaw follow mode, only control yaw angle of gimbal in the ground coordinate to follow aircraft. */ +#define PSDK_GIMBAL_MODE_YAW_FOLLOW DJI_GIMBAL_MODE_YAW_FOLLOW + +/** + * @brief Gimbal calibration stage and result. + */ +typedef E_DjiGimbalCalibrationStage E_PsdkGimbalCalibrationStage; +/*!< Calibration have been completed and the result is successful. */ +#define PSDK_GIMBAL_CALIBRATION_STAGE_COMPLETE DJI_GIMBAL_CALIBRATION_STAGE_COMPLETE +/*!< Gimbal is calibrating. */ +#define PSDK_GIMBAL_CALIBRATION_STAGE_PROCRESSING DJI_GIMBAL_CALIBRATION_STAGE_PROCRESSING +/*!< Calibration have been completed and the result is failure. */ +#define PSDK_GIMBAL_CALIBRATION_STAGE_FAILED DJI_GIMBAL_CALIBRATION_STAGE_FAILED + +/** + * @brief Gimbal rotation mode, specifies control style. + */ +typedef E_DjiGimbalRotationMode E_PsdkGimbalRotationMode; +#define PSDK_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE /*!< Relative angle rotation mode, represents rotating gimbal specified angles based on current angles. */ +#define PSDK_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE /*!< Absolute angle rotation mode, represents rotating gimbal to specified angles in the ground coordinate. */ +#define PSDK_GIMBAL_ROTATION_MODE_SPEED DJI_GIMBAL_ROTATION_MODE_SPEED /*!< Speed rotation mode, specifies rotation speed of gimbal in the ground coordinate. */ + +/** + * @brief Axis of gimbal. + */ +typedef E_DjiGimbalAxis E_PsdkGimbalAxis; +#define PSDK_GIMBAL_AXIS_PITCH DJI_GIMBAL_AXIS_PITCH /*!< Pitch axis. */ +#define PSDK_GIMBAL_AXIS_ROLL DJI_GIMBAL_AXIS_ROLL /*!< Roll axis. */ +#define PSDK_GIMBAL_AXIS_YAW DJI_GIMBAL_AXIS_YAW /*!< Yaw axis. */ + +/** + * @brief Reset mode of gimbal. + */ +typedef E_DjiGimbalResetMode E_PsdkGimbalResetMode; +/*! Only reset yaw axis of gimbal. Reset angle of yaw axis to the sum of yaw axis angle of aircraft and fine tune angle + * of yaw axis of gimbal. */ +#define PSDK_GIMBAL_RESET_MODE_YAW DJI_GIMBAL_RESET_MODE_YAW +/*! Reset yaw axis and pitch axis of gimbal. Reset angle of yaw axis to sum of yaw axis angle of aircraft and fine tune + * angle of yaw axis of gimbal, and reset pitch axis angle to the fine tune angle. */ +#define PSDK_GIMBAL_RESET_MODE_PITCH_AND_YAW DJI_GIMBAL_RESET_MODE_PITCH_AND_YAW +/*! Reset yaw axis and pitch axis of gimbal. Reset angle of yaw axis to sum of yaw axis angle of aircraft and fine tune + * angle of yaw axis of gimbal, and reset pitch axis angle to sum of -90 degree and fine tune angle if gimbal + * downward, sum of 90 degree and fine tune angle if upward. */ +#define PSDK_GIMBAL_RESET_MODE_PITCH_DOWNWARD_UPWARD_AND_YAW DJI_GIMBAL_RESET_MODE_PITCH_DOWNWARD_UPWARD_AND_YAW +/*! Reset pitch axis of gimbal. Reset pitch axis angle to sum of -90 degree and fine tune angle if gimbal downward, + * sum of 90 degree and fine tune angle if upward. */ +#define PSDK_GIMBAL_RESET_MODE_PITCH_DOWNWARD_UPWARD DJI_GIMBAL_RESET_MODE_PITCH_DOWNWARD_UPWARD + +/** + * @brief Smooth factor of gimbal controller. + */ +typedef T_DjiGimbalControllerSmoothFactor T_PsdkGimbalControllerSmoothFactor; + +/** + * @brief Max speed percentage of every axis of gimbal. + */ +typedef T_DjiGimbalControllerMaxSpeedPercentage T_PsdkGimbalControllerMaxSpeedPercentage; + +/** + * @brief Data structure describes gimbal system state. + */ +typedef T_DjiGimbalSystemState T_PsdkGimbalSystemState; + +/** + * @brief Reach limit flag. + */ +typedef T_DjiGimbalReachLimitFlag T_PsdkGimbalReachLimitFlag; + +/** + * @brief Gimbal attitude related information. + */ +typedef T_DjiGimbalAttitudeInformation T_PsdkGimbalAttitudeInformation; + +/** + * @brief Gimbal calibration state. + */ +typedef T_DjiGimbalCalibrationState T_PsdkGimbalCalibrationState; + +/** + * @brief Gimbal rotation command property. + */ +typedef T_DjiGimbalRotationProperty T_PsdkGimbalRotationProperty; + +/** + * @brief Common handler function prototypes of gimbal, that is, some common callback function prototypes of gimbal. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef T_DjiGimbalCommonHandler T_PsdkGimbalCommonHandler; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise gimbal module, and user should call this function before using gimbal features. + * @return Execution result. + */ +T_PsdkReturnCode PsdkGimbal_Init(void); + +/** + * @brief Deinitialise gimbal module. + * @return Execution result. + */ +T_PsdkReturnCode PsdkGimbal_DeInit(void); + +/** + * @brief Register common handler functions/callback functions of gimbal. After registering, callback functions will be + * called automatically. + * @param commonHandler: pointer to common handler functions of gimbal. + * @return Execution result. + */ +T_PsdkReturnCode PsdkGimbal_RegCommonHandler(const T_PsdkGimbalCommonHandler *commonHandler); + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_GIMBAL_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_logger.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_logger.h new file mode 100644 index 0000000..b7a511b --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_logger.h @@ -0,0 +1,113 @@ +/** + ******************************************************************** + * @file psdk_logger.h + * @brief This is the header file for "psdk_logger.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_LOGGER_H +#define PSDK_LOGGER_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "dji_logger.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef E_DjiLoggerConsoleLogLevel E_PsdkLoggerConsoleLogLevel; + +/*!< Logger console error level. The method and level of the console are associated with each other. If the level of the + * registered console method is lower than this level, the level interface will not be printed successfully. */ +#define PSDK_LOGGER_CONSOLE_LOG_LEVEL_ERROR DJI_LOGGER_CONSOLE_LOG_LEVEL_ERROR + +/*!< Logger console warning level.The method and level of the console are associated with each other. If the level of the + * registered console method is lower than this level, the level interface will not be printed successfully. */ +#define PSDK_LOGGER_CONSOLE_LOG_LEVEL_WARNING DJI_LOGGER_CONSOLE_LOG_LEVEL_WARNING +/*!< Logger console info level. The method and level of the console are associated with each other. If the level of the + * registered console method is lower than this level, the level interface will not be printed successfully. */ +#define PSDK_LOGGER_CONSOLE_LOG_LEVEL_INFO DJI_LOGGER_CONSOLE_LOG_LEVEL_INFO +/*!< Logger console debug level. The method and level of the console are associated with each other. If the level of the + * registered console method is lower than this level, the level interface will not be printed successfully. */ +#define PSDK_LOGGER_CONSOLE_LOG_LEVEL_DEBUG DJI_LOGGER_CONSOLE_LOG_LEVEL_DEBUG + +typedef T_DjiLoggerConsole T_PsdkLoggerConsole; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Add the console function and level for Payload SDK. + * @note When registering the console, you need to provide the method of the console and the level corresponding to + * the method. Log levels from high to low are Debug, Info, Warn, and Error, the log function module can print all + * logs not higher than the specified level. Maximum support for registering eight different console methods at the + * same time.Before registering the console method, you should test the registration method ensure that all the method + * are normally. If you registered multiple methods at the same time, all the methods will be print. + * @param console: pointer to the console function. + * @return Execution result. + */ +T_PsdkReturnCode PsdkLogger_AddConsole(T_PsdkLoggerConsole *console); + +/** + * @brief Print out the info log of the specified format by the registration method. + * @note The registered method is printed according to the corresponding level. If the level of the console is lower + * than the level at which the log needs to be printed, it will not be printed successfully. + * @param fmt: pointer to the format string that needs print out. + * @param ...: Variable parameters, consistent with the use of the system interface print out. + */ +void PsdkLogger_UserLogInfo(const char *fmt, ...); + +/** + * @brief Print out the warning log of the specified format by the registration method. + * @note The registered method is printed according to the corresponding level. If the level of the console is lower + * than the level at which the log needs to be printed, it will not be printed successfully. + * @param fmt: pointer to the format string that needs print out. + * @param ...: Variable parameters, consistent with the use of the system interface print out. + */ +void PsdkLogger_UserLogWarn(const char *fmt, ...); + +/** + * @brief Print out the debug log of the specified format by the registration method. + * @note The registered method is printed according to the corresponding level. If the level of the console is lower + * than the level at which the log needs to be printed, it will not be printed successfully. + * @param fmt: pointer to the format string that needs print out. + * @param ...: Variable parameters, consistent with the use of the system interface print out. + */ +void PsdkLogger_UserLogDebug(const char *fmt, ...); + +/** + * @brief Print out the error log of the specified format by the registration method. + * @note The registered method is printed according to the corresponding level. If the level of the console is lower + * than the level at which the log needs to be printed, it will not be printed successfully. + * @param fmt: pointer to the format string that needs print out. + * @param ...: Variable parameters, consistent with the use of the system interface print out. + */ +void PsdkLogger_UserLogError(const char *fmt, ...); + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_LOGGER_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_mop_channel.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_mop_channel.h new file mode 100644 index 0000000..7e8c21d --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_mop_channel.h @@ -0,0 +1,150 @@ +/** + ******************************************************************** + * @file psdk_mop_channel.h + * @brief This is the header file for "psdk_mop_channel.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_MOP_CHANNEL_H +#define PSDK_MOP_CHANNEL_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "dji_mop_channel.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Mop channel handle. + */ +typedef T_DjiMopChannelHandle T_PsdkMopChannelHandle; + +/** + * @brief Mop channel transmission type. + */ +typedef E_DjiMopChannelTransType E_PsdkMopChannelTransType; +#define PSDK_MOP_CHANNEL_TRANS_RELIABLE DJI_MOP_CHANNEL_TRANS_RELIABLE +#define PSDK_MOP_CHANNEL_TRANS_UNRELIABLE DJI_MOP_CHANNEL_TRANS_UNRELIABLE + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialize the mop channel for operation about mop channel handle later. + * @note This interface needs to be called before calling other mop channel interfaces. Please make sure the network port + * is connected properly before calling this interface. Mop channel feature currently only supports linux platform. + * @return Execution result. + */ +T_PsdkReturnCode PsdkMopChannel_Init(void); + +/** + * @brief Create the mop channel handle by specified transmission type. + * @note After calling this interface, you should follow below cases: + * 1. When mop channel handle created successfully, you need bind channel id to this created mop channel handle and + * accept other client device connections, such as MSDK or OSDK device; + * 2. When mop channel accept successfully, you can use send or receive data interface to write or read data by accepted + * output channel handle; + * 3. When the mop channel handle do not used, you can use close or destroy interface to release the resource; + * @param channelHandle: pointer to the created mop channel. + * @param transType: the transmission type for mop channel ::E_PsdkMopChannelTransType. + * @return Execution result. + */ +T_PsdkReturnCode PsdkMopChannel_Create(T_PsdkMopChannelHandle *channelHandle, E_PsdkMopChannelTransType transType); + +/** + * @brief Destroy the created mop channel and release the resource that referenced by the channel handle. + * @note After calling this interface, we can not do any operation about this channel handle expect create channel handle. + * @param channelHandle: pointer to the created mop channel. + * @return Execution result. + */ +T_PsdkReturnCode PsdkMopChannel_Destroy(T_PsdkMopChannelHandle channelHandle); + +/** + * @brief Bind the channel id to the created mop channel handle. + * @note When mop channel handle created successfully, you can bind channel id to this created mop handle and calling + * interface ::PsdkMopChannel_Accept, then other client device can use this binded channel id to connect created mop handle. + * @param channelHandle: pointer to the created mop channel handle. + * @param channelId: the channel id of mop handle for accepting client device connection. + * @return Execution result. + */ +T_PsdkReturnCode PsdkMopChannel_Bind(T_PsdkMopChannelHandle channelHandle, + uint16_t channelId); + +/** + * @brief Accept the connection by binded channel id for created mop channel. + * @note The mop accept channel extracts the connection request on the queue of pennding connections for listening channel + * handle ::channelHandle. Create a new connected channel handle and return to user ::outChannelHandle by referrng to a new + * connection. Payload can be a server that allow multiple client connections by binded channel id. + * @param channelHandle: pointer to the created mop channel. + * @param outChannelHandle: pointer to the accepted output mop channel. + * @return Execution result. + */ +T_PsdkReturnCode PsdkMopChannel_Accept(T_PsdkMopChannelHandle channelHandle, + T_PsdkMopChannelHandle *outChannelHandle); + +/** + * @brief Close the created mop channel. + * @note After calling this interface, we can not do any operation about this channel handle expect destroy channel handle. + * @param channelHandle: pointer to the created mop channel. + * @return Execution result. + */ +T_PsdkReturnCode PsdkMopChannel_Close(T_PsdkMopChannelHandle channelHandle); + +/** + * @brief Send data by the accepted output mop channel. + * @note This interface should be called after successfully calling the interface ::PsdkMopChannel_Accept. It is recommended + * to send more bytes of data at a time to improve read and write efficiency. Need to determine whether the send is + * successful according to the return code and the actual sent data length. + * @param channelHandle: pointer to accepted output mop handle ::outChannelHandle by calling interface ::PsdkMopChannel_Accept. + * @param data: pointer to data to be sent. + * @param len: length of data to be sent via accepted output mop handle, unit: byte. + * @param realLen: pointer to real length of data that already sent. + * @return Execution result. + */ +T_PsdkReturnCode PsdkMopChannel_SendData(T_PsdkMopChannelHandle channelHandle, + uint8_t *data, + uint32_t len, + uint32_t *realLen); + +/** + * @brief Receive data from the accepted output mop channel. + * @note This interface should be called after successfully calling the interface ::PsdkMopChannel_Accept. It is recommended + * to receive more bytes of data at a time to improve read and write efficiency. Need to determine whether the receive + * is successful according to the return code and the actual received data length. + * @param channelHandle: pointer to accepted output mop handle ::outChannelHandle by calling interface ::PsdkMopChannel_Accept. + * @param data: pointer to data to store the received data. + * @param len: length of data to be received via accepted output mop handle, unit: byte. + * @param realLen: pointer to real length of data that already received. + * @return Execution result. + */ +T_PsdkReturnCode PsdkMopChannel_RecvData(T_PsdkMopChannelHandle channelHandle, + uint8_t *data, + uint32_t len, + uint32_t *realLen); +#ifdef __cplusplus +} +#endif + +#endif // PSDK_MOP_CHANNEL_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_payload_camera.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_payload_camera.h new file mode 100644 index 0000000..4c4b3fb --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_payload_camera.h @@ -0,0 +1,421 @@ +/** + ******************************************************************** + * @file psdk_payload_camera.h + * @brief This is the header file for "psdk_payload_camera.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_PAYLOAD_CAMERA_H +#define PSDK_PAYLOAD_CAMERA_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "dji_payload_camera.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Camera work mode. + */ +typedef E_DjiCameraMode E_PsdkCameraMode; +#define PSDK_CAMERA_MODE_SHOOT_PHOTO DJI_CAMERA_MODE_SHOOT_PHOTO /*!< Shoot photo work mode. */ +#define PSDK_CAMERA_MODE_RECORD_VIDEO DJI_CAMERA_MODE_RECORD_VIDEO/*!< Record video work mode. */ +#define PSDK_CAMERA_MODE_PLAYBACK DJI_CAMERA_MODE_PLAYBACK /*!< Media playback work mode. */ + +/** + * @brief Camera shoot photo mode. + */ +typedef E_DjiCameraShootPhotoMode E_PsdkCameraShootPhotoMode; +#define PSDK_CAMERA_SHOOT_PHOTO_MODE_SINGLE DJI_CAMERA_SHOOT_PHOTO_MODE_SINGLE /*!< Single photographing mode. */ +#define PSDK_CAMERA_SHOOT_PHOTO_MODE_BURST DJI_CAMERA_SHOOT_PHOTO_MODE_BURST/*!< Burst photographing mode. */ +#define PSDK_CAMERA_SHOOT_PHOTO_MODE_INTERVAL DJI_CAMERA_SHOOT_PHOTO_MODE_INTERVAL/*!< Interval photographing mode. */ + +/** + * @brief Camera shooting state when photographing. + */ +typedef E_DjiCameraShootingState E_PsdkCameraShootingState; +#define PSDK_CAMERA_SHOOTING_PHOTO_IDLE DJI_CAMERA_SHOOTING_PHOTO_IDLE /*!< Photographing in idle state. */ +#define PSDK_CAMERA_SHOOTING_SINGLE_PHOTO DJI_CAMERA_SHOOTING_SINGLE_PHOTO /*!< Photographing in single photograph state . */ +#define PSDK_CAMERA_SHOOTING_BURST_PHOTO DJI_CAMERA_SHOOTING_BURST_PHOTO /*!< Photographing in burst photograph state. */ +#define PSDK_CAMERA_SHOOTING_INTERVAL_PHOTO DJI_CAMERA_SHOOTING_INTERVAL_PHOTO /*!< Photographing in interval photograph state. */ + +/** + * @brief Camera burst count setting when photographing. + */ +typedef E_DjiCameraBurstCount E_PsdkCameraBurstCount; +#define PSDK_CAMERA_BURST_COUNT_2 DJI_CAMERA_BURST_COUNT_2 /*!< Photo number of burst photographing: 2. */ +#define PSDK_CAMERA_BURST_COUNT_3 DJI_CAMERA_BURST_COUNT_3 /*!< Photo number of burst photographing: 3. */ +#define PSDK_CAMERA_BURST_COUNT_5 DJI_CAMERA_BURST_COUNT_5 /*!< Photo number of burst photographing: 5. */ +#define PSDK_CAMERA_BURST_COUNT_7 DJI_CAMERA_BURST_COUNT_7/*!< Photo number of burst photographing: 7. */ +#define PSDK_CAMERA_BURST_COUNT_10 DJI_CAMERA_BURST_COUNT_10 /*!< Photo number of burst photographing: 10. */ +#define PSDK_CAMERA_BURST_COUNT_14 DJI_CAMERA_BURST_COUNT_14 /*!< Photo number of burst photographing: 14. */ + +/** + * @brief Camera metering mode. + */ +typedef E_DjiCameraMeteringMode E_PsdkCameraMeteringMode; +#define PSDK_CAMERA_METERING_MODE_CENTER DJI_CAMERA_METERING_MODE_CENTER /*!< Center metering mode. */ +#define PSDK_CAMERA_METERING_MODE_AVERAGE DJI_CAMERA_METERING_MODE_AVERAGE /*!< Average metering mode. */ +#define PSDK_CAMERA_METERING_MODE_SPOT DJI_CAMERA_METERING_MODE_SPOT /*!< Spot metering mode. */ + +/** + * @brief Camera focus mode. + */ +typedef E_DjiCameraFocusMode E_PsdkCameraFocusMode; +#define PSDK_CAMERA_FOCUS_MODE_MANUAL DJI_CAMERA_FOCUS_MODE_MANUAL /*!< Manual focus mode. */ +#define PSDK_CAMERA_FOCUS_MODE_AUTO DJI_CAMERA_FOCUS_MODE_AUTO /*!< Auto focus mode. */ + +/** + * @brief Camera zoom direction. + */ +typedef E_DjiCameraZoomDirection E_PsdkCameraZoomDirection; +#define PSDK_CAMERA_ZOOM_DIRECTION_OUT DJI_CAMERA_ZOOM_DIRECTION_OUT /*!< The lens moves in the far direction, the zoom factor becomes smaller. */ +#define PSDK_CAMERA_ZOOM_DIRECTION_IN DJI_CAMERA_ZOOM_DIRECTION_IN /*!< The lens moves in the near direction, the zoom factor becomes larger. */ + +/** + * @brief Camera zoom speed. + */ +typedef E_DjiCameraZoomSpeed E_PsdkCameraZoomSpeed; +#define PSDK_CAMERA_ZOOM_SPEED_SLOWEST DJI_CAMERA_ZOOM_SPEED_SLOWEST/*!< Lens zooms in slowest speed. */ +#define PSDK_CAMERA_ZOOM_SPEED_SLOW DJI_CAMERA_ZOOM_SPEED_SLOW /*!< Lens zooms in slow speed. */ +#define PSDK_CAMERA_ZOOM_SPEED_MODERATELY_SLOW DJI_CAMERA_ZOOM_SPEED_MODERATELY_SLOW /*!< Lens zooms in speed slightly slower than normal speed. */ +#define PSDK_CAMERA_ZOOM_SPEED_NORMAL DJI_CAMERA_ZOOM_SPEED_NORMAL /*!< Lens zooms in normal speed. */ +#define PSDK_CAMERA_ZOOM_SPEED_MODERATELY_FAST DJI_CAMERA_ZOOM_SPEED_MODERATELY_FAST /*!< Lens zooms very in speed slightly faster than normal speed. */ +#define PSDK_CAMERA_ZOOM_SPEED_FAST DJI_CAMERA_ZOOM_SPEED_FAST /*!< Lens zooms very in fast speed. */ +#define PSDK_CAMERA_ZOOM_SPEED_FASTEST DJI_CAMERA_ZOOM_SPEED_FASTEST /*!< Lens zooms very in fastest speed. */ + +/** + * @brief Camera supported media file type. + */ +typedef E_DjiCameraMediaFileType E_PsdkCameraMediaFileType; +#define PSDK_CAMERA_FILE_TYPE_JPEG DJI_CAMERA_FILE_TYPE_JPEG /*!< Media file JPEG type. */ +#define PSDK_CAMERA_FILE_TYPE_DNG DJI_CAMERA_FILE_TYPE_DNG /*!< Media file DNG type. */ +#define PSDK_CAMERA_FILE_TYPE_MOV DJI_CAMERA_FILE_TYPE_MOV /*!< Media file MOV type. */ +#define PSDK_CAMERA_FILE_TYPE_MP4 DJI_CAMERA_FILE_TYPE_MP4 /*!< Media file MP4 type. */ + +/** + * @brief Camera playback mode in playback process. + */ +typedef E_DjiCameraPlaybackMode E_PsdkCameraPlaybackMode; +#define PSDK_CAMERA_PLAYBACK_MODE_PLAY DJI_CAMERA_PLAYBACK_MODE_PLAY /*!< Play playbacking mode. */ +#define PSDK_CAMERA_PLAYBACK_MODE_PAUSE DJI_CAMERA_PLAYBACK_MODE_PAUSE /*!< Pause playbacking mode. */ +#define PSDK_CAMERA_PLAYBACK_MODE_STOP DJI_CAMERA_PLAYBACK_MODE_STOP /*!< Stop playbacking mode. */ + +/** + * @brief Camera supported video frames when working in playback mode. + */ +typedef E_DjiCameraVideoFrameRate E_PsdkCameraVideoFrameRate; +#define PSDK_CAMERA_VIDEO_FRAME_RATE_24_FPS DJI_CAMERA_VIDEO_FRAME_RATE_24_FPS /*!< The camera's video frame rate is 24fps (frames per second) */ +#define PSDK_CAMERA_VIDEO_FRAME_RATE_25_FPS DJI_CAMERA_VIDEO_FRAME_RATE_25_FPS /*!< The camera's video frame rate is 25fps (frames per second) */ +#define PSDK_CAMERA_VIDEO_FRAME_RATE_30_FPS DJI_CAMERA_VIDEO_FRAME_RATE_30_FPS /*!< The camera's video frame rate is 30fps (frames per second) */ +#define PSDK_CAMERA_VIDEO_FRAME_RATE_UNKNOWN DJI_CAMERA_VIDEO_FRAME_RATE_UNKNOWN /*!< The camera's video frame rate is unknown (frames per second) */ + +/** + * @brief Camera supported video resolutions when working in playback mode. + */ +typedef E_DjiCameraVideoResolution E_PsdkCameraVideoResolution; +#define PSDK_CAMERA_VIDEO_RESOLUTION_640x480 DJI_CAMERA_VIDEO_RESOLUTION_640x480 /*!< /The camera's video resolution is 640x480. */ +#define PSDK_CAMERA_VIDEO_RESOLUTION_1280x720 DJI_CAMERA_VIDEO_RESOLUTION_1280x720 /*!< /The camera's video resolution is 1280x720. */ +#define PSDK_CAMERA_VIDEO_RESOLUTION_1920x1080 DJI_CAMERA_VIDEO_RESOLUTION_1920x1080 /*!< /The camera's video resolution is 1920x1080. */ +#define PSDK_CAMERA_VIDEO_RESOLUTION_2048x1080 DJI_CAMERA_VIDEO_RESOLUTION_2048x1080 /*!< /The camera's video resolution is 2048x1080. */ +#define PSDK_CAMERA_VIDEO_RESOLUTION_3840x2160 DJI_CAMERA_VIDEO_RESOLUTION_3840x2160 /*!< /The camera's video resolution is 3840x2160. */ +#define PSDK_CAMERA_VIDEO_RESOLUTION_UNKNOWN DJI_CAMERA_VIDEO_RESOLUTION_UNKNOWN /*!< /The camera's video resolution is unknown. */ + +/** + * @brief Camera zoom state in tap zoom process. + */ +typedef E_DjiCameraTapZoomState E_PsdkCameraTapZoomState; +#define PSDK_CAMERA_TAP_ZOOM_STATE_IDLE DJI_CAMERA_TAP_ZOOM_STATE_IDLE /*!< Camera is not in tap zoom process. */ +#define PSDK_CAMERA_TAP_ZOOM_STATE_ZOOM_IN DJI_CAMERA_TAP_ZOOM_STATE_ZOOM_IN /*!< Camera is zooming in. */ +#define PSDK_CAMERA_TAP_ZOOM_STATE_ZOOM_OUT DJI_CAMERA_TAP_ZOOM_STATE_ZOOM_OUT /*!< Camera is zooming out. */ +#define PSDK_CAMERA_TAP_ZOOM_STATE_ZOOM_LIMITED DJI_CAMERA_TAP_ZOOM_STATE_ZOOM_LIMITED /*!< Camera has reached zoom limit. */ + +/** + * @brief Camera video stream type. + */ +typedef E_DjiCameraVideoStreamType E_PsdkCameraVideoStreamType; +/*! Camera video stream by h264 custom format, which needs to comply with the user document Custom-H264 video stream format standard. + * When using this format to send a video stream, the bit rate of the video stream needs must not exceed the real-time bandwidth + * limit of the channel that feedback by interface #PsdkPayloadCamera_GetVideoStreamState.*/ +#define PSDK_CAMERA_VIDEO_STREAM_TYPE_H264_CUSTOM_FORMAT DJI_CAMERA_VIDEO_STREAM_TYPE_H264_CUSTOM_FORMAT +/*! Camera video stream by h264 DJI format, which needs to comply with the user document DJI-H264 video stream format standard. + * When using this format to send a video stream, the video stream will be recoded by aircraft. No need to dynamically adjust + * the bit rate to ensure the quality of transmission. But the bit rate of video stream can not exceed 8Mbps. */ +#define PSDK_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT DJI_CAMERA_VIDEO_STREAM_TYPE_H264_DJI_FORMAT + +/** + * @brief Camera sdcard state. + */ +typedef T_DjiCameraSDCardState T_PsdkCameraSDCardState; + +/** + * @brief Camera time interval settings when in interval shootPhoto mode. + */ +typedef T_DjiCameraPhotoTimeIntervalSettings T_PsdkCameraPhotoTimeIntervalSettings; + +/** + * @brief Camera metering target when in spot metering mode. + */ +typedef T_DjiCameraSpotMeteringTarget T_PsdkCameraSpotMeteringTarget; + +/** + * @brief Camera system state. + */ +typedef T_DjiCameraSystemState T_PsdkCameraSystemState; + +/** + * @brief Camera focus target point when in focus mode. + */ +typedef T_DjiCameraPointInScreen T_PsdkCameraPointInScreen; + +/** + * @brief Camera focus assistant settings. + */ +typedef T_DjiCameraFocusAssistantSettings T_PsdkCameraFocusAssistantSettings; + +/** + * @brief Camera playback status. + */ +typedef T_DjiCameraPlaybackStatus T_PsdkCameraPlaybackStatus; + +/** + * @brief Camera focus assistant settings. + */ +typedef T_DjiCameraMediaFileAttr T_PsdkCameraMediaFileAttr; + +/** + * @brief Camera media file info. + */ +typedef T_DjiCameraMediaFileInfo T_PsdkCameraMediaFileInfo; + +/** + * @brief Camera optical zoom specifies. + */ +typedef T_DjiCameraOpticalZoomSpec T_PsdkCameraOpticalZoomSpec; + +/** + * @brief Camera tap zoom state. + */ +typedef T_DjiCameraTapZoomState T_PsdkCameraTapZoomState; + +/** + * @brief Camera common features handler. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef T_DjiCameraCommonHandler T_PsdkCameraCommonHandler; + +/** + * @brief Camera metering feature handler. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef T_DjiCameraExposureMeteringHandler T_PsdkCameraExposureMeteringHandler; + +/** + * @brief Camera focus feature handler. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef T_DjiCameraFocusHandler T_PsdkCameraFocusHandler; + +/** + * @brief Camera digital zoom feature handler. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef T_DjiCameraDigitalZoomHandler T_PsdkCameraDigitalZoomHandler; + +/** + * @brief Camera optical zoom feature handler. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef T_DjiCameraOpticalZoomHandler T_PsdkCameraOpticalZoomHandler; + +/** + * @brief Prototype of handler functions for media file download and playback. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + */ +typedef T_DjiCameraMediaDownloadPlaybackHandler T_PsdkCameraMediaDownloadPlaybackHandler; + +/** + * @brief Prototype of handler functions for tap zooming. + * @note User can not execute blocking style operations or functions in callback function, like PsdkXPort_RotateSync() + * function, because that will block PSDK root thread, causing problems such as slow system response, payload + * disconnection or infinite loop. + */ +typedef T_DjiCameraTapZoomHandler T_PsdkCameraTapZoomHandler; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialize the payload camera module. + * @note The interface is the total initialization interface of the camera module. The following interfaces are optional + * functions and can be freely selected according to the actual load device condition of the user. Before registering + * the optional interface, the interface must be initialized before the system can work normally. Interface initialization + * needs to be after PsdkCore_Init. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_Init(void); + +/** + * @brief Register the handler for payload camera common function interfaces. + * @note This interface registers the camera's basic function interface, including camera camera, video, mode settings, + * SD card operation, camera status interface. Registration of this interface needs to be after PsdkPayloadCamera_Init. + * @param cameraCommonHandler: pointer to the handler for payload camera common functions. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_RegCommonHandler(const T_PsdkCameraCommonHandler *cameraCommonHandler); + +/** + * @brief Register the handler for payload camera exposure and metering function interfaces. + * @note This interface registers the spot metering and exposure interface of the camera. It currently includes + * setting and acquiring the metering mode and metering area. Special attention must be paid to the limitations + * of the interface parameters. Registration of this interface needs to be after PsdkPayloadCamera_Init. + * @param cameraExposureMeteringHandler: pointer to the handler for payload camera exposure and metering functions. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_RegExposureMeteringHandler(const T_PsdkCameraExposureMeteringHandler + *cameraExposureMeteringHandler); + +/** + * @brief Register the handler for payload camera focus function interfaces. + * @note This interface registers the camera's focus interface, which includes setting and acquiring the focus mode, + * focus area, and focus settings. Special attention must be paid to the interface parameters. Registration of + * this interface needs to be after PsdkPayloadCamera_Init. + * @param cameraFocusHandler: pointer to the handler for payload camera focus functions. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_RegFocusHandler(const T_PsdkCameraFocusHandler *cameraFocusHandler); + +/** + * @brief Register the handler for payload camera digital zoom function interfaces. + * @note This interface registers the camera's digital zoom interface, which includes setting and obtaining the digital + * zoom zoom factor. Registering the load on this interface requires digital zoom. Registration of this interface + * needs to be after PsdkPayloadCamera_Init. + * @param cameraDigitalZoomHandler: pointer to the handler for payload camera digital zoom functions. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_RegDigitalZoomHandler(const T_PsdkCameraDigitalZoomHandler + *cameraDigitalZoomHandler); + +/** + * @brief Register the handler for payload camera optical zoom function interfaces. + * @note This interface registers the camera's optical zoom interface, which includes setting and acquiring optical zoom + * parameters, and a continuous zoom interface. Registering the load on this interface requires support for optical + * zoom. Registration of this interface needs to be after PsdkPayloadCamera_Init. + * @param cameraOpticalZoomHandler: pointer to the handler for payload camera optical zoom functions. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_RegOpticalZoomHandler(const T_PsdkCameraOpticalZoomHandler + *cameraOpticalZoomHandler); + +/** + * @brief Register handler functions for tap zoom function. + * @details Registration specifies PSDK application support tap zoom function. + * @param cameraTapZoomHandler: pointer to structure of handler functions for tap zoom function. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_RegTapZoomHandler(const T_PsdkCameraTapZoomHandler *cameraTapZoomHandler); + +/** + * @brief Set the type of camera video stream. + * @note The interface is used to set the camera video stream type. Must ensure the format of video stream conforms to + * the specified type in E_PsdkCameraVideoStreamType, please refer to developer documentation for more details. + * @attention Set video stream type must before calling PsdkCore_ApplicationStart function, when calling this interface + * the thread will be blocked, and the maximum blocking time is 10s. If this interface is not called, the default video + * stream type ::PSDK_CAMERA_VIDEO_STREAM_TYPE_H264_CUSTOM_FORMAT will be used. + * @param videoStreamType: camera video stream type. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_SetVideoStreamType(E_PsdkCameraVideoStreamType videoStreamType); + +/** + * @brief Get the network remote address for sending camera video stream. + * @note The interface is used to get the network remote address for sending camera video stream. You can get this info for another + * heterogeneous system to do somethings. This interface should be used after calling PsdkCore_Init function. + * @attention If you want use this interface, should call PsdkPlatform_RegHalNetworkHandler interface firstly, otherwise + * this interface will not work. + * @param ipAddr: the remote ip address for sending camera video stream. + * @param port: the remote port for sending camera video stream. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_GetVideoStreamRemoteAddress(char *ipAddr, uint16_t *port); + +/** + * @brief Register the handler for payload camera media download and playback function interfaces. + * @note Registering the camera playback and downloading related interfaces, mainly able to operate the media files of + * the user storage device online through the playback interface of the pilot. It can playback and download files + * of pictures and videos. Currently, only media files in MP4 and JPG formats are supported. + * @param cameraMediaHandler: pointer to the handler for payload camera media download and playback functions. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_RegMediaDownloadPlaybackHandler(const T_PsdkCameraMediaDownloadPlaybackHandler + *cameraMediaHandler); + +/** + * @brief Send the video to mobile end via video stream of the data channel. This function exists and can be used only in Linux. + * @note Must ensure actual bandwidth is less than bandwidth limitation of corresponding channel or stream, please + * refer to developer documentation and state of channel/stream for details related to bandwidth limitation. User can + * get state of "videoStream" channel via PsdkPayloadCamera_GetVideoStreamState() function. If actual bandwidth + * exceeds the limitation or busy state is set, the user should stop transmitting data or decrease amount of data to be + * sent. Otherwise, data may be discarded. + * @param data: pointer to data to be sent. + * @param len: length of data to be sent via data stream, and it must be less than or equal to 65000, unit: byte. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_SendVideoStream(const uint8_t *data, uint16_t len); + +/** + * @brief Get data transmission state of "videoStream" channel. User can use the state as base for controlling data + * transmission of video stream. This function exists and can be used only in Linux operation system. + * @param state: pointer to "videoStream" channel state. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_GetVideoStreamState(T_PsdkDataChannelState *state); + +/** + * @brief Push added media file information to aircraft system. + * @details After photography or recording video, users must push information of created media file immediately using + * this interface. + * @param filePath: pointer to path of added media file. Guaranteed to end with '\0'. Length of path have to be less + * than ::PSDK_FILE_PATH_SIZE_MAX bytes. + * @param mediaFileInfo: information of added media file. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCamera_PushAddedMediaFileInfo(const char *filePath, + T_PsdkCameraMediaFileInfo mediaFileInfo); + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_PAYLOAD_CAMERA_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_payload_collaboration.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_payload_collaboration.h new file mode 100644 index 0000000..1838ca9 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_payload_collaboration.h @@ -0,0 +1,116 @@ +/** + ******************************************************************** + * @file psdk_payload_collaboration.h + * @brief This is the header file for "psdk_payload_collaboration.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_PAYLOAD_COLLABORATION_H +#define PSDK_PAYLOAD_COLLABORATION_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "legacy_psdk2.x/psdk_payload_camera.h" +#include "legacy_psdk2.x/psdk_aircraft_info.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Camera type. + */ +typedef E_DjiCameraType E_PsdkPayloadCollaborationCameraType; +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_UNKNOWN DJI_CAMERA_TYPE_UNKNOWN /*!< Camera type is unknown. */ +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_XT DJI_CAMERA_TYPE_XT /*!< Camera type is XT. */ +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_X4S DJI_CAMERA_TYPE_X4S /*!< Camera type is X4S. */ +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_X5S DJI_CAMERA_TYPE_X5S /*!< Camera type is X5S. */ +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_X7 DJI_CAMERA_TYPE_X7 /*!< Camera type is X7. */ +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_Z30 DJI_CAMERA_TYPE_Z30 /*!< Camera type is Z30. */ +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_XT2 DJI_CAMERA_TYPE_XT2/*!< Camera type is XT2. */ +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_PSDK DJI_CAMERA_TYPE_PSDK /*!< Camera type is third party camera based on Payload SDK. */ +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_XTS DJI_CAMERA_TYPE_XTS /*!< Camera type is XT S. */ +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_H20 DJI_CAMERA_TYPE_H20 /*!< Camera type is H20. */ +#define PSDK_PAYLOAD_COLLABORATION_CAMERA_TYPE_H20T DJI_CAMERA_TYPE_H20T /*!< Camera type is H20T. */ + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise payload collaboration module. User should call this function before using this module. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCollaboration_Init(void); + +/** + * @brief Deinitialise payload collaboration module. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCollaboration_DeInit(void); + +/** + * @brief Get camera type of other payloads mounted on aircraft. + * @note Please refer to PSDK documentation in DJI SDK developer website for details of conditions of use. + * @note If there is empty in requested position or payload do not have camera type, the interface will return error. + * @param payloadPosition: position where payload mounted on. + * @param cameraType: Pointer to camera type of payload. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPayloadCollaboration_GetCameraTypeOfPayload( + E_PsdkAircraftInfoPayloadMountPosition payloadPosition, + E_PsdkPayloadCollaborationCameraType *cameraType); + +/** + * @brief Get optical zoom specification of other camera payloads mounted on aircraft. + * @note Please refer to PSDK documentation in DJI SDK developer website for details of conditions of use. + * @note If there is empty in requested position or payload do not have related information, the interface will return + * error. + * @param payloadPosition: position where payload mounted on. + * @param opticalZoomSpec: pointer to optical zoom specification. + * @return Execution result. + */ +T_PsdkReturnCode +PsdkPayloadCollaboration_GetCameraOpticalZoomSpecOfPayload(E_PsdkAircraftInfoPayloadMountPosition payloadPosition, + T_PsdkCameraOpticalZoomSpec *opticalZoomSpec); + +/** + * @brief Get hybrid zoom focal length of other camera payloads mounted on aircraft. + * @note Please refer to PSDK documentation in DJI SDK developer website for details of conditions of use. + * @note If there is empty in requested position or payload do not have related information, the interface will return + * error. + * @param payloadPosition: position where payload mounted on. + * @param focalLength: Pointer to optical focal length, unit: 0.1mm. + * @return Execution result. + */ +T_PsdkReturnCode +PsdkPayloadCollaboration_GetCameraHybridZoomFocalLengthOfPayload(E_PsdkAircraftInfoPayloadMountPosition payloadPosition, + uint16_t *focalLength); + +#ifdef __cplusplus +} +#endif + +#endif // `PSDK_PAYLOAD_COLLABORATION`_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_platform.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_platform.h new file mode 100644 index 0000000..57f9c13 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_platform.h @@ -0,0 +1,216 @@ +/** + ******************************************************************** + * @file psdk_platform.h + * @brief This is the header file for define PSDK platform interfaces. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_PLATFORM_H +#define PSDK_PLATFORM_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "dji_platform.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +/** +* @brief Platform handle of thread task operation. +*/ +typedef T_DjiTaskHandle T_PsdkTaskHandle; +/** +* @brief Platform handle of mutex operation. +*/ +typedef T_DjiMutexHandle T_PsdkMutexHandle; +/** +* @brief Platform handle of semaphore operation. +*/ +typedef T_DjiSemaHandle T_PsdkSemHandle; + +/* Exported types ------------------------------------------------------------*/ +typedef T_DjiHalUartHandler T_PsdkHalUartHandler; + +typedef T_DjiHalNetworkHandler T_PsdkHalNetWorkHandler; + +typedef T_DjiOsalHandler T_PsdkOsalHandler; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Register the handler for hal uart interfaces by your platform. + * @note It should be noted that the interface in hal is written and tested well. Users need to implement all the + * interfaces. Otherwise, the user interface cannot be successfully registered, and then the user interface is registered + * through the interface. If the registration fails, it needs to be based on the return code. To judge the problem. Make + * sure that the feature is available after a successful registration. The interface needs to be called at the beginning of + * the application for registration, otherwise, the subsequent functions will not work properly. + * @param halUartHandler: pointer to the handler for hal uart interfaces by your platform. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPlatform_RegHalUartHandler(const T_PsdkHalUartHandler *halUartHandler); + +/** + * @brief Register the handler for osal interfaces by your platform. + * @note It should be noted that the interface in osal is written and tested well. Users need to implement all the + * interfaces. Otherwise, the user interface cannot be successfully registered, and then the user interface is registered + * through the interface. If the registration fails, it needs to be based on the return code. To judge the problem. Make + * sure that the feature is available after a successful registration. The interface needs to be called at the beginning of + * the application for registration, otherwise, the subsequent functions will not work properly. + * @param osalHandler: pointer to the handler for osal interfaces by your platform. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPlatform_RegOsalHandler(const T_PsdkOsalHandler *osalHandler); + +/** + * @brief Register the handler for hal network interfaces by your platform. + * @note It should be noted that the interface in hal is written and tested well. Users need to implement all the + * interfaces. Otherwise, the user interface cannot be successfully registered, and then the user interface is registered + * through the interface. If the registration fails, it needs to be based on the return code. To judge the problem. Make + * sure that the feature is available after a successful registration. + * @attention The interface needs to be called at the beginning of the application for registration, otherwise, the + * subsequent functions will not work properly. + * @param osalHandler: pointer to the handler for network handler interfaces by your platform. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPlatform_RegHalNetworkHandler(const T_PsdkHalNetWorkHandler *halNetWorkHandler); + +/** + * @brief Declare the task container, initialize the task, and create task ID. + * @param task: pointer to the created task ID. + * @param taskFunc: pointer to the created task function. + * @param name: pointer to task name string, end with '\0'. If user do not specify name for task, fill in NULL. + * @param stackSize: value of task stack size, unit: byte. + * @param arg: pointer to the user defined data. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_TaskCreate(T_PsdkTaskHandle *task, void *(*taskFunc)(void *), const char *name, + uint32_t stackSize, void *arg); + +/** + * @brief Destroy the created task. + * @param task: pointer to the created task ID. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_TaskDestroy(T_PsdkTaskHandle task); + +/** + * @brief Let task into a sleep state in a set time, uint:ms. + * @param timeMs: value of time ms for task sleeping. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_TaskSleepMs(uint32_t timeMs); + +/** + * @brief Declare the mutex container, initialize the mutex, and create mutex ID. + * @param mutex: pointer to the created mutex ID. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_MutexCreate(T_PsdkMutexHandle *mutex); + +/** + * @brief Destroy the created mutex. + * @param mutex: pointer to the created mutex ID. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_MutexDestroy(T_PsdkMutexHandle mutex); + +/** + * @brief Acquire and lock the mutex when peripheral access is required. + * @param mutex: pointer to the created mutex ID. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_MutexLock(T_PsdkMutexHandle mutex); + +/** + * @brief Unlock and release the mutex when done with the peripheral access. + * @param mutex: pointer to the created mutex ID. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_MutexUnlock(T_PsdkMutexHandle mutex); + +/** + * @brief Declare the semaphore container, initialize the semaphore, and create semaphore ID. + * @param semaphore: pointer to the created semaphore ID. + * @param initValue: init value of semaphore for the created semaphore. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_SemaphoreCreate(T_PsdkSemHandle *semaphore, uint32_t initValue); + +/** + * @brief Destroy the created semaphore. + * @param semaphore: pointer to the created semaphore ID. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_SemaphoreDestroy(T_PsdkSemHandle semaphore); + +/** + * @brief Wait the created semaphore forever. + * @param semaphore: pointer to the created semaphore ID. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_SemaphoreWait(T_PsdkSemHandle semaphore); + +/** + * @brief Wait the created semaphore and set the value of timeout. + * @param semaphore: pointer to the created semaphore ID. + * @param waitTimeMs: value of timeout for waiting created semaphore. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_SemaphoreTimedWait(T_PsdkSemHandle semaphore, uint32_t waitTimeMs); + +/** + * @brief Post the created semaphore. + * @param semaphore: pointer to the created semaphore ID. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_SemaphorePost(T_PsdkSemHandle semaphore); + +/** + * @brief Get the system millisecond time, uint:ms. + * @param ms: pointer to the got time ms. + * @return Execution result. + */ +T_PsdkReturnCode PsdkOsal_GetTimeMs(uint32_t *ms); + +/** + * @brief Allocate size bytes of memory. + * @note Users need to apply for memory according to the actual situation of the platform and application. If you do not + * use the memory after applying for it, please call #PsdkOsal_Free to release the memory. + * @param size: uint32_t size that needs allocate. + * @return a void pointer to the allocated memory, if equal to NULL, please do related processing to avoid null pointer crash. + */ +void *PsdkOsal_Malloc(uint32_t size); + +/** + * @brief Release allocated memory. + * @note After calling the #PsdkOsal_Malloc interface, if you do not use memory, please remember to use this interface + * to release the memory. + * @param ptr: pointer to the need allocated memory. + */ +void PsdkOsal_Free(void *ptr); + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_PLATFORM_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_positioning.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_positioning.h new file mode 100644 index 0000000..09aa366 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_positioning.h @@ -0,0 +1,113 @@ +/** + ******************************************************************** + * @file psdk_positioning.h + * @brief This is the header file for "psdk_positioning.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_POSITIONING_H +#define PSDK_POSITIONING_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "legacy_psdk2.x/psdk_time_sync.h" +#include "dji_positioning.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Data structure that describes a positioning event. + */ +typedef T_DjiPositioningEventInfo T_PsdkPositioningEventInfo; + +/** + * @brief Data structure that describes position of a point. + */ +typedef T_DjiPositioningPosition T_PsdkPositioningPosition; + +/** + * @brief Position value standard deviation. + */ +typedef T_DjiPositioningPositionStandardDeviation T_PsdkPositioningPositionStandardDeviation; + +/** + * @brief Position of target point and other details returned by interface of requesting position. + */ +typedef T_DjiPositioningPositionInfo T_PsdkPositioningPositionInfo; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise positioning module in blocking mode. User should call this function before all other positioning + * operations, just like setting task index, register callback function and requesting positions. + * @note Max execution time of this function is slightly larger than 500ms. + * @note This function has to be called in user task, rather than main() function, and after scheduler being started. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPositioning_Init(void); + +/** + * @brief Set task index, specifying a sequence number of operations, using to write to mark the file for some post-process + * flows. + * @details One operation may be a precise surveying and mapping task or ten exposures of camera. The default task index + * is 0. + * @param index: task index. + */ +void PsdkPositioning_SetTaskIndex(uint8_t index); + +/** + * @brief The interface is used to get the position of target points and other information (refer to + * ::T_PsdkPositioningPositionInfo) based on the timestamp in aircraft time system when some events (positioning events) are + * triggered. The function uses blocking mode. + * @details Users can request positions for multiple events (event set) conveniently, such as sync exposure of + * multiple cameras. User must register callback function used to get the newest PPS triggered timestamp (refer to + * PsdkPositioning_RegGetNewestPpsTriggerTimeCallback()) before requesting position. When users have set structure + * parameters of payload and interest points (the points whose position user hope to get, e.g. center point of the camera + * image sensor), the target points are interest points, otherwise the target points are main gimbal interface center. + * Users can use position information of gimbal interface center, position offset between gimbal interface center and + * RTK main antenna, UAV attitude, gimbal structure parameters ,and gimbal attitude to calculate the position of interest + * points in the payload. + * @note Max execution time of this function is slightly larger than 600ms. + * @note All requested timestamp have to be between the time point 2 seconds earlier than the newest synchronized + * timestamp and the time point 1 seconds earlier than the newest synchronized timestamp. + * @param eventCount: count of positioning event set specified by eventInfo parameter. Please ensure the count is less + * than 5. + * @param eventInfo: pointer to positioning event information array. + * @param positionInfo: the position of target points. In Matrice 210 RTK V2 and Matrice 300 RTK aircraft system, it is + * the position of the main gimbal interface always. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPositioning_GetPositionInformationSync(uint8_t eventCount, T_PsdkPositioningEventInfo *eventInfo, + T_PsdkPositioningPositionInfo *positionInfo); + +#ifdef __cplusplus +} +#endif + +#endif //PSDK_POSITIONING_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_power_management.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_power_management.h new file mode 100644 index 0000000..57a08d3 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_power_management.h @@ -0,0 +1,105 @@ +/** + ******************************************************************** + * @file psdk_power_management.h + * @brief This is the header file for "psdk_power_management.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_POWER_MANAGEMENT_H +#define PSDK_POWER_MANAGEMENT_H + +/* Includes ------------------------------------------------------------------*/ +#include +#include +#include "dji_power_management.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/** + * @brief Pin state. + */ +typedef E_DjiPowerManagementPinState E_PsdkPowerManagementPinState; +#define PSDK_POWER_MANAGEMENT_PIN_STATE_RESET DJI_POWER_MANAGEMENT_PIN_STATE_RESET /*!< Specifies pin is in low level state. */ +#define PSDK_POWER_MANAGEMENT_PIN_STATE_SET DJI_POWER_MANAGEMENT_PIN_STATE_SET /*!< Specifies pin is in high level state. */ + +/** + * @brief Prototype of callback function used to set level of high power application pin. + * @param pinState: level state of pin to be set. + * @return Execution result. + */ +typedef DjiWriteHighPowerApplyPinCallback WriteHighPowerApplyPinCallback; + +/** + * @brief Prototype of callback function used to notify payload that the aircraft will power off soon and get state + * whether the payload is ready to power off or not. + * @warning User can not execute blocking style operations or functions in a callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param powerOffPreparationFlag: pointer to memory space used to store power off preparation flag. True represents + * that payload has completed all work and is ready to power off. False represents that payload is not ready to power + * off. + * @return Execution result. + */ +typedef DjiPowerOffNotificationCallback PowerOffNotificationCallback; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Apply high power from aircraft in blocking mode. + * @details Before applying, user should register callback function used to set level state of high power application + * pin using PsdkPowerManagement_RegWriteHighPowerApplyPinCallback() function. After applying high power, power pin of + * PSDK adapter will output high power based predetermined specification. + * @note Max execution time of this function is slightly larger than 600ms. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPowerManagement_ApplyHighPowerSync(void); + +/** + * @brief Register callback function used to set level state of high power application pin. Must be called before + * applying high power. + * @param callback: pointer to the callback function. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPowerManagement_RegWriteHighPowerApplyPinCallback(WriteHighPowerApplyPinCallback callback); + +/** + * @brief Register callback function used to notify payload that the aircraft will power off soon and get state + * whether the payload is ready to power off or not. + * @details After registering, the callback function will be called at a fixed frequency when aircraft will power off. + * User fill in the power off preparation flag, and once the payload is ready to power off, the callback function will not + * be called. After a specified time, if the payload is not ready to power off, the aircraft will power off immediately. The + * specified time is 10s. + * @param callback: pointer to callback function used to notify aircraft power off message and get payload power off + * preparation flag. + * @return Execution result. + */ +T_PsdkReturnCode PsdkPowerManagement_RegPowerOffNotificationCallback(PowerOffNotificationCallback callback); + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_POWER_MANAGEMENT_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_product_info.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_product_info.h new file mode 100644 index 0000000..8710e8b --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_product_info.h @@ -0,0 +1,63 @@ +/** + ******************************************************************** + * @file psdk_product_info.h + * @brief This is the header file for "psdk_product_info.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_PRODUCT_INFO_H +#define PSDK_PRODUCT_INFO_H + +/* Includes ------------------------------------------------------------------*/ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ + + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Set an alias that satisfies the condition for PSDK application or product. + * @details Alias will display in DJI Pilot, if exist. + * @note Still need to pass in correct PSDK APP name that is obtained from DJI SDK developer website to PsdkCore_Init() + * interface. The PSDK APP name will be used to bind or verification. + * @note Alias will be effective after a while, and the max value is 1s. + * @param productAlias: pointer to product alias string, and alias end with '\0'. The max length of the string is 31. If + * length of alias string is greater than 31, alias string will be truncated and passed in. + * @return Execution result. + */ +T_PsdkReturnCode PsdkProductInfo_SetAlias(const char *productAlias); + +#ifdef __cplusplus +} +#endif + +#endif //PSDK_PRODUCT_INFO_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_time_sync.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_time_sync.h new file mode 100644 index 0000000..9525d44 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_time_sync.h @@ -0,0 +1,92 @@ +/** + ******************************************************************** + * @file psdk_time_sync.h + * @brief This is the header file for "psdk_time_synchronization.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_TIME_SYNC_H +#define PSDK_TIME_SYNC_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "dji_time_sync.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Prototype of callback function used to get the newest PPS triggered timestamp. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param localTimeUs: pointer to memory space used to store PPS triggered timestamp. + * @return Execution result. + */ +typedef DjiGetNewestPpsTriggerLocalTimeUsCallback GetNewestPpsTriggerLocalTimeUsCallback; + +/** + * @brief Data structure of time in aircraft time system. + */ +typedef T_DjiTimeSyncAircraftTime T_PsdkTimeSyncAircraftTime; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise time synchronization module in blocking mode. User should call this function before all other time + * synchronization operations, just like transferring time. + * @note Max execution time of this function is slightly larger than 2000ms. + * @note This function have to be called in user task, rather than main() function, and after scheduler being started. + * @return Execution result. + */ +T_PsdkReturnCode PsdkTimeSync_Init(void); + +/** + * @brief Register callback function used to get the newest timestamp in local time system when PPS rising edge signal + * is detected. + * @details PSDK uses the timestamp information to synchronise time of local time system and RTK navigation and + * positioning system. + * @param callback: pointer to the callback function. + * @return Execution result. + */ +T_PsdkReturnCode PsdkTimeSync_RegGetNewestPpsTriggerTimeCallback(GetNewestPpsTriggerLocalTimeUsCallback callback); + +/** + * @brief Transfer local time to time in aircraft time system. + * @note Before calling the interface, users must call PsdkTimeSync_RegGetNewestPpsTriggerTimeCallback() to register + * callback function used to report the latest triggered time of PPS signal. + * @param localTimeUs: local time, unit: microsecond. + * @param aircraftTime: pointer to memory space used to store time in aircraft time system. + * @return Execution result. + */ +T_PsdkReturnCode PsdkTimeSync_TransferToAircraftTime(uint64_t localTimeUs, T_PsdkTimeSyncAircraftTime *aircraftTime); + +#ifdef __cplusplus +} +#endif + +#endif //PSDK_TIME_SYNC_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_typedef.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_typedef.h new file mode 100644 index 0000000..f4de1e6 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_typedef.h @@ -0,0 +1,88 @@ +/** + ******************************************************************** + * @file psdk_typedef.h + * @brief PSDK type define file. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_TYPEDEF_H +#define PSDK_TYPEDEF_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_error.h" +#include "dji_typedef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +#define PI DJI_PI +#define PSDK_FILE_NAME_SIZE_MAX DJI_FILE_NAME_SIZE_MAX +#define PSDK_FILE_PATH_SIZE_MAX DJI_FILE_PATH_SIZE_MAX +#define PSDK_IP_ADDR_STR_SIZE_MAX DJI_IP_ADDR_STR_SIZE_MAX +#define PSDK_MD5_BUFFER_LEN DJI_MD5_BUFFER_LEN + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Type define double as psdk_f64_t. + */ +typedef dji_f64_t psdk_f64_t; +/** + * @brief Type define float as psdk_f32_t. + */ +typedef dji_f32_t psdk_f32_t; +/** + * @brief Type define uint64 as T_PsdkReturnCode. + * @details The type can be any value of ::PsdkErrorCode. + */ +typedef T_DjiReturnCode T_PsdkReturnCode; + +#pragma pack (1) + +typedef T_DjiVector3d T_PsdkVector3d; + +typedef T_DjiVector3f T_PsdkVector3f; + +typedef T_DjiAttitude3d T_PsdkAttitude3d; + +typedef T_DjiAttitude3f T_PsdkAttitude3f; + +typedef T_DjiQuaternion4f T_PsdkQuaternion4f; + +typedef T_DjiDataChannelState T_PsdkDataChannelState; + +#pragma pack () + +/* define compiler specific symbols */ +#if defined (__ICCARM__) +#elif defined (__CC_ARM) +#pragma anon_unions +#elif defined (__GNUC__) +#elif defined (__TASKING__) +#endif + +#ifdef __cplusplus +} +#endif + +#endif //PSDK_TYPEDEF_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_upgrade.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_upgrade.h new file mode 100644 index 0000000..0e25217 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_upgrade.h @@ -0,0 +1,140 @@ +/** + ******************************************************************** + * @file psdk_upgrade.h + * @brief This is the header file for "psdk_upgrade.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_UPGRADE_H +#define PSDK_UPGRADE_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +typedef E_DjiFirmwareTransferType E_PsdkPayloadFirmwareTransferType; +/*! + * @brief FTP firmware transfer type. + * @note This transfer type only support linux platform and use network port. Users need to deploy FTP service on + * payload. The ftp user info used to transfer upgrade firmware is : + * username:psdk_payload_ftp + * password:DJi_#$31 + * You can get guide about FTP service deployment on https://developer.dji.com/payload-sdk/documentation + */ +#define PSDK_PAYLOAD_FIRMWARE_TRANSFER_TYPE_FTP DJI_FIRMWARE_TRANSFER_TYPE_FTP +/*! + * @brief DCFTP firmware transfer type. + * @details DCFTP (DJI Common File Transfer Protocol) is a private protocol used to transfer file on DJI Product. + * Users can get file data by command callbacks, see :: T_PsdkUpgradeDcftpFileTransferOpt. + * @note This transfer type is used to support RTOS platform or payload don't have network port. The transfer speed + * is very slow compare to FTP because it uses low speed transfer channel. + */ +#define PSDK_PAYLOAD_FIRMWARE_TRANSFER_TYPE_DCFTP DJI_FIRMWARE_TRANSFER_TYPE_DCFTP + +typedef E_DjiUpgradeStage E_PsdkUpgradeStage; +#define PSDK_UPGRADE_STAGE_IDLE DJI_UPGRADE_STAGE_IDLE /*!< Idle stage means not in upgrade mode. */ +#define PSDK_UPGRADE_STAGE_ONGOING DJI_UPGRADE_STAGE_ONGOING /*!< Ongoing stage means payload is upgrading. */ +#define PSDK_UPGRADE_STAGE_DEVICE_REBOOT DJI_UPGRADE_STAGE_DEVICE_REBOOT /*!< Device reboot stage means device is rebooting. */ +#define PSDK_UPGRADE_STAGE_END DJI_UPGRADE_STAGE_END /*!< End Stage means upgrade finish and reporting upgrade result to the terminal APP. */ + +typedef E_DjiUpgradeEndState E_PsdkUpgradeEndState; +#define PSDK_UPGRADE_END_STATE_SUCCESS DJI_UPGRADE_END_STATE_SUCCESS /*!< Upgrade success. */ +#define PSDK_UPGRADE_END_STATE_UNKNOWN_ERROR DJI_UPGRADE_END_STATE_UNKNOWN_ERROR /*!< Upgrade failure due to unknown reason. */ + +/** + * @brief The firmware version of payload. + * @note If majorVersion = AA, minorVersion = BB, modifyVersion = CC, debugVersion = DD, The version show in + * terminal APP is AA.BB.CC.DD + */ +typedef T_DjiFirmwareVersion T_PsdkPayloadFirmwareVersion; + +typedef T_DjiUpgradeOngoingInfo T_PsdkUpgradeOngoingInfo; + +typedef T_DjiUpgradeRebootInfo T_PsdkUpgradeRebootInfo; + +typedef T_DjiUpgradeEndInfo T_PsdkUpgradeEndInfo; + +typedef T_DjiUpgradeFtpFileTransferInfo T_PsdkUpgradeFtpFileTransferInfo; + +typedef T_DjiUpgradeFileInfo T_PsdkUpgradeFileInfo; + +typedef T_DjiUpgradeDcftpFileTransferOpt T_PsdkUpgradeDcftpFileTransferOpt; + +typedef T_DjiFirmwareTransferInfo T_PsdkPayloadFirmwareTransferInfo; + +typedef T_DjiUpgradeState T_PsdkUpgradeState; + +typedef T_DjiUpgradeConfig T_PsdkUpgradeConfig; + +typedef T_DjiUpgradeHandler T_PsdkUpgradeHandler; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise upgrade module, and user should call this function before using upgrade features. + * @param upgradeConfig: upgrade init configuration. + * @return Execution result. + */ +T_PsdkReturnCode PsdkUpgrade_Init(const T_PsdkUpgradeConfig *upgradeConfig); + +/** + * @brief Enable local upgrade mode. + * @details After enable local upgrade mode, DJI Assistant 2 will display payload upgrade interface. Users can choose + * firmware file to upgrade payload. + * @return Execution result. + */ +T_PsdkReturnCode PsdkUpgrade_EnableLocalUpgrade(void); + +/** + * @brief Register the handler for upgrade process. + * @param upgradeHandler: pointer to structure of handler functions for upgrade process. + * @return Execution result. + */ +T_PsdkReturnCode PsdkUpgrade_RegHandler(const T_PsdkUpgradeHandler *upgradeHandler); + +/** + * @brief Push upgrade state to terminal app. + * @param upgradeState: upgrade state in upgrade process. + * @note When start upgrade, you need push upgrade state until finish upgrade. The upgrade state push logic is : + * 1. StartUpgrade callback called; + * 2. The upgrade stage change to :: PSDK_UPGRADE_STAGE_ONGOING. Push upgrade state upgradeOngoingInfo when upgradeOngoingInfo changed; + * 3. After upgrade ongoing, change upgrade stage to PSDK_UPGRADE_STAGE_DEVICE_REBOOT and push upgrade state upgradeRebootInfo; + * 4. Device reboot; + * 4. After device reboot, change upgrade stage to PSDK_UPGRADE_STAGE_END and continuous push upgrade state upgradeEndInfo (recommended 1Hz); + * 5. FinishUpgrade Callback called, stop push upgrade state. The upgrade process finished. + * @return Execution result. + */ +T_PsdkReturnCode PsdkUpgrade_PushUpgradeState(const T_PsdkUpgradeState *upgradeState); + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_UPGRADE_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_version.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_version.h new file mode 100644 index 0000000..6b7e8a2 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_version.h @@ -0,0 +1,54 @@ +/** + ******************************************************************** + * @file psdk_version.h + * @brief This is the header file for "psdk_version.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_VERSION_H +#define PSDK_VERSION_H + +/* Includes ------------------------------------------------------------------*/ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +#define PSDK_VERSION_MAJOR DJI_VERSION_MAJOR /*!< Payload SDK major version num, when have incompatible API changes. Range from 0 to 99. */ +#define PSDK_VERSION_MINOR DJI_VERSION_MINOR /*!< Payload SDK minor version num, when add functionality in a backwards compatible manner changes. Range from 0 to 99. */ +#define PSDK_VERSION_MODIFY DJI_VERSION_MODIFY /*!< Payload SDK modify version num, when have backwards compatible bug fixes changes. Range from 0 to 99. */ +#define PSDK_VERSION_BETA DJI_VERSION_BETA /*!< Payload SDK version beta info, release version will be 0, when beta version release changes. Range from 0 to 255. */ +#define PSDK_VERSION_BUILD DJI_VERSION_BUILD /*!< Payload SDK version build info, when jenkins trigger build changes. Range from 0 to 65535. */ + +/* Exported types ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_VERSION_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_widget.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_widget.h new file mode 100644 index 0000000..63888fc --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_widget.h @@ -0,0 +1,171 @@ +/** + ******************************************************************** + * @file psdk_widget.h + * @brief This is the header file for "psdk_widget.c", defining the structure and + * (exported) function prototypes. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_WIDGET_H +#define PSDK_WIDGET_H + +/* Includes ------------------------------------------------------------------*/ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ +/*! The maximum length of a message that can be displayed by the mobile app floating window */ +#define PSDK_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief Widget types. + */ +typedef E_DjiWidgetType E_PsdkWidgetType; +#define PSDK_WIDGET_TYPE_BUTTON DJI_WIDGET_TYPE_BUTTON /*!< button widget type */ +#define PSDK_WIDGET_TYPE_SWITCH DJI_WIDGET_TYPE_SWITCH /*!< switch widget type */ +#define PSDK_WIDGET_TYPE_SCALE DJI_WIDGET_TYPE_SCALE /*!< scale widget type */ +#define PSDK_WIDGET_TYPE_LIST DJI_WIDGET_TYPE_LIST /*!< list widget type */ +#define PSDK_WIDGET_TYPE_INT_INPUT_BOX DJI_WIDGET_TYPE_INT_INPUT_BOX /*!< integer input box widget type */ + +/** + * @brief Button widget state. + */ +typedef E_DjiWidgetButtonState E_PsdkWidgetButtonState; +#define PSDK_WIDGET_BUTTON_STATE_PRESS_DOWN DJI_WIDGET_BUTTON_STATE_PRESS_DOWN /*!< Button is pressed down */ +#define PSDK_WIDGET_BUTTON_STATE_RELEASE_UP DJI_WIDGET_BUTTON_STATE_RELEASE_UP /*!< Button is released up */ + +/** + * @brief Switch widget state. + */ +typedef E_DjiWidgetSwitchState E_PsdkWidgetSwitchState; +#define PSDK_WIDGET_SWITCH_STATE_OFF DJI_WIDGET_SWITCH_STATE_OFF /*!< Switch is turned off */ +#define PSDK_WIDGET_SWITCH_STATE_ON DJI_WIDGET_SWITCH_STATE_ON /*!< Switch is turned on */ + +/** + * @brief Widget file binary array. + */ +typedef T_DjiWidgetFileBinaryArray T_PsdkWidgetFileBinaryArray; + +/** + * @brief Widget binary array config. + */ +typedef T_DjiWidgetBinaryArrayConfig T_PsdkWidgetBinaryArrayConfig; + +/** + * @brief Widget handler item. + */ +typedef T_DjiWidgetHandlerListItem T_PsdkWidgetHandlerListItem; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise widget module, and user should call this function before using widget features. + * @return Execution result. + */ +T_PsdkReturnCode PsdkWidget_Init(void); + +/** + * @brief Register default widget UI configuration file directory path. + * @note Under Linux system, there are two functions to set the custom widget configuration directory path, function + * PsdkWidget_RegDefaultConfigByDirPath and PsdkWidget_RegUiConfigByDirPath. When you don't need multi-language + * and multi-screen size support, you can just use PsdkWidget_RegDefaultUiConfigByDirPath function set widget UI + * Config directory path. If you need support multi-language and multi-screen size support, you can use function + * PsdkWidget_RegUiConfigByDirPath to specify widget configuration. When the language and screen size is not + * cover in your setting by PsdkWidget_RegUiConfigByDirPath, the widget UI configuration uses setting by + * PsdkWiget_RegDefaultUiConfigByDirPath function. + * @param widgetConfigDirPath: the widget UI configuration directory path. + * @return Execution result. + */ +T_PsdkReturnCode PsdkWidget_RegDefaultUiConfigByDirPath(const char *widgetConfigDirPath); + +/** + * @brief Register widget UI configuration file directory path. + * @note Different widget UI configurations for several language and screen size require the same widget type, index and + * count. + * @param appLanguage: mobile app language type. + * @param appScreenType: mobile app screen type. + * @param widgetConfigDirPath: the widget UI configuration directory path. + * @return Execution result. + */ +T_PsdkReturnCode PsdkWidget_RegUiConfigByDirPath(E_PsdkAircraftInfoMobileAppLanguage appLanguage, + E_PsdkAircraftInfoMobileAppScreenType appScreenType, + const char *widgetConfigDirPath); + +/** + * @brief Register default widget UI config by binary array configuration. + * @note In RTOS, most likely there is no file system. The widget config file content can use C array express. Use this + * function and PsdkWidget_RegDefaultUiConfigBinaryArray set widget UI configuration. When the language and screen size + * is not cover in your setting by PsdkWidget_RegUiConfigByBinaryArray, the widget UI configuration uses setting by this + * function. + * @param binaryArrayConfig: the binary array config for widget UI configuration. + * @return Execution result. + */ +T_PsdkReturnCode PsdkWidget_RegDefaultUiConfigByBinaryArray(const T_PsdkWidgetBinaryArrayConfig *binaryArrayConfig); + +/** + * @brief Register widget UI config by binary array configuration. + * @note Different widget UI configurations for several language and screen size require the same widget type, index and + * count. + * @param appLanguage: mobile app language type. + * @param screenType: mobile app screen type. + * @param binaryArrayConfig: the binary array config for widget UI configuration. + * @return Execution result. + */ +T_PsdkReturnCode PsdkWidget_RegUiConfigByBinaryArray(E_PsdkAircraftInfoMobileAppLanguage appLanguage, + E_PsdkAircraftInfoMobileAppScreenType screenType, + const T_PsdkWidgetBinaryArrayConfig *binaryArrayConfig); + +/** + * @brief Register handler list for widgets. + * @param widgetHandlerList: widget handler list for widgets. + * @param itemCount: the item count of widget handler list. + * @return Execution result. + */ +T_PsdkReturnCode PsdkWidget_RegHandlerList(const T_PsdkWidgetHandlerListItem *widgetHandlerList, uint32_t itemCount); + +/** + * @brief Send message to mobile app floating window. + * @note the message length can't more than PSDK_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN. The max data bandwidth of floating + * windows message is 2KB/s. + * @param str: pointer to message string. + * @return Execution result. + */ +T_PsdkReturnCode PsdkWidgetFloatingWindow_ShowMessage(const char *str); + +/** + * @brief Get data transmission state of floating window channel. User can use the state as base for controlling + * floating windows message send. + * @param state: pointer to floating window channel state. + * @return Execution result. + */ +T_PsdkReturnCode PsdkWidgetFloatingWindow_GetChannelState(T_PsdkDataChannelState *state); + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_WIDGET_H +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_xport.h b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_xport.h new file mode 100644 index 0000000..bb3d205 --- /dev/null +++ b/Source/M300/PSDK_Qt/psdk_lib/include/legacy_psdk2.x/psdk_xport.h @@ -0,0 +1,223 @@ +/** + ******************************************************************** + * @file psdk_xport.h + * @brief XPort module provides some interfaces used to control XPort and get states of XPort. The module can be used + * only when the PSDK adapter is XPort, rather than Skyport. + * + * @copyright (c) 2021 DJI. All rights reserved. + * + * All information contained herein is, and remains, the property of DJI. + * The intellectual and technical concepts contained herein are proprietary + * to DJI and may be covered by U.S. and foreign patents, patents in process, + * and protected by trade secret or copyright law. Dissemination of this + * information, including but not limited to data and other proprietary + * material(s) incorporated within the information, in any form, is strictly + * prohibited without the express written consent of DJI. + * + * If you receive this source code without DJI’s authorization, you may not + * further disseminate the information, and you must immediately remove the + * source code and notify DJI of its removal. DJI reserves the right to pursue + * legal actions against you for any loss(es) or damage(s) caused by your + * failure to do so. + * + ********************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef PSDK_XPORT_H +#define PSDK_XPORT_H + +/* Includes ------------------------------------------------------------------*/ +#include "legacy_psdk2.x/psdk_typedef.h" +#include "legacy_psdk2.x/psdk_gimbal.h" +#include "dji_xport.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported constants --------------------------------------------------------*/ + + +/* Exported types ------------------------------------------------------------*/ +/** + * @brief XPort limit angle category. + */ +typedef E_DjiXPortLimitAngleCategory E_PsdkXPortLimitAngleCategory; +/*!< Joint angle limit of roll axis. */ +#define PSDK_XPORT_LIMIT_ANGLE_CATEGORY_ROLL_JOINT_ANGLE DJI_XPORT_LIMIT_ANGLE_CATEGORY_ROLL_JOINT_ANGLE +/*!< Joint angle limit of pitch axis. */ +#define PSDK_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_JOINT_ANGLE DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_JOINT_ANGLE +/*!< Euler angle limit of pitch axis, just is limitation of angle in ground coordinate. */ +#define PSDK_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_EULER_ANGLE DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_EULER_ANGLE +/*!< Extended euler angle limit of pitch axis, just is limitation of angle in ground coordinate. Extended euler +angle limit is activated when enable extended pitch axis angle limit. */ +#define PSDK_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_EULER_ANGLE_EXTENSION DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_EULER_ANGLE_EXTENSION +/*!< Joint angle limit of yaw axis. */ +#define PSDK_XPORT_LIMIT_ANGLE_CATEGORY_YAW_JOINT_ANGLE DJI_XPORT_LIMIT_ANGLE_CATEGORY_YAW_JOINT_ANGLE + +/** + * @brief Limit angle data structure. + */ +typedef T_DjiXPortLimitAngle T_PsdkXPortLimitAngle; + +/** + * @brief Prototype of callback function used to receive system state of XPort. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param systemState: system state of XPort. + * @return Execution result. + */ +typedef DjiReceiveXPortSystemStateCallback ReceiveXPortSystemStateCallback; + +/** + * @brief Prototype of callback function used to receive attitude information of XPort. + * @warning User can not execute blocking style operations or functions in callback function, because that will block PSDK + * root thread, causing problems such as slow system response, payload disconnection or infinite loop. + * @param attitudeInformation: attitude information of XPort. + * @return Execution result. + */ +typedef DjiReceiveXPortAttitudeInformationCallback ReceiveXPortAttitudeInformationCallback; + +/* Exported functions --------------------------------------------------------*/ +/** + * @brief Initialise XPort module. + * @note The function have to be called before other functions related to XPort. + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_Init(void); + +/** + * @brief Deinitialize XPort module. + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_DeInit(void); + +/** + * @brief Register callback function used to receive system state of XPort. + * @note The callback function will be called after registering. The call frequency is 1Hz. + * @param callback: pointer to the callback function. + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_RegReceiveSystemStateCallback(ReceiveXPortSystemStateCallback callback); + +/** + * @brief Register callback function used to receive attitude information of XPort. + * @note The callback function will be called after registering. The call frequency is 10Hz. + * @param callback: pointer to the callback function. + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_RegReceiveAttitudeInformationCallback(ReceiveXPortAttitudeInformationCallback callback); + +/** + * @brief Set gimbal mode of XPort in blocking mode. + * @note Max execution time of this function is slightly larger than 600ms. + * @param mode: gimbal mode. + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_SetGimbalModeSync(E_PsdkGimbalMode mode); + +/** + * @brief Rotate gimbal of XPort in blocking mode. + * @note Max execution time of this function is slightly larger than 600ms. + * @note If rotation mode is ::PSDK_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE or ::PSDK_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, + * range of yaw value in rotation value argument is [-1800, 1800]. Gimbal can rotate to any angle of yaw axis by the + * range. Symbol of yaw value does not determine the rotation direction of the gimbal. + * @note Attitude that gimbal can reach is also determined by angle limitation and angle limitation buffer of the gimbal. + * When the gimbal is upward, angle limitation differs from limitation users set. For angle limitation and angle limitation + * buffer, please refer to PSDK documentation for details. If gimbal attitude is within range limitation buffer and + * control gimbal move towards limit direction still, or gimbal attitude is outside the angle limitation buffer but + * control gimbal to the range limitation buffer, the gimbal will return an error. For the former case, the gimbal will not + * move. In the latter case, the gimbal will try to move towards the direction of angle limit but it will stop at + * somewhere in angle limitation buffer. + * @note Rotation speed and rotation duration are also limited by the maximum speed of gimbal and maximum acceleration. The + * maximum acceleration is determined by the smooth factor of the gimbal controller set by APP. The maximum speed is determined + * by default maximum speed and maximum speed percentage set by APP, and the default maximum speed of XPort is + * 90degree/s. For the detailed relationship, please refer to SetControllerSmoothFactor() and + * SetControllerMaxSpeedPercentage() callback function prototype in psdk_gimbal.h file. + * @note Only pitch and yaw axis of XPort is controllable. + * @note XPort do not response rotation command in process of control parameters auto-tuning, coaxiality detection, + * balance detection and resetting. And these operations will interrupt rotation of XPort. + * @note Effective time of a speed control command is 500ms, that is, if XPort do not receive other control commands + * within 500ms after speed control, XPort will stop rotation. + * @param rotationMode: mode of rotation command. + * @param rotationProperty: property of rotation command. + * @param rotationValue: value of rotation command, unit: 0.1 degree (if rotation mode is + * ::PSDK_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE or ::PSDK_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE), 0.1 degree/s + * (if rotation mode is ::PSDK_GIMBAL_ROTATION_MODE_SPEED). + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_RotateSync(E_PsdkGimbalRotationMode rotationMode, + T_PsdkGimbalRotationProperty rotationProperty, T_PsdkAttitude3d rotationValue); + +/** + * @brief Release gimbal control permission out in blocking mode. + * @details When PSDK application control XPort gimbal, PSDK application will capture and gain control permission of + * gimbal if allowable. After PSDK application sending a sequence of the gimbal control command, PSDK application should + * call this interface to release control permission of gimbal, to allow other modules (like APP, flight + * controller) can control gimbal right now. For example, PSDK application can release control permission after tap + * zooming. Of course, if PSDK application does not release control permission after controlling gimbal, the gimbal will also + * release control permission automatically at some time point later than the completion of control commands. Undoubtedly, + * this is inefficient. + * @note Max execution time of this function is slightly larger than 600ms. + * @note XPort do not response release control permission command in process of control parameters auto-tuning, + * coaxiality detection and balance detection. + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_ReleaseControlPermissionSync(void); + +/** + * @brief Reset gimbal of XPort in blocking mode. + * @details The interface reset angle of pitch axis to corresponding fine tune value in ground coordinate, and yaw axis + * to superimposed value of yaw axis angle of aircraft and corresponding fine tune value in ground coordinate. + * @note Max execution time of this function is slightly larger than 600ms. + * @note XPort do not response reset command in process of control parameters auto-tuning, coaxiality detection and + * balance detection. + * @param mode: Reset mode. + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_ResetSync(E_PsdkGimbalResetMode mode); + +/** + * @brief Set limit angle for XPort in blocking mode. + * @details Please refer to XPort part of developer website for + * details about default limit angle of XPort. + * @note Max execution time of this function is slightly larger than 1200ms. + * @note XPort do not response set limit angle command in process of control parameters auto-tuning, coaxiality + * detection and balance detection. + * @param limitAngleCategory: limit angle category. + * @param limitAngle: limit angle. + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_SetLimitAngleSync(E_PsdkXPortLimitAngleCategory limitAngleCategory, + T_PsdkXPortLimitAngle limitAngle); + +/** + * @brief Get limit angle of XPort in blocking mode. + * @note Max execution time of this function is slightly larger than 1200ms. + * @param limitAngleCategory: limit angle category. + * @param limitAngle: pointer to memory space used to store limit angle. + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_GetLimitAngleSync(E_PsdkXPortLimitAngleCategory limitAngleCategory, + T_PsdkXPortLimitAngle *limitAngle); + +/** + * @brief Set speed conversion factor for speed control from joystick and APP. + * @details XPort convert speed control command from joystick and APP to rotation speed based on the speed conversion + * factor. The formula is "speed = maximum rotation speed * conversion factor", and maximum rotation speed is a product of + * default maximum speed and maximum speed percentage. The default maximum rotation speed is 90degree/s. The maximum + * speed percentage is set by APP. The default speed conversion factor is 1.0. + * @note The value will be effective after a while, and the max value is 100ms. + * @param factor: Speed conversion factor and it has to be smaller than or equal to 1.0. + * @return Execution result. + */ +T_PsdkReturnCode PsdkXPort_SetSpeedConversionFactor(psdk_f32_t factor); + +#ifdef __cplusplus +} +#endif + +#endif // PSDK_XPORT_H + +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ diff --git a/Source/M300/PSDK_Qt/psdk_lib/lib/aarch64-linux-gnu-gcc/libpayloadsdk.a b/Source/M300/PSDK_Qt/psdk_lib/lib/aarch64-linux-gnu-gcc/libpayloadsdk.a new file mode 100644 index 0000000000000000000000000000000000000000..ae79c8fd5e92156837150f61a7d9e0e5fc10c3d9 GIT binary patch literal 2934032 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�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