作者 ookk303

00212更新 2025/1/3

优化了jsdklib的code部分,加入了 最新最潮的osal库
昆腾红外相机修改为最新的sdk,并修复了高低温数据溢出的问题
修复了mp3实时语音的崩溃问题
优化了hal层 处理修改了hal相关的关系
    移除了无帧头帧尾的不健康帧
简化了uart的层,使得再也不会混进奇怪的内容了
    数据传输上限修改至2048,优化了打印,使得数据传输快了
优化了log.c避免log日志没有及时保存导致的丢失
正在显示 53 个修改的文件 包含 1640 行增加269 行删除
@@ -99,7 +99,14 @@ @@ -99,7 +99,14 @@
99 "jzsdk_flagcode.h": "c", 99 "jzsdk_flagcode.h": "c",
100 "jzsdk_typedef.h": "c", 100 "jzsdk_typedef.h": "c",
101 "jzsdk_errorcode.h": "c", 101 "jzsdk_errorcode.h": "c",
102 - "jzsdk_portcode.h": "c" 102 + "jzsdk_portcode.h": "c",
  103 + "jzsdk_osal.h": "c",
  104 + "jzsdk_time.h": "c",
  105 + "jzsdk_task.h": "c",
  106 + "jzsdk_semaphore.h": "c",
  107 + "jzsdk_filesystm.h": "c",
  108 + "jzsdk_memoryadapter.h": "c",
  109 + "jzsdk_errorcodedef.h": "c"
103 }, 110 },
104 "Codegeex.GenerationPreference": "automatic", 111 "Codegeex.GenerationPreference": "automatic",
105 "C_Cpp.dimInactiveRegions": false 112 "C_Cpp.dimInactiveRegions": false
1 # 编译链的配置 1 # 编译链的配置
2 2
3 #1、编译链与设备类型的选择 3 #1、编译链与设备类型的选择
4 -set(DEVICE_NAME JZ_C1) 4 +set(DEVICE_NAME JZ_H10)
5 #上一行为禁止修改行 5 #上一行为禁止修改行
6 6
7 message("**************************JZSDK构建编译开始***************************\n") 7 message("**************************JZSDK构建编译开始***************************\n")
1 #include <stdio.h> 1 #include <stdio.h>
2 #include "JZsdkLib.h" 2 #include "JZsdkLib.h"
  3 +
3 #include "./JZsdk_TaskManagement/TaskManagement.h" 4 #include "./JZsdk_TaskManagement/TaskManagement.h"
4 5
  6 +static T_JZsdkReturnCode JZsdk_PrepareSystemEnvironment()
  7 +{
  8 + T_JZsdkReturnCode ret;
  9 +
  10 + ret = JZsdk_OsalInit();
  11 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  12 + {
  13 +
  14 + }
  15 + else
  16 + {
  17 + JZSDK_LOG_INFO("JZSDK_OSAL_INIT_SUCCESS");
  18 + }
  19 +
  20 + return ret;
  21 +}
  22 +
  23 +
5 //初始化sdk 24 //初始化sdk
6 T_JZsdkReturnCode JZsdk_LibInit() 25 T_JZsdkReturnCode JZsdk_LibInit()
7 { 26 {
  27 + //环境初始化
  28 + JZsdk_PrepareSystemEnvironment();
  29 +
8 //1、初始化log 30 //1、初始化log
9 JZsdk_LoggerInit(); 31 JZsdk_LoggerInit();
10 32
11 //2、任务管理系统初始化 33 //2、任务管理系统初始化
12 TaskManagement_Init(); 34 TaskManagement_Init();
13 35
14 - JZSDK_LOG_INFO("Lib加载已完成"); 36 + JZSDK_LOG_INFO("JZSDK_LIB_INIT_SUCCESS");
15 } 37 }
@@ -19,11 +19,8 @@ extern "C" { @@ -19,11 +19,8 @@ extern "C" {
19 /* Exported constants --------------------------------------------------------*/ 19 /* Exported constants --------------------------------------------------------*/
20 /* 常亮定义*/ 20 /* 常亮定义*/
21 #include "JZsdk_Logger/JZsdk_Logger.h" 21 #include "JZsdk_Logger/JZsdk_Logger.h"
22 -#include "JZsdk_Osal/JZsdk_FileSystm.h"  
23 -#include "JZsdk_Delay/JZsdk_Delay.h"  
24 #include "JZsdk_Code/JZsdk_FLagCode.h" 22 #include "JZsdk_Code/JZsdk_FLagCode.h"
25 -#include "JZsdk_Osal/JZsdk_MemoryAdapter.h"  
26 -#include "JZsdk_Osal/JZsdk_CheckSum/JZsdk_CheckSum.h" 23 +#include "JZsdk_Osal/JZsdk_Osal.h"
27 24
28 /* Exported types ------------------------------------------------------------*/ 25 /* Exported types ------------------------------------------------------------*/
29 26
@@ -19,10 +19,12 @@ extern "C" { @@ -19,10 +19,12 @@ extern "C" {
19 /* Exported constants --------------------------------------------------------*/ 19 /* Exported constants --------------------------------------------------------*/
20 /* 常亮定义*/ 20 /* 常亮定义*/
21 21
  22 +#include "./JZsdk_typedef/JZsdk_typedef.h"
  23 +#include "./JZsdk_ReturnCode/JZsdk_ReturnCode.h"
  24 +
  25 +
22 #include "./JZsdk_InsCode.h" 26 #include "./JZsdk_InsCode.h"
23 #include "./JZsdk_FLagCode.h" 27 #include "./JZsdk_FLagCode.h"
24 -#include "./JZsdk_ReturnCode.h"  
25 -#include "./JZsdk_FileType.h"  
26 #include "./JZsdk_WidgetCode.h" 28 #include "./JZsdk_WidgetCode.h"
27 #include "./JZsdk_DeviceCode.h" 29 #include "./JZsdk_DeviceCode.h"
28 #include "./JZsdk_DefineCode.h" 30 #include "./JZsdk_DefineCode.h"
@@ -7,62 +7,26 @@ @@ -7,62 +7,26 @@
7 #define JZSDK_DEVICE_CODE_H 7 #define JZSDK_DEVICE_CODE_H
8 8
9 //特殊版本号 9 //特殊版本号
10 -typedef enum SpecialVersion  
11 -{  
12 - SPECIAL_NORMAL = 0x01, //普通版本  
13 - SPECIAL_DAOTONG = 0x02, //道通版本  
14 -}SpecialVersion; 10 +#define SPECIAL_NORMAL 0x01 //普通版本
  11 +#define SPECIAL_DAOTONG 0x02 //道通版本
15 12
16 //软件模式 13 //软件模式
17 -typedef enum AppMode  
18 -{  
19 - APP_PSDK = 0x01, //psdk设备  
20 - APP_UART = 0x02, //串口设备  
21 - APP_TEST = 0x03, //测试设备  
22 -}AppMode; 14 +#define APP_PSDK 0x01
  15 +#define APP_UART 0x02
  16 +#define APP_TEST 0x03
23 17
24 //平台选择 18 //平台选择
25 -typedef enum Platform  
26 -{  
27 - PLATFORM_H3 = 0x01, //H3平台  
28 - PLATFORM_V3S = 0x02, //V3S平台  
29 -}Platform; 19 +#define PLATFORM_H3 0x01
  20 +#define PLATFORM_V3S 0x02
30 21
31 //固件属地 22 //固件属地
32 -typedef enum FirmwarePlace  
33 -{  
34 - OVERSEAS_VERSION = 0x01, //海外版  
35 - DOMESTIC_VERSION = 0x02, //国内版  
36 -}FirmwarePlace; 23 +#define OVERSEAS_VERSION 0x01
  24 +#define DOMESTIC_VERSION 0x02
37 25
38 //加载开关 26 //加载开关
39 -// typedef enum VersionLoadSwitch  
40 -// {  
41 -// VERSION_SWITCH_ON = 0x0001, //加载  
42 -// VERSION_SWITCH_OFF = 0x0000, //不加载  
43 -// }VersionLoadSwitch;  
44 -  
45 #define VERSION_SWITCH_ON 0x0001 //加载 27 #define VERSION_SWITCH_ON 0x0001 //加载
46 #define VERSION_SWITCH_OFF 0x0000 //不加载 28 #define VERSION_SWITCH_OFF 0x0000 //不加载
47 29
48 -// //设备名  
49 -// typedef enum DeviceName  
50 -// {  
51 -// JZ_H1E = 0x0011, //H1E  
52 -// JZ_H1T = 0x0016, //H1T  
53 -// JZ_U3 = 0x0017, //U3  
54 -// JZ_U3S = 0x0018, //U3S  
55 -// JZ_U3D = 0x0019, //U3D  
56 -// JZ_U30 = 0x001A, //U30  
57 -// JZ_H150S = 0x0013, //H150S  
58 -// JZ_H150T = 0x0015, //H150T  
59 -// JZ_H10 = 0x0012, //H10  
60 -// JZ_H10T = 0x0014, //H10T  
61 -// TF_A1 = 0x1010, //TF-A1  
62 -// JZ_C1 = 0x1011, //C1  
63 -  
64 -// }DeviceName;  
65 -  
66 //设备选择 30 //设备选择
67 #define JZ_H1E 0x0011 31 #define JZ_H1E 0x0011
68 32
  1 +/**
  2 + ********************************************************************
  3 + * @file JZsdk_typedef.h
  4 + * 用于记录各类码的表
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef JZSDK_TYPEDEF_H
  11 +#define JZSDK_TYPEDEF_H
  12 +
  13 +/* Includes ------------------------------------------------------------------*/
  14 +#include "../JZsdk_typedef/JZsdk_typedef.h"
  15 +
  16 +#ifdef __cplusplus
  17 +extern "C" {
  18 +#endif
  19 +
  20 +
  21 +/* Exported constants --------------------------------------------------------*/
  22 +/* 常亮定义*/
  23 +
  24 +/* Exported macro ------------------------------------------------------------*/
  25 +
  26 +
  27 +/* Exported types ------------------------------------------------------------*/
  28 +
  29 +
  30 +/* Exported functions --------------------------------------------------------*/
  31 +
  32 +#ifdef __cplusplus
  33 +}
  34 +#endif
  35 +
  36 +#endif
  37 +
  38 +
1 -#include <stdint.h>  
2 -#include <stdbool.h>  
3 -#include <stddef.h>  
4 -#include <string.h>  
5 -#include <stdlib.h>  
6 -#include <stdio.h>  
7 -#include <string.h>  
8 -  
9 -#include "./JZsdk_Code.h"  
10 -  
11 - 1 +#include "./JZsdk_ReturnCode.h"
12 2
13 //获取返回码的信息 3 //获取返回码的信息
14 const char* JZsdk_GetReturnCodeMessage(T_JZsdkReturnCode ReturnCode) 4 const char* JZsdk_GetReturnCodeMessage(T_JZsdkReturnCode ReturnCode)
@@ -13,8 +13,7 @@ @@ -13,8 +13,7 @@
13 #define JZSDK_RETURNCODE_H 13 #define JZSDK_RETURNCODE_H
14 14
15 /* Includes ------------------------------------------------------------------*/ 15 /* Includes ------------------------------------------------------------------*/
16 -#include <stdint.h>  
17 -#include "JZsdk_ErrorCode.h" 16 +#include "../JZsdk_typedef/JZsdk_typedef.h"
18 17
19 #ifdef __cplusplus 18 #ifdef __cplusplus
20 extern "C" { 19 extern "C" {
@@ -30,21 +29,7 @@ extern "C" { @@ -30,21 +29,7 @@ extern "C" {
30 29
31 30
32 /* Exported types ------------------------------------------------------------*/ 31 /* Exported types ------------------------------------------------------------*/
33 -//重定义一个返回码  
34 -typedef uint64_t T_JZsdkReturnCode;  
35 -typedef uint8_t U8_t;  
36 -typedef uint16_t U16_t;  
37 -typedef uint32_t U32_t;  
38 -typedef uint64_t U64_t;  
39 -  
40 -// typedef unsigned long T_JZsdkReturnCode;  
41 -// typedef unsigned char U8_t;  
42 -// typedef unsigned short U16_t;  
43 -// typedef unsigned int U32_t;  
44 -// typedef unsigned long U64_t;  
45 -  
46 -typedef double F64_t;  
47 -typedef float F32_t; 32 +
48 33
49 /* Exported functions --------------------------------------------------------*/ 34 /* Exported functions --------------------------------------------------------*/
50 const char* JZsdk_GetReturnCodeMessage(T_JZsdkReturnCode ReturnCode); 35 const char* JZsdk_GetReturnCodeMessage(T_JZsdkReturnCode ReturnCode);
@@ -24,7 +24,9 @@ extern "C" { @@ -24,7 +24,9 @@ extern "C" {
24 typedef enum { 24 typedef enum {
25 JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS = 0x0000, 25 JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS = 0x0000,
26 JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE = 0x0001, 26 JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE = 0x0001,
  27 + JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE = 0x0003, //严重错误
27 JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER = 0x0002, //文件指针错误 28 JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER = 0x0002, //文件指针错误
  29 + JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED = 0x0004, //内存分配失败
28 } JZ_SYSTEM_Code; 30 } JZ_SYSTEM_Code;
29 31
30 typedef enum { 32 typedef enum {
  1 +/**
  2 + ********************************************************************
  3 + * @file JZsdk_typedef.h
  4 + * 用于记录各类码的表
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef JZSDK_TYPEDEF_H
  11 +#define JZSDK_TYPEDEF_H
  12 +
  13 +/* Includes ------------------------------------------------------------------*/
  14 +#include <stdint.h>
  15 +#include <stdbool.h>
  16 +#include <stddef.h>
  17 +#include <string.h>
  18 +#include <stdlib.h>
  19 +#include <stdio.h>
  20 +#include <string.h>
  21 +
  22 +#ifdef __cplusplus
  23 +extern "C" {
  24 +#endif
  25 +
  26 +#include "./JZsdk_ErrorCodeDef.h"
  27 +#include "./JZsdk_FileTypeDef.h"
  28 +
  29 +/* Exported constants --------------------------------------------------------*/
  30 +/* 常亮定义*/
  31 +
  32 +
  33 +/* Exported macro ------------------------------------------------------------*/
  34 +//重定义一个返回码
  35 +typedef uint64_t T_JZsdkReturnCode;
  36 +typedef uint8_t U8_t;
  37 +typedef uint16_t U16_t;
  38 +typedef uint32_t U32_t;
  39 +typedef uint64_t U64_t;
  40 +
  41 +// typedef unsigned long T_JZsdkReturnCode;
  42 +// typedef unsigned char U8_t;
  43 +// typedef unsigned short U16_t;
  44 +// typedef unsigned int U32_t;
  45 +// typedef unsigned long U64_t;
  46 +
  47 +typedef double F64_t;
  48 +typedef float F32_t;
  49 +
  50 +
  51 +//线程权柄
  52 +typedef void *T_JZTaskHandle;
  53 +//互斥锁权柄
  54 +typedef void *T_JZsdkMutexHandle;
  55 +//信号量权柄
  56 +typedef void *T_JZsdkSemaHandle;
  57 +
  58 +/* Exported types ------------------------------------------------------------*/
  59 +
  60 +
  61 +/* Exported functions --------------------------------------------------------*/
  62 +
  63 +#ifdef __cplusplus
  64 +}
  65 +#endif
  66 +
  67 +#endif
  68 +
  69 +
1 -#include <stdio.h>  
2 -#include "JZsdk_Delay.h"  
3 -#include <unistd.h>  
4 -  
5 -/*  
6 -* 用于延时(粗略)  
7 -* 需要优化  
8 -*/  
9 -int delayUs(unsigned long msec)  
10 -{  
11 - usleep(msec);  
12 -}  
13 -  
14 -/*  
15 -* 用于延时(粗略)  
16 -* 需要优化  
17 -*/  
18 -int delayMs(unsigned long msec)  
19 -{  
20 - usleep(msec * 1000);  
21 -}  
22 -  
23 -/*  
24 -* 用于延时(粗略)  
25 -* 需要优化  
26 -*/  
27 -int delayS(unsigned long sec)  
28 -{  
29 - delayMs(sec * 1000);  
30 -}  
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 #define CHECK_SUM_H 13 #define CHECK_SUM_H
14 14
15 /* Includes ------------------------------------------------------------------*/ 15 /* Includes ------------------------------------------------------------------*/
16 -#include "../../JZsdk_Code/JZsdk_Code.h" 16 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
17 17
18 #ifdef __cplusplus 18 #ifdef __cplusplus
19 extern "C" { 19 extern "C" {
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 #define JZSDK_CHECK_SUM_H 13 #define JZSDK_CHECK_SUM_H
14 14
15 /* Includes ------------------------------------------------------------------*/ 15 /* Includes ------------------------------------------------------------------*/
16 -#include "../../JZsdk_Code/JZsdk_Code.h" 16 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
17 17
18 #ifdef __cplusplus 18 #ifdef __cplusplus
19 extern "C" { 19 extern "C" {
1 #include <stdio.h> 1 #include <stdio.h>
2 -#include "JZsdk_FileSystm.h" 2 +#include "./JZsdk_FileSystm.h"
3 #include <stdlib.h> 3 #include <stdlib.h>
4 #include <stdbool.h> 4 #include <stdbool.h>
5 #include <string.h> 5 #include <string.h>
@@ -446,3 +446,16 @@ T_JZsdkReturnCode JZsdk_Fs_ReadFileSize(const unsigned char* FilePath, int *File @@ -446,3 +446,16 @@ T_JZsdkReturnCode JZsdk_Fs_ReadFileSize(const unsigned char* FilePath, int *File
446 446
447 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 447 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
448 } 448 }
  449 +
  450 +
  451 +/**************
  452 + *
  453 + * 进行一次系统的保存
  454 + *
  455 + *
  456 + * *****************/
  457 +T_JZsdkReturnCode JZsdk_Sync()
  458 +{
  459 + sync();
  460 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  461 +}
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 #define JZSDK_FILESYSTEM_H 11 #define JZSDK_FILESYSTEM_H
12 12
13 /* Includes ------------------------------------------------------------------*/ 13 /* Includes ------------------------------------------------------------------*/
14 -#include "../JZsdk_Code/JZsdk_Code.h" 14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
15 #include "./JZsdk_FS_Standards.h" 15 #include "./JZsdk_FS_Standards.h"
16 16
17 #ifdef __cplusplus 17 #ifdef __cplusplus
@@ -39,6 +39,7 @@ T_JZsdkReturnCode JZsdk_Fs_ReadFileSize(const unsigned char* FilePath, int *File @@ -39,6 +39,7 @@ T_JZsdkReturnCode JZsdk_Fs_ReadFileSize(const unsigned char* FilePath, int *File
39 T_JZsdkReturnCode JZsdk_copy_file_byC(const char* source_path, const char* dest_path); 39 T_JZsdkReturnCode JZsdk_copy_file_byC(const char* source_path, const char* dest_path);
40 T_JZsdkReturnCode JZsdk_RunSystemCmd_ReturnResult(char *systemCmd, unsigned int *result); 40 T_JZsdkReturnCode JZsdk_RunSystemCmd_ReturnResult(char *systemCmd, unsigned int *result);
41 T_JZsdkReturnCode JZsdk_RunSystemCmd_ReturnResult_Str(char *systemCmd, unsigned char *str); 41 T_JZsdkReturnCode JZsdk_RunSystemCmd_ReturnResult_Str(char *systemCmd, unsigned char *str);
  42 +T_JZsdkReturnCode JZsdk_Sync();
42 43
43 #ifdef __cplusplus 44 #ifdef __cplusplus
44 } 45 }
@@ -3,9 +3,7 @@ @@ -3,9 +3,7 @@
3 #include <stdbool.h> 3 #include <stdbool.h>
4 #include <string.h> 4 #include <string.h>
5 5
6 -#include "JZsdkLib.h"  
7 -  
8 - 6 +#include "./JZsdk_MemoryAdapter.h"
9 7
10 /********************************** 8 /**********************************
11 * 9 *
@@ -55,3 +53,17 @@ T_JZsdkReturnCode JZsdk_Free(void *ptr) @@ -55,3 +53,17 @@ T_JZsdkReturnCode JZsdk_Free(void *ptr)
55 53
56 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 54 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
57 } 55 }
  56 +
  57 +
  58 +
  59 +void *JZsdk_Osal_Malloc(U32_t size)
  60 +{
  61 + return malloc(size);
  62 +}
  63 +
  64 +void JZsdk_Osal_Free(void *ptr)
  65 +{
  66 + free(ptr);
  67 +}
  68 +
  69 +
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 #define JZSDK_MEMORY_ADAPTER_H 11 #define JZSDK_MEMORY_ADAPTER_H
12 12
13 /* Includes ------------------------------------------------------------------*/ 13 /* Includes ------------------------------------------------------------------*/
14 -#include "../JZsdk_Code/JZsdk_Code.h" 14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
15 15
16 #ifdef __cplusplus 16 #ifdef __cplusplus
17 extern "C" { 17 extern "C" {
@@ -26,6 +26,8 @@ extern "C" { @@ -26,6 +26,8 @@ extern "C" {
26 /* Exported functions --------------------------------------------------------*/ 26 /* Exported functions --------------------------------------------------------*/
27 T_JZsdkReturnCode JZsdk_Malloc(void **ptr, unsigned int size); 27 T_JZsdkReturnCode JZsdk_Malloc(void **ptr, unsigned int size);
28 T_JZsdkReturnCode JZsdk_Free(void *ptr); 28 T_JZsdkReturnCode JZsdk_Free(void *ptr);
  29 +void *JZsdk_Osal_Malloc(U32_t size);
  30 +void JZsdk_Osal_Free(void *ptr);
29 31
30 #ifdef __cplusplus 32 #ifdef __cplusplus
31 } 33 }
  1 +#include <stdio.h>
  2 +#include <stdlib.h>
  3 +#include <pthread.h>
  4 +
  5 +#include "./JZsdk_Mutex.h"
  6 +
  7 +/**
  8 + * @brief Declare the mutex container, initialize the mutex, and
  9 + * create mutex ID.
  10 + * @param mutex: pointer to the created mutex ID.
  11 + * @return an enum that represents a status of PSDK
  12 + */
  13 +T_JZsdkReturnCode JZsdk_Osal_MutexCreate(T_JZsdkMutexHandle *mutex)
  14 +{
  15 + int result;
  16 +
  17 + if (!mutex)
  18 + {
  19 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  20 + }
  21 +
  22 + *mutex = malloc(sizeof(pthread_mutex_t));
  23 + if (*mutex == NULL)
  24 + {
  25 + return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
  26 + }
  27 +
  28 + result = pthread_mutex_init(*mutex, NULL);
  29 + if (result != 0)
  30 + {
  31 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  32 + }
  33 +
  34 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  35 +}
  36 +
  37 +
  38 +
  39 +/**
  40 + * @brief Delete the created mutex.
  41 + * @param mutex: pointer to the created mutex ID.
  42 + * @return an enum that represents a status of PSDK
  43 + */
  44 +T_JZsdkReturnCode JZsdk_Osal_MutexDestroy(T_JZsdkMutexHandle mutex)
  45 +{
  46 + int result = 0;
  47 +
  48 + if (!mutex)
  49 + {
  50 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  51 + }
  52 +
  53 + result = pthread_mutex_destroy(mutex);
  54 + if (result != 0)
  55 + {
  56 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  57 + }
  58 +
  59 + free(mutex);
  60 +
  61 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  62 +}
  63 +
  64 +/**
  65 + * @brief Acquire and lock the mutex when peripheral access is required
  66 + * @param mutex: pointer to the created mutex ID.
  67 + * @return an enum that represents a status of PSDK
  68 + */
  69 +T_JZsdkReturnCode JZsdk_Osal_MutexLock(T_JZsdkMutexHandle mutex)
  70 +{
  71 + int result = 0;
  72 +
  73 + if (!mutex)
  74 + {
  75 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  76 + }
  77 +
  78 + result = pthread_mutex_lock(mutex);
  79 + if (result != 0)
  80 + {
  81 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  82 + }
  83 +
  84 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  85 +}
  86 +
  87 +
  88 +
  89 +/**
  90 + * @brief Unlock and release the mutex, when done with the peripheral access.
  91 + * @param mutex: pointer to the created mutex ID.
  92 + * @return an enum that represents a status of PSDK
  93 + */
  94 +T_JZsdkReturnCode JZsdk_Osal_MutexUnlock(T_JZsdkMutexHandle mutex)
  95 +{
  96 + int result = 0;
  97 +
  98 + if (!mutex)
  99 + {
  100 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  101 + }
  102 +
  103 + result = pthread_mutex_unlock(mutex);
  104 + if (result != 0)
  105 + {
  106 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  107 + }
  108 +
  109 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  110 +}
1 /** 1 /**
2 ******************************************************************** 2 ********************************************************************
3 - * @file JZsdk_FileSystem.h  
4 - * 用于文件系统操作 3 + * @file JZsdk_Mutex.h
  4 + * JZsdk_Mutex.c 的头文件
5 * 5 *
6 ********************************************************************* 6 *********************************************************************
7 */ 7 */
8 8
9 /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/ 9 /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
10 -#ifndef JZSDK_DELAY_H  
11 -#define JZSDK_DELAY_H 10 +#ifndef JZSDK_MUTEX_H
  11 +#define JZSDK_MUTEX_H
12 12
13 /* Includes ------------------------------------------------------------------*/ 13 /* Includes ------------------------------------------------------------------*/
  14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
14 15
15 #ifdef __cplusplus 16 #ifdef __cplusplus
16 extern "C" { 17 extern "C" {
@@ -19,14 +20,17 @@ extern "C" { @@ -19,14 +20,17 @@ extern "C" {
19 /* Exported constants --------------------------------------------------------*/ 20 /* Exported constants --------------------------------------------------------*/
20 /* 常亮定义*/ 21 /* 常亮定义*/
21 22
  23 +/* Exported macro ------------------------------------------------------------*/
22 24
23 /* Exported types ------------------------------------------------------------*/ 25 /* Exported types ------------------------------------------------------------*/
24 26
25 27
26 /* Exported functions --------------------------------------------------------*/ 28 /* Exported functions --------------------------------------------------------*/
27 -int delayMs(unsigned long msec);  
28 -int delayS(unsigned long sec);  
29 -int delayUs(unsigned long msec); 29 +T_JZsdkReturnCode JZsdk_Osal_MutexCreate(T_JZsdkMutexHandle *mutex);
  30 +T_JZsdkReturnCode JZsdk_Osal_MutexDestroy(T_JZsdkMutexHandle mutex);
  31 +T_JZsdkReturnCode JZsdk_Osal_MutexLock(T_JZsdkMutexHandle mutex);
  32 +T_JZsdkReturnCode JZsdk_Osal_MutexUnlock(T_JZsdkMutexHandle mutex);
  33 +
30 34
31 #ifdef __cplusplus 35 #ifdef __cplusplus
32 } 36 }
1 -// #include "../JZsdk_Code/JZsdk_Code.h"  
2 -// #include "./JZsdk_Osal.h" 1 +#include "../JZsdk_Code/JZsdk_Code.h"
  2 +#include "./JZsdk_Osal.h"
3 3
4 -// T_JZsdkReturnCode JZsdk_Osal_TaskCreate(const char *name, void *(*taskFunc)(void *), uint32_t stackSize, void *arg,  
5 -// T_JzTaskHandle *task) 4 +
  5 +
  6 +
  7 +static T_JZsdkOsalHandler* g_osalHandler = NULL;
  8 +
  9 +static T_JZsdkReturnCode JZsdk_Platform_RegOsalHandler(const T_JZsdkOsalHandler *osalHandler)
  10 +{
  11 + g_osalHandler = (T_JZsdkOsalHandler*)osalHandler; // 存储传入的 OSAL 处理器
  12 +
  13 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  14 +}
  15 +
  16 +T_JZsdkOsalHandler *JZsdk_Platform_GetOsalHandler(void)
  17 +{
  18 + return g_osalHandler; // 返回已注册的 OSAL 处理器
  19 +}
  20 +
  21 +T_JZsdkReturnCode JZsdk_OsalInit()
  22 +{
  23 + T_JZsdkOsalHandler osalHandler = {
  24 + .TaskCreate = JZsdk_Osal_TaskCreate,
  25 + .TaskDestroy = JZsdk_Osal_TaskDestroy,
  26 + .TaskSleepMs = delayMs,
  27 + .MutexCreate= JZsdk_Osal_MutexCreate,
  28 + .MutexDestroy = JZsdk_Osal_MutexDestroy,
  29 + .MutexLock = JZsdk_Osal_MutexLock,
  30 + .MutexUnlock = JZsdk_Osal_MutexUnlock,
  31 + .SemaphoreCreate = JZsdk_Osal_SemaphoreCreate,
  32 + .SemaphoreDestroy = JZsdk_Osal_SemaphoreDestroy,
  33 + .SemaphoreWait = JZsdk_Osal_SemaphoreWait,
  34 + .SemaphoreTimedWait = JZsdk_Osal_SemaphoreTimedWait,
  35 + .SemaphorePost = JZsdk_Osal_SemaphorePost,
  36 + .Malloc = JZsdk_Osal_Malloc,
  37 + .Free = JZsdk_Osal_Free,
  38 + .GetTimeMs = JZsdk_Osal_GetTimeMs,
  39 + .GetTimeUs = JZsdk_Osal_GetTimeUs,
  40 + .GetRandomNum = JZsdk_Osal_GetRandomNum,
  41 + };
  42 +
  43 + JZsdk_Platform_RegOsalHandler(&osalHandler);
  44 +
  45 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  46 +}
@@ -13,6 +13,14 @@ @@ -13,6 +13,14 @@
13 /* Includes ------------------------------------------------------------------*/ 13 /* Includes ------------------------------------------------------------------*/
14 #include "../JZsdk_Code/JZsdk_Code.h" 14 #include "../JZsdk_Code/JZsdk_Code.h"
15 15
  16 +#include "./JZsdk_CheckSum/JZsdk_CheckSum.h"
  17 +#include "./JZsdk_FileSystm/JZsdk_FileSystm.h"
  18 +#include "./JZsdk_MemoryAdapter/JZsdk_MemoryAdapter.h"
  19 +#include "./JZsdk_Mutex/JZsdk_Mutex.h"
  20 +#include "./JZsdk_Semaphore/JZsdk_Semaphore.h"
  21 +#include "./JZsdk_Task/JZsdk_Task.h"
  22 +#include "./JZsdk_Timer/JZsdk_Timer.h"
  23 +
16 #ifdef __cplusplus 24 #ifdef __cplusplus
17 extern "C" { 25 extern "C" {
18 #endif 26 #endif
@@ -20,12 +28,60 @@ extern "C" { @@ -20,12 +28,60 @@ extern "C" {
20 /* Exported constants --------------------------------------------------------*/ 28 /* Exported constants --------------------------------------------------------*/
21 /* 常亮定义*/ 29 /* 常亮定义*/
22 30
23 -typedef void *T_JzTaskHandle; 31 +/****************
  32 + *
  33 + * osal权柄
  34 + *
  35 + *
  36 + * ******************/
  37 +typedef struct {
  38 + T_JZsdkReturnCode (*TaskCreate)(const char *name, void *(*taskFunc)(void *),
  39 + unsigned int stackSize, void *arg, T_JZTaskHandle *task);
  40 +
  41 + T_JZsdkReturnCode (*TaskDestroy)(T_JZTaskHandle task);
  42 +
  43 + T_JZsdkReturnCode (*TaskSleepMs)(U32_t timeMs);
  44 +
  45 + T_JZsdkReturnCode (*MutexCreate)(T_JZsdkMutexHandle *mutex);
  46 +
  47 + T_JZsdkReturnCode (*MutexDestroy)(T_JZsdkMutexHandle mutex);
  48 +
  49 + T_JZsdkReturnCode (*MutexLock)(T_JZsdkMutexHandle mutex);
  50 +
  51 + T_JZsdkReturnCode (*MutexUnlock)(T_JZsdkMutexHandle mutex);
  52 +
  53 + T_JZsdkReturnCode (*SemaphoreCreate)(U32_t initValue, T_JZsdkSemaHandle *semaphore);
  54 +
  55 + T_JZsdkReturnCode (*SemaphoreDestroy)(T_JZsdkSemaHandle semaphore);
  56 +
  57 + T_JZsdkReturnCode (*SemaphoreWait)(T_JZsdkSemaHandle semaphore);
  58 +
  59 + T_JZsdkReturnCode (*SemaphoreTimedWait)(T_JZsdkSemaHandle semaphore, U32_t waitTimeMs);
  60 +
  61 + T_JZsdkReturnCode (*SemaphorePost)(T_JZsdkSemaHandle semaphore);
  62 +
  63 + T_JZsdkReturnCode (*GetTimeMs)(U32_t *ms);
  64 +
  65 + T_JZsdkReturnCode (*GetTimeUs)(U64_t *us);
  66 +
  67 + T_JZsdkReturnCode (*GetRandomNum)(U16_t *randomNum);
  68 +
  69 + void *(*Malloc)(U32_t size);
  70 +
  71 + void (*Free)(void *ptr);
  72 +} T_JZsdkOsalHandler;
  73 +
  74 +
  75 +
  76 +/* Exported macro ------------------------------------------------------------*/
  77 +
24 78
25 /* Exported types ------------------------------------------------------------*/ 79 /* Exported types ------------------------------------------------------------*/
26 80
27 81
28 /* Exported functions --------------------------------------------------------*/ 82 /* Exported functions --------------------------------------------------------*/
  83 +T_JZsdkReturnCode JZsdk_OsalInit();
  84 +T_JZsdkOsalHandler *JZsdk_Platform_GetOsalHandler(void);
29 85
30 86
31 #ifdef __cplusplus 87 #ifdef __cplusplus
  1 +#include <stdio.h>
  2 +#include <stdlib.h>
  3 +#include <pthread.h>
  4 +#include <semaphore.h>
  5 +#include <sys/time.h>
  6 +
  7 +#include "./JZsdk_Semaphore.h"
  8 +
  9 +/**
  10 + * @brief Declare the semaphore container, initialize the semaphore, and
  11 + * create semaphore ID.
  12 + * @param semaphore: pointer to the created semaphore ID.
  13 + * @param initValue: initial value of semaphore.
  14 + * @return an enum that represents a status of PSDK
  15 + */
  16 +T_JZsdkReturnCode JZsdk_Osal_SemaphoreCreate(U32_t initValue, T_JZsdkSemaHandle *semaphore)
  17 +{
  18 + int result;
  19 +
  20 + *semaphore = malloc(sizeof(sem_t));
  21 + if (*semaphore == NULL)
  22 + {
  23 + return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
  24 + }
  25 +
  26 + result = sem_init(*semaphore, 0, (unsigned int) initValue);
  27 + if (result != 0)
  28 + {
  29 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  30 + }
  31 +
  32 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  33 +}
  34 +
  35 +
  36 +/**
  37 + * @brief Delete the created semaphore.
  38 + * @param semaphore: pointer to the created semaphore ID.
  39 + * @return an enum that represents a status of PSDK
  40 + */
  41 +T_JZsdkReturnCode JZsdk_Osal_SemaphoreDestroy(T_JZsdkSemaHandle semaphore)
  42 +{
  43 + int result;
  44 +
  45 + result = sem_destroy((sem_t *) semaphore);
  46 + if (result != 0)
  47 + {
  48 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  49 + }
  50 +
  51 + free(semaphore);
  52 +
  53 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  54 +}
  55 +
  56 +
  57 +/**
  58 + * @brief Wait the semaphore until token becomes available.
  59 + * @param semaphore: pointer to the created semaphore ID.
  60 + * @return an enum that represents a status of PSDK
  61 + */
  62 +T_JZsdkReturnCode JZsdk_Osal_SemaphoreWait(T_JZsdkSemaHandle semaphore)
  63 +{
  64 + int result;
  65 +
  66 + result = sem_wait(semaphore);
  67 + if (result != 0)
  68 + {
  69 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  70 + }
  71 +
  72 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  73 +}
  74 +
  75 +
  76 +/**
  77 + * @brief Wait the semaphore until token becomes available.
  78 + * @param semaphore: pointer to the created semaphore ID.
  79 + * @param waitTime: timeout value of waiting semaphore, unit: millisecond.
  80 + * @return an enum that represents a status of PSDK
  81 + */
  82 +T_JZsdkReturnCode JZsdk_Osal_SemaphoreTimedWait(T_JZsdkSemaHandle semaphore, U32_t waitTime)
  83 +{
  84 + int result;
  85 + struct timespec semaphoreWaitTime;
  86 + struct timeval systemTime;
  87 +
  88 + gettimeofday(&systemTime, NULL);
  89 +
  90 + systemTime.tv_usec += waitTime * 1000;
  91 + if (systemTime.tv_usec >= 1000000)
  92 + {
  93 + systemTime.tv_sec += systemTime.tv_usec / 1000000;
  94 + systemTime.tv_usec %= 1000000;
  95 + }
  96 +
  97 + semaphoreWaitTime.tv_sec = systemTime.tv_sec;
  98 + semaphoreWaitTime.tv_nsec = systemTime.tv_usec * 1000;
  99 +
  100 + result = sem_timedwait(semaphore, &semaphoreWaitTime);
  101 + if (result != 0)
  102 + {
  103 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  104 + }
  105 +
  106 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  107 +}
  108 +
  109 +
  110 +
  111 +/**
  112 + * @brief Release the semaphore token.
  113 + * @param semaphore: pointer to the created semaphore ID.
  114 + * @return an enum that represents a status of PSDK
  115 + */
  116 +T_JZsdkReturnCode JZsdk_Osal_SemaphorePost(T_JZsdkSemaHandle semaphore)
  117 +{
  118 + int result;
  119 +
  120 + result = sem_post(semaphore);
  121 + if (result != 0)
  122 + {
  123 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  124 + }
  125 +
  126 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  127 +}
  1 +/**
  2 + ********************************************************************
  3 + * @file JZsdk_Semaphore.h
  4 + * JZsdk_Semaphore.c 的头文件
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef JZSDK_SEMAPHORE_H
  11 +#define JZSDK_SEMAPHORE_H
  12 +
  13 +/* Includes ------------------------------------------------------------------*/
  14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  15 +
  16 +#ifdef __cplusplus
  17 +extern "C" {
  18 +#endif
  19 +
  20 +/* Exported constants --------------------------------------------------------*/
  21 +/* 常亮定义*/
  22 +
  23 +/* Exported macro ------------------------------------------------------------*/
  24 +
  25 +/* Exported types ------------------------------------------------------------*/
  26 +
  27 +
  28 +/* Exported functions --------------------------------------------------------*/
  29 +T_JZsdkReturnCode JZsdk_Osal_SemaphoreCreate(U32_t initValue, T_JZsdkSemaHandle *semaphore);
  30 +T_JZsdkReturnCode JZsdk_Osal_SemaphoreDestroy(T_JZsdkSemaHandle semaphore);
  31 +T_JZsdkReturnCode JZsdk_Osal_SemaphoreWait(T_JZsdkSemaHandle semaphore);
  32 +T_JZsdkReturnCode JZsdk_Osal_SemaphoreTimedWait(T_JZsdkSemaHandle semaphore, U32_t waitTime);
  33 +T_JZsdkReturnCode JZsdk_Osal_SemaphorePost(T_JZsdkSemaHandle semaphore);
  34 +
  35 +
  36 +#ifdef __cplusplus
  37 +}
  38 +#endif
  39 +
  40 +#endif
  41 +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/
  1 +#include <stdio.h>
  2 +#include <stdlib.h>
  3 +#include <pthread.h>
  4 +
  5 +#include "./JZsdk_Task.h"
  6 +
  7 +T_JZsdkReturnCode JZsdk_Osal_TaskCreate(const char *name, void *(*taskFunc)(void *), unsigned int stackSize, void *arg,
  8 + T_JZTaskHandle *task)
  9 +{
  10 + int result;
  11 + char nameDealed[16] = {0};
  12 +
  13 + //为任务句柄分配内存空间,大小为sizeof(pthread_t)。如果内存分配失败,则返回一个错误代码
  14 + *task = malloc(sizeof(pthread_t));
  15 + if (*task == NULL) {
  16 + return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
  17 + }
  18 +
  19 + //使用pthread_create函数创建一个新的线程,传递给它任务函数指针taskFunc和参数arg。如果创建线程失败,则返回一个错误代码
  20 + result = pthread_create(*task, NULL, taskFunc, arg);
  21 + if (result != 0) {
  22 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  23 + }
  24 +
  25 +
  26 + //如果任务名称name不为空,则将其拷贝到nameDealed字符数组中(最多拷贝sizeof(nameDealed) - 1个字符)。
  27 + if (name != NULL)
  28 + strncpy(nameDealed, name, sizeof(nameDealed) - 1);
  29 +
  30 + //使用pthread_setname_np函数将任务线程的名称设置为nameDealed。如果设置线程名称失败,则返回一个错误代码
  31 + result = pthread_setname_np(*(pthread_t *) *task, nameDealed);
  32 + if (result != 0) {
  33 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  34 + }
  35 +
  36 +/*int pthread_setcanceltype(int type, int *oldtype);
  37 +```
  38 +
  39 +- `type`参数指定了取消类型,可以是以下两个值之一:
  40 + - `PTHREAD_CANCEL_DEFERRED`:线程将在下一个取消点取消。取消点是指线程可以响应取消请求的一些特定操作点,例如函数调用、线程等待等。线程将继续运行,直到到达取消点后才会被取消。
  41 + - `PTHREAD_CANCEL_ASYNCHRONOUS`:线程立即取消,不论是否在取消点。线程将立即终止执行,不会进行清理操作。这种取消类型可能导致资源泄漏和数据不一致,因此需要谨慎使用。
  42 +- `oldtype`参数是一个可选的输出参数,用于获取之前的取消类型。
  43 +
  44 +*/
  45 + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
  46 +/*
  47 +- `state`参数指定了取消状态,可以是以下两个值之一:
  48 + - `PTHREAD_CANCEL_ENABLE`:线程可以接收取消请求。
  49 + - `PTHREAD_CANCEL_DISABLE`:线程忽略取消请求。
  50 +- `oldstate`参数是一个可选的输出参数,用于获取之前的取消状态。
  51 +
  52 +通过调用`pthread_setcancelstate`函数,您可以选择线程的取消状态。默认情况下,线程的取消状态是`PTHREAD_CANCEL_ENABLE`。*/
  53 + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
  54 +
  55 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  56 +
  57 +}
  58 +
  59 +
  60 +T_JZsdkReturnCode JZsdk_Osal_TaskDestroy(T_JZTaskHandle task)
  61 +{
  62 + pthread_cancel(*(pthread_t *) task);
  63 + free(task);
  64 +
  65 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  66 +}
  1 +/**
  2 + ********************************************************************
  3 + * @file JZsdk_Task.h
  4 + * JZsdk_Task.c 的头文件
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef JZSDK_TASK_H
  11 +#define JZSDK_TASK_H
  12 +
  13 +/* Includes ------------------------------------------------------------------*/
  14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  15 +
  16 +#ifdef __cplusplus
  17 +extern "C" {
  18 +#endif
  19 +
  20 +/* Exported constants --------------------------------------------------------*/
  21 +/* 常亮定义*/
  22 +
  23 +/* Exported macro ------------------------------------------------------------*/
  24 +
  25 +/* Exported types ------------------------------------------------------------*/
  26 +
  27 +
  28 +/* Exported functions --------------------------------------------------------*/
  29 +T_JZsdkReturnCode JZsdk_Osal_TaskCreate(const char *name, void *(*taskFunc)(void *), unsigned int stackSize, void *arg,
  30 + T_JZTaskHandle *task);
  31 +
  32 +T_JZsdkReturnCode JZsdk_Osal_TaskDestroy(T_JZTaskHandle task);
  33 +
  34 +#ifdef __cplusplus
  35 +}
  36 +#endif
  37 +
  38 +#endif
  39 +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/
  1 +#include <sys/time.h> // 为了使用 gettimeofday 函数
  2 +#include <time.h> // 为了使用 time 函数
  3 +
  4 +#include "./JZsdk_TimeR.h"
  5 +
  6 +static U32_t s_localTimeMsOffset = 0;
  7 +static U64_t s_localTimeUsOffset = 0;
  8 +
  9 +
  10 +/**
  11 + * @brief Get the system time for ms.
  12 + * @return an uint32 that the time of system, uint:ms
  13 + */
  14 +T_JZsdkReturnCode JZsdk_Osal_GetTimeMs(U32_t *ms)
  15 +{
  16 + struct timeval time;
  17 +
  18 + gettimeofday(&time, NULL);
  19 + *ms = (time.tv_sec * 1000 + time.tv_usec / 1000);
  20 +
  21 + if (s_localTimeMsOffset == 0)
  22 + {
  23 + s_localTimeMsOffset = *ms;
  24 + } else {
  25 + *ms = *ms - s_localTimeMsOffset;
  26 + }
  27 +
  28 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  29 +}
  30 +
  31 +T_JZsdkReturnCode JZsdk_Osal_GetTimeUs(U64_t *us)
  32 +{
  33 + struct timeval time;
  34 +
  35 + gettimeofday(&time, NULL);
  36 + *us = (time.tv_sec * 1000000 + time.tv_usec);
  37 +
  38 + if (s_localTimeUsOffset == 0) {
  39 + s_localTimeUsOffset = *us;
  40 + } else {
  41 + *us = *us - s_localTimeMsOffset;
  42 + }
  43 +
  44 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  45 +}
  46 +
  47 +T_JZsdkReturnCode JZsdk_Osal_GetRandomNum(U16_t *randomNum)
  48 +{
  49 + srand(time(NULL));
  50 + *randomNum = random() % 65535;
  51 +
  52 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  53 +}
  54 +
  55 +
  56 +/*
  57 +* 用于延时(粗略)
  58 +* 需要优化
  59 +*/
  60 +T_JZsdkReturnCode delayUs(U32_t msec)
  61 +{
  62 + usleep(msec);
  63 +
  64 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  65 +}
  66 +
  67 +/*
  68 +* 用于延时(粗略)
  69 +* 需要优化
  70 +*/
  71 +T_JZsdkReturnCode delayMs(U32_t msec)
  72 +{
  73 + usleep(msec * 1000);
  74 +
  75 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  76 +}
  77 +
  78 +/*
  79 +* 用于延时(粗略)
  80 +* 需要优化
  81 +*/
  82 +T_JZsdkReturnCode delayS(U32_t sec)
  83 +{
  84 + delayMs(sec * 1000);
  85 +
  86 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  87 +}
  1 +/**
  2 + ********************************************************************
  3 + * @file JZsdk_Timer.h
  4 + * JZsdk_Timer.c 的头文件
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef JZSDK_TIMER_H
  11 +#define JZSDK_TIMER_H
  12 +
  13 +/* Includes ------------------------------------------------------------------*/
  14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  15 +
  16 +#ifdef __cplusplus
  17 +extern "C" {
  18 +#endif
  19 +
  20 +/* Exported constants --------------------------------------------------------*/
  21 +/* 常亮定义*/
  22 +
  23 +/* Exported macro ------------------------------------------------------------*/
  24 +
  25 +/* Exported types ------------------------------------------------------------*/
  26 +
  27 +
  28 +/* Exported functions --------------------------------------------------------*/
  29 +T_JZsdkReturnCode JZsdk_Osal_GetTimeMs(U32_t *ms);
  30 +T_JZsdkReturnCode JZsdk_Osal_GetTimeUs(U64_t *us);
  31 +T_JZsdkReturnCode JZsdk_Osal_GetRandomNum(U16_t *randomNum);
  32 +T_JZsdkReturnCode delayUs(U32_t msec);
  33 +T_JZsdkReturnCode delayMs(U32_t msec);
  34 +T_JZsdkReturnCode delayS(U32_t sec);
  35 +
  36 +
  37 +#ifdef __cplusplus
  38 +}
  39 +#endif
  40 +
  41 +#endif
  42 +/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/
@@ -25,8 +25,11 @@ @@ -25,8 +25,11 @@
25 #include "JZsdk_Hal.h" 25 #include "JZsdk_Hal.h"
26 26
27 #if APP_VERSION == APP_PSDK 27 #if APP_VERSION == APP_PSDK
  28 +
28 #include "fc_subscription/test_fc_subscription.h" 29 #include "fc_subscription/test_fc_subscription.h"
  30 +
29 #endif 31 #endif
  32 +
30 #include "DeviceInfo/DeviceInfo.h" 33 #include "DeviceInfo/DeviceInfo.h"
31 34
32 #ifdef MEGAPHONE_CONFIG_STATUS_ON 35 #ifdef MEGAPHONE_CONFIG_STATUS_ON
@@ -7,19 +7,19 @@ @@ -7,19 +7,19 @@
7 #define VERSION_CHOOSE_H 7 #define VERSION_CHOOSE_H
8 #include "JZsdk_Base/JZsdk_Code/JZsdk_DeviceCode.h" 8 #include "JZsdk_Base/JZsdk_Code/JZsdk_DeviceCode.h"
9 //1~10行 除了D可以修改版本选择 禁止动任何东西 9 //1~10行 除了D可以修改版本选择 禁止动任何东西
10 -#define DEVICE_VERSION JZ_C1 10 +#define DEVICE_VERSION JZ_H10
11 11
12 //禁止修改行 选择是串口程序 还是 psdk程序 12 //禁止修改行 选择是串口程序 还是 psdk程序
13 -#define APP_VERSION APP_PSDK 13 +#define APP_VERSION APP_UART
14 14
15 //禁止修改行 板子型号 15 //禁止修改行 板子型号
16 #define PLATFORM_VERSION PLATFORM_V3S 16 #define PLATFORM_VERSION PLATFORM_V3S
17 17
18 //禁止修改行 串口连接程序的软件版本号 18 //禁止修改行 串口连接程序的软件版本号
19 -#define MAJOR_VERSION 0x01  
20 -#define MINOR_VERSION 0x03  
21 -#define MODIFY_VERSION 0x09  
22 -#define DEBUG_VERSION 0x07 19 +#define MAJOR_VERSION 0x00
  20 +#define MINOR_VERSION 0x00
  21 +#define MODIFY_VERSION 0x02
  22 +#define DEBUG_VERSION 0x12
23 23
24 //禁止修改行 滤波方式 24 //禁止修改行 滤波方式
25 #define FILTERING_TYPE HIGH_PASS_FILTERING 25 #define FILTERING_TYPE HIGH_PASS_FILTERING
@@ -59,6 +59,7 @@ T_JZsdkReturnCode JZsdk_HalUsbBulk_Init(void **index, int interfaceNum, int isUs @@ -59,6 +59,7 @@ T_JZsdkReturnCode JZsdk_HalUsbBulk_Init(void **index, int interfaceNum, int isUs
59 ret = libusb_init(NULL); 59 ret = libusb_init(NULL);
60 if (ret < 0) { 60 if (ret < 0) {
61 JZSDK_LOG_ERROR("init usb bulk failed, errno = %d", ret); 61 JZSDK_LOG_ERROR("init usb bulk failed, errno = %d", ret);
  62 +
62 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 63 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
63 } 64 }
64 65
@@ -147,6 +148,7 @@ T_JZsdkReturnCode JZsdk_HalUsbBulk_ReadData(void **index ,unsigned char *buf, un @@ -147,6 +148,7 @@ T_JZsdkReturnCode JZsdk_HalUsbBulk_ReadData(void **index ,unsigned char *buf, un
147 buf, len, &actualLen, LINUX_USB_BULK_TRANSFER_WAIT_FOREVER); 148 buf, len, &actualLen, LINUX_USB_BULK_TRANSFER_WAIT_FOREVER);
148 if (ret < 0) { 149 if (ret < 0) {
149 JZSDK_LOG_ERROR("Read usb bulk data failed, errno = %d", ret); 150 JZSDK_LOG_ERROR("Read usb bulk data failed, errno = %d", ret);
  151 + delayMs(100);
150 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 152 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
151 } 153 }
152 #endif 154 #endif
@@ -69,7 +69,7 @@ T_JZsdkReturnCode AudioDeal_Init() @@ -69,7 +69,7 @@ T_JZsdkReturnCode AudioDeal_Init()
69 AudioDeakInfo_index->FilterInfo = NULL; 69 AudioDeakInfo_index->FilterInfo = NULL;
70 FF_Filter_Init(AudioDeakInfo_index, 0x00); 70 FF_Filter_Init(AudioDeakInfo_index, 0x00);
71 71
72 - //初始化mp2音频 72 + //初始化实时
73 File_Stream_deal_Init(AV_CODEC_ID_MP2); 73 File_Stream_deal_Init(AV_CODEC_ID_MP2);
74 74
75 Audiodeal_status = JZ_FLAGCODE_ON; 75 Audiodeal_status = JZ_FLAGCODE_ON;
@@ -195,11 +195,20 @@ T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer, @@ -195,11 +195,20 @@ T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer,
195 //1、打开音频库的处理标志位,该标志可以重复打开,只有强制关闭音频时,需要关闭该标志 195 //1、打开音频库的处理标志位,该标志可以重复打开,只有强制关闭音频时,需要关闭该标志
196 AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_ON; 196 AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_ON;
197 197
198 - mp3_Stream_Interface_Mp3Data(AudioDeakInfo_index, In_Bitrate, buffer, bytesRead); 198 + T_JZsdkReturnCode ret = mp3_Stream_Interface_Mp3Data(AudioDeakInfo_index, In_Bitrate, buffer, bytesRead);
  199 + if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE)
  200 + {
  201 + return JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE;
  202 + }
199 203
200 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 204 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
201 } 205 }
202 206
  207 +T_JZsdkReturnCode AudioDeal_Mp3DataStop()
  208 +{
  209 + mp3_Stream_Interface_Mp3Data_Stop(AudioDeakInfo_index);
  210 +}
  211 +
203 /******************* 212 /*******************
204 * 213 *
205 * 暂停播放 214 * 暂停播放
@@ -264,9 +273,6 @@ T_JZsdkReturnCode AudioDeal_StopDeal() @@ -264,9 +273,6 @@ T_JZsdkReturnCode AudioDeal_StopDeal()
264 //清空alsa里的缓冲区 273 //清空alsa里的缓冲区
265 Alsa_DropPcm(AudioDeakInfo_index); 274 Alsa_DropPcm(AudioDeakInfo_index);
266 275
267 - //清空mp3音频流  
268 - Stream_Player_Stop(AudioDeakInfo_index);  
269 -  
270 while (AudioDeakInfo_index->AudioDeal_Alsa_Finish_Flag != JZ_FLAGCODE_OFF) 276 while (AudioDeakInfo_index->AudioDeal_Alsa_Finish_Flag != JZ_FLAGCODE_OFF)
271 { 277 {
272 delayMs(1); 278 delayMs(1);
@@ -99,6 +99,7 @@ T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer, @@ -99,6 +99,7 @@ T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer,
99 T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status); 99 T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status);
100 T_JZsdkReturnCode Get_AudioDealStatus(); 100 T_JZsdkReturnCode Get_AudioDealStatus();
101 T_JZsdkReturnCode AudioDeal_SetFilterMode(int mode); 101 T_JZsdkReturnCode AudioDeal_SetFilterMode(int mode);
  102 +T_JZsdkReturnCode AudioDeal_Mp3DataStop();
102 103
103 #ifdef __cplusplus 104 #ifdef __cplusplus
104 } 105 }
@@ -30,9 +30,8 @@ int PCM_PooL_Interface_PcmData(struct AudioDealInfo *AD_Info,unsigned int in_sam @@ -30,9 +30,8 @@ int PCM_PooL_Interface_PcmData(struct AudioDealInfo *AD_Info,unsigned int in_sam
30 int PCM_PooL_Interface_PcmData_WithoutReply(struct AudioDealInfo *AD_Info,unsigned int in_sampleRate, AVChannelLayout in_ch_layout, enum AVSampleFormat in_format , unsigned char* data, int dataSize); 30 int PCM_PooL_Interface_PcmData_WithoutReply(struct AudioDealInfo *AD_Info,unsigned int in_sampleRate, AVChannelLayout in_ch_layout, enum AVSampleFormat in_format , unsigned char* data, int dataSize);
31 T_JZsdkReturnCode AudioFile_Stream_Interface_PcmData(struct AudioDealInfo *AD_Info, AVFrame *frame); 31 T_JZsdkReturnCode AudioFile_Stream_Interface_PcmData(struct AudioDealInfo *AD_Info, AVFrame *frame);
32 T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize); 32 T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize);
33 -  
34 T_JZsdkReturnCode File_Stream_deal_Init(enum AVCodecID id); 33 T_JZsdkReturnCode File_Stream_deal_Init(enum AVCodecID id);
35 -T_JZsdkReturnCode Stream_Player_Stop(struct AudioDealInfo *AD_Info); 34 +T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data_Stop(struct AudioDealInfo *AD_Info);
36 35
37 #ifdef __cplusplus 36 #ifdef __cplusplus
38 } 37 }
@@ -23,60 +23,48 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -23,60 +23,48 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
23 23
24 T_JZsdkReturnCode File_Stream_deal_Init(enum AVCodecID id) 24 T_JZsdkReturnCode File_Stream_deal_Init(enum AVCodecID id)
25 { 25 {
26 - //注册包  
27 pkt = av_packet_alloc(); 26 pkt = av_packet_alloc();
28 if(!pkt) 27 if(!pkt)
29 { 28 {
30 JZSDK_LOG_ERROR("av_packet_alloc failed."); 29 JZSDK_LOG_ERROR("av_packet_alloc failed.");
31 } 30 }
32 31
33 - //寻找解码器  
34 codec = avcodec_find_decoder(id); 32 codec = avcodec_find_decoder(id);
35 if (!codec) { 33 if (!codec) {
36 JZSDK_LOG_ERROR("Codec not found\n"); 34 JZSDK_LOG_ERROR("Codec not found\n");
37 } 35 }
38 36
39 - //获得裸流的解析器  
40 parser = av_parser_init(codec->id); 37 parser = av_parser_init(codec->id);
41 if (!parser) { 38 if (!parser) {
42 JZSDK_LOG_ERROR("Parser not found\n"); 39 JZSDK_LOG_ERROR("Parser not found\n");
43 } 40 }
44 41
45 - //分配解码上下文  
46 cdc_ctx = avcodec_alloc_context3(codec); 42 cdc_ctx = avcodec_alloc_context3(codec);
47 if (!cdc_ctx) { 43 if (!cdc_ctx) {
48 JZSDK_LOG_ERROR("Could not allocate audio codec context\n"); 44 JZSDK_LOG_ERROR("Could not allocate audio codec context\n");
49 } 45 }
50 46
51 - //将解码器和解码上下文绑定 47 + /* open it */
52 if (avcodec_open2(cdc_ctx, codec, NULL) < 0) 48 if (avcodec_open2(cdc_ctx, codec, NULL) < 0)
53 { 49 {
54 JZSDK_LOG_ERROR("Could not open codec\n"); 50 JZSDK_LOG_ERROR("Could not open codec\n");
55 } 51 }
56 52
57 - JZSDK_LOG_INFO("file stream init complete");  
58 -  
59 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 53 + JZSDK_LOG_INFO("File_Stream_deal_Init success");
60 } 54 }
61 55
62 //输入mp3的实时数据,以及本次数据的长度 56 //输入mp3的实时数据,以及本次数据的长度
63 T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize) 57 T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize)
64 { 58 {
65 - //JZSDK_LOG_DEBUG("mp3 stream输入 %d 字节数据", dataSize); 59 + //JZSDK_LOG_DEBUG("mp3_Stream_Interface_Mp3Data");
66 60
67 - //重置重采样器  
68 - FF_Resample_Reset(AD_Info, in_sampleRate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16);  
69 -  
70 - //检查滤波器  
71 - FF_Filter_Init(AD_Info, 0x01);  
72 -  
73 - int ret = 0;  
74 - unsigned char *databufPtr = data;  
75 - int databufSize = dataSize; 61 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
76 62
77 //将数据输入到 63 //将数据输入到
78 - while(databufSize > 0) 64 + while(dataSize > 0 && (AD_Info->AudioDeal_ResampleAndFilter_Execute_Flag == JZ_FLAGCODE_ON))
79 { 65 {
  66 + //printf("开始解码\n");
  67 +
80 //如果解码器不存在,初始化解码器 68 //如果解码器不存在,初始化解码器
81 if (!decoded_frame) 69 if (!decoded_frame)
82 { 70 {
@@ -87,31 +75,47 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un @@ -87,31 +75,47 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un
87 } 75 }
88 } 76 }
89 77
  78 + //printf("alloc后\n");
  79 +
90 //检查参数,并将正确的数据输入到pkt中 80 //检查参数,并将正确的数据输入到pkt中
91 //parser 解析器 81 //parser 解析器
92 //cdc_ctx 上下文 82 //cdc_ctx 上下文
93 //pkt输出的数据指针 83 //pkt输出的数据指针
94 //data datasize 输入的数据指针 84 //data datasize 输入的数据指针
95 //pts、dts、pos:时间戳和位置信息,一般可以设置为AV_NOPTS_VALUE和0。 85 //pts、dts、pos:时间戳和位置信息,一般可以设置为AV_NOPTS_VALUE和0。
96 - ret = av_parser_parse2(parser, cdc_ctx, &pkt->data, &pkt->size, databufPtr, databufSize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0); 86 + int ret = av_parser_parse2(parser, cdc_ctx, &pkt->data, &pkt->size, data, dataSize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
97 if (ret < 0) { 87 if (ret < 0) {
98 - printf("Error while parsing\n"); 88 + JZSDK_LOG_ERROR("Error while parsing\n");
99 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 89 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
100 } 90 }
101 91
  92 + //printf("av_parser_parse2\n");
  93 +
  94 + //重置重采样器
  95 + FF_Resample_Reset(AD_Info, in_sampleRate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16);
  96 +
  97 + //printf("FF_Resample_Reset\n");
  98 +
  99 + //检查滤波器
  100 + FF_Filter_Init(AD_Info, 0x01);
  101 +
  102 + //printf("FF_Filter_Init %d \n", pkt->size );
  103 +
102 //数据指针 往后一个解析长度 104 //数据指针 往后一个解析长度
103 //长度指针 减少一个被解析数据的长度 105 //长度指针 减少一个被解析数据的长度
104 - databufPtr += ret;  
105 - databufSize -= ret; 106 + data += ret;
  107 + dataSize -= ret;
106 108
107 //如果输出有长度 解码输出的数据 109 //如果输出有长度 解码输出的数据
108 if (pkt->size > 0) 110 if (pkt->size > 0)
109 { 111 {
110 - Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame); 112 + ret = Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame);
  113 + if(ret == JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE)
  114 + {
  115 + return JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE;
  116 + }
111 } 117 }
112 } 118 }
113 -  
114 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
115 } 119 }
116 120
117 121
@@ -121,17 +125,14 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -121,17 +125,14 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
121 { 125 {
122 int ret; 126 int ret;
123 127
  128 + //JZSDK_LOG_DEBUG("Stream_Player_decode");
  129 +
124 //发送数据包给解码器解码,已将数据解码为pcm原始数据 130 //发送数据包给解码器解码,已将数据解码为pcm原始数据
125 ret = avcodec_send_packet(dec_ctx, pkt); 131 ret = avcodec_send_packet(dec_ctx, pkt);
126 - if (ret == AVERROR(EAGAIN))  
127 - {  
128 - char errbuf[128];  
129 - av_strerror(ret, errbuf, sizeof(errbuf));  
130 - JZSDK_LOG_ERROR("Error while sending a packet to the decoder %s",errbuf);  
131 - }  
132 - else if (ret < 0) 132 + if (ret < 0)
133 { 133 {
134 JZSDK_LOG_ERROR("Error submitting the packet to the decoder, ret=%d\n",ret); 134 JZSDK_LOG_ERROR("Error submitting the packet to the decoder, ret=%d\n",ret);
  135 + //return JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE;
135 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 136 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
136 } 137 }
137 138
@@ -139,27 +140,36 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -139,27 +140,36 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
139 AVFrame *eq_frame = av_frame_alloc(); 140 AVFrame *eq_frame = av_frame_alloc();
140 AVFrame *temp_frame = av_frame_alloc(); 141 AVFrame *temp_frame = av_frame_alloc();
141 142
  143 + //JZSDK_LOG_DEBUG("alloc");
  144 +
142 /* read all the output frames (in general there may be any number of them */ 145 /* read all the output frames (in general there may be any number of them */
143 //读取输出的帧 146 //读取输出的帧
144 - while ( (ret >= 0) && AD_Info->AudioDeal_ResampleAndFilter_Execute_Flag == JZ_FLAGCODE_ON) 147 + while ( (ret >= 0) && (AD_Info->AudioDeal_ResampleAndFilter_Execute_Flag == JZ_FLAGCODE_ON) )
145 { 148 {
146 //从解码器中读取解码后的音频帧数据 149 //从解码器中读取解码后的音频帧数据
147 ret = avcodec_receive_frame(dec_ctx, frame); 150 ret = avcodec_receive_frame(dec_ctx, frame);
148 //输出帧不可用 、 输出帧 已用完 151 //输出帧不可用 、 输出帧 已用完
149 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) 152 if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
150 { 153 {
151 - break; 154 + continue;;
152 } 155 }
153 else if (ret < 0) 156 else if (ret < 0)
154 { 157 {
155 JZSDK_LOG_ERROR("Error during decoding\n"); 158 JZSDK_LOG_ERROR("Error during decoding\n");
  159 +
  160 + //释放掉输出的变量
  161 + av_frame_free(&eq_frame);
  162 + av_frame_free(&temp_frame);
  163 +
  164 + //JZSDK_LOG_DEBUG("提前释放后\n");
  165 +
156 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 166 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
157 } 167 }
158 168
159 - //printf("输出了:%d的数据\n",frame->nb_samples);  
160 -  
161 int out_nb_samples = 0; 169 int out_nb_samples = 0;
162 170
  171 + //JZSDK_LOG_DEBUG("播放前");
  172 +
163 //重采样解码后的数据 173 //重采样解码后的数据
164 void* resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, frame->data, frame->nb_samples, &out_nb_samples); 174 void* resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, frame->data, frame->nb_samples, &out_nb_samples);
165 175
@@ -181,8 +191,6 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -181,8 +191,6 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
181 break; 191 break;
182 } 192 }
183 193
184 - //printf("pcm播放 %d 数据\n",eq_frame->nb_samples);  
185 -  
186 //播放改滤波后的帧 194 //播放改滤波后的帧
187 Pcm_AlsaPlay(AD_Info, (unsigned char*)eq_frame->data[0], eq_frame->nb_samples); 195 Pcm_AlsaPlay(AD_Info, (unsigned char*)eq_frame->data[0], eq_frame->nb_samples);
188 196
@@ -201,17 +209,18 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -201,17 +209,18 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
201 FF_Resample_freeReasmpleData(resampledData); 209 FF_Resample_freeReasmpleData(resampledData);
202 } 210 }
203 211
  212 + //JZSDK_LOG_DEBUG("怀疑释放前\n");
  213 +
204 //释放掉输出的变量 214 //释放掉输出的变量
205 av_frame_unref(temp_frame); 215 av_frame_unref(temp_frame);
206 av_frame_unref(eq_frame); 216 av_frame_unref(eq_frame);
207 217
  218 + //JZSDK_LOG_DEBUG("怀疑释放后\n");
208 } 219 }
209 220
210 -T_JZsdkReturnCode Stream_Player_Stop(struct AudioDealInfo *AD_Info) 221 +T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data_Stop(struct AudioDealInfo *AD_Info)
211 { 222 {
212 - pkt->data = NULL;  
213 - pkt->size = 0;  
214 - Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame);  
215 -  
216 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 223 + // pkt->data = NULL;
  224 + // pkt->size = 0;
  225 + // Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame);
217 } 226 }
@@ -821,6 +821,7 @@ T_JZsdkReturnCode Gimbal_Flush_Pitch() @@ -821,6 +821,7 @@ T_JZsdkReturnCode Gimbal_Flush_Pitch()
821 static T_JZsdkReturnCode Gimbal_Init_Gimbal_Init_TransparentControl() 821 static T_JZsdkReturnCode Gimbal_Init_Gimbal_Init_TransparentControl()
822 { 822 {
823 // 823 //
  824 + g_Gimbal_Mode = JZ_MODULE_CONTROL_WAY_TRANSPARENT;
824 825
825 826
826 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 827 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@@ -835,6 +836,9 @@ static T_JZsdkReturnCode Gimbal_Init_Gimbal_Init_TransparentControl() @@ -835,6 +836,9 @@ static T_JZsdkReturnCode Gimbal_Init_Gimbal_Init_TransparentControl()
835 * **************************/ 836 * **************************/
836 static T_JZsdkReturnCode Gimbal_Init_IndependentControl() 837 static T_JZsdkReturnCode Gimbal_Init_IndependentControl()
837 { 838 {
  839 + g_Gimbal_Mode = JZ_MODULE_CONTROL_WAY_INDEPENDENT;
  840 +
  841 +
838 //舵机初始化 842 //舵机初始化
839 Gimal_MotorInit(); 843 Gimal_MotorInit();
840 844
@@ -11,6 +11,7 @@ @@ -11,6 +11,7 @@
11 11
12 #include "Hal_Send/HalSend.h" 12 #include "Hal_Send/HalSend.h"
13 #include "JZsdk_uart/JZsdk_Uart.h" 13 #include "JZsdk_uart/JZsdk_Uart.h"
  14 +#include "Ircut/H3_ircut/H3_ircut.h"
14 15
15 #ifdef WIRINGPI_STATUS_ON 16 #ifdef WIRINGPI_STATUS_ON
16 #include <wiringPi.h> 17 #include <wiringPi.h>
@@ -145,6 +145,7 @@ T_JZsdkReturnCode H3_ircut_init() @@ -145,6 +145,7 @@ T_JZsdkReturnCode H3_ircut_init()
145 if (DEVICE_VERSION == JZ_H10) 145 if (DEVICE_VERSION == JZ_H10)
146 { 146 {
147 pinMode(MOTOR_IRCUT_PIN,PWM_OUTPUT);//设置输出模式 147 pinMode(MOTOR_IRCUT_PIN,PWM_OUTPUT);//设置输出模式
  148 + JZSDK_LOG_INFO("H3 gimbal Init Complete");
148 } 149 }
149 150
150 JZSDK_LOG_INFO("H3 Init Complete"); 151 JZSDK_LOG_INFO("H3 Init Complete");
@@ -25,6 +25,9 @@ typedef struct IRC_param @@ -25,6 +25,9 @@ typedef struct IRC_param
25 { 25 {
26 int DealWay; //0为JZSDK自带的红外处理,1为KT库的红外处理 26 int DealWay; //0为JZSDK自带的红外处理,1为KT库的红外处理
27 27
  28 + int Filp_V; //垂直翻转
  29 + int Filp_H; //水平翻转
  30 +
28 int ImgDataBits; //图像位数 31 int ImgDataBits; //图像位数
29 int ExpectedMax; //最大灰度值 32 int ExpectedMax; //最大灰度值
30 int Gain; //对比度,这里设为 11 33 int Gain; //对比度,这里设为 11
@@ -89,11 +92,11 @@ typedef struct IRC_param @@ -89,11 +92,11 @@ typedef struct IRC_param
89 U16_t *Factory_LowT_Mark_Data; //出厂的低温标定帧灰度 92 U16_t *Factory_LowT_Mark_Data; //出厂的低温标定帧灰度
90 unsigned int Factory_LowT_Mark_Data_flag; //出厂的高温标定帧灰度标志位 93 unsigned int Factory_LowT_Mark_Data_flag; //出厂的高温标定帧灰度标志位
91 94
92 - U16_t *HighT_NineFrameAdd; //高温温度判定时的9帧综合数组 95 + int *HighT_NineFrameAdd; //高温温度判定时的9帧综合数组
93 U16_t *HighT_NineFrame_Avg; //高温温度判定时的9帧综合数组平均值 96 U16_t *HighT_NineFrame_Avg; //高温温度判定时的9帧综合数组平均值
94 unsigned int HighT_flag; //高温判定标志 0~9 0关闭,1~9 为计数 97 unsigned int HighT_flag; //高温判定标志 0~9 0关闭,1~9 为计数
95 98
96 - U16_t *LowT_NineFrameAdd; //低温温度判断时的9帧综合数组 99 + int *LowT_NineFrameAdd; //低温温度判断时的9帧综合数组
97 U16_t *LowT_NineFrame_Avg; //低温温度判定时的9帧综合数组平均值 100 U16_t *LowT_NineFrame_Avg; //低温温度判定时的9帧综合数组平均值
98 unsigned int LowT_flag; //低温判定标志 0~9 0关闭,1~9 为计数 101 unsigned int LowT_flag; //低温判定标志 0~9 0关闭,1~9 为计数
99 102
@@ -50,7 +50,10 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d @@ -50,7 +50,10 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d
50 { 50 {
51 JZSDK_LOG_DEBUG("开始低温标定"); 51 JZSDK_LOG_DEBUG("开始低温标定");
52 memset(dealInfo->LowT_NineFrameAdd, 0, dealInfo->PixelNum); 52 memset(dealInfo->LowT_NineFrameAdd, 0, dealInfo->PixelNum);
53 - memcpy(dealInfo->LowT_NineFrameAdd, ImageData, dealInfo->PixelNum * sizeof(U16_t)); 53 + for (int i = 0; i < dealInfo->PixelNum; i++)
  54 + {
  55 + dealInfo->LowT_NineFrameAdd[i] += ImageData[i];
  56 + }
54 dealInfo->LowT_flag++; 57 dealInfo->LowT_flag++;
55 } 58 }
56 else if (dealInfo->LowT_flag == JZ_FLAGCODE_OFF) 59 else if (dealInfo->LowT_flag == JZ_FLAGCODE_OFF)
@@ -61,7 +64,7 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d @@ -61,7 +64,7 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d
61 else 64 else
62 { 65 {
63 //否则累加存储数组 66 //否则累加存储数组
64 - for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++) 67 + for (int i = 0; i < dealInfo->PixelNum; i++)
65 { 68 {
66 dealInfo->LowT_NineFrameAdd[i] += ImageData[i]; 69 dealInfo->LowT_NineFrameAdd[i] += ImageData[i];
67 } 70 }
@@ -75,7 +78,7 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d @@ -75,7 +78,7 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d
75 { 78 {
76 for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++) 79 for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++)
77 { 80 {
78 - dealInfo->LowT_NineFrame_Avg[i] = dealInfo->LowT_NineFrameAdd[i] / 9; 81 + dealInfo->LowT_NineFrame_Avg[i] = (int)(dealInfo->LowT_NineFrameAdd[i] / 9);
79 } 82 }
80 83
81 dealInfo->LowT_flag = JZ_FLAGCODE_OFF; //将标志位归位 84 dealInfo->LowT_flag = JZ_FLAGCODE_OFF; //将标志位归位
@@ -104,7 +107,11 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param @@ -104,7 +107,11 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param
104 { 107 {
105 JZSDK_LOG_DEBUG("开始高温标定"); 108 JZSDK_LOG_DEBUG("开始高温标定");
106 memset(dealInfo->HighT_NineFrameAdd, 0, dealInfo->PixelNum); 109 memset(dealInfo->HighT_NineFrameAdd, 0, dealInfo->PixelNum);
107 - memcpy(dealInfo->HighT_NineFrameAdd, ImageData, dealInfo->PixelNum * sizeof(U16_t)); 110 + for (int i = 0; i < dealInfo->PixelNum; i++)
  111 + {
  112 + dealInfo->HighT_NineFrameAdd[i] += ImageData[i];
  113 + }
  114 +
108 dealInfo->HighT_flag++; 115 dealInfo->HighT_flag++;
109 } 116 }
110 else if (dealInfo->HighT_flag == JZ_FLAGCODE_OFF) 117 else if (dealInfo->HighT_flag == JZ_FLAGCODE_OFF)
@@ -115,7 +122,7 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param @@ -115,7 +122,7 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param
115 else 122 else
116 { 123 {
117 //否则累加存储数组 124 //否则累加存储数组
118 - for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++) 125 + for (int i = 0; i < dealInfo->PixelNum; i++)
119 { 126 {
120 dealInfo->HighT_NineFrameAdd[i] += ImageData[i]; 127 dealInfo->HighT_NineFrameAdd[i] += ImageData[i];
121 } 128 }
@@ -128,7 +135,7 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param @@ -128,7 +135,7 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param
128 { 135 {
129 for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++) 136 for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++)
130 { 137 {
131 - dealInfo->HighT_NineFrame_Avg[i] = dealInfo->HighT_NineFrameAdd[i] / 9; 138 + dealInfo->HighT_NineFrame_Avg[i] = (U16_t)(dealInfo->HighT_NineFrameAdd[i] / 9);
132 } 139 }
133 140
134 dealInfo->HighT_flag = JZ_FLAGCODE_OFF; //将标志位归位 141 dealInfo->HighT_flag = JZ_FLAGCODE_OFF; //将标志位归位
@@ -886,7 +893,8 @@ T_JZsdkReturnCode IRC_LocalFrame_DataWrite(int flag,struct IRC_param *dealInfo, @@ -886,7 +893,8 @@ T_JZsdkReturnCode IRC_LocalFrame_DataWrite(int flag,struct IRC_param *dealInfo,
886 893
887 //写入数据 894 //写入数据
888 for (int i = 0; i < image_size; i++) { 895 for (int i = 0; i < image_size; i++) {
889 - fprintf(fp, "%d ", image[i]); 896 + //fprintf(fp, "%d ", image[i]);
  897 + fprintf(fp, "%u ", (unsigned int)image[i]);
890 } 898 }
891 899
892 fclose(fp); // 关闭文件 900 fclose(fp); // 关闭文件
@@ -21,6 +21,8 @@ int g_temp_GasValueMin = 30; @@ -21,6 +21,8 @@ int g_temp_GasValueMin = 30;
21 21
22 struct IRC_param *g_IRC_Param = NULL; 22 struct IRC_param *g_IRC_Param = NULL;
23 static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, int width, int frameRate); 23 static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, int width, int frameRate);
  24 +static int lastSPCMode = -1; //0低温数据 1手动打档 2自动打档
  25 +static int lastTPCMode = -1;
24 26
25 static FILE *temp_fp = NULL; 27 static FILE *temp_fp = NULL;
26 28
@@ -107,6 +109,15 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int * @@ -107,6 +109,15 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int *
107 JZsdk_CutBadPixel_U16(rawData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, dealInfo->BadPixelNum,dealInfo->BadPixelExtern, 1); 109 JZsdk_CutBadPixel_U16(rawData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, dealInfo->BadPixelNum,dealInfo->BadPixelExtern, 1);
108 } 110 }
109 111
  112 + // //盲点过后进行数据复查
  113 + // for (int i = 0; i < *rawSize; i++)
  114 + // {
  115 + // if (rawData[i] > dealInfo->ExpectedMax)
  116 + // {
  117 + // rawData[i] = dealInfo->ExpectedMax;
  118 + // }
  119 + // }
  120 +
110 /*************************************两点纠正部分******************************************************************/ 121 /*************************************两点纠正部分******************************************************************/
111 122
112 //判断两点的数据模式是否有改变 123 //判断两点的数据模式是否有改变
@@ -345,6 +356,35 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int * @@ -345,6 +356,35 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int *
345 dealInfo->FirstSPC_flag = JZ_FLAGCODE_ON; 356 dealInfo->FirstSPC_flag = JZ_FLAGCODE_ON;
346 } 357 }
347 358
  359 + //判断单点下石佛切换过单点模式(切换低温数据 或 手动打挡),如果切换过,鲲腾要重新注入spc数据
  360 + if ( (dealInfo->SPC_mode == 0 && lastSPCMode != 0 ) || (dealInfo->SPC_mode == 1 && lastSPCMode != 1))
  361 + {
  362 +#ifdef KTIRC_LIB_STATUS_ON
  363 + if (dealInfo->SPC_mode == 0)
  364 + {
  365 + KtLib_writeMarkData(SPC_MARK_DATA, dealInfo->LowT_NineFrame_Avg ,dealInfo->PixelNum);
  366 + }
  367 +
  368 + if (dealInfo->SPC_mode == 1)
  369 + {
  370 + //此时spc数据应该是换过的
  371 + KtLib_writeMarkData(SPC_MARK_DATA, dealInfo->SPC_Mark_Data ,dealInfo->PixelNum);
  372 + }
  373 +#endif
  374 + }
  375 +
  376 + lastSPCMode = dealInfo->SPC_mode;
  377 +
  378 + //判断单点模式 选择了低温数据的情况下,是否切换过低温数据组
  379 + if (dealInfo->SPC_mode == 0)
  380 + {
  381 + if (lastTPCMode != dealInfo->TPC_mode)
  382 + {
  383 + KtLib_writeMarkData(SPC_MARK_DATA, dealInfo->LowT_NineFrame_Avg ,dealInfo->PixelNum);
  384 + lastTPCMode = dealInfo->TPC_mode;
  385 + }
  386 + }
  387 +
348 //如果处于自动打档模式 388 //如果处于自动打档模式
349 if (dealInfo->SPC_mode == 2) 389 if (dealInfo->SPC_mode == 2)
350 { 390 {
@@ -374,9 +414,11 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int * @@ -374,9 +414,11 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int *
374 IRC_LocalFrame_DataWrite(SPC_MARK_DATA, dealInfo, (U16_t *)dealInfo->SPC_Mark_Data, dealInfo->PixelNum); 414 IRC_LocalFrame_DataWrite(SPC_MARK_DATA, dealInfo, (U16_t *)dealInfo->SPC_Mark_Data, dealInfo->PixelNum);
375 415
376 //如果开启开启的昆腾库,则载入昆腾数据 416 //如果开启开启的昆腾库,则载入昆腾数据
377 - if (g_IRC_Param->DealWay == IRC_DEALMODE_KTLIB) 417 + if (g_IRC_Param->DealWay == IRC_DEALMODE_KTLIB && dealInfo->SPC_mode == 1)
378 { 418 {
  419 +#ifdef KTIRC_LIB_STATUS_ON
379 KtLib_writeMarkData(SPC_MARK_DATA ,dealInfo->SPC_Mark_Data, dealInfo->PixelNum); 420 KtLib_writeMarkData(SPC_MARK_DATA ,dealInfo->SPC_Mark_Data, dealInfo->PixelNum);
  421 +#endif
380 } 422 }
381 423
382 dealInfo->SPC_ResetFlag = JZ_FLAGCODE_OFF; 424 dealInfo->SPC_ResetFlag = JZ_FLAGCODE_OFF;
@@ -417,14 +459,8 @@ unsigned int Get_2DImage_PointToArray(int x, int y, int width, int height) @@ -417,14 +459,8 @@ unsigned int Get_2DImage_PointToArray(int x, int y, int width, int height)
417 static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param *dealInfo) 459 static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param *dealInfo)
418 { 460 {
419 //将rgb图形镜像 461 //将rgb图形镜像
420 - int MirrorImageFlag = JZ_FLAGCODE_ON;  
421 - if (dealInfo->DealWay == IRC_DEALMODE_KTLIB)  
422 - {  
423 - MirrorImageFlag = JZ_FLAGCODE_OFF;  
424 - }  
425 -  
426 -  
427 - if (MirrorImageFlag == JZ_FLAGCODE_ON) 462 + //水平镜像
  463 + if (dealInfo->Filp_H == JZ_FLAGCODE_ON)
428 { 464 {
429 int x, y = 0; 465 int x, y = 0;
430 466
@@ -457,6 +493,32 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -457,6 +493,32 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
457 free(temp_row); // 释放临时缓冲区 493 free(temp_row); // 释放临时缓冲区
458 } 494 }
459 495
  496 + //垂直镜像
  497 + if (dealInfo->Filp_V == JZ_FLAGCODE_ON) // 假设Filp_V是控制垂直翻转的标志
  498 + {
  499 + int x, y = 0;
  500 + int bytes_per_row = dealInfo->Width * 3; // 每行的字节数,假设图像是RGB格式
  501 + unsigned char *temp_image = (unsigned char *)malloc(dealInfo->Height * bytes_per_row); // 临时缓冲区,用于存储整个图像的像素数据
  502 +
  503 + if (temp_image == NULL) {
  504 + // 内存分配失败处理
  505 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  506 + }
  507 +
  508 + // 复制整个图像到临时缓冲区
  509 + memcpy(temp_image, rgb_data, dealInfo->Height * bytes_per_row);
  510 +
  511 + // 遍历图像的每一行
  512 + for (y = 0; y < dealInfo->Height; y++) {
  513 + // 从临时缓冲区中复制对应行的数据回原图像,但是是从底部向上(即反向)复制
  514 + memcpy(rgb_data + (dealInfo->Height - 1 - y) * bytes_per_row,
  515 + temp_image + y * bytes_per_row,
  516 + bytes_per_row);
  517 + }
  518 +
  519 + free(temp_image); // 释放临时缓冲区
  520 + }
  521 +
460 //修复外圈图像 522 //修复外圈图像
461 if (dealInfo->RingRepair == JZ_FLAGCODE_ON) 523 if (dealInfo->RingRepair == JZ_FLAGCODE_ON)
462 { 524 {
@@ -618,12 +680,12 @@ T_JZsdkReturnCode IRC_FrameDeal(U16_t *rawData ,unsigned int dataSize, unsigned @@ -618,12 +680,12 @@ T_JZsdkReturnCode IRC_FrameDeal(U16_t *rawData ,unsigned int dataSize, unsigned
618 680
619 //JZSDK_LOG_DEBUG("数据预处理完成"); 681 //JZSDK_LOG_DEBUG("数据预处理完成");
620 682
621 - if (temp_fp != NULL)  
622 - {  
623 - fwrite(rawData, sizeof(U16_t), dataSize, temp_fp); 683 + // if (temp_fp != NULL)
  684 + // {
  685 + // fwrite(rawData, sizeof(U16_t), dataSize, temp_fp);
624 686
625 - fflush(temp_fp);  
626 - } 687 + // fflush(temp_fp);
  688 + // }
627 689
628 690
629 //2、数据前处理,将原始数据和16位数据 合成为rgb数据 691 //2、数据前处理,将原始数据和16位数据 合成为rgb数据
@@ -1194,6 +1256,24 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in @@ -1194,6 +1256,24 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
1194 //IrcDealCfg->DealWay = IRC_DEALMODE_JZSDK; 1256 //IrcDealCfg->DealWay = IRC_DEALMODE_JZSDK;
1195 IrcDealCfg->DealWay = IRC_DEALMODE_KTLIB; 1257 IrcDealCfg->DealWay = IRC_DEALMODE_KTLIB;
1196 1258
  1259 + //我们自己库要水平翻转
  1260 + if (IrcDealCfg->DealWay == IRC_DEALMODE_JZSDK)
  1261 + {
  1262 + IrcDealCfg->Filp_H = JZ_FLAGCODE_ON;
  1263 + }
  1264 + //鲲腾的库要垂直翻转
  1265 + else if (IrcDealCfg->DealWay == IRC_DEALMODE_KTLIB)
  1266 + {
  1267 + IrcDealCfg->Filp_V = JZ_FLAGCODE_ON;
  1268 + }
  1269 + //否则都不翻转
  1270 + else
  1271 + {
  1272 + IrcDealCfg->Filp_H = JZ_FLAGCODE_OFF;
  1273 + IrcDealCfg->Filp_V = JZ_FLAGCODE_OFF;
  1274 + }
  1275 +
  1276 +
1197 IrcDealCfg->ImgDataBits = 14; //图像为14位图像 1277 IrcDealCfg->ImgDataBits = 14; //图像为14位图像
1198 IrcDealCfg->Height = height; 1278 IrcDealCfg->Height = height;
1199 IrcDealCfg->Width = width; 1279 IrcDealCfg->Width = width;
@@ -1238,13 +1318,13 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in @@ -1238,13 +1318,13 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
1238 JZSDK_LOG_ERROR("TPC_Gain注册失败"); 1318 JZSDK_LOG_ERROR("TPC_Gain注册失败");
1239 } 1319 }
1240 1320
1241 - IrcDealCfg->HighT_NineFrameAdd = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t)); 1321 + IrcDealCfg->HighT_NineFrameAdd = (int *)malloc(IrcDealCfg->PixelNum * sizeof(int));
1242 if (IrcDealCfg->HighT_NineFrameAdd == NULL) 1322 if (IrcDealCfg->HighT_NineFrameAdd == NULL)
1243 { 1323 {
1244 JZSDK_LOG_ERROR("HighT_NineFrameAdd注册失败"); 1324 JZSDK_LOG_ERROR("HighT_NineFrameAdd注册失败");
1245 } 1325 }
1246 1326
1247 - IrcDealCfg->LowT_NineFrameAdd = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t)); 1327 + IrcDealCfg->LowT_NineFrameAdd = (int *)malloc(IrcDealCfg->PixelNum * sizeof(int));
1248 if (IrcDealCfg->LowT_NineFrameAdd == NULL) 1328 if (IrcDealCfg->LowT_NineFrameAdd == NULL)
1249 { 1329 {
1250 JZSDK_LOG_ERROR("LowT_NineFrameAdd注册失败"); 1330 JZSDK_LOG_ERROR("LowT_NineFrameAdd注册失败");
@@ -40,7 +40,7 @@ T_JZsdkReturnCode KtLib_Init(struct IRC_param *dealInfo) @@ -40,7 +40,7 @@ T_JZsdkReturnCode KtLib_Init(struct IRC_param *dealInfo)
40 /********************************************** 40 /**********************************************
41 * 41 *
42 * 42 *
43 - * 43 + * ktlib 写入标定的数据
44 * 44 *
45 * 45 *
46 * **********************************************/ 46 * **********************************************/
@@ -51,12 +51,19 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size) @@ -51,12 +51,19 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size)
51 // 加锁 51 // 加锁
52 std::lock_guard<std::mutex> lock(ktLibMutex); 52 std::lock_guard<std::mutex> lock(ktLibMutex);
53 53
  54 + int TempBuffer[size];
  55 +
  56 + for (int i = 0; i < size; i++)
  57 + {
  58 + TempBuffer[i] = in[i];
  59 + }
  60 +
54 #ifdef KTIRC_LIB_STATUS_ON 61 #ifdef KTIRC_LIB_STATUS_ON
55 switch (type) 62 switch (type)
56 { 63 {
57 //高温标记数据 64 //高温标记数据
58 case HIGH_TEMP_DATA: 65 case HIGH_TEMP_DATA:
59 - bool_ret = LoadMarkData((int *)in ,size,HIGH_MARK_DATA); 66 + bool_ret = LoadMarkData(TempBuffer ,size,HIGH_MARK_DATA);
60 if (bool_ret == false) 67 if (bool_ret == false)
61 { 68 {
62 JZSDK_LOG_ERROR("LoadMarkData HIGH_TEMP_DATA error"); 69 JZSDK_LOG_ERROR("LoadMarkData HIGH_TEMP_DATA error");
@@ -71,7 +78,7 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size) @@ -71,7 +78,7 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size)
71 78
72 //低温标记数据 79 //低温标记数据
73 case LOW_TEMP_DATA: 80 case LOW_TEMP_DATA:
74 - bool_ret = LoadMarkData((int *)in ,size,LOW_MARK_DATA); 81 + bool_ret = LoadMarkData(TempBuffer ,size,LOW_MARK_DATA);
75 if (bool_ret == false) 82 if (bool_ret == false)
76 { 83 {
77 JZSDK_LOG_ERROR("LoadMarkData LOW_TEMP_DATA error"); 84 JZSDK_LOG_ERROR("LoadMarkData LOW_TEMP_DATA error");
@@ -87,7 +94,7 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size) @@ -87,7 +94,7 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size)
87 94
88 //单点标记数据 95 //单点标记数据
89 case SPC_MARK_DATA: 96 case SPC_MARK_DATA:
90 - bool_ret = LoadMarkData((int *)in ,size, SINGLE_MARK_DATA); 97 + bool_ret = LoadMarkData(TempBuffer ,size, SINGLE_MARK_DATA);
91 if (bool_ret == false) 98 if (bool_ret == false)
92 { 99 {
93 JZSDK_LOG_ERROR("LoadMarkData SPC_MARK_DATA error"); 100 JZSDK_LOG_ERROR("LoadMarkData SPC_MARK_DATA error");
@@ -110,6 +117,9 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size) @@ -110,6 +117,9 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size)
110 } 117 }
111 118
112 static int lastCorrectMode = JZ_FLAGCODE_OFF; 119 static int lastCorrectMode = JZ_FLAGCODE_OFF;
  120 +static int DynamicGasesColorFlag = JZ_FLAGCODE_OFF;
  121 +
  122 +
113 123
114 T_JZsdkReturnCode KtLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize, 124 T_JZsdkReturnCode KtLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
115 U8_t **RGB_data, unsigned int *RGB_dataSize, 125 U8_t **RGB_data, unsigned int *RGB_dataSize,
@@ -184,17 +194,41 @@ T_JZsdkReturnCode KtLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize, @@ -184,17 +194,41 @@ T_JZsdkReturnCode KtLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
184 switch (dealInfo->OutputPixelColorMode) 194 switch (dealInfo->OutputPixelColorMode)
185 { 195 {
186 case 0: // 默认输出模式 196 case 0: // 默认输出模式
187 - case 2: // 气体色彩增强输出模式  
188 { 197 {
  198 + if (DynamicGasesColorFlag == JZ_FLAGCODE_ON)
  199 + {
  200 + CloseDynamicGasesColorEnhance();
  201 + DynamicGasesColorFlag = JZ_FLAGCODE_OFF;
  202 + }
  203 +
189 bool_ret = GetImageSynchronous(inputDataChar, inputDataSize, (char *)*RGB_data, dealInfo->PixelNum*3, (int *)RGB_dataSize); //同步处理数据 204 bool_ret = GetImageSynchronous(inputDataChar, inputDataSize, (char *)*RGB_data, dealInfo->PixelNum*3, (int *)RGB_dataSize); //同步处理数据
190 } 205 }
191 break; 206 break;
192 207
193 case 1: // 伪彩输出模式 208 case 1: // 伪彩输出模式
194 { 209 {
  210 + if (DynamicGasesColorFlag == JZ_FLAGCODE_ON)
  211 + {
  212 + CloseDynamicGasesColorEnhance();
  213 + DynamicGasesColorFlag = JZ_FLAGCODE_OFF;
  214 + }
  215 +
195 bool_ret = GetImageSynchronous(inputDataChar, inputDataSize, (char *)*RGB_data, dealInfo->PixelNum*3, (int *)RGB_dataSize); //同步处理数据 216 bool_ret = GetImageSynchronous(inputDataChar, inputDataSize, (char *)*RGB_data, dealInfo->PixelNum*3, (int *)RGB_dataSize); //同步处理数据
196 217
197 //将rgb888数据反转为灰度数据并进行颜色映射 218 //将rgb888数据反转为灰度数据并进行颜色映射
  219 + PseudoColor_GrayRgb2Rgb((*RGB_data), dealInfo->PixelNum);
  220 + }
  221 + break;
  222 +
  223 + case 2: // 气体色彩增强输出模式
  224 + {
  225 + if (DynamicGasesColorFlag == JZ_FLAGCODE_OFF)
  226 + {
  227 + OpenDynamicGasesColorEnhance();
  228 + DynamicGasesColorFlag = JZ_FLAGCODE_ON;
  229 + }
  230 +
  231 + bool_ret = GetImageSynchronous(inputDataChar, inputDataSize, (char *)*RGB_data, dealInfo->PixelNum*3, (int *)RGB_dataSize); //同步处理数据
198 } 232 }
199 break; 233 break;
200 234
@@ -265,7 +265,7 @@ T_JZsdkReturnCode JZsdk_CutBadPixel_U16(U16_t *image, int width, int height, uns @@ -265,7 +265,7 @@ T_JZsdkReturnCode JZsdk_CutBadPixel_U16(U16_t *image, int width, int height, uns
265 int Avged = (newPixel-image[tempLen])/8; 265 int Avged = (newPixel-image[tempLen])/8;
266 if ((fabs(image[tempLen] - Avged) < Buildextern)) 266 if ((fabs(image[tempLen] - Avged) < Buildextern))
267 { 267 {
268 - 268 + newPixel = 0;
269 for (int dy = -2; dy <= 2; dy++) 269 for (int dy = -2; dy <= 2; dy++)
270 { 270 {
271 for (int dx = -2; dx <= 2; dx++) 271 for (int dx = -2; dx <= 2; dx++)
@@ -294,12 +294,13 @@ T_JZsdkReturnCode JZsdk_CutBadPixel_U16(U16_t *image, int width, int height, uns @@ -294,12 +294,13 @@ T_JZsdkReturnCode JZsdk_CutBadPixel_U16(U16_t *image, int width, int height, uns
294 294
295 unsigned int newPixel = 0; 295 unsigned int newPixel = 0;
296 296
297 - //获取xy轴坐标 297 + //把盲点长度坐标转化为xy坐标
298 int tempLen = Blind[i]; 298 int tempLen = Blind[i];
299 PointY = tempLen/width; 299 PointY = tempLen/width;
300 PointX = tempLen%width; 300 PointX = tempLen%width;
301 - int index=0;  
302 - int Avged=0; 301 +
  302 + int index=0; //索引值
  303 + int Avged=0; //平均值
303 304
304 int tempPixel[25]; 305 int tempPixel[25];
305 306
@@ -307,16 +308,23 @@ T_JZsdkReturnCode JZsdk_CutBadPixel_U16(U16_t *image, int width, int height, uns @@ -307,16 +308,23 @@ T_JZsdkReturnCode JZsdk_CutBadPixel_U16(U16_t *image, int width, int height, uns
307 { 308 {
308 for (int dx = -2; dx <= 2; dx++) 309 for (int dx = -2; dx <= 2; dx++)
309 { 310 {
  311 +
310 // 计算5x5窗口中当前元素的索引 312 // 计算5x5窗口中当前元素的索引
311 int newY = PointY + dy; 313 int newY = PointY + dy;
312 int newX = PointX + dx; 314 int newX = PointX + dx;
313 tempPixel[index] = image[newY * width + newX]; 315 tempPixel[index] = image[newY * width + newX];
  316 +
  317 +
314 newPixel += tempPixel[index]; 318 newPixel += tempPixel[index];
315 index++; 319 index++;
316 } 320 }
317 } 321 }
318 322
319 - Avged = (newPixel-image[tempLen])/24; 323 + //移除中心点
  324 + newPixel -= image[tempLen];
  325 +
  326 + //计算周围24个点的平均值
  327 + Avged = newPixel/24;
320 328
321 int MaxAvgd = 0; 329 int MaxAvgd = 0;
322 int MinAvgd = 0; 330 int MinAvgd = 0;
@@ -112,6 +112,12 @@ T_JZsdkReturnCode PseudoColor_256Gray2Rgb_ResetColor(int value) @@ -112,6 +112,12 @@ T_JZsdkReturnCode PseudoColor_256Gray2Rgb_ResetColor(int value)
112 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 112 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
113 } 113 }
114 114
  115 +/*****************************
  116 + *
  117 + * 灰度图转伪彩rgb
  118 + *
  119 + *
  120 + * ***************************/
115 T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned int *out_str_len, int PixelNum) 121 T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned int *out_str_len, int PixelNum)
116 { 122 {
117 if (P_Color_FinishFlag != JZ_FLAGCODE_ON) 123 if (P_Color_FinishFlag != JZ_FLAGCODE_ON)
@@ -140,3 +146,27 @@ T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned in @@ -140,3 +146,27 @@ T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned in
140 146
141 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 147 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
142 } 148 }
  149 +
  150 +/*****************************
  151 + *
  152 + * 灰度rgb转伪彩rgb
  153 + *
  154 + *
  155 + * ***************************/
  156 +T_JZsdkReturnCode PseudoColor_GrayRgb2Rgb(U8_t *str, unsigned int PixelNum)
  157 +{
  158 + if (P_Color_FinishFlag != JZ_FLAGCODE_ON)
  159 + {
  160 + JZSDK_LOG_ERROR("伪彩配置文件未初始化");
  161 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  162 + }
  163 +
  164 + for (int i = 0; i < PixelNum; i += 1)
  165 + {
  166 + str[3*i] = P_Color.R_color[str[3*i]];
  167 + str[3*i + 1] = P_Color.G_color[str[3*i + 1]];
  168 + str[3*i + 2] = P_Color.B_color[str[3*i + 2]];
  169 + }
  170 +
  171 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  172 +}
@@ -41,6 +41,8 @@ typedef enum e_PseudoColor @@ -41,6 +41,8 @@ typedef enum e_PseudoColor
41 41
42 /* Exported functions --------------------------------------------------------*/ 42 /* Exported functions --------------------------------------------------------*/
43 T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned int *out_str_len, int PixelNum); 43 T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned int *out_str_len, int PixelNum);
  44 +T_JZsdkReturnCode PseudoColor_GrayRgb2Rgb(U8_t *str, unsigned int PixelNum);
  45 +
44 T_JZsdkReturnCode PseudoColor_256Gray2Rgb_ResetColor(int value); 46 T_JZsdkReturnCode PseudoColor_256Gray2Rgb_ResetColor(int value);
45 47
46 #ifdef __cplusplus 48 #ifdef __cplusplus
@@ -11,6 +11,9 @@ @@ -11,6 +11,9 @@
11 11
12 static int RealTimeMp2_StatusFlag = JZ_FLAGCODE_OFF; 12 static int RealTimeMp2_StatusFlag = JZ_FLAGCODE_OFF;
13 13
  14 +static int MP2_Loop_Flag = JZ_FLAGCODE_OFF;
  15 +static int MP2_Write_Flag = JZ_FLAGCODE_OFF;
  16 +
14 //解码播放部分 17 //解码播放部分
15 static unsigned char RealTimeMP2_PlayData_Loop[ (256 + 1) ][128];//解码缓存池 18 static unsigned char RealTimeMP2_PlayData_Loop[ (256 + 1) ][128];//解码缓存池
16 static int RealTimeMP2_PlayData_LoopHead = 0; //池数头 19 static int RealTimeMP2_PlayData_LoopHead = 0; //池数头
@@ -96,8 +99,6 @@ T_JZsdkReturnCode RealTimeMP2_start() @@ -96,8 +99,6 @@ T_JZsdkReturnCode RealTimeMP2_start()
96 return ret; 99 return ret;
97 } 100 }
98 101
99 - JZSDK_LOG_INFO("MP2实时喊话初始化成功");  
100 -  
101 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 102 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
102 } 103 }
103 104
@@ -123,7 +124,13 @@ T_JZsdkReturnCode RealTimeMP2_Close() @@ -123,7 +124,13 @@ T_JZsdkReturnCode RealTimeMP2_Close()
123 } 124 }
124 125
125 RealTimeMp2_StatusFlag = JZ_FLAGCODE_OFF; 126 RealTimeMp2_StatusFlag = JZ_FLAGCODE_OFF;
  127 +
  128 + //关闭loop线程
  129 + MP2_Loop_Flag = JZ_FLAGCODE_ON;
126 RealTimeMP2s_PlayData_LoopReadFlag = JZ_FLAGCODE_OFF; 130 RealTimeMP2s_PlayData_LoopReadFlag = JZ_FLAGCODE_OFF;
  131 +
  132 + //关闭write线程
  133 + //MP2_Write_Flag = JZ_FLAGCODE_ON;
127 RealTimeMP2_WriteFlag = JZ_FLAGCODE_OFF; 134 RealTimeMP2_WriteFlag = JZ_FLAGCODE_OFF;
128 135
129 Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF); 136 Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
@@ -132,9 +139,15 @@ T_JZsdkReturnCode RealTimeMP2_Close() @@ -132,9 +139,15 @@ T_JZsdkReturnCode RealTimeMP2_Close()
132 int amplifier = JZ_FLAGCODE_OFF; 139 int amplifier = JZ_FLAGCODE_OFF;
133 Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier); 140 Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
134 141
135 - //关闭音频库  
136 AudioDeal_StopDeal(); 142 AudioDeal_StopDeal();
137 143
  144 + //等候mp2全部关闭
  145 + while ((MP2_Loop_Flag == JZ_FLAGCODE_ON) )//| (MP2_Write_Flag == JZ_FLAGCODE_ON))
  146 + {
  147 + JZSDK_LOG_DEBUG("等待mp2关闭 Lopp:%d Write:%d", MP2_Loop_Flag, MP2_Write_Flag);
  148 + delayMs(100);
  149 + }
  150 +
138 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 151 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
139 } 152 }
140 153
@@ -169,14 +182,15 @@ static T_JZsdkReturnCode RealTimeMP2_Play_init() @@ -169,14 +182,15 @@ static T_JZsdkReturnCode RealTimeMP2_Play_init()
169 //解码并播放 182 //解码并播放
170 static T_JZsdkReturnCode RealTimeMP2_PlayData(unsigned char *data,int len) 183 static T_JZsdkReturnCode RealTimeMP2_PlayData(unsigned char *data,int len)
171 { 184 {
172 - unsigned char playFile[len];  
173 -  
174 - //清空  
175 - memset(playFile, 0, len);  
176 -  
177 - memcpy(playFile, data, len); 185 + T_JZsdkReturnCode ret = AudioDeal_Mp3DataInput(8000, data, len);
  186 + if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE)
  187 + {
  188 + JZSDK_LOG_ERROR("严重错误,清空缓冲区");
  189 + RealTimeMP2_ClearLoop();
  190 + return JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE;
  191 + }
178 192
179 - AudioDeal_Mp3DataInput(8000, playFile, len); 193 + //printf("播放结束\n");
180 194
181 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 195 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
182 } 196 }
@@ -191,7 +205,7 @@ static void *RealTimeMP2_LoopPlay(void *arg) @@ -191,7 +205,7 @@ static void *RealTimeMP2_LoopPlay(void *arg)
191 205
192 //设立缓冲区域 206 //设立缓冲区域
193 int range = 0; 207 int range = 0;
194 - while (range < 15) // 1.5s 208 + while (range < 15 && RealTimeMP2s_PlayData_LoopReadFlag != JZ_FLAGCODE_OFF) // 1.5s
195 { 209 {
196 range = (RealTimeMP2_PlayData_LoopEnd-RealTimeMP2_PlayData_LoopHead); 210 range = (RealTimeMP2_PlayData_LoopEnd-RealTimeMP2_PlayData_LoopHead);
197 if (range < 0) 211 if (range < 0)
@@ -200,7 +214,7 @@ static void *RealTimeMP2_LoopPlay(void *arg) @@ -200,7 +214,7 @@ static void *RealTimeMP2_LoopPlay(void *arg)
200 } 214 }
201 } 215 }
202 216
203 - printf("开始播放函数\n"); 217 + //printf("开始播放函数\n");
204 218
205 while(RealTimeMP2s_PlayData_LoopReadFlag != JZ_FLAGCODE_OFF) 219 while(RealTimeMP2s_PlayData_LoopReadFlag != JZ_FLAGCODE_OFF)
206 { 220 {
@@ -212,8 +226,11 @@ static void *RealTimeMP2_LoopPlay(void *arg) @@ -212,8 +226,11 @@ static void *RealTimeMP2_LoopPlay(void *arg)
212 RealTimeMP2_PlayData_LoopHead++; 226 RealTimeMP2_PlayData_LoopHead++;
213 RealTimeMP2_PlayLoop_HeadReset(); //池满判断 227 RealTimeMP2_PlayLoop_HeadReset(); //池满判断
214 } 228 }
  229 +
215 } 230 }
216 231
  232 + MP2_Loop_Flag = JZ_FLAGCODE_OFF;
  233 +
217 } 234 }
218 235
219 // 池子头部到底了,重置池头 236 // 池子头部到底了,重置池头
@@ -284,7 +301,7 @@ static void *RealTimeMP2_WriteData_Task(void *arg) @@ -284,7 +301,7 @@ static void *RealTimeMP2_WriteData_Task(void *arg)
284 { 301 {
285 302
286 int ret; 303 int ret;
287 - JZSDK_LOG_DEBUG("MP2实施喊话,输入数据缓冲线程建立"); 304 + printf("MP2实施喊话,输入数据缓冲线程建立\n");
288 RealTimeMP2_WriteFlag = JZ_FLAGCODE_ON; 305 RealTimeMP2_WriteFlag = JZ_FLAGCODE_ON;
289 306
290 while(RealTimeMP2_WriteFlag == JZ_FLAGCODE_ON) 307 while(RealTimeMP2_WriteFlag == JZ_FLAGCODE_ON)
@@ -305,6 +322,8 @@ static void *RealTimeMP2_WriteData_Task(void *arg) @@ -305,6 +322,8 @@ static void *RealTimeMP2_WriteData_Task(void *arg)
305 pthread_cond_signal(&RealTimeMP2_WriteCond); 322 pthread_cond_signal(&RealTimeMP2_WriteCond);
306 pthread_mutex_unlock(&RealTimeMP2_WriteDataLock); 323 pthread_mutex_unlock(&RealTimeMP2_WriteDataLock);
307 } 324 }
  325 +
  326 + MP2_Write_Flag = JZ_FLAGCODE_OFF;
308 } 327 }
309 328
310 //写入数据缓存池重置 329 //写入数据缓存池重置
@@ -449,5 +468,7 @@ static T_JZsdkReturnCode RealTimeMP2_WriteDataToLoop(unsigned char *buf,int leng @@ -449,5 +468,7 @@ static T_JZsdkReturnCode RealTimeMP2_WriteDataToLoop(unsigned char *buf,int leng
449 * **************/ 468 * **************/
450 T_JZsdkReturnCode RealTimeMP2_GetStatusFlag() 469 T_JZsdkReturnCode RealTimeMP2_GetStatusFlag()
451 { 470 {
  471 +
  472 +
452 return RealTimeMp2_StatusFlag; 473 return RealTimeMp2_StatusFlag;
453 } 474 }
@@ -75,7 +75,6 @@ T_JZsdkReturnCode OpusFile_FlushList() @@ -75,7 +75,6 @@ T_JZsdkReturnCode OpusFile_FlushList()
75 OpusFile_FreeAudioList(); 75 OpusFile_FreeAudioList();
76 } 76 }
77 77
78 -  
79 while ((entry = readdir(dir)) != NULL) 78 while ((entry = readdir(dir)) != NULL)
80 { 79 {
81 const unsigned char *filename = entry->d_name; 80 const unsigned char *filename = entry->d_name;
@@ -153,14 +152,6 @@ T_JZsdkReturnCode OpusFile_FlushList() @@ -153,14 +152,6 @@ T_JZsdkReturnCode OpusFile_FlushList()
153 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 152 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
154 } 153 }
155 154
156 -  
157 -  
158 -  
159 -  
160 -  
161 -  
162 -  
163 -  
164 /********* 155 /*********
165 * 156 *
166 * opus文件初始化 157 * opus文件初始化
@@ -168,6 +159,6 @@ T_JZsdkReturnCode OpusFile_FlushList() @@ -168,6 +159,6 @@ T_JZsdkReturnCode OpusFile_FlushList()
168 **********/ 159 **********/
169 T_JZsdkReturnCode Megaphone_OpusFile_Init() 160 T_JZsdkReturnCode Megaphone_OpusFile_Init()
170 { 161 {
171 - //刷新opus列表 162 + //刷新opus列表(用于加载新的opus文件)
172 OpusFile_FlushList(); 163 OpusFile_FlushList();
173 } 164 }
  1 +/**
  2 + ********************************************************************
  3 + * @file OpusFile.h
  4 + * OpusFile.c OpusFileSave.c 的头文件
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef OPUS_FILE_H
  11 +#define OPUS_FILE_H
  12 +
  13 +/* Includes ------------------------------------------------------------------*/
  14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  15 +
  16 +#ifdef __cplusplus
  17 +extern "C" {
  18 +#endif
  19 +
  20 +/* Exported constants --------------------------------------------------------*/
  21 +/* 常亮定义*/
  22 +
  23 +/* Exported types ------------------------------------------------------------*/
  24 +
  25 +/* Exported functions --------------------------------------------------------*/
  26 +T_JZsdkReturnCode Megaphone_OpusFile_Init();
  27 +T_JZsdkReturnCode OpusFile_FlushList();
  28 +T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile);
  29 +
  30 +
  31 +T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName);
  32 +T_JZsdkReturnCode OpusFile_SaveOpusFileStream(unsigned char *Stream, int StreamLen);
  33 +T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCode, int SaveFlag);
  34 +
  35 +#ifdef __cplusplus
  36 +}
  37 +#endif
  38 +
  39 +#endif
  1 +#include "JZsdkLib.h"
  2 +
  3 +#include "../../Megaphone.h"
  4 +#include "../Megaphone_Opus.h"
  5 +#include "version_choose.h"
  6 +#include "BaseConfig.h"
  7 +
  8 +#include "AudioDeal/AudioDeal.h"
  9 +
  10 +#include "opus.h"
  11 +
  12 +#define OPUS_MAX_FRAME_SIZE (6 * 960)
  13 +#define OPUS_CHANNELS (1)
  14 +#define OPUS_MAX_PACKET_SIZE (3 * 1276)
  15 +
  16 +#define PCM_PLAY_FILE_NAME "/root/test_audio.pcm" //用于播放的pcm
  17 +
  18 +#define PCM_RATE 16000 //解码得到的pcm码率 目前仅支持16000码率
  19 +static int g_opus_decodeBitrate = 16000; //解码码率
  20 +
  21 +static int g_Opus_play_Flag = JZ_FLAGCODE_OFF; //opus的播放标志位
  22 +static int g_Opus_decode_Flag = JZ_FLAGCODE_OFF; //opus的解码标志位
  23 +static T_JZTaskHandle g_DecodeOpus_task = NULL;
  24 +static T_JZTaskHandle g_OpusPlay_task = NULL;
  25 +
  26 +/***************************************************************************************************************
  27 + *
  28 + * 播放部分
  29 + *
  30 + *
  31 +****************************************************************************************************************/
  32 +
  33 +
  34 +static T_JZsdkReturnCode FixedFilePlay()
  35 +{
  36 + FILE *PlayFixedFile_pcm_fp = NULL;
  37 + unsigned int nbBytes;
  38 + uint8_t cbits[3 * 1276];
  39 + int timeNum = 0;
  40 + int loop = JZ_FLAGCODE_OFF;
  41 + int loop_interval;
  42 +
  43 + if(g_Opus_decode_Flag != JZ_FLAGCODE_OFF)
  44 + {
  45 + JZSDK_LOG_ERROR("opus解码超时,无法播放");
  46 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  47 + }
  48 +
  49 + g_Opus_play_Flag = JZ_FLAGCODE_ON;
  50 +
  51 + JZSDK_LOG_INFO("播放指定位置的opus pcm文件\n");
  52 + PlayFixedFile_pcm_fp = fopen(PCM_PLAY_FILE_NAME, "r");
  53 + if (PlayFixedFile_pcm_fp == NULL)
  54 + {
  55 + JZSDK_LOG_ERROR("打开固定opus pcm文件失败\n");
  56 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  57 + }
  58 +
  59 + // 将文件指针移动到文件开头
  60 + if (fseek(PlayFixedFile_pcm_fp, 0, SEEK_SET) != 0)
  61 + {
  62 + JZSDK_LOG_ERROR("Failed to move file pointer to the beginning of the file");
  63 + fclose(PlayFixedFile_pcm_fp);
  64 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  65 + }
  66 +
  67 + while (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON)
  68 + {
  69 + nbBytes = fread(cbits, 1, 3 * 1276, PlayFixedFile_pcm_fp);
  70 + if(nbBytes > 0)
  71 + {
  72 + AudioDeal_PcmDataInput(PCM_RATE, (unsigned char *)cbits, nbBytes);
  73 + }
  74 + if (feof(PlayFixedFile_pcm_fp))
  75 + {
  76 + //如果循环播放没打开
  77 + Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_LOOP, &loop);
  78 + Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_LOOP_INTERVAL, &loop_interval);
  79 +
  80 + if (loop == JZ_FLAGCODE_OFF)
  81 + {
  82 + timeNum = 0;
  83 +
  84 + // //播放结束延迟
  85 + // while ((timeNum <=3000) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
  86 + // {
  87 + // delayMs(10);
  88 + // timeNum +=10;
  89 + // }
  90 +
  91 + break;
  92 + }
  93 + //如果循环播放打开
  94 + else if (loop == JZ_FLAGCODE_ON)
  95 + {
  96 + timeNum = 0;
  97 + JZSDK_LOG_INFO("循环播放opus");
  98 +
  99 + // //播放结束延迟
  100 + // while ((loop == 1) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
  101 + // {
  102 + // delayMs(10);
  103 + // timeNum +=10;
  104 + // }
  105 +
  106 + //重置文件光标 继续播放
  107 + fseek(PlayFixedFile_pcm_fp, 0, SEEK_SET);
  108 +
  109 + //循环播放延时
  110 + while (loop_interval > 0 && (loop == JZ_FLAGCODE_ON) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
  111 + {
  112 + delayMs(50);
  113 + loop_interval -= 50;
  114 + }
  115 +
  116 + continue;
  117 + }
  118 + }
  119 + }
  120 +
  121 + fclose(PlayFixedFile_pcm_fp);
  122 +
  123 + g_Opus_play_Flag = JZ_FLAGCODE_OFF;
  124 +}
  125 +
  126 +/*
  127 +*
  128 +* 播放固定位置pcm线程
  129 +*
  130 +*/
  131 +static void *PlayFixedFile_task(void *arg)
  132 +{
  133 + Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_ON);
  134 + Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_ON);
  135 +
  136 + //广播开始
  137 + Megaphone_status_Broadcast(AUDIO_PLAY_STATUS_OPUS_RECORD);
  138 +
  139 + int amplifier = JZ_FLAGCODE_ON;
  140 + Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
  141 +
  142 + FixedFilePlay();
  143 +
  144 + amplifier = JZ_FLAGCODE_OFF;
  145 + Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
  146 +
  147 + Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
  148 + Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
  149 +
  150 + //广播关闭
  151 + Megaphone_status_Broadcast(JZ_FLAGCODE_OFF);
  152 +}
  153 +
  154 +/*******************************
  155 +*
  156 +* 播放规定位置的opus文件
  157 +* 旧接口,无需定位传入的位置
  158 +*
  159 +************************************/
  160 +T_JZsdkReturnCode OpusFile_PlayFixedFile()
  161 +{
  162 + T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
  163 +
  164 + OsalHandler->TaskCreate("PiayFilexdFile", PlayFixedFile_task, 8192, NULL, &g_DecodeOpus_task);
  165 +
  166 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  167 +}
  168 +
  169 +
  170 +
  171 +/*************************************************************************************************************/
  172 +
  173 +/*
  174 +
  175 + 解码函数
  176 +
  177 +
  178 +*/
  179 +static T_JZsdkReturnCode OpusDecodeFun(unsigned char *OpusFile)
  180 +{
  181 + FILE *fin = NULL;
  182 + FILE *fout = NULL;
  183 + OpusDecoder *decoder;
  184 + opus_int16 out[OPUS_MAX_FRAME_SIZE * OPUS_CHANNELS];
  185 + uint8_t cbits[OPUS_MAX_PACKET_SIZE];
  186 + int32_t nbBytes;
  187 + int32_t err;
  188 +
  189 + if (g_Opus_decode_Flag != JZ_FLAGCODE_OFF)
  190 + {
  191 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  192 + }
  193 +
  194 + g_Opus_decode_Flag = JZ_FLAGCODE_ON;
  195 +
  196 + printf("Decode Start 解码开始\n"); //解码开始
  197 +
  198 + //打开解码的opus文件
  199 + //TODO: need delete
  200 + //attention: you can use "ffmpeg -i xxx.mp3 -ar 16000 -ac 1 out.wav" and "./test_opus_tool out.wav out.opus" to generate opus file to test
  201 + fin = fopen(OpusFile, "r");
  202 + if (fin == NULL) {
  203 + JZSDK_LOG_ERROR("fin打开失败");
  204 + goto DecodeFinsh;
  205 + }
  206 +
  207 + //创建一个解码器
  208 + decoder = opus_decoder_create(PCM_RATE, OPUS_CHANNELS, &err);
  209 + if (err < 0) {
  210 + JZSDK_LOG_ERROR("解码器创建失败 %s",opus_strerror(err));
  211 + goto DecodeFinsh;
  212 + }
  213 +
  214 + //创建一个opus输出文件
  215 + fout = fopen(PCM_PLAY_FILE_NAME, "w");
  216 + if (fout == NULL) {
  217 + JZSDK_LOG_ERROR("创建opus输出文件失败");
  218 + goto DecodeFinsh;
  219 + }
  220 +
  221 + printf("opus解码初始化完成\n");
  222 +
  223 + int frame_size;
  224 +
  225 + while (1)
  226 + {
  227 + int i;
  228 + opus_int16 TempPcm[OPUS_MAX_FRAME_SIZE * OPUS_CHANNELS];
  229 +
  230 + frame_size = 0;
  231 +
  232 + //读取opus内容
  233 + /* Read a 16 bits/sample audio frame. */
  234 + nbBytes = fread(cbits, 1, g_opus_decodeBitrate / 8000 * 40, fin);
  235 + if (feof(fin))
  236 + {
  237 + break;
  238 + }
  239 +
  240 + printf("fread nbBytes=%d\n",nbBytes);
  241 + //printf("s_decodeBitrate=%d",s_decodeBitrate / OPUS_DECODE_BITRATE_8KBPS * OPUS_DECODE_FRAME_SIZE_8KBPS);
  242 + /* Decode the data. In this example, frame_size will be constant because
  243 + the encoder is using a constant frame size. However, that may not
  244 + be the case for all encoders, so the decoder must always check
  245 + the frame size returned. */
  246 +
  247 + //向解码器输入opus内容
  248 + frame_size = opus_decode(decoder, cbits, nbBytes, out, OPUS_MAX_FRAME_SIZE, 0);
  249 + if (frame_size < 0) {
  250 + JZSDK_LOG_ERROR("decoder failed: %s",opus_strerror(frame_size));
  251 + goto DecodeFinsh;
  252 + }
  253 +
  254 + //解码完成
  255 + printf("decode data to file: %d\r\n", frame_size * OPUS_CHANNELS);
  256 + /* Convert to little-endian ordering. */
  257 +
  258 + for (i = 0; i < OPUS_CHANNELS * frame_size; i++) {
  259 + TempPcm [i] = out[i] & 0xFF | (out[i] >> 8) << 8;
  260 + //TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
  261 + }
  262 +
  263 + fwrite(TempPcm, sizeof(short), frame_size * OPUS_CHANNELS, fout);
  264 +
  265 + }
  266 +
  267 +DecodeFinsh:
  268 +
  269 + //释放解码器
  270 + if (decoder != NULL)
  271 + {
  272 + opus_decoder_destroy(decoder);
  273 + printf("opus_decoder_destroy(decoder)\n");
  274 + }
  275 +
  276 + //关闭文件
  277 + if (fin != NULL)
  278 + {
  279 + fclose(fin);
  280 + fin = NULL;
  281 + printf("fclose(fin);\n");
  282 + }
  283 +
  284 + //关闭文件
  285 + if (fout != NULL)
  286 + {
  287 + fclose(fout);
  288 + fout = NULL;
  289 + printf("fclose(fout);\n");
  290 + }
  291 +
  292 + if (frame_size < 0)
  293 + {
  294 + JZSDK_LOG_ERROR("opus解码失败");
  295 + g_Opus_decode_Flag = JZ_FLAGCODE_OFF;
  296 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  297 + }
  298 +
  299 + //解码完成
  300 + JZSDK_LOG_INFO("Decode Finished...\n");
  301 + g_Opus_decode_Flag = JZ_FLAGCODE_OFF;
  302 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  303 +}
  304 +
  305 +/*******************
  306 +*
  307 +* opus解码线程
  308 +*
  309 +*******************/
  310 +static void *DecodeOpus_task(void *arg)
  311 +{
  312 + unsigned char *opusFile = (unsigned char *)arg;
  313 +
  314 + T_JZsdkReturnCode ret = OpusDecodeFun(opusFile);
  315 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  316 + {
  317 + //广播解码失败
  318 + Megaphone_Broadcast_OpusDecodeStatus(1);
  319 + }
  320 + else
  321 + {
  322 + Megaphone_Broadcast_OpusDecodeStatus(0);
  323 + }
  324 +
  325 + free(opusFile);
  326 +}
  327 +
  328 +T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile)
  329 +{
  330 + T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
  331 +
  332 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  333 +
  334 + //因为播放的流通pcm文件只有一份,所以播放时,不能进行解码,不然会导致相当多问题
  335 + int i = 0;
  336 + while (i <= 4 && g_Opus_play_Flag == JZ_FLAGCODE_ON)
  337 + {
  338 + i++;
  339 + delayMs(50);
  340 + }
  341 +
  342 + //判断上一次播放是否结束 判断解码是否完成
  343 + if(i == 4)
  344 + {
  345 + JZSDK_LOG_ERROR("超时200ms,上一次opus录音播放未结束,无法解码");
  346 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  347 + }
  348 +
  349 + i = 0;
  350 + while (i<=4 && g_Opus_decode_Flag == JZ_FLAGCODE_ON)
  351 + {
  352 + i++;
  353 + delayMs(50);
  354 + }
  355 + if(i == 4)
  356 + {
  357 + JZSDK_LOG_ERROR("超时,上一次opus仍在解码,无法开始新的解码");
  358 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  359 + }
  360 +
  361 + unsigned char *DecodeFile = OsalHandler->Malloc(strlen(opusFile));
  362 + if(DecodeFile == NULL)
  363 + {
  364 + JZSDK_LOG_ERROR("DecodeFile malloc failed");
  365 + return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
  366 + }
  367 + memset(DecodeFile, strlen(opusFile), 0);
  368 + memcpy(DecodeFile, opusFile, strlen(opusFile));
  369 +
  370 + OsalHandler->TaskCreate("DecodeOpus", DecodeOpus_task((void *)DecodeFile), 8192,NULL, &g_DecodeOpus_task);
  371 +
  372 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  373 +}
1 #include <stdio.h> 1 #include <stdio.h>
2 #include "JZsdkLib.h" 2 #include "JZsdkLib.h"
3 3
  4 +#include "OpusFile.h"
  5 +
4 static int g_OpusFile_SaveLen = 0; 6 static int g_OpusFile_SaveLen = 0;
5 static FILE *g_OpusFile_SaveFp = NULL; 7 static FILE *g_OpusFile_SaveFp = NULL;
6 -static int g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF; 8 +static int g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF; //opus存储标志位
7 9
8 #define OPUS_FILE_DIR "/root/sdcard/opus" 10 #define OPUS_FILE_DIR "/root/sdcard/opus"
9 -#define OPUS_TEMP_SAVE_DIR "/root/opusFileTemp.opus" 11 +#define OPUS_TEMP_SAVE_DIR "/root/test_audio.opus"
10 static unsigned char opus_SaveFile[128]; 12 static unsigned char opus_SaveFile[128];
11 13
12 -static int OpusFile_SaveThread_Flag = JZ_FLAGCODE_OFF; 14 +static T_JZTaskHandle s_OpusSaveThread = NULL;
13 15
14 /****************** 16 /******************
15 * 17 *
@@ -18,19 +20,21 @@ static int OpusFile_SaveThread_Flag = JZ_FLAGCODE_OFF; @@ -18,19 +20,21 @@ static int OpusFile_SaveThread_Flag = JZ_FLAGCODE_OFF;
18 * 20 *
19 * 21 *
20 * **********************/ 22 * **********************/
21 -static T_JZsdkReturnCode OpusFile_SaveOpusFileShowLen(void) 23 +static void *OpusFile_SaveOpusPrint(void *arg)
22 { 24 {
23 - if (OpusFile_SaveThread_Flag != JZ_FLAGCODE_OFF) 25 + while (g_OpusFile_SaveFlag == JZ_FLAGCODE_ON)
24 { 26 {
25 - JZSDK_LOG_ERROR("存储显示线程已经启动,请先关闭");  
26 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
27 - }  
28 -  
29 - OpusFile_SaveThread_Flag = JZ_FLAGCODE_ON; 27 + int num = 0;
30 28
  29 + JZSDK_LOG_INFO("opus存储功能开启中,当前已存入 %d 字节",g_OpusFile_SaveLen);
31 30
32 -  
33 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 31 + //适时延迟
  32 + while (num < 100 && g_OpusFile_SaveFlag == JZ_FLAGCODE_ON)
  33 + {
  34 + delayMs(10);
  35 + num++;
  36 + }
  37 + }
34 } 38 }
35 39
36 /****************** 40 /******************
@@ -42,6 +46,14 @@ static T_JZsdkReturnCode OpusFile_SaveOpusFileShowLen(void) @@ -42,6 +46,14 @@ static T_JZsdkReturnCode OpusFile_SaveOpusFileShowLen(void)
42 * **********************/ 46 * **********************/
43 T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName) 47 T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName)
44 { 48 {
  49 + T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
  50 +
  51 + if (g_OpusFile_SaveFlag == JZ_FLAGCODE_ON)
  52 + {
  53 + JZSDK_LOG_ERROR("opus文件保存功能已经开启");
  54 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  55 + }
  56 +
45 g_OpusFile_SaveLen = 0; 57 g_OpusFile_SaveLen = 0;
46 58
47 memset(opus_SaveFile, 0, sizeof(opus_SaveFile)); 59 memset(opus_SaveFile, 0, sizeof(opus_SaveFile));
@@ -64,6 +76,9 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName) @@ -64,6 +76,9 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName)
64 76
65 g_OpusFile_SaveFlag = JZ_FLAGCODE_ON; 77 g_OpusFile_SaveFlag = JZ_FLAGCODE_ON;
66 78
  79 + //创建存储显示线程
  80 + OsalHandler->TaskCreate("OpusSavePrint", OpusFile_SaveOpusPrint, 8192,NULL, &s_OpusSaveThread);
  81 +
67 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 82 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
68 } 83 }
69 84
@@ -107,9 +122,12 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStream(unsigned char *Stream, int StreamL @@ -107,9 +122,12 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStream(unsigned char *Stream, int StreamL
107 * 122 *
108 * 结束存储opus文件 123 * 结束存储opus文件
109 * 124 *
  125 + * checkflag是否需要校正 或校正类型
  126 + * checkcode 校正码
  127 + * saveflag 是否需要保存
110 * 128 *
111 * **********************/ 129 * **********************/
112 -T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCode) 130 +T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCode, int SaveFlag)
113 { 131 {
114 T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 132 T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
115 unsigned char cmd[128]; 133 unsigned char cmd[128];
@@ -136,15 +154,16 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo @@ -136,15 +154,16 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo
136 154
137 JZSDK_LOG_INFO("已存储opus文件, 其长度为:%d", g_OpusFile_SaveLen); 155 JZSDK_LOG_INFO("已存储opus文件, 其长度为:%d", g_OpusFile_SaveLen);
138 156
139 - switch (CheckFlag) 157 +/***********************************************************
  158 + *
  159 + * 校验部分
  160 + *
  161 + *
  162 + * *********************************************************/
  163 + if (CheckFlag != JZ_FLAGCODE_OFF)
140 { 164 {
141 - case JZ_FLAGCODE_OFF: 165 + switch (CheckFlag)
142 { 166 {
143 - JZSDK_LOG_INFO("opus保存无需校验码");  
144 - ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
145 - }  
146 - break;  
147 -  
148 case JZSDK_CHECK_SUM_TYPE_MD5: 167 case JZSDK_CHECK_SUM_TYPE_MD5:
149 { 168 {
150 JZSDK_LOG_INFO("opus保存使用md5校验码"); 169 JZSDK_LOG_INFO("opus保存使用md5校验码");
@@ -159,6 +178,7 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo @@ -159,6 +178,7 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo
159 //1、获取文件的src32校验码 178 //1、获取文件的src32校验码
160 ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_SRC32, OPUS_TEMP_SAVE_DIR, CheckCode, 4); 179 ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_SRC32, OPUS_TEMP_SAVE_DIR, CheckCode, 4);
161 } 180 }
  181 + break;
162 182
163 default: 183 default:
164 { 184 {
@@ -178,6 +198,55 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo @@ -178,6 +198,55 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo
178 198
179 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 199 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
180 } 200 }
  201 + }
  202 + else
  203 + {
  204 + JZSDK_LOG_INFO("opus保存无需校验码");
  205 + }
181 206
  207 +/***********************************************************
  208 + *
  209 + * 额外存储部分
  210 + *
  211 + *
  212 + * *********************************************************/
  213 + if (SaveFlag != JZ_FLAGCODE_OFF)
  214 + {
  215 + //将临时的opus文件移动到指定的目录
  216 + memset(cmd, 0, sizeof(cmd));
  217 + sprintf(cmd, "mv %s %s", OPUS_TEMP_SAVE_DIR, opus_SaveFile);
  218 + ret = JZsdk_RunSystemCmd(cmd);
  219 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  220 + {
  221 + JZSDK_LOG_ERROR("opus保存文件移动失败");
  222 + memset(cmd, 0, sizeof(cmd));
  223 + sprintf(cmd, "rm -rf %s", OPUS_TEMP_SAVE_DIR);
  224 + JZsdk_RunSystemCmd(cmd);
  225 + g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
182 226
  227 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  228 + }
  229 +
  230 + //移动成功
  231 + JZsdk_Sync(); //同步文件系统
  232 + JZSDK_LOG_INFO("opus保存成功,刷新列表");
  233 + OpusFile_FlushList(); //刷新opus文件列表
  234 + }
  235 +/********************************************************************
  236 + *
  237 + *
  238 + * 如果不进行额存储,则进行一次opus解码
  239 + *
  240 + *
  241 +/********************************************************************/
  242 + else
  243 + {
  244 + OpusFile_DecodeOpus(opus_SaveFile);
  245 + }
  246 +
  247 + JZSDK_LOG_INFO("opus_save_end");
  248 +
  249 + g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
  250 +
  251 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
183 } 252 }
@@ -189,7 +189,7 @@ static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = { @@ -189,7 +189,7 @@ static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = {
189 }; 189 };
190 190
191 static const uint32_t s_widgetHandlerListCount = sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem); 191 static const uint32_t s_widgetHandlerListCount = sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem);
192 -int32_t s_widgetValueList[] = {VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST, //视频流 192 +int32_t s_widgetValueList[] = {VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD, //视频流
193 OFF, //测温模式 193 OFF, //测温模式
194 ON, //光圈开关 194 ON, //光圈开关
195 OFF, //冻结开关 195 OFF, //冻结开关