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