作者 ookk303

hal层修改

1 -#include <pthread.h> 1 +#include <pthread.h>
2 #include "JZsdkLib.h" 2 #include "JZsdkLib.h"
3 3
4 #include "BaseConfig.h" 4 #include "BaseConfig.h"
@@ -338,8 +338,8 @@ static T_JZsdkReturnCode EquipmentEnvironment_Init() @@ -338,8 +338,8 @@ static T_JZsdkReturnCode EquipmentEnvironment_Init()
338 //sdklib加载 338 //sdklib加载
339 JZsdk_LibInit(JZ_FLAGCODE_ON); 339 JZsdk_LibInit(JZ_FLAGCODE_ON);
340 340
341 - //hal信息加载,这里后期需要优化  
342 - JZsdk_Hal_Init(); 341 + //hal信息加载
  342 + JZsdk_HalInit();
343 343
344 JZSDK_LOG_INFO("%x,PsdkVersion%d.%d.%d.%d\n",DEVICE_VERSION,MAJOR_VERSION, MINOR_VERSION, MODIFY_VERSION, DEBUG_VERSION); 344 JZSDK_LOG_INFO("%x,PsdkVersion%d.%d.%d.%d\n",DEVICE_VERSION,MAJOR_VERSION, MINOR_VERSION, MODIFY_VERSION, DEBUG_VERSION);
345 345
@@ -369,7 +369,11 @@ T_JZsdkReturnCode Main_APP_Psdk() @@ -369,7 +369,11 @@ T_JZsdkReturnCode Main_APP_Psdk()
369 JZSDK_WidgetMgMT_Init(); 369 JZSDK_WidgetMgMT_Init();
370 370
371 //初始化app模式 371 //初始化app模式
372 - JZsdk_HalPort_SetUseFlag(DEVICE_PSDK ,JZ_FLAGCODE_ON); 372 +
  373 + T_JZsdk_DirectDataInfo DirectDataInfo = {
  374 + .Base.PortId = DEVICE_PSDK,
  375 + };
  376 + JZsdk_HalDirectDataInit(&DirectDataInfo);
373 377
374 Main_WorkModeSet(JZ_FLAGCODE_ON); 378 Main_WorkModeSet(JZ_FLAGCODE_ON);
375 379
@@ -398,17 +402,19 @@ int Main_TestAPP() @@ -398,17 +402,19 @@ int Main_TestAPP()
398 { 402 {
399 JZsdk_LibInit(JZ_FLAGCODE_ON); 403 JZsdk_LibInit(JZ_FLAGCODE_ON);
400 404
401 - JZsdk_Hal_Init(); 405 + JZsdk_HalInit();
402 406
403 CommonMod_Init(); 407 CommonMod_Init();
404 408
405 //串口设备1初始化 409 //串口设备1初始化
406 - s_JZ_SerialPortHalRegInfo SerialInfo = {  
407 - .BitRate = UART_DEV1_BITRATE,  
408 - .ConnectType = PORT_CONNECT_TYPE_AS_SUB  
409 - }; 410 + T_JZsdk_UartInfo UartInfo = {
410 411
411 - JZsdk_HalPort_Init(UART_DEV_1, (void *)&SerialInfo); 412 + .DevicePath = UART_DEV1_NUM,
  413 + .Baudrate = UART_DEV1_BITRATE,
  414 + .Base.PortId = UART_DEV_1,
  415 + .Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_SUB,
  416 + };
  417 + JZsdk_HalUartInit(&UartInfo);
412 } 418 }
413 419
414 420
@@ -39,6 +39,15 @@ void *JZ_T40_SubConnectTask(void *arg) @@ -39,6 +39,15 @@ void *JZ_T40_SubConnectTask(void *arg)
39 39
40 static int DelayTime = 0; //最多尝试连接设备30s 40 static int DelayTime = 0; //最多尝试连接设备30s
41 41
  42 + T_JZsdkHalHandle* HalHandle = JZsdk_Platform_GetHalHandle();
  43 + if (HalHandle == NULL)
  44 + {
  45 + JZSDK_LOG_ERROR("无法正常获取hal权柄");
  46 + return;
  47 + }
  48 +
  49 + T_JZsdk_HalInfo HalInfo = { 0 };
  50 +
42 while ( 51 while (
43 (RightGimbalConnectFlag == JZ_FLAGCODE_OFF || 52 (RightGimbalConnectFlag == JZ_FLAGCODE_OFF ||
44 LeftGimbalConnectFlag == JZ_FLAGCODE_OFF || 53 LeftGimbalConnectFlag == JZ_FLAGCODE_OFF ||
@@ -46,40 +55,47 @@ void *JZ_T40_SubConnectTask(void *arg) @@ -46,40 +55,47 @@ void *JZ_T40_SubConnectTask(void *arg)
46 LeftDeviceConnectFlag == JZ_FLAGCODE_OFF ) && 55 LeftDeviceConnectFlag == JZ_FLAGCODE_OFF ) &&
47 DelayTime <= 20000) 56 DelayTime <= 20000)
48 { 57 {
49 - s_JZsdk_Hal_Info *HalInfo = JZsdk_Hal_GetHalInfo(); 58 + HalHandle->GetHalInfo(&HalInfo);
50 59
51 - //遍历hal信息  
52 - for (int i = 0; i < HalInfo->HalPort[UART_DEV_2].SubNum; i++) 60 + for (int i = 0; i < HalInfo.UartNum; i++)
  61 + {
  62 + if (HalInfo.UartInfo[i].Base.PortId == UART_DEV_2)
53 { 63 {
54 - if(HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c11) 64 + for (int j = 0; j < HalInfo.UartInfo[i].Base.HalStatus.SubNum; j++)
  65 + {
  66 + if (HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c11)
55 { 67 {
56 LeftGimbalConnectFlag = JZ_FLAGCODE_ON; 68 LeftGimbalConnectFlag = JZ_FLAGCODE_ON;
57 continue; 69 continue;
58 } 70 }
59 71
60 - if(HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c12) 72 + if (HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c12)
61 { 73 {
62 RightGimbalConnectFlag = JZ_FLAGCODE_ON; 74 RightGimbalConnectFlag = JZ_FLAGCODE_ON;
63 continue; 75 continue;
64 } 76 }
65 77
66 - if(HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c21  
67 - || HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c31) 78 + if (HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c21 ||
  79 + HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c31)
68 { 80 {
69 - LeftDeviceId = HalInfo->HalPort[UART_DEV_2].SubId[i]; 81 + LeftDeviceId = HalInfo.UartInfo[i].Base.HalStatus.SubId[j];
70 LeftDeviceConnectFlag = JZ_FLAGCODE_ON; 82 LeftDeviceConnectFlag = JZ_FLAGCODE_ON;
71 continue; 83 continue;
72 } 84 }
73 85
74 - if(HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c22  
75 - || HalInfo->HalPort[UART_DEV_2].SubId[i] == 0x1c32) 86 + if (HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c22 ||
  87 + HalInfo.UartInfo[i].Base.HalStatus.SubId[j] == 0x1c32)
76 { 88 {
77 - RightDeviceId = HalInfo->HalPort[UART_DEV_2].SubId[i]; 89 + RightDeviceId = HalInfo.UartInfo[i].Base.HalStatus.SubId[j];
78 RightDeviceConnectFlag = JZ_FLAGCODE_ON; 90 RightDeviceConnectFlag = JZ_FLAGCODE_ON;
79 continue; 91 continue;
80 } 92 }
81 } 93 }
82 94
  95 + break;
  96 + }
  97 + }
  98 +
83 //左云台未连接 99 //左云台未连接
84 if (LeftGimbalConnectFlag == JZ_FLAGCODE_OFF) 100 if (LeftGimbalConnectFlag == JZ_FLAGCODE_OFF)
85 { 101 {
@@ -127,7 +143,7 @@ void *JZ_T40_SubConnectTask(void *arg) @@ -127,7 +143,7 @@ void *JZ_T40_SubConnectTask(void *arg)
127 } 143 }
128 144
129 //右激光未连接 145 //右激光未连接
130 - if (LeftDeviceConnectFlag == JZ_FLAGCODE_OFF) 146 + if (RightDeviceConnectFlag == JZ_FLAGCODE_OFF)
131 { 147 {
132 //向左探照灯发送连接指令 148 //向左探照灯发送连接指令
133 HalSend_type1Send_ConnectFrame(UART_DEV_2, 0x32); 149 HalSend_type1Send_ConnectFrame(UART_DEV_2, 0x32);
@@ -579,13 +595,15 @@ T_JZsdkReturnCode JZ_T40_init_JZ(int mode) @@ -579,13 +595,15 @@ T_JZsdkReturnCode JZ_T40_init_JZ(int mode)
579 595
580 if (mode == APP_UART) 596 if (mode == APP_UART)
581 { 597 {
582 - //串口设备1初始化  
583 - s_JZ_SerialPortHalRegInfo SerialInfo = {  
584 - .BitRate = UART_DEV1_BITRATE,  
585 - .ConnectType = PORT_CONNECT_TYPE_AS_SUB 598 + T_JZsdk_UartInfo UartInfo = {
  599 + .Base.PortId = UART_DEV_1,
  600 + .DevicePath = UART_DEV1_NUM,
  601 + .Baudrate = UART_DEV1_BITRATE,
  602 + .Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_SUB,
586 }; 603 };
587 604
588 - JZsdk_HalPort_Init(UART_DEV_1, (void*)&SerialInfo); 605 + //串口设备1初始化
  606 + JZsdk_HalUartInit(&UartInfo);
589 } 607 }
590 608
591 if (mode == APP_PSDK) 609 if (mode == APP_PSDK)
@@ -595,20 +613,26 @@ T_JZsdkReturnCode JZ_T40_init_JZ(int mode) @@ -595,20 +613,26 @@ T_JZsdkReturnCode JZ_T40_init_JZ(int mode)
595 } 613 }
596 614
597 //串口设备2初始化 615 //串口设备2初始化
598 - s_JZ_SerialPortHalRegInfo SerialInfo2 = {  
599 - .BitRate = UART_DEV2_BITRATE,  
600 - .ConnectType = PORT_CONNECT_TYPE_AS_MAIN, 616 + T_JZsdk_UartInfo Uart2Info = {
  617 + .Base.PortId = UART_DEV_2,
  618 + .DevicePath = UART_DEV2_NUM,
  619 + .Baudrate = UART_DEV2_BITRATE,
  620 + .Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_MAIN,
601 }; 621 };
  622 + JZsdk_HalUartInit(&Uart2Info);
602 623
603 - JZsdk_HalPort_Init(UART_DEV_2, (void*)&SerialInfo2);  
604 624
605 #if DEVICE_VERSION == JZ_T40S 625 #if DEVICE_VERSION == JZ_T40S
  626 +
606 //4G初始化 627 //4G初始化
607 - s_JZ_SerialPortHalRegInfo SerialInfo3 = {  
608 - .BitRate = COMM_4G_UART_BITRATE,  
609 - .ConnectType = PORT_CONNECT_TYPE_AS_SUB, 628 + T_JZsdk_UartInfo Uart4GInfo = {
  629 + .Base.PortId = UART_4G,
  630 + .DevicePath = COMM_4G_UART_NUM,
  631 + .Baudrate = COMM_4G_UART_BITRATE,
  632 + .Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_SUB,
610 }; 633 };
611 - JZsdk_HalPort_Init(UART_4G, (void*)&SerialInfo3); 634 + JZsdk_HalUartInit(&Uart4GInfo);
  635 +
612 #endif 636 #endif
613 637
614 //子设备连接 638 //子设备连接
@@ -718,21 +742,23 @@ T_JZsdkReturnCode JZ_T40_init_DT(int mode) @@ -718,21 +742,23 @@ T_JZsdkReturnCode JZ_T40_init_DT(int mode)
718 if (mode == APP_UART) 742 if (mode == APP_UART)
719 { 743 {
720 //串口设备1初始化 744 //串口设备1初始化
721 - s_JZ_SerialPortHalRegInfo SerialInfo = {  
722 - .BitRate = UART_DEV1_BITRATE,  
723 - .ConnectType = PORT_CONNECT_TYPE_AS_SUB 745 + T_JZsdk_UartInfo UartInfo = {
  746 + .Base.PortId = UART_DEV_1,
  747 + .DevicePath = UART_DEV1_NUM,
  748 + .Baudrate = UART_DEV1_BITRATE,
  749 + .Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_SUB,
724 }; 750 };
725 -  
726 - JZsdk_HalPort_Init(UART_DEV_1, (void*)&SerialInfo); 751 + JZsdk_HalUartInit(&UartInfo);
727 } 752 }
728 753
729 //串口设备2初始化 754 //串口设备2初始化
730 - s_JZ_SerialPortHalRegInfo SerialInfo2 = {  
731 - .BitRate = UART_DEV2_BITRATE,  
732 - .ConnectType = PORT_CONNECT_TYPE_AS_MAIN, 755 + T_JZsdk_UartInfo Uart2Info = {
  756 + .Base.PortId = UART_DEV_2,
  757 + .DevicePath = UART_DEV2_NUM,
  758 + .Baudrate = UART_DEV2_BITRATE,
  759 + .Base.HalStatus.ConnectType = PORT_CONNECT_TYPE_AS_MAIN,
733 }; 760 };
734 -  
735 - JZsdk_HalPort_Init(UART_DEV_2, (void*)&SerialInfo2); 761 + JZsdk_HalUartInit(&Uart2Info);
736 762
737 //子设备连接 763 //子设备连接
738 JZ_T40_SubDevice_Init(); 764 JZ_T40_SubDevice_Init();
1 -/* ******************************************************************** 1 +/* ********************************************************************
2 * 2 *
3 * 用于确认对应设备的选择 3 * 用于确认对应设备的选择
4 * 4 *
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 #define DEVICE_VERSION JZ_T40S 10 #define DEVICE_VERSION JZ_T40S
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
@@ -23,7 +23,7 @@ @@ -23,7 +23,7 @@
23 #define MODIFY_VERSION_TEN_POSITION 0 23 #define MODIFY_VERSION_TEN_POSITION 0
24 #define MODIFY_VERSION_ONE_POSITION 2 24 #define MODIFY_VERSION_ONE_POSITION 2
25 #define DEBUG_VERSION_TEN_POSITION 2 25 #define DEBUG_VERSION_TEN_POSITION 2
26 -#define DEBUG_VERSION_ONE_POSITION 7 26 +#define DEBUG_VERSION_ONE_POSITION 8
27 27
28 #define FIRMWARE_ORIGIN DOMESTIC_VERSION 28 #define FIRMWARE_ORIGIN DOMESTIC_VERSION
29 29
@@ -199,4 +199,3 @@ @@ -199,4 +199,3 @@
199 199
200 200
201 #endif 201 #endif
202 -  
@@ -91,8 +91,28 @@ static T_JZsdkReturnCode RecvDeal_AskForConnect(int Port, char *getbuf) @@ -91,8 +91,28 @@ static T_JZsdkReturnCode RecvDeal_AskForConnect(int Port, char *getbuf)
91 } 91 }
92 92
93 //5、打开连接状态 93 //5、打开连接状态
94 - s_JZsdk_Hal_Info *HalInfo = JZsdk_Hal_GetHalInfo();  
95 - HalInfo->HalPort[Port].ConnectStatus = JZ_FLAGCODE_ON; 94 +
  95 + // 通过 HAL 句柄安全地修改连接状态
  96 + T_JZsdkHalHandle* handle = JZsdk_Platform_GetHalHandle();
  97 + if (handle == NULL)
  98 + {
  99 + JZSDK_LOG_ERROR("HAL 未初始化");
  100 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  101 + }
  102 +
  103 + handle->lock(handle);
  104 + T_JZsdk_PortBase* halBase = JZsdk_FindPortBase(Port);
  105 + if (halBase != NULL)
  106 + {
  107 + halBase->HalStatus.ConnectStatus = JZ_FLAGCODE_ON;
  108 + }
  109 + else
  110 + {
  111 + handle->unlock(handle);
  112 + JZSDK_LOG_ERROR("端口 %d 未找到", Port);
  113 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  114 + }
  115 + handle->unlock(handle);
96 116
97 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 117 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
98 } 118 }
@@ -101,41 +121,83 @@ static T_JZsdkReturnCode RecvDeal_AskForConnect(int Port, char *getbuf) @@ -101,41 +121,83 @@ static T_JZsdkReturnCode RecvDeal_AskForConnect(int Port, char *getbuf)
101 * 121 *
102 * 心跳帧通知 122 * 心跳帧通知
103 * 123 *
104 -**********/  
105 -static T_JZsdkReturnCode RecvDeal_HeartBeat(int Port, char *getbuf) 124 + **********/
  125 +static T_JZsdkReturnCode RecvDeal_HeartBeat(int Port, char* getbuf)
106 { 126 {
107 - JZSDK_LOG_INFO("%s,recvHBF",JZsdk_DefineCode_GetPortName(Port)); 127 + JZSDK_LOG_INFO("%s, recvHBF", JZsdk_DefineCode_GetPortName(Port));
108 128
109 - //获取帧的序列号  
110 int FrameSequence = JZsdk_Get_FrameSequence(getbuf); 129 int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
  130 + int mode = getbuf[9]; // 假设模式在第9字节
  131 +
  132 + T_JZsdkHalHandle* handle = JZsdk_Platform_GetHalHandle();
  133 + if (handle == NULL)
  134 + {
  135 + JZSDK_LOG_ERROR("HAL 未初始化");
  136 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  137 + }
111 138
112 - //1、获取连接情况  
113 - s_JZsdk_Hal_Info *halInfo = JZsdk_Hal_GetHalInfo(); 139 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
114 140
115 - //分析模式  
116 - int mode = getbuf[9];  
117 if (mode == 0x00) 141 if (mode == 0x00)
118 { 142 {
119 - //2、回复心跳帧  
120 - HalSend_type1Send_Send_HeartBeatStatus(Port, FrameSequence, halInfo->HalPort[Port].ConnectStatus); 143 + int connectStatus = JZ_FLAGCODE_OFF; // 默认值
  144 + handle->lock(handle);
  145 + T_JZsdk_PortBase* portBase = JZsdk_FindPortBase(Port);
  146 +
  147 + if (portBase != NULL)
  148 + {
  149 + connectStatus = portBase->HalStatus.ConnectStatus;
  150 + }
  151 + else {
  152 + JZSDK_LOG_ERROR("端口 %d 未找到", Port);
  153 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  154 + }
  155 +
  156 + handle->unlock(handle);
  157 +
  158 + if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  159 + {
  160 + // 使用复制的 connectStatus 发送心跳状态
  161 + HalSend_type1Send_Send_HeartBeatStatus(Port, FrameSequence, connectStatus);
  162 + }
121 } 163 }
122 else if (mode == 0x01 || mode == 0x02) 164 else if (mode == 0x01 || mode == 0x02)
123 { 165 {
124 - if(mode == 0x01) 166 +
  167 + handle->lock(handle);
  168 + T_JZsdk_PortBase* portBase = JZsdk_FindPortBase(Port);
  169 +
  170 + if (portBase != NULL)
  171 + {
  172 + if (mode == 0x01)
125 { 173 {
126 - halInfo->HalPort[Port].HeartBeatStatusSend = JZ_FLAGCODE_ON; 174 + portBase->HalStatus.HeartBeatStatusSend = JZ_FLAGCODE_ON;
127 } 175 }
128 - else if (mode == 0x02) 176 + else if(mode == 0x02)
129 { 177 {
130 - halInfo->HalPort[Port].HeartBeatStatusSend = JZ_FLAGCODE_OFF; 178 + portBase->HalStatus.HeartBeatStatusSend = JZ_FLAGCODE_OFF;
131 } 179 }
  180 + handle->unlock(handle);
132 181
133 HalSend_type1Send_Reply_Success(Port, FrameSequence); 182 HalSend_type1Send_Reply_Success(Port, FrameSequence);
134 } 183 }
  184 + else
  185 + {
  186 + handle->unlock(handle);
  187 + JZSDK_LOG_ERROR("端口 %d 未找到", Port);
  188 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  189 + }
  190 + }
  191 + else
  192 + {
  193 + JZSDK_LOG_WARN("未知心跳模式: 0x%02x", mode);
  194 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  195 + }
135 196
136 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 197 + return ret;
137 } 198 }
138 199
  200 +
139 /********* 201 /*********
140 * 202 *
141 * 获取所有版本号 203 * 获取所有版本号
@@ -4279,68 +4341,77 @@ static T_JZsdkReturnCode RecvDeal_CheckStatus_WarningLightMode2(int Port, char * @@ -4279,68 +4341,77 @@ static T_JZsdkReturnCode RecvDeal_CheckStatus_WarningLightMode2(int Port, char *
4279 ********* ********| 4341 ********* ********|
4280 ********* ********| 4342 ********* ********|
4281 *********************************************************************************************************/ 4343 *********************************************************************************************************/
4282 -/******************************************************************************************************************************* 4344 +/*********
4283 * 4345 *
4284 - * 设备相关 4346 + * 作为主设备,收到连接回复帧(从设备回复连接)
4285 * 4347 *
4286 - * *******************************************************************************************************************************/  
4287 -static T_JZsdkReturnCode RecvDeal_ObtainConnectFrame(int Port, char *getbuf) 4348 + **********/
  4349 +static T_JZsdkReturnCode RecvDeal_ObtainConnectFrame(int Port, char* getbuf)
4288 { 4350 {
4289 T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 4351 T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
4290 4352
4291 - JZSDK_LOG_INFO("%s,收到连接回复帧",JZsdk_DefineCode_GetPortName(Port)); 4353 + JZSDK_LOG_INFO("%s,收到连接回复帧", JZsdk_DefineCode_GetPortName(Port));
4292 4354
4293 - //获取帧的序列号 4355 + // 获取帧的序列号
4294 int FrameSequence = JZsdk_Get_FrameSequence(getbuf); 4356 int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
4295 4357
4296 - //获取设备id  
4297 - //计算ID长度  
4298 - int FrameLenth = JZsdk_Get_FrameLength(getbuf);  
4299 - int IDLength = FrameLenth - 11; 4358 + // 计算设备ID长度
  4359 + int FrameLength = JZsdk_Get_FrameLength(getbuf);
  4360 + int IDLength = FrameLength - 11; // 假设协议头固定11字节
4300 4361
4301 - //获取ID 4362 + // 解析设备ID(移位累加)
4302 int DeviceID = 0; 4363 int DeviceID = 0;
4303 -  
4304 - //将ID转换为int  
4305 for (int i = 0; i < IDLength; i++) 4364 for (int i = 0; i < IDLength; i++)
4306 { 4365 {
4307 - DeviceID = DeviceID + (getbuf[9 + i] << (8 * (IDLength - i - 1))); 4366 + DeviceID = (DeviceID << 8) | (getbuf[9 + i] & 0xFF);
4308 } 4367 }
4309 4368
4310 JZSDK_LOG_INFO("收到连接回复帧, 设备ID: %d", DeviceID); 4369 JZSDK_LOG_INFO("收到连接回复帧, 设备ID: %d", DeviceID);
4311 4370
4312 - //将ID放入Hal信息  
4313 - s_JZsdk_Hal_Info *halInfo = JZsdk_Hal_GetHalInfo();  
4314 - if (halInfo == NULL) 4371 + // 获取HAL句柄
  4372 + T_JZsdkHalHandle* handle = JZsdk_Platform_GetHalHandle();
  4373 + if (handle == NULL)
  4374 + {
  4375 + JZSDK_LOG_ERROR("HAL 未初始化");
  4376 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  4377 + }
  4378 +
  4379 + handle->lock(handle);
  4380 +
  4381 + // 查找端口基类
  4382 + T_JZsdk_PortBase* portBase = JZsdk_FindPortBase(Port);
  4383 + if (portBase == NULL)
4315 { 4384 {
4316 - JZSDK_LOG_ERROR("获取Hal信息失败"); 4385 + handle->unlock(handle);
  4386 + JZSDK_LOG_ERROR("端口 %d 未找到", Port);
4317 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; 4387 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
4318 } 4388 }
4319 4389
4320 - //遍历ID表  
4321 - for (int i = 0; i < halInfo->HalPort[Port].SubNum ; i++) 4390 + // 检查设备ID是否已存在
  4391 + for (int i = 0; i < portBase->HalStatus.SubNum; i++)
4322 { 4392 {
4323 - if (halInfo->HalPort[Port].SubId[i] == DeviceID) 4393 + if (portBase->HalStatus.SubId[i] == DeviceID)
4324 { 4394 {
4325 - JZSDK_LOG_INFO("已拥有设备ID: %d", DeviceID); 4395 + JZSDK_LOG_INFO("设备ID %d 已存在", DeviceID);
  4396 + handle->unlock(handle);
4326 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 4397 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
4327 } 4398 }
4328 } 4399 }
4329 4400
4330 - //添加ID  
4331 - if (halInfo->HalPort[Port].SubNum >= JZ_MAX_SUB_ID_NUM)  
4332 - {  
4333 - JZSDK_LOG_INFO("设备ID表已满");  
4334 - return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;  
4335 - }  
4336 - else 4401 + // 检查数组是否已满
  4402 + if (portBase->HalStatus.SubNum >= JZ_MAX_SUB_ID_NUM)
4337 { 4403 {
4338 - JZSDK_LOG_INFO("添加设备ID: %d", DeviceID); 4404 + JZSDK_LOG_ERROR("设备ID表已满,无法添加新ID");
  4405 + handle->unlock(handle);
  4406 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
4339 } 4407 }
4340 4408
4341 - halInfo->HalPort[Port].SubId[halInfo->HalPort[Port].SubNum] = DeviceID;  
4342 - halInfo->HalPort[Port].SubNum++; 4409 + // 添加新设备ID
  4410 + portBase->HalStatus.SubId[portBase->HalStatus.SubNum] = DeviceID;
  4411 + portBase->HalStatus.SubNum++;
  4412 + JZSDK_LOG_INFO("添加设备ID 0x%x 成功,当前从设备数量: %d", DeviceID, portBase->HalStatus.SubNum);
4343 4413
  4414 + handle->unlock(handle);
4344 return ret; 4415 return ret;
4345 } 4416 }
4346 4417
@@ -5070,13 +5141,9 @@ static void *UartReinit_thread(void *arg) @@ -5070,13 +5141,9 @@ static void *UartReinit_thread(void *arg)
5070 int *arg_value = (int *)arg; 5141 int *arg_value = (int *)arg;
5071 5142
5072 int Port = arg_value[0]; 5143 int Port = arg_value[0];
  5144 + int BitRate = arg_value[1];
5073 5145
5074 - s_JZ_SerialPortHalRegInfo SerialInfo = {  
5075 - .BitRate = arg_value[1],  
5076 - .ConnectType = PORT_CONNECT_TYPE_AS_SUB  
5077 - };  
5078 -  
5079 - JZsdk_HalPort_ReInit(Port, (void *)&SerialInfo); 5146 + JZsdk_HalUartReInit(Port, BitRate);
5080 5147
5081 JZSDK_LOG_INFO("串口重置完毕"); 5148 JZSDK_LOG_INFO("串口重置完毕");
5082 5149
  1 +#include "JZsdkLib.h"
1 #include <stdio.h> 2 #include <stdio.h>
2 -  
3 -#include "JZsdkLib.h"  
4 -#include "Hal_Recv/HalRecv.h"  
5 -#include "Hal_Send/HalSend.h" 3 +#include <string.h>
  4 +#include <stdlib.h>
  5 +#include <pthread.h>
6 #include "JZsdk_Hal.h" 6 #include "JZsdk_Hal.h"
7 -#include "BaseConfig.h"  
8 7
9 #include "JZsdk_uart/JZsdk_Uart.h" 8 #include "JZsdk_uart/JZsdk_Uart.h"
10 9
11 -static s_JZsdk_Hal_Info *g_HalInfo = NULL; 10 +// 静态全局变量:HAL 信息指针和句柄指针
  11 +static T_JZsdk_HalInfo* g_pHalInfo = NULL;
  12 +static T_JZsdkHalHandle* g_HalHandle = NULL;
  13 +
  14 +// 用于保护初始化的临时锁(仅用于 JZsdk_HalInit 和 JZsdk_HalDeinit)
  15 +static pthread_mutex_t g_initMutex = PTHREAD_MUTEX_INITIALIZER;
  16 +
12 17
13 -s_JZsdk_Hal_Info *JZsdk_Hal_GetHalInfo() 18 +/* 默认锁函数实现(使用 pthread) */
  19 +static T_JZsdkReturnCode default_lock(T_JZsdkHalHandle* handle)
14 { 20 {
15 - return g_HalInfo; 21 + pthread_mutex_lock((pthread_mutex_t*)handle->lockCtx);
  22 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
16 } 23 }
17 24
18 -T_JZsdkReturnCode JZsdk_Hal_Init() 25 +static T_JZsdkReturnCode default_unlock(T_JZsdkHalHandle* handle)
19 { 26 {
20 - T_JZsdkOsalHandler *pOsalHandler = JZsdk_Platform_GetOsalHandler(); 27 + pthread_mutex_unlock((pthread_mutex_t*)handle->lockCtx);
  28 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  29 +}
  30 +
  31 +/***************
  32 +*
  33 +* 查询设备是否被引用
  34 +*
  35 +***********/
  36 +static int JZsdk_Hal_PortIsUsed(int PortId)
  37 +{
  38 + // 检查句柄和数据是否已初始化
  39 + if (g_HalHandle == NULL || g_pHalInfo == NULL)
  40 + {
  41 + JZSDK_LOG_ERROR("HAL 未初始化,请先调用 JZsdk_HalInit");
  42 + return JZ_FLAGCODE_OFF;
  43 + }
21 44
22 - if (g_HalInfo == NULL) 45 + // 加锁
  46 + g_HalHandle->lock(g_HalHandle);
  47 +
  48 + int used = JZ_FLAGCODE_OFF;
  49 + for (int i = 0; i < g_pHalInfo->HaveUsePortNum; i++) {
  50 + if (g_pHalInfo->HaveUsePortId[i] == PortId) {
  51 + used = JZ_FLAGCODE_ON;
  52 + break;
  53 + }
  54 + }
  55 +
  56 + g_HalHandle->unlock(g_HalHandle);
  57 +
  58 + return used;
  59 +}
  60 +
  61 +/***************
  62 +*
  63 +* 获取结构体以获取信息
  64 +*
  65 +***********/
  66 +static T_JZsdkReturnCode JZsdk_Get_HalInfo(T_JZsdk_HalInfo* pHalInfo)
  67 +{
  68 + if (g_HalHandle == NULL || g_pHalInfo == NULL)
  69 + {
  70 + JZSDK_LOG_ERROR("获取hal信息失败:HAL未初始化");
  71 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  72 + }
  73 + if (pHalInfo == NULL)
23 { 74 {
24 - g_HalInfo = pOsalHandler->Malloc(sizeof(s_JZsdk_Hal_Info)); 75 + JZSDK_LOG_ERROR("无效参数:pHalInfo 为空");
  76 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
25 } 77 }
26 78
27 - //将结构体信息清空  
28 - memset(g_HalInfo, 0, sizeof(s_JZsdk_Hal_Info)); 79 + g_HalHandle->lock(g_HalHandle);
  80 + memcpy(pHalInfo, g_pHalInfo, sizeof(T_JZsdk_HalInfo));
  81 + g_HalHandle->unlock(g_HalHandle);
  82 +
  83 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  84 +}
  85 +
  86 +
  87 +
  88 +/**
  89 +*
  90 + * @brief 上层UART端口注册与管理
  91 + * @param pUartInfo 指向UART配置信息的指针
  92 + * @return 成功返回JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS,失败返回相应错误码
  93 + *
  94 + */
  95 +T_JZsdkReturnCode JZsdk_HalUartInit(T_JZsdk_UartInfo* pUartInfo)
  96 +{
  97 + if (pUartInfo == NULL)
  98 + {
  99 + JZSDK_LOG_ERROR("无效参数:pUartInfo 为空");
  100 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  101 + }
29 102
30 - //PSDK系列初始化  
31 - for (int i = DEVICE_PSDK; i < UART_4G; i++) 103 + // 检查句柄和数据是否已初始化
  104 + if (g_HalHandle == NULL || g_pHalInfo == NULL)
32 { 105 {
33 - g_HalInfo->HalPort[i].PortType = PORT_TYPE_PSDK; 106 + JZSDK_LOG_ERROR("HAL 未初始化,请先调用 JZsdk_HalInit");
  107 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
34 } 108 }
35 109
36 - //UART系列初始化  
37 - for (int i = UART_4G; i < USB_DEV_1; i++) 110 + g_HalHandle->lock(g_HalHandle);
  111 +
  112 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  113 +
  114 + // 1. 检查端口ID是否已经存在
  115 + for (int i = 0; i < g_pHalInfo->HaveUsePortNum; i++)
  116 + {
  117 + if (pUartInfo->Base.PortId == g_pHalInfo->HaveUsePortId[i])
38 { 118 {
39 - g_HalInfo->HalPort[i].PortType = PORT_TYPE_UART; 119 + JZSDK_LOG_INFO("端口 0x%x 已经初始化过", pUartInfo->Base.PortId);
  120 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  121 + goto unlock;
  122 + }
40 } 123 }
41 124
42 - //USB系列初始化  
43 - for (int i = USB_DEV_1; i < NET_DEV_1; i++) 125 + // 2. 检查全局端口表是否已满
  126 + if (g_pHalInfo->HaveUsePortNum >= JZ_MAX_PORT_NUM)
44 { 127 {
45 - g_HalInfo->HalPort[i].PortType = PORT_TYPE_USB; 128 + JZSDK_LOG_ERROR("全局端口表已满(最多 %d 个)", JZ_MAX_PORT_NUM);
  129 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  130 + goto unlock;
46 } 131 }
47 132
48 - //网口系列初始化  
49 - for (int i = NET_DEV_1; i < HAL_DATA_TRANSMISSION; i++) 133 + // 3. 检查UART端口数量是否已达上限
  134 + if (g_pHalInfo->UartNum >= JZ_MAX_UART_NUM)
50 { 135 {
51 - g_HalInfo->HalPort[i].PortType = PORT_TYPE_NET; 136 + JZSDK_LOG_ERROR("没有可用的UART槽位(最多 %d 个)", JZ_MAX_UART_NUM);
  137 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  138 + goto unlock;
52 } 139 }
53 140
54 - //特殊数据层  
55 - for (int i = HAL_DATA_TRANSMISSION; i < HAL_MAX; i++) 141 + // 4. 调用底层硬件初始化
  142 + if (JZsdk_UartInit(pUartInfo) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
56 { 143 {
57 - g_HalInfo->HalPort[i].PortType = PORT_TYPE_TRANS_DATA; 144 + JZSDK_LOG_ERROR("UART硬件初始化失败,端口 0x%x", pUartInfo->Base.PortId);
  145 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  146 + goto unlock;
58 } 147 }
59 148
60 - JZSDK_LOG_INFO("JZsdk_Hal_Init Success"); 149 + // 5. 保存UART信息到UART数组(使用UartNum作为索引)
  150 + int uartIndex = g_pHalInfo->UartNum;
  151 + memcpy(&g_pHalInfo->UartInfo[uartIndex], pUartInfo, sizeof(T_JZsdk_UartInfo));
  152 + g_pHalInfo->UartNum++;
61 153
62 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 154 + // 6. 记录端口ID到全局已使用表
  155 + g_pHalInfo->HaveUsePortId[g_pHalInfo->HaveUsePortNum] = pUartInfo->Base.PortId;
  156 + g_pHalInfo->HaveUsePortNum++;
  157 +
  158 + JZSDK_LOG_INFO("UART端口 0x%x 初始化成功", pUartInfo->Base.PortId);
  159 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  160 +
  161 +unlock:
  162 + g_HalHandle->unlock(g_HalHandle);
  163 + return ret;
63 } 164 }
64 165
65 166
66 -/************** 167 +/**
  168 +*
  169 + * uart重初始化的专用指针
67 * 170 *
68 - * jzsdk 获取hal的端口使用标志位  
69 * 171 *
70 - * *********************/  
71 -int JZsdk_HalPort_UseFlag(int PortName) 172 + */
  173 +T_JZsdkReturnCode JZsdk_HalUartReInit(int PortId, int NewBitRate)
72 { 174 {
73 - if(g_HalInfo == NULL) 175 + //获取id信息
  176 + T_JZsdkHalHandle* HalHandle = JZsdk_Platform_GetHalHandle();
  177 + if (HalHandle == NULL)
74 { 178 {
75 - return JZ_FLAGCODE_OFF; 179 + JZSDK_LOG_ERROR("注册错误,hal未初始化");
  180 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
76 } 181 }
77 182
78 - return g_HalInfo->HalPort[PortName].UseFlag;  
79 -} 183 + //检查该id是否已被注册
  184 + if (HalHandle->PortIsUsed(PortId) == JZ_FLAGCODE_OFF)
  185 + {
  186 + JZSDK_LOG_ERROR("当前串口未被初始化");
  187 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  188 + }
80 189
81 -T_JZsdkReturnCode JZsdk_HalPort_SetUseFlag(int PortName,int UseFlag)  
82 -{  
83 - g_HalInfo->HalPort[PortName].UseFlag = UseFlag; 190 + // 获取当前 HAL 信息(需要加锁,但 GetHalInfo 内部已经加锁)
  191 + T_JZsdk_HalInfo halInfo = { 0 };
  192 + T_JZsdkReturnCode ret = HalHandle->GetHalInfo(&halInfo);
  193 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  194 + {
  195 + return ret;
  196 + }
84 197
85 - //将端口添加到已使用端口列表中 或从端口中移除  
86 198
87 - //如果是要添加进列表中  
88 - if (UseFlag == JZ_FLAGCODE_ON) 199 + // 查找对应 UART 信息
  200 + int i = 0;
  201 + for (; i < halInfo.UartNum; i++)
89 { 202 {
90 - //先检查列表中是否已经存在  
91 - for (int i = 0; i < g_HalInfo->HaveUsePortNum; i++)  
92 - {  
93 - if (g_HalInfo->HaveUsePort[i] == PortName)  
94 - {  
95 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 203 + if (halInfo.UartInfo[i].Base.PortId == PortId) {
  204 + break;
96 } 205 }
97 } 206 }
98 -  
99 - //如果不存在,则添加  
100 - g_HalInfo->HaveUsePort[g_HalInfo->HaveUsePortNum] = PortName;  
101 - g_HalInfo->HaveUsePortNum++;  
102 - g_HalInfo->HalPort[PortName].UseFlag = JZ_FLAGCODE_ON; 207 + if (i >= halInfo.UartNum)
  208 + {
  209 + JZSDK_LOG_ERROR("重初始化失败,未检测到串口信息");
  210 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
103 } 211 }
104 212
105 - //如果是要从列表中移除  
106 - else if (UseFlag == JZ_FLAGCODE_OFF)  
107 - {  
108 - //先检查列表中是否已经存在  
109 - for (int i = 0; i < g_HalInfo->HaveUsePortNum; i++)  
110 - {  
111 - if (g_HalInfo->HaveUsePort[i] == PortName) 213 + // 修改波特率
  214 + T_JZsdk_UartInfo uartInfo = halInfo.UartInfo[i];
  215 + uartInfo.Baudrate = NewBitRate;
  216 +
  217 + //重初始化
  218 + if (JZsdk_UartReinit(&uartInfo, PortId) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
112 { 219 {
113 - g_HalInfo->HaveUsePort[i] = g_HalInfo->HaveUsePort[g_HalInfo->HaveUsePortNum - 1];  
114 - g_HalInfo->HaveUsePortNum--;  
115 - g_HalInfo->HalPort[PortName].UseFlag = JZ_FLAGCODE_OFF;  
116 - g_HalInfo->HalPort[PortName].ConnectStatus = JZ_FLAGCODE_OFF;  
117 - g_HalInfo->HalPort[PortName].HeartBeatStatusSend = JZ_FLAGCODE_OFF; 220 + JZSDK_LOG_ERROR("串口重初始化失败");
118 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 221 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
119 } 222 }
  223 +
  224 + // 更新全局信息(需要加锁)
  225 + HalHandle->lock(HalHandle);
  226 + // 再次查找(可能期间发生变化),确保索引有效
  227 + int j = 0;
  228 + for (; j < g_pHalInfo->UartNum; j++)
  229 + {
  230 + if (g_pHalInfo->UartInfo[j].Base.PortId == PortId) {
  231 + memcpy(&g_pHalInfo->UartInfo[j], &uartInfo, sizeof(T_JZsdk_UartInfo));
  232 + break;
  233 + }
120 } 234 }
121 235
122 - //如果本来就不存在,则直接返回  
123 - JZSDK_LOG_INFO("hal口:%s,本来就未使用,无需移除", JZsdk_DefineCode_GetPortName(PortName));  
124 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 236 + HalHandle->unlock(HalHandle);
  237 +
  238 + if (j >= g_pHalInfo->UartNum) {
  239 + JZSDK_LOG_ERROR("更新失败,端口在查找过程中被移除");
  240 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
125 } 241 }
126 242
  243 + JZSDK_LOG_INFO("UART端口 0x%x 重初始化成功", PortId);
127 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 244 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
128 } 245 }
129 246
130 -//用于给初始化函数调用  
131 -static T_JZsdkReturnCode JZsdK_HalPort_Init_Info(int PortName, int UseFlag  
132 - , int ConnectStatus, int HeartBeatStatusSend, int PortType, int ConnectType)  
133 -{  
134 - g_HalInfo->HalPort[PortName].UseFlag = UseFlag;  
135 - g_HalInfo->HalPort[PortName].ConnectStatus = ConnectStatus;  
136 - g_HalInfo->HalPort[PortName].HeartBeatStatusSend = HeartBeatStatusSend;  
137 - g_HalInfo->HalPort[PortName].PortType = PortType;  
138 - g_HalInfo->HalPort[PortName].ConnectType = ConnectType;  
139 247
140 - //记录端口  
141 - JZsdk_HalPort_SetUseFlag(PortName, JZ_FLAGCODE_ON);  
142 248
143 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
144 -}  
145 249
146 -/**********************  
147 - *  
148 - * hal端口 初始化函数  
149 - * psdk初始化 value为NULL  
150 - * uart初始化 value[0]为波特率  
151 - *  
152 - * ******************/  
153 -T_JZsdkReturnCode JZsdk_HalPort_Init(int PortName, void *Value) 250 +
  251 +T_JZsdkReturnCode JZsdk_HalDirectDataInit(T_JZsdk_DirectDataInfo* pDirectDataInfo)
154 { 252 {
155 - T_JZsdkReturnCode ret; 253 + if (pDirectDataInfo == NULL)
  254 + {
  255 + JZSDK_LOG_ERROR("无效参数:pDirectDataInfo 为空");
  256 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  257 + }
156 258
157 - //psdk初始化  
158 - if (PortName >= DEVICE_PSDK && PortName < UART_4G) 259 + if (g_HalHandle == NULL || g_pHalInfo == NULL)
159 { 260 {
160 - JZsdK_HalPort_Init_Info(PortName,  
161 - JZ_FLAGCODE_ON,  
162 - JZ_FLAGCODE_OFF,  
163 - JZ_FLAGCODE_OFF,  
164 - PORT_TYPE_PSDK,  
165 - PORT_CONNECT_TYPE_AS_SUB); 261 + JZSDK_LOG_ERROR("HAL 未初始化,请先调用 JZsdk_HalInit");
  262 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  263 + }
166 264
167 - JZSDK_LOG_INFO("hal%s 初始化",JZsdk_DefineCode_GetPortName(PortName)); 265 + g_HalHandle->lock(g_HalHandle);
168 266
169 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 267 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  268 +
  269 + // 1. 检查端口ID是否已经存在
  270 + for (int i = 0; i < g_pHalInfo->HaveUsePortNum; i++)
  271 + {
  272 + if (pDirectDataInfo->Base.PortId == g_pHalInfo->HaveUsePortId[i])
  273 + {
  274 + JZSDK_LOG_INFO("端口 0x%x 已经初始化过", pDirectDataInfo->Base.PortId);
  275 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  276 + goto unlock;
  277 + }
170 } 278 }
171 279
172 - //uart初始化  
173 - if (PortName >= UART_4G && PortName < USB_DEV_1) 280 + // 2. 检查全局端口表是否已满
  281 + if (g_pHalInfo->HaveUsePortNum >= JZ_MAX_PORT_NUM)
174 { 282 {
175 - JZSDK_LOG_INFO("hal%s 初始化",JZsdk_DefineCode_GetPortName(PortName)); 283 + JZSDK_LOG_ERROR("全局端口表已满(最多 %d 个)", JZ_MAX_PORT_NUM);
  284 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  285 + goto unlock;
  286 + }
176 287
177 - if (Value == NULL) 288 + // 3. 检查UART端口数量是否已达上限
  289 + if (g_pHalInfo->DirectNum >= JZ_MAX_DIRECT_NUM)
178 { 290 {
179 - JZSDK_LOG_ERROR("hal%s 初始化失败,Value为NULL",JZsdk_DefineCode_GetPortName(PortName));  
180 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 291 + JZSDK_LOG_ERROR("没有可用的DIRECT槽位(最多 %d 个)", JZ_MAX_DIRECT_NUM);
  292 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  293 + goto unlock;
181 } 294 }
182 295
183 - s_JZ_SerialPortHalRegInfo *PortInfo = (s_JZ_SerialPortHalRegInfo *)Value; 296 + // 4 初始化直通
  297 + //(只是把id打开)
184 298
185 - int BitRate = PortInfo->BitRate;  
186 - int ConnectType = PortInfo->ConnectType; 299 + // 5. 保存UART信息到UART数组(使用UartNum作为索引)
  300 + int Index = g_pHalInfo->DirectNum;
  301 + memcpy(&g_pHalInfo->DirectDataInfo[Index], pDirectDataInfo, sizeof(T_JZsdk_UartInfo));
  302 + g_pHalInfo->UartNum++;
187 303
188 - ret = JZsdk_Uart_ReInit(PortName, BitRate);  
189 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
190 - {  
191 - JZSDK_LOG_ERROR("hal%s 初始化失败",JZsdk_DefineCode_GetPortName(PortName)); 304 + // 6. 记录端口ID到全局已使用表
  305 + g_pHalInfo->HaveUsePortId[g_pHalInfo->HaveUsePortNum] = g_pHalInfo->DirectDataInfo->Base.PortId;
  306 + g_pHalInfo->HaveUsePortNum++;
  307 +
  308 + JZSDK_LOG_INFO("DIRECT端口 0x%x 初始化成功", pDirectDataInfo->Base.PortId);
  309 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  310 +
  311 +unlock:
  312 + g_HalHandle->unlock(g_HalHandle);
192 return ret; 313 return ret;
  314 +}
  315 +
  316 +
  317 +
  318 +
  319 +
  320 +
  321 +
  322 +
  323 +
  324 +
  325 +
  326 +
  327 +
  328 +
  329 +
  330 +
  331 +
  332 +
  333 +
  334 +
  335 +
  336 +
  337 +
  338 +
  339 +
  340 +//hal的基类指针,用于快速修改或者找到某个数据
  341 +T_JZsdk_PortBase* JZsdk_FindPortBase(int PortId)
  342 +{
  343 + if (g_pHalInfo == NULL) return NULL;
  344 +
  345 + // 遍历 UART
  346 + for (int i = 0; i < g_pHalInfo->UartNum; i++) {
  347 + if (g_pHalInfo->UartInfo[i].Base.PortId == PortId) {
  348 + return &g_pHalInfo->UartInfo[i].Base;
  349 + }
  350 + }
  351 + // 遍历 USB
  352 + for (int i = 0; i < g_pHalInfo->UsbNum; i++) {
  353 + if (g_pHalInfo->UsbInfo[i].Base.PortId == PortId) {
  354 + return &g_pHalInfo->UsbInfo[i].Base;
  355 + }
  356 + }
  357 + // 遍历 NET
  358 + for (int i = 0; i < g_pHalInfo->NetNum; i++) {
  359 + if (g_pHalInfo->NetInfo[i].Base.PortId == PortId) {
  360 + return &g_pHalInfo->NetInfo[i].Base;
193 } 361 }
  362 + }
  363 + // 遍历 DIRECT
  364 + for (int i = 0; i < g_pHalInfo->DirectNum; i++) {
  365 + if (g_pHalInfo->DirectDataInfo[i].Base.PortId == PortId) {
  366 + return &g_pHalInfo->DirectDataInfo[i].Base;
  367 + }
  368 + }
  369 + return NULL;
  370 +}
194 371
195 - JZsdK_HalPort_Init_Info(PortName, JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF, PORT_TYPE_UART, ConnectType);  
196 372
  373 +T_JZsdkHalHandle* JZsdk_Platform_GetHalHandle(void)
  374 +{
  375 + return g_HalHandle; // 返回已注册的 OSAL 处理器
  376 +}
  377 +
  378 +
  379 +
  380 +/**
  381 + * HAL 初始化(动态分配内存)
  382 + */
  383 +T_JZsdkReturnCode JZsdk_HalInit(void)
  384 +{
  385 + // 使用单独的初始化锁保护
  386 + pthread_mutex_lock(&g_initMutex);
  387 +
  388 + if (g_pHalInfo != NULL || g_HalHandle != NULL)
  389 + {
  390 + JZSDK_LOG_WARN("HAL 已经初始化过");
  391 + pthread_mutex_unlock(&g_initMutex);
197 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 392 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
198 } 393 }
199 394
200 - //usb初始化  
201 - if (PortName >= USB_DEV_1 && PortName < NET_DEV_1) 395 + // 1. 分配 HAL 信息内存
  396 + T_JZsdk_HalInfo* halInfo = (T_JZsdk_HalInfo*)malloc(sizeof(T_JZsdk_HalInfo));
  397 + if (halInfo == NULL)
202 { 398 {
203 - //还没做 399 + JZSDK_LOG_ERROR("分配 HAL 信息内存失败");
  400 + pthread_mutex_unlock(&g_initMutex);
  401 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
204 } 402 }
  403 + memset(halInfo, 0, sizeof(T_JZsdk_HalInfo));
205 404
206 - //net初始化  
207 - if (PortName >= NET_DEV_1 && PortName < HAL_DATA_TRANSMISSION) 405 + // 2. 分配句柄内存
  406 + T_JZsdkHalHandle* handle = (T_JZsdkHalHandle*)malloc(sizeof(T_JZsdkHalHandle));
  407 + if (handle == NULL)
208 { 408 {
209 - //还没做 409 + JZSDK_LOG_ERROR("分配 HAL 句柄内存失败");
  410 + free(halInfo);
  411 + pthread_mutex_unlock(&g_initMutex);
  412 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
210 } 413 }
211 414
212 - //数据传输初始化  
213 - if (PortName == HAL_DATA_TRANSMISSION) 415 + // 3. 分配锁对象(使用 pthread_mutex_t)
  416 + pthread_mutex_t* mutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
  417 + if (mutex == NULL)
214 { 418 {
215 - JZsdK_HalPort_Init_Info(PortName, JZ_FLAGCODE_ON, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF, PORT_TYPE_TRANS_DATA, PORT_CONNECT_TYPE_AS_SUB); 419 + JZSDK_LOG_ERROR("分配锁内存失败");
  420 + free(handle);
  421 + free(halInfo);
  422 + pthread_mutex_unlock(&g_initMutex);
  423 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  424 + }
  425 + pthread_mutex_init(mutex, NULL);
216 426
217 - JZSDK_LOG_INFO("hal%s 初始化",JZsdk_DefineCode_GetPortName(PortName)); 427 + // 4. 填充句柄
  428 + handle->lockCtx = mutex;
  429 + handle->lock = default_lock;
  430 + handle->unlock = default_unlock;
  431 + handle->PortIsUsed = JZsdk_Hal_PortIsUsed;
  432 + handle->GetHalInfo = JZsdk_Get_HalInfo;
  433 +
  434 + // 5. 赋值给全局变量
  435 + g_pHalInfo = halInfo;
  436 + g_HalHandle = handle;
  437 +
  438 + pthread_mutex_unlock(&g_initMutex);
  439 +
  440 + JZSDK_LOG_INFO("JZSDK HAL INIT SUCCESS");
  441 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  442 +}
  443 +
  444 +/**
  445 + * HAL 去初始化(释放内存)
  446 + */
  447 +T_JZsdkReturnCode JZsdk_HalDeinit(void)
  448 +{
  449 + pthread_mutex_lock(&g_initMutex);
  450 +
  451 + if (g_HalHandle != NULL) {
  452 + // 销毁锁
  453 + pthread_mutex_t* mutex = (pthread_mutex_t*)g_HalHandle->lockCtx;
  454 + if (mutex) {
  455 + pthread_mutex_destroy(mutex);
  456 + free(mutex);
  457 + }
  458 + free(g_HalHandle);
  459 + g_HalHandle = NULL;
  460 + }
  461 + if (g_pHalInfo != NULL) {
  462 + free(g_pHalInfo);
  463 + g_pHalInfo = NULL;
218 } 464 }
219 465
  466 + pthread_mutex_unlock(&g_initMutex);
  467 + JZSDK_LOG_INFO("JZSDK HAL 去初始化成功");
220 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 468 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
221 } 469 }
222 470
223 471
224 -/************************ 472 +
  473 +
  474 +
  475 +
  476 +
  477 +
  478 +
  479 +
  480 +
  481 +
  482 +
  483 +
  484 +
  485 +//temp
  486 +/**************
225 * 487 *
226 - * HalRort Reinit  
227 - * 专门用于已经初始化完毕端口  
228 - * 与init的区别是, Reinit 是要调用多线程来重初始化的 488 + * jzsdk 获取hal的端口使用标志位
229 * 489 *
230 - * ***************************/  
231 -T_JZsdkReturnCode JZsdk_HalPort_ReInit(int PortName, void *Value) 490 + * *********************/
  491 +int JZsdk_HalPort_UseFlag(int PortName)
232 { 492 {
233 - return JZsdk_HalPort_Init(PortName, Value); 493 + for (int i = 0; i < g_pHalInfo->HaveUsePortNum; i++)
  494 + {
  495 + if (g_pHalInfo->HaveUsePortId[i] == PortName)
  496 + {
  497 + return JZ_FLAGCODE_ON;
  498 + }
  499 + }
  500 +
  501 + return JZ_FLAGCODE_OFF;
234 } 502 }
1 -/** 1 +/**
2 ******************************************************************** 2 ********************************************************************
3 * @file JZsdk_Hal.h 3 * @file JZsdk_Hal.h
4 * JZsdk_Hal.c 的头文件 4 * JZsdk_Hal.c 的头文件
@@ -26,6 +26,11 @@ extern "C" { @@ -26,6 +26,11 @@ extern "C" {
26 /* 常亮定义*/ 26 /* 常亮定义*/
27 27
28 #define JZ_MAX_SUB_ID_NUM 10 28 #define JZ_MAX_SUB_ID_NUM 10
  29 +#define JZ_MAX_PORT_NUM 64
  30 +#define JZ_MAX_UART_NUM 8
  31 +#define JZ_MAX_USB_NUM 4
  32 +#define JZ_MAX_NET_NUM 4
  33 +#define JZ_MAX_DIRECT_NUM 1
29 34
30 typedef enum E_HAL_PORT_TYPE 35 typedef enum E_HAL_PORT_TYPE
31 { 36 {
@@ -47,59 +52,118 @@ typedef enum E_HAL_CONNECT_TYPE @@ -47,59 +52,118 @@ typedef enum E_HAL_CONNECT_TYPE
47 52
48 /****************** 53 /******************
49 * 54 *
50 - * hal使用状态 55 + * 端口使用状态
51 * 56 *
52 * ********/ 57 * ********/
53 -typedef struct s_JZ_SerialPortHalRegInfo 58 +typedef struct T_JZsdk_HalStatus
54 { 59 {
55 - int BitRate; //波特率  
56 - E_HAL_CONNECT_TYPE ConnectType; //连接类型  
57 -}s_JZ_SerialPortHalRegInfo; 60 + int PortType; // hal的端口类型
  61 + int ConnectType; // 主副设备类型
58 62
  63 + // 作为主设备专有
  64 + int SubId[JZ_MAX_SUB_ID_NUM]; // 副设备ID
  65 + int SubNum; // 副设备数量
59 66
60 -/******************  
61 - *  
62 - * hal使用状态  
63 - *  
64 - *  
65 - *  
66 - * ********/  
67 -typedef struct s_JZsdk_HalStatus 67 + // 作为副设备专有
  68 + int HeartBeatStatusSend; // 对主设备发送心跳帧的发送开关
  69 + int ConnectStatus; // 连接状态,接收过连接帧后打开
  70 +
  71 +}T_JZsdk_HalStatus;
  72 +
  73 +typedef struct {
  74 + T_JZsdk_HalStatus HalStatus;
  75 + int PortId;
  76 +}T_JZsdk_PortBase;
  77 +
  78 +typedef struct T_JZsdk_UartInfo
  79 +{
  80 + T_JZsdk_PortBase Base;
  81 +
  82 + // 独有参数
  83 + char DevicePath[64]; // 设备路径
  84 + int Baudrate; // 波特率
  85 + int UartId; // uart编号
  86 +}T_JZsdk_UartInfo;
  87 +
  88 +typedef struct T_JZsdk_UsbInfo
  89 +{
  90 + T_JZsdk_PortBase Base;
  91 +
  92 + // 独有参数
  93 + char DevicePath[64]; // 设备路径
  94 +
  95 +}T_JZsdk_UsbInfo;
  96 +
  97 +typedef struct T_JZsdk_NetInfo
68 { 98 {
69 - int UseFlag; //hal使用标志位 //初始化时开关关闭  
70 - int PortType; //hal的端口类型  
71 - int ConnectType;//主副设备类型 99 + T_JZsdk_PortBase Base;
  100 +
  101 + // 独有参数
  102 + char DevicePath[64]; // 设备路径
72 103
73 -//作为主设备专有  
74 - int SubId[JZ_MAX_SUB_ID_NUM]; //副设备ID  
75 - int SubNum; //副设备数量 104 +} T_JZsdk_NetInfo;
76 105
77 -//作为副设备专有  
78 - int HeartBeatStatusSend; //对主设备发送心跳帧的发送开关  
79 - int ConnectStatus; //连接状态,接收过连接帧后打开 106 +typedef struct T_JZsdk_DirectDataInfo
  107 +{
  108 + T_JZsdk_PortBase Base;
80 109
81 -}s_JZsdk_HalStatus; 110 +}T_JZsdk_DirectDataInfo;
82 111
83 -typedef struct s_JZsdk_Hal_Info 112 +typedef struct T_JZsdk_HalInfo
84 { 113 {
85 - s_JZsdk_HalStatus HalPort[0x50]; //记录hal使用的端口状态  
86 - int HaveUsePort[0x50]; //记录已经使用的端口  
87 - int HaveUsePortNum; //记录已经使用的端口数量 114 + // uart信息
  115 + T_JZsdk_UartInfo UartInfo[JZ_MAX_UART_NUM];
  116 + int UartNum;
  117 +
  118 + // usb信息
  119 + T_JZsdk_UsbInfo UsbInfo[JZ_MAX_USB_NUM];
  120 + int UsbNum;
88 121
89 -}s_JZsdk_Hal_Info; 122 + // 网口信息
  123 + T_JZsdk_NetInfo NetInfo[JZ_MAX_NET_NUM];
  124 + int NetNum;
  125 +
  126 + // 直通数据类型接口
  127 + T_JZsdk_DirectDataInfo DirectDataInfo[JZ_MAX_DIRECT_NUM];
  128 + int DirectNum;
  129 +
  130 + int HaveUsePortId[JZ_MAX_PORT_NUM]; // 记录已经使用的端口ID
  131 + //T_JZsdk_PortBase* PortPtrs[JZ_MAX_PORT_NUM]; // 与 HaveUsePortId 一一对应,存储端口基类指针
  132 + //ps : 基类指针的方法如果后期效率不够了再该用,前期遍历可能更安全一点
  133 + int HaveUsePortNum; // 记录已经使用的端口数量
  134 +} T_JZsdk_HalInfo;
  135 +
  136 +//前向声明
  137 +typedef struct T_JZsdkHalHandle T_JZsdkHalHandle;
  138 +
  139 +typedef struct T_JZsdkHalHandle
  140 +{
  141 + void* lockCtx; // 锁上下文(指向具体的锁对象)
  142 + T_JZsdkReturnCode(*lock)(T_JZsdkHalHandle* handle);
  143 + T_JZsdkReturnCode(*unlock)(T_JZsdkHalHandle* handle);
  144 +
  145 + int (*PortIsUsed)(int PortId);
  146 +
  147 + T_JZsdkReturnCode(*GetHalInfo)(T_JZsdk_HalInfo* HalInfo);
  148 +}T_JZsdkHalHandle;
90 149
91 /* Exported types ------------------------------------------------------------*/ 150 /* Exported types ------------------------------------------------------------*/
92 151
93 /* Exported functions --------------------------------------------------------*/ 152 /* Exported functions --------------------------------------------------------*/
94 -int JZsdk_HalPort_UseFlag(int PortName);  
95 -T_JZsdkReturnCode JZsdk_HalPort_SetUseFlag(int PortName,int UseFlag); 153 +T_JZsdkReturnCode JZsdk_HalInit(void);
  154 +T_JZsdkReturnCode JZsdk_HalDeinit(void);
96 155
97 -T_JZsdkReturnCode JZsdk_HalPort_Init(int PortName, void *Value);  
98 -T_JZsdkReturnCode JZsdk_HalPort_ReInit(int PortName, void *Value); 156 +T_JZsdkHalHandle* JZsdk_Platform_GetHalHandle(void);
  157 +T_JZsdk_PortBase* JZsdk_FindPortBase(int PortId);
99 158
100 -T_JZsdkReturnCode JZsdk_Hal_Init();  
101 159
102 -s_JZsdk_Hal_Info *JZsdk_Hal_GetHalInfo(); 160 +//后期优化进 handle
  161 +T_JZsdkReturnCode JZsdk_HalUartInit(T_JZsdk_UartInfo* pUartInfo);
  162 +T_JZsdkReturnCode JZsdk_HalUartReInit(int PortId, int NewBitRate);
  163 +T_JZsdkReturnCode JZsdk_HalDirectDataInit(T_JZsdk_DirectDataInfo* pDirectDataInfo);
  164 +
  165 +int JZsdk_HalPort_UseFlag(int PortName);
  166 +
103 167
104 #ifdef __cplusplus 168 #ifdef __cplusplus
105 } 169 }
1 -#include <stdio.h> 1 +#include <stdio.h>
2 #include <string.h> 2 #include <string.h>
3 #include <stdlib.h> 3 #include <stdlib.h>
4 4
@@ -11,29 +11,8 @@ @@ -11,29 +11,8 @@
11 #include "BaseConfig.h" 11 #include "BaseConfig.h"
12 12
13 #include "JZsdk_uart/JZsdk_Uart_UartDeal.h" 13 #include "JZsdk_uart/JZsdk_Uart_UartDeal.h"
14 -#include "JZsdk_Hal.h"  
15 -  
16 -static unsigned char *Get_UartDevPath(int UartDev)  
17 -{  
18 - switch (UartDev)  
19 - {  
20 - case UART_4G:  
21 - return COMM_4G_UART_NUM;  
22 - break;  
23 -  
24 - case UART_DEV_1:  
25 - return UART_DEV1_NUM;  
26 - break;  
27 -  
28 - case UART_DEV_2:  
29 - return UART_DEV2_NUM;  
30 - break;  
31 -  
32 - default:  
33 - return NULL;  
34 - break;  
35 - }  
36 -} 14 +#include "JZsdk_Uart.h"
  15 +#include "../JZsdk_Hal.h"
37 16
38 /******************** 17 /********************
39 * 18 *
@@ -130,41 +109,36 @@ T_JZsdkReturnCode JZsdk_Uart_UartEnabled(unsigned char *UartDev, unsigned int Bi @@ -130,41 +109,36 @@ T_JZsdkReturnCode JZsdk_Uart_UartEnabled(unsigned char *UartDev, unsigned int Bi
130 109
131 110
132 111
133 -/****************  
134 - *  
135 - * 串口重初始化  
136 - * 该函数仅能被JZsdk_HalPort_Init调用,请勿直接使用  
137 - *  
138 - * ************************/  
139 -T_JZsdkReturnCode JZsdk_Uart_ReInit(int UART_DEV_NAME, int BitRate)  
140 -{  
141 - T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
142 - int UartFd = 0;  
143 112
144 - //JZSDK_LOG_INFO("初始化串口 0x%x", UART_DEV_NAME);  
145 -  
146 - //检查是否已经初始化  
147 - if(JZsdk_HalPort_UseFlag(UART_DEV_NAME) == JZ_FLAGCODE_ON)  
148 - {  
149 - //先注释掉原来的串口  
150 - JZsdk_HalPort_SetUseFlag(UART_DEV_NAME, JZ_FLAGCODE_OFF);  
151 113
  114 +/*
  115 +* 串口重初始化,比较特殊,该函数仅能用于已经被初始化的串口
  116 +* 注意, 外部初始化串口应该用hal uart reinit
  117 +*/
  118 +T_JZsdkReturnCode JZsdk_UartReinit(T_JZsdk_UartInfo* pUartInf, int PortId)
  119 +{
152 //然后关闭串口 注:该函数有延时 120 //然后关闭串口 注:该函数有延时
153 - JZsdk_Uart_CloseUartThead(UART_DEV_NAME);  
154 - } 121 + JZsdk_Uart_CloseUartThead(PortId);
  122 +
  123 + return JZsdk_UartInit(pUartInf);
  124 +}
  125 +
  126 +//该函数仅被hal.c引用,注意, 外部初始化串口应该用haluartinit
  127 +T_JZsdkReturnCode JZsdk_UartInit(T_JZsdk_UartInfo* pUartInfo)
  128 +{
  129 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
155 130
156 - //2、串口初始化  
157 - ret = JZsdk_Uart_UartEnabled(Get_UartDevPath(UART_DEV_NAME), BitRate, &UartFd); 131 + //串口初始化
  132 + ret = JZsdk_Uart_UartEnabled(pUartInfo->DevicePath, pUartInfo->Baudrate, &pUartInfo->UartId);
158 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 133 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
159 { 134 {
160 return ret; 135 return ret;
161 } 136 }
162 137
163 - //3、串口接收初始化  
164 - JZsdk_Uart_UartDeal_Receive(UartFd, UART_DEV_NAME); 138 + //串口接收初始化
  139 + JZsdk_Uart_UartDeal_Receive(pUartInfo->UartId, pUartInfo->Base.PortId);
165 140
166 - JZSDK_LOG_INFO("init %s sucess", JZsdk_DefineCode_GetPortName(UART_DEV_NAME)); 141 + JZSDK_LOG_INFO("init %s sucess", JZsdk_DefineCode_GetPortName(pUartInfo->Base.PortId));
167 142
168 - return ret; 143 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
169 } 144 }
170 -  
1 -/** 1 +/**
2 ******************************************************************** 2 ********************************************************************
3 * @file JZsdk_Uart.h 3 * @file JZsdk_Uart.h
4 * JZsdk_Uart.c 的头文件 4 * JZsdk_Uart.c 的头文件
@@ -7,11 +7,12 @@ @@ -7,11 +7,12 @@
7 */ 7 */
8 8
9 /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/ 9 /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
10 -#ifndef JZSDK_UART_H  
11 -#define JZSDK_UART_H 10 +#ifndef JZSDK_UART_2_H
  11 +#define JZSDK_UART_2_H
12 12
13 /* Includes ------------------------------------------------------------------*/ 13 /* Includes ------------------------------------------------------------------*/
14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h" 14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  15 +#include "../JZsdk_Hal.h"
15 16
16 #ifdef __cplusplus 17 #ifdef __cplusplus
17 extern "C" { 18 extern "C" {
@@ -24,8 +25,8 @@ extern "C" { @@ -24,8 +25,8 @@ extern "C" {
24 /* Exported types ------------------------------------------------------------*/ 25 /* Exported types ------------------------------------------------------------*/
25 26
26 /* Exported functions --------------------------------------------------------*/ 27 /* Exported functions --------------------------------------------------------*/
27 -T_JZsdkReturnCode JZsdk_Uart_ReInit(int UART_DEV_NAME, int BitRate);  
28 -T_JZsdkReturnCode JZsdk_Uart_UartEnabled(unsigned char *UartDev, unsigned int BitRate, int *UartFd); 28 +T_JZsdkReturnCode JZsdk_UartReinit(T_JZsdk_UartInfo* pUartInf, int PortId);
  29 +T_JZsdkReturnCode JZsdk_UartInit(T_JZsdk_UartInfo* pUartInfo);
29 30
30 #ifdef __cplusplus 31 #ifdef __cplusplus
31 } 32 }
1 -#include <stdio.h> 1 +#include <stdio.h>
2 #include <pthread.h> 2 #include <pthread.h>
3 3
4 #include "JZsdkLib.h" 4 #include "JZsdkLib.h"
5 #include "JZsdk_Hal.h" 5 #include "JZsdk_Hal.h"
6 #include "Hal_Send/HalSend_type1/HalSend_type1.h" 6 #include "Hal_Send/HalSend_type1/HalSend_type1.h"
7 7
8 -T_JZsdkReturnCode HeartBeat_HalCheck() 8 +T_JZsdkReturnCode HeartBeat_HalCheck(void)
9 { 9 {
10 - s_JZsdk_Hal_Info *HalInfo = JZsdk_Hal_GetHalInfo(); 10 + T_JZsdkHalHandle* handle = JZsdk_Platform_GetHalHandle();
  11 + if (handle == NULL)
  12 + {
  13 + JZSDK_LOG_ERROR("HAL未初始化");
  14 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  15 + }
  16 +
  17 + T_JZsdk_HalInfo HalInfo = { 0 };
  18 + handle->GetHalInfo(&HalInfo);
  19 +
  20 + // 加锁保护共享数据
  21 + handle->lock(handle);
11 22
12 - //1、获取心跳帧的开启情况 发送心跳帧  
13 - for (int i = 0; i < HalInfo->HaveUsePortNum; i++) 23 + // 遍历所有已使用的端口
  24 + for (int i = 0; i < HalInfo.HaveUsePortNum; i++)
14 { 25 {
15 - if (HalInfo->HalPort[HalInfo->HaveUsePort[i]].HeartBeatStatusSend == JZ_FLAGCODE_ON) 26 + int portId = HalInfo.HaveUsePortId[i];
  27 + T_JZsdk_PortBase* portBase = JZsdk_FindPortBase(portId);
  28 + if (portBase == NULL)
16 { 29 {
17 - HalSend_type1Send_HeartBeatStatus(HalInfo->HaveUsePort[i], 0x00, HalInfo->HalPort[HalInfo->HaveUsePort[i]].ConnectStatus); 30 + JZSDK_LOG_WARN("端口 %d 在已使用列表中但未找到对应结构", portId);
  31 + continue;
  32 + }
  33 +
  34 + // 如果心跳发送开关开启,则发送心跳状态
  35 + if (portBase->HalStatus.HeartBeatStatusSend == JZ_FLAGCODE_ON)
  36 + {
  37 + // 发送心跳状态,第二个参数为序列号,此处沿用原代码的0x00
  38 + HalSend_type1Send_HeartBeatStatus(portId, 0x00, portBase->HalStatus.ConnectStatus);
18 } 39 }
19 } 40 }
20 41
  42 + handle->unlock(handle);
  43 +
  44 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
21 } 45 }
22 46
23 static void *HeartBeatTask(void *arg) 47 static void *HeartBeatTask(void *arg)
@@ -173,7 +173,7 @@ T_JZsdkReturnCode Gimbal_Set_PitchAngle(int angle) @@ -173,7 +173,7 @@ T_JZsdkReturnCode Gimbal_Set_PitchAngle(int angle)
173 //独立模式 173 //独立模式
174 case JZ_MODULE_CONTROL_WAY_INDEPENDENT: 174 case JZ_MODULE_CONTROL_WAY_INDEPENDENT:
175 { 175 {
176 - if (angle < g_GimbalInfo.PitchLimitMin || angle > g_GimbalInfo.PitchLimitMax || (g_GimbalInfo.PitchLimitMin == g_GimbalInfo.PitchLimitMax)) 176 + if ( (angle < g_GimbalInfo.PitchLimitMin) || (angle > g_GimbalInfo.PitchLimitMax) || (g_GimbalInfo.PitchLimitMin == g_GimbalInfo.PitchLimitMax))
177 { 177 {
178 printf("云台俯仰输入值范围出错:%d\n", angle); 178 printf("云台俯仰输入值范围出错:%d\n", angle);
179 return JZ_ERRORCODE_GIMBAL_INVALID_PITCH; 179 return JZ_ERRORCODE_GIMBAL_INVALID_PITCH;
1 # cmake 最低版本要求 第三行名字不能动 1 # cmake 最低版本要求 第三行名字不能动
2 cmake_minimum_required(VERSION 2.8) 2 cmake_minimum_required(VERSION 2.8)
3 -project(JZ_T40S) 3 +project(JZ_H150A)
4 4
5 #set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++") 5 #set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++")
6 #"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。 6 #"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。
@@ -62,6 +62,12 @@ extern "C" { @@ -62,6 +62,12 @@ extern "C" {
62 #define USER_DEVELOPER_ACCOUNT "jizhisdk@163.com" 62 #define USER_DEVELOPER_ACCOUNT "jizhisdk@163.com"
63 #define USER_BAUD_RATE "921600" 63 #define USER_BAUD_RATE "921600"
64 64
  65 + //#define USER_APP_NAME "H150A"
  66 + //#define USER_APP_ID "180445"
  67 + //#define USER_APP_KEY "0164ed60d70b438c5ff26fde60c6609"
  68 + //#define USER_APP_LICENSE "rlyth08igUpD/ell+FOLoQJYI12b8IjnaylClO6T4n7sGopwUQ29aEXPaEK7HylrZBXbpYCpdZGbtjOj22G38FgEYOiVJqeFEzeZwJorDZzNt3X+i26h2pHvEMG9d+p3UnW8AGqowKAvOPOD8VW6jquj4iMkLrUP4NLrijWR9uMET1TenZY4MFSK+F5/Hl3+J8DFF8Uagj1q4UBaoUH/noZOiIspJB/s5mmYJAcqMwEMkv8YeE4gN8HLh8kDGFpmMXD2cy5UoQnZJVMzBYOMg4Fn1GPbuVGEIszgFY1XPjGvJ5219znC02ZHs9IKc6g8BxotKF8gUQbXI/yweGoCMA=="
  69 + //#define USER_DEVELOPER_ACCOUNT "jizhisdk@163.com"
  70 + //#define USER_BAUD_RATE "921600"
65 #else 71 #else
66 #define USER_APP_NAME "H110" 72 #define USER_APP_NAME "H110"
67 #define USER_APP_ID "107188" 73 #define USER_APP_ID "107188"