作者 ookk303

hal层修改

#include <pthread.h>
#include <pthread.h>
#include "JZsdkLib.h"
#include "BaseConfig.h"
... ... @@ -338,8 +338,8 @@ static T_JZsdkReturnCode EquipmentEnvironment_Init()
//sdklib加载
JZsdk_LibInit(JZ_FLAGCODE_ON);
//hal信息加载,这里后期需要优化
JZsdk_Hal_Init();
//hal信息加载
JZsdk_HalInit();
JZSDK_LOG_INFO("%x,PsdkVersion%d.%d.%d.%d\n",DEVICE_VERSION,MAJOR_VERSION, MINOR_VERSION, MODIFY_VERSION, DEBUG_VERSION);
... ... @@ -369,7 +369,11 @@ T_JZsdkReturnCode Main_APP_Psdk()
JZSDK_WidgetMgMT_Init();
//初始化app模式
JZsdk_HalPort_SetUseFlag(DEVICE_PSDK ,JZ_FLAGCODE_ON);
T_JZsdk_DirectDataInfo DirectDataInfo = {
.Base.PortId = DEVICE_PSDK,
};
JZsdk_HalDirectDataInit(&DirectDataInfo);
Main_WorkModeSet(JZ_FLAGCODE_ON);
... ... @@ -398,17 +402,19 @@ int Main_TestAPP()
{
JZsdk_LibInit(JZ_FLAGCODE_ON);
JZsdk_Hal_Init();
JZsdk_HalInit();
CommonMod_Init();
//串口设备1初始化
s_JZ_SerialPortHalRegInfo SerialInfo = {
.BitRate = UART_DEV1_BITRATE,
.ConnectType = PORT_CONNECT_TYPE_AS_SUB
};
T_JZsdk_UartInfo UartInfo = {
JZsdk_HalPort_Init(UART_DEV_1, (void *)&SerialInfo);
.DevicePath = UART_DEV1_NUM,
.Baudrate = UART_DEV1_BITRATE,
.Base.PortId = UART_DEV_1,
.Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_SUB,
};
JZsdk_HalUartInit(&UartInfo);
}
... ...
... ... @@ -39,6 +39,15 @@ void *JZ_T40_SubConnectTask(void *arg)
static int DelayTime = 0; //最多尝试连接设备30s
T_JZsdkHalHandle* HalHandle = JZsdk_Platform_GetHalHandle();
if (HalHandle == NULL)
{
JZSDK_LOG_ERROR("无法正常获取hal权柄");
return;
}
T_JZsdk_HalInfo HalInfo = { 0 };
while (
(RightGimbalConnectFlag == JZ_FLAGCODE_OFF ||
LeftGimbalConnectFlag == JZ_FLAGCODE_OFF ||
... ... @@ -46,40 +55,47 @@ void *JZ_T40_SubConnectTask(void *arg)
LeftDeviceConnectFlag == JZ_FLAGCODE_OFF ) &&
DelayTime <= 20000)
{
s_JZsdk_Hal_Info *HalInfo = JZsdk_Hal_GetHalInfo();
HalHandle->GetHalInfo(&HalInfo);
//遍历hal信息
for (int i = 0; i < HalInfo->HalPort[UART_DEV_2].SubNum; i++)
for (int i = 0; i < HalInfo.UartNum; i++)
{
if (HalInfo.UartInfo[i].Base.PortId == UART_DEV_2)
{
if(HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c11)
for (int j = 0; j < HalInfo.UartInfo[i].Base.HalStatus.SubNum; j++)
{
if (HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c11)
{
LeftGimbalConnectFlag = JZ_FLAGCODE_ON;
continue;
}
if(HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c12)
if (HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c12)
{
RightGimbalConnectFlag = JZ_FLAGCODE_ON;
continue;
}
if(HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c21
|| HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c31)
if (HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c21 ||
HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c31)
{
LeftDeviceId = HalInfo->HalPort[UART_DEV_2].SubId[i];
LeftDeviceId = HalInfo.UartInfo[i].Base.HalStatus.SubId[j];
LeftDeviceConnectFlag = JZ_FLAGCODE_ON;
continue;
}
if(HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c22
|| HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c32)
if (HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c22 ||
HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c32)
{
RightDeviceId = HalInfo->HalPort[UART_DEV_2].SubId[i];
RightDeviceId = HalInfo.UartInfo[i].Base.HalStatus.SubId[j];
RightDeviceConnectFlag = JZ_FLAGCODE_ON;
continue;
}
}
break;
}
}
//左云台未连接
if (LeftGimbalConnectFlag == JZ_FLAGCODE_OFF)
{
... ... @@ -127,7 +143,7 @@ void *JZ_T40_SubConnectTask(void *arg)
}
//右激光未连接
if (LeftDeviceConnectFlag == JZ_FLAGCODE_OFF)
if (RightDeviceConnectFlag == JZ_FLAGCODE_OFF)
{
//向左探照灯发送连接指令
HalSend_type1Send_ConnectFrame(UART_DEV_2, 0x32);
... ... @@ -579,13 +595,15 @@ T_JZsdkReturnCode JZ_T40_init_JZ(int mode)
if (mode == APP_UART)
{
//串口设备1初始化
s_JZ_SerialPortHalRegInfo SerialInfo = {
.BitRate = UART_DEV1_BITRATE,
.ConnectType = PORT_CONNECT_TYPE_AS_SUB
T_JZsdk_UartInfo UartInfo = {
.Base.PortId = UART_DEV_1,
.DevicePath = UART_DEV1_NUM,
.Baudrate = UART_DEV1_BITRATE,
.Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_SUB,
};
JZsdk_HalPort_Init(UART_DEV_1, (void*)&SerialInfo);
//串口设备1初始化
JZsdk_HalUartInit(&UartInfo);
}
if (mode == APP_PSDK)
... ... @@ -595,20 +613,26 @@ T_JZsdkReturnCode JZ_T40_init_JZ(int mode)
}
//串口设备2初始化
s_JZ_SerialPortHalRegInfo SerialInfo2 = {
.BitRate = UART_DEV2_BITRATE,
.ConnectType = PORT_CONNECT_TYPE_AS_MAIN,
T_JZsdk_UartInfo Uart2Info = {
.Base.PortId = UART_DEV_2,
.DevicePath = UART_DEV2_NUM,
.Baudrate = UART_DEV2_BITRATE,
.Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_MAIN,
};
JZsdk_HalUartInit(&Uart2Info);
JZsdk_HalPort_Init(UART_DEV_2, (void*)&SerialInfo2);
#if DEVICE_VERSION == JZ_T40S
//4G初始化
s_JZ_SerialPortHalRegInfo SerialInfo3 = {
.BitRate = COMM_4G_UART_BITRATE,
.ConnectType = PORT_CONNECT_TYPE_AS_SUB,
T_JZsdk_UartInfo Uart4GInfo = {
.Base.PortId = UART_4G,
.DevicePath = COMM_4G_UART_NUM,
.Baudrate = COMM_4G_UART_BITRATE,
.Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_SUB,
};
JZsdk_HalPort_Init(UART_4G, (void*)&SerialInfo3);
JZsdk_HalUartInit(&Uart4GInfo);
#endif
//子设备连接
... ... @@ -718,21 +742,23 @@ T_JZsdkReturnCode JZ_T40_init_DT(int mode)
if (mode == APP_UART)
{
//串口设备1初始化
s_JZ_SerialPortHalRegInfo SerialInfo = {
.BitRate = UART_DEV1_BITRATE,
.ConnectType = PORT_CONNECT_TYPE_AS_SUB
T_JZsdk_UartInfo UartInfo = {
.Base.PortId = UART_DEV_1,
.DevicePath = UART_DEV1_NUM,
.Baudrate = UART_DEV1_BITRATE,
.Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_SUB,
};
JZsdk_HalPort_Init(UART_DEV_1, (void*)&SerialInfo);
JZsdk_HalUartInit(&UartInfo);
}
//串口设备2初始化
s_JZ_SerialPortHalRegInfo SerialInfo2 = {
.BitRate = UART_DEV2_BITRATE,
.ConnectType = PORT_CONNECT_TYPE_AS_MAIN,
T_JZsdk_UartInfo Uart2Info = {
.Base.PortId = UART_DEV_2,
.DevicePath = UART_DEV2_NUM,
.Baudrate = UART_DEV2_BITRATE,
.Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_MAIN,
};
JZsdk_HalPort_Init(UART_DEV_2, (void*)&SerialInfo2);
JZsdk_HalUartInit(&Uart2Info);
//子设备连接
JZ_T40_SubDevice_Init();
... ...
/* ********************************************************************
/* ********************************************************************
*
* 用于确认对应设备的选择
*
... ... @@ -10,7 +10,7 @@
#define DEVICE_VERSION JZ_T40S
//禁止修改行 选择是串口程序 还是 psdk程序
#define APP_VERSION APP_PSDK
#define APP_VERSION APP_UART
//禁止修改行 板子型号
#define PLATFORM_VERSION PLATFORM_V3S
... ... @@ -23,7 +23,7 @@
#define MODIFY_VERSION_TEN_POSITION 0
#define MODIFY_VERSION_ONE_POSITION 2
#define DEBUG_VERSION_TEN_POSITION 2
#define DEBUG_VERSION_ONE_POSITION 7
#define DEBUG_VERSION_ONE_POSITION 8
#define FIRMWARE_ORIGIN DOMESTIC_VERSION
... ... @@ -199,4 +199,3 @@
#endif
\ No newline at end of file
... ...
... ... @@ -91,8 +91,28 @@ static T_JZsdkReturnCode RecvDeal_AskForConnect(int Port, char *getbuf)
}
//5、打开连接状态
s_JZsdk_Hal_Info *HalInfo = JZsdk_Hal_GetHalInfo();
HalInfo->HalPort[Port].ConnectStatus = JZ_FLAGCODE_ON;
// 通过 HAL 句柄安全地修改连接状态
T_JZsdkHalHandle* handle = JZsdk_Platform_GetHalHandle();
if (handle == NULL)
{
JZSDK_LOG_ERROR("HAL 未初始化");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
handle->lock(handle);
T_JZsdk_PortBase* halBase = JZsdk_FindPortBase(Port);
if (halBase != NULL)
{
halBase->HalStatus.ConnectStatus = JZ_FLAGCODE_ON;
}
else
{
handle->unlock(handle);
JZSDK_LOG_ERROR("端口 %d 未找到", Port);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
handle->unlock(handle);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -101,41 +121,83 @@ static T_JZsdkReturnCode RecvDeal_AskForConnect(int Port, char *getbuf)
*
* 心跳帧通知
*
**********/
static T_JZsdkReturnCode RecvDeal_HeartBeat(int Port, char *getbuf)
**********/
static T_JZsdkReturnCode RecvDeal_HeartBeat(int Port, char* getbuf)
{
JZSDK_LOG_INFO("%s,recvHBF",JZsdk_DefineCode_GetPortName(Port));
JZSDK_LOG_INFO("%s, recvHBF", JZsdk_DefineCode_GetPortName(Port));
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
int mode = getbuf[9]; // 假设模式在第9字节
T_JZsdkHalHandle* handle = JZsdk_Platform_GetHalHandle();
if (handle == NULL)
{
JZSDK_LOG_ERROR("HAL 未初始化");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//1、获取连接情况
s_JZsdk_Hal_Info *halInfo = JZsdk_Hal_GetHalInfo();
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//分析模式
int mode = getbuf[9];
if (mode == 0x00)
{
//2、回复心跳帧
HalSend_type1Send_Send_HeartBeatStatus(Port, FrameSequence, halInfo->HalPort[Port].ConnectStatus);
int connectStatus = JZ_FLAGCODE_OFF; // 默认值
handle->lock(handle);
T_JZsdk_PortBase* portBase = JZsdk_FindPortBase(Port);
if (portBase != NULL)
{
connectStatus = portBase->HalStatus.ConnectStatus;
}
else {
JZSDK_LOG_ERROR("端口 %d 未找到", Port);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
handle->unlock(handle);
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
// 使用复制的 connectStatus 发送心跳状态
HalSend_type1Send_Send_HeartBeatStatus(Port, FrameSequence, connectStatus);
}
}
else if (mode == 0x01 || mode == 0x02)
{
if(mode == 0x01)
handle->lock(handle);
T_JZsdk_PortBase* portBase = JZsdk_FindPortBase(Port);
if (portBase != NULL)
{
if (mode == 0x01)
{
halInfo->HalPort[Port].HeartBeatStatusSend = JZ_FLAGCODE_ON;
portBase->HalStatus.HeartBeatStatusSend = JZ_FLAGCODE_ON;
}
else if (mode == 0x02)
else if(mode == 0x02)
{
halInfo->HalPort[Port].HeartBeatStatusSend = JZ_FLAGCODE_OFF;
portBase->HalStatus.HeartBeatStatusSend = JZ_FLAGCODE_OFF;
}
handle->unlock(handle);
HalSend_type1Send_Reply_Success(Port, FrameSequence);
}
else
{
handle->unlock(handle);
JZSDK_LOG_ERROR("端口 %d 未找到", Port);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
else
{
JZSDK_LOG_WARN("未知心跳模式: 0x%02x", mode);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
return ret;
}
/*********
*
* 获取所有版本号
... ... @@ -4279,68 +4341,77 @@ static T_JZsdkReturnCode RecvDeal_CheckStatus_WarningLightMode2(int Port, char *
********* ********|
********* ********|
*********************************************************************************************************/
/*******************************************************************************************************************************
/*********
*
* 设备相关
* 作为主设备,收到连接回复帧(从设备回复连接)
*
* *******************************************************************************************************************************/
static T_JZsdkReturnCode RecvDeal_ObtainConnectFrame(int Port, char *getbuf)
**********/
static T_JZsdkReturnCode RecvDeal_ObtainConnectFrame(int Port, char* getbuf)
{
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
JZSDK_LOG_INFO("%s,收到连接回复帧",JZsdk_DefineCode_GetPortName(Port));
JZSDK_LOG_INFO("%s,收到连接回复帧", JZsdk_DefineCode_GetPortName(Port));
//获取帧的序列号
// 获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
//获取设备id
//计算ID长度
int FrameLenth = JZsdk_Get_FrameLength(getbuf);
int IDLength = FrameLenth - 11;
// 计算设备ID长度
int FrameLength = JZsdk_Get_FrameLength(getbuf);
int IDLength = FrameLength - 11; // 假设协议头固定11字节
//获取ID
// 解析设备ID(移位累加)
int DeviceID = 0;
//将ID转换为int
for (int i = 0; i < IDLength; i++)
{
DeviceID = DeviceID + (getbuf[9 + i] << (8 * (IDLength - i - 1)));
DeviceID = (DeviceID << 8) | (getbuf[9 + i] & 0xFF);
}
JZSDK_LOG_INFO("收到连接回复帧, 设备ID: %d", DeviceID);
//将ID放入Hal信息
s_JZsdk_Hal_Info *halInfo = JZsdk_Hal_GetHalInfo();
if (halInfo == NULL)
// 获取HAL句柄
T_JZsdkHalHandle* handle = JZsdk_Platform_GetHalHandle();
if (handle == NULL)
{
JZSDK_LOG_ERROR("HAL 未初始化");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
handle->lock(handle);
// 查找端口基类
T_JZsdk_PortBase* portBase = JZsdk_FindPortBase(Port);
if (portBase == NULL)
{
JZSDK_LOG_ERROR("获取Hal信息失败");
handle->unlock(handle);
JZSDK_LOG_ERROR("端口 %d 未找到", Port);
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
//遍历ID表
for (int i = 0; i < halInfo->HalPort[Port].SubNum ; i++)
// 检查设备ID是否已存在
for (int i = 0; i < portBase->HalStatus.SubNum; i++)
{
if (halInfo->HalPort[Port].SubId[i] == DeviceID)
if (portBase->HalStatus.SubId[i] == DeviceID)
{
JZSDK_LOG_INFO("已拥有设备ID: %d", DeviceID);
JZSDK_LOG_INFO("设备ID %d 已存在", DeviceID);
handle->unlock(handle);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
}
//添加ID
if (halInfo->HalPort[Port].SubNum >= JZ_MAX_SUB_ID_NUM)
{
JZSDK_LOG_INFO("设备ID表已满");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
else
// 检查数组是否已满
if (portBase->HalStatus.SubNum >= JZ_MAX_SUB_ID_NUM)
{
JZSDK_LOG_INFO("添加设备ID: %d", DeviceID);
JZSDK_LOG_ERROR("设备ID表已满,无法添加新ID");
handle->unlock(handle);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
halInfo->HalPort[Port].SubId[halInfo->HalPort[Port].SubNum] = DeviceID;
halInfo->HalPort[Port].SubNum++;
// 添加新设备ID
portBase->HalStatus.SubId[portBase->HalStatus.SubNum] = DeviceID;
portBase->HalStatus.SubNum++;
JZSDK_LOG_INFO("添加设备ID 0x%x 成功,当前从设备数量: %d", DeviceID, portBase->HalStatus.SubNum);
handle->unlock(handle);
return ret;
}
... ... @@ -5070,13 +5141,9 @@ static void *UartReinit_thread(void *arg)
int *arg_value = (int *)arg;
int Port = arg_value[0];
int BitRate = arg_value[1];
s_JZ_SerialPortHalRegInfo SerialInfo = {
.BitRate = arg_value[1],
.ConnectType = PORT_CONNECT_TYPE_AS_SUB
};
JZsdk_HalPort_ReInit(Port, (void *)&SerialInfo);
JZsdk_HalUartReInit(Port, BitRate);
JZSDK_LOG_INFO("串口重置完毕");
... ...
#include "JZsdkLib.h"
#include <stdio.h>
#include "JZsdkLib.h"
#include "Hal_Recv/HalRecv.h"
#include "Hal_Send/HalSend.h"
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include "JZsdk_Hal.h"
#include "BaseConfig.h"
#include "JZsdk_uart/JZsdk_Uart.h"
static s_JZsdk_Hal_Info *g_HalInfo = NULL;
// 静态全局变量:HAL 信息指针和句柄指针
static T_JZsdk_HalInfo* g_pHalInfo = NULL;
static T_JZsdkHalHandle* g_HalHandle = NULL;
// 用于保护初始化的临时锁(仅用于 JZsdk_HalInit 和 JZsdk_HalDeinit)
static pthread_mutex_t g_initMutex = PTHREAD_MUTEX_INITIALIZER;
s_JZsdk_Hal_Info *JZsdk_Hal_GetHalInfo()
/* 默认锁函数实现(使用 pthread) */
static T_JZsdkReturnCode default_lock(T_JZsdkHalHandle* handle)
{
return g_HalInfo;
pthread_mutex_lock((pthread_mutex_t*)handle->lockCtx);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode JZsdk_Hal_Init()
static T_JZsdkReturnCode default_unlock(T_JZsdkHalHandle* handle)
{
T_JZsdkOsalHandler *pOsalHandler = JZsdk_Platform_GetOsalHandler();
pthread_mutex_unlock((pthread_mutex_t*)handle->lockCtx);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/***************
*
* 查询设备是否被引用
*
***********/
static int JZsdk_Hal_PortIsUsed(int PortId)
{
// 检查句柄和数据是否已初始化
if (g_HalHandle == NULL || g_pHalInfo == NULL)
{
JZSDK_LOG_ERROR("HAL 未初始化,请先调用 JZsdk_HalInit");
return JZ_FLAGCODE_OFF;
}
if (g_HalInfo == NULL)
// 加锁
g_HalHandle->lock(g_HalHandle);
int used = JZ_FLAGCODE_OFF;
for (int i = 0; i < g_pHalInfo->HaveUsePortNum; i++) {
if (g_pHalInfo->HaveUsePortId[i] == PortId) {
used = JZ_FLAGCODE_ON;
break;
}
}
g_HalHandle->unlock(g_HalHandle);
return used;
}
/***************
*
* 获取结构体以获取信息
*
***********/
static T_JZsdkReturnCode JZsdk_Get_HalInfo(T_JZsdk_HalInfo* pHalInfo)
{
if (g_HalHandle == NULL || g_pHalInfo == NULL)
{
JZSDK_LOG_ERROR("获取hal信息失败:HAL未初始化");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
if (pHalInfo == NULL)
{
g_HalInfo = pOsalHandler->Malloc(sizeof(s_JZsdk_Hal_Info));
JZSDK_LOG_ERROR("无效参数:pHalInfo 为空");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//将结构体信息清空
memset(g_HalInfo, 0, sizeof(s_JZsdk_Hal_Info));
g_HalHandle->lock(g_HalHandle);
memcpy(pHalInfo, g_pHalInfo, sizeof(T_JZsdk_HalInfo));
g_HalHandle->unlock(g_HalHandle);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**
*
* @brief 上层UART端口注册与管理
* @param pUartInfo 指向UART配置信息的指针
* @return 成功返回JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS,失败返回相应错误码
*
*/
T_JZsdkReturnCode JZsdk_HalUartInit(T_JZsdk_UartInfo* pUartInfo)
{
if (pUartInfo == NULL)
{
JZSDK_LOG_ERROR("无效参数:pUartInfo 为空");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//PSDK系列初始化
for (int i = DEVICE_PSDK; i < UART_4G; i++)
// 检查句柄和数据是否已初始化
if (g_HalHandle == NULL || g_pHalInfo == NULL)
{
g_HalInfo->HalPort[i].PortType = PORT_TYPE_PSDK;
JZSDK_LOG_ERROR("HAL 未初始化,请先调用 JZsdk_HalInit");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//UART系列初始化
for (int i = UART_4G; i < USB_DEV_1; i++)
g_HalHandle->lock(g_HalHandle);
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// 1. 检查端口ID是否已经存在
for (int i = 0; i < g_pHalInfo->HaveUsePortNum; i++)
{
if (pUartInfo->Base.PortId == g_pHalInfo->HaveUsePortId[i])
{
g_HalInfo->HalPort[i].PortType = PORT_TYPE_UART;
JZSDK_LOG_INFO("端口 0x%x 已经初始化过", pUartInfo->Base.PortId);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
goto unlock;
}
}
//USB系列初始化
for (int i = USB_DEV_1; i < NET_DEV_1; i++)
// 2. 检查全局端口表是否已满
if (g_pHalInfo->HaveUsePortNum >= JZ_MAX_PORT_NUM)
{
g_HalInfo->HalPort[i].PortType = PORT_TYPE_USB;
JZSDK_LOG_ERROR("全局端口表已满(最多 %d 个)", JZ_MAX_PORT_NUM);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
goto unlock;
}
//网口系列初始化
for (int i = NET_DEV_1; i < HAL_DATA_TRANSMISSION; i++)
// 3. 检查UART端口数量是否已达上限
if (g_pHalInfo->UartNum >= JZ_MAX_UART_NUM)
{
g_HalInfo->HalPort[i].PortType = PORT_TYPE_NET;
JZSDK_LOG_ERROR("没有可用的UART槽位(最多 %d 个)", JZ_MAX_UART_NUM);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
goto unlock;
}
//特殊数据层
for (int i = HAL_DATA_TRANSMISSION; i < HAL_MAX; i++)
// 4. 调用底层硬件初始化
if (JZsdk_UartInit(pUartInfo) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
g_HalInfo->HalPort[i].PortType = PORT_TYPE_TRANS_DATA;
JZSDK_LOG_ERROR("UART硬件初始化失败,端口 0x%x", pUartInfo->Base.PortId);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
goto unlock;
}
JZSDK_LOG_INFO("JZsdk_Hal_Init Success");
// 5. 保存UART信息到UART数组(使用UartNum作为索引)
int uartIndex = g_pHalInfo->UartNum;
memcpy(&g_pHalInfo->UartInfo[uartIndex], pUartInfo, sizeof(T_JZsdk_UartInfo));
g_pHalInfo->UartNum++;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// 6. 记录端口ID到全局已使用表
g_pHalInfo->HaveUsePortId[g_pHalInfo->HaveUsePortNum] = pUartInfo->Base.PortId;
g_pHalInfo->HaveUsePortNum++;
JZSDK_LOG_INFO("UART端口 0x%x 初始化成功", pUartInfo->Base.PortId);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
unlock:
g_HalHandle->unlock(g_HalHandle);
return ret;
}
/**************
/**
*
* uart重初始化的专用指针
*
* jzsdk 获取hal的端口使用标志位
*
* *********************/
int JZsdk_HalPort_UseFlag(int PortName)
*/
T_JZsdkReturnCode JZsdk_HalUartReInit(int PortId, int NewBitRate)
{
if(g_HalInfo == NULL)
//获取id信息
T_JZsdkHalHandle* HalHandle = JZsdk_Platform_GetHalHandle();
if (HalHandle == NULL)
{
return JZ_FLAGCODE_OFF;
JZSDK_LOG_ERROR("注册错误,hal未初始化");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return g_HalInfo->HalPort[PortName].UseFlag;
}
//检查该id是否已被注册
if (HalHandle->PortIsUsed(PortId) == JZ_FLAGCODE_OFF)
{
JZSDK_LOG_ERROR("当前串口未被初始化");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
T_JZsdkReturnCode JZsdk_HalPort_SetUseFlag(int PortName,int UseFlag)
{
g_HalInfo->HalPort[PortName].UseFlag = UseFlag;
// 获取当前 HAL 信息(需要加锁,但 GetHalInfo 内部已经加锁)
T_JZsdk_HalInfo halInfo = { 0 };
T_JZsdkReturnCode ret = HalHandle->GetHalInfo(&halInfo);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
return ret;
}
//将端口添加到已使用端口列表中 或从端口中移除
//如果是要添加进列表中
if (UseFlag == JZ_FLAGCODE_ON)
// 查找对应 UART 信息
int i = 0;
for (; i < halInfo.UartNum; i++)
{
//先检查列表中是否已经存在
for (int i = 0; i < g_HalInfo->HaveUsePortNum; i++)
{
if (g_HalInfo->HaveUsePort[i] == PortName)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
if (halInfo.UartInfo[i].Base.PortId == PortId) {
break;
}
}
//如果不存在,则添加
g_HalInfo->HaveUsePort[g_HalInfo->HaveUsePortNum] = PortName;
g_HalInfo->HaveUsePortNum++;
g_HalInfo->HalPort[PortName].UseFlag = JZ_FLAGCODE_ON;
if (i >= halInfo.UartNum)
{
JZSDK_LOG_ERROR("重初始化失败,未检测到串口信息");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//如果是要从列表中移除
else if (UseFlag == JZ_FLAGCODE_OFF)
{
//先检查列表中是否已经存在
for (int i = 0; i < g_HalInfo->HaveUsePortNum; i++)
{
if (g_HalInfo->HaveUsePort[i] == PortName)
// 修改波特率
T_JZsdk_UartInfo uartInfo = halInfo.UartInfo[i];
uartInfo.Baudrate = NewBitRate;
//重初始化
if (JZsdk_UartReinit(&uartInfo, PortId) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
g_HalInfo->HaveUsePort[i] = g_HalInfo->HaveUsePort[g_HalInfo->HaveUsePortNum - 1];
g_HalInfo->HaveUsePortNum--;
g_HalInfo->HalPort[PortName].UseFlag = JZ_FLAGCODE_OFF;
g_HalInfo->HalPort[PortName].ConnectStatus = JZ_FLAGCODE_OFF;
g_HalInfo->HalPort[PortName].HeartBeatStatusSend = JZ_FLAGCODE_OFF;
JZSDK_LOG_ERROR("串口重初始化失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 更新全局信息(需要加锁)
HalHandle->lock(HalHandle);
// 再次查找(可能期间发生变化),确保索引有效
int j = 0;
for (; j < g_pHalInfo->UartNum; j++)
{
if (g_pHalInfo->UartInfo[j].Base.PortId == PortId) {
memcpy(&g_pHalInfo->UartInfo[j], &uartInfo, sizeof(T_JZsdk_UartInfo));
break;
}
}
//如果本来就不存在,则直接返回
JZSDK_LOG_INFO("hal口:%s,本来就未使用,无需移除", JZsdk_DefineCode_GetPortName(PortName));
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
HalHandle->unlock(HalHandle);
if (j >= g_pHalInfo->UartNum) {
JZSDK_LOG_ERROR("更新失败,端口在查找过程中被移除");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZSDK_LOG_INFO("UART端口 0x%x 重初始化成功", PortId);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//用于给初始化函数调用
static T_JZsdkReturnCode JZsdK_HalPort_Init_Info(int PortName, int UseFlag
, int ConnectStatus, int HeartBeatStatusSend, int PortType, int ConnectType)
{
g_HalInfo->HalPort[PortName].UseFlag = UseFlag;
g_HalInfo->HalPort[PortName].ConnectStatus = ConnectStatus;
g_HalInfo->HalPort[PortName].HeartBeatStatusSend = HeartBeatStatusSend;
g_HalInfo->HalPort[PortName].PortType = PortType;
g_HalInfo->HalPort[PortName].ConnectType = ConnectType;
//记录端口
JZsdk_HalPort_SetUseFlag(PortName, JZ_FLAGCODE_ON);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**********************
*
* hal端口 初始化函数
* psdk初始化 value为NULL
* uart初始化 value[0]为波特率
*
* ******************/
T_JZsdkReturnCode JZsdk_HalPort_Init(int PortName, void *Value)
T_JZsdkReturnCode JZsdk_HalDirectDataInit(T_JZsdk_DirectDataInfo* pDirectDataInfo)
{
T_JZsdkReturnCode ret;
if (pDirectDataInfo == NULL)
{
JZSDK_LOG_ERROR("无效参数:pDirectDataInfo 为空");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//psdk初始化
if (PortName >= DEVICE_PSDK && PortName < UART_4G)
if (g_HalHandle == NULL || g_pHalInfo == NULL)
{
JZsdK_HalPort_Init_Info(PortName,
JZ_FLAGCODE_ON,
JZ_FLAGCODE_OFF,
JZ_FLAGCODE_OFF,
PORT_TYPE_PSDK,
PORT_CONNECT_TYPE_AS_SUB);
JZSDK_LOG_ERROR("HAL 未初始化,请先调用 JZsdk_HalInit");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZSDK_LOG_INFO("hal%s 初始化",JZsdk_DefineCode_GetPortName(PortName));
g_HalHandle->lock(g_HalHandle);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// 1. 检查端口ID是否已经存在
for (int i = 0; i < g_pHalInfo->HaveUsePortNum; i++)
{
if (pDirectDataInfo->Base.PortId == g_pHalInfo->HaveUsePortId[i])
{
JZSDK_LOG_INFO("端口 0x%x 已经初始化过", pDirectDataInfo->Base.PortId);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
goto unlock;
}
}
//uart初始化
if (PortName >= UART_4G && PortName < USB_DEV_1)
// 2. 检查全局端口表是否已满
if (g_pHalInfo->HaveUsePortNum >= JZ_MAX_PORT_NUM)
{
JZSDK_LOG_INFO("hal%s 初始化",JZsdk_DefineCode_GetPortName(PortName));
JZSDK_LOG_ERROR("全局端口表已满(最多 %d 个)", JZ_MAX_PORT_NUM);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
goto unlock;
}
if (Value == NULL)
// 3. 检查UART端口数量是否已达上限
if (g_pHalInfo->DirectNum >= JZ_MAX_DIRECT_NUM)
{
JZSDK_LOG_ERROR("hal%s 初始化失败,Value为NULL",JZsdk_DefineCode_GetPortName(PortName));
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
JZSDK_LOG_ERROR("没有可用的DIRECT槽位(最多 %d 个)", JZ_MAX_DIRECT_NUM);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
goto unlock;
}
s_JZ_SerialPortHalRegInfo *PortInfo = (s_JZ_SerialPortHalRegInfo *)Value;
// 4 初始化直通
//(只是把id打开)
int BitRate = PortInfo->BitRate;
int ConnectType = PortInfo->ConnectType;
// 5. 保存UART信息到UART数组(使用UartNum作为索引)
int Index = g_pHalInfo->DirectNum;
memcpy(&g_pHalInfo->DirectDataInfo[Index], pDirectDataInfo, sizeof(T_JZsdk_UartInfo));
g_pHalInfo->UartNum++;
ret = JZsdk_Uart_ReInit(PortName, BitRate);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("hal%s 初始化失败",JZsdk_DefineCode_GetPortName(PortName));
// 6. 记录端口ID到全局已使用表
g_pHalInfo->HaveUsePortId[g_pHalInfo->HaveUsePortNum] = g_pHalInfo->DirectDataInfo->Base.PortId;
g_pHalInfo->HaveUsePortNum++;
JZSDK_LOG_INFO("DIRECT端口 0x%x 初始化成功", pDirectDataInfo->Base.PortId);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
unlock:
g_HalHandle->unlock(g_HalHandle);
return ret;
}
//hal的基类指针,用于快速修改或者找到某个数据
T_JZsdk_PortBase* JZsdk_FindPortBase(int PortId)
{
if (g_pHalInfo == NULL) return NULL;
// 遍历 UART
for (int i = 0; i < g_pHalInfo->UartNum; i++) {
if (g_pHalInfo->UartInfo[i].Base.PortId == PortId) {
return &g_pHalInfo->UartInfo[i].Base;
}
}
// 遍历 USB
for (int i = 0; i < g_pHalInfo->UsbNum; i++) {
if (g_pHalInfo->UsbInfo[i].Base.PortId == PortId) {
return &g_pHalInfo->UsbInfo[i].Base;
}
}
// 遍历 NET
for (int i = 0; i < g_pHalInfo->NetNum; i++) {
if (g_pHalInfo->NetInfo[i].Base.PortId == PortId) {
return &g_pHalInfo->NetInfo[i].Base;
}
}
// 遍历 DIRECT
for (int i = 0; i < g_pHalInfo->DirectNum; i++) {
if (g_pHalInfo->DirectDataInfo[i].Base.PortId == PortId) {
return &g_pHalInfo->DirectDataInfo[i].Base;
}
}
return NULL;
}
JZsdK_HalPort_Init_Info(PortName, JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF, PORT_TYPE_UART, ConnectType);
T_JZsdkHalHandle* JZsdk_Platform_GetHalHandle(void)
{
return g_HalHandle; // 返回已注册的 OSAL 处理器
}
/**
* HAL 初始化(动态分配内存)
*/
T_JZsdkReturnCode JZsdk_HalInit(void)
{
// 使用单独的初始化锁保护
pthread_mutex_lock(&g_initMutex);
if (g_pHalInfo != NULL || g_HalHandle != NULL)
{
JZSDK_LOG_WARN("HAL 已经初始化过");
pthread_mutex_unlock(&g_initMutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//usb初始化
if (PortName >= USB_DEV_1 && PortName < NET_DEV_1)
// 1. 分配 HAL 信息内存
T_JZsdk_HalInfo* halInfo = (T_JZsdk_HalInfo*)malloc(sizeof(T_JZsdk_HalInfo));
if (halInfo == NULL)
{
//还没做
JZSDK_LOG_ERROR("分配 HAL 信息内存失败");
pthread_mutex_unlock(&g_initMutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
memset(halInfo, 0, sizeof(T_JZsdk_HalInfo));
//net初始化
if (PortName >= NET_DEV_1 && PortName < HAL_DATA_TRANSMISSION)
// 2. 分配句柄内存
T_JZsdkHalHandle* handle = (T_JZsdkHalHandle*)malloc(sizeof(T_JZsdkHalHandle));
if (handle == NULL)
{
//还没做
JZSDK_LOG_ERROR("分配 HAL 句柄内存失败");
free(halInfo);
pthread_mutex_unlock(&g_initMutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//数据传输初始化
if (PortName == HAL_DATA_TRANSMISSION)
// 3. 分配锁对象(使用 pthread_mutex_t)
pthread_mutex_t* mutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
if (mutex == NULL)
{
JZsdK_HalPort_Init_Info(PortName, JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF, PORT_TYPE_TRANS_DATA, PORT_CONNECT_TYPE_AS_SUB);
JZSDK_LOG_ERROR("分配锁内存失败");
free(handle);
free(halInfo);
pthread_mutex_unlock(&g_initMutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
pthread_mutex_init(mutex, NULL);
JZSDK_LOG_INFO("hal%s 初始化",JZsdk_DefineCode_GetPortName(PortName));
// 4. 填充句柄
handle->lockCtx = mutex;
handle->lock = default_lock;
handle->unlock = default_unlock;
handle->PortIsUsed = JZsdk_Hal_PortIsUsed;
handle->GetHalInfo = JZsdk_Get_HalInfo;
// 5. 赋值给全局变量
g_pHalInfo = halInfo;
g_HalHandle = handle;
pthread_mutex_unlock(&g_initMutex);
JZSDK_LOG_INFO("JZSDK HAL INIT SUCCESS");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**
* HAL 去初始化(释放内存)
*/
T_JZsdkReturnCode JZsdk_HalDeinit(void)
{
pthread_mutex_lock(&g_initMutex);
if (g_HalHandle != NULL) {
// 销毁锁
pthread_mutex_t* mutex = (pthread_mutex_t*)g_HalHandle->lockCtx;
if (mutex) {
pthread_mutex_destroy(mutex);
free(mutex);
}
free(g_HalHandle);
g_HalHandle = NULL;
}
if (g_pHalInfo != NULL) {
free(g_pHalInfo);
g_pHalInfo = NULL;
}
pthread_mutex_unlock(&g_initMutex);
JZSDK_LOG_INFO("JZSDK HAL 去初始化成功");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/************************
//temp
/**************
*
* HalRort Reinit
* 专门用于已经初始化完毕端口
* 与init的区别是, Reinit 是要调用多线程来重初始化的
* jzsdk 获取hal的端口使用标志位
*
* ***************************/
T_JZsdkReturnCode JZsdk_HalPort_ReInit(int PortName, void *Value)
* *********************/
int JZsdk_HalPort_UseFlag(int PortName)
{
return JZsdk_HalPort_Init(PortName, Value);
for (int i = 0; i < g_pHalInfo->HaveUsePortNum; i++)
{
if (g_pHalInfo->HaveUsePortId[i] == PortName)
{
return JZ_FLAGCODE_ON;
}
}
return JZ_FLAGCODE_OFF;
}
\ No newline at end of file
... ...
/**
/**
********************************************************************
* @file JZsdk_Hal.h
* JZsdk_Hal.c 的头文件
... ... @@ -26,6 +26,11 @@ extern "C" {
/* 常亮定义*/
#define JZ_MAX_SUB_ID_NUM 10
#define JZ_MAX_PORT_NUM 64
#define JZ_MAX_UART_NUM 8
#define JZ_MAX_USB_NUM 4
#define JZ_MAX_NET_NUM 4
#define JZ_MAX_DIRECT_NUM 1
typedef enum E_HAL_PORT_TYPE
{
... ... @@ -47,59 +52,118 @@ typedef enum E_HAL_CONNECT_TYPE
/******************
*
* hal使用状态
* 端口使用状态
*
* ********/
typedef struct s_JZ_SerialPortHalRegInfo
typedef struct T_JZsdk_HalStatus
{
int BitRate; //波特率
E_HAL_CONNECT_TYPE ConnectType; //连接类型
}s_JZ_SerialPortHalRegInfo;
int PortType; // hal的端口类型
int ConnectType; // 主副设备类型
// 作为主设备专有
int SubId[JZ_MAX_SUB_ID_NUM]; // 副设备ID
int SubNum; // 副设备数量
/******************
*
* hal使用状态
*
*
*
* ********/
typedef struct s_JZsdk_HalStatus
// 作为副设备专有
int HeartBeatStatusSend; // 对主设备发送心跳帧的发送开关
int ConnectStatus; // 连接状态,接收过连接帧后打开
}T_JZsdk_HalStatus;
typedef struct {
T_JZsdk_HalStatus HalStatus;
int PortId;
}T_JZsdk_PortBase;
typedef struct T_JZsdk_UartInfo
{
T_JZsdk_PortBase Base;
// 独有参数
char DevicePath[64]; // 设备路径
int Baudrate; // 波特率
int UartId; // uart编号
}T_JZsdk_UartInfo;
typedef struct T_JZsdk_UsbInfo
{
T_JZsdk_PortBase Base;
// 独有参数
char DevicePath[64]; // 设备路径
}T_JZsdk_UsbInfo;
typedef struct T_JZsdk_NetInfo
{
int UseFlag; //hal使用标志位 //初始化时开关关闭
int PortType; //hal的端口类型
int ConnectType;//主副设备类型
T_JZsdk_PortBase Base;
// 独有参数
char DevicePath[64]; // 设备路径
//作为主设备专有
int SubId[JZ_MAX_SUB_ID_NUM]; //副设备ID
int SubNum; //副设备数量
} T_JZsdk_NetInfo;
//作为副设备专有
int HeartBeatStatusSend; //对主设备发送心跳帧的发送开关
int ConnectStatus; //连接状态,接收过连接帧后打开
typedef struct T_JZsdk_DirectDataInfo
{
T_JZsdk_PortBase Base;
}s_JZsdk_HalStatus;
}T_JZsdk_DirectDataInfo;
typedef struct s_JZsdk_Hal_Info
typedef struct T_JZsdk_HalInfo
{
s_JZsdk_HalStatus HalPort[0x50]; //记录hal使用的端口状态
int HaveUsePort[0x50]; //记录已经使用的端口
int HaveUsePortNum; //记录已经使用的端口数量
// uart信息
T_JZsdk_UartInfo UartInfo[JZ_MAX_UART_NUM];
int UartNum;
// usb信息
T_JZsdk_UsbInfo UsbInfo[JZ_MAX_USB_NUM];
int UsbNum;
}s_JZsdk_Hal_Info;
// 网口信息
T_JZsdk_NetInfo NetInfo[JZ_MAX_NET_NUM];
int NetNum;
// 直通数据类型接口
T_JZsdk_DirectDataInfo DirectDataInfo[JZ_MAX_DIRECT_NUM];
int DirectNum;
int HaveUsePortId[JZ_MAX_PORT_NUM]; // 记录已经使用的端口ID
//T_JZsdk_PortBase* PortPtrs[JZ_MAX_PORT_NUM]; // 与 HaveUsePortId 一一对应,存储端口基类指针
//ps : 基类指针的方法如果后期效率不够了再该用,前期遍历可能更安全一点
int HaveUsePortNum; // 记录已经使用的端口数量
} T_JZsdk_HalInfo;
//前向声明
typedef struct T_JZsdkHalHandle T_JZsdkHalHandle;
typedef struct T_JZsdkHalHandle
{
void* lockCtx; // 锁上下文(指向具体的锁对象)
T_JZsdkReturnCode(*lock)(T_JZsdkHalHandle* handle);
T_JZsdkReturnCode(*unlock)(T_JZsdkHalHandle* handle);
int (*PortIsUsed)(int PortId);
T_JZsdkReturnCode(*GetHalInfo)(T_JZsdk_HalInfo* HalInfo);
}T_JZsdkHalHandle;
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
int JZsdk_HalPort_UseFlag(int PortName);
T_JZsdkReturnCode JZsdk_HalPort_SetUseFlag(int PortName,int UseFlag);
T_JZsdkReturnCode JZsdk_HalInit(void);
T_JZsdkReturnCode JZsdk_HalDeinit(void);
T_JZsdkReturnCode JZsdk_HalPort_Init(int PortName, void *Value);
T_JZsdkReturnCode JZsdk_HalPort_ReInit(int PortName, void *Value);
T_JZsdkHalHandle* JZsdk_Platform_GetHalHandle(void);
T_JZsdk_PortBase* JZsdk_FindPortBase(int PortId);
T_JZsdkReturnCode JZsdk_Hal_Init();
s_JZsdk_Hal_Info *JZsdk_Hal_GetHalInfo();
//后期优化进 handle
T_JZsdkReturnCode JZsdk_HalUartInit(T_JZsdk_UartInfo* pUartInfo);
T_JZsdkReturnCode JZsdk_HalUartReInit(int PortId, int NewBitRate);
T_JZsdkReturnCode JZsdk_HalDirectDataInit(T_JZsdk_DirectDataInfo* pDirectDataInfo);
int JZsdk_HalPort_UseFlag(int PortName);
#ifdef __cplusplus
}
... ...
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
... ... @@ -11,29 +11,8 @@
#include "BaseConfig.h"
#include "JZsdk_uart/JZsdk_Uart_UartDeal.h"
#include "JZsdk_Hal.h"
static unsigned char *Get_UartDevPath(int UartDev)
{
switch (UartDev)
{
case UART_4G:
return COMM_4G_UART_NUM;
break;
case UART_DEV_1:
return UART_DEV1_NUM;
break;
case UART_DEV_2:
return UART_DEV2_NUM;
break;
default:
return NULL;
break;
}
}
#include "JZsdk_Uart.h"
#include "../JZsdk_Hal.h"
/********************
*
... ... @@ -130,41 +109,36 @@ T_JZsdkReturnCode JZsdk_Uart_UartEnabled(unsigned char *UartDev, unsigned int Bi
/****************
*
* 串口重初始化
* 该函数仅能被JZsdk_HalPort_Init调用,请勿直接使用
*
* ************************/
T_JZsdkReturnCode JZsdk_Uart_ReInit(int UART_DEV_NAME, int BitRate)
{
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
int UartFd = 0;
//JZSDK_LOG_INFO("初始化串口 0x%x", UART_DEV_NAME);
//检查是否已经初始化
if(JZsdk_HalPort_UseFlag(UART_DEV_NAME) == JZ_FLAGCODE_ON)
{
//先注释掉原来的串口
JZsdk_HalPort_SetUseFlag(UART_DEV_NAME, JZ_FLAGCODE_OFF);
/*
* 串口重初始化,比较特殊,该函数仅能用于已经被初始化的串口
* 注意, 外部初始化串口应该用hal uart reinit
*/
T_JZsdkReturnCode JZsdk_UartReinit(T_JZsdk_UartInfo* pUartInf, int PortId)
{
//然后关闭串口 注:该函数有延时
JZsdk_Uart_CloseUartThead(UART_DEV_NAME);
}
JZsdk_Uart_CloseUartThead(PortId);
return JZsdk_UartInit(pUartInf);
}
//该函数仅被hal.c引用,注意, 外部初始化串口应该用haluartinit
T_JZsdkReturnCode JZsdk_UartInit(T_JZsdk_UartInfo* pUartInfo)
{
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//2、串口初始化
ret = JZsdk_Uart_UartEnabled(Get_UartDevPath(UART_DEV_NAME), BitRate, &UartFd);
//串口初始化
ret = JZsdk_Uart_UartEnabled(pUartInfo->DevicePath, pUartInfo->Baudrate, &pUartInfo->UartId);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
return ret;
}
//3、串口接收初始化
JZsdk_Uart_UartDeal_Receive(UartFd, UART_DEV_NAME);
//串口接收初始化
JZsdk_Uart_UartDeal_Receive(pUartInfo->UartId, pUartInfo->Base.PortId);
JZSDK_LOG_INFO("init %s sucess", JZsdk_DefineCode_GetPortName(UART_DEV_NAME));
JZSDK_LOG_INFO("init %s sucess", JZsdk_DefineCode_GetPortName(pUartInfo->Base.PortId));
return ret;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/**
/**
********************************************************************
* @file JZsdk_Uart.h
* JZsdk_Uart.c 的头文件
... ... @@ -7,11 +7,12 @@
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_UART_H
#define JZSDK_UART_H
#ifndef JZSDK_UART_2_H
#define JZSDK_UART_2_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include "../JZsdk_Hal.h"
#ifdef __cplusplus
extern "C" {
... ... @@ -24,8 +25,8 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_Uart_ReInit(int UART_DEV_NAME, int BitRate);
T_JZsdkReturnCode JZsdk_Uart_UartEnabled(unsigned char *UartDev, unsigned int BitRate, int *UartFd);
T_JZsdkReturnCode JZsdk_UartReinit(T_JZsdk_UartInfo* pUartInf, int PortId);
T_JZsdkReturnCode JZsdk_UartInit(T_JZsdk_UartInfo* pUartInfo);
#ifdef __cplusplus
}
... ...
#include <stdio.h>
#include <stdio.h>
#include <pthread.h>
#include "JZsdkLib.h"
#include "JZsdk_Hal.h"
#include "Hal_Send/HalSend_type1/HalSend_type1.h"
T_JZsdkReturnCode HeartBeat_HalCheck()
T_JZsdkReturnCode HeartBeat_HalCheck(void)
{
s_JZsdk_Hal_Info *HalInfo = JZsdk_Hal_GetHalInfo();
T_JZsdkHalHandle* handle = JZsdk_Platform_GetHalHandle();
if (handle == NULL)
{
JZSDK_LOG_ERROR("HAL未初始化");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
T_JZsdk_HalInfo HalInfo = { 0 };
handle->GetHalInfo(&HalInfo);
// 加锁保护共享数据
handle->lock(handle);
//1、获取心跳帧的开启情况 发送心跳帧
for (int i = 0; i < HalInfo->HaveUsePortNum; i++)
// 遍历所有已使用的端口
for (int i = 0; i < HalInfo.HaveUsePortNum; i++)
{
if (HalInfo->HalPort[HalInfo->HaveUsePort[i]].HeartBeatStatusSend == JZ_FLAGCODE_ON)
int portId = HalInfo.HaveUsePortId[i];
T_JZsdk_PortBase* portBase = JZsdk_FindPortBase(portId);
if (portBase == NULL)
{
HalSend_type1Send_HeartBeatStatus(HalInfo->HaveUsePort[i], 0x00, HalInfo->HalPort[HalInfo->HaveUsePort[i]].ConnectStatus);
JZSDK_LOG_WARN("端口 %d 在已使用列表中但未找到对应结构", portId);
continue;
}
// 如果心跳发送开关开启,则发送心跳状态
if (portBase->HalStatus.HeartBeatStatusSend == JZ_FLAGCODE_ON)
{
// 发送心跳状态,第二个参数为序列号,此处沿用原代码的0x00
HalSend_type1Send_HeartBeatStatus(portId, 0x00, portBase->HalStatus.ConnectStatus);
}
}
handle->unlock(handle);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static void *HeartBeatTask(void *arg)
... ...
... ... @@ -173,7 +173,7 @@ T_JZsdkReturnCode Gimbal_Set_PitchAngle(int angle)
//独立模式
case JZ_MODULE_CONTROL_WAY_INDEPENDENT:
{
if (angle < g_GimbalInfo.PitchLimitMin || angle > g_GimbalInfo.PitchLimitMax || (g_GimbalInfo.PitchLimitMin == g_GimbalInfo.PitchLimitMax))
if ( (angle < g_GimbalInfo.PitchLimitMin) || (angle > g_GimbalInfo.PitchLimitMax) || (g_GimbalInfo.PitchLimitMin == g_GimbalInfo.PitchLimitMax))
{
printf("云台俯仰输入值范围出错:%d\n", angle);
return JZ_ERRORCODE_GIMBAL_INVALID_PITCH;
... ...
# cmake 最低版本要求 第三行名字不能动
cmake_minimum_required(VERSION 2.8)
project(JZ_T40S)
project(JZ_H150A)
#set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++")
#"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。
... ...
... ... @@ -62,6 +62,12 @@ extern "C" {
#define USER_DEVELOPER_ACCOUNT "jizhisdk@163.com"
#define USER_BAUD_RATE "921600"
//#define USER_APP_NAME "H150A"
//#define USER_APP_ID "180445"
//#define USER_APP_KEY "0164ed60d70b438c5ff26fde60c6609"
//#define USER_APP_LICENSE "rlyth08igUpD/ell+FOLoQJYI12b8IjnaylClO6T4n7sGopwUQ29aEXPaEK7HylrZBXbpYCpdZGbtjOj22G38FgEYOiVJqeFEzeZwJorDZzNt3X+i26h2pHvEMG9d+p3UnW8AGqowKAvOPOD8VW6jquj4iMkLrUP4NLrijWR9uMET1TenZY4MFSK+F5/Hl3+J8DFF8Uagj1q4UBaoUH/noZOiIspJB/s5mmYJAcqMwEMkv8YeE4gN8HLh8kDGFpmMXD2cy5UoQnZJVMzBYOMg4Fn1GPbuVGEIszgFY1XPjGvJ5219znC02ZHs9IKc6g8BxotKF8gUQbXI/yweGoCMA=="
//#define USER_DEVELOPER_ACCOUNT "jizhisdk@163.com"
//#define USER_BAUD_RATE "921600"
#else
#define USER_APP_NAME "H110"
#define USER_APP_ID "107188"
... ...