diff --git a/LICENSE.txt b/LICENSE.txt index 8023395b..5ff326d8 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -316,7 +316,7 @@ The following portions of the DJI’s Payload SDK (“Software” referred to in │   │   │   │   ├── hal_uart.h │   │   │   │   ├── hal_usb_bulk.c │   │   │   │   └── hal_usb_bulk.h -│   │   │   └── nvidia_jeston +│   │   │   └── nvidia_jetson │   │   │   ├── application │   │   │   │   ├── dji_sdk_app_info.h │   │   │   │   ├── dji_sdk_config.h @@ -497,7 +497,7 @@ The following portions of the DJI’s Payload SDK (“Software” referred to in │   │   ├── hal_uart.h │   │   ├── hal_usb_bulk.c │   │   └── hal_usb_bulk.h -│   └── nvidia_jeston +│   └── nvidia_jetson │   ├── application │   │   ├── application.cpp │   │   ├── application.hpp diff --git a/README.md b/README.md index e3a44699..8f21f270 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DJI Payload SDK (PSDK) -![](https://img.shields.io/badge/version-V3.4.0-pink.svg) +![](https://img.shields.io/badge/version-V3.5.0-yellow.svg) ![](https://img.shields.io/badge/platform-linux_|_rtos-green.svg) ![](https://img.shields.io/badge/license-MIT-blue.svg) @@ -23,37 +23,22 @@ to get the latest version information. ## Latest Release -PSDK 3.4.0 was released on 18 April 2023. This version of Payload SDK mainly add some new features support and fixed -some bugs. Please refer to the release notes for detailed changes list. - -* Added support for SDK interconnection on M30/M30T -* Added support for downloading camera media files on M3E/M3T -* Added support for infrared temperature in camera management on M30T/M3T -* Added support for waypoint action status push on M30/M30T and M3E/M3T -* Added support for custom HMS function on all models -* Added support for custom device version number and serial number on all models -* Added support for subscribing to video stream request I-frame on all models -* Added support for obtaining H20N laser distance measurement data camera management on M300 RTK -* Added support for controlling H20N infrared zoom in camera management on M300 RTK -* Added support for subscribing perception grayscale image by Ethernet on M30/M30T and M3E/M3T -* Added support for downloading camera media files by Ethernet on M30/M30T and M3E/M3T -* Added support for Nvidia Jeston series development boards sample -* Added support for H20/H20T model files -* Fixed issue with unsuccessful initialization in USB single Bulk mode on M30/M30T and M3E/M3T -* Fixed issue with unstable data transmission OSDK expansion port to PSDK port for passing through small data on M300 RTK -* Fixed issue with third-party camera function causing payload disconnection due to deleting all media files in certain platforms on M300 RTK -* Fixed issue with gimbal mode abnormal setting in gimbal management on M300 RTK -* Fixed issue with deleting L1 camera media files in camera management on M300 RTK -* Fixed issue with abnormal triggering of text input box widget function in RTOS platform on M300 RTK -* Fixed issue with abnormal payload power supply during hot plugging in some scenarios in RTOS platform on M3E/M3T -* Fixed issue with CPU loading abnormal usage due to multiple video stream subscriptions on M30/M30T -* Fixed issue with occasional payload negotiation failure on M30/M30T and M3E/M3T -* Fixed issue with obtaining camera work mode on M30/M30T and M3E/M3T -* Fixed issue with obtaining camera zoom parameters on M30/M30T and M3E/M3T -* Fixed issue with altitude and distance limitations when using joystick function in some scenarios on all models -* Fixed some memory leak issues -* Optimized camera management C++ Sample support -* Optimized gimbal management C++ Sample support +PSDK 3.5.0 was released on 18 May 2023. This version of Payload SDK mainly add support for M350 RTK, also add some new features support and fixed some bugs. +Please refer to the release notes for detailed changes list. + +* Added support for new drone model Matrice 350 RTK +* Matrice 300 RTK added support for DJI RC Plus +* Added support for downloading media files in pieces on all drone models +* Added support for Osal get random number callback interface on all drone model +* Fixed issue with the black screen problem when uses third-party camera to playback video on M300 RTK and DJI smart controller screen combination +* Fixed issue with failure of subscribing L1 camera code stream on M300 RTK +* Fixed issue with failure of subscribing main camera code stream in dual control mode on M300 RTK +* Fixed issue with local upgrade function of RTOS platform on Mavic 3E/3T +* Fixed issue with the initialization failure of using PSDK Payload device and millimeter wave radar on M300 RTK +* Fixed issue with custom HMS function on M300 RTK and X-Port combination +* Fixed issue with invalid TTS option of speaker widget on M300 RTK +* Fixed issue with downloading file list with high probability of failure when the camera photos are over 400 on M300 RTK +* Fixed some of the memory leaks ## License diff --git a/psdk_lib/include/dji_camera_manager.h b/psdk_lib/include/dji_camera_manager.h index 1e62c978..62ad7cc6 100644 --- a/psdk_lib/include/dji_camera_manager.h +++ b/psdk_lib/include/dji_camera_manager.h @@ -442,6 +442,12 @@ typedef enum { 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 struct { uint8_t firmware_version[4]; } T_DjiCameraManagerFirmwareVersion; @@ -500,6 +506,11 @@ typedef struct { 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, @@ -1011,6 +1022,18 @@ T_DjiReturnCode DjiCameraManager_StopRecordVideo(E_DjiMountPosition position); */ T_DjiReturnCode DjiCameraManager_DownloadFileList(E_DjiMountPosition position, T_DjiCameraManagerFileList *fileList); +/** + * @brief Download selected camera media file list by slices. + * @note The interface is a synchronous interface, which occupies more CPU resources when using it. + * If the download file fails, the timeout time is 3S. + * @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 Regsiter selected camera download file data callback, * @param position: the mount position of the camera diff --git a/psdk_lib/include/dji_fc_subscription.h b/psdk_lib/include/dji_fc_subscription.h index cca15cb9..0aa143b9 100644 --- a/psdk_lib/include/dji_fc_subscription.h +++ b/psdk_lib/include/dji_fc_subscription.h @@ -361,8 +361,8 @@ typedef enum { 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_DjiFcSubscriptionBatteryInfo for information about data structure. - * @datastruct \ref T_DjiFcSubscriptionBatteryInfo + * @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), /*! @@ -977,13 +977,13 @@ typedef struct BatteryWholeInfo { 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:℃. */ + 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:%. */ + uint8_t batteryCapacityPercent; /*!< uint: %. */ T_DjiFcSubscriptionSingleBatteryState batteryState; uint8_t reserve1; uint8_t reserve2; diff --git a/psdk_lib/include/dji_flight_controller.h b/psdk_lib/include/dji_flight_controller.h index 936a0667..1ffc0f6b 100644 --- a/psdk_lib/include/dji_flight_controller.h +++ b/psdk_lib/include/dji_flight_controller.h @@ -76,7 +76,6 @@ typedef enum { */ typedef enum { DJI_FLIGHT_CONTROLLER_ENABLE_EMERGENCY_STOP_MOTOR = 0x01, /*!< Execute emergency-stop-motor action */ - DJI_FLIGHT_CONTROLLER_DISABLE_EMERGENCY_STOP_MOTOR = 0x02 /*!< Cancel emergency-stop-motor status */ } E_DjiFlightControllerEmergencyStopMotor; /** diff --git a/psdk_lib/include/dji_platform.h b/psdk_lib/include/dji_platform.h index 6018eae2..171e1465 100644 --- a/psdk_lib/include/dji_platform.h +++ b/psdk_lib/include/dji_platform.h @@ -89,11 +89,14 @@ typedef enum { * 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 RTK Extension Port by USB virtual serial port, such as /dev/ttyACM0. + * 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; @@ -221,6 +224,8 @@ typedef struct { T_DjiReturnCode (*GetTimeUs)(uint64_t *us); + T_DjiReturnCode (*GetRandomNum)(uint16_t *randomNum); + void *(*Malloc)(uint32_t size); void (*Free)(void *ptr); diff --git a/psdk_lib/include/dji_power_management.h b/psdk_lib/include/dji_power_management.h index 187ce70f..8961535d 100644 --- a/psdk_lib/include/dji_power_management.h +++ b/psdk_lib/include/dji_power_management.h @@ -71,6 +71,12 @@ typedef T_DjiReturnCode (*DjiPowerOffNotificationCallback)(bool *powerOffPrepara */ 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 diff --git a/psdk_lib/include/dji_typedef.h b/psdk_lib/include/dji_typedef.h index fecae41d..cd4d37dc 100644 --- a/psdk_lib/include/dji_typedef.h +++ b/psdk_lib/include/dji_typedef.h @@ -83,7 +83,7 @@ typedef enum { 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_PORT = 4, } E_DjiMountPosition; typedef enum { @@ -92,6 +92,7 @@ typedef enum { DJI_AIRCRAFT_SERIES_M300 = 2, DJI_AIRCRAFT_SERIES_M30 = 3, DJI_AIRCRAFT_SERIES_M3 = 4, + DJI_AIRCRAFT_SERIES_M350 = 5, } E_DjiAircraftSeries; typedef enum { @@ -104,6 +105,7 @@ typedef enum { DJI_AIRCRAFT_TYPE_M30T = 68, /*!< Aircraft type is Matrice 30T. */ DJI_AIRCRAFT_TYPE_M3E = 77, /*!< Aircraft type is Mavic 3E. */ DJI_AIRCRAFT_TYPE_M3T = 79, /*!< Aircraft type is Mavic 3T. */ + DJI_AIRCRAFT_TYPE_M350_RTK = 89, /*!< Aircraft type is Matrice 350 RTK. */ } E_DjiAircraftType; /** diff --git a/psdk_lib/include/dji_version.h b/psdk_lib/include/dji_version.h index 5a9f0b55..5623d36f 100644 --- a/psdk_lib/include/dji_version.h +++ b/psdk_lib/include/dji_version.h @@ -34,10 +34,10 @@ extern "C" { /* 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 4 /*!< DJI SDK minor version num, when add functionality in a backwards compatible manner changes. Range from 0 to 99. */ +#define DJI_VERSION_MINOR 5 /*!< DJI SDK minor version num, when add functionality in a backwards compatible manner changes. Range from 0 to 99. */ #define DJI_VERSION_MODIFY 0 /*!< 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 1749 /*!< DJI SDK version build info, when jenkins trigger build changes. Range from 0 to 65535. */ +#define DJI_VERSION_BUILD 1764 /*!< DJI SDK version build info, when jenkins trigger build changes. Range from 0 to 65535. */ /* Exported types ------------------------------------------------------------*/ diff --git a/psdk_lib/lib/aarch64-himix100-linux-gcc/libpayloadsdk.a b/psdk_lib/lib/aarch64-himix100-linux-gcc/libpayloadsdk.a index f327b4d7..22b798c0 100644 Binary files a/psdk_lib/lib/aarch64-himix100-linux-gcc/libpayloadsdk.a and b/psdk_lib/lib/aarch64-himix100-linux-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/aarch64-linux-gnu-gcc/libpayloadsdk.a b/psdk_lib/lib/aarch64-linux-gnu-gcc/libpayloadsdk.a index b94dfa10..524ea8aa 100644 Binary files a/psdk_lib/lib/aarch64-linux-gnu-gcc/libpayloadsdk.a and b/psdk_lib/lib/aarch64-linux-gnu-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/arm-himix100-linux-gcc/libpayloadsdk.a b/psdk_lib/lib/arm-himix100-linux-gcc/libpayloadsdk.a index d01dd602..8260b8b0 100644 Binary files a/psdk_lib/lib/arm-himix100-linux-gcc/libpayloadsdk.a and b/psdk_lib/lib/arm-himix100-linux-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/arm-himix200-linux-gcc/libpayloadsdk.a b/psdk_lib/lib/arm-himix200-linux-gcc/libpayloadsdk.a index 8cae413f..123ee0fa 100644 Binary files a/psdk_lib/lib/arm-himix200-linux-gcc/libpayloadsdk.a and b/psdk_lib/lib/arm-himix200-linux-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/arm-hisiv300-linux-gcc/libpayloadsdk.a b/psdk_lib/lib/arm-hisiv300-linux-gcc/libpayloadsdk.a index 56e3941b..fd108f50 100644 Binary files a/psdk_lib/lib/arm-hisiv300-linux-gcc/libpayloadsdk.a and b/psdk_lib/lib/arm-hisiv300-linux-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/arm-hisiv400-linux-gcc/libpayloadsdk.a b/psdk_lib/lib/arm-hisiv400-linux-gcc/libpayloadsdk.a index 30b375cd..dbfda473 100644 Binary files a/psdk_lib/lib/arm-hisiv400-linux-gcc/libpayloadsdk.a and b/psdk_lib/lib/arm-hisiv400-linux-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/arm-hisiv500-linux-gcc/libpayloadsdk.a b/psdk_lib/lib/arm-hisiv500-linux-gcc/libpayloadsdk.a index 60f57e69..96d90552 100644 Binary files a/psdk_lib/lib/arm-hisiv500-linux-gcc/libpayloadsdk.a and b/psdk_lib/lib/arm-hisiv500-linux-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/arm-hisiv600-linux-gcc/libpayloadsdk.a b/psdk_lib/lib/arm-hisiv600-linux-gcc/libpayloadsdk.a index 2315b6d4..75624452 100644 Binary files a/psdk_lib/lib/arm-hisiv600-linux-gcc/libpayloadsdk.a and b/psdk_lib/lib/arm-hisiv600-linux-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/arm-linux-gnueabi-gcc/libpayloadsdk.a b/psdk_lib/lib/arm-linux-gnueabi-gcc/libpayloadsdk.a index 066b990f..8d65afe7 100644 Binary files a/psdk_lib/lib/arm-linux-gnueabi-gcc/libpayloadsdk.a and b/psdk_lib/lib/arm-linux-gnueabi-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/arm-linux-gnueabihf-gcc/libpayloadsdk.a b/psdk_lib/lib/arm-linux-gnueabihf-gcc/libpayloadsdk.a index d78a21a1..d3065bb4 100644 Binary files a/psdk_lib/lib/arm-linux-gnueabihf-gcc/libpayloadsdk.a and b/psdk_lib/lib/arm-linux-gnueabihf-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/arm-none-eabi-gcc/libpayloadsdk.a b/psdk_lib/lib/arm-none-eabi-gcc/libpayloadsdk.a index 8d0453e9..a7a33430 100644 Binary files a/psdk_lib/lib/arm-none-eabi-gcc/libpayloadsdk.a and b/psdk_lib/lib/arm-none-eabi-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/armcc_cortex-m4/libpayload.lib b/psdk_lib/lib/armcc_cortex-m4/libpayload.lib index 929c8286..98b063ae 100644 Binary files a/psdk_lib/lib/armcc_cortex-m4/libpayload.lib and b/psdk_lib/lib/armcc_cortex-m4/libpayload.lib differ diff --git a/psdk_lib/lib/x86_64-linux-gnu-gcc/libpayloadsdk.a b/psdk_lib/lib/x86_64-linux-gnu-gcc/libpayloadsdk.a index 20ad10f1..eb152042 100644 Binary files a/psdk_lib/lib/x86_64-linux-gnu-gcc/libpayloadsdk.a and b/psdk_lib/lib/x86_64-linux-gnu-gcc/libpayloadsdk.a differ diff --git a/psdk_lib/lib/xtensa-esp32-elf-gcc/libpayloadsdk.a b/psdk_lib/lib/xtensa-esp32-elf-gcc/libpayloadsdk.a index 3bac0809..a38f699b 100644 Binary files a/psdk_lib/lib/xtensa-esp32-elf-gcc/libpayloadsdk.a and b/psdk_lib/lib/xtensa-esp32-elf-gcc/libpayloadsdk.a differ diff --git a/samples/sample_c++/module_sample/camera_manager/test_camera_manager_entry.cpp b/samples/sample_c++/module_sample/camera_manager/test_camera_manager_entry.cpp index 25a987e6..656d840f 100644 --- a/samples/sample_c++/module_sample/camera_manager/test_camera_manager_entry.cpp +++ b/samples/sample_c++/module_sample/camera_manager/test_camera_manager_entry.cpp @@ -50,6 +50,7 @@ static const char *s_cameraManagerSampleSelectList[] = { [E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SHOOT_INTERVAL_PHOTO] = "Shoot interval photo |", [E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_RECORD_VIDEO] = "Record video |", [E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_DOWNLOAD_AND_DELETE_MEDIA_FILE] = "Download and delete media file |", + [E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_DOWNLOAD_FILE_LIST_BY_SLICES] = "Download file list by slices |", [E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_THERMOMETRY] = "Thermometry test |", [E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_GET_LIDAR_RANGING_INFO] = "Get lidar ranging info |", [E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_IR_CAMERA_ZOOM_PARAM] = "Set ir camera zoom param |", @@ -120,8 +121,7 @@ void DjiUser_RunCameraManagerSample(void) if (posNum > 3 || posNum < 1) { USER_LOG_ERROR("Input mount position is invalid"); continue; - } - else { + } else { break; } } @@ -140,15 +140,15 @@ void DjiUser_RunCameraManagerSample(void) return; } - sampleSelectNum = atoi(sampleSelectStr.c_str()); + sampleSelectNum = atoi(sampleSelectStr.c_str()); if (sampleSelectNum < 0 || - sampleSelectNum >= (int)E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_INDEX_MAX) { + sampleSelectNum >= (int) E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_INDEX_MAX) { USER_LOG_ERROR("Input camera sample is invalid"); continue; } - cameraSample = (E_DjiTestCameraManagerSampleSelect)sampleSelectNum; + cameraSample = (E_DjiTestCameraManagerSampleSelect) sampleSelectNum; cout << "Start test: position " << cameraMountPosition << ", sample " << cameraSample << endl; diff --git a/samples/sample_c++/module_sample/gimbal/test_gimbal_entry.cpp b/samples/sample_c++/module_sample/gimbal/test_gimbal_entry.cpp index d7957ca5..3544fd79 100644 --- a/samples/sample_c++/module_sample/gimbal/test_gimbal_entry.cpp +++ b/samples/sample_c++/module_sample/gimbal/test_gimbal_entry.cpp @@ -88,6 +88,7 @@ void DjiUser_RunGimbalManagerSample(void) if (mountPosition == 'q') { return; } + if (mountPosition > '3' || mountPosition < '1') { USER_LOG_ERROR("Input mount position is invalid"); goto start; @@ -126,4 +127,4 @@ void DjiTest_GimbalManagerShowSampleSelectList(const char **SampleList, uint8_t std::cout << SampleList[i] << std::endl; } } -/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/ \ No newline at end of file +/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/ diff --git a/samples/sample_c++/module_sample/gimbal/test_gimbal_entry.hpp b/samples/sample_c++/module_sample/gimbal/test_gimbal_entry.hpp index bb53abc7..405d702f 100644 --- a/samples/sample_c++/module_sample/gimbal/test_gimbal_entry.hpp +++ b/samples/sample_c++/module_sample/gimbal/test_gimbal_entry.hpp @@ -48,4 +48,5 @@ void DjiUser_RunGimbalManagerSample(void); #endif #endif // TEST_GIMBAL_ENTRY_H -/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ \ No newline at end of file +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/ + diff --git a/samples/sample_c++/module_sample/perception/test_perception_entry.cpp b/samples/sample_c++/module_sample/perception/test_perception_entry.cpp index 6ce2efbd..b2976689 100644 --- a/samples/sample_c++/module_sample/perception/test_perception_entry.cpp +++ b/samples/sample_c++/module_sample/perception/test_perception_entry.cpp @@ -1,4 +1,4 @@ -/** + /** ******************************************************************** * @file test_perception_entry.cpp * @brief @@ -358,13 +358,6 @@ static void *DjiTest_StereoImagesDisplayTask(void *arg) pack->gotData = false; osalHandler->MutexUnlock(pack->mutex); - /*! Using Opencv display here */ - if (strstr(nameStr, "_l")) { - cv::moveWindow(nameStr, 200, 0); - } else { - cv::moveWindow(nameStr, (200 + (int) pack->info.rawInfo.width), 0); - } - if (i < USER_PERCEPTION_DIRECTION_NUM) { /*! Calculate frame rate */ timeNow[i] = (double) cv::getTickCount(); diff --git a/samples/sample_c++/platform/linux/common/osal/osal.c b/samples/sample_c++/platform/linux/common/osal/osal.c index f70952b2..1cb0c22c 100644 --- a/samples/sample_c++/platform/linux/common/osal/osal.c +++ b/samples/sample_c++/platform/linux/common/osal/osal.c @@ -98,6 +98,10 @@ T_DjiReturnCode Osal_MutexCreate(T_DjiMutexHandle *mutex) { int result; + if (!mutex) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + *mutex = malloc(sizeof(pthread_mutex_t)); if (*mutex == NULL) { return DJI_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED; @@ -118,7 +122,11 @@ T_DjiReturnCode Osal_MutexCreate(T_DjiMutexHandle *mutex) */ T_DjiReturnCode Osal_MutexDestroy(T_DjiMutexHandle mutex) { - int result; + int result = 0; + + if (!mutex) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } result = pthread_mutex_destroy(mutex); if (result != 0) { @@ -136,8 +144,13 @@ T_DjiReturnCode Osal_MutexDestroy(T_DjiMutexHandle mutex) */ T_DjiReturnCode Osal_MutexLock(T_DjiMutexHandle mutex) { - int result = pthread_mutex_lock(mutex); + int result = 0; + + if (!mutex) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + result = pthread_mutex_lock(mutex); if (result != 0) { return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } @@ -152,8 +165,13 @@ T_DjiReturnCode Osal_MutexLock(T_DjiMutexHandle mutex) */ T_DjiReturnCode Osal_MutexUnlock(T_DjiMutexHandle mutex) { - int result = pthread_mutex_unlock(mutex); + int result = 0; + if (!mutex) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + + result = pthread_mutex_unlock(mutex); if (result != 0) { return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } @@ -308,6 +326,14 @@ T_DjiReturnCode Osal_GetTimeUs(uint64_t *us) return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; } +T_DjiReturnCode Osal_GetRandomNum(uint16_t *randomNum) +{ + srand(time(NULL)); + *randomNum = random() % 65535; + + return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; +} + void *Osal_Malloc(uint32_t size) { return malloc(size); diff --git a/samples/sample_c++/platform/linux/common/osal/osal.h b/samples/sample_c++/platform/linux/common/osal/osal.h index 4d27a650..a38298ef 100644 --- a/samples/sample_c++/platform/linux/common/osal/osal.h +++ b/samples/sample_c++/platform/linux/common/osal/osal.h @@ -65,6 +65,7 @@ T_DjiReturnCode Osal_SemaphorePost(T_DjiSemaHandle semaphore); T_DjiReturnCode Osal_GetTimeMs(uint32_t *ms); T_DjiReturnCode Osal_GetTimeUs(uint64_t *us); +T_DjiReturnCode Osal_GetRandomNum(uint16_t *randomNum); void *Osal_Malloc(uint32_t size); void Osal_Free(void *ptr); diff --git a/samples/sample_c++/platform/linux/common/osal/osal_socket.c b/samples/sample_c++/platform/linux/common/osal/osal_socket.c index 0128d5c4..6abd4890 100644 --- a/samples/sample_c++/platform/linux/common/osal/osal_socket.c +++ b/samples/sample_c++/platform/linux/common/osal/osal_socket.c @@ -72,7 +72,8 @@ T_DjiReturnCode Osal_Socket(E_DjiSocketMode mode, T_DjiSocketHandle *socketHandl goto out; } - if (setsockopt(socketHandleStruct->socketFd, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, optlen) < 0) { + if (setsockopt(socketHandleStruct->socketFd, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, optlen) < 0) + { goto out; } } else if (mode == DJI_SOCKET_MODE_TCP) { @@ -86,7 +87,6 @@ T_DjiReturnCode Osal_Socket(E_DjiSocketMode mode, T_DjiSocketHandle *socketHandl return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; out: - close(socketHandleStruct->socketFd); free(socketHandleStruct); diff --git a/samples/sample_c++/platform/linux/manifold2/CMakeLists.txt b/samples/sample_c++/platform/linux/manifold2/CMakeLists.txt index 7727b1f8..429dd25c 100644 --- a/samples/sample_c++/platform/linux/manifold2/CMakeLists.txt +++ b/samples/sample_c++/platform/linux/manifold2/CMakeLists.txt @@ -2,15 +2,24 @@ cmake_minimum_required(VERSION 3.5) project(dji_sdk_demo_linux_cxx CXX) set(CMAKE_C_FLAGS "-pthread -std=gnu99") +set(CMAKE_CXX_FLAGS "-std=c++11 -pthread") set(CMAKE_EXE_LINKER_FLAGS "-pthread") set(CMAKE_C_COMPILER "gcc") set(CMAKE_CXX_COMPILER "g++") add_definitions(-D_GNU_SOURCE) -set(COMMON_CXX_FLAGS "-std=c++11 -pthread") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_CXX_FLAGS} -fprofile-arcs -ftest-coverage -Wno-deprecated-declarations") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -lgcov") +if (MEMORY_LEAK_CHECK_ON MATCHES TRUE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=leak") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") +endif () + +if (BUILD_TEST_CASES_ON MATCHES TRUE) + set(COMMON_CXX_FLAGS "-std=c++11 -pthread") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -Wno-deprecated-declarations") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -lgcov") +endif () include_directories(../../../module_sample) include_directories(../../../../sample_c/module_sample) diff --git a/samples/sample_c++/platform/linux/manifold2/application/application.cpp b/samples/sample_c++/platform/linux/manifold2/application/application.cpp index aed96b03..78f7dd27 100644 --- a/samples/sample_c++/platform/linux/manifold2/application/application.cpp +++ b/samples/sample_c++/platform/linux/manifold2/application/application.cpp @@ -77,14 +77,14 @@ Application::~Application() void Application::DjiUser_SetupEnvironment() { T_DjiReturnCode returnCode; - T_DjiOsalHandler osalHandler; - T_DjiHalUartHandler uartHandler; - T_DjiHalUsbBulkHandler usbBulkHandler; + T_DjiOsalHandler osalHandler = {0}; + T_DjiHalUartHandler uartHandler = {0}; + T_DjiHalUsbBulkHandler usbBulkHandler = {0}; T_DjiLoggerConsole printConsole; T_DjiLoggerConsole localRecordConsole; - T_DjiFileSystemHandler fileSystemHandler; - T_DjiSocketHandler socketHandler; - T_DjiHalNetworkHandler networkHandler; + T_DjiFileSystemHandler fileSystemHandler = {0}; + T_DjiSocketHandler socketHandler {0}; + T_DjiHalNetworkHandler networkHandler = {0}; networkHandler.NetworkInit = HalNetWork_Init; networkHandler.NetworkDeInit = HalNetWork_DeInit; @@ -117,6 +117,7 @@ void Application::DjiUser_SetupEnvironment() osalHandler.Free = Osal_Free; osalHandler.GetTimeMs = Osal_GetTimeMs; osalHandler.GetTimeUs = Osal_GetTimeUs; + osalHandler.GetRandomNum = Osal_GetRandomNum; printConsole.func = DjiUser_PrintConsole; printConsole.consoleLevel = DJI_LOGGER_CONSOLE_LOG_LEVEL_INFO; diff --git a/samples/sample_c++/platform/linux/manifold2/application/main.cpp b/samples/sample_c++/platform/linux/manifold2/application/main.cpp index 512ff0d1..2af5228c 100644 --- a/samples/sample_c++/platform/linux/manifold2/application/main.cpp +++ b/samples/sample_c++/platform/linux/manifold2/application/main.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include "application.hpp" #include "fc_subscription/test_fc_subscription.h" #include diff --git a/samples/sample_c++/platform/linux/manifold2/hal/hal_usb_bulk.c b/samples/sample_c++/platform/linux/manifold2/hal/hal_usb_bulk.c index 8235171f..b912591b 100644 --- a/samples/sample_c++/platform/linux/manifold2/hal/hal_usb_bulk.c +++ b/samples/sample_c++/platform/linux/manifold2/hal/hal_usb_bulk.c @@ -62,17 +62,19 @@ T_DjiReturnCode HalUsbBulk_Init(T_DjiHalUsbBulkInfo usbBulkInfo, T_DjiUsbBulkHan #ifdef LIBUSB_INSTALLED ret = libusb_init(NULL); if (ret < 0) { + USER_LOG_ERROR("init usb bulk failed, errno = %d", ret); return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } handle = libusb_open_device_with_vid_pid(NULL, usbBulkInfo.vid, usbBulkInfo.pid); - if (handle == NULL) { + if(handle == NULL) { + USER_LOG_ERROR("open usb device failed"); return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } ret = libusb_claim_interface(handle, usbBulkInfo.channelInfo.interfaceNum); if (ret != LIBUSB_SUCCESS) { - printf("libusb claim interface error"); + USER_LOG_ERROR("libusb claim interface failed, errno = %d", ret); libusb_close(handle); return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } @@ -115,6 +117,7 @@ T_DjiReturnCode HalUsbBulk_DeInit(T_DjiUsbBulkHandle usbBulkHandle) { struct libusb_device_handle *handle = NULL; T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler(); + int32_t ret; if (usbBulkHandle == NULL) { return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; @@ -124,8 +127,11 @@ T_DjiReturnCode HalUsbBulk_DeInit(T_DjiUsbBulkHandle usbBulkHandle) if (((T_HalUsbBulkObj *) usbBulkHandle)->usbBulkInfo.isUsbHost == true) { #ifdef LIBUSB_INSTALLED - libusb_release_interface(handle, ((T_HalUsbBulkObj *) usbBulkHandle)->usbBulkInfo.channelInfo.interfaceNum); - osalHandler->TaskSleepMs(100); + ret = libusb_release_interface(handle, ((T_HalUsbBulkObj *) usbBulkHandle)->usbBulkInfo.channelInfo.interfaceNum); + if(ret != 0) { + USER_LOG_ERROR("release usb bulk interface failed, errno = %d", ret); + return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; + } libusb_exit(NULL); #endif } else { diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/CMakeLists.txt b/samples/sample_c++/platform/linux/nvidia_jetson/CMakeLists.txt similarity index 94% rename from samples/sample_c++/platform/linux/nvidia_jeston/CMakeLists.txt rename to samples/sample_c++/platform/linux/nvidia_jetson/CMakeLists.txt index eb20b21a..c1c0814b 100644 --- a/samples/sample_c++/platform/linux/nvidia_jeston/CMakeLists.txt +++ b/samples/sample_c++/platform/linux/nvidia_jetson/CMakeLists.txt @@ -1,15 +1,15 @@ cmake_minimum_required(VERSION 3.5) -project(dji_sdk_demo_on_jeston_cxx CXX) +project(dji_sdk_demo_on_jetson_cxx CXX) set(CMAKE_C_FLAGS "-pthread -std=gnu99") +set(CMAKE_CXX_FLAGS "-std=c++11 -pthread") set(CMAKE_EXE_LINKER_FLAGS "-pthread") set(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc") set(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++") add_definitions(-D_GNU_SOURCE) if (BUILD_TEST_CASES_ON MATCHES TRUE) - set(COMMON_CXX_FLAGS "-std=c++11 -pthread") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_CXX_FLAGS} -fprofile-arcs -ftest-coverage -Wno-deprecated-declarations") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -Wno-deprecated-declarations") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -lgcov") endif () @@ -17,7 +17,7 @@ endif () include_directories(../../../module_sample) include_directories(../../../../sample_c/module_sample) include_directories(../common) -include_directories(../nvidia_jeston/application) +include_directories(../nvidia_jetson/application) file(GLOB_RECURSE MODULE_SAMPLE_SRC ../../../module_sample/liveview/*.c* @@ -57,9 +57,11 @@ if (OpenCV_FOUND) execute_process(COMMAND opencv_version OUTPUT_VARIABLE OPENCV_VERSION) if (${OPENCV_VERSION} STRLESS "4.0.0") add_definitions(-DOPEN_CV_VERSION_3) - else() + + else () add_definitions(-DOPEN_CV_VERSION_4) - endif() + + endif () else () message(STATUS "Did not find OpenCV in the system, image data is inside RecvContainer as raw data") endif () @@ -69,8 +71,6 @@ if (FFMPEG_FOUND) message(STATUS "Found FFMPEG installed in the system") message(STATUS " - Includes: ${FFMPEG_INCLUDE_DIR}") message(STATUS " - Libraries: ${FFMPEG_LIBRARIES}") - add_definitions(-DFFMPEG_INSTALLED) - include_directories(${FFMPEG_INCLUDE_DIR}) EXECUTE_PROCESS(COMMAND ffmpeg -version OUTPUT_VARIABLE ffmpeg_version_psdk_libput @@ -87,6 +87,8 @@ if (FFMPEG_FOUND) endif () target_link_libraries(${PROJECT_NAME} ${FFMPEG_LIBRARIES}) + include_directories(${FFMPEG_INCLUDE_DIR}) + add_definitions(-DFFMPEG_INSTALLED) else () message(STATUS "Cannot Find FFMPEG") endif (FFMPEG_FOUND) diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/application/application.cpp b/samples/sample_c++/platform/linux/nvidia_jetson/application/application.cpp similarity index 98% rename from samples/sample_c++/platform/linux/nvidia_jeston/application/application.cpp rename to samples/sample_c++/platform/linux/nvidia_jetson/application/application.cpp index 985a158e..0669ea0b 100644 --- a/samples/sample_c++/platform/linux/nvidia_jeston/application/application.cpp +++ b/samples/sample_c++/platform/linux/nvidia_jetson/application/application.cpp @@ -77,14 +77,14 @@ Application::~Application() void Application::DjiUser_SetupEnvironment() { T_DjiReturnCode returnCode; - T_DjiOsalHandler osalHandler; - T_DjiHalUartHandler uartHandler; - T_DjiHalUsbBulkHandler usbBulkHandler; + T_DjiOsalHandler osalHandler = {0}; + T_DjiHalUartHandler uartHandler = {0}; + T_DjiHalUsbBulkHandler usbBulkHandler = {0}; T_DjiLoggerConsole printConsole; T_DjiLoggerConsole localRecordConsole; - T_DjiFileSystemHandler fileSystemHandler; - T_DjiSocketHandler socketHandler; - T_DjiHalNetworkHandler networkHandler; + T_DjiFileSystemHandler fileSystemHandler = {0}; + T_DjiSocketHandler socketHandler = {0}; + T_DjiHalNetworkHandler networkHandler = {0}; networkHandler.NetworkInit = HalNetWork_Init; networkHandler.NetworkDeInit = HalNetWork_DeInit; @@ -117,6 +117,7 @@ void Application::DjiUser_SetupEnvironment() osalHandler.Free = Osal_Free; osalHandler.GetTimeMs = Osal_GetTimeMs; osalHandler.GetTimeUs = Osal_GetTimeUs; + osalHandler.GetRandomNum = Osal_GetRandomNum, printConsole.func = DjiUser_PrintConsole; printConsole.consoleLevel = DJI_LOGGER_CONSOLE_LOG_LEVEL_INFO; diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/application/application.hpp b/samples/sample_c++/platform/linux/nvidia_jetson/application/application.hpp similarity index 100% rename from samples/sample_c++/platform/linux/nvidia_jeston/application/application.hpp rename to samples/sample_c++/platform/linux/nvidia_jetson/application/application.hpp diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/application/dji_sdk_app_info.h b/samples/sample_c++/platform/linux/nvidia_jetson/application/dji_sdk_app_info.h similarity index 100% rename from samples/sample_c++/platform/linux/nvidia_jeston/application/dji_sdk_app_info.h rename to samples/sample_c++/platform/linux/nvidia_jetson/application/dji_sdk_app_info.h diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/application/dji_sdk_config.h b/samples/sample_c++/platform/linux/nvidia_jetson/application/dji_sdk_config.h similarity index 100% rename from samples/sample_c++/platform/linux/nvidia_jeston/application/dji_sdk_config.h rename to samples/sample_c++/platform/linux/nvidia_jetson/application/dji_sdk_config.h diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/application/main.cpp b/samples/sample_c++/platform/linux/nvidia_jetson/application/main.cpp similarity index 100% rename from samples/sample_c++/platform/linux/nvidia_jeston/application/main.cpp rename to samples/sample_c++/platform/linux/nvidia_jetson/application/main.cpp diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_network.c b/samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_network.c similarity index 100% rename from samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_network.c rename to samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_network.c diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_network.h b/samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_network.h similarity index 100% rename from samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_network.h rename to samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_network.h diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_uart.c b/samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_uart.c similarity index 100% rename from samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_uart.c rename to samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_uart.c diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_uart.h b/samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_uart.h similarity index 100% rename from samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_uart.h rename to samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_uart.h diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_usb_bulk.c b/samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_usb_bulk.c similarity index 100% rename from samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_usb_bulk.c rename to samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_usb_bulk.c diff --git a/samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_usb_bulk.h b/samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_usb_bulk.h similarity index 100% rename from samples/sample_c++/platform/linux/nvidia_jeston/hal/hal_usb_bulk.h rename to samples/sample_c++/platform/linux/nvidia_jetson/hal/hal_usb_bulk.h diff --git a/samples/sample_c/module_sample/camera_emu/test_payload_cam_emu_media.c b/samples/sample_c/module_sample/camera_emu/test_payload_cam_emu_media.c index 97cf84f2..d8eab655 100644 --- a/samples/sample_c/module_sample/camera_emu/test_payload_cam_emu_media.c +++ b/samples/sample_c/module_sample/camera_emu/test_payload_cam_emu_media.c @@ -186,7 +186,8 @@ T_DjiReturnCode DjiTest_CameraEmuMediaStartService(void) UtilBuffer_Init(&s_mediaPlayCommandBufferHandler, s_mediaPlayCommandBuffer, sizeof(s_mediaPlayCommandBuffer)); - if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK) { + if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK || + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) { returnCode = DjiPayloadCamera_RegMediaDownloadPlaybackHandler(&s_psdkCameraMedia); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { USER_LOG_ERROR("psdk camera media function init error."); diff --git a/samples/sample_c/module_sample/camera_manager/test_camera_manager.c b/samples/sample_c/module_sample/camera_manager/test_camera_manager.c index 74496676..ea1e842b 100644 --- a/samples/sample_c/module_sample/camera_manager/test_camera_manager.c +++ b/samples/sample_c/module_sample/camera_manager/test_camera_manager.c @@ -72,6 +72,7 @@ static uint32_t s_nextDownloadFileIndex = 0; /* Private functions declaration ---------------------------------------------*/ static uint8_t DjiTest_CameraManagerGetCameraTypeIndex(E_DjiCameraType cameraType); static T_DjiReturnCode DjiTest_CameraManagerMediaDownloadAndDeleteMediaFile(E_DjiMountPosition position); +static T_DjiReturnCode DjiTest_CameraManagerMediaDownloadFileListBySlices(E_DjiMountPosition position); static T_DjiReturnCode DjiTest_CameraManagerDownloadFileDataCallback(T_DjiDownloadFilePacketInfo packetInfo, const uint8_t *data, uint16_t len); static T_DjiReturnCode DjiTest_CameraManagerGetAreaThermometryData(E_DjiMountPosition position); @@ -1071,8 +1072,8 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition, "error code: 0x%08X\r\n", mountPosition, returnCode); goto exitCameraModule; } - USER_LOG_INFO("Sleep 4s..."); - osalHandler->TaskSleepMs(4000); + USER_LOG_INFO("Sleep 8s..."); + osalHandler->TaskSleepMs(8000); returnCode = DjiTest_CameraManagerOpticalZoom(mountPosition, DJI_CAMERA_ZOOM_DIRECTION_OUT, 5); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { @@ -1195,6 +1196,15 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition, #endif break; } + + case E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_DOWNLOAD_FILE_LIST_BY_SLICES: { +#ifdef SYSTEM_ARCH_LINUX + DjiTest_CameraManagerMediaDownloadFileListBySlices(mountPosition); +#else + USER_LOG_WARN("This feature does not support RTOS platform."); +#endif + break; + } case E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_THERMOMETRY: { returnCode = DjiTest_CameraManagerGetPointThermometryData(mountPosition); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { @@ -1353,6 +1363,77 @@ static T_DjiReturnCode DjiTest_CameraManagerMediaDownloadAndDeleteMediaFile(E_Dj return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; } +static T_DjiReturnCode DjiTest_CameraManagerMediaDownloadFileListBySlices(E_DjiMountPosition position) +{ + T_DjiReturnCode returnCode; + T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler(); + uint16_t downloadCount = 0; + T_DjiCameraManagerSliceConfig sliceConfig = {0}; + + s_nextDownloadFileIndex = 0; + returnCode = DjiCameraManager_RegDownloadFileDataCallback(position, DjiTest_CameraManagerDownloadFileDataCallback); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("Register download file data callback failed, error code: 0x%08X.", returnCode); + return returnCode; + } + + sliceConfig.countPerSlice = DJI_CAMERA_MANAGER_FILE_LIST_COUNT_ALL_PER_SLICE; + sliceConfig.sliceStartIndex = 0; + + returnCode = DjiCameraManager_DownloadFileListBySlices(position, sliceConfig, &s_meidaFileList); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("Download file list failed, error code: 0x%08X.", returnCode); + return returnCode; + } + + if (s_meidaFileList.totalCount > 0) { + downloadCount = s_meidaFileList.totalCount; + printf( + "\033[1;33;40m -> Download file list finished, total file count is %d, the following %d is list details: \033[0m\r\n", + s_meidaFileList.totalCount, downloadCount); + for (int i = 0; i < downloadCount; ++i) { + if (s_meidaFileList.fileListInfo[i].fileSize < 1 * 1024 * 1024) { + printf( + "\033[1;32;40m ### Media file_%03d name: %s, index: %d, time:%04d-%02d-%02d_%02d:%02d:%02d, size: %.2f KB, type: %d \033[0m\r\n", + i, s_meidaFileList.fileListInfo[i].fileName, + s_meidaFileList.fileListInfo[i].fileIndex, + s_meidaFileList.fileListInfo[i].createTime.year, + s_meidaFileList.fileListInfo[i].createTime.month, + s_meidaFileList.fileListInfo[i].createTime.day, + s_meidaFileList.fileListInfo[i].createTime.hour, + s_meidaFileList.fileListInfo[i].createTime.minute, + s_meidaFileList.fileListInfo[i].createTime.second, + (dji_f32_t) s_meidaFileList.fileListInfo[i].fileSize / 1024, + s_meidaFileList.fileListInfo[i].type); + } else { + printf( + "\033[1;32;40m ### Media file_%03d name: %s, index: %d, time:%04d-%02d-%02d_%02d:%02d:%02d, size: %.2f MB, type: %d \033[0m\r\n", + i, s_meidaFileList.fileListInfo[i].fileName, + s_meidaFileList.fileListInfo[i].fileIndex, + s_meidaFileList.fileListInfo[i].createTime.year, + s_meidaFileList.fileListInfo[i].createTime.month, + s_meidaFileList.fileListInfo[i].createTime.day, + s_meidaFileList.fileListInfo[i].createTime.hour, + s_meidaFileList.fileListInfo[i].createTime.minute, + s_meidaFileList.fileListInfo[i].createTime.second, + (dji_f32_t) s_meidaFileList.fileListInfo[i].fileSize / (1024 * 1024), + s_meidaFileList.fileListInfo[i].type); + } + } + printf("\r\n"); + + returnCode = DjiCameraManager_DownloadFileByIndex(position, s_meidaFileList.fileListInfo[0].fileIndex); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("Download media file by index failed, error code: 0x%08X.", returnCode); + } + + } else { + USER_LOG_WARN("Media file is not existed in sdcard.\r\n"); + } + + return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; +} + static T_DjiReturnCode DjiTest_CameraManagerDownloadFileDataCallback(T_DjiDownloadFilePacketInfo packetInfo, const uint8_t *data, uint16_t len) { @@ -1371,7 +1452,8 @@ static T_DjiReturnCode DjiTest_CameraManagerDownloadFileDataCallback(T_DjiDownlo memset(downloadFileName, 0, sizeof(downloadFileName)); snprintf(downloadFileName, sizeof(downloadFileName), "%s", s_meidaFileList.fileListInfo[i].fileName); - USER_LOG_INFO("Start download media file, index : %d, next download media file, index: %d", i, s_nextDownloadFileIndex); + USER_LOG_INFO("Start download media file, index : %d, next download media file, index: %d", i, + s_nextDownloadFileIndex); s_downloadMediaFile = fopen(downloadFileName, "wb+"); if (s_downloadMediaFile == NULL) { return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; diff --git a/samples/sample_c/module_sample/camera_manager/test_camera_manager.h b/samples/sample_c/module_sample/camera_manager/test_camera_manager.h index 72725fbc..4e48ef41 100644 --- a/samples/sample_c/module_sample/camera_manager/test_camera_manager.h +++ b/samples/sample_c/module_sample/camera_manager/test_camera_manager.h @@ -52,6 +52,7 @@ typedef enum { E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SHOOT_INTERVAL_PHOTO, E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_RECORD_VIDEO, E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_DOWNLOAD_AND_DELETE_MEDIA_FILE, + E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_DOWNLOAD_FILE_LIST_BY_SLICES, E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_THERMOMETRY, E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_GET_LIDAR_RANGING_INFO, E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_IR_CAMERA_ZOOM_PARAM, diff --git a/samples/sample_c/module_sample/data_transmission/test_data_transmission.c b/samples/sample_c/module_sample/data_transmission/test_data_transmission.c index 473920f0..a5e73894 100644 --- a/samples/sample_c/module_sample/data_transmission/test_data_transmission.c +++ b/samples/sample_c/module_sample/data_transmission/test_data_transmission.c @@ -60,7 +60,6 @@ T_DjiReturnCode DjiTest_DataTransmissionStartService(void) char ipAddr[DJI_IP_ADDR_STR_SIZE_MAX]; uint16_t port; - djiStat = DjiLowSpeedDataChannel_Init(); if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { USER_LOG_ERROR("init data transmission module error."); @@ -124,6 +123,25 @@ T_DjiReturnCode DjiTest_DataTransmissionStartService(void) return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; } +T_DjiReturnCode DjiTest_DataTransmissionStopService(void) +{ + T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler(); + T_DjiReturnCode returnCode; + + if (osalHandler->TaskDestroy(s_userDataTransmissionThread) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("user data transmission task destroy error."); + return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; + } + + returnCode = DjiLowSpeedDataChannel_DeInit(); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("deinit data transmission module error."); + return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; + } + + return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; +} + /* Private functions definition-----------------------------------------------*/ #ifndef __CC_ARM #pragma GCC diagnostic push diff --git a/samples/sample_c/module_sample/data_transmission/test_data_transmission.h b/samples/sample_c/module_sample/data_transmission/test_data_transmission.h index 4380bde4..e18b27f1 100644 --- a/samples/sample_c/module_sample/data_transmission/test_data_transmission.h +++ b/samples/sample_c/module_sample/data_transmission/test_data_transmission.h @@ -41,6 +41,7 @@ extern "C" { /* Exported functions --------------------------------------------------------*/ T_DjiReturnCode DjiTest_DataTransmissionStartService(void); +T_DjiReturnCode DjiTest_DataTransmissionStopService(void); #ifdef __cplusplus } diff --git a/samples/sample_c/module_sample/fc_subscription/test_fc_subscription.c b/samples/sample_c/module_sample/fc_subscription/test_fc_subscription.c index e5d73a60..9a54dc1d 100644 --- a/samples/sample_c/module_sample/fc_subscription/test_fc_subscription.c +++ b/samples/sample_c/module_sample/fc_subscription/test_fc_subscription.c @@ -126,7 +126,7 @@ T_DjiReturnCode DjiTest_FcSubscriptionRunSample(void) } USER_LOG_INFO("--> Step 2: Subscribe the topics of quaternion, velocity and gps position"); - djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, + djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_50_HZ, DjiTest_FcSubscriptionReceiveQuaternionCallback); if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { USER_LOG_ERROR("Subscribe topic quaternion error."); diff --git a/samples/sample_c/module_sample/flight_control/test_flight_control.c b/samples/sample_c/module_sample/flight_control/test_flight_control.c index 9c038b38..8a611470 100644 --- a/samples/sample_c/module_sample/flight_control/test_flight_control.c +++ b/samples/sample_c/module_sample/flight_control/test_flight_control.c @@ -186,7 +186,10 @@ T_DjiReturnCode DjiTest_FlightControlInit(void) DJI_DATA_SUBSCRIPTION_TOPIC_50_HZ, NULL); - if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + if (returnCode == DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + } else if (returnCode == DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_DUPLICATE) { + USER_LOG_WARN("Subscribe topic quaternion duplicate"); + } else { USER_LOG_ERROR("Subscribe topic quaternion failed,error code:0x%08llX", returnCode); return returnCode; } @@ -703,7 +706,8 @@ void DjiTest_FlightControlSetGetParamSample() DjiTest_WidgetLogAppend("--> Step 3: Turn on horizontal radar obstacle avoidance"); if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 || - aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T) { + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T || + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) { returnCode = DjiFlightController_SetHorizontalRadarObstacleAvoidanceEnableStatus( DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { @@ -717,7 +721,8 @@ void DjiTest_FlightControlSetGetParamSample() DjiTest_WidgetLogAppend("--> Step 4: Get horizontal radar obstacle avoidance status\r\n"); if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 || - aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T) { + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T || + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) { returnCode = DjiFlightController_GetHorizontalRadarObstacleAvoidanceEnableStatus( &horizontalRadarObstacleAvoidanceStatus); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { @@ -756,7 +761,8 @@ void DjiTest_FlightControlSetGetParamSample() DjiTest_WidgetLogAppend("--> Step 7: Turn on upwards radar obstacle avoidance."); if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 || - aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T) { + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T || + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) { returnCode = DjiFlightController_SetUpwardsRadarObstacleAvoidanceEnableStatus( DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { @@ -770,7 +776,8 @@ void DjiTest_FlightControlSetGetParamSample() DjiTest_WidgetLogAppend("--> Step 8: Get upwards radar obstacle avoidance status\r\n"); if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 || - aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T) { + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T || + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) { returnCode = DjiFlightController_GetUpwardsRadarObstacleAvoidanceEnableStatus( &upwardsRadarObstacleAvoidanceStatus); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { @@ -846,7 +853,8 @@ void DjiTest_FlightControlSetGetParamSample() s_osalHandler->TaskSleepMs(1000); /*! Set rc lost action */ - if (aircraftInfoBaseInfo.aircraftType != DJI_AIRCRAFT_TYPE_M300_RTK) { + if (aircraftInfoBaseInfo.aircraftType != DJI_AIRCRAFT_TYPE_M300_RTK && + aircraftInfoBaseInfo.aircraftType != DJI_AIRCRAFT_TYPE_M350_RTK) { USER_LOG_INFO("--> Step 15: Set rc lost action"); DjiTest_WidgetLogAppend("--> Step 15: Set rc lost action"); returnCode = DjiFlightController_SetRCLostAction(DJI_FLIGHT_CONTROLLER_RC_LOST_ACTION_GOHOME); diff --git a/samples/sample_c/module_sample/gimbal_emu/test_payload_gimbal_emu.c b/samples/sample_c/module_sample/gimbal_emu/test_payload_gimbal_emu.c index f396a48c..fb6c7c37 100644 --- a/samples/sample_c/module_sample/gimbal_emu/test_payload_gimbal_emu.c +++ b/samples/sample_c/module_sample/gimbal_emu/test_payload_gimbal_emu.c @@ -35,6 +35,7 @@ #define PAYLOAD_GIMBAL_EMU_TASK_STACK_SIZE (2048) #define PAYLOAD_GIMBAL_TASK_FREQ 1000 #define PAYLOAD_GIMBAL_CALIBRATION_TIME_MS 2000 +#define PAYLOAD_GIMBAL_MIN_ACTION_TIME 5 /* Private types -------------------------------------------------------------*/ typedef enum { @@ -389,10 +390,14 @@ static void *UserGimbal_Task(void *arg) djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ, NULL); - if (djiStat == DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_DUPLICATE) { - USER_LOG_DEBUG("Subscribe topic quaternion duplicate."); - } else if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { - USER_LOG_ERROR("Subscribe topic quaternion error."); + if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + if (djiStat == DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_DUPLICATE) { + USER_LOG_WARN("Subscribe topic quaternion duplicate."); + } else { + USER_LOG_ERROR("Subscribe topic quaternion error."); + } + } else { + USER_LOG_DEBUG("Subscribe topic quaternion success."); } while (1) { @@ -1077,6 +1082,11 @@ DjiTest_GimbalCalculateSpeed(T_DjiAttitude3d originalAttitude, T_DjiAttitude3d t return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; } + if (actionTime == 0) { + USER_LOG_WARN("Input action time is zero, now used max speed to rotate."); + actionTime = PAYLOAD_GIMBAL_MIN_ACTION_TIME; + } + pitchSpeedTemp = (float) (targetAttitude.pitch - originalAttitude.pitch) / (float) actionTime * 100; rollSpeedTemp = (float) (targetAttitude.roll - originalAttitude.roll) / (float) actionTime * 100; yawSpeedTemp = (float) (targetAttitude.yaw - originalAttitude.yaw) / (float) actionTime * 100; diff --git a/samples/sample_c/module_sample/gimbal_manager/test_gimbal_manager.c b/samples/sample_c/module_sample/gimbal_manager/test_gimbal_manager.c index 6c04b180..c2697bb1 100644 --- a/samples/sample_c/module_sample/gimbal_manager/test_gimbal_manager.c +++ b/samples/sample_c/module_sample/gimbal_manager/test_gimbal_manager.c @@ -45,7 +45,7 @@ typedef struct { /* Private values -------------------------------------------------------------*/ static const T_DjiTestGimbalActionList s_rotationActionList[] = - { +{ {.action = DJI_TEST_GIMBAL_RESET}, {.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 30, 0, 0, 0.2}, {.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, -30, 0, 0, 0.2}, @@ -63,7 +63,7 @@ static const T_DjiTestGimbalActionList s_rotationActionList[] = {.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, -60, 0, 0, 0.5}, {.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, -30, 0, 0, 0.5}, {.action = DJI_TEST_GIMBAL_RESET}, - }; +}; /* Private functions declaration ---------------------------------------------*/ @@ -151,6 +151,4 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition, } /* Private functions definition-----------------------------------------------*/ - - /****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/ diff --git a/samples/sample_c/module_sample/hms/test_hms.c b/samples/sample_c/module_sample/hms/test_hms.c index dd7fcd2a..3ebbb164 100644 --- a/samples/sample_c/module_sample/hms/test_hms.c +++ b/samples/sample_c/module_sample/hms/test_hms.c @@ -52,6 +52,7 @@ static const char *oldReplaceComponentIndexStr = "%component_index"; static T_DjiHmsFileBinaryArray s_EnHmsTextConfigFileBinaryArrayList[] = { {hms_text_config_json_fileName, hms_text_config_json_fileSize, hms_text_config_json_fileBinaryArray}, }; +static bool s_hmsServiceRunFlag = false; /* Private functions declaration ---------------------------------------------*/ static T_DjiReturnCode DjiTest_HmsInit(void); @@ -169,6 +170,8 @@ T_DjiReturnCode DjiTest_HmsStartService(void) DjiHms_InjectHmsErrorCode(0x1E020000, DJI_HMS_ERROR_LEVEL_FATAL); #endif + s_hmsServiceRunFlag = true; + return returnCode; } @@ -193,6 +196,10 @@ static T_DjiReturnCode DjiTest_HmsInit(void) return returnCode; } + if (s_hmsServiceRunFlag == true) { + return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; + } + return DjiHms_Init(); } @@ -207,6 +214,10 @@ static T_DjiReturnCode DjiTest_HmsDeInit(void) return returnCode; } + if (s_hmsServiceRunFlag == true) { + return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; + } + return DjiHms_DeInit(); } diff --git a/samples/sample_c/module_sample/power_management/test_power_management.c b/samples/sample_c/module_sample/power_management/test_power_management.c index 3c237551..0af54fdd 100644 --- a/samples/sample_c/module_sample/power_management/test_power_management.c +++ b/samples/sample_c/module_sample/power_management/test_power_management.c @@ -87,7 +87,8 @@ T_DjiReturnCode DjiTest_PowerManagementStartService(void) return returnCode; } - if (baseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK && + if ((baseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK || + baseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) && (baseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 || baseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_XPORT)) { // apply high power @@ -130,6 +131,19 @@ T_DjiReturnCode DjiTest_PowerManagementStartService(void) return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; } +T_DjiReturnCode DjiTest_PowerManagementStopService(void) +{ + T_DjiReturnCode returnCode; + + returnCode = DjiPowerManagement_DeInit(); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("power management deinit error: 0x%08llX.", returnCode); + return returnCode; + } + + return returnCode; +} + /* Private functions definition-----------------------------------------------*/ static T_DjiReturnCode DjiTest_PowerOffNotificationCallback(bool *powerOffPreparationFlag) { diff --git a/samples/sample_c/module_sample/power_management/test_power_management.h b/samples/sample_c/module_sample/power_management/test_power_management.h index 470aae54..63cc4322 100644 --- a/samples/sample_c/module_sample/power_management/test_power_management.h +++ b/samples/sample_c/module_sample/power_management/test_power_management.h @@ -46,6 +46,7 @@ typedef struct { /* Exported functions --------------------------------------------------------*/ T_DjiReturnCode DjiTest_PowerManagementStartService(void); +T_DjiReturnCode DjiTest_PowerManagementStopService(void); T_DjiReturnCode DjiTest_RegApplyHighPowerHandler(T_DjiTestApplyHighPowerHandler *applyHighPowerHandler); #ifdef __cplusplus diff --git a/samples/sample_c/module_sample/waypoint_v3/test_waypoint_v3.c b/samples/sample_c/module_sample/waypoint_v3/test_waypoint_v3.c index d9047626..a65022ba 100644 --- a/samples/sample_c/module_sample/waypoint_v3/test_waypoint_v3.c +++ b/samples/sample_c/module_sample/waypoint_v3/test_waypoint_v3.c @@ -29,6 +29,7 @@ #include "dji_logger.h" #include "dji_waypoint_v3.h" #include "waypoint_file_c/waypoint_v3_test_file_kmz.h" +#include "dji_fc_subscription.h" /* Private constants ---------------------------------------------------------*/ #define DJI_TEST_WAYPOINT_V3_KMZ_FILE_PATH_LEN_MAX (256) @@ -47,6 +48,9 @@ T_DjiReturnCode DjiTest_WaypointV3RunSample(void) { T_DjiReturnCode returnCode; T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler(); + T_DjiFcSubscriptionFlightStatus flightStatus = 0; + T_DjiDataTimestamp flightStatusTimestamp = {0}; + #ifdef SYSTEM_ARCH_LINUX FILE *kmzFile = NULL; uint32_t kmzFileSize = 0; @@ -94,25 +98,25 @@ T_DjiReturnCode DjiTest_WaypointV3RunSample(void) returnCode = UtilFile_GetFileSize(kmzFile, &kmzFileSize); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { USER_LOG_ERROR("Get kmz file size failed."); - goto out; + goto close_file; } kmzFileBuf = osalHandler->Malloc(kmzFileSize); if (kmzFileBuf == NULL) { USER_LOG_ERROR("Malloc kmz file buf error."); - goto out; + goto close_file; } readLen = fread(kmzFileBuf, 1, kmzFileSize, kmzFile); if (readLen != kmzFileSize) { USER_LOG_ERROR("Read kmz file data failed."); - goto out; + goto close_file; } returnCode = DjiWaypointV3_UploadKmzFile(kmzFileBuf, kmzFileSize); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { USER_LOG_ERROR("Upload kmz file failed."); - goto out; + goto close_file; } osalHandler->Free(kmzFileBuf); @@ -129,14 +133,43 @@ T_DjiReturnCode DjiTest_WaypointV3RunSample(void) returnCode = DjiWaypointV3_Action(DJI_WAYPOINT_V3_ACTION_START); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { USER_LOG_ERROR("Execute start action failed."); - goto out; + goto close_file; } + osalHandler->TaskSleepMs(2000); + +close_file: #ifdef SYSTEM_ARCH_LINUX - fclose(kmzFile); + returnCode = fclose(kmzFile); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("Close KMZ file failed."); + } + kmzFile = NULL; #endif - return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; + returnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_STATUS_FLIGHT, + DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ, + NULL); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("Subscribe topic flight status failed, error code:0x%08llX", returnCode); + goto out; + } + + do { + osalHandler->TaskSleepMs(2000); + + returnCode = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_STATUS_FLIGHT, + (uint8_t *) &flightStatus, + sizeof(T_DjiFcSubscriptionFlightStatus), + &flightStatusTimestamp); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("Get value of topic flight status failed, error code:0x%08llX", returnCode); + } + + USER_LOG_INFO("flight status: %d", flightStatus); + } while(flightStatus == DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR); + + USER_LOG_INFO("The aircraft is on the ground now."); out: #ifdef SYSTEM_ARCH_LINUX @@ -145,7 +178,7 @@ T_DjiReturnCode DjiTest_WaypointV3RunSample(void) } #endif - return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; + return DjiWaypointV3_DeInit(); } /* Private functions definition-----------------------------------------------*/ diff --git a/samples/sample_c/module_sample/widget/test_widget_speaker.c b/samples/sample_c/module_sample/widget/test_widget_speaker.c index 6c91707a..6fb0760d 100644 --- a/samples/sample_c/module_sample/widget/test_widget_speaker.c +++ b/samples/sample_c/module_sample/widget/test_widget_speaker.c @@ -163,6 +163,7 @@ T_DjiReturnCode DjiTest_WidgetSpeakerStartService(void) /* Private functions definition-----------------------------------------------*/ #ifdef SYSTEM_ARCH_LINUX + static uint32_t DjiTest_GetVoicePlayProcessId(void) { FILE *fp; @@ -220,21 +221,21 @@ static T_DjiReturnCode DjiTest_DecodeAudioData(void) /*! Attention: you can use "ffmpeg -i xxx.mp3 -ar 16000 -ac 1 out.wav" and use opus-tools to generate opus file for test */ fin = fopen(WIDGET_SPEAKER_AUDIO_OPUS_FILE_NAME, "r"); if (fin == NULL) { - USER_LOG_ERROR("failed to open input file: %s\n", strerror(errno)); + fprintf(stderr, "failed to open input file: %s\n", strerror(errno)); return EXIT_FAILURE; } - fout = fopen(WIDGET_SPEAKER_AUDIO_PCM_FILE_NAME, "w"); - if (fout == NULL) { - USER_LOG_ERROR("failed to open output file: %s\n", strerror(errno)); - goto open_pcm_audio_failed; - } - /* Create a new decoder state. */ decoder = opus_decoder_create(WIDGET_SPEAKER_AUDIO_OPUS_SAMPLE_RATE, WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, &err); if (err < 0) { - USER_LOG_ERROR("failed to create decoder: %s\n", opus_strerror(err)); - goto create_decoder_failed; + fprintf(stderr, "failed to create decoder: %s\n", opus_strerror(err)); + goto close_fin; + } + + fout = fopen(WIDGET_SPEAKER_AUDIO_PCM_FILE_NAME, "w"); + if (fout == NULL) { + fprintf(stderr, "failed to open output file: %s\n", strerror(errno)); + goto close_fin; } while (1) { @@ -254,8 +255,8 @@ static T_DjiReturnCode DjiTest_DecodeAudioData(void) the frame size returned. */ frame_size = opus_decode(decoder, cbits, nbBytes, out, WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE, 0); if (frame_size < 0) { - USER_LOG_ERROR("decoder failed: %s\n", opus_strerror(frame_size)); - goto decode_data_failed; + fprintf(stderr, "decoder failed: %s\n", opus_strerror(frame_size)); + goto close_fout; } USER_LOG_DEBUG("decode data to file: %d\r\n", frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS); @@ -278,8 +279,18 @@ static T_DjiReturnCode DjiTest_DecodeAudioData(void) open_pcm_audio_failed: fclose(fin); #endif + return EXIT_SUCCESS; + +#ifdef OPUS_INSTALLED +close_fout: + fclose(fout); + +close_fin: + fclose(fin); + + return EXIT_FAILURE; +#endif - return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; } static T_DjiReturnCode DjiTest_PlayAudioData(void) @@ -364,7 +375,7 @@ static T_DjiReturnCode DjiTest_CheckFileMd5Sum(const char *path, uint8_t *buf, u uint32_t readFileTotalSize = 0; uint16_t readLen; T_DjiReturnCode returnCode; - uint8_t readBuf[1024]; + uint8_t readBuf[1024] = {0}; uint8_t md5Sum[16] = {0}; FILE *file = NULL;; @@ -407,6 +418,7 @@ static T_DjiReturnCode DjiTest_CheckFileMd5Sum(const char *path, uint8_t *buf, u return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; } + #endif static void SetSpeakerState(E_DjiWidgetSpeakerState speakerState) @@ -628,6 +640,7 @@ static T_DjiReturnCode ReceiveTtsData(E_DjiWidgetTransmitDataEvent event, #ifdef SYSTEM_ARCH_LINUX if (s_ttsFile != NULL) { fclose(s_ttsFile); + s_ttsFile = NULL; } returnCode = DjiTest_CheckFileMd5Sum(WIDGET_SPEAKER_TTS_FILE_NAME, buf, size); @@ -685,6 +698,7 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event, USER_LOG_INFO("Close voice file."); if (s_audioFile != NULL) { fclose(s_audioFile); + s_audioFile = NULL; } #ifdef SYSTEM_ARCH_LINUX diff --git a/samples/sample_c/module_sample/widget_interaction_test/test_widget_interaction.c b/samples/sample_c/module_sample/widget_interaction_test/test_widget_interaction.c index 626f65fc..46d3fece 100644 --- a/samples/sample_c/module_sample/widget_interaction_test/test_widget_interaction.c +++ b/samples/sample_c/module_sample/widget_interaction_test/test_widget_interaction.c @@ -55,6 +55,13 @@ #define WIDGET_LOG_STRING_MAX_SIZE (40) #define WIDGET_LOG_LINE_MAX_NUM (5) +#define DJI_HMS_ERROR_CODE_VALUE0 0x1E020000 +#define DJI_HMS_ERROR_CODE_VALUE1 0x1E020001 +#define DJI_HMS_ERROR_CODE_VALUE2 0x1E020002 +#define DJI_HMS_ERROR_CODE_VALUE3 0x1E020003 +#define DJI_HMS_ERROR_CODE_VALUE4 0x1E020004 + + /* Private types -------------------------------------------------------------*/ typedef enum { E_DJI_SAMPLE_INDEX_FC_SUBSCRIPTION = 0, @@ -86,7 +93,6 @@ typedef enum { E_DJI_SAMPLE_INDEX_CAMMGR_RECORDER_VIDEO = 26, E_DJI_SAMPLE_INDEX_CAMMGR_MEDIA_DOWNLOAD = 27, E_DJI_SAMPLE_INDEX_CAMMGR_THERMOMETRY = 28, - E_DJI_SAMPLE_INDEX_UNKNOWN = 0xFF, } E_DjiExtensionPortSampleIndex; @@ -376,19 +382,19 @@ static void *DjiTest_WidgetInteractionTask(void *arg) if (s_isInjectErrcode == true && s_isEliminateErrcode == false) { switch (s_extensionPortErrcodeIndex) { case E_DJI_HMS_ERROR_CODE_INDEX1: - errorCode = 0x1E020000; + errorCode = DJI_HMS_ERROR_CODE_VALUE0; break; case E_DJI_HMS_ERROR_CODE_INDEX2: - errorCode = 0x1E020001; + errorCode = DJI_HMS_ERROR_CODE_VALUE1; break; case E_DJI_HMS_ERROR_CODE_INDEX3: - errorCode = 0x1E020002; + errorCode = DJI_HMS_ERROR_CODE_VALUE2; break; case E_DJI_HMS_ERROR_CODE_INDEX4: - errorCode = 0x1E020003; + errorCode = DJI_HMS_ERROR_CODE_VALUE3; break; case E_DJI_HMS_ERROR_CODE_INDEX5: - errorCode = 0x1E020004; + errorCode = DJI_HMS_ERROR_CODE_VALUE4; break; default: break; @@ -421,19 +427,19 @@ static void *DjiTest_WidgetInteractionTask(void *arg) if (s_isEliminateErrcode == true && s_isInjectErrcode == false) { switch (s_extensionPortErrcodeIndex) { case E_DJI_HMS_ERROR_CODE_INDEX1: - errorCode = 0x1E020000; + errorCode = DJI_HMS_ERROR_CODE_VALUE0; break; case E_DJI_HMS_ERROR_CODE_INDEX2: - errorCode = 0x1E020001; + errorCode = DJI_HMS_ERROR_CODE_VALUE1; break; case E_DJI_HMS_ERROR_CODE_INDEX3: - errorCode = 0x1E020002; + errorCode = DJI_HMS_ERROR_CODE_VALUE2; break; case E_DJI_HMS_ERROR_CODE_INDEX4: - errorCode = 0x1E020003; + errorCode = DJI_HMS_ERROR_CODE_VALUE3; break; case E_DJI_HMS_ERROR_CODE_INDEX5: - errorCode = 0x1E020004; + errorCode = DJI_HMS_ERROR_CODE_VALUE4; break; default: break; diff --git a/samples/sample_c/platform/linux/common/osal/osal.c b/samples/sample_c/platform/linux/common/osal/osal.c index f70952b2..1cb0c22c 100644 --- a/samples/sample_c/platform/linux/common/osal/osal.c +++ b/samples/sample_c/platform/linux/common/osal/osal.c @@ -98,6 +98,10 @@ T_DjiReturnCode Osal_MutexCreate(T_DjiMutexHandle *mutex) { int result; + if (!mutex) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + *mutex = malloc(sizeof(pthread_mutex_t)); if (*mutex == NULL) { return DJI_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED; @@ -118,7 +122,11 @@ T_DjiReturnCode Osal_MutexCreate(T_DjiMutexHandle *mutex) */ T_DjiReturnCode Osal_MutexDestroy(T_DjiMutexHandle mutex) { - int result; + int result = 0; + + if (!mutex) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } result = pthread_mutex_destroy(mutex); if (result != 0) { @@ -136,8 +144,13 @@ T_DjiReturnCode Osal_MutexDestroy(T_DjiMutexHandle mutex) */ T_DjiReturnCode Osal_MutexLock(T_DjiMutexHandle mutex) { - int result = pthread_mutex_lock(mutex); + int result = 0; + + if (!mutex) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + result = pthread_mutex_lock(mutex); if (result != 0) { return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } @@ -152,8 +165,13 @@ T_DjiReturnCode Osal_MutexLock(T_DjiMutexHandle mutex) */ T_DjiReturnCode Osal_MutexUnlock(T_DjiMutexHandle mutex) { - int result = pthread_mutex_unlock(mutex); + int result = 0; + if (!mutex) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + + result = pthread_mutex_unlock(mutex); if (result != 0) { return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } @@ -308,6 +326,14 @@ T_DjiReturnCode Osal_GetTimeUs(uint64_t *us) return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; } +T_DjiReturnCode Osal_GetRandomNum(uint16_t *randomNum) +{ + srand(time(NULL)); + *randomNum = random() % 65535; + + return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; +} + void *Osal_Malloc(uint32_t size) { return malloc(size); diff --git a/samples/sample_c/platform/linux/common/osal/osal.h b/samples/sample_c/platform/linux/common/osal/osal.h index 954337cb..3b42cadc 100644 --- a/samples/sample_c/platform/linux/common/osal/osal.h +++ b/samples/sample_c/platform/linux/common/osal/osal.h @@ -63,6 +63,7 @@ T_DjiReturnCode Osal_SemaphorePost(T_DjiSemaHandle semaphore); T_DjiReturnCode Osal_GetTimeMs(uint32_t *ms); T_DjiReturnCode Osal_GetTimeUs(uint64_t *us); +T_DjiReturnCode Osal_GetRandomNum(uint16_t *randomNum); void *Osal_Malloc(uint32_t size); void Osal_Free(void *ptr); diff --git a/samples/sample_c/platform/linux/common/osal/osal_socket.c b/samples/sample_c/platform/linux/common/osal/osal_socket.c index db01feea..92735247 100644 --- a/samples/sample_c/platform/linux/common/osal/osal_socket.c +++ b/samples/sample_c/platform/linux/common/osal/osal_socket.c @@ -46,7 +46,7 @@ typedef struct { T_DjiReturnCode Osal_Socket(E_DjiSocketMode mode, T_DjiSocketHandle *socketHandle) { T_SocketHandleStruct *socketHandleStruct; - socklen_t optlen = sizeof(int); + socklen_t optlen = sizeof (int); int rcvBufSize = SOCKET_RECV_BUF_MAX_SIZE; int opt = 1; @@ -72,7 +72,8 @@ T_DjiReturnCode Osal_Socket(E_DjiSocketMode mode, T_DjiSocketHandle *socketHandl goto out; } - if (setsockopt(socketHandleStruct->socketFd, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, optlen) < 0) { + if (setsockopt(socketHandleStruct->socketFd, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, optlen) < 0) + { goto out; } } else if (mode == DJI_SOCKET_MODE_TCP) { diff --git a/samples/sample_c/platform/linux/manifold2/application/main.c b/samples/sample_c/platform/linux/manifold2/application/main.c index 767a8356..c647fbc3 100644 --- a/samples/sample_c/platform/linux/manifold2/application/main.c +++ b/samples/sample_c/platform/linux/manifold2/application/main.c @@ -81,6 +81,7 @@ static pthread_t s_monitorThread = 0; /* Private functions declaration ---------------------------------------------*/ static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void); +static T_DjiReturnCode DjiUser_CleanSystemEnvironment(void); static T_DjiReturnCode DjiUser_FillInUserInfo(T_DjiUserInfo *userInfo); static T_DjiReturnCode DjiUser_PrintConsole(const uint8_t *data, uint16_t dataLen); static T_DjiReturnCode DjiUser_LocalWrite(const uint8_t *data, uint16_t dataLen); @@ -180,7 +181,8 @@ int main(int argc, char **argv) #endif if (aircraftInfoBaseInfo.mountPosition == DJI_MOUNT_POSITION_EXTENSION_PORT && - aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK) { + (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK || + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK)) { returnCode = DjiTest_WidgetInteractionStartService(); if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { USER_LOG_ERROR("widget interaction sample init error"); @@ -190,6 +192,13 @@ int main(int argc, char **argv) if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { USER_LOG_ERROR("widget speaker test init error"); } + +#ifdef CONFIG_MODULE_SAMPLE_MOP_CHANNEL_ON + returnCode = DjiTest_MopChannelStartService(); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("mop channel sample init error"); + } +#endif } else { #ifdef CONFIG_MODULE_SAMPLE_CAMERA_EMU_ON returnCode = DjiTest_CameraEmuBaseStartService(); @@ -339,6 +348,7 @@ static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void) .Free = Osal_Free, .GetTimeMs = Osal_GetTimeMs, .GetTimeUs = Osal_GetTimeUs, + .GetRandomNum = Osal_GetRandomNum, }; T_DjiLoggerConsole printConsole = { @@ -466,6 +476,39 @@ static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void) return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; } +static T_DjiReturnCode DjiUser_CleanSystemEnvironment(void) +{ + T_DjiReturnCode returnCode; + T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo; + + returnCode = DjiAircraftInfo_GetBaseInfo(&aircraftInfoBaseInfo); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + USER_LOG_ERROR("get aircraft base info error"); + return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; + } + +#ifdef CONFIG_MODULE_SAMPLE_POWER_MANAGEMENT_ON + returnCode = DjiTest_PowerManagementStopService(); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + perror("power management deinit error"); + } +#endif + +#ifdef CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON + returnCode = DjiTest_DataTransmissionStopService(); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + perror("widget sample deinit error"); + } +#endif + + returnCode = DjiCore_DeInit(); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + perror("Core deinit failed."); + } + + return returnCode; +} + static T_DjiReturnCode DjiUser_FillInUserInfo(T_DjiUserInfo *userInfo) { if (userInfo == NULL) { @@ -689,7 +732,15 @@ static T_DjiReturnCode DjiTest_WriteHighPowerApplyPin(E_DjiPowerManagementPinSta static void DjiUser_NormalExitHandler(int signalNum) { + T_DjiReturnCode returnCode; + USER_UTIL_UNUSED(signalNum); + + returnCode = DjiUser_CleanSystemEnvironment(); + if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { + perror("Clean up system environment failed."); + } + exit(0); } diff --git a/samples/sample_c/platform/linux/manifold2/hal/hal_usb_bulk.c b/samples/sample_c/platform/linux/manifold2/hal/hal_usb_bulk.c index 8235171f..05281a6e 100644 --- a/samples/sample_c/platform/linux/manifold2/hal/hal_usb_bulk.c +++ b/samples/sample_c/platform/linux/manifold2/hal/hal_usb_bulk.c @@ -62,17 +62,19 @@ T_DjiReturnCode HalUsbBulk_Init(T_DjiHalUsbBulkInfo usbBulkInfo, T_DjiUsbBulkHan #ifdef LIBUSB_INSTALLED ret = libusb_init(NULL); if (ret < 0) { + USER_LOG_ERROR("init usb bulk failed, errno = %d", ret); return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } handle = libusb_open_device_with_vid_pid(NULL, usbBulkInfo.vid, usbBulkInfo.pid); if (handle == NULL) { + USER_LOG_ERROR("open usb device failed"); return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } ret = libusb_claim_interface(handle, usbBulkInfo.channelInfo.interfaceNum); if (ret != LIBUSB_SUCCESS) { - printf("libusb claim interface error"); + USER_LOG_ERROR("libusb claim interface failed, errno = %d", ret); libusb_close(handle); return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } @@ -114,6 +116,7 @@ T_DjiReturnCode HalUsbBulk_Init(T_DjiHalUsbBulkInfo usbBulkInfo, T_DjiUsbBulkHan T_DjiReturnCode HalUsbBulk_DeInit(T_DjiUsbBulkHandle usbBulkHandle) { struct libusb_device_handle *handle = NULL; + int32_t ret; T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler(); if (usbBulkHandle == NULL) { @@ -124,7 +127,11 @@ T_DjiReturnCode HalUsbBulk_DeInit(T_DjiUsbBulkHandle usbBulkHandle) if (((T_HalUsbBulkObj *) usbBulkHandle)->usbBulkInfo.isUsbHost == true) { #ifdef LIBUSB_INSTALLED - libusb_release_interface(handle, ((T_HalUsbBulkObj *) usbBulkHandle)->usbBulkInfo.channelInfo.interfaceNum); + ret = libusb_release_interface(handle, ((T_HalUsbBulkObj *) usbBulkHandle)->usbBulkInfo.channelInfo.interfaceNum); + if(ret != 0) { + USER_LOG_ERROR("release usb bulk interface failed, errno = %d", ret); + return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; + } osalHandler->TaskSleepMs(100); libusb_exit(NULL); #endif diff --git a/samples/sample_c/platform/linux/nvidia_jeston/CMakeLists.txt b/samples/sample_c/platform/linux/nvidia_jetson/CMakeLists.txt similarity index 98% rename from samples/sample_c/platform/linux/nvidia_jeston/CMakeLists.txt rename to samples/sample_c/platform/linux/nvidia_jetson/CMakeLists.txt index 858192de..255d1f39 100644 --- a/samples/sample_c/platform/linux/nvidia_jeston/CMakeLists.txt +++ b/samples/sample_c/platform/linux/nvidia_jetson/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.5) -project(dji_sdk_demo_on_jeston C) +project(dji_sdk_demo_on_jetson C) set(CMAKE_C_FLAGS "-pthread -std=gnu99") set(CMAKE_EXE_LINKER_FLAGS "-pthread") diff --git a/samples/sample_c/platform/linux/nvidia_jeston/application/dji_sdk_app_info.h b/samples/sample_c/platform/linux/nvidia_jetson/application/dji_sdk_app_info.h similarity index 100% rename from samples/sample_c/platform/linux/nvidia_jeston/application/dji_sdk_app_info.h rename to samples/sample_c/platform/linux/nvidia_jetson/application/dji_sdk_app_info.h diff --git a/samples/sample_c/platform/linux/nvidia_jeston/application/dji_sdk_config.h b/samples/sample_c/platform/linux/nvidia_jetson/application/dji_sdk_config.h similarity index 100% rename from samples/sample_c/platform/linux/nvidia_jeston/application/dji_sdk_config.h rename to samples/sample_c/platform/linux/nvidia_jetson/application/dji_sdk_config.h diff --git a/samples/sample_c/platform/linux/nvidia_jeston/application/main.c b/samples/sample_c/platform/linux/nvidia_jetson/application/main.c similarity index 99% rename from samples/sample_c/platform/linux/nvidia_jeston/application/main.c rename to samples/sample_c/platform/linux/nvidia_jetson/application/main.c index 4e769c49..bc49d711 100644 --- a/samples/sample_c/platform/linux/nvidia_jeston/application/main.c +++ b/samples/sample_c/platform/linux/nvidia_jetson/application/main.c @@ -337,6 +337,7 @@ static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void) .SemaphorePost = Osal_SemaphorePost, .Malloc = Osal_Malloc, .Free = Osal_Free, + .GetRandomNum = Osal_GetRandomNum, .GetTimeMs = Osal_GetTimeMs, .GetTimeUs = Osal_GetTimeUs, }; diff --git a/samples/sample_c/platform/linux/nvidia_jeston/hal/hal_network.c b/samples/sample_c/platform/linux/nvidia_jetson/hal/hal_network.c similarity index 100% rename from samples/sample_c/platform/linux/nvidia_jeston/hal/hal_network.c rename to samples/sample_c/platform/linux/nvidia_jetson/hal/hal_network.c diff --git a/samples/sample_c/platform/linux/nvidia_jeston/hal/hal_network.h b/samples/sample_c/platform/linux/nvidia_jetson/hal/hal_network.h similarity index 100% rename from samples/sample_c/platform/linux/nvidia_jeston/hal/hal_network.h rename to samples/sample_c/platform/linux/nvidia_jetson/hal/hal_network.h diff --git a/samples/sample_c/platform/linux/nvidia_jeston/hal/hal_uart.c b/samples/sample_c/platform/linux/nvidia_jetson/hal/hal_uart.c similarity index 100% rename from samples/sample_c/platform/linux/nvidia_jeston/hal/hal_uart.c rename to samples/sample_c/platform/linux/nvidia_jetson/hal/hal_uart.c diff --git a/samples/sample_c/platform/linux/nvidia_jeston/hal/hal_uart.h b/samples/sample_c/platform/linux/nvidia_jetson/hal/hal_uart.h similarity index 100% rename from samples/sample_c/platform/linux/nvidia_jeston/hal/hal_uart.h rename to samples/sample_c/platform/linux/nvidia_jetson/hal/hal_uart.h diff --git a/samples/sample_c/platform/linux/nvidia_jeston/hal/hal_usb_bulk.c b/samples/sample_c/platform/linux/nvidia_jetson/hal/hal_usb_bulk.c similarity index 100% rename from samples/sample_c/platform/linux/nvidia_jeston/hal/hal_usb_bulk.c rename to samples/sample_c/platform/linux/nvidia_jetson/hal/hal_usb_bulk.c diff --git a/samples/sample_c/platform/linux/nvidia_jeston/hal/hal_usb_bulk.h b/samples/sample_c/platform/linux/nvidia_jetson/hal/hal_usb_bulk.h similarity index 100% rename from samples/sample_c/platform/linux/nvidia_jeston/hal/hal_usb_bulk.h rename to samples/sample_c/platform/linux/nvidia_jetson/hal/hal_usb_bulk.h diff --git a/samples/sample_c/platform/rtos_freertos/common/osal/osal.c b/samples/sample_c/platform/rtos_freertos/common/osal/osal.c index 4f23c399..5f3ac21d 100644 --- a/samples/sample_c/platform/rtos_freertos/common/osal/osal.c +++ b/samples/sample_c/platform/rtos_freertos/common/osal/osal.c @@ -28,6 +28,7 @@ #include "FreeRTOS.h" #include "task.h" #include "semphr.h" +#include "stdlib.h" /* Private constants ---------------------------------------------------------*/ #define SEM_MUTEX_WAIT_FOREVER 0xFFFFFFFF @@ -64,6 +65,10 @@ T_DjiReturnCode Osal_TaskCreate(const char *name, void *(*taskFunc)(void *), uin T_DjiReturnCode Osal_TaskDestroy(T_DjiTaskHandle task) { + if (task == NULL) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + vTaskDelete(task); return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; @@ -83,6 +88,10 @@ T_DjiReturnCode Osal_TaskSleepMs(uint32_t timeMs) T_DjiReturnCode Osal_MutexCreate(T_DjiMutexHandle *mutex) { + if (mutex == NULL) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + *mutex = xSemaphoreCreateMutex(); if (*mutex == NULL) { return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; @@ -93,6 +102,10 @@ T_DjiReturnCode Osal_MutexCreate(T_DjiMutexHandle *mutex) T_DjiReturnCode Osal_MutexDestroy(T_DjiMutexHandle mutex) { + if (mutex == NULL) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + vQueueDelete((SemaphoreHandle_t) mutex); return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; @@ -117,6 +130,10 @@ T_DjiReturnCode Osal_MutexLock(T_DjiMutexHandle mutex) T_DjiReturnCode Osal_MutexUnlock(T_DjiMutexHandle mutex) { + if (mutex == NULL) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + if (xSemaphoreGive(mutex) != pdTRUE) { return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; } @@ -128,6 +145,10 @@ T_DjiReturnCode Osal_SemaphoreCreate(uint32_t initValue, T_DjiSemaHandle *semaph { uint32_t maxCount = UINT_MAX; + if (semaphore == NULL) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + *semaphore = xSemaphoreCreateCounting(maxCount, initValue); if (*semaphore == NULL) { @@ -139,6 +160,10 @@ T_DjiReturnCode Osal_SemaphoreCreate(uint32_t initValue, T_DjiSemaHandle *semaph T_DjiReturnCode Osal_SemaphoreDestroy(T_DjiSemaHandle semaphore) { + if (semaphore == NULL) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + vSemaphoreDelete(semaphore); return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; @@ -177,6 +202,10 @@ T_DjiReturnCode Osal_SemaphoreWait(T_DjiSemaHandle semaphore) T_DjiReturnCode Osal_SemaphorePost(T_DjiSemaHandle semaphore) { + if (semaphore == NULL) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + if (xSemaphoreGive(semaphore) != pdTRUE) { return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; } @@ -186,6 +215,10 @@ T_DjiReturnCode Osal_SemaphorePost(T_DjiSemaHandle semaphore) T_DjiReturnCode Osal_GetTimeMs(uint32_t *ms) { + if (ms == NULL) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + *ms = xTaskGetTickCount(); return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; @@ -193,11 +226,22 @@ T_DjiReturnCode Osal_GetTimeMs(uint32_t *ms) T_DjiReturnCode Osal_GetTimeUs(uint64_t *us) { + if (us == NULL) { + return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; + } + *us = xTaskGetTickCount() * 1000; return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; } +T_DjiReturnCode Osal_GetRandomNum(uint16_t *randomNum) +{ + *randomNum = rand() % 65535; + + return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; +} + void *Osal_Malloc(uint32_t size) { return pvPortMalloc(size); diff --git a/samples/sample_c/platform/rtos_freertos/common/osal/osal.h b/samples/sample_c/platform/rtos_freertos/common/osal/osal.h index 6cda9b02..88f58a11 100644 --- a/samples/sample_c/platform/rtos_freertos/common/osal/osal.h +++ b/samples/sample_c/platform/rtos_freertos/common/osal/osal.h @@ -43,35 +43,21 @@ extern "C" { /* Exported functions --------------------------------------------------------*/ T_DjiReturnCode Osal_TaskCreate(const char *name, void *(*taskFunc)(void *), uint32_t stackSize, void *arg, T_DjiTaskHandle *task); - T_DjiReturnCode Osal_TaskDestroy(T_DjiTaskHandle task); - T_DjiReturnCode Osal_TaskSleepMs(uint32_t timeMs); - T_DjiReturnCode Osal_MutexCreate(T_DjiMutexHandle *mutex); - T_DjiReturnCode Osal_MutexDestroy(T_DjiMutexHandle mutex); - T_DjiReturnCode Osal_MutexLock(T_DjiMutexHandle mutex); - T_DjiReturnCode Osal_MutexUnlock(T_DjiMutexHandle mutex); - T_DjiReturnCode Osal_SemaphoreCreate(uint32_t initValue, T_DjiSemaHandle *semaphore); - T_DjiReturnCode Osal_SemaphoreDestroy(T_DjiSemaHandle semaphore); - T_DjiReturnCode Osal_SemaphoreTimedWait(T_DjiSemaHandle semaphore, uint32_t waitTimeMs); - T_DjiReturnCode Osal_SemaphoreWait(T_DjiSemaHandle semaphore); - T_DjiReturnCode Osal_SemaphorePost(T_DjiSemaHandle semaphore); - T_DjiReturnCode Osal_GetTimeMs(uint32_t *ms); - T_DjiReturnCode Osal_GetTimeUs(uint64_t *us); - +T_DjiReturnCode Osal_GetRandomNum(uint16_t *randomNum); void *Osal_Malloc(uint32_t size); - void Osal_Free(void *ptr); #ifdef __cplusplus diff --git a/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/application/application.c b/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/application/application.c index bfb0379c..3e39d0c9 100644 --- a/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/application/application.c +++ b/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/application/application.c @@ -97,6 +97,7 @@ void DjiUser_StartTask(void const *argument) .Free = Osal_Free, .GetTimeMs = Osal_GetTimeMs, .GetTimeUs = Osal_GetTimeUs, + .GetRandomNum = Osal_GetRandomNum, }; T_DjiLoggerConsole printConsole = { .func = DjiUser_PrintConsole, @@ -247,7 +248,8 @@ void DjiUser_StartTask(void const *argument) #endif #ifdef CONFIG_MODULE_SAMPLE_GIMBAL_EMU_ON - if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK + if ((aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK || + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) && aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_NONE) { USER_LOG_WARN("Not support gimbal emu sample."); } else { @@ -294,7 +296,8 @@ void DjiUser_StartTask(void const *argument) #endif #ifdef CONFIG_MODULE_SAMPLE_POSITIONING_ON - if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK + if ((aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK || + aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) && aircraftInfoBaseInfo.mountPosition != DJI_MOUNT_POSITION_TYPE_EXTENSION_PORT) { if (DjiTest_PositioningStartService() != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { USER_LOG_ERROR("psdk positioning init error"); diff --git a/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/drivers/BSP/uart.c b/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/drivers/BSP/uart.c index 18ef160d..56d8cfc9 100644 --- a/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/drivers/BSP/uart.c +++ b/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/drivers/BSP/uart.c @@ -40,7 +40,7 @@ #define UART1_WRITE_BUF_SIZE 64 #define UART2_READ_BUF_SIZE 64 #define UART2_WRITE_BUF_SIZE 2048 -#define UART3_READ_BUF_SIZE 4096 +#define UART3_READ_BUF_SIZE 8192 #define UART3_WRITE_BUF_SIZE 2048 /* Private macro -------------------------------------------------------------*/ diff --git a/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/drivers/BSP/upgrade_platform_opt_stm32.c b/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/drivers/BSP/upgrade_platform_opt_stm32.c index 81475aa5..cde7cd1a 100644 --- a/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/drivers/BSP/upgrade_platform_opt_stm32.c +++ b/samples/sample_c/platform/rtos_freertos/stm32f4_discovery/drivers/BSP/upgrade_platform_opt_stm32.c @@ -81,11 +81,15 @@ T_DjiReturnCode DjiUpgradePlatformStm32_WriteUpgradeProgramFile(uint32_t offset, { uint32_t result; + __disable_irq(); + result = FLASH_If_Write(APPLICATION_STORE_ADDRESS + offset, (uint8_t *) data, dataLen); if (result != FLASHIF_OK) { return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; } + __enable_irq(); + return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; }