作者 ookk303

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

避免了某个全局变量被越界。
@@ -463,7 +463,7 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_T40S") @@ -463,7 +463,7 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_T40S")
463 set(AUDIODEAL_MODULE VERSION_SWITCH_ON) 463 set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
464 464
465 # 添加speex音频处理模块 465 # 添加speex音频处理模块
466 - # set(SPEEX_MODULE VERSION_SWITCH_ON) 466 + set(SPEEX_MODULE VERSION_SWITCH_ON)
467 467
468 # 添加喊话器模块 468 # 添加喊话器模块
469 set(MEGAPHONE_MODULE VERSION_SWITCH_ON) 469 set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
1 -/* 头文件 ------------------------------------------------------------------*/ 1 +/* 头文件 ------------------------------------------------------------------*/
2 #include "JZsdk_logger.h" 2 #include "JZsdk_logger.h"
3 #include "JZsdkLib.h" 3 #include "JZsdkLib.h"
4 #include <stdarg.h> 4 #include <stdarg.h>
@@ -5,10 +5,8 @@ @@ -5,10 +5,8 @@
5 #include <unistd.h> 5 #include <unistd.h>
6 #include <time.h> 6 #include <time.h>
7 7
8 -#define JZSDK_LOG_PATH "/root/sdcard/JZLOG/" //sd卡存放路径  
9 -#define JZSDK_LOG_INDEX_PATH "/root/JZLOG/" //sd卡存放序号文件路径 8 +#define JZSDK_LOG_PATH "/root/JZLOG/" //sd卡存放路径
10 #define JZSDK_LOG_INDEX_FILE_NAME "/root/JZLOG/thelast" //sd卡存放序号文件路径 9 #define JZSDK_LOG_INDEX_FILE_NAME "/root/JZLOG/thelast" //sd卡存放序号文件路径
11 -#define JZSDK_LOG_SD_INDEX_FILE_NAME "/root/sdcard/JZLOG/thelast" //sd卡存放序号文件路径  
12 10
13 #define JZ_LOG_FOLDER_NAME_MAX_SIZE (32) 11 #define JZ_LOG_FOLDER_NAME_MAX_SIZE (32)
14 #define JZ_LOG_MAX_COUNT (10) 12 #define JZ_LOG_MAX_COUNT (10)
@@ -35,16 +33,9 @@ static T_JZsdkReturnCode createJZLOGFolder() @@ -35,16 +33,9 @@ static T_JZsdkReturnCode createJZLOGFolder()
35 JZsdk_Osal_Mkdir(JZSDK_LOG_PATH); 33 JZsdk_Osal_Mkdir(JZSDK_LOG_PATH);
36 } 34 }
37 35
38 - if(JZsdk_check_directory_exists_posix(JZSDK_LOG_INDEX_PATH) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
39 - {  
40 - JZsdk_Osal_Mkdir(JZSDK_LOG_INDEX_PATH);  
41 - }  
42 -  
43 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 36 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
44 } 37 }
45 38
46 -  
47 -  
48 static T_JZsdkReturnCode JzUser_PrintConsole(const JZ_U8 *data, JZ_U16 dataLen) 39 static T_JZsdkReturnCode JzUser_PrintConsole(const JZ_U8 *data, JZ_U16 dataLen)
49 { 40 {
50 dataLen = dataLen; 41 dataLen = dataLen;
@@ -62,17 +53,16 @@ static T_JZsdkReturnCode JzUser_LocalWrite(const JZ_U8* data, JZ_U16 dataLen) @@ -62,17 +53,16 @@ static T_JZsdkReturnCode JzUser_LocalWrite(const JZ_U8* data, JZ_U16 dataLen)
62 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; 53 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
63 54
64 realLen = fwrite(data, 1, dataLen, logFile); 55 realLen = fwrite(data, 1, dataLen, logFile);
65 - fflush(logFile);  
66 - if (realLen != dataLen)  
67 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
68 -  
69 - //这里后续考虑加入保存fileno  
70 - //if (fflush(logFile) != 0) 56 + //fflush(logFile);
  57 + //if (realLen != dataLen)
71 // return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 58 // return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
72 59
73 - //if (fsync(fileno(logFile)) != 0)  
74 - // return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 60 + //这里后续考虑加入保存fileno
  61 + if (fflush(logFile) != 0)
  62 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
75 63
  64 + if (fsync(fileno(logFile)) != 0)
  65 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
76 66
77 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 67 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
78 } 68 }
@@ -88,22 +78,13 @@ static T_JZsdkReturnCode JzUser_LocalWriteFsInit(const JZ_U8 *path) @@ -88,22 +78,13 @@ static T_JZsdkReturnCode JzUser_LocalWriteFsInit(const JZ_U8 *path)
88 uint16_t currentLogFileIndex; 78 uint16_t currentLogFileIndex;
89 uint8_t ret; 79 uint8_t ret;
90 80
91 -  
92 if (localTime == NULL) 81 if (localTime == NULL)
93 { 82 {
94 printf("Get local time error.\r\n"); 83 printf("Get local time error.\r\n");
95 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 84 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
96 } 85 }
97 86
98 - //1、检查sd卡的计数文件是否存在, 如果不存在,则移除系统的计数文件  
99 - if (JZsdk_check_file_exists(JZSDK_LOG_SD_INDEX_FILE_NAME) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
100 - {  
101 - memset(systemCmd, 0, sizeof(systemCmd));  
102 - sprintf(systemCmd, "rm -f %s", JZSDK_LOG_INDEX_FILE_NAME);  
103 - ret = system(systemCmd);  
104 - }  
105 -  
106 - //2、打开计数文件,获取当前日志文件序号,并更新日志文件序号 87 + //打开计数文件,获取当前日志文件序号,并更新日志文件序号
107 logFileCnt = fopen(JZSDK_LOG_INDEX_FILE_NAME, "rb+"); 88 logFileCnt = fopen(JZSDK_LOG_INDEX_FILE_NAME, "rb+");
108 if (logFileCnt == NULL) 89 if (logFileCnt == NULL)
109 { 90 {
@@ -147,22 +128,6 @@ static T_JZsdkReturnCode JzUser_LocalWriteFsInit(const JZ_U8 *path) @@ -147,22 +128,6 @@ static T_JZsdkReturnCode JzUser_LocalWriteFsInit(const JZ_U8 *path)
147 128
148 fclose(logFileCnt); 129 fclose(logFileCnt);
149 130
150 - ////移除sd卡的计数文件  
151 - //memset(systemCmd, 0, sizeof(systemCmd));  
152 - //sprintf(systemCmd, "rm -f %sthelast", JZSDK_LOG_PATH);  
153 - //ret = system(systemCmd);  
154 - //if (ret != 0) {  
155 - // JZSDK_LOG_ERROR("Remove file error, ret:%d.\r\n", ret);  
156 - //}  
157 -  
158 - //复制日志计数文件到sd卡  
159 - memset(systemCmd, 0, sizeof(systemCmd));  
160 - sprintf(systemCmd, "cp %s %s/thelast", JZSDK_LOG_INDEX_FILE_NAME, JZSDK_LOG_PATH);  
161 - ret = system(systemCmd);  
162 - if (ret != 0) {  
163 - JZSDK_LOG_ERROR("Copy file error, ret:%d.\r\n", ret);  
164 - }  
165 -  
166 //开始打开log文件 131 //开始打开log文件
167 sprintf(filePath, "%s_%04d_%04d%02d%02d_%02d-%02d-%02d.log", path, currentLogFileIndex, 132 sprintf(filePath, "%s_%04d_%04d%02d%02d_%02d-%02d-%02d.log", path, currentLogFileIndex,
168 localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday, 133 localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
@@ -174,16 +139,16 @@ static T_JZsdkReturnCode JzUser_LocalWriteFsInit(const JZ_U8 *path) @@ -174,16 +139,16 @@ static T_JZsdkReturnCode JzUser_LocalWriteFsInit(const JZ_U8 *path)
174 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 139 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
175 } 140 }
176 141
177 - if (logFileIndex >= JZ_LOG_MAX_COUNT)  
178 - {  
179 - //把多余的日志删除  
180 - sprintf(systemCmd, "rm -rf %s_%04d*.log", path, currentLogFileIndex - JZ_LOG_MAX_COUNT);  
181 - ret = system(systemCmd);  
182 - if (ret != 0) {  
183 - printf("Remove file error, ret:%d.\r\n", ret);  
184 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
185 - }  
186 - } 142 + //if (logFileIndex >= JZ_LOG_MAX_COUNT)
  143 + //{
  144 + // //把多余的日志删除
  145 + // sprintf(systemCmd, "rm -rf %s_%04d*.log", path, currentLogFileIndex - JZ_LOG_MAX_COUNT);
  146 + // ret = system(systemCmd);
  147 + // if (ret != 0) {
  148 + // printf("Remove file error, ret:%d.\r\n", ret);
  149 + // return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  150 + // }
  151 + //}
187 152
188 //往日志中写入utf8识别符 153 //往日志中写入utf8识别符
189 fputc(0xEF, logFile); 154 fputc(0xEF, logFile);
@@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
16 #include "Hal_Send/HalSend.h" 16 #include "Hal_Send/HalSend.h"
17 #include "SideLaser/SideLaser.h" 17 #include "SideLaser/SideLaser.h"
18 18
19 -#include "UI_control/Psdk_ui_value_menu.h" 19 +#include "UI_control/Psdk_UI_io.h"
20 #include "UI_control/UI_control.h" 20 #include "UI_control/UI_control.h"
21 21
22 #include "../../ParamterParsing.h" 22 #include "../../ParamterParsing.h"
@@ -23,7 +23,7 @@ @@ -23,7 +23,7 @@
23 #define MODIFY_VERSION_TEN_POSITION 1 23 #define MODIFY_VERSION_TEN_POSITION 1
24 #define MODIFY_VERSION_ONE_POSITION 5 24 #define MODIFY_VERSION_ONE_POSITION 5
25 #define DEBUG_VERSION_TEN_POSITION 0 25 #define DEBUG_VERSION_TEN_POSITION 0
26 -#define DEBUG_VERSION_ONE_POSITION 4 26 +#define DEBUG_VERSION_ONE_POSITION 6
27 27
28 #define FIRMWARE_ORIGIN DOMESTIC_VERSION 28 #define FIRMWARE_ORIGIN DOMESTIC_VERSION
29 29
1 -#include <stdio.h> 1 +#include <stdio.h>
2 #include <pthread.h> 2 #include <pthread.h>
3 #include <alsa/asoundlib.h> 3 #include <alsa/asoundlib.h>
4 #include <stdlib.h> 4 #include <stdlib.h>
@@ -189,6 +189,42 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RecordSteam(int In_Bitrate, unsigned ch @@ -189,6 +189,42 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RecordSteam(int In_Bitrate, unsigned ch
189 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 189 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
190 } 190 }
191 191
  192 +
  193 +/*************
  194 + *
  195 + * 实时语音语音类型的pcm数据导入接口 char
  196 + *
  197 + * 区别
  198 + * a 使用语音专用的滤波
  199 + * b 需要进行回音消除
  200 + *
  201 + *
  202 + * **********************/
  203 +T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam_byChar(int In_Bitrate, unsigned char* buffer, int bytesRead)
  204 +{
  205 + if (AudioDeakInfo_index == NULL)
  206 + {
  207 + JZSDK_LOG_ERROR("音频处理器未注册");
  208 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  209 + }
  210 +
  211 + while (Audiodeal_status != JZ_FLAGCODE_ON)
  212 + {
  213 + delayMs(1);
  214 + }
  215 +
  216 + int DateType = 0x02;
  217 +
  218 + //1、打开音频库的处理标志位,该标志可以重复打开,只有强制关闭音频时,需要关闭该标志
  219 + AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_ON;
  220 +
  221 +
  222 + //默认数据pcm接入口都是 单声道,16位
  223 + PCM_PooL_Interface_PcmData(AudioDeakInfo_index, In_Bitrate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16, buffer, bytesRead, DateType);
  224 +
  225 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  226 +}
  227 +
192 /************* 228 /*************
193 * 229 *
194 * 实时语音语音类型的pcm数据导入接口 230 * 实时语音语音类型的pcm数据导入接口
@@ -197,8 +233,10 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RecordSteam(int In_Bitrate, unsigned ch @@ -197,8 +233,10 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RecordSteam(int In_Bitrate, unsigned ch
197 * a 使用语音专用的滤波 233 * a 使用语音专用的滤波
198 * b 需要进行回音消除 234 * b 需要进行回音消除
199 * 235 *
  236 + * 正常16000的opus解出来的framesize是640长度的short
  237 + *
200 * **********************/ 238 * **********************/
201 -T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, unsigned char *buffer, int bytesRead) 239 +T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, short *buffer, int frame_size)
202 { 240 {
203 if (AudioDeakInfo_index == NULL) 241 if (AudioDeakInfo_index == NULL)
204 { 242 {
@@ -221,29 +259,23 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, unsigned @@ -221,29 +259,23 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, unsigned
221 259
222 #ifdef SPEEX_STATUS_ON 260 #ifdef SPEEX_STATUS_ON
223 261
224 - short TempPcm[bytesRead / 2];  
225 - short OutPcm[bytesRead / 2];  
226 - for (int i = 0; i < bytesRead / 2; i++)  
227 - {  
228 - TempPcm[i] = (buffer[2*i] & 0xFF) | (((short)buffer[2*i + 1]) << 8);  
229 - }  
230 -  
231 - //送去回音消除  
232 - T_JZsdkReturnCode ret = Speex_DealData(TempPcm, OutPcm, bytesRead / 2);  
233 - // if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
234 - // {  
235 - // //将输出的pcm还原回u8型到数据缓冲区  
236 - // for (int i = 0; i < bytesRead / 2; i++)  
237 - // {  
238 - // buffer[2*i] = (OutPcm[i] & 0xFF);  
239 - // buffer[2*i + 1] = ((OutPcm[i] >> 8) & 0xFF);  
240 - // }  
241 - // } 262 + //回音消除+噪声抑制
  263 + Speex_ProcessMic(buffer, buffer);
242 264
243 #endif 265 #endif
244 266
  267 + unsigned char pcm_buffer[640 * 2];
  268 + int pcm_bytes = 640 * 2;
  269 +
  270 + //把short类型的数据转换为char型输入到播放器
  271 + for (int i = 0; i < 640; i++)
  272 + {
  273 + pcm_buffer[2 * i] = buffer[i] & 0xFF;
  274 + pcm_buffer[2 * i + 1] = (buffer[i] >> 8) & 0xFF;
  275 + }
  276 +
245 //默认数据pcm接入口都是 单声道,16位 277 //默认数据pcm接入口都是 单声道,16位
246 - PCM_PooL_Interface_PcmData(AudioDeakInfo_index, In_Bitrate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16, buffer, bytesRead, DateType); 278 + PCM_PooL_Interface_PcmData(AudioDeakInfo_index, In_Bitrate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16, pcm_buffer, pcm_bytes, DateType);
247 279
248 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 280 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
249 } 281 }
1 -/** 1 +/**
2 ******************************************************************** 2 ********************************************************************
3 * @file AudioDeal.h 3 * @file AudioDeal.h
4 * AudioDeal的头文件 4 * AudioDeal的头文件
@@ -103,7 +103,8 @@ T_JZsdkReturnCode AudioDeal_Init(); @@ -103,7 +103,8 @@ T_JZsdkReturnCode AudioDeal_Init();
103 103
104 T_JZsdkReturnCode AudioDeal_PcmDataInput_TextSteam(int In_Bitrate, unsigned char *buffer, int bytesRead); 104 T_JZsdkReturnCode AudioDeal_PcmDataInput_TextSteam(int In_Bitrate, unsigned char *buffer, int bytesRead);
105 T_JZsdkReturnCode AudioDeal_PcmDataInput_RecordSteam(int In_Bitrate, unsigned char *buffer, int bytesRead); 105 T_JZsdkReturnCode AudioDeal_PcmDataInput_RecordSteam(int In_Bitrate, unsigned char *buffer, int bytesRead);
106 -T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, unsigned char *buffer, int bytesRead); 106 +T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, short* buffer, int frame_size);
  107 +T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam_byChar(int In_Bitrate, unsigned char* buffer, int bytesRead);
107 108
108 T_JZsdkReturnCode AudioDeal_EchoCancellation_Init(int SampleRate); 109 T_JZsdkReturnCode AudioDeal_EchoCancellation_Init(int SampleRate);
109 110
1 -#include "JZsdkLib.h" 1 +#include "JZsdkLib.h"
2 #include "version_choose.h" 2 #include "version_choose.h"
3 3
4 -//main函数参数一是原始pcm文件名,参数二是去噪后的pcm文件名  
5 -  
6 -  
7 #ifdef SPEEX_STATUS_ON 4 #ifdef SPEEX_STATUS_ON
8 5
9 #include <stdio.h> 6 #include <stdio.h>
10 #include <string.h> 7 #include <string.h>
11 -#include "speex/speex_echo.h" // Speex 回声消除头文件  
12 -#include "speex/speex_preprocess.h" // Speex 预处理头文件  
13 -  
14 -/*  
15 -graph LR  
16 -  
17 -A[原始语音信号] --> B[预处理]  
18 -B --> C[语言检测]  
19 -C -->|英语| D[英语参数配置]  
20 -C -->|汉语| E[汉语参数配置]  
21 -C -->|法语| F[法语参数配置]  
22 -D --> G[Speex编码器]  
23 -E --> H[Speex编码器]  
24 -F --> I[Speex编码器]  
25 -G --> J[输出编码数据]  
26 -H --> J  
27 -I --> J  
28 -*/  
29 -  
30 -#define TAIL_TIME 500 //回声尾长,单位毫秒  
31 -  
32 -typedef struct JZ_SpeexInfo{  
33 -  
34 - //处理的音频样本长度, 一般对应10~20ms的音频数据,太小会增加计算开销,太大会增加处理延迟  
35 - int DealSampleLen;  
36 -  
37 - /*  
38 - 回声尾长 表示需要消除的回声持续时间(以样本数计) 建议值对应100-500毫秒的音频数据  
39 - 对于8kHz采样率:800-4000个样本  
40 - 对于16kHz采样率:1600-8000个样本  
41 - */  
42 - int TailLen;  
43 -  
44 - //音频采样率 8 +#include "speex/speex_echo.h"
  9 +#include "speex/speex_preprocess.h"
  10 +
  11 +// ========== 可配置参数 ==========
  12 +#define TAIL_MS 300 // 回声尾长(毫秒)
  13 +#define FRAME_SAMPLES 640 // 每帧样本数 640个short
  14 +#define SAMPLE_RATE 16000 // 采样率
  15 +#define PLAYBACK_DELAY_FRAMES 1 // 播放延迟(帧数),1 表示用上一帧作为参考
  16 +// =================================
  17 +
  18 +typedef struct JZ_SpeexInfo {
45 int SampleRate; 19 int SampleRate;
  20 + int FrameSize;
  21 + int TailLen; // 回声尾长(样本数)
  22 + int PlaybackDelaySamples; // 播放延迟(样本数)
46 23
47 - // Speex回声消除状态  
48 - SpeexEchoState *EchoState; 24 + SpeexEchoState* EchoState;
  25 + SpeexPreprocessState* PreprocessState;
49 26
50 - // Speex预处理状态  
51 - SpeexPreprocessState *PreprocessState; 27 + // 环形缓冲区,存储历史输出帧(即播放过的数据)
  28 + short* HistoryBuffer;
  29 + int HistorySize; // 缓冲区总长度(样本数)
  30 + int WritePos; // 下一个写入位置
  31 + int TotalWritten; // 累计写入样本数(用于判断缓冲区是否足够)
52 32
53 - // 存储回声消除的样本  
54 - short *EchoBuf;  
55 - int EchoBufLen; 33 + SpeexPreprocessState* DenoiseOnlyState;
  34 + int DenoiseOnlyFlag; // 是否启用独立降噪模式
56 35
57 - //标志位  
58 int Flag; 36 int Flag;
  37 +} JZ_SpeexInfo;
  38 +
  39 +static JZ_SpeexInfo g_SpeexInfo = { 0 };
  40 +
  41 +// 初始化历史缓冲区
  42 +static int InitHistoryBuffer(int size_samples) {
  43 + if (g_SpeexInfo.HistoryBuffer) {
  44 + free(g_SpeexInfo.HistoryBuffer);
  45 + g_SpeexInfo.HistoryBuffer = NULL;
  46 + }
  47 + g_SpeexInfo.HistoryBuffer = (short*)malloc(size_samples * sizeof(short));
  48 + if (!g_SpeexInfo.HistoryBuffer) return -1;
  49 + memset(g_SpeexInfo.HistoryBuffer, 0, size_samples * sizeof(short));
  50 + g_SpeexInfo.HistorySize = size_samples;
  51 + g_SpeexInfo.WritePos = 0;
  52 + g_SpeexInfo.TotalWritten = 0;
  53 + return 0;
  54 +}
  55 +
  56 +// 写入一帧到历史缓冲区(播放过的帧)
  57 +static void WriteHistoryFrame(short* frame) {
  58 + int fs = g_SpeexInfo.FrameSize;
  59 + int hist_size = g_SpeexInfo.HistorySize;
  60 + int write_pos = g_SpeexInfo.WritePos;
  61 +
  62 + if (write_pos + fs <= hist_size) {
  63 + memcpy(g_SpeexInfo.HistoryBuffer + write_pos, frame, fs * sizeof(short));
  64 + }
  65 + else {
  66 + int first_part = hist_size - write_pos;
  67 + memcpy(g_SpeexInfo.HistoryBuffer + write_pos, frame, first_part * sizeof(short));
  68 + memcpy(g_SpeexInfo.HistoryBuffer, frame + first_part, (fs - first_part) * sizeof(short));
  69 + }
  70 + g_SpeexInfo.WritePos = (write_pos + fs) % hist_size;
  71 + g_SpeexInfo.TotalWritten += fs;
  72 +}
  73 +
  74 +// 从历史缓冲区读取参考帧(对齐到当前麦克风时间)
  75 +static int ReadRefFrame(short* out_ref) {
  76 + int fs = g_SpeexInfo.FrameSize;
  77 + int hist_size = g_SpeexInfo.HistorySize;
  78 + int write_pos = g_SpeexInfo.WritePos;
  79 + int delay_samples = g_SpeexInfo.PlaybackDelaySamples;
  80 +
  81 + int read_pos = write_pos - delay_samples - fs;
  82 + if (read_pos < 0) read_pos += hist_size;
59 83
60 -}JZ_SpeexInfo; 84 + if (g_SpeexInfo.TotalWritten < delay_samples + fs) {
  85 + return -1;
  86 + }
61 87
62 -static JZ_SpeexInfo g_SpeexInfo = {0}; 88 + if (read_pos + fs <= hist_size) {
  89 + memcpy(out_ref, g_SpeexInfo.HistoryBuffer + read_pos, fs * sizeof(short));
  90 + }
  91 + else {
  92 + int first_part = hist_size - read_pos;
  93 + memcpy(out_ref, g_SpeexInfo.HistoryBuffer + read_pos, first_part * sizeof(short));
  94 + memcpy(out_ref + first_part, g_SpeexInfo.HistoryBuffer, (fs - first_part) * sizeof(short));
  95 + }
  96 + return 0;
  97 +}
63 98
64 T_JZsdkReturnCode Speex_Deinit() 99 T_JZsdkReturnCode Speex_Deinit()
65 { 100 {
66 if (g_SpeexInfo.Flag == JZ_FLAGCODE_ON) 101 if (g_SpeexInfo.Flag == JZ_FLAGCODE_ON)
67 { 102 {
68 - speex_echo_state_destroy(g_SpeexInfo.EchoState); // 释放回声消除状态  
69 - speex_preprocess_state_destroy(g_SpeexInfo.PreprocessState); // 释放预处理状态 103 + if (g_SpeexInfo.EchoState)
  104 + {
  105 + speex_echo_state_destroy(g_SpeexInfo.EchoState);
  106 + g_SpeexInfo.EchoState = NULL;
  107 + }
70 108
71 - memset(&(g_SpeexInfo.EchoBuf), 0, sizeof(g_SpeexInfo.EchoBuf));  
72 - g_SpeexInfo.EchoBufLen = 0; 109 + if (g_SpeexInfo.PreprocessState)
  110 + {
  111 + speex_preprocess_state_destroy(g_SpeexInfo.PreprocessState);
  112 + g_SpeexInfo.PreprocessState = NULL;
  113 + }
73 114
74 - if (g_SpeexInfo.EchoBuf != NULL) 115 + if (g_SpeexInfo.HistoryBuffer)
75 { 116 {
76 - free(g_SpeexInfo.EchoBuf);  
77 - g_SpeexInfo.EchoBuf = NULL; 117 + free(g_SpeexInfo.HistoryBuffer);
  118 + g_SpeexInfo.HistoryBuffer = NULL;
78 } 119 }
79 120
  121 + memset(&g_SpeexInfo, 0, sizeof(g_SpeexInfo));
80 g_SpeexInfo.Flag = JZ_FLAGCODE_OFF; 122 g_SpeexInfo.Flag = JZ_FLAGCODE_OFF;
81 } 123 }
82 124
83 - JZSDK_LOG_DEBUG("Speex_Deinit success\n"); 125 + //降噪注销
  126 + if (g_SpeexInfo.DenoiseOnlyState)
  127 + {
  128 + speex_preprocess_state_destroy(g_SpeexInfo.DenoiseOnlyState);
  129 + g_SpeexInfo.DenoiseOnlyState = NULL;
  130 + }
84 131
  132 + JZSDK_LOG_DEBUG("Speex_Deinit success\n");
85 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 133 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
86 } 134 }
87 135
88 -T_JZsdkReturnCode Speex_Init(int SampleRate) 136 +// 初始化
  137 +// sample_rate: 采样率(如 16000)
  138 +T_JZsdkReturnCode Speex_Init(int sample_rate)
89 { 139 {
90 - //检查speex的参数  
91 if (g_SpeexInfo.Flag == JZ_FLAGCODE_ON) 140 if (g_SpeexInfo.Flag == JZ_FLAGCODE_ON)
92 { 141 {
93 Speex_Deinit(); 142 Speex_Deinit();
94 } 143 }
95 144
96 - g_SpeexInfo.SampleRate = SampleRate; 145 + int frame_samples = FRAME_SAMPLES;
  146 + int playback_delay_frames = PLAYBACK_DELAY_FRAMES;
97 147
98 - //计算长度  
99 - g_SpeexInfo.TailLen = SampleRate * TAIL_TIME / 1000 ; //可以×1.2作为余量  
100 - g_SpeexInfo.DealSampleLen = 640; //16000 * time / 1000 //目前是因为程序写死了80 后面可以改 148 + g_SpeexInfo.SampleRate = sample_rate;
  149 + g_SpeexInfo.FrameSize = frame_samples;
  150 + g_SpeexInfo.TailLen = sample_rate * TAIL_MS / 1000;
  151 + g_SpeexInfo.PlaybackDelaySamples = playback_delay_frames * frame_samples;
101 152
102 - // 初始化回声消除状态  
103 - g_SpeexInfo.EchoState = speex_echo_state_init(g_SpeexInfo.DealSampleLen, g_SpeexInfo.TailLen);  
104 - g_SpeexInfo.PreprocessState = speex_preprocess_state_init(g_SpeexInfo.DealSampleLen, g_SpeexInfo.SampleRate); // 初始化预处理状态 153 + int hist_size = g_SpeexInfo.TailLen + g_SpeexInfo.PlaybackDelaySamples + frame_samples * 2;
105 154
106 - //设置采样率  
107 - speex_echo_ctl(g_SpeexInfo.EchoState, SPEEX_ECHO_SET_SAMPLING_RATE, &(g_SpeexInfo.SampleRate)); 155 + g_SpeexInfo.EchoState = speex_echo_state_init(frame_samples, g_SpeexInfo.TailLen);
  156 + if (!g_SpeexInfo.EchoState) {
  157 + JZSDK_LOG_DEBUG("Speex_Init: speex_echo_state_init failed\n");
  158 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  159 + }
  160 + speex_echo_ctl(g_SpeexInfo.EchoState, SPEEX_ECHO_SET_SAMPLING_RATE, &sample_rate);
  161 +
  162 + g_SpeexInfo.PreprocessState = speex_preprocess_state_init(frame_samples, sample_rate);
  163 + if (!g_SpeexInfo.PreprocessState)
  164 + {
  165 + speex_echo_state_destroy(g_SpeexInfo.EchoState);
  166 + JZSDK_LOG_DEBUG("Speex_Init: speex_preprocess_state_init failed\n");
  167 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  168 + }
108 169
109 - //将预处理状态与回声消除状态关联  
110 speex_preprocess_ctl(g_SpeexInfo.PreprocessState, SPEEX_PREPROCESS_SET_ECHO_STATE, g_SpeexInfo.EchoState); 170 speex_preprocess_ctl(g_SpeexInfo.PreprocessState, SPEEX_PREPROCESS_SET_ECHO_STATE, g_SpeexInfo.EchoState);
111 171
112 - //注册预处理数据数组  
113 - g_SpeexInfo.EchoBuf = (short *)malloc(g_SpeexInfo.TailLen * sizeof(short)); 172 + if (InitHistoryBuffer(hist_size) != 0) {
  173 + speex_echo_state_destroy(g_SpeexInfo.EchoState);
  174 + speex_preprocess_state_destroy(g_SpeexInfo.PreprocessState);
  175 + JZSDK_LOG_DEBUG("Speex_Init: history buffer allocation failed\n");
  176 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  177 + }
114 178
115 g_SpeexInfo.Flag = JZ_FLAGCODE_ON; 179 g_SpeexInfo.Flag = JZ_FLAGCODE_ON;
  180 + JZSDK_LOG_DEBUG("Speex_Init success: sr=%d, fs=%d, tail=%d, delay=%d samples, hist=%d\n",
  181 + sample_rate, frame_samples, g_SpeexInfo.TailLen,
  182 + g_SpeexInfo.PlaybackDelaySamples, hist_size);
  183 +
  184 +
  185 +
116 186
117 - JZSDK_LOG_DEBUG("Speex_Init success\n"); 187 + /***********************************
  188 +
  189 + 降噪配置
  190 +
  191 +
  192 + *************************************/
  193 + g_SpeexInfo.DenoiseOnlyState = speex_preprocess_state_init(FRAME_SAMPLES, sample_rate);
  194 + if (!g_SpeexInfo.DenoiseOnlyState) {
  195 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  196 + }
  197 +
  198 + // 在 Speex_Init 中,创建 DenoiseOnlyState 后添加:
  199 + int vad = 0;
  200 + speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_VAD, &vad);
  201 + int agc = 0;
  202 + speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_AGC, &agc);
  203 + int denoise = 1; // 保持开启
  204 + speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_DENOISE, &denoise);
  205 + // 可选:关闭降噪的自动增益补偿
  206 + int noise_suppress = 0; // 或者尝试 1,2...
  207 + speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &noise_suppress);
118 208
119 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 209 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
120 } 210 }
121 211
122 -T_JZsdkReturnCode Speex_DealData(short *InData, short *OutData, int frame_size) 212 +
  213 +// 独立降噪处理(char* 版本,原地处理)
  214 +T_JZsdkReturnCode Speex_DenoiseOnly_Process(short* mic, short* out)
123 { 215 {
124 - if (g_SpeexInfo.Flag == JZ_FLAGCODE_OFF) 216 + if (!g_SpeexInfo.DenoiseOnlyState)
125 { 217 {
  218 + if (out != mic) memcpy(out, mic, FRAME_SAMPLES * sizeof(short));
126 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 219 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
127 } 220 }
128 221
129 - //填充回声消除的样本  
130 - if (g_SpeexInfo.EchoBufLen < g_SpeexInfo.TailLen)  
131 - {  
132 - memcpy(&(g_SpeexInfo.EchoBuf[g_SpeexInfo.EchoBufLen]), InData, frame_size * sizeof(short));  
133 - g_SpeexInfo.EchoBufLen += frame_size;  
134 - }  
135 - //如果里面有完整数据  
136 - else if (g_SpeexInfo.EchoBufLen == g_SpeexInfo.DealSampleLen)  
137 - {  
138 - //对数据进行位移  
139 - memmove(g_SpeexInfo.EchoBuf, &(g_SpeexInfo.EchoBuf[frame_size]), (g_SpeexInfo.EchoBufLen - frame_size) * sizeof(short)); 222 + if (out != mic) memcpy(out, mic, FRAME_SAMPLES * sizeof(short));
140 223
141 - //将新的数据填充到回声消除的样本中  
142 - memcpy(&(g_SpeexInfo.EchoBuf[g_SpeexInfo.EchoBufLen - frame_size]), InData, frame_size * sizeof(short));  
143 - }  
144 - //如果里面的数据超了  
145 - else if (g_SpeexInfo.EchoBufLen > g_SpeexInfo.TailLen) 224 + speex_preprocess_run(g_SpeexInfo.DenoiseOnlyState, out);
  225 +
  226 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  227 +}
  228 +
  229 +// 处理麦克风数据(char* 版本)
  230 +// mic: 麦克风采集的原始 PCM 字节流(长度 = frame_samples * sizeof(short) = 640 字节)
  231 +// out: 处理后的干净 PCM 字节流(长度相同,可与 mic 共用内存)
  232 +// 注意:out 同时会被保存到历史缓冲区,作为下一帧的参考信号(播放数据)
  233 +T_JZsdkReturnCode Speex_ProcessMic(short* mic, short* out)
  234 +{
  235 + if (g_SpeexInfo.Flag == JZ_FLAGCODE_OFF)
146 { 236 {
147 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 237 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
148 } 238 }
149 239
150 - //如果没有填充完回声数组  
151 - if (g_SpeexInfo.EchoBufLen < g_SpeexInfo.TailLen) 240 + short ref_frame[FRAME_SAMPLES]; // 用于存放参考帧
  241 + if (ReadRefFrame(ref_frame) != 0)
152 { 242 {
153 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 243 + // 历史数据不足,直接拷贝输出
  244 + if (out != mic) memcpy(out, mic, g_SpeexInfo.FrameSize * sizeof(short));
  245 + WriteHistoryFrame(out);
  246 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
154 } 247 }
155 248
156 - // // 执行回声消除  
157 - // speex_echo_cancellation(g_SpeexInfo.EchoState, InData, g_SpeexInfo.EchoBuf, OutData); 249 + // 执行回声消除
  250 + speex_echo_cancellation(g_SpeexInfo.EchoState, mic, ref_frame, out);
  251 +
  252 + // 执行后处理(噪声抑制等)
  253 + speex_preprocess_run(g_SpeexInfo.PreprocessState, out);
158 254
159 - // // 执行预处理(如噪声抑制等)  
160 - // speex_preprocess_run(g_SpeexInfo.PreprocessState, OutData); 255 + // 将处理后的帧写入历史缓冲区(因为它即将被播放)
  256 + WriteHistoryFrame(out);
161 257
162 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 258 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
163 } 259 }
1 -/** 1 +/**
2 ******************************************************************** 2 ********************************************************************
3 * @file speex.h 3 * @file speex.h
4 * speex的头文件 4 * speex的头文件
@@ -24,7 +24,8 @@ extern "C" { @@ -24,7 +24,8 @@ extern "C" {
24 24
25 25
26 /* Exported functions --------------------------------------------------------*/ 26 /* Exported functions --------------------------------------------------------*/
27 -T_JZsdkReturnCode Speex_DealData(short *InData, short *OutData, int frame_size); 27 +T_JZsdkReturnCode Speex_ProcessMic(short* mic, short* out);
  28 +T_JZsdkReturnCode Speex_DenoiseOnly_Process(short* mic, short* out);
28 T_JZsdkReturnCode Speex_Init(int SampleRate); 29 T_JZsdkReturnCode Speex_Init(int SampleRate);
29 30
30 #ifdef __cplusplus 31 #ifdef __cplusplus
@@ -216,6 +216,7 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len @@ -216,6 +216,7 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len
216 frame_size = WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE; 216 frame_size = WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE;
217 } 217 }
218 218
  219 +#if 0
219 //转换 220 //转换
220 opus_int16 TempPcm[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS]; 221 opus_int16 TempPcm[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS];
221 222
@@ -223,14 +224,16 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len @@ -223,14 +224,16 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len
223 { 224 {
224 TempPcm[i] = out[i] & 0xFF | (out[i] >> 8) << 8; 225 TempPcm[i] = out[i] & 0xFF | (out[i] >> 8) << 8;
225 226
226 -#if SPECIAL_VERSION == SPECIAL_DAOTONG  
227 - TempPcm[i] = PcmNoiseReduction(TempPcm[i]);  
228 -#endif  
229 pcm_bytes[2 * i] = TempPcm[i] & 0xFF; 227 pcm_bytes[2 * i] = TempPcm[i] & 0xFF;
230 pcm_bytes[2 * i + 1] = (TempPcm[i] >> 8) & 0xFF; 228 pcm_bytes[2 * i + 1] = (TempPcm[i] >> 8) & 0xFF;
231 } 229 }
232 230
233 - AudioDeal_PcmDataInput_RealTimeSteam(RealTimeDecodeRate, pcm_bytes, frame_size*2); 231 + AudioDeal_PcmDataInput_RealTimeSteam_byChar(RealTimeDecodeRate, pcm_bytes, frame_size * 2);
  232 +#else
  233 + AudioDeal_PcmDataInput_RealTimeSteam(RealTimeDecodeRate, (short*)out, frame_size);
  234 +
  235 +#endif
  236 +
234 237
235 if (decodeErrorFlag == JZ_FLAGCODE_ON) 238 if (decodeErrorFlag == JZ_FLAGCODE_ON)
236 { 239 {
1 -#include "JZsdkLib.h"  
2 -#include "UI_control/Psdk_ui_value_menu.h" 1 +#include "JZsdkLib.h"
  2 +#include "UI_control/Psdk_UI/jzsdk_to_psdk_ui.h"
3 #include "UI_control/UI_control.h" 3 #include "UI_control/UI_control.h"
4 4
5 #include "version_choose.h" 5 #include "version_choose.h"
@@ -13,6 +13,22 @@ @@ -13,6 +13,22 @@
13 #include "SideLaser/SideLaser.h" 13 #include "SideLaser/SideLaser.h"
14 #endif 14 #endif
15 15
  16 +/***********************************************************************
  17 +
  18 + 文件说明, pskd_api.c 用于存放psdkapi
  19 +
  20 + 这里的api有两个功能
  21 +
  22 + wheather_control 关闭时
  23 +
  24 + 这里的api仅用于去修改psdk里ui的值
  25 +
  26 + wheather_control 开启时
  27 +
  28 + 不仅用于修改ui值,还会将控制命令给到ui_api
  29 +
  30 +**************************************************************************/
  31 +
16 //警灯颜色 32 //警灯颜色
17 static int FirstWarningLight = 1; 33 static int FirstWarningLight = 1;
18 static int SecondWarningLight = 3; 34 static int SecondWarningLight = 3;
@@ -75,6 +91,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Audio_PauseAndPlayContinue(int wheather_contr @@ -75,6 +91,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Audio_PauseAndPlayContinue(int wheather_contr
75 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 91 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
76 } 92 }
77 93
  94 + //设置到psdkui
78 JZsdk_PsdkUi_value_set(JZSDK_WIDGET_PLAYANDSTOP, value); 95 JZsdk_PsdkUi_value_set(JZSDK_WIDGET_PLAYANDSTOP, value);
79 96
80 if(wheather_control == JZ_FLAGCODE_ON) 97 if(wheather_control == JZ_FLAGCODE_ON)
@@ -109,22 +126,19 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_StopPlayAudio() @@ -109,22 +126,19 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_StopPlayAudio()
109 return ret; 126 return ret;
110 } 127 }
111 128
112 -// T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetVolume(int wheather_control, int value)  
113 -// {  
114 -// //后续需要优化掉  
115 -// widget_volume = value;  
116 - 129 +//T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetVolume(int wheather_control, int value)
  130 +//{
117 // //控件变化 131 // //控件变化
118 // JZsdk_PsdkUi_value_set(JZSDK_WIDGET_VOLUME, value); 132 // JZsdk_PsdkUi_value_set(JZSDK_WIDGET_VOLUME, value);
119 - 133 +//
120 // //将音量控制值发送到UIcontrol 用于控制设备 134 // //将音量控制值发送到UIcontrol 用于控制设备
121 // if(wheather_control == JZ_FLAGCODE_ON) 135 // if(wheather_control == JZ_FLAGCODE_ON)
122 // { 136 // {
123 // UIcontrol_SetVolume(DEVICE_PSDK, value, JZ_FLAGCODE_ON); 137 // UIcontrol_SetVolume(DEVICE_PSDK, value, JZ_FLAGCODE_ON);
124 // } 138 // }
125 - 139 +//
126 // return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 140 // return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
127 -// } 141 +//}
128 142
129 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_speed(int wheather_control, int speed) 143 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_speed(int wheather_control, int speed)
130 { 144 {
  1 +#include "JZsdkLib.h"
  2 +
  3 +#include "Psdk_ui_to_jzsdk.h"
  4 +#include "./WidegMgmt/JZsdk_Widget.h"
  5 +#include "./jzsdk_to_psdk_ui.h"
  6 +#include "Psdk_UI_io.h"
  7 +#include "BaseConfig.h"
  8 +
  9 +#define AUTO_CONTROL 0x02
  10 +
  11 +
  12 +/*
  13 +* 功率限制
  14 +*
  15 +* flag == 1 , 输入的为音量
  16 +*/
  17 +
  18 +static T_JZsdkReturnCode Psdk_ui_to_jzsdk_PowerLimit(int flag, int value)
  19 +{
  20 + if (flag == 0)
  21 + {
  22 +
  23 + }
  24 + //输入的value为音量
  25 + else if(flag == 1)
  26 + {
  27 + //这几台设备有 音量和亮度的限制
  28 + if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
  29 + {
  30 + //获取当前设备的亮度
  31 + int lumen = 0;
  32 +
  33 + if (value + lumen > 150)
  34 + {
  35 + JZsdk_Psdk_UI_io_Set_SearchLightLumen(AUTO_CONTROL, 150 - value);
  36 + }
  37 + }
  38 + }
  39 +}
  40 +
  41 +//psdk控制上一曲
  42 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_LastSong()
  43 +{
  44 + //发送上一曲命令进队列
  45 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_LASTSONG, 0);
  46 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  47 +}
  48 +
  49 +//psdk控制下一曲
  50 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_NextSong()
  51 +{
  52 + //发送下一曲命令进队列
  53 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_NEXTSONG, 0);
  54 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  55 +}
  56 +
  57 +/*
  58 + psdk控制播放/暂停
  59 +
  60 +*/
  61 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_PlayOrPause(int value)
  62 +{
  63 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PLAYANDSTOP, value);
  64 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  65 +}
  66 +
  67 +
  68 +/*
  69 + psdk控制音量
  70 + value 0~100
  71 +*/
  72 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_Volume(int value, int PowerLimitFlag)
  73 +{
  74 + if (PowerLimitFlag == JZ_FLAGCODE_ON)
  75 + {
  76 +
  77 + }
  78 +
  79 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_VOLUME, value);
  80 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  81 +}
  82 +
  83 +/*
  84 + psdk控制tts文本速度, 档位模式
  85 + value 0 1 2 3
  86 + 对应 0.5速 一倍速 1.5倍数 2倍数
  87 +
  88 +*/
  89 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Speed_ByGear(int value)
  90 +{
  91 + int speed = value;
  92 +
  93 + //将档位模式转换为实际速度
  94 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_TTS_SPEED, &speed);
  95 +
  96 + //推送到队列
  97 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_SPEED, speed);
  98 +
  99 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  100 +}
  101 +
  102 +
  103 +/*
  104 + psdk控制tts文本速度, 数值模式
  105 + value 0~100
  106 +*/
  107 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Speed(int value)
  108 +{
  109 + //推送到队列
  110 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_SPEED, value);
  111 +
  112 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  113 +}
  114 +
  115 +/*
  116 + psdk控制tts文本音色, 档位模式
  117 + value 无固定
  118 +*/
  119 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Tone_ByGear(int value)
  120 +{
  121 + int tone = value;
  122 +
  123 + //将档位模式转换为实际音色
  124 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_TTS_TONE, &tone);
  125 +
  126 + //推送到队列
  127 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_TONE, tone);
  128 +
  129 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  130 +}
  131 +
  132 +/*
  133 + psdk控制tts文本追加音色,档位模式
  134 + value 无固定
  135 +*/
  136 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Tone_Add_ByGear(int value)
  137 +{
  138 + int tone = value;
  139 +
  140 + JZsdk_Psdk_UI_io_AppendTone(1,value);
  141 +
  142 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  143 +}
  144 +
  145 +/*
  146 + psdk控制 喊话器播放循环
  147 + value 0关闭 1开启
  148 +*/
  149 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_Loop(int value)
  150 +{
  151 + JZsdk_Psdk_UI_io_SetAudioPlayLoop(1, value);
  152 +
  153 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  154 +}
  155 +
  156 +/*
  157 + psdk控制 探照灯亮度
  158 + value 0~100
  159 +*/
  160 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Lumen(int value)
  161 +{
  162 + JZsdk_Psdk_UI_io_Set_SearchLightLumen(1,value);
  163 +
  164 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  165 +}
  166 +
  167 +/*
  168 + psdk控制 探照灯模式
  169 + 0 关灯 1 爆闪 2 常亮
  170 +
  171 +*/
  172 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Mode(int value)
  173 +{
  174 + JZsdk_Psdk_UI_io_Set_SearchLightMode(1, value);
  175 +
  176 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  177 +}
  178 +
  179 +/*
  180 + psdk控制 探照灯爆闪频率
  181 + value 0~100
  182 +*/
  183 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Freq(int value)
  184 +{
  185 + JZsdk_Psdk_UI_io_Set_SearchLightFrequency(1,value);
  186 +
  187 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  188 +}
  189 +
  190 +/*
  191 + psdk控制 激光模式 档位模式
  192 + value 不定
  193 +*/
  194 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Mode_ByGear(int value)
  195 +{
  196 + int mode = value;
  197 +
  198 + //将档位模式转换为实际模式
  199 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_SIDE_LASER_MODE, &mode);
  200 +
  201 + //推送到队列
  202 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_MODE, mode);
  203 +
  204 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  205 +}
  206 +
  207 +/*
  208 + psdk控制 激光亮度
  209 + value 0~100
  210 +*/
  211 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Lumen(int value)
  212 +{
  213 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_LUMEN, value);
  214 +
  215 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  216 +}
  217 +
  218 +/*
  219 + psdk控制 激光颜色
  220 +*/
  221 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Color(int value)
  222 +{
  223 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_COLOR, value);
  224 +
  225 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  226 +}
  227 +
  228 +/*
  229 + psdk控制 警灯模式 档位模式
  230 + value 不定
  231 +*/
  232 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Mode_ByGear(int value)
  233 +{
  234 + int mode = value;
  235 +
  236 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_MODE, &mode);
  237 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_MODE, mode);
  238 +
  239 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  240 +}
  241 +
  242 +/*
  243 + psdk控制 警灯颜色1 档位模式
  244 + value 不定
  245 +*/
  246 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Color1_ByGear(int value)
  247 +{
  248 + int color = value;
  249 +
  250 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_COLOR_1, &color);
  251 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_COLOR_1,color);
  252 +
  253 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  254 +}
  255 +
  256 +/*
  257 + psdk控制 警灯颜色2 档位模式
  258 + value 不定
  259 +*/
  260 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Color2_ByGear(int value)
  261 +{
  262 + int color = value;
  263 +
  264 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_COLOR_2, &color);
  265 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_COLOR_2,color);
  266 +
  267 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  268 +}
  269 +
  270 +/*
  271 + psdk
  272 + 滑动条控制云台
  273 + value 0~100
  274 +*/
  275 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_PitchAngle_BySlider(int value)
  276 +{
  277 + JZsdk_Psdk_Ui_io_Gimbal_PitchScaleMode(value);
  278 +
  279 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  280 +}
  281 +
  282 +/*
  283 + psdk
  284 + 云台微调 单次输入值变化模式
  285 +
  286 +*/
  287 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_AdjustmentPitch_ByVariation(int value)
  288 +{
  289 +
  290 + JZsdk_Psdk_UI_io_Set_AdjustmentGimbalPitchAngle(value);
  291 +
  292 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  293 +}
  294 +
  295 +/*
  296 + psdk
  297 + 对外供电开关
  298 + 0关 1开
  299 +*/
  300 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_PowerSupply(int value)
  301 +{
  302 + int power;
  303 + if(value == 0)
  304 + {
  305 + power = JZ_FLAGCODE_OFF;
  306 + }
  307 + else
  308 + {
  309 + power = JZ_FLAGCODE_ON;
  310 + }
  311 +
  312 + JZsdk_Psdk_UI_io_Set_OutputPowerStatus(1 ,power);
  313 +
  314 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  315 +}
  316 +
  317 +/*
  318 + psdk 开机预设任务添加
  319 + value 0 关 1开
  320 +*/
  321 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_PrsetTask(int value)
  322 +{
  323 + int task;
  324 + if(value == 0)
  325 + {
  326 + task = JZ_FLAGCODE_OFF;
  327 + }
  328 + else
  329 + {
  330 + task = JZ_FLAGCODE_ON;
  331 + }
  332 +
  333 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PRSET_TASK, task);
  334 +
  335 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  336 +}
  337 +
  338 +/*
  339 + psdk 单边云台补偿值
  340 +
  341 + value1 修改的云台 value2 修改值
  342 +*/
  343 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(int value1, int value2)
  344 +{
  345 + JZSDK_WidgetMgMT_ConrtrolInputTask(value1, value2);
  346 +
  347 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  348 +}
  349 +
  350 +/*
  351 + 设置picth云台的最大最小值
  352 + value 0 最大值 value 1 最小值
  353 +
  354 +*/
  355 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_PitchAngle_ByMaxMin(int value)
  356 +{
  357 + if (value == 0)
  358 + {
  359 + JZsdk_Psdk_UI_io_Set_MAXGimbalRangen();
  360 + }
  361 + else if (value == 1)
  362 + {
  363 + JZsdk_Psdk_UI_io_Set_MINGimbalRangen();
  364 + }
  365 +
  366 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  367 +}
  1 +/**
  2 + ********************************************************************
  3 + * @file Psdk_ui_to_jzsdk.h
  4 + * Psdk_ui_to_jzsdk.h的头文件
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef PSDK_UI_TO_JZSDK_H
  11 +#define PSDK_UI_TO_JZSDK_H
  12 +
  13 +/* Includes ------------------------------------------------------------------*/
  14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  15 +
  16 +#ifdef __cplusplus
  17 +extern "C" {
  18 +#endif
  19 +
  20 +/* Exported constants --------------------------------------------------------*/
  21 +
  22 +/* 常亮定义*/
  23 +
  24 +/* Exported types ------------------------------------------------------------*/
  25 +
  26 +/* Exported functions --------------------------------------------------------*/
  27 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_LastSong();
  28 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_NextSong();
  29 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_PlayOrPause(int value);
  30 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_Volume(int value, int PowerLimitFlag);
  31 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Speed_ByGear(int value);
  32 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Speed(int value);
  33 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Tone_ByGear(int value);
  34 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_TTS_Tone_Add_ByGear(int value);
  35 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Megphone_Loop(int value);
  36 +
  37 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Lumen(int value);
  38 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Mode(int value);
  39 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_SearchLight_Freq(int value);
  40 +
  41 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Mode_ByGear(int value);
  42 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Lumen(int value);
  43 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_Laser_Color(int value);
  44 +
  45 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Mode_ByGear(int value);
  46 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Color1_ByGear(int value);
  47 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_WarnLight_Color2_ByGear(int value);
  48 +
  49 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_PitchAngle_BySlider(int value);
  50 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_AdjustmentPitch_ByVariation(int value);
  51 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_PowerSupply(int value);
  52 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_PrsetTask(int value);
  53 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(int value1, int value2);
  54 +T_JZsdkReturnCode Psdk_ui_to_jzsdk_PitchAngle_ByMaxMin(int value);
  55 +
  56 +#ifdef __cplusplus
  57 +}
  58 +#endif
  59 +
  60 +#endif
1 -#include "Psdk_ui_value_menu.h" 1 +#include "UI_control/Psdk_UI_io.h"
2 #include "JZsdkLib.h" 2 #include "JZsdkLib.h"
3 #include "DeviceInfo/DeviceInfo.h" 3 #include "DeviceInfo/DeviceInfo.h"
4 4
5 #include "version_choose.h" 5 #include "version_choose.h"
6 -#include "JZsdkLib.h"  
7 #include "ExtensionAPI/JZsdk_ExpansionApi.h" 6 #include "ExtensionAPI/JZsdk_ExpansionApi.h"
8 7
9 //当x < min时,返回min;当x > max时,返回max;否则返回x 8 //当x < min时,返回min;当x > max时,返回max;否则返回x
@@ -314,7 +313,7 @@ static T_JZsdkReturnCode JZsdk_UI_DJIpsdk_Widget_set(JZsdk_Widget_Control index, @@ -314,7 +313,7 @@ static T_JZsdkReturnCode JZsdk_UI_DJIpsdk_Widget_set(JZsdk_Widget_Control index,
314 313
315 case JZSDK_WIDGET_WARNLIGHT_COLOR_2: 314 case JZSDK_WIDGET_WARNLIGHT_COLOR_2:
316 { 315 {
317 - temp = UI_control_value_to_SecondaryWidgetValue(JZSDK_WIDGET_WARNLIGHT_COLOR_1, value); 316 + temp = UI_control_value_to_SecondaryWidgetValue(JZSDK_WIDGET_WARNLIGHT_COLOR_2, value);
318 UI_control_WidgetArraySet(18, index); 317 UI_control_WidgetArraySet(18, index);
319 } 318 }
320 break; 319 break;
@@ -393,6 +392,7 @@ T_JZsdkReturnCode JZsdk_PsdkUi_value_get(JZsdk_Widget_Control index, int *value) @@ -393,6 +392,7 @@ T_JZsdkReturnCode JZsdk_PsdkUi_value_get(JZsdk_Widget_Control index, int *value)
393 #if DEVICE_VERSION == JZ_T40 || DEVICE_VERSION == JZ_T40S 392 #if DEVICE_VERSION == JZ_T40 || DEVICE_VERSION == JZ_T40S
394 393
395 int type = JZsdk_GetDeviceType(); 394 int type = JZsdk_GetDeviceType();
  395 +
396 if (type == 0 || type == 1) 396 if (type == 0 || type == 1)
397 { 397 {
398 temp = IN_RANGE_OR_ZERO(temp, 0, (ARRAY_SIZE(WarnColor_RedBule) - 1)); 398 temp = IN_RANGE_OR_ZERO(temp, 0, (ARRAY_SIZE(WarnColor_RedBule) - 1));
1 -/** 1 +/**
2 ******************************************************************** 2 ********************************************************************
3 - * @file Psdk_ui_change.h  
4 - * Psdk_ui_change的头文件 3 + * @file jzsdk_to_psdk_ui.h
  4 + * jzsdk_to_psdk_ui.h的头文件
5 * 5 *
6 ********************************************************************* 6 *********************************************************************
7 */ 7 */
8 8
9 /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/ 9 /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
10 -#ifndef PSDK_UI_CHANGE_H  
11 -#define PSDK_UI_CHANGE_H 10 +#ifndef JZSDK_TO_PSDK_UI_H
  11 +#define JZSDK_TO_PSDK_UI_H
12 12
13 /* Includes ------------------------------------------------------------------*/ 13 /* Includes ------------------------------------------------------------------*/
14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h" 14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
@@ -461,284 +461,6 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetVolume(int wheather_control, int value) @@ -461,284 +461,6 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetVolume(int wheather_control, int value)
461 } 461 }
462 } 462 }
463 463
464 -// //psdk 变量获取tts语速  
465 -// int JZsdk_Psdk_UI_io_GetTTSSpeed_ByValue(int value)  
466 -// {  
467 -// switch (value)  
468 -// {  
469 -// case 0:  
470 -// return 25;  
471 -// break;  
472 -// case 1:  
473 -// return 50;  
474 -// break;  
475 -// case 2:  
476 -// return 75;  
477 -// break;  
478 -// case 3:  
479 -// return 100;  
480 -// break;  
481 -// default:  
482 -// break;  
483 -// }  
484 -// }  
485 -  
486 -// // psdkTTS语速 0-100 25 50 75 100  
487 -// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_speed(int wheather_control, int speed)  
488 -// {  
489 -// T_JZsdkReturnCode ret;  
490 -// int value;  
491 -  
492 -// if (speed >=0 && speed <=25 )  
493 -// {  
494 -// value = 0;  
495 -// }  
496 -// else if (speed > 25 && speed <= 50)  
497 -// {  
498 -// value = 1;  
499 -// }  
500 -// else if (speed > 50 && speed <= 75)  
501 -// {  
502 -// value = 2;  
503 -// }  
504 -// else if (speed > 75 && speed <= 100)  
505 -// {  
506 -// value = 3;  
507 -// }  
508 -  
509 -// // 调整控件  
510 -// UI_control_WidgetSet(PSDK_UI_WIDGET_SPEED, value);  
511 -  
512 -// // 如果有进行控制,不只是改控件  
513 -// if (wheather_control == 1)  
514 -// {  
515 -// ret = UIcontrol_Set_TTS_speed(DEVICE_PSDK, speed);  
516 -// return ret;  
517 -// }  
518 -// }  
519 -  
520 -  
521 -// //psdk 变量获取tts音色  
522 -// int JZsdk_Psdk_UI_io_GetTTSTone_ByValue(int value)  
523 -// {  
524 -// E_LanguageInfo LanguageInfo = LanguageInfo_Get_LanguageInfo();  
525 -// if (LanguageInfo == LANGUAGE_INFO_CHINESE)  
526 -// {  
527 -// switch (value)  
528 -// {  
529 -// case 0:  
530 -// return 0x01;  
531 -// break;  
532 -// case 1:  
533 -// return 0x02;  
534 -// break;  
535 -// case 2:  
536 -// return 0x11;  
537 -// break;  
538 -// case 3:  
539 -// return 0x12;  
540 -// break;  
541 -// case 4:  
542 -// return 0x31;  
543 -// break;  
544 -// case 5:  
545 -// return 0x32;  
546 -// break;  
547 -// case 6:  
548 -// return 0x33;  
549 -// break;  
550 -// case 7:  
551 -// return 0x34;  
552 -// break;  
553 -// case 8:  
554 -// return 0x35;  
555 -// break;  
556 -// case 9:  
557 -// return 0x36;  
558 -// break;  
559 -// default:  
560 -// return 0x01;  
561 -// break;  
562 -// }  
563 -  
564 -// }  
565 -  
566 -// else  
567 -// {  
568 -// switch (value)  
569 -// {  
570 -// case 0:  
571 -// return 0x11;  
572 -// break;  
573 -// case 1:  
574 -// return 0x12;  
575 -// break;  
576 -// case 2:  
577 -// return 0x01;  
578 -// break;  
579 -// case 3:  
580 -// return 0x02;  
581 -// break;  
582 -// case 4:  
583 -// return 0x41;  
584 -// break;  
585 -// case 5:  
586 -// return 0x42;  
587 -// break;  
588 -// case 6:  
589 -// return 0x43;  
590 -// break;  
591 -// case 7:  
592 -// return 0x44;  
593 -// break;  
594 -// case 8:  
595 -// return 0x45;  
596 -// break;  
597 -// case 9:  
598 -// return 0x46;  
599 -// break;  
600 -// case 10:  
601 -// return 0x47;  
602 -// break;  
603 -// case 11:  
604 -// return 0x48;  
605 -// break;  
606 -  
607 -// default:  
608 -// return 0x11;  
609 -// break;  
610 -// }  
611 -// }  
612 -  
613 -// }  
614 -  
615 -// // psdkTTS音色 10个音色  
616 -// // 要分国内版和海外版  
617 -// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_tone(int wheather_control, int tone)  
618 -// {  
619 -  
620 -// T_JZsdkReturnCode ret;  
621 -// int value;  
622 -// E_LanguageInfo LanguageInfo = LanguageInfo_Get_LanguageInfo();  
623 -// if (LanguageInfo == LANGUAGE_INFO_CHINESE)  
624 -// {  
625 -// switch (tone)  
626 -// {  
627 -// case 0x01:  
628 -// value = 0;  
629 -// break;  
630 -  
631 -// case 0x02:  
632 -// value = 1;  
633 -// break;  
634 -  
635 -// case 0x11:  
636 -// value = 2;  
637 -// break;  
638 -  
639 -// case 0x12:  
640 -// value = 3;  
641 -// break;  
642 -  
643 -// case 0x31:  
644 -// value = 4;  
645 -// break;  
646 -  
647 -// case 0x32:  
648 -// value = 5;  
649 -// break;  
650 -  
651 -// case 0x33:  
652 -// value = 6;  
653 -// break;  
654 -  
655 -// case 0x34:  
656 -// value = 7;  
657 -// break;  
658 -  
659 -// case 0x35:  
660 -// value = 8;  
661 -// break;  
662 -  
663 -// case 0x36:  
664 -// value = 9;  
665 -// break;  
666 -  
667 -// default:  
668 -// printf("无效的tts设置\n");  
669 -// return JZ_ERRORCODE_TTS_INVALID_TONE;  
670 -// break;  
671 -// }  
672 -// }  
673 -// else {  
674 -// switch (tone)  
675 -// {  
676 -// case 0x01:  
677 -// value = 2;  
678 -// break;  
679 -  
680 -// case 0x02:  
681 -// value = 3;  
682 -// break;  
683 -  
684 -// case 0x11:  
685 -// value = 0;  
686 -// break;  
687 -  
688 -// case 0x12:  
689 -// value = 1;  
690 -// break;  
691 -  
692 -// case 0x41://俄 russian ru  
693 -// value = 4;  
694 -// break;  
695 -  
696 -// case 0x42://法 french fr-fr  
697 -// value = 5;  
698 -// break;  
699 -  
700 -// case 0x43://德 german de  
701 -// value = 6;  
702 -// break;  
703 -  
704 -// case 0x44://韩 ko  
705 -// value = 7;  
706 -// break;  
707 -  
708 -// case 0x45://意大利 italian it  
709 -// value = 8;  
710 -// break;  
711 -  
712 -// case 0x46://波兰 polish pl  
713 -// value = 9;  
714 -// break;  
715 -  
716 -// case 0x47://西班牙 spanish es  
717 -// value = 10;  
718 -// break;  
719 -  
720 -// case 0x48://葡萄牙 portugal pt-pt  
721 -// value = 11;  
722 -// break;  
723 -  
724 -// default:  
725 -// printf("无效的tts设置\n");  
726 -// return JZ_ERRORCODE_TTS_INVALID_TONE;  
727 -// break;  
728 -// }  
729 -// }  
730 -// // 将控件界面的播放开关 转化为关闭  
731 -// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_TONE, value);  
732 -  
733 -// // 如果有进行控制,不只是改控件  
734 -// if (wheather_control == 1)  
735 -// {  
736 -// return UIcontrol_Set_TTS_tone(DEVICE_PSDK,tone);  
737 -// }  
738 -  
739 -// return ret;  
740 -// }  
741 -  
742 // psdk追加音色 0 1 2 464 // psdk追加音色 0 1 2
743 T_JZsdkReturnCode JZsdk_Psdk_UI_io_AppendTone(int wheather_control, int value) 465 T_JZsdkReturnCode JZsdk_Psdk_UI_io_AppendTone(int wheather_control, int value)
744 { 466 {
@@ -1025,69 +747,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_SearchLightLumen(int wheather_control,int @@ -1025,69 +747,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_SearchLightLumen(int wheather_control,int
1025 return ret; 747 return ret;
1026 } 748 }
1027 749
1028 -// //警灯模式 0 关 1交替快闪 2交替满闪 3交替齐闪  
1029 -// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightMode(int wheather_control, int value)  
1030 -// {  
1031 -// T_JZsdkReturnCode ret;  
1032 -  
1033 -// //控件值 0 关闭 1快闪 2 满闪 3齐闪  
1034 -  
1035 -// int mode = 0;  
1036 -// int Switch = 0;  
1037 -// if (value >= 1)  
1038 -// {  
1039 -// mode = value - 1;  
1040 -// Switch = 1;  
1041 -// }  
1042 -// else  
1043 -// {  
1044 -// Switch = 0;  
1045 -// mode = 0;  
1046 -// }  
1047 -  
1048 -// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_MODE, value);  
1049 -  
1050 -// if (wheather_control == JZ_FLAGCODE_ON)  
1051 -// {  
1052 -// ret = UIcontrol_Set_WarningLight_ModeControl(DEVICE_PSDK, Switch, mode);  
1053 -// }  
1054 -  
1055 -// return ret;  
1056 -// }  
1057 -  
1058 -// //警灯颜色1  
1059 -// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(int wheather_control, int value)  
1060 -// {  
1061 -// T_JZsdkReturnCode ret;  
1062 -  
1063 -// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_FIRSTCOLOR, (value-1));  
1064 -  
1065 -// FirstWarningLight = value;  
1066 750
1067 -// if (wheather_control == JZ_FLAGCODE_ON)  
1068 -// {  
1069 -// ret = UIcontrol_Set_WarningLight_Color(DEVICE_PSDK, FirstWarningLight, SecondWarningLight);  
1070 -// }  
1071 -  
1072 -// return ret;  
1073 -// }  
1074 -  
1075 -// //警灯颜色2  
1076 -// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(int wheather_control, int value)  
1077 -// {  
1078 -// T_JZsdkReturnCode ret;  
1079 -  
1080 -// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_SECONDCOLOR, (value-1));  
1081 -  
1082 -// SecondWarningLight = value;  
1083 -  
1084 -// if (wheather_control == JZ_FLAGCODE_ON)  
1085 -// {  
1086 -// ret = UIcontrol_Set_WarningLight_Color(DEVICE_PSDK, FirstWarningLight, SecondWarningLight);  
1087 -// }  
1088 -  
1089 -// return ret;  
1090 -// }  
1091 751
1092 // 设置云台最大值 752 // 设置云台最大值
1093 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_MAXGimbalRangen() 753 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_MAXGimbalRangen()
@@ -1472,7 +1472,7 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, i @@ -1472,7 +1472,7 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, i
1472 T_JZsdkReturnCode ret = WarnLight_Set_Color(value1, value2); 1472 T_JZsdkReturnCode ret = WarnLight_Set_Color(value1, value2);
1473 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 1473 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
1474 { 1474 {
1475 - printf("%s:%s\n",UI_CONTROL_ERROR,JZsdk_GetReturnCodeMessage(ret)); 1475 + JZSDK_LOG_ERROR("%s:%s",UI_CONTROL_ERROR,JZsdk_GetReturnCodeMessage(ret));
1476 return ret; 1476 return ret;
1477 } 1477 }
1478 1478
@@ -1501,8 +1501,8 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, i @@ -1501,8 +1501,8 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, i
1501 //如果psdk接口已经使用 1501 //如果psdk接口已经使用
1502 if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK ) 1502 if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
1503 { 1503 {
1504 - JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(JZ_FLAGCODE_OFF, value1);  
1505 - JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(JZ_FLAGCODE_OFF, value2); 1504 + JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(JZ_FLAGCODE_OFF, LightAttribute.Color1);
  1505 + JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(JZ_FLAGCODE_OFF, LightAttribute.Color2);
1506 } 1506 }
1507 1507
1508 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 1508 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
1 -/** 1 +/**
2 ******************************************************************** 2 ********************************************************************
3 * @file UI_control.h 3 * @file UI_control.h
4 - * UI_control的头文件 4 + * UI_control的头文件
5 * 5 *
6 ********************************************************************* 6 *********************************************************************
7 */ 7 */
8 8
9 - /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/ 9 + /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
10 #ifndef JZSDK_UI_CONTROL_H 10 #ifndef JZSDK_UI_CONTROL_H
11 #define JZSDK_UI_CONTROL_H 11 #define JZSDK_UI_CONTROL_H
12 12
13 /* Includes ------------------------------------------------------------------*/ 13 /* Includes ------------------------------------------------------------------*/
14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h" 14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
15 -#include "UI_control/Psdk_ui_value_menu.h" 15 +#include "UI_control/Psdk_UI_io.h"
16 #include "UI_control/UI_Api.h" 16 #include "UI_control/UI_Api.h"
17 17
18 #ifdef __cplusplus 18 #ifdef __cplusplus
@@ -20,18 +20,18 @@ extern "C" { @@ -20,18 +20,18 @@ extern "C" {
20 #endif 20 #endif
21 21
22 /* Exported constants --------------------------------------------------------*/ 22 /* Exported constants --------------------------------------------------------*/
23 -/* 常亮定义*/ 23 +/* 常亮定义*/
24 24
25 /******************** 25 /********************
26 * 26 *
27 - * 完整路径 假设 27 + * 完整路径 假设
28 * /root/Configs/DJI_widget_file/cn/widget_file/cn_big_screen 28 * /root/Configs/DJI_widget_file/cn/widget_file/cn_big_screen
29 * /root/Configs/DJI_widget_file/en/widget_file/cn_big_screen 29 * /root/Configs/DJI_widget_file/en/widget_file/cn_big_screen
30 * /root/Configs/DJI_widget_file/debug/widget_file/cn_big_screen 30 * /root/Configs/DJI_widget_file/debug/widget_file/cn_big_screen
31 * 31 *
32 - * 其中 /root/Configs/DJI_widget_file 是对应的psdk给出的路径  
33 - * cn en debug 是对应的语言  
34 - * widget_file/cn_big_screen 是对应的文件,也有psdk给出 32 + * 其中 /root/Configs/DJI_widget_file 是对应的psdk给出的路径
  33 + * cn en debug 是对应的语言
  34 + * widget_file/cn_big_screen 是对应的文件,也有psdk给出
35 * 35 *
36 * **************/ 36 * **************/
37 typedef struct T_JZsdkUIJson 37 typedef struct T_JZsdkUIJson
@@ -48,6 +48,10 @@ static int WidgetMgMT_Control_WorkFuntion(int Inscode, int value) @@ -48,6 +48,10 @@ static int WidgetMgMT_Control_WorkFuntion(int Inscode, int value)
48 JZsdk_Psdk_UI_io_Audio_PauseAndPlayContinue(JZ_FLAGCODE_ON, value); 48 JZsdk_Psdk_UI_io_Audio_PauseAndPlayContinue(JZ_FLAGCODE_ON, value);
49 break; 49 break;
50 50
  51 + case JZSDK_WIDGET_VOLUME:
  52 + JZsdk_Psdk_UI_io_SetVolume(1,value);
  53 + break;
  54 +
51 case JZSDK_WIDGET_TTS_SPEED: 55 case JZSDK_WIDGET_TTS_SPEED:
52 JZsdk_Psdk_UI_io_Set_TTS_speed(JZ_FLAGCODE_ON,value); 56 JZsdk_Psdk_UI_io_Set_TTS_speed(JZ_FLAGCODE_ON,value);
53 break; 57 break;
@@ -89,7 +89,7 @@ T_JZsdkReturnCode WarnLight_Flush_StatusAndMode() @@ -89,7 +89,7 @@ T_JZsdkReturnCode WarnLight_Flush_StatusAndMode()
89 //设置警灯颜色 89 //设置警灯颜色
90 T_JZsdkReturnCode WarnLight_Set_Color(int Color1, int Color2) 90 T_JZsdkReturnCode WarnLight_Set_Color(int Color1, int Color2)
91 { 91 {
92 - JZSDK_LOG_DEBUG("设置0x%x:警灯颜色 Color1:0x%x, color:0x%x",DEVICE_VERSION, Color1, Color2); 92 + JZSDK_LOG_INFO("设置0x%x:警灯颜色 Color1:0x%x, color:0x%x",DEVICE_VERSION, Color1, Color2);
93 93
94 T_JZsdkOsalHandler *osalHandle = JZsdk_Platform_GetOsalHandler(); 94 T_JZsdkOsalHandler *osalHandle = JZsdk_Platform_GetOsalHandler();
95 if (osalHandle == NULL) 95 if (osalHandle == NULL)
@@ -44,6 +44,7 @@ @@ -44,6 +44,7 @@
44 44
45 #include "UI_control/WidegMgmt/JZsdk_Widget.h" 45 #include "UI_control/WidegMgmt/JZsdk_Widget.h"
46 #include "UI_control/UI_control.h" 46 #include "UI_control/UI_control.h"
  47 +#include "Psdk_UI/Psdk_ui_to_jzsdk.h"
47 #include "JZsdkLib.h" 48 #include "JZsdkLib.h"
48 49
49 #ifdef GIMBAL_STATUS_ON 50 #ifdef GIMBAL_STATUS_ON
@@ -613,64 +614,74 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -613,64 +614,74 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
613 switch(index){ 614 switch(index){
614 //喊话器部分 615 //喊话器部分
615 case 0://上一曲 616 case 0://上一曲
  617 + {
616 if(value==1) 618 if(value==1)
617 { 619 {
618 - //JZsdk_Psdk_UI_io_LastSong(1);  
619 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_LASTSONG, 0); 620 + Psdk_ui_to_jzsdk_Megphone_LastSong();
620 } 621 }
621 break; 622 break;
  623 + }
622 case 1://下一曲 624 case 1://下一曲
623 { 625 {
624 if(value==1) 626 if(value==1)
625 { 627 {
626 -  
627 - //JZsdk_Psdk_UI_io_NextSong(1);  
628 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_NEXTSONG, 0); 628 + Psdk_ui_to_jzsdk_Megphone_NextSong();
629 } 629 }
630 break; 630 break;
631 } 631 }
632 case 2: // 播放\暂停 value为1 是三角控件 暂停 所以要去取反 632 case 2: // 播放\暂停 value为1 是三角控件 暂停 所以要去取反
633 { 633 {
634 value = !value; 634 value = !value;
635 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PLAYANDSTOP, value);  
636 - 635 + Psdk_ui_to_jzsdk_Megphone_PlayOrPause(value);
637 break; 636 break;
638 } 637 }
639 638
640 case 3://内显示音量 scale 639 case 3://内显示音量 scale
641 { 640 {
642 - delayMs(100);//避免拉滑动条设置太多次 641 + //避免拉滑动条设置太多次
  642 + delayMs(100);
  643 +
  644 + //部分dji设备存在亮度和音量功率限制
643 JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(1, value); 645 JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(1, value);
644 - JZsdk_Psdk_UI_io_SetVolume(1,value); 646 +
  647 + //设置音量
  648 + Psdk_ui_to_jzsdk_Megphone_Volume(value, JZ_FLAGCODE_ON);
645 break; 649 break;
646 } 650 }
647 case 4://外显示音量 scale 651 case 4://外显示音量 scale
648 { 652 {
649 - delayMs(100);//避免拉滑动条设置太多次 653 + //避免拉滑动条设置太多次
  654 + delayMs(100);
  655 +
  656 + //部分dji设备存在亮度和音量功率限制
650 JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(1, value); 657 JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(1, value);
651 - JZsdk_Psdk_UI_io_SetVolume(1,value); 658 +
  659 + //设置音量
  660 + Psdk_ui_to_jzsdk_Megphone_Volume(value, JZ_FLAGCODE_ON);
652 break; 661 break;
653 } 662 }
654 case 5://TTS语速 list 663 case 5://TTS语速 list
655 { 664 {
656 - int speed = value;  
657 - JZsdk_PsdkUi_value_get(JZSDK_WIDGET_TTS_SPEED, &speed);  
658 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_SPEED, speed); 665 + Psdk_ui_to_jzsdk_Megphone_TTS_Speed_ByGear(value);
659 break; 666 break;
660 } 667 }
661 case 6://TTS音色 list 668 case 6://TTS音色 list
662 { 669 {
663 - int tone = value;  
664 - JZsdk_PsdkUi_value_get(JZSDK_WIDGET_TTS_TONE, &tone);  
665 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_TONE, tone); 670 + Psdk_ui_to_jzsdk_Megphone_TTS_Tone_ByGear(value);
666 break; 671 break;
667 } 672 }
668 case 7://TTS追加音色 list 673 case 7://TTS追加音色 list
669 - JZsdk_Psdk_UI_io_AppendTone(1,value); 674 + {
  675 + Psdk_ui_to_jzsdk_Megphone_TTS_Tone_Add_ByGear(value);
670 break; 676 break;
  677 + }
  678 +
671 case 8: //switch 循环 循环是1 679 case 8: //switch 循环 循环是1
672 - JZsdk_Psdk_UI_io_SetAudioPlayLoop(1, value); 680 + {
  681 + Psdk_ui_to_jzsdk_Megphone_Loop(value);
673 break; 682 break;
  683 + }
  684 +
674 case 9: //喊话模式切换 685 case 9: //喊话模式切换
675 { 686 {
676 //切换前关闭所有实时喊话 687 //切换前关闭所有实时喊话
@@ -703,23 +714,37 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -703,23 +714,37 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
703 714
704 break; 715 break;
705 } 716 }
  717 +
706 //探照灯部分 718 //探照灯部分
707 case 10://探照灯 内显示亮度 719 case 10://探照灯 内显示亮度
708 { 720 {
709 - delayMs(50);//避免拉滑动条设置太多次 721 + //避免拉滑动条设置太多次
  722 + delayMs(150);
  723 +
  724 + //部分dji设备存在亮度和音量功率限制
710 JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(0, value); 725 JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(0, value);
711 - JZsdk_Psdk_UI_io_Set_SearchLightLumen(1,value); 726 +
  727 + //设置亮度
  728 + Psdk_ui_to_jzsdk_SearchLight_Lumen(value);
  729 +
712 break; 730 break;
713 } 731 }
714 case 11://探照灯 外显示亮度 732 case 11://探照灯 外显示亮度
715 { 733 {
716 - delayMs(50);//避免拉滑动条设置太多次 734 + //避免拉滑动条设置太多次
  735 + delayMs(150);
  736 +
  737 + //部分dji设备存在亮度和音量功率限制
717 JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(0, value); 738 JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(0, value);
718 - JZsdk_Psdk_UI_io_Set_SearchLightLumen(1,value); 739 +
  740 + //设置亮度
  741 + Psdk_ui_to_jzsdk_SearchLight_Lumen(value);
  742 +
719 break; 743 break;
720 } 744 }
721 case 12: //探照灯模式 745 case 12: //探照灯模式
722 { 746 {
  747 + //部分飞机存在降落时强制关灯
723 int mode = value; 748 int mode = value;
724 JZsdk_PlaneInfo PlaneInfo; 749 JZsdk_PlaneInfo PlaneInfo;
725 JZsdk_PlaneInfo_Get(&PlaneInfo); 750 JZsdk_PlaneInfo_Get(&PlaneInfo);
@@ -728,7 +753,9 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -728,7 +753,9 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
728 mode = 0; 753 mode = 0;
729 } 754 }
730 755
731 - JZsdk_Psdk_UI_io_Set_SearchLightMode(1, mode); 756 + //设置模式
  757 + Psdk_ui_to_jzsdk_SearchLight_Mode(mode);
  758 +
732 break; 759 break;
733 } 760 }
734 761
@@ -739,29 +766,25 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -739,29 +766,25 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
739 } 766 }
740 case 14://探照灯 爆闪频率 767 case 14://探照灯 爆闪频率
741 { 768 {
742 - JZsdk_Psdk_UI_io_Set_SearchLightFrequency(1,value); 769 + Psdk_ui_to_jzsdk_SearchLight_Freq(value);
743 break; 770 break;
744 } 771 }
745 //侧面激光部分 772 //侧面激光部分
746 case 15://激光开关 773 case 15://激光开关
747 { 774 {
748 - int mode = value;  
749 - JZsdk_PsdkUi_value_get(JZSDK_WIDGET_SIDE_LASER_MODE, &mode);  
750 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_MODE, mode); 775 + Psdk_ui_to_jzsdk_Laser_Mode_ByGear(value);
751 break; 776 break;
752 } 777 }
753 778
754 case 30://激光亮度 779 case 30://激光亮度
755 { 780 {
756 - int lumen = value;  
757 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_LUMEN, lumen); 781 + Psdk_ui_to_jzsdk_Laser_Lumen(value);
758 break; 782 break;
759 } 783 }
760 784
761 case 31://激光颜色 785 case 31://激光颜色
762 { 786 {
763 - int color = value;  
764 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_COLOR, color); 787 + Psdk_ui_to_jzsdk_Laser_Color(value);
765 break; 788 break;
766 } 789 }
767 //警灯部分 790 //警灯部分
@@ -769,6 +792,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -769,6 +792,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
769 { 792 {
770 int mode = value; 793 int mode = value;
771 794
  795 + //部分飞机存在降落时强制关灯
772 JZsdk_PlaneInfo PlaneInfo; 796 JZsdk_PlaneInfo PlaneInfo;
773 JZsdk_PlaneInfo_Get(&PlaneInfo); 797 JZsdk_PlaneInfo_Get(&PlaneInfo);
774 if (PlaneInfo.LandingStatus == JZ_FLAGCODE_ON) 798 if (PlaneInfo.LandingStatus == JZ_FLAGCODE_ON)
@@ -776,22 +800,18 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -776,22 +800,18 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
776 mode = 0; 800 mode = 0;
777 } 801 }
778 802
779 - JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_MODE, &mode);  
780 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_MODE, mode); 803 + Psdk_ui_to_jzsdk_WarnLight_Mode_ByGear(mode);
  804 +
781 break; 805 break;
782 } 806 }
783 case 17://警灯颜色1 807 case 17://警灯颜色1
784 { 808 {
785 - int color = value;  
786 - JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_COLOR_1, &color);  
787 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_COLOR_1,color); 809 + Psdk_ui_to_jzsdk_WarnLight_Color1_ByGear(value);
788 break; 810 break;
789 } 811 }
790 case 18://警灯颜色2 812 case 18://警灯颜色2
791 { 813 {
792 - int color = value;  
793 - JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_COLOR_1, &color);  
794 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_COLOR_2,color); 814 + Psdk_ui_to_jzsdk_WarnLight_Color2_ByGear(value);
795 break; 815 break;
796 } 816 }
797 //云台部分 817 //云台部分
@@ -799,7 +819,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -799,7 +819,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
799 { 819 {
800 if (Get_Gimbal_linkage() == JZ_FLAGCODE_OFF) 820 if (Get_Gimbal_linkage() == JZ_FLAGCODE_OFF)
801 { 821 {
802 - JZsdk_Psdk_Ui_io_Gimbal_PitchScaleMode(value); 822 + Psdk_ui_to_jzsdk_PitchAngle_BySlider(value);
803 } 823 }
804 break; 824 break;
805 } 825 }
@@ -807,7 +827,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -807,7 +827,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
807 { 827 {
808 if (Get_Gimbal_linkage() == JZ_FLAGCODE_OFF) 828 if (Get_Gimbal_linkage() == JZ_FLAGCODE_OFF)
809 { 829 {
810 - JZsdk_Psdk_Ui_io_Gimbal_PitchScaleMode(value); 830 + Psdk_ui_to_jzsdk_PitchAngle_BySlider(value);
811 } 831 }
812 break; 832 break;
813 } 833 }
@@ -820,7 +840,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -820,7 +840,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
820 { 840 {
821 if(value == 1) 841 if(value == 1)
822 { 842 {
823 - JZsdk_Psdk_UI_io_Set_AdjustmentGimbalPitchAngle(5); 843 + Psdk_ui_to_jzsdk_AdjustmentPitch_ByVariation(5);
824 } 844 }
825 845
826 break; 846 break;
@@ -829,7 +849,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -829,7 +849,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
829 { 849 {
830 if(value == 1) 850 if(value == 1)
831 { 851 {
832 - JZsdk_Psdk_UI_io_Set_AdjustmentGimbalPitchAngle(-5); 852 + Psdk_ui_to_jzsdk_AdjustmentPitch_ByVariation(-5);
833 } 853 }
834 break; 854 break;
835 } 855 }
@@ -857,22 +877,13 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -857,22 +877,13 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
857 } 877 }
858 case 25://对外供电开关 878 case 25://对外供电开关
859 { 879 {
860 - JZsdk_Psdk_UI_io_Set_OutputPowerStatus(1 ,value); 880 + Psdk_ui_to_jzsdk_PowerSupply(value);
861 break; 881 break;
862 } 882 }
863 883
864 case 26://开机预设任务 884 case 26://开机预设任务
865 { 885 {
866 - JZSDK_LOG_INFO("设置开机预设任务:%d", value);  
867 - if (value == 1)  
868 - {  
869 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PRSET_TASK, JZ_FLAGCODE_ON);  
870 - }  
871 - else if (value == 0)  
872 - {  
873 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PRSET_TASK, JZ_FLAGCODE_OFF);  
874 - }  
875 - 886 + Psdk_ui_to_jzsdk_PrsetTask(value);
876 break; 887 break;
877 } 888 }
878 889
@@ -886,19 +897,19 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -886,19 +897,19 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
886 { 897 {
887 if (Temp_GimbalCompensation_Flag == 0) 898 if (Temp_GimbalCompensation_Flag == 0)
888 { 899 {
889 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_LEFT, +5); 900 + Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_LEFT, +5);
890 } 901 }
891 else if (Temp_GimbalCompensation_Flag == 1) 902 else if (Temp_GimbalCompensation_Flag == 1)
892 { 903 {
893 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_LEFT, -5); 904 + Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_LEFT, -5);
894 } 905 }
895 else if (Temp_GimbalCompensation_Flag == 2) 906 else if (Temp_GimbalCompensation_Flag == 2)
896 { 907 {
897 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_RIGHT, +5); 908 + Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_RIGHT, +5);
898 } 909 }
899 else if (Temp_GimbalCompensation_Flag == 3) 910 else if (Temp_GimbalCompensation_Flag == 3)
900 { 911 {
901 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_RIGHT, -5); 912 + Psdk_ui_to_jzsdk_GimbalCompensation_ByVariation(JZSDK_WIDGET_GIMBAL_SINGLE_COMPENSATION_RIGHT, -5);
902 } 913 }
903 break; 914 break;
904 } 915 }
@@ -908,7 +919,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -908,7 +919,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
908 { 919 {
909 if(value==1 && num_flag == 3) 920 if(value==1 && num_flag == 3)
910 { 921 {
911 - JZsdk_Psdk_UI_io_Set_MAXGimbalRangen(); 922 + Psdk_ui_to_jzsdk_PitchAngle_ByMaxMin(0);
912 } 923 }
913 break; 924 break;
914 } 925 }
@@ -916,7 +927,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -916,7 +927,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
916 { 927 {
917 if(value==1 && num_flag == 3) 928 if(value==1 && num_flag == 3)
918 { 929 {
919 - JZsdk_Psdk_UI_io_Set_MINGimbalRangen(); 930 + Psdk_ui_to_jzsdk_PitchAngle_ByMaxMin(1);
920 } 931 }
921 break; 932 break;
922 } 933 }
@@ -927,8 +938,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -927,8 +938,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
927 938
928 case 42://设置云台补偿 939 case 42://设置云台补偿
929 { 940 {
930 - JZSDK_LOG_INFO("设置云台补充:%d", Temp_GimbalCompensation_Flag);  
931 - Temp_GimbalCalibration_Flag = value; 941 + JZSDK_LOG_INFO("设置云台补充:%d", s_widgetValueList[42]);
932 break; 942 break;
933 } 943 }
934 944
@@ -937,6 +947,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -937,6 +947,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
937 if (value == 1) 947 if (value == 1)
938 { 948 {
939 int direction; 949 int direction;
  950 + int Temp_GimbalCalibration_Flag = s_widgetValueList[42];
940 if (Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX 951 if (Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX
941 || Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MIN 952 || Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MIN
942 || Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_ZERO 953 || 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) @@ -961,6 +972,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
961 if (value == 1) 972 if (value == 1)
962 { 973 {
963 int direction; 974 int direction;
  975 + int Temp_GimbalCalibration_Flag = s_widgetValueList[42];
964 if (Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX 976 if (Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX
965 || Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MIN 977 || Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MIN
966 || Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_ZERO 978 || 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) @@ -979,8 +991,13 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
979 break; 991 break;
980 } 992 }
981 993
982 - case 45://设置云台补偿 994 + case 45://设置云台校准
983 { 995 {
  996 + if (value == 1)
  997 + {
  998 + int Temp_GimbalCalibration_Flag = s_widgetValueList[42];
  999 + JZSDK_LOG_INFO("设置云台校准:%d", Temp_GimbalCalibration_Flag);
  1000 +
984 if (Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX) 1001 if (Temp_GimbalCalibration_Flag == JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX)
985 { 1002 {
986 Gimbal_Set_GimbalSingleCalibration(JZ_GIMBAL_SINGLE_CALIBRATION_MODE_LEFT_MAX); 1003 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) @@ -1021,6 +1038,8 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
1021 { 1038 {
1022 Gimbal_Set_DebugPitch(0, JZ_FLAGCODE_ON, 1); 1039 Gimbal_Set_DebugPitch(0, JZ_FLAGCODE_ON, 1);
1023 } 1040 }
  1041 + }
  1042 +
1024 break; 1043 break;
1025 } 1044 }
1026 1045
1 -/** 1 + /**
2 ******************************************************************** 2 ********************************************************************
3 * @file test_widget_speaker.c 3 * @file test_widget_speaker.c
4 * @brief 4 * @brief
@@ -874,30 +874,9 @@ static void *DjiTest_WidgetSpeakerTask(void *arg) @@ -874,30 +874,9 @@ static void *DjiTest_WidgetSpeakerTask(void *arg)
874 continue; 874 continue;
875 } 875 }
876 876
877 - if (s_speakerState.state == DJI_WIDGET_SPEAKER_STATE_PLAYING) {  
878 - ////如果处于回放模式  
879 - //if (s_speakerState.playMode == DJI_WIDGET_SPEAKER_PLAY_MODE_LOOP_PLAYBACK)  
880 - //{  
881 - // if (s_speakerState.workMode == DJI_WIDGET_SPEAKER_WORK_MODE_VOICE) {  
882 - // USER_LOG_DEBUG("Waiting opus decoder finished...");  
883 - // while (s_isDecodeFinished == false) {  
884 - // osalHandler->TaskSleepMs(1);  
885 - // }  
886 - // djiReturnCode = DjiTest_PlayAudioData();  
887 - // if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {  
888 - // USER_LOG_ERROR("Play audio data failed, error: 0x%08llX.", djiReturnCode);  
889 - // }  
890 - // } else {  
891 - // djiReturnCode = DjiTest_PlayTtsData();  
892 - // if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {  
893 - // USER_LOG_ERROR("Play tts data failed, error: 0x%08llX.", djiReturnCode);  
894 - // }  
895 - // }  
896 - // osalHandler->TaskSleepMs(1000);  
897 - //}  
898 - //  
899 - ////单放模式  
900 - //else { 877 + //注意,以下播放的函数都会执行到播完再释放。
  878 + if (s_speakerState.state == DJI_WIDGET_SPEAKER_STATE_PLAYING)
  879 + {
901 //如果工作模式为语音 880 //如果工作模式为语音
902 if (s_speakerState.workMode == DJI_WIDGET_SPEAKER_WORK_MODE_VOICE) 881 if (s_speakerState.workMode == DJI_WIDGET_SPEAKER_WORK_MODE_VOICE)
903 { 882 {
@@ -923,16 +902,12 @@ static void *DjiTest_WidgetSpeakerTask(void *arg) @@ -923,16 +902,12 @@ static void *DjiTest_WidgetSpeakerTask(void *arg)
923 USER_LOG_ERROR("lock mutex error: 0x%08llX.", djiReturnCode); 902 USER_LOG_ERROR("lock mutex error: 0x%08llX.", djiReturnCode);
924 } 903 }
925 904
926 - //if (s_speakerState.playMode == DJI_WIDGET_SPEAKER_PLAY_MODE_SINGLE_PLAY)  
927 - //{  
928 s_speakerState.state = DJI_WIDGET_SPEAKER_STATE_IDEL; 905 s_speakerState.state = DJI_WIDGET_SPEAKER_STATE_IDEL;
929 - //}  
930 906
931 djiReturnCode = osalHandler->MutexUnlock(s_speakerMutex); 907 djiReturnCode = osalHandler->MutexUnlock(s_speakerMutex);
932 if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { 908 if (djiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
933 USER_LOG_ERROR("unlock mutex error: 0x%08llX.", djiReturnCode); 909 USER_LOG_ERROR("unlock mutex error: 0x%08llX.", djiReturnCode);
934 } 910 }
935 - //}  
936 } 911 }
937 } 912 }
938 } 913 }
@@ -75,10 +75,8 @@ @@ -75,10 +75,8 @@
75 #endif 75 #endif
76 76
77 /* Private constants ---------------------------------------------------------*/ 77 /* Private constants ---------------------------------------------------------*/
78 -#define DJI_LOG_PATH "/root/sdcard/Logs/"  
79 #define DJI_LOG_INDEX_FILE_NAME "/root/Logs/latest" 78 #define DJI_LOG_INDEX_FILE_NAME "/root/Logs/latest"
80 -#define DJI_LOG_SD_INDEX_FILE_NAME "/root/sdcard/Logs/latest"  
81 -#define DJI_LOG_FOLDER_NAME "Logs" 79 +#define DJI_LOG_FOLDER_NAME "/root/Logs/"
82 #define DJI_LOG_PATH_MAX_SIZE (128) 80 #define DJI_LOG_PATH_MAX_SIZE (128)
83 #define DJI_LOG_FOLDER_NAME_MAX_SIZE (32) 81 #define DJI_LOG_FOLDER_NAME_MAX_SIZE (32)
84 #define DJI_LOG_MAX_COUNT (10) 82 #define DJI_LOG_MAX_COUNT (10)
@@ -762,7 +760,7 @@ static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void) @@ -762,7 +760,7 @@ static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void)
762 return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; 760 return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
763 } 761 }
764 762
765 - if (DjiUser_LocalWriteFsInit(DJI_LOG_PATH) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { 763 + if (DjiUser_LocalWriteFsInit(DJI_LOG_FOLDER_NAME) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
766 printf("file system init error"); 764 printf("file system init error");
767 //return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN; 765 //return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
768 } 766 }
@@ -1028,23 +1026,6 @@ static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path) @@ -1028,23 +1026,6 @@ static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path)
1028 } 1026 }
1029 } 1027 }
1030 1028
1031 - //检查sd卡的日志文件夹  
1032 - if (access(DJI_LOG_PATH, F_OK) != 0) {  
1033 - memset(folderName, 0, sizeof(folderName));  
1034 - sprintf(folderName, "mkdir %s", DJI_LOG_PATH);  
1035 - ret = system(folderName);  
1036 - if (ret != 0) {  
1037 - return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;  
1038 - }  
1039 - }  
1040 -  
1041 - //检查sd卡的内序号文件是否存在  
1042 - if (access(DJI_LOG_SD_INDEX_FILE_NAME, F_OK) == 0) {  
1043 - memset(folderName, 0, sizeof(folderName));  
1044 - sprintf(folderName, "rm %s", DJI_LOG_INDEX_FILE_NAME);  
1045 - ret = system(folderName);  
1046 - }  
1047 -  
1048 s_djiLogFileCnt = fopen(DJI_LOG_INDEX_FILE_NAME, "rb+"); 1029 s_djiLogFileCnt = fopen(DJI_LOG_INDEX_FILE_NAME, "rb+");
1049 if (s_djiLogFileCnt == NULL) { 1030 if (s_djiLogFileCnt == NULL) {
1050 s_djiLogFileCnt = fopen(DJI_LOG_INDEX_FILE_NAME, "wb+"); 1031 s_djiLogFileCnt = fopen(DJI_LOG_INDEX_FILE_NAME, "wb+");
@@ -1082,16 +1063,6 @@ static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path) @@ -1082,16 +1063,6 @@ static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path)
1082 1063
1083 fclose(s_djiLogFileCnt); 1064 fclose(s_djiLogFileCnt);
1084 1065
1085 - //将sd卡的索引值文件删除  
1086 - memset(systemCmd, 0, sizeof(systemCmd));  
1087 - sprintf(systemCmd, "rm %s", DJI_LOG_SD_INDEX_FILE_NAME);  
1088 - ret = system(systemCmd);  
1089 -  
1090 - //将索引值复制到sd卡  
1091 - memset(systemCmd, 0, sizeof(systemCmd));  
1092 - sprintf(systemCmd, "cp %s %s", DJI_LOG_INDEX_FILE_NAME, DJI_LOG_SD_INDEX_FILE_NAME);  
1093 - ret = system(systemCmd);  
1094 -  
1095 //filePath : /root/sdcard/Logs/_%04d_%04d%02d%02d_%02d-%02d-%02d.log 1066 //filePath : /root/sdcard/Logs/_%04d_%04d%02d%02d_%02d-%02d-%02d.log
1096 sprintf(filePath, "%s_%04d_%04d%02d%02d_%02d-%02d-%02d.log", path, currentLogFileIndex, 1067 sprintf(filePath, "%s_%04d_%04d%02d%02d_%02d-%02d-%02d.log", path, currentLogFileIndex,
1097 localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday, 1068 localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
@@ -1103,17 +1074,17 @@ static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path) @@ -1103,17 +1074,17 @@ static T_DjiReturnCode DjiUser_LocalWriteFsInit(const char *path)
1103 return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; 1074 return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
1104 } 1075 }
1105 1076
1106 - if (logFileIndex >= DJI_LOG_MAX_COUNT) {  
1107 - sprintf(systemCmd, "rm -rf %s_%04d*.log", path, currentLogFileIndex - DJI_LOG_MAX_COUNT);  
1108 - ret = system(systemCmd);  
1109 - if (ret != 0) {  
1110 - printf("Remove file error, ret:%d.\r\n", ret);  
1111 - return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;  
1112 - }  
1113 - } 1077 + //if (logFileIndex >= DJI_LOG_MAX_COUNT) {
  1078 + // sprintf(systemCmd, "rm -rf %s_%04d*.log", path, currentLogFileIndex - DJI_LOG_MAX_COUNT);
  1079 + // ret = system(systemCmd);
  1080 + // if (ret != 0) {
  1081 + // printf("Remove file error, ret:%d.\r\n", ret);
  1082 + // return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
  1083 + // }
  1084 + //}
1114 1085
1115 - sprintf(systemCmd, "ln -sfrv %s "DJI_LOG_FOLDER_NAME"/latest.log", filePath);  
1116 - system(systemCmd); 1086 + //sprintf(systemCmd, "ln -sfrv %s "DJI_LOG_FOLDER_NAME"/latest.log", filePath);
  1087 + //system(systemCmd);
1117 1088
1118 g_DJI_LoginitFlag = JZ_FLAGCODE_ON; 1089 g_DJI_LoginitFlag = JZ_FLAGCODE_ON;
1119 1090
  1 +#!/bin/sh
  2 +# 开机日志归档脚本
  3 +# 执行时机:必须在 USB Gadget 启动之前
  4 +
  5 +LOG_SYS="/root/JZLOG"
  6 +LOG_SDCARD="/root/sdcard/JZLOG"
  7 +
  8 +# 1. 创建目录
  9 +mkdir -p "$LOG_SYS" "$LOG_SDCARD"
  10 +
  11 +# 2. 同步 thelast 文件
  12 +if [ -f "$LOG_SDCARD/thelast" ]; then
  13 + cp -f "$LOG_SYS/thelast" "$LOG_SDCARD/thelast"
  14 +else
  15 + rm -f "$LOG_SYS/thelast"
  16 +fi
  17 +
  18 +# 3. 移动所有 .log 文件
  19 +# 使用 find 避免 "argument list too long"
  20 +find "$LOG_SYS" -maxdepth 1 -type f -name "*.log" -print0 | while IFS= read -r -d '' file; do
  21 + mv "$file" "$LOG_SDCARD/"
  22 +done
  23 +
  24 +# 4. 数量控制:超过20份则删除最早的(按文件名中的序号)
  25 +cd "$LOG_SDCARD" || exit 1
  26 +files=( *.log )
  27 +count=${#files[@]}
  28 +if [ $count -gt 20 ]; then
  29 + # 提取序号并排序(假设文件名格式固定为 _数字_...)
  30 + sorted=$(printf '%s\n' "${files[@]}" | sed -n 's/^_\([0-9]*\)_.*/\1 \0/p' | sort -n | cut -d' ' -f2)
  31 + if [ -n "$sorted" ]; then
  32 + delete=$((count - 20))
  33 + echo "$sorted" | head -n "$delete" | xargs rm -f
  34 + else
  35 + # 如果无法解析序号,退而按修改时间删除最老的
  36 + ls -t *.log | tail -n +21 | xargs rm -f
  37 + fi
  38 +fi