作者 ookk303

ui改动, 讯飞库2代库改动,将探照灯和警灯分离

@@ -163,7 +163,13 @@ @@ -163,7 +163,13 @@
163 "debuginfo.h": "c", 163 "debuginfo.h": "c",
164 "h3_ircut.h": "c", 164 "h3_ircut.h": "c",
165 "dji_high_speed_data_channel.h": "c", 165 "dji_high_speed_data_channel.h": "c",
166 - "psdk_ui.h": "c" 166 + "psdk_ui.h": "c",
  167 + "jzsdk_widgetindex.h": "c",
  168 + "psdk_ui_change.h": "c",
  169 + "psdk_ui_value_menu.h": "c",
  170 + "iflybak": "c",
  171 + "iflybak2": "c",
  172 + "ifybak3": "c"
167 }, 173 },
168 "Codegeex.GenerationPreference": "automatic", 174 "Codegeex.GenerationPreference": "automatic",
169 "C_Cpp.dimInactiveRegions": false, 175 "C_Cpp.dimInactiveRegions": false,
1 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h" 1 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
2 -#include <string.h> // 添加memcpy函数支持 2 +#include <string.h>
  3 +#include <pthread.h> // 添加线程互斥锁支持
3 #include "JZring.h" 4 #include "JZring.h"
4 5
5 typedef struct T_JZring 6 typedef struct T_JZring
@@ -8,65 +9,68 @@ typedef struct T_JZring @@ -8,65 +9,68 @@ typedef struct T_JZring
8 U32_t size; // 缓冲区总容量 9 U32_t size; // 缓冲区总容量
9 U32_t head; // 写入位置(下一个可写位置) 10 U32_t head; // 写入位置(下一个可写位置)
10 U32_t tail; // 读取位置(下一个可读位置) 11 U32_t tail; // 读取位置(下一个可读位置)
11 - U32_t count; // 当前数据量(可选改进) 12 + U32_t count; // 当前数据量
  13 + pthread_mutex_t mutex; // 互斥锁保护共享资源
12 } T_JZring; 14 } T_JZring;
13 15
14 -  
15 // 初始化环形缓冲区 16 // 初始化环形缓冲区
16 T_JZsdkReturnCode JZring_Init(T_JZringHandle *ring, U8_t *buffer, U32_t size) 17 T_JZsdkReturnCode JZring_Init(T_JZringHandle *ring, U8_t *buffer, U32_t size)
17 { 18 {
18 - if (!buffer || size == 0) 19 + if (!ring || !buffer || size == 0)
19 { 20 {
20 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 21 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
21 } 22 }
22 23
23 - //注册ring  
24 T_JZring *r = (T_JZring*)malloc(sizeof(T_JZring)); 24 T_JZring *r = (T_JZring*)malloc(sizeof(T_JZring));
25 if (!r) { 25 if (!r) {
26 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 26 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
27 } 27 }
28 28
  29 + // 初始化互斥锁
  30 + if (pthread_mutex_init(&r->mutex, NULL) != 0) {
  31 + free(r);
  32 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  33 + }
  34 +
29 r->buffer = buffer; 35 r->buffer = buffer;
30 r->size = size; 36 r->size = size;
31 r->head = 0; 37 r->head = 0;
32 r->tail = 0; 38 r->tail = 0;
33 - r->count = 0; // 初始化数据计数 39 + r->count = 0;
34 40
35 *ring = (T_JZringHandle)r; 41 *ring = (T_JZringHandle)r;
36 -  
37 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 42 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
38 } 43 }
39 44
40 -// 写入数据到环形缓冲区  
41 -T_JZsdkReturnCode JZring_Write(T_JZringHandle ring, const U8_t *data, U32_t size) 45 +// 获取缓冲区总容量
  46 +T_JZsdkReturnCode JZring_GetSize(T_JZringHandle ring, U32_t *size)
42 { 47 {
43 - if (!ring || !data) { 48 + if (!ring || !size) {
44 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; 49 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
45 } 50 }
46 - if (size == 0) {  
47 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
48 - }  
49 51
50 T_JZring *r = (T_JZring*)ring; 52 T_JZring *r = (T_JZring*)ring;
51 53
52 - // 检查可用空间  
53 - U32_t free_space = r->size - r->count;  
54 - if (size > free_space) {  
55 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
56 - } 54 + pthread_mutex_lock(&r->mutex);
  55 + *size = r->size;
  56 + pthread_mutex_unlock(&r->mutex);
  57 +
  58 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  59 +}
57 60
58 - // 分两段复制数据(处理回绕)  
59 - U32_t first_chunk = r->size - r->head;  
60 - if (first_chunk >= size) {  
61 - memcpy(r->buffer + r->head, data, size);  
62 - r->head = (r->head + size) % r->size;  
63 - } else {  
64 - memcpy(r->buffer + r->head, data, first_chunk);  
65 - memcpy(r->buffer, data + first_chunk, size - first_chunk);  
66 - r->head = size - first_chunk; 61 +// 获取当前数据量
  62 +T_JZsdkReturnCode JZring_GetDataCount(T_JZringHandle ring, U32_t *count)
  63 +{
  64 + if (!ring || !count) {
  65 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
67 } 66 }
  67 +
  68 + T_JZring *r = (T_JZring*)ring;
  69 +
  70 + pthread_mutex_lock(&r->mutex);
  71 + *count = r->count;
  72 + pthread_mutex_unlock(&r->mutex);
68 73
69 - r->count += size; // 更新数据计数  
70 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 74 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
71 } 75 }
72 76
@@ -80,61 +84,153 @@ T_JZsdkReturnCode JZring_Read(T_JZringHandle ring, U8_t *data, U32_t size, U32_t @@ -80,61 +84,153 @@ T_JZsdkReturnCode JZring_Read(T_JZringHandle ring, U8_t *data, U32_t size, U32_t
80 T_JZring *r = (T_JZring*)ring; 84 T_JZring *r = (T_JZring*)ring;
81 *readSize = 0; 85 *readSize = 0;
82 86
  87 + pthread_mutex_lock(&r->mutex);
  88 +
83 if (r->count == 0 || size == 0) { 89 if (r->count == 0 || size == 0) {
  90 + pthread_mutex_unlock(&r->mutex);
84 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 91 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
85 } 92 }
86 93
87 // 计算实际可读数量 94 // 计算实际可读数量
88 U32_t bytes_to_read = (size > r->count) ? r->count : size; 95 U32_t bytes_to_read = (size > r->count) ? r->count : size;
  96 + *readSize = bytes_to_read;
89 97
90 - // 分两段复制数据(处理回绕)  
91 - U32_t first_chunk = r->size - r->tail;  
92 - if (first_chunk >= bytes_to_read) { 98 + // 计算连续可读空间(可能被尾部分割)
  99 + U32_t contig = r->size - r->tail;
  100 + if (bytes_to_read <= contig) {
93 memcpy(data, r->buffer + r->tail, bytes_to_read); 101 memcpy(data, r->buffer + r->tail, bytes_to_read);
94 - r->tail = (r->tail + bytes_to_read) % r->size;  
95 } else { 102 } else {
96 - memcpy(data, r->buffer + r->tail, first_chunk);  
97 - memcpy(data + first_chunk, r->buffer, bytes_to_read - first_chunk);  
98 - r->tail = bytes_to_read - first_chunk; 103 + memcpy(data, r->buffer + r->tail, contig);
  104 + memcpy(data + contig, r->buffer, bytes_to_read - contig);
99 } 105 }
100 106
101 - r->count -= bytes_to_read; // 更新数据计数  
102 - *readSize = bytes_to_read; 107 + // 更新读指针和数据计数
  108 + r->tail = (r->tail + bytes_to_read) % r->size;
  109 + r->count -= bytes_to_read;
  110 +
  111 + pthread_mutex_unlock(&r->mutex);
103 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 112 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
104 } 113 }
105 114
106 -T_JZsdkReturnCode JZring_GetSize(T_JZringHandle ring, U32_t *size) 115 +// 写入数据到环形缓冲区
  116 +T_JZsdkReturnCode JZring_Write(T_JZringHandle ring, const U8_t *data, U32_t size)
  117 +{
  118 + if (!ring || !data) {
  119 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  120 + }
  121 +
  122 + if (size == 0) {
  123 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  124 + }
  125 +
  126 + T_JZring *r = (T_JZring*)ring;
  127 +
  128 + pthread_mutex_lock(&r->mutex);
  129 +
  130 + // 直接检查可用空间
  131 + if (size > (r->size - r->count))
  132 + {
  133 + pthread_mutex_unlock(&r->mutex);
  134 + return JZ_ERROR_SYSTEM_MODULE_CODE_BUFFER_SIZE_NOT_ENOUGH;
  135 + }
  136 +
  137 + // 计算连续可写空间(可能被尾部分割)
  138 + U32_t contig = r->size - r->head;
  139 + if (size <= contig) {
  140 + memcpy(r->buffer + r->head, data, size);
  141 + } else {
  142 + memcpy(r->buffer + r->head, data, contig);
  143 + memcpy(r->buffer, data + contig, size - contig);
  144 + }
  145 +
  146 + // 更新写指针和数据计数
  147 + r->head = (r->head + size) % r->size;
  148 + r->count += size;
  149 +
  150 + pthread_mutex_unlock(&r->mutex);
  151 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  152 +}
  153 +
  154 +// 获取空闲空间
  155 +T_JZsdkReturnCode JZring_GetFreeSpace(T_JZringHandle ring, U32_t *size)
107 { 156 {
108 - T_JZring *ringHandle = (T_JZring*)ring; 157 + if (!ring || !size) {
  158 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  159 + }
109 160
  161 + T_JZring *r = (T_JZring*)ring;
  162 +
  163 + pthread_mutex_lock(&r->mutex);
  164 + *size = r->size - r->count;
  165 + pthread_mutex_unlock(&r->mutex);
  166 +
110 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 167 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
111 } 168 }
112 169
113 -T_JZsdkReturnCode JZring_GetFreeSize(T_JZringHandle ring, U32_t *size) 170 +// 检查缓冲区是否为空
  171 +T_JZsdkReturnCode JZring_IsEmpty(T_JZringHandle ring, bool *isEmpty)
114 { 172 {
115 - T_JZring *ringHandle = (T_JZring*)ring; 173 + if (!ring || !isEmpty) {
  174 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  175 + }
116 176
  177 + T_JZring *r = (T_JZring*)ring;
  178 +
  179 + pthread_mutex_lock(&r->mutex);
  180 + *isEmpty = (r->count == 0);
  181 + pthread_mutex_unlock(&r->mutex);
  182 +
117 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 183 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
118 } 184 }
119 185
120 -T_JZsdkReturnCode JZring_Reset(T_JZringHandle ring) 186 +// 检查缓冲区是否已满
  187 +T_JZsdkReturnCode JZring_IsFull(T_JZringHandle ring, bool *isFull)
121 { 188 {
122 - T_JZring *ringHandle = (T_JZring*)ring; 189 + if (!ring || !isFull) {
  190 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  191 + }
123 192
124 - ringHandle->head = 0;  
125 - ringHandle->tail = 0; 193 + T_JZring *r = (T_JZring*)ring;
  194 +
  195 + pthread_mutex_lock(&r->mutex);
  196 + *isFull = (r->count == r->size);
  197 + pthread_mutex_unlock(&r->mutex);
  198 +
  199 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  200 +}
126 201
  202 +// 重置环形缓冲区
  203 +T_JZsdkReturnCode JZring_Reset(T_JZringHandle ring)
  204 +{
  205 + if (!ring) {
  206 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  207 + }
  208 +
  209 + T_JZring *r = (T_JZring*)ring;
  210 +
  211 + pthread_mutex_lock(&r->mutex);
  212 + r->head = 0;
  213 + r->tail = 0;
  214 + r->count = 0;
  215 + pthread_mutex_unlock(&r->mutex);
  216 +
127 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 217 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
128 } 218 }
129 219
  220 +// 反初始化环形缓冲区
130 T_JZsdkReturnCode JZring_DeInit(T_JZringHandle ring) 221 T_JZsdkReturnCode JZring_DeInit(T_JZringHandle ring)
131 { 222 {
132 - T_JZring *ringHandle = (T_JZring*)ring;  
133 -  
134 - ringHandle->buffer = NULL;  
135 - ringHandle->size = 0;  
136 - ringHandle->head = 0;  
137 - ringHandle->tail = 0;  
138 - 223 + if (!ring) {
  224 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  225 + }
  226 +
  227 + T_JZring *r = (T_JZring*)ring;
  228 +
  229 + // 销毁互斥锁
  230 + pthread_mutex_destroy(&r->mutex);
  231 +
  232 + // 释放管理结构体
  233 + free(r);
  234 +
139 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 235 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
140 } 236 }
@@ -28,6 +28,10 @@ T_JZsdkReturnCode JZring_Init(T_JZringHandle *ring, U8_t *buffer, U32_t size); @@ -28,6 +28,10 @@ T_JZsdkReturnCode JZring_Init(T_JZringHandle *ring, U8_t *buffer, U32_t size);
28 T_JZsdkReturnCode JZring_Write(T_JZringHandle ring, const U8_t *data, U32_t size); 28 T_JZsdkReturnCode JZring_Write(T_JZringHandle ring, const U8_t *data, U32_t size);
29 T_JZsdkReturnCode JZring_Read(T_JZringHandle ring, U8_t *data, U32_t size, U32_t *readSize); 29 T_JZsdkReturnCode JZring_Read(T_JZringHandle ring, U8_t *data, U32_t size, U32_t *readSize);
30 30
  31 +T_JZsdkReturnCode JZring_GetDataCount(T_JZringHandle ring, U32_t *count);
  32 +T_JZsdkReturnCode JZring_Reset(T_JZringHandle ring);
  33 +T_JZsdkReturnCode JZring_DeInit(T_JZringHandle ring);
  34 +
31 #ifdef __cplusplus 35 #ifdef __cplusplus
32 } 36 }
33 #endif 37 #endif
@@ -24,9 +24,10 @@ typedef enum JZsdk_Widget_Control @@ -24,9 +24,10 @@ typedef enum JZsdk_Widget_Control
24 JZSDK_WIDGET_LASTSONG = 0x0000, // 控件上一曲 24 JZSDK_WIDGET_LASTSONG = 0x0000, // 控件上一曲
25 JZSDK_WIDGET_NEXTSONG = 0x0001, // 控件下一曲 25 JZSDK_WIDGET_NEXTSONG = 0x0001, // 控件下一曲
26 JZSDK_WIDGET_PLAYANDSTOP = 0x0002, // 控件播放暂停 26 JZSDK_WIDGET_PLAYANDSTOP = 0x0002, // 控件播放暂停
27 - JZSDK_WIDGET_VOLUME = 0x0003, // 控件音量  
28 -  
29 - JZSDK_WIDGET_SIDE_LASER_MODE = 0x0020, 27 + JZSDK_WIDGET_VOLUME = 0x003, // 控件音量
  28 + JZSDK_WIDGET_TTS_SPEED = 0x0004, // 控件tts速度
  29 + JZSDK_WIDGET_TTS_TONE = 0x0005, // 控件tts音色
  30 + JZSDK_WIDGET_LOOP_PLAY = 0x0010, // 控件循环播放
30 31
31 JZSDK_WIDGET_VIDEOPUSH_INDEX = 0x0021, //切换视频流 32 JZSDK_WIDGET_VIDEOPUSH_INDEX = 0x0021, //切换视频流
32 JZSDK_WIDGET_TEMP_MEASUREMENT_MODE = 0x0022, //测温 33 JZSDK_WIDGET_TEMP_MEASUREMENT_MODE = 0x0022, //测温
@@ -55,8 +56,12 @@ typedef enum JZsdk_Widget_Control @@ -55,8 +56,12 @@ typedef enum JZsdk_Widget_Control
55 JZSDK_WIDGET_GAS_ENHANCEMENT_CORRECT_LOW_CALIBRATION = 0x0039, //气体增强纠正低温校准 56 JZSDK_WIDGET_GAS_ENHANCEMENT_CORRECT_LOW_CALIBRATION = 0x0039, //气体增强纠正低温校准
56 57
57 58
58 - 59 + JZSDK_WIDGET_WARNLIGHT_COLOR_1 = 0x0040, //警告灯颜色1
  60 + JZSDK_WIDGET_WARNLIGHT_COLOR_2 = 0x0041, //警告灯颜色2
59 61
  62 + JZSDK_WIDGET_WARNLIGHT_MODE = 0x0042, //警告灯模式
  63 +
  64 + JZSDK_WIDGET_SIDE_LASER_MODE = 0x0050, //侧射激光模式
60 65
61 }JZsdk_Widget_Control; 66 }JZsdk_Widget_Control;
62 67
@@ -29,6 +29,7 @@ typedef enum { @@ -29,6 +29,7 @@ typedef enum {
29 JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED = 0x0004, //内存分配失败 29 JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED = 0x0004, //内存分配失败
30 JZ_ERROR_SYSTEM_MODULE_CODE_IS_BUSY = 0x0005, //忙错误 30 JZ_ERROR_SYSTEM_MODULE_CODE_IS_BUSY = 0x0005, //忙错误
31 JZ_ERROR_SYSTEM_MODULE_CODE_CHECK_CODE_ERROR = 0x0006, //校验码错误 31 JZ_ERROR_SYSTEM_MODULE_CODE_CHECK_CODE_ERROR = 0x0006, //校验码错误
  32 + JZ_ERROR_SYSTEM_MODULE_CODE_BUFFER_SIZE_NOT_ENOUGH = 0x0007, //缓冲区大小不足
32 } JZ_SYSTEM_Code; 33 } JZ_SYSTEM_Code;
33 34
34 typedef enum { 35 typedef enum {
@@ -209,7 +209,7 @@ static T_JZsdkReturnCode JZ_T40_BaseParamSet(void) @@ -209,7 +209,7 @@ static T_JZsdkReturnCode JZ_T40_BaseParamSet(void)
209 //测试部分 209 //测试部分
210 210
211 //1、将总功率设置为无限制 211 //1、将总功率设置为无限制
212 - //HalSend_type1Send_SearchLight_SetLumenPowerLimit(UART_DEV_2, 0x00, 0x64, 0x20, 0x00); 212 + HalSend_type1Send_SearchLight_SetLumenPowerLimit(UART_DEV_2, 0x00, 0x64, 0x20, 0x00);
213 213
214 } 214 }
215 215
@@ -251,8 +251,8 @@ T_JZsdkReturnCode JZ_T40_init(int mode) @@ -251,8 +251,8 @@ T_JZsdkReturnCode JZ_T40_init(int mode)
251 JZsdk_HalPort_Init(UART_DEV_2, (void *)&SerialInfo2); 251 JZsdk_HalPort_Init(UART_DEV_2, (void *)&SerialInfo2);
252 252
253 //4G初始化 253 //4G初始化
254 - int value[1] = {COMM_4G_UART_BITRATE};  
255 - JZsdk_HalPort_Init(UART_4G, value); 254 + // int value[1] = {COMM_4G_UART_BITRATE};
  255 + // JZsdk_HalPort_Init(UART_4G, value);
256 256
257 //子设备连接 257 //子设备连接
258 JZ_T40_SubDevice_Init(); 258 JZ_T40_SubDevice_Init();
@@ -10,20 +10,20 @@ @@ -10,20 +10,20 @@
10 #define DEVICE_VERSION JZ_T40 10 #define DEVICE_VERSION JZ_T40
11 11
12 //禁止修改行 选择是串口程序 还是 psdk程序 12 //禁止修改行 选择是串口程序 还是 psdk程序
13 -#define APP_VERSION APP_UART 13 +#define APP_VERSION APP_PSDK
14 14
15 //禁止修改行 板子型号 15 //禁止修改行 板子型号
16 #define PLATFORM_VERSION PLATFORM_V3S 16 #define PLATFORM_VERSION PLATFORM_V3S
17 17
18 //禁止修改行 串口连接程序的软件版本号 18 //禁止修改行 串口连接程序的软件版本号
19 #define MAJOR_VERSION_TEN_POSITION 0 19 #define MAJOR_VERSION_TEN_POSITION 0
20 -#define MAJOR_VERSION_ONE_POSITION 0 20 +#define MAJOR_VERSION_ONE_POSITION 1
21 #define MINOR_VERSION_TEN_POSITION 0 21 #define MINOR_VERSION_TEN_POSITION 0
22 -#define MINOR_VERSION_ONE_POSITION 0  
23 -#define MODIFY_VERSION_TEN_POSITION 0 22 +#define MINOR_VERSION_ONE_POSITION 3
  23 +#define MODIFY_VERSION_TEN_POSITION 1
24 #define MODIFY_VERSION_ONE_POSITION 2 24 #define MODIFY_VERSION_ONE_POSITION 2
25 -#define DEBUG_VERSION_TEN_POSITION 2  
26 -#define DEBUG_VERSION_ONE_POSITION 2 25 +#define DEBUG_VERSION_TEN_POSITION 0
  26 +#define DEBUG_VERSION_ONE_POSITION 0
27 27
28 28
29 29
@@ -478,7 +478,7 @@ static T_JZsdkReturnCode RecvDeal_RealTimeMP2_Limit_transmission(int Port, char @@ -478,7 +478,7 @@ static T_JZsdkReturnCode RecvDeal_RealTimeMP2_Limit_transmission(int Port, char
478 } 478 }
479 479
480 HalRecvDataLen += DataLen; 480 HalRecvDataLen += DataLen;
481 - JZSDK_LOG_DEBUG("%s,MP2实时喊话定长制传输中 长度:%d 总长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen, HalRecvDataLen); 481 + JZSDK_LOG_INFO("%s,MP2实时喊话定长制传输中 长度:%d 总长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen, HalRecvDataLen);
482 482
483 //传输数据接口 483 //传输数据接口
484 #ifdef MEGAPHONE_CONFIG_STATUS_ON 484 #ifdef MEGAPHONE_CONFIG_STATUS_ON
@@ -1994,7 +1994,7 @@ static T_JZsdkReturnCode RecvDeal_TTS_Trans_LimitTransmission(int Port, char *ge @@ -1994,7 +1994,7 @@ static T_JZsdkReturnCode RecvDeal_TTS_Trans_LimitTransmission(int Port, char *ge
1994 //2、记录已加载的长度 1994 //2、记录已加载的长度
1995 TTS_RecvBufferLen = TTS_RecvBufferLen + DataLen; 1995 TTS_RecvBufferLen = TTS_RecvBufferLen + DataLen;
1996 1996
1997 - JZSDK_LOG_DEBUG("%s,tts定长传输中, 长度:%d 总长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen, TTS_RecvBufferLen); 1997 + JZSDK_LOG_INFO("%s,tts定长传输中, 长度:%d 总长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen, TTS_RecvBufferLen);
1998 } 1998 }
1999 else 1999 else
2000 { 2000 {
@@ -2563,7 +2563,7 @@ static T_JZsdkReturnCode RecvDeal_Opus_RealTimeVoice_LimitTransmission(int Port, @@ -2563,7 +2563,7 @@ static T_JZsdkReturnCode RecvDeal_Opus_RealTimeVoice_LimitTransmission(int Port,
2563 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 2563 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
2564 } 2564 }
2565 2565
2566 - JZSDK_LOG_DEBUG("%s,传输opus定长语音传输中 长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen); 2566 + JZSDK_LOG_INFO("%s,传输opus定长语音传输中 长度:%d",JZsdk_DefineCode_GetPortName(Port), DataLen);
2567 2567
2568 //传输数据接口 2568 //传输数据接口
2569 #ifdef MEGAPHONE_CONFIG_STATUS_ON 2569 #ifdef MEGAPHONE_CONFIG_STATUS_ON
@@ -4,11 +4,15 @@ @@ -4,11 +4,15 @@
4 #include <atomic> 4 #include <atomic>
5 #include <unistd.h> 5 #include <unistd.h>
6 #include <string> 6 #include <string>
  7 +#include <thread>
  8 +#include <mutex>
  9 +#include <condition_variable>
7 10
8 #include "JZsdkLib.h" 11 #include "JZsdkLib.h"
9 #include "version_choose.h" 12 #include "version_choose.h"
  13 +#include "JZsdk_base/JZring/JZring.h"
10 14
11 -#ifdef IFLAY_TTS_2_CONFIG_STATUS_ON 15 +#if 1
12 16
13 #include "aikit_biz_api.h" 17 #include "aikit_biz_api.h"
14 #include "aikit_constant.h" 18 #include "aikit_constant.h"
@@ -18,71 +22,137 @@ @@ -18,71 +22,137 @@
18 #include "../../Megaphone.h" 22 #include "../../Megaphone.h"
19 #include "iflytek_tts.h" 23 #include "iflytek_tts.h"
20 24
21 -  
22 using namespace std; 25 using namespace std;
23 using namespace AIKIT; 26 using namespace AIKIT;
24 27
25 static std::atomic_bool ttsFinished(false); 28 static std::atomic_bool ttsFinished(false);
  29 +static std::atomic_bool g_playThreadRunning(false);
26 static const char *ABILITY = "e2e44feff"; 30 static const char *ABILITY = "e2e44feff";
27 -static AIKIT_HANDLE *g_AikitHandle = nullptr; //合成句柄 31 +static AIKIT_HANDLE *g_AikitHandle = nullptr; // 合成句柄
28 32
29 static int IflytekLib_2_StopTts(); 33 static int IflytekLib_2_StopTts();
30 34
  35 +#define IFLYTEK_RING_BUF_SIZE (1024 * 100) // 100KB缓冲区
  36 +static T_JZringHandle g_ringHandle = nullptr;
  37 +static char *g_ringBuf = nullptr;
31 38
  39 +// 同步机制
  40 +static std::mutex g_mutex;
  41 +static std::condition_variable g_cv;
32 42
33 -void OnOutput(AIKIT_HANDLE* handle, const AIKIT_OutputData* output) 43 +// 播放线程函数
  44 +void PlaybackThreadFunc()
34 { 45 {
35 - //检测数据生成标志位是否有关闭,如果有关闭,则主动关闭合成,并退出该事件  
36 - if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) 46 + U8_t buffer[2048]; // 每次读取2KB
  47 + U32_t readSize = 0;
  48 + T_JZsdkReturnCode ret;
  49 +
  50 + g_playThreadRunning = true;
  51 +
  52 + while (g_playThreadRunning)
37 { 53 {
  54 + // 等待有数据可读
  55 + {
  56 + std::unique_lock<std::mutex> lock(g_mutex);
  57 + U32_t dataCount = 0;
  58 + JZring_GetDataCount(g_ringHandle, &dataCount);
  59 +
  60 + if (dataCount == 0) {
  61 + // 等待最多100ms或通知
  62 + g_cv.wait_for(lock, std::chrono::milliseconds(100));
  63 + continue;
  64 + }
  65 + }
  66 +
  67 + JZSDK_LOG_DEBUG("有数据可读");
  68 +
  69 + // 从环形缓冲区读取数据
  70 + ret = JZring_Read(g_ringHandle, buffer, sizeof(buffer), &readSize);
  71 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS || readSize == 0) {
  72 + usleep(10000); // 10ms
  73 + continue;
  74 + }
  75 +
  76 +
  77 +
  78 + // 发送到音频播放器
  79 + AudioDeal_PcmDataInput_TextSteam(16000, buffer, readSize);
  80 +
  81 + // 检查是否需要停止播放
  82 + if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
  83 + break;
  84 + }
  85 + }
  86 +
  87 + g_playThreadRunning = false;
  88 +}
  89 +
  90 +void OnOutput(AIKIT_HANDLE* handle, const AIKIT_OutputData* output)
  91 +{
  92 + // 检测数据生成标志位是否有关闭
  93 + if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
38 IflytekLib_2_StopTts(); 94 IflytekLib_2_StopTts();
39 return; 95 return;
40 } 96 }
41 97
42 - //如果存在数据,则播放  
43 - if (output->node->value)  
44 - {  
45 - //生产的文本数据 output->node->value  
46 - //生产的数据长度 output->node->len  
47 - //char类型  
48 -  
49 - //JZSDK_LOG_DEBUG("生产了数据%d", output->node->len);  
50 - printf("生产了数据%d\n", output->node->len);  
51 -  
52 - //将该数据发送到alsa播放器  
53 - AudioDeal_PcmDataInput_TextSteam(16000, (unsigned char *)output->node->value, output->node->len); 98 + if (output->node->value) {
  99 + JZSDK_LOG_DEBUG("生产了数据%d", output->node->len);
  100 +
  101 + // 写入环形缓冲区
  102 + T_JZsdkReturnCode ret;
  103 + U32_t written = 0;
  104 +
  105 + while (written < static_cast<U32_t>(output->node->len)) {
  106 + U32_t chunkSize = std::min(static_cast<U32_t>(output->node->len) - written,
  107 + static_cast<U32_t>(4096));
  108 +
  109 + ret = JZring_Write(g_ringHandle,
  110 + reinterpret_cast<U8_t*>(output->node->value) + written,
  111 + chunkSize);
  112 +
  113 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
  114 + JZSDK_LOG_ERROR("写入环形缓冲区失败: %d", ret);
  115 + break;
  116 + }
  117 +
  118 + written += chunkSize;
  119 + }
  120 +
  121 + // 通知播放线程有新数据
  122 + g_cv.notify_one();
54 } 123 }
55 -  
56 -  
57 } 124 }
58 125
59 void OnEvent(AIKIT_HANDLE* handle, AIKIT_EVENT eventType, const AIKIT_OutputEvent* eventValue) { 126 void OnEvent(AIKIT_HANDLE* handle, AIKIT_EVENT eventType, const AIKIT_OutputEvent* eventValue) {
60 if (eventType == AIKIT_Event_End) { 127 if (eventType == AIKIT_Event_End) {
61 ttsFinished = true; 128 ttsFinished = true;
62 -  
63 JZSDK_LOG_INFO("合成完成"); 129 JZSDK_LOG_INFO("合成完成");
  130 +
  131 + // 通知播放线程所有数据已生成
  132 + g_cv.notify_one();
64 } 133 }
65 } 134 }
66 135
67 void OnError(AIKIT_HANDLE* handle, int32_t err, const char* desc) { 136 void OnError(AIKIT_HANDLE* handle, int32_t err, const char* desc) {
68 - printf("OnError:%d\n", err);  
69 -  
70 - //报错 137 + JZSDK_LOG_ERROR("TTS错误: %d, %s", err, desc);
  138 + IflytekLib_2_StopTts();
71 } 139 }
72 140
73 int IflytekLib_2_TextToTts(int language, 141 int IflytekLib_2_TextToTts(int language,
74 - const char *TtsRole,  
75 - const char *text, int speed, int volume) 142 + const char *TtsRole,
  143 + const char *text, int speed, int volume)
76 { 144 {
77 -  
78 AIKIT_ParamBuilder* paramBuilder = nullptr; 145 AIKIT_ParamBuilder* paramBuilder = nullptr;
79 AIKIT_DataBuilder* dataBuilder = nullptr; 146 AIKIT_DataBuilder* dataBuilder = nullptr;
80 AiText* aiText_raw = nullptr; 147 AiText* aiText_raw = nullptr;
81 - 148 + int ret = 0;
82 149
83 // 重置完成标志 150 // 重置完成标志
84 ttsFinished = false; 151 ttsFinished = false;
85 - 152 +
  153 + // 重置环形缓冲区
  154 + JZring_Reset(g_ringHandle);
  155 +
86 paramBuilder = AIKIT_ParamBuilder::create(); 156 paramBuilder = AIKIT_ParamBuilder::create();
87 paramBuilder->clear(); 157 paramBuilder->clear();
88 // 设置发音人 158 // 设置发音人
@@ -92,66 +162,67 @@ int IflytekLib_2_TextToTts(int language, @@ -92,66 +162,67 @@ int IflytekLib_2_TextToTts(int language,
92 paramBuilder->param("language", language); 162 paramBuilder->param("language", language);
93 // 设置文本编码 163 // 设置文本编码
94 paramBuilder->param("textEncoding", "UTF-8", strlen("UTF-8")); 164 paramBuilder->param("textEncoding", "UTF-8", strlen("UTF-8"));
  165 + // 音量
  166 + paramBuilder->param("volume", volume);
  167 + // 语速
  168 + paramBuilder->param("speed", speed);
95 169
96 - //语速  
97 - //paramBuilder->param("speed",speed); //可选参数,默认为0  
98 -  
99 - //音调  
100 - //paramBuilder->param("pitch",100); //可选参数,默认为0  
101 -  
102 - //声音  
103 - //paramBuilder->param("volume",100);//可选参数,默认为0  
104 -  
105 - //JZSDK_LOG_DEBUG("TTS Role:%s Len:%d, Text:%s Len:%d, language:%d", TtsRole, strlen(TtsRole), text, strlen(text), language); 170 + JZSDK_LOG_DEBUG("TTS Role:%s, Text:%s, language:%d", TtsRole, text, language);
106 171
107 - int ret = AIKIT_Start(ABILITY, AIKIT_Builder::build(paramBuilder), nullptr, &g_AikitHandle); 172 + ret = AIKIT_Start(ABILITY, AIKIT_Builder::build(paramBuilder), nullptr, &g_AikitHandle);
108 if(ret != 0) { 173 if(ret != 0) {
109 - printf("AIKIT_Start failed: %d\n", ret); 174 + JZSDK_LOG_ERROR("AIKIT_Start failed: %d", ret);
110 goto exit; 175 goto exit;
111 } 176 }
112 177
113 dataBuilder = AIKIT_DataBuilder::create(); 178 dataBuilder = AIKIT_DataBuilder::create();
114 dataBuilder->clear(); 179 dataBuilder->clear();
115 - //aiText_raw = AiText::get("text")->data(text.c_str(), text.length())->once()->valid();  
116 - aiText_raw = AiText::get("text")->data(text, strlen(text) )->once()->valid(); 180 + aiText_raw = AiText::get("text")->data(text, strlen(text))->once()->valid();
117 dataBuilder->payload(aiText_raw); 181 dataBuilder->payload(aiText_raw);
118 182
119 ret = AIKIT_Write(g_AikitHandle, AIKIT_Builder::build(dataBuilder)); 183 ret = AIKIT_Write(g_AikitHandle, AIKIT_Builder::build(dataBuilder));
120 if(ret != 0) { 184 if(ret != 0) {
121 - printf("AIKIT_Write failed: %d\n", ret); 185 + JZSDK_LOG_ERROR("AIKIT_Write failed: %d", ret);
122 goto exit; 186 goto exit;
123 } 187 }
124 188
125 - // 等待合成完成 189 + // 等待合成完成或停止信号
126 while(!ttsFinished) { 190 while(!ttsFinished) {
127 - usleep(1000); 191 + if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
  192 + break;
  193 + }
  194 + usleep(10000); // 10ms
128 } 195 }
129 196
130 - //JZSDK_LOG_INFO("合成完成");  
131 - 197 + // 结束合成
132 ret = AIKIT_End(g_AikitHandle); 198 ret = AIKIT_End(g_AikitHandle);
  199 + g_AikitHandle = nullptr;
133 200
134 -exit: 201 +exit:
135 if(paramBuilder != nullptr) { 202 if(paramBuilder != nullptr) {
136 delete paramBuilder; 203 delete paramBuilder;
137 } 204 }
138 if(dataBuilder != nullptr) { 205 if(dataBuilder != nullptr) {
139 delete dataBuilder; 206 delete dataBuilder;
140 } 207 }
  208 +
  209 + return ret;
141 } 210 }
142 211
143 -  
144 -  
145 -  
146 -  
147 -  
148 -  
149 -  
150 -  
151 -  
152 -  
153 int IflytekLib_2_Init() 212 int IflytekLib_2_Init()
154 { 213 {
  214 + // 初始化环形缓冲区
  215 + g_ringBuf = new char[IFLYTEK_RING_BUF_SIZE];
  216 + if (JZring_Init(&g_ringHandle, reinterpret_cast<U8_t*>(g_ringBuf), IFLYTEK_RING_BUF_SIZE)
  217 + != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
  218 + JZSDK_LOG_ERROR("环形缓冲区初始化失败");
  219 + return -1;
  220 + }
  221 +
  222 + // 启动播放线程
  223 + std::thread(PlaybackThreadFunc).detach();
  224 +
  225 + // 初始化TTS SDK
155 AIKIT_Configurator::builder() 226 AIKIT_Configurator::builder()
156 .app() 227 .app()
157 .appID("03857dfd") 228 .appID("03857dfd")
@@ -166,7 +237,7 @@ int IflytekLib_2_Init() @@ -166,7 +237,7 @@ int IflytekLib_2_Init()
166 237
167 int ret = AIKIT_Init(); 238 int ret = AIKIT_Init();
168 if(ret != 0) { 239 if(ret != 0) {
169 - printf("AIKIT_Init failed: %d\n", ret); 240 + JZSDK_LOG_ERROR("AIKIT_Init failed: %d", ret);
170 return -1; 241 return -1;
171 } 242 }
172 243
@@ -178,18 +249,49 @@ int IflytekLib_2_Init() @@ -178,18 +249,49 @@ int IflytekLib_2_Init()
178 249
179 int IflytekLib_2_UnInit() 250 int IflytekLib_2_UnInit()
180 { 251 {
  252 + // 停止播放线程
  253 + g_playThreadRunning = false;
  254 + g_cv.notify_one();
  255 +
  256 + // 等待播放线程退出
  257 + int waitCount = 0;
  258 + while (g_playThreadRunning && waitCount++ < 50) {
  259 + usleep(100000); // 100ms
  260 + }
  261 +
  262 + // 反初始化TTS SDK
  263 + if (g_AikitHandle) {
  264 + AIKIT_End(g_AikitHandle);
  265 + g_AikitHandle = nullptr;
  266 + }
  267 +
181 AIKIT_UnInit(); 268 AIKIT_UnInit();
  269 +
  270 + // 释放环形缓冲区
  271 + if (g_ringHandle) {
  272 + JZring_DeInit(g_ringHandle);
  273 + g_ringHandle = nullptr;
  274 + }
  275 +
  276 + if (g_ringBuf) {
  277 + delete[] g_ringBuf;
  278 + g_ringBuf = nullptr;
  279 + }
  280 +
182 return 0; 281 return 0;
183 } 282 }
184 283
185 static int IflytekLib_2_StopTts() 284 static int IflytekLib_2_StopTts()
186 { 285 {
187 - AIKIT_OutputEvent eventData = {};  
188 - if (g_AikitHandle != nullptr)  
189 - {  
190 - OnEvent(g_AikitHandle,AIKIT_Event_End,&eventData); 286 + if (g_AikitHandle) {
  287 + AIKIT_End(g_AikitHandle);
  288 + g_AikitHandle = nullptr;
  289 + ttsFinished = true;
  290 + JZSDK_LOG_INFO("TTS合成已停止");
191 } 291 }
192 292
  293 + // 通知播放线程
  294 + g_cv.notify_one();
193 return 0; 295 return 0;
194 } 296 }
195 297
@@ -110,7 +110,7 @@ int IflytekLib_2_TextToTts(int language, @@ -110,7 +110,7 @@ int IflytekLib_2_TextToTts(int language,
110 paramBuilder->param("textEncoding", "UTF-8", strlen("UTF-8")); 110 paramBuilder->param("textEncoding", "UTF-8", strlen("UTF-8"));
111 111
112 //语速 112 //语速
113 - //paramBuilder->param("speed",speed); //可选参数,默认为0 113 + paramBuilder->param("speed",speed); //可选参数,默认为0
114 114
115 //音调 115 //音调
116 //paramBuilder->param("pitch",100); //可选参数,默认为0 116 //paramBuilder->param("pitch",100); //可选参数,默认为0
@@ -4,11 +4,15 @@ @@ -4,11 +4,15 @@
4 #include <atomic> 4 #include <atomic>
5 #include <unistd.h> 5 #include <unistd.h>
6 #include <string> 6 #include <string>
  7 +#include <thread>
  8 +#include <mutex>
  9 +#include <condition_variable>
7 10
8 #include "JZsdkLib.h" 11 #include "JZsdkLib.h"
9 #include "version_choose.h" 12 #include "version_choose.h"
  13 +#include "JZsdk_base/JZring/JZring.h"
10 14
11 -#ifdef IFLAY_TTS_2_CONFIG_STATUS_ON 15 +#if 1
12 16
13 #include "aikit_biz_api.h" 17 #include "aikit_biz_api.h"
14 #include "aikit_constant.h" 18 #include "aikit_constant.h"
@@ -18,87 +22,146 @@ @@ -18,87 +22,146 @@
18 #include "../../Megaphone.h" 22 #include "../../Megaphone.h"
19 #include "iflytek_tts.h" 23 #include "iflytek_tts.h"
20 24
21 -  
22 using namespace std; 25 using namespace std;
23 using namespace AIKIT; 26 using namespace AIKIT;
24 27
25 static std::atomic_bool ttsFinished(false); 28 static std::atomic_bool ttsFinished(false);
  29 +static std::atomic_bool g_playThreadRunning(false);
26 static const char *ABILITY = "e2e44feff"; 30 static const char *ABILITY = "e2e44feff";
27 -static AIKIT_HANDLE *g_AikitHandle = nullptr; //合成句柄 31 +static AIKIT_HANDLE *g_AikitHandle = nullptr; // 合成句柄
28 32
29 static int IflytekLib_2_StopTts(); 33 static int IflytekLib_2_StopTts();
30 34
31 -static FILE *iflytts_fp = NULL;  
32 -#define IFLYTTS_FP_NAME "/root/tmp_tts_file.pcm" 35 +#define IFLYTEK_RING_BUF_SIZE (1024 * 100) // 100KB缓冲区
  36 +static T_JZringHandle g_ringHandle = nullptr;
  37 +static char *g_ringBuf = nullptr;
  38 +static int g_AudioPlayFinshFlag = JZ_FLAGCODE_OFF;
33 39
  40 +// 同步机制
  41 +static std::mutex g_mutex;
  42 +static std::condition_variable g_cv;
34 43
35 -void OnOutput(AIKIT_HANDLE* handle, const AIKIT_OutputData* output) 44 +// 播放线程函数
  45 +void PlaybackThreadFunc()
36 { 46 {
37 - //检测数据生成标志位是否有关闭,如果有关闭,则主动关闭合成,并退出该事件  
38 - if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF)  
39 - {  
40 - IflytekLib_2_StopTts();  
41 - return;  
42 - } 47 + U8_t buffer[2048]; // 每次读取2KB
  48 + U32_t readSize = 0;
  49 + T_JZsdkReturnCode ret;
43 50
44 - //如果存在数据,则播放  
45 - if (output->node->value) 51 + g_playThreadRunning = true;
  52 +
  53 + while (g_playThreadRunning)
46 { 54 {
47 - //生产的文本数据 output->node->value  
48 - //生产的数据长度 output->node->len  
49 - //char类型 55 + // 等待有数据可读
  56 + {
  57 + std::unique_lock<std::mutex> lock(g_mutex);
  58 + U32_t dataCount = 0;
  59 + JZring_GetDataCount(g_ringHandle, &dataCount);
50 60
51 - //JZSDK_LOG_DEBUG("生产了数据%d", output->node->len);  
52 - printf("生产了数据%d\n", output->node->len); 61 + JZSDK_LOG_DEBUG("缓冲区数据量: %d", dataCount);
  62 +
  63 + if (dataCount == 0) {
  64 + // 等待最多100ms或通知
  65 + g_cv.wait_for(lock, std::chrono::milliseconds(100));
  66 + continue;
  67 + }
  68 + }
53 69
54 - //将该数据发送到alsa播放器  
55 - //AudioDeal_PcmDataInput_TextSteam(16000, (unsigned char *)output->node->value, output->node->len); 70 + g_AudioPlayFinshFlag = JZ_FLAGCODE_ON;
56 71
57 - if (iflytts_fp != NULL)  
58 - {  
59 - fwrite(output->node->value, sizeof(char), output->node->len, iflytts_fp);  
60 - fflush(iflytts_fp); 72 + JZSDK_LOG_DEBUG("有数据可读");
  73 +
  74 + // 从环形缓冲区读取数据
  75 + ret = JZring_Read(g_ringHandle, buffer, sizeof(buffer), &readSize);
  76 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS || readSize == 0) {
  77 + usleep(10000); // 10ms
  78 + continue;
61 } 79 }
  80 +
  81 + JZSDK_LOG_DEBUG("输入数据进音频库");
62 82
63 - } 83 + // 发送到音频播放器
  84 + AudioDeal_PcmDataInput_TextSteam(16000, buffer, readSize);
64 85
  86 + g_AudioPlayFinshFlag = JZ_FLAGCODE_OFF;
65 87
  88 + JZSDK_LOG_DEBUG("音频库播放完毕");
  89 +
  90 + // 检查是否需要停止播放
  91 + if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
  92 + break;
  93 + }
  94 + }
  95 +
  96 + g_playThreadRunning = false;
  97 +}
  98 +
  99 +void OnOutput(AIKIT_HANDLE* handle, const AIKIT_OutputData* output)
  100 +{
  101 + // 检测数据生成标志位是否有关闭
  102 + if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
  103 + IflytekLib_2_StopTts();
  104 + return;
  105 + }
  106 +
  107 + if (output->node->value) {
  108 + JZSDK_LOG_DEBUG("生产了数据%d", output->node->len);
  109 +
  110 + // 写入环形缓冲区
  111 + T_JZsdkReturnCode ret;
  112 + U32_t written = 0;
  113 +
  114 + while (written < static_cast<U32_t>(output->node->len)) {
  115 + U32_t chunkSize = std::min(static_cast<U32_t>(output->node->len) - written,
  116 + static_cast<U32_t>(4096));
  117 +
  118 + ret = JZring_Write(g_ringHandle,
  119 + reinterpret_cast<U8_t*>(output->node->value) + written,
  120 + chunkSize);
  121 +
  122 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
  123 + JZSDK_LOG_ERROR("写入环形缓冲区失败: %d", ret);
  124 + break;
  125 + }
  126 +
  127 + written += chunkSize;
  128 + }
  129 +
  130 + // 通知播放线程有新数据
  131 + g_cv.notify_one();
  132 + }
66 } 133 }
67 134
68 void OnEvent(AIKIT_HANDLE* handle, AIKIT_EVENT eventType, const AIKIT_OutputEvent* eventValue) { 135 void OnEvent(AIKIT_HANDLE* handle, AIKIT_EVENT eventType, const AIKIT_OutputEvent* eventValue) {
69 if (eventType == AIKIT_Event_End) { 136 if (eventType == AIKIT_Event_End) {
70 ttsFinished = true; 137 ttsFinished = true;
71 -  
72 JZSDK_LOG_INFO("合成完成"); 138 JZSDK_LOG_INFO("合成完成");
  139 +
  140 + // 通知播放线程所有数据已生成
  141 + g_cv.notify_one();
73 } 142 }
74 } 143 }
75 144
76 void OnError(AIKIT_HANDLE* handle, int32_t err, const char* desc) { 145 void OnError(AIKIT_HANDLE* handle, int32_t err, const char* desc) {
77 - printf("OnError:%d\n", err);  
78 -  
79 - //报错 146 + JZSDK_LOG_ERROR("TTS错误: %d, %s", err, desc);
  147 + IflytekLib_2_StopTts();
80 } 148 }
81 149
82 int IflytekLib_2_TextToTts(int language, 150 int IflytekLib_2_TextToTts(int language,
83 - const char *TtsRole,  
84 - const char *text, int speed, int volume) 151 + const char *TtsRole,
  152 + const char *text, int speed, int volume)
85 { 153 {
86 -  
87 - if (iflytts_fp != NULL)  
88 - {  
89 - JZSDK_LOG_ERROR("file %s is not closed\n", IFLYTTS_FP_NAME);  
90 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
91 - }  
92 -  
93 -  
94 AIKIT_ParamBuilder* paramBuilder = nullptr; 154 AIKIT_ParamBuilder* paramBuilder = nullptr;
95 AIKIT_DataBuilder* dataBuilder = nullptr; 155 AIKIT_DataBuilder* dataBuilder = nullptr;
96 AiText* aiText_raw = nullptr; 156 AiText* aiText_raw = nullptr;
97 - 157 + int ret = 0;
98 158
99 // 重置完成标志 159 // 重置完成标志
100 ttsFinished = false; 160 ttsFinished = false;
101 - 161 +
  162 + // 重置环形缓冲区
  163 + JZring_Reset(g_ringHandle);
  164 +
102 paramBuilder = AIKIT_ParamBuilder::create(); 165 paramBuilder = AIKIT_ParamBuilder::create();
103 paramBuilder->clear(); 166 paramBuilder->clear();
104 // 设置发音人 167 // 设置发音人
@@ -108,102 +171,69 @@ int IflytekLib_2_TextToTts(int language, @@ -108,102 +171,69 @@ int IflytekLib_2_TextToTts(int language,
108 paramBuilder->param("language", language); 171 paramBuilder->param("language", language);
109 // 设置文本编码 172 // 设置文本编码
110 paramBuilder->param("textEncoding", "UTF-8", strlen("UTF-8")); 173 paramBuilder->param("textEncoding", "UTF-8", strlen("UTF-8"));
  174 + // 音量
  175 + paramBuilder->param("volume", volume);
  176 + // 语速
  177 + paramBuilder->param("speed", speed);
111 178
112 - //语速  
113 - //paramBuilder->param("speed",speed); //可选参数,默认为0 179 + JZSDK_LOG_DEBUG("TTS Role:%s, Text:%s, language:%d", TtsRole, text, language);
114 180
115 - //音调  
116 - //paramBuilder->param("pitch",100); //可选参数,默认为0  
117 -  
118 - //声音  
119 - //paramBuilder->param("volume",100);//可选参数,默认为0  
120 -  
121 - //打开临存文件  
122 - iflytts_fp = fopen(IFLYTTS_FP_NAME, "w+b");  
123 - if (iflytts_fp == NULL)  
124 - {  
125 - JZSDK_LOG_ERROR("open file %s failed\n", IFLYTTS_FP_NAME);  
126 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
127 - }  
128 -  
129 - //JZSDK_LOG_DEBUG("TTS Role:%s Len:%d, Text:%s Len:%d, language:%d", TtsRole, strlen(TtsRole), text, strlen(text), language);  
130 -  
131 - int ret = AIKIT_Start(ABILITY, AIKIT_Builder::build(paramBuilder), nullptr, &g_AikitHandle); 181 + ret = AIKIT_Start(ABILITY, AIKIT_Builder::build(paramBuilder), nullptr, &g_AikitHandle);
132 if(ret != 0) { 182 if(ret != 0) {
133 - printf("AIKIT_Start failed: %d\n", ret); 183 + JZSDK_LOG_ERROR("AIKIT_Start failed: %d", ret);
134 goto exit; 184 goto exit;
135 } 185 }
136 186
137 dataBuilder = AIKIT_DataBuilder::create(); 187 dataBuilder = AIKIT_DataBuilder::create();
138 dataBuilder->clear(); 188 dataBuilder->clear();
139 - //aiText_raw = AiText::get("text")->data(text.c_str(), text.length())->once()->valid();  
140 - aiText_raw = AiText::get("text")->data(text, strlen(text) )->once()->valid(); 189 + aiText_raw = AiText::get("text")->data(text, strlen(text))->once()->valid();
141 dataBuilder->payload(aiText_raw); 190 dataBuilder->payload(aiText_raw);
142 191
143 ret = AIKIT_Write(g_AikitHandle, AIKIT_Builder::build(dataBuilder)); 192 ret = AIKIT_Write(g_AikitHandle, AIKIT_Builder::build(dataBuilder));
144 if(ret != 0) { 193 if(ret != 0) {
145 - printf("AIKIT_Write failed: %d\n", ret); 194 + JZSDK_LOG_ERROR("AIKIT_Write failed: %d", ret);
146 goto exit; 195 goto exit;
147 } 196 }
148 197
149 - // 等待合成完成  
150 - while(!ttsFinished) {  
151 - usleep(1000);  
152 - }  
153 -  
154 - JZSDK_LOG_DEBUG("合成完成,开始播放");  
155 -  
156 - //将fp指针移到文件开头  
157 - fseek(iflytts_fp, 0, SEEK_SET);  
158 -  
159 - //将数据导入播放器  
160 - unsigned char buffer[1024];  
161 - int len;  
162 - while (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) != JZ_FLAGCODE_OFF)  
163 - {  
164 - len = fread(buffer, sizeof(char), 1024, iflytts_fp);  
165 - if (len <= 0)  
166 - {  
167 - JZSDK_LOG_DEBUG("已读取完毕\n"); 198 + // 等待合成完成或停止信号
  199 + while(!ttsFinished || g_AudioPlayFinshFlag == JZ_FLAGCODE_ON) {
  200 + if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
168 break; 201 break;
169 } 202 }
170 -  
171 - AudioDeal_PcmDataInput_TextSteam(16000, buffer, len); 203 + usleep(10000); // 10ms
172 } 204 }
173 205
174 - JZSDK_LOG_INFO("播放完成");  
175 - 206 + JZSDK_LOG_INFO("合成结束");
  207 +
  208 + // 结束合成
176 ret = AIKIT_End(g_AikitHandle); 209 ret = AIKIT_End(g_AikitHandle);
  210 + g_AikitHandle = nullptr;
177 211
178 -exit: 212 +exit:
179 if(paramBuilder != nullptr) { 213 if(paramBuilder != nullptr) {
180 delete paramBuilder; 214 delete paramBuilder;
181 } 215 }
182 if(dataBuilder != nullptr) { 216 if(dataBuilder != nullptr) {
183 delete dataBuilder; 217 delete dataBuilder;
184 } 218 }
185 -  
186 - if (iflytts_fp != NULL)  
187 - {  
188 - fclose(iflytts_fp);  
189 - iflytts_fp = NULL;  
190 - }  
191 -  
192 - return 0; 219 +
  220 + return ret;
193 } 221 }
194 222
195 -  
196 -  
197 -  
198 -  
199 -  
200 -  
201 -  
202 -  
203 -  
204 -  
205 int IflytekLib_2_Init() 223 int IflytekLib_2_Init()
206 { 224 {
  225 + // 初始化环形缓冲区
  226 + g_ringBuf = new char[IFLYTEK_RING_BUF_SIZE];
  227 + if (JZring_Init(&g_ringHandle, reinterpret_cast<U8_t*>(g_ringBuf), IFLYTEK_RING_BUF_SIZE)
  228 + != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
  229 + JZSDK_LOG_ERROR("环形缓冲区初始化失败");
  230 + return -1;
  231 + }
  232 +
  233 + // 启动播放线程
  234 + std::thread(PlaybackThreadFunc).detach();
  235 +
  236 + // 初始化TTS SDK
207 AIKIT_Configurator::builder() 237 AIKIT_Configurator::builder()
208 .app() 238 .app()
209 .appID("03857dfd") 239 .appID("03857dfd")
@@ -218,7 +248,7 @@ int IflytekLib_2_Init() @@ -218,7 +248,7 @@ int IflytekLib_2_Init()
218 248
219 int ret = AIKIT_Init(); 249 int ret = AIKIT_Init();
220 if(ret != 0) { 250 if(ret != 0) {
221 - printf("AIKIT_Init failed: %d\n", ret); 251 + JZSDK_LOG_ERROR("AIKIT_Init failed: %d", ret);
222 return -1; 252 return -1;
223 } 253 }
224 254
@@ -230,18 +260,49 @@ int IflytekLib_2_Init() @@ -230,18 +260,49 @@ int IflytekLib_2_Init()
230 260
231 int IflytekLib_2_UnInit() 261 int IflytekLib_2_UnInit()
232 { 262 {
  263 + // 停止播放线程
  264 + g_playThreadRunning = false;
  265 + g_cv.notify_one();
  266 +
  267 + // 等待播放线程退出
  268 + int waitCount = 0;
  269 + while (g_playThreadRunning && waitCount++ < 50) {
  270 + usleep(100000); // 100ms
  271 + }
  272 +
  273 + // 反初始化TTS SDK
  274 + if (g_AikitHandle) {
  275 + AIKIT_End(g_AikitHandle);
  276 + g_AikitHandle = nullptr;
  277 + }
  278 +
233 AIKIT_UnInit(); 279 AIKIT_UnInit();
  280 +
  281 + // 释放环形缓冲区
  282 + if (g_ringHandle) {
  283 + JZring_DeInit(g_ringHandle);
  284 + g_ringHandle = nullptr;
  285 + }
  286 +
  287 + if (g_ringBuf) {
  288 + delete[] g_ringBuf;
  289 + g_ringBuf = nullptr;
  290 + }
  291 +
234 return 0; 292 return 0;
235 } 293 }
236 294
237 static int IflytekLib_2_StopTts() 295 static int IflytekLib_2_StopTts()
238 { 296 {
239 - AIKIT_OutputEvent eventData = {};  
240 - if (g_AikitHandle != nullptr)  
241 - {  
242 - OnEvent(g_AikitHandle,AIKIT_Event_End,&eventData); 297 + if (g_AikitHandle) {
  298 + AIKIT_End(g_AikitHandle);
  299 + g_AikitHandle = nullptr;
  300 + ttsFinished = true;
  301 + JZSDK_LOG_INFO("TTS合成已停止");
243 } 302 }
244 303
  304 + // 通知播放线程
  305 + g_cv.notify_one();
245 return 0; 306 return 0;
246 } 307 }
247 308
1 -#include <fstream>  
2 -#include <assert.h>  
3 -#include <cstring>  
4 -#include <atomic>  
5 -#include <unistd.h>  
6 -#include <string>  
7 -  
8 -#include "JZsdkLib.h"  
9 -#include "version_choose.h"  
10 -#include "JZsdk_base/JZring/JZring.h"  
11 -  
12 -#ifdef IFLAY_TTS_2_CONFIG_STATUS_ON  
13 -  
14 -#include "aikit_biz_api.h"  
15 -#include "aikit_constant.h"  
16 -#include "aikit_biz_config.h"  
17 -#include "iflytek_tts.h"  
18 -#include "AudioDeal/AudioDeal.h"  
19 -#include "../../Megaphone.h"  
20 -#include "iflytek_tts.h"  
21 -  
22 -  
23 -using namespace std;  
24 -using namespace AIKIT;  
25 -  
26 -static std::atomic_bool ttsFinished(false);  
27 -static const char *ABILITY = "e2e44feff";  
28 -static AIKIT_HANDLE *g_AikitHandle = nullptr; //合成句柄  
29 -  
30 -static int IflytekLib_2_StopTts();  
31 -  
32 -#define IFLYTEK_RING_BUF_SIZE 1024*100  
33 -static T_JZringHandle g_ringHandle;  
34 -static char *g_ringBuf = NULL;  
35 -  
36 -void OnOutput(AIKIT_HANDLE* handle, const AIKIT_OutputData* output)  
37 -{  
38 - T_JZsdkReturnCode ret;  
39 -  
40 - //检测数据生成标志位是否有关闭,如果有关闭,则主动关闭合成,并退出该事件  
41 - if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF)  
42 - {  
43 - IflytekLib_2_StopTts();  
44 - return;  
45 - }  
46 -  
47 - //如果存在数据,则播放  
48 - if (output->node->value)  
49 - {  
50 - //生产的文本数据 output->node->value  
51 - //生产的数据长度 output->node->len  
52 - //char类型  
53 -  
54 - //JZSDK_LOG_DEBUG("生产了数据%d", output->node->len);  
55 - printf("生产了数据%d\n", output->node->len);  
56 -  
57 - //将该数据发送到alsa播放器  
58 - //AudioDeal_PcmDataInput_TextSteam(16000, (unsigned char *)output->node->value, output->node->len);  
59 -  
60 -  
61 - while (1)  
62 - {  
63 - ret = JZring_Write(g_ringHandle, (U8_t *)output->node->value, (U32_t)output->node->len);  
64 - if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
65 - {  
66 - break;  
67 - }  
68 - }  
69 - }  
70 -  
71 -}  
72 -  
73 -void OnEvent(AIKIT_HANDLE* handle, AIKIT_EVENT eventType, const AIKIT_OutputEvent* eventValue) {  
74 - if (eventType == AIKIT_Event_End) {  
75 - ttsFinished = true;  
76 -  
77 - JZSDK_LOG_INFO("合成完成");  
78 - }  
79 -}  
80 -  
81 -void OnError(AIKIT_HANDLE* handle, int32_t err, const char* desc) {  
82 - printf("OnError:%d\n", err);  
83 -  
84 - //报错  
85 -}  
86 -  
87 -int IflytekLib_2_TextToTts(int language,  
88 - const char *TtsRole,  
89 - const char *text, int speed, int volume)  
90 -{  
91 -  
92 - AIKIT_ParamBuilder* paramBuilder = nullptr;  
93 - AIKIT_DataBuilder* dataBuilder = nullptr;  
94 - AiText* aiText_raw = nullptr;  
95 -  
96 -  
97 - // 重置完成标志  
98 - ttsFinished = false;  
99 -  
100 - paramBuilder = AIKIT_ParamBuilder::create();  
101 - paramBuilder->clear();  
102 - // 设置发音人  
103 - paramBuilder->param("vcn", TtsRole, strlen(TtsRole));  
104 - paramBuilder->param("vcnModel", TtsRole, strlen(TtsRole));  
105 - // 设置语种  
106 - paramBuilder->param("language", language);  
107 - // 设置文本编码  
108 - paramBuilder->param("textEncoding", "UTF-8", strlen("UTF-8"));  
109 -  
110 - //语速  
111 - //paramBuilder->param("speed",speed); //可选参数,默认为0  
112 -  
113 - //音调  
114 - //paramBuilder->param("pitch",100); //可选参数,默认为0  
115 -  
116 - //声音  
117 - //paramBuilder->param("volume",100);//可选参数,默认为0  
118 -  
119 - //JZSDK_LOG_DEBUG("TTS Role:%s Len:%d, Text:%s Len:%d, language:%d", TtsRole, strlen(TtsRole), text, strlen(text), language);  
120 -  
121 - int ret = AIKIT_Start(ABILITY, AIKIT_Builder::build(paramBuilder), nullptr, &g_AikitHandle);  
122 - if(ret != 0) {  
123 - printf("AIKIT_Start failed: %d\n", ret);  
124 - goto exit;  
125 - }  
126 -  
127 - dataBuilder = AIKIT_DataBuilder::create();  
128 - dataBuilder->clear();  
129 - //aiText_raw = AiText::get("text")->data(text.c_str(), text.length())->once()->valid();  
130 - aiText_raw = AiText::get("text")->data(text, strlen(text) )->once()->valid();  
131 - dataBuilder->payload(aiText_raw);  
132 -  
133 - ret = AIKIT_Write(g_AikitHandle, AIKIT_Builder::build(dataBuilder));  
134 - if(ret != 0) {  
135 - printf("AIKIT_Write failed: %d\n", ret);  
136 - goto exit;  
137 - }  
138 -  
139 - // 等待合成完成  
140 - while(!ttsFinished) {  
141 - usleep(1000);  
142 - }  
143 -  
144 - //JZSDK_LOG_INFO("合成完成");  
145 -  
146 - ret = AIKIT_End(g_AikitHandle);  
147 -  
148 -exit:  
149 - if(paramBuilder != nullptr) {  
150 - delete paramBuilder;  
151 - }  
152 - if(dataBuilder != nullptr) {  
153 - delete dataBuilder;  
154 - }  
155 -}  
156 -  
157 -  
158 -  
159 -  
160 -  
161 -  
162 -  
163 -  
164 -  
165 -  
166 -  
167 -int IflytekLib_2_Init()  
168 -{  
169 - //初始化环形缓冲区数组  
170 - g_ringBuf = (char *)malloc(IFLYTEK_RING_BUF_SIZE * sizeof(char));  
171 - JZring_Init(&g_ringHandle, g_ringBuf, IFLYTEK_RING_BUF_SIZE);  
172 -  
173 - AIKIT_Configurator::builder()  
174 - .app()  
175 - .appID("03857dfd")  
176 - .apiSecret("OTA2OTEzMTVlOGYwMjllMmJkYzEwZGY5")  
177 - .apiKey("2b2c60f8a80b8cdfe45ae1058a25149a")  
178 - .workDir("/root/Iflytek_2")  
179 - .auth()  
180 - .authType(0)  
181 - .log()  
182 - .logLevel(LOG_LVL_OFF) //关闭日志打印  
183 - .logMode(LOG_STDOUT); //日志输出为控制台  
184 -  
185 - int ret = AIKIT_Init();  
186 - if(ret != 0) {  
187 - printf("AIKIT_Init failed: %d\n", ret);  
188 - return -1;  
189 - }  
190 -  
191 - AIKIT_Callbacks cbs = {OnOutput, OnEvent, OnError};  
192 - AIKIT_RegisterAbilityCallback(ABILITY, cbs);  
193 -  
194 - return 0;  
195 -}  
196 -  
197 -int IflytekLib_2_UnInit()  
198 -{  
199 - AIKIT_UnInit();  
200 - return 0;  
201 -}  
202 -  
203 -static int IflytekLib_2_StopTts()  
204 -{  
205 - AIKIT_OutputEvent eventData = {};  
206 - if (g_AikitHandle != nullptr)  
207 - {  
208 - OnEvent(g_AikitHandle,AIKIT_Event_End,&eventData);  
209 - }  
210 -  
211 - return 0;  
212 -}  
213 -  
214 -#endif  
  1 +#include <fstream>
  2 +#include <assert.h>
  3 +#include <cstring>
  4 +#include <atomic>
  5 +#include <unistd.h>
  6 +#include <string>
  7 +#include <thread>
  8 +#include <mutex>
  9 +#include <condition_variable>
  10 +
  11 +#include "JZsdkLib.h"
  12 +#include "version_choose.h"
  13 +#include "JZsdk_base/JZring/JZring.h"
  14 +
  15 +#if 0
  16 +
  17 +#include "aikit_biz_api.h"
  18 +#include "aikit_constant.h"
  19 +#include "aikit_biz_config.h"
  20 +#include "iflytek_tts.h"
  21 +#include "AudioDeal/AudioDeal.h"
  22 +#include "../../Megaphone.h"
  23 +#include "iflytek_tts.h"
  24 +
  25 +using namespace std;
  26 +using namespace AIKIT;
  27 +
  28 +static std::atomic_bool ttsFinished(false);
  29 +static std::atomic_bool g_playThreadRunning(false);
  30 +static const char *ABILITY = "e2e44feff";
  31 +static AIKIT_HANDLE *g_AikitHandle = nullptr; // 合成句柄
  32 +
  33 +static int IflytekLib_2_StopTts();
  34 +
  35 +#define IFLYTEK_RING_BUF_SIZE (1024 * 100) // 100KB缓冲区
  36 +static T_JZringHandle g_ringHandle = nullptr;
  37 +static char *g_ringBuf = nullptr;
  38 +
  39 +// 同步机制
  40 +static std::mutex g_mutex;
  41 +static std::condition_variable g_cv;
  42 +
  43 +// 播放线程函数
  44 +void PlaybackThreadFunc()
  45 +{
  46 + U8_t buffer[2048]; // 每次读取2KB
  47 + U32_t readSize = 0;
  48 + T_JZsdkReturnCode ret;
  49 +
  50 + g_playThreadRunning = true;
  51 +
  52 + while (g_playThreadRunning)
  53 + {
  54 + // 等待有数据可读
  55 + {
  56 + std::unique_lock<std::mutex> lock(g_mutex);
  57 + U32_t dataCount = 0;
  58 + JZring_GetDataCount(g_ringHandle, &dataCount);
  59 +
  60 + if (dataCount == 0) {
  61 + // 等待最多100ms或通知
  62 + g_cv.wait_for(lock, std::chrono::milliseconds(100));
  63 + continue;
  64 + }
  65 + }
  66 +
  67 + JZSDK_LOG_DEBUG("有数据可读");
  68 +
  69 + // 从环形缓冲区读取数据
  70 + ret = JZring_Read(g_ringHandle, buffer, sizeof(buffer), &readSize);
  71 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS || readSize == 0) {
  72 + usleep(10000); // 10ms
  73 + continue;
  74 + }
  75 +
  76 +
  77 +
  78 + // 发送到音频播放器
  79 + AudioDeal_PcmDataInput_TextSteam(16000, buffer, readSize);
  80 +
  81 + // 检查是否需要停止播放
  82 + if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
  83 + break;
  84 + }
  85 + }
  86 +
  87 + g_playThreadRunning = false;
  88 +}
  89 +
  90 +void OnOutput(AIKIT_HANDLE* handle, const AIKIT_OutputData* output)
  91 +{
  92 + // 检测数据生成标志位是否有关闭
  93 + if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
  94 + IflytekLib_2_StopTts();
  95 + return;
  96 + }
  97 +
  98 + if (output->node->value) {
  99 + JZSDK_LOG_DEBUG("生产了数据%d", output->node->len);
  100 +
  101 + // 写入环形缓冲区
  102 + T_JZsdkReturnCode ret;
  103 + U32_t written = 0;
  104 +
  105 + while (written < static_cast<U32_t>(output->node->len)) {
  106 + U32_t chunkSize = std::min(static_cast<U32_t>(output->node->len) - written,
  107 + static_cast<U32_t>(4096));
  108 +
  109 + ret = JZring_Write(g_ringHandle,
  110 + reinterpret_cast<U8_t*>(output->node->value) + written,
  111 + chunkSize);
  112 +
  113 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
  114 + JZSDK_LOG_ERROR("写入环形缓冲区失败: %d", ret);
  115 + break;
  116 + }
  117 +
  118 + written += chunkSize;
  119 + }
  120 +
  121 + // 通知播放线程有新数据
  122 + g_cv.notify_one();
  123 + }
  124 +}
  125 +
  126 +void OnEvent(AIKIT_HANDLE* handle, AIKIT_EVENT eventType, const AIKIT_OutputEvent* eventValue) {
  127 + if (eventType == AIKIT_Event_End) {
  128 + ttsFinished = true;
  129 + JZSDK_LOG_INFO("合成完成");
  130 +
  131 + // 通知播放线程所有数据已生成
  132 + g_cv.notify_one();
  133 + }
  134 +}
  135 +
  136 +void OnError(AIKIT_HANDLE* handle, int32_t err, const char* desc) {
  137 + JZSDK_LOG_ERROR("TTS错误: %d, %s", err, desc);
  138 + IflytekLib_2_StopTts();
  139 +}
  140 +
  141 +int IflytekLib_2_TextToTts(int language,
  142 + const char *TtsRole,
  143 + const char *text, int speed, int volume)
  144 +{
  145 + AIKIT_ParamBuilder* paramBuilder = nullptr;
  146 + AIKIT_DataBuilder* dataBuilder = nullptr;
  147 + AiText* aiText_raw = nullptr;
  148 + int ret = 0;
  149 +
  150 + // 重置完成标志
  151 + ttsFinished = false;
  152 +
  153 + // 重置环形缓冲区
  154 + JZring_Reset(g_ringHandle);
  155 +
  156 + paramBuilder = AIKIT_ParamBuilder::create();
  157 + paramBuilder->clear();
  158 + // 设置发音人
  159 + paramBuilder->param("vcn", TtsRole, strlen(TtsRole));
  160 + paramBuilder->param("vcnModel", TtsRole, strlen(TtsRole));
  161 + // 设置语种
  162 + paramBuilder->param("language", language);
  163 + // 设置文本编码
  164 + paramBuilder->param("textEncoding", "UTF-8", strlen("UTF-8"));
  165 + // 音量
  166 + paramBuilder->param("volume", volume);
  167 + // 语速
  168 + paramBuilder->param("speed", speed);
  169 +
  170 + JZSDK_LOG_DEBUG("TTS Role:%s, Text:%s, language:%d", TtsRole, text, language);
  171 +
  172 + ret = AIKIT_Start(ABILITY, AIKIT_Builder::build(paramBuilder), nullptr, &g_AikitHandle);
  173 + if(ret != 0) {
  174 + JZSDK_LOG_ERROR("AIKIT_Start failed: %d", ret);
  175 + goto exit;
  176 + }
  177 +
  178 + dataBuilder = AIKIT_DataBuilder::create();
  179 + dataBuilder->clear();
  180 + aiText_raw = AiText::get("text")->data(text, strlen(text))->once()->valid();
  181 + dataBuilder->payload(aiText_raw);
  182 +
  183 + ret = AIKIT_Write(g_AikitHandle, AIKIT_Builder::build(dataBuilder));
  184 + if(ret != 0) {
  185 + JZSDK_LOG_ERROR("AIKIT_Write failed: %d", ret);
  186 + goto exit;
  187 + }
  188 +
  189 + // 等待合成完成或停止信号
  190 + while(!ttsFinished) {
  191 + if (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_OFF) {
  192 + break;
  193 + }
  194 + usleep(10000); // 10ms
  195 + }
  196 +
  197 + // 结束合成
  198 + ret = AIKIT_End(g_AikitHandle);
  199 + g_AikitHandle = nullptr;
  200 +
  201 +exit:
  202 + if(paramBuilder != nullptr) {
  203 + delete paramBuilder;
  204 + }
  205 + if(dataBuilder != nullptr) {
  206 + delete dataBuilder;
  207 + }
  208 +
  209 + return ret;
  210 +}
  211 +
  212 +int IflytekLib_2_Init()
  213 +{
  214 + // 初始化环形缓冲区
  215 + g_ringBuf = new char[IFLYTEK_RING_BUF_SIZE];
  216 + if (JZring_Init(&g_ringHandle, reinterpret_cast<U8_t*>(g_ringBuf), IFLYTEK_RING_BUF_SIZE)
  217 + != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
  218 + JZSDK_LOG_ERROR("环形缓冲区初始化失败");
  219 + return -1;
  220 + }
  221 +
  222 + // 启动播放线程
  223 + std::thread(PlaybackThreadFunc).detach();
  224 +
  225 + // 初始化TTS SDK
  226 + AIKIT_Configurator::builder()
  227 + .app()
  228 + .appID("03857dfd")
  229 + .apiSecret("OTA2OTEzMTVlOGYwMjllMmJkYzEwZGY5")
  230 + .apiKey("2b2c60f8a80b8cdfe45ae1058a25149a")
  231 + .workDir("/root/Iflytek_2")
  232 + .auth()
  233 + .authType(0)
  234 + .log()
  235 + .logLevel(LOG_LVL_OFF) //关闭日志打印
  236 + .logMode(LOG_STDOUT); //日志输出为控制台
  237 +
  238 + int ret = AIKIT_Init();
  239 + if(ret != 0) {
  240 + JZSDK_LOG_ERROR("AIKIT_Init failed: %d", ret);
  241 + return -1;
  242 + }
  243 +
  244 + AIKIT_Callbacks cbs = {OnOutput, OnEvent, OnError};
  245 + AIKIT_RegisterAbilityCallback(ABILITY, cbs);
  246 +
  247 + return 0;
  248 +}
  249 +
  250 +int IflytekLib_2_UnInit()
  251 +{
  252 + // 停止播放线程
  253 + g_playThreadRunning = false;
  254 + g_cv.notify_one();
  255 +
  256 + // 等待播放线程退出
  257 + int waitCount = 0;
  258 + while (g_playThreadRunning && waitCount++ < 50) {
  259 + usleep(100000); // 100ms
  260 + }
  261 +
  262 + // 反初始化TTS SDK
  263 + if (g_AikitHandle) {
  264 + AIKIT_End(g_AikitHandle);
  265 + g_AikitHandle = nullptr;
  266 + }
  267 +
  268 + AIKIT_UnInit();
  269 +
  270 + // 释放环形缓冲区
  271 + if (g_ringHandle) {
  272 + JZring_DeInit(g_ringHandle);
  273 + g_ringHandle = nullptr;
  274 + }
  275 +
  276 + if (g_ringBuf) {
  277 + delete[] g_ringBuf;
  278 + g_ringBuf = nullptr;
  279 + }
  280 +
  281 + return 0;
  282 +}
  283 +
  284 +static int IflytekLib_2_StopTts()
  285 +{
  286 + if (g_AikitHandle) {
  287 + AIKIT_End(g_AikitHandle);
  288 + g_AikitHandle = nullptr;
  289 + ttsFinished = true;
  290 + JZSDK_LOG_INFO("TTS合成已停止");
  291 + }
  292 +
  293 + // 通知播放线程
  294 + g_cv.notify_one();
  295 + return 0;
  296 +}
  297 +
  298 +#endif
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 8
9 #define MAX(a,b) ( (a>b) ?a:b ) 9 #define MAX(a,b) ( (a>b) ?a:b )
10 10
11 -static int g_SearchLight_Subscription_Flag = JZ_FLAGCODE_ON; //消息订阅状态 11 +static int g_SearchLight_Subscription_Flag = JZ_FLAGCODE_OFF; //消息订阅状态 默认关闭本机的
12 12
13 13
14 typedef struct T_JzSearchLightInfo{ 14 typedef struct T_JzSearchLightInfo{
@@ -191,7 +191,7 @@ T_JZsdkReturnCode SearchLight_Obtain_Frequency(int Frequency) @@ -191,7 +191,7 @@ T_JZsdkReturnCode SearchLight_Obtain_Frequency(int Frequency)
191 //收到探照灯温度 191 //收到探照灯温度
192 T_JZsdkReturnCode SearchLight_Obtain_Temperature(int left, int right) 192 T_JZsdkReturnCode SearchLight_Obtain_Temperature(int left, int right)
193 { 193 {
194 - JZSDK_LOG_DEBUG("%x收到探照灯温度回复%d %d",DEVICE_VERSION, left, right); 194 + //JZSDK_LOG_DEBUG("%x收到探照灯温度回复%d %d",DEVICE_VERSION, left, right);
195 195
196 g_SearchLight_Info.Attribute.LeftTemperature = left; 196 g_SearchLight_Info.Attribute.LeftTemperature = left;
197 g_SearchLight_Info.Attribute.RightTemperature = right; 197 g_SearchLight_Info.Attribute.RightTemperature = right;
@@ -11,175 +11,160 @@ @@ -11,175 +11,160 @@
11 11
12 static T_JZsdkReturnCode SideLaser_RealCotrol(int LaserNum, int status); 12 static T_JZsdkReturnCode SideLaser_RealCotrol(int LaserNum, int status);
13 13
14 -  
15 -  
16 -static T_SideLaserMode g_SideLaser_RealMode = SIDE_LASER_OFF; //实际控制灯光的值  
17 -  
18 -static int g_SideLaserMode = 0; //realmode -1  
19 -static int g_SideLaserControl = JZ_FLAGCODE_OFF;  
20 -  
21 -static int SideLaser_Frequency = 50; //1~100  
22 -  
23 -  
24 - 14 +static T_JZsdkSideLaserInfo g_SideLaserInfo;
25 15
26 static void *SideLaserControl_task(void *arg) 16 static void *SideLaserControl_task(void *arg)
27 { 17 {
28 - int status = JZ_FLAGCODE_OFF;  
29 - static T_SideLaserMode Last_LaserMode = SIDE_LASER_OFF; 18 + T_JZsdkSideLaserInfo LastSideLaserInfo = g_SideLaserInfo;
30 19
  20 + int tempStatus = LastSideLaserInfo.status;
31 21
32 #if DEVICE_VERSION == JZ_U3S 22 #if DEVICE_VERSION == JZ_U3S
  23 +
33 while (1) 24 while (1)
34 { 25 {
35 -  
36 - switch (g_SideLaser_RealMode) 26 + if (g_SideLaserInfo.status == JZ_FLAGCODE_OFF)
37 { 27 {
38 - case SIDE_LASER_OFF: 28 + if (LastSideLaserInfo.status != JZ_FLAGCODE_OFF)
39 { 29 {
40 - if (Last_LaserMode == g_SideLaser_RealMode)  
41 - {  
42 - delayMs(10);  
43 - continue;  
44 - }  
45 - else  
46 - {  
47 - Last_LaserMode = g_SideLaser_RealMode;  
48 - SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);  
49 - continue;  
50 - }  
51 - break; 30 + SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
52 } 31 }
53 - 32 +
  33 + LastSideLaserInfo.status = g_SideLaserInfo.status;
  34 + delayMs(10);
  35 + continue;
  36 + }
  37 +
  38 +
  39 + switch(g_SideLaserInfo.mode)
  40 + {
54 case SIDE_LASER_GREEN_AWALYS_ON: 41 case SIDE_LASER_GREEN_AWALYS_ON:
55 { 42 {
56 - if (Last_LaserMode == g_SideLaser_RealMode)  
57 - {  
58 - delayMs(10);  
59 - continue;  
60 - }  
61 - else 43 + if (LastSideLaserInfo.mode != g_SideLaserInfo.mode)
62 { 44 {
63 - Last_LaserMode = g_SideLaser_RealMode;  
64 SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF); 45 SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
65 SideLaser_RealCotrol(0, JZ_FLAGCODE_ON); 46 SideLaser_RealCotrol(0, JZ_FLAGCODE_ON);
66 - continue;  
67 } 47 }
68 - break; 48 +
  49 + LastSideLaserInfo.mode = g_SideLaserInfo.mode;
  50 + delayMs(10);
  51 + continue;
69 } 52 }
70 - 53 + break;
  54 +
71 case SIDE_LASER_RED_AWALYS_ON: 55 case SIDE_LASER_RED_AWALYS_ON:
72 { 56 {
73 - if (Last_LaserMode == g_SideLaser_RealMode) 57 + if (LastSideLaserInfo.mode != g_SideLaserInfo.mode)
74 { 58 {
75 - delayMs(10);  
76 - continue;  
77 - }  
78 - else  
79 - {  
80 - Last_LaserMode = g_SideLaser_RealMode;  
81 SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF); 59 SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
82 SideLaser_RealCotrol(1, JZ_FLAGCODE_ON); 60 SideLaser_RealCotrol(1, JZ_FLAGCODE_ON);
83 - continue;  
84 } 61 }
85 - break; 62 +
  63 + LastSideLaserInfo.mode = g_SideLaserInfo.mode;
  64 + delayMs(10);
  65 + continue;
86 } 66 }
  67 + break;
87 68
88 -  
89 case SIDE_LASER_GREEN_AND_RED_AWALYS_ON: 69 case SIDE_LASER_GREEN_AND_RED_AWALYS_ON:
90 { 70 {
91 - if (Last_LaserMode == g_SideLaser_RealMode)  
92 - {  
93 - delayMs(10);  
94 - continue;  
95 - }  
96 - else 71 + if (LastSideLaserInfo.mode != g_SideLaserInfo.mode)
97 { 72 {
98 - Last_LaserMode = g_SideLaser_RealMode;  
99 - SideLaser_RealCotrol(255, JZ_FLAGCODE_ON);  
100 - continue; 73 + SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
101 } 74 }
102 - break; 75 +
  76 + LastSideLaserInfo.mode = g_SideLaserInfo.mode;
  77 + delayMs(10);
  78 + continue;
103 } 79 }
  80 + break;
104 81
105 case SIDE_LASER_GREEN_ADD_RED_TOGETHER_FLICKER: 82 case SIDE_LASER_GREEN_ADD_RED_TOGETHER_FLICKER:
106 { 83 {
107 - if (Last_LaserMode != g_SideLaser_RealMode)  
108 - {  
109 - Last_LaserMode = g_SideLaser_RealMode;  
110 - } 84 + LastSideLaserInfo.mode = g_SideLaserInfo.mode;
111 85
112 - if (status == JZ_FLAGCODE_OFF) 86 + if (tempStatus == JZ_FLAGCODE_OFF)
113 { 87 {
114 - status = JZ_FLAGCODE_ON; 88 + tempStatus = JZ_FLAGCODE_ON;
115 } 89 }
116 else 90 else
117 { 91 {
118 - status = JZ_FLAGCODE_OFF; 92 + tempStatus = JZ_FLAGCODE_OFF;
119 } 93 }
120 94
121 - SideLaser_RealCotrol(255, status);  
122 -  
123 - delayMs(1000/SideLaser_Frequency);  
124 - 95 + SideLaser_RealCotrol(255, tempStatus);
  96 + delayMs(1000/g_SideLaserInfo.Frequency);
125 continue; 97 continue;
126 } 98 }
127 - 99 + break;
  100 +
128 case SIDE_LASER_GREEN_ADD_RED_ALTERNATION_FLICKER: 101 case SIDE_LASER_GREEN_ADD_RED_ALTERNATION_FLICKER:
129 { 102 {
130 - if (Last_LaserMode != g_SideLaser_RealMode)  
131 - {  
132 - Last_LaserMode = g_SideLaser_RealMode;  
133 - } 103 + LastSideLaserInfo.mode = g_SideLaserInfo.mode;
134 104
135 - if (status == JZ_FLAGCODE_OFF) 105 + if (tempStatus == JZ_FLAGCODE_OFF)
136 { 106 {
137 - status = JZ_FLAGCODE_ON; 107 + tempStatus = JZ_FLAGCODE_ON;
138 SideLaser_RealCotrol(0,JZ_FLAGCODE_ON); 108 SideLaser_RealCotrol(0,JZ_FLAGCODE_ON);
139 SideLaser_RealCotrol(1,JZ_FLAGCODE_OFF); 109 SideLaser_RealCotrol(1,JZ_FLAGCODE_OFF);
140 } 110 }
141 else 111 else
142 { 112 {
143 - status = JZ_FLAGCODE_OFF; 113 + tempStatus = JZ_FLAGCODE_OFF;
144 SideLaser_RealCotrol(0,JZ_FLAGCODE_OFF); 114 SideLaser_RealCotrol(0,JZ_FLAGCODE_OFF);
145 SideLaser_RealCotrol(1,JZ_FLAGCODE_ON); 115 SideLaser_RealCotrol(1,JZ_FLAGCODE_ON);
146 } 116 }
147 117
148 - delayMs(1000/SideLaser_Frequency); 118 + delayMs(1000/g_SideLaserInfo.Frequency);
  119 + continue;
  120 + }
  121 + break;
149 122
  123 + default:
  124 + {
  125 + SideLaser_RealCotrol(255, JZ_FLAGCODE_OFF);
  126 + delayMs(10);
150 continue; 127 continue;
151 } 128 }
152 -  
153 - default:  
154 - break; 129 + break;
155 } 130 }
156 -  
157 - delayMs(10);  
158 -  
159 -  
160 } 131 }
  132 +
161 #endif 133 #endif
162 134
163 #if DEVICE_VERSION == JZ_T40 135 #if DEVICE_VERSION == JZ_T40
164 - while(1) 136 +
  137 + while (1)
165 { 138 {
166 - if (Last_LaserMode != g_SideLaser_RealMode) 139 + if (g_SideLaserInfo.status == JZ_FLAGCODE_OFF)
167 { 140 {
168 - Last_LaserMode = g_SideLaser_RealMode;  
169 -  
170 - if (g_SideLaser_RealMode == SIDE_LASER_OFF) 141 + if (LastSideLaserInfo.status != JZ_FLAGCODE_OFF)
171 { 142 {
172 HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x20 ,JZ_FLAGCODE_OFF); 143 HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x20 ,JZ_FLAGCODE_OFF);
173 } 144 }
174 - else 145 +
  146 + LastSideLaserInfo.status = g_SideLaserInfo.status;
  147 + delayMs(10);
  148 + continue;
  149 + }
  150 +
  151 + if (g_SideLaserInfo.status == JZ_FLAGCODE_ON)
  152 + {
  153 + if (LastSideLaserInfo.status != JZ_FLAGCODE_ON)
175 { 154 {
176 - int mode = g_SideLaser_RealMode - 1;  
177 HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x20 ,JZ_FLAGCODE_ON); 155 HalSend_type1Send_SetLaserControl(UART_DEV_2, 0x20 ,JZ_FLAGCODE_ON);
178 - HalSend_type1Send_SetLaserMode(UART_DEV_2, 0x20, mode);  
179 } 156 }
180 - 157 +
  158 + LastSideLaserInfo.status = g_SideLaserInfo.status;
  159 + }
  160 +
  161 + if (g_SideLaserInfo.mode != LastSideLaserInfo.mode)
  162 + {
  163 + LastSideLaserInfo.mode = g_SideLaserInfo.mode;
  164 + HalSend_type1Send_SetLaserMode(UART_DEV_2, 0x20, LastSideLaserInfo.mode);
181 } 165 }
182 166
  167 + delayMs(10);
183 } 168 }
184 169
185 #endif 170 #endif
@@ -193,6 +178,11 @@ static void *SideLaserControl_task(void *arg) @@ -193,6 +178,11 @@ static void *SideLaserControl_task(void *arg)
193 * *******************************/ 178 * *******************************/
194 T_JZsdkReturnCode SideLaser_Init() 179 T_JZsdkReturnCode SideLaser_Init()
195 { 180 {
  181 +
  182 + g_SideLaserInfo.status = JZ_FLAGCODE_OFF;
  183 + g_SideLaserInfo.mode = SIDE_LASER_GREEN_AWALYS_ON;
  184 + g_SideLaserInfo.Frequency = 50;
  185 +
196 pthread_t Task; 186 pthread_t Task;
197 pthread_attr_t task_attribute; //线程属性 187 pthread_attr_t task_attribute; //线程属性
198 pthread_attr_init(&task_attribute); //初始化线程属性 188 pthread_attr_init(&task_attribute); //初始化线程属性
@@ -256,19 +246,19 @@ T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, i @@ -256,19 +246,19 @@ T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, i
256 { 246 {
257 case SIDELASER_REALMODE: 247 case SIDELASER_REALMODE:
258 { 248 {
259 - *value = g_SideLaser_RealMode; 249 + *value = g_SideLaserInfo.Uimode;
260 } 250 }
261 break; 251 break;
262 252
263 case SIDELASER_CONTROL: 253 case SIDELASER_CONTROL:
264 { 254 {
265 - *value = g_SideLaserControl; 255 + *value = g_SideLaserInfo.status;
266 } 256 }
267 break; 257 break;
268 258
269 case SIDELASER_MODE: 259 case SIDELASER_MODE:
270 { 260 {
271 - *value = g_SideLaserMode; 261 + *value = g_SideLaserInfo.mode;
272 } 262 }
273 263
274 default: 264 default:
@@ -286,35 +276,49 @@ T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, i @@ -286,35 +276,49 @@ T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, i
286 { 276 {
287 case SIDELASER_CONTROL: 277 case SIDELASER_CONTROL:
288 { 278 {
289 - g_SideLaserControl = *value;  
290 - JZSDK_LOG_INFO("设置激光控制值:%d",g_SideLaserControl);  
291 - //从灯光的模式和控制计算得到实际控制值  
292 - if (g_SideLaserControl == JZ_FLAGCODE_OFF) 279 + JZSDK_LOG_INFO("设置激光控制值:%d",*value);
  280 + g_SideLaserInfo.status = *value;
  281 + if (*value == JZ_FLAGCODE_OFF)
293 { 282 {
294 - g_SideLaser_RealMode = SIDE_LASER_OFF; 283 + g_SideLaserInfo.Uimode = JZ_FLAGCODE_OFF;
295 } 284 }
296 else 285 else
297 { 286 {
298 - g_SideLaser_RealMode = g_SideLaserMode+1; 287 + g_SideLaserInfo.Uimode = g_SideLaserInfo.mode + 1;
299 } 288 }
300 } 289 }
301 break; 290 break;
302 291
303 case SIDELASER_MODE: 292 case SIDELASER_MODE:
304 { 293 {
305 - g_SideLaserMode = *value;  
306 - JZSDK_LOG_INFO("设置激光模式值:%d",g_SideLaserMode);  
307 - if (g_SideLaserControl == JZ_FLAGCODE_OFF) 294 + JZSDK_LOG_INFO("设置激光模式值:%d",*value);
  295 + g_SideLaserInfo.mode = *value;
  296 + if (g_SideLaserInfo.status == JZ_FLAGCODE_OFF)
308 { 297 {
309 - g_SideLaser_RealMode = SIDE_LASER_OFF; 298 + g_SideLaserInfo.Uimode = JZ_FLAGCODE_OFF;
310 } 299 }
311 else 300 else
312 { 301 {
313 - g_SideLaser_RealMode = g_SideLaserMode+1; 302 + g_SideLaserInfo.Uimode = g_SideLaserInfo.mode + 1;
314 } 303 }
315 } 304 }
316 break; 305 break;
317 306
  307 + case SIDELASER_REALMODE:
  308 + {
  309 + if (*value == JZ_FLAGCODE_OFF)
  310 + {
  311 + g_SideLaserInfo.status = JZ_FLAGCODE_OFF;
  312 + g_SideLaserInfo.Uimode = JZ_FLAGCODE_OFF;
  313 + }
  314 + else
  315 + {
  316 + g_SideLaserInfo.status = JZ_FLAGCODE_ON;
  317 + g_SideLaserInfo.Uimode = JZ_FLAGCODE_ON;
  318 + g_SideLaserInfo.mode = *value - 1;
  319 + }
  320 + }
  321 +
318 default: 322 default:
319 { 323 {
320 *value = JZ_FLAGCODE_OFF; 324 *value = JZ_FLAGCODE_OFF;
@@ -327,4 +331,19 @@ T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, i @@ -327,4 +331,19 @@ T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, i
327 331
328 JZSDK_LOG_ERROR("参数获取出错"); 332 JZSDK_LOG_ERROR("参数获取出错");
329 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 333 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  334 +}
  335 +
  336 +/************************
  337 + *
  338 + * 获取激光侧面信息
  339 + *
  340 + *
  341 + * ***********************/
  342 +T_JZsdkReturnCode SideLaser_getInfo(T_JZsdkSideLaserInfo *SideLaserInfo)
  343 +{
  344 + SideLaserInfo->status = g_SideLaserInfo.status;
  345 + SideLaserInfo->mode = g_SideLaserInfo.mode;
  346 + SideLaserInfo->Frequency = g_SideLaserInfo.Frequency;
  347 +
  348 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
330 } 349 }
@@ -25,15 +25,14 @@ extern "C" { @@ -25,15 +25,14 @@ extern "C" {
25 * 激光模式结构体 25 * 激光模式结构体
26 * 26 *
27 * **********/ 27 * **********/
28 -typedef enum T_SideLaserMode 28 +typedef enum E_SideLaserMode
29 { 29 {
30 - SIDE_LASER_OFF = 0x0000, //关闭  
31 - SIDE_LASER_GREEN_AWALYS_ON = 0x0001, //绿色常亮  
32 - SIDE_LASER_RED_AWALYS_ON = 0x0002, //红色常亮  
33 - SIDE_LASER_GREEN_AND_RED_AWALYS_ON = 0x0003, //红绿常亮  
34 - SIDE_LASER_GREEN_ADD_RED_TOGETHER_FLICKER = 0x0004, //红绿齐闪  
35 - SIDE_LASER_GREEN_ADD_RED_ALTERNATION_FLICKER = 0x0005, //红绿交替闪  
36 -}T_SideLaserMode; 30 + SIDE_LASER_GREEN_AWALYS_ON = 0x00, //绿色常亮
  31 + SIDE_LASER_RED_AWALYS_ON = 0x01, //红色常亮
  32 + SIDE_LASER_GREEN_AND_RED_AWALYS_ON = 0x02, //红绿常亮
  33 + SIDE_LASER_GREEN_ADD_RED_TOGETHER_FLICKER = 0x03, //红绿齐闪
  34 + SIDE_LASER_GREEN_ADD_RED_ALTERNATION_FLICKER = 0x04, //红绿交替闪
  35 +}E_SideLaserMode;
37 36
38 37
39 /********* 38 /*********
@@ -48,11 +47,20 @@ typedef enum SideLaserParam @@ -48,11 +47,20 @@ typedef enum SideLaserParam
48 SIDELASER_MODE = 0x000002, 47 SIDELASER_MODE = 0x000002,
49 }SideLaserParam; 48 }SideLaserParam;
50 49
  50 +
  51 +typedef struct T_JZsdkSideLaserInfo{
  52 + int status;
  53 + E_SideLaserMode mode;
  54 + int Frequency;
  55 + int Uimode; //0 关闭 1~5就是 E_SideLaserMode
  56 +}T_JZsdkSideLaserInfo;
  57 +
51 /* Exported types ------------------------------------------------------------*/ 58 /* Exported types ------------------------------------------------------------*/
52 59
53 /* Exported functions --------------------------------------------------------*/ 60 /* Exported functions --------------------------------------------------------*/
54 T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, int *value); 61 T_JZsdkReturnCode SideLaser_param(int flagcode, enum SideLaserParam paramflag, int *value);
55 T_JZsdkReturnCode SideLaser_Init(); 62 T_JZsdkReturnCode SideLaser_Init();
  63 +T_JZsdkReturnCode SideLaser_getInfo(T_JZsdkSideLaserInfo *SideLaserInfo);
56 64
57 #ifdef __cplusplus 65 #ifdef __cplusplus
58 } 66 }
1 -#include "Psdk_To_UI.h"  
2 -#include "JZsdkLib.h"  
3 -#include "UI_control/Psdk_Ui.h"  
4 -#include "UI_control/UI_control.h"  
5 -  
6 -#include "version_choose.h"  
7 -  
8 -T_JZsdkReturnCode JZsdk_PsdkToUi_PlayLastSong()  
9 -{  
10 - //1、将播放上一首歌曲的命令发送到UIcontrol  
11 - UIcontrol_LastSong(DEVICE_PSDK);  
12 -  
13 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
14 -}  
15 -  
16 -T_JZsdkReturnCode JZsdk_PsdkToUi_PlayNextSong()  
17 -{  
18 - //1、将播放下一首歌曲的命令发送到UIcontrol  
19 - UIcontrol_NextSong(DEVICE_PSDK);  
20 -  
21 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
22 -}  
23 -  
24 -T_JZsdkReturnCode JZsdk_PsdkToUi_SetVolume(int volume)  
25 -{  
26 - //1、将volume传递到所有的psdk ui (因为psdk有两个音量ui)  
27 - JZsdk_UI_value_set(JZSDK_WIDGET_VOLUME, volume);  
28 -  
29 - //2、将音量控制值发送到UIcontrol 用于控制设备  
30 - UIcontrol_SetVolume(DEVICE_PSDK, volume, JZ_FLAGCODE_ON);  
31 -  
32 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
33 -}  
@@ -39,9 +39,9 @@ int Get_UI_Widget_OpusRealTimeMode() @@ -39,9 +39,9 @@ int Get_UI_Widget_OpusRealTimeMode()
39 #define AUTO_CONTROL 0x02 39 #define AUTO_CONTROL 0x02
40 40
41 41
42 -//警灯颜色  
43 -static int FirstWarningLight = 1;  
44 -static int SecondWarningLight = 3; 42 +// //警灯颜色
  43 +// static int FirstWarningLight = 1;
  44 +// static int SecondWarningLight = 3;
45 45
46 //探照灯模式 46 //探照灯模式
47 static int SearchLightMode = 0; 47 static int SearchLightMode = 0;
@@ -321,146 +321,81 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Reply_GimbalPitchAngle(int angle) @@ -321,146 +321,81 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Reply_GimbalPitchAngle(int angle)
321 //------------------------------------------------------------------------------------------------------------------------------------------------- 321 //-------------------------------------------------------------------------------------------------------------------------------------------------
322 //------------------------------------------------------------------------------------------------------------------------------------------------- 322 //-------------------------------------------------------------------------------------------------------------------------------------------------
323 323
324 -// psdk上一曲  
325 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_LastSong(int wheather_control)  
326 -{  
327 - T_JZsdkReturnCode ret;  
328 -  
329 - // 开启实时喊话时,锁定该功能  
330 - if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)  
331 - {  
332 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
333 - }  
334 -  
335 - // 将控件界面的播放开关打开  
336 - UI_control_WidgetSet(PSDK_UI_WIDGET_PLAYSTATUS, 0);  
337 -  
338 - // 将ttsSpeaker的开关关闭  
339 - UI_control_WidgetSet(PSDK_UI_SECONDARY_WIDGET_PLAYSTATUS, 0);  
340 -  
341 - // 如果有进行控制,不只是改控件  
342 - if (wheather_control == 1)  
343 - {  
344 - ret = UIcontrol_LastSong(DEVICE_PSDK);  
345 - return ret;  
346 - }  
347 -}  
348 -// psdk下一曲  
349 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_NextSong(int wheather_control)  
350 -{  
351 - T_JZsdkReturnCode ret;  
352 -  
353 - // 开启实时喊话时,锁定该功能  
354 - if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)  
355 - {  
356 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
357 - }  
358 -  
359 - // 将控件界面的播放开关打开  
360 - UI_control_WidgetSet(PSDK_UI_WIDGET_PLAYSTATUS, 0);  
361 -  
362 - // 将ttsSpeaker的开关关闭  
363 - UI_control_WidgetSet(PSDK_UI_SECONDARY_WIDGET_PLAYSTATUS, 0);  
364 -  
365 - // 如果有进行控制,不只是改控件  
366 - if (wheather_control == 1)  
367 - {  
368 - ret = UIcontrol_NextSong(DEVICE_PSDK);  
369 - return ret;  
370 - }  
371 -}  
372 -  
373 -// psdk播放当前歌曲  
374 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_PlaySong(int wheather_control)  
375 -{  
376 - T_JZsdkReturnCode ret;  
377 -  
378 - // 开启实时喊话时,锁定该功能  
379 - if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)  
380 - {  
381 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
382 - }  
383 -  
384 - char MusicName[256];  
385 - int MusicNameLen;  
386 -  
387 - // 将控件界面的播放开关打开  
388 - UI_control_WidgetSet(PSDK_UI_WIDGET_PLAYSTATUS, 0); 324 +// // psdk下一曲
  325 +// T_JZsdkReturnCode JZsdk_Psdk_UI_io_NextSong(int wheather_control)
  326 +// {
  327 +// T_JZsdkReturnCode ret;
  328 +
  329 +// // 开启实时喊话时,锁定该功能
  330 +// if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)
  331 +// {
  332 +// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  333 +// }
  334 +
  335 +// // 将控件界面的播放开关打开
  336 +// UI_control_WidgetSet(PSDK_UI_WIDGET_PLAYSTATUS, 0);
  337 +
  338 +// // 将ttsSpeaker的开关关闭
  339 +// UI_control_WidgetSet(PSDK_UI_SECONDARY_WIDGET_PLAYSTATUS, 0);
  340 +
  341 +// // 如果有进行控制,不只是改控件
  342 +// if (wheather_control == 1)
  343 +// {
  344 +// ret = UIcontrol_NextSong(DEVICE_PSDK);
  345 +// return ret;
  346 +// }
  347 +// }
  348 +
  349 +// // psdk播放当前歌曲
  350 +// T_JZsdkReturnCode JZsdk_Psdk_UI_io_PlaySong(int wheather_control)
  351 +// {
  352 +// T_JZsdkReturnCode ret;
  353 +
  354 +// // 开启实时喊话时,锁定该功能
  355 +// if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)
  356 +// {
  357 +// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  358 +// }
  359 +
  360 +// char MusicName[256];
  361 +// int MusicNameLen;
  362 +
  363 +// // 将控件界面的播放开关打开
  364 +// UI_control_WidgetSet(PSDK_UI_WIDGET_PLAYSTATUS, 0);
389 365
390 - // 将ttsSpeaker的开关关闭  
391 - UI_control_WidgetSet(PSDK_UI_SECONDARY_WIDGET_PLAYSTATUS, 0);  
392 -  
393 - // 如果有进行控制,不只是改控件  
394 - if (wheather_control == 1)  
395 - {  
396 -#ifdef MEGAPHONE_CONFIG_STATUS_ON  
397 - // 获取当前播放的歌曲名字  
398 - Megaphone_get_play_FileName(MusicName, &MusicNameLen);  
399 -  
400 - // 播放歌曲  
401 - ret = UIcontrol_PlayAudioFile(DEVICE_PSDK,MusicName, MusicNameLen);  
402 - return ret;  
403 -#endif  
404 - }  
405 -}  
406 -  
407 -// psdk 音频 继续播放/暂停  
408 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_Audio_PauseAndPlayContinue(int wheather_control, int value)  
409 -{  
410 - // 开启实时喊话时,锁定该功能  
411 - if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)  
412 - {  
413 - UI_control_WidgetSet(PSDK_UI_WIDGET_PLAYSTATUS, value);  
414 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
415 - }  
416 -  
417 - if (value == JZ_FLAGCODE_ON)  
418 - {  
419 - // 将控件界面的播放开关 转化为打开  
420 - UI_control_WidgetSet(PSDK_UI_WIDGET_PLAYSTATUS, 0);  
421 -  
422 - // 将ttsSpeaker的开关关闭  
423 - UI_control_WidgetSet(PSDK_UI_SECONDARY_WIDGET_PLAYSTATUS, 0);  
424 -  
425 - // 如果有进行控制,不只是改控件  
426 - if (wheather_control == 1)  
427 - {  
428 - return UIcontrol_ContinuePlayAudio(DEVICE_PSDK);  
429 - }  
430 - }  
431 - else if (value == JZ_FLAGCODE_OFF)  
432 - {  
433 - // 将控件界面的播放开关 转化为关闭  
434 - UI_control_WidgetSet(PSDK_UI_WIDGET_PLAYSTATUS, 1);  
435 -  
436 - // 将ttsSpeaker的开关关闭  
437 - UI_control_WidgetSet(PSDK_UI_SECONDARY_WIDGET_PLAYSTATUS, 0);  
438 -  
439 - // 如果有进行控制,不只是改控件  
440 - if (wheather_control == 1)  
441 - {  
442 - return UIcontrol_PausePlayAudio(DEVICE_PSDK);  
443 - }  
444 - }  
445 -  
446 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
447 -}  
448 -  
449 -// 关闭喊话器所有音频  
450 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_StopPlayAudio()  
451 -{  
452 - // 开启实时喊话时,锁定该功能  
453 - if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)  
454 - {  
455 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
456 - }  
457 -  
458 - UI_control_WidgetSet(PSDK_UI_WIDGET_PLAYSTATUS, 1);  
459 - UI_control_WidgetSet(PSDK_UI_SECONDARY_WIDGET_PLAYSTATUS,0);  
460 - T_JZsdkReturnCode ret;  
461 - ret = UIcontrol_StopPlayAudio(DEVICE_PSDK);  
462 - return ret;  
463 -} 366 +// // 将ttsSpeaker的开关关闭
  367 +// UI_control_WidgetSet(PSDK_UI_SECONDARY_WIDGET_PLAYSTATUS, 0);
  368 +
  369 +// // 如果有进行控制,不只是改控件
  370 +// if (wheather_control == 1)
  371 +// {
  372 +// #ifdef MEGAPHONE_CONFIG_STATUS_ON
  373 +// // 获取当前播放的歌曲名字
  374 +// Megaphone_get_play_FileName(MusicName, &MusicNameLen);
  375 +
  376 +// // 播放歌曲
  377 +// ret = UIcontrol_PlayAudioFile(DEVICE_PSDK,MusicName, MusicNameLen);
  378 +// return ret;
  379 +// #endif
  380 +// }
  381 +// }
  382 +
  383 +
  384 +// // 关闭喊话器所有音频
  385 +// T_JZsdkReturnCode JZsdk_Psdk_UI_io_StopPlayAudio()
  386 +// {
  387 +// // 开启实时喊话时,锁定该功能
  388 +// if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)
  389 +// {
  390 +// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  391 +// }
  392 +
  393 +// UI_control_WidgetSet(PSDK_UI_WIDGET_PLAYSTATUS, 1);
  394 +// UI_control_WidgetSet(PSDK_UI_SECONDARY_WIDGET_PLAYSTATUS,0);
  395 +// T_JZsdkReturnCode ret;
  396 +// ret = UIcontrol_StopPlayAudio(DEVICE_PSDK);
  397 +// return ret;
  398 +// }
464 399
465 400
466 /********* 401 /*********
@@ -519,283 +454,283 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetVolume(int wheather_control, int value) @@ -519,283 +454,283 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetVolume(int wheather_control, int value)
519 } 454 }
520 } 455 }
521 456
522 -//psdk 变量获取tts语速  
523 -int JZsdk_Psdk_UI_io_GetTTSSpeed_ByValue(int value)  
524 -{  
525 - switch (value)  
526 - {  
527 - case 0:  
528 - return 25;  
529 - break;  
530 - case 1:  
531 - return 50;  
532 - break;  
533 - case 2:  
534 - return 75;  
535 - break;  
536 - case 3:  
537 - return 100;  
538 - break;  
539 - default:  
540 - break;  
541 - }  
542 -}  
543 -  
544 -// psdkTTS语速 0-100 25 50 75 100  
545 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_speed(int wheather_control, int speed)  
546 -{  
547 - T_JZsdkReturnCode ret;  
548 - int value;  
549 -  
550 - if (speed >=0 && speed <=25 )  
551 - {  
552 - value = 0;  
553 - }  
554 - else if (speed > 25 && speed <= 50)  
555 - {  
556 - value = 1;  
557 - }  
558 - else if (speed > 50 && speed <= 75)  
559 - {  
560 - value = 2;  
561 - }  
562 - else if (speed > 75 && speed <= 100)  
563 - {  
564 - value = 3;  
565 - } 457 +// //psdk 变量获取tts语速
  458 +// int JZsdk_Psdk_UI_io_GetTTSSpeed_ByValue(int value)
  459 +// {
  460 +// switch (value)
  461 +// {
  462 +// case 0:
  463 +// return 25;
  464 +// break;
  465 +// case 1:
  466 +// return 50;
  467 +// break;
  468 +// case 2:
  469 +// return 75;
  470 +// break;
  471 +// case 3:
  472 +// return 100;
  473 +// break;
  474 +// default:
  475 +// break;
  476 +// }
  477 +// }
  478 +
  479 +// // psdkTTS语速 0-100 25 50 75 100
  480 +// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_speed(int wheather_control, int speed)
  481 +// {
  482 +// T_JZsdkReturnCode ret;
  483 +// int value;
  484 +
  485 +// if (speed >=0 && speed <=25 )
  486 +// {
  487 +// value = 0;
  488 +// }
  489 +// else if (speed > 25 && speed <= 50)
  490 +// {
  491 +// value = 1;
  492 +// }
  493 +// else if (speed > 50 && speed <= 75)
  494 +// {
  495 +// value = 2;
  496 +// }
  497 +// else if (speed > 75 && speed <= 100)
  498 +// {
  499 +// value = 3;
  500 +// }
566 501
567 - // 调整控件  
568 - UI_control_WidgetSet(PSDK_UI_WIDGET_SPEED, value);  
569 -  
570 - // 如果有进行控制,不只是改控件  
571 - if (wheather_control == 1)  
572 - {  
573 - ret = UIcontrol_Set_TTS_speed(DEVICE_PSDK, speed);  
574 - return ret;  
575 - }  
576 -}  
577 -  
578 -  
579 -//psdk 变量获取tts音色  
580 -int JZsdk_Psdk_UI_io_GetTTSTone_ByValue(int value)  
581 -{  
582 - E_LanguageInfo LanguageInfo = LanguageInfo_Get_LanguageInfo();  
583 - if (LanguageInfo == LANGUAGE_INFO_CHINESE)  
584 - {  
585 - switch (value)  
586 - {  
587 - case 0:  
588 - return 0x01;  
589 - break;  
590 - case 1:  
591 - return 0x02;  
592 - break;  
593 - case 2:  
594 - return 0x11;  
595 - break;  
596 - case 3:  
597 - return 0x12;  
598 - break;  
599 - case 4:  
600 - return 0x31;  
601 - break;  
602 - case 5:  
603 - return 0x32;  
604 - break;  
605 - case 6:  
606 - return 0x33;  
607 - break;  
608 - case 7:  
609 - return 0x34;  
610 - break;  
611 - case 8:  
612 - return 0x35;  
613 - break;  
614 - case 9:  
615 - return 0x36;  
616 - break;  
617 - default:  
618 - return 0x01;  
619 - break;  
620 - }  
621 -  
622 - } 502 +// // 调整控件
  503 +// UI_control_WidgetSet(PSDK_UI_WIDGET_SPEED, value);
  504 +
  505 +// // 如果有进行控制,不只是改控件
  506 +// if (wheather_control == 1)
  507 +// {
  508 +// ret = UIcontrol_Set_TTS_speed(DEVICE_PSDK, speed);
  509 +// return ret;
  510 +// }
  511 +// }
  512 +
  513 +
  514 +// //psdk 变量获取tts音色
  515 +// int JZsdk_Psdk_UI_io_GetTTSTone_ByValue(int value)
  516 +// {
  517 +// E_LanguageInfo LanguageInfo = LanguageInfo_Get_LanguageInfo();
  518 +// if (LanguageInfo == LANGUAGE_INFO_CHINESE)
  519 +// {
  520 +// switch (value)
  521 +// {
  522 +// case 0:
  523 +// return 0x01;
  524 +// break;
  525 +// case 1:
  526 +// return 0x02;
  527 +// break;
  528 +// case 2:
  529 +// return 0x11;
  530 +// break;
  531 +// case 3:
  532 +// return 0x12;
  533 +// break;
  534 +// case 4:
  535 +// return 0x31;
  536 +// break;
  537 +// case 5:
  538 +// return 0x32;
  539 +// break;
  540 +// case 6:
  541 +// return 0x33;
  542 +// break;
  543 +// case 7:
  544 +// return 0x34;
  545 +// break;
  546 +// case 8:
  547 +// return 0x35;
  548 +// break;
  549 +// case 9:
  550 +// return 0x36;
  551 +// break;
  552 +// default:
  553 +// return 0x01;
  554 +// break;
  555 +// }
  556 +
  557 +// }
623 558
624 - else  
625 - {  
626 - switch (value)  
627 - {  
628 - case 0:  
629 - return 0x11;  
630 - break;  
631 - case 1:  
632 - return 0x12;  
633 - break;  
634 - case 2:  
635 - return 0x01;  
636 - break;  
637 - case 3:  
638 - return 0x02;  
639 - break;  
640 - case 4:  
641 - return 0x41;  
642 - break;  
643 - case 5:  
644 - return 0x42;  
645 - break;  
646 - case 6:  
647 - return 0x43;  
648 - break;  
649 - case 7:  
650 - return 0x44;  
651 - break;  
652 - case 8:  
653 - return 0x45;  
654 - break;  
655 - case 9:  
656 - return 0x46;  
657 - break;  
658 - case 10:  
659 - return 0x47;  
660 - break;  
661 - case 11:  
662 - return 0x48;  
663 - break; 559 +// else
  560 +// {
  561 +// switch (value)
  562 +// {
  563 +// case 0:
  564 +// return 0x11;
  565 +// break;
  566 +// case 1:
  567 +// return 0x12;
  568 +// break;
  569 +// case 2:
  570 +// return 0x01;
  571 +// break;
  572 +// case 3:
  573 +// return 0x02;
  574 +// break;
  575 +// case 4:
  576 +// return 0x41;
  577 +// break;
  578 +// case 5:
  579 +// return 0x42;
  580 +// break;
  581 +// case 6:
  582 +// return 0x43;
  583 +// break;
  584 +// case 7:
  585 +// return 0x44;
  586 +// break;
  587 +// case 8:
  588 +// return 0x45;
  589 +// break;
  590 +// case 9:
  591 +// return 0x46;
  592 +// break;
  593 +// case 10:
  594 +// return 0x47;
  595 +// break;
  596 +// case 11:
  597 +// return 0x48;
  598 +// break;
664 599
665 - default:  
666 - return 0x11;  
667 - break;  
668 - }  
669 - } 600 +// default:
  601 +// return 0x11;
  602 +// break;
  603 +// }
  604 +// }
670 605
671 -}  
672 -  
673 -// psdkTTS音色 10个音色  
674 -// 要分国内版和海外版  
675 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_tone(int wheather_control, int tone)  
676 -{  
677 -  
678 - T_JZsdkReturnCode ret;  
679 - int value;  
680 - E_LanguageInfo LanguageInfo = LanguageInfo_Get_LanguageInfo();  
681 - if (LanguageInfo == LANGUAGE_INFO_CHINESE)  
682 - {  
683 - switch (tone)  
684 - {  
685 - case 0x01:  
686 - value = 0;  
687 - break;  
688 -  
689 - case 0x02:  
690 - value = 1;  
691 - break;  
692 -  
693 - case 0x11:  
694 - value = 2;  
695 - break;  
696 -  
697 - case 0x12:  
698 - value = 3;  
699 - break;  
700 -  
701 - case 0x31:  
702 - value = 4;  
703 - break;  
704 -  
705 - case 0x32:  
706 - value = 5;  
707 - break;  
708 -  
709 - case 0x33:  
710 - value = 6;  
711 - break;  
712 -  
713 - case 0x34:  
714 - value = 7;  
715 - break;  
716 -  
717 - case 0x35:  
718 - value = 8;  
719 - break;  
720 -  
721 - case 0x36:  
722 - value = 9;  
723 - break;  
724 -  
725 - default:  
726 - printf("无效的tts设置\n");  
727 - return JZ_ERRORCODE_TTS_INVALID_TONE;  
728 - break;  
729 - }  
730 - }  
731 - else {  
732 - switch (tone)  
733 - {  
734 - case 0x01:  
735 - value = 2;  
736 - break;  
737 -  
738 - case 0x02:  
739 - value = 3;  
740 - break;  
741 -  
742 - case 0x11:  
743 - value = 0;  
744 - break;  
745 -  
746 - case 0x12:  
747 - value = 1;  
748 - break;  
749 -  
750 - case 0x41://俄 russian ru  
751 - value = 4;  
752 - break;  
753 -  
754 - case 0x42://法 french fr-fr  
755 - value = 5;  
756 - break;  
757 -  
758 - case 0x43://德 german de  
759 - value = 6;  
760 - break;  
761 -  
762 - case 0x44://韩 ko  
763 - value = 7;  
764 - break;  
765 -  
766 - case 0x45://意大利 italian it  
767 - value = 8;  
768 - break;  
769 -  
770 - case 0x46://波兰 polish pl  
771 - value = 9;  
772 - break;  
773 -  
774 - case 0x47://西班牙 spanish es  
775 - value = 10;  
776 - break;  
777 -  
778 - case 0x48://葡萄牙 portugal pt-pt  
779 - value = 11;  
780 - break;  
781 -  
782 - default:  
783 - printf("无效的tts设置\n");  
784 - return JZ_ERRORCODE_TTS_INVALID_TONE;  
785 - break;  
786 - }  
787 - }  
788 - // 将控件界面的播放开关 转化为关闭  
789 - ret = UI_control_WidgetSet(PSDK_UI_WIDGET_TONE, value);  
790 -  
791 - // 如果有进行控制,不只是改控件  
792 - if (wheather_control == 1)  
793 - {  
794 - return UIcontrol_Set_TTS_tone(DEVICE_PSDK,tone);  
795 - }  
796 -  
797 - return ret;  
798 -} 606 +// }
  607 +
  608 +// // psdkTTS音色 10个音色
  609 +// // 要分国内版和海外版
  610 +// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_tone(int wheather_control, int tone)
  611 +// {
  612 +
  613 +// T_JZsdkReturnCode ret;
  614 +// int value;
  615 +// E_LanguageInfo LanguageInfo = LanguageInfo_Get_LanguageInfo();
  616 +// if (LanguageInfo == LANGUAGE_INFO_CHINESE)
  617 +// {
  618 +// switch (tone)
  619 +// {
  620 +// case 0x01:
  621 +// value = 0;
  622 +// break;
  623 +
  624 +// case 0x02:
  625 +// value = 1;
  626 +// break;
  627 +
  628 +// case 0x11:
  629 +// value = 2;
  630 +// break;
  631 +
  632 +// case 0x12:
  633 +// value = 3;
  634 +// break;
  635 +
  636 +// case 0x31:
  637 +// value = 4;
  638 +// break;
  639 +
  640 +// case 0x32:
  641 +// value = 5;
  642 +// break;
  643 +
  644 +// case 0x33:
  645 +// value = 6;
  646 +// break;
  647 +
  648 +// case 0x34:
  649 +// value = 7;
  650 +// break;
  651 +
  652 +// case 0x35:
  653 +// value = 8;
  654 +// break;
  655 +
  656 +// case 0x36:
  657 +// value = 9;
  658 +// break;
  659 +
  660 +// default:
  661 +// printf("无效的tts设置\n");
  662 +// return JZ_ERRORCODE_TTS_INVALID_TONE;
  663 +// break;
  664 +// }
  665 +// }
  666 +// else {
  667 +// switch (tone)
  668 +// {
  669 +// case 0x01:
  670 +// value = 2;
  671 +// break;
  672 +
  673 +// case 0x02:
  674 +// value = 3;
  675 +// break;
  676 +
  677 +// case 0x11:
  678 +// value = 0;
  679 +// break;
  680 +
  681 +// case 0x12:
  682 +// value = 1;
  683 +// break;
  684 +
  685 +// case 0x41://俄 russian ru
  686 +// value = 4;
  687 +// break;
  688 +
  689 +// case 0x42://法 french fr-fr
  690 +// value = 5;
  691 +// break;
  692 +
  693 +// case 0x43://德 german de
  694 +// value = 6;
  695 +// break;
  696 +
  697 +// case 0x44://韩 ko
  698 +// value = 7;
  699 +// break;
  700 +
  701 +// case 0x45://意大利 italian it
  702 +// value = 8;
  703 +// break;
  704 +
  705 +// case 0x46://波兰 polish pl
  706 +// value = 9;
  707 +// break;
  708 +
  709 +// case 0x47://西班牙 spanish es
  710 +// value = 10;
  711 +// break;
  712 +
  713 +// case 0x48://葡萄牙 portugal pt-pt
  714 +// value = 11;
  715 +// break;
  716 +
  717 +// default:
  718 +// printf("无效的tts设置\n");
  719 +// return JZ_ERRORCODE_TTS_INVALID_TONE;
  720 +// break;
  721 +// }
  722 +// }
  723 +// // 将控件界面的播放开关 转化为关闭
  724 +// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_TONE, value);
  725 +
  726 +// // 如果有进行控制,不只是改控件
  727 +// if (wheather_control == 1)
  728 +// {
  729 +// return UIcontrol_Set_TTS_tone(DEVICE_PSDK,tone);
  730 +// }
  731 +
  732 +// return ret;
  733 +// }
799 734
800 // psdk追加音色 0 1 2 735 // psdk追加音色 0 1 2
801 T_JZsdkReturnCode JZsdk_Psdk_UI_io_AppendTone(int wheather_control, int value) 736 T_JZsdkReturnCode JZsdk_Psdk_UI_io_AppendTone(int wheather_control, int value)
@@ -1063,69 +998,69 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_SearchLightLumen(int wheather_control,int @@ -1063,69 +998,69 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_SearchLightLumen(int wheather_control,int
1063 return ret; 998 return ret;
1064 } 999 }
1065 1000
1066 -//警灯模式 0 关 1交替快闪 2交替满闪 3交替齐闪  
1067 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightMode(int wheather_control, int value)  
1068 -{  
1069 - T_JZsdkReturnCode ret; 1001 +// //警灯模式 0 关 1交替快闪 2交替满闪 3交替齐闪
  1002 +// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightMode(int wheather_control, int value)
  1003 +// {
  1004 +// T_JZsdkReturnCode ret;
1070 1005
1071 - //控件值 0 关闭 1快闪 2 满闪 3齐闪  
1072 -  
1073 - int mode = 0;  
1074 - int Switch = 0;  
1075 - if (value >= 1)  
1076 - {  
1077 - mode = value - 1;  
1078 - Switch = 1;  
1079 - }  
1080 - else  
1081 - {  
1082 - Switch = 0;  
1083 - mode = 0;  
1084 - } 1006 +// //控件值 0 关闭 1快闪 2 满闪 3齐闪
  1007 +
  1008 +// int mode = 0;
  1009 +// int Switch = 0;
  1010 +// if (value >= 1)
  1011 +// {
  1012 +// mode = value - 1;
  1013 +// Switch = 1;
  1014 +// }
  1015 +// else
  1016 +// {
  1017 +// Switch = 0;
  1018 +// mode = 0;
  1019 +// }
1085 1020
1086 - ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_MODE, value); 1021 +// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_MODE, value);
1087 1022
1088 - if (wheather_control == JZ_FLAGCODE_ON)  
1089 - {  
1090 - ret = UIcontrol_Set_WarningLight_ModeControl(DEVICE_PSDK, Switch, mode);  
1091 - } 1023 +// if (wheather_control == JZ_FLAGCODE_ON)
  1024 +// {
  1025 +// ret = UIcontrol_Set_WarningLight_ModeControl(DEVICE_PSDK, Switch, mode);
  1026 +// }
1092 1027
1093 - return ret;  
1094 -} 1028 +// return ret;
  1029 +// }
1095 1030
1096 -//警灯颜色1  
1097 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(int wheather_control, int value)  
1098 -{  
1099 - T_JZsdkReturnCode ret; 1031 +// //警灯颜色1
  1032 +// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(int wheather_control, int value)
  1033 +// {
  1034 +// T_JZsdkReturnCode ret;
1100 1035
1101 - ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_FIRSTCOLOR, (value-1)); 1036 +// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_FIRSTCOLOR, (value-1));
1102 1037
1103 - FirstWarningLight = value; 1038 +// FirstWarningLight = value;
1104 1039
1105 - if (wheather_control == JZ_FLAGCODE_ON)  
1106 - {  
1107 - ret = UIcontrol_Set_WarningLight_Color(DEVICE_PSDK, FirstWarningLight, SecondWarningLight);  
1108 - } 1040 +// if (wheather_control == JZ_FLAGCODE_ON)
  1041 +// {
  1042 +// ret = UIcontrol_Set_WarningLight_Color(DEVICE_PSDK, FirstWarningLight, SecondWarningLight);
  1043 +// }
1109 1044
1110 - return ret;  
1111 -} 1045 +// return ret;
  1046 +// }
1112 1047
1113 -//警灯颜色2  
1114 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(int wheather_control, int value)  
1115 -{  
1116 - T_JZsdkReturnCode ret; 1048 +// //警灯颜色2
  1049 +// T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(int wheather_control, int value)
  1050 +// {
  1051 +// T_JZsdkReturnCode ret;
1117 1052
1118 - ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_SECONDCOLOR, (value-1)); 1053 +// ret = UI_control_WidgetSet(PSDK_UI_WIDGET_WARNINGLIGHT_SECONDCOLOR, (value-1));
1119 1054
1120 - SecondWarningLight = value; 1055 +// SecondWarningLight = value;
1121 1056
1122 - if (wheather_control == JZ_FLAGCODE_ON)  
1123 - {  
1124 - ret = UIcontrol_Set_WarningLight_Color(DEVICE_PSDK, FirstWarningLight, SecondWarningLight);  
1125 - } 1057 +// if (wheather_control == JZ_FLAGCODE_ON)
  1058 +// {
  1059 +// ret = UIcontrol_Set_WarningLight_Color(DEVICE_PSDK, FirstWarningLight, SecondWarningLight);
  1060 +// }
1126 1061
1127 - return ret;  
1128 -} 1062 +// return ret;
  1063 +// }
1129 1064
1130 // 设置云台最大值 1065 // 设置云台最大值
1131 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_MAXGimbalRangen() 1066 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_MAXGimbalRangen()
@@ -1639,31 +1574,31 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_IrcMarkLowAndHighTemp(int wheather_ChangeWidg @@ -1639,31 +1574,31 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_IrcMarkLowAndHighTemp(int wheather_ChangeWidg
1639 * 1574 *
1640 * 侧面激光模式 1575 * 侧面激光模式
1641 * 1576 *
1642 -**********/  
1643 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_SideLaserMode(int wheather_ChangeWidget, int wheather_control, int value)  
1644 -{  
1645 - //如果修改控件  
1646 - if (wheather_ChangeWidget == JZ_FLAGCODE_ON)  
1647 - {  
1648 - UI_control_WidgetSet(JZSDK_WIDGET_SIDE_LASER_MODE, value);  
1649 - }  
1650 -  
1651 - //如果进行控制  
1652 - if (wheather_control == JZ_FLAGCODE_ON)  
1653 - {  
1654 - if (value == 0)  
1655 - {  
1656 - UIcontrol_SideLaser_SetControl(DEVICE_PSDK, JZ_FLAGCODE_OFF);  
1657 - }  
1658 - else  
1659 - {  
1660 - UIcontrol_SideLaser_SetMode(DEVICE_PSDK, value);  
1661 - UIcontrol_SideLaser_SetControl(DEVICE_PSDK, JZ_FLAGCODE_ON);  
1662 - }  
1663 - }  
1664 -  
1665 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
1666 -} 1577 +// **********/
  1578 +// T_JZsdkReturnCode JZsdk_Psdk_UI_io_SideLaserMode(int wheather_ChangeWidget, int wheather_control, int value)
  1579 +// {
  1580 +// //如果修改控件
  1581 +// if (wheather_ChangeWidget == JZ_FLAGCODE_ON)
  1582 +// {
  1583 +// UI_control_WidgetSet(JZSDK_WIDGET_SIDE_LASER_MODE, value);
  1584 +// }
  1585 +
  1586 +// //如果进行控制
  1587 +// if (wheather_control == JZ_FLAGCODE_ON)
  1588 +// {
  1589 +// if (value == 0)
  1590 +// {
  1591 +// UIcontrol_SideLaser_SetControl(DEVICE_PSDK, JZ_FLAGCODE_OFF);
  1592 +// }
  1593 +// else
  1594 +// {
  1595 +// UIcontrol_SideLaser_SetMode(DEVICE_PSDK, value);
  1596 +// UIcontrol_SideLaser_SetControl(DEVICE_PSDK, JZ_FLAGCODE_ON);
  1597 +// }
  1598 +// }
  1599 +
  1600 +// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  1601 +// }
1667 1602
1668 /*******************************************************8**************************************************** 1603 /*******************************************************8****************************************************
1669 * 1604 *
@@ -173,7 +173,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_AutoBadPixelCorrectMode(int wheather_Chan @@ -173,7 +173,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_AutoBadPixelCorrectMode(int wheather_Chan
173 T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetPowerStatus(int value); 173 T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetPowerStatus(int value);
174 174
175 //侧面激光 175 //侧面激光
176 -T_JZsdkReturnCode JZsdk_Psdk_UI_io_SideLaserMode(int wheather_ChangeWidget, int wheather_control, int value); 176 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_SideLaserMode(int wheather_control, int value);
177 177
178 178
179 //获取控件的实时opus模式是否开启 179 //获取控件的实时opus模式是否开启
  1 +#include "JZsdkLib.h"
  2 +#include "UI_control/Psdk_ui_value_menu.h"
  3 +#include "UI_control/UI_control.h"
  4 +
  5 +#include "version_choose.h"
  6 +#include "UI_control/Psdk_UI_io.h"
  7 +
  8 +#ifdef WARNLIGHT_STATUS_ON
  9 + #include "WarnLight/WarnLight.h"
  10 +#endif
  11 +
  12 +#ifdef SIDE_LASER_STATUS_ON
  13 + #include "SideLaser/SideLaser.h"
  14 +#endif
  15 +
  16 +//警灯颜色
  17 +static int FirstWarningLight = 1;
  18 +static int SecondWarningLight = 3;
  19 +
  20 +//播放上一首歌曲
  21 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_LastSong(int wheather_control)
  22 +{
  23 + T_JZsdkReturnCode ret =JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  24 +
  25 + // 开启实时喊话时,锁定该功能
  26 + if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)
  27 + {
  28 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  29 + }
  30 +
  31 + //将播放状态给到psdk ui
  32 + JZsdk_PsdkUi_value_set(JZSDK_WIDGET_PLAYANDSTOP, JZ_FLAGCODE_ON);
  33 +
  34 + if(wheather_control == JZ_FLAGCODE_ON)
  35 + {
  36 + //将播放上一首歌曲的命令发送到UIcontrol
  37 + ret = UIcontrol_LastSong(DEVICE_PSDK);
  38 + }
  39 +
  40 + return ret;
  41 +}
  42 +
  43 +//播放下一首歌曲
  44 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_NextSong(int wheather_control)
  45 +{
  46 + T_JZsdkReturnCode ret =JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  47 +
  48 + // 开启实时喊话时,锁定该功能
  49 + if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)
  50 + {
  51 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  52 + }
  53 +
  54 + //将播放状态给到psdk ui
  55 + JZsdk_PsdkUi_value_set(JZSDK_WIDGET_PLAYANDSTOP, JZ_FLAGCODE_ON);
  56 +
  57 + // 如果有进行控制,不只是改控件
  58 + if (wheather_control == 1)
  59 + {
  60 + ret = UIcontrol_NextSong(DEVICE_PSDK);
  61 + return ret;
  62 + }
  63 +
  64 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  65 +}
  66 +
  67 +//播放暂停
  68 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_Audio_PauseAndPlayContinue(int wheather_control, int value)
  69 +{
  70 + T_JZsdkReturnCode ret =JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  71 +
  72 + // 开启实时喊话时,锁定该功能
  73 + if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)
  74 + {
  75 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  76 + }
  77 +
  78 + JZsdk_PsdkUi_value_set(JZSDK_WIDGET_PLAYANDSTOP, value);
  79 +
  80 + if(wheather_control == JZ_FLAGCODE_ON)
  81 + {
  82 + if (value == JZ_FLAGCODE_ON)
  83 + {
  84 + ret = UIcontrol_ContinuePlayAudio(DEVICE_PSDK);
  85 + }
  86 + else
  87 + {
  88 + ret = UIcontrol_PausePlayAudio(DEVICE_PSDK);
  89 + }
  90 + }
  91 +
  92 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  93 +}
  94 +
  95 +
  96 +// 关闭喊话器所有音频
  97 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_StopPlayAudio()
  98 +{
  99 + // 开启实时喊话时,锁定该功能
  100 + if (Get_UI_Widget_OpusRealTimeMode() == JZ_FLAGCODE_ON)
  101 + {
  102 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  103 + }
  104 +
  105 + JZsdk_PsdkUi_value_set(JZSDK_WIDGET_PLAYANDSTOP, JZ_FLAGCODE_OFF);
  106 +
  107 + T_JZsdkReturnCode ret;
  108 + ret = UIcontrol_StopPlayAudio(DEVICE_PSDK);
  109 + return ret;
  110 +}
  111 +
  112 +// T_JZsdkReturnCode JZsdk_Psdk_UI_io_SetVolume(int wheather_control, int value)
  113 +// {
  114 +// //后续需要优化掉
  115 +// widget_volume = value;
  116 +
  117 +// //控件变化
  118 +// JZsdk_PsdkUi_value_set(JZSDK_WIDGET_VOLUME, value);
  119 +
  120 +// //将音量控制值发送到UIcontrol 用于控制设备
  121 +// if(wheather_control == JZ_FLAGCODE_ON)
  122 +// {
  123 +// UIcontrol_SetVolume(DEVICE_PSDK, value, JZ_FLAGCODE_ON);
  124 +// }
  125 +
  126 +// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  127 +// }
  128 +
  129 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_speed(int wheather_control, int speed)
  130 +{
  131 + //将TTS速度的控件变化给到psdk ui
  132 + JZsdk_PsdkUi_value_set(JZSDK_WIDGET_TTS_SPEED, speed);
  133 +
  134 + if (wheather_control == JZ_FLAGCODE_ON)
  135 + {
  136 + //将TTS速度的命令发送到UIcontrol
  137 + UIcontrol_Set_TTS_speed(DEVICE_PSDK, speed);
  138 + }
  139 +
  140 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  141 +}
  142 +
  143 +// psdkTTS音色 10个音色
  144 +// 要分国内版和海外版
  145 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_TTS_tone(int wheather_control, int tone)
  146 +{
  147 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  148 +
  149 + // 将控件界面的播放开关 转化为关闭
  150 + JZsdk_PsdkUi_value_set(JZSDK_WIDGET_TTS_TONE, tone);
  151 +
  152 + // 如果有进行控制,不只是改控件
  153 + if (wheather_control == 1)
  154 + {
  155 + ret = UIcontrol_Set_TTS_tone(DEVICE_PSDK,tone);
  156 + }
  157 +
  158 + return ret;
  159 +}
  160 +
  161 +/*
  162 + 侧面激光 0 关 1绿常亮 2红常亮 3齐亮 4齐闪 5交替闪
  163 + 这里传入的value是控件值,要将其转换为开关与模式再转到uicontrol
  164 +*/
  165 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_SideLaserMode(int wheather_control, int value)
  166 +{
  167 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  168 +
  169 + ret = JZsdk_PsdkUi_value_set(JZSDK_WIDGET_SIDE_LASER_MODE, value);
  170 +
  171 +#ifdef SIDE_LASER_STATUS_ON
  172 + if (wheather_control == JZ_FLAGCODE_ON)
  173 + {
  174 + //获取模式
  175 + int mode = 0;
  176 + SideLaser_param(JZ_FLAGCODE_GET ,SIDELASER_MODE, &mode);
  177 +
  178 + if (value == 0)
  179 + {
  180 + UIcontrol_SideLaser_SetControl(DEVICE_PSDK, JZ_FLAGCODE_OFF);
  181 + }
  182 + else
  183 + {
  184 + mode = value - 1;
  185 + UIcontrol_SideLaser_SetMode(DEVICE_PSDK, mode);
  186 + UIcontrol_SideLaser_SetControl(DEVICE_PSDK, JZ_FLAGCODE_ON);
  187 + }
  188 + }
  189 +#endif
  190 +
  191 + return ret;
  192 +}
  193 +
  194 +/*
  195 + 警灯模式 0 关 1交替快闪 2交替满闪 3交替齐闪 4(同时快闪) 5(同时慢闪)
  196 + 这里传入的value是控件值,要将其转换为开关与模式再转到uicontrol
  197 +*/
  198 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightMode(int wheather_control, int value)
  199 +{
  200 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  201 +
  202 + ret = JZsdk_PsdkUi_value_set(JZSDK_WIDGET_WARNLIGHT_MODE, value);
  203 +
  204 +#ifdef WARNLIGHT_STATUS_ON
  205 +
  206 + if (wheather_control == JZ_FLAGCODE_ON)
  207 + {
  208 + T_JzWarnLightAttribute Attribute;
  209 + WarnLight_Get_Attribute(&Attribute);
  210 +
  211 + //将ui值转换为模式值
  212 + int Lswitch = 0;
  213 + int mode = 0;
  214 +
  215 + if (value == 0)
  216 + {
  217 + Lswitch = JZ_FLAGCODE_OFF;
  218 +
  219 + //去获取上次的模式
  220 + mode = Attribute.mode;
  221 + }
  222 + else
  223 + {
  224 + Lswitch = JZ_FLAGCODE_ON;
  225 + mode = value - 1;
  226 + }
  227 +
  228 + ret = UIcontrol_Set_WarningLight_ModeControl(DEVICE_PSDK, Lswitch, mode);
  229 + }
  230 +#endif
  231 + return ret;
  232 +}
  233 +
  234 +//警灯颜色1
  235 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(int wheather_control, int value)
  236 +{
  237 + T_JZsdkReturnCode ret;
  238 +
  239 + ret = JZsdk_PsdkUi_value_set(JZSDK_WIDGET_WARNLIGHT_COLOR_1, value);
  240 +
  241 + FirstWarningLight = value;
  242 +
  243 + if (wheather_control == JZ_FLAGCODE_ON)
  244 + {
  245 + ret = UIcontrol_Set_WarningLight_Color(DEVICE_PSDK, FirstWarningLight, SecondWarningLight);
  246 + }
  247 +
  248 + return ret;
  249 +}
  250 +
  251 +//警灯颜色2
  252 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(int wheather_control, int value)
  253 +{
  254 + T_JZsdkReturnCode ret;
  255 +
  256 + ret = JZsdk_PsdkUi_value_set(JZSDK_WIDGET_WARNLIGHT_COLOR_2, value);
  257 +
  258 + SecondWarningLight = value;
  259 +
  260 + if (wheather_control == JZ_FLAGCODE_ON)
  261 + {
  262 + ret = UIcontrol_Set_WarningLight_Color(DEVICE_PSDK, FirstWarningLight, SecondWarningLight);
  263 + }
  264 +
  265 + return ret;
  266 +}
1 -#include "Psdk_Ui.h"  
2 -#include "JZsdkLib.h"  
3 -#include "ExtensionAPI/JZsdk_ExpansionApi.h"  
4 -  
5 -  
6 -/****************  
7 - *  
8 - * 控件设置  
9 - *  
10 - * *************/  
11 -static T_JZsdkReturnCode UI_control_WidgetArraySet(int index, int value)  
12 -{  
13 - T_JZsdkToPsdkHandler *handle = ExpansionApi_JZsdkToPsdk_GetHandler();  
14 - if (handle != NULL && handle->Set_UI_Widget_Value != NULL)  
15 - {  
16 - //将控件值设置到psdk的ui控件  
17 - handle->Set_UI_Widget_Value(index, value);  
18 - }  
19 -}  
20 -  
21 -  
22 -/****************  
23 - *  
24 - * 二级控件设置  
25 - *  
26 - * *************/  
27 -static T_JZsdkReturnCode UI_control_SecondaryWidgetArraySet(int type, int value)  
28 -{  
29 - T_JZsdkToPsdkHandler *handle = ExpansionApi_JZsdkToPsdk_GetHandler();  
30 - if (handle == NULL)  
31 - {  
32 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
33 - }  
34 -  
35 - switch (type)  
36 - {  
37 -  
38 - case PSDK_UI_SECONDARY_WIDGET_PLAYSTATUS:  
39 - if (handle->Set_UI_SpeakerWidget_PlayState != NULL)  
40 - {  
41 - return handle->Set_UI_SpeakerWidget_PlayState(value);  
42 - }  
43 - break;  
44 -  
45 - case PSDK_UI_SECONDARY_WIDGET_LOOPPLAY:  
46 - if (handle->Set_UI_SpeakerWidget_LoopMode != NULL)  
47 - {  
48 - return handle->Set_UI_SpeakerWidget_LoopMode(value);  
49 - }  
50 - break;  
51 -  
52 - case JZSDK_WIDGET_VOLUME://音量  
53 - if (handle->Set_UI_SpeakerWidget_Volume != NULL)  
54 - {  
55 - return handle->Set_UI_SpeakerWidget_Volume(value);  
56 - }  
57 - break;  
58 -  
59 -  
60 - default:  
61 - break;  
62 - }  
63 -}  
64 -  
65 -static T_JZsdkReturnCode JZsdk_UI_DJIpsdk_Widget_set(JZsdk_Widget_Control index, int value)  
66 -{  
67 - switch (index)  
68 - {  
69 - case JZSDK_WIDGET_VOLUME:  
70 - {  
71 - //1、大疆音量控件需要去设置喊话器控件内的音量  
72 - UI_control_WidgetArraySet(3, value);  
73 - UI_control_WidgetArraySet(4, value);  
74 -  
75 - //2、大疆音量控件需要去设置悬浮窗的音量  
76 - UI_control_SecondaryWidgetArraySet(JZSDK_WIDGET_VOLUME, value);  
77 - }  
78 - break;  
79 -  
80 - default:  
81 - break;  
82 - }  
83 -}  
84 -T_JZsdkReturnCode JZsdk_UI_value_set(JZsdk_Widget_Control index, int value)  
85 -{  
86 - JZsdk_UI_DJIpsdk_Widget_set(index, value);  
87 -}  
  1 +#include "Psdk_ui_value_menu.h"
  2 +#include "JZsdkLib.h"
  3 +#include "DeviceInfo/DeviceInfo.h"
  4 +
  5 +#include "version_choose.h"
  6 +#include "JZsdkLib.h"
  7 +#include "ExtensionAPI/JZsdk_ExpansionApi.h"
  8 +
  9 +#ifdef IFLAY_TTS_1_CONFIG_STATUS_ON
  10 + static char Ify1_TTS_Value[10] = {0x00, 0x02, 0x11, 0x12, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36};
  11 +#endif
  12 +
  13 +#ifdef IFLAY_TTS_2_CONFIG_STATUS_ON
  14 + static char Ify2_TTS_Value[10] = {0x01, 0x02, 0x11, 0x12, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37};
  15 +#endif
  16 +
  17 +
  18 +/****************
  19 + *
  20 + * 控件设置
  21 + *
  22 + * *************/
  23 +static T_JZsdkReturnCode UI_control_WidgetArraySet(int index, int value)
  24 +{
  25 + T_JZsdkToPsdkHandler *handle = ExpansionApi_JZsdkToPsdk_GetHandler();
  26 + if (handle != NULL && handle->Set_UI_Widget_Value != NULL)
  27 + {
  28 + //将控件值设置到psdk的ui控件
  29 + handle->Set_UI_Widget_Value(index, value);
  30 + }
  31 +}
  32 +
  33 +
  34 +/****************
  35 + *
  36 + * 二级控件设置
  37 + *
  38 + * *************/
  39 +static T_JZsdkReturnCode UI_control_SecondaryWidgetArraySet(int type, int value)
  40 +{
  41 + T_JZsdkToPsdkHandler *handle = ExpansionApi_JZsdkToPsdk_GetHandler();
  42 + if (handle == NULL)
  43 + {
  44 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  45 + }
  46 +
  47 + switch (type)
  48 + {
  49 +
  50 + case JZSDK_WIDGET_PLAYANDSTOP:
  51 + if (handle->Set_UI_SpeakerWidget_PlayState != NULL)
  52 + {
  53 + return handle->Set_UI_SpeakerWidget_PlayState(value);
  54 + }
  55 + break;
  56 +
  57 + case JZSDK_WIDGET_LOOP_PLAY:
  58 + if (handle->Set_UI_SpeakerWidget_LoopMode != NULL)
  59 + {
  60 + return handle->Set_UI_SpeakerWidget_LoopMode(value);
  61 + }
  62 + break;
  63 +
  64 + case JZSDK_WIDGET_VOLUME://音量
  65 + if (handle->Set_UI_SpeakerWidget_Volume != NULL)
  66 + {
  67 + return handle->Set_UI_SpeakerWidget_Volume(value);
  68 + }
  69 + break;
  70 +
  71 +
  72 + default:
  73 + break;
  74 + }
  75 +}
  76 +
  77 +static T_JZsdkReturnCode JZsdk_UI_DJIpsdk_Widget_set(JZsdk_Widget_Control index, int value)
  78 +{
  79 + switch (index)
  80 + {
  81 + case JZSDK_WIDGET_PLAYANDSTOP:
  82 + {
  83 + //如果是要播放
  84 + if (value == JZ_FLAGCODE_ON)
  85 + {
  86 + // 将控件界面的播放开关打开
  87 + UI_control_WidgetArraySet(JZSDK_WIDGET_PLAYANDSTOP, 0);
  88 +
  89 + // 将ttsSpeaker的开关关闭
  90 + UI_control_SecondaryWidgetArraySet(JZSDK_WIDGET_PLAYANDSTOP, JZ_FLAGCODE_OFF);
  91 + }
  92 + else
  93 + {
  94 + // 将控件界面的播放开关关闭
  95 + UI_control_WidgetArraySet(JZSDK_WIDGET_PLAYANDSTOP, 1);
  96 +
  97 + // 将ttsSpeaker的开关关闭
  98 + UI_control_SecondaryWidgetArraySet(JZSDK_WIDGET_PLAYANDSTOP, JZ_FLAGCODE_OFF);
  99 + }
  100 + }
  101 + break;
  102 +
  103 + case JZSDK_WIDGET_VOLUME:
  104 + {
  105 + //1、大疆音量控件需要去设置喊话器控件内的音量
  106 + UI_control_WidgetArraySet(3, value);
  107 + UI_control_WidgetArraySet(4, value);
  108 +
  109 + //2、大疆音量控件需要去设置悬浮窗的音量
  110 + UI_control_SecondaryWidgetArraySet(JZSDK_WIDGET_VOLUME, value);
  111 + }
  112 + break;
  113 +
  114 + case JZSDK_WIDGET_TTS_SPEED:
  115 + {
  116 + //将音量转换为控件值
  117 + int index = 0;
  118 + if (value >=0 && value <=25 )
  119 + {
  120 + index = 0;
  121 + }
  122 + else if (value > 25 && value <= 50)
  123 + {
  124 + index = 1;
  125 + }
  126 + else if (value > 50 && value <= 75)
  127 + {
  128 + index = 2;
  129 + }
  130 + else if (value > 75 && value <= 100)
  131 + {
  132 + index = 3;
  133 + }
  134 +
  135 + UI_control_WidgetArraySet(5, index);
  136 + }
  137 + break;
  138 +
  139 + case JZSDK_WIDGET_TTS_TONE:
  140 + {
  141 + //将音色转换为控件值
  142 + int index = 0;
  143 +
  144 +#ifdef IFLAY_TTS_1_CONFIG_STATUS_ON //讯飞一代音色转换
  145 + T_JZsdkReturnCode ret;
  146 + int value;
  147 + E_LanguageInfo LanguageInfo = LanguageInfo_Get_LanguageInfo();
  148 +
  149 + //中文音色控件值转换
  150 + if (LanguageInfo == LANGUAGE_INFO_CHINESE)
  151 + {
  152 + switch (value)
  153 + {
  154 + case 0x01:
  155 + index = 0;
  156 + break;
  157 +
  158 + case 0x02:
  159 + index = 1;
  160 + break;
  161 +
  162 + case 0x11:
  163 + index = 2;
  164 + break;
  165 +
  166 + case 0x12:
  167 + index = 3;
  168 + break;
  169 +
  170 + case 0x31:
  171 + index = 4;
  172 + break;
  173 +
  174 + case 0x32:
  175 + index = 5;
  176 + break;
  177 +
  178 + case 0x33:
  179 + index = 6;
  180 + break;
  181 +
  182 + case 0x34:
  183 + index = 7;
  184 + break;
  185 +
  186 + case 0x35:
  187 + index = 8;
  188 + break;
  189 +
  190 + case 0x36:
  191 + index = 9;
  192 + break;
  193 +
  194 + default:
  195 + printf("无效的tts设置\n");
  196 + return JZ_ERRORCODE_TTS_INVALID_TONE;
  197 + break;
  198 + }
  199 + }
  200 + else {
  201 + switch (value)
  202 + {
  203 + case 0x01:
  204 + index = 2;
  205 + break;
  206 +
  207 + case 0x02:
  208 + index = 3;
  209 + break;
  210 +
  211 + case 0x11:
  212 + index = 0;
  213 + break;
  214 +
  215 + case 0x12:
  216 + index = 1;
  217 + break;
  218 +
  219 + case 0x41://俄 russian ru
  220 + index = 4;
  221 + break;
  222 +
  223 + case 0x42://法 french fr-fr
  224 + index = 5;
  225 + break;
  226 +
  227 + case 0x43://德 german de
  228 + index = 6;
  229 + break;
  230 +
  231 + case 0x44://韩 ko
  232 + index = 7;
  233 + break;
  234 +
  235 + case 0x45://意大利 italian it
  236 + index = 8;
  237 + break;
  238 +
  239 + case 0x46://波兰 polish pl
  240 + index = 9;
  241 + break;
  242 +
  243 + case 0x47://西班牙 spanish es
  244 + index = 10;
  245 + break;
  246 +
  247 + case 0x48://葡萄牙 portugal pt-pt
  248 + index = 11;
  249 + break;
  250 +
  251 + default:
  252 + printf("无效的tts设置\n");
  253 + return JZ_ERRORCODE_TTS_INVALID_TONE;
  254 + break;
  255 + }
  256 + }
  257 +
  258 +#endif // IFLAY_TTS_1_CONFIG_STATUS_ON
  259 +
  260 +#ifdef IFLAY_TTS_2_CONFIG_STATUS_ON //讯飞二代音色转换
  261 +
  262 + index = -1;
  263 +
  264 + int num = sizeof(Ify2_TTS_Value) / sizeof(Ify2_TTS_Value[0]);
  265 + //将音色转换为控件值
  266 + for (int i = 0; i < num; i++)
  267 + {
  268 + if (Ify2_TTS_Value[i] == value)
  269 + {
  270 + index = i;
  271 + break;
  272 + }
  273 + }
  274 +
  275 + if (index < 0)
  276 + {
  277 + printf("无效的tts设置\n");
  278 + return JZ_ERRORCODE_TTS_INVALID_TONE;
  279 + break;
  280 + }
  281 +
  282 +#endif // IFLAY_TTS_2_CONFIG_STATUS_ON
  283 +
  284 + JZsdk_PsdkUi_value_set(6 , index);
  285 +
  286 + }
  287 + break;
  288 +
  289 + case JZSDK_WIDGET_SIDE_LASER_MODE:
  290 + {
  291 + int index = value;
  292 +#if DEVICE_VERSION == JZ_T40
  293 + if (value == 0)
  294 + {
  295 + index = 0;
  296 + }
  297 + else if (value == 3)
  298 + {
  299 + index = 1;
  300 + }
  301 + else if (value == 4)
  302 + {
  303 + index = 2;
  304 + }
  305 + else
  306 + {
  307 + index = 0;
  308 + }
  309 +#endif
  310 + UI_control_WidgetArraySet(15, index);
  311 + }
  312 + break;
  313 +
  314 + case JZSDK_WIDGET_WARNLIGHT_MODE:
  315 + {
  316 + int index = value;
  317 +#if DEVICE_VERSION == JZ_T40
  318 + if (value == 0)
  319 + {
  320 + index = 0;
  321 + }
  322 + else if (value == 4)
  323 + {
  324 + index = 1;
  325 + }
  326 + else if (value == 5)
  327 + {
  328 + index = 2;
  329 + }
  330 + else
  331 + {
  332 + index = 0;
  333 + }
  334 +#endif
  335 + UI_control_WidgetArraySet(16, index);
  336 + }
  337 + break;
  338 +
  339 + case JZSDK_WIDGET_WARNLIGHT_COLOR_1:
  340 + {
  341 + int index = value - 1;
  342 +#if DEVICE_VERSION == JZ_T40
  343 + if (index == 1)
  344 + {
  345 + index = 0;
  346 + }
  347 + else if (index == 3)
  348 + {
  349 + index = 1;
  350 + }
  351 +#endif
  352 + UI_control_WidgetArraySet(17, index);
  353 + }
  354 + break;
  355 +
  356 + case JZSDK_WIDGET_WARNLIGHT_COLOR_2:
  357 + {
  358 + int index = value - 1;
  359 +#if DEVICE_VERSION == JZ_T40
  360 + if (index == 1)
  361 + {
  362 + index = 0;
  363 + }
  364 + else if (index == 3)
  365 + {
  366 + index = 1;
  367 + }
  368 +#endif
  369 + UI_control_WidgetArraySet(18, index);
  370 + }
  371 + break;
  372 +
  373 +
  374 +
  375 + default:
  376 + break;
  377 + }
  378 +}
  379 +
  380 +//设置控件值
  381 +T_JZsdkReturnCode JZsdk_PsdkUi_value_set(JZsdk_Widget_Control index, int value)
  382 +{
  383 + JZsdk_UI_DJIpsdk_Widget_set(index, value);
  384 +}
  385 +
  386 +
  387 +
  388 +//控件值转换为变量, 专门用在test wideget
  389 +T_JZsdkReturnCode JZsdk_PsdkUi_value_get(JZsdk_Widget_Control index, int *value)
  390 +{
  391 + switch (index)
  392 + {
  393 + case JZSDK_WIDGET_TTS_SPEED:
  394 + {
  395 + int index = 0;
  396 + if (*value == 0)
  397 + {
  398 + index = 25;
  399 + }
  400 + else if (*value == 1)
  401 + {
  402 + index = 50;
  403 + }
  404 + else if (*value == 2)
  405 + {
  406 + index = 75;
  407 + }
  408 + else if (*value == 3)
  409 + {
  410 + index = 100;
  411 + }
  412 +
  413 + *value = index;
  414 + }
  415 + break;
  416 +
  417 + case JZSDK_WIDGET_TTS_TONE:
  418 + {
  419 + int tone = 0x01;
  420 +
  421 +#ifdef IFLAY_TTS_1_CONFIG_STATUS_ON //讯飞一代音色转换
  422 +
  423 + E_LanguageInfo LanguageInfo = LanguageInfo_Get_LanguageInfo();
  424 +
  425 +
  426 + if (LanguageInfo == LANGUAGE_INFO_CHINESE)
  427 + {
  428 + switch (value)
  429 + {
  430 + case 0:
  431 + tone = 0x01;
  432 + break;
  433 + case 1:
  434 + tone = 0x02;
  435 + break;
  436 + case 2:
  437 + tone = 0x11;
  438 + break;
  439 + case 3:
  440 + tone = 0x12;
  441 + break;
  442 + case 4:
  443 + tone = 0x31;
  444 + break;
  445 + case 5:
  446 + tone = 0x32;
  447 + break;
  448 + case 6:
  449 + tone = 0x33;
  450 + break;
  451 + case 7:
  452 + tone = 0x34;
  453 + break;
  454 + case 8:
  455 + tone = 0x35;
  456 + break;
  457 + case 9:
  458 + tone = 0x36;
  459 + break;
  460 + default:
  461 + tone = 0x01;
  462 + break;
  463 + }
  464 +
  465 + }
  466 +
  467 + else
  468 + {
  469 + switch (value)
  470 + {
  471 + case 0:
  472 + tone = 0x11;
  473 + break;
  474 + case 1:
  475 + tone = 0x12;
  476 + break;
  477 + case 2:
  478 + tone = 0x01;
  479 + break;
  480 + case 3:
  481 + tone = 0x02;
  482 + break;
  483 + case 4:
  484 + tone = 0x41;
  485 + break;
  486 + case 5:
  487 + tone = 0x42;
  488 + break;
  489 + case 6:
  490 + tone = 0x43;
  491 + break;
  492 + case 7:
  493 + tone = 0x44;
  494 + break;
  495 + case 8:
  496 + tone = 0x45;
  497 + break;
  498 + case 9:
  499 + tone = 0x46;
  500 + break;
  501 + case 10:
  502 + tone = 0x47;
  503 + break;
  504 + case 11:
  505 + tone = 0x48;
  506 + break;
  507 +
  508 + default:
  509 + tone = 0x11;
  510 + break;
  511 + }
  512 + }
  513 +
  514 +#endif //讯飞一代音色转换
  515 +
  516 +#ifdef IFLAY_TTS_2_CONFIG_STATUS_ON //讯飞二代音色转换
  517 +
  518 + if (*value > (sizeof(Ify2_TTS_Value)/sizeof(Ify2_TTS_Value[0])))
  519 + {
  520 + JZSDK_LOG_ERROR("TTS tone value error");
  521 + tone = 0;
  522 + }
  523 + else
  524 + {
  525 + tone = Ify2_TTS_Value[*value];
  526 + }
  527 +#endif
  528 + *value = tone;
  529 + }
  530 + break;
  531 +
  532 + case JZSDK_WIDGET_WARNLIGHT_COLOR_1:
  533 + case JZSDK_WIDGET_WARNLIGHT_COLOR_2:
  534 + {
  535 + int color;
  536 +#if DEVICE_VERSION == JZ_T40
  537 +
  538 + if (*value == 0)
  539 + {
  540 + color = 0x01; //红色
  541 + }
  542 + else if (*value == 1)
  543 + {
  544 + color = 0x03; //蓝色
  545 + }
  546 +#else
  547 + if (*value == 0)
  548 + {
  549 + color = 0x01; //红色
  550 + }
  551 + else if (*value == 1)
  552 + {
  553 + color = 0x02; //绿色
  554 + }
  555 + else if (*value == 2)
  556 + {
  557 + color = 0x03; //蓝色
  558 + }
  559 + else if (*value == 3)
  560 + {
  561 + color = 0x04; //黄色
  562 + }
  563 + else if (*value == 4)
  564 + {
  565 + color = 0x05; //白色
  566 + }
  567 +#endif
  568 + *value = color;
  569 + }
  570 + break;
  571 +
  572 + case JZSDK_WIDGET_SIDE_LASER_MODE:
  573 + {
  574 + int index = *value;
  575 +
  576 +#if DEVICE_VERSION == JZ_T40
  577 + if(index == 0)
  578 + {
  579 + *value = 0;
  580 + }
  581 + else if (index == 1)
  582 + {
  583 + *value = 3;
  584 + }
  585 + else if (index == 2)
  586 + {
  587 + *value = 4;
  588 + }
  589 + else
  590 + {
  591 + *value = 0;
  592 + }
  593 +#else
  594 + *value = index;
  595 +#endif
  596 + }
  597 + break;
  598 +
  599 + case JZSDK_WIDGET_WARNLIGHT_MODE:
  600 + {
  601 + int index = *value;
  602 +#if DEVICE_VERSION == JZ_T40
  603 +
  604 + if(index == 0)
  605 + {
  606 + *value = 0;
  607 + }
  608 + else if (index == 1)
  609 + {
  610 + *value = 4;
  611 + }
  612 + else if (index == 2)
  613 + {
  614 + *value = 5;
  615 + }
  616 + else
  617 + {
  618 + *value = 0;
  619 + }
  620 +#else
  621 + *value = index;
  622 +#endif
  623 + }
  624 + break;
  625 +
  626 + default:
  627 + break;
  628 + }
  629 +
  630 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  631 +}
1 /** 1 /**
2 ******************************************************************** 2 ********************************************************************
3 - * @file Psdk_Ui.h  
4 - * Psdk_Ui的头文件 3 + * @file Psdk_ui_change.h
  4 + * Psdk_ui_change的头文件
5 * 5 *
6 ********************************************************************* 6 *********************************************************************
7 */ 7 */
8 8
9 /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/ 9 /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
10 -#ifndef PSDK_UI_H  
11 -#define PSDK_UI_H 10 +#ifndef PSDK_UI_CHANGE_H
  11 +#define PSDK_UI_CHANGE_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"
@@ -25,7 +25,8 @@ extern "C" { @@ -25,7 +25,8 @@ extern "C" {
25 /* Exported types ------------------------------------------------------------*/ 25 /* Exported types ------------------------------------------------------------*/
26 26
27 /* Exported functions --------------------------------------------------------*/ 27 /* Exported functions --------------------------------------------------------*/
28 -T_JZsdkReturnCode JZsdk_UI_value_set(JZsdk_Widget_Control index, int value); 28 +T_JZsdkReturnCode JZsdk_PsdkUi_value_set(JZsdk_Widget_Control index, int value);
  29 +T_JZsdkReturnCode JZsdk_PsdkUi_value_get(JZsdk_Widget_Control index, int *value);
29 30
30 31
31 #ifdef __cplusplus 32 #ifdef __cplusplus
@@ -1413,7 +1413,18 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_ModeControl(int DeviceName, int val @@ -1413,7 +1413,18 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_ModeControl(int DeviceName, int val
1413 //如果psdk接口已经使用 1413 //如果psdk接口已经使用
1414 if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK ) 1414 if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
1415 { 1415 {
  1416 + int index;
1416 1417
  1418 + if (LightAttribute.status == JZ_FLAGCODE_OFF)
  1419 + {
  1420 + index = 0;
  1421 + }
  1422 + else
  1423 + {
  1424 + index = LightAttribute.mode + 1;
  1425 + }
  1426 +
  1427 + JZsdk_Psdk_UI_io_Set_WarningLightMode(JZ_FLAGCODE_OFF, index);
1417 } 1428 }
1418 1429
1419 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 1430 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@@ -1458,7 +1469,8 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, i @@ -1458,7 +1469,8 @@ T_JZsdkReturnCode UIcontrol_Set_WarningLight_Color(int DeviceName, int value1, i
1458 //如果psdk接口已经使用 1469 //如果psdk接口已经使用
1459 if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK ) 1470 if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
1460 { 1471 {
1461 - 1472 + JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(JZ_FLAGCODE_OFF, value1);
  1473 + JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(JZ_FLAGCODE_OFF, value2);
1462 } 1474 }
1463 1475
1464 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 1476 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@@ -2652,25 +2664,29 @@ T_JZsdkReturnCode UIcontrol_SideLaser_SetControl(int DeviceName, int value) @@ -2652,25 +2664,29 @@ T_JZsdkReturnCode UIcontrol_SideLaser_SetControl(int DeviceName, int value)
2652 return ret; 2664 return ret;
2653 } 2665 }
2654 2666
  2667 + T_JZsdkSideLaserInfo Info;
  2668 + //获取参数
  2669 + SideLaser_getInfo(&Info);
  2670 +
2655 //2、通知其他设备变化 2671 //2、通知其他设备变化
2656 if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) ) 2672 if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
2657 { 2673 {
  2674 + HalSend_type1Send_LaserControl(UART_4G, 0x00, Info.status);
2658 } 2675 }
2659 //如果设备1有启动 2676 //如果设备1有启动
2660 if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) ) 2677 if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
2661 { 2678 {
  2679 + HalSend_type1Send_LaserControl(UART_DEV_1, 0x00, Info.status);
2662 } 2680 }
2663 //如果设备2有启动 2681 //如果设备2有启动
2664 if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) ) 2682 if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
2665 { 2683 {
  2684 + HalSend_type1Send_LaserControl(UART_DEV_2, 0x00, Info.status);
2666 } 2685 }
2667 //如果psdk接口已经使用 2686 //如果psdk接口已经使用
2668 if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK ) 2687 if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
2669 { 2688 {
2670 - int RealMode;  
2671 - //psdk的ui是开关和模式一起的,所以需要另外获取  
2672 - SideLaser_param(JZ_FLAGCODE_GET, SIDELASER_REALMODE, &RealMode);  
2673 - JZsdk_Psdk_UI_io_SideLaserMode(JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, RealMode); 2689 + JZsdk_Psdk_UI_io_SideLaserMode(JZ_FLAGCODE_OFF, Info.Uimode);
2674 } 2690 }
2675 2691
2676 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 2692 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@@ -2690,25 +2706,29 @@ T_JZsdkReturnCode UIcontrol_SideLaser_SetMode(int DeviceName, int value) @@ -2690,25 +2706,29 @@ T_JZsdkReturnCode UIcontrol_SideLaser_SetMode(int DeviceName, int value)
2690 return ret; 2706 return ret;
2691 } 2707 }
2692 2708
  2709 + T_JZsdkSideLaserInfo Info;
  2710 + //获取参数
  2711 + SideLaser_getInfo(&Info);
  2712 +
2693 //2、通知其他设备变化 2713 //2、通知其他设备变化
2694 if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) ) 2714 if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
2695 { 2715 {
  2716 + HalSend_type1Send_LaserMode(UART_4G, 0x00, Info.mode);
2696 } 2717 }
2697 //如果设备1有启动 2718 //如果设备1有启动
2698 if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) ) 2719 if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
2699 { 2720 {
  2721 + HalSend_type1Send_LaserMode(UART_DEV_1, 0x00, Info.mode);
2700 } 2722 }
2701 //如果设备2有启动 2723 //如果设备2有启动
2702 if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) ) 2724 if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
2703 { 2725 {
  2726 + HalSend_type1Send_LaserMode(UART_DEV_2, 0x00, Info.mode);
2704 } 2727 }
2705 //如果psdk接口已经使用 2728 //如果psdk接口已经使用
2706 if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK ) 2729 if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
2707 { 2730 {
2708 - int RealMode;  
2709 - //psdk的ui是开关和模式一起的,所以需要另外获取  
2710 - SideLaser_param(JZ_FLAGCODE_GET, SIDELASER_REALMODE, &RealMode);  
2711 - JZsdk_Psdk_UI_io_SideLaserMode(JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, RealMode); 2731 + JZsdk_Psdk_UI_io_SideLaserMode(JZ_FLAGCODE_OFF, Info.Uimode);
2712 } 2732 }
2713 2733
2714 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 2734 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@@ -12,6 +12,7 @@ @@ -12,6 +12,7 @@
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 16
16 #ifdef __cplusplus 17 #ifdef __cplusplus
17 extern "C" { 18 extern "C" {
@@ -48,6 +48,27 @@ static int WidgetMgMT_Control_WorkFuntion(int Inscode, int value) @@ -48,6 +48,27 @@ 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_TTS_SPEED:
  52 + JZsdk_Psdk_UI_io_Set_TTS_speed(JZ_FLAGCODE_ON,value);
  53 + break;
  54 +
  55 + case JZSDK_WIDGET_TTS_TONE:
  56 + JZsdk_Psdk_UI_io_Set_TTS_tone(JZ_FLAGCODE_ON,value);
  57 + break;
  58 +
  59 +
  60 + case JZSDK_WIDGET_WARNLIGHT_COLOR_1:
  61 + JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(JZ_FLAGCODE_ON, value);
  62 + break;
  63 +
  64 + case JZSDK_WIDGET_WARNLIGHT_COLOR_2:
  65 + JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(JZ_FLAGCODE_ON, value);
  66 + break;
  67 +
  68 + case JZSDK_WIDGET_WARNLIGHT_MODE:
  69 + JZsdk_Psdk_UI_io_Set_WarningLightMode(JZ_FLAGCODE_ON, value);
  70 + break;
  71 +
51 //相机 72 //相机
52 case JZSDK_WIDGET_VIDEOPUSH_INDEX: 73 case JZSDK_WIDGET_VIDEOPUSH_INDEX:
53 JZsdk_Psdk_UI_io_Set_VideoMgmtPush(JZ_FLAGCODE_ON, JZ_FLAGCODE_ON, value); 74 JZsdk_Psdk_UI_io_Set_VideoMgmtPush(JZ_FLAGCODE_ON, JZ_FLAGCODE_ON, value);
@@ -125,12 +146,10 @@ static int WidgetMgMT_Control_WorkFuntion(int Inscode, int value) @@ -125,12 +146,10 @@ static int WidgetMgMT_Control_WorkFuntion(int Inscode, int value)
125 146
126 case JZSDK_WIDGET_GAS_ENHANCEMENT_CORRECT_LOW_CALIBRATION: 147 case JZSDK_WIDGET_GAS_ENHANCEMENT_CORRECT_LOW_CALIBRATION:
127 printf("未设置"); 148 printf("未设置");
128 - break;  
129 -  
130 - 149 + break;
131 150
132 case JZSDK_WIDGET_SIDE_LASER_MODE: 151 case JZSDK_WIDGET_SIDE_LASER_MODE:
133 - JZsdk_Psdk_UI_io_SideLaserMode(JZ_FLAGCODE_ON, JZ_FLAGCODE_ON, value); 152 + JZsdk_Psdk_UI_io_SideLaserMode(JZ_FLAGCODE_ON, value);
134 break; 153 break;
135 154
136 default: 155 default:
@@ -499,14 +499,16 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -499,14 +499,16 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
499 } 499 }
500 case 5://TTS语速 list 500 case 5://TTS语速 list
501 { 501 {
502 - int speed = JZsdk_Psdk_UI_io_GetTTSSpeed_ByValue(value);  
503 - JZsdk_Psdk_UI_io_Set_TTS_speed(1,speed); 502 + int speed = value;
  503 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_TTS_SPEED, &speed);
  504 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_SPEED, speed);
504 break; 505 break;
505 } 506 }
506 case 6://TTS音色 list 507 case 6://TTS音色 list
507 - {  
508 - int tone = JZsdk_Psdk_UI_io_GetTTSTone_ByValue(value);  
509 - JZsdk_Psdk_UI_io_Set_TTS_tone(1,tone); 508 + {
  509 + int tone = value;
  510 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_TTS_TONE, &tone);
  511 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TTS_TONE, tone);
510 break; 512 break;
511 } 513 }
512 case 7://TTS追加音色 list 514 case 7://TTS追加音色 list
@@ -579,23 +581,31 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -579,23 +581,31 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
579 //侧面激光部分 581 //侧面激光部分
580 case 15://激光开关 582 case 15://激光开关
581 { 583 {
582 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_MODE, value); 584 + int mode = value;
  585 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_SIDE_LASER_MODE, &mode);
  586 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_SIDE_LASER_MODE, mode);
583 break; 587 break;
584 } 588 }
585 //警灯部分 589 //警灯部分
586 case 16://警灯模式 590 case 16://警灯模式
587 - {  
588 - JZsdk_Psdk_UI_io_Set_WarningLightMode(1,value); 591 + {
  592 + int mode = value;
  593 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_MODE, &mode);
  594 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_MODE, mode);
589 break; 595 break;
590 } 596 }
591 case 17://警灯颜色1 597 case 17://警灯颜色1
592 { 598 {
593 - JZsdk_Psdk_UI_io_Set_WarningLightFirstColor(1,(value+1)); 599 + int color = value;
  600 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_COLOR_1, &color);
  601 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_COLOR_1,color);
594 break; 602 break;
595 } 603 }
596 case 18://警灯颜色2 604 case 18://警灯颜色2
597 { 605 {
598 - JZsdk_Psdk_UI_io_Set_WarningLightSecondColor(1,(value+1)); 606 + int color = value;
  607 + JZsdk_PsdkUi_value_get(JZSDK_WIDGET_WARNLIGHT_COLOR_1, &color);
  608 + JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_WARNLIGHT_COLOR_2,color);
599 break; 609 break;
600 } 610 }
601 //云台部分 611 //云台部分
1 # cmake 最低版本要求 第三行名字不能动 1 # cmake 最低版本要求 第三行名字不能动
2 cmake_minimum_required(VERSION 2.8) 2 cmake_minimum_required(VERSION 2.8)
3 -project(JZ_H150S) 3 +project(JZ_T40)
4 4
5 #set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++") 5 #set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++")
6 #"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。 6 #"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。