NEW: release DJI Payload-SDK version 3.1

Signed-off-by: DJI-Martin <DJI-Martin@dji.com>
This commit is contained in:
DJI-Martin
2022-03-21 22:25:37 +08:00
parent 7b5f853e87
commit 0e06bc3fd3
62 changed files with 9042 additions and 348 deletions

View File

@ -1,6 +1,6 @@
# DJI Payload SDK (PSDK) # DJI Payload SDK (PSDK)
![](https://img.shields.io/badge/version-V3.0.0-orange.svg) ![](https://img.shields.io/badge/version-V3.1.0-orange.svg)
![](https://img.shields.io/badge/platform-linux_|_rtos-green.svg) ![](https://img.shields.io/badge/platform-linux_|_rtos-green.svg)
![](https://img.shields.io/badge/license-MIT-blue.svg) ![](https://img.shields.io/badge/license-MIT-blue.svg)
[![Join the chat at https://gitter.im/dji-sdk/Payload-SDK](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/dji-sdk/Payload-SDK?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Join the chat at https://gitter.im/dji-sdk/Payload-SDK](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/dji-sdk/Payload-SDK?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
@ -20,12 +20,12 @@ Documentation regarding the code can be found in the [PSDK API Reference](https:
Please visit the [Latest Version Information](https://developer.dji.com/payload-sdk/documentation/appendix/firmware.html) to get the latest version information. Please visit the [Latest Version Information](https://developer.dji.com/payload-sdk/documentation/appendix/firmware.html) to get the latest version information.
## Latest Release ## Latest Release
PSDK 3.0.0 was released on 20 October 2021. This version inherit the PSDK 2.2.1 existing functions (use X-Port or Skyport-V2
to develop payload), and add extension port existing functions(based on OSDK 4.1.0) support, add the DJI offline certificate PSDK 3.1.0 was released on 21 March 2022. This version of Payload SDK mainly add some features support, such as add the
support, add the serial port baud rate adaptive support, add the arrest-flying feature support in flight-controller module, Matrice 30/30T support, add the standard speaker widget support on M30/M30T, add the waypoint 3.0 support on M30/30T, add the
add the custom widget feature support on extend port, add the remote controller custom button mapping function support, get camera laser ranging data support on M30/30T, add the power-off notification support on M300 RTK OSDK port, etc. At
add the DJI L1/P1 camera support in camera-manager module. Also enhance the camera media file download speed and fix some the same time, we also fixed some bugs on the last version, add more sample support and add ESP32 toolchain support.
bugs on the last version. At the same time, add more api sample support and more toolchain support. Please refer to the release notes for detailed changes list.
## License ## License

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -509,6 +509,17 @@ typedef struct {
uint8_t progressInPercent; uint8_t progressInPercent;
} T_DjiDownloadFilePacketInfo; } 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;
bool exception;
} T_DjiCameraManagerLaserRangingInfo;
typedef T_DjiReturnCode (*DjiCameraManagerDownloadFileDataCallback)(T_DjiDownloadFilePacketInfo packetInfo, typedef T_DjiReturnCode (*DjiCameraManagerDownloadFileDataCallback)(T_DjiDownloadFilePacketInfo packetInfo,
const uint8_t *data, const uint8_t *data,
uint16_t dataLen); uint16_t dataLen);
@ -976,6 +987,14 @@ T_DjiReturnCode DjiCameraManager_DownloadFileByIndex(E_DjiMountPosition position
*/ */
T_DjiReturnCode DjiCameraManager_DeleteFileByIndex(E_DjiMountPosition position, uint32_t fileIndex); T_DjiReturnCode DjiCameraManager_DeleteFileByIndex(E_DjiMountPosition position, uint32_t fileIndex);
/**
* @brief Get the camera laser ranging info of the selected camera mounted position.
* @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);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -55,7 +55,7 @@ typedef struct {
/* Exported functions --------------------------------------------------------*/ /* Exported functions --------------------------------------------------------*/
/** /**
* @brief Initialize the Onboard SDK core in blocking mode. * @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 * @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 * 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 * initialized at the beginning of calling other functional module interfaces. You need to fill in the developer
@ -82,7 +82,7 @@ T_DjiReturnCode DjiCore_Init(const T_DjiUserInfo *userInfo);
T_DjiReturnCode DjiCore_SetAlias(const char *productAlias); T_DjiReturnCode DjiCore_SetAlias(const char *productAlias);
/** /**
* @brief Notify that the Onboard SDK core application starts. * @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 * @note The call location of this interface requires special attention, The call needs to be completed after all the
* module initialize and register interfaces. * module initialize and register interfaces.
* @return Execution result. * @return Execution result.

View File

@ -90,6 +90,7 @@ typedef enum {
DJI_AIRCRAFT_SERIES_UNKNOWN = 0, DJI_AIRCRAFT_SERIES_UNKNOWN = 0,
DJI_AIRCRAFT_SERIES_M200_V2 = 1, DJI_AIRCRAFT_SERIES_M200_V2 = 1,
DJI_AIRCRAFT_SERIES_M300 = 2, DJI_AIRCRAFT_SERIES_M300 = 2,
DJI_AIRCRAFT_SERIES_M30 = 3,
} E_DjiAircraftSeries; } E_DjiAircraftSeries;
typedef enum { typedef enum {
@ -98,6 +99,8 @@ typedef enum {
DJI_AIRCRAFT_TYPE_M210_V2 = 45, /*!< Aircraft type is Matrice 220 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_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_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. */
} E_DjiAircraftType; } E_DjiAircraftType;
/** /**
@ -113,6 +116,8 @@ typedef enum {
DJI_CAMERA_TYPE_H20T = 43, /*!< Camera type is H20T. */ DJI_CAMERA_TYPE_H20T = 43, /*!< Camera type is H20T. */
DJI_CAMERA_TYPE_P1 = 50, /*!< Camera type is P1. */ DJI_CAMERA_TYPE_P1 = 50, /*!< Camera type is P1. */
DJI_CAMERA_TYPE_L1, /*!< Camera type is L1. */ DJI_CAMERA_TYPE_L1, /*!< Camera type is L1. */
DJI_CAMERA_TYPE_M30, /*!< Camera type is M30. */
DJI_CAMERA_TYPE_M30T, /*!< Camera type is M30T. */
} E_DjiCameraType; } E_DjiCameraType;
/** /**

View File

@ -28,24 +28,21 @@
#define DJI_VERSION_H #define DJI_VERSION_H
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* Exported constants --------------------------------------------------------*/ /* 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_MAJOR 3 /*!< DJI SDK major version num, when have incompatible API changes. Range from 0 to 99. */
#define DJI_VERSION_MINOR 0 /*!< DJI SDK minor version num, when add functionality in a backwards compatible manner changes. Range from 0 to 99. */ #define DJI_VERSION_MINOR 1 /*!< 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_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_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 1462 /*!< DJI SDK version build info, when jenkins trigger build changes. Range from 0 to 65535. */ #define DJI_VERSION_BUILD 1491 /*!< DJI SDK version build info, when jenkins trigger build changes. Range from 0 to 65535. */
/* Exported types ------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/ /* Exported functions --------------------------------------------------------*/
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -36,9 +36,11 @@ extern "C" {
#endif #endif
/* Exported constants --------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/
typedef T_DjiReturnCode (*WaypointV2EventCbFunc)(T_DjiWaypointV2MissionEventPush eventData); typedef T_DjiReturnCode (*WaypointV2EventCbFunc)(T_DjiWaypointV2MissionEventPush eventData);
typedef T_DjiReturnCode (*WaypointV2StateCbFunc)(T_DjiWaypointV2MissionStatePush stateData); typedef T_DjiReturnCode (*WaypointV2StateCbFunc)(T_DjiWaypointV2MissionStatePush stateData);
/* Exported functions --------------------------------------------------------*/ /* Exported functions --------------------------------------------------------*/
/** /**
* @brief Initialise waypoint v2 module, and user should call this function * @brief Initialise waypoint v2 module, and user should call this function

View File

@ -0,0 +1,122 @@
/**
********************************************************************
* @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 DJIs 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 aircraft state.
*/
typedef enum {
DJI_WAYPOINT_V3_STATE_IDLE = 0, /*!< Waypoint v3 aircraft in idle state. */
DJI_WAYPOINT_V3_STATE_PREPARE = 16, /*!< Waypoint v3 aircraft in prepare state. */
DJI_WAYPOINT_V3_STATE_TRANS_MISSION = 32, /*!< Waypoint v3 aircraft in trans mission state. */
DJI_WAYPOINT_V3_STATE_MISSION = 48, /*!< Waypoint v3 aircraft in mission state. */
DJI_WAYPOINT_V3_STATE_BREAK = 64, /*!< Waypoint v3 aircraft in break state. */
DJI_WAYPOINT_V3_STATE_RESUME = 80, /*!< Waypoint v3 aircraft in resume state. */
DJI_WAYPOINT_V3_STATE_RETURN_FIRSTPOINT = 98, /*!< Waypoint v3 aircraft in return first point state. */
} E_DjiWaypointV3State;
/**
* Waypoint v3 mission state.
*/
typedef struct {
E_DjiWaypointV3State state; /*!< Waypoint v3 current aircraft state, #E_DjiWaypointV3State. */
uint32_t wayLineId; /*!< Waypoint v3 current way line id. */
uint16_t currentWaypointIndex; /*!< Waypoint v3 current waypoint index. */
} T_DjiWaypointV3MissionState;
/**
* @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 (*WaypointV3StateCallback)(T_DjiWaypointV3MissionState 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(WaypointV3StateCallback callback);
#ifdef __cplusplus
}
#endif
#endif // DJI_WAYPOINT_V3_H
/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/

View File

@ -66,6 +66,42 @@ typedef enum {
DJI_WIDGET_SWITCH_STATE_ON = 1 /*!< Switch is turned on */ DJI_WIDGET_SWITCH_STATE_ON = 1 /*!< Switch is turned on */
} E_DjiWidgetSwitchState; } E_DjiWidgetSwitchState;
/**
* @brief Switch widget speaker work mode.
*/
typedef enum {
DJI_WIDGET_SPEAKER_WORK_MODE_TTS,
DJI_WIDGET_SPEAKER_WORK_MODE_VOICE,
} E_DjiWidgetSpeakerWorkMode;
/**
* @brief Switch widget speaker play mode.
*/
typedef enum {
DJI_WIDGET_SPEAKER_PLAY_MODE_SINGLE_PLAY,
DJI_WIDGET_SPEAKER_PLAY_MODE_LOOP_PLAYBACK,
} E_DjiWidgetSpeakerPlayMode;
/**
* @brief Switch widget speaker state.
*/
typedef enum {
DJI_WIDGET_SPEAKER_STATE_IDEL,
DJI_WIDGET_SPEAKER_STATE_TRANSMITTING,
DJI_WIDGET_SPEAKER_STATE_PLAYING,
DJI_WIDGET_SPEAKER_STATE_ERROR,
} 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. * @brief Widget file binary array.
*/ */
@ -132,6 +168,45 @@ typedef struct {
void *userData; void *userData;
} T_DjiWidgetHandlerListItem; } T_DjiWidgetHandlerListItem;
typedef struct {
uint16_t size;
uint32_t uuid;
uint8_t md5Sum[16];
} T_DjiWidgetTtsDataInfo;
typedef struct {
uint16_t size;
uint32_t uuid;
uint8_t md5Sum[16];
} T_DjiWidgetVoiceDataInfo;
typedef struct {
E_DjiWidgetSpeakerState state;
E_DjiWidgetSpeakerWorkMode workMode;
E_DjiWidgetSpeakerPlayMode playMode;
uint8_t volume;
uint32_t uuid;
} T_DjiWidgetSpeakerState;
typedef struct {
T_DjiReturnCode (*GetSpeakerState)(T_DjiWidgetSpeakerState *speakerState);
T_DjiReturnCode (*SetWorkMode)(E_DjiWidgetSpeakerWorkMode workMode);
T_DjiReturnCode (*GetWorkMode)(E_DjiWidgetSpeakerWorkMode *workMode);
T_DjiReturnCode (*SetPlayMode)(E_DjiWidgetSpeakerPlayMode playMode);
T_DjiReturnCode (*GetPlayMode)(E_DjiWidgetSpeakerPlayMode *playMode);
T_DjiReturnCode (*SetVolume)(uint8_t volume);
T_DjiReturnCode (*GetVolume)(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 --------------------------------------------------------*/ /* Exported functions --------------------------------------------------------*/
/** /**
* @brief Initialise widget module, and user should call this function before using widget features. * @brief Initialise widget module, and user should call this function before using widget features.
@ -215,6 +290,15 @@ T_DjiReturnCode DjiWidgetFloatingWindow_ShowMessage(const char *str);
*/ */
T_DjiReturnCode DjiWidgetFloatingWindow_GetChannelState(T_DjiDataChannelState *state); 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 #ifdef __cplusplus
} }
#endif #endif

View File

@ -25,6 +25,7 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include <stdexcept> #include <stdexcept>
#include "test_perception.hpp" #include "test_perception.hpp"
#include "dji_logger.h"
/* Private constants ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/
@ -41,6 +42,11 @@ PerceptionSample::PerceptionSample()
returnCode = DjiPerception_Init(); returnCode = DjiPerception_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
if (returnCode == DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT) {
USER_LOG_ERROR("Perception feature will support on later version.");
}
throw std::runtime_error("Perception init failed"); throw std::runtime_error("Perception init failed");
} }
} }

View File

@ -0,0 +1,272 @@
/**
********************************************************************
* @file osal_socket.c
* @brief
*
* @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 DJIs 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.
*
*********************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "osal_socket.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "stdlib.h"
/* Private constants ---------------------------------------------------------*/
typedef struct {
int socketFd;
} T_SocketHandleStruct;
/* Private types -------------------------------------------------------------*/
/* Private values -------------------------------------------------------------*/
/* Private functions declaration ---------------------------------------------*/
/* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode Osal_Socket(E_DjiSocketMode mode, T_DjiSocketHandle *socketHandle)
{
T_SocketHandleStruct *socketHandleStruct;
if (socketHandle == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
socketHandleStruct = malloc(sizeof(T_SocketHandleStruct));
if (socketHandleStruct == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
}
if (mode == DJI_SOCKET_MODE_UDP) {
socketHandleStruct->socketFd = socket(PF_INET, SOCK_DGRAM, 0);
} else if (mode == DJI_SOCKET_MODE_TCP) {
socketHandleStruct->socketFd = socket(PF_INET, SOCK_STREAM, 0);
} else {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
*socketHandle = socketHandleStruct;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode Osal_Close(T_DjiSocketHandle socketHandle)
{
T_SocketHandleStruct *socketHandleStruct = (T_SocketHandleStruct *) socketHandle;
int32_t ret;
if (socketHandleStruct->socketFd <= 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
ret = close(socketHandleStruct->socketFd);
if (ret < 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode Osal_Bind(T_DjiSocketHandle socketHandle, const char *ipAddr, uint32_t port)
{
T_SocketHandleStruct *socketHandleStruct = (T_SocketHandleStruct *) socketHandle;
struct sockaddr_in addr;
int32_t ret;
if (socketHandle == NULL || ipAddr == NULL || port == 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ipAddr);
ret = bind(socketHandleStruct->socketFd, (struct sockaddr *) &addr, sizeof(struct sockaddr_in));
if (ret < 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode Osal_UdpSendData(T_DjiSocketHandle socketHandle, const char *ipAddr, uint32_t port,
const uint8_t *buf, uint32_t len, uint32_t *realLen)
{
struct sockaddr_in addr;
T_SocketHandleStruct *socketHandleStruct = (T_SocketHandleStruct *) socketHandle;
int32_t ret;
if (socketHandle <= 0 || ipAddr == NULL || port == 0 || buf == NULL || len == 0 || realLen == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ipAddr);
ret = sendto(socketHandleStruct->socketFd, buf, len, 0, (struct sockaddr *) &addr, sizeof(struct sockaddr_in));
if (ret >= 0) {
*realLen = ret;
} else {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode Osal_UdpRecvData(T_DjiSocketHandle socketHandle, char *ipAddr, uint32_t *port,
uint8_t *buf, uint32_t len, uint32_t *realLen)
{
struct sockaddr_in addr;
T_SocketHandleStruct *socketHandleStruct = (T_SocketHandleStruct *) socketHandle;
uint32_t addrLen = 0;
int32_t ret;
if (socketHandle == NULL || ipAddr == NULL || port == 0 || buf == NULL || len == 0 || realLen == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
ret = recvfrom(socketHandleStruct->socketFd, buf, len, 0, (struct sockaddr *) &addr, &addrLen);
if (ret >= 0) {
*realLen = ret;
strcpy(ipAddr, inet_ntoa(addr.sin_addr));
*port = ntohs(addr.sin_port);
} else {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode Osal_TcpListen(T_DjiSocketHandle socketHandle)
{
int32_t ret;
T_SocketHandleStruct *socketHandleStruct = (T_SocketHandleStruct *) socketHandle;
if (socketHandle == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
ret = listen(socketHandleStruct->socketFd, 5);
if (ret < 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode Osal_TcpAccept(T_DjiSocketHandle socketHandle, char *ipAddr, uint32_t *port,
T_DjiSocketHandle *outSocketHandle)
{
T_SocketHandleStruct *socketHandleStruct = (T_SocketHandleStruct *) socketHandle;
T_SocketHandleStruct *outSocketHandleStruct;
struct sockaddr_in addr;
uint32_t addrLen = 0;
if (socketHandle == NULL || ipAddr == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
outSocketHandleStruct = malloc(sizeof(T_SocketHandleStruct));
if (outSocketHandleStruct == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
}
outSocketHandleStruct->socketFd = accept(socketHandleStruct->socketFd, (struct sockaddr *) &addr, &addrLen);
if (outSocketHandleStruct->socketFd < 0) {
free(outSocketHandleStruct);
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
*port = ntohs(addr.sin_port);
*outSocketHandle = outSocketHandleStruct;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode Osal_TcpConnect(T_DjiSocketHandle socketHandle, const char *ipAddr, uint32_t port)
{
struct sockaddr_in addr;
T_SocketHandleStruct *socketHandleStruct = (T_SocketHandleStruct *) socketHandle;
int32_t ret;
if (socketHandle == NULL || ipAddr == NULL || port == 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ipAddr);
ret = connect(socketHandleStruct->socketFd, (struct sockaddr *) &addr, sizeof(struct sockaddr_in));
if (ret < 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode Osal_TcpSendData(T_DjiSocketHandle socketHandle,
const uint8_t *buf, uint32_t len, uint32_t *realLen)
{
T_SocketHandleStruct *socketHandleStruct = (T_SocketHandleStruct *) socketHandle;
int32_t ret;
if (socketHandle == NULL || buf == NULL || len == 0 || realLen == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
ret = send(socketHandleStruct->socketFd, buf, len, 0);
if (ret >= 0) {
*realLen = ret;
} else {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode Osal_TcpRecvData(T_DjiSocketHandle socketHandle,
uint8_t *buf, uint32_t len, uint32_t *realLen)
{
T_SocketHandleStruct *socketHandleStruct = (T_SocketHandleStruct *) socketHandle;
int32_t ret;
if (socketHandle == NULL || buf == NULL || len == 0 || realLen == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
ret = recv(socketHandleStruct->socketFd, buf, len, 0);
if (ret >= 0) {
*realLen = ret;
} else {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/* Private functions definition-----------------------------------------------*/
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/

View File

@ -0,0 +1,72 @@
/**
********************************************************************
* @file osal_socket.h
* @brief This is the header file for "osal_socket.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 DJIs 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 OSAL_SOCKET_H
#define OSAL_SOCKET_H
/* Includes ------------------------------------------------------------------*/
#include "dji_platform.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_DjiReturnCode Osal_Socket(E_DjiSocketMode mode, T_DjiSocketHandle *socketHandle);
T_DjiReturnCode Osal_Close(T_DjiSocketHandle socketHandle);
T_DjiReturnCode Osal_Bind(T_DjiSocketHandle socketHandle, const char *ipAddr, uint32_t port);
T_DjiReturnCode Osal_UdpSendData(T_DjiSocketHandle socketHandle, const char *ipAddr, uint32_t port,
const uint8_t *buf, uint32_t len, uint32_t *realLen);
T_DjiReturnCode Osal_UdpRecvData(T_DjiSocketHandle socketHandle, char *ipAddr, uint32_t *port,
uint8_t *buf, uint32_t len, uint32_t *realLen);
T_DjiReturnCode Osal_TcpListen(T_DjiSocketHandle socketHandle);
T_DjiReturnCode Osal_TcpAccept(T_DjiSocketHandle socketHandle, char *ipAddr, uint32_t *port,
T_DjiSocketHandle *outSocketHandle);
T_DjiReturnCode Osal_TcpConnect(T_DjiSocketHandle socketHandle, const char *ipAddr, uint32_t port);
T_DjiReturnCode Osal_TcpSendData(T_DjiSocketHandle socketHandle,
const uint8_t *buf, uint32_t len, uint32_t *realLen);
T_DjiReturnCode Osal_TcpRecvData(T_DjiSocketHandle socketHandle,
uint8_t *buf, uint32_t len, uint32_t *realLen);
#ifdef __cplusplus
}
#endif
#endif // OSAL_SOCKET_H
/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/

View File

@ -26,11 +26,13 @@ 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") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -lgcov")
include_directories(../../../module_sample) include_directories(../../../module_sample)
include_directories(../../../../sample_c/module_sample)
include_directories(../common) include_directories(../common)
file(GLOB_RECURSE MODULE_SAMPLE_SRC file(GLOB_RECURSE MODULE_SAMPLE_SRC
../../../module_sample/liveview/*.c* ../../../module_sample/liveview/*.c*
../../../module_sample/perception/*.c* ../../../module_sample/perception/*.c*
../../../../sample_c/module_sample/*.c
) )
file(GLOB_RECURSE MODULE_COMMON_SRC ../common/*.c*) file(GLOB_RECURSE MODULE_COMMON_SRC ../common/*.c*)
file(GLOB_RECURSE MODULE_HAL_SRC hal/*.c*) file(GLOB_RECURSE MODULE_HAL_SRC hal/*.c*)

View File

@ -32,8 +32,9 @@
#include "../common/osal/osal.h" #include "../common/osal/osal.h"
#include "../common/osal/osal_fs.h" #include "../common/osal/osal_fs.h"
#include "../manifold2//hal/hal_usb_bulk.h" #include "../common/osal/osal_socket.h"
#include "../manifold2//hal/hal_uart.h" #include "../manifold2/hal/hal_usb_bulk.h"
#include "../manifold2/hal/hal_uart.h"
/* Private constants ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/
#define DJI_LOG_PATH "Logs/DJI" #define DJI_LOG_PATH "Logs/DJI"
@ -41,7 +42,7 @@
#define DJI_LOG_FOLDER_NAME "Logs" #define DJI_LOG_FOLDER_NAME "Logs"
#define DJI_LOG_PATH_MAX_SIZE (128) #define DJI_LOG_PATH_MAX_SIZE (128)
#define DJI_LOG_FOLDER_NAME_MAX_SIZE (32) #define DJI_LOG_FOLDER_NAME_MAX_SIZE (32)
#define DJI_SYSTEM_CMD_STR_MAX_SIZE (64) #define DJI_LOG_SYSTEM_CMD_MAX_SIZE (64)
#define DJI_LOG_MAX_COUNT (10) #define DJI_LOG_MAX_COUNT (10)
#define USER_UTIL_UNUSED(x) ((x) = (x)) #define USER_UTIL_UNUSED(x) ((x) = (x))
@ -62,7 +63,7 @@ Application::Application(int argc, char **argv)
Application::DjiUser_SetupEnvironment(); Application::DjiUser_SetupEnvironment();
Application::DjiUser_ApplicationStart(); Application::DjiUser_ApplicationStart();
Osal_TaskSleepMs(1000); Osal_TaskSleepMs(3000);
} }
Application::~Application() Application::~Application()
@ -78,6 +79,18 @@ void Application::DjiUser_SetupEnvironment()
T_DjiLoggerConsole printConsole; T_DjiLoggerConsole printConsole;
T_DjiLoggerConsole localRecordConsole; T_DjiLoggerConsole localRecordConsole;
T_DjiFileSystemHandler fileSystemHandler; T_DjiFileSystemHandler fileSystemHandler;
T_DjiSocketHandler socketHandler;
socketHandler.Socket = Osal_Socket;
socketHandler.Bind = Osal_Bind;
socketHandler.Close = Osal_Close;
socketHandler.UdpSendData = Osal_UdpSendData;
socketHandler.UdpRecvData = Osal_UdpRecvData;
socketHandler.TcpListen = Osal_TcpListen;
socketHandler.TcpAccept = Osal_TcpAccept;
socketHandler.TcpConnect = Osal_TcpConnect;
socketHandler.TcpSendData = Osal_TcpSendData;
socketHandler.TcpRecvData = Osal_TcpRecvData;
osalHandler.TaskCreate = Osal_TaskCreate; osalHandler.TaskCreate = Osal_TaskCreate;
osalHandler.TaskDestroy = Osal_TaskDestroy; osalHandler.TaskDestroy = Osal_TaskDestroy;
@ -145,6 +158,11 @@ void Application::DjiUser_SetupEnvironment()
throw std::runtime_error("Register hal usb bulk handler error."); throw std::runtime_error("Register hal usb bulk handler error.");
} }
returnCode = DjiPlatform_RegSocketHandler(&socketHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
throw std::runtime_error("register osal socket handler error");
}
returnCode = DjiPlatform_RegFileSystemHandler(&fileSystemHandler); returnCode = DjiPlatform_RegFileSystemHandler(&fileSystemHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
throw std::runtime_error("Register osal filesystem handler error."); throw std::runtime_error("Register osal filesystem handler error.");
@ -272,7 +290,7 @@ T_DjiReturnCode Application::DjiUser_LocalWriteFsInit(const char *path)
{ {
T_DjiReturnCode djiReturnCode = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; T_DjiReturnCode djiReturnCode = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
char filePath[DJI_LOG_PATH_MAX_SIZE]; char filePath[DJI_LOG_PATH_MAX_SIZE];
char systemCmd[DJI_SYSTEM_CMD_STR_MAX_SIZE]; char systemCmd[DJI_LOG_SYSTEM_CMD_MAX_SIZE];
char folderName[DJI_LOG_FOLDER_NAME_MAX_SIZE]; char folderName[DJI_LOG_FOLDER_NAME_MAX_SIZE];
time_t currentTime = time(nullptr); time_t currentTime = time(nullptr);
struct tm *localTime = localtime(&currentTime); struct tm *localTime = localtime(&currentTime);

View File

@ -25,7 +25,22 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include <liveview/test_liveview_entry.hpp> #include <liveview/test_liveview_entry.hpp>
#include <perception/test_perception_entry.hpp> #include <perception/test_perception_entry.hpp>
#include <flight_control/test_flight_control.h>
#include <hms/test_hms.h>
#include <waypoint_v2/test_waypoint_v2.h>
#include <waypoint_v3/test_waypoint_v3.h>
#include <gimbal_manager/test_gimbal_manager.h>
#include "application.hpp" #include "application.hpp"
#include "fc_subscription/test_fc_subscription.h"
#include <gimbal_emu/test_payload_gimbal_emu.h>
#include <camera_emu/test_payload_cam_emu_media.h>
#include <camera_emu/test_payload_cam_emu_base.h>
#include <dji_logger.h>
#include "widget/test_widget.h"
#include "widget/test_widget_speaker.h"
#include <power_management/test_power_management.h>
#include "data_transmission/test_data_transmission.h"
#include <camera_manager/test_camera_manager.h>
/* Private constants ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/
@ -34,35 +49,182 @@
/* Private values -------------------------------------------------------------*/ /* Private values -------------------------------------------------------------*/
/* Private functions declaration ---------------------------------------------*/ /* Private functions declaration ---------------------------------------------*/
static T_DjiReturnCode DjiTest_HighPowerApplyPinInit();
static T_DjiReturnCode DjiTest_WriteHighPowerApplyPin(E_DjiPowerManagementPinState pinState);
/* Exported functions definition ---------------------------------------------*/ /* Exported functions definition ---------------------------------------------*/
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
Application application(argc, argv); Application application(argc, argv);
char inputChar; char inputChar;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
T_DjiReturnCode returnCode;
T_DjiTestApplyHighPowerHandler applyHighPowerHandler;
start:
std::cout std::cout
<< "\n" << "\n"
<< "| Available commands: |\n" << "| Available commands: |\n"
<< "| [0] Camera stream view sample |\n" << "| [0] Fc subscribe sample - subscribe quaternion and gps data |\n"
<< "| [1] Stereo vision view sample |\n" << "| [1] Flight controller sample - take off landing |\n"
<< "| [2] Flight controller sample - take off position ctrl landing |\n"
<< "| [3] Flight controller sample - take off go home force landing |\n"
<< "| [4] Flight controller sample - take off velocity ctrl landing |\n"
<< "| [5] Flight controller sample - arrest flying |\n"
<< "| [6] Flight controller sample - set get parameters |\n"
<< "| [7] Hms info sample - get health manger system info |\n"
<< "| [8] Waypoint 2.0 sample - run airline mission by settings (only support on M300 RTK) |\n"
<< "| [9] Waypoint 3.0 sample - run airline mission by kmz file (only support on M30/30T) |\n"
<< "| [a] Gimbal manager sample - rotate gimbal on free mode |\n"
<< "| [b] Gimbal manager sample - rotate gimbal on yaw follow mode |\n"
<< "| [c] Camera stream view sample - display the camera video stream |\n"
<< "| [d] Stereo vision view sample - display the stereo image (only support on M300 RTK) |\n"
<< "| [e] Start camera all feautes sample - you can operate the camera on DJI Pilot |\n"
<< "| [f] Start gimbal all feautes sample - you can operate the gimbal on DJI Pilot |\n"
<< "| [g] Start widget all feautes sample - you can operate the widget on DJI Pilot |\n"
<< "| [h] Start widget speaker sample - you can operate the speaker on MSDK demo |\n"
<< "| [i] Start power management sample - you will see notification when aircraft power off |\n"
<< "| [j] Start data transmission sample - you can send or recv custom data on MSDK demo |\n"
<< "| [l] Run camera manager sample - shoot photo by the selected camera mounted position |\n"
<< std::endl; << std::endl;
std::cin >> inputChar; std::cin >> inputChar;
switch (inputChar) { switch (inputChar) {
case '0': case '0':
DjiUser_RunCameraStreamViewSample(); DjiTest_FcSubscriptionRunSample();
break; break;
case '1': case '1':
DjiTest_FlightControlRunSample(E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_TAKE_OFF_LANDING);
break;
case '2':
DjiTest_FlightControlRunSample(E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_TAKE_OFF_POSITION_CTRL_LANDING);
break;
case '3':
DjiTest_FlightControlRunSample(E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_TAKE_OFF_GO_HOME_FORCE_LANDING);
break;
case '4':
DjiTest_FlightControlRunSample(E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_TAKE_OFF_VELOCITY_CTRL_LANDING);
break;
case '5':
DjiTest_FlightControlRunSample(E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_ARREST_FLYING);
break;
case '6':
DjiTest_FlightControlRunSample(E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_SET_GET_PARAM);
break;
case '7':
DjiTest_HmsRunSample();
break;
case '8':
DjiTest_WaypointV2RunSample();
break;
case '9':
DjiTest_WaypointV3RunSample();
break;
case 'a':
DjiTest_GimbalManagerRunSample(DJI_MOUNT_POSITION_PAYLOAD_PORT_NO1, DJI_GIMBAL_MODE_FREE);
break;
case 'b':
DjiTest_GimbalManagerRunSample(DJI_MOUNT_POSITION_PAYLOAD_PORT_NO1, DJI_GIMBAL_MODE_YAW_FOLLOW);
break;
case 'c':
DjiUser_RunCameraStreamViewSample();
break;
case 'd':
DjiUser_RunStereoVisionViewSample(); DjiUser_RunStereoVisionViewSample();
break; break;
case 'e':
returnCode = DjiTest_CameraEmuBaseStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("camera emu common init error");
break;
}
if (DjiPlatform_GetSocketHandler() != NULL) {
returnCode = DjiTest_CameraEmuMediaStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("camera emu media init error");
break;
}
}
USER_LOG_INFO("Start camera all feautes sample successfully");
break;
case 'f':
if (DjiTest_GimbalStartService() != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk gimbal init error");
break;
}
USER_LOG_INFO("Start gimbal all feautes sample successfully");
break;
case 'g':
returnCode = DjiTest_WidgetStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget sample init error");
break;
}
USER_LOG_INFO("Start widget all feautes sample successfully");
break;
case 'h':
returnCode = DjiTest_WidgetSpeakerStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget speaker test init error");
break;
}
USER_LOG_INFO("Start widget speaker sample successfully");
break;
case 'i':
applyHighPowerHandler.pinInit = DjiTest_HighPowerApplyPinInit;
applyHighPowerHandler.pinWrite = DjiTest_WriteHighPowerApplyPin;
returnCode = DjiTest_RegApplyHighPowerHandler(&applyHighPowerHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("regsiter apply high power handler error");
break;
}
returnCode = DjiTest_PowerManagementStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("power management init error");
break;
}
USER_LOG_INFO("Start power management sample successfully");
break;
case 'j':
returnCode = DjiTest_DataTransmissionStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("data transmission sample init error");
break;
}
USER_LOG_INFO("Start data transmission sample successfully");
break;
case 'l':
DjiTest_CameraManagerRunSample(DJI_MOUNT_POSITION_PAYLOAD_PORT_NO1,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SHOOT_SINGLE_PHOTO);
break;
default: default:
break; break;
} }
return 0; osalHandler->TaskSleepMs(2000);
goto start;
} }
/* Private functions definition-----------------------------------------------*/ /* Private functions definition-----------------------------------------------*/
static T_DjiReturnCode DjiTest_HighPowerApplyPinInit()
{
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode DjiTest_WriteHighPowerApplyPin(E_DjiPowerManagementPinState pinState)
{
//attention: please pull up the HWPR pin state by hardware.
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/ /****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/

View File

@ -28,7 +28,7 @@
/* Private constants ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/
#define UART_DEV_NAME_STR_SIZE (128) #define UART_DEV_NAME_STR_SIZE (128)
#define DJI_SYSTEM_CMD_STR_MAX_SIZE (64) #define DJI_SYSTEM_CMD_MAX_SIZE (64)
#define DJI_SYSTEM_RESULT_STR_MAX_SIZE (128) #define DJI_SYSTEM_RESULT_STR_MAX_SIZE (128)
/* Private types -------------------------------------------------------------*/ /* Private types -------------------------------------------------------------*/
@ -48,7 +48,7 @@ T_DjiReturnCode HalUart_Init(E_DjiHalUartNum uartNum, uint32_t baudRate, T_DjiUa
struct flock lock; struct flock lock;
T_DjiReturnCode returnCode = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; T_DjiReturnCode returnCode = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
char uartName[UART_DEV_NAME_STR_SIZE]; char uartName[UART_DEV_NAME_STR_SIZE];
char systemCmd[DJI_SYSTEM_CMD_STR_MAX_SIZE]; char systemCmd[DJI_SYSTEM_CMD_MAX_SIZE];
char *ret = NULL; char *ret = NULL;
char lineBuf[DJI_SYSTEM_RESULT_STR_MAX_SIZE] = {0}; char lineBuf[DJI_SYSTEM_RESULT_STR_MAX_SIZE] = {0};
FILE *fp; FILE *fp;

View File

@ -1234,7 +1234,8 @@ T_DjiReturnCode DjiTest_CameraEmuBaseStartService(void)
returnCode = DjiPayloadCamera_Init(); returnCode = DjiPayloadCamera_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("payload camera init error:0x%08llX", returnCode); USER_LOG_ERROR("init payload camera error:0x%08llX", returnCode);
return returnCode;
} }
/* Init the SDcard parameters */ /* Init the SDcard parameters */

View File

@ -51,6 +51,8 @@ static const T_DjiTestCameraTypeStr s_cameraTypeStrList[] = {
{DJI_CAMERA_TYPE_H20T, "Zenmuse H20T"}, {DJI_CAMERA_TYPE_H20T, "Zenmuse H20T"},
{DJI_CAMERA_TYPE_P1, "Zenmuse P1"}, {DJI_CAMERA_TYPE_P1, "Zenmuse P1"},
{DJI_CAMERA_TYPE_L1, "Zenmuse L1"}, {DJI_CAMERA_TYPE_L1, "Zenmuse L1"},
{DJI_CAMERA_TYPE_M30, "Zenmuse M30"},
{DJI_CAMERA_TYPE_M30T, "Zenmuse M30T"},
}; };
static FILE *s_downloadMediaFile = NULL; static FILE *s_downloadMediaFile = NULL;

View File

@ -48,10 +48,9 @@ static T_DjiReturnCode ReceiveDataFromPayload(const uint8_t *data, uint16_t len)
/* Private variables ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
static T_DjiTaskHandle s_userDataTransmissionThread; static T_DjiTaskHandle s_userDataTransmissionThread;
static T_DjiAircraftInfoBaseInfo s_aircraftInfoBaseInfo; static T_DjiAircraftInfoBaseInfo s_aircraftInfoBaseInfo;
static DjiTestDataTransmissionConfig s_dataTransmissionConfig = {0};
/* Exported functions definition ---------------------------------------------*/ /* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode DjiTest_DataTransmissionStartService(DjiTestDataTransmissionConfig config) T_DjiReturnCode DjiTest_DataTransmissionStartService(void)
{ {
T_DjiReturnCode djiStat; T_DjiReturnCode djiStat;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler(); T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
@ -61,8 +60,6 @@ T_DjiReturnCode DjiTest_DataTransmissionStartService(DjiTestDataTransmissionConf
char ipAddr[DJI_IP_ADDR_STR_SIZE_MAX]; char ipAddr[DJI_IP_ADDR_STR_SIZE_MAX];
uint16_t port; uint16_t port;
memcpy(&s_dataTransmissionConfig, &config, sizeof(DjiTestDataTransmissionConfig));
djiStat = DjiLowSpeedDataChannel_Init(); djiStat = DjiLowSpeedDataChannel_Init();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("init data transmission module error."); USER_LOG_ERROR("init data transmission module error.");
@ -179,7 +176,7 @@ static void *UserDataTransmission_Task(void *arg)
USER_LOG_ERROR("get send to onboard computer channel state error."); USER_LOG_ERROR("get send to onboard computer channel state error.");
} }
if (s_dataTransmissionConfig.isEnableHighSpeedDataChannel == true) { #ifdef SYSTEM_ARCH_LINUX
djiStat = DjiHighSpeedDataChannel_SendDataStreamData(dataToBeSent, sizeof(dataToBeSent)); djiStat = DjiHighSpeedDataChannel_SendDataStreamData(dataToBeSent, sizeof(dataToBeSent));
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
USER_LOG_ERROR("send data to data stream error."); USER_LOG_ERROR("send data to data stream error.");
@ -192,7 +189,7 @@ static void *UserDataTransmission_Task(void *arg)
} else { } else {
USER_LOG_ERROR("get data stream state error."); USER_LOG_ERROR("get data stream state error.");
} }
} #endif
} else if (s_aircraftInfoBaseInfo.mountPosition == DJI_MOUNT_POSITION_EXTENSION_PORT) { } else if (s_aircraftInfoBaseInfo.mountPosition == DJI_MOUNT_POSITION_EXTENSION_PORT) {
channelAddress = DJI_CHANNEL_ADDRESS_PAYLOAD_PORT_NO1; channelAddress = DJI_CHANNEL_ADDRESS_PAYLOAD_PORT_NO1;
djiStat = DjiLowSpeedDataChannel_SendData(channelAddress, dataToBeSent, sizeof(dataToBeSent)); djiStat = DjiLowSpeedDataChannel_SendData(channelAddress, dataToBeSent, sizeof(dataToBeSent));

View File

@ -38,13 +38,10 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/
typedef struct {
bool isEnableLowSpeedDataChannel;
bool isEnableHighSpeedDataChannel;
} DjiTestDataTransmissionConfig;
/* Exported functions --------------------------------------------------------*/ /* Exported functions --------------------------------------------------------*/
T_DjiReturnCode DjiTest_DataTransmissionStartService(DjiTestDataTransmissionConfig config); T_DjiReturnCode DjiTest_DataTransmissionStartService(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -147,7 +147,7 @@ T_DjiReturnCode DjiTest_FcSubscriptionRunSample(void)
USER_LOG_INFO("--> Step 3: Get latest value of the subscribed topics in the next 20s\r\n"); USER_LOG_INFO("--> Step 3: Get latest value of the subscribed topics in the next 20s\r\n");
for (int i = 0; i < 20; ++i) { for (int i = 0; i < 10; ++i) {
osalHandler->TaskSleepMs(1000 / FC_SUBSCRIPTION_TASK_FREQ); osalHandler->TaskSleepMs(1000 / FC_SUBSCRIPTION_TASK_FREQ);
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY, djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY,
(uint8_t *) &velocity, (uint8_t *) &velocity,

View File

@ -127,6 +127,12 @@ T_DjiReturnCode DjiTest_GimbalStartService(void)
s_commonHandler.Reset = Reset; s_commonHandler.Reset = Reset;
s_commonHandler.FineTuneAngle = FineTuneAngle; s_commonHandler.FineTuneAngle = FineTuneAngle;
djiStat = DjiFcSubscription_Init();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("init data subscription module error.");
return djiStat;
}
if (osalHandler->MutexCreate(&s_commonMutex) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (osalHandler->MutexCreate(&s_commonMutex) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("mutex create error"); USER_LOG_ERROR("mutex create error");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
@ -145,11 +151,13 @@ T_DjiReturnCode DjiTest_GimbalStartService(void)
djiStat = DjiGimbal_Init(); djiStat = DjiGimbal_Init();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("init gimbal module error: 0x%08llX", djiStat); USER_LOG_ERROR("init gimbal module error: 0x%08llX", djiStat);
return djiStat;
} }
djiStat = DjiGimbal_RegCommonHandler(&s_commonHandler); djiStat = DjiGimbal_RegCommonHandler(&s_commonHandler);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("gimbal register common handler error: 0x%08llX", djiStat); USER_LOG_ERROR("gimbal register common handler error: 0x%08llX", djiStat);
return djiStat;
} }
if (osalHandler->TaskCreate("user_gimbal_task", UserGimbal_Task, if (osalHandler->TaskCreate("user_gimbal_task", UserGimbal_Task,
@ -379,6 +387,14 @@ static void *UserGimbal_Task(void *arg)
USER_UTIL_UNUSED(arg); USER_UTIL_UNUSED(arg);
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ,
NULL);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic quaternion error.");
} else {
USER_LOG_DEBUG("Subscribe topic quaternion success.");
}
while (1) { while (1) {
osalHandler->TaskSleepMs(1000 / PAYLOAD_GIMBAL_TASK_FREQ); osalHandler->TaskSleepMs(1000 / PAYLOAD_GIMBAL_TASK_FREQ);
step++; step++;

View File

@ -78,7 +78,6 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition,
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation); returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (30, 0, 0) failed, error code: 0x%08X", returnCode); USER_LOG_ERROR("Target gimbal pry = (30, 0, 0) failed, error code: 0x%08X", returnCode);
goto out;
} }
osalHandler->TaskSleepMs(1000); osalHandler->TaskSleepMs(1000);
@ -88,7 +87,6 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition,
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation); returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (0, 30, 0) failed, error code: 0x%08X", returnCode); USER_LOG_ERROR("Target gimbal pry = (0, 30, 0) failed, error code: 0x%08X", returnCode);
goto out;
} }
osalHandler->TaskSleepMs(1000); osalHandler->TaskSleepMs(1000);
@ -97,7 +95,6 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition,
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation); returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (0, 0, 30) failed, error code: 0x%08X", returnCode); USER_LOG_ERROR("Target gimbal pry = (0, 0, 30) failed, error code: 0x%08X", returnCode);
goto out;
} }
osalHandler->TaskSleepMs(1000); osalHandler->TaskSleepMs(1000);
@ -105,7 +102,6 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition,
returnCode = DjiGimbalManager_Reset(mountPosition); returnCode = DjiGimbalManager_Reset(mountPosition);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode); USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode);
goto out;
} }
osalHandler->TaskSleepMs(2000); osalHandler->TaskSleepMs(2000);
} }
@ -119,7 +115,6 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition,
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation); returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (30, 0, 0) failed, error code: 0x%08X", returnCode); USER_LOG_ERROR("Target gimbal pry = (30, 0, 0) failed, error code: 0x%08X", returnCode);
goto out;
} }
osalHandler->TaskSleepMs(1000); osalHandler->TaskSleepMs(1000);
@ -129,7 +124,6 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition,
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation); returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (0, 30, 0) failed, error code: 0x%08X", returnCode); USER_LOG_ERROR("Target gimbal pry = (0, 30, 0) failed, error code: 0x%08X", returnCode);
goto out;
} }
osalHandler->TaskSleepMs(1000); osalHandler->TaskSleepMs(1000);
@ -138,7 +132,6 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition,
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation); returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (0, 0, 30) failed, error code: 0x%08X", returnCode); USER_LOG_ERROR("Target gimbal pry = (0, 0, 30) failed, error code: 0x%08X", returnCode);
goto out;
} }
osalHandler->TaskSleepMs(1000); osalHandler->TaskSleepMs(1000);
@ -146,7 +139,6 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition,
returnCode = DjiGimbalManager_Reset(mountPosition); returnCode = DjiGimbalManager_Reset(mountPosition);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode); USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode);
goto out;
} }
osalHandler->TaskSleepMs(2000); osalHandler->TaskSleepMs(2000);
} }

View File

@ -78,7 +78,7 @@ T_DjiReturnCode DjiTest_HmsRunSample(void)
goto out; goto out;
} }
osalHandler->TaskSleepMs(30000); osalHandler->TaskSleepMs(10000);
out: out:
USER_LOG_INFO("--> Step 3: Deinit hms sample"); USER_LOG_INFO("--> Step 3: Deinit hms sample");

View File

@ -0,0 +1,161 @@
/**
********************************************************************
* @file test_waypoint_v3.c
* @brief
*
* @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 DJIs 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.
*
*********************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include <utils/util_file.h>
#include <utils/util_misc.h>
#include "test_waypoint_v3.h"
#include "dji_logger.h"
#include "dji_waypoint_v3.h"
#include "waypoint_file_c/waypoint_v3_test_file_kmz.h"
/* Private constants ---------------------------------------------------------*/
#define DJI_TEST_WAYPOINT_V3_KMZ_FILE_PATH_LEN_MAX (256)
/* Private types -------------------------------------------------------------*/
/* Private values -------------------------------------------------------------*/
/* Private functions declaration ---------------------------------------------*/
static T_DjiReturnCode DjiTest_WaypointV3StateCallback(T_DjiWaypointV3MissionState missionState);
/* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode DjiTest_WaypointV3RunSample(void)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
#ifdef SYSTEM_ARCH_LINUX
FILE *kmzFile;
uint32_t kmzFileSize = 0;
uint8_t *kmzFileBuf;
uint16_t readLen;
char curFileDirPath[DJI_TEST_WAYPOINT_V3_KMZ_FILE_PATH_LEN_MAX];
char tempPath[DJI_TEST_WAYPOINT_V3_KMZ_FILE_PATH_LEN_MAX];
returnCode = DjiWaypointV3_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Waypoint v3 init failed.");
return returnCode;
}
returnCode = DjiWaypointV3_RegMissionStateCallback(DjiTest_WaypointV3StateCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Register waypoint v3 state callback failed.");
goto out;
}
returnCode = DjiUserUtil_GetCurrentFileDirPath(__FILE__, DJI_TEST_WAYPOINT_V3_KMZ_FILE_PATH_LEN_MAX,
curFileDirPath);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get file current path error, stat = 0x%08llX", returnCode);
goto out;
}
/*! Attention: suggest use the exported kmz file by DJI pilot. If use this test file, you need set the longitude as
* 113.94755, latitude as 22.51853 on DJI Assistant 2 simulator */
snprintf(tempPath, DJI_TEST_WAYPOINT_V3_KMZ_FILE_PATH_LEN_MAX, "%s/waypoint_file/waypoint_v3_test_file.kmz",
curFileDirPath);
kmzFile = fopen(tempPath, "r");
if (kmzFile == NULL) {
USER_LOG_ERROR("Open kmz file failed.");
goto out;
}
returnCode = UtilFile_GetFileSize(kmzFile, &kmzFileSize);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get kmz file size failed.");
goto out;
}
kmzFileBuf = osalHandler->Malloc(kmzFileSize);
if (kmzFileBuf == NULL) {
USER_LOG_ERROR("Malloc kmz file buf error.");
goto out;
}
readLen = fread(kmzFileBuf, 1, kmzFileSize, kmzFile);
if (readLen != kmzFileSize) {
USER_LOG_ERROR("Read kmz file data failed.");
goto out;
}
returnCode = DjiWaypointV3_UploadKmzFile(kmzFileBuf, kmzFileSize);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Upload kmz file failed.");
goto out;
}
osalHandler->Free(kmzFileBuf);
#else
returnCode = DjiWaypointV3_UploadKmzFile(waypoint_v3_test_file_kmz_fileBinaryArray,
waypoint_v3_test_file_kmz_fileSize);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Upload kmz file failed.");
goto out;
}
#endif
USER_LOG_INFO("Execute start action");
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;
}
for (int i = 0; i < 30; ++i) {
osalHandler->TaskSleepMs(1000);
}
USER_LOG_INFO("Execute pause action");
returnCode = DjiWaypointV3_Action(DJI_WAYPOINT_V3_ACTION_PAUSE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Execute start action failed.");
goto out;
}
for (int i = 0; i < 5; ++i) {
osalHandler->TaskSleepMs(1000);
}
USER_LOG_INFO("Execute resume action");
returnCode = DjiWaypointV3_Action(DJI_WAYPOINT_V3_ACTION_RESUME);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Execute start action failed.");
goto out;
}
out:
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/* Private functions definition-----------------------------------------------*/
static T_DjiReturnCode DjiTest_WaypointV3StateCallback(T_DjiWaypointV3MissionState missionState)
{
USER_LOG_INFO("Waypoint v3 mission state: %d, current waypoint index: %d, wayLine id: %d", missionState.state,
missionState.currentWaypointIndex, missionState.wayLineId);
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/

View File

@ -0,0 +1,49 @@
/**
********************************************************************
* @file test_waypoint_v3.h
* @brief This is the header file for "test_waypoint_v3.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 DJIs 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 TEST_WAYPOINT_V3_H
#define TEST_WAYPOINT_V3_H
/* Includes ------------------------------------------------------------------*/
#include "dji_typedef.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_DjiReturnCode DjiTest_WaypointV3RunSample(void);
#ifdef __cplusplus
}
#endif
#endif // TEST_WAYPOINT_V3_H
/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/

View File

@ -0,0 +1,245 @@
/* Generated by file2c, do not edit manually */
#ifndef __waypoint_v3_test_file_kmz_h_included
#define __waypoint_v3_test_file_kmz_h_included
#include <stdint.h>
/* Contents of file waypoint_v3_test_file.kmz */
#define waypoint_v3_test_file_kmz_fileName "waypoint_v3_test_file.kmz"
#define waypoint_v3_test_file_kmz_fileSize 3690
static const uint8_t waypoint_v3_test_file_kmz_fileBinaryArray[3690] = {
0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA8,
0x54, 0x6C, 0xA8, 0x06, 0x00, 0x00, 0xD9, 0x59, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x77, 0x70,
0x6D, 0x7A, 0x2F, 0x74, 0x65, 0x6D, 0x70, 0x6C, 0x61, 0x74, 0x65, 0x2E, 0x6B, 0x6D, 0x6C, 0xED,
0x9C, 0x6D, 0x6F, 0xDB, 0x36, 0x10, 0xC7, 0xDF, 0xF7, 0x53, 0x04, 0x79, 0xDD, 0xC5, 0xBC, 0x23,
0x8F, 0x0F, 0x85, 0xEB, 0xA2, 0xE8, 0x33, 0xB0, 0xA1, 0xC1, 0x9C, 0x2D, 0xAF, 0x55, 0x5B, 0x49,
0xB4, 0xCA, 0x92, 0x61, 0xCB, 0x75, 0xB3, 0x4F, 0xBF, 0x93, 0x2D, 0xD9, 0x92, 0xAD, 0xB4, 0x03,
0x38, 0x0C, 0x20, 0xC0, 0xA2, 0x40, 0x6B, 0x1D, 0x8F, 0xA2, 0xC8, 0x1F, 0x8F, 0xC7, 0xBF, 0x1E,
0xC6, 0xAF, 0xBE, 0x2F, 0xF2, 0x8B, 0x6F, 0xE9, 0x6A, 0x9D, 0x95, 0xC5, 0xCB, 0x4B, 0xB8, 0x12,
0x97, 0x17, 0x69, 0x31, 0x2B, 0xE7, 0x59, 0x71, 0xFF, 0xF2, 0xF2, 0x8F, 0x9B, 0xF7, 0xBF, 0xD8,
0xCB, 0x57, 0x93, 0x67, 0xE3, 0xAF, 0x5C, 0x8A, 0x4B, 0x16, 0xEB, 0x97, 0x97, 0x0F, 0x55, 0xB5,
0x7C, 0x31, 0x1A, 0x6D, 0xB7, 0xDB, 0xAB, 0x72, 0x99, 0x16, 0xF7, 0xD9, 0xFA, 0xAA, 0x48, 0xAB,
0x11, 0x97, 0x18, 0xE1, 0x15, 0x5E, 0xEE, 0x8B, 0xBD, 0xD8, 0x2E, 0x17, 0x79, 0xAF, 0xEC, 0xFC,
0xAF, 0xEC, 0x6A, 0x56, 0x2E, 0x46, 0x6C, 0xF8, 0x7B, 0xC4, 0xE7, 0xE1, 0x33, 0x4D, 0x9E, 0x5D,
0x5C, 0x8C, 0xDF, 0x96, 0xB3, 0xCD, 0x22, 0x2D, 0xAA, 0xFA, 0x07, 0xFF, 0xAC, 0xFD, 0x5E, 0xCC,
0x56, 0x69, 0x52, 0xA5, 0x37, 0xD9, 0x22, 0x9D, 0x80, 0x56, 0x46, 0xA2, 0xB1, 0x92, 0xA4, 0xC3,
0xF1, 0xE8, 0xD4, 0xDC, 0x71, 0xDA, 0x2C, 0xE7, 0x27, 0x4E, 0xCE, 0x19, 0x00, 0xD3, 0x38, 0x75,
0xCC, 0x1D, 0xA7, 0x45, 0xB6, 0xAE, 0xAF, 0xFC, 0x4D, 0x59, 0xDC, 0x65, 0xF7, 0x7B, 0x43, 0x6B,
0xBA, 0xCB, 0x1F, 0x6F, 0xCA, 0xDB, 0xE4, 0x31, 0xCF, 0x8A, 0xF4, 0xB7, 0x72, 0x9E, 0x4E, 0xD6,
0xC9, 0x5D, 0x9A, 0x3F, 0x36, 0xD5, 0x9D, 0x59, 0xFB, 0xBE, 0x59, 0x91, 0xAD, 0x1F, 0x5E, 0xCF,
0x2A, 0xAE, 0x7B, 0x72, 0x5F, 0x7E, 0x2C, 0x17, 0x69, 0xEB, 0xD7, 0xB5, 0xF4, 0x7C, 0xD2, 0xEF,
0x59, 0xF5, 0xB9, 0xF8, 0xFD, 0xCD, 0xAF, 0xE5, 0xBA, 0x62, 0x1F, 0x6E, 0x52, 0x95, 0x15, 0x9B,
0xD6, 0xAF, 0x67, 0xED, 0xF9, 0x55, 0xC9, 0xD7, 0xF4, 0xF3, 0xDD, 0xDD, 0x34, 0x9D, 0x6D, 0x56,
0x59, 0xF5, 0xF8, 0x31, 0xCD, 0xEE, 0x1F, 0xAA, 0x09, 0x8A, 0xC6, 0x71, 0xD8, 0xDC, 0xAB, 0xE1,
0x3E, 0x2F, 0xBF, 0x24, 0xF9, 0xCD, 0x2A, 0x29, 0xD6, 0x59, 0xDD, 0xAE, 0x24, 0x9F, 0x2E, 0xD3,
0x74, 0x3E, 0xA1, 0xA6, 0x8A, 0xA7, 0xEC, 0xBD, 0x4A, 0xE6, 0xAB, 0xB2, 0x48, 0x3F, 0x15, 0x77,
0x65, 0x7B, 0xB8, 0x67, 0x78, 0x57, 0x6C, 0x16, 0x7F, 0x26, 0xF9, 0x26, 0x9D, 0xE8, 0x76, 0x40,
0x4E, 0x8E, 0x0F, 0x79, 0x4D, 0x37, 0x5F, 0x8E, 0x05, 0x44, 0xD7, 0xAF, 0x67, 0x69, 0xDB, 0x31,
0x1A, 0x6E, 0xC8, 0xBE, 0xC2, 0x25, 0x8F, 0x55, 0x99, 0xCC, 0x87, 0x5A, 0xD8, 0x98, 0x8E, 0x15,
0x52, 0x4B, 0xDA, 0x99, 0x65, 0xD8, 0x73, 0xB0, 0x9D, 0x43, 0xB6, 0x61, 0xF7, 0xEB, 0x72, 0xDF,
0xAF, 0x9F, 0x8A, 0x79, 0xFA, 0xFD, 0xD4, 0xBF, 0x6F, 0xEC, 0x5F, 0xEA, 0xD9, 0x35, 0x35, 0xC7,
0x07, 0xA8, 0x1E, 0xBF, 0x2F, 0xF3, 0x79, 0xBA, 0x3A, 0x41, 0x27, 0x5D, 0x2C, 0xF3, 0x7A, 0x56,
0x3C, 0x2E, 0xD3, 0xC9, 0x36, 0x79, 0x5C, 0x96, 0x59, 0x51, 0xB5, 0xDC, 0x74, 0x6D, 0x3D, 0xAF,
0xCD, 0x3A, 0xFD, 0xF0, 0x04, 0x11, 0x6D, 0xDB, 0x7F, 0x50, 0x64, 0xB0, 0x01, 0x9F, 0x8E, 0xAE,
0x9D, 0x43, 0xBD, 0xA2, 0xDB, 0xFD, 0x5C, 0x7B, 0x53, 0x96, 0x2B, 0x0E, 0x4E, 0x5C, 0x60, 0xFA,
0xB8, 0xBE, 0x4E, 0x56, 0xC9, 0xE2, 0xB4, 0x53, 0x67, 0x87, 0x12, 0xBB, 0x79, 0x79, 0xFB, 0x61,
0x6A, 0x55, 0x1B, 0x38, 0xFA, 0xA6, 0x13, 0xC7, 0x87, 0xDD, 0xD4, 0xD8, 0x59, 0x56, 0x29, 0x37,
0x21, 0xFB, 0x96, 0xDE, 0x94, 0xD3, 0x2A, 0x59, 0x55, 0xD7, 0x9D, 0x7E, 0xE9, 0x94, 0x3A, 0xF1,
0xDF, 0x4F, 0x93, 0x66, 0x82, 0x81, 0x10, 0xBD, 0xD9, 0xD3, 0x9F, 0x77, 0x07, 0x00, 0x9A, 0xC1,
0xE5, 0x68, 0xBB, 0xEB, 0xE7, 0x0F, 0xD7, 0xD3, 0x76, 0x68, 0x4F, 0x2C, 0xFD, 0x81, 0xFF, 0x69,
0x67, 0xEC, 0xAB, 0x4F, 0x36, 0x55, 0xF9, 0x3E, 0xAF, 0x4F, 0xDC, 0x9F, 0xD0, 0xA7, 0xC7, 0xFB,
0x63, 0xF2, 0x64, 0x1C, 0x38, 0xB7, 0xF4, 0x1C, 0x67, 0x49, 0x9E, 0xED, 0x6B, 0x7D, 0x57, 0x24,
0x5F, 0xF2, 0xE3, 0x4C, 0x38, 0x33, 0xF4, 0xA3, 0x4F, 0xB6, 0xE0, 0xFE, 0xB9, 0xCE, 0xAA, 0xD9,
0xC3, 0xAE, 0x57, 0x17, 0x49, 0xB1, 0x49, 0xF2, 0xB6, 0xF3, 0x4E, 0x8C, 0x03, 0x71, 0xEB, 0xB6,
0xE1, 0xF6, 0x63, 0x9A, 0xD4, 0xAB, 0xD6, 0x20, 0x13, 0xDB, 0x7E, 0x99, 0x5D, 0x55, 0x77, 0x65,
0x9E, 0x97, 0xDB, 0x26, 0x84, 0x1F, 0xFB, 0xF5, 0xAC, 0xDC, 0x8F, 0xAB, 0x7A, 0x5D, 0xDC, 0x77,
0xAE, 0x74, 0xD0, 0xF8, 0x44, 0x05, 0x0C, 0xD5, 0x8E, 0xAB, 0x09, 0x2F, 0x85, 0xBB, 0x3F, 0xCF,
0xCF, 0xFE, 0x73, 0x52, 0xEB, 0xC1, 0xE3, 0x5F, 0x34, 0xE9, 0x64, 0x08, 0x7E, 0x50, 0xA4, 0x4F,
0xD6, 0xCF, 0xFB, 0x74, 0xA8, 0xEF, 0x6F, 0x36, 0xAB, 0x62, 0xD7, 0x59, 0x55, 0xB9, 0x6B, 0xE1,
0xEB, 0x62, 0x3E, 0xAD, 0xCA, 0xE5, 0x6D, 0x56, 0x3D, 0xBC, 0xCD, 0xD6, 0xB3, 0xFD, 0x52, 0xC6,
0xAB, 0xCF, 0x9B, 0xCD, 0xEA, 0x5B, 0x52, 0x6D, 0x56, 0xE9, 0xE0, 0xD9, 0x0E, 0xB5, 0xB4, 0x67,
0xBA, 0xCE, 0x93, 0x59, 0xBA, 0x48, 0x56, 0x5F, 0x3B, 0x57, 0x7C, 0xD2, 0x03, 0x7C, 0xE4, 0x38,
0xAB, 0xD7, 0xDD, 0xE3, 0x17, 0x17, 0x00, 0xF2, 0xCA, 0x29, 0x90, 0x46, 0x81, 0xD5, 0x1A, 0xF5,
0x73, 0xC4, 0x2B, 0x42, 0x54, 0xCA, 0x29, 0x6B, 0x8D, 0x00, 0xEC, 0xD6, 0x32, 0x1A, 0xAC, 0x66,
0x3C, 0x1A, 0xEC, 0xF1, 0xAC, 0x17, 0xA9, 0xB3, 0x6E, 0x68, 0x3E, 0x2C, 0xE7, 0x79, 0x9E, 0x2D,
0xD7, 0x65, 0x36, 0x3F, 0x0B, 0x08, 0xA7, 0x96, 0xC1, 0x30, 0xD4, 0x29, 0xFF, 0x30, 0x58, 0xEC,
0x10, 0x62, 0xDB, 0xFA, 0x4F, 0x43, 0xEF, 0x70, 0xED, 0x07, 0xF3, 0x7E, 0x02, 0x9F, 0x79, 0xF5,
0xE6, 0xF5, 0xC0, 0xB9, 0x3A, 0x3C, 0x0C, 0x9C, 0xF1, 0xE9, 0x19, 0x78, 0x5C, 0x11, 0x78, 0x90,
0x9F, 0xF0, 0x3F, 0x9A, 0x0E, 0x4C, 0x9E, 0x11, 0xF0, 0xDF, 0x30, 0x81, 0x46, 0x0B, 0xC9, 0x19,
0xA2, 0x86, 0x86, 0x09, 0xD4, 0x52, 0x29, 0x44, 0x00, 0xE5, 0xC9, 0x04, 0x44, 0x26, 0x02, 0x65,
0x42, 0x82, 0x94, 0xD6, 0x2A, 0xED, 0x1A, 0x26, 0x24, 0x87, 0x0C, 0x92, 0xC6, 0x28, 0x65, 0x3D,
0x99, 0xC0, 0xC8, 0x44, 0xA0, 0x4C, 0x30, 0x05, 0xC2, 0x39, 0x74, 0xBA, 0x45, 0x82, 0x17, 0x12,
0x25, 0x94, 0x06, 0xE9, 0x89, 0x84, 0x8C, 0x48, 0x04, 0x8A, 0x84, 0xB6, 0x12, 0x09, 0x08, 0x45,
0x1B, 0x26, 0xA4, 0x26, 0xA1, 0x0C, 0xF1, 0x3F, 0x9E, 0x4C, 0xA8, 0xC8, 0x44, 0xA0, 0x4C, 0x18,
0x63, 0x90, 0x88, 0xB4, 0x38, 0xA4, 0x13, 0x0A, 0x1C, 0x2A, 0x23, 0x94, 0x6F, 0x8A, 0x49, 0x91,
0x89, 0x40, 0x99, 0xB0, 0x92, 0xFF, 0xD6, 0x4B, 0x87, 0xDA, 0x33, 0x21, 0xAC, 0x34, 0x20, 0x34,
0x0A, 0xF4, 0x4D, 0x27, 0x74, 0x64, 0x22, 0x50, 0x26, 0x8C, 0x71, 0x8E, 0x04, 0x49, 0xB1, 0xCF,
0x27, 0xC0, 0x91, 0xE2, 0xEC, 0x42, 0xF0, 0xA2, 0xE2, 0x1B, 0x27, 0x4C, 0x64, 0x22, 0x50, 0x26,
0xB4, 0x93, 0xCE, 0x5A, 0x4D, 0x68, 0x1B, 0x26, 0x94, 0x20, 0xB2, 0x28, 0xB4, 0x31, 0x9E, 0x4C,
0xD8, 0xC8, 0x44, 0xA8, 0x4C, 0x48, 0xDE, 0x67, 0x80, 0x33, 0x16, 0xF7, 0x4C, 0x58, 0x63, 0x49,
0x08, 0x29, 0xBC, 0xB7, 0x1D, 0x2E, 0x22, 0x11, 0x28, 0x12, 0xBC, 0xC3, 0xB0, 0x1C, 0x16, 0x24,
0x35, 0x4B, 0x87, 0x75, 0xC6, 0x09, 0x34, 0x02, 0x49, 0xFB, 0x2A, 0x56, 0x51, 0xC6, 0x0C, 0x15,
0x0A, 0xDE, 0x7B, 0x3A, 0x4B, 0xC8, 0xC9, 0xE6, 0x61, 0xED, 0x10, 0xC4, 0x4B, 0x09, 0x08, 0xDF,
0x40, 0x01, 0x51, 0xC7, 0x0C, 0x15, 0x0A, 0x8E, 0x11, 0x52, 0x2A, 0xA7, 0x9D, 0x6A, 0xA0, 0x70,
0x56, 0x0B, 0xAD, 0x35, 0x87, 0x0A, 0x5F, 0x28, 0xA2, 0x90, 0x19, 0x2A, 0x14, 0xC2, 0xDA, 0xFA,
0x6E, 0x87, 0x46, 0x38, 0xEC, 0x46, 0xA5, 0xA9, 0xB9, 0x00, 0xDF, 0x2C, 0x13, 0xA2, 0x94, 0x19,
0x2A, 0x14, 0x00, 0x9C, 0x63, 0x6A, 0xAB, 0x1A, 0x75, 0x1B, 0xB4, 0x96, 0x4C, 0x05, 0x48, 0xEF,
0x7B, 0x60, 0x51, 0xC9, 0x0C, 0x16, 0x09, 0x4B, 0x52, 0x5B, 0x61, 0x4C, 0xCB, 0x84, 0x33, 0x1C,
0x34, 0x38, 0xC3, 0x40, 0x6F, 0x28, 0xA2, 0x94, 0x19, 0x2A, 0x14, 0x12, 0xB5, 0x71, 0xA8, 0xAD,
0x74, 0x0D, 0x14, 0x46, 0x0A, 0x67, 0x0D, 0x90, 0xF1, 0xDE, 0x7B, 0x44, 0x2D, 0x33, 0x54, 0x28,
0x98, 0x0A, 0x09, 0xBC, 0x7A, 0x68, 0xD9, 0x46, 0x0A, 0x72, 0x68, 0x2C, 0x6A, 0xE1, 0x9D, 0x66,
0x46, 0x31, 0x33, 0x54, 0x28, 0x78, 0xF3, 0xC9, 0x04, 0x10, 0xB4, 0x48, 0xF0, 0xA6, 0x83, 0x8F,
0x09, 0xE1, 0x2B, 0x6F, 0x43, 0xD4, 0x32, 0x43, 0x45, 0x42, 0xD7, 0xB7, 0x38, 0x08, 0x8C, 0x69,
0x16, 0x0F, 0xE1, 0x48, 0xA3, 0x55, 0x40, 0xCE, 0x5B, 0xA3, 0x88, 0x6A, 0x66, 0xA8, 0x50, 0x90,
0x03, 0x52, 0x0C, 0x06, 0xB5, 0x50, 0x68, 0x24, 0x12, 0x4E, 0xF0, 0x86, 0xD4, 0x13, 0x0A, 0x8C,
0x6A, 0x66, 0xB0, 0x50, 0xA0, 0xB0, 0xAA, 0x4E, 0x2A, 0x5A, 0x28, 0x48, 0x09, 0xE4, 0xCD, 0x07,
0x38, 0xEF, 0x07, 0xF0, 0xA2, 0x9A, 0x19, 0x2A, 0x14, 0x4A, 0x73, 0x06, 0x41, 0x12, 0xC0, 0x1E,
0x84, 0x2B, 0x01, 0xC2, 0x48, 0x8E, 0x1D, 0xBE, 0x50, 0x44, 0x35, 0x33, 0x58, 0x28, 0x04, 0x20,
0x49, 0x85, 0xBA, 0x55, 0x29, 0x24, 0x3A, 0x49, 0x44, 0xCE, 0x80, 0x2F, 0x14, 0x51, 0xCD, 0x0C,
0x15, 0x0A, 0x94, 0x4E, 0x59, 0xA1, 0x00, 0xB1, 0x4D, 0x34, 0xB5, 0x95, 0xF5, 0xD3, 0x15, 0xDE,
0x81, 0x22, 0xCA, 0x99, 0xA1, 0x32, 0xC1, 0xE3, 0x4F, 0x9C, 0x51, 0x48, 0x6A, 0x90, 0x10, 0xC6,
0x10, 0xF1, 0x4F, 0xEF, 0xBB, 0x1E, 0x18, 0xD5, 0xCC, 0x50, 0x99, 0x50, 0x16, 0xD1, 0x82, 0x40,
0x69, 0x9A, 0xFB, 0xA3, 0x46, 0x2B, 0x09, 0x4A, 0xF1, 0x0E, 0xC4, 0x17, 0x8A, 0xA8, 0x66, 0x86,
0x0A, 0x85, 0x06, 0x94, 0xBB, 0xFD, 0x46, 0x0B, 0x85, 0x45, 0xCE, 0x32, 0x19, 0x13, 0xE9, 0x2B,
0x5D, 0x61, 0x54, 0x33, 0x43, 0x85, 0xC2, 0x08, 0xD2, 0x52, 0xE2, 0x31, 0xA3, 0x00, 0xB2, 0xCC,
0x88, 0xE5, 0x5D, 0xA9, 0x2F, 0x14, 0x51, 0xCF, 0x0C, 0x16, 0x0A, 0x5E, 0x2B, 0x0C, 0x10, 0xE8,
0xCE, 0x93, 0x14, 0xA0, 0x88, 0x37, 0xA8, 0xCE, 0x17, 0x8A, 0xA8, 0x67, 0x86, 0x0A, 0x05, 0x6F,
0x33, 0xAC, 0x12, 0xCA, 0x91, 0x6D, 0x1F, 0xA5, 0x20, 0xCE, 0x34, 0xAD, 0x22, 0xE1, 0x0B, 0x85,
0x8C, 0x7A, 0x66, 0xB0, 0x50, 0x28, 0x30, 0xF5, 0x77, 0x88, 0xDA, 0xE5, 0x03, 0xA9, 0xFE, 0xA6,
0x83, 0x33, 0xDE, 0xCF, 0xD7, 0xC8, 0x28, 0x67, 0x86, 0xCA, 0x04, 0x49, 0x47, 0x86, 0x14, 0xA8,
0xE6, 0xAE, 0x39, 0x1A, 0x63, 0xA0, 0xBE, 0x4B, 0x8A, 0xDE, 0x81, 0x22, 0xCA, 0x99, 0xA1, 0x42,
0xA1, 0xEA, 0x77, 0xCA, 0x9D, 0x70, 0x6D, 0x9C, 0x70, 0x00, 0xA8, 0x0D, 0xFA, 0xEF, 0x3D, 0x64,
0x54, 0x33, 0x43, 0x65, 0x42, 0x5A, 0x0D, 0x00, 0xC6, 0x08, 0x73, 0x08, 0x14, 0x0A, 0x04, 0x39,
0xAD, 0x7C, 0xA5, 0x2B, 0x19, 0xE5, 0xCC, 0x60, 0xA1, 0xC0, 0xFA, 0xE5, 0x0E, 0xB0, 0xCD, 0xFB,
0x1E, 0x58, 0x7F, 0x9D, 0x82, 0x40, 0x1A, 0xEB, 0x7D, 0x87, 0x54, 0x46, 0x3D, 0x33, 0x58, 0x28,
0xA4, 0x10, 0x48, 0x8E, 0xB3, 0x8A, 0xE6, 0xCD, 0x30, 0x5D, 0xBF, 0x52, 0x2C, 0x34, 0x79, 0x7F,
0xDF, 0x4A, 0x46, 0x3D, 0x33, 0x54, 0x28, 0xC0, 0x70, 0x3E, 0x61, 0xE1, 0xF0, 0xA6, 0xB9, 0x15,
0x86, 0x78, 0x3F, 0x22, 0xB4, 0xF2, 0xFE, 0x72, 0x4D, 0xD4, 0x33, 0x43, 0x85, 0x02, 0x95, 0x76,
0x64, 0x25, 0x6F, 0x42, 0xF6, 0xCB, 0x87, 0x62, 0x4C, 0x84, 0x04, 0xE5, 0xB4, 0x77, 0x4E, 0x11,
0xF5, 0xCC, 0xFF, 0x1B, 0x8A, 0xF1, 0xE8, 0xF8, 0x45, 0xD7, 0xF1, 0xE8, 0xF8, 0x15, 0xE5, 0x71,
0xFD, 0x25, 0xE6, 0xC9, 0xB3, 0x7F, 0x00, 0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0xD8, 0x8E, 0x16, 0xCE, 0x06, 0x00, 0x00, 0xD6, 0x99, 0x00,
0x00, 0x12, 0x00, 0x00, 0x00, 0x77, 0x70, 0x6D, 0x7A, 0x2F, 0x77, 0x61, 0x79, 0x6C, 0x69, 0x6E,
0x65, 0x73, 0x2E, 0x77, 0x70, 0x6D, 0x6C, 0xED, 0x9D, 0xDF, 0x6F, 0xDB, 0x36, 0x10, 0xC7, 0xDF,
0xFB, 0x57, 0x04, 0x79, 0xEE, 0xEC, 0xBB, 0x23, 0x8F, 0x3F, 0x0A, 0xD7, 0x45, 0xD1, 0x34, 0x68,
0x81, 0x0E, 0x0D, 0x96, 0x6C, 0x7D, 0x56, 0x6D, 0x25, 0xD1, 0x22, 0x4B, 0x86, 0x2C, 0x37, 0xED,
0xFE, 0xFA, 0x51, 0xB6, 0xE4, 0x58, 0x8E, 0xB3, 0x16, 0xE0, 0xA0, 0xBC, 0x5C, 0x50, 0x24, 0x15,
0xC9, 0x23, 0x29, 0x8A, 0x1F, 0x1F, 0x49, 0x7D, 0x49, 0x4F, 0xDE, 0x7C, 0x5F, 0xE4, 0x27, 0xDF,
0xD2, 0x6A, 0x95, 0x95, 0xC5, 0xEB, 0x53, 0x1C, 0xC1, 0xE9, 0x49, 0x5A, 0xCC, 0xCA, 0x79, 0x56,
0xDC, 0xBC, 0x3E, 0xFD, 0xF3, 0xEA, 0xFC, 0x37, 0x77, 0xFA, 0x66, 0xFA, 0x62, 0x72, 0x17, 0x52,
0x85, 0x94, 0xC5, 0xEA, 0xF5, 0xE9, 0x6D, 0x5D, 0x2F, 0x5F, 0x8D, 0xC7, 0xF7, 0xF7, 0xF7, 0xA3,
0x72, 0x99, 0x16, 0x37, 0xD9, 0x6A, 0x54, 0xA4, 0xF5, 0x38, 0xA4, 0x18, 0xD3, 0x88, 0x4E, 0xB7,
0xC9, 0x5E, 0xDD, 0x2F, 0x17, 0x79, 0x2F, 0xED, 0xFC, 0xEF, 0x6C, 0x34, 0x2B, 0x17, 0xE3, 0x10,
0xF1, 0xCF, 0x38, 0x94, 0x13, 0x4A, 0x9A, 0xBE, 0x38, 0x39, 0x99, 0x9C, 0x95, 0xB3, 0xF5, 0x22,
0x2D, 0xEA, 0xE6, 0x22, 0x5C, 0x36, 0x76, 0xAF, 0x16, 0xD9, 0xAA, 0xA9, 0xCF, 0xBB, 0xB2, 0xB8,
0xCE, 0x6E, 0xB6, 0x11, 0x5D, 0xD4, 0x75, 0xFE, 0xE3, 0xAA, 0xFC, 0x92, 0xFC, 0xC8, 0xB3, 0x22,
0xFD, 0xBD, 0x9C, 0xA7, 0xD3, 0x55, 0x72, 0x9D, 0xE6, 0x3F, 0x26, 0xE3, 0xE3, 0xB1, 0x7D, 0xDB,
0xAC, 0xC8, 0x56, 0xB7, 0x6F, 0x67, 0x75, 0xC8, 0x7B, 0x7A, 0x53, 0x7E, 0x28, 0x17, 0x69, 0x67,
0xB7, 0x1F, 0xD3, 0xB3, 0x49, 0xBF, 0x67, 0xF5, 0xE7, 0xE2, 0x8F, 0x77, 0x9F, 0xCA, 0x55, 0x1D,
0x6C, 0x42, 0x95, 0xEA, 0xAC, 0x58, 0x77, 0x76, 0xBD, 0xD8, 0x9E, 0x5D, 0x9D, 0xDC, 0xA5, 0x9F,
0xAF, 0xAF, 0x2F, 0xD3, 0xD9, 0xBA, 0xCA, 0xEA, 0x1F, 0x1F, 0xD2, 0xEC, 0xE6, 0xB6, 0x9E, 0x12,
0xB4, 0x86, 0xC7, 0xA3, 0x7B, 0x39, 0xDC, 0xE4, 0xE5, 0xD7, 0x24, 0xBF, 0xAA, 0x92, 0x62, 0x95,
0x35, 0xF5, 0x4A, 0xF2, 0xCB, 0x65, 0x9A, 0xCE, 0xA7, 0xDC, 0x66, 0xF1, 0x54, 0x7C, 0x2F, 0x93,
0x79, 0x55, 0x16, 0xE9, 0xC7, 0xE2, 0xBA, 0xEC, 0x82, 0x7B, 0x11, 0xEF, 0x8B, 0xF5, 0xE2, 0xAF,
0x24, 0x5F, 0xA7, 0x53, 0x63, 0xDB, 0x5C, 0x0F, 0xC2, 0x8F, 0x59, 0x5D, 0xAE, 0xBF, 0x3E, 0x24,
0x80, 0x7D, 0xBB, 0x5E, 0x4C, 0x57, 0x8F, 0xF1, 0xF1, 0x8A, 0x6C, 0x33, 0x5C, 0x86, 0x67, 0x55,
0x26, 0xF3, 0x63, 0x35, 0x6C, 0xA3, 0x1E, 0x32, 0x64, 0x6A, 0xF3, 0x7A, 0x14, 0x73, 0xDC, 0xF2,
0x68, 0x3D, 0x8F, 0xC5, 0x1D, 0x37, 0xBF, 0x28, 0xB7, 0xED, 0xFA, 0xB1, 0x98, 0xA7, 0xDF, 0x0F,
0xED, 0xFB, 0x91, 0xFD, 0x5B, 0x7D, 0x74, 0x4F, 0x6D, 0xF8, 0x91, 0x5E, 0x3D, 0x39, 0x2F, 0xF3,
0x79, 0x5A, 0x1D, 0x74, 0x9D, 0x74, 0xB1, 0xCC, 0x93, 0x3A, 0xFD, 0x38, 0xDF, 0x95, 0xBA, 0x17,
0x74, 0xD0, 0x3B, 0x43, 0x07, 0xAA, 0xD3, 0x6D, 0xF7, 0xD9, 0x74, 0xF8, 0x2A, 0x0D, 0xE9, 0xB2,
0x6F, 0xE9, 0x55, 0x79, 0x59, 0x27, 0x55, 0x7D, 0x51, 0x66, 0x45, 0xBD, 0xEB, 0xAC, 0x87, 0x89,
0x7B, 0x79, 0xDD, 0x6F, 0xB1, 0xD9, 0x2B, 0xF5, 0x21, 0xA4, 0xDF, 0xA7, 0xB2, 0x55, 0x9D, 0x14,
0xB3, 0xF0, 0x40, 0xD8, 0xE9, 0x91, 0xB7, 0x40, 0xA8, 0x9D, 0x56, 0xB6, 0xEB, 0x98, 0xBB, 0xF8,
0xBE, 0xD5, 0xBA, 0x4A, 0x36, 0x78, 0x21, 0x38, 0x35, 0x72, 0x04, 0xC6, 0x3A, 0x8B, 0xE0, 0x75,
0x67, 0xD5, 0xC5, 0xF7, 0xAC, 0x92, 0x75, 0x5D, 0x9E, 0xE7, 0x4D, 0x85, 0xFB, 0x9D, 0xFF, 0x30,
0xBC, 0x33, 0xBA, 0xC8, 0x93, 0x59, 0xBA, 0x48, 0xAA, 0xBB, 0xBD, 0x87, 0xBA, 0x69, 0x83, 0x87,
0xEB, 0x10, 0x32, 0x2B, 0xCB, 0x2A, 0x7C, 0xC2, 0x85, 0x06, 0x5D, 0xED, 0x87, 0x9F, 0x9C, 0x20,
0xAA, 0x91, 0xD7, 0xA8, 0xAC, 0x46, 0x67, 0x0C, 0x99, 0x97, 0x44, 0x23, 0x26, 0xD2, 0xDA, 0x6B,
0xE7, 0x2C, 0x20, 0xED, 0xE7, 0x32, 0x3E, 0x9A, 0xCD, 0x64, 0x7C, 0x50, 0xDE, 0xF6, 0x46, 0xB2,
0x5E, 0x2F, 0xCA, 0xF6, 0xBB, 0xCD, 0xD1, 0x87, 0x19, 0x9A, 0x09, 0x8E, 0x3D, 0xB7, 0x43, 0xA3,
0xF0, 0x8C, 0x96, 0x4D, 0x79, 0xFD, 0xE6, 0xE9, 0x87, 0x3E, 0x61, 0xF2, 0x21, 0x4D, 0x9A, 0x8F,
0xF9, 0x8B, 0xA4, 0x4A, 0x16, 0xBD, 0xE6, 0x39, 0x96, 0x6A, 0xD3, 0x5F, 0xAE, 0xCB, 0x3C, 0x2F,
0xEF, 0xDB, 0xCF, 0xD7, 0x83, 0xA2, 0xF6, 0xD3, 0xFD, 0x2C, 0xB3, 0xB7, 0xC5, 0x4D, 0x9E, 0xEE,
0x77, 0xB3, 0xC7, 0x91, 0x4F, 0x66, 0x11, 0x5A, 0x77, 0xDB, 0xC0, 0xC1, 0x83, 0x6C, 0x7E, 0x5E,
0x3E, 0xFA, 0xCF, 0x41, 0xBE, 0x3B, 0x8B, 0x5F, 0xAA, 0xD6, 0xFB, 0x22, 0xF9, 0xFA, 0x93, 0xCA,
0xB5, 0x49, 0xF6, 0x1E, 0xF9, 0x2F, 0xB4, 0x6B, 0xBF, 0xC4, 0xAB, 0x75, 0x55, 0xFC, 0xA4, 0xE1,
0x9B, 0x24, 0x9B, 0xD6, 0xAC, 0xCB, 0x4D, 0xF5, 0xDF, 0x16, 0xF3, 0xCB, 0xBA, 0x5C, 0x7E, 0xC9,
0xEA, 0xDB, 0xB3, 0x6C, 0x35, 0xDB, 0x3A, 0xA2, 0xE0, 0x3B, 0xDE, 0xAD, 0xAB, 0x6F, 0x49, 0xBD,
0xAE, 0x0E, 0x1F, 0xC8, 0xCE, 0xFE, 0x3F, 0x4B, 0x38, 0x4B, 0x16, 0xCB, 0x50, 0xD9, 0x90, 0x63,
0xFD, 0xE8, 0x9E, 0x0F, 0xE3, 0x9F, 0xBA, 0xE1, 0x23, 0x37, 0xB3, 0x2D, 0x68, 0xBD, 0x4A, 0x2F,
0xEB, 0x2A, 0x69, 0xFA, 0xED, 0xA7, 0xD0, 0x63, 0xA6, 0xD8, 0x1A, 0x1E, 0x86, 0xEF, 0x3E, 0x3F,
0x1F, 0xE1, 0xFB, 0xFF, 0x00, 0x4D, 0xD6, 0x80, 0x52, 0xE1, 0x37, 0xB6, 0x40, 0x93, 0x51, 0x5A,
0x13, 0x21, 0xEA, 0x48, 0xA0, 0x51, 0x80, 0x16, 0xA0, 0x05, 0xE8, 0xA1, 0x81, 0x56, 0xA8, 0x94,
0x73, 0xDA, 0xF8, 0x16, 0x68, 0x15, 0x9C, 0x35, 0x2B, 0x6B, 0xB5, 0x76, 0x91, 0x40, 0x93, 0x00,
0x2D, 0x40, 0x0B, 0xD0, 0x43, 0x03, 0x1D, 0x10, 0x06, 0xEF, 0xC9, 0x9B, 0x8E, 0xE7, 0x30, 0xFE,
0xD6, 0xA0, 0x0D, 0xAA, 0x48, 0x9E, 0x95, 0xF0, 0x2C, 0x3C, 0x0B, 0xCF, 0x43, 0xF3, 0x6C, 0x9C,
0x22, 0x46, 0x26, 0xE8, 0x1C, 0xB4, 0x32, 0x0C, 0xDA, 0x72, 0xF8, 0x13, 0x09, 0xB4, 0x16, 0xA0,
0x05, 0x68, 0x01, 0x7A, 0x68, 0xA0, 0xAD, 0xB5, 0xC4, 0xCC, 0x06, 0x76, 0x53, 0x68, 0x8D, 0x9E,
0xB4, 0x05, 0x1D, 0xBB, 0x26, 0xC6, 0x02, 0xB4, 0x00, 0x2D, 0x40, 0x0F, 0x0D, 0xB4, 0x53, 0xE1,
0x5F, 0x33, 0xE2, 0xD6, 0x5B, 0xA0, 0xC1, 0x29, 0x8B, 0x60, 0x08, 0x28, 0x76, 0x0A, 0x6D, 0x04,
0x68, 0x01, 0x5A, 0x80, 0x1E, 0xDE, 0x43, 0x7B, 0xCF, 0xC0, 0x0A, 0xB6, 0x73, 0x68, 0xF4, 0xAC,
0xC3, 0x8C, 0x1A, 0xC2, 0x58, 0x3C, 0xD6, 0x43, 0x5B, 0x01, 0x5A, 0x80, 0x16, 0xA0, 0x07, 0x9F,
0x43, 0x7B, 0xE5, 0x9D, 0x33, 0x4C, 0xAE, 0x05, 0x5A, 0x03, 0xF3, 0xE6, 0xC5, 0xB9, 0x8D, 0x04,
0xDA, 0x09, 0xD0, 0x02, 0xB4, 0x00, 0x3D, 0x38, 0xD0, 0x0A, 0x9D, 0x41, 0x6F, 0x1D, 0x6D, 0x81,
0x76, 0xD6, 0x31, 0x80, 0x82, 0xE8, 0x45, 0x6E, 0x2F, 0x3C, 0x0B, 0xCF, 0xC2, 0xF3, 0xD0, 0x3C,
0x6B, 0xCB, 0x2E, 0x38, 0x64, 0xC5, 0xED, 0x88, 0xDB, 0x79, 0xEB, 0x81, 0x2C, 0x10, 0x9B, 0x48,
0xA0, 0x51, 0x84, 0x62, 0x42, 0xB4, 0x10, 0x3D, 0xBC, 0xAE, 0x44, 0x19, 0xEF, 0x98, 0xBC, 0x7E,
0x18, 0x72, 0x03, 0x87, 0x11, 0x38, 0x42, 0xAC, 0x8B, 0x46, 0x51, 0x8A, 0x09, 0xD1, 0x42, 0xF4,
0xF0, 0xD2, 0x4F, 0xC5, 0x4A, 0x69, 0x6F, 0xBC, 0x6E, 0x89, 0xF6, 0xCE, 0x80, 0x31, 0x26, 0x38,
0xE9, 0x58, 0xA2, 0x45, 0x2A, 0x26, 0x44, 0x0B, 0xD1, 0x83, 0x13, 0x0D, 0xCE, 0x35, 0x4A, 0x6E,
0x43, 0xB8, 0x7B, 0x71, 0xA5, 0x6C, 0x03, 0x35, 0xC6, 0x2E, 0x8B, 0xA1, 0x88, 0xC5, 0x84, 0x68,
0x21, 0x7A, 0x70, 0xA2, 0x11, 0xD1, 0x5B, 0xE3, 0x74, 0x2B, 0xFE, 0x44, 0x63, 0x54, 0x40, 0x1A,
0x55, 0xF4, 0xE6, 0x0C, 0xD1, 0x8A, 0x09, 0xCF, 0xC2, 0xF3, 0xF0, 0x3C, 0x3B, 0x56, 0xC6, 0x81,
0xB5, 0x1D, 0xD0, 0xDE, 0x06, 0x77, 0x1D, 0x66, 0xD5, 0x14, 0x4D, 0xB4, 0x88, 0xC5, 0x84, 0x68,
0x21, 0x7A, 0xF8, 0x75, 0x31, 0x32, 0xD6, 0x93, 0x71, 0xCA, 0xB7, 0x44, 0x5B, 0x05, 0xDE, 0x59,
0x64, 0x1B, 0xBD, 0xD2, 0x2D, 0x6A, 0x31, 0x21, 0x5A, 0x88, 0x1E, 0xFE, 0xDD, 0x95, 0x22, 0x85,
0x61, 0xD0, 0x6D, 0x54, 0xE7, 0xA3, 0xD9, 0x93, 0x75, 0x64, 0x20, 0x7A, 0x5D, 0x4C, 0xE4, 0x62,
0x42, 0xB4, 0x10, 0x3D, 0xFC, 0x16, 0x4A, 0xC3, 0x01, 0x5F, 0xC6, 0x8E, 0x67, 0x03, 0x14, 0xC2,
0x00, 0x62, 0xD5, 0x9F, 0x28, 0x6A, 0x31, 0xE1, 0x59, 0x78, 0x1E, 0x5E, 0x2D, 0xD6, 0xC8, 0xB7,
0x19, 0xAD, 0x6D, 0xC7, 0xDC, 0xE0, 0xD9, 0x90, 0xD3, 0xC8, 0x3E, 0xFA, 0x5D, 0xB4, 0xE8, 0xC5,
0x84, 0x68, 0x21, 0x7A, 0x78, 0x0F, 0xED, 0x91, 0x75, 0xA0, 0x9A, 0x3B, 0xA2, 0x0D, 0x31, 0x83,
0x07, 0x03, 0xB1, 0xB3, 0xE8, 0xDD, 0xB9, 0x82, 0x42, 0xB4, 0x10, 0x2D, 0x44, 0x0F, 0x78, 0x6C,
0x09, 0x38, 0xDD, 0x4C, 0xA4, 0x3B, 0xA2, 0x59, 0x03, 0x19, 0x0A, 0xA3, 0xEF, 0xE8, 0x73, 0x88,
0x44, 0x2F, 0x26, 0x44, 0x0B, 0xD1, 0xC3, 0xAF, 0x8B, 0x99, 0x30, 0x6B, 0x66, 0x85, 0xE8, 0x76,
0xEA, 0x12, 0x40, 0xB0, 0x2A, 0x78, 0xED, 0x58, 0xA2, 0x45, 0x2F, 0x26, 0x44, 0x0B, 0xD1, 0xC3,
0x13, 0x0D, 0x48, 0xAC, 0x34, 0x99, 0xEE, 0x6D, 0xB4, 0x22, 0xAF, 0x98, 0xD9, 0x5B, 0x8C, 0x25,
0x5A, 0xF4, 0x62, 0x42, 0xB4, 0x10, 0xFD, 0x0C, 0x9A, 0x6E, 0xAF, 0x1D, 0x68, 0x24, 0xEA, 0x56,
0xC6, 0x8C, 0x53, 0xCD, 0x6E, 0xE9, 0x68, 0x17, 0x2D, 0x82, 0x31, 0x01, 0x5A, 0x80, 0x1E, 0x5E,
0x5E, 0x62, 0x3C, 0x87, 0x59, 0xB4, 0xE2, 0x96, 0x67, 0xB0, 0x96, 0x39, 0x5C, 0x46, 0x2B, 0xBA,
0x49, 0xF4, 0x62, 0x02, 0xB4, 0x00, 0x3D, 0xFC, 0x98, 0xDB, 0x11, 0x39, 0x04, 0x52, 0xB6, 0xDD,
0x75, 0x65, 0x8D, 0x56, 0xA8, 0x35, 0x71, 0xB4, 0x8B, 0x16, 0xBD, 0x98, 0x10, 0x2D, 0x44, 0x0F,
0xFF, 0x36, 0x1A, 0x49, 0x6D, 0x56, 0xB7, 0x3B, 0xA2, 0x1D, 0x21, 0xD8, 0xC0, 0xB8, 0x8A, 0xD5,
0x97, 0x90, 0xE8, 0xC5, 0x84, 0x68, 0x21, 0x7A, 0xF8, 0xF3, 0x02, 0x81, 0x8D, 0x52, 0xF4, 0x30,
0x8B, 0x46, 0x76, 0x01, 0x70, 0x07, 0x14, 0xFD, 0x36, 0x5A, 0x14, 0x63, 0x42, 0xB4, 0x10, 0x3D,
0x3C, 0xD1, 0x61, 0x88, 0x6D, 0x91, 0xD1, 0xEC, 0xED, 0x8C, 0x46, 0xCD, 0x88, 0xCE, 0xC7, 0x12,
0x2D, 0x8A, 0x31, 0x21, 0x5A, 0x88, 0x7E, 0x8E, 0x23, 0x40, 0x9D, 0x06, 0xED, 0xD9, 0x75, 0x5B,
0xA3, 0xD9, 0x5A, 0x76, 0x9A, 0x21, 0x96, 0x68, 0x25, 0x8A, 0x31, 0x21, 0x5A, 0x88, 0x7E, 0x06,
0x55, 0x37, 0xDA, 0xE0, 0xA8, 0xA9, 0x1B, 0x75, 0x13, 0x37, 0xDD, 0xC4, 0xDB, 0xE8, 0xC3, 0x0E,
0x94, 0x08, 0xC6, 0x04, 0x68, 0x01, 0x7A, 0x78, 0x09, 0xA8, 0xF2, 0x6C, 0x59, 0xA3, 0x6E, 0x37,
0x52, 0x92, 0xB5, 0x16, 0x9B, 0xBD, 0x57, 0x14, 0xED, 0xA2, 0x45, 0x30, 0x26, 0x44, 0x0B, 0xD1,
0xCF, 0x20, 0x01, 0x6D, 0x86, 0xDC, 0xE0, 0x3B, 0x0F, 0xED, 0x11, 0xC9, 0x58, 0x8A, 0x5F, 0xE9,
0x56, 0xA2, 0x17, 0x13, 0xA0, 0x05, 0xE8, 0xE1, 0xE5, 0x25, 0xCE, 0x20, 0xA2, 0xB5, 0x60, 0x77,
0x2E, 0x5A, 0x23, 0xB0, 0x37, 0x3A, 0x56, 0x5F, 0xA2, 0x44, 0x30, 0x26, 0x44, 0x0B, 0xD1, 0xCF,
0x71, 0x1E, 0x11, 0x13, 0xA2, 0x6B, 0xCF, 0xE9, 0xA6, 0xE6, 0xDB, 0xA3, 0x19, 0x95, 0x75, 0xD1,
0xFB, 0xAE, 0x94, 0x28, 0xC6, 0x84, 0x68, 0x21, 0xFA, 0x19, 0x4E, 0xDE, 0x07, 0x20, 0xF6, 0x61,
0x26, 0xDD, 0x7E, 0x97, 0x86, 0x69, 0xBE, 0xBB, 0x0E, 0x0C, 0x63, 0xF4, 0xA8, 0x5B, 0x14, 0x63,
0x42, 0xB4, 0x10, 0x3D, 0xFC, 0x29, 0xA0, 0x36, 0xCC, 0xA1, 0x1D, 0xEE, 0xBE, 0x8F, 0xD2, 0x81,
0x65, 0x13, 0xC6, 0xDD, 0x46, 0xC7, 0x9E, 0x5F, 0xA2, 0x44, 0x31, 0x26, 0x44, 0x0B, 0xD1, 0xC3,
0xEF, 0xBB, 0xD2, 0xC6, 0xB3, 0x53, 0x9A, 0xDB, 0xA5, 0x6E, 0x1D, 0x18, 0x07, 0x85, 0xDA, 0x9B,
0xE8, 0x79, 0xB4, 0x28, 0xC6, 0x84, 0x68, 0x21, 0xFA, 0x97, 0x89, 0x9E, 0x8C, 0xCF, 0xCB, 0x7C,
0x9E, 0x56, 0xCD, 0xD5, 0x64, 0x7C, 0x56, 0xCE, 0xD6, 0x8B, 0xB4, 0x79, 0x8E, 0x93, 0xF1, 0xDD,
0x22, 0x9F, 0xBE, 0xF8, 0x17, 0x50, 0x4B, 0x01, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA8, 0x54, 0x6C, 0xA8, 0x06, 0x00, 0x00, 0xD9, 0x59, 0x00,
0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x77, 0x70, 0x6D, 0x7A, 0x2F, 0x74, 0x65, 0x6D, 0x70, 0x6C, 0x61, 0x74, 0x65,
0x2E, 0x6B, 0x6D, 0x6C, 0x50, 0x4B, 0x01, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0xB3, 0xD8, 0x8E, 0x16, 0xCE, 0x06, 0x00, 0x00, 0xD6, 0x99, 0x00, 0x00,
0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x06,
0x00, 0x00, 0x77, 0x70, 0x6D, 0x7A, 0x2F, 0x77, 0x61, 0x79, 0x6C, 0x69, 0x6E, 0x65, 0x73, 0x2E,
0x77, 0x70, 0x6D, 0x6C, 0x50, 0x4B, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,
0x7F, 0x00, 0x00, 0x00, 0xD5, 0x0D, 0x00, 0x00, 0x00, 0x00
};
#endif /* __waypoint_v3_test_file_kmz_h_included */

View File

@ -0,0 +1,708 @@
/**
********************************************************************
* @file test_widget_speaker.c
* @brief
*
* @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 DJIs 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.
*
*********************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#ifdef SYSTEM_ARCH_LINUX
#include "test_widget_speaker.h"
#include "dji_logger.h"
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include "utils/util_misc.h"
#include "utils/util_md5.h"
#ifdef OPUS_INSTALLED
#include <opus.h>
#endif
/* Private constants ---------------------------------------------------------*/
#define WIDGET_SPEAKER_TASK_STACK_SIZE (2048)
#define WIDGET_SPEAKER_USB_AUDIO_DEVICE_NAME "alsa_output.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.analog-stereo"
#define WIDGET_SPEAKER_AUDIO_OPUS_FILE_NAME "test_audio.opus"
#define WIDGET_SPEAKER_AUDIO_PCM_FILE_NAME "test_audio.pcm"
#define WIDGET_SPEAKER_TTS_FILE_NAME "test_tts.txt"
#define WIDGET_SPEAKER_TTS_OUTPUT_FILE_NAME "tts_sample.wav"
#define WIDGET_SPEAKER_TTS_FILE_MAX_SIZE (3000)
/*The frame size is hardcoded for this sample code but it doesn't have to be*/
#define WIDGET_SPEAKER_AUDIO_OPUS_MAX_PACKET_SIZE (3 * 1276)
#define WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE (6 * 960)
#define WIDGET_SPEAKER_AUDIO_OPUS_SAMPLE_RATE (16000)
#define WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS (1)
#define WIDGET_SPEAKER_AUDIO_OPUS_DECODE_FRAME_SIZE (160)
/* Private types -------------------------------------------------------------*/
/* Private values -------------------------------------------------------------*/
static T_DjiWidgetSpeakerHandler s_speakerHandler = {0};
static T_DjiMutexHandle s_speakerMutex = {0};
static T_DjiWidgetSpeakerState s_speakerState = {0};
static T_DjiTaskHandle s_widgetSpeakerTestThread;
static FILE *audioFile = NULL;
static FILE *ttsFile = NULL;
/* Private functions declaration ---------------------------------------------*/
static T_DjiReturnCode GetSpeakerState(T_DjiWidgetSpeakerState *speakerState);
static T_DjiReturnCode SetWorkMode(E_DjiWidgetSpeakerWorkMode workMode);
static T_DjiReturnCode GetWorkMode(E_DjiWidgetSpeakerWorkMode *workMode);
static T_DjiReturnCode SetPlayMode(E_DjiWidgetSpeakerPlayMode playMode);
static T_DjiReturnCode GetPlayMode(E_DjiWidgetSpeakerPlayMode *playMode);
static T_DjiReturnCode StartPlay(void);
static T_DjiReturnCode StopPlay(void);
static T_DjiReturnCode SetVolume(uint8_t volume);
static T_DjiReturnCode GetVolume(uint8_t *volume);
static T_DjiReturnCode ReceiveTtsData(E_DjiWidgetTransmitDataEvent event,
uint32_t offset, uint8_t *buf, uint16_t size);
static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
uint32_t offset, uint8_t *buf, uint16_t size);
static void *DjiTest_WidgetSpeakerTask(void *arg);
static uint32_t DjiTest_GetVoicePlayProcessId(void);
static uint32_t DjiTest_KillVoicePlayProcess(uint32_t pid);
static T_DjiReturnCode DjiTest_DecodeAudioData(void);
static T_DjiReturnCode DjiTest_PlayAudioData(void);
static T_DjiReturnCode DjiTest_PlayTtsData(void);
static T_DjiReturnCode DjiTest_CheckFileMd5Sum(const char *path, uint8_t *buf, uint16_t size);
/* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode DjiTest_WidgetSpeakerStartService(void)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
s_speakerHandler.GetSpeakerState = GetSpeakerState;
s_speakerHandler.SetWorkMode = SetWorkMode;
s_speakerHandler.GetWorkMode = GetWorkMode;
s_speakerHandler.StartPlay = StartPlay;
s_speakerHandler.StopPlay = StopPlay;
s_speakerHandler.SetPlayMode = SetPlayMode;
s_speakerHandler.GetPlayMode = GetPlayMode;
s_speakerHandler.SetVolume = SetVolume;
s_speakerHandler.GetVolume = GetVolume;
s_speakerHandler.ReceiveTtsData = ReceiveTtsData;
s_speakerHandler.ReceiveVoiceData = ReceiveAudioData;
returnCode = osalHandler->MutexCreate(&s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Create speaker mutex error: 0x%08llX", returnCode);
return returnCode;
}
returnCode = DjiWidget_RegSpeakerHandler(&s_speakerHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Register speaker handler error: 0x%08llX", returnCode);
return returnCode;
}
if (osalHandler->TaskCreate("user_widget_speaker_task", DjiTest_WidgetSpeakerTask, WIDGET_SPEAKER_TASK_STACK_SIZE,
NULL,
&s_widgetSpeakerTestThread) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Dji widget speaker test task create error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/* Private functions definition-----------------------------------------------*/
static uint32_t DjiTest_GetVoicePlayProcessId(void)
{
FILE *fp;
char cmdStr[128];
uint32_t pid;
int ret;
snprintf(cmdStr, 128, "pgrep ffplay");
fp = popen(cmdStr, "r");
if (fp == NULL) {
USER_LOG_ERROR("fp is null.");
return 0;
}
ret = fscanf(fp, "%u", &pid);
if (ret <= 0) {
USER_LOG_ERROR("get pid error.");
pid = 0;
goto out;
}
out:
pclose(fp);
return pid;
}
static uint32_t DjiTest_KillVoicePlayProcess(uint32_t pid)
{
FILE *fp;
char cmdStr[128];
snprintf(cmdStr, 128, "kill %d", pid);
fp = popen(cmdStr, "r");
if (fp == NULL) {
USER_LOG_ERROR("fp is null.");
return 0;
}
pclose(fp);
return pid;
}
static T_DjiReturnCode DjiTest_DecodeAudioData(void)
{
#ifdef OPUS_INSTALLED
FILE *fin;
FILE *fout;
OpusDecoder *decoder;
opus_int16 out[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS];
uint8_t cbits[WIDGET_SPEAKER_AUDIO_OPUS_MAX_PACKET_SIZE];
int32_t nbBytes;
int32_t err;
/*! 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) {
fprintf(stderr, "failed to open input file: %s\n", strerror(errno));
return EXIT_FAILURE;
}
/* Create a new decoder state. */
decoder = opus_decoder_create(WIDGET_SPEAKER_AUDIO_OPUS_SAMPLE_RATE, WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, &err);
if (err < 0) {
fprintf(stderr, "failed to create decoder: %s\n", opus_strerror(err));
return EXIT_FAILURE;
}
fout = fopen(WIDGET_SPEAKER_AUDIO_PCM_FILE_NAME, "w");
if (fout == NULL) {
fprintf(stderr, "failed to open output file: %s\n", strerror(errno));
return EXIT_FAILURE;
}
USER_LOG_INFO("Decode Start...");
while (1) {
int i;
unsigned char pcm_bytes[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * 2];
int frame_size;
/* Read a 16 bits/sample audio frame. */
nbBytes = fread(cbits, 1, WIDGET_SPEAKER_AUDIO_OPUS_DECODE_FRAME_SIZE, fin);
if (feof(fin))
break;
/* Decode the data. In this example, frame_size will be constant because
the encoder is using a constant frame size. However, that may not
be the case for all encoders, so the decoder must always check
the frame size returned. */
frame_size = opus_decode(decoder, cbits, nbBytes, out, WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE, 0);
if (frame_size < 0) {
fprintf(stderr, "decoder failed: %s\n", opus_strerror(frame_size));
return EXIT_FAILURE;
}
USER_LOG_DEBUG("decode data to file: %d\r\n", frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS);
/* Convert to little-endian ordering. */
for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++) {
pcm_bytes[2 * i] = out[i] & 0xFF;
pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF;
}
/* Write the decoded audio to file. */
fwrite(pcm_bytes, sizeof(short), frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, fout);
}
/*Destroy the encoder state*/
opus_decoder_destroy(decoder);
fclose(fin);
fclose(fout);
USER_LOG_INFO("Decode Finished...");
#endif
return EXIT_SUCCESS;
}
static T_DjiReturnCode DjiTest_PlayAudioData(void)
{
char cmdStr[128];
memset(cmdStr, 0, sizeof(cmdStr));
snprintf(cmdStr, sizeof(cmdStr), "ffplay -nodisp -autoexit -ar 16000 -ac 1 -f s16le -i %s 2>/dev/null",
WIDGET_SPEAKER_AUDIO_PCM_FILE_NAME);
return DjiUserUtil_RunSystemCmd(cmdStr);
}
static T_DjiReturnCode DjiTest_PlayTtsData(void)
{
FILE *txtFile;
uint8_t data[WIDGET_SPEAKER_TTS_FILE_MAX_SIZE] = {0};
int32_t readLen;
char cmdStr[WIDGET_SPEAKER_TTS_FILE_MAX_SIZE + 128];
txtFile = fopen(WIDGET_SPEAKER_TTS_FILE_NAME, "r");
if (txtFile == NULL) {
fprintf(stderr, "failed to open input file: %s\n", strerror(errno));
return EXIT_FAILURE;
}
readLen = fread(data, 1, WIDGET_SPEAKER_TTS_FILE_MAX_SIZE, txtFile);
if (readLen <= 0) {
USER_LOG_ERROR("Read tts file failed, error code: %d", readLen);
fclose(txtFile);
return DJI_ERROR_SYSTEM_MODULE_CODE_NOT_FOUND;
}
fclose(txtFile);
USER_LOG_INFO("Read tts file success, len: %d", readLen);
USER_LOG_INFO("Content: %s", data);
memset(cmdStr, 0, sizeof(cmdStr));
/*! Attention: you can use other tts opensource function to convert txt to speech, example used ekho v7.5 */
snprintf(cmdStr, sizeof(cmdStr), " ekho %s -s 20 -p 20 -a 100", data);
return DjiUserUtil_RunSystemCmd(cmdStr);
}
static T_DjiReturnCode DjiTest_CheckFileMd5Sum(const char *path, uint8_t *buf, uint16_t size)
{
MD5_CTX md5Ctx;
uint32_t readFileTotalSize = 0;
uint16_t readLen;
T_DjiReturnCode returnCode;
uint8_t readBuf[1024];
uint8_t md5Sum[16];
FILE *file = NULL;;
UtilMd5_Init(&md5Ctx);
file = fopen(path, "rb");
if (file == NULL) {
USER_LOG_ERROR("Open tts file error.");
}
while (1) {
returnCode = fseek(file, readFileTotalSize, SEEK_SET);
if (returnCode != 0) {
USER_LOG_INFO("fseek file error");
}
readLen = fread(readBuf, 1, sizeof(readBuf), file);
if (readLen > 0) {
readFileTotalSize += readLen;
UtilMd5_Update(&md5Ctx, readBuf, readLen);
}
if (feof(file))
break;
}
UtilMd5_Final(&md5Ctx, md5Sum);
fclose(file);
if (size == sizeof(md5Sum)) {
if (memcmp(md5Sum, buf, sizeof(md5Sum)) == 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
} else {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
} else {
USER_LOG_ERROR("MD5 sum length error");
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode GetSpeakerState(T_DjiWidgetSpeakerState *speakerState)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
returnCode = osalHandler->MutexLock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
*speakerState = s_speakerState;
returnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode SetWorkMode(E_DjiWidgetSpeakerWorkMode workMode)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
returnCode = osalHandler->MutexLock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
USER_LOG_INFO("Set widget speaker work mode: %d", workMode);
s_speakerState.workMode = workMode;
returnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode GetWorkMode(E_DjiWidgetSpeakerWorkMode *workMode)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
returnCode = osalHandler->MutexLock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
*workMode = s_speakerState.workMode;
returnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode SetPlayMode(E_DjiWidgetSpeakerPlayMode playMode)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
returnCode = osalHandler->MutexLock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
USER_LOG_INFO("Set widget speaker play mode: %d", playMode);
s_speakerState.playMode = playMode;
returnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode GetPlayMode(E_DjiWidgetSpeakerPlayMode *playMode)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
returnCode = osalHandler->MutexLock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
*playMode = s_speakerState.playMode;
returnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode StartPlay(void)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
returnCode = osalHandler->MutexLock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
USER_LOG_INFO("Start widget speaker play");
s_speakerState.state = DJI_WIDGET_SPEAKER_STATE_PLAYING;
returnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode StopPlay(void)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
uint32_t pid;
returnCode = osalHandler->MutexLock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
USER_LOG_INFO("Stop widget speaker play");
s_speakerState.state = DJI_WIDGET_SPEAKER_STATE_IDEL;
pid = DjiTest_GetVoicePlayProcessId();
if (pid != 0) {
DjiTest_KillVoicePlayProcess(pid);
}
returnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode SetVolume(uint8_t volume)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
char cmdStr[128];
int32_t ret = 0;
float realVolume;
returnCode = osalHandler->MutexLock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
realVolume = 1.5f * (float) volume;
USER_LOG_INFO("Set widget speaker volume: %d", volume);
s_speakerState.volume = volume;
memset(cmdStr, 0, sizeof(cmdStr));
snprintf(cmdStr, sizeof(cmdStr), "pactl set-sink-volume %s %d%%", WIDGET_SPEAKER_USB_AUDIO_DEVICE_NAME,
(int32_t) realVolume);
returnCode = DjiUserUtil_RunSystemCmd(cmdStr);
if (returnCode < 0) {
USER_LOG_ERROR("Set widget speaker volume error: %d", ret);
}
returnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode GetVolume(uint8_t *volume)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
returnCode = osalHandler->MutexLock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
*volume = s_speakerState.volume;
returnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode ReceiveTtsData(E_DjiWidgetTransmitDataEvent event,
uint32_t offset, uint8_t *buf, uint16_t size)
{
uint16_t writeLen;
T_DjiReturnCode returnCode;
if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_START) {
USER_LOG_INFO("Create tts file.");
ttsFile = fopen(WIDGET_SPEAKER_TTS_FILE_NAME, "wb");
if (ttsFile == NULL) {
USER_LOG_ERROR("Open tts file error.");
}
} else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_TRANSMIT) {
USER_LOG_INFO("Transmit tts file, offset: %d, size: %d", offset, size);
if (ttsFile != NULL) {
fseek(ttsFile, offset, SEEK_SET);
writeLen = fwrite(buf, 1, size, ttsFile);
if (writeLen != size) {
USER_LOG_ERROR("Write tts file error %d", writeLen);
}
}
} else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_FINISH) {
USER_LOG_INFO("Close tts file.");
if (ttsFile != NULL) {
fclose(ttsFile);
}
returnCode = DjiTest_CheckFileMd5Sum(WIDGET_SPEAKER_TTS_FILE_NAME, buf, size);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("File md5 sum check failed");
}
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
uint32_t offset, uint8_t *buf, uint16_t size)
{
uint16_t writeLen;
T_DjiReturnCode returnCode;
if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_START) {
USER_LOG_INFO("Create voice file.");
audioFile = fopen(WIDGET_SPEAKER_AUDIO_OPUS_FILE_NAME, "wb");
if (audioFile == NULL) {
USER_LOG_ERROR("Create tts file error.");
}
} else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_TRANSMIT) {
USER_LOG_INFO("Transmit voice file, offset: %d, size: %d", offset, size);
if (audioFile != NULL) {
fseek(audioFile, offset, SEEK_SET);
writeLen = fwrite(buf, 1, size, audioFile);
if (writeLen != size) {
USER_LOG_ERROR("Write tts file error %d", writeLen);
}
}
} else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_FINISH) {
USER_LOG_INFO("Close voice file.");
if (audioFile != NULL) {
fclose(audioFile);
}
returnCode = DjiTest_CheckFileMd5Sum(WIDGET_SPEAKER_AUDIO_OPUS_FILE_NAME, buf, size);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("File md5 sum check failed");
}
DjiTest_DecodeAudioData();
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
#ifndef __CC_ARM
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmissing-noreturn"
#pragma GCC diagnostic ignored "-Wreturn-type"
#endif
static void *DjiTest_WidgetSpeakerTask(void *arg)
{
T_DjiReturnCode djiReturnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
USER_UTIL_UNUSED(arg);
while (1) {
osalHandler->TaskSleepMs(10);
if (s_speakerState.state == DJI_WIDGET_SPEAKER_STATE_PLAYING) {
if (s_speakerState.playMode == DJI_WIDGET_SPEAKER_PLAY_MODE_LOOP_PLAYBACK) {
if (s_speakerState.workMode == DJI_WIDGET_SPEAKER_WORK_MODE_VOICE) {
djiReturnCode = DjiTest_PlayAudioData();
if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Play audio data failed, error: 0x%08llX.", djiReturnCode);
}
} else {
djiReturnCode = DjiTest_PlayTtsData();
if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Play tts data failed, error: 0x%08llX.", djiReturnCode);
}
}
} else {
if (s_speakerState.workMode == DJI_WIDGET_SPEAKER_WORK_MODE_VOICE) {
djiReturnCode = DjiTest_PlayAudioData();
if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Play audio data failed, error: 0x%08llX.", djiReturnCode);
}
} else {
djiReturnCode = DjiTest_PlayTtsData();
if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Play tts data failed, error: 0x%08llX.", djiReturnCode);
}
}
djiReturnCode = osalHandler->MutexLock(s_speakerMutex);
if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("lock mutex error: 0x%08llX.", djiReturnCode);
}
s_speakerState.state = DJI_WIDGET_SPEAKER_STATE_IDEL;
djiReturnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", djiReturnCode);
}
}
}
}
}
#ifndef __CC_ARM
#pragma GCC diagnostic pop
#endif
#endif
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/

View File

@ -0,0 +1,53 @@
/**
********************************************************************
* @file test_widget_speaker.h
* @brief This is the header file for "test_widget_speaker.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 DJIs 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 TEST_WIDGET_SPEAKER_H
#define TEST_WIDGET_SPEAKER_H
/* Includes ------------------------------------------------------------------*/
#include "dji_widget.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef SYSTEM_ARCH_LINUX
/* Exported constants --------------------------------------------------------*/
T_DjiReturnCode DjiTest_WidgetSpeakerStartService(void);
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
#endif
#ifdef __cplusplus
}
#endif
#endif // TEST_WIDGET_SPEAKER_H
/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/

View File

@ -7,6 +7,10 @@
"floating_window": { "floating_window": {
"is_enable": true "is_enable": true
}, },
"speaker": {
"is_enable_tts": true,
"is_enable_voice": true
},
"widget_list": [ "widget_list": [
{ {
"widget_index": 0, "widget_index": 0,

View File

@ -7,6 +7,10 @@
"floating_window": { "floating_window": {
"is_enable": true "is_enable": true
}, },
"speaker": {
"is_enable_tts": true,
"is_enable_voice": true
},
"widget_list": [ "widget_list": [
{ {
"widget_index": 0, "widget_index": 0,

View File

@ -43,6 +43,7 @@
#include "dji_aircraft_info.h" #include "dji_aircraft_info.h"
#include "dji_core.h" #include "dji_core.h"
#include <payload_collaboration/test_payload_collaboration.h> #include <payload_collaboration/test_payload_collaboration.h>
#include <waypoint_v3/test_waypoint_v3.h>
/* Private constants ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/
#define WIDGET_DIR_PATH_LEN_MAX (256) #define WIDGET_DIR_PATH_LEN_MAX (256)
@ -55,18 +56,19 @@
typedef enum { typedef enum {
E_DJI_SAMPLE_INDEX_FC_SUBSCRIPTION = 0, E_DJI_SAMPLE_INDEX_FC_SUBSCRIPTION = 0,
E_DJI_SAMPLE_INDEX_WAYPOINT_V2 = 1, E_DJI_SAMPLE_INDEX_WAYPOINT_V2 = 1,
E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_TAKE_OFF_LANDING = 2, E_DJI_SAMPLE_INDEX_WAYPOINT_V3 = 2,
E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_TAKE_OFF_POSITION_CTRL_LANDING = 3, E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_TAKE_OFF_LANDING = 3,
E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_TAKE_OFF_GO_HOME_FORCE_LANDING = 4, E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_TAKE_OFF_POSITION_CTRL_LANDING = 4,
E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_TAKE_OFF_VELOCITY_CTRL_LANDING = 5, E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_TAKE_OFF_GO_HOME_FORCE_LANDING = 5,
E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_ARREST_FLYING = 6, E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_TAKE_OFF_VELOCITY_CTRL_LANDING = 6,
E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_SET_GET_PARAM = 7, E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_ARREST_FLYING = 7,
E_DJI_SAMPLE_INDEX_HMS = 8, E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_SET_GET_PARAM = 8,
E_DJI_SAMPLE_INDEX_CAMERA_MANAGER = 9, E_DJI_SAMPLE_INDEX_HMS = 9,
E_DJI_SAMPLE_INDEX_GIMBAL_MANAGER_FREE_MODE = 10, E_DJI_SAMPLE_INDEX_CAMERA_MANAGER = 10,
E_DJI_SAMPLE_INDEX_GIMBAL_MANAGER_YAW_FOLLOW_MODE = 11, E_DJI_SAMPLE_INDEX_GIMBAL_MANAGER_FREE_MODE = 11,
E_DJI_SAMPLE_INDEX_LIVEVIEW = 12, E_DJI_SAMPLE_INDEX_GIMBAL_MANAGER_YAW_FOLLOW_MODE = 12,
E_DJI_SAMPLE_INDEX_PERCEPTION = 13, E_DJI_SAMPLE_INDEX_LIVEVIEW = 13,
E_DJI_SAMPLE_INDEX_PERCEPTION = 14,
E_DJI_SAMPLE_INDEX_UNKNOWN = 0xFF, E_DJI_SAMPLE_INDEX_UNKNOWN = 0xFF,
} E_DjiExtensionPortSampleIndex; } E_DjiExtensionPortSampleIndex;
@ -338,6 +340,14 @@ static void *DjiTest_WidgetInteractionTask(void *arg)
USER_LOG_WARN("Please turn on the 'unlock flight control restrictions' switch."); USER_LOG_WARN("Please turn on the 'unlock flight control restrictions' switch.");
} }
break; break;
case E_DJI_SAMPLE_INDEX_WAYPOINT_V3:
if (s_isallowRunFlightControlSample == true) {
DjiTest_WaypointV3RunSample();
} else {
DjiTest_WidgetLogAppend("Please turn on the 'unlock flight control restrictions'");
USER_LOG_WARN("Please turn on the 'unlock flight control restrictions' switch.");
}
break;
case E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_TAKE_OFF_LANDING: case E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_TAKE_OFF_LANDING:
if (s_isallowRunFlightControlSample == true) { if (s_isallowRunFlightControlSample == true) {
DjiTest_FlightControlRunSample(E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_TAKE_OFF_LANDING); DjiTest_FlightControlRunSample(E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_TAKE_OFF_LANDING);

View File

@ -243,6 +243,9 @@
{ {
"item_name": "waypoint_v2" "item_name": "waypoint_v2"
}, },
{
"item_name": "waypoint_v3"
},
{ {
"item_name": "flight_ctrl_takeoff_landing" "item_name": "flight_ctrl_takeoff_landing"
}, },

View File

@ -245,6 +245,9 @@
{ {
"item_name": "waypoint_v2" "item_name": "waypoint_v2"
}, },
{
"item_name": "waypoint_v3"
},
{ {
"item_name": "flight_ctrl_takeoff_landing" "item_name": "flight_ctrl_takeoff_landing"
}, },

View File

@ -271,7 +271,7 @@ T_DjiReturnCode Osal_Stat(const char *filePath, T_DjiFileInfo *fileInfo)
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
} }
fileTm = localtime(&(st.st_ctime)); fileTm = localtime(&(st.st_mtim));
if (fileTm == NULL) { if (fileTm == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
} }
@ -279,7 +279,7 @@ T_DjiReturnCode Osal_Stat(const char *filePath, T_DjiFileInfo *fileInfo)
fileInfo->size = st.st_size; fileInfo->size = st.st_size;
fileInfo->createTime.year = fileTm->tm_year + 1900 - 1980; fileInfo->createTime.year = fileTm->tm_year + 1900 - 1980;
fileInfo->createTime.month = fileTm->tm_mon; fileInfo->createTime.month = fileTm->tm_mon + 1;
fileInfo->createTime.day = fileTm->tm_mday; fileInfo->createTime.day = fileTm->tm_mday;
fileInfo->createTime.hour = fileTm->tm_hour; fileInfo->createTime.hour = fileTm->tm_hour;
fileInfo->createTime.minute = fileTm->tm_min; fileInfo->createTime.minute = fileTm->tm_min;

View File

@ -124,7 +124,7 @@ T_DjiReturnCode Osal_UdpSendData(T_DjiSocketHandle socketHandle, const char *ipA
addr.sin_port = htons(port); addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ipAddr); addr.sin_addr.s_addr = inet_addr(ipAddr);
ret = sendto(socketHandleStruct->socketFd, buf, len, MSG_DONTWAIT, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)); ret = sendto(socketHandleStruct->socketFd, buf, len, 0, (struct sockaddr *) &addr, sizeof(struct sockaddr_in));
if (ret >= 0) { if (ret >= 0) {
*realLen = ret; *realLen = ret;
} else { } else {

View File

@ -38,7 +38,7 @@ extern "C" {
#endif #endif
/* Exported constants --------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/
#define DJI_TEST_UPGRADE_OLD_FIRMWARE_PATH "/usr/local/bin/dji_sdk_demo" #define DJI_TEST_UPGRADE_OLD_FIRMWARE_PATH "/usr/local/bin/dji_sdk_demo_linux"
#define DJI_TEST_UPGRADE_FILE_DIR "/upgrade/" #define DJI_TEST_UPGRADE_FILE_DIR "/upgrade/"
/* Exported types ------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/

View File

@ -48,12 +48,14 @@ extern "C" {
#define CONFIG_MODULE_SAMPLE_WIDGET_ON #define CONFIG_MODULE_SAMPLE_WIDGET_ON
#define CONFIG_MODULE_SAMPLE_WIDGET_SPEAKER_ON
#define CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON #define CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON
#define CONFIG_MODULE_SAMPLE_PAYLOAD_COLLABORATION_ON
#define CONFIG_MODULE_SAMPLE_UPGRADE_ON #define CONFIG_MODULE_SAMPLE_UPGRADE_ON
#define CONFIG_MODULE_SAMPLE_PAYLOAD_COLLABORATION_ON
/*!< Attention: This function needs to be used together with mobile sdk mop sample. /*!< Attention: This function needs to be used together with mobile sdk mop sample.
* */ * */
//#define CONFIG_MODULE_SAMPLE_MOP_CHANNEL_ON //#define CONFIG_MODULE_SAMPLE_MOP_CHANNEL_ON

View File

@ -30,25 +30,26 @@
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
#include <power_management/test_power_management.h> #include <power_management/test_power_management.h>
#include <upgrade/test_upgrade.h>
#include <payload_collaboration/test_payload_collaboration.h>
#include <mop_channel/test_mop_channel.h>
#include <xport/test_payload_xport.h>
#include <gimbal_emu/test_payload_gimbal_emu.h> #include <gimbal_emu/test_payload_gimbal_emu.h>
#include <fc_subscription/test_fc_subscription.h> #include <fc_subscription/test_fc_subscription.h>
#include <camera_emu/test_payload_cam_emu_media.h> #include <camera_emu/test_payload_cam_emu_media.h>
#include <camera_emu/test_payload_cam_emu_base.h> #include <camera_emu/test_payload_cam_emu_base.h>
#include <upgrade/test_upgrade.h>
#include <upgrade_platform_opt/upgrade_platform_opt_linux.h>
#include <mop_channel/test_mop_channel.h>
#include <payload_collaboration/test_payload_collaboration.h>
#include <xport/test_payload_xport.h>
#include "monitor/sys_monitor.h" #include "monitor/sys_monitor.h"
#include "osal/osal.h" #include "osal/osal.h"
#include "osal/osal_fs.h" #include "osal/osal_fs.h"
#include "osal/osal_socket.h" #include "osal/osal_socket.h"
#include "upgrade_platform_opt/upgrade_platform_opt_linux.h"
#include "../hal/hal_uart.h" #include "../hal/hal_uart.h"
#include "../hal/hal_network.h" #include "../hal/hal_network.h"
#include "../hal/hal_usb_bulk.h" #include "../hal/hal_usb_bulk.h"
#include "dji_sdk_app_info.h" #include "dji_sdk_app_info.h"
#include "dji_aircraft_info.h" #include "dji_aircraft_info.h"
#include "widget/test_widget.h" #include "widget/test_widget.h"
#include "widget/test_widget_speaker.h"
#include "widget_interaction_test/test_widget_interaction.h" #include "widget_interaction_test/test_widget_interaction.h"
#include "data_transmission/test_data_transmission.h" #include "data_transmission/test_data_transmission.h"
#include "dji_sdk_config.h" #include "dji_sdk_config.h"
@ -59,9 +60,8 @@
#define DJI_LOG_FOLDER_NAME "Logs" #define DJI_LOG_FOLDER_NAME "Logs"
#define DJI_LOG_PATH_MAX_SIZE (128) #define DJI_LOG_PATH_MAX_SIZE (128)
#define DJI_LOG_FOLDER_NAME_MAX_SIZE (32) #define DJI_LOG_FOLDER_NAME_MAX_SIZE (32)
#define DJI_LOG_SYSTEM_CMD_MAX_SIZE (64)
#define DJI_LOG_MAX_COUNT (10) #define DJI_LOG_MAX_COUNT (10)
#define DJI_SYSTEM_CMD_STR_MAX_SIZE (64)
#define DJI_SYSTEM_RESULT_STR_MAX_SIZE (128)
#define DJI_USE_WIDGET_INTERACTION 0 #define DJI_USE_WIDGET_INTERACTION 0
@ -78,6 +78,7 @@ static FILE *s_djiLogFileCnt;
static pthread_t s_monitorThread = 0; static pthread_t s_monitorThread = 0;
/* Private functions declaration ---------------------------------------------*/ /* Private functions declaration ---------------------------------------------*/
static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void);
static T_DjiReturnCode DjiUser_FillInUserInfo(T_DjiUserInfo *userInfo); static T_DjiReturnCode DjiUser_FillInUserInfo(T_DjiUserInfo *userInfo);
static T_DjiReturnCode DjiUser_PrintConsole(const uint8_t *data, uint16_t dataLen); static T_DjiReturnCode DjiUser_PrintConsole(const uint8_t *data, uint16_t dataLen);
static T_DjiReturnCode DjiUser_LocalWrite(const uint8_t *data, uint16_t dataLen); static T_DjiReturnCode DjiUser_LocalWrite(const uint8_t *data, uint16_t dataLen);
@ -85,7 +86,6 @@ static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path);
static void *DjiUser_MonitorTask(void *argument); static void *DjiUser_MonitorTask(void *argument);
static T_DjiReturnCode DjiTest_HighPowerApplyPinInit(); static T_DjiReturnCode DjiTest_HighPowerApplyPinInit();
static T_DjiReturnCode DjiTest_WriteHighPowerApplyPin(E_DjiPowerManagementPinState pinState); static T_DjiReturnCode DjiTest_WriteHighPowerApplyPin(E_DjiPowerManagementPinState pinState);
static bool DjiUser_CheckNetCableConnectStatus(void);
/* Exported functions definition ---------------------------------------------*/ /* Exported functions definition ---------------------------------------------*/
int main(int argc, char **argv) int main(int argc, char **argv)
@ -93,7 +93,204 @@ int main(int argc, char **argv)
T_DjiReturnCode returnCode; T_DjiReturnCode returnCode;
T_DjiUserInfo userInfo; T_DjiUserInfo userInfo;
T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo; T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo;
DjiTestDataTransmissionConfig dataTransmissionConfig;
USER_UTIL_UNUSED(argc);
USER_UTIL_UNUSED(argv);
/*!< Step 1: Prepare system environment, such as osal, hal uart, console function and so on. */
returnCode = DjiUser_PrepareSystemEnvironment();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Prepare system environment error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
/*!< Step 2: Fill your application information in dji_sdk_app_info.h and use this interface to fill it. */
returnCode = DjiUser_FillInUserInfo(&userInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Fill user info error, please check user info config");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
/*!< Step 3: Initialize the Payload SDK core by your application information. */
returnCode = DjiCore_Init(&userInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Core init error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
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;
}
returnCode = DjiCore_SetAlias("PSDK_APPALIAS");
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("set alias error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
/*!< Step 4: Initialize the selected modules by macros in dji_sdk_config.h . */
#ifdef CONFIG_MODULE_SAMPLE_POWER_MANAGEMENT_ON
T_DjiTestApplyHighPowerHandler applyHighPowerHandler = {
.pinInit = DjiTest_HighPowerApplyPinInit,
.pinWrite = DjiTest_WriteHighPowerApplyPin,
};
returnCode = DjiTest_RegApplyHighPowerHandler(&applyHighPowerHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("regsiter apply high power handler error");
}
returnCode = DjiTest_PowerManagementStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("power management init error");
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON
returnCode = DjiTest_DataTransmissionStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget sample init error");
}
#endif
if (aircraftInfoBaseInfo.mountPosition == DJI_MOUNT_POSITION_EXTENSION_PORT &&
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK) {
returnCode = DjiTest_WidgetInteractionStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget interaction sample init error");
}
} else {
#ifdef CONFIG_MODULE_SAMPLE_CAMERA_EMU_ON
returnCode = DjiTest_CameraEmuBaseStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("camera emu common init error");
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_CAMERA_MEDIA_ON
returnCode = DjiTest_CameraEmuMediaStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("camera emu media init error");
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_FC_SUBSCRIPTION_ON
returnCode = DjiTest_FcSubscriptionStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("data subscription sample init error\n");
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_GIMBAL_ON
if (aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 ||
aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_NONE) {
if (DjiTest_GimbalStartService() != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk gimbal init error");
}
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_XPORT_ON
if (aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_XPORT) {
if (DjiTest_XPortStartService() != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk xport init error");
}
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_WIDGET_ON
#if DJI_USE_WIDGET_INTERACTION
returnCode = DjiTest_WidgetInteractionStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget interaction test init error");
}
#else
returnCode = DjiTest_WidgetStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget sample init error");
}
#endif
#endif
#ifdef CONFIG_MODULE_SAMPLE_WIDGET_SPEAKER_ON
if (aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_NONE) {
returnCode = DjiTest_WidgetSpeakerStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget speaker test init error");
}
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_MOP_CHANNEL_ON
if (aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 ||
aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_XPORT) {
returnCode = DjiTest_MopChannelStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("mop channel sample init error");
}
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_PAYLOAD_COLLABORATION_ON
if (aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 ||
aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_XPORT) {
returnCode = DjiTest_PayloadCollaborationStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Payload collaboration sample init error\n");
}
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_UPGRADE_ON
T_DjiTestUpgradePlatformOpt linuxUpgradePlatformOpt = {
.rebootSystem = DjiUpgradePlatformLinux_RebootSystem,
.cleanUpgradeProgramFileStoreArea = DjiUpgradePlatformLinux_CleanUpgradeProgramFileStoreArea,
.createUpgradeProgramFile = DjiUpgradePlatformLinux_CreateUpgradeProgramFile,
.writeUpgradeProgramFile = DjiUpgradePlatformLinux_WriteUpgradeProgramFile,
.readUpgradeProgramFile = DjiUpgradePlatformLinux_ReadUpgradeProgramFile,
.closeUpgradeProgramFile = DjiUpgradePlatformLinux_CloseUpgradeProgramFile,
.replaceOldProgram = DjiUpgradePlatformLinux_ReplaceOldProgram,
.setUpgradeRebootState = DjiUpgradePlatformLinux_SetUpgradeRebootState,
.getUpgradeRebootState = DjiUpgradePlatformLinux_GetUpgradeRebootState,
.cleanUpgradeRebootState = DjiUpgradePlatformLinux_CleanUpgradeRebootState,
};
T_DjiTestUpgradeConfig testUpgradeConfig = {
.firmwareVersion = {1, 0, 0, 0},
.transferType = DJI_FIRMWARE_TRANSFER_TYPE_DCFTP,
.needReplaceProgramBeforeReboot = true
};
if (DjiTest_UpgradeStartService(&linuxUpgradePlatformOpt, testUpgradeConfig) !=
DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk upgrade init error");
}
#endif
}
/*!< Step 5: Tell the DJI Pilot you are ready. */
returnCode = DjiCore_ApplicationStart();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("start sdk application error");
}
if (pthread_create(&s_monitorThread, NULL, DjiUser_MonitorTask, NULL) != 0) {
USER_LOG_ERROR("create monitor task fail.");
}
if (pthread_setname_np(s_monitorThread, "monitor task") != 0) {
USER_LOG_ERROR("set name for monitor task fail.");
}
while (1) {
sleep(1);
}
}
/* Private functions definition-----------------------------------------------*/
static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler osalHandler = { T_DjiOsalHandler osalHandler = {
.TaskCreate = Osal_TaskCreate, .TaskCreate = Osal_TaskCreate,
.TaskDestroy = Osal_TaskDestroy, .TaskDestroy = Osal_TaskDestroy,
@ -112,6 +309,7 @@ int main(int argc, char **argv)
.GetTimeMs = Osal_GetTimeMs, .GetTimeMs = Osal_GetTimeMs,
.GetTimeUs = Osal_GetTimeUs, .GetTimeUs = Osal_GetTimeUs,
}; };
T_DjiLoggerConsole printConsole = { T_DjiLoggerConsole printConsole = {
.func = DjiUser_PrintConsole, .func = DjiUser_PrintConsole,
.consoleLevel = DJI_LOGGER_CONSOLE_LOG_LEVEL_INFO, .consoleLevel = DJI_LOGGER_CONSOLE_LOG_LEVEL_INFO,
@ -121,7 +319,7 @@ int main(int argc, char **argv)
T_DjiLoggerConsole localRecordConsole = { T_DjiLoggerConsole localRecordConsole = {
.consoleLevel = DJI_LOGGER_CONSOLE_LOG_LEVEL_DEBUG, .consoleLevel = DJI_LOGGER_CONSOLE_LOG_LEVEL_DEBUG,
.func = DjiUser_LocalWrite, .func = DjiUser_LocalWrite,
.isSupportColor = false, .isSupportColor = true,
}; };
T_DjiHalUartHandler uartHandler = { T_DjiHalUartHandler uartHandler = {
@ -227,211 +425,15 @@ int main(int argc, char **argv)
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
} }
returnCode = DjiUser_FillInUserInfo(&userInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
osalHandler.TaskSleepMs(1000);
USER_LOG_ERROR("fill user info error, please check user info config");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
returnCode = DjiCore_Init(&userInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("core init error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
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;
}
returnCode = DjiCore_SetAlias("PSDK_APPALIAS");
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("set alias error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
if (aircraftInfoBaseInfo.mountPosition == DJI_MOUNT_POSITION_EXTENSION_PORT) {
dataTransmissionConfig.isEnableLowSpeedDataChannel = true;
dataTransmissionConfig.isEnableHighSpeedDataChannel = false;
returnCode = DjiTest_DataTransmissionStartService(dataTransmissionConfig);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("data transmission init error");
}
returnCode = DjiTest_WidgetInteractionStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget interaction sample init error");
}
} else {
#ifdef CONFIG_MODULE_SAMPLE_POWER_MANAGEMENT_ON
T_DjiTestApplyHighPowerHandler applyHighPowerHandler = {
.pinInit = DjiTest_HighPowerApplyPinInit,
.pinWrite = DjiTest_WriteHighPowerApplyPin,
};
returnCode = DjiTest_RegApplyHighPowerHandler(&applyHighPowerHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("regsiter apply high power handler error");
}
returnCode = DjiTest_PowerManagementStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("power management init error");
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_CAMERA_EMU_ON
returnCode = DjiTest_CameraEmuBaseStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("camera emu common init error");
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_CAMERA_MEDIA_ON
if (DjiUser_CheckNetCableConnectStatus() == true) {
returnCode = DjiTest_CameraEmuMediaStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("camera emu media init error");
}
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_FC_SUBSCRIPTION_ON
returnCode = DjiTest_FcSubscriptionStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("data subscription sample init error\n");
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_GIMBAL_ON
if (aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 ||
aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_NONE) {
if (DjiTest_GimbalStartService() != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk gimbal init error");
}
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_XPORT_ON
if (aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_XPORT) {
if (DjiTest_XPortStartService() != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk xport init error");
}
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_WIDGET_ON
#if DJI_USE_WIDGET_INTERACTION
returnCode = DjiTest_WidgetInteractionStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget interaction test init error");
}
#else
returnCode = DjiTest_WidgetStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget sample init error");
}
#endif
#endif
#ifdef CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON
dataTransmissionConfig.isEnableLowSpeedDataChannel = true;
dataTransmissionConfig.isEnableHighSpeedDataChannel = DjiUser_CheckNetCableConnectStatus();
returnCode = DjiTest_DataTransmissionStartService(dataTransmissionConfig);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget sample init error");
}
#endif
#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
#ifdef CONFIG_MODULE_SAMPLE_PAYLOAD_COLLABORATION_ON
returnCode = DjiTest_PayloadCollaborationStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Payload collaboration sample init error\n");
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_UPGRADE_ON
T_DjiTestUpgradePlatformOpt linuxUpgradePlatformOpt = {
.rebootSystem = DjiUpgradePlatformLinux_RebootSystem,
.cleanUpgradeProgramFileStoreArea = DjiUpgradePlatformLinux_CleanUpgradeProgramFileStoreArea,
.createUpgradeProgramFile = DjiUpgradePlatformLinux_CreateUpgradeProgramFile,
.writeUpgradeProgramFile = DjiUpgradePlatformLinux_WriteUpgradeProgramFile,
.readUpgradeProgramFile = DjiUpgradePlatformLinux_ReadUpgradeProgramFile,
.closeUpgradeProgramFile = DjiUpgradePlatformLinux_CloseUpgradeProgramFile,
.replaceOldProgram = DjiUpgradePlatformLinux_ReplaceOldProgram,
.setUpgradeRebootState = DjiUpgradePlatformLinux_SetUpgradeRebootState,
.getUpgradeRebootState = DjiUpgradePlatformLinux_GetUpgradeRebootState,
.cleanUpgradeRebootState = DjiUpgradePlatformLinux_CleanUpgradeRebootState,
};
T_DjiTestUpgradeConfig testUpgradeConfig = {
.firmwareVersion = {1, 0, 0, 0},
.transferType = DJI_FIRMWARE_TRANSFER_TYPE_FTP,
.needReplaceProgramBeforeReboot = true
};
if (DjiTest_UpgradeStartService(&linuxUpgradePlatformOpt, testUpgradeConfig) !=
DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk upgrade init error");
}
#endif
}
returnCode = DjiCore_ApplicationStart();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("start sdk application error");
}
if (pthread_create(&s_monitorThread, NULL, DjiUser_MonitorTask, NULL) != 0) {
USER_LOG_ERROR("create monitor task fail.");
}
if (pthread_setname_np(s_monitorThread, "monitor task") != 0) {
USER_LOG_ERROR("set name for monitor task fail.");
}
while (1) {
sleep(1);
}
}
/* Private functions definition-----------------------------------------------*/
static T_DjiReturnCode DjiUser_PrintConsole(const uint8_t *data, uint16_t dataLen)
{
USER_UTIL_UNUSED(dataLen);
printf("%s", data);
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
} }
static T_DjiReturnCode DjiUser_LocalWrite(const uint8_t *data, uint16_t dataLen)
{
int32_t realLen;
if (s_djiLogFile == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
realLen = fwrite(data, 1, dataLen, s_djiLogFile);
fflush(s_djiLogFile);
if (realLen == dataLen) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
} else {
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
}
static T_DjiReturnCode DjiUser_FillInUserInfo(T_DjiUserInfo *userInfo) static T_DjiReturnCode DjiUser_FillInUserInfo(T_DjiUserInfo *userInfo)
{ {
if (userInfo == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
memset(userInfo->appName, 0, sizeof(userInfo->appName)); memset(userInfo->appName, 0, sizeof(userInfo->appName));
memset(userInfo->appId, 0, sizeof(userInfo->appId)); memset(userInfo->appId, 0, sizeof(userInfo->appId));
memset(userInfo->appKey, 0, sizeof(userInfo->appKey)); memset(userInfo->appKey, 0, sizeof(userInfo->appKey));
@ -446,6 +448,7 @@ static T_DjiReturnCode DjiUser_FillInUserInfo(T_DjiUserInfo *userInfo)
strlen(USER_DEVELOPER_ACCOUNT) >= sizeof(userInfo->developerAccount) || strlen(USER_DEVELOPER_ACCOUNT) >= sizeof(userInfo->developerAccount) ||
strlen(USER_BAUD_RATE) > sizeof(userInfo->baudRate)) { strlen(USER_BAUD_RATE) > sizeof(userInfo->baudRate)) {
USER_LOG_ERROR("Length of user information string is beyond limit. Please check."); USER_LOG_ERROR("Length of user information string is beyond limit. Please check.");
sleep(1);
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
} }
@ -457,6 +460,7 @@ static T_DjiReturnCode DjiUser_FillInUserInfo(T_DjiUserInfo *userInfo)
!strcmp(USER_BAUD_RATE, "your_baud_rate")) { !strcmp(USER_BAUD_RATE, "your_baud_rate")) {
USER_LOG_ERROR( USER_LOG_ERROR(
"Please fill in correct user information to 'samples/sample_c/platform/linux/manifold2/application/dji_sdk_app_info.h' file."); "Please fill in correct user information to 'samples/sample_c/platform/linux/manifold2/application/dji_sdk_app_info.h' file.");
sleep(1);
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
} }
@ -471,11 +475,37 @@ static T_DjiReturnCode DjiUser_FillInUserInfo(T_DjiUserInfo *userInfo)
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
} }
static T_DjiReturnCode DjiUser_PrintConsole(const uint8_t *data, uint16_t dataLen)
{
USER_UTIL_UNUSED(dataLen);
printf("%s", data);
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode DjiUser_LocalWrite(const uint8_t *data, uint16_t dataLen)
{
uint32_t realLen;
if (s_djiLogFile == NULL) {
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
realLen = fwrite(data, 1, dataLen, s_djiLogFile);
fflush(s_djiLogFile);
if (realLen == dataLen) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
} else {
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
}
static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path) static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path)
{ {
T_DjiReturnCode djiReturnCode = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; T_DjiReturnCode djiReturnCode = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
char filePath[DJI_LOG_PATH_MAX_SIZE]; char filePath[DJI_LOG_PATH_MAX_SIZE];
char systemCmd[DJI_SYSTEM_CMD_STR_MAX_SIZE]; char systemCmd[DJI_LOG_SYSTEM_CMD_MAX_SIZE];
char folderName[DJI_LOG_FOLDER_NAME_MAX_SIZE]; char folderName[DJI_LOG_FOLDER_NAME_MAX_SIZE];
time_t currentTime = time(NULL); time_t currentTime = time(NULL);
struct tm *localTime = localtime(&currentTime); struct tm *localTime = localtime(&currentTime);
@ -621,25 +651,4 @@ static T_DjiReturnCode DjiTest_WriteHighPowerApplyPin(E_DjiPowerManagementPinSta
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
static bool DjiUser_CheckNetCableConnectStatus(void)
{
FILE *fp;
char *ret = NULL;
char systemCmd[DJI_SYSTEM_CMD_STR_MAX_SIZE] = {0};
char lineBuf[DJI_SYSTEM_RESULT_STR_MAX_SIZE] = {0};
sprintf(systemCmd, "ifconfig %s | grep RUNNING", LINUX_NETWORK_DEV);
fp = popen(systemCmd, "r");
if (fp == NULL) {
return false;
}
ret = fgets(lineBuf, sizeof(lineBuf), fp);
if (ret == NULL) {
return false;
}
return true;
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/ /****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/

View File

@ -55,7 +55,6 @@ extern "C" {
/* Exported functions --------------------------------------------------------*/ /* Exported functions --------------------------------------------------------*/
T_DjiReturnCode HalNetWork_Init(const char *ipAddr, const char *netMask, T_DjiNetworkHandle *halObj); T_DjiReturnCode HalNetWork_Init(const char *ipAddr, const char *netMask, T_DjiNetworkHandle *halObj);
T_DjiReturnCode HalNetWork_DeInit(T_DjiNetworkHandle halObj); T_DjiReturnCode HalNetWork_DeInit(T_DjiNetworkHandle halObj);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -28,7 +28,7 @@
/* Private constants ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/
#define UART_DEV_NAME_STR_SIZE (128) #define UART_DEV_NAME_STR_SIZE (128)
#define DJI_SYSTEM_CMD_STR_MAX_SIZE (64) #define DJI_SYSTEM_CMD_MAX_SIZE (64)
#define DJI_SYSTEM_RESULT_STR_MAX_SIZE (128) #define DJI_SYSTEM_RESULT_STR_MAX_SIZE (128)
/* Private types -------------------------------------------------------------*/ /* Private types -------------------------------------------------------------*/
@ -48,7 +48,7 @@ T_DjiReturnCode HalUart_Init(E_DjiHalUartNum uartNum, uint32_t baudRate, T_DjiUa
struct flock lock; struct flock lock;
T_DjiReturnCode returnCode = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; T_DjiReturnCode returnCode = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
char uartName[UART_DEV_NAME_STR_SIZE]; char uartName[UART_DEV_NAME_STR_SIZE];
char systemCmd[DJI_SYSTEM_CMD_STR_MAX_SIZE]; char systemCmd[DJI_SYSTEM_CMD_MAX_SIZE];
char *ret = NULL; char *ret = NULL;
char lineBuf[DJI_SYSTEM_RESULT_STR_MAX_SIZE] = {0}; char lineBuf[DJI_SYSTEM_RESULT_STR_MAX_SIZE] = {0};
FILE *fp; FILE *fp;

View File

@ -78,10 +78,6 @@ void DjiUser_StartTask(void const *argument)
T_DjiReturnCode returnCode; T_DjiReturnCode returnCode;
T_DjiUserInfo userInfo; T_DjiUserInfo userInfo;
T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo; T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo;
DjiTestDataTransmissionConfig dataTransmissionConfig = {
.isEnableHighSpeedDataChannel = false,
.isEnableLowSpeedDataChannel = true,
};
T_DjiOsalHandler osalHandler = { T_DjiOsalHandler osalHandler = {
.TaskCreate = Osal_TaskCreate, .TaskCreate = Osal_TaskCreate,
.TaskDestroy = Osal_TaskDestroy, .TaskDestroy = Osal_TaskDestroy,
@ -165,19 +161,6 @@ void DjiUser_StartTask(void const *argument)
goto out; goto out;
} }
if (aircraftInfoBaseInfo.mountPosition == DJI_MOUNT_POSITION_EXTENSION_PORT) {
#if DJI_EXTENSION_PORT_SUPPORT
returnCode = DjiTest_DataTransmissionStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("data transmission init error");
}
returnCode = DjiTest_WidgetStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget sample init error");
}
#endif
} else {
#ifdef CONFIG_MODULE_SAMPLE_POWER_MANAGEMENT_ON #ifdef CONFIG_MODULE_SAMPLE_POWER_MANAGEMENT_ON
T_DjiTestApplyHighPowerHandler applyHighPowerHandler = { T_DjiTestApplyHighPowerHandler applyHighPowerHandler = {
.pinInit = DjiTest_HighPowerApplyPinInit, .pinInit = DjiTest_HighPowerApplyPinInit,
@ -218,7 +201,7 @@ void DjiUser_StartTask(void const *argument)
#endif #endif
#ifdef CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON #ifdef CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON
returnCode = DjiTest_DataTransmissionStartService(dataTransmissionConfig); returnCode = DjiTest_DataTransmissionStartService();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("widget sample init error"); USER_LOG_ERROR("widget sample init error");
} }
@ -301,7 +284,6 @@ void DjiUser_StartTask(void const *argument)
printf("psdk upgrade init error"); printf("psdk upgrade init error");
} }
#endif #endif
}
returnCode = DjiCore_ApplicationStart(); returnCode = DjiCore_ApplicationStart();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {

View File

@ -34,34 +34,34 @@ extern "C" {
#endif #endif
/* Exported constants --------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/
#define CONFIG_MODULE_SAMPLE_POWER_MANAGEMENT_ON //#define CONFIG_MODULE_SAMPLE_POWER_MANAGEMENT_ON
#define CONFIG_MODULE_SAMPLE_CAMERA_ON //#define CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON
#define CONFIG_MODULE_SAMPLE_WIDGET_ON #define CONFIG_MODULE_SAMPLE_WIDGET_ON
#ifdef USE_BOOTLOADER //#ifdef USE_BOOTLOADER
//Attention: If you dont need to upgrade, you can uncomment it and change flash size from 0x70000 to 0xD0000 to build all functions. //Attention: If you dont need to upgrade, you can uncomment it and change flash size from 0x70000 to 0xD0000 to build all functions.
#define CONFIG_MODULE_SAMPLE_UPGRADE_ON //#define CONFIG_MODULE_SAMPLE_UPGRADE_ON
#endif //#endif
#ifndef CONFIG_MODULE_SAMPLE_UPGRADE_ON //#ifndef CONFIG_MODULE_SAMPLE_UPGRADE_ON
#define CONFIG_MODULE_SAMPLE_GIMBAL_ON //#define CONFIG_MODULE_SAMPLE_GIMBAL_ON
#define CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON //#define CONFIG_MODULE_SAMPLE_CAMERA_ON
#define CONFIG_MODULE_SAMPLE_FC_SUBSCRIPTION_ON //#define CONFIG_MODULE_SAMPLE_FC_SUBSCRIPTION_ON
#define CONFIG_MODULE_SAMPLE_XPORT_ON //#define CONFIG_MODULE_SAMPLE_XPORT_ON
#define CONFIG_MODULE_SAMPLE_PAYLOAD_COLLABORATION_ON //#define CONFIG_MODULE_SAMPLE_PAYLOAD_COLLABORATION_ON
#define CONFIG_MODULE_SAMPLE_TIME_SYNC_ON //#define CONFIG_MODULE_SAMPLE_TIME_SYNC_ON
#define CONFIG_MODULE_SAMPLE_POSITIONING_ON //#define CONFIG_MODULE_SAMPLE_POSITIONING_ON
#endif //#endif
/* Exported types ------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/

View File

@ -500,6 +500,11 @@
</File> </File>
<File> <File>
<FileType>1</FileType> <FileType>1</FileType>
<FileName>test_waypoint_v3.c</FileName>
<FilePath>..\..\..\..\..\module_sample\waypoint_v3\test_waypoint_v3.c</FilePath>
</File>
<File>
<FileType>1</FileType>
<FileName>test_widget.c</FileName> <FileName>test_widget.c</FileName>
<FilePath>..\..\..\..\..\module_sample\widget\test_widget.c</FilePath> <FilePath>..\..\..\..\..\module_sample\widget\test_widget.c</FilePath>
</File> </File>
@ -510,6 +515,11 @@
</File> </File>
<File> <File>
<FileType>1</FileType> <FileType>1</FileType>
<FileName>test_widget_speaker.c</FileName>
<FilePath>..\..\..\..\..\module_sample\widget\test_widget_speaker.c</FilePath>
</File>
<File>
<FileType>1</FileType>
<FileName>util_buffer.c</FileName> <FileName>util_buffer.c</FileName>
<FilePath>..\..\..\..\..\module_sample\utils\util_buffer.c</FilePath> <FilePath>..\..\..\..\..\module_sample\utils\util_buffer.c</FilePath>
</File> </File>
@ -1025,6 +1035,11 @@
</File> </File>
<File> <File>
<FileType>5</FileType> <FileType>5</FileType>
<FileName>dji_waypoint_v3.h</FileName>
<FilePath>..\..\..\..\..\..\..\psdk_lib\include\dji_waypoint_v3.h</FilePath>
</File>
<File>
<FileType>5</FileType>
<FileName>dji_widget.h</FileName> <FileName>dji_widget.h</FileName>
<FilePath>..\..\..\..\..\..\..\psdk_lib\include\dji_widget.h</FilePath> <FilePath>..\..\..\..\..\..\..\psdk_lib\include\dji_widget.h</FilePath>
</File> </File>