From 842bb64195f958b050867c50db66fc0aa413dafb Mon Sep 17 00:00:00 2001
From: QuakeGod <quakegod@sina.com>
Date: 星期六, 27 七月 2024 10:42:56 +0800
Subject: [PATCH] KBus upgrade

---
 ComLib/Src/KLink.c |  252 +++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 197 insertions(+), 55 deletions(-)

diff --git a/ComLib/Src/KLink.c b/ComLib/Src/KLink.c
index 9141d7b..5b9381a 100644
--- a/ComLib/Src/KLink.c
+++ b/ComLib/Src/KLink.c
@@ -9,8 +9,14 @@
 #include "string.h"
 #include "PLCFunctions.h"
 #include "stm32f0xx_hal.h"
+#include "main.h"
 
-unsigned char KLPacketBuf1[256];
+#ifdef KWLESS
+#include "KWireless.h"
+#endif
+//extern stWLRunStat KwRunStat;
+
+//unsigned char KLPacketBuf1[256];
 unsigned char KLPacketBuf2[256];
 
 unsigned char KLBufferIn[16]={0};
@@ -24,6 +30,14 @@
 int KLThisuS=0;
 int KLRecvTimeuS=0;
 
+stPortDef KLinkPortReg1 = {.nPortHardType = 3,.nPortUseType = 2, .bEnable = 1, .bRunning =1, .StationId = 1, .bMaster = 0};
+
+int KLinkInit(int n)
+{
+		
+		KMRegisterPort(0,&KLinkPortReg1);
+	return 0;
+}
 unsigned char KLBCC(void const * pData, int nSize)
 {
 	unsigned char k;
@@ -43,10 +57,16 @@
 	p1->nStatus=Status;
 	p1->nRplyCMD=nCmd;
 	p1->nSize1=DataLen;
-	memcpy(p1->Datas,pData,DataLen);
-	p1->Datas[DataLen]=KLBCC(p1,sizeof(stKLRplyPktHdr)+DataLen-1);
-	PacketLenth=sizeof(stKLRplyPktHdr)+DataLen;	
-	
+	if (nCmd == KLCmdErrRply) {
+		DataLen = 0;
+		p1->Datas[DataLen]=KLBCC(p1,sizeof(stKLRplyPktHdr)+DataLen-1);
+		PacketLenth=sizeof(stKLRplyPktHdr)+DataLen;	
+		
+	} else {
+		memcpy(p1->Datas,pData,DataLen);
+		p1->Datas[DataLen]=KLBCC(p1,sizeof(stKLRplyPktHdr)+DataLen-1);
+		PacketLenth=sizeof(stKLRplyPktHdr)+DataLen;	
+	}
 
 	switch (nCmd)
 	{
@@ -70,6 +90,7 @@
 		
 		break;
 		default:
+			
 			break;
 	}
 	
@@ -136,6 +157,7 @@
 	unsigned short nByteAddr=0;
 	unsigned short nBitAddr=0;
 	unsigned short DataLen=0;	//p1->LoadLen;
+	unsigned short nValue=0;
 //int nSrcAddr=p1->SrcAddr;
 
 	nKLStatus.nSEQ = ((pKLStat)(&(p1->Stat)))->nSEQ;;
@@ -143,7 +165,7 @@
 	void * pData=0;
 	pKLRplyPktHdr p2=(pKLRplyPktHdr)KLPacketBuf2;
 	char rData[4];
-
+	int res = 0 ;
 	int PacketLen=0;
 	KLRecvTimeuS=KLThisuS;
 	if (nDstHost==nKLStationId || nDstHost==0xff)
@@ -208,12 +230,16 @@
 				else if (nDataType == KLDataTypeWR)		{		pData=KMem.WR+nWordAddr;		}
 				else if (nDataType == KLDataTypeWLX)		{		pData=KMem.WLX+nWordAddr;		}
 				else if (nDataType == KLDataTypeWLY)		{		pData=KMem.WLY+nWordAddr;		}
-				else if (nDataType == KLDataTypeSV)		{		pData=KMem.SV+nWordAddr;	}
-				else if (nDataType == KLDataTypeEV)		{		pData=KMem.EV+nWordAddr;	}
+#if (ENABLE_PLC)				
+				else if (nDataType == KLDataTypeSV)		{		pData=PLCMem.SV+nWordAddr;	}
+				else if (nDataType == KLDataTypeEV)		{		pData=PLCMem.EV+nWordAddr;	}
+#endif			
 				else if (nDataType == KLDataTypeTest)	{		pData=KMem.SDT+nWordAddr;	}
 				else if (nDataType == KLDataTypeWDT)	{		pData=KMem.WDT+nWordAddr;	}
-				else if (nDataType == KLDataTypeKBD)	{		pData=(unsigned short *)&KBusChnStats  +nWordAddr;	}
-//				else if (nDataType == KLDataTypeKWLD)	{		pData=(unsigned short *)&KwRunStat  +nWordAddr;	}
+				else if (nDataType == KLDataTypeKBD)	{		pData=(unsigned short *)&KBus1.KBusChnStats  +nWordAddr;	}
+#ifdef KWLESS
+				else if (nDataType == KLDataTypeKWLD)	{		pData=(unsigned short *)&KwRunStat  +nWordAddr;	}
+#endif
 				else if (nDataType == KLDataSysCfg) { pData = (unsigned short *)&storedKMSysCfg.theKMSysCfg + nWordAddr;}
 				else if (nDataType == KLDataTypeFlash) { pData = (unsigned short *)FLASH_BASE + nWordAddr;}
 				else				{					pData=KLBufferOut+nWordAddr;				}
@@ -239,12 +265,16 @@
 				else if (nDataType == KLDataTypeWR)		{		pData=KMem.WR+nWordAddr;		}
 				else if (nDataType == KLDataTypeWLX)		{		pData=KMem.WLX+nWordAddr;		}
 				else if (nDataType == KLDataTypeWLY)		{		pData=KMem.WLY+nWordAddr;		}
-				else if (nDataType == KLDataTypeSV)		{		pData=KMem.SV+nWordAddr;	DataLen=0;}
-				else if (nDataType == KLDataTypeEV)		{		pData=KMem.EV+nWordAddr;	DataLen=0;}
+#if (ENABLE_PLC)				
+				else if (nDataType == KLDataTypeSV)		{		pData=PLCMem.SV+nWordAddr;	DataLen=0;}
+				else if (nDataType == KLDataTypeEV)		{		pData=PLCMem.EV+nWordAddr;	DataLen=0;}
+#endif
 				else if (nDataType == KLDataTypeTest)	{		pData=KMem.SDT+nWordAddr;	DataLen=0;}
 				else if (nDataType == KLDataTypeWDT)	{		pData=KMem.WDT+nWordAddr;	DataLen=0;}
-				else if (nDataType == KLDataTypeKBD)	{		pData=(unsigned short *)KBusChnStats +nWordAddr;	DataLen=0;}
-//				else if (nDataType == KLDataTypeKWLD)	{		pData=(unsigned short *)&KwRunStat  +nWordAddr;	}
+				else if (nDataType == KLDataTypeKBD)	{		pData=(unsigned short *)KBus1.KBusChnStats +nWordAddr;	DataLen=0;}
+#ifdef KWLESS				
+				else if (nDataType == KLDataTypeKWLD)	{		pData=(unsigned short *)&KwRunStat  +nWordAddr;	}
+#endif
 				else if (nDataType == KLDataSysCfg)		{ pData = (unsigned short *)&(storedKMSysCfg) + nWordAddr;}
 				else if (nDataType == KLDataTypeFlash) { pData = (unsigned short *)FLASH_BASE + nWordAddr;}
 				else				{					pData=KLBufferOut+nWordAddr;	DataLen=0;			}
@@ -264,8 +294,10 @@
 				else if (nDataType == KLCoilTypeR) { rData[0] = ((KMem.WR[nBitAddr>>4]&(1<<(nBitAddr&0x0f)))>0);}
 				else if (nDataType == KLCoilTypeLX) { rData[0] = ((KMem.WLX[nBitAddr>>4]&(1<<(nBitAddr&0x0f)))>0);}
 				else if (nDataType == KLCoilTypeLY) { rData[0] = ((KMem.WLY[nBitAddr>>4]&(1<<(nBitAddr&0x0f)))>0);}
-				else if (nDataType == KLCoilTypeT) { rData[0] = KMem.Timers[nBitAddr].bTon;}
-				else if (nDataType == KLCoilTypeC) { rData[0] = KMem.Timers[nBitAddr].bTon;}
+#if (ENABLE_PLC)				
+				else if (nDataType == KLCoilTypeT) { rData[0] = PLCMem.Timers[nBitAddr].bTon;}
+				else if (nDataType == KLCoilTypeC) { rData[0] = PLCMem.Timers[nBitAddr].bTon;}
+#endif
 				else if (nDataType == KLCoilTypeSR) {rData[0] = ((KMem.WSR[nBitAddr>>4]&(1<<(nBitAddr&0x0f)))>0);}
 				
 				else if (nDataType == KLCoilTypeLR) { rData[0] = 0;}
@@ -280,9 +312,10 @@
 				else if (nDataType == KLCoilTypeR) { SetBitValue( &KMem.WR[nBitAddr>>4],nBitAddr&0x0f,p1->Params[2]);}
 				else if (nDataType == KLCoilTypeLX) {SetBitValue( &KMem.WLX[nBitAddr>>4],nBitAddr&0x0f,p1->Params[2]);}
 				else if (nDataType == KLCoilTypeLY) {SetBitValue( &KMem.WLY[nBitAddr>>4],nBitAddr&0x0f,p1->Params[2]);}
-				else if (nDataType == KLCoilTypeT) { KMem.Timers[nBitAddr].bTon = p1->Params[2];}
-				else if (nDataType == KLCoilTypeC) { KMem.Timers[nBitAddr].bTon = p1->Params[2];}
-				else if (nDataType == KLCoilTypeC) { KMem.Timers[nBitAddr].bTon = p1->Params[2];}
+#if (ENABLE_PLC)			
+				else if (nDataType == KLCoilTypeT) { PLCMem.Timers[nBitAddr].bTon = p1->Params[2];}
+				else if (nDataType == KLCoilTypeC) { PLCMem.Timers[nBitAddr].bTon = p1->Params[2];}
+#endif
 				else if (nDataType == KLCoilTypeLR) { SetBitValue( &KMem.WSR[nBitAddr>>4],nBitAddr&0x0f,p1->Params[2]);;}
 				else {rData[0]=0;}
 				DataLen=0;
@@ -293,66 +326,91 @@
 				break;
 			case KLCmdWriteBits:
 				break;
+#if (ENABLE_PLC)
+			case KLCmdGetMode:
+				rData[0]=	PLCMem.bPLCRunning;
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,1,rData);
+				SendPacket(nChn, p2, PacketLen);			
+				break;
 			case KLCmdChgMode:
 				if (nDataType ==0) {StopPLC();}
 				if (nDataType == 1) {StartPLC();}
 				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,0,0);
 				SendPacket(nChn, p2, PacketLen);				
 				break;
-			case KLCmdReadProgram:
+			case KLCmdReadPLCProgram:
 				nWordAddr=p1->Params[0]+ (p1->Params[1]<<8);
 				DataLen= p1->Params[2];
 				 if (nDataType==0){
-						pData = (unsigned short *)STORE_PRG_BASE + nWordAddr;
+						pData = (unsigned short *)(&((stStoredBinProgs *)STORE_PRG_BASE)->BinInstrcns) + nWordAddr;
 				 } else if (nDataType==1){
-						pData = (unsigned short *)ALT_PRG_BASE + nWordAddr;
+						pData = (unsigned short *)(&((stStoredBinProgs *)ALT_PRG_BASE)->BinInstrcns) + nWordAddr;
 				 } else if (KMRunStat.nBinProgBank == 0) {
-						pData = (unsigned short *)STORE_PRG_BASE + nWordAddr;
+						pData = (unsigned short *)(&((stStoredBinProgs *)STORE_PRG_BASE)->BinInstrcns) + nWordAddr;
 				 }else {
-						pData = (unsigned short *)ALT_PRG_BASE + nWordAddr;
+						pData = (unsigned short *)(&((stStoredBinProgs *)ALT_PRG_BASE)->BinInstrcns) + nWordAddr;
 				 }
 				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData);
 				SendPacket(nChn, p2, PacketLen);
 				
 				break;
-			case KLCmdStartProgram:
-				DataLen=nDataType;
-//				KLBufferIn[0]=p1->Params[0];
-//				p1->Params[0]=KLBufferOut[0];
-				if (PLCMem.bPLCRunning) PLCMem.bPLCRunning=0;
-			
-				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdStartProgram,0,0);
+			case KLCmdStartPLCProgram:
+				DataLen=p1->Params[0] + (p1->Params[1] <<8);		//Program Size
+				nValue = p1->Params[2] + (p1->Params[3] <<8);   // CRC
+				//if (PLCMem.bPLCRunning) StopPLC();
+				StartPLCProgram(nDataType, DataLen, nValue);
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdStartPLCProgram,0,0);
 				SendPacket(nChn, p2, PacketLen);
-				
+
 				break;
-			case KLCmdWriteProgram:
+			case KLCmdWritePLCProgram:
 				if (PLCMem.bPLCRunning) PLCMem.bPLCRunning=0;
 				nWordAddr=p1->Params[0]+ (p1->Params[1]<<8);
 				DataLen= p1->Params[2];
-
-				//DataLen=16;
-				for (int i=0;i<DataLen;i++)
-				{KLPacketBuf2[i]=p1->Params[4+i];}
-				WriteProgram(nWordAddr, KLPacketBuf2, DataLen,nDataType);
+				WritePLCProgram(nDataType, nWordAddr, &p1->Params[4], DataLen);
 				DataLen=4;
-				*((int *)(&rData[0]))=(long)(p1->Params+4);
-				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdWriteProgram,0,0);
+//				*((int *)(&rData[0]))=(long)(p1->Params+4);
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdWritePLCProgram,0,0);
 				SendPacket(nChn, p2, PacketLen);
 				break;
-			case KLCmdFinishProgram:
-				nWordAddr=p1->Params[0]+ (p1->Params[1]<<8);		//Program Size;
-				DataLen=nDataType;
-				KMRunStat.nBinProgSize=nWordAddr;
-				if (KMRunStat.nBinProgBank ==0) {KMRunStat.nBinProgBank=1;}
-				else {KMRunStat.nBinProgBank=0;}
-				SaveRunStat(&KMRunStat);				
-				//PLCMem.bPLCRunning=1;
-//				KLBufferIn[0]=p1->Params[0];
-//				p1->Params[0]=KLBufferOut[0];
-				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdFinishProgram,0,0);
+			case KLCmdFinishPLCProgram:
+				DataLen=p1->Params[0]+ (p1->Params[1]<<8);		//Program Size;
+				nValue = p1->Params[2] + (p1->Params[3] <<8);				//CRC
+				FinishiPLCProgram(nDataType, DataLen, nValue);
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdFinishPLCProgram,0,0);
 				SendPacket(nChn, p2, PacketLen);
 				break;
-				
+			case KLCmdReadPLCAnno:
+				nByteAddr=p1->Params[0]+ (p1->Params[1]<<8);
+				DataLen= p1->Params[2];
+				pData = ((stStoredAnno *)STORE_PLC_ANNO_BASE)->Annos + nByteAddr;
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData);
+				SendPacket(nChn, p2, PacketLen);
+				break;
+			case KLCmdStartPLCAnno:
+				nWordAddr=p1->Params[0]+ (p1->Params[1]<<8);
+				DataLen= p1->Params[2];
+				StartPLCAnno(nDataType, DataLen, nValue);
+				DataLen=4;
+//				*((int *)(&rData[0]))=(long)(p1->Params+4);
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdStartPLCAnno,0,0);
+				SendPacket(nChn, p2, PacketLen);
+				break;
+			case KLCmdWritePLCAnno:
+				nByteAddr=p1->Params[0]+ (p1->Params[1]<<8);		;
+				DataLen = p1->Params[2];				//CRC
+				WritePLCAnno(nDataType, nByteAddr, &p1->Params[4], DataLen);
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdWritePLCAnno,0,0);
+				SendPacket(nChn, p2, PacketLen);
+				break;			
+			case KLCmdFinishPLCAnno:
+				DataLen=p1->Params[0]+ (p1->Params[1]<<8);		//Program Size;
+				nValue = p1->Params[2] + (p1->Params[3] <<8);				//CRC
+				FinishiPLCAnno(nDataType, DataLen, nValue);
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdFinishPLCAnno,0,0);
+				SendPacket(nChn, p2, PacketLen);
+				break;			
+#endif // ENABLE_PLC				
 			case KLCmdBlinkLED:
 				DataLen=nDataType;
 				KMRunStat.bLEDFlick=DataLen;
@@ -410,7 +468,7 @@
 				SendPacket(nChn, p2, PacketLen);
 				break;
 			case KLCmdClearRunStat:
-				memset(KBusChnStats,0,sizeof(KBusChnStats));
+				memset(KBus1.KBusChnStats,0,sizeof(KBus1.KBusChnStats));
 				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,0,0);
 				SendPacket(nChn, p2, PacketLen);					
 				break;
@@ -432,8 +490,92 @@
 				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdClearEventLog,0,0);
 				SendPacket(nChn, p2, PacketLen);
 				break;			
+			case KLCmdResetMachine:
+
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,KLCmdClearEventLog,0,0);
+				SendPacket(nChn, p2, PacketLen);
+				KMRunService(ReqReset,0,0,0,0);
+				break;					
+			case KLCmdWriteFirmware:
+				nByteAddr=p1->Params[0]+ (p1->Params[1]<<8);
+				//pData=(UCHAR *)(&storedKMSysCfg.theKMSysCfg)+nByteAddr;
+				DataLen = p1->Params[2];
+				pData = p1->Params + 4 ;
+				res = KMRunService(ReqUpdateFirm,nByteAddr,0,&pData,&DataLen);
+			
+//				res = WriteNewApp(nByteAddr,p1->Params+4,DataLen);
+//			res = 0;
+				if (res) {
+					PacketLen=KLMakeRplyPacket(p2,nKLStationId,nKLStatus.StatByte,KLCmdErrRply,res,rData);					
+				}else {					
+					PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,0,0);
+				}
+				SendPacket(nChn, p2, PacketLen);				
+
+				
+				break;
+			case KLCmdWriteFirmInfo:
+				nByteAddr=p1->Params[0]+ (p1->Params[1]<<8);
+				//pData=(UCHAR *)(&storedKMSysCfg.theKMSysCfg)+nByteAddr;
+				DataLen = p1->Params[2];
+				pData = p1->Params + 4 ;
+				res = KMRunService(ReqUpdateFirmInfo,nByteAddr,0,&pData,&DataLen);
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,0,0);
+				SendPacket(nChn, p2, PacketLen);		
+//				WriteNewAppInfo(nByteAddr,p1->Params+4,DataLen);			
+				break;
+			case KLCmdGetPortInfo:
+				
+				nByteAddr=p1->Params[0] + (p1->Params[1]<<8);
+				//pData=(UCHAR *)(&storedKMSysCfg.theKMSysCfg)+nByteAddr;
+				pData = KMem.pPorts[nDataType];
+				DataLen = sizeof(stPortDef);
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData);
+				SendPacket(nChn, p2, PacketLen);		
+				break;			
+			case KLCmdGetPortChnInfo:
+				
+				nByteAddr=p1->Params[0] + (p1->Params[1]<<8);
+				// nDataType --> port 
+				// nByteAddr --> ChildId
+				//pData=(UCHAR *)(&storedKMSysCfg.theKMSysCfg)+nByteAddr;
+			  KMPortReqFunc(nDataType,ReqPortChnInfo,nByteAddr,0,&pData,&DataLen);
+				
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData);
+				SendPacket(nChn, p2, PacketLen);		
+				break;			
+			
+			case KLCmdGetPortChildInfo:
+				nByteAddr=p1->Params[0] + (p1->Params[1]<<8);
+				// nDataType --> port 
+				// nByteAddr --> ChildId
+				//pData=(UCHAR *)(&storedKMSysCfg.theKMSysCfg)+nByteAddr;
+			  KMPortReqFunc(nDataType,ReqPortChildInfo,nByteAddr,0,&pData,&DataLen);
+				
+				//DataLen = sizeof(stPortDef);
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData);
+				SendPacket(nChn, p2, PacketLen);		
+				break;			
+			
+			case KLCmdPortRemoteReq:		// 远程服务请求
+				//p1->nType1 -> ReqId;
+				//p1->Params[0] -> Port;
+				//p1->Params[1] -> Child;
+				//p1->params[2] -> Param;
+				//p1->params[3] -> nAddr % 256;
+				//p1->params[4] -> nAddr / 256;
+				//p1->params[5] -> nCount;
+				pData = &p1->Params[3];
+				DataLen = p1->Params[5]+3;
+			
+				KMPortReqFunc(p1->Params[0],nDataType,p1->Params[1],p1->Params[2],&pData,&DataLen);
+				DataLen=0;
+				PacketLen=KLMakeRplyPacket(p2,nDstHost,nKLStatus.StatByte,p1->nCMD,DataLen,pData);
+				SendPacket(nChn, p2, PacketLen);
+				break;
 			default:
-			DataLen=1;
+			//DataLen=1;
+			DataLen=KL_UNKNOWN;			
 			rData[0]=KL_UNKNOWN;
 			PacketLen=KLMakeRplyPacket(p2,nKLStationId,nKLStatus.StatByte,KLCmdErrRply,DataLen,rData);
 			SendPacket(nChn, p2, PacketLen);			
@@ -454,7 +596,7 @@
 		int DataLen=4;
 		char rData[4];
 		rData[0]=Result;
-		
+		DataLen = Result;
 		PacketLen=KLMakeRplyPacket(KLPacketBuf2,nKLStationId,nKLStatus.StatByte,KLCmdErrRply,DataLen,rData);
 //		PacketLen=KLMakePacket(p2,0,nAddr,cmdKLPing,p1->nSEQ,DataLen,rData);
 		SendPacket(nChn, KLPacketBuf2, PacketLen);

--
Gitblit v1.9.1