作者 潘浩彬

合并分支 'dev' 到 'master'

Dev



查看合并请求 !10
正在显示 76 个修改的文件 包含 2372 行增加964 行删除

要显示太多修改。

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

... ... @@ -25,3 +25,5 @@ project_build/DJI_大疆PSDK/samples/sample_c/platform/linux/all/*
!project_build/DJI_大疆PSDK/samples/sample_c/platform/linux/all/application
!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/Attention_提示程序
\ No newline at end of file
... ...
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/linux_kernel/include/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"cStandard": "c99",
"intelliSenseMode": "${default}"
}
],
"version": 4
}
\ No newline at end of file
... ...
... ... @@ -42,7 +42,22 @@
"jzsdk_uart_send.h": "c",
"espeak_tts.h": "c",
"buffersrc.h": "c",
"audiodeal.h": "c"
"audiodeal.h": "c",
"wiringpi.h": "c",
"v4l2_cameraparametersetting.h": "c",
"rtk_mmp.h": "c",
"videostream_shootphoto.h": "c",
"videostream_record.h": "c",
"videomgmt_parm.h": "c",
"multproc.h": "c",
"videomgmt.h": "c",
"string.h": "c",
"unistd.h": "c",
"mediaparm.h": "c",
"videostream_push.h": "c",
"v4l2_record.h": "c",
"deviceinfo.h": "c"
},
"Codegeex.GenerationPreference": "automatic"
"Codegeex.GenerationPreference": "automatic",
"C_Cpp.dimInactiveRegions": false
}
\ No newline at end of file
... ...
# 编译链的配置
#1、编译链与设备类型的选择
set(DEVICE_NAME JZ_C1)
set(DEVICE_NAME JZ_H150S)
#上一行为禁止修改行
message("**************************JZSDK构建编译开始***************************\n")
if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
... ... @@ -70,4 +72,4 @@ else()
message(FATAL_ERROR "不支持的编译链")
endif()
message("编译链配置完毕\n")
\ No newline at end of file
message("\n**************************编译链配置完毕***********************\n")
\ No newline at end of file
... ...
# SubsidiaryThirdPartyConfig.cmake 附属第三方库配置文件
set(IFLAY_TTS_MODULE VERSION_SWITCH_OFF)
set(ESPEAK_TTS_MODULE VERSION_SWITCH_OFF)
set(ALSALIB_MODULE VERSION_SWITCH_OFF)
set(OPUS_MODULE VERSION_SWITCH_OFF)
set(LIB_RTK_MMP VERSION_SWITCH_OFF)
set(LIB_USB VERSION_SWITCH_OFF)
set(LIB_KT_IRC VERSION_SWITCH_OFF)
add_definitions(-D COMPILE_MODE_MODULE) #设置代码为编译模式
if(${MEGAPHONE_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n喊话器模块已加载")
add_definitions(-DMACRO_MEGAPHONE_MODULE) #加载喊话器模块
message("加载讯飞TTS模块")
set(IFLAY_TTS_MODULE VERSION_SWITCH_ON)
message("加载espeak模块")
set(ESPEAK_TTS_MODULE VERSION_SWITCH_ON)
message("加载alsalib模块")
set(ALSALIB_MODULE VERSION_SWITCH_ON)
message("加载OPUS模块")
set(OPUS_MODULE VERSION_SWITCH_ON)
endif()
if(${IRC_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n红外相机模块已加载")
add_definitions(-DMACRO_IRC_MODULE)
message("加载RTK模块")
set(LIB_RTK_MMP VERSION_SWITCH_ON)
message("加载USB模块")
set(LIB_USB VERSION_SWITCH_ON)
message("\n媒体管理模块已加载")
add_definitions(-DMACRO_MEDIA_PROC_MODULE)
if(${IRC_MODULE} STREQUAL "VERSION_SWITCH_ON")
set(LIB_KT_IRC VERSION_SWITCH_ON)
endif()
endif()
if(${SIDE_LASER_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("加载侧面激光模块")
add_definitions(-DMACRO_SIDE_LASER_MODULE)
endif()
message("附属库已加载\n")
\ No newline at end of file
# 模组构建文件,用于加载源代码 与 配置代码中的开关
# ${ROOT_DIRS}为cmakelist文件提供的工程根目录
message("\n*************************开始模块构建***********************\n")
set(IFLAY_TTS_MODULE VERSION_SWITCH_OFF)
set(ESPEAK_TTS_MODULE VERSION_SWITCH_OFF)
set(ALSALIB_MODULE VERSION_SWITCH_OFF)
set(OPUS_MODULE VERSION_SWITCH_OFF)
set(LIB_RTK_MMP VERSION_SWITCH_OFF)
set(LIB_USB VERSION_SWITCH_OFF)
set(LIB_KT_IRC VERSION_SWITCH_OFF)
add_definitions(-D COMPILE_MODE_MODULE) #设置代码为编译模式
#加载基础库JZSDK库基础代码
file(GLOB_RECURSE JZSDK_COMMON_SRC ${ROOT_DIRS}JZsdk_Common/*.c)
list(APPEND ALL_SRC_FILES ${JZSDK_COMMON_SRC})
list(APPEND ALL_INC_FILES ${ROOT_DIRS}JZsdk_Common)
file(GLOB_RECURSE JZSDK_CONFIG_SRC ${ROOT_DIRS}JZsdk_Config/*.c)
list(APPEND ALL_SRC_FILES ${JZSDK_CONFIG_SRC})
list(APPEND ALL_INC_FILES ${ROOT_DIRS}JZsdk_Config)
file(GLOB_RECURSE JZSDK_HAL_SRC ${ROOT_DIRS}JZsdk_hal/*.c)
list(APPEND ALL_SRC_FILES ${JZSDK_HAL_SRC})
list(APPEND ALL_INC_FILES ${ROOT_DIRS}JZsdk_hal)
file(GLOB_RECURSE JZSDK_OSAL_SRC ${ROOT_DIRS}JZsdk_osal/*.c)
list(APPEND ALL_SRC_FILES ${JZSDK_OSAL_SRC})
list(APPEND ALL_INC_FILES ${ROOT_DIRS}JZsdk_osal)
message("\nJZSDK基础代码加载完毕\n")
#如果要加载设备信息模块,需要加载以下附属内容
if(${DEVICE_INFO_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n设备信息模块源码加载中")
file(GLOB_RECURSE DEVICE_MESSAGE_SRC ${ROOT_DIRS}Module/DeviceInfo/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_MESSAGE_SRC})
endif()
#如果要加载云台模块,需要加载以下附属内容
if(${GIMBAL_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n云台模块源码加载中")
file(GLOB_RECURSE GIMBAL_SRC ${ROOT_DIRS}Module/Gimbal/*.c)
list(APPEND ALL_SRC_FILES ${GIMBAL_SRC})
endif()
#如果要加载引脚模块,需要加载以下附属内容
if(${IRCUT_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n引脚模块源码加载中")
file(GLOB_RECURSE MODULE_IRCUT_SRC ${ROOT_DIRS}Module/Ircut/*.c)
list(APPEND ALL_SRC_FILES ${MODULE_IRCUT_SRC})
endif()
#如果要加载光源模块,需要加载以下附属内容
if(${LIGHTING_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n光源模块加载中")
#打开光源的代码编译部分
add_definitions(-DMACRO_LIGHTING_MODULE)
#将光源的源代码加入编译中
file(GLOB_RECURSE LIGHTING_SRC ${ROOT_DIRS}Module/Lighting/*.c)
list(APPEND ALL_SRC_FILES ${LIGHTING_SRC})
endif()
#如果要加载媒体管理模块,需要加载以下附属内容
if(${MEDIA_PROC_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n媒体管理模块加载中")
#将媒体管理模块的源代码加入编译中
add_definitions(-DMACRO_MEDIA_PROC_MODULE)
file(GLOB_RECURSE MEDIA_PROC_SRC ${ROOT_DIRS}Module/MediaProc/*.c)
file(GLOB_RECURSE MEDIA_PROC_SRC_CPP ${ROOT_DIRS}Module/MediaProc/*.cpp)
list(APPEND ALL_SRC_FILES ${MEDIA_PROC_SRC})
list(APPEND ALL_SRC_FILES ${MEDIA_PROC_SRC_CPP})
#如果要加载红外相机模块,额外加载以下附属内容
if(${IRC_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("加载红外相机模块")
add_definitions(-DMACRO_IRC_MODULE)
message("加载RTK模块")
set(LIB_RTK_MMP VERSION_SWITCH_ON)
message("加载USB模块")
set(LIB_USB VERSION_SWITCH_ON)
if(${IRC_MODULE} STREQUAL "VERSION_SWITCH_ON")
set(LIB_KT_IRC VERSION_SWITCH_ON)
endif()
endif()
endif()
#如果要加载喊话器模块,需要加载以下附属内容
if(${MEGAPHONE_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n喊话器模块加载中")
message("加载喊话器")
add_definitions(-DMACRO_MEGAPHONE_MODULE) #加载喊话器模块
file(GLOB_RECURSE MEGAPHONE_SRC ${ROOT_DIRS}Module/Megaphone/*.c)
list(APPEND ALL_SRC_FILES ${MEGAPHONE_SRC})
message("加载音频库")
file(GLOB_RECURSE AUDIODEAL_SRC ${ROOT_DIRS}Module/AudioDeal/*.c)
list(APPEND ALL_SRC_FILES ${AUDIODEAL_SRC})
message("加载讯飞TTS模块")
set(IFLAY_TTS_MODULE VERSION_SWITCH_ON)
message("加载espeak模块")
set(ESPEAK_TTS_MODULE VERSION_SWITCH_ON)
message("加载alsalib模块")
set(ALSALIB_MODULE VERSION_SWITCH_ON)
message("加载OPUS模块")
set(OPUS_MODULE VERSION_SWITCH_ON)
endif()
#如果要加载电源管理模块,需要加载以下附属内容
if(${POWER_MANAGER_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n电源模块加载中")
file(GLOB_RECURSE POWERMANAGER_SRC ${ROOT_DIRS}Module/PowerManager/*.c)
list(APPEND ALL_SRC_FILES ${POWERMANAGER_SRC})
endif()
#如果要加载侧面激光模块,需要加载以下附属内容
if(${SIDE_LASER_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n侧面激光模块加载中")
#打开侧面激光的代码编译部分
add_definitions(-DMACRO_SIDE_LASER_MODULE)
file(GLOB_RECURSE MODULE_SIDE_LASER_SRC ${ROOT_DIRS}Module/SideLaser/*.c)
list(APPEND ALL_SRC_FILES ${MODULE_SIDE_LASER_SRC})
endif()
#如果要加载UI模块,需要加载以下附属内容
if(${UI_CONTROL_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\nUI模块源码加载中")
file(GLOB_RECURSE MODULE_UICONTROL_SRC ${ROOT_DIRS}Module/UI_control/*.c)
list(APPEND ALL_SRC_FILES ${MODULE_UICONTROL_SRC})
endif()
# wiringPi
if(${WIRINGPI_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\nwiringPi模块加载中")
file(GLOB_RECURSE WIRINGPI_SRC ${ROOT_DIRS}ThirdParty/wiringPi/*.c)
list(APPEND ALL_SRC_FILES ${WIRINGPI_SRC})
list(APPEND ALL_INC_FILES ${ROOT_DIRS}ThirdParty/wiringPi)
#打开wiringPi的代码编译部分
add_definitions(-DMACRO_WIRINGPI_MODULE)
endif()
# 如果要加入特殊图像处理模块,需要加载以下附属内容
if(${IMAGEPROCESSING_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n特殊图像处理模块加载中")
file(GLOB_RECURSE MODULE_IMAGEPROCESSING_SRC ${ROOT_DIRS}Module/ImageProcessing/*.c)
file(GLOB_RECURSE MODULE_IMAGEPROCESSING_cpp_SRC ${ROOT_DIRS}Module/ImageProcessing/*.cpp)
list(APPEND ALL_SRC_FILES ${MODULE_IMAGEPROCESSING_SRC})
list(APPEND ALL_SRC_FILES ${MODULE_IMAGEPROCESSING_cpp_SRC})
endif()
# 头文件加载,后续再进行优化
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/Megaphone)
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/Ircut)
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/Gimbal)
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/Lighting)
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/UI_control)
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/Camera)
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/PowerManager)
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/TestAPP)
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/ImageProcessing)
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/SerialManagement)
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module)
message("**************************库构建完毕***************************\n")
\ No newline at end of file
... ...
# ModuleConfig.cmake 模组模块的配置文件
# 设备类型的模块配置文件
# 主要用于根据设备类型
# 将对应的模块打开
###################### 自己的库 ##############################
# AudioDeal 音频处理模块
... ... @@ -16,8 +18,6 @@ set(IRCUT_MODULE VERSION_SWITCH_OFF)
# LIGHTING 光源处理模块
set(LIGHTING_MODULE VERSION_SWITCH_OFF)
# MediaProc 媒体管理模块
set(MEDIA_PROC_MODULE VERSION_SWITCH_OFF)
# 喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_OFF)
... ... @@ -28,6 +28,10 @@ set(POWER_MANAGER_MODULE VERSION_SWITCH_OFF)
# UI管理模块
set(UI_CONTROL_MODULE VERSION_SWITCH_OFF)
# MediaProc 媒体管理模块
set(MEDIA_PROC_MODULE VERSION_SWITCH_OFF)
# 红外相机模块
set(IRC_MODULE VERSION_SWITCH_OFF)
... ... @@ -42,7 +46,13 @@ set(FFMPEG_MODULE VERSION_SWITCH_OFF)
# cedarxLib
set(CedarxLib VERSION_SWITCH_OFF)
########################## 通用库 ###########################################
# wiringPi库
set(WIRINGPI_MODULE VERSION_SWITCH_OFF)
# OpenCV库
set(IMAGEPROCESSING_MODULE VERSION_SWITCH_OFF)
########################## 通用库加载 ###########################################
# 添加信息模块
set(DEVICE_INFO_MODULE VERSION_SWITCH_ON)
... ... @@ -50,7 +60,12 @@ set(DEVICE_INFO_MODULE VERSION_SWITCH_ON)
# 添加UI管理模块
set(UI_CONTROL_MODULE VERSION_SWITCH_ON)
#####################################################################
# 添加电源管理模块
set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
message("通用库加载完成")
########################### 独立库加载 ##########################################
if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
# 添加AudioDeal 音频处理模块
... ... @@ -68,9 +83,6 @@ if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加电源管理模块
set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
... ... @@ -91,8 +103,25 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_H1T")
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加电源管理模块
set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
elseif("${DEVICE_NAME}" STREQUAL "JZ_U3")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
# 添加Gimbal 云台处理模块
set(GIMBAL_MODULE VERSION_SWITCH_ON)
# 添加IRCUT 引脚处理模块
set(IRCUT_MODULE VERSION_SWITCH_ON)
# 添加LIGHTING 光源处理模块
set(LIGHTING_MODULE VERSION_SWITCH_ON)
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
... ... @@ -114,9 +143,6 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3S")
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加电源管理模块
set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
... ... @@ -140,9 +166,6 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D")
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加电源管理模块
set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
... ... @@ -163,8 +186,86 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U30")
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加电源管理模块
set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
elseif("${DEVICE_NAME}" STREQUAL "JZ_H10")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
# 添加Gimbal 云台处理模块
set(GIMBAL_MODULE VERSION_SWITCH_ON)
# 添加IRCUT 引脚处理模块
set(IRCUT_MODULE VERSION_SWITCH_ON)
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加wringpi
set(WIRINGPI_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
elseif("${DEVICE_NAME}" STREQUAL "JZ_H10T")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
# 添加Gimbal 云台处理模块
set(GIMBAL_MODULE VERSION_SWITCH_ON)
# 添加IRCUT 引脚处理模块
set(IRCUT_MODULE VERSION_SWITCH_ON)
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
elseif("${DEVICE_NAME}" STREQUAL "JZ_H150S")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
# 添加Gimbal 云台处理模块
set(GIMBAL_MODULE VERSION_SWITCH_ON)
# 添加IRCUT 引脚处理模块
set(IRCUT_MODULE VERSION_SWITCH_ON)
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加MediaProc 媒体管理模块
set(MEDIA_PROC_MODULE VERSION_SWITCH_ON)
# 添加wringpi
set(WIRINGPI_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
elseif("${DEVICE_NAME}" STREQUAL "JZ_H150T")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
# 添加Gimbal 云台处理模块
set(GIMBAL_MODULE VERSION_SWITCH_ON)
# 添加IRCUT 引脚处理模块
set(IRCUT_MODULE VERSION_SWITCH_ON)
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加MediaProc 媒体管理模块
set(MEDIA_PROC_MODULE VERSION_SWITCH_ON)
# 添加wringpi
set(WIRINGPI_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
... ... @@ -183,9 +284,6 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_C1")
# 添加MediaProc 媒体管理模块
set(MEDIA_PROC_MODULE VERSION_SWITCH_ON)
# 添加电源管理模块
set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
# 添加红外相机模块
set(IRC_MODULE VERSION_SWITCH_ON)
... ... @@ -193,4 +291,4 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_C1")
set(LIB_KT_MODULE VERSION_SWITCH_ON)
endif()
message("模组模块已加载\n")
\ No newline at end of file
message("***********************模组模块配置完毕*********************************\n")
\ No newline at end of file
... ...
# ModuleLoading.cmake 模块加载文件
# 第一方/第三方 模块加载文件
# 主要用于加载动态库给编译使用
# ${ROOT_DIRS}为cmakelist文件提供的工程根目录
if(${IFLAY_TTS_MODULE} STREQUAL "VERSION_SWITCH_ON")
... ... @@ -170,5 +171,7 @@ if(${LIB_KT_IRC} STREQUAL "VERSION_SWITCH_ON")
${PROJECT_NAME}
${ROOT_DIRS}/ThirdParty/KT_IRC/aarch64-none-linux-gnu/lib/libktlib.so
)
add_definitions(-DMACRO_KTIRC_MODULE)
endif()
message("**************************动态库加载完毕***************************\n")
\ No newline at end of file
... ...
... ... @@ -156,7 +156,9 @@ typedef enum {
JZ_INSCODE_5BFRAME_MUSICLIST_START = 0x10004300, //开启发送音乐列表帧
JZ_INSCODE_5BFRAME_MUSICLIST_TRANS = 0x10004301, //发送音乐列表帧
JZ_INSCODE_5BFRAME_MUSICLIST_STOP = 0x10004302, //结束发送音乐列表帧
JZ_INSCODE_5BFRAME_MUSICLIST_TRANS_2 = 0x10004303, //查询音频详细信息2型
JZ_INSCODE_5BFRAME_AUDIO_PLAYSTATUS = 0x10004310, //音频播放状态返回帧
JZ_INSCODE_5BFRAME_AUDIO_PLAYSTATUS_END = 0x10004311, //音频播放状态结束帧
... ... @@ -168,6 +170,7 @@ typedef enum {
JZ_INSCODE_5BFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE = 0x10004405, //查询音频详细信息
JZ_INSCODE_5BFRAME_GIMBAL_PITCH = 0x10004500, //云台俯仰角度
JZ_INSCODE_5BFRAME_GIMBAL_YAW = 0x10004501, //云台航向角度
JZ_INSCODE_5BFRAME_GIMBAL_ROLL = 0x10004502, //
... ... @@ -198,6 +201,8 @@ typedef enum {
//6A类
JZ_INSCODE_6AFRAME_FRAME = 0x10008000, //发送帧
JZ_INSCODE_6AFRAME_DEBUG_INS = 0x10008080, //调试指令
JZ_INSCODE_6AFRAME_SET_GIMBAL_ORIGIN = 0x10008101, //设置坐标0值
JZ_INSCODE_6AFRAME_SET_GIMBAL_MAXMIN_RANGE = 0x10008102, //设置云台范围最大最小值
JZ_INSCODE_6AFRAME_SET_LUMEN_MAXMIN_RANGE = 0x10008103, //设置灯光范围最大最小值
... ...
... ... @@ -3,6 +3,24 @@
//一级功能码是私有协议
static int Comparison_6AFRAME_FirstLevelCode_0x10(char *getdata)
{
//二级功能位
switch (getdata[8])
{
//调试指令
case 0x00:
return JZ_INSCODE_6AFRAME_DEBUG_INS;
break;
default:
return JZ_ERROR_SYSTEM_FRAME_ERROR;
break;
}
}
//一级功能码是私有协议
static int Comparison_6AFRAME_FirstLevelCode_0x69(char *getdata)
{
//二级功能位
... ... @@ -104,6 +122,10 @@ int JZsdk_6AFrameComparsion(char *getdata, int len)
//一级功能码
switch (getdata[7])
{
case 0x10:
return Comparison_6AFRAME_FirstLevelCode_0x10(getdata);
break;
case 0x69:
return Comparison_6AFRAME_FirstLevelCode_0x69(getdata);
break;
... ...
... ... @@ -391,14 +391,23 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
}
break;
case JZ_INSCODE_5BFRAME_MUSICLIST_TRANS_2:
{
char sendbuf[14] = { 0x5b, 0x5b, 0x77, 0x00, 0x0d, 0x01, 0x00, 0x58, 0x04, 0x00, 0x00, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 14);
*str_len = 14;
}
break;
case JZ_INSCODE_5BFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE:
{
char sendbuf[14] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x01, 0x00, 0x58, 0x03, 0x00, 0x00, 0x00, 0x00, 0x23};
char sendbuf[14] = { 0x5b, 0x5b, 0x77, 0x00, 0x0d, 0x01, 0x00, 0x58, 0x03, 0x00, 0x00, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 14);
*str_len = 14;
}
break;
case JZ_INSCODE_5BFRAME_MUSICLIST_STOP:
{
char sendbuf[12] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x23};
... ...
... ... @@ -387,7 +387,6 @@ int Main_APP_Uart()
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
//音频库初始化
AudioDeal_Init();
#endif
if (DEVICE_VERSION == JZ_H1E)
... ...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // 包含getopt函数
#include <unistd.h>
#include <ctype.h>
#include <getopt.h>
#include "JZsdkLib.h"
#include "./ParamterParsing.h"
/*
struct option {
const char *name; 参数名称
int has_arg; 指明是否带有参数
int *flag; flag=NULL时,返回value;不为空时,*flag=val,返回0
int val; 用于指定函数找到选项的返回值或flag非空时指定*flag的值
};
no_argument 不带参数 如: --version,--help
required_argument 必须带参数 --参数 值 或者 --参数=值。如:--dir=/root
optional_argument 参数可选 只能为:--参数=值
char *optstring="ab:c::";
运行程序可以给最多三个参数,分别为-a,-b和-c,其中
a选项 :因为没有跟冒号,不能有参数,如:-a
b选项 :因为后面跟了1个冒号,必须有参数,如:-b 100
c选项 :因为跟了2个冒号,参数可有可无,如:-c 100 或 -c 都行
*/
typedef enum parameter{
PARAMETER_OUT_TIMEFLAG = 0x1010, //备用超时标志位
PARAMETER_OUT_TIMEOUT = 0x1011, //备用超时时间
PARAMETER_PLAY_PROMPT_TTS = 0x1012, //播放提示音
}parameter;
static const struct option storage_opts[] = {
{ "OutFlag", required_argument, 0, PARAMETER_OUT_TIMEFLAG }, //超时标志
{ "OutTime", required_argument, 0, PARAMETER_OUT_TIMEOUT }, //超时时间
{ "play_prompt_tts", required_argument, NULL, PARAMETER_PLAY_PROMPT_TTS }, //提示选项
{ 0, 0, 0, 0 }
};
static int Timeout_flag = JZ_FLAGCODE_OFF; //超时标记位,默认关闭
static int Timeout_time = 60; //超时时间
unsigned char *g_JZsdkParam_PlayPromptTTS = NULL; //播放提示音
int JZsdk_ParamterParsing_GetTimeOutFlag()
{
... ... @@ -25,38 +65,68 @@ int JZsdk_ParamterParsing_GetTimeOutTime()
*
* * 程序参数解析
* * 输入:参数字符串
*
* 输出:模式
* 目前 模式0 为不开启任何单独功能,即psdk或者串口模式
* 模式1 为开起喊话器播放模式
*
* ********************************/
T_JZsdkReturnCode JZsdk_ParamterParsing(int argc, char *argv[])
T_JZsdkReturnCode JZsdk_ParamterParsing(int argc, char *argv[], unsigned int *mode)
{
JZSDK_LOG_INFO("参数解析");
int c;
// getopt_long 需要长选项,但这里我们只使用短选项
// getopt循环将逐个处理选项,直到没有更多选项
while ((c = getopt(argc, argv, "f:t:")) != -1)
{
switch (c) {
int insCode = 0; //指令码
//获取短选项
static char *opt_storage = "t:f:";
//解析参数
while (1)
{
int opt_index = 0;
insCode = getopt_long(argc, argv, opt_storage, storage_opts, &opt_index);
if (insCode == -1)
break;
switch (insCode)
{
case PARAMETER_OUT_TIMEFLAG:
printf("备用:outtimeflag:%d \n", atoi(optarg));
Timeout_flag = atoi(optarg);
break;
case PARAMETER_OUT_TIMEOUT:
printf("备用:time %d \n", atoi(optarg));
Timeout_time = atoi(optarg);
break;
//提示音选项
case PARAMETER_PLAY_PROMPT_TTS:
printf("prompt_option:%s \n", optarg);
g_JZsdkParam_PlayPromptTTS = optarg;
*mode = 1;
break;
case 'f': //超时标记位
Timeout_flag = atoi(optarg);
break;
case 't': //超时时间
Timeout_time = atoi(optarg);
break;
case '?':
case '?':
// 如果getopt遇到一个它不认识的选项,它会打印一个消息到stderr
// 并返回'?'。然后我们可以选择退出或给出更多帮助。
if (isprint(optopt))
JZSDK_LOG_ERROR("Unknown option `-%c'.", optopt);
else
JZSDK_LOG_ERROR("Unknown option character `\\x%x'.", optopt);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
default:
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
break;
}
}
default:
break;
}
}
JZSDK_LOG_INFO("参数解析成功");
... ...
... ... @@ -24,7 +24,7 @@ extern "C" {
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_ParamterParsing(int argc, char *argv[]);
T_JZsdkReturnCode JZsdk_ParamterParsing(int argc, char *argv[], unsigned int *mode);
int JZsdk_ParamterParsing_GetTimeOutFlag();
int JZsdk_ParamterParsing_GetTimeOutTime();
... ...
... ... @@ -13,7 +13,7 @@
#define APP_VERSION APP_PSDK
//禁止修改行 板子型号
#define PLATFORM_VERSION PLATFORM_V3S
#define PLATFORM_VERSION PLATFORM_H3
//禁止修改行 串口连接程序的软件版本号
#define MAJOR_VERSION 0x01
... ... @@ -60,6 +60,11 @@
#define IRC_CONFIG_STATUS VERSION_SWITCH_OFF
#endif
//是否加载ktirclib
#ifdef DMACRO_KTIRC_MODULE
#define KTIRC_LIB_STATUS_ON
#endif
//是否加载usb模块
#ifdef MACRO_USB_MODULE
#define USB_CONFIG_STATUS VERSION_SWITCH_ON
... ... @@ -76,9 +81,7 @@
//是否加载WIRINGPI模块
#ifdef MACRO_WIRINGPI_MODULE
#define WIRINGPI_STATUS VERSION_SWITCH_ON
#else
#define WIRINGPI_STATUS VERSION_SWITCH_OFF
#define WIRINGPI_STATUS_ON
#endif
//是否加载侧边激光模块
... ... @@ -86,7 +89,12 @@
#define SIDE_LASER_STATUS_ON
#endif
#else
//是否加载光源模块
#ifdef MACRO_LIGHTING_MODULE
#define LIGHTING_STATUS_ON
#endif
#else //这里用于方便调试使用,不是实际加载的模组
//是否开启喊话器功能
#define MEGAPHONE_CONFIG_STATUS VERSION_SWITCH_ON
... ... @@ -103,10 +111,16 @@
#define RTK_MPP_STATUS VERSION_SWITCH_ON
//是否加载WIRINGPI模块
#define WIRINGPI_STATUS VERSION_SWITCH_ON
#define WIRINGPI_STATUS_ON
//是否加载侧边激光模块
#define SIDE_LASER_STATUS_ON
//默认开启ktlib
#define KTIRC_LIB_STATUS_ON
//默认开启光源模块
#define LIGHTING_STATUS_ON
#endif
#endif
\ No newline at end of file
... ...
... ... @@ -804,23 +804,27 @@ static int RecvDeal_audio_NextSong(int Port, char *getbuf)
**********/
static T_JZsdkReturnCode RecvDeal_audio_GetMusicList(int Port, char *getbuf)
{
T_JZsdkReturnCode ret;
JZSDK_LOG_INFO("%s,获取音乐列表",RecvDeal_GetPortName(Port));
int music_sum = 0;
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
//0、刷新歌曲列表
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
//刷新歌曲列表
Megaphone_Flush_MusicList();
JZSDK_LOG_INFO("刷新");
//解析获取的类型
int type = getbuf[9];
//1、获取歌曲总数
Megaphone_get_music_list_sum(&music_sum);
//2、注册一个歌曲数组
char **MusicName = (char **)malloc(music_sum * sizeof(char*));
unsigned char **MusicName = (unsigned char **)malloc(music_sum * sizeof(unsigned char*));
if (MusicName == NULL)
{
//回复操作失败
... ... @@ -841,7 +845,7 @@ static T_JZsdkReturnCode RecvDeal_audio_GetMusicList(int Port, char *getbuf)
//4、为每一首歌曲分配内存
for (int i = 0; i < music_sum; i++)
{
MusicName[i] = (char*)malloc(128);
MusicName[i] = (unsigned char*)malloc(128 * sizeof(unsigned char));
if (MusicName[i] == NULL)
{
// 内存分配失败,需要释放之前分配的内存
... ... @@ -857,28 +861,78 @@ static T_JZsdkReturnCode RecvDeal_audio_GetMusicList(int Port, char *getbuf)
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
memset(MusicName[i], 0, 128 * sizeof(unsigned char));
//如果成功分配内存,则写入名字
Megaphone_get_music_list_name(i, MusicName[i], &MusicNameLength[i]);
}
JZSDK_LOG_INFO("列表取出完成");
JZSDK_LOG_DEBUG("列表取出完成");
//开始发送歌曲列表
T_JZsdkReturnCode ret = JZsdk_Uart_SentDeal_Reply_Musiclist(Port, FrameSequence, music_sum, MusicName, MusicNameLength);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
//默认类型的歌曲列表发送
if (type == 0x00)
{
//开始发送歌曲列表
ret = JZsdk_Uart_SentDeal_Reply_Musiclist(Port, FrameSequence, music_sum, MusicName, MusicNameLength);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
for (int i = 0; i < music_sum; i++)
{
free(MusicName[i]);
}
free(MusicNameLength);
free(MusicName);
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
else if(type == 0x01)
{
//发送开始帧
ret = JZsdk_Uart_SendDeal_Send_AudioList_Start(Port, FrameSequence, music_sum);
for (int i = 0; i < music_sum; i++)
{
//获取歌曲详细信息
struct AudioMange_audio_struct AudioDetailMessage;
memset(&AudioDetailMessage, 0, sizeof(struct AudioMange_audio_struct));
ret = AudioFile_GetAudioInfo(MusicName[i], MusicNameLength[i],&AudioDetailMessage);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
continue;
}
//发送歌曲列表Ⅱ型
ret = JZsdk_Uart_SendDeal_Send_AudioList_2(Port, FrameSequence, AudioDetailMessage.FileName, AudioDetailMessage.FileNameLen, AudioDetailMessage.FileSize, AudioDetailMessage.Time);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
continue;
}
}
//释放存储的数据
for (int i = 0; i < music_sum; i++)
{
free(MusicName[i]);
}
free(MusicNameLength);
free(MusicName);
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
//发送结束帧
ret = JZsdk_Uart_SendDeal_Send_AudioList_Stop(Port, FrameSequence);
}
#endif
... ... @@ -917,90 +971,87 @@ static T_JZsdkReturnCode RecvDeal_CheckStatus_AudioDetailMessage(int Port, char
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
if (ListBelong == 0)
{
//1、检查歌曲是否存在
ret = AudioFile_CheckFile_WhetherInList(AudioName,AudioNameLength);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
if (ListBelong == 0)
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
return ret;
}
//2、获取歌曲详细信息
struct AudioMange_audio_struct AudioDetailMessage;
ret = AudioFile_GetAudioInfo(AudioName, AudioNameLength,&AudioDetailMessage);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
//1、检查歌曲是否存在
ret = AudioFile_CheckFile_WhetherInList(AudioName,AudioNameLength);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
return ret;
}
return ret;
}
//2、获取歌曲详细信息
struct AudioMange_audio_struct AudioDetailMessage;
ret = AudioFile_GetAudioInfo(AudioName, AudioNameLength,&AudioDetailMessage);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
//获取文件的md5码
unsigned char md5[16];
unsigned char cmd[256];
snprintf(cmd, sizeof(cmd), "md5sum /root/sdcard/audio/%s", AudioDetailMessage.FileName);
JZsdk_RunSystemCmd_ReturnResult_Str(cmd, md5);
return ret;
}
//3、发送歌曲详细信息
// JZSDK_LOG_INFO("即将发送%s, %d, %d, %s",
// AudioDetailMessage.FileName, AudioDetailMessage.FileSize, AudioDetailMessage.Time, md5);
//获取文件的md5码
unsigned char md5[16];
unsigned char cmd[256];
snprintf(cmd, sizeof(cmd), "md5sum /root/sdcard/audio/%s", AudioDetailMessage.FileName);
JZsdk_RunSystemCmd_ReturnResult_Str(cmd, md5);
//要求所有信息
if (QueryContent == 0)
{
//发送名字
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x00, AudioDetailMessage.FileName, AudioDetailMessage.FileNameLen);
//3、发送歌曲详细信息
// JZSDK_LOG_INFO("即将发送%s, %d, %d, %s",
// AudioDetailMessage.FileName, AudioDetailMessage.FileSize, AudioDetailMessage.Time, md5);
//文件大小
unsigned char str1[4];
str1[0] = (AudioDetailMessage.FileSize >> 24) & 0xFF;
str1[1] = (AudioDetailMessage.FileSize >> 16) & 0xFF;
str1[2] = (AudioDetailMessage.FileSize >> 8) & 0xFF;
str1[3] = AudioDetailMessage.FileSize & 0xFF;
//要求所有信息
if (QueryContent == 0)
{
//发送名字
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x00, AudioDetailMessage.FileName, AudioDetailMessage.FileNameLen);
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x01, str1, sizeof(str1));
//文件大小
unsigned char str1[4];
str1[0] = (AudioDetailMessage.FileSize >> 24) & 0xFF;
str1[1] = (AudioDetailMessage.FileSize >> 16) & 0xFF;
str1[2] = (AudioDetailMessage.FileSize >> 8) & 0xFF;
str1[3] = AudioDetailMessage.FileSize & 0xFF;
//播放时间
unsigned char str2[4];
str2[0] = (AudioDetailMessage.Time >> 8) & 0xFF;
str2[1] = AudioDetailMessage.Time & 0xFF;
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x01, str1, sizeof(str1));
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x02, str2, sizeof(str2));
}
else if (QueryContent == 0x01)
{
//文件大小
unsigned char str1[4];
str1[0] = (AudioDetailMessage.FileSize >> 24) & 0xFF;
str1[1] = (AudioDetailMessage.FileSize >> 16) & 0xFF;
str1[2] = (AudioDetailMessage.FileSize >> 8) & 0xFF;
str1[3] = AudioDetailMessage.FileSize & 0xFF;
//播放时间
unsigned char str2[4];
str2[0] = (AudioDetailMessage.Time >> 8) & 0xFF;
str2[1] = AudioDetailMessage.Time & 0xFF;
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x01, str1, sizeof(str1));
}
else if (QueryContent == 0x02)
{
//播放时间
unsigned char str2[4];
str2[0] = (AudioDetailMessage.Time >> 8) & 0xFF;
str2[1] = AudioDetailMessage.Time & 0xFF;
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x02, str2, sizeof(str2));
}
else if (QueryContent == 0x01)
{
//文件大小
unsigned char str1[4];
str1[0] = (AudioDetailMessage.FileSize >> 24) & 0xFF;
str1[1] = (AudioDetailMessage.FileSize >> 16) & 0xFF;
str1[2] = (AudioDetailMessage.FileSize >> 8) & 0xFF;
str1[3] = AudioDetailMessage.FileSize & 0xFF;
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x01, str1, sizeof(str1));
}
else if (QueryContent == 0x02)
{
//播放时间
unsigned char str2[4];
str2[0] = (AudioDetailMessage.Time >> 8) & 0xFF;
str2[1] = AudioDetailMessage.Time & 0xFF;
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x02, str2, sizeof(str2));
}
else if (QueryContent == 0x20)
{
//发送md5码
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x20, md5, sizeof(md5));
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x02, str2, sizeof(str2));
}
else if (QueryContent == 0x20)
{
//发送md5码
JZsdk_Uart_SendDeal_Send_AudioDetailMessage(Port, FrameSequence, 0x20, md5, sizeof(md5));
}
}
}
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
... ... @@ -2986,6 +3037,28 @@ static int RecvDeal_SetGimbalRange(int Port, char *getbuf)
}
}
/***************
*
* 调试指令
*
* **************/
static T_JZsdkReturnCode RecvDeal_DebugIns(int Port, char *getbuf)
{
JZSDK_LOG_INFO("%s,调试指令",RecvDeal_GetPortName(Port));
//解析参数
int len = getbuf[4] + ((int)getbuf[3]) << 8;
int InsLen = len - 11 - 1;
// int pwm = (((int)getbuf[9]) << 8 ) + getbuf[10];
// H3_ircut_pwm(pwm);
// int pwm = (((int)getbuf[9]) << 8 ) + getbuf[10];
// Ircut_PWM_control(pwm);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*********
*
* 设置云台联动
... ... @@ -3861,6 +3934,12 @@ int RecvDeal_InstructInput(int Port, int Receive_mode, unsigned char *getbuf, in
* 6A类部分
*
* *******************************************************************************************************************************/
//debug调试
case JZ_INSCODE_6AFRAME_DEBUG_INS:
RecvDeal_DebugIns(Port,getbuf);
return 0;
break;
//云台联动控制
case JZ_INSCODE_6AFRAME_GIMBAL_LINKAGE_CONTROL:
RecvDeal_GimbalLinkageControl(Port,getbuf);
... ...
... ... @@ -377,7 +377,7 @@ static void JZsdk_Uart_SentDeal_Reply_Musiclist_Task(void *data)
JZsdk_GetFrameTemplate(JZ_INSCODE_5BFRAME_MUSICLIST_STOP , sendbuf, &send_buf_len);
//写入数据
sendbuf[6] = taskData->FrameSequence; //帧序列
sendbuf[9] = taskData->music_sum;
sendbuf[9] = 0x00;
//发送帧
printf("发送歌曲结束列表");
JZsdk_Uart_UartSend_NotTask(taskData->UartPort ,sendbuf, send_buf_len);
... ... @@ -397,6 +397,7 @@ static void JZsdk_Uart_SentDeal_Reply_Musiclist_Task(void *data)
taskData = NULL;
}
//发送歌曲列表Ⅰ型
T_JZsdkReturnCode JZsdk_Uart_SentDeal_Reply_Musiclist(int UartPort ,int FrameSequence, int music_sum ,char **MusicName ,int *MusicNameLength)
{
struct JZsdk_MusicListSentStruct *musicList = (struct JZsdk_MusicListSentStruct *)malloc(sizeof(struct JZsdk_MusicListSentStruct));
... ... @@ -422,6 +423,85 @@ T_JZsdkReturnCode JZsdk_Uart_SentDeal_Reply_Musiclist(int UartPort ,int FrameSeq
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//发送歌曲列表开始帧
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioList_Start(int Uartport, int FrameSequence, int music_sum)
{
printf("发送歌曲开始列表帧\n");
unsigned char sendbuf[128];
int send_buf_len;
//获取帧样板
memset(sendbuf,0,sizeof(sendbuf));
JZsdk_GetFrameTemplate(JZ_INSCODE_5BFRAME_MUSICLIST_START , sendbuf, &send_buf_len);
//写入数据
sendbuf[6] = FrameSequence; //帧序列
sendbuf[9] = music_sum;
//发送帧
JZsdk_Uart_UartSend_NotTask(Uartport ,sendbuf, send_buf_len);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//发送歌曲列表结束帧
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioList_Stop(int Uartport, int FrameSequence)
{
printf("发送歌曲结束列表帧\n");
unsigned char sendbuf[128];
int send_buf_len;
//获取帧样板
memset(sendbuf,0,sizeof(sendbuf));
JZsdk_GetFrameTemplate(JZ_INSCODE_5BFRAME_MUSICLIST_STOP , sendbuf, &send_buf_len);
//写入数据
sendbuf[6] = FrameSequence; //帧序列
JZsdk_Uart_UartSend_NotTask(Uartport ,sendbuf, send_buf_len);
}
//发送歌曲列表Ⅱ型
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioList_2(int Uartport, int FrameSequence, unsigned char *name, unsigned int namelen, unsigned int Filesize, unsigned int Time)
{
printf("发送歌曲列表Ⅱ型 %s %d %d %d\n",name, namelen, Filesize, Time);
unsigned char sendbuf[400];
int send_buf_len;
//1、获取帧样板
JZsdk_GetFrameTemplate(JZ_INSCODE_5BFRAME_MUSICLIST_TRANS_2 , sendbuf, &send_buf_len);
//写入文件名
sendbuf[9] = namelen;
memcpy(&sendbuf[10], name, namelen);
//文件大小
sendbuf[10+namelen] = (Filesize >> 24) & 0xFF;
sendbuf[10+namelen+1] = (Filesize >> 16) & 0xFF;
sendbuf[10+namelen+2] = (Filesize >> 8) & 0xFF;
sendbuf[10+namelen+3] = Filesize & 0xFF;
//播放时间
sendbuf[10+namelen+4] = (Time >> 8) & 0xFF;
sendbuf[10+namelen+5] = Time & 0xFF;
//2、写入数据
send_buf_len = 9 + 1 + namelen + 4 + 2 + 2;
sendbuf[3] = (unsigned char)( (send_buf_len >> 8) & 0xFF); //帧长度
sendbuf[4] = (unsigned char)(send_buf_len & 0xFF); //帧长度
sendbuf[6] = FrameSequence; //帧序列
sendbuf[send_buf_len-2] = 0x00;
sendbuf[send_buf_len-1] = 0x23;
//3、发送帧
JZsdk_Uart_UartSend_NotTask(Uartport ,sendbuf, send_buf_len);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//发送音频详细信息帧
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioDetailMessage(int Uartport, int FrameSequence, unsigned char type ,unsigned char *data, unsigned int datalen)
{
... ... @@ -681,9 +761,6 @@ int JZsdk_Uart_SendDeal_Set_GimbalPitchAngle(int Uartport ,int angle)
//1、获取帧样板
JZsdk_GetFrameTemplate(JZ_INSCODE_5AFRAME_GIMBAL_PITCH_CONTROL, sendbuf, &send_buf_len);
//char sendbuf[14] = {0x5A ,0x5A ,0x77 ,0x00 ,0x0E ,0x00 ,0x00 ,0x64 ,0x51 ,0x00 ,0x00 ,0x00 ,0x00 ,0x23};
//send_buf_len = 14;
//2、写入数据
if (angle < 0)
{
... ...
... ... @@ -46,7 +46,12 @@ T_JZsdkReturnCode JZsdk_Uart_SendDeal_Reply_DecodeError(int Uartport ,int FrameS
int JZsdk_Uart_SendDeal_Reply_Failure(int Uartport ,int FrameSequence);
T_JZsdkReturnCode JZsdk_Uart_SentDeal_Reply_Musiclist(int UartPort ,int FrameSequence, int music_sum ,char **MusicName ,int *MusicNameLength);
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioList_2(int Uartport, int FrameSequence, unsigned char *name, unsigned int namelen, unsigned int Filesize, unsigned int Time);
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioDetailMessage(int Uartport,int FrameSequence, unsigned char type ,unsigned char *data, unsigned int datalen);
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioList_Start(int Uartport, int FrameSequence, int music_sum);
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioList_Stop(int Uartport, int FrameSequence);
int JZsdk_Uart_SendDeal_Send_PlayStatus_end(int Uartport);
int JZsdk_Uart_SendDeal_Send_PlayStatus(int Uartport ,int num);
... ...
... ... @@ -36,7 +36,7 @@ struct FF_Filter
}FF_Filter;
static int g_FilterFlag = JZ_FLAGCODE_ON;
static int g_FilterFlag = JZ_FLAGCODE_OFF;
static int FilterParamNumber = 0;
static int g_FilterMode = 0; //滤波模式 0为默认 1为m30
static int g_FilterType = 0; //滤波类型 0为默认
... ...
... ... @@ -2,6 +2,7 @@
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <math.h>
#include "JZsdkLib.h"
... ...
... ... @@ -42,6 +42,9 @@ static int g_JZsdk_GimbalStatusFlag = JZ_FLAGCODE_OFF; //云台状态,用于
static T_JZsdkReturnCode Gimbal_Set_RealPitchAngle(int pitch, int FineTuningP, int UAV_pitch);
//手动刷新角度标志位
static int g_Flush_Pitch = JZ_FLAGCODE_OFF;
/**************************
*
*
... ... @@ -64,11 +67,13 @@ static void *Gimbal_SendAngleTask(void *arg)
if (Gimbal_PitchAngle != Old_angle //云台角度发生了变化
|| Gimbal_UavSelfPitch != Old_UAV_self_angle //飞机自身角度发生了变化
|| g_MotorFineTuningPitch != Old_PitchFineTuning //微调角度发生了变化
|| g_Flush_Pitch == JZ_FLAGCODE_ON
)
{
Old_angle = Gimbal_PitchAngle;
Old_UAV_self_angle = Gimbal_UavSelfPitch;
Old_PitchFineTuning = g_MotorFineTuningPitch;
g_Flush_Pitch = JZ_FLAGCODE_OFF;
Gimbal_Set_RealPitchAngle(Old_angle, Old_PitchFineTuning, Old_UAV_self_angle);
}
... ... @@ -103,6 +108,8 @@ static T_JZsdkReturnCode Gimal_MotorInit()
//数据处理初始化
Gimbal_DataDeal_init();
JZSDK_LOG_INFO("MODULE_GIMBAL_MOTOR_INIT_COMPLETE");
}
//初始化云台模块
... ... @@ -239,23 +246,25 @@ T_JZsdkReturnCode Gimbal_Set_PitchFineTuning(int pitch)
}
//设置本地微调值
g_MotorFineTuningPitch = g_MotorFineTuningPitch + pitch;
//组合机是发到另外一个设备
#if DEVICE_VERSION == JZ_H1T
JZsdk_Uart_Send_SetGimbalFineTuningPitch(UART_DEV_1, g_MotorFineTuningPitch);
#else
int temp_pitch = g_MotorFineTuningPitch + pitch;
//微调值要小于20度
if (g_MotorFineTuningPitch >= 200)
if (temp_pitch >= 200)
{
g_MotorFineTuningPitch = 200;
temp_pitch = 200;
}
if (g_MotorFineTuningPitch <= -200)
if (temp_pitch <= -200)
{
g_MotorFineTuningPitch = -200;
temp_pitch = -200;
}
g_MotorFineTuningPitch = temp_pitch;
//组合机是发到另外一个设备
#if DEVICE_VERSION == JZ_H1T
JZsdk_Uart_Send_SetGimbalFineTuningPitch(UART_DEV_1, g_MotorFineTuningPitch);
#else
//存储到文件
MotorFineTuning_WritePitch(g_MotorFineTuningPitch);
#endif
... ... @@ -542,4 +551,11 @@ int Gimbal_Get_PitchFineTuning()
int Gimbal_Get_PitchRealPitchAngle()
{
return Gimbal_RealPitchAngle;
}
T_JZsdkReturnCode Gimbal_Flush_Pitch()
{
g_Flush_Pitch = JZ_FLAGCODE_ON;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -53,6 +53,7 @@ int Gimbal_ReplyPitchToUAVScale(int angle);
int Gimbal_Get_PitchAngle();
int Gimbal_Get_PitchFineTuning();
int Gimbal_Get_PitchRealPitchAngle();
T_JZsdkReturnCode Gimbal_Flush_Pitch();
#ifdef __cplusplus
}
... ...
... ... @@ -10,15 +10,23 @@
#include "JZsdk_TaskManagement/TaskManagement.h"
#include "Gimbal_SpecialUart/Gimbal_SpecialUart.h"
#include "../Gimbal_Param.h"
#if WIRINGPI_STATUS == VERSION_SWITCH_ON
#include <wiringPi.h>
#endif
#define PITCH_OFFSET_FILE_PATH "/root/Gimbal_Pitch_BaseOffset"
static T_JZsdkReturnCode Gimbal_DataDeal_Read_PitchBaseOffset(int *offset);
static T_JZsdkReturnCode Gimbal_DataDeal_Write_PitchBaseOffset(int offset);
static int g_Gimbal_Pitch_BaseOffset = 0; //云台俯仰基准偏移量
/******************
*
* 初始化
*
* **************/
T_JZsdkReturnCode Gimbal_DataDeal_init()
... ... @@ -37,7 +45,12 @@ T_JZsdkReturnCode Gimbal_DataDeal_init()
//不需特地初始化
#elif DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_C1
// 不用去特地初始化t60的云台
#elif DEVICE_VERSION == JZ_H10 || DEVICE_VERSION == JZ_H10T || DEVICE_VERSION == JZ_U3 \
#elif DEVICE_VERSION == JZ_H10 || DEVICE_VERSION == JZ_H10T
//H10 H10T需要去读取云台偏移量
Gimbal_DataDeal_Read_PitchBaseOffset(&g_Gimbal_Pitch_BaseOffset);
#elif DEVICE_VERSION == JZ_U3 \
|| DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 || DEVICE_VERSION == TF_A1
//设置0度
... ... @@ -66,33 +79,35 @@ T_JZsdkReturnCode Gimbal_DataDeal_SetRealAngle(int angle)
Gimbal_SpecialUart_UartSend(send_angle, 4);
#elif DEVICE_VERSION == JZ_H10
int base = 200;
//完整计算公式
//angle_PWM = base + angle*195/((abs(MAX_PITCH)+abs(MIN_PITCH)))
//因为PWM写的时候是按90度写的,所以分母是900,不是设定的600
int base_offset = g_Gimbal_Pitch_BaseOffset;
//最大最小值的偏移量 //正整数时,则总体角度向0偏移 为负数时,向-900便宜
//计算方法 设置最小角度时 为 PwM - 195 - 200 //设置最大角度时 为 PwM - 0 - 200
int base = 200; //0度
//简化为
angle_PWM = base + angle*195/MIN_PITCH;
//每43.5对饮20度
//完整计算公式
//angle_PWM = base + angle*195/((abs(MAX_PITCH) + abs(MIN_PITCH)))
//上调15度
//angle_PWM = 200 -angle*195/900 -150*195/900; //上调15度
#if WIRINGPI_STATUS == VERSION_SWITCH_ON
pwmWrite(18,angle_PWM);
//简化为
//angle_PWM =base + base_offset +angle*195/MIN_PITCH;
angle_PWM =base + base_offset +angle*195/(-900);
#ifdef WIRINGPI_STATUS_ON
H3_ircut_pwm(angle_PWM);
#endif
#elif DEVICE_VERSION == JZ_H10T
//因为PWM写的时候是按90度写的,所以分母是900,不是设定的600
PWM_num = ( angle * (V3S_H10T_angle_PWM_MAX-V3S_H10T_angle_PWM_MIN) /900 ) + V3S_H10T_angle_PWM_MAX;
int base_offset = g_Gimbal_Pitch_BaseOffset;
int base = 820;
if (PWM_num > PITCH_PWM_MAX)
{
PWM_num = PITCH_PWM_MAX;
}
if (PWM_num < PITCH_PWM_MIN)
{
PWM_num = PITCH_PWM_MIN;
}
//因为PWM写的时候是按60度写的
angle_PWM = base + base_offset + ( angle * (120) /(MAX_PITCH - MIN_PITCH) );
Ircut_PWM_control(PWM_num);
Ircut_PWM_control(angle_PWM);
#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 \
|| DEVICE_VERSION == TF_A1
... ... @@ -111,7 +126,13 @@ T_JZsdkReturnCode Gimbal_DataDeal_SetRealAngle(int angle)
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/******************************
*
*
* 设置云台最大最小值
*
*
* *******************************/
T_JZsdkReturnCode Gimbal_DataDeal_SetPitchRange(int Range)
{
if (Range != 0xFF && Range != 0x00)
... ... @@ -132,13 +153,117 @@ T_JZsdkReturnCode Gimbal_DataDeal_SetPitchRange(int Range)
Gimbal_SpecialUart_UartSend(set_min_motor, 4);
}
#elif DEVICE_VERSION == JZ_H10
//因为PWM写的时候是按90度写的,所以分母是900,不是设定的600
int base_offset = g_Gimbal_Pitch_BaseOffset;
//在最大的角度弄的
if (Range == 0xFF)
{
//先通过角度 得出目前的PWM值
int angle = Gimbal_Get_PitchRealPitchAngle();
//int angle_PWM =200 + base_offset +angle*195/MIN_PITCH;
int angle_PWM =200 + base_offset +angle*195/(-900);
//通过最大值的计算方式 得出offset值
//g_Gimbal_Pitch_BaseOffset = angle_PWM - ((MAX_PITCH*195)/(MAX_PITCH - MIN_PITCH)) - base_offset;
g_Gimbal_Pitch_BaseOffset = angle_PWM - ((MAX_PITCH*195)/(MAX_PITCH - (-900))) - base_offset;
if (g_Gimbal_Pitch_BaseOffset <= - 100)
{
g_Gimbal_Pitch_BaseOffset = - 100;
}
else if (g_Gimbal_Pitch_BaseOffset >= 100)
{
g_Gimbal_Pitch_BaseOffset = 100;
}
}
//在最小的角度弄的
else if (Range == 0x00)
{
//先通过角度 得出目前的PWM值
int angle = Gimbal_Get_PitchRealPitchAngle();
int angle_PWM =200 + base_offset +angle*195/(-900);
//通过最小值的计算方式 得出offset值
g_Gimbal_Pitch_BaseOffset = angle_PWM - (((MAX_PITCH - (-900))*195)/(MAX_PITCH - (-900)) ) - base_offset;
if (g_Gimbal_Pitch_BaseOffset <= - 100) //最小160
{
g_Gimbal_Pitch_BaseOffset = - 100;
}
else if (g_Gimbal_Pitch_BaseOffset >= 100) //最大420
{
g_Gimbal_Pitch_BaseOffset = 100;
}
}
JZSDK_LOG_INFO("设置pitch的offset值:%d",g_Gimbal_Pitch_BaseOffset);
//写入偏移量
Gimbal_DataDeal_Write_PitchBaseOffset(g_Gimbal_Pitch_BaseOffset);
//还没想好怎么弄
//刷新角度
Gimbal_Flush_Pitch();
#elif DEVICE_VERSION == JZ_H10T
//还没想好怎么弄
//因为PWM写的时候是按90度写的,所以分母是900,不是设定的600
int base_offset = g_Gimbal_Pitch_BaseOffset;
//先通过角度 得出目前的PWM值
int angle = Gimbal_Get_PitchRealPitchAngle();
//在最大的角度弄的
if (Range == 0xFF)
{
//先得出目前pwm值
int angle_PWM = 820 + base_offset + (angle * (120)/(MAX_PITCH - MIN_PITCH)); //820是0度
//通过最大值的计算方式 得出新的offset值
//g_Gimbal_Pitch_BaseOffset = angle_PWM - ((MAX_PITCH*195)/(MAX_PITCH - MIN_PITCH)) - base_offset;
g_Gimbal_Pitch_BaseOffset = angle_PWM - 820 - ((MAX_PITCH*120)/(MAX_PITCH - MIN_PITCH)) - base_offset;
//下限600,上限830
if (g_Gimbal_Pitch_BaseOffset <= - 100)
{
g_Gimbal_Pitch_BaseOffset = - 100;
}
else if (g_Gimbal_Pitch_BaseOffset >= 20)
{
g_Gimbal_Pitch_BaseOffset = 20;
}
}
//在最小的角度弄的
else if (Range == 0x00)
{
//先通过角度 得出目前的PWM值
int angle = Gimbal_Get_PitchRealPitchAngle();
int angle_PWM = 820 + base_offset + (angle * (120)/(900)); //820是0度
//通过最小值的计算方式 得出offset值
g_Gimbal_Pitch_BaseOffset = angle_PWM - 820 - ((MAX_PITCH*120)/(MAX_PITCH - MIN_PITCH)) - base_offset;
//下限600,上限830
if (g_Gimbal_Pitch_BaseOffset <= - 100)
{
g_Gimbal_Pitch_BaseOffset = - 100;
}
else if (g_Gimbal_Pitch_BaseOffset >= 20)
{
g_Gimbal_Pitch_BaseOffset = 20;
}
}
JZSDK_LOG_INFO("设置pitch的offset值:%d",g_Gimbal_Pitch_BaseOffset);
//写入偏移量
Gimbal_DataDeal_Write_PitchBaseOffset(g_Gimbal_Pitch_BaseOffset);
//刷新角度
Gimbal_Flush_Pitch();
#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 \
|| DEVICE_VERSION == TF_A1
... ... @@ -162,3 +287,72 @@ T_JZsdkReturnCode Gimbal_DataDeal_SetPitchRange(int Range)
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_JZsdkReturnCode Gimbal_DataDeal_Read_PitchBaseOffset(int *offset)
{
FILE *fp = NULL;
fp = fopen(PITCH_OFFSET_FILE_PATH, "rb+");
if (fp == NULL)
{
fp = fopen(PITCH_OFFSET_FILE_PATH, "wb+");
if (fp == NULL)
{
*offset = 0;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
}
else
{
int ret = fseek(fp, 0, SEEK_SET);
if (ret != 0)
{
JZSDK_LOG_ERROR("Seek count file error, ret: %d.", ret);
}
ret = fread((int *) offset, 1, sizeof(int), fp);
if (ret != sizeof(int))
{
JZSDK_LOG_ERROR("Read Pitch BaseOffset error.");
*offset = 0;
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
JZSDK_LOG_ERROR("Pitch BaseOffset=%d",*offset);
*offset = 0;
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
if (fp != NULL)
{
fclose(fp);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_JZsdkReturnCode Gimbal_DataDeal_Write_PitchBaseOffset(int offset)
{
FILE *fp = NULL;
fp = fopen(PITCH_OFFSET_FILE_PATH, "wb+");
if (fp == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
int ret = fwrite((int *) &offset, 1, sizeof(unsigned int),fp);
if (ret != sizeof(unsigned int))
{
JZSDK_LOG_ERROR("Pitch BaseOffset error.");
}
else
{
JZSDK_LOG_DEBUG("Pitch BaseOffset=%d\n",offset);
}
fclose(fp);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
... ... @@ -36,6 +36,7 @@ T_JZsdkReturnCode Gimbal_DataDeal_init(); //初始化
T_JZsdkReturnCode Gimbal_DataDeal_SetRealAngle(int angle);
T_JZsdkReturnCode Gimbal_DataDeal_SetPitchRange(int Range);
T_JZsdkReturnCode Read_MotorFineTuning_Pitch(int *value);
T_JZsdkReturnCode Gimbal_DataDeal_Write_PitchBaseOffset(int offset);
#ifdef __cplusplus
}
... ...
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "H3_ircut.h"
#include "version_choose.h"
#if WIRINGPI_STATUS == VERSION_SWITCH_ON
#include <wiringPi.h>
#include "./H3_ircut.h"
#include "BaseConfig.h"
//如果wiringPi库安装了,则使用wiringPi库,否则使用sysfs
#ifdef WIRINGPI_STATUS_ON
#include <wiringPi.h>
#endif
#define AC 7
#define AC2 19
int now_ircut_mode=0;
#define AMPLIFIER_IRCUT_PIN_1 7
#define AMPLIFIER_IRCUT_PIN_2 19
#define MOTOR_IRCUT_PIN 18
//sys方案输入,未进行测试
int gpio_test_in(unsigned int gpio_chip_num, unsigned int gpio_offset_num)
{
FILE *fp;
... ... @@ -62,7 +66,7 @@ int gpio_test_in(unsigned int gpio_chip_num, unsigned int gpio_offset_num)
return (int)(buf[0]-48);
}
//���ܣ�����GPIO���
//sys方案输入,未进行测试
int gpio_test_out(unsigned int gpio_chip_num, unsigned int gpio_offset_num,unsigned int gpio_out_val)
{
FILE *fp;
... ... @@ -116,60 +120,79 @@ int gpio_test_out(unsigned int gpio_chip_num, unsigned int gpio_offset_num,unsig
return 0;
}
void set_mute(int mutemode){//��������
if(mutemode==1)
{//ȡ������
//gpio_test_out(1,2,1);//gpio1_2 �����
}
if(mutemode==0)
{//����
//gpio_test_out(1,2,0);//gpio1_2 �����
}
else{
printf("mutemode error\n");
}
}
/********************
*
*
* H3引脚初始化
*
*
* ****************/
T_JZsdkReturnCode H3_ircut_init()
{
#ifdef WIRINGPI_STATUS_ON
//wiringPi库的初始化
wiringPiSetup() ;
//静音引脚初始化
pinMode (AMPLIFIER_IRCUT_PIN_1, OUTPUT) ;
digitalWrite(AMPLIFIER_IRCUT_PIN_1,LOW);
pinMode (AMPLIFIER_IRCUT_PIN_2, OUTPUT) ;
digitalWrite(AMPLIFIER_IRCUT_PIN_2,LOW);
//H10要初始化电机引脚
if (DEVICE_VERSION == JZ_H10)
{
pinMode(MOTOR_IRCUT_PIN,PWM_OUTPUT);//设置输出模式
}
JZSDK_LOG_INFO("H3 Init Complete");
void H3_init_amplifier(void)
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/***********************
*
*
* H3 pwm控制
*
* ***************************/
T_JZsdkReturnCode H3_ircut_pwm(int pwm_duty)
{
#if WIRINGPI_STATUS == VERSION_SWITCH_ON
wiringPiSetup() ; //��ʼ��GPIO
pinMode (AC, OUTPUT) ;//�������ģʽ
digitalWrite(AC,LOW);
pinMode (AC2, OUTPUT) ;//�������ģʽ
digitalWrite(AC2,LOW);
#ifdef WIRINGPI_STATUS_ON
pwmWrite(MOTOR_IRCUT_PIN,pwm_duty);
//printf("pwm控制:%d\n",pwm_duty);
#endif
}
void H3_set_amplifier(int amplifier_mode){
#if WIRINGPI_STATUS == VERSION_SWITCH_ON
if(amplifier_mode==1)
{//���Ŵ�
if(now_ircut_mode==0){
digitalWrite(AC,HIGH);//gpio1_3 �����
digitalWrite(AC2,HIGH);//gpio1_3 �����
now_ircut_mode=1;
printf("open!!!\n");
}
//gpio_test_out(1,2,1);//gpio1_2 �����
return;
}
if(amplifier_mode==0)
{//���Źر�
if(now_ircut_mode==1){
digitalWrite(AC,LOW);
digitalWrite(AC2,LOW);//gpio1_3 �����
now_ircut_mode=0;
printf("close!!!\n");
}
//gpio_test_out(1,2,0);//gpio1_2 �����
return;
}
else{
printf("amplifier_mode error\n");
return;
}
/***********************
*
* H3引脚控制
* 静音角控制
*
* *******************/
T_JZsdkReturnCode H3_ircut_set_amplifier(int ircut_mode)
{
#ifdef WIRINGPI_STATUS_ON
if (ircut_mode == JZ_FLAGCODE_ON)
{
digitalWrite(AMPLIFIER_IRCUT_PIN_1,HIGH);
digitalWrite(AMPLIFIER_IRCUT_PIN_2,HIGH);
}
else if (ircut_mode == JZ_FLAGCODE_OFF)
{
digitalWrite(AMPLIFIER_IRCUT_PIN_1,LOW);
digitalWrite(AMPLIFIER_IRCUT_PIN_2,LOW);
}
else
{
JZSDK_LOG_ERROR("H3引脚控制错误");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
#endif
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file
*
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef H3_IRCUT_H
#define H3_IRCUT_H
#include <stdio.h>
#include <stdint.h>
int gpio_test_in(unsigned int gpio_chip_num, unsigned int gpio_offset_num);
int gpio_test_out(unsigned int gpio_chip_num, unsigned int gpio_offset_num,unsigned int gpio_out_val);
void set_mute(int mutemode);//�������ܣ�0���� 1�رվ���
void H3_set_amplifier(int amplifier_mode);//���ſ��� 0�ر� 1��
void H3_init_amplifier(void);
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode H3_ircut_init();
T_JZsdkReturnCode H3_ircut_set_amplifier(int ircut_mode);
T_JZsdkReturnCode H3_ircut_pwm(int pwm_duty);
#ifdef __cplusplus
}
#endif
#endif //IRCUT_H
\ No newline at end of file
#endif
... ...
#include "Ircut_H3_H10.h"
#include "version_choose.h"
#include <stdio.h>
#if WIRINGPI_STATUS == VERSION_SWITCH_ON
#include <wiringPi.h>
#endif
#define AC 7
#define AC2 19
#define MOTOR 18
int H3_H10_now_ircut_mode=0;
int H3_H10_Gimbal_IrcutInit()
{
#if WIRINGPI_STATUS == VERSION_SWITCH_ON
pinMode(MOTOR,PWM_OUTPUT);//设置输出模式
#endif
}
void H3_H10_init_amplifier(void)
{
#if WIRINGPI_STATUS == VERSION_SWITCH_ON
pinMode (AC, OUTPUT) ;//�������ģʽ
digitalWrite(AC,LOW);
pinMode (AC2, OUTPUT) ;//�������ģʽ
digitalWrite(AC2,LOW);
#endif
}
int H3_H10_IrcutInit()
{
printf("正在进行H3_H10的引脚初始化\n");
#if WIRINGPI_STATUS == VERSION_SWITCH_ON
//wiringPi库的初始化
wiringPiSetup() ;
//声音引脚初始化
H3_H10_init_amplifier();
//电机引脚初始化
H3_H10_Gimbal_IrcutInit();
printf("H3_H10引脚初始化完成\n");
#endif
}
void H3_H10_set_amplifier(int amplifier_mode)
{
#if WIRINGPI_STATUS == VERSION_SWITCH_ON
if(amplifier_mode==1)
{//���Ŵ�
if(H3_H10_now_ircut_mode==0){
digitalWrite(AC,HIGH);//gpio1_3 �����
digitalWrite(AC2,HIGH);//gpio1_3 �����
H3_H10_now_ircut_mode=1;
printf("open!!!\n");
}
//gpio_test_out(1,2,1);//gpio1_2 �����
return;
}
if(amplifier_mode==0)
{//���Źر�
if(H3_H10_now_ircut_mode==1){
digitalWrite(AC,LOW);
digitalWrite(AC2,LOW);//gpio1_3 �����
H3_H10_now_ircut_mode=0;
printf("close!!!\n");
}
//gpio_test_out(1,2,0);//gpio1_2 �����
return;
}
else{
printf("amplifier_mode error\n");
return;
}
#endif
}
#ifndef IRCUT_H3_H10_H
#define IRCUT_H3_H10_H
void H3_H10_set_amplifier(int amplifier_mode);
int H3_H10_IrcutInit();
#endif
\ No newline at end of file
... ... @@ -2,14 +2,13 @@
#include "version_choose.h"
#include "./V3s_ircut/V3s_ircut.h"
#include "./H3_ircut/H3_ircut.h"
#include "./H3_ircut/Ircut_H3_H10/Ircut_H3_H10.h"
#include "ircut.h"
#include "JZsdkLib.h"
static int OutPutPower = JZ_FLAGCODE_OFF;
void Ircut_Init()//引脚初始化
T_JZsdkReturnCode Ircut_Init()//引脚初始化
{
if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T ||
DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30||
... ... @@ -18,13 +17,9 @@ void Ircut_Init()//引脚初始化
V3s_Ircut_Init();
}
else if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T)
else if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T || DEVICE_VERSION == JZ_H10)
{
H3_init_amplifier();
}
else if (DEVICE_VERSION == JZ_H10)
{
H3_H10_IrcutInit();
H3_ircut_init();
}
else if (DEVICE_VERSION == JZ_C1)
{
... ... @@ -38,19 +33,23 @@ void Ircut_Init()//引脚初始化
}
JZSDK_LOG_INFO("MODULE_IRCUT_INIT_COMPLETE");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
int Ircut_uInit()
T_JZsdkReturnCode Ircut_uInit()
{
if (DEVICE_VERSION == JZ_H1E)
{
V3s_Ircut_uInit();
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//功放开关
void set_amplifier(int amplifier_mode)
T_JZsdkReturnCode set_amplifier(int amplifier_mode)
{
if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T ||
DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 ||
... ... @@ -59,15 +58,12 @@ void set_amplifier(int amplifier_mode)
V3s_set_amplifier(amplifier_mode);
}
if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T)
if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T || DEVICE_VERSION == JZ_H10)
{
H3_set_amplifier(amplifier_mode);
H3_ircut_set_amplifier(amplifier_mode);
}
if (DEVICE_VERSION == JZ_H10)
{
H3_H10_set_amplifier(amplifier_mode);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//PWM控制
... ... @@ -77,7 +73,6 @@ int Ircut_PWM_control(int pwm_num)
{
V3s_PWM_contrl(pwm_num);
}
}
//对外电源控制
... ...
... ... @@ -25,9 +25,9 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
void Ircut_Init();
int Ircut_uInit() ;
void set_amplifier(int amplifier_mode);
T_JZsdkReturnCode Ircut_Init();
T_JZsdkReturnCode Ircut_uInit() ;
T_JZsdkReturnCode set_amplifier(int amplifier_mode);
int Ircut_PWM_control(int pwm_num);
T_JZsdkReturnCode Ircut_Set_OutPutPower_Control(int value);
T_JZsdkReturnCode Ircut_CheckStatus_OutPutPower(int *value);
... ...
... ... @@ -386,8 +386,8 @@ T_JZsdkReturnCode Lighting_Obtain_WarningLight_Color(int color1, int color2)
//获取探警灯颜色
T_JZsdkReturnCode Lighting_Get_WarningLight_Color(int *color1, int *color2)
{
*color1 = WarningLight_Status;
*color2 = WarningLight_Mode;
*color1 = WarningLight_Color1;
*color2 = WarningLight_Color2;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -406,7 +406,7 @@ T_JZsdkReturnCode Lighting_CheckStatus_WarningLightColor(int *ValueColor1, int *
}
//2、获取一次本地探警灯颜色
Lighting_Get_WarningLight_Status(ValueColor1, ValueColor2);
Lighting_Get_WarningLight_Color(ValueColor1, ValueColor2);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
... ... @@ -5,22 +5,20 @@
#include <unistd.h>
#include "JZsdkLib.h"
#include "version_choose.h"
#include "BaseConfig.h"
#include "../V4L2_camera/V4L2_Record.h"
#include "../../StreamProc/StreamProc.h"
#include "../V4L2_camera/V4L2_CameraParameterSetting.h"
#include "../../MultProc/MultProc.h"
#include "../../MediaParm.h"
#include "../../VideoMgmt/VideoMgmt.h"
#include "../../StreamProc/StreamProc.h"
#include "Ircut/ircut.h"
#include "../Camera.h"
#include "UI_control/UI_control.h"
static int CameraFd = 0;
//光学相机数据读取线程
static void *JZsdk_Cam_Data_Thread(void *args)
//多线程抓取数据线程
static void *JZsdk_Catch_MultiThread(void *args)
{
while (1)
{
... ... @@ -30,13 +28,15 @@ static void *JZsdk_Cam_Data_Thread(void *args)
//从相机中读取一张照片
V4L2_CameraFrameRecord_OnlyGetFrame(&buf, &buf_size);
//printf("read: len:%d data[3]:%x data[4]:%x\n", buf_size, buf[3], buf[4]);
if (buf == NULL)
{
JZSDK_LOG_ERROR("相机数据读取失败");
continue;
}
//放入缓冲池
//放入缓冲池 //将数据放入缓冲池,从而被其他线程使用
VideoMgmt_write_data(&VideoMgmt_FirstVideo_index, buf, buf_size);
//归还图片
... ... @@ -44,30 +44,68 @@ static void *JZsdk_Cam_Data_Thread(void *args)
}
}
//150st相机初始化
T_JZsdkReturnCode JZsdk_H150ST_CameraInit(int width, int height, int frame_num)
//单线程抓取数据线程
static void *JZsdk_Catch_SingleThread(void *args)
{
T_JZsdkReturnCode ret;
while (1)
{
unsigned int buf_size = 0;
unsigned char *buf = NULL;
//从相机中读取一张照片
V4L2_CameraFrameRecord_OnlyGetFrame(&buf, &buf_size);
//初始化摄像头
ret = V4l2_Camarainit2(&CameraFd,width,height,frame_num);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
return ret;
//printf("read: len:%d data[3]:%x data[4]:%x\n", buf_size, buf[3], buf[4]);
if (buf == NULL)
{
JZSDK_LOG_ERROR("相机数据读取失败");
continue;
}
//进行数据处理
VideoMgmt_Single_FrameIn(buf, buf_size);
//归还图片
V4L2_CameraFrameRecord_OnlyReturnFrame();
}
}
/******************************
*
* 相机抓取初始化
* ThreadMode: 0为单线程 1为多线程
*
* ******************************/
T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode)
{
T_JZsdkReturnCode ret;
//初始化数据接收线程
pthread_t ReadDataTask;
pthread_attr_t task_attribute; //线程属性
pthread_attr_init(&task_attribute); //初始化线程属性
pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Cam_Data_Thread,NULL); //线程
if(opus_Protection != 0)
{
JZSDK_LOG_ERROR("创建v4l2线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
if (ThreadMode == 0)
{
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_SingleThread,NULL); //线程
if(opus_Protection != 0)
{
JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
else if (ThreadMode == 1)
{
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_MultiThread,NULL); //线程
if(opus_Protection != 0)
{
JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file H150ST_Cam.h
* H150ST_Cam.h 的头文件
* @file Cam_FrameCatch.h
* Cam_FrameCatch.c 的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef H150ST_CAM_H
#define H150ST_CAM_H
#ifndef CAM_FRAMECATCH_H
#define CAM_FRAMECATCH_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
... ... @@ -24,7 +24,7 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_H150ST_CameraInit(int width, int height, int frame_num);
T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode);
... ...
... ... @@ -14,6 +14,12 @@
#include "MediaProc/IRC_funtion/IRC_funtion.h"
#include "./V4L2_camera/V4L2_CameraParameterSetting.h"
#include "./V4L2_camera/V4L2_Record.h"
#include "./Cam_FrameCatch/Cam_FrameCatch.h"
static int g_CameraFd = 0; //摄像头文件描述符
static int PseudoColor = JZ_FLAGCODE_OFF; //伪彩颜色
static int PixelColorMode = JZ_FLAGCODE_OFF; //像素颜色模式
... ... @@ -25,6 +31,42 @@ int g_CameraRegionBox_FirstPixel[2] = {0, 0}; // 初始化第一点坐标(x, y)
int g_CameraRegionBox_SecondPixel[2] = {0, 0}; // 初始化第二点坐标(x, y)为(0, 0)
int g_CameraRegionBox_ClickTime = 0;
/******************************
*
* 相机初始化
* ThreadMode: 0为单线程 1为多线程
* width: 宽
* height: 高
* frame_num: 帧数
*
* ******************************/
T_JZsdkReturnCode Camera_Init(int ThreadMode, int width, int height, int frame_num)
{
T_JZsdkReturnCode ret;
//初始化摄像头
ret = V4l2_Camarainit2(&g_CameraFd,width,height,frame_num);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
return ret;
}
#if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
//初始化摄像头参数
ret = V4L2_Parameter_Setting(g_CameraFd);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("摄像头参数调整失败");
return ret;
}
#endif
//根据线程模式初始化抓取和初步处理的线程
JZsdk_FrameCatch_Init(ThreadMode);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//快门开关
/***********************************
... ... @@ -93,6 +135,8 @@ T_JZsdkReturnCode JZsdk_Camera_GasEnhancementCorrectSwitch()
* ******************/
T_JZsdkReturnCode Camera_RegionBox(unsigned int PointX, unsigned int PointY)
{
printf("设置框选点X:%d Y:%d\n",PointX,PointY);
//1、检查该点是否合法
#if DEVICE_VERSION == JZ_C1
//红外相机下的坐标参数是0~319 0~255
... ... @@ -100,11 +144,7 @@ T_JZsdkReturnCode Camera_RegionBox(unsigned int PointX, unsigned int PointY)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
#endif
printf("设置框选点X:%d Y:%d\n",PointX,PointY);
//如果本次操作是画第一个点
if (g_CameraRegionBox_ClickTime+1 == 1)
{
... ... @@ -129,7 +169,8 @@ T_JZsdkReturnCode Camera_RegionBox(unsigned int PointX, unsigned int PointY)
{
g_CameraRegionBox_ClickTime=0;
IRC_Set_RegionMode(0);
}
}
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
... ... @@ -32,7 +32,8 @@ T_JZsdkReturnCode JZsdk_Camera_BadPixelSwitch();
T_JZsdkReturnCode JZsdk_CameraSPC_ResetSwitch();
T_JZsdkReturnCode JZsdk_Camera_GasEnhancementCorrectSwitch();
T_JZsdkReturnCode JZsdk_H150ST_CameraInit(int width, int height, int frame_num);
T_JZsdkReturnCode Camera_Init(int ThreadMode, int width, int height, int frame_num);
#ifdef __cplusplus
}
... ...
... ... @@ -11,10 +11,9 @@
#include "JZsdk_usb_bulk/JZsdk_usb_bulk.h"
#include "../V4L2_camera/V4L2_Record.h"
#include "../../StreamProc/StreamProc.h"
#include "../../MultProc/MultProc.h"
#include "../../MediaParm.h"
#include "../../VideoMgmt/VideoMgmt.h"
#include "../../StreamProc/StreamProc.h"
#include "Ircut/ircut.h"
#include "../Camera.h"
... ... @@ -238,17 +237,25 @@ static void *JZsdk_Kt_Irc_DataDeal_Thread(void *args)
//4、将原始码流数据转换成h264流,为避免多次复制,这里的h264会直接放入视频流管理的缓冲区
JZsdk_RTKMMP_RawData_to_h264(raw_data, raw_data_len);
//5、释放内存
if (raw_data != NULL)
{
if (raw_data != NULL)
{
free(raw_data);
raw_data = NULL;
raw_data = NULL;
}
if (gary_data != NULL)
{
}
if (gary_data != NULL)
{
free(gary_data);
gary_data = NULL;
gary_data = NULL;
}
}
//JZSDK_LOG_DEBUG("得到了一帧红外h264");
}
... ...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <getopt.h> /* getopt_long() */
#include <fcntl.h> /* low-level i/o */
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include "./V4L2_CameraParameterSetting.h"
#include "JZsdkLib.h"
#include "MediaProc/MediaParm.h"
T_JZsdkReturnCode V4L2_Parameter_Setting(int cam_fd)
{
struct v4l2_control ctrl;
//设置亮度*
ctrl.id= V4L2_CID_BRIGHTNESS;
ctrl.value = BRIGHTNESS;
if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
{
JZSDK_LOG_INFO("相机亮度设置失败");
}
//设置对比度
ctrl.id = V4L2_CID_CONTRAST;
ctrl.value= CONTRAST;
if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
{
JZSDK_LOG_INFO("相机对比度设置失败");
}
//设置饱和度
ctrl.id = V4L2_CID_SATURATION;
ctrl.value= SATURATION;
if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
{
perror("相机饱和度设置失败");
}
/*
//设置色度
ctrl.id = V4L2_CID_HUE;
ctrl.value = 1;
if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
{
perror("ioctl");
exit(EXIT_FAILURE);
}
//设置手动白平衡
ctrl.id = V4L2_CID_AUTO_WHITE_BALANCE;
ctrl.value = V4L2_WHITE_BALANCE_MANUAL ;
if(ioctl(cam_fd,VIDIOC_G_CTRL,&ctrl)==-1)
{
perror("ioctl");
exit(EXIT_FAILURE);
}
//设置白平衡色温
ctrl.id = V4L2_CID_WHITE_BALANCE_TEMPERATURE;
ctrl.value = 5100;
if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
{
perror("ioctl");
exit(EXIT_FAILURE);
}
//设置锐度
ctrl.id = V4L2_CID_SHARPNESS;
ctrl.value = 4;
if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
{
perror("ioctl");
exit(EXIT_FAILURE);
}
//设置背光补偿
ctrl.id = V4L2_CID_BACKLIGHT_COMPENSATION;
ctrl.value = 3;
if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
{
perror("ioctl");
exit(EXIT_FAILURE);
}
//设置伽玛值
ctrl.id = V4L2_CID_GAMMA;
ctrl.value = 120;
if(ioctl(cam_fd,VIDIOC_S_CTRL,&ctrl)==-1)
{
perror("ioctl");
exit(EXIT_FAILURE);
}
*/
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
/**
********************************************************************
* @file V4L2_CameraParameterSetting.h
* 用于转码拍下来的照片以及视频
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef V4L2_CAMERA_PARAMETER_SETTING_H
#define V4L2_CAMERA_PARAMETER_SETTING_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode V4L2_Parameter_Setting(int cam_fd);
#ifdef __cplusplus
}
#endif
#endif
\ No newline at end of file
... ...
... ... @@ -19,6 +19,7 @@
#include "JZsdkLib.h"
#include "./V4L2_Record.h"
#include "MediaProc/MediaParm.h"
/* Private constants ---------------------------------------------------------*/
// 清空
... ... @@ -42,7 +43,6 @@ static struct v4l2_buffer buf;
static int camera_width;
static int camera_height;
static int camera_record_frame;
#define CAMERA_DEVICE_NAME ("/dev/video21")
//unsigned char* pucVideBuf[4]; // 视频BUFF空间地址
... ... @@ -213,8 +213,7 @@ static int init_device()
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = camera_width;
fmt.fmt.pix.height = camera_height;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
//fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_H264;
fmt.fmt.pix.pixelformat = CAMERA_CATCH_PIXEL;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
//写入格式参数
... ... @@ -288,7 +287,7 @@ T_JZsdkReturnCode V4l2_Camarainit2(int *dev_fd, int width, int height, int frame
ret = open_device();
if (ret != 0)
{
JZSDK_LOG_ERROR("打开摄像头失败");
JZSDK_LOG_ERROR("打开摄像头失败%s", CAMERA_DEVICE_NAME);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
... ...
... ... @@ -6,11 +6,12 @@
#include "./KtLibProc/KtLibProc.h"
#include "./IRC_data_deal/IRC_data_deal.h"
#include "./IRC_Param.h"
#include "../StreamProc/StreamProc.h"
#include "../MultProc/MultProc.h"
#include "../ImageProc/BadPixelProc/BadPixelProc.h"
#include "MediaProc/MediaProc_Param.h"
#include "./IRC_funtion.h"
#include "MediaProc/IRC_funtion/JZIRC_LibProc/JZIRC_Lib.h"
#define IRC_DEALMODE_JZSDK 0
#define IRC_DEALMODE_KTLIB 1
... ...
... ... @@ -828,34 +828,32 @@ T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
break;
default:
if (u16_CorrentData != NULL)
{
free(u16_CorrentData);
u16_CorrentData = NULL;
}
if (GrayImage != NULL)
{
free(GrayImage);
GrayImage = NULL;
}
if (u16_CorrentData != NULL)
{
free(u16_CorrentData);
u16_CorrentData = NULL;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
break;
}
if (u16_CorrentData != NULL)
{
free(u16_CorrentData);
u16_CorrentData = NULL;
}
if (GrayImage != NULL)
{
free(GrayImage);
GrayImage = NULL;
}
if (u16_CorrentData != NULL)
{
free(u16_CorrentData);
u16_CorrentData = NULL;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -3,11 +3,18 @@
#include <string.h>
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include "../IRC_data_deal/IRC_data_deal.h"
#include <vector>
#include "KTv330_CPP.h"
#ifdef KTIRC_LIB_STATUS_ON
#include "KTv330_CPP.h"
#endif
#include "MediaProc/MediaProc_Param.h"
#include "KtLibProc.h"
... ... @@ -15,7 +22,9 @@
#include "../IRC_Param.h"
// 创建一个 ClassKT 类对象
KTv330Space::ClassKT* KtObject = new KTv330Space::ClassKT();
#ifdef KTIRC_LIB_STATUS_ON
KTv330Space::ClassKT* KtObject = new KTv330Space::ClassKT();
#endif
... ... @@ -24,7 +33,7 @@ T_JZsdkReturnCode KtLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
struct IRC_param *dealInfo)
{
T_JZsdkReturnCode ret;
#ifdef KTIRC_LIB_STATUS_ON
// 创建一个存储转换后数据的 vector<int>
std::vector<int> inputDataVector(U16_data, U16_data + U16_dataSize);
... ... @@ -117,12 +126,14 @@ T_JZsdkReturnCode KtLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
T_JZsdkReturnCode KtLib_Init()
{
#ifdef KTIRC_LIB_STATUS_ON
KtObject->KT_M330_InfraredLogin("192.168.1.3", 6666, "192.168.1.2", 6666, 320, 256, 14, NULL, 0, 0);
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
... ... @@ -31,19 +31,35 @@ extern "C" {
#define FIRST_HEIGHT 256
#define FIRST_FRAME_NUM 30
#define BRIGHTNESS (80) //亮度,该摄像头亮度范围为 1-255 默认128
#define CONTRAST (155) //对比度,摄像头对比度范围为 1-255 默认128
#define SATURATION (128) //饱和度 摄像头饱和度范围为 1-255 默认128
#define EXPSURE (100) //曝光值 摄像头曝光值范围: 5-2500 默认auto设置
#define SECOND_WIDTH 1920
#define SECOND_HEIGHT 1080
#define SECOND_FRAME_NUM 30
#define CAMERA_DEVICE_NAME ("/dev/video21")
#define CAMERA_CATCH_PIXEL V4L2_PIX_FMT_MJPEG
#elif DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
#define FIRST_WIDTH 1280
#define FIRST_HEIGHT 720
#define FIRST_WIDTH 1980
#define FIRST_HEIGHT 1080
#define FIRST_FRAME_NUM 25
#define BRIGHTNESS (80) //亮度,该摄像头亮度范围为 1-255 默认128
#define CONTRAST (155) //对比度,摄像头对比度范围为 1-255 默认128
#define SATURATION (128) //饱和度 摄像头饱和度范围为 1-255 默认128
#define EXPSURE (100) //曝光值 摄像头曝光值范围: 5-2500 默认auto设置
#define SECOND_WIDTH 0
#define SECOND_HEIGHT 0
#define SECOND_FRAME_NUM 25
#define CAMERA_DEVICE_NAME ("/dev/video0")
#define CAMERA_CATCH_PIXEL V4L2_PIX_FMT_H264
#else
... ... @@ -55,6 +71,9 @@ extern "C" {
#define SECOND_HEIGHT 720
#define SECOND_FRAME_NUM 25
#define CAMERA_DEVICE_NAME ("/dev/video0")
#endif
... ...
... ... @@ -9,18 +9,48 @@
#include "BaseConfig.h"
#include "./VideoMgmt/VideoMgmt.h"
#include "./StreamProc/StreamProc.h"
#include "./MultProc/MultProc.h"
#include "./MediaParm.h"
#include "./Camera/Camera.h"
#include "./Camera/Kt_Irc/Kt_Irc.h"
static int Kt_irc_flag = JZ_FLAGCODE_ON;
//单线程方案
static T_JZsdkReturnCode MediaProc_SingleThreading()
{
//如果是150S相机 150T相机
if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T)
{
//1、相机初始化
Camera_Init(0,FIRST_WIDTH, FIRST_HEIGHT, FIRST_FRAME_NUM);
//视频流模块初始化
T_JZsdkReturnCode MediaProc_Init()
//2、转码模块初始化
VideoStreamTransCode_Init();
}
}
//多线程方案
static T_JZsdkReturnCode MediaProc_MultiThreading()
{
//如果是150S相机 150T相机
if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T)
{
//1、启动视频流缓冲区模块
VideoMgmt_init_buffer(&VideoMgmt_FirstVideo_index);
//2、相机初始化
Camera_Init(1,FIRST_WIDTH, FIRST_HEIGHT, FIRST_FRAME_NUM);
//3、启用推流模块
VideoMgmt_VideoStreamFlow_Init(FIRST_FRAME_NUM, &VideoMgmt_FirstVideo_index, VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST);
//转码模块
VideoStreamTransCode_Init();
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头
}
//如果是昆腾相机 红外+光学 则红外为1号,光学为2号
if (Kt_irc_flag == JZ_FLAGCODE_ON)
if (DEVICE_VERSION == JZ_C1)
{
//1、启动视频流缓冲区模块
VideoMgmt_init_buffer(&VideoMgmt_FirstVideo_index);
... ... @@ -43,7 +73,7 @@ T_JZsdkReturnCode MediaProc_Init()
VideoStreamTransCode_Init();
//5、打开默认选项
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送红外摄像头 后续改成 红外+光学 的组合画面
JZsdk_Kt_Irc_ShutterSwitch(JZ_FLAGCODE_ON);
//6、修改部分参数
... ... @@ -53,20 +83,17 @@ T_JZsdkReturnCode MediaProc_Init()
Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value);
}
//如果是150S相机 150T相机
if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T)
{
//1、启动视频流缓冲区模块
VideoMgmt_init_buffer(&VideoMgmt_FirstVideo_index);
}
//2、相机初始化
JZsdk_H150ST_CameraInit(FIRST_WIDTH, FIRST_HEIGHT, FIRST_FRAME_NUM);
//视频流模块初始化
T_JZsdkReturnCode MediaProc_Init()
{
//3、启用推流模块
VideoMgmt_VideoStreamFlow_Init(FIRST_FRAME_NUM, &VideoMgmt_FirstVideo_index, VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST);
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头
}
#if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
MediaProc_SingleThreading();
# elif DEVICE_VERSION == JZ_C1
MediaProc_MultiThreading();
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/***************
*
* 多媒体处理器
* Multimedia Processor
*
* ******************/
#include "stdio.h"
#include "./StreamProc.h"
#include "./MultProc.h"
#include "JZsdkLib.h"
... ...
/**
********************************************************************
* @file StreamProc.h
* StreamProc的头文件
* @file MultProc.h
* MultProc.c的头文件
*
*********************************************************************
*/
... ...
/**************************************************
*
* 文件名:VideoMgmt.c
* 视频流模块
* 版本:V1.0
* 作用:
* 在视频流完成处理之后
* 1、将视频流数据发送到视频流推送模块
* 2、将视频流数据发送到视频流录制块
* 3、将视频流数据发送到视频流拍照模块
*
* **********************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
... ... @@ -15,245 +27,11 @@
#include "UI_control/UI_control.h"
#include "../MediaParm.h"
#include "../StreamProc/RTK_mmp/RTK_mmp.h"
//额外头文件声明
#include "../MultProc/RTK_mmp/RTK_mmp.h"
#define DATA_SEND_FROM_VIDEO_STREAM_MAX_LEN 60000
#define VIDEO_FRAME_AUD_LEN 6
static const unsigned char s_frameAudInfo[VIDEO_FRAME_AUD_LEN] = {0x00, 0x00, 0x00, 0x01, 0x09, 0x10};
JZ_VideoStreamUseStatus g_VideoStreamDealStatus = VIDEO_STREAM_IDLE; //视频流的处理状态
/*视频流缓冲区地址说明
留有三对缓冲区,一队中的数据分别为成型数据,以及原始数据
如果设备只有一个摄像头,则使用一号视频流
如果设备为 红外+光学 则红外为1号,光学为2号
*/
void *VideoMgmt_FirstVideo_index = NULL; //一号视频流的缓冲地址
void *VideoMgmt_SecondVideo_index = NULL; //二号视频流的缓冲地址
void *VideoMgmt_ThirdVideo_index = NULL; //三号视频流的缓冲地址
void *VideoMgmt_FirstRaw_index = NULL; //一号原始流的缓冲地址
void *VideoMgmt_SecondRaw_index = NULL; //二号原始流的缓冲地址
void *VideoMgmt_ThirdRaw_index = NULL; //三号原始流的缓冲地址
static int VideoFreezeFlag = JZ_FLAGCODE_OFF; //视频流冻结功能
//视频流缓冲区结构
typedef struct JZsdk_VideoBuffer{
unsigned char *data; //缓冲区数据
unsigned int data_len;
int is_ready; // 标志位,表示数据是否准备好被读取
pthread_mutex_t lock; // 互斥锁,用于线程同步
pthread_cond_t cond; // 条件变量,用于通知读取线程数据已准备好
} JZsdk_VideoBuffer;
// 初始化缓冲区
T_JZsdkReturnCode VideoMgmt_init_buffer(void **index)
{
//从索引值获取对应的缓冲区
//创建一个缓冲区
struct JZsdk_VideoBuffer *VideoBuffer = NULL;
//为编码器参数注册内存
VideoBuffer = (struct JZsdk_VideoBuffer *)malloc(sizeof(struct JZsdk_VideoBuffer));
if (VideoBuffer == NULL) {
JZSDK_LOG_ERROR("视频流缓冲区注册失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
VideoBuffer->data = NULL;
VideoBuffer->data_len = 0;
VideoBuffer->is_ready = 0;
pthread_mutex_init(&VideoBuffer->lock, NULL);
pthread_cond_init(&VideoBuffer->cond, NULL);
if (*index != NULL)
{
free(*index);
}
*index = (void *)VideoBuffer;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//缓冲区清理
T_JZsdkReturnCode VideoMgmt_VideoBuffer_Deinit(void **index)
{
if (index == NULL || *index == NULL) {
// 如果索引或缓冲区指针为空,则直接返回
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
//从索引值获取对应的缓冲区
struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index;
if (VideoBuffer->data != NULL)
{
free(VideoBuffer->data);
VideoBuffer->data = NULL;
}
VideoBuffer->data_len = 0;
VideoBuffer->is_ready = 0;
pthread_mutex_destroy(&VideoBuffer->lock);
pthread_cond_destroy(&VideoBuffer->cond);
free(VideoBuffer);
index = NULL; // 防止悬挂指针
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//缓冲区写入
T_JZsdkReturnCode VideoMgmt_write_data(void **index, unsigned char *data, unsigned int data_len)
{
//从索引值获取对应的缓冲区
struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index;
pthread_mutex_lock(&VideoBuffer->lock);
// 释放旧数据
if (VideoBuffer->data)
{
free(VideoBuffer->data);
VideoBuffer->data = NULL;
}
// 分配新内存并复制数据
VideoBuffer->data = (unsigned char *)malloc(data_len);
memcpy(VideoBuffer->data, data, data_len);
VideoBuffer->data_len = data_len;
VideoBuffer->is_ready = 1; // 标记数据已准备好
// 通知读取线程数据已准备好
pthread_cond_signal(&VideoBuffer->cond);
pthread_mutex_unlock(&VideoBuffer->lock);
}
//缓冲区读取
//输入的参数,缓冲区索引地址 回复的数据地址 回复的数据长度 帧头帧尾模式 帧头帧尾长度
T_JZsdkReturnCode VideoMgmt_read_data(void **index, unsigned char **data, unsigned int *data_len, unsigned int mode, unsigned int extra_len)
{
//从索引值获取对应的缓冲区
struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index;
// 检查缓冲区指针是否有效
if (VideoBuffer == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效
}
pthread_mutex_lock(&VideoBuffer->lock);
// 等待数据准备好
while (!VideoBuffer->is_ready)
{
pthread_cond_wait(&VideoBuffer->cond, &VideoBuffer->lock);
}
// 检查数据指针是否有效
if (VideoBuffer->data == NULL)
{
pthread_mutex_unlock(&VideoBuffer->lock);
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示没有数据可供读取
}
// 返回数据和长度
*data_len = VideoBuffer->data_len;
if (mode == JZ_FLAGCODE_OFF)
{
*data = (unsigned char *)malloc(*data_len);
memcpy(*data, VideoBuffer->data, *data_len);
}
else if (mode == VIDEOMGMT_USE_FRAMEHEAD)
{
*data = (unsigned char *)malloc(*data_len + extra_len);
memcpy(*data+extra_len, VideoBuffer->data, VideoBuffer->data_len);
}
else if (mode == VIDEOMGMT_USE_FRAMEEND)
{
*data = (unsigned char *)malloc(*data_len + extra_len);
memcpy(*data, VideoBuffer->data, VideoBuffer->data_len);
}
else
{
*data = (unsigned char *)malloc(*data_len);
memcpy(*data, VideoBuffer->data, *data_len);
}
VideoBuffer->is_ready = 0;
pthread_mutex_unlock(&VideoBuffer->lock);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**********
*
* 直接返回地址略有风险,暂时不考虑使用这个以下注释的方法
*
* ************/
// //缓冲区读取
// T_JZsdkReturnCode VideoMgmt_read_data(void **index, unsigned char **data, unsigned int *data_len)
// {
// //从索引值获取对应的缓冲区
// struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index;
// // 检查缓冲区指针是否有效
// if (VideoBuffer == NULL)
// {
// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效
// }
// pthread_mutex_lock(&VideoBuffer->lock);
// // 等待数据准备好
// while (!VideoBuffer->is_ready)
// {
// pthread_cond_wait(&VideoBuffer->cond, &VideoBuffer->lock);
// }
// // 检查数据指针是否有效
// if (VideoBuffer->data == NULL)
// {
// pthread_mutex_unlock(&VideoBuffer->lock);
// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示没有数据可供读取
// }
// // 返回数据和长度
// *data = (VideoBuffer->data);
// *data_len = VideoBuffer->data_len;
// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }
// //回复已经读取完成,在read函数,且数据处理完成后调用
// T_JZsdkReturnCode VideoMgmt_ReplyRead(void **index)
// {
// //从索引值获取对应的缓冲区
// struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index;
// // 检查缓冲区指针是否有效
// if (VideoBuffer == NULL)
// {
// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效
// }
// VideoBuffer->is_ready = 0;
// pthread_mutex_unlock(&VideoBuffer->lock);
// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }
static int g_VideoFreezeFlag = JZ_FLAGCODE_OFF; //视频流冻结功能
/*********************************************************************************************************************************************
*
... ... @@ -262,15 +40,14 @@ T_JZsdkReturnCode VideoMgmt_read_data(void **index, unsigned char **data, unsign
*
*
* *********************************************************************************************************************************************/
struct VideoMgmt_VideoStreamFlow
{
void **index; //用于提出画面流的缓冲区地址
int VideoStreamFlowIndex; //缓冲区的索引号,用于区分缓冲区
int FrameNumber; //推流的帧数
};
static int VideoStreamFlowIndexNum = JZ_FLAGCODE_OFF; //视频流转的索引值
static int g_VideoStreamFlowIndexNum = JZ_FLAGCODE_OFF; //视频流转的索引值
int VideoMgmt_GetVideoStreamFlowIndexNum()
{
return g_VideoStreamFlowIndexNum;
}
//设置流转的视频流
T_JZsdkReturnCode VideoMgmt_VideoStreamFlowIndex(int index)
... ... @@ -280,28 +57,28 @@ T_JZsdkReturnCode VideoMgmt_VideoStreamFlowIndex(int index)
case JZ_FLAGCODE_OFF:
{
JZSDK_LOG_INFO("切换视频流为关");
VideoStreamFlowIndexNum = index;
g_VideoStreamFlowIndexNum = index;
}
break;
case VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST:
{
JZSDK_LOG_INFO("切换视频流为一号");
VideoStreamFlowIndexNum = index;
g_VideoStreamFlowIndexNum = index;
}
break;
case VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND:
{
JZSDK_LOG_INFO("切换视频流为二号");
VideoStreamFlowIndexNum = index;
g_VideoStreamFlowIndexNum = index;
}
break;
case VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD:
{
JZSDK_LOG_INFO("切换视频流为三号");
VideoStreamFlowIndexNum = index;
g_VideoStreamFlowIndexNum = index;
}
break;
... ... @@ -325,12 +102,12 @@ T_JZsdkReturnCode VideoMgmt_VideoStreamFlow_RecordPlay(int status)
{
if (status == JZ_FLAGCODE_ON && Temp_LastVideoStatus == JZ_FLAGCODE_NORMAL)
{
Temp_LastVideoStatus = VideoStreamFlowIndexNum;
VideoStreamFlowIndexNum = VIDEOMGMT_STREAMING_FLOW_INDEX_RECORD;
Temp_LastVideoStatus = g_VideoStreamFlowIndexNum;
g_VideoStreamFlowIndexNum = VIDEOMGMT_STREAMING_FLOW_INDEX_RECORD;
}
else if (status == JZ_FLAGCODE_OFF && Temp_LastVideoStatus != JZ_FLAGCODE_NORMAL)
{
VideoStreamFlowIndexNum = Temp_LastVideoStatus;
g_VideoStreamFlowIndexNum = Temp_LastVideoStatus;
Temp_LastVideoStatus = JZ_FLAGCODE_NORMAL;
}
else
... ... @@ -349,7 +126,7 @@ T_JZsdkReturnCode VideoMgmt_VideoStreamFlow_RecordPlay(int status)
T_JZsdkReturnCode VideoStramPhoto_DevelopH264FlowGenerateIDR()
{
#if DEVICE_VERSION == JZ_C1
switch (VideoStreamFlowIndexNum)
switch (g_VideoStreamFlowIndexNum)
{
case VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST:
{
... ... @@ -375,10 +152,10 @@ T_JZsdkReturnCode VideoStramPhoto_DevelopH264FlowGenerateIDR()
/**************
*
* 视频流流转的线程
*
* 视频流处理完成后,可以通过此函数完成拍照记录 录像记录 以及推送
*
* ************/
static T_JZsdkReturnCode VideoStreamToDeal(unsigned char *data, unsigned int data_len)
T_JZsdkReturnCode VideoMgmt_VideoStreamToDeal(unsigned char *data, unsigned int data_len)
{
//拍照数据
VideoStramPhoto_PhotoDataIn(data, data_len);
... ... @@ -394,117 +171,6 @@ static T_JZsdkReturnCode VideoStreamToDeal(unsigned char *data, unsigned int dat
//JZSDK_LOG_INFO("推送一帧%d,数据大小%d\n",VideoPush->VideoStreamFlowIndex,data_len);
}
static void *VideoMgmt_VideoStreamFlow_Thread(void *args)
{
struct VideoMgmt_VideoStreamFlow *VideoPush = (struct VideoMgmt_VideoStreamFlow *)args;
int delay_time_ms = (1000/VideoPush->FrameNumber); //得出延时的ms
unsigned char *FreezeData = NULL;
unsigned int FreezeDataLen = 0;
int FreezeFlag = JZ_FLAGCODE_OFF;
while (1)
{
delayMs(delay_time_ms);
//判断是否用视频流是否用的是当前这个
if (VideoPush->VideoStreamFlowIndex != VideoStreamFlowIndexNum)
{
continue;
}
//推流操作
//读取数据
unsigned char *data = NULL;
unsigned int data_len = 0;
//如果视频为大疆H264型 或 JZH264型
if (VIDEOMGMT_VIDEO_TPYE == VIDEOMGMT_TPYE_DJIH264 || VIDEOMGMT_VIDEO_TPYE == VIDEOMGMT_TPYE_JZH264 )
{
VideoMgmt_read_data((void **)VideoPush->index, &data, &data_len, VIDEOMGMT_USE_FRAMEEND, VIDEO_FRAME_AUD_LEN); //读取
memcpy(data + data_len, s_frameAudInfo, VIDEO_FRAME_AUD_LEN);
data_len = data_len + VIDEO_FRAME_AUD_LEN;
}
else
{
VideoMgmt_read_data((void **)VideoPush->index, &data, &data_len, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF); //读取
}
//冻结功能
if (VideoFreezeFlag == JZ_FLAGCODE_ON)
{
//如果冻结数据为空,且 当前为i帧
if (FreezeData == NULL && data[4] == 0x67)
{
FreezeDataLen = data_len;
JZsdk_Malloc((void **)&FreezeData, data_len);
memcpy(FreezeData, data, data_len);
}
}
if (VideoFreezeFlag == JZ_FLAGCODE_ON && FreezeDataLen != 0)
{
VideoStreamToDeal(FreezeData, FreezeDataLen);
}
else
{
VideoStreamToDeal(data, data_len);
}
// 释放数据(如果有必要的话)
if (data) {
free(data);
data = NULL;
}
data_len = 0;
if (VideoFreezeFlag == JZ_FLAGCODE_OFF)
{
if (FreezeData) {
free(FreezeData);
FreezeData = NULL;
}
FreezeDataLen = 0;
}
}
pthread_exit(NULL);
return NULL;
}
//视频流流转模块的初始化
T_JZsdkReturnCode VideoMgmt_VideoStreamFlow_Init(int FrameNumber, void **index, int VideoStreamFlowIndex)
{
struct VideoMgmt_VideoStreamFlow *VideoStreamFlow = NULL;
// 分配新内存并复制数据
VideoStreamFlow = (struct VideoMgmt_VideoStreamFlow *)malloc(sizeof(struct VideoMgmt_VideoStreamFlow));
if (VideoStreamFlow == NULL) {
JZSDK_LOG_ERROR("视频流流转模块注册失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
VideoStreamFlow->index = index;
VideoStreamFlow->FrameNumber = FrameNumber;
VideoStreamFlow->VideoStreamFlowIndex = VideoStreamFlowIndex;
//创建视频流流转线程
pthread_t ReadDataTask;
pthread_attr_t task_attribute; //线程属性
pthread_attr_init(&task_attribute); //初始化线程属性
pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
int ret = pthread_create(&ReadDataTask,&task_attribute,(void *)VideoMgmt_VideoStreamFlow_Thread,VideoStreamFlow); //线程
if(ret != 0)
{
JZSDK_LOG_ERROR("创建视频流流转线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZSDK_LOG_INFO("视频流流转模块初始化完毕");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**************
*
... ... @@ -556,12 +222,12 @@ static T_JZsdkReturnCode VideoStream_FreezeVideo(int value)
if (value == JZ_FLAGCODE_ON)
{
JZSDK_LOG_INFO("视频流冻结");
VideoFreezeFlag = JZ_FLAGCODE_ON;
g_VideoFreezeFlag = JZ_FLAGCODE_ON;
}
else if (value == JZ_FLAGCODE_OFF)
{
JZSDK_LOG_INFO("关闭视频流冻结");
VideoFreezeFlag = JZ_FLAGCODE_OFF;
g_VideoFreezeFlag = JZ_FLAGCODE_OFF;
}
else
{
... ... @@ -588,7 +254,7 @@ T_JZsdkReturnCode VideoMgmt_param(int flagcode, enum VideoMgmtParm paramflag, in
{
case VIDEO_MGMT_FREEZE:
{
*value = VideoFreezeFlag;
*value = g_VideoFreezeFlag;
}
break;
... ... @@ -645,7 +311,7 @@ T_JZsdkReturnCode VideoMgmt_Send_StreamStatus(JZ_VideoStreamUseStatus status)
T_JZsdkReturnCode VideoMgmt_Get_StreamWidthAndHeight(int *width, int *height)
{
#if DEVICE_VERSION == JZ_C1
if (VideoStreamFlowIndexNum == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST)
if (g_VideoStreamFlowIndexNum == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST)
{
*width = FIRST_WIDTH;
*height = FIRST_HEIGHT;
... ... @@ -656,5 +322,11 @@ T_JZsdkReturnCode VideoMgmt_Get_StreamWidthAndHeight(int *width, int *height)
*height = SECOND_HEIGHT;
}
#endif
#if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
*width = FIRST_WIDTH;
*height = FIRST_HEIGHT;
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -12,6 +12,7 @@
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include "./VideoMgmt_Parm.h"
#ifdef __cplusplus
extern "C" {
... ... @@ -19,48 +20,7 @@ extern "C" {
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
typedef enum {
VIDEOMGMT_TPYE_H264 = 0x0000,
VIDEOMGMT_TPYE_DJIH264 = 0x0001,
VIDEOMGMT_TPYE_JZH264 = 0x0002
} JZ_VideoMgmt_Type_Code;
//推送的索引值,用于解决推送哪一个视频流的问题
typedef enum JZ_VideoMgmt_PushIndex{
VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST = 0x0001,
VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND = 0x0002,
VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD = 0x0003,
VIDEOMGMT_STREAMING_FLOW_INDEX_RECORD = 0x0010, //录像流
}JZ_VideoMgmt_PushIndex;
//视频流的使用状态
typedef enum JZ_VideoStreamUseStatus{
VIDEO_STREAM_IDLE = 0x0000, //相机空闲
VIDEO_STREAM_RECORD = 0x0001, //相机录像中
VIDEO_STREAM_SHOOTPHOTO = 0x0002, //相机拍照中
VIDEO_STREAM_BRUSTSHOORPHOTO = 0x0003, //相机连拍中
VIDEO_STREAM_TRANSCODE = 0x0004, //相机转码中
}JZ_VideoStreamUseStatus;
typedef enum VideoMgmtParm
{
VIDEO_MGMT_FREEZE = 0x0001, //冻结
}VideoMgmtParm;
extern void *VideoMgmt_FirstVideo_index; //一号视频流的缓冲地址
extern void *VideoMgmt_SecondVideo_index; //二号视频流的缓冲地址
extern void *VideoMgmt_ThirdVideo_index; //三号视频流的缓冲地址
extern void *VideoMgmt_FirstRaw_index; //一号原始流的缓冲地址
extern void *VideoMgmt_SecondRaw_index; //二号原始流的缓冲地址
extern void *VideoMgmt_ThirdRaw_index; //三号原始流的缓冲地址
#define VIDEOMGMT_USE_FRAMEHEAD (1) //获取的数据加上帧头预留位
#define VIDEOMGMT_USE_FRAMEEND (2) //获取的数据加上帧尾预留位
#define VIDEOMGMT_VIDEO_TPYE VIDEOMGMT_TPYE_DJIH264 //推送帧的视频格式
/* Exported types ------------------------------------------------------------*/
... ... @@ -93,6 +53,22 @@ T_JZsdkReturnCode VideoStramPhoto_DevelopH264FlowGenerateIDR();
* *********/
T_JZsdkReturnCode VideoRecord_TransMode(int status);
/*********
*
* 内部交互函数
*
* *****************/
T_JZsdkReturnCode VideoMgmt_VideoStreamToDeal(unsigned char *data, unsigned int data_len);
int VideoMgmt_GetVideoStreamFlowIndexNum();
/*************
*
* 单线程输入函数
*
* **************/
T_JZsdkReturnCode VideoMgmt_Single_FrameIn(unsigned char *FrmaeData,unsigned int FrmaeDataLen);
#ifdef __cplusplus
}
#endif
... ...
/**************************************************
*
* 文件名:缓冲区管理文件
*
* **********************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include "./VideoMgmt.h"
#include "../MediaParm.h"
#include "./VideoMgmt_Parm.h"
/*视频流缓冲区地址说明
留有三对缓冲区,一队中的数据分别为成型数据,以及原始数据
如果设备只有一个摄像头,则使用一号视频流
如果设备为 红外+光学 则红外为1号,光学为2号
*/
void *VideoMgmt_FirstVideo_index = NULL; //一号视频流的缓冲地址
void *VideoMgmt_SecondVideo_index = NULL; //二号视频流的缓冲地址
void *VideoMgmt_ThirdVideo_index = NULL; //三号视频流的缓冲地址
void *VideoMgmt_FirstRaw_index = NULL; //一号原始流的缓冲地址
void *VideoMgmt_SecondRaw_index = NULL; //二号原始流的缓冲地址
void *VideoMgmt_ThirdRaw_index = NULL; //三号原始流的缓冲地址
//视频流缓冲区结构
typedef struct JZsdk_VideoBuffer{
unsigned char *data; //缓冲区数据
unsigned int data_len;
int is_ready; // 标志位,表示数据是否准备好被读取
pthread_mutex_t lock; // 互斥锁,用于线程同步
pthread_cond_t cond; // 条件变量,用于通知读取线程数据已准备好
} JZsdk_VideoBuffer;
// 初始化缓冲区
T_JZsdkReturnCode VideoMgmt_init_buffer(void **index)
{
//从索引值获取对应的缓冲区
//创建一个缓冲区
struct JZsdk_VideoBuffer *VideoBuffer = NULL;
//为编码器参数注册内存
VideoBuffer = (struct JZsdk_VideoBuffer *)malloc(sizeof(struct JZsdk_VideoBuffer));
if (VideoBuffer == NULL) {
JZSDK_LOG_ERROR("视频流缓冲区注册失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
VideoBuffer->data = NULL;
VideoBuffer->data_len = 0;
VideoBuffer->is_ready = 0;
pthread_mutex_init(&VideoBuffer->lock, NULL);
pthread_cond_init(&VideoBuffer->cond, NULL);
if (*index != NULL)
{
free(*index);
}
*index = (void *)VideoBuffer;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//缓冲区清理
T_JZsdkReturnCode VideoMgmt_VideoBuffer_Deinit(void **index)
{
if (index == NULL || *index == NULL) {
// 如果索引或缓冲区指针为空,则直接返回
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
//从索引值获取对应的缓冲区
struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index;
if (VideoBuffer->data != NULL)
{
free(VideoBuffer->data);
VideoBuffer->data = NULL;
}
VideoBuffer->data_len = 0;
VideoBuffer->is_ready = 0;
pthread_mutex_destroy(&VideoBuffer->lock);
pthread_cond_destroy(&VideoBuffer->cond);
free(VideoBuffer);
index = NULL; // 防止悬挂指针
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//缓冲区写入
T_JZsdkReturnCode VideoMgmt_write_data(void **index, unsigned char *data, unsigned int data_len)
{
//从索引值获取对应的缓冲区
struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index;
pthread_mutex_lock(&VideoBuffer->lock);
// 释放旧数据
if (VideoBuffer->data)
{
free(VideoBuffer->data);
VideoBuffer->data = NULL;
}
// 分配新内存并复制数据
VideoBuffer->data = (unsigned char *)malloc(data_len);
memcpy(VideoBuffer->data, data, data_len);
VideoBuffer->data_len = data_len;
VideoBuffer->is_ready = 1; // 标记数据已准备好
// 通知读取线程数据已准备好
pthread_cond_signal(&VideoBuffer->cond);
pthread_mutex_unlock(&VideoBuffer->lock);
}
//缓冲区读取
//输入的参数,缓冲区索引地址 回复的数据地址 回复的数据长度 帧头帧尾模式 帧头帧尾长度
T_JZsdkReturnCode VideoMgmt_read_data(void **index, unsigned char **data, unsigned int *data_len, unsigned int mode, unsigned int extra_len)
{
//从索引值获取对应的缓冲区
struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index;
// 检查缓冲区指针是否有效
if (VideoBuffer == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效
}
pthread_mutex_lock(&VideoBuffer->lock);
// 等待数据准备好
while (!VideoBuffer->is_ready)
{
pthread_cond_wait(&VideoBuffer->cond, &VideoBuffer->lock);
}
// 检查数据指针是否有效
if (VideoBuffer->data == NULL)
{
pthread_mutex_unlock(&VideoBuffer->lock);
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示没有数据可供读取
}
// 返回数据和长度
*data_len = VideoBuffer->data_len;
if (mode == JZ_FLAGCODE_OFF)
{
*data = (unsigned char *)malloc(*data_len);
memcpy(*data, VideoBuffer->data, *data_len);
}
else if (mode == VIDEOMGMT_USE_FRAMEHEAD)
{
*data = (unsigned char *)malloc(*data_len + extra_len);
memcpy(*data+extra_len, VideoBuffer->data, VideoBuffer->data_len);
}
else if (mode == VIDEOMGMT_USE_FRAMEEND)
{
*data = (unsigned char *)malloc(*data_len + extra_len);
memcpy(*data, VideoBuffer->data, VideoBuffer->data_len);
}
else
{
*data = (unsigned char *)malloc(*data_len);
memcpy(*data, VideoBuffer->data, *data_len);
}
VideoBuffer->is_ready = 0;
pthread_mutex_unlock(&VideoBuffer->lock);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**********
*
* 直接返回地址略有风险,暂时不考虑使用这个以下注释的方法
*
* ************/
// //缓冲区读取
// T_JZsdkReturnCode VideoMgmt_read_data(void **index, unsigned char **data, unsigned int *data_len)
// {
// //从索引值获取对应的缓冲区
// struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index;
// // 检查缓冲区指针是否有效
// if (VideoBuffer == NULL)
// {
// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效
// }
// pthread_mutex_lock(&VideoBuffer->lock);
// // 等待数据准备好
// while (!VideoBuffer->is_ready)
// {
// pthread_cond_wait(&VideoBuffer->cond, &VideoBuffer->lock);
// }
// // 检查数据指针是否有效
// if (VideoBuffer->data == NULL)
// {
// pthread_mutex_unlock(&VideoBuffer->lock);
// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示没有数据可供读取
// }
// // 返回数据和长度
// *data = (VideoBuffer->data);
// *data_len = VideoBuffer->data_len;
// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }
// //回复已经读取完成,在read函数,且数据处理完成后调用
// T_JZsdkReturnCode VideoMgmt_ReplyRead(void **index)
// {
// //从索引值获取对应的缓冲区
// struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index;
// // 检查缓冲区指针是否有效
// if (VideoBuffer == NULL)
// {
// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效
// }
// VideoBuffer->is_ready = 0;
// pthread_mutex_unlock(&VideoBuffer->lock);
// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }
\ No newline at end of file
... ...
/**
********************************************************************
* @file VideoMgmt_Parm.h
* VideoMgmt_Parm的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef VIDEO_MGMT_PARAM_H
#define VIDEO_MGMT_PARAM_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
typedef enum {
VIDEOMGMT_TPYE_H264 = 0x0000,
VIDEOMGMT_TPYE_DJIH264 = 0x0001,
VIDEOMGMT_TPYE_JZH264 = 0x0002
} JZ_VideoMgmt_Type_Code;
//推送的索引值,用于解决推送哪一个视频流的问题
typedef enum JZ_VideoMgmt_PushIndex{
VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST = 0x0001,
VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND = 0x0002,
VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD = 0x0003,
VIDEOMGMT_STREAMING_FLOW_INDEX_RECORD = 0x0010, //录像流
}JZ_VideoMgmt_PushIndex;
//视频流的使用状态
typedef enum JZ_VideoStreamUseStatus{
VIDEO_STREAM_IDLE = 0x0000, //相机空闲
VIDEO_STREAM_RECORD = 0x0001, //相机录像中
VIDEO_STREAM_SHOOTPHOTO = 0x0002, //相机拍照中
VIDEO_STREAM_BRUSTSHOORPHOTO = 0x0003, //相机连拍中
VIDEO_STREAM_TRANSCODE = 0x0004, //相机转码中
}JZ_VideoStreamUseStatus;
//视频流索引
typedef struct VideoMgmt_VideoStreamFlow
{
void **index; //用于提出画面流的缓冲区地址
int VideoStreamFlowIndex; //缓冲区的索引号,用于区分缓冲区
int FrameNumber; //推流的帧数
}VideoMgmt_VideoStreamFlow;
typedef enum VideoMgmtParm
{
VIDEO_MGMT_FREEZE = 0x0001, //冻结
}VideoMgmtParm;
extern void *VideoMgmt_FirstVideo_index; //一号视频流的缓冲地址
extern void *VideoMgmt_SecondVideo_index; //二号视频流的缓冲地址
extern void *VideoMgmt_ThirdVideo_index; //三号视频流的缓冲地址
extern void *VideoMgmt_FirstRaw_index; //一号原始流的缓冲地址
extern void *VideoMgmt_SecondRaw_index; //二号原始流的缓冲地址
extern void *VideoMgmt_ThirdRaw_index; //三号原始流的缓冲地址
#define VIDEOMGMT_USE_FRAMEHEAD (1) //获取的数据加上帧头预留位
#define VIDEOMGMT_USE_FRAMEEND (2) //获取的数据加上帧尾预留位
#define VIDEOMGMT_VIDEO_TPYE VIDEOMGMT_TPYE_DJIH264 //推送帧的视频格式
#define VIDEO_FRAME_AUD_NO1_LEN 6
static const unsigned char FrameAudInfo_NO1[VIDEO_FRAME_AUD_NO1_LEN] = {0x00, 0x00, 0x00, 0x01, 0x09, 0x10}; //类型一帧长度
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
#ifdef __cplusplus
}
#endif
#endif
... ...
/**************************************************
*
* 文件名:VideoMgmt的多线程处理模式
*
* **********************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include "./VideoMgmt.h"
#include "../MediaParm.h"
#include "./VideoMgmt_Parm.h"
static void *VideoMgmt_VideoStreamFlow_Thread(void *args)
{
struct VideoMgmt_VideoStreamFlow *VideoPush = (struct VideoMgmt_VideoStreamFlow *)args;
int delay_time_ms = (1000/VideoPush->FrameNumber); //得出延时的ms
unsigned char *FreezeData = NULL;
unsigned int FreezeDataLen = 0;
int VideoFreezeFlag = JZ_FLAGCODE_OFF;
while (1)
{
delayMs(delay_time_ms);
//判断是否用视频流是否用的是当前这个
if (VideoPush->VideoStreamFlowIndex != VideoMgmt_GetVideoStreamFlowIndexNum())
{
continue;
}
//推流操作
//读取数据
unsigned char *data = NULL;
unsigned int data_len = 0;
//如果视频为大疆H264型 或 JZH264型
if (VIDEOMGMT_VIDEO_TPYE == VIDEOMGMT_TPYE_DJIH264 || VIDEOMGMT_VIDEO_TPYE == VIDEOMGMT_TPYE_JZH264 )
{
VideoMgmt_read_data((void **)VideoPush->index, &data, &data_len, VIDEOMGMT_USE_FRAMEEND, VIDEO_FRAME_AUD_NO1_LEN); //读取
memcpy(data + data_len, FrameAudInfo_NO1, VIDEO_FRAME_AUD_NO1_LEN);
data_len = data_len + VIDEO_FRAME_AUD_NO1_LEN;
}
else
{
VideoMgmt_read_data((void **)VideoPush->index, &data, &data_len, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF); //读取
}
//获取冻结标志位
VideoMgmt_param(JZ_FLAGCODE_SET, VIDEO_MGMT_FREEZE, &VideoFreezeFlag);
//冻结功能
if (VideoFreezeFlag == JZ_FLAGCODE_ON)
{
//如果冻结数据为空,且 当前为i帧
if (FreezeData == NULL && data[4] == 0x67)
{
FreezeDataLen = data_len;
JZsdk_Malloc((void **)&FreezeData, data_len);
memcpy(FreezeData, data, data_len);
}
}
//冻结开了就推送冻结画面
if (VideoFreezeFlag == JZ_FLAGCODE_ON && FreezeDataLen != 0)
{
VideoMgmt_VideoStreamToDeal(FreezeData, FreezeDataLen);
}
//否则推送正常画面
else
{
VideoMgmt_VideoStreamToDeal(data, data_len);
}
// 释放数据(如果有必要的话)
if (data) {
printf("释放1\n");
free(data);
data = NULL;
}
data_len = 0;
if (VideoFreezeFlag == JZ_FLAGCODE_OFF)
{
if (FreezeData) {
free(FreezeData);
FreezeData = NULL;
}
FreezeDataLen = 0;
}
}
pthread_exit(NULL);
return NULL;
}
/************************
*
* 开启流转区块
*
*
*
* ***********************/
T_JZsdkReturnCode VideoMgmt_VideoStreamFlow_Init(int FrameNumber, void **index, int VideoStreamFlowIndex)
{
struct VideoMgmt_VideoStreamFlow *VideoStreamFlow = NULL;
// 分配新内存并复制数据
VideoStreamFlow = (struct VideoMgmt_VideoStreamFlow *)malloc(sizeof(struct VideoMgmt_VideoStreamFlow));
if (VideoStreamFlow == NULL) {
JZSDK_LOG_ERROR("视频流流转模块注册失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
VideoStreamFlow->index = index;
VideoStreamFlow->FrameNumber = FrameNumber;
VideoStreamFlow->VideoStreamFlowIndex = VideoStreamFlowIndex;
//创建视频流流转线程
pthread_t ReadDataTask;
pthread_attr_t task_attribute; //线程属性
pthread_attr_init(&task_attribute); //初始化线程属性
pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
int ret = pthread_create(&ReadDataTask,&task_attribute,(void *)VideoMgmt_VideoStreamFlow_Thread,VideoStreamFlow); //线程
if(ret != 0)
{
JZSDK_LOG_ERROR("创建视频流流转线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZSDK_LOG_INFO("视频流流转模块初始化完毕");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/**************************************************
*
* 文件名:VideoMgmt的单线程处理模式
*
* **********************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include "./VideoMgmt.h"
#include "../MediaParm.h"
#include "./VideoMgmt_Parm.h"
/************************
*
* 视频管理模块
* 单线程模式下的数据输入接口
*
* *************************/
T_JZsdkReturnCode VideoMgmt_Single_FrameIn(unsigned char *FrmaeData,unsigned int FrmaeDataLen)
{
//判断数据是否为空
if(FrmaeData == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
//判断数据长度是否为空
if(FrmaeDataLen == 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//进行数据后处理,即加入帧头,帧尾等
//如果视频为大疆H264型 或 JZH264型
if (VIDEOMGMT_VIDEO_TPYE == VIDEOMGMT_TPYE_DJIH264 || VIDEOMGMT_VIDEO_TPYE == VIDEOMGMT_TPYE_JZH264 )
{
unsigned char *data = (unsigned char *)malloc(FrmaeDataLen + VIDEO_FRAME_AUD_NO1_LEN);
memcpy(data, FrmaeData, FrmaeDataLen);
memcpy(data + FrmaeDataLen, FrameAudInfo_NO1, VIDEO_FRAME_AUD_NO1_LEN);
FrmaeDataLen = FrmaeDataLen + VIDEO_FRAME_AUD_NO1_LEN;
//将数据输入到流转函数中
VideoMgmt_VideoStreamToDeal(data,FrmaeDataLen);
free(data);
}
else
{
//将数据输入到流转函数中
VideoMgmt_VideoStreamToDeal(FrmaeData,FrmaeDataLen);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -29,7 +29,7 @@ T_JZsdkReturnCode VideoStream_PushFrame(unsigned char* h264_data, unsigned int d
}
else
{
JZSDK_LOG_ERROR("视频传输发送了错误帧\n");
JZSDK_LOG_ERROR("视频传输发送了错误帧,长度%d [0]:%x [1]:%x [2]:%x [3]:%x [4]:%x",data_len, h264_data[0], h264_data[1], h264_data[2], h264_data[3], h264_data[4]);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
... ...
... ... @@ -190,6 +190,8 @@ static int Video_TransCode_Thread_Init()
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*****
... ... @@ -210,6 +212,8 @@ T_JZsdkReturnCode VideoStreamTransCode_Init()
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZSDK_LOG_INFO("transcode module init success");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -5,6 +5,8 @@
#include "Megaphone/Megaphone.h"
#include "DeviceInfo/DeviceInfo.h"
extern unsigned char *g_JZsdkParam_PlayPromptTTS; //播放提示音
T_JZsdkReturnCode Start_voice()
{
if (APP_VERSION == APP_UART)
... ... @@ -107,4 +109,105 @@ T_JZsdkReturnCode Start_up_and_broadcast_voice()
}
}
}
}
T_JZsdkReturnCode AttentionVoice_IndependencePlay()
{
//如果是 -p sucess 程序成功 播放喊话器升级成功
//如果是 -p updefeat 程序失败 播放喊话器升级失败
//设置音量
Megaphone_SetVolume(30 , 0);
delayMs(100);
//根据属地设置默认语言
int language = 0;
int OriginValue = FOMAT_Get_FirewareOriginRegion();
//如果是国内版或者无属地 设置为中文
if (OriginValue == ORIGIN_DEFAULT || OriginValue == ORIGIN_CN)
{
language = 0x01;
Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
}
//如果是海外版 设置为英文
else
{
language = 0x11;
Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
}
//如果是 -p error 程序错误 播放喊话器错误
if (strcmp((const char *)g_JZsdkParam_PlayPromptTTS, "error") == 0)
{
JZSDK_LOG_INFO("播放喊话器错误");
if (language == 0x11)
{
Megaphone_TTS_Play("Software error, restarting Megaphone.", strlen("Software error, restarting Megaphone."), JZ_FLAGCODE_ON);
}
else
{
Megaphone_TTS_Play("程序错误,正在重启喊话器", strlen("程序错误,正在重启喊话器"), JZ_FLAGCODE_ON);
}
}
else if (strcmp((const char *)g_JZsdkParam_PlayPromptTTS, "upsucess") == 0)
{
JZSDK_LOG_INFO("播放喊话器升级成功");
if (language == 0x11)
{
Megaphone_TTS_Play("Upgrade completed, restarting Megaphone.", strlen("Upgrade completed, restarting Megaphone."), JZ_FLAGCODE_ON);
}
else
{
Megaphone_TTS_Play("升级已完成,正在重启喊话器", strlen("升级已完成,正在重启喊话器"), JZ_FLAGCODE_ON);
}
}
else if (strcmp((const char *)g_JZsdkParam_PlayPromptTTS, "updefeat") == 0)
{
JZSDK_LOG_INFO("播放喊话器升级失败");
if (language == 0x11)
{
Megaphone_TTS_Play("Upgrade defeat, restarting Megaphone.", strlen("Upgrade defeat, restarting Megaphone."), JZ_FLAGCODE_ON);
}
else
{
Megaphone_TTS_Play("升级失败,请检查Log或者重启喊话器", strlen("升级失败,请检查Log或者重启喊话器"), JZ_FLAGCODE_ON);
}
}
else if (strcmp((const char *)g_JZsdkParam_PlayPromptTTS, "start") == 0)
{
JZSDK_LOG_INFO("播放喊话器启动中");
if (language == 0x11)
{
Megaphone_TTS_Play("Upgrade defeat, restarting Megaphone.", strlen("Upgrade defeat, restarting Megaphone."), JZ_FLAGCODE_ON);
}
else
{
Megaphone_TTS_Play("喊话器启动中", strlen("喊话器启动中"), JZ_FLAGCODE_ON);
}
}
delayMs(100);
//等待播放状态结束
while(1)
{
if (Megaphone_GetMegaphoneStatus() != JZ_FLAGCODE_OFF)
{
delayMs(1);
continue;
}
break;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file
*
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef ATTENTIONVOICE_H
#define ATTENTIONVOICE_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode Start_voice();
T_JZsdkReturnCode Start_up_and_broadcast_voice();
T_JZsdkReturnCode AttentionVoice_IndependencePlay();
#ifdef __cplusplus
}
#endif
#endif
... ...
... ... @@ -335,6 +335,7 @@ T_JZsdkReturnCode JZsdk_GetSongInDudioList_AudioInfo(struct AudioMange_Node *hea
while (current != NULL) {
if (strcmp(current->audioInfo.FileName, songToFind->FileName) == 0)
{
songToFind->FileNameLen = current->audioInfo.FileNameLen;
songToFind->BitRate = current->audioInfo.BitRate;
songToFind->FileSize = current->audioInfo.FileSize;
songToFind->FileType = current->audioInfo.FileType;
... ...
... ... @@ -309,6 +309,8 @@ T_JZsdkReturnCode AudioFile_FlushAudioList()
//打印一遍已加载的音乐
JZsdk_PrintfAuidoNode_AudioList(g_AudioList);
JZSDK_LOG_INFO("刷新歌曲列表已完成");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -636,6 +638,8 @@ T_JZsdkReturnCode AudioFile_SaveAudioFileStop(int checkFlag, unsigned char *Chec
g_AudioFile_SaveAudioFile_NameFp = NULL;
g_AudioFile_SaveAudioFile_len = 0; //置零长度
JZsdk_RunSystemCmd("sync");
if (checkFlag != JZ_FLAGCODE_OFF)
{
//校验文件
... ... @@ -676,6 +680,8 @@ T_JZsdkReturnCode AudioFile_SaveAudioFileStop(int checkFlag, unsigned char *Chec
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZsdk_RunSystemCmd("sync");
//2、关闭标志位
AudioFile_save_flag = 0;
... ... @@ -720,12 +726,13 @@ T_JZsdkReturnCode AudioFile_GetAudioInfo(unsigned char *str, unsigned int str_le
T_JZsdkReturnCode ret;
//1、查询该名字是否存在于音乐列表中
memset(songToFind->FileName, 0 ,sizeof(songToFind->FileName));
memcpy(songToFind->FileName, str, str_len);
ret = JZsdk_isSongInAudioList(g_AudioList, (*songToFind));
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("播放文件不存在于音乐列表");
JZSDK_LOG_ERROR("播放文件不存在于音乐列表 %s", songToFind->FileName);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
... ...
... ... @@ -188,7 +188,7 @@ static void *MegTempRead_task(void *arg)
int fd = open("/dev/sunxi_adc",O_RDWR);
if(fd < 0)
{
return;
return NULL;
JZSDK_LOG_ERROR("测温模块出错");
}
... ...
... ... @@ -1174,8 +1174,8 @@ T_JZsdkReturnCode Megaphone_SetVolume(int value, int mode)//设置音é‡ï¼ŒéŸ³é‡
now_volume=value;//获取当前音量
//10T要提高30初始音量
if (DEVICE_VERSION == JZ_H10T)
//v3s自设系统 10T要提高30初始音量
if (DEVICE_VERSION == JZ_H10T || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
if (value > 0)
{
... ... @@ -1190,29 +1190,12 @@ T_JZsdkReturnCode Megaphone_SetVolume(int value, int mode)//设置音é‡ï¼ŒéŸ³é‡
else if(value>0&&value<100)
{
if (DEVICE_VERSION == JZ_U3)
{
value=value*g_Max_volume/100 *63/100;
}
else
{
value=value*g_Max_volume/100 *255/100;
}
value=value*g_Max_volume/100 *255/100;
}
else if(value>=100)
{
if (DEVICE_VERSION == JZ_U3)
{
value=100*g_Max_volume/100 *63/100;
}
else
{
value=100*g_Max_volume/100 *255/100;
}
value=100*g_Max_volume/100 *255/100;
}
int* set_volume_value_ptr = malloc(sizeof(int)); // 动态分配内存
... ... @@ -1244,8 +1227,8 @@ static T_JZsdkReturnCode Megaphone_SetTTSvolume()
int value = now_volume;
printf("TTS音量修改\n");
//10T要提高30初始音量
if (DEVICE_VERSION == JZ_H10T)
//v3s自设系统 10T要提高30初始音量
if (DEVICE_VERSION == JZ_H10T || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
if (value > 0)
{
... ... @@ -1261,29 +1244,12 @@ static T_JZsdkReturnCode Megaphone_SetTTSvolume()
else if(value>0&&value<100)
{
if (DEVICE_VERSION == JZ_U3)
{
value=value*g_TTS_Max_volume/63 *63/100;
}
else
{
value=value*g_TTS_Max_volume/100 *255/100;
}
value=value*g_TTS_Max_volume/100 *255/100;
}
else if(value>=100)
{
if (DEVICE_VERSION == JZ_U3)
{
value=100*g_TTS_Max_volume/100 *63/100;
}
else
{
value=100*g_TTS_Max_volume/100 *255/100;
}
value=100*g_TTS_Max_volume/100 *255/100;
}
int* set_volume_value_ptr = malloc(sizeof(int)); // 动态分配内存
... ...
... ... @@ -57,7 +57,7 @@ static T_JZsdkReturnCode TTS_Synthesis(const char* src_text, const char* params)
{
/* 获取合成音频 */
//const void* data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);
unsigned char *data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);
unsigned char *data = (unsigned char *)QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);
if (ret != MSP_SUCCESS)
{
break;
... ...
... ... @@ -25,14 +25,9 @@ extern "C" {
#if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
#define MAX_VOLUME (61)
#define MAX_TTS_VOLUME (75)
//#define MAX_VOLUME (43)
//#define MAX_TTS_VOLUME (53)
#elif DEVICE_VERSION == JZ_H1E
#define MAX_VOLUME (75)
#define MAX_TTS_VOLUME (82)
// #define MAX_VOLUME (100)
// #define MAX_TTS_VOLUME (100)
#elif DEVICE_VERSION == JZ_H1T
// #define MAX_VOLUME 75
// #define MAX_TTS_VOLUME 84
... ... @@ -45,22 +40,18 @@ extern "C" {
#elif DEVICE_VERSION == JZ_H10
#define MAX_VOLUME (65)
#define MAX_TTS_VOLUME (70) //115
//#define MAX_VOLUME (80)
//#define MAX_TTS_VOLUME (86) //119
//#define MAX_VOLUME (95)
//#define MAX_TTS_VOLUME (95)
#elif DEVICE_VERSION == JZ_H10T
#define MAX_VOLUME (83)
#define MAX_TTS_VOLUME (83)
#elif DEVICE_VERSION == JZ_U3
#define MAX_VOLUME (100)
#define MAX_TTS_VOLUME (100)
#define MAX_VOLUME (74)
#define MAX_TTS_VOLUME (82)
#elif DEVICE_VERSION == JZ_U3D
#define MAX_VOLUME (80)
#define MAX_TTS_VOLUME (90)
#define MAX_VOLUME (73)
#define MAX_TTS_VOLUME (81)
#elif DEVICE_VERSION == JZ_U30
#define MAX_VOLUME (80)
#define MAX_TTS_VOLUME (90)
#define MAX_VOLUME (74)
#define MAX_TTS_VOLUME (82)
#elif DEVICE_VERSION == JZ_U3S
#define MAX_VOLUME (74)
#define MAX_TTS_VOLUME (82)
... ...
... ... @@ -9,6 +9,7 @@
#include "../../Megaphone.h"
#include "version_choose.h"
#include "AudioDeal/AudioDeal.h"
#include "AudioDeal/NoiseReduction/NoiseReduction.h"
#include "opus.h"
... ... @@ -174,7 +175,7 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len
for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++)
{
TempPcm [i] = out[i] & 0xFF | (out[i] >> 8) << 8;
TempPcm[i] = out[i] & 0xFF | (out[i] >> 8) << 8;
TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
pcm_bytes[2 * i] = TempPcm[i] & 0xFF;
... ...
... ... @@ -171,6 +171,8 @@ T_JZsdkReturnCode Opus_RecordVoice_PlayFixedFile()
JZSDK_LOG_ERROR("创建Opus_PlayFixedFile线程失败!\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -334,6 +336,8 @@ static T_JZsdkReturnCode Opus_RecordVoice_DecodeFixedFile()
JZSDK_LOG_ERROR("创建DecodeAudioData_task线程失败!\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
... ... @@ -423,7 +427,7 @@ static T_JZsdkReturnCode Opus_Decode()
for (i = 0; i < OPUS_CHANNELS * frame_size; i++) {
TempPcm [i] = out[i] & 0xFF | (out[i] >> 8) << 8;
TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
//TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
}
fwrite(TempPcm, sizeof(short), frame_size * OPUS_CHANNELS, fout);
... ... @@ -463,7 +467,7 @@ DecodeFinsh:
}
//解码完成
printf("Decode Finished...\n");
JZSDK_LOG_INFO("Decode Finished...\n");
OpusDecode_Flag = JZ_FLAGCODE_OFF;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
... ... @@ -857,6 +857,8 @@ T_JZsdkReturnCode JZsdk_Psdk_Ui_io_Gimbal_PitchRotationMode(int Pitch)
//1、将得到的拨轮pitch值裁切,避免变化角度过大
int CutPitch = Pitch/50;
//printf("拨轮控制pitch%d\n",Pitch);
Gimbal_PitchRotationMode(CutPitch);
}
... ... @@ -890,6 +892,7 @@ T_JZsdkReturnCode JZsdk_Psdk_Ui_io_Gimbal_PitchScaleMode(int value)
T_JZsdkReturnCode JZsdk_Psdk_Ui_io_Gimbal_PitchSelfangleMode(int Pitch)
{
//printf("飞机自身角度pitch%d\n",Pitch);
Gimbal_PitchSelfangleMode(Pitch);
}
... ...
... ... @@ -1049,6 +1049,7 @@ T_JZsdkReturnCode UIcontrol_Obtain_GimbalLinkage(int DeviceName, int GimbalLinka
**********/
T_JZsdkReturnCode UIcontrol_Set_SearchLightFrequency(int DeviceName,int value)
{
#ifdef LIGHTING_STATUS_ON
//调用探照灯的接口
T_JZsdkReturnCode ret = Lighting_Set_SearchLightFrequency(value);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
... ... @@ -1086,6 +1087,7 @@ T_JZsdkReturnCode UIcontrol_Set_SearchLightFrequency(int DeviceName,int value)
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
... ... @@ -1096,6 +1098,7 @@ T_JZsdkReturnCode UIcontrol_Set_SearchLightFrequency(int DeviceName,int value)
**********/
T_JZsdkReturnCode UIcontrol_SearchLightControl(int DeviceName, int value)
{
#ifdef LIGHTING_STATUS_ON
//调用探照灯的灯光模式接口
T_JZsdkReturnCode ret = Lighting_SearchLightControl(value);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
... ... @@ -1133,6 +1136,8 @@ T_JZsdkReturnCode UIcontrol_SearchLightControl(int DeviceName, int value)
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
/*********
... ... @@ -1142,6 +1147,7 @@ T_JZsdkReturnCode UIcontrol_SearchLightControl(int DeviceName, int value)
**********/
T_JZsdkReturnCode UIcontrol_Set_SearchLightLumen(int DeviceName, int WeatherFlush, int value1, int value2)
{
#ifdef LIGHTING_STATUS_ON
//检查是否合法
if (value1 >= 100)
{
... ... @@ -1204,6 +1210,7 @@ T_JZsdkReturnCode UIcontrol_Set_SearchLightLumen(int DeviceName, int WeatherFlus
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
/*********
... ... @@ -1213,8 +1220,10 @@ T_JZsdkReturnCode UIcontrol_Set_SearchLightLumen(int DeviceName, int WeatherFlus
**********/
T_JZsdkReturnCode UIcontrol_CheckStatus_SearchLightLightAttribute(int *ValueFrequency, int *ValueMode, int *ValueLeftLumen, int *ValueRightLumen)
{
#ifdef LIGHTING_STATUS_ON
//获取本地的灯光属性,并主动刷新一次灯光属性
Lighting_CheckStatus_SearchLightLightAttribute(ValueFrequency, ValueMode, ValueLeftLumen, ValueRightLumen);
#endif
}
/*********
... ... @@ -1224,8 +1233,10 @@ T_JZsdkReturnCode UIcontrol_CheckStatus_SearchLightLightAttribute(int *ValueFreq
**********/
T_JZsdkReturnCode UIcontrol_CheckStatus_SearchLightTemperture(int *ValueLeftTemperature, int *ValueRightTemperaturen)
{
#ifdef LIGHTING_STATUS_ON
//获取本地的灯光温度,并主动刷新一次灯光温度
Lighting_CheckStatus_SearchLightTemperture(ValueLeftTemperature, ValueRightTemperaturen);
#endif
}
/****************************************************************************************************************************************
... ... @@ -1236,6 +1247,7 @@ T_JZsdkReturnCode UIcontrol_CheckStatus_SearchLightTemperture(int *ValueLeftTemp
//设置警灯状态
T_JZsdkReturnCode UIcontrol_Set_WarningLight_ModeControl(int DeviceName, int value1, int value2)
{
#ifdef LIGHTING_STATUS_ON
//调用探照灯的接口
T_JZsdkReturnCode ret = Lighting_Set_WarningLight_Status(value1, value2);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
... ... @@ -1274,11 +1286,13 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_ModeControl(int DeviceName, int val
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
//设置警灯颜色
T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, int value2)
{
#ifdef LIGHTING_STATUS_ON
//调用探照灯的接口
T_JZsdkReturnCode ret = Lighting_Set_WarningLight_Color(value1, value2);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
... ... @@ -1316,6 +1330,7 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, i
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
... ... @@ -1326,8 +1341,10 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, i
**********/
T_JZsdkReturnCode UIcontrol_CheckStatus_WarningLightStatus(int *ValueSwitch, int *ValueMode)
{
#ifdef LIGHTING_STATUS_ON
//获取本地的警灯状态,并主动刷新一次警灯状态
Lighting_CheckStatus_WarningLightStatus(ValueSwitch, ValueMode);
#endif
}
/*********
... ... @@ -1337,8 +1354,10 @@ T_JZsdkReturnCode UIcontrol_CheckStatus_WarningLightStatus(int *ValueSwitch, int
**********/
T_JZsdkReturnCode UIcontrol_CheckStatus_WarningLightColor(int *ValueColor1, int *ValueColor2)
{
#ifdef LIGHTING_STATUS_ON
//获取本地的警灯颜色,并主动刷新一次警灯颜色
Lighting_CheckStatus_WarningLightColor(ValueColor1, ValueColor2);
#endif
}
/****************************************************************************************************************************************
... ... @@ -1469,6 +1488,7 @@ T_JZsdkReturnCode UIcontrol_CheckStatus_OutPutPowerValue(int *Value)
**********/
T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Frequency(int DeviceName, int Frequency)
{
#ifdef LIGHTING_STATUS_ON
//1、设置本地存储值
Lighting_Obtain_SearchLightFrequency(Frequency);
... ... @@ -1494,6 +1514,7 @@ T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Frequency(int DeviceName, int Freq
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
/*********
... ... @@ -1503,6 +1524,7 @@ T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Frequency(int DeviceName, int Freq
**********/
T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Mode(int DeviceName, int mode)
{
#ifdef LIGHTING_STATUS_ON
//1、设置本地存储值
Lighting_Obtain_SearchLightMode(mode);
... ... @@ -1528,6 +1550,7 @@ T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Mode(int DeviceName, int mode)
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
/*********
... ... @@ -1537,6 +1560,7 @@ T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Mode(int DeviceName, int mode)
**********/
T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Lumen(int DeviceName, int LeftLumen, int RightLumen)
{
#ifdef LIGHTING_STATUS_ON
//1、设置本地存储值
Lighting_Obtain_SearchLightLumen(LeftLumen, RightLumen);
... ... @@ -1563,6 +1587,7 @@ T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Lumen(int DeviceName, int LeftLume
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
/*********
... ... @@ -1572,6 +1597,7 @@ T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Lumen(int DeviceName, int LeftLume
**********/
T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Temperature(int DeviceName, int LeftTemperature, int RightTemperature)
{
#ifdef LIGHTING_STATUS_ON
//1、设置本地存储值
Lighting_Obtain_SearchLightTemperature(LeftTemperature, RightTemperature);
... ... @@ -1598,6 +1624,7 @@ T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Temperature(int DeviceName, int Le
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
/****************************************************************************************************************************************
... ... @@ -1612,6 +1639,7 @@ T_JZsdkReturnCode UIcontrol_ObtainSearchLight_Temperature(int DeviceName, int Le
**********/
T_JZsdkReturnCode UIcontrol_ObtainWarningLight_Status(int DeviceName, int status, int mode)
{
#ifdef LIGHTING_STATUS_ON
//1、设置本地存储值
Lighting_Obtain_WarningLight_Status(status, mode);
... ... @@ -1637,6 +1665,7 @@ T_JZsdkReturnCode UIcontrol_ObtainWarningLight_Status(int DeviceName, int status
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
/*********
... ... @@ -1646,6 +1675,7 @@ T_JZsdkReturnCode UIcontrol_ObtainWarningLight_Status(int DeviceName, int status
**********/
T_JZsdkReturnCode UIcontrol_ObtainWarningLight_Color(int DeviceName, int color1, int color2)
{
#ifdef LIGHTING_STATUS_ON
//1、设置本地存储值
Lighting_Obtain_WarningLight_Color(color1, color2);
... ... @@ -1671,6 +1701,7 @@ T_JZsdkReturnCode UIcontrol_ObtainWarningLight_Color(int DeviceName, int color1,
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
/****************************************************************************************************************************************
... ... @@ -1688,6 +1719,11 @@ T_JZsdkReturnCode UIcontrol_ObtainGimbal_Pitch(int DeviceName, int GimbalPitchAn
//1、设置本地存储值
Gimbal_Obtain_Gimbal_Pitch(GimbalPitchAngle);
#if DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U30
//无变化
#else
//通知其他设备的ui界面变化
//如果4G模块有启动
if ((JZsdk_Get_UartDev_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
... ... @@ -1709,6 +1745,7 @@ T_JZsdkReturnCode UIcontrol_ObtainGimbal_Pitch(int DeviceName, int GimbalPitchAn
{
JZsdk_Psdk_UI_io_Reply_GimbalPitchAngle(GimbalPitchAngle);
}
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
# cmake 最低版本要求 第三行名字不能动
cmake_minimum_required(VERSION 2.8)
project(ATTENTION_APP)
set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++")
#"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。
#"-std=gnu99":指定C语言标准为GNU C99(也就是C99加上GNU的扩展特性),该标准对于一些特性和库的使用是必须的。
#"-lm":指定在编译时链接数学库,以使用一些数学函数。
#"-ldl":指定在编译时链接动态库加载库,以使用动态加载。
#"-lstdc++":指定在编译时链接C++标准库,以使用C++的一些特性和函数。
set(CMAKE_EXE_LINKER_FLAGS "-pthread")
#预留行
set(DEVICE_TYPE MEGAPHONE)
#预留行
#预留行
#预留行
#预留行
#预留行
#预留行
set(ROOT_DIRS "${CMAKE_CURRENT_LIST_DIR}/../../")
# 包含模块配置
include(${ROOT_DIRS}CmakeConfig/Compiler.cmake)
include(${ROOT_DIRS}CmakeConfig/module_config.cmake)
include(${ROOT_DIRS}CmakeConfig/module_build.cmake)
# 加载jzsdk的头文件  *****************************************************
include_directories(${ALL_INC_FILES})
# 生成可执行文件
add_executable(
ATTENTION_APP
./application/main.c
./application/Megaphone_Attention.c
${ALL_SRC_FILES} #加载jzsdk的源文件 *****************************************************
)
include(${ROOT_DIRS}CmakeConfig/module_lib_loading.cmake)
... ...
1
2
0
0
改动备注:2024/8所做
\ No newline at end of file
... ...