作者 ookk303

修改了c1相机的代码,增加了一个新的气体感应

加入新的tts讯飞库判断,从而帮助解决无法使用英文数字及汉语生成噪音的问题
正在显示 38 个修改的文件 包含 3477 行增加157 行删除

要显示太多修改。

为保证性能只显示 38 of 38+ 个文件。

... ... @@ -26,4 +26,7 @@ project_build/DJI_大疆PSDK/samples/sample_c/platform/linux/all/*
!project_build/DJI_大疆PSDK/samples/sample_c/platform/linux/all/hal
!project_build/DJI_大疆PSDK/samples/sample_c/platform/linux/all/CMakeLists.txt
project_build/Payload-SDK-release-v3.11.0/*
project_build/Attention_提示程序
\ No newline at end of file
... ...
... ... @@ -132,7 +132,8 @@
"dji_sdk_config.h": "c",
"hal_uart.h": "c",
"jzsdkbase.h": "c",
"dji_logger.h": "c"
"dji_logger.h": "c",
"dji_platform.h": "c"
},
"Codegeex.GenerationPreference": "automatic",
"C_Cpp.dimInactiveRegions": false
... ...
# 编译链的配置
#1、编译链与设备类型的选择
set(DEVICE_NAME JZ_U30)
set(DEVICE_NAME JZ_H10)
#上一行为禁止修改行
message("**************************JZSDK构建编译开始***************************\n")
... ... @@ -40,15 +40,15 @@ if(${MAKE_COMPILER} STREQUAL "ARM_CORTEXA9_LINUX")
elseif(${MAKE_COMPILER} STREQUAL "ARM_CORTEX_LINUX")
set(TOOLCHAIN_NAME arm-linux-gnueabihf-gcc)
set(CMAKE_C_COMPILER "/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++")
set(CMAKE_C_COMPILER "/usr/local/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "/usr/local/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++")
message("使用ARM_CORTEX_LINUX编译链")
elseif(${MAKE_COMPILER} STREQUAL "ARM_X86_64_ARRCH64")
# 交叉编译链3
set(TOOLCHAIN_NAME aarch64-linux-gnu-gcc)
set(CMAKE_C_COMPILER "/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++")
set(CMAKE_C_COMPILER "/usr/local/arm/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "/usr/local/arm/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++")
message("使用ARM_X86_64_ARRCH64编译链")
elseif(${MAKE_COMPILER} STREQUAL "LOCAL")
... ...
... ... @@ -143,6 +143,7 @@ typedef enum {
JZ_INSCODE_5AFRAME_LASER_CONTROL = 0x10000C00, //激光控制
JZ_INSCODE_5AFRAME_LASER_MODE = 0x10000C01, //激光模式
JZ_INSCODE_5AFRAME_SEARCHLIGHT_CONTROL = 0x10000E00, //探照灯开光
JZ_INSCODE_5AFRAME_SEARCHLIGHT_SET_LUMEN = 0x10000E10, //设置探照灯亮度
... ... @@ -221,10 +222,11 @@ typedef enum {
JZ_INSCODE_5BFRAME_CHECKSTATUS_SEARCHLIGHT_TEMPERATURE = 0x10004600, //查询探照灯温度
JZ_INSCODE_5BFRAME_CHECKSTATUS_LASER_STATUS = 0x10004601, //查询激光状态
JZ_INSCODE_5BFRAME_CHECKSTATUS_SEARCHLIGHT_FREQUENCY = 0x10004602, //查询探照灯频率
JZ_INSCODE_5BFRAME_CHECKSTATUS_SEARCHLIGHT_MODE = 0x10004603, //查询探照灯模式
JZ_INSCODE_5BFRAME_CHECKSTATUS_SEARCHLIGHT_LUMEN = 0x10004604, //查询探照灯流明
JZ_INSCODE_5BFRAME_CHECKSTATUS_LASER_STATUS_CONTROL = 0x10004601, //查询激光状态_控制
JZ_INSCODE_5BFRAME_CHECKSTATUS_LASER_STATUS_MODE = 0x10004602, //查询激光状态_模式
JZ_INSCODE_5BFRAME_CHECKSTATUS_SEARCHLIGHT_FREQUENCY = 0x10004610, //查询探照灯频率
JZ_INSCODE_5BFRAME_CHECKSTATUS_SEARCHLIGHT_MODE = 0x10004611, //查询探照灯模式
JZ_INSCODE_5BFRAME_CHECKSTATUS_SEARCHLIGHT_LUMEN = 0x10004612, //查询探照灯流明
JZ_INSCODE_5BFRAME_CHECKSTATUS_WARNINGLIGHT_STATUS = 0x10004700, //警示灯模式控制
JZ_INSCODE_5BFRAME_CHECKSTATUS_WARNINGLIGHT_COLOR = 0x10004701, //警示灯颜色控制
... ...
... ... @@ -441,6 +441,10 @@ static int Comparison_5AFRAME_FirstLevelCode_0x60(char *getdata)
return JZ_INSCODE_5AFRAME_LASER_CONTROL;
break;
case 0x52:
return JZ_INSCODE_5AFRAME_LASER_MODE;
break;
default:
return JZ_ERROR_SYSTEM_FRAME_ERROR;
break;
... ... @@ -599,7 +603,7 @@ static int Comparison_5AFRAME_FirstLevelCode_0x6F(char *getdata)
//激光查询
case 0x53:
return JZ_ERROR_SYSTEM_FRAME_ERROR;
return JZ_INSCODE_5AFRAME_CHECKSTATUS_LASER_STATUS;
break;
//云台角度查询
... ...
... ... @@ -196,7 +196,11 @@ static int Comparison_5BFRAME_FirstLevelCode_0x60(char *getdata)
{
//回复激光查询
case 0x51:
return JZ_INSCODE_5BFRAME_CHECKSTATUS_LASER_STATUS;
return JZ_INSCODE_5BFRAME_CHECKSTATUS_LASER_STATUS_CONTROL;
break;
case 0x52:
return JZ_INSCODE_5BFRAME_CHECKSTATUS_LASER_STATUS_MODE;
break;
default:
... ...
... ... @@ -486,7 +486,23 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
memcpy(str, sendbuf, 12);
*str_len = 12;
}
break;
break;
case JZ_INSCODE_5BFRAME_CHECKSTATUS_LASER_STATUS_CONTROL:
{
char sendbuf[13] = { 0x5b, 0x5b, 0x77, 0x00, 0x0D, 0x00, 0x00, 0x60, 0x51, 0x00, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 13);
*str_len = 13;
}
break;
case JZ_INSCODE_5BFRAME_CHECKSTATUS_LASER_STATUS_MODE:
{
char sendbuf[13] = { 0x5b, 0x5b, 0x77, 0x00, 0x0D, 0x00, 0x00, 0x60, 0x52, 0x00, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 13);
*str_len = 13;
}
break;
case JZ_INSCODE_5BFRAME_CHECKSTATUS_SEARCHLIGHT_FREQUENCY:
{
... ...
... ... @@ -71,6 +71,7 @@ typedef struct T_JZC1_info
#define JZ_C1_IRC_HEIGHT 256
#define JZ_C1_IRC_FRAMERATE 30
#define JZ_C1_IRC_INDEX VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST
#define JZ_C1_IRC_BPS 4000000
#define JZ_C1_OPT_WIDTH 1920
#define JZ_C1_OPT_HEIGHT 1080
... ... @@ -78,11 +79,13 @@ typedef struct T_JZC1_info
#define JZ_C1_OPT_INDEX VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND
#define JZ_C1_OPT_DEV_PATH ("/dev/video21")
#define JZ_C1_OPT_PIXEL V4L2_PIX_FMT_MJPEG
#define JZ_C1_OPT_BPS 4000000
#define JZ_C1_FUSE_WIDTH 1920
#define JZ_C1_FUSE_HEIGHT 1080
#define JZ_C1_FUSE_FRAMERATE 30
#define JZ_C1_FUSE_FRAMERATE 25
#define JZ_C1_FUSE_INDEX VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD
#define JZ_C1_FUSE_BPS 3000000
static unsigned char *g_MixedIrc_Buffer = NULL;
static unsigned char *g_MixedOpt_Buffer = NULL;
... ... @@ -1168,6 +1171,7 @@ T_JZsdkReturnCode JZC1_Init(int mode)
g_JZC1_info.IRC_enc_info->height = JZ_C1_IRC_HEIGHT;
g_JZC1_info.IRC_enc_info->FrameNum = JZ_C1_IRC_FRAMERATE;
g_JZC1_info.IRC_enc_info->IDR_gop = 5;
g_JZC1_info.IRC_enc_info->bps_target = JZ_C1_IRC_BPS;
g_JZC1_info.IRC_enc_info->hor_stride = JZ_ALIGN(g_JZC1_info.IRC_enc_info->width, 16);
g_JZC1_info.IRC_enc_info->ver_stride = JZ_ALIGN(g_JZC1_info.IRC_enc_info->height, 16);
... ... @@ -1204,6 +1208,7 @@ T_JZsdkReturnCode JZC1_Init(int mode)
g_JZC1_info.Opt_enc_info->height = JZ_C1_OPT_HEIGHT;
g_JZC1_info.Opt_enc_info->FrameNum = JZ_C1_OPT_FRAMERATE;
g_JZC1_info.Opt_enc_info->IDR_gop = 15;
g_JZC1_info.Opt_enc_info->bps_target = JZ_C1_OPT_BPS;
g_JZC1_info.Opt_enc_info->hor_stride = JZ_ALIGN(g_JZC1_info.Opt_enc_info->width, 16);
g_JZC1_info.Opt_enc_info->ver_stride = JZ_ALIGN(g_JZC1_info.Opt_enc_info->height, 16);
... ... @@ -1223,6 +1228,7 @@ T_JZsdkReturnCode JZC1_Init(int mode)
g_JZC1_info.Fuse_enc_info->height = JZ_C1_FUSE_HEIGHT;
g_JZC1_info.Fuse_enc_info->FrameNum = JZ_C1_FUSE_FRAMERATE;
g_JZC1_info.Fuse_enc_info->IDR_gop = 15;
g_JZC1_info.Fuse_enc_info->bps_target = JZ_C1_FUSE_BPS;
g_JZC1_info.Fuse_enc_info->hor_stride = JZ_ALIGN(g_JZC1_info.Fuse_enc_info->width, 16);
g_JZC1_info.Fuse_enc_info->ver_stride = JZ_ALIGN(g_JZC1_info.Fuse_enc_info->height, 16);
... ... @@ -1270,7 +1276,8 @@ T_JZsdkReturnCode JZC1_Init(int mode)
}
//默认推送红外摄像头 后续改成 红外+光学 的组合画面
VideoMgmt_VideoStreamFlowIndex(JZ_C1_FUSE_INDEX);
//VideoMgmt_VideoStreamFlowIndex(JZ_C1_FUSE_INDEX);
VideoMgmt_VideoStreamFlowIndex(JZ_C1_IRC_INDEX);
//设置快门为开
JZsdk_Camera_ShutterSwitch(JZ_FLAGCODE_ON);
... ...
... ... @@ -7,18 +7,18 @@
#define VERSION_CHOOSE_H
#include "JZsdk_Base/JZsdk_Code/JZsdk_DeviceCode.h"
//1~10行 除了D可以修改版本选择 禁止动任何东西
#define DEVICE_VERSION JZ_U30
#define DEVICE_VERSION JZ_H10
//禁止修改行 选择是串口程序 还是 psdk程序
#define APP_VERSION APP_PSDK
//禁止修改行 板子型号
#define PLATFORM_VERSION PLATFORM_V3S
#define PLATFORM_VERSION PLATFORM_H3
//禁止修改行 串口连接程序的软件版本号
#define MAJOR_VERSION 0x01
#define MINOR_VERSION 0x03
#define MODIFY_VERSION 0x10
#define MODIFY_VERSION 0x11
#define DEBUG_VERSION 0x00
//禁止修改行 滤波方式
... ...
... ... @@ -27,6 +27,10 @@
#include "Megaphone/PcmAudio/PcmAudioFile.h"
#endif
#ifdef SIDE_LASER_STATUS_ON
#include "SideLaser/SideLaser.h"
#endif
#ifdef AUDIODEAL_CONFIG_STATUS_ON
#include "AudioDeal/AudioDeal.h"
#endif
... ... @@ -3042,6 +3046,100 @@ static T_JZsdkReturnCode RecvDeal_CheckStatus_SearchLightTemperture(int Port, ch
/*********
*
* 激光控制
*
**********/
static T_JZsdkReturnCode RecvDeal_Laser_Control(int Port, char *getbuf)
{
JZSDK_LOG_INFO("%s,激光控制",JZsdk_DefineCode_GetPortName(Port));
//1、获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
//2、获取激光控制值
int LaserControl = getbuf[10];
T_JZsdkReturnCode ReturnCode = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
ReturnCode = UIcontrol_SideLaser_SetControl(Port, LaserControl);
if (ReturnCode == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作成功
HalSend_type1Send_Reply_Success(Port, FrameSequence);
}
else
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
}
return ReturnCode;
}
/*********
*
* 激光模式控制
*
**********/
static T_JZsdkReturnCode RecvDeal_Laser_Mode(int Port, char *getbuf)
{
JZSDK_LOG_INFO("%s,激光模式控制",JZsdk_DefineCode_GetPortName(Port));
//1、获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
//2、获取激光控制值
int mode = getbuf[10];
T_JZsdkReturnCode ReturnCode = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
ReturnCode = UIcontrol_SideLaser_SetMode(Port, mode);
if (ReturnCode == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作成功
HalSend_type1Send_Reply_Success(Port, FrameSequence);
}
else
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
}
return ReturnCode;
}
/*********
*
* 激光状态查询
*
**********/
static T_JZsdkReturnCode RecvDeal_CheckStatus_LaserStatus(int Port, char *getbuf)
{
JZSDK_LOG_INFO("%s,激光状态查询",JZsdk_DefineCode_GetPortName(Port));
//1、获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
//2、查询激光状态
int LaserControl = JZ_FLAGCODE_OFF;
int LaserMode = 0;
T_JZsdkReturnCode ReturnCode = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#ifdef SIDE_LASER_STATUS_ON
ReturnCode = SideLaser_param(JZ_FLAGCODE_GET, SIDELASER_MODE, &LaserMode);
ReturnCode = SideLaser_param(JZ_FLAGCODE_GET, SIDELASER_CONTROL, &LaserControl);
#endif
// 2、回复激光状态
HalSend_type1Send_LaserControl(Port, LaserControl);
HalSend_type1Send_LaserMode(Port, LaserMode);
return ReturnCode;
}
/*********
*
* 消息订阅控制
*
**********/
... ... @@ -5093,8 +5191,21 @@ static T_JZsdkReturnCode RecvDeal_InstructInput(int Port, int Receive_mode, unsi
case JZ_INSCODE_5AFRAME_CHECKSTATUS_SEARCHLIGHT_TEMPERATURE:
RecvDeal_CheckStatus_SearchLightTemperture(Port,getbuf);
break;
//激光控制
case JZ_INSCODE_5AFRAME_LASER_CONTROL:
RecvDeal_Laser_Control(Port,getbuf);
break;
//激光模式
case JZ_INSCODE_5AFRAME_LASER_MODE:
RecvDeal_Laser_Mode(Port,getbuf);
break;
//激光查询
case JZ_INSCODE_5AFRAME_CHECKSTATUS_LASER_STATUS:
RecvDeal_CheckStatus_LaserStatus(Port,getbuf);
break;
//警灯控制
case JZ_INSCODE_5AFRAME_WARNINGLIGHT_CONTROL:
... ... @@ -5455,9 +5566,9 @@ T_JZsdkReturnCode HalRecv_type1_FrameDeal(int Port, unsigned char *getbuf, int
int flag = JZsdk_FrameComparsion(getbuf, len);
if (flag == JZ_ERROR_SYSTEM_FRAME_ERROR || flag == JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE)
{
if (len >= 7)
if (len >= 9)
{
JZSDK_LOG_ERROR("%s 得到了无法正常识别的帧 [0]0x%x [5]0x%x [6]0x%x", JZsdk_DefineCode_GetPortName(Port),getbuf[0],getbuf[5],getbuf[6]);
JZSDK_LOG_ERROR("%s 得到了无法正常识别的帧 [0]0x%x [7]0x%x [8]0x%x", JZsdk_DefineCode_GetPortName(Port),getbuf[0],getbuf[7],getbuf[8]);
}
else
{
... ...
... ... @@ -1523,6 +1523,51 @@ T_JZsdkReturnCode HalSend_type1Send_SearchLight_Lumen(int Uartport,int LeftLumen
HalSend_SendData(Uartport ,sendbuf, send_buf_len, MULTI_THREAD_SEND);
}
/********************
*
* 发送侧面激光控制值
*
* *************/
T_JZsdkReturnCode HalSend_type1Send_LaserControl(int Uartport, int Control)
{
printf("发送侧面激光控制值帧\n");
unsigned char sendbuf[256];
int send_buf_len;
//1、获取帧样板
JZsdk_GetFrameTemplate(JZ_INSCODE_5BFRAME_CHECKSTATUS_LASER_STATUS_CONTROL, sendbuf, &send_buf_len);
//2、写入数据
sendbuf[10] = Control;
//3、发送帧
HalSend_SendData(Uartport ,sendbuf, send_buf_len, MULTI_THREAD_SEND);
}
/********************
*
* 发送侧面激光模式
*
* *************/
T_JZsdkReturnCode HalSend_type1Send_LaserMode(int Uartport, int mode)
{
printf("发送侧面激光模式值帧\n");
unsigned char sendbuf[256];
int send_buf_len;
//1、获取帧样板
JZsdk_GetFrameTemplate(JZ_INSCODE_5BFRAME_CHECKSTATUS_LASER_STATUS_MODE, sendbuf, &send_buf_len);
//2、写入数据
sendbuf[10] = mode;
//3、发送帧
HalSend_SendData(Uartport ,sendbuf, send_buf_len, MULTI_THREAD_SEND);
}
/*************
*
* 发送探照灯温度
... ...
... ... @@ -132,6 +132,8 @@ T_JZsdkReturnCode HalSend_type1Send_Reply_UpgradeStart(int Uartport);
T_JZsdkReturnCode HalSend_type1Send_Reply_UpgradeEnd(int Uartport);
T_JZsdkReturnCode HalSend_type1Send_Reply_UpgradeCheckResult(int Uartport, int status);
T_JZsdkReturnCode HalSend_type1Send_LaserControl(int Uartport, int Control);
T_JZsdkReturnCode HalSend_type1Send_LaserMode(int Uartport, int mode);
... ...
... ... @@ -167,6 +167,25 @@ static T_JZsdkReturnCode DeviceMessage_Enter_Default(unsigned char *message)
snprintf(message,MESSAGE_MAX_LEN,"%s%s",old_message,new_message);
//JZSDK_LOG_INFO("获取的信息%s",message);
}
// //某些特殊固件增加了功率模拟显示
// if (g_MessageLanguage == DEVICE_MESSAGE_CHINESE)
// {
// memset(new_message,0,sizeof(new_message));
// memset(old_message,0,sizeof(old_message));
// snprintf(new_message,MESSAGE_MAX_LEN,"当前功率:%0.1fW\n", JZsdk_GetMagaphonePowerSimulation());
// snprintf(old_message,MESSAGE_MAX_LEN,"%s",message);
// snprintf(message,MESSAGE_MAX_LEN,"%s%s",old_message,new_message);
// }
// else
// {
// memset(new_message,0,sizeof(new_message));
// memset(old_message,0,sizeof(old_message));
// snprintf(new_message,MESSAGE_MAX_LEN,"Current Power:%0.1fW\n", JZsdk_GetMagaphonePowerSimulation());
// snprintf(old_message,MESSAGE_MAX_LEN,"%s",message);
// snprintf(message,MESSAGE_MAX_LEN,"%s%s",old_message,new_message);
// }
#endif
#ifdef IRC_CONFIG_STATUS_ON
... ...
... ... @@ -149,7 +149,7 @@ T_JZsdkReturnCode RTK_mmp_enc_Init(T_rtk_mmp_enc_info *enc_info)
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:mode", MPP_ENC_RC_MODE_CBR);
//设置码率 dji要小于8M 先填个4M 4000000
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:bps_target", 4000000);
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:bps_target", enc_info->bps_target);
//设置输入帧率不变
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:fps_in_flex", 0);
... ...
... ... @@ -18,6 +18,7 @@ typedef struct T_rtk_mmp_enc_info
unsigned int width; //输入视频的宽度
unsigned int height; //输入视频的高度
unsigned int FrameNum; //帧数
unsigned int bps_target; //目标码率
MppCodingType encType; //编码的类型
unsigned int IDR_gop; //i帧间隔数
... ...
... ... @@ -96,6 +96,9 @@ T_JZsdkReturnCode VideoMgmt_VideoStreamFlowIndex(int index)
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
break;
}
//增加一个i帧
VideoStramPhoto_DevelopH264FlowGenerateIDR();
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -136,12 +139,11 @@ T_JZsdkReturnCode VideoStramPhoto_DevelopH264FlowGenerateIDR()
{
T_JZsdkVideoMgmtHandler *VideoMgmtHandler = JZsdk_GetVideoMgmtHandler();
if (VideoMgmtHandler == NULL)
if (VideoMgmtHandler == NULL || VideoMgmtHandler->SetNextFrame_IDR == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
VideoMgmtHandler->SetNextFrame_IDR(g_VideoStreamFlowIndexNum);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
... ...
... ... @@ -51,6 +51,7 @@ T_JZsdkReturnCode Megaphone_SetVolume(int value, int mode);//霈曄蔭
static int g_TTS_Max_volume = 0; //用于存储tts最大音量限制
static int g_Max_volume = 0; //用于存储最大音量限制
static double PowerSimulation = 0; //用于模拟喊话器功率状态
/**********************
*
... ... @@ -919,6 +920,62 @@ static T_JZsdkReturnCode Megaphone_MaxVolume_Init()
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static void *JZsdk_PowerSimulationThread(void *args)
{
T_JZsdkOsalHandler *OsalHandle = JZsdk_Platform_GetOsalHandler();
while(1)
{
//获取当前播放状态
int play_status = Megaphone_GetMegaphoneStatus();
//生产一个随机数
U16_t randomNum;
OsalHandle->GetRandomNum(&randomNum); // 获取 0~65535 的随机数
// 转换为 [0.5, 1.2) 范围
double normalized = 0.5 + ((double)randomNum / 65535.0) * 0.7;
//获取音量百分比
int volume = g_Megaphone_Volume;
double _volume = (double)volume / 100;
if (_volume < 0.1)
{
_volume = 0.1;
}
if (play_status == AUDIO_PLAY_STATUS_IDLE)
{
PowerSimulation = 25 * 0.1 * normalized;
}
else
{
PowerSimulation = 25* _volume * normalized;
}
//printf("PowerSimulation:%0.1f\n",PowerSimulation);
OsalHandle->TaskSleepMs(1000);
}
}
//获取模拟功率
double JZsdk_GetMagaphonePowerSimulation()
{
return PowerSimulation;
}
static T_JZsdkReturnCode PowerSimulation_Init()
{
T_JZsdkOsalHandler *OsalHandle = JZsdk_Platform_GetOsalHandler();
T_JZTaskHandle single_task = NULL;
OsalHandle->TaskCreate("PowerSimulation", JZsdk_PowerSimulationThread, 8192, NULL , &single_task);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*********
*
* 喊话器初始化
... ... @@ -964,7 +1021,10 @@ T_JZsdkReturnCode Megaphone_Init()
int language = 0x11;
Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
}
//设置一个模拟功率函数
//PowerSimulation_Init();
MegaphoneStatusFlag = JZ_FLAGCODE_ON;
}
... ... @@ -1515,17 +1575,17 @@ T_JZsdkReturnCode Megaphone_PrintVolume(int Value, int flag)
//如果4G模块有启动
if ( (JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON))
{
HalSend_type1Send_Reply_Volume(UART_4G, g_Megaphone_Volume);
HalSend_type1Send_Reply_Volume(UART_4G, 0, g_Megaphone_Volume);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) )
{
HalSend_type1Send_Reply_Volume(UART_DEV_1, g_Megaphone_Volume);
HalSend_type1Send_Reply_Volume(UART_DEV_1, 0, g_Megaphone_Volume);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) )
{
HalSend_type1Send_Reply_Volume(UART_DEV_2, g_Megaphone_Volume);
HalSend_type1Send_Reply_Volume(UART_DEV_2, 0, g_Megaphone_Volume);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON))
... ...
... ... @@ -146,7 +146,7 @@ T_JZsdkReturnCode Megaphone_PrintVolume(int Value, int flag);
T_JZsdkReturnCode Megaphone_PresetTask();
double JZsdk_GetMagaphonePowerSimulation();
#ifdef __cplusplus
}
#endif
... ...
... ... @@ -123,7 +123,7 @@ static T_JZsdkReturnCode TTS_Synthesis(const char* src_text, const char* params)
* 获取音源
*
* ********/
static T_JZsdkReturnCode TTS_GetSoundSource(int tone,unsigned char *name_tts, unsigned char *name_path)
static T_JZsdkReturnCode TTS_GetSoundSource(int tone,unsigned char *name_tts, unsigned char *name_path, unsigned char *rule_path)
{
/*
... ... @@ -182,6 +182,25 @@ static T_JZsdkReturnCode TTS_GetSoundSource(int tone,unsigned char *name_tts, un
snprintf(name_path,64, "fo|/root/tts/xiaoyan.jet");
break;
}
//写入发音规则
memset(rule_path,0,128);
snprintf(rule_path,128,"/root/tts/common.jet");
//不是英文就直接返回
if ( tone != 0x11 && tone != 0x12)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//由于有讯飞更新,让英文有了新的发音规则,所以要检测本地是否有新的发音规则
if(JZsdk_check_file_exists("/root/tts/common_en.jet") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
memset(rule_path,0,128);
snprintf(rule_path,128,"/root/tts/common_en.jet");
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_JZsdkReturnCode TTS_FILE_GenerateAndPlay(struct t_Megaphone_tts_param *Megaphone_tts_param)
... ... @@ -196,15 +215,18 @@ static T_JZsdkReturnCode TTS_FILE_GenerateAndPlay(struct t_Megaphone_tts_param *
int ret = MSP_SUCCESS;
char name_tts[16];
char name_path[64];
char session_begin_params[512];
char tts_add_params[512];
char rule[128];
//获取音源
TTS_GetSoundSource(tone, name_tts, name_path);
//获取音源,以及规则
TTS_GetSoundSource(tone, name_tts, name_path, rule);
//配置合成参数
snprintf(session_begin_params,512,
"engine_type = local,voice_name=%s, text_encoding = UTF8, tts_res_path = %s;fo|/root/tts/common.jet, sample_rate = 16000, speed = %d, volume = %d, pitch = 50, rdn = 2"
,name_tts,name_path,speed,volume);
"engine_type = local,voice_name=%s, text_encoding = UTF8, tts_res_path = %s;fo|%s, sample_rate = 16000, speed = %d, volume = %d, pitch = 50, rdn = 2"
,name_tts , name_path, rule, speed, volume);
printf("session_begin_params=%s\n",session_begin_params);
printf("argv=%s\n",argv);
... ...
... ... @@ -11,29 +11,34 @@
static T_JZsdkReturnCode SideLaser_RealCotrol(int LaserNum, int status);
static unsigned char g_LaserMode = SIDE_LASER_OFF;
static T_SideLaserMode g_SideLaser_Control = SIDE_LASER_OFF;
static T_SideLaserMode g_SideLaser_RealMode = SIDE_LASER_OFF; //实际控制灯光的值
static int g_SideLaserMode = 0; //realmode -1
static int g_SideLaserControl = JZ_FLAGCODE_OFF;
static int SideLaser_Frequency = 50; //1~100
static void *SideLaserControl_task(void *arg)
{
int status = JZ_FLAGCODE_OFF;
static T_SideLaserMode Last_LaserMode = SIDE_LASER_OFF;
while (1)
{
switch (g_SideLaser_Control)
switch (g_SideLaser_RealMode)
{
case SIDE_LASER_OFF:
{
if (Last_LaserMode == g_SideLaser_Control)
if (Last_LaserMode == g_SideLaser_RealMode)
{
delayMs(10);
continue;
}
else
{
Last_LaserMode = g_SideLaser_Control;
Last_LaserMode = g_SideLaser_RealMode;
SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
continue;
}
... ... @@ -42,14 +47,14 @@ static void *SideLaserControl_task(void *arg)
case SIDE_LASER_GREEN_AWALYS_ON:
{
if (Last_LaserMode == g_SideLaser_Control)
if (Last_LaserMode == g_SideLaser_RealMode)
{
delayMs(10);
continue;
}
else
{
Last_LaserMode = g_SideLaser_Control;
Last_LaserMode = g_SideLaser_RealMode;
SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
SideLaser_RealCotrol(0, JZ_FLAGCODE_ON);
continue;
... ... @@ -59,14 +64,14 @@ static void *SideLaserControl_task(void *arg)
case SIDE_LASER_RED_AWALYS_ON:
{
if (Last_LaserMode == g_SideLaser_Control)
if (Last_LaserMode == g_SideLaser_RealMode)
{
delayMs(10);
continue;
}
else
{
Last_LaserMode = g_SideLaser_Control;
Last_LaserMode = g_SideLaser_RealMode;
SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
SideLaser_RealCotrol(1, JZ_FLAGCODE_ON);
continue;
... ... @@ -77,14 +82,14 @@ static void *SideLaserControl_task(void *arg)
case SIDE_LASER_GREEN_AND_RED_AWALYS_ON:
{
if (Last_LaserMode == g_SideLaser_Control)
if (Last_LaserMode == g_SideLaser_RealMode)
{
delayMs(10);
continue;
}
else
{
Last_LaserMode = g_SideLaser_Control;
Last_LaserMode = g_SideLaser_RealMode;
SideLaser_RealCotrol(255, JZ_FLAGCODE_ON);
continue;
}
... ... @@ -93,9 +98,9 @@ static void *SideLaserControl_task(void *arg)
case SIDE_LASER_GREEN_ADD_RED_TOGETHER_FLICKER:
{
if (Last_LaserMode != g_SideLaser_Control)
if (Last_LaserMode != g_SideLaser_RealMode)
{
Last_LaserMode = g_SideLaser_Control;
Last_LaserMode = g_SideLaser_RealMode;
}
if (status == JZ_FLAGCODE_OFF)
... ... @@ -116,9 +121,9 @@ static void *SideLaserControl_task(void *arg)
case SIDE_LASER_GREEN_ADD_RED_ALTERNATION_FLICKER:
{
if (Last_LaserMode != g_SideLaser_Control)
if (Last_LaserMode != g_SideLaser_RealMode)
{
Last_LaserMode = g_SideLaser_Control;
Last_LaserMode = g_SideLaser_RealMode;
}
if (status == JZ_FLAGCODE_OFF)
... ... @@ -217,12 +222,23 @@ T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, i
{
switch (paramflag)
{
case SIDELASER_REALMODE:
{
*value = g_SideLaser_RealMode;
}
break;
case SIDELASER_CONTROL:
{
*value = g_SideLaser_Control;
*value = g_SideLaserControl;
}
break;
case SIDELASER_MODE:
{
*value = g_SideLaserMode;
}
default:
{
*value = JZ_FLAGCODE_OFF;
... ... @@ -238,8 +254,32 @@ T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, i
{
case SIDELASER_CONTROL:
{
g_SideLaser_Control = *value;
JZSDK_LOG_INFO("设置激光模式:%d",g_SideLaser_Control);
g_SideLaserControl = *value;
JZSDK_LOG_INFO("设置激光控制值:%d",g_SideLaserControl);
//从灯光的模式和控制计算得到实际控制值
if (g_SideLaserControl == JZ_FLAGCODE_OFF)
{
g_SideLaser_RealMode = SIDE_LASER_OFF;
}
else
{
g_SideLaser_RealMode = g_SideLaserMode+1;
}
}
break;
case SIDELASER_MODE:
{
g_SideLaserMode = *value;
JZSDK_LOG_INFO("设置激光模式值:%d",g_SideLaserMode);
if (g_SideLaserControl == JZ_FLAGCODE_OFF)
{
g_SideLaser_RealMode = SIDE_LASER_OFF;
}
else
{
g_SideLaser_RealMode = g_SideLaserMode+1;
}
}
break;
... ...
... ... @@ -43,7 +43,9 @@ typedef enum T_SideLaserMode
* **********/
typedef enum SideLaserParam
{
SIDELASER_REALMODE = 0x000000,
SIDELASER_CONTROL = 0x000001,
SIDELASER_MODE = 0x000002,
}SideLaserParam;
/* Exported types ------------------------------------------------------------*/
... ...
... ... @@ -1585,7 +1585,15 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_SideLaserMode(int wheather_ChangeWidget, int
//如果进行控制
if (wheather_control == JZ_FLAGCODE_ON)
{
UIcontrol_SideLaser_Mode(DEVICE_PSDK, value);
if (value == 0)
{
UIcontrol_SideLaser_SetControl(DEVICE_PSDK, JZ_FLAGCODE_OFF);
}
else
{
UIcontrol_SideLaser_SetMode(DEVICE_PSDK, value);
UIcontrol_SideLaser_SetControl(DEVICE_PSDK, JZ_FLAGCODE_ON);
}
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
... ...
... ... @@ -117,17 +117,17 @@ T_JZsdkReturnCode UIcontrol_SetVolume(int DeviceName,int value)
//如果4G模块有启动
if ( (JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Reply_Volume(UART_4G, Volume);
HalSend_type1Send_Reply_Volume(UART_4G, 0, Volume);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Reply_Volume(UART_DEV_1, Volume);
HalSend_type1Send_Reply_Volume(UART_DEV_1, 0, Volume);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Reply_Volume(UART_DEV_2, Volume);
HalSend_type1Send_Reply_Volume(UART_DEV_2, 0, Volume);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -161,17 +161,17 @@ T_JZsdkReturnCode UIcontrol_Set_AudioPlayLoop(int DeviceName,int value)
//如果4G模块有启动
if ( (JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Reply_LoopPlayStatus(UART_4G, PlayLoopStatus);
HalSend_type1Send_Reply_LoopPlayStatus(UART_4G, 0, PlayLoopStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Reply_LoopPlayStatus(UART_DEV_1, PlayLoopStatus);
HalSend_type1Send_Reply_LoopPlayStatus(UART_DEV_1, 0, PlayLoopStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Reply_LoopPlayStatus(UART_DEV_2, PlayLoopStatus);
HalSend_type1Send_Reply_LoopPlayStatus(UART_DEV_2, 0, PlayLoopStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -254,17 +254,17 @@ T_JZsdkReturnCode UIcontrol_OpusRealTimeVoice_Start(int DeviceName, int BitRate)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -315,17 +315,17 @@ T_JZsdkReturnCode UIcontrol_OpusRealTimeVoice_Close(int DeviceName)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -364,17 +364,17 @@ T_JZsdkReturnCode UIcontrol_PlayAudioFile(int DeviceName, char *MusicName, int M
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -408,17 +408,17 @@ T_JZsdkReturnCode UIcontrol_StopPlayAudio(int DeviceName)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -452,17 +452,17 @@ T_JZsdkReturnCode UIcontrol_PausePlayAudio(int DeviceName)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -497,17 +497,17 @@ T_JZsdkReturnCode UIcontrol_ContinuePlayAudio(int DeviceName)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -542,17 +542,17 @@ T_JZsdkReturnCode UIcontrol_LastSong(int DeviceName)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -586,17 +586,17 @@ T_JZsdkReturnCode UIcontrol_NextSong(int DeviceName)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -638,17 +638,17 @@ T_JZsdkReturnCode UIcontrol_Opus_PlayFixedFile(int DeviceName)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -685,17 +685,17 @@ T_JZsdkReturnCode UIcontrol_Pcm_PlayListFile(int DeviceName, unsigned char *File
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -734,17 +734,17 @@ T_JZsdkReturnCode UIcontrol_TTS_Play(int DeviceName, char *data, int len)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_4G, 0, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, 0, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, 0, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -778,17 +778,17 @@ T_JZsdkReturnCode UIcontrol_Set_TTS_tone(int DeviceName,int value)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Reply_TTS_tone(UART_4G, TTS_tone);
HalSend_type1Send_Reply_TTS_tone(UART_4G, 0, TTS_tone);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Reply_TTS_tone(UART_DEV_1, TTS_tone);
HalSend_type1Send_Reply_TTS_tone(UART_DEV_1, 0, TTS_tone);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Reply_TTS_tone(UART_DEV_2, TTS_tone);
HalSend_type1Send_Reply_TTS_tone(UART_DEV_2, 0, TTS_tone);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -822,17 +822,17 @@ T_JZsdkReturnCode UIcontrol_Set_TTS_speed(int DeviceName,int value)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Reply_TTS_speed(UART_4G, TTS_speed);
HalSend_type1Send_Reply_TTS_speed(UART_4G, 0, TTS_speed);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Reply_TTS_speed(UART_DEV_1, TTS_speed);
HalSend_type1Send_Reply_TTS_speed(UART_DEV_1, 0, TTS_speed);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Reply_TTS_speed(UART_DEV_2, TTS_speed);
HalSend_type1Send_Reply_TTS_speed(UART_DEV_2, 0, TTS_speed);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -910,17 +910,17 @@ T_JZsdkReturnCode UIcontrol_Set_GimbalPitchAngle(int DeviceName,int value)
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Reply_GimbalPitchAngle(UART_4G, GimbalPitchAngle);
HalSend_type1Send_Reply_GimbalPitchAngle(UART_4G, 0, GimbalPitchAngle);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Reply_GimbalPitchAngle(UART_DEV_1, GimbalPitchAngle);
HalSend_type1Send_Reply_GimbalPitchAngle(UART_DEV_1, 0, GimbalPitchAngle);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
//HalSend_type1Send_Reply_GimbalPitchAngle(UART_DEV_2, GimbalPitchAngle);
//HalSend_type1Send_Reply_GimbalPitchAngle(UART_DEV_2, 0, GimbalPitchAngle);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -1805,17 +1805,17 @@ T_JZsdkReturnCode UIcontrol_ObtainGimbal_Pitch(int DeviceName, int GimbalPitchAn
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Reply_GimbalPitchAngle(UART_4G, GimbalPitchAngle);
HalSend_type1Send_Reply_GimbalPitchAngle(UART_4G, 0, GimbalPitchAngle);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Reply_GimbalPitchAngle(UART_DEV_1, GimbalPitchAngle);
HalSend_type1Send_Reply_GimbalPitchAngle(UART_DEV_1, 0, GimbalPitchAngle);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Reply_GimbalPitchAngle(UART_DEV_2, GimbalPitchAngle);
HalSend_type1Send_Reply_GimbalPitchAngle(UART_DEV_2, 0, GimbalPitchAngle);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
... ... @@ -2481,7 +2481,7 @@ T_JZsdkReturnCode UIcontrol_DeviceMessage_SetMessageMode(int value)
*
*
**************************************************************************************************************************************************************/
T_JZsdkReturnCode UIcontrol_SideLaser_Mode(int DeviceName, int value)
T_JZsdkReturnCode UIcontrol_SideLaser_SetControl(int DeviceName, int value)
{
T_JZsdkReturnCode ret;
#ifdef SIDE_LASER_STATUS_ON
... ... @@ -2507,7 +2507,48 @@ T_JZsdkReturnCode UIcontrol_SideLaser_Mode(int DeviceName, int value)
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
{
JZsdk_Psdk_UI_io_SideLaserMode(JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, value);
int RealMode;
//psdk的ui是开关和模式一起的,所以需要另外获取
SideLaser_param(JZ_FLAGCODE_GET, SIDELASER_REALMODE, &RealMode);
JZsdk_Psdk_UI_io_SideLaserMode(JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, RealMode);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#else
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
#endif
}
T_JZsdkReturnCode UIcontrol_SideLaser_SetMode(int DeviceName, int value)
{
T_JZsdkReturnCode ret;
#ifdef SIDE_LASER_STATUS_ON
//设置参数
ret = SideLaser_param(JZ_FLAGCODE_SET, SIDELASER_MODE, &value);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
return ret;
}
//2、通知其他设备变化
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
{
int RealMode;
//psdk的ui是开关和模式一起的,所以需要另外获取
SideLaser_param(JZ_FLAGCODE_GET, SIDELASER_REALMODE, &RealMode);
JZsdk_Psdk_UI_io_SideLaserMode(JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, RealMode);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
... ...
... ... @@ -141,7 +141,8 @@ T_JZsdkReturnCode UIcontrol_Broadcast_PlayStatus_end();
T_JZsdkReturnCode UIcontrol_Broadcast_SecondaryDeviceName(int name);
//激光
T_JZsdkReturnCode UIcontrol_SideLaser_Mode(int DeviceName, int value);
T_JZsdkReturnCode UIcontrol_SideLaser_SetControl(int DeviceName, int value);
T_JZsdkReturnCode UIcontrol_SideLaser_SetMode(int DeviceName, int value);
... ...
... ... @@ -76,6 +76,8 @@ static const T_DjiTestCameraTypeStr s_cameraTypeStrList[] = {
{DJI_CAMERA_TYPE_H30T, "H30T Camera"},
{DJI_CAMERA_TYPE_M4T, "M4T Camera"},
{DJI_CAMERA_TYPE_M4E, "M4E Camera"},
{DJI_CAMERA_TYPE_M4TD, "M4TD Camera"},
{DJI_CAMERA_TYPE_M4D, "M4D Camera"},
};
static FILE *s_downloadMediaFile = NULL;
... ... @@ -855,6 +857,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
|| DJI_CAMERA_TYPE_M3D == cameraType || DJI_CAMERA_TYPE_M3TD == cameraType
|| DJI_CAMERA_TYPE_M4T == cameraType || DJI_CAMERA_TYPE_M4E == cameraType
|| DJI_CAMERA_TYPE_H30 == cameraType || DJI_CAMERA_TYPE_H30T == cameraType
|| DJI_CAMERA_TYPE_M4TD == cameraType || DJI_CAMERA_TYPE_M4D == cameraType
) {
USER_LOG_INFO("Set mounted position %d camera's exposure mode to manual mode.",
mountPosition);
... ... @@ -898,6 +901,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
|| DJI_CAMERA_TYPE_M3D == cameraType || DJI_CAMERA_TYPE_M3TD == cameraType
|| DJI_CAMERA_TYPE_M4T == cameraType || DJI_CAMERA_TYPE_M4E == cameraType
|| DJI_CAMERA_TYPE_H30 == cameraType || DJI_CAMERA_TYPE_H30T == cameraType
|| DJI_CAMERA_TYPE_M4TD == cameraType || DJI_CAMERA_TYPE_M4D == cameraType
) {
USER_LOG_INFO("Set mounted position %d camera's exposure mode to manual mode.",
mountPosition);
... ... @@ -1198,6 +1202,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
|| DJI_CAMERA_TYPE_M3E == cameraType || DJI_CAMERA_TYPE_M3T == cameraType
|| DJI_CAMERA_TYPE_M3D == cameraType || DJI_CAMERA_TYPE_M3TD == cameraType
|| DJI_CAMERA_TYPE_M4T == cameraType || DJI_CAMERA_TYPE_M4E == cameraType
|| DJI_CAMERA_TYPE_M4TD == cameraType || DJI_CAMERA_TYPE_M4D == cameraType
) {
USER_LOG_INFO("Camera type %s does not support night scene mode!",
s_cameraTypeStrList[DjiTest_CameraManagerGetCameraTypeIndex(cameraType)].cameraTypeStr);
... ... @@ -1933,7 +1938,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
cameraType == DJI_CAMERA_TYPE_L1 || cameraType == DJI_CAMERA_TYPE_M30 ||
cameraType == DJI_CAMERA_TYPE_M3E || cameraType == DJI_CAMERA_TYPE_M3D ||
cameraType == DJI_CAMERA_TYPE_L2 || cameraType == DJI_CAMERA_TYPE_H30 ||
cameraType == DJI_CAMERA_TYPE_M4T) {
cameraType == DJI_CAMERA_TYPE_M4T || cameraType == DJI_CAMERA_TYPE_M4TD) {
USER_LOG_WARN("Camera type %s don't support FFC function.",
s_cameraTypeStrList[DjiTest_CameraManagerGetCameraTypeIndex(cameraType)].cameraTypeStr);
goto exitCameraModule;
... ... @@ -1980,7 +1985,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
cameraType == DJI_CAMERA_TYPE_L1 || cameraType == DJI_CAMERA_TYPE_M30 ||
cameraType == DJI_CAMERA_TYPE_M3E || cameraType == DJI_CAMERA_TYPE_M3D ||
cameraType == DJI_CAMERA_TYPE_L2 || cameraType == DJI_CAMERA_TYPE_H30 ||
cameraType == DJI_CAMERA_TYPE_M4T) {
cameraType == DJI_CAMERA_TYPE_M4T || cameraType == DJI_CAMERA_TYPE_M4TD) {
USER_LOG_WARN("Camera type %s don't support infrared function.",
s_cameraTypeStrList[DjiTest_CameraManagerGetCameraTypeIndex(cameraType)].cameraTypeStr);
goto exitCameraModule;
... ...
... ... @@ -59,8 +59,11 @@ static T_DjiReturnCode ReceiveDataFromMobile(const uint8_t *data, uint16_t len);
static T_DjiReturnCode ReceiveDataFromCloud(const uint8_t *data, uint16_t len);
static T_DjiReturnCode ReceiveDataFromExtensionPort(const uint8_t *data, uint16_t len);
static T_DjiReturnCode ReceiveDataFromPayload(const uint8_t *data, uint16_t len);
static T_DjiReturnCode ReceiveDataFromPayload1(const uint8_t *data, uint16_t len);
static T_DjiReturnCode ReceiveDataFromPayload2(const uint8_t *data, uint16_t len);
static T_DjiReturnCode ReceiveDataFromPayload3(const uint8_t *data, uint16_t len);
void music_data(const uint8_t *data, uint16_t len,int get_equipment);
static uint16_t crc16bitbybit(uint8_t *ptr, uint16_t len);
/* Private variables ---------------------------------------------------------*/
static T_DjiTaskHandle s_userDataTransmissionThread;
static T_DjiAircraftInfoBaseInfo s_aircraftInfoBaseInfo;
... ... @@ -98,7 +101,9 @@ T_DjiReturnCode DjiTest_DataTransmissionStartService(void)
if (s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 ||
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T ||
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3D ||
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3TD) {
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3TD ||
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M4D ||
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M4TD) {
channelAddress = DJI_CHANNEL_ADDRESS_CLOUD_API;
djiStat = DjiLowSpeedDataChannel_RegRecvDataCallback(channelAddress, ReceiveDataFromCloud);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
... ... @@ -135,14 +140,34 @@ T_DjiReturnCode DjiTest_DataTransmissionStartService(void)
}
} else if (s_aircraftInfoBaseInfo.mountPosition == DJI_MOUNT_POSITION_EXTENSION_PORT
|| DJI_MOUNT_POSITION_EXTENSION_LITE_PORT == s_aircraftInfoBaseInfo.mountPosition) {
|| DJI_MOUNT_POSITION_EXTENSION_LITE_PORT == s_aircraftInfoBaseInfo.mountPosition)
{
channelAddress = DJI_CHANNEL_ADDRESS_PAYLOAD_PORT_NO1;
djiStat = DjiLowSpeedDataChannel_RegRecvDataCallback(channelAddress, ReceiveDataFromPayload);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("register receive data from payload NO1 error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
} else {
//djiStat = DjiLowSpeedDataChannel_RegRecvDataCallback(channelAddress, ReceiveDataFromPayload1);
//if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
// USER_LOG_ERROR("register receive data from payload NO1 error.");
// return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
//}
//channelAddress = DJI_CHANNEL_ADDRESS_PAYLOAD_PORT_NO2;
//djiStat = DjiLowSpeedDataChannel_RegRecvDataCallback(channelAddress, ReceiveDataFromPayload2);
//if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
// USER_LOG_ERROR("register receive data from payload NO1 error.");
// return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
//}
//channelAddress = DJI_CHANNEL_ADDRESS_PAYLOAD_PORT_NO3;
//djiStat = DjiLowSpeedDataChannel_RegRecvDataCallback(channelAddress, ReceiveDataFromPayload3);
//if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
// USER_LOG_ERROR("register receive data from payload NO1 error.");
// return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
//}
}
else
{
return DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT;
}
... ... @@ -213,7 +238,9 @@ static void *UserDataTransmission_Task(void *arg)
if (s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 ||
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T ||
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3D ||
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3TD) {
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3TD ||
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M4D ||
s_aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M4TD ) {
channelAddress = DJI_CHANNEL_ADDRESS_CLOUD_API;
djiStat = DjiLowSpeedDataChannel_SendData(channelAddress, dataToBeSent, sizeof(dataToBeSent));
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
... ... @@ -262,8 +289,7 @@ static void *UserDataTransmission_Task(void *arg)
USER_LOG_ERROR("get data stream state error.");
}
}
} else if (s_aircraftInfoBaseInfo.mountPosition == DJI_MOUNT_POSITION_EXTENSION_PORT
|| DJI_MOUNT_POSITION_EXTENSION_LITE_PORT == s_aircraftInfoBaseInfo.mountPosition) {
} else if (s_aircraftInfoBaseInfo.mountPosition == DJI_MOUNT_POSITION_EXTENSION_PORT) {
channelAddress = DJI_CHANNEL_ADDRESS_PAYLOAD_PORT_NO1;
djiStat = DjiLowSpeedDataChannel_SendData(channelAddress, dataToBeSent, sizeof(dataToBeSent));
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
... ... @@ -394,6 +420,24 @@ static T_DjiReturnCode ReceiveDataFromPayload(const uint8_t *data, uint16_t len)
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_DjiReturnCode ReceiveDataFromPayload1(const uint8_t *data, uint16_t len)
{
USER_LOG_INFO("Receive from payload on port 1");
return ReceiveDataFromPayload(data, len);
}
static T_DjiReturnCode ReceiveDataFromPayload2(const uint8_t *data, uint16_t len)
{
USER_LOG_INFO("Receive from payload on port 2");
return ReceiveDataFromPayload(data, len);
}
static T_DjiReturnCode ReceiveDataFromPayload3(const uint8_t *data, uint16_t len)
{
USER_LOG_INFO("Receive from payload on port 3");
return ReceiveDataFromPayload(data, len);
}
static int DebugModeCheck(unsigned char *data, unsigned int len)
{
if (len == sizeof("#debugmode#") - 1) // 减去终止符 '\0'
... ... @@ -424,6 +468,7 @@ static int DebugModeCheck(unsigned char *data, unsigned int len)
}
//根据不同的通道再加上判断各个功能标志位来做事 1是通道5 2是通道4
void music_data(const uint8_t *data, uint16_t len,int get_equipment)
{
... ... @@ -468,31 +513,4 @@ void music_data(const uint8_t *data, uint16_t len,int get_equipment)
}
static uint16_t crc16bitbybit(uint8_t *ptr, uint16_t len)
{
uint8_t i;
uint16_t crc = 0xffff;
uint16_t polynom = 0xA001;//CRC校验
if (len == 0)
{
len = 1;
}
while (len--)
{
crc ^= *ptr;
for (int i = 0; i<8; i++)
{
if (crc & 1)
{
crc >>= 1;
crc ^= polynom;
}
else
{
crc >>= 1;
}
}
ptr++;
}
return crc;
}
\ No newline at end of file
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/
... ...
... ... @@ -548,10 +548,8 @@ static T_DjiReturnCode DjiTest_FcSubscriptionReceiveQuaternionCallback(const uin
roll = (dji_f64_t) atan2f(2 * quaternion->q2 * quaternion->q3 + 2 * quaternion->q0 * quaternion->q1,
-2 * quaternion->q1 * quaternion->q1 - 2 * quaternion->q2 * quaternion->q2 + 1) * 57.3;
yaw = (dji_f64_t) atan2f(2 * quaternion->q1 * quaternion->q2 + 2 * quaternion->q0 * quaternion->q3,
-2 * quaternion->q2 * quaternion->q2 - 2 * quaternion->q3 * quaternion->q3 + 1) *57.3;
//printf("回调:pitch%d\n",(int)pitch);
-2 * quaternion->q2 * quaternion->q2 - 2 * quaternion->q3 * quaternion->q3 + 1) *
57.3;
//飞机自身角度
JZsdk_Psdk_Ui_io_Gimbal_PitchSelfangleMode( ( (int)pitch * 10));
... ...
/**
********************************************************************
* @file test_fc_subscription.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 DJI’s authorization, you may not
* further disseminate the information, and you must immediately remove the
* source code and notify DJI of its removal. DJI reserves the right to pursue
* legal actions against you for any loss(es) or damage(s) caused by your
* failure to do so.
*
*********************************************************************
*/
/*
1.消息订阅初始化
2.构造回调函数,通过构造回调函数接收飞行器推送的信息。
*/
/* Includes ------------------------------------------------------------------*/
#include <utils/util_misc.h>
#include <math.h>
#include "test_fc_subscription.h"
#include "dji_logger.h"
#include "dji_platform.h"
#include "widget_interaction_test/test_widget_interaction.h"
#include "../widget/test_widget.h"
#include "dji_aircraft_info.h"
#include "version_choose.h"
#include "Psdk_UI_io.h"
#include "gimbal_emu/test_payload_gimbal_emu.h"
#include "JZsdkLib.h"
#include "DeviceInfo/Attribute/Attribute.h"
/* Private constants ---------------------------------------------------------*/
#define FC_SUBSCRIPTION_TASK_FREQ (1)
#define FC_SUBSCRIPTION_TASK_STACK_SIZE (1024)
/* Private types -------------------------------------------------------------*/
/* Private functions declaration ---------------------------------------------*/
static void *Subscription_GPS_DealTask(void *arg);
static void *Subscription_Velocity_ReplyTask(void *arg);
// static void *Subscription_GimbalSub_Task(void *arg);
static T_DjiReturnCode DjiTest_FcSubscriptionReceiveQuaternionCallback(const uint8_t *data, uint16_t dataSize,
const T_DjiDataTimestamp *timestamp);
static void *Subscription_GimbalAngels_task(void *arg);
static void* Subscription_Height_Fusion_task(void* arg);
/* Private variables ---------------------------------------------------------*/
static T_DjiTaskHandle s_userFcSubscriptionThread;
static bool s_userFcSubscriptionDataShow = false;//标志位
static uint8_t s_totalSatelliteNumberUsed = 0;
static T_DjiFcSubscriptionGpsTime gpsTime = {0};
static T_DjiFcSubscriptionGpsDate gpsDate = {0};
static T_DjiFcSubscriptionGpsPosition gpsPosition = {0};
//获取时间结构体
struct TimeGetSub
{
int GetTime;
int GetDate;
};
float g_height_value = 0;
int height_Volume_lock = 0; //高度音量锁
static int g_WhetherInChina = 0;
/* Exported functions definition ---------------------------------------------*/
/*
DjiTest_FcSubscriptionStartService----------------------------------------------------------------------------------------------START
1. 初始化消息订阅模块
2. 指定TOPIC发起数据订阅 订阅的消息有 姿态四元数 速度 GPS 位置 GPS 信息
3. 运行user_subscription_task样例任务
*/
T_DjiReturnCode DjiTest_FcSubscriptionStartService(void)
{
T_DjiReturnCode djiStat;
T_DjiOsalHandler *osalHandler = NULL;
T_DjiReturnCode returnCode;
T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo;
osalHandler = DjiPlatform_GetOsalHandler();
//消息订阅功能模块初始化
djiStat = DjiFcSubscription_Init();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("init data subscription module error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
// 获得飞机信息
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;
}
//订阅gps时间的主题
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ,
NULL);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic gps position error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
//订阅gps日期 主题
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ,
NULL);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic gps position error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
//订阅gps地址
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ,
NULL);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic gps position error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
//订阅 飞机 飞行状态
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ,
NULL);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic velocity error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
} else {
USER_LOG_DEBUG("Subscribe topic velocity success.");
}
//订阅相机角度
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_ANGLES, DJI_DATA_SUBSCRIPTION_TOPIC_50_HZ,NULL);//订阅角度
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
USER_LOG_ERROR("Subscribe topic quaternion error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
//飞机自身角度
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ,
DjiTest_FcSubscriptionReceiveQuaternionCallback);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic quaternion error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
} else {
USER_LOG_DEBUG("Subscribe topic quaternion success.");
}
// //m30和m30t有高度锁
// if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T)
// {
// if (osalHandler->TaskCreate("Subscription_Height_Fusion_task", Subscription_Height_Fusion_task,
// FC_SUBSCRIPTION_TASK_STACK_SIZE, NULL, &s_userFcSubscriptionThread) !=
// DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
// USER_LOG_ERROR("Height Fusion task create error.");
// return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
// }
// else {
// USER_LOG_INFO("开启相对高度音量限制功能");
// }
// }
/**********************
*
*
* 处理线程
*
* *******************************************/
//gps处理线程
if (osalHandler->TaskCreate("user_GPSDeal_task",Subscription_GPS_DealTask,
FC_SUBSCRIPTION_TASK_STACK_SIZE, NULL, &s_userFcSubscriptionThread) !=
DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("user data subscription task create error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
//飞机飞行状态回复线程
if (osalHandler->TaskCreate("user_subscription_task", Subscription_Velocity_ReplyTask,
FC_SUBSCRIPTION_TASK_STACK_SIZE, NULL, &s_userFcSubscriptionThread) !=
DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("user data subscription task create error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
// //云台参数回复线程
// if (osalHandler->TaskCreate("Subscription_GimbalSub_Task", Subscription_GimbalSub_Task,
// FC_SUBSCRIPTION_TASK_STACK_SIZE, NULL, &s_userFcSubscriptionThread) !=
// DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
// {
// USER_LOG_ERROR("user data subscription task create error.");
// return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
// }
//如果飞机为需要飞机自带的相机进行云台联动的型号
// if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30
// || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T
// || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3E
// || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3T
// || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3D
// || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3TD
// || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK
// || aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK
// )
// {
if (osalHandler->TaskCreate("Subscription_GimbalAngels_task", Subscription_GimbalAngels_task,
FC_SUBSCRIPTION_TASK_STACK_SIZE, NULL, &s_userFcSubscriptionThread) !=
DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("user data Subscription_GimbalAngels_task create error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
//}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//取反标志位,是和阻塞函数里用到--------------------------------------------------------
T_DjiReturnCode DjiTest_FcSubscriptionDataShowTrigger(void)
{
//标志位取反
s_userFcSubscriptionDataShow = !s_userFcSubscriptionDataShow;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//获取标志位到number------------------------------------------------------------------------
T_DjiReturnCode DjiTest_FcSubscriptionGetTotalSatelliteNumber(uint8_t *number)
{
*number = s_totalSatelliteNumberUsed;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/* Private functions definition-----------------------------------------------*/
#ifndef __CC_ARM
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmissing-noreturn"
#pragma GCC diagnostic ignored "-Wreturn-type"
#endif
/**
*
功能:判断经纬度是否在指定范围
参数:x 经度 y 纬度
返回值:1(中国) 0(国外)
*/
static int check_GPS()
{
//经度
int x = 0;
//纬度
int y = 0;
x = (int)gpsPosition.x;
y = (int)gpsPosition.y;
//USER_LOG_INFO("x:%f y:%f",x,y);
x= x/10000000;
y= y/10000000;
//USER_LOG_INFO("x:%d y:%d",x,y);
/**
中国经纬度粗划分,精度为 1 ,中国区域占比偏大
*/
int gps_map[67][2]={
{0 ,0 },{ 0, 0},{ 0, 0},{0,0},{37,38},{36,41},{35,42},{35,42},{31,42},{30,45},//70-79
{29,45},{30,46},{29,47},{29,48},{28,48},{27,49},{27,50},{27,50},{27,49},{27,48},//80-89
{28,48},{27,46},{26,46},{27,45},{27,45},{27,45},{28,44},{23,43},{23,43},{21,43},//90-99
{21,43},{21,43},{22,42},{22,42},{22,42},{22,43},{22,43},{21,43},{21,43},{3,43},//100-109
{3,43},{3,45},{3,46},{4,45},{5,46},{6,49},{9,50},{10,50},{13,49},{25,51},//110-119
{19,53},{20,54},{22,54},{24,54},{25,54},{40,54},{41,53},{41,51},{41,50},{41,50},//120-129
{42,49},{42,48},{45,48},{45,49},{47,48},{48,49},{48,49}//130-136
};
if(x<73||x>136) //经度超范围
{
g_WhetherInChina = 0;;
}
else
{
int getx=x-70;
int gety=y;
if(y>=gps_map[getx][0]&&y<=gps_map[getx][1]) //根据经纬度判断是否处于中国区域
g_WhetherInChina = 1;
else
g_WhetherInChina = 0;
}
}
int Subscription_WhetherInChina()
{
//USER_LOG_INFO("g_WhetherInChina:%d",g_WhetherInChina);
//不在返回0 在返回1
return g_WhetherInChina;
}
//GPS订阅线程
static void *Subscription_GPS_DealTask(void *arg)
{
//权柄
T_DjiReturnCode djiStat;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
//回调参数
T_DjiDataTimestamp timestamp = {0};
USER_UTIL_UNUSED(arg);
while (1)
{
//时间
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME,
(uint8_t *) &gpsTime,
sizeof(T_DjiFcSubscriptionGpsTime),
&timestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get value of topic gps position error.");
} else {
//USER_LOG_INFO("gpsTime = %d", gpsTime);
}
//日期
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE,
(uint8_t *) &gpsDate,
sizeof(T_DjiFcSubscriptionGpsDate),
&timestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get value of topic gps position error.");
} else {
//USER_LOG_INFO("gpsDate = %d", gpsDate);
}
//地址
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION,
(uint8_t *) &gpsPosition,
sizeof(T_DjiFcSubscriptionGpsPosition),
&timestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get value of topic gps position error.");
} else {
//USER_LOG_INFO("gpsDate = %d", gpsDate);
}
//如果为海外版
if (FIRMWARE_ORIGIN == OVERSEAS_VERSION)
{
check_GPS();
//USER_LOG_INFO("海外");
}
//USER_LOG_INFO("gps订阅");
//1s一次
T_JZsdkAttributeGpsPosition temp_GpsPosition;
temp_GpsPosition.x = gpsPosition.x;
temp_GpsPosition.y = gpsPosition.y;
temp_GpsPosition.z = gpsPosition.z;
Attribute_SetGpsPosition(temp_GpsPosition);
T_JZsdkAttributeGpsTime temp_GpsTime;
temp_GpsTime = gpsTime;
Attribute_SetGpsTime(temp_GpsTime);
T_JZsdkAttributeGpsDate temp_GpsDate;
temp_GpsDate = gpsDate;
Attribute_SetGpsDate(temp_GpsDate);
osalHandler->TaskSleepMs(1000 / FC_SUBSCRIPTION_TASK_FREQ);
}
//5、结束订阅函数
djiStat = DjiFcSubscription_DeInit();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Deinit fc subscription error.");
}
}
static void *Subscription_Velocity_ReplyTask(void *arg)
{
T_DjiReturnCode djiStat;
T_DjiFcSubscriptionVelocity velocity = {0};
T_DjiDataTimestamp timestamp = {0};
T_DjiFcSubscriptionGpsPosition gpsPosition = {0};
T_DjiFcSubscriptionGpsDetails gpsDetails = {0};
T_DjiOsalHandler *osalHandler = NULL;
USER_UTIL_UNUSED(arg);
osalHandler = DjiPlatform_GetOsalHandler();
//飞机的运行情况打印
while (1) {
//等待一秒
osalHandler->TaskSleepMs(1000 / FC_SUBSCRIPTION_TASK_FREQ);
//主动获取数据 获取指定TOPIC的最新发布数据。 获取速度------------------------------------------------
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY,
(uint8_t *) &velocity,
sizeof(T_DjiFcSubscriptionVelocity),
&timestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get value of topic velocity error.");
}
//如果是阻塞标志位开启,就将速度打印出来
if (s_userFcSubscriptionDataShow == true) {
USER_LOG_INFO("velocity: x %f y %f z %f, healthFlag %d.", velocity.data.x, velocity.data.y,
velocity.data.z, velocity.health);
}
}
}
static void *Subscription_GimbalAngels_task(void *arg)
{
T_DjiReturnCode djiStat;
T_DjiVector3f gimbalangle = {0};//云台角度
T_DjiOsalHandler *osalHandler = NULL;
T_DjiDataTimestamp timestamp = {0};
osalHandler = DjiPlatform_GetOsalHandler();
int LastGimbalPitch;
int NowGimbalPitch;
USER_LOG_INFO("相机云台联动线程已经启用");
while (1) {//一直在循环里面
//osalHandler->TaskSleepMs(1000 / FC_SUBSCRIPTION_TASK_FREQ);
osalHandler->TaskSleepMs(1000 / 20);
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_ANGLES,
(uint8_t *) &gimbalangle,
sizeof(T_DjiVector3f),
&timestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get gimbal angle error.");
}
else
{
NowGimbalPitch = (int)gimbalangle.x * 10;
//USER_LOG_INFO("NowGimbalPitch%d",NowGimbalPitch);
//如果云台联动已经打开
if( (Get_Gimbal_linkage()== JZ_FLAGCODE_ON ) && (NowGimbalPitch != LastGimbalPitch) )
{
//printf("消息订阅联动\n");
JZsdk_Psdk_Ui_io_Gimbal_PitchAngleControlMode(NowGimbalPitch);
LastGimbalPitch = NowGimbalPitch;
}
}
}
}
//获取相对高度音量限制线程
static void* Subscription_Height_Fusion_task(void* arg)
{
T_DjiReturnCode djiStat;
T_DjiFcSubscriptionHeightFusion height_fusion_value = {0};//融合相对高度
T_DjiOsalHandler* osalHandler = NULL;
T_DjiDataTimestamp timestamp = { 0 };
osalHandler = DjiPlatform_GetOsalHandler();
//订阅相对融合高度
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_FUSION, DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ,NULL);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
JZSDK_LOG_ERROR("融合高度订阅失败");
}
else
{
JZSDK_LOG_INFO("融合高度订阅成功");
}
while (1) {//一直在循环里面
osalHandler->TaskSleepMs(100);
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_FUSION,
(uint8_t*)&height_fusion_value,
sizeof(T_DjiFcSubscriptionHeightFusion),
&timestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get height relativevalue error.");
}
else
{
//USER_LOG_INFO("融合相对高度为 = %f",height_fusion_value);
g_height_value = height_fusion_value;
//如果高度音量限制已打开,音量超过60,设置为60%
if ( height_fusion_value <= 10) // && DeviceActivation_GetDebugMode() == 0)
{
height_Volume_lock = 1;//高度锁生效
if(JZsdk_Psdk_UI_io_GetWidgetVolume() >60 ) //高度音量锁e > 60
{
JZsdk_Psdk_UI_io_SetVolume(1,60);
}
}
else {
height_Volume_lock = 0;//高度锁解锁
//高度音量锁
}
}
}
}
#ifndef __CC_ARM
#pragma GCC diagnostic pop
#endif
//回调函数
static T_DjiReturnCode DjiTest_FcSubscriptionReceiveQuaternionCallback(const uint8_t *data, uint16_t dataSize,
const T_DjiDataTimestamp *timestamp)
{
T_DjiFcSubscriptionQuaternion *quaternion = (T_DjiFcSubscriptionQuaternion *) data;
dji_f64_t pitch, yaw, roll;
USER_UTIL_UNUSED(dataSize);
//转换成 倾角 转角
pitch = (dji_f64_t) asinf(-2 * quaternion->q1 * quaternion->q3 + 2 * quaternion->q0 * quaternion->q2) * 57.3;
roll = (dji_f64_t) atan2f(2 * quaternion->q2 * quaternion->q3 + 2 * quaternion->q0 * quaternion->q1,
-2 * quaternion->q1 * quaternion->q1 - 2 * quaternion->q2 * quaternion->q2 + 1) * 57.3;
yaw = (dji_f64_t) atan2f(2 * quaternion->q1 * quaternion->q2 + 2 * quaternion->q0 * quaternion->q3,
-2 * quaternion->q2 * quaternion->q2 - 2 * quaternion->q3 * quaternion->q3 + 1) *57.3;
//printf("回调:pitch%d\n",(int)pitch);
//飞机自身角度
JZsdk_Psdk_Ui_io_Gimbal_PitchSelfangleMode( ( (int)pitch * 10));
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode DjiTest_FcSubscriptionRunSample(void)
{
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/
... ...
... ... @@ -1306,6 +1306,8 @@ bool DjiTest_FlightControlGoHomeAndConfirmLanding(void)
|| DJI_AIRCRAFT_TYPE_M3D == aircraftInfoBaseInfo.aircraftType || DJI_AIRCRAFT_TYPE_M3TD == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M4T == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M4E == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M4TD == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M4D == aircraftInfoBaseInfo.aircraftType
) {
if ((dji_f64_t) 0.45 < heightFusion && heightFusion < (dji_f64_t) 0.55) {
break;
... ...
/**
********************************************************************
* @file test_flight_control.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 DJI’s authorization, you may not
* further disseminate the information, and you must immediately remove the
* source code and notify DJI of its removal. DJI reserves the right to pursue
* legal actions against you for any loss(es) or damage(s) caused by your
* failure to do so.
*
*********************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "dji_flight_controller.h"
#include "test_flight_control.h"
#include "dji_fc_subscription.h"
#include "dji_platform.h"
#include "dji_logger.h"
#include <math.h>
#include <widget_interaction_test/test_widget_interaction.h>
#include <dji_aircraft_info.h>
/* Private constants ---------------------------------------------------------*/
/* Private types -------------------------------------------------------------*/
typedef struct {
E_DjiFcSubscriptionDisplayMode displayMode;
char *displayModeStr;
} T_DjiTestFlightControlDisplayModeStr;
/* Private values -------------------------------------------------------------*/
static T_DjiOsalHandler *s_osalHandler = NULL;
static const double s_earthCenter = 6378137.0;
static const double s_degToRad = 0.01745329252;
static bool s_isFtsCallbackRegistered = false;
static int32_t s_ftsTriggerCount = 0;
static const T_DjiTestFlightControlDisplayModeStr s_flightControlDisplayModeStr[] = {
{.displayMode = DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ATTITUDE, .displayModeStr = "attitude mode"},
{.displayMode = DJI_FC_SUBSCRIPTION_DISPLAY_MODE_P_GPS, .displayModeStr = "p_gps mode"},
{.displayMode = DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ASSISTED_TAKEOFF, .displayModeStr = "assisted takeoff mode"},
{.displayMode = DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_TAKEOFF, .displayModeStr = "auto takeoff mode"},
{.displayMode = DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_LANDING, .displayModeStr = "auto landing mode"},
{.displayMode = DJI_FC_SUBSCRIPTION_DISPLAY_MODE_NAVI_GO_HOME, .displayModeStr = "go home mode"},
{.displayMode = DJI_FC_SUBSCRIPTION_DISPLAY_MODE_FORCE_AUTO_LANDING, .displayModeStr = "force landing mode"},
{.displayMode = DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ENGINE_START, .displayModeStr = "engine start mode"},
{.displayMode = 0xFF, .displayModeStr = "unknown mode"}
};
/* Private functions declaration ---------------------------------------------*/
static uint8_t DjiTest_FlightControlGetDisplayModeIndex(E_DjiFcSubscriptionDisplayMode displayMode);
static T_DjiFcSubscriptionFlightStatus DjiTest_FlightControlGetValueOfFlightStatus(void);
static T_DjiFcSubscriptionDisplaymode DjiTest_FlightControlGetValueOfDisplayMode(void);
static T_DjiFcSubscriptionHeightFusion DjiTest_FlightControlGetValueOfHeightFusion(void);
static T_DjiFcSubscriptionQuaternion DjiTest_FlightControlGetValueOfQuaternion(void);
static T_DjiFcSubscriptionPositionFused DjiTest_FlightControlGetValueOfPositionFused(void);
static dji_f32_t DjiTest_FlightControlGetValueOfRelativeHeight(void);
static bool DjiTest_FlightControlMotorStartedCheck(void);
static bool DjiTest_FlightControlTakeOffInAirCheck(void);
static bool DjiTest_FlightControlLandFinishedCheck(void);
static bool DjiTest_FlightControlMonitoredTakeoff(void);
static bool DjiTest_FlightControlCheckActionStarted(E_DjiFcSubscriptionDisplayMode mode);
static bool DjiTest_FlightControlMonitoredLanding(void);
static bool DjiTest_FlightControlGoHomeAndConfirmLanding(void);
static T_DjiTestFlightControlVector3f DjiTest_FlightControlQuaternionToEulerAngle(T_DjiFcSubscriptionQuaternion quat);
static T_DjiTestFlightControlVector3f
DjiTest_FlightControlLocalOffsetFromGpsAndFusedHeightOffset(T_DjiFcSubscriptionPositionFused target,
T_DjiFcSubscriptionPositionFused origin,
dji_f32_t targetHeight,
dji_f32_t originHeight);
static T_DjiTestFlightControlVector3f
DjiTest_FlightControlVector3FSub(T_DjiTestFlightControlVector3f vectorA, T_DjiTestFlightControlVector3f vectorB);
static int DjiTest_FlightControlSignOfData(dji_f32_t data);
static void DjiTest_FlightControlHorizCommandLimit(dji_f32_t speedFactor, dji_f32_t *commandX, dji_f32_t *commandY);
static dji_f32_t DjiTest_FlightControlVectorNorm(T_DjiTestFlightControlVector3f v);
static T_DjiReturnCode
DjiTest_FlightControlJoystickCtrlAuthSwitchEventCallback(T_DjiFlightControllerJoystickCtrlAuthorityEventInfo eventData);
static bool DjiTest_FlightControlMoveByPositionOffset(T_DjiTestFlightControlVector3f offsetDesired,
float yawDesiredInDeg,
float posThresholdInM,
float yawThresholdInDeg);
static T_DjiReturnCode DjiTest_FlightControlInit(void);
static T_DjiReturnCode DjiTest_FlightControlDeInit(void);
static void DjiTest_FlightControlTakeOffLandingSample(void);
static void DjiTest_FlightControlPositionControlSample(void);
static void DjiTest_FlightControlGoHomeForceLandingSample(void);
static void DjiTest_FlightControlVelocityControlSample(void);
static void DjiTest_FlightControlArrestFlyingSample(void);
static void DjiTest_FlightControlSetGetParamSample(void);
static void DjiTest_FlightControlPassiveTriggerFtsSample(void);
static T_DjiReturnCode DjiTest_TriggerFtsEventCallback(void);
static void DjiTest_FlightControlSample(E_DjiTestFlightCtrlSampleSelect flightCtrlSampleSelect);
/* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode DjiTest_FlightControlRunSample(E_DjiTestFlightCtrlSampleSelect flightCtrlSampleSelect)
{
T_DjiReturnCode returnCode;
USER_LOG_DEBUG("Init flight Control Sample");
DjiTest_WidgetLogAppend("Init flight Control Sample");
returnCode = DjiTest_FlightControlInit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Init flight Control sample failed,error code:0x%08llX", returnCode);
return returnCode;
}
DjiTest_FlightControlSample(flightCtrlSampleSelect);
USER_LOG_DEBUG("Deinit Flight Control Sample");
DjiTest_WidgetLogAppend("Deinit Flight Control Sample");
returnCode = DjiTest_FlightControlDeInit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Deinit Flight Control sample failed,error code:0x%08llX", returnCode);
return returnCode;
}
return returnCode;
}
/* Private functions definition-----------------------------------------------*/
T_DjiReturnCode DjiTest_FlightControlInit(void)
{
T_DjiReturnCode returnCode;
T_DjiFlightControllerRidInfo ridInfo = {0};
s_osalHandler = DjiPlatform_GetOsalHandler();
if (!s_osalHandler) return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
ridInfo.latitude = 22.542812;
ridInfo.longitude = 113.958902;
ridInfo.altitude = 10;
returnCode = DjiFlightController_Init(ridInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Init flight controller module failed, error code:0x%08llX", returnCode);
return returnCode;
}
returnCode = DjiFcSubscription_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Init data subscription module failed, error code:0x%08llX", returnCode);
return returnCode;
}
/*! subscribe fc data */
returnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_STATUS_FLIGHT,
DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ,
NULL);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic flight status failed, error code:0x%08llX", returnCode);
return returnCode;
}
returnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_STATUS_DISPLAYMODE,
DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ,
NULL);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic display mode failed, error code:0x%08llX", returnCode);
return returnCode;
}
returnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_FUSION,
DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ,
NULL);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic avoid data failed,error code:0x%08llX", returnCode);
return returnCode;
}
returnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION,
DJI_DATA_SUBSCRIPTION_TOPIC_50_HZ,
NULL);
if (returnCode == DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
} else if (returnCode == DJI_ERROR_SUBSCRIPTION_MODULE_CODE_TOPIC_DUPLICATE) {
USER_LOG_WARN("Subscribe topic quaternion duplicate");
} else {
USER_LOG_ERROR("Subscribe topic quaternion failed,error code:0x%08llX", returnCode);
return returnCode;
}
returnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_POSITION_FUSED,
DJI_DATA_SUBSCRIPTION_TOPIC_50_HZ,
NULL);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic position fused failed,error code:0x%08llX", returnCode);
return returnCode;
}
returnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_FUSED,
DJI_DATA_SUBSCRIPTION_TOPIC_50_HZ,
NULL);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic altitude fused failed,error code:0x%08llX", returnCode);
return returnCode;
}
returnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT,
DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ,
NULL);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic altitude of home point failed,error code:0x%08llX", returnCode);
return returnCode;
}
returnCode = DjiFlightController_RegJoystickCtrlAuthorityEventCallback(
DjiTest_FlightControlJoystickCtrlAuthSwitchEventCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS && returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_NONSUPPORT) {
USER_LOG_ERROR("Register joystick control authority event callback failed,error code:0x%08llX", returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode DjiTest_FlightControlDeInit(void)
{
T_DjiReturnCode returnCode;
returnCode = DjiFlightController_DeInit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Deinit flight controller module failed, error code:0x%08llX",
returnCode);
return returnCode;
}
returnCode = DjiFcSubscription_DeInit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Deinit data subscription module failed, error code:0x%08llX",
returnCode);
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
void DjiTest_FlightControlTakeOffLandingSample()
{
T_DjiReturnCode returnCode;
USER_LOG_INFO("Flight control takeoff-landing sample start");
DjiTest_WidgetLogAppend("Flight control takeoff-landing sample start");
USER_LOG_INFO("--> Step 1: Obtain joystick control authority.");
DjiTest_WidgetLogAppend("--> Step 1: Obtain joystick control authority.");
returnCode = DjiFlightController_ObtainJoystickCtrlAuthority();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Obtain joystick authority failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 2: Take off\r\n");
DjiTest_WidgetLogAppend("--> Step 2: Take off\r\n");
if (!DjiTest_FlightControlMonitoredTakeoff()) {
USER_LOG_ERROR("Take off failed");
goto out;
}
USER_LOG_INFO("Successful take off\r\n");
DjiTest_WidgetLogAppend("Successful take off\r\n");
s_osalHandler->TaskSleepMs(4000);
USER_LOG_INFO("--> Step 3: Landing\r\n");
DjiTest_WidgetLogAppend("--> Step 3: Landing\r\n");
if (!DjiTest_FlightControlMonitoredLanding()) {
USER_LOG_ERROR("Landing failed");
goto out;
}
USER_LOG_INFO("Successful landing\r\n");
DjiTest_WidgetLogAppend("Successful landing\r\n");
USER_LOG_INFO("--> Step 4: Release joystick authority");
DjiTest_WidgetLogAppend("--> Step 4: Release joystick authority");
returnCode = DjiFlightController_ReleaseJoystickCtrlAuthority();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Release joystick authority failed, error code: 0x%08X", returnCode);
goto out;
}
out:
USER_LOG_INFO("Flight control takeoff-landing sample end");
DjiTest_WidgetLogAppend("Flight control takeoff-landing sample end");
}
void DjiTest_FlightControlPositionControlSample()
{
T_DjiReturnCode returnCode;
USER_LOG_INFO("Flight control move-by-position sample start");
DjiTest_WidgetLogAppend("Flight control move-by-position sample start");
USER_LOG_INFO("--> Step 1: Obtain joystick control authority.");
DjiTest_WidgetLogAppend("--> Step 1: Obtain joystick control authority.");
returnCode = DjiFlightController_ObtainJoystickCtrlAuthority();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Obtain joystick authority failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 2: Take off\r\n");
DjiTest_WidgetLogAppend("--> Step 2: Take off\r\n");
if (!DjiTest_FlightControlMonitoredTakeoff()) {
USER_LOG_ERROR("Take off failed");
goto out;
}
USER_LOG_INFO("Successful take off\r\n");
DjiTest_WidgetLogAppend("Successful take off\r\n");
USER_LOG_INFO("--> Step 3: Move to north:0(m), east:6(m), up:6(m) , yaw:30(degree) from current point");
DjiTest_WidgetLogAppend("--> Step 3: Move to north:0(m), east:6(m), up:6(m) , yaw:30(degree) from current point");
if (!DjiTest_FlightControlMoveByPositionOffset((T_DjiTestFlightControlVector3f) {0, 6, 6}, 30, 0.8, 1)) {
USER_LOG_ERROR("Move to north:0(m), east:6(m), up:6(m) , yaw:30(degree) from current point failed");
goto out;
};
USER_LOG_INFO("--> Step 4: Move to north:6(m), east:0(m), up:-3(m) , yaw:-30(degree) from current point");
DjiTest_WidgetLogAppend(
"--> Step 4: Move to north:6(m), east:0(m), up:-3(m) , yaw:-30(degree) from current point");
if (!DjiTest_FlightControlMoveByPositionOffset((T_DjiTestFlightControlVector3f) {6, 0, -3}, -30, 0.8, 1)) {
USER_LOG_ERROR("Move to north:6(m), east:0(m), up:-3(m) , yaw:-30(degree) from current point failed");
goto out;
};
USER_LOG_INFO("--> Step 5: Move to north:-6(m), east:-6(m), up:0(m) , yaw:0(degree) from current point");
DjiTest_WidgetLogAppend("--> Step 5: Move to north:-6(m), east:-6(m), up:0(m) , yaw:0(degree) from current point");
if (!DjiTest_FlightControlMoveByPositionOffset((T_DjiTestFlightControlVector3f) {-6, -6, 0}, 0, 0.8, 1)) {
USER_LOG_ERROR("Move to north:-6(m), east:-6(m), up:0(m) , yaw:0(degree) from current point failed");
goto out;
}
USER_LOG_INFO("--> Step 6: Landing\r\n");
DjiTest_WidgetLogAppend("--> Step 6: Landing\r\n");
if (!DjiTest_FlightControlMonitoredLanding()) {
USER_LOG_ERROR("Landing failed");
goto out;
}
USER_LOG_INFO("Successful landing\r\n");
DjiTest_WidgetLogAppend("Successful landing\r\n");
USER_LOG_INFO("--> Step 7: Release joystick authority");
DjiTest_WidgetLogAppend("--> Step 7: Release joystick authority");
returnCode = DjiFlightController_ReleaseJoystickCtrlAuthority();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Release joystick authority failed, error code: 0x%08X", returnCode);
goto out;
}
out:
USER_LOG_INFO("Flight control move-by-position sample end");
DjiTest_WidgetLogAppend("Flight control move-by-position sample end");
}
void DjiTest_FlightControlGoHomeForceLandingSample()
{
T_DjiReturnCode returnCode;
USER_LOG_INFO("Flight control go-home-force-landing sample start");
DjiTest_WidgetLogAppend("Flight control go-home-force-landing sample start");
USER_LOG_INFO("--> Step 1: Obtain joystick control authority");
DjiTest_WidgetLogAppend("--> Step 1: Obtain joystick control authority");
returnCode = DjiFlightController_ObtainJoystickCtrlAuthority();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Obtain joystick authority failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 2: Take off\r\n");
DjiTest_WidgetLogAppend("--> Step 2: Take off\r\n");
if (!DjiTest_FlightControlMonitoredTakeoff()) {
USER_LOG_ERROR("Take off failed");
goto out;
}
USER_LOG_INFO("Successful take off\r\n");
DjiTest_WidgetLogAppend("Successful take off\r\n");
USER_LOG_INFO("--> Step 3: Move to north:0(m), east:0(m), up:30(m) , yaw:0(degree) from current point");
DjiTest_WidgetLogAppend("--> Step 3: Move to north:0(m), east:0(m), up:30(m) , yaw:0(degree) from current point");
if (!DjiTest_FlightControlMoveByPositionOffset((T_DjiTestFlightControlVector3f) {0, 0, 30}, 0, 0.8, 1)) {
USER_LOG_ERROR("Move to north:0(m), east:0(m), up:30(m) , yaw:0(degree) from current point failed");
goto out;
}
USER_LOG_INFO("--> Step 4: Move to north:10(m), east:0(m), up:0(m) , yaw:0(degree) from current point");
DjiTest_WidgetLogAppend("--> Step 4: Move to north:10(m), east:0(m), up:0(m) , yaw:0(degree) from current point");
if (!DjiTest_FlightControlMoveByPositionOffset((T_DjiTestFlightControlVector3f) {10, 0, 0}, 0, 0.8, 1)) {
USER_LOG_ERROR("Move to north:10(m), east:0(m), up:0(m) , yaw:0(degree) from current point failed");
goto out;
}
USER_LOG_INFO("--> Step 5: Set aircraft current position as new home location!");
DjiTest_WidgetLogAppend("--> Step 5: Set aircraft current position as new home location!");
returnCode = DjiFlightController_SetHomeLocationUsingCurrentAircraftLocation();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set aircraft current position as new home location failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("--> Step 6: Set go home altitude to 50(m)\r\n");
DjiTest_WidgetLogAppend("--> Step 6: Set go home altitude to 50(m)\r\n");
returnCode = DjiFlightController_SetGoHomeAltitude(50);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set go home altitude to 50(m) failed, error code: 0x%08X", returnCode);
goto out;
}
/*! get go home altitude */
E_DjiFlightControllerGoHomeAltitude goHomeAltitude;
returnCode = DjiFlightController_GetGoHomeAltitude(&goHomeAltitude);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get go home altitude failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current go home altitude is %d m\r\n", goHomeAltitude);
DjiTest_WidgetLogAppend("Current go home altitude is %d m\r\n", goHomeAltitude);
USER_LOG_INFO("--> Step 7: Move to north:20(m), east:0(m), up:0(m) , yaw:0(degree) from current point");
DjiTest_WidgetLogAppend("--> Step 7: Move to north:20(m), east:0(m), up:0(m) , yaw:0(degree) from current point");
if (!DjiTest_FlightControlMoveByPositionOffset((T_DjiTestFlightControlVector3f) {20, 0, 0}, 0, 0.8, 1)) {
USER_LOG_ERROR("Move to north:20(m), east:0(m), up:0(m) , yaw:0(degree) from current point failed");
goto out;
}
USER_LOG_INFO("--> Step 8: Go home and confirm force landing\r\n");
DjiTest_WidgetLogAppend("--> Step 8: Go home and confirm force landing\r\n");
if (!DjiTest_FlightControlGoHomeAndConfirmLanding()) {
USER_LOG_ERROR("Go home and confirm force landing failed");
goto out;
}
USER_LOG_INFO("Successful go home and confirm force landing\r\n");
DjiTest_WidgetLogAppend("Successful go home and confirm force landing\r\n");
USER_LOG_INFO("-> Step 9: Release joystick authority");
DjiTest_WidgetLogAppend("-> Step 9: Release joystick authority");
returnCode = DjiFlightController_ReleaseJoystickCtrlAuthority();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Release joystick authority failed, error code: 0x%08X", returnCode);
goto out;
}
out:
USER_LOG_INFO("Flight control go-home-force-landing sample end");
DjiTest_WidgetLogAppend("Flight control go-home-force-landing sample end");
}
void DjiTest_FlightControlVelocityControlSample()
{
T_DjiReturnCode returnCode;
USER_LOG_INFO("Flight control move-by-velocity sample start");
DjiTest_WidgetLogAppend("Flight control move-by-velocity sample start");
USER_LOG_INFO("--> Step 1: Obtain joystick control authority");
DjiTest_WidgetLogAppend("--> Step 1: Obtain joystick control authority");
returnCode = DjiFlightController_ObtainJoystickCtrlAuthority();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Obtain joystick authority failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 2: Take off\r\n");
DjiTest_WidgetLogAppend("--> Step 2: Take off\r\n");
if (!DjiTest_FlightControlMonitoredTakeoff()) {
USER_LOG_ERROR("Take off failed");
goto out;
}
USER_LOG_INFO("Successful take off\r\n");
DjiTest_WidgetLogAppend("Successful take off\r\n");
USER_LOG_INFO(
"--> Step 3: Move with north:0(m/s), east:0(m/s), up:5(m/s), yaw:0(deg/s) from current point for 2s!");
DjiTest_WidgetLogAppend(
"--> Step 3: Move with north:0(m/s), east:0(m/s), up:5(m/s), yaw:0(deg/s) from current point for 2s!");
DjiTest_FlightControlVelocityAndYawRateCtrl((T_DjiTestFlightControlVector3f) {0, 0, 5.0}, 0, 2000);
USER_LOG_INFO("--> Step 4: Emergency brake for 2s");
DjiTest_WidgetLogAppend("--> Step 4: Emergency brake for 2s");
returnCode = DjiFlightController_ExecuteEmergencyBrakeAction();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Emergency brake failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(2000);
returnCode = DjiFlightController_CancelEmergencyBrakeAction();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Cancel emergency brake action failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO(
"--> Step 5: Move with north:-1.5(m/s), east:2(m/s), up:0(m/s), yaw:20(deg/s) from current point for 2s!");
DjiTest_WidgetLogAppend(
"--> Step 5: Move with north:-1.5(m/s), east:2(m/s), up:0(m/s), yaw:20(deg/s) from current point for 2s!");
DjiTest_FlightControlVelocityAndYawRateCtrl((T_DjiTestFlightControlVector3f) {-1.5, 2, 0}, 20, 2000);
USER_LOG_INFO("--> Step 6: Emergency brake for 2s");
DjiTest_WidgetLogAppend("--> Step 6: Emergency brake for 2s");
returnCode = DjiFlightController_ExecuteEmergencyBrakeAction();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Emergency brake failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(2000);
returnCode = DjiFlightController_CancelEmergencyBrakeAction();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Cancel emergency brake action failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO(
"--> Step 7: Move with north:3(m/s), east:0(m/s), up:0(m/s), yaw:0(deg/s) from current point for 2.5s!");
DjiTest_WidgetLogAppend(
"--> Step 7: Move with north:3(m/s), east:0(m/s), up:0(m/s), yaw:0(deg/s) from current point for 2.5s!");
DjiTest_FlightControlVelocityAndYawRateCtrl((T_DjiTestFlightControlVector3f) {3, 0, 0}, 0, 2500);
USER_LOG_INFO("--> Step 8: Emergency brake for 2s");
DjiTest_WidgetLogAppend("--> Step 8: Emergency brake for 2s");
returnCode = DjiFlightController_ExecuteEmergencyBrakeAction();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Emergency brake failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(2000);
returnCode = DjiFlightController_CancelEmergencyBrakeAction();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Cancel emergency brake action failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO(
"--> Step 9: Move with north:-1.6(m/s), east:-2(m/s), up:0(m/s), yaw:0(deg/s) from current point for 2.2s!");
DjiTest_WidgetLogAppend(
"--> Step 9: Move with north:-1.6(m/s), east:-2(m/s), up:0(m/s), yaw:0(deg/s) from current point for 2.2s!");
DjiTest_FlightControlVelocityAndYawRateCtrl((T_DjiTestFlightControlVector3f) {-1.6, -2, 0}, 0, 2200);
USER_LOG_INFO("--> Step 10: Emergency brake for 2s");
DjiTest_WidgetLogAppend("--> Step 10: Emergency brake for 2s");
returnCode = DjiFlightController_ExecuteEmergencyBrakeAction();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Emergency brake failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(2000);
returnCode = DjiFlightController_CancelEmergencyBrakeAction();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Cancel emergency brake action failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("--> Step 11: Landing\r\n");
DjiTest_WidgetLogAppend("--> Step 11: Landing\r\n");
if (!DjiTest_FlightControlMonitoredLanding()) {
USER_LOG_ERROR("Landing failed");
goto out;
}
USER_LOG_INFO("Successful landing\r\n");
DjiTest_WidgetLogAppend("Successful landing\r\n");
USER_LOG_INFO("--> Step 12: Release joystick authority");
DjiTest_WidgetLogAppend("--> Step 12: Release joystick authority");
returnCode = DjiFlightController_ReleaseJoystickCtrlAuthority();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Release joystick authority failed, error code: 0x%08X", returnCode);
goto out;
}
out:
USER_LOG_INFO("Flight control move-by-velocity sample end");
DjiTest_WidgetLogAppend("Flight control move-by-velocity sample end");
}
void DjiTest_FlightControlArrestFlyingSample()
{
T_DjiReturnCode returnCode;
USER_LOG_INFO("Flight control arrest-flying sample start");
DjiTest_WidgetLogAppend("Flight control arrest-flying sample start");
USER_LOG_INFO("--> Step 1: Enable arrest-flying");
DjiTest_WidgetLogAppend("--> Step 1: Enable arrest-flying");
returnCode = DjiFlightController_ArrestFlying();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Enable arrest-flying failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(2000);
//you can replace with takeoff to test in air.
USER_LOG_INFO("--> Step 2: Turn on motors\r\n");
DjiTest_WidgetLogAppend("--> Step 2: Turn on motors\r\n");
returnCode = DjiFlightController_TurnOnMotors();
if (returnCode == DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on motors successfully, but arrest-flying failed");
s_osalHandler->TaskSleepMs(4000);
USER_LOG_INFO("--> Step 3: Turn off motors\r\n");
DjiTest_WidgetLogAppend("--> Step 3: Turn off motors\r\n");
returnCode = DjiFlightController_TurnOffMotors();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn off motors failed, error code: 0x%08X", returnCode);
}
goto out;
}
USER_LOG_INFO("Turn on motors failed.Arrest-flying successfully\r\n");
DjiTest_WidgetLogAppend("Turn on motors failed.Arrest-flying successfully\r\n");
s_osalHandler->TaskSleepMs(2000);
USER_LOG_INFO("--> Step 3: Disable arrest-flying");
DjiTest_WidgetLogAppend("--> Step 3: Disable arrest-flying");
returnCode = DjiFlightController_CancelArrestFlying();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Disable arrest-flying failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(2000);
USER_LOG_INFO("--> Step 4: Turn on motors\r\n");
DjiTest_WidgetLogAppend("--> Step 4: Turn on motors\r\n");
returnCode = DjiFlightController_TurnOnMotors();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on motors failed and disable arrest-flying failed, error code: 0x%08X", returnCode);
goto out;
} else {
USER_LOG_INFO("Turn on motors successfully and disable arrest-flying successfully\r\n");
s_osalHandler->TaskSleepMs(4000);
USER_LOG_INFO("--> Step 5: Turn off motors");
DjiTest_WidgetLogAppend("--> Step 5: Turn off motors");
returnCode = DjiFlightController_TurnOffMotors();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn off motors failed, error code: 0x%08X", returnCode);
}
}
out:
USER_LOG_INFO("Flight control arrest-flying sample end");
DjiTest_WidgetLogAppend("Flight control arrest-flying sample end");
}
void DjiTest_FlightControlSetGetParamSample()
{
T_DjiReturnCode returnCode;
E_DjiFlightControllerObstacleAvoidanceEnableStatus horizontalVisualObstacleAvoidanceStatus;
E_DjiFlightControllerObstacleAvoidanceEnableStatus horizontalRadarObstacleAvoidanceStatus;
E_DjiFlightControllerObstacleAvoidanceEnableStatus upwardsVisualObstacleAvoidanceStatus;
E_DjiFlightControllerObstacleAvoidanceEnableStatus upwardsRadarObstacleAvoidanceStatus;
E_DjiFlightControllerObstacleAvoidanceEnableStatus downloadsVisualObstacleAvoidanceStatus;
E_DjiFlightControllerGoHomeAltitude goHomeAltitude;
E_DjiFlightControllerRtkPositionEnableStatus rtkEnableStatus;
E_DjiFlightControllerRCLostAction rcLostAction;
T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo;
uint16_t countryCode;
returnCode = DjiAircraftInfo_GetBaseInfo(&aircraftInfoBaseInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get aircraft base info error");
}
USER_LOG_INFO("Flight control set-get-param sample start");
DjiTest_WidgetLogAppend("Flight control set-get-param sample start");
returnCode = DjiFlightController_GetCountryCode(&countryCode);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get aircraft country code error.");
}
USER_LOG_INFO("country code: %hd", countryCode);
/*! Turn on horizontal vision avoid enable */
USER_LOG_INFO("--> Step 1: Turn on horizontal visual obstacle avoidance");
DjiTest_WidgetLogAppend("--> Step 1: Turn on horizontal visual obstacle avoidance");
returnCode = DjiFlightController_SetHorizontalVisualObstacleAvoidanceEnableStatus(
DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on horizontal visual obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
};
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 2: Get horizontal horizontal visual obstacle status\r\n");
DjiTest_WidgetLogAppend("--> Step 2: Get horizontal horizontal visual obstacle status\r\n");
returnCode = DjiFlightController_GetHorizontalVisualObstacleAvoidanceEnableStatus(
&horizontalVisualObstacleAvoidanceStatus);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get horizontal visual obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current horizontal visual obstacle avoidance status is %d\r\n",
horizontalVisualObstacleAvoidanceStatus);
s_osalHandler->TaskSleepMs(1000);
/*! Turn on horizontal radar avoid enable */
USER_LOG_INFO("--> Step 3: Turn on horizontal radar obstacle avoidance");
DjiTest_WidgetLogAppend("--> Step 3: Turn on horizontal radar obstacle avoidance");
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) {
returnCode = DjiFlightController_SetHorizontalRadarObstacleAvoidanceEnableStatus(
DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on horizontal radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
};
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 4: Get horizontal radar obstacle avoidance status\r\n");
DjiTest_WidgetLogAppend("--> Step 4: Get horizontal radar obstacle avoidance status\r\n");
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) {
returnCode = DjiFlightController_GetHorizontalRadarObstacleAvoidanceEnableStatus(
&horizontalRadarObstacleAvoidanceStatus);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get horizontal radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current horizontal radar obstacle avoidance status is %d\r\n",
horizontalRadarObstacleAvoidanceStatus);
}
s_osalHandler->TaskSleepMs(1000);
/*! Turn on upwards vision avoid enable */
USER_LOG_INFO("--> Step 5: Turn on upwards visual obstacle avoidance.");
DjiTest_WidgetLogAppend("--> Step 5: Turn on upwards visual obstacle avoidance.");
returnCode = DjiFlightController_SetUpwardsVisualObstacleAvoidanceEnableStatus(
DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on upwards visual obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
};
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 6: Get upwards visual obstacle avoidance status\r\n");
DjiTest_WidgetLogAppend("--> Step 6: Get upwards visual obstacle avoidance status\r\n");
returnCode = DjiFlightController_GetUpwardsVisualObstacleAvoidanceEnableStatus(
&upwardsVisualObstacleAvoidanceStatus);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get upwards visual obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current upwards visual obstacle avoidance status is %d\r\n", upwardsVisualObstacleAvoidanceStatus);
s_osalHandler->TaskSleepMs(1000);
/*! Turn on upwards radar avoid enable */
USER_LOG_INFO("--> Step 7: Turn on upwards radar obstacle avoidance.");
DjiTest_WidgetLogAppend("--> Step 7: Turn on upwards radar obstacle avoidance.");
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) {
returnCode = DjiFlightController_SetUpwardsRadarObstacleAvoidanceEnableStatus(
DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on upwards radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
}
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 8: Get upwards radar obstacle avoidance status\r\n");
DjiTest_WidgetLogAppend("--> Step 8: Get upwards radar obstacle avoidance status\r\n");
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M350_RTK) {
returnCode = DjiFlightController_GetUpwardsRadarObstacleAvoidanceEnableStatus(
&upwardsRadarObstacleAvoidanceStatus);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get upwards radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current upwards radar obstacle avoidance status is %d\r\n", upwardsRadarObstacleAvoidanceStatus);
s_osalHandler->TaskSleepMs(1000);
}
/*! Turn on downwards vision avoid enable */
USER_LOG_INFO("--> Step 9: Turn on downwards visual obstacle avoidance.");
DjiTest_WidgetLogAppend("--> Step 9: Turn on downwards visual obstacle avoidance.");
returnCode = DjiFlightController_SetDownwardsVisualObstacleAvoidanceEnableStatus(
DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on downwards visual obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 10: Get downwards visual obstacle avoidance status\r\n");
DjiTest_WidgetLogAppend("--> Step 10: Get downwards visual obstacle avoidance status\r\n");
returnCode = DjiFlightController_GetDownwardsVisualObstacleAvoidanceEnableStatus(
&downloadsVisualObstacleAvoidanceStatus);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get downwards visual obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current downwards visual obstacle avoidance status is %d\r\n",
downloadsVisualObstacleAvoidanceStatus);
s_osalHandler->TaskSleepMs(1000);
/*! Set new go home altitude */
USER_LOG_INFO("--> Step 11: Set go home altitude to 50(m)");
DjiTest_WidgetLogAppend("--> Step 11: Set go home altitude to 50(m)");
returnCode = DjiFlightController_SetGoHomeAltitude(50);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set go home altitude to 50(m) failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(1000);
/*! get go home altitude */
USER_LOG_INFO("--> Step 12: Get go home altitude\r\n");
DjiTest_WidgetLogAppend("--> Step 12: Get go home altitude\r\n");
returnCode = DjiFlightController_GetGoHomeAltitude(&goHomeAltitude);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get go home altitude failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current go home altitude is %d m\r\n", goHomeAltitude);
s_osalHandler->TaskSleepMs(2000);
/*! Set rtk enable */
USER_LOG_INFO("--> Step 13: Set rtk enable status");
DjiTest_WidgetLogAppend("--> Step 13: Set rtk enable status");
returnCode = DjiFlightController_SetRtkPositionEnableStatus(DJI_FLIGHT_CONTROLLER_ENABLE_RTK_POSITION);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set rtk enable failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 14: Get rtk enable status\r\n");
DjiTest_WidgetLogAppend("--> Step 14: Get rtk enable status\r\n");
returnCode = DjiFlightController_GetRtkPositionEnableStatus(&rtkEnableStatus);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get rtk enable failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current rtk enable status is %d\r\n", rtkEnableStatus);
s_osalHandler->TaskSleepMs(1000);
/*! Set rc lost action */
if (aircraftInfoBaseInfo.aircraftType != DJI_AIRCRAFT_TYPE_M300_RTK &&
aircraftInfoBaseInfo.aircraftType != DJI_AIRCRAFT_TYPE_M350_RTK) {
USER_LOG_INFO("--> Step 15: Set rc lost action");
DjiTest_WidgetLogAppend("--> Step 15: Set rc lost action");
returnCode = DjiFlightController_SetRCLostAction(DJI_FLIGHT_CONTROLLER_RC_LOST_ACTION_GOHOME);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set rc lost action failed, error code: 0x%08X", returnCode);
goto out;
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 16: Get rc lost action\r\n");
DjiTest_WidgetLogAppend("--> Step 16: Get rc lost action\r\n");
returnCode = DjiFlightController_GetRCLostAction(&rcLostAction);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get rc lost action failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current rc lost action is %d\r\n", rcLostAction);
DjiTest_WidgetLogAppend("Current rc lost action is %d\r\n", rcLostAction);
s_osalHandler->TaskSleepMs(1000);
}
out:
USER_LOG_INFO("Flight control set-get-param sample end");
DjiTest_WidgetLogAppend("Flight control set-get-param sample end");
}
T_DjiReturnCode DjiTest_TriggerFtsEventCallback(void)
{
USER_LOG_INFO("Received FTS Trigger event, count = %d.", s_ftsTriggerCount);
if (s_ftsTriggerCount == 0) {
USER_LOG_WARN("Note: Simulate a trigger failure scenario and return an error value, this function will be invoked again.");
s_ftsTriggerCount++;
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
} else {
USER_LOG_WARN("Note: This is an empty implementation, and the FTS signal needs to be triggered by the PWM signal.");
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
}
void DjiTest_FlightControlPassiveTriggerFtsSample(void)
{
T_DjiReturnCode returnCode;
USER_LOG_INFO("Flight control passive trigger FTS sample start.");
if (s_isFtsCallbackRegistered == false) {
returnCode = DjiFlightController_RegTriggerFtsEventCallback(DjiTest_TriggerFtsEventCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Register trigger FTS event callback failed.");
return;
} else {
s_isFtsCallbackRegistered = true;
USER_LOG_INFO("Register trigger FTS event callback successfully."
"Please wait for the aircraft to trigger the payload to execute FTS action.");
}
} else {
USER_LOG_WARN("FTS trigger event callback has been registered, no need to register again.");
}
}
void DjiTest_FlightControlSample(E_DjiTestFlightCtrlSampleSelect flightCtrlSampleSelect)
{
switch (flightCtrlSampleSelect) {
case E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_TAKE_OFF_LANDING: {
DjiTest_FlightControlTakeOffLandingSample();
break;
}
case E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_TAKE_OFF_POSITION_CTRL_LANDING: {
DjiTest_FlightControlPositionControlSample();
break;
}
case E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_TAKE_OFF_GO_HOME_FORCE_LANDING: {
DjiTest_FlightControlGoHomeForceLandingSample();
break;
}
case E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_TAKE_OFF_VELOCITY_CTRL_LANDING: {
DjiTest_FlightControlVelocityControlSample();
break;
}
case E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_ARREST_FLYING: {
DjiTest_FlightControlArrestFlyingSample();
break;
}
case E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_SET_GET_PARAM: {
DjiTest_FlightControlSetGetParamSample();
break;
}
case E_DJI_TEST_FLIGHT_CTRL_SAMPLE_SELECT_FTS_TRIGGER: {
DjiTest_FlightControlPassiveTriggerFtsSample();
break;
}
default:
break;
}
}
uint8_t DjiTest_FlightControlGetDisplayModeIndex(E_DjiFcSubscriptionDisplayMode displayMode)
{
uint8_t i;
for (i = 0; i < sizeof(s_flightControlDisplayModeStr) / sizeof(T_DjiTestFlightControlDisplayModeStr); i++) {
if (s_flightControlDisplayModeStr[i].displayMode == displayMode) {
return i;
}
}
return i;
}
T_DjiFcSubscriptionFlightStatus DjiTest_FlightControlGetValueOfFlightStatus(void)
{
T_DjiReturnCode djiStat;
T_DjiFcSubscriptionFlightStatus flightStatus;
T_DjiDataTimestamp flightStatusTimestamp = {0};
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_STATUS_FLIGHT,
(uint8_t *) &flightStatus,
sizeof(T_DjiFcSubscriptionFlightStatus),
&flightStatusTimestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get value of topic flight status error, error code: 0x%08X", djiStat);
flightStatus = 0;
} else {
USER_LOG_DEBUG("Timestamp: millisecond %u microsecond %u.", flightStatusTimestamp.millisecond,
flightStatusTimestamp.microsecond);
USER_LOG_DEBUG("Flight status: %d.", flightStatus);
}
return flightStatus;
}
T_DjiFcSubscriptionDisplaymode DjiTest_FlightControlGetValueOfDisplayMode(void)
{
T_DjiReturnCode djiStat;
T_DjiFcSubscriptionDisplaymode displayMode;
T_DjiDataTimestamp displayModeTimestamp = {0};
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_STATUS_DISPLAYMODE,
(uint8_t *) &displayMode,
sizeof(T_DjiFcSubscriptionDisplaymode),
&displayModeTimestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get value of topic display mode error, error code: 0x%08X", djiStat);
displayMode = 0;
} else {
USER_LOG_DEBUG("Timestamp: millisecond %u microsecond %u.", displayModeTimestamp.millisecond,
displayModeTimestamp.microsecond);
USER_LOG_DEBUG("Display mode : %d.", displayMode);
}
return displayMode;
}
T_DjiFcSubscriptionHeightFusion DjiTest_FlightControlGetValueOfHeightFusion(void)
{
T_DjiReturnCode djiStat;
T_DjiFcSubscriptionHeightFusion heightFusion = {0};
T_DjiDataTimestamp timestamp = {0};
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_FUSION,
(uint8_t *) &heightFusion,
sizeof(T_DjiFcSubscriptionHeightFusion),
&timestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get value of topic height fusion error, error code: 0x%08X", djiStat);
} else {
USER_LOG_DEBUG("Timestamp: millisecond %u microsecond %u.", timestamp.millisecond, timestamp.microsecond);
USER_LOG_DEBUG("Relative height fusion is %f m", heightFusion);
}
return heightFusion;
}
T_DjiFcSubscriptionQuaternion DjiTest_FlightControlGetValueOfQuaternion(void)
{
T_DjiReturnCode djiStat;
T_DjiFcSubscriptionQuaternion quaternion = {0};
T_DjiDataTimestamp quaternionTimestamp = {0};
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION,
(uint8_t *) &quaternion,
sizeof(T_DjiFcSubscriptionQuaternion),
&quaternionTimestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get value of topic quaternion error, error code: 0x%08X", djiStat);
} else {
USER_LOG_DEBUG("Timestamp: millisecond %u microsecond %u.", quaternionTimestamp.millisecond,
quaternionTimestamp.microsecond);
USER_LOG_DEBUG("Quaternion: %f %f %f %f.", quaternion.q0, quaternion.q1, quaternion.q2, quaternion.q3);
}
return quaternion;
}
T_DjiFcSubscriptionPositionFused DjiTest_FlightControlGetValueOfPositionFused(void)
{
T_DjiReturnCode djiStat;
T_DjiFcSubscriptionPositionFused positionFused = {0};
T_DjiDataTimestamp positionFusedTimestamp = {0};
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_POSITION_FUSED,
(uint8_t *) &positionFused,
sizeof(T_DjiFcSubscriptionPositionFused),
&positionFusedTimestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get value of topic position fused error, error code: 0x%08X", djiStat);
} else {
USER_LOG_DEBUG("Timestamp: millisecond %u microsecond %u.", positionFusedTimestamp.millisecond,
positionFusedTimestamp.microsecond);
USER_LOG_DEBUG("PositionFused: %f, %f,%f,%d.", positionFused.latitude, positionFused.longitude,
positionFused.altitude, positionFused.visibleSatelliteNumber);
}
return positionFused;
}
dji_f32_t DjiTest_FlightControlGetValueOfRelativeHeight(void)
{
T_DjiReturnCode djiStat;
T_DjiFcSubscriptionAltitudeFused altitudeFused = 0;
T_DjiFcSubscriptionAltitudeOfHomePoint homePointAltitude = 0;
dji_f32_t relativeHeight = 0;
T_DjiDataTimestamp relativeHeightTimestamp = {0};
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT,
(uint8_t *) &homePointAltitude,
sizeof(T_DjiFcSubscriptionAltitudeOfHomePoint),
&relativeHeightTimestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get value of topic altitude of home point error, error code: 0x%08X", djiStat);
return -1;
} else {
USER_LOG_DEBUG("Timestamp: millisecond %u microsecond %u.", relativeHeightTimestamp.millisecond,
relativeHeightTimestamp.microsecond);
}
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_FUSED,
(uint8_t *) &altitudeFused,
sizeof(T_DjiFcSubscriptionAltitudeFused),
&relativeHeightTimestamp);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get value of topic altitude fused error, error code: 0x%08X", djiStat);
return -1;
} else {
USER_LOG_DEBUG("Timestamp: millisecond %u microsecond %u.", relativeHeightTimestamp.millisecond,
relativeHeightTimestamp.microsecond);
}
relativeHeight = altitudeFused - homePointAltitude;
return relativeHeight;
}
bool DjiTest_FlightControlMotorStartedCheck(void)
{
int motorsNotStarted = 0;
int timeoutCycles = 20;
while (DjiTest_FlightControlGetValueOfFlightStatus() != DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_ON_GROUND &&
DjiTest_FlightControlGetValueOfDisplayMode() != DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ENGINE_START &&
motorsNotStarted < timeoutCycles) {
motorsNotStarted++;
s_osalHandler->TaskSleepMs(100);
}
return motorsNotStarted != timeoutCycles ? true : false;
}
bool DjiTest_FlightControlTakeOffInAirCheck(void)
{
int stillOnGround = 0;
int timeoutCycles = 110;
while (DjiTest_FlightControlGetValueOfFlightStatus() != DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR &&
(DjiTest_FlightControlGetValueOfDisplayMode() != DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ASSISTED_TAKEOFF ||
DjiTest_FlightControlGetValueOfDisplayMode() != DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_TAKEOFF) &&
stillOnGround < timeoutCycles) {
stillOnGround++;
s_osalHandler->TaskSleepMs(100);
}
return stillOnGround != timeoutCycles ? true : false;
}
bool takeoffFinishedCheck(void)
{
while (DjiTest_FlightControlGetValueOfDisplayMode() == DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_TAKEOFF ||
DjiTest_FlightControlGetValueOfDisplayMode() == DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ASSISTED_TAKEOFF) {
s_osalHandler->TaskSleepMs(1000);
}
return (DjiTest_FlightControlGetValueOfDisplayMode() == DJI_FC_SUBSCRIPTION_DISPLAY_MODE_P_GPS ||
DjiTest_FlightControlGetValueOfDisplayMode() == DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ATTITUDE) ? true : false;
}
bool DjiTest_FlightControlLandFinishedCheck(void)
{
while (DjiTest_FlightControlGetValueOfDisplayMode() == DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_LANDING ||
DjiTest_FlightControlGetValueOfFlightStatus() == DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR) {
s_osalHandler->TaskSleepMs(1000);
}
return (DjiTest_FlightControlGetValueOfDisplayMode() != DJI_FC_SUBSCRIPTION_DISPLAY_MODE_P_GPS ||
DjiTest_FlightControlGetValueOfDisplayMode() != DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ATTITUDE) ? true : false;
}
bool DjiTest_FlightControlCheckActionStarted(E_DjiFcSubscriptionDisplayMode mode)
{
int actionNotStarted = 0;
int timeoutCycles = 20;
while (DjiTest_FlightControlGetValueOfDisplayMode() != mode && actionNotStarted < timeoutCycles) {
actionNotStarted++;
s_osalHandler->TaskSleepMs(100);
}
if (actionNotStarted == timeoutCycles) {
USER_LOG_ERROR("%s start failed, now flight is in %s.",
s_flightControlDisplayModeStr[DjiTest_FlightControlGetDisplayModeIndex(mode)].displayModeStr,
s_flightControlDisplayModeStr[DjiTest_FlightControlGetDisplayModeIndex(
DjiTest_FlightControlGetValueOfDisplayMode())].displayModeStr);
return false;
} else {
USER_LOG_INFO("Now flight is in %s.",
s_flightControlDisplayModeStr[DjiTest_FlightControlGetDisplayModeIndex(mode)].displayModeStr);
return true;
}
}
bool DjiTest_FlightControlMonitoredTakeoff(void)
{
T_DjiReturnCode djiStat;
//! Start takeoff
djiStat = DjiFlightController_StartTakeoff();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request to take off failed, error code: 0x%08X", djiStat);
return false;
}
//! Motors start check
if (!DjiTest_FlightControlMotorStartedCheck()) {
USER_LOG_ERROR("Takeoff failed. Motors are not spinning.");
return false;
} else {
USER_LOG_INFO("Motors spinning...");
}
//! In air check
if (!DjiTest_FlightControlTakeOffInAirCheck()) {
USER_LOG_ERROR("Takeoff failed. Aircraft is still on the ground, but the "
"motors are spinning");
return false;
} else {
USER_LOG_INFO("Ascending...");
}
//! Finished takeoff check
if (!takeoffFinishedCheck()) {
USER_LOG_ERROR("Takeoff finished, but the aircraft is in an unexpected mode. "
"Please connect DJI GO.");
return false;
}
return true;
}
bool DjiTest_FlightControlMonitoredLanding(void)
{
T_DjiReturnCode djiStat;
/*! Step 1: Start landing */
djiStat = DjiFlightController_StartLanding();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Start landing failed, error code: 0x%08X", djiStat);
return false;
}
/*! Step 2: check Landing start*/
if (!DjiTest_FlightControlCheckActionStarted(DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_LANDING)) {
USER_LOG_ERROR("Fail to execute Landing action!");
return false;
} else {
/*! Step 3: check Landing finished*/
if (!DjiTest_FlightControlLandFinishedCheck()) {
USER_LOG_ERROR("Landing finished, but the aircraft is in an unexpected mode. "
"Please connect DJI Assistant.");
return false;
}
}
return true;
}
bool DjiTest_FlightControlGoHomeAndConfirmLanding(void)
{
T_DjiReturnCode djiStat;
T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo;
E_DjiFlightControllerObstacleAvoidanceEnableStatus enableStatus;
djiStat = DjiFlightController_GetDownwardsVisualObstacleAvoidanceEnableStatus(&enableStatus);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get downwards visual obstacle avoidance enable status error");
}
djiStat = DjiAircraftInfo_GetBaseInfo(&aircraftInfoBaseInfo);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get aircraft base info error");
}
/*! Step 1: Start go home */
USER_LOG_INFO("Start go home action");
djiStat = DjiFlightController_StartGoHome();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Start to go home failed, error code: 0x%08X", djiStat);
return false;;
}
if (!DjiTest_FlightControlCheckActionStarted(DJI_FC_SUBSCRIPTION_DISPLAY_MODE_NAVI_GO_HOME)) {
return false;
} else {
while (DjiTest_FlightControlGetValueOfFlightStatus() == DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR &&
DjiTest_FlightControlGetValueOfDisplayMode() == DJI_FC_SUBSCRIPTION_DISPLAY_MODE_NAVI_GO_HOME) {
s_osalHandler->TaskSleepMs(1000);// waiting for this action finished
}
}
/*! Step 2: Start landing */
USER_LOG_INFO("Start landing action");
if (!DjiTest_FlightControlCheckActionStarted(DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_LANDING)) {
USER_LOG_ERROR("Fail to execute Landing action");
return false;
} else {
while (DjiTest_FlightControlGetValueOfDisplayMode() == DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_LANDING &&
DjiTest_FlightControlGetValueOfFlightStatus() == DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR) {
T_DjiFcSubscriptionHeightFusion heightFusion = DjiTest_FlightControlGetValueOfHeightFusion();
s_osalHandler->TaskSleepMs(1000);
if (DJI_AIRCRAFT_TYPE_M3E == aircraftInfoBaseInfo.aircraftType || DJI_AIRCRAFT_TYPE_M3T == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M3D == aircraftInfoBaseInfo.aircraftType || DJI_AIRCRAFT_TYPE_M3TD == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M4T == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M4E == aircraftInfoBaseInfo.aircraftType
) {
if ((dji_f64_t) 0.45 < heightFusion && heightFusion < (dji_f64_t) 0.55) {
break;
}
} else {
if ((dji_f64_t) 0.65 < heightFusion && heightFusion < (dji_f64_t) 0.75) {
break;
}
}
}
}
/*! Step 4: Confirm Landing */
USER_LOG_INFO("Start confirm Landing and avoid ground action");
djiStat = DjiFlightController_StartConfirmLanding();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Fail to execute confirm landing avoid ground action, error code: 0x%08X", djiStat);
return false;
}
if (enableStatus == DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE) {
if (!DjiTest_FlightControlCheckActionStarted(DJI_FC_SUBSCRIPTION_DISPLAY_MODE_FORCE_AUTO_LANDING)) {
return false;
} else {
while (DjiTest_FlightControlGetValueOfFlightStatus() == DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR &&
DjiTest_FlightControlGetValueOfDisplayMode() ==
DJI_FC_SUBSCRIPTION_DISPLAY_MODE_FORCE_AUTO_LANDING) {
s_osalHandler->TaskSleepMs(1000);
}
}
} else {
while (DjiTest_FlightControlGetValueOfFlightStatus() == DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR &&
DjiTest_FlightControlGetValueOfDisplayMode() ==
DJI_FC_SUBSCRIPTION_DISPLAY_MODE_FORCE_AUTO_LANDING) {
s_osalHandler->TaskSleepMs(1000);
}
}
/*! Step 5: Landing finished check*/
if (DjiTest_FlightControlGetValueOfDisplayMode() != DJI_FC_SUBSCRIPTION_DISPLAY_MODE_P_GPS ||
DjiTest_FlightControlGetValueOfDisplayMode() != DJI_FC_SUBSCRIPTION_DISPLAY_MODE_ATTITUDE) {
USER_LOG_INFO("Successful landing");
} else {
USER_LOG_ERROR("Landing finished, but the aircraft is in an unexpected mode. "
"Please connect DJI Assistant.");
return false;
}
return true;
}
T_DjiTestFlightControlVector3f DjiTest_FlightControlQuaternionToEulerAngle(const T_DjiFcSubscriptionQuaternion quat)
{
T_DjiTestFlightControlVector3f eulerAngle;
double q2sqr = quat.q2 * quat.q2;
double t0 = -2.0 * (q2sqr + quat.q3 * quat.q3) + 1.0;
double t1 = (dji_f64_t) 2.0 * (quat.q1 * quat.q2 + quat.q0 * quat.q3);
double t2 = -2.0 * (quat.q1 * quat.q3 - quat.q0 * quat.q2);
double t3 = (dji_f64_t) 2.0 * (quat.q2 * quat.q3 + quat.q0 * quat.q1);
double t4 = -2.0 * (quat.q1 * quat.q1 + q2sqr) + 1.0;
t2 = (t2 > 1.0) ? 1.0 : t2;
t2 = (t2 < -1.0) ? -1.0 : t2;
eulerAngle.x = asin(t2);
eulerAngle.y = atan2(t3, t4);
eulerAngle.z = atan2(t1, t0);
return eulerAngle;
}
T_DjiTestFlightControlVector3f
DjiTest_FlightControlLocalOffsetFromGpsAndFusedHeightOffset(const T_DjiFcSubscriptionPositionFused target,
const T_DjiFcSubscriptionPositionFused origin,
const dji_f32_t targetHeight,
const dji_f32_t originHeight)
{
T_DjiTestFlightControlVector3f deltaNed;
double deltaLon = target.longitude - origin.longitude;
double deltaLat = target.latitude - origin.latitude;
deltaNed.x = deltaLat * s_earthCenter;
deltaNed.y = deltaLon * s_earthCenter * cos(target.latitude);
deltaNed.z = targetHeight - originHeight;
return deltaNed;
}
T_DjiTestFlightControlVector3f DjiTest_FlightControlVector3FSub(const T_DjiTestFlightControlVector3f vectorA,
const T_DjiTestFlightControlVector3f vectorB)
{
T_DjiTestFlightControlVector3f result;
result.x = vectorA.x - vectorB.x;
result.y = vectorA.y - vectorB.y;
result.z = vectorA.z - vectorB.z;
return result;
}
int DjiTest_FlightControlSignOfData(dji_f32_t data)
{
return data < 0 ? -1 : 1;
}
void DjiTest_FlightControlHorizCommandLimit(dji_f32_t speedFactor, dji_f32_t *commandX, dji_f32_t *commandY)
{
if (fabs(*commandX) > speedFactor)
*commandX = speedFactor * DjiTest_FlightControlSignOfData(*commandX);
if (fabs(*commandY) > speedFactor)
*commandY = speedFactor * DjiTest_FlightControlSignOfData(*commandY);
}
dji_f32_t DjiTest_FlightControlVectorNorm(T_DjiTestFlightControlVector3f v)
{
return sqrt(pow(v.x, 2) + pow(v.y, 2) + pow(v.z, 2));
}
bool
DjiTest_FlightControlMoveByPositionOffset(const T_DjiTestFlightControlVector3f offsetDesired, float yawDesiredInDeg,
float posThresholdInM, float yawThresholdInDeg)
{
int timeoutInMilSec = 20000;
int controlFreqInHz = 50; // Hz
int cycleTimeInMs = 1000 / controlFreqInHz;
int outOfControlBoundsTimeLimit = 10 * cycleTimeInMs; // 10 cycles
int withinControlBoundsTimeReqmt = 100 * cycleTimeInMs; // 100 cycles
int elapsedTimeInMs = 0;
int withinBoundsCounter = 0;
int outOfBounds = 0;
int brakeCounter = 0;
int speedFactor = 2;
//! get origin position and relative height(from home point)of aircraft.
T_DjiFcSubscriptionPositionFused originGPSPosition = DjiTest_FlightControlGetValueOfPositionFused();
dji_f32_t originHeightBaseHomePoint = DjiTest_FlightControlGetValueOfRelativeHeight();
if (originHeightBaseHomePoint == -1) {
USER_LOG_ERROR("Relative height is invalid!");
return false;
}
T_DjiFlightControllerJoystickMode joystickMode = {
DJI_FLIGHT_CONTROLLER_HORIZONTAL_POSITION_CONTROL_MODE,
DJI_FLIGHT_CONTROLLER_VERTICAL_POSITION_CONTROL_MODE,
DJI_FLIGHT_CONTROLLER_YAW_ANGLE_CONTROL_MODE,
DJI_FLIGHT_CONTROLLER_HORIZONTAL_GROUND_COORDINATE,
DJI_FLIGHT_CONTROLLER_STABLE_CONTROL_MODE_ENABLE,
};
DjiFlightController_SetJoystickMode(joystickMode);
while (elapsedTimeInMs < timeoutInMilSec) {
T_DjiFcSubscriptionPositionFused currentGPSPosition = DjiTest_FlightControlGetValueOfPositionFused();
T_DjiFcSubscriptionQuaternion currentQuaternion = DjiTest_FlightControlGetValueOfQuaternion();
dji_f32_t currentHeight = DjiTest_FlightControlGetValueOfRelativeHeight();
if (originHeightBaseHomePoint == -1) {
USER_LOG_ERROR("Relative height is invalid!");
return false;
}
float yawInRad = DjiTest_FlightControlQuaternionToEulerAngle(currentQuaternion).z;
//! get the vector between aircraft and origin point.
T_DjiTestFlightControlVector3f localOffset = DjiTest_FlightControlLocalOffsetFromGpsAndFusedHeightOffset(
currentGPSPosition,
originGPSPosition,
currentHeight,
originHeightBaseHomePoint);
//! get the vector between aircraft and target point.
T_DjiTestFlightControlVector3f offsetRemaining = DjiTest_FlightControlVector3FSub(offsetDesired, localOffset);
T_DjiTestFlightControlVector3f positionCommand = offsetRemaining;
DjiTest_FlightControlHorizCommandLimit(speedFactor, &positionCommand.x, &positionCommand.y);
T_DjiFlightControllerJoystickCommand joystickCommand = {positionCommand.x, positionCommand.y,
offsetDesired.z + originHeightBaseHomePoint,
yawDesiredInDeg};
DjiFlightController_ExecuteJoystickAction(joystickCommand);
if (DjiTest_FlightControlVectorNorm(offsetRemaining) < posThresholdInM &&
fabs(yawInRad / s_degToRad - yawDesiredInDeg) < yawThresholdInDeg) {
//! 1. We are within bounds; start incrementing our in-bound counter
withinBoundsCounter += cycleTimeInMs;
} else {
if (withinBoundsCounter != 0) {
//! 2. Start incrementing an out-of-bounds counter
outOfBounds += cycleTimeInMs;
}
}
//! 3. Reset withinBoundsCounter if necessary
if (outOfBounds > outOfControlBoundsTimeLimit) {
withinBoundsCounter = 0;
outOfBounds = 0;
}
//! 4. If within bounds, set flag and break
if (withinBoundsCounter >= withinControlBoundsTimeReqmt) {
break;
}
s_osalHandler->TaskSleepMs(cycleTimeInMs);
elapsedTimeInMs += cycleTimeInMs;
}
while (brakeCounter < withinControlBoundsTimeReqmt) {
s_osalHandler->TaskSleepMs(cycleTimeInMs);
brakeCounter += cycleTimeInMs;
}
if (elapsedTimeInMs >= timeoutInMilSec) {
USER_LOG_ERROR("Task timeout!");
return false;
}
return true;
}
void DjiTest_FlightControlVelocityAndYawRateCtrl(const T_DjiTestFlightControlVector3f offsetDesired, float yawRate,
uint32_t timeMs)
{
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
uint32_t originTime = 0;
uint32_t currentTime = 0;
uint32_t elapsedTimeInMs = 0;
osalHandler->GetTimeMs(&originTime);
osalHandler->GetTimeMs(&currentTime);
elapsedTimeInMs = currentTime - originTime;
T_DjiFlightControllerJoystickMode joystickMode = {
DJI_FLIGHT_CONTROLLER_HORIZONTAL_VELOCITY_CONTROL_MODE,
DJI_FLIGHT_CONTROLLER_VERTICAL_VELOCITY_CONTROL_MODE,
DJI_FLIGHT_CONTROLLER_YAW_ANGLE_RATE_CONTROL_MODE,
DJI_FLIGHT_CONTROLLER_HORIZONTAL_GROUND_COORDINATE,
DJI_FLIGHT_CONTROLLER_STABLE_CONTROL_MODE_ENABLE,
};
DjiFlightController_SetJoystickMode(joystickMode);
T_DjiFlightControllerJoystickCommand joystickCommand = {offsetDesired.x, offsetDesired.y, offsetDesired.z,
yawRate};
while (elapsedTimeInMs <= timeMs) {
DjiFlightController_ExecuteJoystickAction(joystickCommand);
osalHandler->TaskSleepMs(2);
osalHandler->GetTimeMs(&currentTime);
elapsedTimeInMs = currentTime - originTime;
}
}
T_DjiReturnCode
DjiTest_FlightControlJoystickCtrlAuthSwitchEventCallback(T_DjiFlightControllerJoystickCtrlAuthorityEventInfo eventData)
{
switch (eventData.joystickCtrlAuthoritySwitchEvent) {
case DJI_FLIGHT_CONTROLLER_MSDK_GET_JOYSTICK_CTRL_AUTH_EVENT: {
if (eventData.curJoystickCtrlAuthority == DJI_FLIGHT_CONTROLLER_JOYSTICK_CTRL_AUTHORITY_MSDK) {
USER_LOG_INFO("[Event]Msdk request to obtain joystick ctrl authority\r\n");
} else {
USER_LOG_INFO("[Event]Msdk request to release joystick ctrl authority\r\n");
}
break;
}
case DJI_FLIGHT_CONTROLLER_INTERNAL_GET_JOYSTICK_CTRL_AUTH_EVENT: {
if (eventData.curJoystickCtrlAuthority == DJI_FLIGHT_CONTROLLER_JOYSTICK_CTRL_AUTHORITY_INTERNAL) {
USER_LOG_INFO("[Event]Internal request to obtain joystick ctrl authority\r\n");
} else {
USER_LOG_INFO("[Event]Internal request to release joystick ctrl authority\r\n");
}
break;
}
case DJI_FLIGHT_CONTROLLER_OSDK_GET_JOYSTICK_CTRL_AUTH_EVENT: {
if (eventData.curJoystickCtrlAuthority == DJI_FLIGHT_CONTROLLER_JOYSTICK_CTRL_AUTHORITY_OSDK) {
USER_LOG_INFO("[Event] Request to obtain joystick ctrl authority\r\n");
} else {
USER_LOG_INFO("[Event] Request to release joystick ctrl authority\r\n");
}
break;
}
case DJI_FLIGHT_CONTROLLER_RC_LOST_GET_JOYSTICK_CTRL_AUTH_EVENT :
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc due to rc lost\r\n");
break;
case DJI_FLIGHT_CONTROLLER_RC_NOT_P_MODE_RESET_JOYSTICK_CTRL_AUTH_EVENT :
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc for rc is not in P mode\r\n");
break;
case DJI_FLIGHT_CONTROLLER_RC_SWITCH_MODE_GET_JOYSTICK_CTRL_AUTH_EVENT :
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc due to rc switching mode\r\n");
break;
case DJI_FLIGHT_CONTROLLER_RC_PAUSE_GET_JOYSTICK_CTRL_AUTH_EVENT :
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc due to rc pausing\r\n");
break;
case DJI_FLIGHT_CONTROLLER_RC_REQUEST_GO_HOME_GET_JOYSTICK_CTRL_AUTH_EVENT :
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc due to rc request for return\r\n");
break;
case DJI_FLIGHT_CONTROLLER_LOW_BATTERY_GO_HOME_RESET_JOYSTICK_CTRL_AUTH_EVENT :
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc for low battery return\r\n");
break;
case DJI_FLIGHT_CONTROLLER_LOW_BATTERY_LANDING_RESET_JOYSTICK_CTRL_AUTH_EVENT :
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc for low battery land\r\n");
break;
case DJI_FLIGHT_CONTROLLER_OSDK_LOST_GET_JOYSTICK_CTRL_AUTH_EVENT:
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc due to sdk lost\r\n");
break;
case DJI_FLIGHT_CONTROLLER_NERA_FLIGHT_BOUNDARY_RESET_JOYSTICK_CTRL_AUTH_EVENT :
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc due to near boundary\r\n");
break;
default:
USER_LOG_INFO("[Event]Unknown joystick ctrl authority event\r\n");
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/
... ...
... ... @@ -144,6 +144,7 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition,
|| DJI_AIRCRAFT_SERIES_M3 == aircraftSeries
|| DJI_AIRCRAFT_SERIES_M3D == aircraftSeries
|| DJI_AIRCRAFT_SERIES_M4 == aircraftSeries
|| DJI_AIRCRAFT_SERIES_M4D == aircraftSeries
) {
if (s_rotationActionList[i].rotation.rotationMode == DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE) {
T_DjiFcSubscriptionGimbalAngles gimbalAngles = {0};
... ...
/**
********************************************************************
* @file test_gimbal_manager.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 DJI’s authorization, you may not
* further disseminate the information, and you must immediately remove the
* source code and notify DJI of its removal. DJI reserves the right to pursue
* legal actions against you for any loss(es) or damage(s) caused by your
* failure to do so.
*
*********************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include <utils/util_misc.h>
#include <widget_interaction_test/test_widget_interaction.h>
#include "test_gimbal_manager.h"
#include "dji_platform.h"
#include "dji_logger.h"
#include "dji_gimbal_manager.h"
#include "dji_fc_subscription.h"
#include "dji_aircraft_info.h"
/* Private constants ---------------------------------------------------------*/
/* Private types -------------------------------------------------------------*/
typedef enum {
DJI_TEST_GIMBAL_ROTATION,
DJI_TEST_GIMBAL_RESET,
} E_DjiTestGimbalAction;
typedef struct {
E_DjiTestGimbalAction action;
T_DjiGimbalManagerRotation rotation;
} T_DjiTestGimbalActionList;
/* Private values -------------------------------------------------------------*/
static const T_DjiTestGimbalActionList s_rotationActionList[] =
{
{.action = DJI_TEST_GIMBAL_RESET},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 30, 0, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, -30, 0, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, -30, 0, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 30, 0, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 30, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, -30, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, -30, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 30, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 0, 4, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 0, -4, 0.2},
{.action = DJI_TEST_GIMBAL_RESET},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, 30, 0, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, -90, 0, 0, 0.5},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, -60, 0, 0, 0.5},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, -30, 0, 0, 0.5},
{.action = DJI_TEST_GIMBAL_RESET},
};
/* Private functions declaration ---------------------------------------------*/
/* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition, E_DjiGimbalMode gimbalMode)
{
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
T_DjiReturnCode returnCode;
T_DjiGimbalManagerRotation rotation;
T_DjiAircraftInfoBaseInfo baseInfo;
E_DjiAircraftSeries aircraftSeries;
returnCode = DjiAircraftInfo_GetBaseInfo(&baseInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Failed to get aircraft base info, return code 0x%08X", returnCode);
goto out;
}
aircraftSeries = baseInfo.aircraftSeries;
USER_LOG_INFO("Gimbal manager sample start");
DjiTest_WidgetLogAppend("Gimbal manager sample start");
returnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_ANGLES, DJI_DATA_SUBSCRIPTION_TOPIC_50_HZ, NULL);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Failed to subscribe topic %d, 0x%08X", DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_ANGLES, returnCode);
goto out;
}
USER_LOG_INFO("--> Step 1: Init gimbal manager module");
DjiTest_WidgetLogAppend("--> Step 1: Init gimbal manager module");
returnCode = DjiGimbalManager_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Init gimbal manager failed, error code: 0x%08X", returnCode);
goto out;
}
if (gimbalMode == DJI_GIMBAL_MODE_FREE) {
USER_LOG_INFO("--> Step 2: Set gimbal to free mode");
DjiTest_WidgetLogAppend("--> Step 2: Set gimbal to free mode");
} else if (gimbalMode == DJI_GIMBAL_MODE_YAW_FOLLOW) {
USER_LOG_INFO("--> Step 2: Set gimbal to yaw follow mode");
DjiTest_WidgetLogAppend("--> Step 2: Set gimbal to yaw follow mode");
}
returnCode = DjiGimbalManager_SetMode(mountPosition, gimbalMode);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set gimbal mode failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("--> Step 3: Reset gimbal angles.\r\n");
returnCode = DjiGimbalManager_Reset(mountPosition, DJI_GIMBAL_RESET_MODE_PITCH_AND_YAW);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode);
}
USER_LOG_INFO("--> Step 4: Rotate gimbal to target angle by action list\r\n");
for (int i = 0; i < sizeof(s_rotationActionList) / sizeof(T_DjiTestGimbalActionList); ++i) {
if (s_rotationActionList[i].action == DJI_TEST_GIMBAL_RESET) {
USER_LOG_INFO("Target gimbal reset.\r\n");
returnCode = DjiGimbalManager_Reset(mountPosition, DJI_GIMBAL_RESET_MODE_PITCH_AND_YAW);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode);
}
osalHandler->TaskSleepMs(2000);
} else if (s_rotationActionList[i].action == DJI_TEST_GIMBAL_ROTATION) {
if (gimbalMode == DJI_GIMBAL_MODE_FREE &&
s_rotationActionList[i].rotation.rotationMode == DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE) {
continue;
}
rotation = s_rotationActionList[i].rotation;
if (DJI_AIRCRAFT_SERIES_M30 == aircraftSeries
|| DJI_AIRCRAFT_SERIES_M3 == aircraftSeries
|| DJI_AIRCRAFT_SERIES_M3D == aircraftSeries
|| DJI_AIRCRAFT_SERIES_M4 == aircraftSeries
) {
if (s_rotationActionList[i].rotation.rotationMode == DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE) {
T_DjiFcSubscriptionGimbalAngles gimbalAngles = {0};
T_DjiDataTimestamp timestamp = {0};
returnCode = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_ANGLES,
(uint8_t *) &gimbalAngles,
sizeof(T_DjiFcSubscriptionGimbalAngles),
&timestamp);
rotation.yaw = gimbalAngles.z;
}
}
USER_LOG_INFO("Target gimbal pry = (%.1f, %.1f, %.1f)", rotation.pitch, rotation.roll, rotation.yaw);
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (%.1f, %.1f, %.1f) failed, error code: 0x%08X",
s_rotationActionList[i].rotation.pitch, s_rotationActionList[i].rotation.roll,
s_rotationActionList[i].rotation.yaw,
returnCode);
}
osalHandler->TaskSleepMs(1000);
}
}
returnCode = DjiFcSubscription_UnSubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_ANGLES);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Failed to unsubscribe topic %d, 0x%08X", DJI_FC_SUBSCRIPTION_TOPIC_GIMBAL_ANGLES, returnCode);
}
USER_LOG_INFO("--> Step 5: Deinit gimbal manager module");
DjiTest_WidgetLogAppend("--> Step 5: Deinit gimbal manager module");
returnCode = DjiGimbalManager_Deinit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Deinit gimbal manager failed, error code: 0x%08X", returnCode);
goto out;
}
out:
USER_LOG_INFO("Gimbal manager sample end");
return returnCode;
}
/* Private functions definition-----------------------------------------------*/
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/
... ...
... ... @@ -280,6 +280,7 @@ T_DjiReturnCode DjiTest_LiveviewRunSample(E_DjiMountPosition mountPosition)
if (DJI_AIRCRAFT_TYPE_M3T == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M3TD == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M4T == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M4TD == aircraftInfoBaseInfo.aircraftType
) {
USER_LOG_INFO("--> Start h264 stream of the fpv and selected payload\r\n");
... ...
/**
********************************************************************
* @file test_liveview.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 DJI’s authorization, you may not
* further disseminate the information, and you must immediately remove the
* source code and notify DJI of its removal. DJI reserves the right to pursue
* legal actions against you for any loss(es) or damage(s) caused by your
* failure to do so.
*
*********************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include <utils/util_misc.h>
#include <widget_interaction_test/test_widget_interaction.h>
#include "test_liveview.h"
#include "dji_liveview.h"
#include "dji_logger.h"
#include "dji_platform.h"
#include "dji_aircraft_info.h"
#include "time.h"
#include <pthread.h>
/* Private constants ---------------------------------------------------------*/
#define TEST_LIVEVIEW_STREAM_FILE_PATH_STR_MAX_SIZE 256
#define TEST_LIVEVIEW_STREAM_STROING_TIME_IN_SECONDS 20
#define TEST_LIVEVIEW_STREAM_REQUEST_I_FRAME_ON 1
#define TEST_LIVEVIEW_STREAM_REQUEST_I_FRAME_TICK_IN_SECONDS 5
/* Private types -------------------------------------------------------------*/
/* Private values -------------------------------------------------------------*/
static char s_fpvCameraStreamFilePath[TEST_LIVEVIEW_STREAM_FILE_PATH_STR_MAX_SIZE];
static char s_payloadCameraStreamFilePath[TEST_LIVEVIEW_STREAM_FILE_PATH_STR_MAX_SIZE];
/* Private functions declaration ---------------------------------------------*/
static void DjiTest_FpvCameraStreamCallback(E_DjiLiveViewCameraPosition position, const uint8_t *buf,
uint32_t bufLen);
static void DjiTest_PayloadCameraStreamCallback(E_DjiLiveViewCameraPosition position, const uint8_t *buf,
uint32_t bufLen);
static void U3_LiveviewGetPhoto_StreamCallback(E_DjiLiveViewCameraPosition position, const uint8_t *buf,
uint32_t bufLen);
/* Exported functions definition ---------------------------------------------*/
static void *U3_LiveviewGetPhoto();
static T_DjiTaskHandle s_U3_LiveViewThread;
T_DjiReturnCode U3_LiveView_Sever(void)
{
// 硬件层 句柄
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
// 错误返回
T_DjiReturnCode returnCode;
//注册中心函数
//SearchLightCenter_init();
returnCode = osalHandler->TaskCreate("Liveview_task", U3_LiveviewGetPhoto, 8192,
NULL, &s_U3_LiveViewThread);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Liveview_task create error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/* Exported functions definition ---------------------------------------------*/
static void *U3_LiveviewGetPhoto()
{
E_DjiMountPosition mountPosition; //负载选择
mountPosition = 1;
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
time_t currentTime = time(NULL);
struct tm *localTime = NULL;
T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo = {0};
USER_LOG_INFO("视频流传输开始");
//1、获取飞机的种类信息
returnCode = DjiAircraftInfo_GetBaseInfo(&aircraftInfoBaseInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get aircraft base info error");
pthread_exit(NULL);
}
USER_LOG_INFO("--> Step 1: 初始化视频流传输模块");
returnCode = DjiLiveview_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Liveview init failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("--> Step 2: 开始获取fpv和负载的h264码流");
//获取本地时间,并拼写出 负载视频流的存储地址
localTime = localtime(&currentTime);
sprintf(s_payloadCameraStreamFilePath, "/root/sdcard/payload%d_vis_stream_%04d%02d%02d_%02d-%02d-%02d.h264",
mountPosition, localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
//开始获得fpv的h264视频流 获得的结果返回到 回调函数DjiTest_FpvCameraStreamCallback
returnCode = DjiLiveview_StartH264Stream((E_DjiLiveViewCameraPosition) mountPosition,
DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT,
U3_LiveviewGetPhoto_StreamCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request h264 of payload %d failed, error code: 0x%08X", mountPosition, returnCode);
}
while (1)
{
osalHandler->TaskSleepMs(1000);
}
USER_LOG_INFO("--> Step 3: 停止从fpv和负载获取视频流");
//停止获取负载的视频流
returnCode = DjiLiveview_StopH264Stream((E_DjiLiveViewCameraPosition) mountPosition,
DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request to stop h264 of payload %d failed, error code: 0x%08X", mountPosition, returnCode);
goto out;
}
USER_LOG_INFO("--> Step 4: 释放视频流模块 liveview module");
returnCode = DjiLiveview_Deinit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Liveview deinit failed, error code: 0x%08X", returnCode);
goto out;
}
out:
USER_LOG_INFO("Liveview sample end");
pthread_exit(NULL);
}
int test_num = 0;
static void U3_LiveviewGetPhoto_StreamCallback(E_DjiLiveViewCameraPosition position, const uint8_t *buf,
uint32_t bufLen)
{
//USER_LOG_INFO("U3_LiveviewGetPhoto_StreamCallback");
//倒进解码器里
//SearchLightCenter_SwsMedia(buf,bufLen);
//fwrite(buf, 1, bufLen, h264_Output);
//USER_LOG_INFO("解码完成,记录调用时间\n");
test_num ++;
if (test_num > 200)
{
if (test_num %20 == 0)
{
DjiLiveview_RequestIntraframeFrameData((E_DjiLiveViewCameraPosition) 1,
DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT);
}
//CameraCedarX_H264_TO_NV21_DecodeOneFrame(buf, bufLen);
}
else
{
printf("testnum%d\n",test_num);
}
}
T_DjiReturnCode DjiTest_LiveviewRunSample(E_DjiMountPosition mountPosition)
{
T_DjiReturnCode returnCode;
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
time_t currentTime = time(NULL);
struct tm *localTime = NULL;
T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo = {0};
USER_LOG_INFO("Liveview sample start");
DjiTest_WidgetLogAppend("Liveview sample start");
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;
}
USER_LOG_INFO("--> Step 1: Init liveview module");
DjiTest_WidgetLogAppend("--> Step 1: Init liveview module");
returnCode = DjiLiveview_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Liveview init failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("--> Step 2: Start h264 stream of the fpv and selected payload\r\n");
DjiTest_WidgetLogAppend("--> Step 2: Start h264 stream of the fpv and selected payload\r\n");
if (aircraftInfoBaseInfo.aircraftSeries == DJI_AIRCRAFT_SERIES_M300 ||
aircraftInfoBaseInfo.aircraftSeries == DJI_AIRCRAFT_SERIES_M350 ||
aircraftInfoBaseInfo.aircraftSeries == DJI_AIRCRAFT_SERIES_M30) {
localTime = localtime(&currentTime);
sprintf(s_fpvCameraStreamFilePath, "fpv_stream_%04d%02d%02d_%02d-%02d-%02d.h264",
localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
returnCode = DjiLiveview_StartH264Stream(DJI_LIVEVIEW_CAMERA_POSITION_FPV, DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT,
DjiTest_FpvCameraStreamCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request h264 of fpv failed, error code: 0x%08X", returnCode);
goto out;
}
}
localTime = localtime(&currentTime);
sprintf(s_payloadCameraStreamFilePath, "payload%d_vis_stream_%04d%02d%02d_%02d-%02d-%02d.h264",
mountPosition, localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
returnCode = DjiLiveview_StartH264Stream((E_DjiLiveViewCameraPosition) mountPosition,
DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT,
DjiTest_PayloadCameraStreamCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request h264 of payload %d failed, error code: 0x%08X", mountPosition, returnCode);
}
for (int i = 0; i < TEST_LIVEVIEW_STREAM_STROING_TIME_IN_SECONDS; ++i) {
USER_LOG_INFO("Storing camera h264 stream, second: %d.", i + 1);
#if TEST_LIVEVIEW_STREAM_REQUEST_I_FRAME_ON
if (i % TEST_LIVEVIEW_STREAM_REQUEST_I_FRAME_TICK_IN_SECONDS == 0) {
returnCode = DjiLiveview_RequestIntraframeFrameData((E_DjiLiveViewCameraPosition) mountPosition,
DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request stream I frame of payload %d failed, error code: 0x%08X", mountPosition,
returnCode);
}
}
#endif
osalHandler->TaskSleepMs(1000);
}
USER_LOG_INFO("--> Step 3: Stop h264 stream of the fpv and selected payload\r\n");
DjiTest_WidgetLogAppend("--> Step 3: Stop h264 stream of the fpv and selected payload");
if (aircraftInfoBaseInfo.aircraftSeries == DJI_AIRCRAFT_SERIES_M300 ||
aircraftInfoBaseInfo.aircraftSeries == DJI_AIRCRAFT_SERIES_M350 ||
aircraftInfoBaseInfo.aircraftSeries == DJI_AIRCRAFT_SERIES_M30) {
returnCode = DjiLiveview_StopH264Stream(DJI_LIVEVIEW_CAMERA_POSITION_FPV, DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request to stop h264 of fpv failed, error code: 0x%08X", returnCode);
goto out;
}
}
returnCode = DjiLiveview_StopH264Stream((E_DjiLiveViewCameraPosition) mountPosition,
DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request to stop h264 of payload %d failed, error code: 0x%08X", mountPosition, returnCode);
goto out;
}
USER_LOG_INFO("Fpv stream is saved to file: %s", s_fpvCameraStreamFilePath);
USER_LOG_INFO("Payload%d stream is saved to file: %s\r\n", mountPosition, s_payloadCameraStreamFilePath);
if (DJI_AIRCRAFT_TYPE_M3T == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M3TD == aircraftInfoBaseInfo.aircraftType
|| DJI_AIRCRAFT_TYPE_M4T == aircraftInfoBaseInfo.aircraftType
) {
USER_LOG_INFO("--> Start h264 stream of the fpv and selected payload\r\n");
localTime = localtime(&currentTime);
sprintf(s_payloadCameraStreamFilePath, "payload%d_ir_stream_%04d%02d%02d_%02d-%02d-%02d.h264",
mountPosition, localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
returnCode = DjiLiveview_StartH264Stream((E_DjiLiveViewCameraPosition) mountPosition,
DJI_LIVEVIEW_CAMERA_SOURCE_M3T_IR,
DjiTest_PayloadCameraStreamCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request h264 of payload %d failed, error code: 0x%08X", mountPosition, returnCode);
}
for (int i = 0; i < TEST_LIVEVIEW_STREAM_STROING_TIME_IN_SECONDS; ++i) {
USER_LOG_INFO("Storing camera h264 stream, second: %d.", i + 1);
osalHandler->TaskSleepMs(1000);
}
returnCode = DjiLiveview_StopH264Stream((E_DjiLiveViewCameraPosition) mountPosition,
DJI_LIVEVIEW_CAMERA_SOURCE_M3T_IR);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request to stop h264 of payload %d failed, error code: 0x%08X", mountPosition, returnCode);
goto out;
}
}
USER_LOG_INFO("Fpv stream is saved to file: %s", s_fpvCameraStreamFilePath);
USER_LOG_INFO("Payload%d stream is saved to file: %s\r\n", mountPosition, s_payloadCameraStreamFilePath);
USER_LOG_INFO("--> Step 4: Deinit liveview module");
DjiTest_WidgetLogAppend("--> Step 4: Deinit liveview module");
returnCode = DjiLiveview_Deinit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Liveview deinit failed, error code: 0x%08X", returnCode);
goto out;
}
out:
USER_LOG_INFO("Liveview sample end");
return returnCode;
}
/* Private functions definition-----------------------------------------------*/
static void DjiTest_FpvCameraStreamCallback(E_DjiLiveViewCameraPosition position, const uint8_t *buf,
uint32_t bufLen)
{
FILE *fp = NULL;
size_t size;
fp = fopen(s_fpvCameraStreamFilePath, "ab+");
if (fp == NULL) {
printf("fopen failed!\n");
return;
}
size = fwrite(buf, 1, bufLen, fp);
if (size != bufLen) {
fclose(fp);
return;
}
fflush(fp);
fclose(fp);
}
static void DjiTest_PayloadCameraStreamCallback(E_DjiLiveViewCameraPosition position, const uint8_t *buf,
uint32_t bufLen)
{
FILE *fp = NULL;
size_t size;
fp = fopen(s_payloadCameraStreamFilePath, "ab+");
if (fp == NULL) {
printf("fopen failed!\n");
return;
}
size = fwrite(buf, 1, bufLen, fp);
if (size != bufLen) {
fclose(fp);
return;
}
fflush(fp);
fclose(fp);
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/
... ...
... ... @@ -115,11 +115,15 @@ T_DjiReturnCode DjiTest_PowerManagementStartService(void)
return returnCode;
}
USER_LOG_INFO("Start to apply high power.");
returnCode = DjiPowerManagement_ApplyHighPowerSync();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("apply high power error");
return returnCode;
}
USER_LOG_INFO("Success to apply high power.");
}
// register power off notification callback function
... ... @@ -150,7 +154,6 @@ static T_DjiReturnCode DjiTest_PowerOffNotificationCallback(bool *powerOffPrepar
{
USER_LOG_INFO("aircraft will power off soon.");
*powerOffPreparationFlag = true;
JZsdk_Psdk_UI_io_SetPowerStatus(0);
... ...
/**
********************************************************************
* @file test_power_management.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 DJI’s authorization, you may not
* further disseminate the information, and you must immediately remove the
* source code and notify DJI of its removal. DJI reserves the right to pursue
* legal actions against you for any loss(es) or damage(s) caused by your
* failure to do so.
*
*********************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "test_power_management.h"
#include "dji_logger.h"
#include "dji_aircraft_info.h"
#include "Psdk_UI_io.h"
/* Private constants ---------------------------------------------------------*/
/* Private types -------------------------------------------------------------*/
/* Private functions declaration ---------------------------------------------*/
static T_DjiReturnCode DjiTest_PowerOffNotificationCallback(bool *powerOffPreparationFlag);
/* Private variables ---------------------------------------------------------*/
static T_DjiTestApplyHighPowerHandler s_applyHighPowerHandler;
/* Exported functions definition ---------------------------------------------*/
/**
* @brief Register handler function for applying high power. This function have to be called before calling
* DjiTest_PowerManagementInit(), except for in Linux, because DjiTest_PowerManagementInit() do not apply high power
* in Linux OS.
* @param applyHighPowerHandler: pointer to handler function for applying high power.
* @return Execution result.
*/
T_DjiReturnCode DjiTest_RegApplyHighPowerHandler(T_DjiTestApplyHighPowerHandler *applyHighPowerHandler)
{
if (applyHighPowerHandler->pinInit == NULL) {
USER_LOG_ERROR("reg apply high power handler pinInit error");
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
if (applyHighPowerHandler->pinWrite == NULL) {
USER_LOG_ERROR("reg apply high power handler pinWrite error");
return DJI_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
memcpy(&s_applyHighPowerHandler, applyHighPowerHandler, sizeof(T_DjiTestApplyHighPowerHandler));
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**
* @brief Initialise power management module, including apply high power (only RTOS) and register power off notification
* callback function.
* @note DJI development board 1.0 can not accept high power, so do not call this function in DJI development board
* 1.0 project.
* @return Execution result.
*/
T_DjiReturnCode DjiTest_PowerManagementStartService(void)
{
T_DjiReturnCode returnCode;
T_DjiAircraftInfoBaseInfo baseInfo = {0};
returnCode = DjiPowerManagement_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("power management init error: 0x%08llX.", returnCode);
return returnCode;
}
returnCode = DjiAircraftInfo_GetBaseInfo(&baseInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get aircraft base info error: 0x%08llX.", returnCode);
return returnCode;
}
if (baseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 ||
baseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_XPORT ||
baseInfo.aircraftType == DJI_AIRCRAFT_TYPE_FC30) {
// apply high power
if (s_applyHighPowerHandler.pinInit == NULL) {
USER_LOG_ERROR("apply high power pin init interface is NULL error");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
if (s_applyHighPowerHandler.pinWrite == NULL) {
USER_LOG_ERROR("apply high power pin write interface is NULL error");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
returnCode = s_applyHighPowerHandler.pinInit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("apply high power pin init error");
return returnCode;
}
returnCode = DjiPowerManagement_RegWriteHighPowerApplyPinCallback(s_applyHighPowerHandler.pinWrite);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("register WriteHighPowerApplyPinCallback error.");
return returnCode;
}
returnCode = DjiPowerManagement_ApplyHighPowerSync();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("apply high power error");
return returnCode;
}
}
// register power off notification callback function
returnCode = DjiPowerManagement_RegPowerOffNotificationCallback(DjiTest_PowerOffNotificationCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("register power off notification callback function error");
return returnCode;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode DjiTest_PowerManagementStopService(void)
{
T_DjiReturnCode returnCode;
returnCode = DjiPowerManagement_DeInit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("power management deinit error: 0x%08llX.", returnCode);
return returnCode;
}
return returnCode;
}
/* Private functions definition-----------------------------------------------*/
static T_DjiReturnCode DjiTest_PowerOffNotificationCallback(bool *powerOffPreparationFlag)
{
USER_LOG_INFO("aircraft will power off soon.");
*powerOffPreparationFlag = true;
JZsdk_Psdk_UI_io_SetPowerStatus(0);
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/
... ...
... ... @@ -188,7 +188,7 @@ static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = {
};
static const uint32_t s_widgetHandlerListCount = sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem);
int32_t s_widgetValueList[] = {VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD, //视频流
int32_t s_widgetValueList[] = {VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST, //视频流
OFF, //测温模式
ON, //光圈开关
OFF, //冻结开关
... ... @@ -197,7 +197,7 @@ int32_t s_widgetValueList[] = {VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD, //视频
OFF, //打档
8, //伪彩颜色
1, //纠正选项
0, //气体增强颜色选项
1, //气体增强颜色选项
0, //单点纠正模式
0, //自动打档间隔
0, //高低温模式
... ...
... ... @@ -211,10 +211,11 @@ T_DjiReturnCode DjiTest_WidgetInteractionStartService(void)
return djiStat;
}
#ifdef SYSTEM_ARCH_LINUX_DISABLEED
#ifdef SYSTEM_ARCH_LINUX_DISABLE
//Step 2 : Set UI Config (Linux environment)
char curFileDirPath[WIDGET_DIR_PATH_LEN_MAX];
char tempPath[WIDGET_DIR_PATH_LEN_MAX];
djiStat = DjiUserUtil_GetCurrentFileDirPath(__FILE__, WIDGET_DIR_PATH_LEN_MAX, curFileDirPath);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get file current path error, stat = 0x%08llX", djiStat);
... ...