From f40c4226843b55d2a6ceb9959256492c64e815ae Mon Sep 17 00:00:00 2001 From: YuanHongbin <975559679@qq.com> Date: Wed, 22 Jul 2026 12:36:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(uart):=20=E5=88=86=E7=A6=BBETH=E4=B8=8ECat?= =?UTF-8?q?1=E9=80=9A=E8=AE=AF=EF=BC=8C=E6=94=AF=E6=8C=81UART1/Cat1/Debug?= =?UTF-8?q?=E4=BA=92=E6=96=A5=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Breaking Changes: - USART1(PA11/PA12)改为Cat1(115200)/Debug(500000)共享,SGM3157控制 - USART4(PB09/PC13)独家给ETH(115200),不再共享 - 新增EthTask独立状态机,与CatOneTask解耦运行 - 上电默认Comm=CATONE_COMM,dch=RS485_CH1 Details: - feat: 新增EthTask.c/h,ETH状态机(8态)独立运行 - refactor: CatOneTask移除ETH代码,AT发送/接收走USART1 - feat: comm cat1/eth命令增加USART1占用互斥检查 - feat: dch dbg命令增加USART1占用互斥检查 - feat: rt_kprintf根据dch通道自动路由(USART1/RS485) - feat: 新增eth on/off调试打印开关命令 - fix: 两个状态机按Comm模式判断休眠,避免误发AT - fix: bsp.c修复IRQ回调函数名不匹配(BusFault隐患) - fix: PB08(PortB Pin08)PORT_Init触发复位,改用外部上拉+POUTE单bit使能 - fix: DebugCmd命令表DEBUG_CMD_CNT与实际条目数不符(crash风险) - chore: 删除InfTest死函数、重复include、无用宏声明、EthRev_Sem等冗余代码 - chore: 更正中文标点(!→! ,→,) --- Project/GateWay/MDK/GateWay.uvoptx | 107 ++-- Project/GateWay/MDK/GateWay.uvprojx | 10 + Project/GateWay/MDK/RTE/RTOS/board.c | 19 +- .../source/Module/GateWay_Debug/DebugCmd.c | 102 ++-- .../source/Module/GateWay_Debug/DebugCmd.h | 2 +- Project/GateWay/source/User/Inc/CatOneTask.h | 54 +- Project/GateWay/source/User/Inc/EthTask.h | 47 ++ Project/GateWay/source/User/Inc/bsp.h | 145 ++--- Project/GateWay/source/User/Src/CatOneTask.c | 494 +++++------------- Project/GateWay/source/User/Src/EthTask.c | 311 +++++++++++ Project/GateWay/source/User/Src/LoraTask.c | 6 +- Project/GateWay/source/User/Src/Public.c | 2 +- Project/GateWay/source/User/Src/bsp.c | 262 +++++----- Project/GateWay/source/User/Src/main.c | 59 +-- 14 files changed, 857 insertions(+), 763 deletions(-) create mode 100644 Project/GateWay/source/User/Inc/EthTask.h create mode 100644 Project/GateWay/source/User/Src/EthTask.c diff --git a/Project/GateWay/MDK/GateWay.uvoptx b/Project/GateWay/MDK/GateWay.uvoptx index 740478b..82ab462 100644 --- a/Project/GateWay/MDK/GateWay.uvoptx +++ b/Project/GateWay/MDK/GateWay.uvoptx @@ -135,7 +135,7 @@ 0 JL2CM3 - -U4294967295 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM) + -U12345678 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM) 0 @@ -250,7 +250,7 @@ 0 1 - 1 + 0 0 0 0 @@ -410,7 +410,7 @@ 0 JL2CM3 - -U4294967295 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO14 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM) + -U12345678 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO14 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM) 0 @@ -428,40 +428,7 @@ - - - 0 - 0 - 1004 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\source\User\Src\Public.c - - -
- - 1 - 0 - 1006 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\source\User\Src\Public.c - - -
-
+ 0 @@ -513,7 +480,7 @@ 0 1 - 1 + 0 0 0 0 @@ -729,6 +696,18 @@ 0 0 + + 2 + 14 + 1 + 0 + 0 + 0 + ..\source\User\Src\EthTask.c + EthTask.c + 0 + 0 + @@ -739,7 +718,7 @@ 0 3 - 14 + 15 1 0 0 @@ -751,7 +730,7 @@ 3 - 15 + 16 1 0 0 @@ -763,7 +742,7 @@ 3 - 16 + 17 1 0 0 @@ -775,7 +754,7 @@ 3 - 17 + 18 1 0 0 @@ -787,7 +766,7 @@ 3 - 18 + 19 1 0 0 @@ -799,7 +778,7 @@ 3 - 19 + 20 1 0 0 @@ -811,7 +790,7 @@ 3 - 20 + 21 1 0 0 @@ -823,7 +802,7 @@ 3 - 21 + 22 1 0 0 @@ -835,7 +814,7 @@ 3 - 22 + 23 1 0 0 @@ -847,7 +826,7 @@ 3 - 23 + 24 1 0 0 @@ -859,7 +838,7 @@ 3 - 24 + 25 1 0 0 @@ -871,7 +850,7 @@ 3 - 25 + 26 1 0 0 @@ -883,7 +862,7 @@ 3 - 26 + 27 1 0 0 @@ -895,7 +874,7 @@ 3 - 27 + 28 1 0 0 @@ -907,7 +886,7 @@ 3 - 28 + 29 1 0 0 @@ -919,7 +898,7 @@ 3 - 29 + 30 1 0 0 @@ -931,7 +910,7 @@ 3 - 30 + 31 1 0 0 @@ -951,7 +930,7 @@ 0 4 - 31 + 32 1 0 0 @@ -971,7 +950,7 @@ 0 5 - 32 + 33 1 0 0 @@ -983,7 +962,7 @@ 5 - 33 + 34 1 0 0 @@ -1003,7 +982,7 @@ 0 6 - 34 + 35 1 0 0 @@ -1015,7 +994,7 @@ 6 - 35 + 36 1 0 0 @@ -1027,7 +1006,7 @@ 6 - 36 + 37 1 0 0 @@ -1039,7 +1018,7 @@ 6 - 37 + 38 1 0 0 @@ -1059,7 +1038,7 @@ 0 7 - 38 + 39 1 0 0 @@ -1089,7 +1068,7 @@ ::RTOS - 0 + 1 0 0 1 diff --git a/Project/GateWay/MDK/GateWay.uvprojx b/Project/GateWay/MDK/GateWay.uvprojx index e88e94b..a3220d2 100644 --- a/Project/GateWay/MDK/GateWay.uvprojx +++ b/Project/GateWay/MDK/GateWay.uvprojx @@ -493,6 +493,11 @@ 1 ..\source\User\Src\utils.c + + EthTask.c + 1 + ..\source\User\Src\EthTask.c + @@ -1419,6 +1424,11 @@ 1 ..\source\User\Src\utils.c + + EthTask.c + 1 + ..\source\User\Src\EthTask.c + diff --git a/Project/GateWay/MDK/RTE/RTOS/board.c b/Project/GateWay/MDK/RTE/RTOS/board.c index 7b3b1e8..4252c91 100644 --- a/Project/GateWay/MDK/RTE/RTOS/board.c +++ b/Project/GateWay/MDK/RTE/RTOS/board.c @@ -11,6 +11,9 @@ #include #include #include "bsp.h" +#include "main.h" + +extern GateWayPara_t GateWay; #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) /* @@ -73,16 +76,24 @@ void rt_hw_board_init(void) static int uart_init(void) { //#error "TODO 2: Enable the hardware uart and config baudrate." - DbgUart_Config(500000); - return 0; + DbgOrCat1Uart_Config(500000); +// RS485Ch1_Config(500000); + return 0; } INIT_BOARD_EXPORT(uart_init); void rt_hw_console_output(const char *str) { -//#error "TODO 3: Output the string 'str' through the uart." rt_enter_critical(); - DebugUartSend((uint8_t *)str, strlen(str)); + if(GateWay.ConfigPara.DebugChannel == DEBUG_CH_RS485_1) { + RS485Ch1UartSend((uint8_t *)str, strlen(str)); + } + else if(GateWay.ConfigPara.DebugChannel == DEBUG_CH_RS485_2) { + RS485Ch2UartSend((uint8_t *)str, strlen(str)); + } + else { + DebugOrCat1UartSend((uint8_t *)str, strlen(str)); + } rt_exit_critical(); } diff --git a/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.c b/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.c index 772cdc8..6fa0799 100644 --- a/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.c +++ b/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.c @@ -1,6 +1,7 @@ #include "main.h" #include "bsp.h" #include "CatOneTask.h" +#include "EthTask.h" #include "RS485Task.h" #include "Public.h" #include @@ -9,7 +10,7 @@ #define DBG_RX_LEN_MAX 128 //#define DBG_LOG(...) rt_kprintf(__VA_ARGS__) -#define DEBUG_CMD_CNT 31 +#define DEBUG_CMD_CNT 29 #define DEBUG_BUFF_SIZE_MAX 512 #define DEBUG_BUFSIZE 200 @@ -106,7 +107,7 @@ void Debug_Thread_Entry(void *parameter) if(DebugRev_Sem == RT_NULL) { rt_kprintf("DebugRev Sem Create Failed!\r\n"); } - rt_kprintf("DebugRev Thread is running!\r\n"); + rt_kprintf("DebugRev Thread is running!\r\n"); while(1) { result = rt_sem_take(DebugRev_Sem, RT_WAITING_FOREVER); @@ -119,16 +120,21 @@ void Debug_Thread_Entry(void *parameter) } /***************************************************************************************** -* 函数名称: RS485Ch2RxIrqCallback -* 功能描述: RS485通道1中断处理回调函数 +* 函数名称: DbgOrCat1RxIrqCallback +* 功能描述: 调试和Cat1中断处理回调函数 * 参 数: rData 接收到的数据 * 返 回 值: 无 *****************************************************************************************/ -void DbgRxIrqCallback(uint8_t rData) +void DbgOrCat1RxIrqCallback(uint8_t rData) { - if(DebugRxTimeOut1mSCnt == 0) + if(GateWay->ConfigPara.Comm == CATONE_COMM) { + Cat1IrqCallback(rData); + return; + } + + if(DebugRxTimeOut1mSCnt == 0) DebugRxLen = 0; - + DebugRxTimeOut1mSCnt = 3; if(DebugRxLen < DBG_RX_LEN_MAX) { DebugRxBuff[DebugRxLen++] = rData; @@ -136,11 +142,16 @@ void DbgRxIrqCallback(uint8_t rData) } -void DebugRxOverhandler(void) +void DebugOrCat1RxOverhandler(void) { + if(GateWay->ConfigPara.Comm == CATONE_COMM) { + Cat1OverHandler(); + return; + } + if(DebugRxTimeOut1mSCnt > 0) DebugRxTimeOut1mSCnt--; - + if(DebugRxLen > 2 && DebugRxTimeOut1mSCnt == 0) { DebugRxTimeOut1mSCnt = 20; rt_sem_release(DebugRev_Sem); @@ -231,12 +242,12 @@ void DebugCmdCat1OnOff(int argc, char *argv[]) DBG_LOG("\r\n"); if(argc < 2) return; - + if(strcmp(argv[1], "?") == 0) { DBG_LOG("Debug Cmd: cat1 arg1\r\n"); DBG_LOG(" brief --> Turn the Cat1_DBG on or off.\r\n"); DBG_LOG(" arg1 --> on/off\r\n\r\n"); - return; + return; } if(strcmp(argv[1], "on") == 0) { @@ -247,6 +258,27 @@ void DebugCmdCat1OnOff(int argc, char *argv[]) } } +void DebugCmdEthOnOff(int argc, char *argv[]) +{ + DBG_LOG("\r\n"); + if(argc < 2) + return; + + if(strcmp(argv[1], "?") == 0) { + DBG_LOG("Debug Cmd: eth arg1\r\n"); + DBG_LOG(" brief --> Turn the Eth_DBG on or off.\r\n"); + DBG_LOG(" arg1 --> on/off\r\n\r\n"); + return; + } + + if(strcmp(argv[1], "on") == 0) { + ETHOnOff(true); + } + else if(strcmp(argv[1], "off") == 0) { + ETHOnOff(false); + } +} + /***************************************************************************************** * 函数名称: DebugCmdCat1OnOff * 功能描述: CAT1调试信息开关 @@ -673,18 +705,24 @@ void DebugCmdSetComm(int argc, char *argv[]) DBG_LOG("\r\n"); if(argc < 2) return; - + if(strcmp(argv[1], "?") == 0) { DBG_LOG("Debug Cmd: comm arg1\r\n"); DBG_LOG(" brief --> Set gateway and service communication methods.\r\n"); DBG_LOG(" arg1 --> para: (cat1, eth),Cat1 or ETH communication.\r\n\r\n"); return; } - + if(strcmp(argv[1], "cat1") == 0) { + if(GateWay->ConfigPara.DebugChannel == DEBUG_CH_DBG) { + DBG_LOG("dch is dbg, USART1 occupied. Please switch dch to ch1/ch2 first.\r\n"); + return; + } GateWay->SvrRegFlag = false; GateWay->ConfigPara.Comm = CATONE_COMM; ETHStop(); + ETH_OFF(); + DbgOrCat1Uart_Config(115200); CAT1_ON(); CatOneReset(); DBG_LOG("Set the communication method to Cat1.\r\n"); @@ -697,45 +735,17 @@ void DebugCmdSetComm(int argc, char *argv[]) CatOneStop(); rt_thread_delay(3000); CAT1_PWR_KEY_SET(); + DBG_ON(); } GateWay->SvrRegFlag = false; GateWay->ConfigPara.Comm = ETH_COMM; + DbgOrCat1Uart_Config(500000); ETH_ON(); ETHReset(); WritePara((uint8_t *)&GateWay->ConfigPara, sizeof(GWConfigPara_t)); } } -/***************************************************************************************** -* 函数名称: DebugCmdSetCollTime -* 功能描述: 设置数据采集间隔 -* 参 数: argc, 输入参数数量 - argv, 输入参数 -* 返 回 值: 无 -*****************************************************************************************/ -void DebugCmdSetCollTime(int argc, char *argv[]) -{ - DBG_LOG("\r\n"); - if(argc < 2) - return; - - if(strcmp(argv[1], "?") == 0) { - DBG_LOG("Debug Cmd: sct para\r\n"); - DBG_LOG(" brief --> Set the data collection interval.\r\n"); - DBG_LOG(" arg1 --> para: (10~3600),Set the range from 10 to 3600 seconds.\r\n\r\n"); - return; - } - - int time = atoi(argv[1]); - if(time < 10 || time > 7200) { - DBG_LOG("RS485 Cmd Para Error!\r\n"); - return; - } - GateWay->ConfigPara.CommUnitReadInterval = time; - DBG_LOG("Set the collection time interval to %d seconds.\r\n", time); - WritePara((uint8_t *)&GateWay->ConfigPara, sizeof(GWConfigPara_t)); -} - /***************************************************************************************** * 函数名称: DebugCmdReadHisData * 功能描述: 读取历史数据 @@ -1166,7 +1176,12 @@ void DebugCmdSelDebugChannel(int argc, char *argv[]) } if(strcmp(argv[1], "dbg") == 0) { + if(GateWay->ConfigPara.Comm == CATONE_COMM) { + DBG_LOG("comm is cat1, USART1 occupied. Please switch comm to eth first.\r\n"); + return; + } DBG_LOG("Select Debug Channel is dbg\r\n"); + DbgOrCat1Uart_Config(500000); GateWay->ConfigPara.DebugChannel = DEBUG_CH_DBG; WritePara((uint8_t *)&GateWay->ConfigPara, sizeof(GWConfigPara_t)); } @@ -1948,6 +1963,7 @@ const DBGFunType DebugFun[DEBUG_CMD_CNT] = { "help", DebugCmdHelp, "main", DebugCmdMainOnOff, "cat1", DebugCmdCat1OnOff, + "eth", DebugCmdEthOnOff, "rs485", DebugCmdRS485Ctrl, "cudel", DebugCmdDelCommUnit, "culs", DebugCmdLsCommUnit, diff --git a/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.h b/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.h index 1dd66bd..802a6f5 100644 --- a/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.h +++ b/Project/GateWay/source/Module/GateWay_Debug/DebugCmd.h @@ -2,6 +2,6 @@ #define __DEBUG_CMD_H void Debug_Thread_Entry(void *parameter); -void DebugRxOverhandler(void); +void DebugOrCat1RxOverhandler(void); void Debug_Printf(char *format, ...); #endif diff --git a/Project/GateWay/source/User/Inc/CatOneTask.h b/Project/GateWay/source/User/Inc/CatOneTask.h index adf5b77..d7356f3 100644 --- a/Project/GateWay/source/User/Inc/CatOneTask.h +++ b/Project/GateWay/source/User/Inc/CatOneTask.h @@ -1,28 +1,11 @@ #ifndef __CAT_ONE_TASK_H -#define __CAT_ONE_TASK_H +#define __CAT_ONE_TASK_H #include "main.h" #include "Public.h" #define CAT_ONE_REV_TIMEOUT_MAX (10 * 60 * 1000) #define CAT_ONE_REV_LEN_MAX 512 -#define CAT_ONE_POW_ON() CAT1_POW_ON() -#define CAT_ONE_POW_OFF() CAT1_POW_OFF() - -#define CAT_ONE_LINKA_GET() CAT1_LINKA_GET() -#define CAT_ONE_LINKB_GET() CAT1_LINKB_GET() - -#define CAT_ONE_DELAY_1MS(X) - -// ETH状态机相关宏定义 -#define ETH_RESET_DELAY_TIME_MAX (5 * 60 * 1000) -#define ETH_LINK_WAIT_TIME_MAX (10 * 1000) -#define ETH_REG_TIMEOUT_MAX (30 * 1000) -#define ETH_SEND_TIMEOUT_MAX (5 * 1000) -#define ETH_RECV_TIMEOUT_MAX (60 * 1000) -#define ETH_SEND_RETRY_MAX 3 -#define ETH_FIRST_REG_DELAY (5 * 1000) - typedef enum { CAT_ONE_AT_NULL, CAT_ONE_AT, //开机检测 @@ -58,17 +41,6 @@ typedef enum { CAT_ONE_CLOSE_TCP, }CatOneStatus_m; -typedef enum { - ETH_IDEL, - ETH_RESET, - ETH_WAIT_LINK, - ETH_REG_SVR, - ETH_WAIT_SEND, - ETH_SEND_DATA, - ETH_WAIT_RECV, - ETH_OFF, -}EthStatus_m; - typedef enum { CAT_ONE_RET_NULL, CAT_ONE_RET_OK, @@ -102,38 +74,26 @@ typedef struct { char SIM[32]; CatOneNetType_m NetType; bool TcpConnFlag; - + bool LBSFlag; int Longitude; int Latitude; char CatOneSendBuff[1024]; - - GateWayPara GateWay; + + GateWayPara GateWay; DataRevCallBack CatOneRevCallBack; - - // ETH状态机相关字段 - EthStatus_m EthStatus; - uint32_t EthResetDelayCnt; - uint32_t EthLinkWaitCnt; - uint32_t EthRecvTimeoutCnt; - uint8_t EthSendRetryCnt; - bool EthFirstRegFlag; }CatOne_t, *pCatOne_t; -CatOneRetStatus_m CatOneSend(uint8_t *sData, uint16_t sLen); -void CatOneStart(void); void CatOneStop(void); void CatOneReset(void); -void ETHStop(void); -void ETHReset(void); void Cat1DBGOnOff(bool OnOff); void CatOneGetLocationInfo(int *Longitude, int *Latitude); void CatOneGetIMEIAndSIM(char *Imei, char *Sim); bool CatOneGetStatus(void); bool CatOneEthSendQueue(uint8_t *sData, uint16_t sLen); void CatOneTriggerRegister(void); -void ETHTriggerRegister(void); -void CatOne_Eth_Thread_Entry(void *parameter); -void EthRxOverhandler(void); +void CatOne_Thread_Entry(void *parameter); +void Cat1IrqCallback(uint8_t rData); +void Cat1OverHandler(void); void CatReadImeiOrSim(char *Imei, char *Sim); #endif diff --git a/Project/GateWay/source/User/Inc/EthTask.h b/Project/GateWay/source/User/Inc/EthTask.h new file mode 100644 index 0000000..b86544c --- /dev/null +++ b/Project/GateWay/source/User/Inc/EthTask.h @@ -0,0 +1,47 @@ +#ifndef __ETH_TASK_H +#define __ETH_TASK_H +#include "main.h" +#include "Public.h" + +#define ETH_RX_LEN_MAX 512 + +#define ETH_RESET_DELAY_TIME_MAX (5 * 60 * 1000) +#define ETH_LINK_WAIT_TIME_MAX (10 * 1000) +#define ETH_RECV_TIMEOUT_MAX (60 * 1000) +#define ETH_SEND_RETRY_MAX 3 +#define ETH_FIRST_REG_DELAY (5 * 1000) + +typedef enum { + ETH_IDEL, + ETH_RESET, + ETH_WAIT_LINK, + ETH_REG_SVR, + ETH_WAIT_SEND, + ETH_SEND_DATA, + ETH_WAIT_RECV, + ETH_OFF, +} EthStatus_m; + +typedef struct { + EthStatus_m Status; + uint32_t ResetDelayCnt; + uint32_t LinkWaitCnt; + uint32_t RecvTimeoutCnt; + uint8_t SendRetryCnt; + bool FirstRegFlag; + + GateWayPara GateWay; + + uint8_t TxBuff[ETH_RX_LEN_MAX]; + uint16_t TxLen; + uint8_t Payload[ETH_RX_LEN_MAX]; + char SendASCII[ETH_RX_LEN_MAX * 2]; +} EthTask_t; + +void Eth_Thread_Entry(void *parameter); +void EthIrqCallbackHandler(uint8_t rData); +void EthOverHandler(void); +void ETHStop(void); +void ETHReset(void); +void ETHTriggerRegister(void); +#endif diff --git a/Project/GateWay/source/User/Inc/bsp.h b/Project/GateWay/source/User/Inc/bsp.h index e65b691..2722cc3 100644 --- a/Project/GateWay/source/User/Inc/bsp.h +++ b/Project/GateWay/source/User/Inc/bsp.h @@ -63,36 +63,62 @@ #define RTC_IRQn Int001_IRQn -#define LORA_DIO0_IRQn Int005_IRQn - -#define DBGUART_IRQn Int006_IRQn -#define DBGUART_EI_IRQn Int007_IRQn - -#define RS485CH1_UART_IRQn Int008_IRQn -#define RS485CH1_UART_EI_IRQn Int009_IRQn - -#define RS485CH2_UART_IRQn Int010_IRQn -#define RS485CH2_UART_EI_IRQn Int011_IRQn - -#define ETH_OR_CAT1_UART_IRQn Int012_IRQn -#define ETH_OR_CAT1_UART_EI_IRQn Int013_IRQn - #define DBG_RXPIN_IRQn Int002_IRQn +#define LORA_DIO0_IRQn Int005_IRQn -//DEBUG -#define DBG_USART_CH (M4_USART1) -#define DBG_USART_RX_PORT (PortA) -#define DBG_USART_RX_PIN (Pin11) -#define DBG_USART_TX_PORT (PortA) -#define DBG_USART_TX_PIN (Pin12) -#define DBG_USART_RX_FUNC (Func_Usart1_Rx) -#define DBG_USART_TX_FUNC (Func_Usart1_Tx) -#define DBG_USART_RI_NUM (INT_USART1_RI) -#define DBG_USART_EI_NUM (INT_USART1_EI) -#define DBG_USART_TI_NUM (INT_USART1_TI) -#define DBG_USART_TCI_NUM (INT_USART1_TCI) -#define DBG_FCG1_PERIPH (PWC_FCG1_PERIPH_USART1) +#define DBG_OR_CAT1_UART_IRQn Int006_IRQn +#define DBG_OR_CAT1_UART_EI_IRQn Int007_IRQn + +#define ETH_UART_IRQn Int008_IRQn +#define ETH_UART_EI_IRQn Int009_IRQn + +#define RS485CH1_UART_IRQn Int010_IRQn +#define RS485CH1_UART_EI_IRQn Int011_IRQn + +#define RS485CH2_UART_IRQn Int012_IRQn +#define RS485CH2_UART_EI_IRQn Int013_IRQn + + +//DEBUG or CAT1 +#define DBG_OR_CAT1_USART_CH (M4_USART1) +#define DBG_OR_CAT1_USART_RX_PORT (PortA) +#define DBG_OR_CAT1_USART_RX_PIN (Pin11) +#define DBG_OR_CAT1_USART_TX_PORT (PortA) +#define DBG_OR_CAT1_USART_TX_PIN (Pin12) +#define DBG_OR_CAT1_USART_RX_FUNC (Func_Usart1_Rx) +#define DBG_OR_CAT1_USART_TX_FUNC (Func_Usart1_Tx) +#define DBG_OR_CAT1_USART_RI_NUM (INT_USART1_RI) +#define DBG_OR_CAT1_USART_EI_NUM (INT_USART1_EI) +#define DBG_OR_CAT1_USART_TI_NUM (INT_USART1_TI) +#define DBG_OR_CAT1_USART_TCI_NUM (INT_USART1_TCI) +#define DBG_OR_CAT1_FCG1_PERIPH (PWC_FCG1_PERIPH_USART1) + +#define DBG_OR_CAT1_CTRL_PORT (PortB) +#define DBG_OR_CAT1_CTRL_PIN (Pin08) + +#if (HARDWARE_VERSION == 12) +#define DBG_ON() PORT_SetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN) +#define CAT1_ON() PORT_ResetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN) +#elif (HARDWARE_VERSION >= 13) +#define DBG_ON() PORT_ResetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN) +#define CAT1_ON() PORT_SetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN) +#endif + +#define CAT1_PWR_KEY_PORT (PortA) +#define CAT1_PWR_KEY_PIN (Pin03) +#define CAT1_PWR_KEY_CLR() PORT_SetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN) +#define CAT1_PWR_KEY_SET() PORT_ResetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN) + +#define CAT1_RESET_PORT (PortA) +#define CAT1_RESET_PIN (Pin00) +#define CAT1_RESET_CLR() PORT_SetBits(CAT1_RESET_PORT, CAT1_RESET_PIN) +#define CAT1_RESET_SET() PORT_ResetBits(CAT1_RESET_PORT, CAT1_RESET_PIN) + +#define CAT1_WAKEUP_PORT (PortA) +#define CAT1_WAKEUP_PIN (Pin02) +#define CAT1_WAKEUP_CLR() PORT_SetBits(CAT1_WAKEUP_PORT, CAT1_WAKEUP_PIN) +#define CAT1_WAKEUP_SET() PORT_ResetBits(CAT1_WAKEUP_PORT, CAT1_WAKEUP_PIN) //RS485 Ch1 #define RS485_CH1_USART_CH (M4_USART2) @@ -152,45 +178,22 @@ //#define RS485_CH2_VOL_5V() PORT_SetBits(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN) //#define RS485_CH2_VOL_12V() PORT_ResetBits(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN) -//ETH OR CAT1 -#define ETH_OR_CAT1_USART_CH (M4_USART4) -#define ETH_OR_CAT1_USART_RX_PORT (PortB) -#define ETH_OR_CAT1_USART_RX_PIN (Pin09) -#define ETH_OR_CAT1_USART_TX_PORT (PortC) -#define ETH_OR_CAT1_USART_TX_PIN (Pin13) -#define ETH_OR_CAT1_USART_RX_FUNC (Func_Usart4_Rx) -#define ETH_OR_CAT1_USART_TX_FUNC (Func_Usart4_Tx) -#define ETH_OR_CAT1_USART_RI_NUM (INT_USART4_RI) -#define ETH_OR_CAT1_USART_EI_NUM (INT_USART4_EI) -#define ETH_OR_CAT1_USART_TI_NUM (INT_USART4_TI) -#define ETH_OR_CAT1_USART_TCI_NUM (INT_USART4_TCI) -#define ETH_OR_CAT1_FCG1_PERIPH (PWC_FCG1_PERIPH_USART4) +//ETH +#define ETH_USART_CH (M4_USART4) +#define ETH_USART_RX_PORT (PortB) +#define ETH_USART_RX_PIN (Pin09) +#define ETH_USART_TX_PORT (PortC) +#define ETH_USART_TX_PIN (Pin13) +#define ETH_USART_RX_FUNC (Func_Usart4_Rx) +#define ETH_USART_TX_FUNC (Func_Usart4_Tx) +#define ETH_USART_RI_NUM (INT_USART4_RI) +#define ETH_USART_EI_NUM (INT_USART4_EI) +#define ETH_USART_TI_NUM (INT_USART4_TI) +#define ETH_USART_TCI_NUM (INT_USART4_TCI) +#define ETH_FCG1_PERIPH (PWC_FCG1_PERIPH_USART4) -#define ETH_OR_CAT1_CTRL_PORT (PortB) -#define ETH_OR_CAT1_CTRL_PIN (Pin08) - -#if (HARDWARE_VERSION == 12) -#define ETH_ON() PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN) -#define CAT1_ON() PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN) -#elif (HARDWARE_VERSION >= 13) -#define ETH_ON() PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN) -#define CAT1_ON() PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN) -#endif - -//#define ETH_OR_CAT1_TX_CTRL_PORT (PortH) -//#define ETH_OR_CAT1_TX_CTRL_PIN (Pin02) -//#define ETH_ON() { PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN); PORT_SetBits(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN); } -//#define CAT1_ON() { PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN); PORT_ResetBits(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN);} - -#define CAT1_PWR_KEY_PORT (PortA) -#define CAT1_PWR_KEY_PIN (Pin03) -#define CAT1_PWR_KEY_CLR() PORT_SetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN) -#define CAT1_PWR_KEY_SET() PORT_ResetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN) - -#define CAT1_RESET_PORT (PortA) -#define CAT1_RESET_PIN (Pin00) -#define CAT1_RESET_CLR() PORT_SetBits(CAT1_RESET_PORT, CAT1_RESET_PIN) -#define CAT1_RESET_SET() PORT_ResetBits(CAT1_RESET_PORT, CAT1_RESET_PIN) +#define ETH_ON() ETH_RESET_SET() +#define ETH_OFF() ETH_RESET_CLR() #define ETH_RESET_PORT (PortB) #define ETH_RESET_PIN (Pin05) @@ -377,9 +380,10 @@ typedef struct { void BSP_Init(void); -void DbgUart_Config(uint32_t BaudRate); -void DebugUartSend(uint8_t *sData, uint16_t sLen); -void DbgRxIrqCallback(uint8_t rData); +void DbgOrCat1Uart_Config(uint32_t BaudRate); +void DebugOrCat1UartSend(uint8_t *sData, uint16_t sLen); +void DbgOrCat1RxIrqCallback(uint8_t rData); +void Cat1RxIrqCallback(uint8_t rData); void RS485Ch1_Config(uint32_t BaudRate); void RS485Ch1UartSend(uint8_t *sData, uint16_t sLen); @@ -389,8 +393,9 @@ void RS485Ch2_Config(uint32_t BaudRate); void RS485Ch2UartSend(uint8_t *sData, uint16_t sLen); void RS485Ch2RxIrqCallback(uint8_t rData); -void EthOrCat1UartSend(uint8_t *sData, uint16_t sLen); -void EthOrCat1RxIrqCallback(uint8_t rData); +void Eth_Config(uint32_t BaudRate); +void EthUartSend(uint8_t *sData, uint16_t sLen); +void EthIrqCallbackHandler(uint8_t rData); void LoraTxRxIrqCallback(void); diff --git a/Project/GateWay/source/User/Src/CatOneTask.c b/Project/GateWay/source/User/Src/CatOneTask.c index b31a2c0..4615825 100644 --- a/Project/GateWay/source/User/Src/CatOneTask.c +++ b/Project/GateWay/source/User/Src/CatOneTask.c @@ -4,71 +4,45 @@ static rt_sem_t CatOneRev_Sem = RT_NULL; static rt_sem_t CatOneIRQ_Sem = RT_NULL; -static rt_sem_t EthIRQ_Sem = RT_NULL; static rt_thread_t Cat1Rev_Thread = RT_NULL; static uint8_t CAT1DispEn = false; static CatOne_t CatOne; -static char CatOneEthRxBuff[CAT_ONE_REV_LEN_MAX]; -static uint16_t CatOneEthRxLen; +static char CatOneRxBuff[CAT_ONE_REV_LEN_MAX]; +static uint16_t CatOneRxLen; -static uint8_t CatOneEthTxBuff[CAT_ONE_REV_LEN_MAX]; -static uint16_t CatOneEthTxLen; +static uint8_t CatOneTxBuff[CAT_ONE_REV_LEN_MAX]; +static uint16_t CatOneTxLen; static uint8_t Payload[CAT_ONE_REV_LEN_MAX]; static char CommUnitSendASCII[CAT_ONE_REV_LEN_MAX * 2]; - -static uint8_t EthRevTimeOutCnt; +static uint8_t Cat1RevTimeOutCnt; static uint16_t CatSendErrCnt = 0; -// ETH状态机相关变量已移至 CatOne_t 结构体中 - #define CAT1_DBG_LOG(...) { if(CAT1DispEn) Debug_Printf(__VA_ARGS__);} -//#define CAT1_DBG_ARRAY(ARRAY, SIZE) { if(CAT1DispEn) {DBG_ARRAY(ARRAY,SIZE)}} #define CATONE_RESET_DELAY_TIME_MAX (5 * 60 * 1000) -//const char *CatOneATCmdStr[16] = { -// "NULL", -// "AT\r\n", //开机检测 -// "ATE0\r\n", //关回显 -// "AT+CPIN?\r\n", //识卡 -//// "AT+CIMI\r\n", //IMEI -// "AT+CGSN=1\r\n", -// "AT+LCCID\r\n", //读卡号 -// "AT+CEREG?\r\n", //查询注册状态 -// "AT+CGPADDR=1\r\n", //查询IP地址 -// "AT+CSQ\r\n", //查询信号强度 -// "AT+LDNSGIP=gxjt.cui635.cn\r\n", -// "AT+LBS=0\r\n", //获取基站定位信息 -// "AT+LIPOPEN=", //设置TCP服务器地址和端口,AT+LIPOPEN="TCP","114.55.52.96",6803 -// "AT+LIPSEND=", //发送数据, AT+LIPSEND=0,1,20,"31313131313131323232323232" -// "AT+LIPCLOSE=0\r\n",//断开连接 -// "AT+LBSPARA=http://locator-aep.xiot.senthink.com:80/locator/v0.1/locate,B84E427D95B1DF4A3F49B18DDF714C72\r\n", -// "AT+CCLK?\r\n", //获取时间 -//}; - const char *CatOneATCmdStr[16] = { "NULL", "AT\r\n", //开机检测 "ATE0\r\n", //关回显 "AT+CPIN?\r\n", //识卡 -// "AT+CIMI\r\n", //IMEI "AT+CGSN=1\r\n", - "AT+QCCID\r\n", //读卡号 + "AT+QCCID\r\n", //读卡号 "AT+CEREG?\r\n", //查询注册状态 "AT+CGPADDR=1\r\n", //查询IP地址 "AT+CSQ\r\n", //查询信号强度 "AT+LDNSGIP=gxjt.cui635.cn\r\n", "AT+QLBS\r\n", //获取基站定位信息 - "AT+QIOPEN=", //设置TCP服务器地址和端口,AT+LIPOPEN="TCP","114.55.52.96",6803 - "AT+QISEND=", //发送数据, AT+LIPSEND=0,1,20,"31313131313131323232323232" - "AT+QICLOSE=0\r\n",//断开连接 + "AT+QIOPEN=", //设置TCP服务器地址和端口 + "AT+QISEND=", //发送数据 + "AT+QICLOSE=0\r\n", //断开连接 "AT+QLBSCFG=\"server\",http://locator-aep.xiot.senthink.com:80/locator/v0.1/locate\r\n", - "AT+QLBSCFG=\"token\",45B516D3078467E84DD2CFBF3532A4CB\r\n", - "AT+CCLK?\r\n", //获取时间 + "AT+QLBSCFG=\"token\",45B516D3078467E84DD2CFBF3532A4CB\r\n", + "AT+CCLK?\r\n", //获取时间 }; void Cat1DBGOnOff(bool OnOff) @@ -81,53 +55,23 @@ void Cat1DBGOnOff(bool OnOff) } const CatOneATCMD_m CatOneModeSetCmdArray[] = { - CAT_ONE_AT_NULL, - CAT_ONE_AT, - CAT_ONE_ATE0, - //CAT_ONE_LBSPARA, + CAT_ONE_AT_NULL, + CAT_ONE_AT, + CAT_ONE_ATE0, CAT_ONE_LCCID, CAT_ONE_IMEI, - CAT_ONE_CPIN, - CAT_ONE_CEREG, + CAT_ONE_CPIN, + CAT_ONE_CEREG, CAT_ONE_CSQ, - //CAT_ONE_LDNSGIP, - //CAT_ONE_LBS, CAT_ONE_CCLK, CAT_ONE_AT_CMD_END }; -//CatOneRetStatus_m CatOneSend(uint8_t *sData, uint16_t sLen) -//{ -// rt_err_t result; -// -// if(CatOne.Cat1Status != CAT_ONE_IDEL && CatOne.Cat1Status != CAT_ONE_WAIT_SEND) -// return CAT_ONE_RET_ERR; -// -// //CatOne.Cat1Status = CAT_ONE_RESET; -// result = rt_mq_send(CatOneRev_MQ, sData, sLen); -// if(result != RT_EOK) { -// CAT1_DBG_LOG("CatOne MQ Send ERR...\r\n"); -// return CAT_ONE_RET_ERR; -// } -// CAT1_DBG_LOG("CatOne Send Message: \r\n", sData); -// return CAT_ONE_RET_OK; -//} - void CatOneStop(void) { CatOne.Cat1Status = CAT_ONE_OFF; } -void ETHStop(void) -{ - CatOne.EthStatus = ETH_OFF; -} - -void ETHReset(void) -{ - CatOne.EthStatus = ETH_RESET; -} - void CatOneGetLocationInfo(int *Longitude, int *Latitude) { if(CatOne.LBSFlag) { @@ -146,7 +90,6 @@ void CatOneGetIMEIAndSIM(char *Imei, char *Sim) memcpy(Sim, CatOne.SIM, 20); } -//返回true-busy, false-Idle bool CatOneGetStatus(void) { if(CatOne.Cat1Status == CAT_ONE_IDEL) @@ -159,36 +102,36 @@ void CatOneReset(void) CatOne.Cat1Status = CAT_ONE_RESET; } -void CatTimeSync(char *Data) +void CatTimeSync(char *Data) { struct tm sTimet; time_t sTime; - char *p; - + char *p; + p = strchr(Data, '\"'); if(p == NULL) return; - - int ret = sscanf(p, "\"%d/%d/%d,%d:%d:%d+", + + int ret = sscanf(p, "\"%d/%d/%d,%d:%d:%d+", &sTimet.tm_year, &sTimet.tm_mon, &sTimet.tm_mday, &sTimet.tm_hour, &sTimet.tm_min, & sTimet.tm_sec); if(ret != 6) { - int ret = sscanf(p, "\"%d/%d/%d,%d:%d:%d-", + int ret = sscanf(p, "\"%d/%d/%d,%d:%d:%d-", &sTimet.tm_year, &sTimet.tm_mon, &sTimet.tm_mday, &sTimet.tm_hour, &sTimet.tm_min, & sTimet.tm_sec); if(ret != 6) return; } - + sTimet.tm_isdst = 0; if(sTimet.tm_year < 24 || sTimet.tm_year > 50) return; sTimet.tm_year += 100; - + if(sTimet.tm_mon > 12 || sTimet.tm_mon == 0) return; sTimet.tm_mon--; - + sTime = mktime(&sTimet); TimeSync(sTime); CAT1_DBG_LOG("Set Time:"); @@ -199,10 +142,10 @@ void CatOneAtCmdAnalyze(char *RxBuff) { char *p; int ret; - + CatOne.ATCmdRet = CAT_ONE_RET_OK; CAT1_DBG_LOG(RxBuff); - + switch(CatOne.AtCmd) { case CAT_ONE_AT: case CAT_ONE_ATE0: @@ -213,7 +156,7 @@ void CatOneAtCmdAnalyze(char *RxBuff) CatOne.ATCmdRet = CAT_ONE_RET_ERR; } break; - + case CAT_ONE_IMEI: if(strstr(RxBuff, "OK") == NULL) { CatOne.ATCmdRet = CAT_ONE_RET_ERR; @@ -229,19 +172,15 @@ void CatOneAtCmdAnalyze(char *RxBuff) else { memset(CatOne.IMEI, 0, 15); } -// ret = sscanf(p, "+CGSN: \"%s\"\r\n", CatOne.IMEI); -// if(ret != 1) { -// memset(CatOne.IMEI, 0, 15); -// } CatOne.IMEI[15] = 0; break; - - case CAT_ONE_CCLK: + + case CAT_ONE_CCLK: if(strstr(RxBuff, "+CCLK") != NULL) { CatTimeSync(RxBuff); } break; - + case CAT_ONE_LCCID: if(strstr(RxBuff, "OK") == NULL) { CatOne.ATCmdRet = CAT_ONE_RET_ERR; @@ -256,7 +195,7 @@ void CatOneAtCmdAnalyze(char *RxBuff) memset(CatOne.SIM, 0, 32); } break; - + case CAT_ONE_LBS: p = strstr(RxBuff, "+QLBS"); if(p != NULL) { @@ -290,32 +229,32 @@ void CatOneAtCmdAnalyze(char *RxBuff) } return; } - + case CAT_ONE_CPIN: if(strstr(RxBuff, "READY") == NULL) { CatOne.ATCmdRet = CAT_ONE_RET_ERR; } break; - + case CAT_ONE_CEREG: if(strstr(RxBuff, "CEREG: 0,1") == NULL) { CatOne.CatOne1mSDelayCnt = 3000; CatOne.ATCmdRet = CAT_ONE_RET_ERR; } break; - + case CAT_ONE_CGPADDR: if(strstr(RxBuff, "+CGPADDR") == NULL) { CatOne.ATCmdRet = CAT_ONE_RET_ERR; } break; - + case CAT_ONE_CSQ: if(strstr(RxBuff, "+CSQ") == NULL) { CatOne.ATCmdRet = CAT_ONE_RET_ERR; } break; - + case CAT_ONE_LTPCLOSE: if(strstr(RxBuff, "CLOSE OK") != NULL) { break; @@ -328,20 +267,20 @@ void CatOneAtCmdAnalyze(char *RxBuff) } CatOne.ATCmdRet = CAT_ONE_RET_ERR; break; - case CAT_ONE_AT_NULL: + case CAT_ONE_AT_NULL: p = strstr(RxBuff, "+LIPURC"); if(p != NULL) { char rData[120]; uint8_t hData[60]; int rLen, hLen, ret; - + if(strstr(p, "+LIPURC: 0,0") != NULL) { CAT1_DBG_LOG("TCP connection disconnected.\r\n\r\n"); CatOne.TcpConnFlag = false; CatOne.Cat1Status = CAT_ONE_OFF; return; } - + ret = sscanf(p, "+LIPURC: 0,1,%d,%s\r\n", &rLen, rData); if(ret == 2) { if(rLen < 24) @@ -354,13 +293,12 @@ void CatOneAtCmdAnalyze(char *RxBuff) else { return; } - //CatOne.Cat1Status = CAT_ONE_CLOSE_TCP; - rt_sem_release(CatOneRev_Sem);//接收任务 + rt_sem_release(CatOneRev_Sem); return; } default: CatOne.ATCmdRet = CAT_ONE_RET_ERR; - + } if(CatOne.ATCmdRet == CAT_ONE_RET_OK) { CatOne.Cat1Status = CatOne.NextStatus; @@ -377,35 +315,35 @@ void CatOneAtCmdSend(CatOneATCMD_m Cmd, uint32_t Dly, CatOneStatus_m NextStatus) { CatOne.AtCmd = Cmd; if(CatOne.AtCmd == CAT_ONE_LIPSEND) { - HexToAscii(CatOneEthTxBuff, CommUnitSendASCII, CatOneEthTxLen); - sprintf(CatOne.CatOneSendBuff,"AT+LIPSEND=0,1,%d,\"%s\"\r\n",CatOneEthTxLen * 2, CommUnitSendASCII); + HexToAscii(CatOneTxBuff, CommUnitSendASCII, CatOneTxLen); + sprintf(CatOne.CatOneSendBuff,"AT+LIPSEND=0,1,%d,\"%s\"\r\n",CatOneTxLen * 2, CommUnitSendASCII); CatOne.GateWay->BatteryReadDlyCnt = 30; } else if(CatOne.AtCmd == CAT_ONE_LIPOPEN) { - sprintf(CatOne.CatOneSendBuff,"AT+LIPOPEN=\"TCP\",\"%d.%d.%d.%d\",%d\r\n", - CatOne.GateWay->ConfigPara.LTENet.DestAddr[0], - CatOne.GateWay->ConfigPara.LTENet.DestAddr[1], + sprintf(CatOne.CatOneSendBuff,"AT+LIPOPEN=\"TCP\",\"%d.%d.%d.%d\",%d\r\n", + CatOne.GateWay->ConfigPara.LTENet.DestAddr[0], + CatOne.GateWay->ConfigPara.LTENet.DestAddr[1], CatOne.GateWay->ConfigPara.LTENet.DestAddr[2], - CatOne.GateWay->ConfigPara.LTENet.DestAddr[3], + CatOne.GateWay->ConfigPara.LTENet.DestAddr[3], CatOne.GateWay->ConfigPara.LTENet.DestPort); } else { strcpy(CatOne.CatOneSendBuff, CatOneATCmdStr[CatOne.AtCmd]); } CAT1_DBG_LOG(CatOne.CatOneSendBuff); - EthRevTimeOutCnt = 0; - EthOrCat1UartSend((uint8_t *)CatOne.CatOneSendBuff, strlen(CatOne.CatOneSendBuff)); + Cat1RevTimeOutCnt = 0; + DebugOrCat1UartSend((uint8_t *)CatOne.CatOneSendBuff, strlen(CatOne.CatOneSendBuff)); CatOne.CatOne1mSDelayCnt = Dly; CatOne.Cat1Status = CAT_ONE_WAIT_REV; CatOne.NextStatus = NextStatus; } -int GateWayRegister(uint8_t *TxBuff) +static int GateWayRegister(uint8_t *TxBuff) { uint16_t UnitCommCnt = 0; uint8_t *p = &TxBuff[0]; uint16_t len = 5; - + if(CatOne.GateWay->ConfigPara.Rs485Ch1.CommUnitEnable == true && CatOne.GateWay->ConfigPara.Rs485Ch1.Enable == true) { UnitCommCnt++; memcpy(&p[len], CatOne.GateWay->ConfigPara.Rs485Ch1.CUPara.Para.Mac[0], 6); @@ -439,7 +377,7 @@ void CatOneLoopHandler(void) static rt_err_t result; uint16_t ret; static uint8_t Cat1RevErrCnt = 0; - + switch(CatOne.Cat1Status){ case CAT_ONE_IDEL: rt_thread_delay(1); @@ -450,7 +388,7 @@ void CatOneLoopHandler(void) CatOne.Cat1Status = CAT_ONE_RESET; } break; - + case CAT_ONE_WAIT_REV: result = rt_sem_take(CatOneRev_Sem, CatOne.CatOne1mSDelayCnt); if(result != RT_EOK) { @@ -459,7 +397,7 @@ void CatOneLoopHandler(void) CatOneAtCmdSend(CatOne.AtCmd, 2000, CatOne.NextStatus); CAT1_DBG_LOG("Cat1 Ret TimeOut, ReSend(%d)...\r\n", CatOne.AtCmdResendCnt); } - else { //3次错误,关机 + else { CAT1_DBG_LOG("Cat1 error, Close!\r\n"); if(CatOne.AtCmd == CAT_ONE_LIPSEND) CatOne.Cat1Status = CAT_ONE_CLOSE_TCP; @@ -468,7 +406,7 @@ void CatOneLoopHandler(void) } } break; - + case CAT_ONE_INIT: CatOne.AtCmdIdx++; if(CatOneModeSetCmdArray[CatOne.AtCmdIdx] != CAT_ONE_AT_CMD_END) { @@ -489,31 +427,31 @@ void CatOneLoopHandler(void) case CAT_ONE_TCP_CONN: CatOneAtCmdSend(CAT_ONE_LIPOPEN, 2000, CAT_ONE_WAIT_CONN); break; - + case CAT_ONE_WAIT_CONN: if(CatOne.TcpConnFlag) { if(CatOne.GateWay->SvrRegFlag == false) CatOne.Cat1Status = CAT_ONE_REG_SVR; - else + else CatOne.Cat1Status = CAT_ONE_WAIT_SEND; } break; - - case CAT_ONE_REG_SVR: //注册服务器 - ret = GateWayRegister(CatOneEthTxBuff); - rt_mq_send(CatOne.GateWay->NetSendData_MQ, CatOneEthTxBuff, ret); + + case CAT_ONE_REG_SVR: + ret = GateWayRegister(CatOneTxBuff); + rt_mq_send(CatOne.GateWay->NetSendData_MQ, CatOneTxBuff, ret); CatOne.Cat1Status = CAT_ONE_WAIT_SEND; break; - + case CAT_ONE_WAIT_SEND: result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 1000); if(result == RT_EOK) { - CatSendErrCnt = 0; - CatOneEthTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneEthTxBuff); + CatSendErrCnt = 0; + CatOneTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneTxBuff); CatOne.Cat1Status = CAT_ONE_SEND_DATA; } else { - if(CatOne.Cat1Status == CAT_ONE_RESET || CatOne.Cat1Status == CAT_ONE_OFF) //外部命令执行,状态改变 + if(CatOne.Cat1Status == CAT_ONE_RESET || CatOne.Cat1Status == CAT_ONE_OFF) return; if(!CatOne.TcpConnFlag) { CatOne.Cat1Status = CAT_ONE_OFF; @@ -530,8 +468,8 @@ void CatOneLoopHandler(void) } } break; - - case CAT_ONE_SEND_DATA: + + case CAT_ONE_SEND_DATA: CatOne.AtCmdResendCnt = 3; Cat1RevErrCnt++; if(Cat1RevErrCnt > 10) { @@ -542,7 +480,7 @@ void CatOneLoopHandler(void) } CatOneAtCmdSend(CAT_ONE_LIPSEND, 5000, CAT_ONE_REV_DATA); break; - + case CAT_ONE_REV_DATA: result = rt_sem_take(CatOneRev_Sem, CatOne.CatOne1mSDelayCnt); if(result != RT_EOK) { @@ -554,7 +492,7 @@ void CatOneLoopHandler(void) else { Cat1RevErrCnt = 0; } - if(CatOne.GateWay->SvrRegFlag == false) //设备没注册,关闭4G,等待下一次重新注册 + if(CatOne.GateWay->SvrRegFlag == false) CatOne.Cat1Status = CAT_ONE_OFF; else CatOne.Cat1Status = CAT_ONE_WAIT_SEND; @@ -564,9 +502,8 @@ void CatOneLoopHandler(void) CatOne.AtCmdResendCnt = 3; CatOneAtCmdSend(CAT_ONE_LTPCLOSE, 1000, CAT_ONE_OFF); break; - + case CAT_ONE_OFF: - //CAT1_POW_OFF(); CAT1_RESET_SET(); CAT1_PWR_KEY_CLR(); rt_thread_delay(3000); @@ -576,15 +513,16 @@ void CatOneLoopHandler(void) CAT1_DBG_LOG("Cat1 Power Off!\r\n"); CatOne.Cat1Status = CAT_ONE_IDEL; CatOne.ResetDelayCnt = CATONE_RESET_DELAY_TIME_MAX; + DBG_ON(); break; - + case CAT_ONE_RESET: CatSendErrCnt = 0; CatOne.GateWay->SvrRegFlag = false; CAT1_DBG_LOG("Cat1 Reset!\r\n"); + CAT1_ON(); CAT1_RESET_CLR(); CAT1_PWR_KEY_SET(); - //CAT1_POW_ON(); rt_thread_delay(50); CAT1_RESET_SET(); CAT1_PWR_KEY_CLR(); @@ -594,156 +532,6 @@ void CatOneLoopHandler(void) CatOne.AtCmdIdx = 0; rt_thread_delay(1000); CatOne.GateWay->BatteryReadDlyCnt = 60; - break; - } -} - -void EthLoopHandler(void) -{ - rt_err_t result; - - switch(CatOne.EthStatus) { - case ETH_IDEL: - rt_thread_delay(1); - if(CatOne.EthResetDelayCnt > 0) { - CatOne.EthResetDelayCnt--; - } - else { - CatOne.EthStatus = ETH_RESET; - } - break; - - case ETH_RESET: - CAT1_DBG_LOG("ETH Reset!\r\n"); - ETH_RESET_CLR(); - rt_thread_delay(10); - ETH_RESET_SET(); - rt_thread_delay(2000); // 延长复位后稳定时间到2秒 - CatOne.EthStatus = ETH_WAIT_LINK; - CatOne.EthLinkWaitCnt = 0; - CatOne.EthFirstRegFlag = true; // 重置首次注册标志 - break; - - case ETH_WAIT_LINK: - if(CatOne.EthLinkWaitCnt == 0) { - /* 首次进入等待链路状态,等待模块完全启动 */ - CAT1_DBG_LOG("ETH Waiting for module ready...\r\n"); - rt_thread_delay(2000); - } - if(ETH_LINK_GET() == Reset) { - CAT1_DBG_LOG("ETH Link OK!\r\n"); - if(CatOne.GateWay->SvrRegFlag == false) { - CatOne.EthStatus = ETH_REG_SVR; - } - else { - CatOne.EthStatus = ETH_WAIT_SEND; - } - } - else { - CatOne.EthLinkWaitCnt++; - if(CatOne.EthLinkWaitCnt >= ETH_LINK_WAIT_TIME_MAX) { - CAT1_DBG_LOG("ETH Link Timeout, Reset!\r\n"); - CatOne.EthStatus = ETH_OFF; - } - rt_thread_delay(1); - } - break; - - case ETH_REG_SVR: - { - // 首次注册时添加延迟,等待系统稳定 - if(CatOne.EthFirstRegFlag) { - CAT1_DBG_LOG("ETH First Register, waiting for system stable...\r\n"); - rt_thread_delay(ETH_FIRST_REG_DELAY); - CatOne.EthFirstRegFlag = false; - } - - uint8_t ret = GateWayRegister(CatOneEthTxBuff); - rt_mq_send(CatOne.GateWay->NetSendData_MQ, CatOneEthTxBuff, ret); - CAT1_DBG_LOG("ETH Register Server...\r\n"); - CatOne.EthStatus = ETH_WAIT_SEND; - CatOne.EthSendRetryCnt = 0; // 重置重试计数器 - } - break; - - case ETH_WAIT_SEND: - result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 100); - if(result == RT_EOK) { - CatOneEthTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneEthTxBuff); - CatOne.EthStatus = ETH_SEND_DATA; - } - else { - if(CatOne.EthStatus == ETH_RESET || CatOne.EthStatus == ETH_OFF) - return; - if(ETH_LINK_GET() != Reset) { - CAT1_DBG_LOG("ETH Link Lost!\r\n"); - CatOne.EthStatus = ETH_OFF; - } - else { - rt_thread_delay(1); - } - } - break; - - case ETH_SEND_DATA: - HexToAscii(CatOneEthTxBuff, CommUnitSendASCII, CatOneEthTxLen); - EthRevTimeOutCnt = 0; - EthOrCat1UartSend((uint8_t *)CommUnitSendASCII, CatOneEthTxLen * 2); - CommUnitSendASCII[CatOneEthTxLen * 2] = 0; - CAT1_DBG_LOG("Eth Send: %s\r\n", CommUnitSendASCII); - - CatOne.EthStatus = ETH_WAIT_RECV; - CatOne.EthRecvTimeoutCnt = 0; - CatOne.EthSendRetryCnt = 0; - break; - - case ETH_WAIT_RECV: - rt_thread_delay(1); - CatOne.EthRecvTimeoutCnt++; - - if(CatOne.EthRecvTimeoutCnt >= ETH_RECV_TIMEOUT_MAX) { - CAT1_DBG_LOG("ETH Recv Timeout!\r\n"); - CatOne.EthSendRetryCnt++; - if(CatOne.EthSendRetryCnt >= ETH_SEND_RETRY_MAX) { - CAT1_DBG_LOG("ETH Send Retry Max, Reset!\r\n"); - CatOne.EthStatus = ETH_OFF; - } - else { - if(CatOne.GateWay->SvrRegFlag == false) { - CatOne.EthStatus = ETH_REG_SVR; - } - else { - CatOne.EthStatus = ETH_WAIT_SEND; - } - } - } - - if(ETH_LINK_GET() != Reset) { - CAT1_DBG_LOG("ETH Link Lost During Wait!\r\n"); - CatOne.EthStatus = ETH_OFF; - } - - if(CatOne.GateWay->SvrRegFlag == true) { - CAT1_DBG_LOG("ETH Register Success!\r\n"); - CatOne.EthStatus = ETH_WAIT_SEND; - CatOne.EthRecvTimeoutCnt = 0; - CatOne.EthSendRetryCnt = 0; - } - - break; - - case ETH_OFF: - CAT1_DBG_LOG("ETH Power Off!\r\n"); - CatOne.GateWay->SvrRegFlag = false; - //ETH_RESET_CLR(); - //rt_thread_delay(3000); - //ETH_RESET_SET(); - CatOne.EthStatus = ETH_IDEL; - CatOne.EthResetDelayCnt = ETH_RESET_DELAY_TIME_MAX; - break; - - default: - CatOne.EthStatus = ETH_RESET; break; } } @@ -764,70 +552,44 @@ static void CatOneInit(GateWayPara GateWay) CatOne.CatOneRevCallBack = GateWay->SvrRevCallBack; } -void CatOneEthRev_Thread_Entry(void *parameter) +void CatOneRev_Thread_Entry(void *parameter) { rt_err_t result; char RxBuffTemp[CAT_ONE_REV_LEN_MAX]; - uint8_t HexData[CAT_ONE_REV_LEN_MAX / 2]; - + GateWayPara GateWay = (GateWayPara)parameter; - - rt_kprintf("CatOneTthRev Thread is running!\r\n"); - + + rt_kprintf("CatOneRev Thread is running!\r\n"); + while(1) { - if(GateWay->ConfigPara.Comm == CATONE_COMM) { - result = rt_sem_take(CatOneIRQ_Sem, 500); - if(result == RT_EOK) { - memcpy(RxBuffTemp, CatOneEthRxBuff, CatOneEthRxLen); - RxBuffTemp[CatOneEthRxLen] = 0; - CatOneAtCmdAnalyze(RxBuffTemp); - memset(CatOneEthRxBuff, 0x00, CAT_ONE_REV_LEN_MAX); - CatOneEthRxLen = 0; - } - //CatOneEthRxLen = 0; - } - else if(GateWay->ConfigPara.Comm == ETH_COMM) { - result = rt_sem_take(EthIRQ_Sem, 500); - if(result == RT_EOK) { - memcpy(RxBuffTemp, CatOneEthRxBuff, CatOneEthRxLen); - RxBuffTemp[CatOneEthRxLen] = 0; - CAT1_DBG_LOG("Eth Rev: %s\r\n",RxBuffTemp); - memset(HexData, 0x00, CatOneEthRxLen / 2); - uint8_t ret = AsciiToHex(RxBuffTemp, HexData, CatOneEthRxLen); - if(ret > 0) - GateWay->SvrRevCallBack(GateWay, HexData, ret); - memset(CatOneEthRxBuff, 0x00, CAT_ONE_REV_LEN_MAX); - CatOneEthRxLen = 0; - } - //CatOneEthRxLen = 0; + result = rt_sem_take(CatOneIRQ_Sem, 500); + if(result == RT_EOK) { + memcpy(RxBuffTemp, CatOneRxBuff, CatOneRxLen); + RxBuffTemp[CatOneRxLen] = 0; + CatOneAtCmdAnalyze(RxBuffTemp); + memset(CatOneRxBuff, 0x00, CAT_ONE_REV_LEN_MAX); + CatOneRxLen = 0; } } } -void CatOne_Eth_Thread_Entry(void *parameter) +void CatOne_Thread_Entry(void *parameter) { GateWayPara GateWay = (GateWayPara)parameter; - - CatOneRev_Sem = rt_sem_create("cat1r_sem", 0, RT_IPC_FLAG_FIFO); + + CatOneRev_Sem = rt_sem_create("cat1r_sem", 0, RT_IPC_FLAG_FIFO); if(CatOneRev_Sem == RT_NULL) { - rt_kprintf("CatOne Sem Create Failed!\r\n"); + rt_kprintf("CatOneRev Sem Create Failed!\r\n"); } - - EthIRQ_Sem = rt_sem_create("eth_sem", 0, RT_IPC_FLAG_FIFO); - if(EthIRQ_Sem == RT_NULL) { - rt_kprintf("Eth Sem Create Failed!\r\n"); - } - - CatOneIRQ_Sem = rt_sem_create("cat1_sem", 0, RT_IPC_FLAG_FIFO); + + CatOneIRQ_Sem = rt_sem_create("cat1i_sem", 0, RT_IPC_FLAG_FIFO); if(CatOneIRQ_Sem == RT_NULL) { rt_kprintf("CatOneIRQ Sem Create Failed!\r\n"); } - + CatOneInit(GateWay); - ETH_RESET_CLR(); - rt_thread_delay(10); - ETH_RESET_SET(); - Cat1Rev_Thread = rt_thread_create("Cat1Rev", CatOneEthRev_Thread_Entry, parameter, 3000, 3, 20); + + Cat1Rev_Thread = rt_thread_create("Cat1Rev", CatOneRev_Thread_Entry, parameter, 3000, 3, 20); if (Cat1Rev_Thread != RT_NULL) { rt_thread_startup(Cat1Rev_Thread); } @@ -835,44 +597,37 @@ void CatOne_Eth_Thread_Entry(void *parameter) rt_kprintf("CatOneRev Thread Create Failed! Exit...\r\n"); return; } - rt_kprintf("CatOne Thread is running!\r\n"); + rt_kprintf("CatOne Thread is running!\r\n"); while(1) { - //rt_mutex_take(GateWay->UartRevMutex, RT_WAITING_FOREVER); - if(GateWay->ConfigPara.Comm == CATONE_COMM) - CatOneLoopHandler(); - else if(GateWay->ConfigPara.Comm == ETH_COMM) - EthLoopHandler(); - else - rt_thread_delay(1); - //rt_mutex_release(GateWay->UartRevMutex); + if(GateWay->ConfigPara.Comm != CATONE_COMM) { + rt_thread_delay(100); + continue; + } + CatOneLoopHandler(); } } - -void EthOrCat1RxIrqCallback(uint8_t rData) -{ - if(EthRevTimeOutCnt == 0) - CatOneEthRxLen = 0; - - if(CatOneEthRxLen < CAT_ONE_REV_LEN_MAX) { - CatOneEthRxBuff[CatOneEthRxLen++] = rData; - } - - EthRevTimeOutCnt = 3; -} - -void EthRxOverhandler(void) +void Cat1IrqCallback(uint8_t rData) { - if(EthRevTimeOutCnt > 0) - EthRevTimeOutCnt--; + if(Cat1RevTimeOutCnt == 0) + CatOneRxLen = 0; - if(CatOneEthRxLen > 5 && EthRevTimeOutCnt == 0) { - EthRevTimeOutCnt = 20; - if(CatOne.GateWay->ConfigPara.Comm == CATONE_COMM) - rt_sem_release(CatOneIRQ_Sem); - else - rt_sem_release(EthIRQ_Sem); + if(CatOneRxLen < CAT_ONE_REV_LEN_MAX) { + CatOneRxBuff[CatOneRxLen++] = rData; + } + + Cat1RevTimeOutCnt = 3; +} + +void Cat1OverHandler(void) +{ + if(Cat1RevTimeOutCnt > 0) + Cat1RevTimeOutCnt--; + + if(CatOneRxLen > 5 && Cat1RevTimeOutCnt == 0) { + Cat1RevTimeOutCnt = 20; + rt_sem_release(CatOneIRQ_Sem); } } @@ -890,12 +645,7 @@ void CatReadImeiOrSim(char *Imei, char *Sim) void CatOneTriggerRegister(void) { - ETHStop(); - CAT1_ON(); - CatOneReset(); -} - -void ETHTriggerRegister(void) -{ - CatOne.EthStatus = ETH_REG_SVR; + CatOneStop(); + CAT1_ON(); + CatOneReset(); } diff --git a/Project/GateWay/source/User/Src/EthTask.c b/Project/GateWay/source/User/Src/EthTask.c new file mode 100644 index 0000000..11d98fd --- /dev/null +++ b/Project/GateWay/source/User/Src/EthTask.c @@ -0,0 +1,311 @@ +#include "EthTask.h" +#include "Public.h" +#include "DebugCmd.h" + +static rt_sem_t EthIRQ_Sem = RT_NULL; +static rt_thread_t EthRev_Thread = RT_NULL; + +static EthTask_t Eth; + +static char EthRxBuff[ETH_RX_LEN_MAX]; +static uint16_t EthRxLen; +static uint8_t EthRevTimeOutCnt; + +static uint8_t Payload[ETH_RX_LEN_MAX]; +static char CommUnitSendASCII[ETH_RX_LEN_MAX * 2]; + +static bool EthDispEn = false; + +#define ETH_DBG_LOG(...) { if(EthDispEn) Debug_Printf(__VA_ARGS__);} + +void ETHOnOff(bool OnOff) +{ + EthDispEn = OnOff; + if(OnOff) + Debug_Printf("\r\nEth Display Enable!\r\n\r\n"); + else + Debug_Printf("\r\nEth Display Disable!\r\n\r\n"); +} + +void ETHStop(void) +{ + Eth.Status = ETH_OFF; +} + +void ETHReset(void) +{ + Eth.Status = ETH_RESET; +} + +void ETHTriggerRegister(void) +{ + Eth.Status = ETH_REG_SVR; +} + +static int GateWayRegister(uint8_t *TxBuff) +{ + uint16_t UnitCommCnt = 0; + uint8_t *p = &TxBuff[0]; + uint16_t len = 5; + + if(Eth.GateWay->ConfigPara.Rs485Ch1.CommUnitEnable == true && Eth.GateWay->ConfigPara.Rs485Ch1.Enable == true) { + UnitCommCnt++; + memcpy(&p[len], Eth.GateWay->ConfigPara.Rs485Ch1.CUPara.Para.Mac[0], 6); + len += 6; + } + if(Eth.GateWay->ConfigPara.Rs485Ch2.CommUnitEnable == true && Eth.GateWay->ConfigPara.Rs485Ch2.Enable == true) { + UnitCommCnt++; + memcpy(&p[len], Eth.GateWay->ConfigPara.Rs485Ch2.CUPara.Para.Mac[0], 6); + len += 6; + } + for(int i = 0; i < COMMUNIT_NUM_MAX; i++) { + if(Eth.GateWay->ConfigPara.CommUnitArray[i].RegFlag == true) { + for(int j = 0; j < Eth.GateWay->ConfigPara.CommUnitArray[i].SensorN; j++) + { + memcpy(&p[len], Eth.GateWay->ConfigPara.CommUnitArray[i].Mac[j], 6); + len += 6; + UnitCommCnt++; + } + } + } + TxBuff[0] = (len - 3) & 0x00ff; + TxBuff[1] = ((len - 3) >> 8) & 0x00ff; + TxBuff[2] = NET_COMM_CMD_REG; + TxBuff[3] = UnitCommCnt & 0x00ff; + TxBuff[4] = (UnitCommCnt >> 8) & 0x00ff; + return len; +} + +void EthLoopHandler(void) +{ + rt_err_t result; + + switch(Eth.Status) { + case ETH_IDEL: + rt_thread_delay(1); + if(Eth.ResetDelayCnt > 0) { + Eth.ResetDelayCnt--; + } + else { + Eth.Status = ETH_RESET; + } + break; + + case ETH_RESET: + ETH_DBG_LOG("ETH Reset!\r\n"); + ETH_RESET_CLR(); + rt_thread_delay(10); + ETH_RESET_SET(); + rt_thread_delay(2000); + Eth.Status = ETH_WAIT_LINK; + Eth.LinkWaitCnt = 0; + Eth.FirstRegFlag = true; + break; + + case ETH_WAIT_LINK: + if(Eth.LinkWaitCnt == 0) { + ETH_DBG_LOG("ETH Waiting for module ready...\r\n"); + rt_thread_delay(2000); + } + if(ETH_LINK_GET() == Reset) { + ETH_DBG_LOG("ETH Link OK!\r\n"); + if(Eth.GateWay->SvrRegFlag == false) { + Eth.Status = ETH_REG_SVR; + } + else { + Eth.Status = ETH_WAIT_SEND; + } + } + else { + Eth.LinkWaitCnt++; + if(Eth.LinkWaitCnt >= ETH_LINK_WAIT_TIME_MAX) { + ETH_DBG_LOG("ETH Link Timeout, Reset!\r\n"); + Eth.Status = ETH_OFF; + } + rt_thread_delay(1); + } + break; + + case ETH_REG_SVR: + { + if(Eth.FirstRegFlag) { + ETH_DBG_LOG("ETH First Register, waiting for system stable...\r\n"); + rt_thread_delay(ETH_FIRST_REG_DELAY); + Eth.FirstRegFlag = false; + } + + uint8_t ret = GateWayRegister(Eth.TxBuff); + rt_mq_send(Eth.GateWay->NetSendData_MQ, Eth.TxBuff, ret); + ETH_DBG_LOG("ETH Register Server...\r\n"); + Eth.Status = ETH_WAIT_SEND; + Eth.SendRetryCnt = 0; + } + break; + + case ETH_WAIT_SEND: + result = rt_mq_recv(Eth.GateWay->NetSendData_MQ, Payload, ETH_RX_LEN_MAX, 100); + if(result == RT_EOK) { + Eth.TxLen = NetCommOrgData(Eth.GateWay, Payload, Eth.TxBuff); + Eth.Status = ETH_SEND_DATA; + } + else { + if(Eth.Status == ETH_RESET || Eth.Status == ETH_OFF) + return; + if(ETH_LINK_GET() != Reset) { + ETH_DBG_LOG("ETH Link Lost!\r\n"); + Eth.Status = ETH_OFF; + } + else { + rt_thread_delay(1); + } + } + break; + + case ETH_SEND_DATA: + HexToAscii(Eth.TxBuff, CommUnitSendASCII, Eth.TxLen); + EthRevTimeOutCnt = 0; + EthUartSend((uint8_t *)CommUnitSendASCII, Eth.TxLen * 2); + CommUnitSendASCII[Eth.TxLen * 2] = 0; + ETH_DBG_LOG("Eth Send: %s\r\n", CommUnitSendASCII); + + Eth.Status = ETH_WAIT_RECV; + Eth.RecvTimeoutCnt = 0; + Eth.SendRetryCnt = 0; + break; + + case ETH_WAIT_RECV: + rt_thread_delay(1); + Eth.RecvTimeoutCnt++; + + if(Eth.RecvTimeoutCnt >= ETH_RECV_TIMEOUT_MAX) { + ETH_DBG_LOG("ETH Recv Timeout!\r\n"); + Eth.SendRetryCnt++; + if(Eth.SendRetryCnt >= ETH_SEND_RETRY_MAX) { + ETH_DBG_LOG("ETH Send Retry Max, Reset!\r\n"); + Eth.Status = ETH_OFF; + } + else { + if(Eth.GateWay->SvrRegFlag == false) { + Eth.Status = ETH_REG_SVR; + } + else { + Eth.Status = ETH_WAIT_SEND; + } + } + } + + if(ETH_LINK_GET() != Reset) { + ETH_DBG_LOG("ETH Link Lost During Wait!\r\n"); + Eth.Status = ETH_OFF; + } + + if(Eth.GateWay->SvrRegFlag == true) { + ETH_DBG_LOG("ETH Register Success!\r\n"); + Eth.Status = ETH_WAIT_SEND; + Eth.RecvTimeoutCnt = 0; + Eth.SendRetryCnt = 0; + } + + break; + + case ETH_OFF: + ETH_DBG_LOG("ETH Power Off!\r\n"); + Eth.GateWay->SvrRegFlag = false; + Eth.Status = ETH_IDEL; + Eth.ResetDelayCnt = ETH_RESET_DELAY_TIME_MAX; + break; + + default: + Eth.Status = ETH_RESET; + break; + } +} + +static void EthInit(GateWayPara GateWay) +{ + memset(&Eth, 0x00, sizeof(EthTask_t)); + Eth.Status = ETH_RESET; + Eth.GateWay = GateWay; +} + +void EthIrqCallbackHandler(uint8_t rData) +{ + if(EthRevTimeOutCnt == 0) + EthRxLen = 0; + + if(EthRxLen < ETH_RX_LEN_MAX) { + EthRxBuff[EthRxLen++] = rData; + } + + EthRevTimeOutCnt = 3; +} + +void EthOverHandler(void) +{ + if(EthRevTimeOutCnt > 0) + EthRevTimeOutCnt--; + + if(EthRxLen > 5 && EthRevTimeOutCnt == 0) { + EthRevTimeOutCnt = 20; + rt_sem_release(EthIRQ_Sem); + } +} + +static void EthRev_Thread_Entry(void *parameter) +{ + rt_err_t result; + char RxBuffTemp[ETH_RX_LEN_MAX]; + uint8_t HexData[ETH_RX_LEN_MAX / 2]; + + GateWayPara GateWay = (GateWayPara)parameter; + + rt_kprintf("EthRev Thread is running!\r\n"); + + while(1) { + result = rt_sem_take(EthIRQ_Sem, 500); + if(result == RT_EOK) { + memcpy(RxBuffTemp, EthRxBuff, EthRxLen); + RxBuffTemp[EthRxLen] = 0; + ETH_DBG_LOG("Eth Rev: %s\r\n", RxBuffTemp); + memset(HexData, 0x00, EthRxLen / 2); + uint8_t ret = AsciiToHex(RxBuffTemp, HexData, EthRxLen); + if(ret > 0) + GateWay->SvrRevCallBack(GateWay, HexData, ret); + memset(EthRxBuff, 0x00, ETH_RX_LEN_MAX); + EthRxLen = 0; + } + } +} + +void Eth_Thread_Entry(void *parameter) +{ + GateWayPara GateWay = (GateWayPara)parameter; + + EthIRQ_Sem = rt_sem_create("ethi_sem", 0, RT_IPC_FLAG_FIFO); + if(EthIRQ_Sem == RT_NULL) { + rt_kprintf("EthIRQ Sem Create Failed!\r\n"); + } + + EthInit(GateWay); + ETH_RESET_CLR(); + rt_thread_delay(10); + ETH_RESET_SET(); + + EthRev_Thread = rt_thread_create("EthRev", EthRev_Thread_Entry, parameter, 3000, 3, 20); + if (EthRev_Thread != RT_NULL) { + rt_thread_startup(EthRev_Thread); + } + else { + rt_kprintf("EthRev Thread Create Failed! Exit...\r\n"); + return; + } + rt_kprintf("Eth Thread is running!\r\n"); + + while(1) { + if(GateWay->ConfigPara.Comm != ETH_COMM) { + rt_thread_delay(100); + continue; + } + EthLoopHandler(); + } +} diff --git a/Project/GateWay/source/User/Src/LoraTask.c b/Project/GateWay/source/User/Src/LoraTask.c index 05c32d9..f099278 100644 --- a/Project/GateWay/source/User/Src/LoraTask.c +++ b/Project/GateWay/source/User/Src/LoraTask.c @@ -41,7 +41,7 @@ void LoraIRQ_Thread_Entry(void *parameter) rt_err_t result; static uint16_t LoraErrCnt = 0; - Debug_Printf("LoraRev Thread is running!\r\n"); + Debug_Printf("LoraRev Thread is running!\r\n"); while(1) { if(GateWay->ConfigPara.Lora.OnOff == false) { rt_thread_delay(100); @@ -57,7 +57,7 @@ void LoraIRQ_Thread_Entry(void *parameter) LoraErrCnt++; if(LoraErrCnt > LORA_ERR_RESET_DLY_MAX) { //15分钟内没有收到lora数据重启lora模块 LoraErrCnt = 0; - Debug_Printf("Lora Reset!\r\n"); + Debug_Printf("Lora Reset!\r\n"); Sx1276LoRaInit(LoraRevCallBack); } } @@ -97,7 +97,7 @@ void Lora_Thread_Entry(void *parameter) rt_thread_startup(LoraIRQ_Thread); Sx1276LoRaInit(LoraRevCallBack); - Debug_Printf("Lora Thread is running!\r\n"); + Debug_Printf("Lora Thread is running!\r\n"); #ifdef LORA_LOWPOWER while(1) { if(GateWay->ConfigPara.Lora.OnOff == false) { diff --git a/Project/GateWay/source/User/Src/Public.c b/Project/GateWay/source/User/Src/Public.c index da72f67..dcde891 100644 --- a/Project/GateWay/source/User/Src/Public.c +++ b/Project/GateWay/source/User/Src/Public.c @@ -653,7 +653,7 @@ int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData // int16_t Rssi; // int8_t Snr; // SX1276LoCalcRssiSnr(&Rssi, &Snr); - MAIN_DBG_LOG("\r\nCUMac:%02X-%02X-%02X-%02X-%02X-%02X, Bat: %d%, SN: %d,Rssi:%d, Snr:%d\r\n", + MAIN_DBG_LOG("\r\nCUMac:%02X-%02X-%02X-%02X-%02X-%02X, Bat: %d%, SN: %d, Rssi:%d, Snr:%d\r\n", CUHeader->DevMac[0], CUHeader->DevMac[1], CUHeader->DevMac[2], CUHeader->DevMac[3], CUHeader->DevMac[4], CUHeader->DevMac[5], GateWay->ConfigPara.CommUnitArray[CommUnitIdx].BatLevel, GateWay->ConfigPara.CommUnitArray[CommUnitIdx].SensorN, diff --git a/Project/GateWay/source/User/Src/bsp.c b/Project/GateWay/source/User/Src/bsp.c index a4e66a9..0b1dea2 100644 --- a/Project/GateWay/source/User/Src/bsp.c +++ b/Project/GateWay/source/User/Src/bsp.c @@ -209,57 +209,57 @@ static void Xtal32_ClockConfig(void) ****************************************************************************************/ /***************************************************************************************** -* 函数名称: DbgUartRec -* 功能描述: 调试串口接收函数 +* 函数名称: DbgOrCat1UartRec +* 功能描述: 调试和Cat1串口接收函数 * 参 数: 无 * 返 回 值: 返回收到的字符 *****************************************************************************************/ -static uint8_t DbgUartRec(void) +static uint8_t DbgOrCat1UartRec(void) { - uint16_t u16Data = USART_RecData(DBG_USART_CH); + uint16_t u16Data = USART_RecData(DBG_OR_CAT1_USART_CH); return (uint8_t)u16Data; } /***************************************************************************************** -* 函数名称: DBGUsartErrIrqCallback +* 函数名称: DBGOrCat1UsartErrIrqCallback * 功能描述: 调试串口错误中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ -static void DBGUsartErrIrqCallback(void) +static void DBGOrCat1UsartErrIrqCallback(void) { - if(DBG_USART_CH->SR_f.ORE) { - DBG_USART_CH->CR1_f.CORE = 1; - USART_RecData(DBG_USART_CH); + if(DBG_OR_CAT1_USART_CH->SR_f.ORE) { + DBG_OR_CAT1_USART_CH->CR1_f.CORE = 1; + USART_RecData(DBG_OR_CAT1_USART_CH); } - if(DBG_USART_CH->SR_f.PE) - DBG_USART_CH->CR1_f.CPE = 1; + if(DBG_OR_CAT1_USART_CH->SR_f.PE) + DBG_OR_CAT1_USART_CH->CR1_f.CPE = 1; - if(DBG_USART_CH->SR_f.FE) - DBG_USART_CH->CR1_f.CFE = 1; + if(DBG_OR_CAT1_USART_CH->SR_f.FE) + DBG_OR_CAT1_USART_CH->CR1_f.CFE = 1; } /***************************************************************************************** -* 函数名称: DbgUsartRxIrqCallback -* 功能描述: 调试串口接收中断回调函数 +* 函数名称: DbgOrCatUsartRxIrqCallback +* 功能描述: 调试和Cat1串口接收中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ -static void DbgUsartRxIrqCallback(void) +static void DbgOrCat1UsartRxIrqCallback(void) { - uint8_t rData = DbgUartRec(); - DbgRxIrqCallback(rData); + uint8_t rData = DbgOrCat1UartRec(); + DbgOrCat1RxIrqCallback(rData); } /***************************************************************************************** -* 函数名称: DbgUart_Config -* 功能描述: 调试串口配置函数 +* 函数名称: DbgOrCat1Uart_Config +* 功能描述: 调试和cat1串口配置函数 * 参 数: BaudRate 串口波特率 * 返 回 值: 无 *****************************************************************************************/ -void DbgUart_Config(uint32_t BaudRate) +void DbgOrCat1Uart_Config(uint32_t BaudRate) { stc_usart_uart_init_t stcInitCfg; stc_irq_regi_conf_t stcIrqRegiCfg; @@ -269,8 +269,8 @@ void DbgUart_Config(uint32_t BaudRate) MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinOType = Pin_OType_Cmos; - PORT_Init(DBG_USART_RX_PORT, DBG_USART_RX_PIN, &stcPortInit); - PORT_Init(DBG_USART_TX_PORT, DBG_USART_TX_PIN, &stcPortInit); + PORT_Init(DBG_OR_CAT1_USART_RX_PORT, DBG_OR_CAT1_USART_RX_PIN, &stcPortInit); + PORT_Init(DBG_OR_CAT1_USART_TX_PORT, DBG_OR_CAT1_USART_TX_PIN, &stcPortInit); stcInitCfg.enClkMode = UsartIntClkCkNoOutput; stcInitCfg.enClkDiv = UsartClkDiv_1; @@ -282,35 +282,35 @@ void DbgUart_Config(uint32_t BaudRate) stcInitCfg.enDetectMode = UsartStartBitFallEdge; stcInitCfg.enHwFlow = UsartRtsEnable; - PWC_Fcg1PeriphClockCmd(DBG_FCG1_PERIPH, Enable); + PWC_Fcg1PeriphClockCmd(DBG_OR_CAT1_FCG1_PERIPH, Enable); - PORT_SetFunc(DBG_USART_RX_PORT, DBG_USART_RX_PIN, DBG_USART_RX_FUNC, Disable); - PORT_SetFunc(DBG_USART_TX_PORT, DBG_USART_TX_PIN, DBG_USART_TX_FUNC, Disable); + PORT_SetFunc(DBG_OR_CAT1_USART_RX_PORT, DBG_OR_CAT1_USART_RX_PIN, DBG_OR_CAT1_USART_RX_FUNC, Disable); + PORT_SetFunc(DBG_OR_CAT1_USART_TX_PORT, DBG_OR_CAT1_USART_TX_PIN, DBG_OR_CAT1_USART_TX_FUNC, Disable); - enRet = USART_UART_Init(DBG_USART_CH, &stcInitCfg); + enRet = USART_UART_Init(DBG_OR_CAT1_USART_CH, &stcInitCfg); if(enRet != Ok) { Error_Handler(); } - enRet = USART_SetBaudrate(DBG_USART_CH, BaudRate); + enRet = USART_SetBaudrate(DBG_OR_CAT1_USART_CH, BaudRate); if(enRet != Ok) { Error_Handler(); } - stcIrqRegiCfg.enIRQn = DBGUART_IRQn; - stcIrqRegiCfg.pfnCallback = &DbgUsartRxIrqCallback; - stcIrqRegiCfg.enIntSrc = DBG_USART_RI_NUM; + stcIrqRegiCfg.enIRQn = DBG_OR_CAT1_UART_IRQn; + stcIrqRegiCfg.pfnCallback = &DbgOrCat1UsartRxIrqCallback; + stcIrqRegiCfg.enIntSrc = DBG_OR_CAT1_USART_RI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /* Set USART RX error IRQ */ - stcIrqRegiCfg.enIRQn = DBGUART_EI_IRQn; - stcIrqRegiCfg.pfnCallback = &DBGUsartErrIrqCallback; - stcIrqRegiCfg.enIntSrc = DBG_USART_EI_NUM; + stcIrqRegiCfg.enIRQn = DBG_OR_CAT1_UART_EI_IRQn; + stcIrqRegiCfg.pfnCallback = &DBGOrCat1UsartErrIrqCallback; + stcIrqRegiCfg.enIntSrc = DBG_OR_CAT1_USART_EI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); @@ -320,7 +320,7 @@ void DbgUart_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); @@ -329,27 +329,27 @@ void DbgUart_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TCI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #endif - USART_FuncCmd(DBG_USART_CH, UsartTx, Enable); - USART_FuncCmd(DBG_USART_CH, UsartRx, Enable); - USART_FuncCmd(DBG_USART_CH, UsartRxInt, Enable); + USART_FuncCmd(DBG_OR_CAT1_USART_CH, UsartTx, Enable); + USART_FuncCmd(DBG_OR_CAT1_USART_CH, UsartRx, Enable); + USART_FuncCmd(DBG_OR_CAT1_USART_CH, UsartRxInt, Enable); } /***************************************************************************************** -* 函数名称: DebugUartSend -* 功能描述: 调试串口发送函数 +* 函数名称: DebugOrCat1UartSend +* 功能描述: 调试和Cat1串口发送函数 * 参 数: sData 发送数据入口指针 sLen 发送数据长度 * 返 回 值: 无 *****************************************************************************************/ -void DebugUartSend(uint8_t *sData, uint16_t sLen) +void DebugOrCat1UartSend(uint8_t *sData, uint16_t sLen) { for(int i = 0; i < sLen; i++) { - USART_SendData(DBG_USART_CH, sData[i]); - while(USART_GetStatus(DBG_USART_CH, UsartTxComplete) == Reset); + USART_SendData(DBG_OR_CAT1_USART_CH, sData[i]); + while(USART_GetStatus(DBG_OR_CAT1_USART_CH, UsartTxComplete) == Reset); } } @@ -450,7 +450,7 @@ void RS485Ch1_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &RS485Ch1UsartRxIrqCallback; stcIrqRegiCfg.enIntSrc = RS485_CH1_USART_RI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); @@ -460,7 +460,7 @@ void RS485Ch1_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &RS485Ch1UsartErrIrqCallback; stcIrqRegiCfg.enIntSrc = RS485_CH1_USART_EI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); @@ -470,7 +470,7 @@ void RS485Ch1_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); @@ -479,7 +479,7 @@ void RS485Ch1_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TCI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #endif @@ -600,7 +600,7 @@ void RS485Ch2_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &RS485Ch2UsartRxIrqCallback; stcIrqRegiCfg.enIntSrc = RS485_CH2_USART_RI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); @@ -610,7 +610,7 @@ void RS485Ch2_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &RS485Ch2UsartErrIrqCallback; stcIrqRegiCfg.enIntSrc = RS485_CH2_USART_EI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); @@ -620,7 +620,7 @@ void RS485Ch2_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); @@ -629,7 +629,7 @@ void RS485Ch2_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TCI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #endif @@ -662,57 +662,57 @@ void RS485Ch2UartSend(uint8_t *sData, uint16_t sLen) ****************************************************************************************/ /***************************************************************************************** -* 函数名称: EthOrCat1UartRec -* 功能描述: cat1和eth串口接收函数 +* 函数名称: EthUartRec +* 功能描述: eth串口接收函数 * 参 数: 无 * 返 回 值: 返回收到的字符 *****************************************************************************************/ -static uint8_t EthOrCat1UartRec(void) +static uint8_t EthUartRec(void) { - uint16_t u16Data = USART_RecData(ETH_OR_CAT1_USART_CH); + uint16_t u16Data = USART_RecData(ETH_USART_CH); return (uint8_t)u16Data; } /***************************************************************************************** -* 函数名称: RS485Ch1UsartErrIrqCallback -* 功能描述: cat1和eth串口错误中断回调函数 +* 函数名称: EthUsartErrIrqCallback +* 功能描述: eth串口错误中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ -static void EthOrCat1UsartErrIrqCallback(void) +static void EthUsartErrIrqCallback(void) { - if(ETH_OR_CAT1_USART_CH->SR_f.ORE) { - ETH_OR_CAT1_USART_CH->CR1_f.CORE = 1; - USART_RecData(ETH_OR_CAT1_USART_CH); + if(ETH_USART_CH->SR_f.ORE) { + ETH_USART_CH->CR1_f.CORE = 1; + USART_RecData(ETH_USART_CH); } - if(ETH_OR_CAT1_USART_CH->SR_f.PE) - ETH_OR_CAT1_USART_CH->CR1_f.CPE = 1; + if(ETH_USART_CH->SR_f.PE) + ETH_USART_CH->CR1_f.CPE = 1; - if(ETH_OR_CAT1_USART_CH->SR_f.FE) - ETH_OR_CAT1_USART_CH->CR1_f.CFE = 1; + if(ETH_USART_CH->SR_f.FE) + ETH_USART_CH->CR1_f.CFE = 1; } /***************************************************************************************** -* 函数名称: RS485Ch1UsartRxIrqCallback -* 功能描述: cat1和eth串口接收中断回调函数 +* 函数名称: EthUsartRxIrqCallback +* 功能描述: eth串口接收中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ -static void EthOrCat1UsartRxIrqCallback(void) +static void EthUsartRxIrqCallback(void) { - uint8_t rData =EthOrCat1UartRec(); - EthOrCat1RxIrqCallback(rData); + uint8_t rData =EthUartRec(); + EthIrqCallbackHandler(rData); } /***************************************************************************************** -* 函数名称: RS485Ch1_Config -* 功能描述: cat1和eth串口配置函数 +* 函数名称: Eth_Config +* 功能描述: eth串口配置函数 * 参 数: BaudRate 串口波特率 * 返 回 值: 无 *****************************************************************************************/ -void EthOrCat1_Config(uint32_t BaudRate) +void Eth_Config(uint32_t BaudRate) { stc_usart_uart_init_t stcInitCfg; stc_irq_regi_conf_t stcIrqRegiCfg; @@ -722,8 +722,8 @@ void EthOrCat1_Config(uint32_t BaudRate) MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinOType = Pin_OType_Cmos; - PORT_Init(ETH_OR_CAT1_USART_RX_PORT, ETH_OR_CAT1_USART_RX_PIN, &stcPortInit); - PORT_Init(ETH_OR_CAT1_USART_TX_PORT, ETH_OR_CAT1_USART_TX_PIN, &stcPortInit); + PORT_Init(ETH_USART_RX_PORT, ETH_USART_RX_PIN, &stcPortInit); + PORT_Init(ETH_USART_TX_PORT, ETH_USART_TX_PIN, &stcPortInit); stcInitCfg.enClkMode = UsartIntClkCkNoOutput; stcInitCfg.enClkDiv = UsartClkDiv_1; @@ -735,35 +735,35 @@ void EthOrCat1_Config(uint32_t BaudRate) stcInitCfg.enDetectMode = UsartStartBitFallEdge; stcInitCfg.enHwFlow = UsartRtsEnable; - PWC_Fcg1PeriphClockCmd(ETH_OR_CAT1_FCG1_PERIPH, Enable); + PWC_Fcg1PeriphClockCmd(ETH_FCG1_PERIPH, Enable); - PORT_SetFunc(ETH_OR_CAT1_USART_RX_PORT, ETH_OR_CAT1_USART_RX_PIN, ETH_OR_CAT1_USART_RX_FUNC, Disable); - PORT_SetFunc(ETH_OR_CAT1_USART_TX_PORT, ETH_OR_CAT1_USART_TX_PIN, ETH_OR_CAT1_USART_TX_FUNC, Disable); + PORT_SetFunc(ETH_USART_RX_PORT, ETH_USART_RX_PIN, ETH_USART_RX_FUNC, Disable); + PORT_SetFunc(ETH_USART_TX_PORT, ETH_USART_TX_PIN, ETH_USART_TX_FUNC, Disable); - enRet = USART_UART_Init(ETH_OR_CAT1_USART_CH, &stcInitCfg); + enRet = USART_UART_Init(ETH_USART_CH, &stcInitCfg); if(enRet != Ok) { Error_Handler(); } - enRet = USART_SetBaudrate(ETH_OR_CAT1_USART_CH, BaudRate); + enRet = USART_SetBaudrate(ETH_USART_CH, BaudRate); if(enRet != Ok) { Error_Handler(); } - stcIrqRegiCfg.enIRQn = ETH_OR_CAT1_UART_IRQn; - stcIrqRegiCfg.pfnCallback = &EthOrCat1UsartRxIrqCallback; - stcIrqRegiCfg.enIntSrc = ETH_OR_CAT1_USART_RI_NUM; + stcIrqRegiCfg.enIRQn = ETH_UART_IRQn; + stcIrqRegiCfg.pfnCallback = &EthUsartRxIrqCallback; + stcIrqRegiCfg.enIntSrc = ETH_USART_RI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /* Set USART RX error IRQ */ - stcIrqRegiCfg.enIRQn = ETH_OR_CAT1_UART_EI_IRQn; - stcIrqRegiCfg.pfnCallback = &EthOrCat1UsartErrIrqCallback; - stcIrqRegiCfg.enIntSrc = ETH_OR_CAT1_USART_EI_NUM; + stcIrqRegiCfg.enIRQn = ETH_UART_EI_IRQn; + stcIrqRegiCfg.pfnCallback = &EthUsartErrIrqCallback; + stcIrqRegiCfg.enIntSrc = ETH_USART_EI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); @@ -773,7 +773,7 @@ void EthOrCat1_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); @@ -782,27 +782,27 @@ void EthOrCat1_Config(uint32_t BaudRate) stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TCI_NUM; enIrqRegistration(&stcIrqRegiCfg); - NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); + NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #endif - USART_FuncCmd(ETH_OR_CAT1_USART_CH, UsartTx, Enable); - USART_FuncCmd(ETH_OR_CAT1_USART_CH, UsartRx, Enable); - USART_FuncCmd(ETH_OR_CAT1_USART_CH, UsartRxInt, Enable); + USART_FuncCmd(ETH_USART_CH, UsartTx, Enable); + USART_FuncCmd(ETH_USART_CH, UsartRx, Enable); + USART_FuncCmd(ETH_USART_CH, UsartRxInt, Enable); } /***************************************************************************************** -* 函数名称: EthOrCat1UartSend -* 功能描述: cat1和eth串口发送函数 +* 函数名称: EthUartSend +* 功能描述: eth串口发送函数 * 参 数: sData 发送数据入口指针 sLen 发送数据长度 * 返 回 值: 无 *****************************************************************************************/ -void EthOrCat1UartSend(uint8_t *sData, uint16_t sLen) +void EthUartSend(uint8_t *sData, uint16_t sLen) { for(int i = 0; i < sLen; i++) { - USART_SendData(ETH_OR_CAT1_USART_CH, sData[i]); - while(USART_GetStatus(ETH_OR_CAT1_USART_CH, UsartTxComplete) == Reset); + USART_SendData(ETH_USART_CH, sData[i]); + while(USART_GetStatus(ETH_USART_CH, UsartTxComplete) == Reset); } } @@ -859,25 +859,24 @@ static void GPIO_Config(void) // PORT_Init(RS485_CH1_VOL_CTRL_PORT, RS485_CH1_VOL_CTRL_PIN, &stcPortInit); // RS485_CH1_VOL_5V(); - + PORT_Init(RS485_CH2_CTRL_PORT, RS485_CH2_CTRL_PIN, &stcPortInit); RS485_CH2_RX(); PORT_Init(RS485_CH2_POW_PORT, RS485_CH2_POW_PIN, &stcPortInit); RS485_CH2_POW_OFF(); - + // PORT_Init(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN, &stcPortInit); // RS485_CH1_VOL_5V(); - - PORT_Init(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN, &stcPortInit); -// PORT_Init(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN, &stcPortInit); - ETH_ON(); - + PORT_Init(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN, &stcPortInit); CAT1_PWR_KEY_SET(); PORT_Init(CAT1_RESET_PORT, CAT1_RESET_PIN, &stcPortInit); CAT1_RESET_CLR(); + +// PORT_Init(CAT1_WAKEUP_PORT, CAT1_WAKEUP_PIN, &stcPortInit); +// CAT1_WAKEUP_SET(); // PORT_Init(CAT1_POW_PORT, CAT1_POW_PIN, &stcPortInit); // CAT1_POW_OFF(); @@ -911,7 +910,12 @@ static void GPIO_Config(void) PORT_Init(LORA_POW_PORT, LORA_POW_PIN, &stcPortInit); LORA_POW_OFF(); - + + //stcPortInit.enPullUp = Enable; + PORT_Init(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN, &stcPortInit); + DBG_ON(); + + stcPortInit.enPullUp = Enable; stcPortInit.enPinMode = Pin_Mode_In; PORT_Init(ETH_LINK_PORT, ETH_LINK_PIN, &stcPortInit); @@ -1194,7 +1198,7 @@ static void Rtc_Config(void) // stcIrqRegiConf.pfnCallback = &RtcPeriod_IrqCallback; // enIrqRegistration(&stcIrqRegiConf); // NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); -// NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); +// NVIC_SetPriority(stcIrqRegiConf.enIRQn, ETH_USART_TCI_NUM); // NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); // enIntWakeupEnable(RtcPeriodWU); // /* Enable period interrupt */ @@ -1652,7 +1656,7 @@ int dev_boot_write_param(boot_para_t Param) // PWC_ClkRecover(); // //SystemClockConfig(); // Spi_Config(); -// DbgUart_Config(500000); +// DbgOrCat1Uart_Config(115200); // //GPIO_Config(); // //SysTick_Resume(); // SysTick_Init(1000); @@ -1710,8 +1714,8 @@ void BSP_Init(void) SystemClockConfig(); Xtal32_ClockConfig(); - DbgUart_Config(500000); - EthOrCat1_Config(115200); + DbgOrCat1Uart_Config(500000); + Eth_Config(115200); // RS485Ch1_Config(9600); // RS485Ch2_Config(9600); #if USE_SD_CARD @@ -1745,12 +1749,12 @@ __weak void LoraTxRxIrqCallback(void) } /***************************************************************************************** -* 函数名称: DbgRxIrqCallback +* 函数名称: DbgOrCat1RxIrqCallback * 功能描述: 调试串口接收中断外部重定向回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ -__weak void DbgRxIrqCallback(uint8_t rData) +__weak void DbgOrCat1RxIrqCallback(uint8_t rData) { } @@ -1778,12 +1782,34 @@ __weak void RS485Ch2RxIrqCallback(uint8_t rData) } /***************************************************************************************** -* 函数名称: EthOrCat1RxIrqCallback -* 功能描述: Eth和Cat1串口接收中断外部重定向回调函数 +* 函数名称: Cat1IrqCallback +* 功能描述: Cat1串口接收中断外部重定向回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ -__weak void EthOrCat1RxIrqCallback(uint8_t rData) +__weak void Cat1IrqCallback(uint8_t rData) +{ + +} + +/***************************************************************************************** +* 函数名称: Cat1OverHandler +* 功能描述: Cat1串口接收超时回调 +* 参 数: 无 +* 返 回 值: 无 +*****************************************************************************************/ +__weak void Cat1OverHandler(void) +{ + +} + +/***************************************************************************************** +* 函数名称: EthIrqCallbackHandler +* 功能描述: Eth串口接收中断外部重定向回调函数 +* 参 数: 无 +* 返 回 值: 无 +*****************************************************************************************/ +__weak void EthIrqCallbackHandler(uint8_t rData) { } diff --git a/Project/GateWay/source/User/Src/main.c b/Project/GateWay/source/User/Src/main.c index cd7f46b..7dc1a94 100644 --- a/Project/GateWay/source/User/Src/main.c +++ b/Project/GateWay/source/User/Src/main.c @@ -2,8 +2,8 @@ #include #include "main.h" #include "CatOneTask.h" +#include "EthTask.h" #include "LoraTask.h" -#include "CatOneTask.h" #include "RS485Task.h" #include "DebugCmd.h" #include "spiflash.h" @@ -34,7 +34,8 @@ static const uint8_t GateWayMac_BL10[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x0A}; bool MainDispEn = true; static rt_thread_t Lora_Thread = RT_NULL; -static rt_thread_t Cat1Eth_Thread = RT_NULL; +static rt_thread_t Cat1_Thread = RT_NULL; +static rt_thread_t Eth_Thread = RT_NULL; static rt_thread_t RS485Ch1_Thread = RT_NULL; static rt_thread_t RS485Ch2_Thread = RT_NULL; static rt_thread_t Debug_Thread = RT_NULL; @@ -92,35 +93,6 @@ void SDCardTest(void) } #endif -void InfTest(void) -{ - uint8_t sData[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}; - RS485_CH1_RX(); - RS485_CH1_POW_ON(); - rt_thread_delay(100); - RS485_CH1_POW_OFF(); - - RS485_CH2_POW_ON(); - rt_thread_delay(100); - RS485_CH2_POW_OFF(); - - POWER_LED_OFF(); - POWER_LED_ON(); - LORA_RX_LED_SET(); - LORA_RX_LED_CLR(); - RS485_CH1_TX(); - RS485_CH2_RX(); - RS485Ch1_Config(500000); - RS485Ch2_Config(500000); - RS485Ch1UartSend(sData, 10); - rt_thread_delay(100); - - RS485_CH2_TX(); - RS485_CH1_RX(); - RS485Ch2UartSend(sData, 10); - rt_thread_delay(100); -// SDCardTest(); -} void GateWayInit(void) { @@ -186,8 +158,7 @@ void GateWayInit(void) #if MAC_ADDR_TYPE == 0 memcpy(GateWay.ConfigPara.GwMac, GateWayMac_Test, 6); -// GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1; - GateWay.ConfigPara.DebugChannel = DEBUG_CH_DBG; + GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1; #elif MAC_ADDR_TYPE == 1 memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL1, 6); GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1; @@ -318,12 +289,14 @@ void GateWayInit(void) else rt_kprintf("History Num: 0\r\n"); if(GateWay.ConfigPara.Comm == CATONE_COMM) { + DbgOrCat1Uart_Config(115200); CAT1_ON(); } else { + DBG_ON(); ETH_ON(); - rt_thread_delay(1000); - ETHReset(); + rt_thread_delay(1000); + ETHReset(); } } @@ -418,9 +391,15 @@ int main(void) else return -1; - Cat1Eth_Thread = rt_thread_create("Cat1Eth", CatOne_Eth_Thread_Entry, &GateWay, 4096, 3, 20); - if (Cat1Eth_Thread != RT_NULL) - rt_thread_startup(Cat1Eth_Thread); + Cat1_Thread = rt_thread_create("Cat1", CatOne_Thread_Entry, &GateWay, 4096, 3, 20); + if (Cat1_Thread != RT_NULL) + rt_thread_startup(Cat1_Thread); + else + return -1; + + Eth_Thread = rt_thread_create("Eth", Eth_Thread_Entry, &GateWay, 4096, 3, 20); + if (Eth_Thread != RT_NULL) + rt_thread_startup(Eth_Thread); else return -1; @@ -437,9 +416,9 @@ int main(void) POWER_LED_OFF(); } } - EthRxOverhandler(); + EthOverHandler(); RS485RxOverhandler(); - DebugRxOverhandler(); + DebugOrCat1RxOverhandler(); if(OneSecondDlyCnt % 200 == 0) { FeedDog(); LORA_RX_TOGGLE();