From 448d6c050697a6bb7f4b7b02f08ef8fc8e5cd027 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 |  257 +++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 217 insertions(+), 40 deletions(-)

diff --git a/Src/KBus.c b/Src/KBus.c
index 3fd7f14..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,23 +17,35 @@
 unsigned char BufferIn[16]={0};
 unsigned char BufferOut[16]={0};
 
-stChnStat ChnStats[8];
-int nAddr=0;
-int nChilds;
+stChnStat ChnStats[9];
+unsigned char nAddr=0;
+unsigned char nChilds;
 int ChildStat[16];
-int nCurPollId=0;
-int nSeq=0;
+unsigned char nCurPollId=0;
+unsigned char nSeq=0;
 
-int MasterRecved=1;
-volatile int SlaveRecved=1;
+volatile unsigned char MasterRecved=1;
+volatile unsigned char MasterRecvOK=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)
 {
@@ -44,10 +57,11 @@
 	}
 	return k;	
 }
+
 int MakePacket(pPacket p1,unsigned char src, uchar dst, uchar nType,unsigned char nSEQ, unsigned char DataLen,void * pData )
 {
 	p1->Sign=StartSign;
-	p1->DstAddr=dst;
+	p1->DstHost=dst;
 	p1->SrcAddr=src;
 	p1->nCMD=nType;
 	p1->nSEQ=nSEQ;
@@ -150,7 +164,7 @@
 	return PacketLenth;
 }
 
-int CheckPacket(pPacket p1,int nLen1)
+int CheckPacket(int nChn, pPacket p1, int nLen1)
 {
 	if (p1->Sign != StartSign)
 	{
@@ -183,31 +197,32 @@
 	if (thisBCC != p1->data[DataLen]) 
 	{//BCC Error;
 		Uart2Stat.BCCerr++;
+		ChnStats[nCurPollId].BCCErr++;
 		return -4;
 	} 		
 	return 0;
 }
 
-int SlaveCheckPacket(pPacket p1,int nLen1)
+int SlaveCheckPacket(int nChn, pPacket p1, int nLen1)
 {
 	if (p1->Sign != StartSign)
 	{
 		Uart2Stat.NotPacketErr++;
-		ChnStats[0].NotPkgErr++;
+		ChnStats[0].ClientNotPktErr++;
 		return -1;
 	}
 	int DataLen=p1->PacketLen;
 	if (DataLen>MaxPacketLength) 
 	{
 		Uart2Stat.LengthErr++;
-		ChnStats[0].PkgLenErr++;
+		ChnStats[0].ClientPkgLenErr++;
 		return -1;
 	}
 	if (nLen1<DataLen+sizeof(stPacket)+1)
 	{
 		//len4=sprintf(str3,"%d < %d + %d \r\n",len2,DataLen,sizeof(stPacket));
 		//PutStr(str3,len4);
-		ChnStats[0].PkgLenErr++;
+		ChnStats[0].ClientPkgLenErr++;
 		Uart2Stat.LengthErr++;
 		return -3;	//not long enough					
 	}
@@ -221,13 +236,13 @@
 	if (thisBCC != p1->data[DataLen]) 
 	{//BCC Error;
 		Uart2Stat.BCCerr++;
-		ChnStats[0].BCCErr++;
+		ChnStats[0].ClientBccErr++;
 		return -4;
 	} 		
 	return 0;
 }
 
-int MasterParsePacket(pPacket p1,int Len1)
+int MasterParsePacket(int nChn, pPacket p1, int Len1)
 {
 
 		int DataLen=p1->PacketLen;
@@ -245,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;
@@ -259,7 +274,7 @@
 			if (DelayuS > ChnStats[nCurPollId].MaxDelay) 
 				ChnStats[nCurPollId].MaxDelay=DelayuS;
 				//PutOutput(outputvalue);
-				MasterRecved=1;
+				MasterRecvOK=1;
 				break;
 			case cmdRead:
 				break;
@@ -280,14 +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;
@@ -299,7 +328,7 @@
 				nIndex=p1->data[3];
 				ChnStats[nCurPollId].ClientDatas[nIndex]=p1->data[4]|(p1->data[5]<<8)|(p1->data[6]<<16)|(p1->data[7]<<24);
 			
-				MasterRecved=1;
+				MasterRecvOK=1;
 				
 				break;
 					
@@ -313,12 +342,13 @@
 	//	}	
 	return 0;
 }
-int SlaveParsePacket(pPacket p1,int Len1)
+unsigned char nClientDataIndex=0;
+int SlaveParsePacket(int nChn, pPacket p1, int Len1)
 {
 	Uart2Stat.OKPacket++;				
 	int DataLen=p1->PacketLen;	
 //int nSrcAddr=p1->SrcAddr;
-	int nDstAddr=p1->DstAddr;
+	int nDstHost=p1->DstHost;
 		
 //	RecvTimeuS=ThisuS;
 //	SlaveRecved=1;
@@ -326,12 +356,12 @@
 	pPacket p2=(pPacket)PacketBuf2;
 	int PacketLen=0;
 	unsigned char nIndex = p1->nSEQ & 0x07;
-	if (nDstAddr!=nAddr && nDstAddr != 0xff)
+	if (nDstHost!=nAddr && nDstHost != 0xff)
 	{
 		ChnStats[0].ClientMisIdPkts++;
 		return -1;
 	}
-	if (nDstAddr==nAddr || nDstAddr==0xff)
+	if (nDstHost==nAddr || nDstHost==0xff)
 	{
 		RecvTimeuS=ThisuS;
 		SlaveRecved=1;
@@ -347,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;
@@ -359,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;
@@ -370,19 +400,34 @@
 			case cmdExChgData:
 				BufferIn[0]=p1->data[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();
+#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];
 				p1->data[5]=ChnStats[0].ClientDatas[nIndex]>>8;
 				p1->data[6]=ChnStats[0].ClientDatas[nIndex]>>16;
 				p1->data[7]=ChnStats[0].ClientDatas[nIndex]>>24;
-				nIndex++;
+				nClientDataIndex++;
+				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;
@@ -403,33 +448,36 @@
 	}	
 	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)
 	{
-			Result=CheckPacket(p1,Len1);
+			MasterRecved=1;
+			Result=CheckPacket(nChn, p1, Len1);
 			if (Result != S_OK)
 			{
 				return Result;
 			}
-			Result=MasterParsePacket(p1,Len1);			
+			MasterRecvOK=1;
+			Result=MasterParsePacket(nChn, p1, Len1);			
 			return Result;
 	}
-	if (bSlave)
+	if (bKBusSlave)
 	{
 			ChnStats[0].ClientRecvPkts++;
-			Result=CheckPacket(p1,Len1);
+			Result=SlaveCheckPacket(nChn, p1, Len1);
 			if (Result != S_OK)
 			{
 				return Result;
 			}
-			Result=SlaveParsePacket(p1,Len1);
+			ChnStats[0].ClientTimeOutErr=KMem.RunStat;
+			Result=SlaveParsePacket(nChn, p1, Len1);
 			return Result;
 	}
 	//int len1=p1->PacketLen;
-//	if (p1->DstAddr!=255&&p1->DstAddr!=2) return -3;
+//	if (p1->DstHost!=255&&p1->DstHost!=2) return -3;
 //	pPacket p2=(pPacket)PacketBuf2;
 //			Uart2Stat.OKPacket++;
 
@@ -476,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