From 9aed5d7e7b3c7bf09da712e9c272ece401a7acc9 Mon Sep 17 00:00:00 2001
From: QuakeGod <QuakeGod@sina.com>
Date: 星期一, 25 十一月 2024 14:51:23 +0800
Subject: [PATCH] add UltraSonic and MultiWireLess

---
 Radio_LLCC68/Radio/KWireLess.c |  920 ++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 718 insertions(+), 202 deletions(-)

diff --git a/Radio_LLCC68/Radio/KWireLess.c b/Radio_LLCC68/Radio/KWireLess.c
index 771a2ff..184a407 100644
--- a/Radio_LLCC68/Radio/KWireLess.c
+++ b/Radio_LLCC68/Radio/KWireLess.c
@@ -20,6 +20,7 @@
 #define USE_MODEM_LORA
 //#define USE_MODEM_FSK
 
+/*
 #define REGION_CN779
 
 #if defined( REGION_AS923 )
@@ -32,7 +33,7 @@
 
 #elif defined( REGION_CN779 )
 
-#define RF_FREQUENCY                                432000000 // Hz
+#define RF_FREQUENCY                                430620000 // Hz
 
 #elif defined( REGION_EU868 )
 
@@ -59,39 +60,27 @@
     #error "Please define a frequency band in the compiler options."
 
 #endif
-
-#define nChannelBandwidth 													250000 // Hz
-#define TX_OUTPUT_POWER                             22        // 22 dBm
-
-extern bool IrqFired;
-
-bool RadioEnableMaster=true;//涓讳粠閫夋嫨
-uint32_t nRadioChannel=0;
-uint16_t  crc_value;
-/*!
- * Radio events function pointer
- */
-
-static RadioEvents_t RadioEvents;
-
-stWLRunStat KwRunStat;
-
+*/
+/*
 #if defined( USE_MODEM_LORA )
 
-#define LORA_BANDWIDTH                              0         // [0: 125 kHz,    
+#define LORA_BANDWIDTH                              1         // [0: 125 kHz,    
                                                               //  1: 250 kHz,
                                                               //  2: 500 kHz,
                                                               //  3: Reserved]
-#define LORA_SPREADING_FACTOR                       7         // [SF7..SF12]    
+#define LORA_SPREADING_FACTOR                       8         // [SF5..SF12]    
 #define LORA_CODINGRATE                             4         // [1: 4/5,       
                                                               //  2: 4/6,
                                                               //  3: 4/7,
                                                               //  4: 4/8]
 #define LORA_PREAMBLE_LENGTH                        4         // Same for Tx and Rx
+
+*/
 #define LORA_SYMBOL_TIMEOUT                         0         // Symbols
 #define LORA_FIX_LENGTH_PAYLOAD_ON                  false
 #define LORA_IQ_INVERSION_ON                        false
 
+/*
 #elif defined( USE_MODEM_FSK )
 
 #define FSK_FDEV                                    20e3      // Hz 
@@ -104,6 +93,59 @@
 #else
     #error "Please define a modem in the compiler options."
 #endif
+*/
+/*
+#define nChannelSpacing 														530000 // Hz
+#define TX_OUTPUT_POWER                             16        // 22 dBm
+*/
+
+
+extern bool IrqFired;
+
+//bool RadioEnableMaster=true;//涓讳粠閫夋嫨
+//uchar nRadioChannel = 0;
+//uchar nRadioAddr = 1;
+uint16_t  crc_value;
+
+#define MixAddr(x,y) ((x<<4)|(y))
+/*!
+ * Radio events function pointer
+ */
+#define MASTER_RX_TIMEOUT_VALUE                 80			//mS
+#define SLAVE_RX_TIMEOUT_VALUE                  400			//mS
+#define CYCLE_TIME															80			//mS
+
+const stWLConfig defaultWLConfig =
+{
+	.RF_T_Freq = 430620000,			// uint32_t 	Hz
+	.RF_R_Freq = 430620000,			// uint32_t 		//Hz
+	.nChnSpacing = 530,			//		  uint16_t ChannelSpacing;		//kHz	
+	.nCycleTime = CYCLE_TIME,		// CyCleTime
+	.workMode = 1,				//			uchar workMode;			//0: FSK,    1: LoRa	
+	.nChannel = 0,
+	.bMaster = 0,
+	.nRadioAddr =1 ,
+	.bEnableMulti = 0,
+	
+	.Tx_Power = 20,				//      uchar Tx_Power;
+	.LoraBandWidth = 1,				// 			uchar LoraBandWidth;		//		[0: 125 kHz, 1: 250 kHz, 2: 500 kHz, 3: Reserved ] 
+	.LoRaFactor = 5,				// 			uchar LoRaFactor;				//		[SF5 .. SF 12]
+	.LoRaCodingRate = 1,				//			uchar LoRaCodingRate;		//		[1 : 4/5,  2: 4/6,  3:  4/7,	4:  4/8
+	.NetWorkAddr = 0x00,			//			uint8_t NetWorkAddr;
+	.DeviceAddr = 0x0102,		//			uint16_t DeviceAddr;
+	.bEnableAddr = 0,				//			uchar bEnableAddr;
+	.bEnableEncrypt = 0,				//			uchar bEnableEncrypt;
+	.bEnableRelay = 0,				//			uchar bEnableRelay;
+	.LoRaPreambleLen = 4,				//			uchar LoRaPreamble_Len;			// 2 - 12
+	.bAutoPower = 1,
+	.bAutoReSend = 1,						// 鑷姩閲嶅彂
+};
+
+//stWLConfig * pWLCfg = (stWLConfig *)&defaultWLConfig;
+static RadioEvents_t RadioEvents;
+
+stWLConfig WLCfg ;
+stWLRunStat KwRunStat;
 
 typedef enum
 {
@@ -115,18 +157,22 @@
     TX_TIMEOUT,
 }States_t;
 
-#define MASTER_RX_TIMEOUT_VALUE                 80			//mS
-#define SLAVE_RX_TIMEOUT_VALUE                  250			//mS
-#define CYCLE_TIME															200			//mS
 
-#define BUFFER_SIZE         										32 						// Define the payload size here
 
+#define WL_RX_BUFFER_SIZE         										160 						// Define the payload size here
+#define WL_TX_BUFFER_SIZE         										160 						// Define the payload size here
+
+uint16_t nTimeOnAir;
+/*
 const uint8_t PingMsg[] = "PING";
 const uint8_t PongMsg[] = "PONG";
+*/
 
 //uint16_t BufferSize = BUFFER_SIZE;
-uint8_t TX_Buffer[BUFFER_SIZE];
-uint8_t RX_Buffer[BUFFER_SIZE];
+uint8_t KwRx_Buffer[WL_RX_BUFFER_SIZE];
+uint8_t KwTx_Buffer[WL_TX_BUFFER_SIZE];
+
+#define WL_TT_EACH_SIZE																64						// transparent transmission byte size for each send
 
 
 States_t State = LOWPOWER;
@@ -145,10 +191,38 @@
 		LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_13);		
 }
 
+int LoadKwConfig(void)
+{
+	stStoredWLConfig * pstStoredWLCFG = (stStoredWLConfig *)(STORE_KWCONFIG_BASE);
+
+	if (pstStoredWLCFG->BlockSign == 0x55AA && pstStoredWLCFG->BlockType == 0x05) {
+		WLCfg = pstStoredWLCFG->WLConfig;
+	} else 	{
+		WLCfg = defaultWLConfig;
+	}
+	return 0;
+}
+
+int SaveKwConfig(void)
+{
+//	stStoredWLConfig * pstStoredWLCFG = (stStoredWLConfig *)(STORE_KWCONFIG_BASE);
+
+	stStoredWLConfig theStoredWLCFG;
+	theStoredWLCFG.BlockSign = 0x55AA;
+	theStoredWLCFG.BlockType = 0x05;
+	theStoredWLCFG.nSeq = 1;
+	theStoredWLCFG.nSize = sizeof(stWLConfig);
+	theStoredWLCFG.WLConfig = WLCfg;
+	theStoredWLCFG.nCRC16 = 0x0000;
+	EraseAndWriteToFlashMem(&theStoredWLCFG, (void *)STORE_KWCONFIG_BASE, sizeof(stStoredWLConfig));
+	
+	return 0;
+}
+
 int KWireLessInit(bool bRadioEnableMaster, uint32_t nChn)
 {
-	
-		RadioEnableMaster = bRadioEnableMaster;
+		stWLConfig * pWLCfg = & WLCfg;
+		pWLCfg->bMaster = bRadioEnableMaster;
     // Radio initialization
     RadioEvents.TxDone = OnTxDone;
     RadioEvents.RxDone = OnRxDone;
@@ -158,14 +232,16 @@
     RadioEvents.CadDone = OnCadDone;
     
     Radio.Init( &RadioEvents );
-		nRadioChannel = nChn;
-    Radio.SetChannel( RF_FREQUENCY + nRadioChannel * nChannelBandwidth );
+		pWLCfg->nChannel = nChn;
+		KwRunStat.RF_Freq = pWLCfg->RF_T_Freq + pWLCfg->nChannel * pWLCfg->nChnSpacing*1000;
+	
+    Radio.SetChannel( KwRunStat.RF_Freq );
     
   //  Radio.WriteBuffer(0x06C0,data,2);
    // Radio.ReadBuffer(0x06C0,test,2);
     
 #if defined( USE_MODEM_LORA )
-    
+/*    
     Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
                                    LORA_SPREADING_FACTOR, LORA_CODINGRATE,
                                    LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
@@ -175,6 +251,19 @@
                                    LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
                                    LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
                                    0, true, 0, 0, LORA_IQ_INVERSION_ON, false );
+// */																	
+
+    Radio.SetTxConfig( MODEM_LORA, pWLCfg->Tx_Power, 0, pWLCfg->LoraBandWidth,
+                                   pWLCfg->LoRaFactor, pWLCfg->LoRaCodingRate,
+                                   pWLCfg->LoRaPreambleLen, LORA_FIX_LENGTH_PAYLOAD_ON,
+                                   true, 0, 0, LORA_IQ_INVERSION_ON, 3000 );
+																	 
+    Radio.SetRxConfig( MODEM_LORA, pWLCfg->LoraBandWidth, pWLCfg->LoRaFactor,
+                                   pWLCfg->LoRaCodingRate, 0, pWLCfg->LoRaPreambleLen,
+                                   LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
+                                   0, true, 0, 0, LORA_IQ_INVERSION_ON, false );																	 
+																	 
+		Radio.SetMaxPayloadLength(MODEM_LORA,32);																	 
     
 #elif defined( USE_MODEM_FSK )
     
@@ -188,30 +277,63 @@
                                   0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, true,
                                   0, 0,false, false );
 #else
-    #error "Please define a frequency band in the compiler options."
+    #error "Please define a modem in the compiler options.."
 #endif
 		SX126xSetRxTxFallbackMode(0x40); // 0x40-> FS    0x30 -> SD_XOSC  0x20 -> SD_RC
 		
-//		SX126xSetCadParams(4,0,1,0,1);
-		
+		SX126xSetCadParams(LORA_CAD_02_SYMBOL,22,10,LORA_CAD_ONLY,1);
+
+	nTimeOnAir = Radio.TimeOnAir(MODEM_LORA,14);
+	KwRunStat.nTimeOnAir = 	nTimeOnAir;								
+//	KMem.WDT[38]=nTimeOnAir;																
+	KwRunStat.runStep=RS_IDLE;
+	KMem.WDT[0]++;
+		KwRunStat.Tx_Power = WLCfg.Tx_Power;
+		KwRunStat.LoraBandWidth = WLCfg.LoraBandWidth;
+		KwRunStat.LoRaFactor = WLCfg.LoRaFactor;
+		KwRunStat.LoRaCodingRate = WLCfg.LoRaCodingRate;
+		KwRunStat.LoRaPreambleLen = WLCfg.LoRaPreambleLen;		
 																	
-	KwRunStat.runStep=RS_IDEL;
 	return 0;
 }
 
-int KWireLessStart(void)
+int KwResetRf()
 {
-    if(RadioEnableMaster)
-    {
-			KWLMasterSendReqPkt(1);
-    }
-    else
-    {
+	//	LoadKwConfig();
+	//	KWireLessInit(RadioEnableMaster,nRadioChannel);	
+	Radio.Standby();
+	KwRunStat.runStep=RS_IDLE;	
+	return 0;
+}
+
+int KwStartRecv(int nChnd)
+{
+		Radio.Standby();
+			 Radio.SetChannel( KwRunStat.RF_Freq );
+			Radio.SetRxConfig( MODEM_LORA, WLCfg.LoraBandWidth, WLCfg.LoRaFactor,
+                                   WLCfg.LoRaCodingRate, 0, WLCfg.LoRaPreambleLen,
+                                   LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
+                                   0, true, 0, 0, LORA_IQ_INVERSION_ON, false );																	 
+																	 
+			Radio.SetMaxPayloadLength(MODEM_LORA,32);																	 
+			
        Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); 
 			KwRunStat.runStep=RS_RECVING;
 			
 			KwRunStat.lastActTime = GetTick();
 			KwRunStat.lastRecvtime = GetTick();			
+		return 0;
+}
+
+int KWireLessStart(void)
+{
+    if(WLCfg.bMaster)
+    {
+			KWLMasterSendReqPkt(1);
+    }
+    else
+    {
+			KwStartRecv(1);
     }
     
 //    while( 1 )
@@ -221,50 +343,58 @@
 	return 0;
 }
 
+
 void OnTxDone( void )
 {   
-		KwRunStat.runStep=RS_IDEL;
+		KwRunStat.bMasterSent = 1;
+		KwRunStat.bMasterRecved = 0;
+		KwRunStat.runStep=RS_IDLE;
 		KMem.WDT[42]++;
 		KwRunStat.lastSenttime = GetTick();
 		KwRunStat.lastAckTime = GetTick();
     Radio.Standby();
-		if (RadioEnableMaster) {
+		if (WLCfg.bMaster) {
 			Radio.Rx( MASTER_RX_TIMEOUT_VALUE ); //杩涘叆鎺ユ敹
 		}	else 	{
-			Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); //杩涘叆鎺ユ敹
+			KwStartRecv(1);
+			//Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); //杩涘叆鎺ユ敹
 		}
 		KwRunStat.runStep=RS_RECVING;
 		
 		KwRunStat.lastActTime = GetTick();	
 		KwRunStat.lastRecvtime = GetTick();
 		LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_14);
-			int us2=GetTick();
-			KMem.ScanTimeuS=us2-KMem.LastScanTime;
-		KMem.LastScanTime = us2;
-		if (KMem.ScanTimeuS < KMem.MinScanTimeuS) {KMem.MinScanTimeuS = KMem.ScanTimeuS;}
-		if (KMem.ScanTimeuS > KMem.MaxScanTimeuS) {KMem.MaxScanTimeuS = KMem.ScanTimeuS;}
+//			int us2=GetTick();
+//			KMem.ScanTimeuS=us2-KMem.LastScanTime;
+//			KMem.LastScanTime = us2;
+//		if (KMem.ScanTimeuS < KMem.MinScanTimeuS) {KMem.MinScanTimeuS = KMem.ScanTimeuS;}
+//		if (KMem.ScanTimeuS > KMem.MaxScanTimeuS) {KMem.MaxScanTimeuS = KMem.ScanTimeuS;}
 		
 }
 
 void OnTxTimeout( void )
 {
-		KwRunStat.runStep=RS_IDEL;
+		KwRunStat.runStep=RS_IDLE;
 		KwRunStat.lastAckTime = GetTick();
 		KwRunStat.TXErr++;
     Radio.Standby();	
-    KMem.WDT[44]++;
+//    KMem.WDT[44]++;
 }
 bool bThisRxError=0;
 
 void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
 {
-    memcpy( RX_Buffer, payload, size );	
+		KMem.WDT[44] = size;
+		if (size <= 120) {
+			memcpy( KwRx_Buffer, payload, size );	
+			memcpy(&KMem.WDT[64],payload,size);
+		}else
+		{
+			
+		}
     Radio.Standby();
-	
-		if (bThisRxError) {bThisRxError=0;return;}
-		
-		KwRunStat.lastRecvdtime=GetTick();
-		KwRunStat.lastAckTime = GetTick();
+		KwRunStat.runStep = RS_IDLE;
+
 		
 		KwRunStat.curStat = 0;
 		KwRunStat.latancy = GetTick() - KwRunStat.lastSendtime;
@@ -275,140 +405,264 @@
 		KwRunStat.RSSI = RssiValue;
 		KwRunStat.SNR = SnrValue;
 	
-    KMem.WDT[40]=-RssiValue; //Radio.Rssi(MODEM_FSK);;
-		KMem.WDT[40]=-RssiValue + ((-SnrValue) <<8);
-		
-		KMem.WDT[43]++;
 		KwRunStat.recvCount++;
-		KwRunStat.CtnLstPkts=0;
+//	KwRunStat.CtnLstPkts=0;
 
-//*/	
-	unsigned char indicator1 = 128+RssiValue;
-	unsigned char indicator2;
-	const unsigned char maxrssi = 100;
-	const unsigned char minrssi = 30;
-	if (indicator1 > maxrssi) indicator2=8; 
-	else if (indicator1 < minrssi) indicator2 = 0;
-	
-	else indicator2 = (indicator1 - minrssi)*7/(maxrssi-minrssi) + 1;
-	
-	unsigned char indicator3 = (1 << indicator2) -1;
-    if(RadioEnableMaster)
+    if(WLCfg.bMaster)
     {
-					KWLMasterParsePkt(1,size);
+				KWLMasterParsePkt(WLCfg.nChannel,size);
 			//KWLMasterSendReqPkt(1);
     }
     else			//slave
     {
-			KWLSlaveParsePkt(1,size);
-
+				KWLSlaveParsePkt(WLCfg.nChannel,size);
     }
+		if (bThisRxError) {
+			bThisRxError=0;
+	//		return;
+		}
 }
 
 void OnRxTimeout( void )
 {
-		KwRunStat.runStep=RS_IDEL;
+		KwRunStat.runStep=RS_IDLE;
 	
     Radio.Standby();
 		KwRunStat.lastErrTime = GetTick() - KwRunStat.lastAckTime;
 		KwRunStat.lastAckTime = GetTick();
 	
+		KwRunStat.Tx_Power+=6;				//涓㈠寘锛� 澧炲姞鍙戝皠鍔熺巼
+		if (KwRunStat.Tx_Power > WLCfg.Tx_Power) {KwRunStat.Tx_Power= WLCfg.Tx_Power; }
+		SX126xSetRfTxPower(KwRunStat.Tx_Power);
+						
+	
 		KMem.WDT[45]++;
 		KwRunStat.LostPackets++;
 		KwRunStat.CtnLstPkts++;
 		if (KwRunStat.CtnLstPkts > KwRunStat.MaxCtnLstPkts) {KwRunStat.MaxCtnLstPkts = KwRunStat.CtnLstPkts;}
-//		KMem.ErrStat=500;
-		if (KwRunStat.CtnLstPkts > 1) {		KMem.ErrStat=500;}
-			if (KwRunStat.CtnLstPkts == 2) {KwRunStat.Err1Count++;}
-		if (KwRunStat.CtnLstPkts > 3) {		KMem.ErrStat=5000;}
-			if (KwRunStat.CtnLstPkts == 4) {KwRunStat.Err2Count++;}
-		if (KwRunStat.CtnLstPkts > 6) {	KMem.ErrStat=5000; KMem.WFX[1]=0; }
-			if (KwRunStat.CtnLstPkts == 7) {KwRunStat.Err3Count++;}		
-		
-    if(RadioEnableMaster)
+//		KwRunStat.ErrStat=500;
+		if (KwRunStat.CtnLstPkts > 2) {		KwRunStat.ErrStat=500;}
+			if (KwRunStat.CtnLstPkts ==3 ) {KwRunStat.Err1Count++;}
+		if (KwRunStat.CtnLstPkts > 5) {		KwRunStat.ErrStat=5000;}
+			if (KwRunStat.CtnLstPkts == 6) {KwRunStat.Err2Count++;}
+		if (KwRunStat.CtnLstPkts > 9) {	KwRunStat.ErrStat=5000; KMem.WFX[1]=0; }
+			if (KwRunStat.CtnLstPkts == 10) {KwRunStat.Err3Count++;}		
+		if ((KwRunStat.CtnLstPkts &0x0f) == 0x0f) {
+				KMem.WDT[51]++;
+				KwResetRf();
+				Radio.Standby();
+			//	KWireLessStart();
+		}
+    if(WLCfg.bMaster)
     {
 			//KWLMasterSendReqPkt(1);
     }
     else
     {
-      Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); 
-			KwRunStat.runStep=RS_RECVING;
-			KwRunStat.lastActTime = GetTick();			
-			KwRunStat.lastRecvtime = GetTick();
+			KwStartRecv(1);
+//			Radio.Standby();
+//     Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); 
+//			KwRunStat.runStep=RS_RECVING;
+//			KwRunStat.lastActTime = GetTick();			
+//			KwRunStat.lastRecvtime = GetTick();
     }
 }
 
 
 void OnRxError( void )
 {
-
-//    Radio.Standby();
+			KwStartRecv(1);
+//			Radio.Standby();
+//     Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); 
+//			KwRunStat.runStep=RS_RECVING;
+//			KwRunStat.lastActTime = GetTick();			
+//			KwRunStat.lastRecvtime = GetTick();			
+	
 			KwRunStat.RXErr++;
 			KMem.WDT[46]++;
 			bThisRxError=1;
 		KwRunStat.lastErrTime = GetTick() - KwRunStat.lastAckTime;
 	
-    if(RadioEnableMaster)
+    if(WLCfg.bMaster)
     {
 //			SendPingMsg();
     }
     else
     {
+/*			
 //      Radio.Rx( RX_TIMEOUT_VALUE ); 
 				//KwRunStat.lastActTime = GetTick();			
 			KwRunStat.LostPackets++;
 			KwRunStat.CtnLstPkts++;
 			if (KwRunStat.CtnLstPkts > KwRunStat.MaxCtnLstPkts) {KwRunStat.MaxCtnLstPkts = KwRunStat.CtnLstPkts;}
-//			KMem.ErrStat=500;
-			if (KwRunStat.CtnLstPkts > 1) {		KMem.ErrStat=500; }			
+//			KwRunStat.ErrStat=500;
+			if (KwRunStat.CtnLstPkts > 1) {		KwRunStat.ErrStat=500; }			
 			if (KwRunStat.CtnLstPkts == 2) {KwRunStat.Err1Count++;}
-			if (KwRunStat.CtnLstPkts > 3) {		KMem.ErrStat=5000;}
+			if (KwRunStat.CtnLstPkts > 3) {		KwRunStat.ErrStat=5000;}
 			if (KwRunStat.CtnLstPkts == 4) {KwRunStat.Err2Count++;}
-			if (KwRunStat.CtnLstPkts > 6) {	KMem.ErrStat=5000; KMem.WFX[1]=0; }
+			if (KwRunStat.CtnLstPkts > 6) {	KwRunStat.ErrStat=5000; KMem.WFX[1]=0; }
 			if (KwRunStat.CtnLstPkts == 7) {KwRunStat.Err3Count++;}
+*/			
     }
+//		Radio.Standby();
 }
 
 void OnCadDone( bool channelActivityDetected)
 {
+	KMem.WDT[60]++;
 	KwRunStat.CADDoneCount++;
+	KwRunStat.lastAckTime = GetTick();
+	KMem.WDT[16] = KwRunStat.lastAckTime - KwRunStat.lastActTime;
+	if (channelActivityDetected) {
+		KwRunStat.CADNgCount++;
+		KMem.WDT[61]++;
+		Radio.StartCad();
+		KwRunStat.lastActTime = GetTick();
+	}
+	else {
+		KwRunStat.CADOkCount++;
+		KMem.WDT[62]++;
+		if (WLCfg.bMaster) {
+			if (KwRunStat.curStat == 0 ){ //&& stat == RF_IDLE )	//200mS
+	//					Radio.Standby();
+				KWireLessStart();
+			}else {
+				Radio.Standby();
+				KWireLessStart();
+			}
+		}else {
+			KWLSlaveSendRplyPkt(1);
+		}
+	}
 	return;
 }
+
 int KWLMasterParsePkt(int nChn,int size)
 {
 	bool CRC_OK =1;
 ///*		
-	crc_value=RadioComputeCRC(RX_Buffer,size-2,CRC_TYPE_IBM);//璁$畻寰楀嚭瑕佸彂閫佹暟鎹寘CRC鍊�
-	if (RX_Buffer[size-2] != (crc_value&0xff) && RX_Buffer[size-1] != (crc_value >> 8))
+	crc_value=RadioComputeCRC(KwRx_Buffer,size-2,CRC_TYPE_IBM);//璁$畻寰楀嚭瑕佸彂閫佹暟鎹寘CRC鍊�
+	if (KwRx_Buffer[size-2] != (crc_value&0xff) && KwRx_Buffer[size-1] != (crc_value >> 8))
 	{
 		KwRunStat.CRCErr++;
-		KMem.ErrStat=500;
+		KwRunStat.ErrStat=500;
 		CRC_OK = 0;
 	}else {
 		CRC_OK = 1;
 	}	
 //*/	
-	pstKLPacket p1 = (pstKLPacket) RX_Buffer;
-      if(CRC_OK && p1->STSign == enRplySign) //memcmp(RX_Buffer,PongMsg,4)==0 
+	pstKwPacket p1 = (pstKwPacket) KwRx_Buffer;
+      if(CRC_OK && p1->STSign == enRplySign ) //memcmp(RX_Buffer,PongMsg,4)==0 
       {
-					LedToggle();//LED闂儊
-				if (p1->Stat==0) {
-					KwRunStat.tRSSI = RX_Buffer[10];
-					KwRunStat.tSNR = RX_Buffer[11];
-				}else if (p1->Stat==1){
-					KwRunStat.targetSentCount = RX_Buffer[8] + (RX_Buffer[9]<<8) + (RX_Buffer[10]<<16) + (RX_Buffer[11]<<24);
-				}else if (p1->Stat==2) {
-					KwRunStat.targetRecvdCount = RX_Buffer[8] + (RX_Buffer[9]<<8) + (RX_Buffer[10]<<16) + (RX_Buffer[11]<<24);
-				}else if (p1->Stat==3) {
-				}
+				if (p1->DstAddr == MixAddr(WLCfg.nChannel,WLCfg.nRadioAddr))
+					{
+						KwRunStat.bMasterRecved = 1;						
+						LedToggle();//LED闂儊
+						KwRunStat.lastRecvdtime=GetTick();
+						KwRunStat.lastAckTime = GetTick();						
+						KwRunStat.CtnLstPkts=0;						
+						
+						if (p1->Stat==0) {
+							KwRunStat.tRSSI = KwRx_Buffer[10];
+							KwRunStat.tSNR = KwRx_Buffer[11];
+							if (KwRunStat.tRSSI > -50) {
+								if (KwRunStat.Tx_Power > 0) {KwRunStat.Tx_Power--; SX126xSetRfTxPower(KwRunStat.Tx_Power);}
+							}else if (KwRunStat.tRSSI < -60) {
+								KwRunStat.Tx_Power+=6;
+								if (KwRunStat.Tx_Power > WLCfg.Tx_Power) {KwRunStat.Tx_Power= WLCfg.Tx_Power; }
+								SX126xSetRfTxPower(KwRunStat.Tx_Power);
+							}
+							
+						}else if (p1->Stat==1){
+							KwRunStat.targetSentCount = KwRx_Buffer[8] + (KwRx_Buffer[9]<<8) + (KwRx_Buffer[10]<<16) + (KwRx_Buffer[11]<<24);
+						}else if (p1->Stat==2) {
+							KwRunStat.targetRecvdCount = KwRx_Buffer[8] + (KwRx_Buffer[9]<<8) + (KwRx_Buffer[10]<<16) + (KwRx_Buffer[11]<<24);
+						}else if (p1->Stat==3) {
+						}
 
-					KMem.WDT[41]=(-KwRunStat.tRSSI) + ((-KwRunStat.tSNR)<<8);
-				
+							KMem.WDT[41]=(-KwRunStat.tRSSI) + ((-KwRunStat.tSNR)<<8);
 
-					KMem.WFX[1]=(RX_Buffer[4]) + (RX_Buffer[5]<<8);
-			//		KMem.WFX[1]=(RX_Buffer[4]) + (indicator3<<8);
-				
-					KMem.WFX[2]=(RX_Buffer[6]) + (RX_Buffer[7]<<8);
+							KMem.WFX[1]=(KwRx_Buffer[4]) + (KwRx_Buffer[5]<<8);
+					//		KMem.WFX[1]=(RX_Buffer[4]) + (indicator3<<8);
+						
+							KMem.WFX[2]=(KwRx_Buffer[6]) + (KwRx_Buffer[7]<<8);
+						
+// 鏁版嵁閫忎紶  鏁版嵁鐨勫彂閫佹垚鍔熶笌鍚︼紝闇�瑕佸湪瀵规柟鐨勫簲绛斿寘涓‘璁�
+						if (KwRunStat.sizesending > 0) {			
+							//  纭姝e湪鍙戦�佺殑锛屽彂閫佹垚鍔�
+							KwRunStat.sentsize += KwRunStat.sizesending;
+							KwRunStat.sizesending = 0;
+							
+							if (KwRunStat.sentsize >= KwRunStat.sizetosend) {
+								//鏁翠綋 鍙戦�佸畬鎴�
+								KwRunStat.sizetosend =0;
+								KwRunStat.sentsize = 0;
+								KwRunStat.ttAirSize = 0;
+								// 鍙戦�佸畬鎴�
+							}
+						}	
+// 鎺ュ彈鍒板鏂瑰彂鏉ョ殑鏁版嵁
+
+						if (p1->bHasData && size >= 14+3 ) {
+//							int nFulllen1 = KwRx_Buffer[12];
+							int nthislen2 = KwRx_Buffer[13];
+							if (size >= 14 + nthislen2) {
+								if (p1->bHead) {
+									// 鏁版嵁鍖呯殑璧峰锛� 涓�涓柊鐨勬暟鎹寘鐨勫紑濮�
+									KwRunStat.ttRxSize = 0;
+//									SendPacket(1, "H", 1);
+									
+								}
+								memcpy (KwRunStat.ttRxBuf1 + KwRunStat.ttRxSize , KwRx_Buffer + 14 , nthislen2);
+								KwRunStat.ttRxSize += nthislen2;
+								if (p1->bTail) 
+									{
+									// 宸茬粡鏀跺埌瀹屾暣鐨勪竴涓暟鎹寘
+									KwRunStat.ttRxRecved =1;
+									KwRunStat.ErrStat=500;						
+//									SendPacket(1, "T", 1);
+									
+									// 鍚庣画鏁版嵁鍖呭鐞嗘祦绋� ;
+								 if (Uart1Mode == 1) {		// 澶勪簬閫忎紶妯″紡锛� 鏁版嵁鍙戝洖鍘汇��
+										SendPacket(1, KwRunStat.ttRxBuf1, KwRunStat.ttRxSize);
+								 }
+									KwRunStat.ttRxSize = 0;
+									KwRunStat.ttRxRecved = 0;									 
+								 
+									// 鏆傛椂娴佺▼锛屽叏閮ㄥ彂鍥炲幓銆�
+//									memcpy (KwRunStat.ttTxBuf1, KwRunStat.ttRxBuf1, KwRunStat.ttRxSize);
+//									KwRunStat.sizetosend = KwRunStat.ttRxSize;
+//									KwRunStat.sentsize = 0;
+//									KwRunStat.sizesending = 0;
+								}
+
+							}
+						}
+
+/*
+
+
+						
+						if (KwRunStat.ttAirSize > 0)
+						{
+							if (KwRunStat.bttAirHeader) {	KwRunStat.ttRxRecved=0;	}
+							memcpy(KwRunStat.ttRxBuf1 + KwRunStat.ttRxRecved,KwRunStat.ttAirBuf, KwRunStat.ttAirSize);
+							KwRunStat.ttRxRecved += KwRunStat.ttAirSize;
+							
+							if (KwRunStat.bttAirTail) {
+								// 鏀跺埌	涓�涓暟鎹寘鐨勬渶鍚庨儴鍒�	
+									KwRunStat.ttRxSize = KwRunStat.ttRxRecved;
+								 if (Uart1Mode == 1) {		// 澶勪簬閫忎紶妯″紡锛� 鏁版嵁鍙戝洖鍘汇��
+										SendPacket(1, KwRunStat.ttRxBuf1, KwRunStat.ttRxSize);
+								 }
+								KwRunStat.ttRxSize = 0;
+								KwRunStat.ttRxRecved = 0;
+							}
+							KwRunStat.ttAirSize = 0;
+						}
+*/						
+						
+					}
       }
 	
 	return 0;
@@ -416,46 +670,120 @@
 int KWLSlaveParsePkt(int nChn,int size)
 {
 		bool CRC_OK =1;
-	pstKLPacket p1 = (pstKLPacket) RX_Buffer;	
+	pstKwPacket p1 = (pstKwPacket) KwRx_Buffer;	
 ///*		
-	crc_value=RadioComputeCRC(RX_Buffer,size-2,CRC_TYPE_IBM);//璁$畻寰楀嚭瑕佸彂閫佹暟鎹寘CRC鍊�
-	if (RX_Buffer[size-2] != (crc_value&0xff) && RX_Buffer[size-1] != (crc_value >> 8))
+	crc_value=RadioComputeCRC(KwRx_Buffer,size-2,CRC_TYPE_IBM);//璁$畻寰楀嚭瑕佸彂閫佹暟鎹寘CRC鍊�
+	if (KwRx_Buffer[size-2] != (crc_value&0xff) && KwRx_Buffer[size-1] != (crc_value >> 8))
 	{
 		KwRunStat.CRCErr++;
-		KMem.ErrStat=500;
+//		KwRunStat.ErrStat=500;
 		CRC_OK = 0;
 	}else {
 		CRC_OK = 1;
+			if (p1->STSign != enReqSign) {
+				KwRunStat.PktErr++;
+			}else {
+				if (p1->DstAddr != MixAddr(WLCfg.nChannel,WLCfg.nRadioAddr)) {
+					KwRunStat.ChnErr++;
+					KwRunStat.nErrChn = p1->DstAddr;
+				}
+			}				
 	}
 //*/	
-      if(CRC_OK && p1->STSign == enReqSign)// memcmp(RX_Buffer,PingMsg,4)==0 && )
+
+      if(CRC_OK && p1->STSign == enReqSign && p1->DstAddr == MixAddr(WLCfg.nChannel,WLCfg.nRadioAddr))// memcmp(RX_Buffer,PingMsg,4)==0 && )
       {
+
         LedToggle();//LED闂儊
-				if (p1->Stat==0) {
-					KwRunStat.tRSSI = RX_Buffer[10];
-					KwRunStat.tSNR = RX_Buffer[11];
-				}else if (p1->Stat==1){
-					KwRunStat.targetSentCount = RX_Buffer[8] + (RX_Buffer[9]<<8) + (RX_Buffer[10]<<16) + (RX_Buffer[11]<<24);
-				}else if (p1->Stat==2) {
-					KwRunStat.targetRecvdCount = RX_Buffer[8] + (RX_Buffer[9]<<8) + (RX_Buffer[10]<<16) + (RX_Buffer[11]<<24);
-				}else if (p1->Stat==3) {
+				KwRunStat.lastRecvdtime=GetTick();
+				KwRunStat.lastAckTime = GetTick();				
+				KwRunStat.CtnLstPkts=0;
+				int nSeq = p1->nSeq;
+				if (nSeq==0) {
+					KwRunStat.tRSSI = KwRx_Buffer[10];
+					KwRunStat.tSNR = KwRx_Buffer[11];
+							if (KwRunStat.tRSSI > -50) {
+								if (KwRunStat.Tx_Power > 0) {KwRunStat.Tx_Power--; SX126xSetRfTxPower(KwRunStat.Tx_Power);}
+							}else if (KwRunStat.tRSSI < -60) {
+								KwRunStat.Tx_Power+=6;
+								if (KwRunStat.Tx_Power > WLCfg.Tx_Power) {KwRunStat.Tx_Power= WLCfg.Tx_Power; }
+								SX126xSetRfTxPower(KwRunStat.Tx_Power);
+							}
+				}else if (nSeq==1){
+					KwRunStat.targetSentCount = KwRx_Buffer[8] + (KwRx_Buffer[9]<<8) + (KwRx_Buffer[10]<<16) + (KwRx_Buffer[11]<<24);
+				}else if (nSeq==2) {
+					KwRunStat.targetRecvdCount = KwRx_Buffer[8] + (KwRx_Buffer[9]<<8) + (KwRx_Buffer[10]<<16) + (KwRx_Buffer[11]<<24);
+				}else if (nSeq==3) {
 				}
-				KMem.WFX[1]=(RX_Buffer[4]) + (RX_Buffer[5]<<8);
+				KMem.WFX[1]=(KwRx_Buffer[4]) + (KwRx_Buffer[5]<<8);
 			//	KMem.WFX[1]=(RX_Buffer[4]) + (indicator3<<8);
 				
-				KMem.WFX[2]=(RX_Buffer[6]) + (RX_Buffer[7]<<8);				
+				KMem.WFX[2]=(KwRx_Buffer[6]) + (KwRx_Buffer[7]<<8);				
 
-        KWLSlaveSendRplyPkt(1);
+// 鏁版嵁閫忎紶  鏁版嵁鐨勫彂閫佹垚鍔熶笌鍚︼紝闇�瑕佸湪瀵规柟鐨勫簲绛斿寘涓‘璁�
+						if (KwRunStat.sizesending > 0) {			
+							//  纭姝e湪鍙戦�佺殑锛屽彂閫佹垚鍔�
+							KwRunStat.sentsize += KwRunStat.sizesending;
+							KwRunStat.sizesending = 0;
+							
+							if (KwRunStat.sentsize >= KwRunStat.sizetosend) {
+								//鏁翠綋 鍙戦�佸畬鎴�
+								KwRunStat.sizetosend =0;
+								KwRunStat.sentsize = 0;
+								KwRunStat.ttAirSize = 0;
+								// 鍙戦�佸畬鎴�
+							}
+						}	
 				
+				if (p1->bHasData && size >= 14+3 ) {
+//					int nFulllen1 = KwRx_Buffer[12];
+					int nthislen2 = KwRx_Buffer[13];
+					if (size >= 14 + nthislen2) {
+						// 鏀跺埌涓�涓悎鏍肩殑鎼哄甫浼犵粺鏁版嵁鐨� 鍖呫��
+						if (p1->bHead) {
+							// 鏁版嵁娈电殑璧峰锛� 涓�涓柊鐨勬暟鎹鐨勫紑濮�
+							KwRunStat.ttRxSize = 0;
+						}
+						memcpy (KwRunStat.ttRxBuf1 + KwRunStat.ttRxSize, KwRx_Buffer + 14 , nthislen2);
+						KwRunStat.ttRxSize += nthislen2;
+						if (p1->bTail) {
+							// 宸茬粡鏀跺埌瀹屾暣鐨勪竴涓暟鎹
+							KwRunStat.ttRxRecved =1;
+							KwRunStat.ErrStat=500;						
+							
+							// 鍚庣画鏁版嵁娈靛鐞嗘祦绋� ;
+								 if (Uart1Mode == 1) {		// 澶勪簬閫忎紶妯″紡锛� 鏁版嵁鍙戝洖鍘汇��
+										SendPacket(1, KwRunStat.ttRxBuf1, KwRunStat.ttRxSize);
+								 }
+									KwRunStat.ttRxSize = 0;
+									KwRunStat.ttRxRecved = 0;									 							
+							
+							// 鏆傛椂娴佺▼锛屽叏閮ㄥ彂鍥炲幓銆�
+//							memcpy (KwRunStat.ttTxBuf1, KwRunStat.ttRxBuf1, KwRunStat.ttRxSize);
+//							KwRunStat.sizetosend = KwRunStat.ttRxSize;
+//							KwRunStat.sentsize = 0;
+//							KwRunStat.sizesending = 0;
+//							KwRunStat.ttRxRecved = 0;
+//							KwRunStat.ttRxSize = 0; 
+							
+						}
+
+					}
+					
+				
+				}
+        KWLSlaveSendRplyPkt(1);
+			//	Radio.StartCad();
 //				KMem.WFY[0]=(RX_Buffer[4]<<8) + RX_Buffer[5];
 //				KMem.WFY[1]=(RX_Buffer[6]<<8) + RX_Buffer[7];				
       }
       else
       {
-        Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); 
-				KwRunStat.runStep=RS_RECVING;
-				KwRunStat.lastActTime = GetTick();				
-				KwRunStat.lastRecvtime = GetTick();
+				KwStartRecv(1);
+//        Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); 
+//				KwRunStat.runStep=RS_RECVING;
+//				KwRunStat.lastActTime = GetTick();				
+//				KwRunStat.lastRecvtime = GetTick();
 				
       }   	
 	return 0;
@@ -464,48 +792,77 @@
 int KWLMasterSendReqPkt(int nChn)
 {
 	int len1=12;
-	pstKLPacket p1 = (pstKLPacket) TX_Buffer;
+	pstKwPacket p1 = (pstKwPacket) KwTx_Buffer;
 	p1->STSign = enReqSign;
-	p1->DstAddr = (nRadioChannel<<4) || 0x1;
+	p1->DstAddr = MixAddr(WLCfg.nChannel,WLCfg.nRadioAddr);
 	p1->Func = 0x3;
-	p1->Stat = (p1->Stat + 1) &0x03;   //0x00;
+	KwRunStat.nSeq = (KwRunStat.nSeq + 1)&0x03;
+	p1->Stat = KwRunStat.nSeq;   //0x00;
 	p1->Data[0]=KMem.WFY[1]; 
 	p1->Data[1]=KMem.WFY[1]>>8; 
 	p1->Data[2]=KMem.WFY[2]; 
 	p1->Data[3]=KMem.WFY[2]>>8; 
 	
-/*	
-			TX_Buffer[0] = 'P';
-			TX_Buffer[1] = 'I';
-			TX_Buffer[2] = 'N';
-			TX_Buffer[3] = 'G'; 
-			TX_Buffer[4] = KMem.WFY[1]; 
-			TX_Buffer[5] = KMem.WFY[1]>>8; 
-			TX_Buffer[6] = KMem.WFY[2]; 
-			TX_Buffer[7] = KMem.WFY[2]>>8; 
-*/
 
 	if (p1->Stat == 0)
 	{
-			TX_Buffer[10] = RssiValue;
-			TX_Buffer[11] = SnrValue;
+			KwTx_Buffer[10] = RssiValue;
+			KwTx_Buffer[11] = SnrValue;
 	}else if (p1->Stat == 1){
-		memcpy(TX_Buffer+8,&KwRunStat.sentCount,4);
+		memcpy(KwTx_Buffer+8,&KwRunStat.sentCount,4);
 	}else if (p1->Stat == 2) {
-		memcpy(TX_Buffer+8,&KwRunStat.recvCount,4);		
+		memcpy(KwTx_Buffer+8,&KwRunStat.recvCount,4);		
 	}else if (p1->Stat == 3) {
 		
 	}
-			crc_value=RadioComputeCRC(TX_Buffer,len1,CRC_TYPE_IBM);//璁$畻寰楀嚭瑕佸彂閫佹暟鎹寘CRC鍊�
-			TX_Buffer[len1]=crc_value;
-			TX_Buffer[len1+1]=crc_value>>8;
-	
+// 鍙楅檺浜庣┖涓寘澶у皬鐨勯檺鍒讹紝 閫忎紶鏁版嵁鍙兘闇�瑕佸垎鍑犳鍙戦�併��
+// 鍙戦�佹柟璐熻矗鎷嗗寘锛� 鎺ユ敹鏂硅礋璐� 鍚堝寘锛�  鍙戦�佹柟鍙戦�佺涓�涓寘锛屾湁璧峰鏍囧織锛� 鍙戦�佹柟鍙戦�佹渶鍚庝竴涓寘锛屾湁缁撴潫鏍囧織銆�
+// 濡傛灉鍙湁涓�涓寘鐨勬暟鎹紝鍒欏悓鏃跺叿鏈夎捣濮嬪拰缁撴潫鏍囧織銆�
+// 涓棿鐨勬暟鎹寘锛屼笉鍏锋湁璧峰鏍囧織锛屼篃涓嶅叿鏈夌粨鏉熸爣蹇椼��
+// 鍒╃敤鍖呭簭鍒楀彿鏉ヤ繚璇� 涓棿 鐨勬暟鎹寘鐨� 瀹屾暣鎬� 鍜岄『搴忔纭�с��
+// 鍏堝疄鐜�1涓寘鐨勮浆鍙戙��	
+			if (KwRunStat.sizetosend > 0) {
+				uchar bStart=0,bEnd=1;
+				int16_t thisToSend = KwRunStat.sizetosend - KwRunStat.sentsize;
+				if (thisToSend > WL_TT_EACH_SIZE) { thisToSend = WL_TT_EACH_SIZE; bEnd=0;}
+				
+				if (KwRunStat.sentsize == 0) {		// 绗竴娆″彂閫�
+					bStart = 1;
+				}
+				
+				memcpy(KwRunStat.ttAirBuf, KwRunStat.ttTxBuf1 + KwRunStat.sentsize , thisToSend);			// 鍙戦�佹暟鎹紝 濡傛灉涓婃鏈夛紝缁х画涓婃鐨勫彂銆�
+				
+				KwRunStat.sizesending = thisToSend;
+				KwRunStat.ttAirSize = thisToSend;
+
+//				KwRunStat.sentsize = 0;
+				KwRunStat.bttAirHeader = bStart;
+				KwRunStat.bttAirTail = bEnd;
+				
+				p1->bHasData=1;
+				p1->bHead = bStart;
+				p1->bTail = bEnd;
+				
+				KwTx_Buffer[len1] = KwRunStat.sizetosend;
+				KwTx_Buffer[len1+1] = thisToSend;
+				
+				memcpy( KwTx_Buffer + len1 + 2 , KwRunStat.ttTxBuf1 + KwRunStat.sentsize, thisToSend);
+				len1 += 2 + thisToSend;
+				
+			}
+			
+
+			crc_value=RadioComputeCRC(KwTx_Buffer,len1,CRC_TYPE_IBM);//璁$畻寰楀嚭瑕佸彂閫佹暟鎹寘CRC鍊�
+			KwTx_Buffer[len1]=crc_value;
+			KwTx_Buffer[len1+1]=crc_value>>8;
+			
+			
 			KMem.WDT[56]=crc_value;
-	
+
 			KwRunStat.sentCount++;
 			KwRunStat.cycleTime = GetTick()- KwRunStat.lastSendtime ;	
 			KwRunStat.lastSendtime = GetTick();	
-			Radio.Send( TX_Buffer, len1+2);
+			Radio.Send( KwTx_Buffer, len1+2);
 			KwRunStat.runStep=RS_SENDING;
 			KwRunStat.lastActTime = GetTick();
 	
@@ -515,41 +872,69 @@
 int KWLSlaveSendRplyPkt(int nChn)
 {
 	int len1=12;
-	pstKLPacket p1 = (pstKLPacket) TX_Buffer;
+	pstKwPacket p1 = (pstKwPacket) KwTx_Buffer;
 	p1->STSign = enRplySign;
-	p1->DstAddr = (nRadioChannel<<4) || 0x1;
+	p1->DstAddr = MixAddr(WLCfg.nChannel,WLCfg.nRadioAddr);
 	p1->Func = 0x3;
 	p1->Stat = (p1->Stat + 1) &0x03;   //0x00;
 	p1->Data[0]=KMem.WFY[1]; 
 	p1->Data[1]=KMem.WFY[1]>>8; 
 	p1->Data[2]=KMem.WFY[2]; 
 	p1->Data[3]=KMem.WFY[2]>>8; 
-/*	
-			TX_Buffer[0] = 'P';
-			TX_Buffer[1] = 'O';
-			TX_Buffer[2] = 'N';
-			TX_Buffer[3] = 'G'; 
-			TX_Buffer[4] = KMem.WFY[1]; 
-			TX_Buffer[5] = KMem.WFY[1]>>8; 
-			TX_Buffer[6] = KMem.WFY[2]; 
-			TX_Buffer[7] = KMem.WFY[2]>>8; 
-*/
+
 	if (p1->Stat == 0)
 	{
-			TX_Buffer[10] = RssiValue;
-			TX_Buffer[11] = SnrValue;
+			KwTx_Buffer[10] = RssiValue;
+			KwTx_Buffer[11] = SnrValue;
 	}else if (p1->Stat == 1){
-		memcpy(TX_Buffer+8,&KwRunStat.sentCount,4);
+		memcpy(KwTx_Buffer+8,&KwRunStat.sentCount,4);
 	}else if (p1->Stat == 2) {
-		memcpy(TX_Buffer+8,&KwRunStat.recvCount,4);		
+		memcpy(KwTx_Buffer+8,&KwRunStat.recvCount,4);		
 	}else if (p1->Stat == 3) {
 		
 	}	
 
-			crc_value=RadioComputeCRC(TX_Buffer,len1,CRC_TYPE_IBM);//璁$畻寰楀嚭瑕佸彂閫佹暟鎹寘CRC鍊�
-			TX_Buffer[len1]=crc_value;
-			TX_Buffer[len1+1]=crc_value>>8;
-			Radio.Send( TX_Buffer, len1+2);	
+// 鍙楅檺浜庣┖涓寘澶у皬鐨勯檺鍒讹紝 閫忎紶鏁版嵁鍙兘闇�瑕佸垎鍑犳鍙戦�併��
+// 鍙戦�佹柟璐熻矗鎷嗗寘锛� 鎺ユ敹鏂硅礋璐� 鍚堝寘锛�  鍙戦�佹柟鍙戦�佺涓�涓寘锛屾湁璧峰鏍囧織锛� 鍙戦�佹柟鍙戦�佹渶鍚庝竴涓寘锛屾湁缁撴潫鏍囧織銆�
+// 濡傛灉鍙湁涓�涓寘鐨勬暟鎹紝鍒欏悓鏃跺叿鏈夎捣濮嬪拰缁撴潫鏍囧織銆�
+// 涓棿鐨勬暟鎹寘锛屼笉鍏锋湁璧峰鏍囧織锛屼篃涓嶅叿鏈夌粨鏉熸爣蹇椼��
+// 鍒╃敤鍖呭簭鍒楀彿鏉ヤ繚璇� 涓棿 鐨勬暟鎹寘鐨� 瀹屾暣鎬� 鍜岄『搴忔纭�с��
+// 鍏堝疄鐜�1涓寘鐨勮浆鍙戙��	
+	
+			if (KwRunStat.sizetosend > 0) {
+				uchar bStart=0,bEnd=1;
+				int16_t thisToSend = KwRunStat.sizetosend - KwRunStat.sentsize;
+				if (thisToSend > WL_TT_EACH_SIZE) { thisToSend = WL_TT_EACH_SIZE; bEnd=0;}
+				
+				if (KwRunStat.sentsize == 0) {		// 绗竴娆″彂閫�
+					bStart = 1;
+				}
+				
+				memcpy(KwRunStat.ttAirBuf, KwRunStat.ttTxBuf1 + KwRunStat.sentsize , thisToSend);			// 鍙戦�佹暟鎹紝 濡傛灉涓婃鏈夛紝缁х画涓婃鐨勫彂銆�
+				
+				KwRunStat.sizesending = thisToSend;
+				KwRunStat.ttAirSize = thisToSend;
+
+//				KwRunStat.sentsize = 0;
+				KwRunStat.bttAirHeader = bStart;
+				KwRunStat.bttAirTail = bEnd;
+				
+				p1->bHasData=1;
+				p1->bHead = bStart;
+				p1->bTail = bEnd;
+				
+				KwTx_Buffer[len1] = KwRunStat.sizetosend;
+				KwTx_Buffer[len1+1] = thisToSend;
+				
+				memcpy( KwTx_Buffer + len1 + 2 , KwRunStat.ttTxBuf1 + KwRunStat.sentsize, thisToSend);
+				len1 += 2 + thisToSend;
+				
+			}
+	
+			crc_value=RadioComputeCRC(KwTx_Buffer,len1,CRC_TYPE_IBM);//璁$畻寰楀嚭瑕佸彂閫佹暟鎹寘CRC鍊�
+			KwTx_Buffer[len1]=crc_value;
+			KwTx_Buffer[len1+1]=crc_value>>8;
+			Radio.Send( KwTx_Buffer, len1+2);	
 			KwRunStat.runStep=RS_SENDING;
 	
 			KwRunStat.lastActTime = GetTick();
@@ -559,35 +944,150 @@
 }
 
 
+int KWL_Process(int nChn)
+{
+	RadioStatus_t rs = SX126xGetStatus();
+	KMem.WDT[1] = rs.Value;
+
+	RadioError_t  er = SX126xGetDeviceErrors();
+	KMem.WDT[2] = er.Value;
+
+	KMem.WDT[3] = SX126xGetIrqStatus();
+
+	KMem.WDT[4] = SX126xGetRssiInst();
+	
+	KMem.WDT[5] = GetRadioBusyPin();
+	
+		RadioState_t stat = Radio.GetStatus();
+	
+		KMem.WDT[32]=stat;
+//		KMem.WDT[38]=Radio.Rssi(MODEM_FSK);
+		if (WLCfg.bMaster){
+
+			KWLMasterProc(nChn);
+		}else			//slave
+		{
+				KWLSlaveProc(nChn);
+		}
+	if (KwRunStat.RunStat) KwRunStat.RunStat--;
+	if (KwRunStat.ErrStat) KwRunStat.ErrStat--;
+				
+		
+	return 0;
+}
+
 int KWLMasterProc(int nChn)
 {
+			RadioState_t stat = Radio.GetStatus();
+	
+			switch (KwRunStat.runStep){
+				case RS_IDLE:
+					if (GetTick() - KwRunStat.lastSendtime > (WLCfg.nCycleTime) *10 ||KwRunStat.sizetosend > 0 ){
+						Radio.StartCad();
+						KwRunStat.runStep = RS_MASTER_CAD;
+						KwRunStat.lastActTime = GetTick();
+					}				
+					break;
+				case RS_MASTER_CAD:
+					if (GetTick() - KwRunStat.lastActTime > 15) {
+						KwRunStat.CADTimeOut++;						
+						KwRunStat.runStep = RS_IDLE;			
+						Radio.Standby();
+						KMem.WDT[17]++;
+						KwResetRf();
+					}
+					break;
+				case RS_SENDING:
+					break;
+				case RS_SENT:
+					break;
+				case RS_RECVING:
+					if (GetTick() - KwRunStat.lastSendtime > (WLCfg.nCycleTime) *10 || KwRunStat.bMasterRecved){
+						KwRunStat.ErrStat=5000; 
+						KwRunStat.LostPackets++;
+						KwRunStat.CtnLstPkts++;
+						
+						KwRunStat.Tx_Power+=6;				//涓㈠寘锛� 澧炲姞鍙戝皠鍔熺巼
+						if (KwRunStat.Tx_Power > WLCfg.Tx_Power) {KwRunStat.Tx_Power= WLCfg.Tx_Power; }
+						SX126xSetRfTxPower(KwRunStat.Tx_Power);
+								
+						if (KwRunStat.CtnLstPkts > KwRunStat.MaxCtnLstPkts) {KwRunStat.MaxCtnLstPkts = KwRunStat.CtnLstPkts;}
+				//		KwRunStat.ErrStat=500;
+						if (KwRunStat.CtnLstPkts > 1) {		KwRunStat.ErrStat=2000;}
+							if (KwRunStat.CtnLstPkts == 2) {KwRunStat.Err1Count++;}
+						if (KwRunStat.CtnLstPkts > 3) {		KwRunStat.ErrStat=5000;}
+							if (KwRunStat.CtnLstPkts == 4) {KwRunStat.Err2Count++;}
+						if (KwRunStat.CtnLstPkts > 6) {	KwRunStat.ErrStat=5000; KMem.WFX[1]=0; }
+							if (KwRunStat.CtnLstPkts == 7) {KwRunStat.Err3Count++;}							
+						if ((KwRunStat.CtnLstPkts &0x0f) == 0x0f) {
+								KMem.WDT[51]++;
+							
+								KwResetRf();
+							//	LoadKwConfig();
+							//	KWireLessInit(RadioEnableMaster,nRadioChannel);
+							//	Radio.Standby();
+							//	KWireLessStart();
+						}													
+						
+						
+						KwRunStat.runStep = RS_IDLE;			
+					}
+					
+					break;
+				case RS_RECVED:
+						KwRunStat.runStep = RS_IDLE;					
+					break;
+				
+				default:
+					break;
+			
+			}
+/*			
+			if (GetTick() - KwRunStat.lastSendtime > (WLCfg.nCycleTime) *10){
+				if (!KwRunStat.bMasterRecved) {
+						KwRunStat.ErrStat=5000; 
+						KwRunStat.LostPackets++;
+						KwRunStat.CtnLstPkts++;
+						if (KwRunStat.CtnLstPkts > KwRunStat.MaxCtnLstPkts) {KwRunStat.MaxCtnLstPkts = KwRunStat.CtnLstPkts;}
+				//		KwRunStat.ErrStat=500;
+						if (KwRunStat.CtnLstPkts > 1) {		KwRunStat.ErrStat=2000;}
+							if (KwRunStat.CtnLstPkts == 2) {KwRunStat.Err1Count++;}
+						if (KwRunStat.CtnLstPkts > 3) {		KwRunStat.ErrStat=5000;}
+							if (KwRunStat.CtnLstPkts == 4) {KwRunStat.Err2Count++;}
+						if (KwRunStat.CtnLstPkts > 6) {	KwRunStat.ErrStat=5000; KMem.WFX[1]=0; }
+							if (KwRunStat.CtnLstPkts == 7) {KwRunStat.Err3Count++;}							
+					if ((KwRunStat.CtnLstPkts &0x0f) == 0x0f) {
+							KMem.WDT[51]++;
+						//	LoadKwConfig();
+						//	KWireLessInit(RadioEnableMaster,nRadioChannel);
+						//	Radio.Standby();
+						//	KWireLessStart();
+					}							
+				}
+			}
+*/	
+/*				
+				if (KwRunStat.curStat == 0 ){ //&& stat == RF_IDLE )	//200mS
+//					Radio.Standby();
+					KWireLessStart();
+				}else {
+					Radio.Standby();
+					KWireLessStart();
+				}
+*/					
 	return 0;
 }
 
 int KWLSlaveProc(int nChn)
 {
-	return 0;
-}
-
-int KWL_Process(int nChn)
-{
-		RadioState_t stat = Radio.GetStatus();
-		KMem.WDT[32]=stat;
-//		KMem.WDT[38]=Radio.Rssi(MODEM_FSK);
-		if (RadioEnableMaster){
-			if (GetTick() - KwRunStat.lastSendtime >2000 && KwRunStat.curStat == 0 ) //&& stat == RF_IDLE )	//200mS
-			{
-				KWireLessStart();
-			}
-		}else			//slave
-		{
+			RadioState_t stat = Radio.GetStatus();
 			if (stat == RF_IDLE){
 					KMem.WDT[48]++;
 					Radio.Standby();
 					KWireLessStart();
 			}
 				if (stat == RF_RX_RUNNING ){
-					if (GetTick() - KwRunStat.lastRecvtime > ((CYCLE_TIME + 10 )*10)){
+					if (GetTick() - KwRunStat.lastRecvtime > ((SLAVE_RX_TIMEOUT_VALUE + 10 )*10)){
 						KwRunStat.lastRecvtime = GetTick();
 						KwRunStat.StepErr1++;
 						KMem.WDT[49]++;
@@ -595,17 +1095,33 @@
 						KWireLessStart();
 					}
 				}
-				if (stat == RF_CAD && GetTick() - KwRunStat.lastRecvtime > ((1 )*10)){
+				if (stat == RF_CAD && GetTick() - KwRunStat.lastRecvtime > ((2 )*10)){
 						KwRunStat.StepErr2++;
+						KwRunStat.CADTimeOut++;
 						KMem.WDT[50]++;
 						Radio.Standby();
 						KWireLessStart();
 				}
-				
-		}
+				if (GetTick() - KwRunStat.lastRecvdtime > 4000){	// 200mS
+			//			KwRunStat.ErrStat=500;
+						KwRunStat.ErrStat=500; 
+//						Radio.Standby();
+//						KWireLessStart();
+				}
+				if (GetTick() - KwRunStat.lastRecvdtime > 12000){	// 1200mS
+						KwRunStat.ErrStat=5000; KMem.WFX[1]=0; 
+				}
+				if (GetTick() - KwRunStat.lastRecvtime > 16000){
+						KMem.WDT[52]++;
+						KwResetRf();
+						Radio.Standby();
+						KWireLessStart();
+					KwRunStat.lastRecvtime = GetTick();
+				}						
 	return 0;
 }
 
 
 
 
+

--
Gitblit v1.9.1