作者 潘浩彬

合并分支 'dev_00.00.02.29' 到 'dev'

02.29 优化speex库和实时喊话,并能正常使用了,同时优化了UI的接口,修改了控件

避免了某个全局变量被越界。

查看合并请求 !5
... ... @@ -463,7 +463,7 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_T40S")
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
# 添加speex音频处理模块
# set(SPEEX_MODULE VERSION_SWITCH_ON)
set(SPEEX_MODULE VERSION_SWITCH_ON)
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
... ...
/* 头文件 ------------------------------------------------------------------*/
/* 头文件 ------------------------------------------------------------------*/
#include "JZsdk_logger.h"
#include "JZsdkLib.h"
#include <stdarg.h>
... ...
... ... @@ -5,10 +5,8 @@
#include <unistd.h>
#include <time.h>
#define JZSDK_LOG_PATH "/root/sdcard/JZLOG/" //sd卡存放路径
#define JZSDK_LOG_INDEX_PATH "/root/JZLOG/" //sd卡存放序号文件路径
#define JZSDK_LOG_PATH "/root/JZLOG/" //sd卡存放路径
#define JZSDK_LOG_INDEX_FILE_NAME "/root/JZLOG/thelast" //sd卡存放序号文件路径
#define JZSDK_LOG_SD_INDEX_FILE_NAME "/root/sdcard/JZLOG/thelast" //sd卡存放序号文件路径
#define JZ_LOG_FOLDER_NAME_MAX_SIZE (32)
#define JZ_LOG_MAX_COUNT (10)
... ... @@ -35,16 +33,9 @@ static T_JZsdkReturnCode createJZLOGFolder()
JZsdk_Osal_Mkdir(JZSDK_LOG_PATH);
}
if(JZsdk_check_directory_exists_posix(JZSDK_LOG_INDEX_PATH) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZsdk_Osal_Mkdir(JZSDK_LOG_INDEX_PATH);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_JZsdkReturnCode JzUser_PrintConsole(const JZ_U8 *data, JZ_U16 dataLen)
{
dataLen = dataLen;
... ... @@ -62,17 +53,16 @@ static T_JZsdkReturnCode JzUser_LocalWrite(const JZ_U8* data, JZ_U16 dataLen)
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
realLen = fwrite(data, 1, dataLen, logFile);
fflush(logFile);
if (realLen != dataLen)
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
//这里后续考虑加入保存fileno
//if (fflush(logFile) != 0)
//fflush(logFile);
//if (realLen != dataLen)
// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
//if (fsync(fileno(logFile)) != 0)
// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
//这里后续考虑加入保存fileno
if (fflush(logFile) != 0)
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
if (fsync(fileno(logFile)) != 0)
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -88,22 +78,13 @@ static T_JZsdkReturnCode JzUser_LocalWriteFsInit(const JZ_U8 *path)
uint16_t currentLogFileIndex;
uint8_t ret;
if (localTime == NULL)
{
printf("Get local time error.\r\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//1、检查sd卡的计数文件是否存在, 如果不存在,则移除系统的计数文件
if (JZsdk_check_file_exists(JZSDK_LOG_SD_INDEX_FILE_NAME) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
memset(systemCmd, 0, sizeof(systemCmd));
sprintf(systemCmd, "rm -f %s", JZSDK_LOG_INDEX_FILE_NAME);
ret = system(systemCmd);
}
//2、打开计数文件,获取当前日志文件序号,并更新日志文件序号
//打开计数文件,获取当前日志文件序号,并更新日志文件序号
logFileCnt = fopen(JZSDK_LOG_INDEX_FILE_NAME, "rb+");
if (logFileCnt == NULL)
{
... ... @@ -147,22 +128,6 @@ static T_JZsdkReturnCode JzUser_LocalWriteFsInit(const JZ_U8 *path)
fclose(logFileCnt);
////移除sd卡的计数文件
//memset(systemCmd, 0, sizeof(systemCmd));
//sprintf(systemCmd, "rm -f %sthelast", JZSDK_LOG_PATH);
//ret = system(systemCmd);
//if (ret != 0) {
// JZSDK_LOG_ERROR("Remove file error, ret:%d.\r\n", ret);
//}
//复制日志计数文件到sd卡
memset(systemCmd, 0, sizeof(systemCmd));
sprintf(systemCmd, "cp %s %s/thelast", JZSDK_LOG_INDEX_FILE_NAME, JZSDK_LOG_PATH);
ret = system(systemCmd);
if (ret != 0) {
JZSDK_LOG_ERROR("Copy file error, ret:%d.\r\n", ret);
}
//开始打开log文件
sprintf(filePath, "%s_%04d_%04d%02d%02d_%02d-%02d-%02d.log", path, currentLogFileIndex,
localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
... ... @@ -174,16 +139,16 @@ static T_JZsdkReturnCode JzUser_LocalWriteFsInit(const JZ_U8 *path)
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
if (logFileIndex >= JZ_LOG_MAX_COUNT)
{
//把多余的日志删除
sprintf(systemCmd, "rm -rf %s_%04d*.log", path, currentLogFileIndex - JZ_LOG_MAX_COUNT);
ret = system(systemCmd);
if (ret != 0) {
printf("Remove file error, ret:%d.\r\n", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
//if (logFileIndex >= JZ_LOG_MAX_COUNT)
//{
// //把多余的日志删除
// sprintf(systemCmd, "rm -rf %s_%04d*.log", path, currentLogFileIndex - JZ_LOG_MAX_COUNT);
// ret = system(systemCmd);
// if (ret != 0) {
// printf("Remove file error, ret:%d.\r\n", ret);
// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
// }
//}
//往日志中写入utf8识别符
fputc(0xEF, logFile);
... ...
... ... @@ -16,7 +16,7 @@
#include "Hal_Send/HalSend.h"
#include "SideLaser/SideLaser.h"
#include "UI_control/Psdk_ui_value_menu.h"
#include "UI_control/Psdk_UI_io.h"
#include "UI_control/UI_control.h"
#include "../../ParamterParsing.h"
... ...
... ... @@ -23,7 +23,7 @@
#define MODIFY_VERSION_TEN_POSITION 1
#define MODIFY_VERSION_ONE_POSITION 5
#define DEBUG_VERSION_TEN_POSITION 0
#define DEBUG_VERSION_ONE_POSITION 4
#define DEBUG_VERSION_ONE_POSITION 6
#define FIRMWARE_ORIGIN DOMESTIC_VERSION
... ...
#include <stdio.h>
#include <stdio.h>
#include <pthread.h>
#include <alsa/asoundlib.h>
#include <stdlib.h>
... ... @@ -189,6 +189,42 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RecordSteam(int In_Bitrate, unsigned ch
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*************
*
* 实时语音语音类型的pcm数据导入接口 char
*
* 区别
* a 使用语音专用的滤波
* b 需要进行回音消除
*
*
* **********************/
T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam_byChar(int In_Bitrate, unsigned char* buffer, int bytesRead)
{
if (AudioDeakInfo_index == NULL)
{
JZSDK_LOG_ERROR("音频处理器未注册");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
while (Audiodeal_status != JZ_FLAGCODE_ON)
{
delayMs(1);
}
int DateType = 0x02;
//1、打开音频库的处理标志位,该标志可以重复打开,只有强制关闭音频时,需要关闭该标志
AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_ON;
//默认数据pcm接入口都是 单声道,16位
PCM_PooL_Interface_PcmData(AudioDeakInfo_index, In_Bitrate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16, buffer, bytesRead, DateType);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*************
*
* 实时语音语音类型的pcm数据导入接口
... ... @@ -197,8 +233,10 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RecordSteam(int In_Bitrate, unsigned ch
* a 使用语音专用的滤波
* b 需要进行回音消除
*
* 正常16000的opus解出来的framesize是640长度的short
*
* **********************/
T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, unsigned char *buffer, int bytesRead)
T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, short *buffer, int frame_size)
{
if (AudioDeakInfo_index == NULL)
{
... ... @@ -221,29 +259,23 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, unsigned
#ifdef SPEEX_STATUS_ON
short TempPcm[bytesRead / 2];
short OutPcm[bytesRead / 2];
for (int i = 0; i < bytesRead / 2; i++)
{
TempPcm[i] = (buffer[2*i] & 0xFF) | (((short)buffer[2*i + 1]) << 8);
}
//送去回音消除
T_JZsdkReturnCode ret = Speex_DealData(TempPcm, OutPcm, bytesRead / 2);
// if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
// {
// //将输出的pcm还原回u8型到数据缓冲区
// for (int i = 0; i < bytesRead / 2; i++)
// {
// buffer[2*i] = (OutPcm[i] & 0xFF);
// buffer[2*i + 1] = ((OutPcm[i] >> 8) & 0xFF);
// }
// }
//回音消除+噪声抑制
Speex_ProcessMic(buffer, buffer);
#endif
unsigned char pcm_buffer[640 * 2];
int pcm_bytes = 640 * 2;
//把short类型的数据转换为char型输入到播放器
for (int i = 0; i < 640; i++)
{
pcm_buffer[2 * i] = buffer[i] & 0xFF;
pcm_buffer[2 * i + 1] = (buffer[i] >> 8) & 0xFF;
}
//默认数据pcm接入口都是 单声道,16位
PCM_PooL_Interface_PcmData(AudioDeakInfo_index, In_Bitrate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16, buffer, bytesRead, DateType);
PCM_PooL_Interface_PcmData(AudioDeakInfo_index, In_Bitrate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16, pcm_buffer, pcm_bytes, DateType);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
/**
/**
********************************************************************
* @file AudioDeal.h
* AudioDeal的头文件
... ... @@ -103,7 +103,8 @@ T_JZsdkReturnCode AudioDeal_Init();
T_JZsdkReturnCode AudioDeal_PcmDataInput_TextSteam(int In_Bitrate, unsigned char *buffer, int bytesRead);
T_JZsdkReturnCode AudioDeal_PcmDataInput_RecordSteam(int In_Bitrate, unsigned char *buffer, int bytesRead);
T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, unsigned char *buffer, int bytesRead);
T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, short* buffer, int frame_size);
T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam_byChar(int In_Bitrate, unsigned char* buffer, int bytesRead);
T_JZsdkReturnCode AudioDeal_EchoCancellation_Init(int SampleRate);
... ...
#include "JZsdkLib.h"
#include "JZsdkLib.h"
#include "version_choose.h"
//main函数参数一是原始pcm文件名,参数二是去噪后的pcm文件名
#ifdef SPEEX_STATUS_ON
#include <stdio.h>
#include <string.h>
#include "speex/speex_echo.h" // Speex 回声消除头文件
#include "speex/speex_preprocess.h" // Speex 预处理头文件
/*
graph LR
A[原始语音信号] --> B[预处理]
B --> C[语言检测]
C -->|英语| D[英语参数配置]
C -->|汉语| E[汉语参数配置]
C -->|法语| F[法语参数配置]
D --> G[Speex编码器]
E --> H[Speex编码器]
F --> I[Speex编码器]
G --> J[输出编码数据]
H --> J
I --> J
*/
#define TAIL_TIME 500 //回声尾长,单位毫秒
typedef struct JZ_SpeexInfo{
//处理的音频样本长度, 一般对应10~20ms的音频数据,太小会增加计算开销,太大会增加处理延迟
int DealSampleLen;
/*
回声尾长 表示需要消除的回声持续时间(以样本数计) 建议值对应100-500毫秒的音频数据
对于8kHz采样率:800-4000个样本
对于16kHz采样率:1600-8000个样本
*/
int TailLen;
//音频采样率
#include "speex/speex_echo.h"
#include "speex/speex_preprocess.h"
// ========== 可配置参数 ==========
#define TAIL_MS 300 // 回声尾长(毫秒)
#define FRAME_SAMPLES 640 // 每帧样本数 640个short
#define SAMPLE_RATE 16000 // 采样率
#define PLAYBACK_DELAY_FRAMES 1 // 播放延迟(帧数),1 表示用上一帧作为参考
// =================================
typedef struct JZ_SpeexInfo {
int SampleRate;
int FrameSize;
int TailLen; // 回声尾长(样本数)
int PlaybackDelaySamples; // 播放延迟(样本数)
// Speex回声消除状态
SpeexEchoState *EchoState;
SpeexEchoState* EchoState;
SpeexPreprocessState* PreprocessState;
// Speex预处理状态
SpeexPreprocessState *PreprocessState;
// 环形缓冲区,存储历史输出帧(即播放过的数据)
short* HistoryBuffer;
int HistorySize; // 缓冲区总长度(样本数)
int WritePos; // 下一个写入位置
int TotalWritten; // 累计写入样本数(用于判断缓冲区是否足够)
// 存储回声消除的样本
short *EchoBuf;
int EchoBufLen;
SpeexPreprocessState* DenoiseOnlyState;
int DenoiseOnlyFlag; // 是否启用独立降噪模式
//标志位
int Flag;
} JZ_SpeexInfo;
static JZ_SpeexInfo g_SpeexInfo = { 0 };
// 初始化历史缓冲区
static int InitHistoryBuffer(int size_samples) {
if (g_SpeexInfo.HistoryBuffer) {
free(g_SpeexInfo.HistoryBuffer);
g_SpeexInfo.HistoryBuffer = NULL;
}
g_SpeexInfo.HistoryBuffer = (short*)malloc(size_samples * sizeof(short));
if (!g_SpeexInfo.HistoryBuffer) return -1;
memset(g_SpeexInfo.HistoryBuffer, 0, size_samples * sizeof(short));
g_SpeexInfo.HistorySize = size_samples;
g_SpeexInfo.WritePos = 0;
g_SpeexInfo.TotalWritten = 0;
return 0;
}
// 写入一帧到历史缓冲区(播放过的帧)
static void WriteHistoryFrame(short* frame) {
int fs = g_SpeexInfo.FrameSize;
int hist_size = g_SpeexInfo.HistorySize;
int write_pos = g_SpeexInfo.WritePos;
if (write_pos + fs <= hist_size) {
memcpy(g_SpeexInfo.HistoryBuffer + write_pos, frame, fs * sizeof(short));
}
else {
int first_part = hist_size - write_pos;
memcpy(g_SpeexInfo.HistoryBuffer + write_pos, frame, first_part * sizeof(short));
memcpy(g_SpeexInfo.HistoryBuffer, frame + first_part, (fs - first_part) * sizeof(short));
}
g_SpeexInfo.WritePos = (write_pos + fs) % hist_size;
g_SpeexInfo.TotalWritten += fs;
}
// 从历史缓冲区读取参考帧(对齐到当前麦克风时间)
static int ReadRefFrame(short* out_ref) {
int fs = g_SpeexInfo.FrameSize;
int hist_size = g_SpeexInfo.HistorySize;
int write_pos = g_SpeexInfo.WritePos;
int delay_samples = g_SpeexInfo.PlaybackDelaySamples;
int read_pos = write_pos - delay_samples - fs;
if (read_pos < 0) read_pos += hist_size;
}JZ_SpeexInfo;
if (g_SpeexInfo.TotalWritten < delay_samples + fs) {
return -1;
}
static JZ_SpeexInfo g_SpeexInfo = {0};
if (read_pos + fs <= hist_size) {
memcpy(out_ref, g_SpeexInfo.HistoryBuffer + read_pos, fs * sizeof(short));
}
else {
int first_part = hist_size - read_pos;
memcpy(out_ref, g_SpeexInfo.HistoryBuffer + read_pos, first_part * sizeof(short));
memcpy(out_ref + first_part, g_SpeexInfo.HistoryBuffer, (fs - first_part) * sizeof(short));
}
return 0;
}
T_JZsdkReturnCode Speex_Deinit()
{
if (g_SpeexInfo.Flag == JZ_FLAGCODE_ON)
{
speex_echo_state_destroy(g_SpeexInfo.EchoState); // 释放回声消除状态
speex_preprocess_state_destroy(g_SpeexInfo.PreprocessState); // 释放预处理状态
if (g_SpeexInfo.EchoState)
{
speex_echo_state_destroy(g_SpeexInfo.EchoState);
g_SpeexInfo.EchoState = NULL;
}
memset(&(g_SpeexInfo.EchoBuf), 0, sizeof(g_SpeexInfo.EchoBuf));
g_SpeexInfo.EchoBufLen = 0;
if (g_SpeexInfo.PreprocessState)
{
speex_preprocess_state_destroy(g_SpeexInfo.PreprocessState);
g_SpeexInfo.PreprocessState = NULL;
}
if (g_SpeexInfo.EchoBuf != NULL)
if (g_SpeexInfo.HistoryBuffer)
{
free(g_SpeexInfo.EchoBuf);
g_SpeexInfo.EchoBuf = NULL;
free(g_SpeexInfo.HistoryBuffer);
g_SpeexInfo.HistoryBuffer = NULL;
}
memset(&g_SpeexInfo, 0, sizeof(g_SpeexInfo));
g_SpeexInfo.Flag = JZ_FLAGCODE_OFF;
}
JZSDK_LOG_DEBUG("Speex_Deinit success\n");
//降噪注销
if (g_SpeexInfo.DenoiseOnlyState)
{
speex_preprocess_state_destroy(g_SpeexInfo.DenoiseOnlyState);
g_SpeexInfo.DenoiseOnlyState = NULL;
}
JZSDK_LOG_DEBUG("Speex_Deinit success\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode Speex_Init(int SampleRate)
// 初始化
// sample_rate: 采样率(如 16000)
T_JZsdkReturnCode Speex_Init(int sample_rate)
{
//检查speex的参数
if (g_SpeexInfo.Flag == JZ_FLAGCODE_ON)
{
Speex_Deinit();
}
g_SpeexInfo.SampleRate = SampleRate;
int frame_samples = FRAME_SAMPLES;
int playback_delay_frames = PLAYBACK_DELAY_FRAMES;
//计算长度
g_SpeexInfo.TailLen = SampleRate * TAIL_TIME / 1000 ; //可以×1.2作为余量
g_SpeexInfo.DealSampleLen = 640; //16000 * time / 1000 //目前是因为程序写死了80 后面可以改
g_SpeexInfo.SampleRate = sample_rate;
g_SpeexInfo.FrameSize = frame_samples;
g_SpeexInfo.TailLen = sample_rate * TAIL_MS / 1000;
g_SpeexInfo.PlaybackDelaySamples = playback_delay_frames * frame_samples;
// 初始化回声消除状态
g_SpeexInfo.EchoState = speex_echo_state_init(g_SpeexInfo.DealSampleLen, g_SpeexInfo.TailLen);
g_SpeexInfo.PreprocessState = speex_preprocess_state_init(g_SpeexInfo.DealSampleLen, g_SpeexInfo.SampleRate); // 初始化预处理状态
int hist_size = g_SpeexInfo.TailLen + g_SpeexInfo.PlaybackDelaySamples + frame_samples * 2;
//设置采样率
speex_echo_ctl(g_SpeexInfo.EchoState, SPEEX_ECHO_SET_SAMPLING_RATE, &(g_SpeexInfo.SampleRate));
g_SpeexInfo.EchoState = speex_echo_state_init(frame_samples, g_SpeexInfo.TailLen);
if (!g_SpeexInfo.EchoState) {
JZSDK_LOG_DEBUG("Speex_Init: speex_echo_state_init failed\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
speex_echo_ctl(g_SpeexInfo.EchoState, SPEEX_ECHO_SET_SAMPLING_RATE, &sample_rate);
g_SpeexInfo.PreprocessState = speex_preprocess_state_init(frame_samples, sample_rate);
if (!g_SpeexInfo.PreprocessState)
{
speex_echo_state_destroy(g_SpeexInfo.EchoState);
JZSDK_LOG_DEBUG("Speex_Init: speex_preprocess_state_init failed\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//将预处理状态与回声消除状态关联
speex_preprocess_ctl(g_SpeexInfo.PreprocessState, SPEEX_PREPROCESS_SET_ECHO_STATE, g_SpeexInfo.EchoState);
//注册预处理数据数组
g_SpeexInfo.EchoBuf = (short *)malloc(g_SpeexInfo.TailLen * sizeof(short));
if (InitHistoryBuffer(hist_size) != 0) {
speex_echo_state_destroy(g_SpeexInfo.EchoState);
speex_preprocess_state_destroy(g_SpeexInfo.PreprocessState);
JZSDK_LOG_DEBUG("Speex_Init: history buffer allocation failed\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
g_SpeexInfo.Flag = JZ_FLAGCODE_ON;
JZSDK_LOG_DEBUG("Speex_Init success: sr=%d, fs=%d, tail=%d, delay=%d samples, hist=%d\n",
sample_rate, frame_samples, g_SpeexInfo.TailLen,
g_SpeexInfo.PlaybackDelaySamples, hist_size);
JZSDK_LOG_DEBUG("Speex_Init success\n");
/***********************************
降噪配置
*************************************/
g_SpeexInfo.DenoiseOnlyState = speex_preprocess_state_init(FRAME_SAMPLES, sample_rate);
if (!g_SpeexInfo.DenoiseOnlyState) {
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
// 在 Speex_Init 中,创建 DenoiseOnlyState 后添加:
int vad = 0;
speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_VAD, &vad);
int agc = 0;
speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_AGC, &agc);
int denoise = 1; // 保持开启
speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_DENOISE, &denoise);
// 可选:关闭降噪的自动增益补偿
int noise_suppress = 0; // 或者尝试 1,2...
speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &noise_suppress);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode Speex_DealData(short *InData, short *OutData, int frame_size)
// 独立降噪处理(char* 版本,原地处理)
T_JZsdkReturnCode Speex_DenoiseOnly_Process(short* mic, short* out)
{
if (g_SpeexInfo.Flag == JZ_FLAGCODE_OFF)
if (!g_SpeexInfo.DenoiseOnlyState)
{
if (out != mic) memcpy(out, mic, FRAME_SAMPLES * sizeof(short));
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//填充回声消除的样本
if (g_SpeexInfo.EchoBufLen < g_SpeexInfo.TailLen)
{
memcpy(&(g_SpeexInfo.EchoBuf[g_SpeexInfo.EchoBufLen]), InData, frame_size * sizeof(short));
g_SpeexInfo.EchoBufLen += frame_size;
}
//如果里面有完整数据
else if (g_SpeexInfo.EchoBufLen == g_SpeexInfo.DealSampleLen)
{
//对数据进行位移
memmove(g_SpeexInfo.EchoBuf, &(g_SpeexInfo.EchoBuf[frame_size]), (g_SpeexInfo.EchoBufLen - frame_size) * sizeof(short));
if (out != mic) memcpy(out, mic, FRAME_SAMPLES * sizeof(short));
//将新的数据填充到回声消除的样本中
memcpy(&(g_SpeexInfo.EchoBuf[g_SpeexInfo.EchoBufLen - frame_size]), InData, frame_size * sizeof(short));
}
//如果里面的数据超了
else if (g_SpeexInfo.EchoBufLen > g_SpeexInfo.TailLen)
speex_preprocess_run(g_SpeexInfo.DenoiseOnlyState, out);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 处理麦克风数据(char* 版本)
// mic: 麦克风采集的原始 PCM 字节流(长度 = frame_samples * sizeof(short) = 640 字节)
// out: 处理后的干净 PCM 字节流(长度相同,可与 mic 共用内存)
// 注意:out 同时会被保存到历史缓冲区,作为下一帧的参考信号(播放数据)
T_JZsdkReturnCode Speex_ProcessMic(short* mic, short* out)
{
if (g_SpeexInfo.Flag == JZ_FLAGCODE_OFF)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//如果没有填充完回声数组
if (g_SpeexInfo.EchoBufLen < g_SpeexInfo.TailLen)
short ref_frame[FRAME_SAMPLES]; // 用于存放参考帧
if (ReadRefFrame(ref_frame) != 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
// 历史数据不足,直接拷贝输出
if (out != mic) memcpy(out, mic, g_SpeexInfo.FrameSize * sizeof(short));
WriteHistoryFrame(out);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// // 执行回声消除
// speex_echo_cancellation(g_SpeexInfo.EchoState, InData, g_SpeexInfo.EchoBuf, OutData);
// 执行回声消除
speex_echo_cancellation(g_SpeexInfo.EchoState, mic, ref_frame, out);
// 执行后处理(噪声抑制等)
speex_preprocess_run(g_SpeexInfo.PreprocessState, out);
// // 执行预处理(如噪声抑制等)
// speex_preprocess_run(g_SpeexInfo.PreprocessState, OutData);
// 将处理后的帧写入历史缓冲区(因为它即将被播放)
WriteHistoryFrame(out);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
/**
/**
********************************************************************
* @file speex.h
* speex的头文件
... ... @@ -24,7 +24,8 @@ extern "C" {
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode Speex_DealData(short *InData, short *OutData, int frame_size);
T_JZsdkReturnCode Speex_ProcessMic(short* mic, short* out);
T_JZsdkReturnCode Speex_DenoiseOnly_Process(short* mic, short* out);
T_JZsdkReturnCode Speex_Init(int SampleRate);
#ifdef __cplusplus
... ...
... ... @@ -216,6 +216,7 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len
frame_size = WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE;
}
#if 0
//转换
opus_int16 TempPcm[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS];
... ... @@ -223,14 +224,16 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len
{
TempPcm[i] = out[i] & 0xFF | (out[i] >> 8) << 8;
#if SPECIAL_VERSION == SPECIAL_DAOTONG
TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
#endif
pcm_bytes[2 * i] = TempPcm[i] & 0xFF;
pcm_bytes[2 * i + 1] = (TempPcm[i] >> 8) & 0xFF;
}
AudioDeal_PcmDataInput_RealTimeSteam(RealTimeDecodeRate, pcm_bytes, frame_size*2);
AudioDeal_PcmDataInput_RealTimeSteam_byChar(RealTimeDecodeRate, pcm_bytes, frame_size * 2);
#else
AudioDeal_PcmDataInput_RealTimeSteam(RealTimeDecodeRate, (short*)out, frame_size);
#endif
if (decodeErrorFlag == JZ_FLAGCODE_ON)
{
... ...
#include "JZsdkLib.h"
#include "UI_control/Psdk_ui_value_menu.h"
#include "JZsdkLib.h"
#include "UI_control/Psdk_UI/jzsdk_to_psdk_ui.h"
#include "UI_control/UI_control.h"
#include "version_choose.h"
... ... @@ -13,6 +13,22 @@
#include "SideLaser/SideLaser.h"
#endif
/***********************************************************************
文件说明, pskd_api.c 用于存放psdkapi
这里的api有两个功能
wheather_control 关闭时
这里的api仅用于去修改psdk里ui的值
wheather_control 开启时
不仅用于修改ui值,还会将控制命令给到ui_api
**************************************************************************/
//警灯颜色
static int FirstWarningLight = 1;
static int SecondWarningLight = 3;
... ... @@ -75,6 +91,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Audio_PauseAndPlayContinue(int wheather_contr
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//设置到psdkui
JZsdk_PsdkUi_value_set(JZSDK_WIDGET_PLAYANDSTOP, value);
if(wheather_control == JZ_FLAGCODE_ON)
... ... @@ -109,22 +126,19 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_StopPlayAudio()
return ret;
}
// T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetVolume(int wheather_control, int value)
// {
// //后续需要优化掉
// widget_volume = value;
//T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetVolume(int wheather_control, int value)
//{
// //控件变化
// JZsdk_PsdkUi_value_set(JZSDK_WIDGET_VOLUME, value);
//
// //将音量控制值发送到UIcontrol 用于控制设备
// if(wheather_control == JZ_FLAGCODE_ON)
// {
// UIcontrol_SetVolume(DEVICE_PSDK, value, JZ_FLAGCODE_ON);
// }
//
// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }
//}
T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_speed(int wheather_control, int speed)
{
... ...
#include "JZsdkLib.h"
#include "Psdk_ui_to_jzsdk.h"
#include "./WidegMgmt/JZsdk_Widget.h"
#include "./jzsdk_to_psdk_ui.h"
#include "Psdk_UI_io.h"
#include "BaseConfig.h"
#define AUTO_CONTROL 0x02
/*
* 功率限制
*
* flag == 1 , 输入的为音量
*/
static T_JZsdkReturnCode Psdk_ui_to_jzsdk_PowerLimit(int flag, int value)
{
if (flag == 0)
{
}
//输入的value为音量
else if(flag == 1)
{
//这几台设备有 音量和亮度的限制
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
//获取当前设备的亮度
int lumen = 0;
if (value + lumen > 150)
{
JZsdk_Psdk_UI_io_Set_SearchLightLumen(AUTO_CONTROL, 150 - value);
}
}
}
}
//psdk控制上一曲
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_LastSong()
{
//发送上一曲命令进队列
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_LASTSONG, 0);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//psdk控制下一曲
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_NextSong()
{
//发送下一曲命令进队列
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_NEXTSONG, 0);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制播放/暂停
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_PlayOrPause(int value)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PLAYANDSTOP, value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制音量
value 0~100
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_Volume(int value, int PowerLimitFlag)
{
if (PowerLimitFlag == JZ_FLAGCODE_ON)
{
}
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_VOLUME, value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制tts文本速度, 档位模式
value 0 1 2 3
对应 0.5速 一倍速 1.5倍数 2倍数
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Speed_ByGear(int value)
{
int speed = value;
//将档位模式转换为实际速度
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_TTS_SPEED, &speed);
//推送到队列
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_SPEED, speed);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制tts文本速度, 数值模式
value 0~100
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Speed(int value)
{
//推送到队列
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_SPEED, value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制tts文本音色, 档位模式
value 无固定
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Tone_ByGear(int value)
{
int tone = value;
//将档位模式转换为实际音色
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_TTS_TONE, &tone);
//推送到队列
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_TONE, tone);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制tts文本追加音色,档位模式
value 无固定
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Tone_Add_ByGear(int value)
{
int tone = value;
JZsdk_Psdk_UI_io_AppendTone(1,value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制 喊话器播放循环
value 0关闭 1开启
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_Loop(int value)
{
JZsdk_Psdk_UI_io_SetAudioPlayLoop(1, value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制 探照灯亮度
value 0~100
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Lumen(int value)
{
JZsdk_Psdk_UI_io_Set_SearchLightLumen(1,value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制 探照灯模式
0 关灯 1 爆闪 2 常亮
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Mode(int value)
{
JZsdk_Psdk_UI_io_Set_SearchLightMode(1, value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制 探照灯爆闪频率
value 0~100
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Freq(int value)
{
JZsdk_Psdk_UI_io_Set_SearchLightFrequency(1,value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制 激光模式 档位模式
value 不定
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Mode_ByGear(int value)
{
int mode = value;
//将档位模式转换为实际模式
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_SIDE_LASER_MODE, &mode);
//推送到队列
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_MODE, mode);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制 激光亮度
value 0~100
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Lumen(int value)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_LUMEN, value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制 激光颜色
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Color(int value)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_COLOR, value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制 警灯模式 档位模式
value 不定
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Mode_ByGear(int value)
{
int mode = value;
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_MODE, &mode);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_MODE, mode);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制 警灯颜色1 档位模式
value 不定
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Color1_ByGear(int value)
{
int color = value;
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_COLOR_1, &color);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_COLOR_1,color);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk控制 警灯颜色2 档位模式
value 不定
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Color2_ByGear(int value)
{
int color = value;
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_COLOR_2, &color);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_COLOR_2,color);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk
滑动条控制云台
value 0~100
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_PitchAngle_BySlider(int value)
{
JZsdk_Psdk_Ui_io_Gimbal_PitchScaleMode(value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk
云台微调 单次输入值变化模式
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_AdjustmentPitch_ByVariation(int value)
{
JZsdk_Psdk_UI_io_Set_AdjustmentGimbalPitchAngle(value);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk
对外供电开关
0关 1开
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_PowerSupply(int value)
{
int power;
if(value == 0)
{
power = JZ_FLAGCODE_OFF;
}
else
{
power = JZ_FLAGCODE_ON;
}
JZsdk_Psdk_UI_io_Set_OutputPowerStatus(1 ,power);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk 开机预设任务添加
value 0 关 1开
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_PrsetTask(int value)
{
int task;
if(value == 0)
{
task = JZ_FLAGCODE_OFF;
}
else
{
task = JZ_FLAGCODE_ON;
}
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PRSET_TASK, task);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
psdk 单边云台补偿值
value1 修改的云台 value2 修改值
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(int value1, int value2)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(value1, value2);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
设置picth云台的最大最小值
value 0 最大值 value 1 最小值
*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_PitchAngle_ByMaxMin(int value)
{
if (value == 0)
{
JZsdk_Psdk_UI_io_Set_MAXGimbalRangen();
}
else if (value == 1)
{
JZsdk_Psdk_UI_io_Set_MINGimbalRangen();
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file Psdk_ui_to_jzsdk.h
* Psdk_ui_to_jzsdk.h的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef PSDK_UI_TO_JZSDK_H
#define PSDK_UI_TO_JZSDK_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_LastSong();
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_NextSong();
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_PlayOrPause(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_Volume(int value, int PowerLimitFlag);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Speed_ByGear(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Speed(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Tone_ByGear(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Tone_Add_ByGear(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_Loop(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Lumen(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Mode(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Freq(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Mode_ByGear(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Lumen(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Color(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Mode_ByGear(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Color1_ByGear(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Color2_ByGear(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_PitchAngle_BySlider(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_AdjustmentPitch_ByVariation(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_PowerSupply(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_PrsetTask(int value);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(int value1, int value2);
T_JZsdkReturnCode Psdk_ui_to_jzsdk_PitchAngle_ByMaxMin(int value);
#ifdef __cplusplus
}
#endif
#endif
... ...
#include "Psdk_ui_value_menu.h"
#include "UI_control/Psdk_UI_io.h"
#include "JZsdkLib.h"
#include "DeviceInfo/DeviceInfo.h"
#include "version_choose.h"
#include "JZsdkLib.h"
#include "ExtensionAPI/JZsdk_ExpansionApi.h"
//当x < min时,返回min;当x > max时,返回max;否则返回x
... ... @@ -314,7 +313,7 @@ static T_JZsdkReturnCode JZsdk_UI_DJIpsdk_Widget_set(JZsdk_Widget_Control index,
case JZSDK_WIDGET_WARNLIGHT_COLOR_2:
{
temp = UI_control_value_to_SecondaryWidgetValue(JZSDK_WIDGET_WARNLIGHT_COLOR_1, value);
temp = UI_control_value_to_SecondaryWidgetValue(JZSDK_WIDGET_WARNLIGHT_COLOR_2, value);
UI_control_WidgetArraySet(18, index);
}
break;
... ... @@ -393,6 +392,7 @@ T_JZsdkReturnCode JZsdk_PsdkUi_value_get(JZsdk_Widget_Control index, int *value)
#if DEVICE_VERSION == JZ_T40 || DEVICE_VERSION == JZ_T40S
int type = JZsdk_GetDeviceType();
if (type == 0 || type == 1)
{
temp = IN_RANGE_OR_ZERO(temp, 0, (ARRAY_SIZE(WarnColor_RedBule) - 1));
... ...
/**
/**
********************************************************************
* @file Psdk_ui_change.h
* Psdk_ui_change的头文件
* @file jzsdk_to_psdk_ui.h
* jzsdk_to_psdk_ui.h的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef PSDK_UI_CHANGE_H
#define PSDK_UI_CHANGE_H
#ifndef JZSDK_TO_PSDK_UI_H
#define JZSDK_TO_PSDK_UI_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
... ...
... ... @@ -461,284 +461,6 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetVolume(int wheather_control, int value)
}
}
// //psdk 变量获取tts语速
// int JZsdk_Psdk_UI_io_GetTTSSpeed_ByValue(int value)
// {
// switch (value)
// {
// case 0:
// return 25;
// break;
// case 1:
// return 50;
// break;
// case 2:
// return 75;
// break;
// case 3:
// return 100;
// break;
// default:
// break;
// }
// }
// // psdkTTS语速 0-100 25 50 75 100
// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_speed(int wheather_control, int speed)
// {
// T_JZsdkReturnCode ret;
// int value;
// if (speed >=0 && speed <=25 )
// {
// value = 0;
// }
// else if (speed > 25 && speed <= 50)
// {
// value = 1;
// }
// else if (speed > 50 && speed <= 75)
// {
// value = 2;
// }
// else if (speed > 75 && speed <= 100)
// {
// value = 3;
// }
// // 调整控件
// UI_control_WidgetSet(PSDK_UI_WIDGET_SPEED, value);
// // 如果有进行控制,不只是改控件
// if (wheather_control == 1)
// {
// ret = UIcontrol_Set_TTS_speed(DEVICE_PSDK, speed);
// return ret;
// }
// }
// //psdk 变量获取tts音色
// int JZsdk_Psdk_UI_io_GetTTSTone_ByValue(int value)
// {
// E_LanguageInfo LanguageInfo = LanguageInfo_Get_LanguageInfo();
// if (LanguageInfo == LANGUAGE_INFO_CHINESE)
// {
// switch (value)
// {
// case 0:
// return 0x01;
// break;
// case 1:
// return 0x02;
// break;
// case 2:
// return 0x11;
// break;
// case 3:
// return 0x12;
// break;
// case 4:
// return 0x31;
// break;
// case 5:
// return 0x32;
// break;
// case 6:
// return 0x33;
// break;
// case 7:
// return 0x34;
// break;
// case 8:
// return 0x35;
// break;
// case 9:
// return 0x36;
// break;
// default:
// return 0x01;
// break;
// }
// }
// else
// {
// switch (value)
// {
// case 0:
// return 0x11;
// break;
// case 1:
// return 0x12;
// break;
// case 2:
// return 0x01;
// break;
// case 3:
// return 0x02;
// break;
// case 4:
// return 0x41;
// break;
// case 5:
// return 0x42;
// break;
// case 6:
// return 0x43;
// break;
// case 7:
// return 0x44;
// break;
// case 8:
// return 0x45;
// break;
// case 9:
// return 0x46;
// break;
// case 10:
// return 0x47;
// break;
// case 11:
// return 0x48;
// break;
// default:
// return 0x11;
// break;
// }
// }
// }
// // psdkTTS音色 10个音色
// // 要分国内版和海外版
// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_tone(int wheather_control, int tone)
// {
// T_JZsdkReturnCode ret;
// int value;
// E_LanguageInfo LanguageInfo = LanguageInfo_Get_LanguageInfo();
// if (LanguageInfo == LANGUAGE_INFO_CHINESE)
// {
// switch (tone)
// {
// case 0x01:
// value = 0;
// break;
// case 0x02:
// value = 1;
// break;
// case 0x11:
// value = 2;
// break;
// case 0x12:
// value = 3;
// break;
// case 0x31:
// value = 4;
// break;
// case 0x32:
// value = 5;
// break;
// case 0x33:
// value = 6;
// break;
// case 0x34:
// value = 7;
// break;
// case 0x35:
// value = 8;
// break;
// case 0x36:
// value = 9;
// break;
// default:
// printf("无效的tts设置\n");
// return JZ_ERRORCODE_TTS_INVALID_TONE;
// break;
// }
// }
// else {
// switch (tone)
// {
// case 0x01:
// value = 2;
// break;
// case 0x02:
// value = 3;
// break;
// case 0x11:
// value = 0;
// break;
// case 0x12:
// value = 1;
// break;
// case 0x41://俄 russian ru
// value = 4;
// break;
// case 0x42://法 french fr-fr
// value = 5;
// break;
// case 0x43://德 german de
// value = 6;
// break;
// case 0x44://韩 ko
// value = 7;
// break;
// case 0x45://意大利 italian it
// value = 8;
// break;
// case 0x46://波兰 polish pl
// value = 9;
// break;
// case 0x47://西班牙 spanish es
// value = 10;
// break;
// case 0x48://葡萄牙 portugal pt-pt
// value = 11;
// break;
// default:
// printf("无效的tts设置\n");
// return JZ_ERRORCODE_TTS_INVALID_TONE;
// break;
// }
// }
// // 将控件界面的播放开关 转化为关闭
// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_TONE, value);
// // 如果有进行控制,不只是改控件
// if (wheather_control == 1)
// {
// return UIcontrol_Set_TTS_tone(DEVICE_PSDK,tone);
// }
// return ret;
// }
// psdk追加音色 0 1 2
T_JZsdkReturnCode JZsdk_Psdk_UI_io_AppendTone(int wheather_control, int value)
{
... ... @@ -1025,69 +747,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_SearchLightLumen(int wheather_control,int
return ret;
}
// //警灯模式 0 关 1交替快闪 2交替满闪 3交替齐闪
// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightMode(int wheather_control, int value)
// {
// T_JZsdkReturnCode ret;
// //控件值 0 关闭 1快闪 2 满闪 3齐闪
// int mode = 0;
// int Switch = 0;
// if (value >= 1)
// {
// mode = value - 1;
// Switch = 1;
// }
// else
// {
// Switch = 0;
// mode = 0;
// }
// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_MODE, value);
// if (wheather_control == JZ_FLAGCODE_ON)
// {
// ret = UIcontrol_Set_WarningLight_ModeControl(DEVICE_PSDK, Switch, mode);
// }
// return ret;
// }
// //警灯颜色1
// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(int wheather_control, int value)
// {
// T_JZsdkReturnCode ret;
// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_FIRSTCOLOR, (value-1));
// FirstWarningLight = value;
// if (wheather_control == JZ_FLAGCODE_ON)
// {
// ret = UIcontrol_Set_WarningLight_Color(DEVICE_PSDK, FirstWarningLight, SecondWarningLight);
// }
// return ret;
// }
// //警灯颜色2
// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(int wheather_control, int value)
// {
// T_JZsdkReturnCode ret;
// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_SECONDCOLOR, (value-1));
// SecondWarningLight = value;
// if (wheather_control == JZ_FLAGCODE_ON)
// {
// ret = UIcontrol_Set_WarningLight_Color(DEVICE_PSDK, FirstWarningLight, SecondWarningLight);
// }
// return ret;
// }
// 设置云台最大值
T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_MAXGimbalRangen()
... ...
... ... @@ -1472,7 +1472,7 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, i
T_JZsdkReturnCode ret = WarnLight_Set_Color(value1, value2);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
printf("%s:%s\n",UI_CONTROL_ERROR,JZsdk_GetReturnCodeMessage(ret));
JZSDK_LOG_ERROR("%s:%s",UI_CONTROL_ERROR,JZsdk_GetReturnCodeMessage(ret));
return ret;
}
... ... @@ -1501,8 +1501,8 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, i
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
{
JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(JZ_FLAGCODE_OFF, value1);
JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(JZ_FLAGCODE_OFF, value2);
JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(JZ_FLAGCODE_OFF, LightAttribute.Color1);
JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(JZ_FLAGCODE_OFF, LightAttribute.Color2);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
... ...
/**
/**
********************************************************************
* @file UI_control.h
* UI_control的头文件
* UI_control的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_UI_CONTROL_H
#define JZSDK_UI_CONTROL_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include "UI_control/Psdk_ui_value_menu.h"
#include "UI_control/Psdk_UI_io.h"
#include "UI_control/UI_Api.h"
#ifdef __cplusplus
... ... @@ -20,18 +20,18 @@ extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* 常亮定义*/
/********************
*
* 完整路径 假设
* 完整路径 假设
* /root/Configs/DJI_widget_file/cn/widget_file/cn_big_screen
* /root/Configs/DJI_widget_file/en/widget_file/cn_big_screen
* /root/Configs/DJI_widget_file/debug/widget_file/cn_big_screen
*
* 其中 /root/Configs/DJI_widget_file 是对应的psdk给出的路径
* cn en debug 是对应的语言
* widget_file/cn_big_screen 是对应的文件,也有psdk给出
* 其中 /root/Configs/DJI_widget_file 是对应的psdk给出的路径
* cn en debug 是对应的语言
* widget_file/cn_big_screen 是对应的文件,也有psdk给出
*
* **************/
typedef struct T_JZsdkUIJson
... ...
... ... @@ -48,6 +48,10 @@ static int WidgetMgMT_Control_WorkFuntion(int Inscode, int value)
JZsdk_Psdk_UI_io_Audio_PauseAndPlayContinue(JZ_FLAGCODE_ON, value);
break;
case JZSDK_WIDGET_VOLUME:
JZsdk_Psdk_UI_io_SetVolume(1,value);
break;
case JZSDK_WIDGET_TTS_SPEED:
JZsdk_Psdk_UI_io_Set_TTS_speed(JZ_FLAGCODE_ON,value);
break;
... ...
... ... @@ -89,7 +89,7 @@ T_JZsdkReturnCode WarnLight_Flush_StatusAndMode()
//设置警灯颜色
T_JZsdkReturnCode WarnLight_Set_Color(int Color1, int Color2)
{
JZSDK_LOG_DEBUG("设置0x%x:警灯颜色 Color1:0x%x, color:0x%x",DEVICE_VERSION, Color1, Color2);
JZSDK_LOG_INFO("设置0x%x:警灯颜色 Color1:0x%x, color:0x%x",DEVICE_VERSION, Color1, Color2);
T_JZsdkOsalHandler *osalHandle = JZsdk_Platform_GetOsalHandler();
if (osalHandle == NULL)
... ...
... ... @@ -44,6 +44,7 @@
#include "UI_control/WidegMgmt/JZsdk_Widget.h"
#include "UI_control/UI_control.h"
#include "Psdk_UI/Psdk_ui_to_jzsdk.h"
#include "JZsdkLib.h"
#ifdef GIMBAL_STATUS_ON
... ... @@ -613,64 +614,74 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
switch(index){
//喊话器部分
case 0://上一曲
{
if(value==1)
{
//JZsdk_Psdk_UI_io_LastSong(1);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_LASTSONG, 0);
Psdk_ui_to_jzsdk_Megphone_LastSong();
}
break;
}
case 1://下一曲
{
if(value==1)
{
//JZsdk_Psdk_UI_io_NextSong(1);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_NEXTSONG, 0);
Psdk_ui_to_jzsdk_Megphone_NextSong();
}
break;
}
case 2: // 播放\暂停 value为1 是三角控件 暂停 所以要去取反
{
value = !value;
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PLAYANDSTOP, value);
Psdk_ui_to_jzsdk_Megphone_PlayOrPause(value);
break;
}
case 3://内显示音量 scale
{
delayMs(100);//避免拉滑动条设置太多次
//避免拉滑动条设置太多次
delayMs(100);
//部分dji设备存在亮度和音量功率限制
JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(1, value);
JZsdk_Psdk_UI_io_SetVolume(1,value);
//设置音量
Psdk_ui_to_jzsdk_Megphone_Volume(value, JZ_FLAGCODE_ON);
break;
}
case 4://外显示音量 scale
{
delayMs(100);//避免拉滑动条设置太多次
//避免拉滑动条设置太多次
delayMs(100);
//部分dji设备存在亮度和音量功率限制
JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(1, value);
JZsdk_Psdk_UI_io_SetVolume(1,value);
//设置音量
Psdk_ui_to_jzsdk_Megphone_Volume(value, JZ_FLAGCODE_ON);
break;
}
case 5://TTS语速 list
{
int speed = value;
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_TTS_SPEED, &speed);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_SPEED, speed);
Psdk_ui_to_jzsdk_Megphone_TTS_Speed_ByGear(value);
break;
}
case 6://TTS音色 list
{
int tone = value;
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_TTS_TONE, &tone);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_TONE, tone);
Psdk_ui_to_jzsdk_Megphone_TTS_Tone_ByGear(value);
break;
}
case 7://TTS追加音色 list
JZsdk_Psdk_UI_io_AppendTone(1,value);
{
Psdk_ui_to_jzsdk_Megphone_TTS_Tone_Add_ByGear(value);
break;
}
case 8: //switch 循环 循环是1
JZsdk_Psdk_UI_io_SetAudioPlayLoop(1, value);
{
Psdk_ui_to_jzsdk_Megphone_Loop(value);
break;
}
case 9: //喊话模式切换
{
//切换前关闭所有实时喊话
... ... @@ -703,23 +714,37 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
break;
}
//探照灯部分
case 10://探照灯 内显示亮度
{
delayMs(50);//避免拉滑动条设置太多次
//避免拉滑动条设置太多次
delayMs(150);
//部分dji设备存在亮度和音量功率限制
JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(0, value);
JZsdk_Psdk_UI_io_Set_SearchLightLumen(1,value);
//设置亮度
Psdk_ui_to_jzsdk_SearchLight_Lumen(value);
break;
}
case 11://探照灯 外显示亮度
{
delayMs(50);//避免拉滑动条设置太多次
//避免拉滑动条设置太多次
delayMs(150);
//部分dji设备存在亮度和音量功率限制
JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(0, value);
JZsdk_Psdk_UI_io_Set_SearchLightLumen(1,value);
//设置亮度
Psdk_ui_to_jzsdk_SearchLight_Lumen(value);
break;
}
case 12: //探照灯模式
{
//部分飞机存在降落时强制关灯
int mode = value;
JZsdk_PlaneInfo PlaneInfo;
JZsdk_PlaneInfo_Get(&PlaneInfo);
... ... @@ -728,7 +753,9 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
mode = 0;
}
JZsdk_Psdk_UI_io_Set_SearchLightMode(1, mode);
//设置模式
Psdk_ui_to_jzsdk_SearchLight_Mode(mode);
break;
}
... ... @@ -739,29 +766,25 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
}
case 14://探照灯 爆闪频率
{
JZsdk_Psdk_UI_io_Set_SearchLightFrequency(1,value);
Psdk_ui_to_jzsdk_SearchLight_Freq(value);
break;
}
//侧面激光部分
case 15://激光开关
{
int mode = value;
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_SIDE_LASER_MODE, &mode);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_MODE, mode);
Psdk_ui_to_jzsdk_Laser_Mode_ByGear(value);
break;
}
case 30://激光亮度
{
int lumen = value;
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_LUMEN, lumen);
Psdk_ui_to_jzsdk_Laser_Lumen(value);
break;
}
case 31://激光颜色
{
int color = value;
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_COLOR, color);
Psdk_ui_to_jzsdk_Laser_Color(value);
break;
}
//警灯部分
... ... @@ -769,6 +792,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
{
int mode = value;
//部分飞机存在降落时强制关灯
JZsdk_PlaneInfo PlaneInfo;
JZsdk_PlaneInfo_Get(&PlaneInfo);
if (PlaneInfo.LandingStatus == JZ_FLAGCODE_ON)
... ... @@ -776,22 +800,18 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
mode = 0;
}
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_MODE, &mode);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_MODE, mode);
Psdk_ui_to_jzsdk_WarnLight_Mode_ByGear(mode);
break;
}
case 17://警灯颜色1
{
int color = value;
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_COLOR_1, &color);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_COLOR_1,color);
Psdk_ui_to_jzsdk_WarnLight_Color1_ByGear(value);
break;
}
case 18://警灯颜色2
{
int color = value;
JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_COLOR_1, &color);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_COLOR_2,color);
Psdk_ui_to_jzsdk_WarnLight_Color2_ByGear(value);
break;
}
//云台部分
... ... @@ -799,7 +819,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
{
if (Get_Gimbal_linkage() == JZ_FLAGCODE_OFF)
{
JZsdk_Psdk_Ui_io_Gimbal_PitchScaleMode(value);
Psdk_ui_to_jzsdk_PitchAngle_BySlider(value);
}
break;
}
... ... @@ -807,7 +827,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
{
if (Get_Gimbal_linkage() == JZ_FLAGCODE_OFF)
{
JZsdk_Psdk_Ui_io_Gimbal_PitchScaleMode(value);
Psdk_ui_to_jzsdk_PitchAngle_BySlider(value);
}
break;
}
... ... @@ -820,7 +840,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
{
if(value == 1)
{
JZsdk_Psdk_UI_io_Set_AdjustmentGimbalPitchAngle(5);
Psdk_ui_to_jzsdk_AdjustmentPitch_ByVariation(5);
}
break;
... ... @@ -829,7 +849,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
{
if(value == 1)
{
JZsdk_Psdk_UI_io_Set_AdjustmentGimbalPitchAngle(-5);
Psdk_ui_to_jzsdk_AdjustmentPitch_ByVariation(-5);
}
break;
}
... ... @@ -857,22 +877,13 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
}
case 25://对外供电开关
{
JZsdk_Psdk_UI_io_Set_OutputPowerStatus(1 ,value);
Psdk_ui_to_jzsdk_PowerSupply(value);
break;
}
case 26://开机预设任务
{
JZSDK_LOG_INFO("设置开机预设任务:%d", value);
if (value == 1)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PRSET_TASK, JZ_FLAGCODE_ON);
}
else if (value == 0)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PRSET_TASK, JZ_FLAGCODE_OFF);
}
Psdk_ui_to_jzsdk_PrsetTask(value);
break;
}
... ... @@ -886,19 +897,19 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
{
if (Temp_GimbalCompensation_Flag == 0)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_LEFT, +5);
Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_LEFT, +5);
}
else if (Temp_GimbalCompensation_Flag == 1)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_LEFT, -5);
Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_LEFT, -5);
}
else if (Temp_GimbalCompensation_Flag == 2)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_RIGHT, +5);
Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_RIGHT, +5);
}
else if (Temp_GimbalCompensation_Flag == 3)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_RIGHT, -5);
Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_RIGHT, -5);
}
break;
}
... ... @@ -908,7 +919,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
{
if(value==1 && num_flag == 3)
{
JZsdk_Psdk_UI_io_Set_MAXGimbalRangen();
Psdk_ui_to_jzsdk_PitchAngle_ByMaxMin(0);
}
break;
}
... ... @@ -916,7 +927,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
{
if(value==1 && num_flag == 3)
{
JZsdk_Psdk_UI_io_Set_MINGimbalRangen();
Psdk_ui_to_jzsdk_PitchAngle_ByMaxMin(1);
}
break;
}
... ... @@ -927,8 +938,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
case 42://设置云台补偿
{
JZSDK_LOG_INFO("设置云台补充:%d", Temp_GimbalCompensation_Flag);
Temp_GimbalCalibration_Flag = value;
JZSDK_LOG_INFO("设置云台补充:%d", s_widgetValueList[42]);
break;
}
... ... @@ -937,6 +947,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
if (value == 1)
{
int direction;
int Temp_GimbalCalibration_Flag = s_widgetValueList[42];
if (Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX
|| Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MIN
|| Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_ZERO
... ... @@ -961,6 +972,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
if (value == 1)
{
int direction;
int Temp_GimbalCalibration_Flag = s_widgetValueList[42];
if (Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX
|| Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MIN
|| Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_ZERO
... ... @@ -979,8 +991,13 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
break;
}
case 45://设置云台补偿
case 45://设置云台校准
{
if (value == 1)
{
int Temp_GimbalCalibration_Flag = s_widgetValueList[42];
JZSDK_LOG_INFO("设置云台校准:%d", Temp_GimbalCalibration_Flag);
if (Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX)
{
Gimbal_Set_GimbalSingleCalibration(JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX);
... ... @@ -1021,6 +1038,8 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
{
Gimbal_Set_DebugPitch(0, JZ_FLAGCODE_ON, 1);
}
}
break;
}
... ...
/**
 /**
********************************************************************
* @file test_widget_speaker.c
* @brief
... ... @@ -874,30 +874,9 @@ static void *DjiTest_WidgetSpeakerTask(void *arg)
continue;
}
if (s_speakerState.state == DJI_WIDGET_SPEAKER_STATE_PLAYING) {
////如果处于回放模式
//if (s_speakerState.playMode == DJI_WIDGET_SPEAKER_PLAY_MODE_LOOP_PLAYBACK)
//{
// if (s_speakerState.workMode == DJI_WIDGET_SPEAKER_WORK_MODE_VOICE) {
// USER_LOG_DEBUG("Waiting opus decoder finished...");
// while (s_isDecodeFinished == false) {
// osalHandler->TaskSleepMs(1);
// }
// djiReturnCode = DjiTest_PlayAudioData();
// if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
// USER_LOG_ERROR("Play audio data failed, error: 0x%08llX.", djiReturnCode);
// }
// } else {
// djiReturnCode = DjiTest_PlayTtsData();
// if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
// USER_LOG_ERROR("Play tts data failed, error: 0x%08llX.", djiReturnCode);
// }
// }
// osalHandler->TaskSleepMs(1000);
//}
//
////单放模式
//else {
//注意,以下播放的函数都会执行到播完再释放。
if (s_speakerState.state == DJI_WIDGET_SPEAKER_STATE_PLAYING)
{
//如果工作模式为语音
if (s_speakerState.workMode == DJI_WIDGET_SPEAKER_WORK_MODE_VOICE)
{
... ... @@ -923,16 +902,12 @@ static void *DjiTest_WidgetSpeakerTask(void *arg)
USER_LOG_ERROR("lock mutex error: 0x%08llX.", djiReturnCode);
}
//if (s_speakerState.playMode == DJI_WIDGET_SPEAKER_PLAY_MODE_SINGLE_PLAY)
//{
s_speakerState.state = DJI_WIDGET_SPEAKER_STATE_IDEL;
//}
djiReturnCode = osalHandler->MutexUnlock(s_speakerMutex);
if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("unlock mutex error: 0x%08llX.", djiReturnCode);
}
//}
}
}
}
... ...
... ... @@ -75,10 +75,8 @@
#endif
/* Private constants ---------------------------------------------------------*/
#define DJI_LOG_PATH "/root/sdcard/Logs/"
#define DJI_LOG_INDEX_FILE_NAME "/root/Logs/latest"
#define DJI_LOG_SD_INDEX_FILE_NAME "/root/sdcard/Logs/latest"
#define DJI_LOG_FOLDER_NAME "Logs"
#define DJI_LOG_FOLDER_NAME "/root/Logs/"
#define DJI_LOG_PATH_MAX_SIZE (128)
#define DJI_LOG_FOLDER_NAME_MAX_SIZE (32)
#define DJI_LOG_MAX_COUNT (10)
... ... @@ -762,7 +760,7 @@ static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
if (DjiUser_LocalWriteFsInit(DJI_LOG_PATH) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
if (DjiUser_LocalWriteFsInit(DJI_LOG_FOLDER_NAME) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("file system init error");
//return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
... ... @@ -1028,23 +1026,6 @@ static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path)
}
}
//检查sd卡的日志文件夹
if (access(DJI_LOG_PATH, F_OK) != 0) {
memset(folderName, 0, sizeof(folderName));
sprintf(folderName, "mkdir %s", DJI_LOG_PATH);
ret = system(folderName);
if (ret != 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
}
//检查sd卡的内序号文件是否存在
if (access(DJI_LOG_SD_INDEX_FILE_NAME, F_OK) == 0) {
memset(folderName, 0, sizeof(folderName));
sprintf(folderName, "rm %s", DJI_LOG_INDEX_FILE_NAME);
ret = system(folderName);
}
s_djiLogFileCnt = fopen(DJI_LOG_INDEX_FILE_NAME, "rb+");
if (s_djiLogFileCnt == NULL) {
s_djiLogFileCnt = fopen(DJI_LOG_INDEX_FILE_NAME, "wb+");
... ... @@ -1082,16 +1063,6 @@ static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path)
fclose(s_djiLogFileCnt);
//将sd卡的索引值文件删除
memset(systemCmd, 0, sizeof(systemCmd));
sprintf(systemCmd, "rm %s", DJI_LOG_SD_INDEX_FILE_NAME);
ret = system(systemCmd);
//将索引值复制到sd卡
memset(systemCmd, 0, sizeof(systemCmd));
sprintf(systemCmd, "cp %s %s", DJI_LOG_INDEX_FILE_NAME, DJI_LOG_SD_INDEX_FILE_NAME);
ret = system(systemCmd);
//filePath : /root/sdcard/Logs/_%04d_%04d%02d%02d_%02d-%02d-%02d.log
sprintf(filePath, "%s_%04d_%04d%02d%02d_%02d-%02d-%02d.log", path, currentLogFileIndex,
localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
... ... @@ -1103,17 +1074,17 @@ static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path)
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
if (logFileIndex >= DJI_LOG_MAX_COUNT) {
sprintf(systemCmd, "rm -rf %s_%04d*.log", path, currentLogFileIndex - DJI_LOG_MAX_COUNT);
ret = system(systemCmd);
if (ret != 0) {
printf("Remove file error, ret:%d.\r\n", ret);
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
}
//if (logFileIndex >= DJI_LOG_MAX_COUNT) {
// sprintf(systemCmd, "rm -rf %s_%04d*.log", path, currentLogFileIndex - DJI_LOG_MAX_COUNT);
// ret = system(systemCmd);
// if (ret != 0) {
// printf("Remove file error, ret:%d.\r\n", ret);
// return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
// }
//}
sprintf(systemCmd, "ln -sfrv %s "DJI_LOG_FOLDER_NAME"/latest.log", filePath);
system(systemCmd);
//sprintf(systemCmd, "ln -sfrv %s "DJI_LOG_FOLDER_NAME"/latest.log", filePath);
//system(systemCmd);
g_DJI_LoginitFlag = JZ_FLAGCODE_ON;
... ...
#!/bin/sh
# 开机日志归档脚本
# 执行时机:必须在 USB Gadget 启动之前
LOG_SYS="/root/JZLOG"
LOG_SDCARD="/root/sdcard/JZLOG"
# 1. 创建目录
mkdir -p "$LOG_SYS" "$LOG_SDCARD"
# 2. 同步 thelast 文件
if [ -f "$LOG_SDCARD/thelast" ]; then
cp -f "$LOG_SYS/thelast" "$LOG_SDCARD/thelast"
else
rm -f "$LOG_SYS/thelast"
fi
# 3. 移动所有 .log 文件
# 使用 find 避免 "argument list too long"
find "$LOG_SYS" -maxdepth 1 -type f -name "*.log" -print0 | while IFS= read -r -d '' file; do
mv "$file" "$LOG_SDCARD/"
done
# 4. 数量控制:超过20份则删除最早的(按文件名中的序号)
cd "$LOG_SDCARD" || exit 1
files=( *.log )
count=${#files[@]}
if [ $count -gt 20 ]; then
# 提取序号并排序(假设文件名格式固定为 _数字_...)
sorted=$(printf '%s\n' "${files[@]}" | sed -n 's/^_\([0-9]*\)_.*/\1 \0/p' | sort -n | cut -d' ' -f2)
if [ -n "$sorted" ]; then
delete=$((count - 20))
echo "$sorted" | head -n "$delete" | xargs rm -f
else
# 如果无法解析序号,退而按修改时间删除最老的
ls -t *.log | tail -n +21 | xargs rm -f
fi
fi
\ No newline at end of file
... ...