00212更新 2025/1/3
优化了jsdklib的code部分,加入了 最新最潮的osal库
昆腾红外相机修改为最新的sdk,并修复了高低温数据溢出的问题
修复了mp3实时语音的崩溃问题
优化了hal层 处理修改了hal相关的关系
移除了无帧头帧尾的不健康帧
简化了uart的层,使得再也不会混进奇怪的内容了
数据传输上限修改至2048,优化了打印,使得数据传输快了
优化了log.c避免log日志没有及时保存导致的丢失
正在显示
53 个修改的文件
包含
1670 行增加
和
299 行删除
| @@ -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 | * |
| @@ -54,4 +52,18 @@ T_JZsdkReturnCode JZsdk_Free(void *ptr) | @@ -54,4 +52,18 @@ T_JZsdkReturnCode JZsdk_Free(void *ptr) | ||
| 54 | ptr = NULL; | 52 | ptr = NULL; |
| 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); | ||
| 66 | - | ||
| 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); | 59 | + //JZSDK_LOG_DEBUG("mp3_Stream_Interface_Mp3Data"); |
| 72 | 60 | ||
| 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 | } |
| 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 ); | ||
| 101 | 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,26 +140,35 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | @@ -139,26 +140,35 @@ 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 | - { | ||
| 151 | - break; | 153 | + { |
| 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 | - | ||
| 159 | - //printf("输出了:%d的数据\n",frame->nb_samples); | ||
| 160 | 168 | ||
| 161 | int out_nb_samples = 0; | 169 | int out_nb_samples = 0; |
| 170 | + | ||
| 171 | + //JZSDK_LOG_DEBUG("播放前"); | ||
| 162 | 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); |
| @@ -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,12 +836,15 @@ static T_JZsdkReturnCode Gimbal_Init_Gimbal_Init_TransparentControl() | @@ -835,12 +836,15 @@ 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 | ||
| 841 | //云台微调初始化 | 845 | //云台微调初始化 |
| 842 | MotorFineTuning_Init(&g_MotorFineTuningPitch, &g_MotorFineTuningYaw, &g_MotorFineTuningRoll); | 846 | MotorFineTuning_Init(&g_MotorFineTuningPitch, &g_MotorFineTuningYaw, &g_MotorFineTuningRoll); |
| 843 | - | 847 | + |
| 844 | return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | 848 | return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; |
| 845 | } | 849 | } |
| 846 | 850 |
| @@ -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 | ||
| @@ -106,7 +108,16 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int * | @@ -106,7 +108,16 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int * | ||
| 106 | //对数据进行自动盲点校正 | 108 | //对数据进行自动盲点校正 |
| 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注册失败"); |
| @@ -26,7 +26,7 @@ T_JZsdkReturnCode KtLib_Init(struct IRC_param *dealInfo) | @@ -26,7 +26,7 @@ T_JZsdkReturnCode KtLib_Init(struct IRC_param *dealInfo) | ||
| 26 | { | 26 | { |
| 27 | #ifdef KTIRC_LIB_STATUS_ON | 27 | #ifdef KTIRC_LIB_STATUS_ON |
| 28 | InitM330(); | 28 | InitM330(); |
| 29 | - | 29 | + |
| 30 | KtLib_writeMarkData(HIGH_TEMP_DATA,dealInfo->HighT_NineFrame_Avg ,dealInfo->PixelNum); | 30 | KtLib_writeMarkData(HIGH_TEMP_DATA,dealInfo->HighT_NineFrame_Avg ,dealInfo->PixelNum); |
| 31 | KtLib_writeMarkData(LOW_TEMP_DATA, dealInfo->LowT_NineFrame_Avg ,dealInfo->PixelNum); | 31 | KtLib_writeMarkData(LOW_TEMP_DATA, dealInfo->LowT_NineFrame_Avg ,dealInfo->PixelNum); |
| 32 | KtLib_writeMarkData(SPC_MARK_DATA, dealInfo->SPC_Mark_Data ,dealInfo->PixelNum); | 32 | KtLib_writeMarkData(SPC_MARK_DATA, dealInfo->SPC_Mark_Data ,dealInfo->PixelNum); |
| @@ -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,21 +194,45 @@ T_JZsdkReturnCode KtLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize, | @@ -184,21 +194,45 @@ 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); | ||
| 198 | } | 220 | } |
| 199 | break; | 221 | break; |
| 200 | 222 | ||
| 201 | - default: | 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); //同步处理数据 | ||
| 232 | + } | ||
| 233 | + break; | ||
| 234 | + | ||
| 235 | + default: | ||
| 202 | delete[] inputDataChar; | 236 | delete[] inputDataChar; |
| 203 | return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | 237 | return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; |
| 204 | break; | 238 | break; |
| @@ -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, &lifier); | 140 | Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &lifier); |
| 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); | 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 | + } | ||
| 176 | 192 | ||
| 177 | - memcpy(playFile, data, len); | ||
| 178 | - | ||
| 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 | } |
| @@ -74,7 +74,6 @@ T_JZsdkReturnCode OpusFile_FlushList() | @@ -74,7 +74,6 @@ T_JZsdkReturnCode OpusFile_FlushList() | ||
| 74 | { | 74 | { |
| 75 | OpusFile_FreeAudioList(); | 75 | OpusFile_FreeAudioList(); |
| 76 | } | 76 | } |
| 77 | - | ||
| 78 | 77 | ||
| 79 | while ((entry = readdir(dir)) != NULL) | 78 | while ((entry = readdir(dir)) != NULL) |
| 80 | { | 79 | { |
| @@ -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 | } |
Module/Megaphone/opus/OpusFile/OpusFile.h
0 → 100644
| 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, &lifier); | ||
| 141 | + | ||
| 142 | + FixedFilePlay(); | ||
| 143 | + | ||
| 144 | + amplifier = JZ_FLAGCODE_OFF; | ||
| 145 | + Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &lifier); | ||
| 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 | ||
| 31 | - | 29 | + JZSDK_LOG_INFO("opus存储功能开启中,当前已存入 %d 字节",g_OpusFile_SaveLen); |
| 32 | 30 | ||
| 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 | ||
| @@ -106,10 +121,13 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStream(unsigned char *Stream, int StreamL | @@ -106,10 +121,13 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStream(unsigned char *Stream, int StreamL | ||
| 106 | * | 121 | * |
| 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,48 +154,99 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo | @@ -136,48 +154,99 @@ 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; | 167 | + case JZSDK_CHECK_SUM_TYPE_MD5: |
| 168 | + { | ||
| 169 | + JZSDK_LOG_INFO("opus保存使用md5校验码"); | ||
| 170 | + //1、获取文件的md5校验码 | ||
| 171 | + ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_MD5, OPUS_TEMP_SAVE_DIR, CheckCode, 32); | ||
| 172 | + } | ||
| 173 | + break; | ||
| 174 | + | ||
| 175 | + case JZSDK_CHECK_SUM_TYPE_SRC32: | ||
| 176 | + { | ||
| 177 | + JZSDK_LOG_INFO("opus保存使用src32校验码"); | ||
| 178 | + //1、获取文件的src32校验码 | ||
| 179 | + ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_SRC32, OPUS_TEMP_SAVE_DIR, CheckCode, 4); | ||
| 180 | + } | ||
| 181 | + break; | ||
| 182 | + | ||
| 183 | + default: | ||
| 184 | + { | ||
| 185 | + JZSDK_LOG_ERROR("opus保存校验码类型错误"); | ||
| 186 | + ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 187 | + } | ||
| 188 | + break; | ||
| 145 | } | 189 | } |
| 146 | - break; | ||
| 147 | 190 | ||
| 148 | - case JZSDK_CHECK_SUM_TYPE_MD5: | 191 | + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) |
| 149 | { | 192 | { |
| 150 | - JZSDK_LOG_INFO("opus保存使用md5校验码"); | ||
| 151 | - //1、获取文件的md5校验码 | ||
| 152 | - ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_MD5, OPUS_TEMP_SAVE_DIR, CheckCode, 32); | ||
| 153 | - } | ||
| 154 | - break; | 193 | + JZSDK_LOG_ERROR("opus保存校验失败"); |
| 194 | + memset(cmd, 0, sizeof(cmd)); | ||
| 195 | + sprintf(cmd, "rm -rf %s", OPUS_TEMP_SAVE_DIR); | ||
| 196 | + JZsdk_RunSystemCmd(cmd); | ||
| 197 | + g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF; | ||
| 155 | 198 | ||
| 156 | - case JZSDK_CHECK_SUM_TYPE_SRC32: | ||
| 157 | - { | ||
| 158 | - JZSDK_LOG_INFO("opus保存使用src32校验码"); | ||
| 159 | - //1、获取文件的src32校验码 | ||
| 160 | - ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_SRC32, OPUS_TEMP_SAVE_DIR, CheckCode, 4); | 199 | + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; |
| 161 | } | 200 | } |
| 162 | - | ||
| 163 | - default: | ||
| 164 | - { | ||
| 165 | - JZSDK_LOG_ERROR("opus保存校验码类型错误"); | ||
| 166 | - ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 167 | - } | ||
| 168 | - break; | 201 | + } |
| 202 | + else | ||
| 203 | + { | ||
| 204 | + JZSDK_LOG_INFO("opus保存无需校验码"); | ||
| 169 | } | 205 | } |
| 170 | 206 | ||
| 171 | - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) | 207 | +/*********************************************************** |
| 208 | + * | ||
| 209 | + * 额外存储部分 | ||
| 210 | + * | ||
| 211 | + * | ||
| 212 | + * *********************************************************/ | ||
| 213 | + if (SaveFlag != JZ_FLAGCODE_OFF) | ||
| 172 | { | 214 | { |
| 173 | - JZSDK_LOG_ERROR("opus保存校验失败"); | 215 | + //将临时的opus文件移动到指定的目录 |
| 174 | memset(cmd, 0, sizeof(cmd)); | 216 | memset(cmd, 0, sizeof(cmd)); |
| 175 | - sprintf(cmd, "rm -rf %s", OPUS_TEMP_SAVE_DIR); | ||
| 176 | - JZsdk_RunSystemCmd(cmd); | ||
| 177 | - g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF; | 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; | ||
| 178 | 226 | ||
| 179 | - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | 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); | ||
| 180 | } | 245 | } |
| 181 | 246 | ||
| 182 | - | 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, //冻结开关 |
-
请 注册 或 登录 后发表评论