From 9bb88037ae08b3a1d1bcc155bfbe0665f3a899e2 Mon Sep 17 00:00:00 2001
From: QuakeGod <QuakeGod@sina.com>
Date: 星期一, 17 十月 2022 03:20:54 +0800
Subject: [PATCH] Merge branch 'dev1' of file://hasee-k680e/GitBase/F030C8xx_KLink into dev1

---
 Src/KBus.c |  214 ++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 184 insertions(+), 30 deletions(-)

diff --git a/Src/KBus.c b/Src/KBus.c
index a8d6d21..cc34e0f 100644
--- a/Src/KBus.c
+++ b/Src/KBus.c
@@ -7,8 +7,9 @@
 #include "KBus.h"
 #include "functions.h"
 #include "string.h"
+#include "stm32f0xx.h"
 
-int bMaster=0,bSlave=0;
+unsigned char bKBusMaster=0,bKBusSlave=0,bKBusRepeater=0;;
 
 unsigned char PacketBuf1[128];
 unsigned char PacketBuf2[128];
@@ -16,25 +17,35 @@
 unsigned char BufferIn[16]={0};
 unsigned char BufferOut[16]={0};
 
-stChnStat ChnStats[8];
+stChnStat ChnStats[9];
 unsigned char nAddr=0;
 unsigned char nChilds;
 int ChildStat[16];
 unsigned char nCurPollId=0;
 unsigned char nSeq=0;
 
-volatile int MasterRecved=1;
-volatile int MasterRecvOK=1;
+volatile unsigned char MasterRecved=1;
+volatile unsigned char MasterRecvOK=1;
 
-volatile int SlaveRecved=1;
+volatile unsigned char SlaveRecved=1;
 unsigned int SendTimeuS=0;
 volatile int RecvTimeuS=0;
 
 int DelayuS=0;
 int MaxDelayuS=0;
 int ThisuS;
-
 volatile unsigned int nSlaveTick=0;
+
+int Clk3=0;
+int SendTime,Latancy,LatancyClk,SendClk;	
+
+volatile int nCount2=0;
+int TimeOutCount=0;
+int LastCircleStartTime=0;
+int CircleTime=0;
+
+unsigned char Datas[128];		
+volatile int PacketLength = 0;
 
 unsigned char BCC(void * pData, int nSize)
 {
@@ -46,6 +57,7 @@
 	}
 	return k;	
 }
+
 int MakePacket(pPacket p1,unsigned char src, uchar dst, uchar nType,unsigned char nSEQ, unsigned char DataLen,void * pData )
 {
 	p1->Sign=StartSign;
@@ -152,7 +164,7 @@
 	return PacketLenth;
 }
 
-int CheckPacket(pPacket p1,int nLen1)
+int CheckPacket(int nChn, pPacket p1, int nLen1)
 {
 	if (p1->Sign != StartSign)
 	{
@@ -191,7 +203,7 @@
 	return 0;
 }
 
-int SlaveCheckPacket(pPacket p1,int nLen1)
+int SlaveCheckPacket(int nChn, pPacket p1, int nLen1)
 {
 	if (p1->Sign != StartSign)
 	{
@@ -230,7 +242,7 @@
 	return 0;
 }
 
-int MasterParsePacket(pPacket p1,int Len1)
+int MasterParsePacket(int nChn, pPacket p1, int Len1)
 {
 
 		int DataLen=p1->PacketLen;
@@ -248,7 +260,7 @@
 			case cmdPing:
 				BufferIn[ChildId]=p1->data[0];
 				PacketLen=MakePacket(p2,0,nCurPollId,cmdPingReply,p1->nSEQ,DataLen,p1->data);
-				SendPacket2(p2,PacketLen);
+				SendPacket(nChn, p2, PacketLen);
 				break;
 			case cmdPingReply:
 				DelayuS=ThisuS-SendTimeuS;
@@ -283,18 +295,28 @@
 				//memcpy(DispBuf,p1->data+2,8);
 				p1->data[0]=BufferOut[0];
 				PacketLen=MakePacket(p2,nAddr,0,cmdExChgDataReply,p1->nSEQ,DataLen,p1->data);
-				SendPacket2(p2,PacketLen);
+				SendPacket(nChn, p2, PacketLen);
 				break;
 			case cmdExChgDataReply:
 				DelayuS=ThisuS-SendTimeuS;
 				if (DelayuS > MaxDelayuS) MaxDelayuS = DelayuS;
-				
+
+#if (BOARD_TYPE == 14)				
+				BufferIn[ChildId]=p1->data[0];
+				KMem.WXB[ChildId-1]=BufferIn[ChildId];
+				if (KMRunStat.WorkMode==0) {	
+				//	KMem.WY[0]= KMem.WX[1]+(KMem.WX[2]<<8)	;
+				//	PutOutput (KMem.WY[0]);
+				}
+#else
 				BufferIn[ChildId]=p1->data[0];
 				KMem.WX[ChildId]=BufferIn[ChildId];
 				if (KMRunStat.WorkMode==0) {	
 					KMem.WY[0]= KMem.WX[1]+(KMem.WX[2]<<8)	;
 					PutOutput (KMem.WY[0]);
 				}
+#endif
+
 				//RunStat=100;
 				ChnStats[nCurPollId].CtnLstPkts=0;
 				ChnStats[nCurPollId].Delay=DelayuS;
@@ -321,7 +343,7 @@
 	return 0;
 }
 unsigned char nClientDataIndex=0;
-int SlaveParsePacket(pPacket p1,int Len1)
+int SlaveParsePacket(int nChn, pPacket p1, int Len1)
 {
 	Uart2Stat.OKPacket++;				
 	int DataLen=p1->PacketLen;	
@@ -355,7 +377,7 @@
 				RecvTimeuS=ThisuS;
 				PacketLen=MakePacket(p2,nAddr,0,cmdPingReply,p1->nSEQ,DataLen,p1->data);
 				ChnStats[0].ClientSendPkts++;
-				SendPacket2(p2,PacketLen);
+				SendPacket(nChn, p2, PacketLen);
 				break;
 			case cmdPingReply:
 				break;
@@ -367,7 +389,7 @@
 				//memcpy(DispBuf,p1->data,DataLen);
 				PacketLen=MakePacket(p2,1,0,cmdWriteReply,p1->nSEQ,0,0);
 				ChnStats[0].ClientSendPkts++;
-				SendPacket2(p2,PacketLen);					
+				SendPacket(nChn, p2, PacketLen);					
 				break;
 			case cmdWriteReply:
 				break;
@@ -377,21 +399,24 @@
 				break;
 			case cmdExChgData:
 				BufferIn[0]=p1->data[0];
-				PutOutput(BufferIn[0]);
-				PutOutput(BufferIn[0]);
 				nSlaveTick=p1->data[4]+(p1->data[5]<<8);//+(p1->data[6]<<16)+(p1->data[7]<<24);
-
+#if (BOARD_TYPE == 14)
+			//	PutOutput(BufferIn[0]);
 				//PutOutput(outputvalue);
 				//memcpy(DispBuf,p1->data+2,8);
 				nIndex=nClientDataIndex;
 		//		ChnStats[0].ClientDatas[7]++;
 //				BufferOut[0]=GetInput();
-//				BufferOut[0]=GetInput();
-//				BufferOut[0]=GetInput();
-//				BufferOut[0]=GetInput();
+		//		BufferOut[0]=GetInput();
+#else
+				PutOutput(BufferIn[0]);
+				//PutOutput(outputvalue);
+				//memcpy(DispBuf,p1->data+2,8);
+				nIndex=nClientDataIndex;
+		//		ChnStats[0].ClientDatas[7]++;
 //				BufferOut[0]=GetInput();
 				BufferOut[0]=GetInput();
-			
+#endif
 				p1->data[0]=BufferOut[0];
 				p1->data[3]=nIndex;
 				p1->data[4]=ChnStats[0].ClientDatas[nIndex];
@@ -402,7 +427,7 @@
 				if (nClientDataIndex >= 10) { nClientDataIndex=0;}
 				PacketLen=MakePacket(p2,nAddr,0,cmdExChgDataReply,p1->nSEQ,DataLen,p1->data);
 				ChnStats[0].ClientSendPkts++;
-				SendPacket2(p2,PacketLen);
+				SendPacket(nChn, p2, PacketLen);
 				break;
 			case cmdExChgDataReply:
 				break;
@@ -423,32 +448,32 @@
 	}	
 	return 0;
 }
-int ParsePacket(pPacket p1,int Len1)
+int ParsePacket(int nChn, pPacket p1, int Len1)
 {
 	ThisuS=GetuS();
 	int Result=0;
-	if (bMaster)
+	if (bKBusMaster)
 	{
 			MasterRecved=1;
-			Result=CheckPacket(p1,Len1);
+			Result=CheckPacket(nChn, p1, Len1);
 			if (Result != S_OK)
 			{
 				return Result;
 			}
 			MasterRecvOK=1;
-			Result=MasterParsePacket(p1,Len1);			
+			Result=MasterParsePacket(nChn, p1, Len1);			
 			return Result;
 	}
-	if (bSlave)
+	if (bKBusSlave)
 	{
 			ChnStats[0].ClientRecvPkts++;
-			Result=SlaveCheckPacket(p1,Len1);
+			Result=SlaveCheckPacket(nChn, p1, Len1);
 			if (Result != S_OK)
 			{
 				return Result;
 			}
 			ChnStats[0].ClientTimeOutErr=KMem.RunStat;
-			Result=SlaveParsePacket(p1,Len1);
+			Result=SlaveParsePacket(nChn, p1, Len1);
 			return Result;
 	}
 	//int len1=p1->PacketLen;
@@ -499,3 +524,132 @@
 	return S_OK;
 }
 
+int KBusRepeaterFunc(int nChn)
+{
+		KMem.WY[0]=KMem.WX[0];
+		if ((KMem.nRunCount &0x7f) == 88) 
+		{ 
+			nCount2++;	
+			ToggleRunLed();
+//		int len1=sprintf(str1,"%d %d Cfg %02X  Input %02X  \r\n",nCount,nCount2,EffJumperSW,MyKeyStat1);
+//		PutStr(str1,len1);
+		}				
+	return 0;
+}
+
+int KBusMasterFunc(int nChn)
+{
+	uint32_t tick1=HAL_GetTick();
+	uint32_t thisuS=GetuS();
+
+		int len1=0;
+
+		if ((MasterRecved && MasterRecvOK && thisuS-SendTimeuS>50) || thisuS-SendTimeuS>1000u)
+		{
+			if (!MasterRecvOK) 
+			{
+				TimeOutCount++;
+				Uart2Stat.TimeOutErr++; 
+				ChnStats[nCurPollId].LostPackets++;
+				ChnStats[nCurPollId].CtnLstPkts++;
+				if (!MasterRecved) {ChnStats[nCurPollId].TimeOutErr++;}
+				if (ChnStats[nCurPollId].CtnLstPkts>ChnStats[nCurPollId].MaxCtnLstPkts)
+				{ChnStats[nCurPollId].MaxCtnLstPkts=ChnStats[nCurPollId].CtnLstPkts;}
+				if (ChnStats[nCurPollId].CtnLstPkts>3)
+				{
+					ChnStats[nCurPollId].Stat=0;
+					KMem.ErrStat=200;
+					 
+					{BufferIn[nCurPollId]=0;}
+				}
+			//	LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_7);
+			}else
+			{
+				ChnStats[nCurPollId].Stat=1;
+				
+				KMem.RunStat=100;
+			}
+			nCurPollId ++;
+			if (nCurPollId > nChilds)
+			{
+				CircleTime=thisuS-LastCircleStartTime;
+				LastCircleStartTime=thisuS;
+				nSeq++;
+				nCurPollId=1;
+			}
+#if (BOARD_TYPE == 14)
+			if (KMRunStat.WorkMode==0)
+			{
+			//	KMem.WX[0]= GetInput();
+			//	KMem.WY[1]=KMem.WX[0]&0xff;
+			//	KMem.WY[2]=(KMem.WX[0]>>8)&0xff;		
+			}
+		//	BufferOut[1]=KMem.WY[1];
+		//	BufferOut[2]=KMem.WY[2];		
+#else
+			if (KMRunStat.WorkMode==0)
+			{
+				KMem.WX[0]= GetInput();
+				KMem.WY[1]=KMem.WX[0]&0xff;
+				KMem.WY[2]=(KMem.WX[0]>>8)&0xff;		
+			}
+			BufferOut[1]=KMem.WY[1];
+			BufferOut[2]=KMem.WY[2];		
+#endif
+
+			Datas[0]=BufferOut[nCurPollId];
+			Datas[1]=BufferOut[nCurPollId+1];;
+			Datas[2]=ChnStats[nCurPollId].Stat;
+			Datas[3]=0;
+			Datas[4]=tick1&0xff;
+			Datas[5]=(tick1>>8)&0xff;
+			Datas[6]=(tick1>>16)&0xff;
+			Datas[7]=(tick1>>24)&0xff;
+			
+			SendTimeuS=thisuS;				
+			len1=MakePacket((pPacket)PacketBuf1,0,nCurPollId,cmdExChgData,nSeq,8,Datas);
+			SendPacket(nChn, (pPacket)PacketBuf1, len1);
+			ChnStats[nCurPollId].SendPackets++;
+			ChnStats[nCurPollId].SendTimeInterval=SendTimeuS-ChnStats[nCurPollId].LastSentTimeuS;
+			ChnStats[nCurPollId].LastSentTimeuS=SendTimeuS;
+//			PacketLength = len1;
+			SendTime=tick1;
+
+			MasterRecved=0;
+			MasterRecvOK=0;
+		//	LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_5);		
+			//ToggleErrLed();
+//				ToggleOut8();
+
+		}
+	
+//		Clk3=SysTick->VAL;
+	//	LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_4);
+//	HAL_Delay(1);				
+	return 0;
+}
+
+int KBusSlaveFunc(int nChn)
+{
+		int ThisuS=GetuS();
+		int thisRecvTime=RecvTimeuS;
+		if (SlaveRecved)
+		{
+			KMem.RunStat=8000;
+			SlaveRecved=0;
+		}else if ((ThisuS - thisRecvTime) >12000u)
+		{
+			KMem.ErrStat=8000;
+			KMem.SDD[17]=1;
+			KMem.SDD[18]=ThisuS;
+			KMem.SDD[19]=RecvTimeuS;
+		}else if ( ThisuS > (thisRecvTime + 12000u))
+		{
+			KMem.ErrStat=8000;
+			KMem.SDD[17]=2;
+			KMem.SDD[18]=ThisuS;
+			KMem.SDD[19]=RecvTimeuS;
+		}
+		
+	return 0;
+}

--
Gitblit v1.9.1