QuakeGod
2024-07-27 842bb64195f958b050867c50db66fc0aa413dafb
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                                        200000 // 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                       6         // [SF7..SF12]
#define LORA_CODINGRATE                             1         // [1: 4/5,
#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                        8         // Same for Tx and Rx
#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,49 @@
#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
 */
const stWLConfig defaultWLConfig =
{
   .RF_T_Freq = 430620000,         // uint32_t    Hz
   .RF_R_Freq = 430620000,         //uint32_t       //Hz
   .nChnSpacing = 530,         //        uint16_t ChannelSpacing;      //kHz
   .workMode = 1,            //         uchar workMode;         //0: FSK,    1: LoRa
   .Tx_Power = 22,            //      uchar Tx_Power;
   .LoraBandWidth = 0,            //          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
   .bAutoReSend = 1,                  // 自动重发
};
//stWLConfig * pWLCfg = (stWLConfig *)&defaultWLConfig;
static RadioEvents_t RadioEvents;
stWLConfig WLCfg ;
stWLRunStat KwRunStat;
typedef enum
{
@@ -115,17 +147,23 @@
    TX_TIMEOUT,
}States_t;
#define MASTER_RX_TIMEOUT_VALUE                 60
#define SLAVE_RX_TIMEOUT_VALUE                  200
#define MASTER_RX_TIMEOUT_VALUE                 80         //mS
#define SLAVE_RX_TIMEOUT_VALUE                  400         //mS
#define CYCLE_TIME                                             160         //mS
#define BUFFER_SIZE                       32 // Define the payload size here
#define WL_RX_BUFFER_SIZE                                       256                   // Define the payload size here
#define WL_TX_BUFFER_SIZE                                       128                   // 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];
//uint16_t BufferSize = BUFFER_SIZE;
uint8_t RX_Buffer[WL_RX_BUFFER_SIZE];
uint8_t TX_Buffer[WL_TX_BUFFER_SIZE];
States_t State = LOWPOWER;
@@ -144,9 +182,37 @@
      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)
{
      stWLConfig * pWLCfg = & WLCfg;
      RadioEnableMaster = bRadioEnableMaster;
    // Radio initialization
    RadioEvents.TxDone = OnTxDone;
@@ -158,13 +224,15 @@
    
    Radio.Init( &RadioEvents );
      nRadioChannel = nChn;
    Radio.SetChannel( RF_FREQUENCY + nRadioChannel * nChannelBandwidth );
      KwRunStat.RF_Freq = pWLCfg->RF_T_Freq + nRadioChannel * pWLCfg->nChnSpacing*1000;
    Radio.SetChannel( pWLCfg->RF_T_Freq + nRadioChannel * pWLCfg->nChnSpacing*1000 );
    
  //  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,
@@ -174,6 +242,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 )
    
@@ -187,12 +268,19 @@
                                  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(LORA_CAD_04_SYMBOL,0,1,LORA_CAD_ONLY,1);
   nTimeOnAir = Radio.TimeOnAir(MODEM_LORA,14);
   KwRunStat.nTimeOnAir =    nTimeOnAir;
   KMem.WDT[38]=nTimeOnAir;
   KwRunStat.runStep=RS_IDEL;
   return 0;
}
int KWireLessStart(void)
{
    if(RadioEnableMaster)
@@ -204,8 +292,8 @@
       Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); 
         KwRunStat.runStep=RS_RECVING;
         
         KwRunStat.lastActTime = GetuS();
         KwRunStat.lastRecvtime = GetuS();
         KwRunStat.lastActTime = GetTick();
         KwRunStat.lastRecvtime = GetTick();
    }
    
//    while( 1 )
@@ -217,10 +305,12 @@
void OnTxDone( void )
{   
      KwRunStat.bMasterSent = 1;
      KwRunStat.bMasterRecved = 0;
      KwRunStat.runStep=RS_IDEL;
      KMem.WDT[42]++;
      KwRunStat.lastSenttime = GetuS();
      KwRunStat.lastAckTime = GetuS();
      KwRunStat.lastSenttime = GetTick();
      KwRunStat.lastAckTime = GetTick();
    Radio.Standby();
      if (RadioEnableMaster) {
         Radio.Rx( MASTER_RX_TIMEOUT_VALUE ); //进入接收
@@ -229,10 +319,10 @@
      }
      KwRunStat.runStep=RS_RECVING;
      
      KwRunStat.lastActTime = GetuS();
      KwRunStat.lastRecvtime = GetuS();
      KwRunStat.lastActTime = GetTick();
      KwRunStat.lastRecvtime = GetTick();
      LL_GPIO_TogglePin(GPIOC,LL_GPIO_PIN_14);
         int us2=GetuS();
         int us2=GetTick();
         KMem.ScanTimeuS=us2-KMem.LastScanTime;
      KMem.LastScanTime = us2;
      if (KMem.ScanTimeuS < KMem.MinScanTimeuS) {KMem.MinScanTimeuS = KMem.ScanTimeuS;}
@@ -243,98 +333,45 @@
void OnTxTimeout( void )
{
      KwRunStat.runStep=RS_IDEL;
      KwRunStat.lastAckTime = GetuS();
      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 )
{
      KMem.WDT[44] = size;
    memcpy( RX_Buffer, payload, size );
      memcpy(&KMem.WDT[64],payload,size);
    Radio.Standby();
      if (bThisRxError) {bThisRxError=0;return;}
      KwRunStat.lastRecvdtime=GetuS();
      KwRunStat.lastAckTime = GetuS();
      if (bThisRxError) {
         bThisRxError=0;
         return;
      }
      
      KwRunStat.curStat = 0;
      KwRunStat.latancy = GetuS() - KwRunStat.lastSendtime;
    BufferSize = size;
    memcpy( RX_Buffer, payload, BufferSize );
      KwRunStat.latancy = GetTick() - KwRunStat.lastSendtime;
    RssiValue = rssi;
    SnrValue = snr;
   
      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;
   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))
   {
      KwRunStat.CRCErr++;
      KMem.ErrStat=500;
      CRC_OK = 0;
   }else {
      CRC_OK = 1;
   }
*/
   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;
//   KwRunStat.CtnLstPkts=0;
    if(RadioEnableMaster)
    {
      if(memcmp(RX_Buffer,PongMsg,4)==0 && CRC_OK)
      {
               KWLMasterParsePkt(1);
               KwRunStat.tRSSI = RX_Buffer[10];
               KwRunStat.tSNR = RX_Buffer[11];
               KMem.WDT[41]=(-RX_Buffer[10]) + ((-RX_Buffer[11])<<8);
               LedToggle();//LED闪烁
               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);
      }
            KWLMasterParsePkt(nRadioChannel,size);
         //KWLMasterSendReqPkt(1);
    }
    else         //slave
    {
         KWLSlaveParsePkt(1);
      if(memcmp(RX_Buffer,PingMsg,4)==0 && CRC_OK)
      {
        LedToggle();//LED闪烁
            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);
        KWLSlaveSendRplyPkt(1);
//            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 = GetuS();
            KwRunStat.lastRecvtime = GetuS();
      }
            KWLSlaveParsePkt(nRadioChannel,size);
    }
}
@@ -343,38 +380,54 @@
      KwRunStat.runStep=RS_IDEL;
   
    Radio.Standby();
      KwRunStat.lastAckTime = GetuS();
      KwRunStat.lastErrTime = GetTick() - KwRunStat.lastAckTime;
      KwRunStat.lastAckTime = GetTick();
   
      KMem.WDT[45]++;
      KwRunStat.LostPackets++;
      KwRunStat.CtnLstPkts++;
      if (KwRunStat.CtnLstPkts > KwRunStat.MaxCtnLstPkts) {KwRunStat.MaxCtnLstPkts = KwRunStat.CtnLstPkts;}
      KMem.ErrStat=500;
      if (KwRunStat.CtnLstPkts > 3) {      KMem.ErrStat=5000; }
      if (KwRunStat.CtnLstPkts > 10) {   KMem.ErrStat=5000; KMem.WFX[1]=0; }
//      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]++;
            LoadKwConfig();
            KWireLessInit(RadioEnableMaster,nRadioChannel);
            Radio.Standby();
         //   KWireLessStart();
      }
    if(RadioEnableMaster)
    {
         //KWLMasterSendReqPkt(1);
    }
    else
    {
         Radio.Standby();
      Radio.Rx( SLAVE_RX_TIMEOUT_VALUE ); 
         KwRunStat.runStep=RS_RECVING;
         KwRunStat.lastActTime = GetuS();
         KwRunStat.lastRecvtime = GetuS();
         KwRunStat.lastActTime = GetTick();
         KwRunStat.lastRecvtime = GetTick();
    }
}
void OnRxError( void )
{
//    Radio.Standby();
         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)
    {
@@ -383,26 +436,147 @@
    else
    {
//      Radio.Rx( RX_TIMEOUT_VALUE ); 
            //KwRunStat.lastActTime = GetuS();
            //KwRunStat.lastActTime = GetTick();
         KwRunStat.LostPackets++;
         KwRunStat.CtnLstPkts++;
         if (KwRunStat.CtnLstPkts > KwRunStat.MaxCtnLstPkts) {KwRunStat.MaxCtnLstPkts = KwRunStat.CtnLstPkts;}
         KMem.ErrStat=500;
         if (KwRunStat.CtnLstPkts > 3) {      KMem.ErrStat=5000; }
         if (KwRunStat.CtnLstPkts > 10) {   KMem.ErrStat=5000; KMem.WFX[1]=0; }
//         KwRunStat.ErrStat=500;
         if (KwRunStat.CtnLstPkts > 1) {      KwRunStat.ErrStat=500; }
         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++;}
    }
//      Radio.Standby();
}
void OnCadDone( bool channelActivityDetected)
{
   KwRunStat.CADDoneCount++;
   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))
   {
      KwRunStat.CRCErr++;
      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
      {
            if (p1->DstAddr == MixAddr(nRadioChannel,nRadioAddr))
               {
                  KwRunStat.bMasterRecved = 1;
                  LedToggle();//LED闪烁
                  KwRunStat.lastRecvdtime=GetTick();
                  KwRunStat.lastAckTime = GetTick();
                  KwRunStat.CtnLstPkts=0;
                  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) {
                  }
                     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);
               }
      }
   return 0;
}
int KWLSlaveParsePkt(int nChn,int size)
{
      bool CRC_OK =1;
   pstKLPacket p1 = (pstKLPacket) RX_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))
   {
      KwRunStat.CRCErr++;
      KwRunStat.ErrStat=500;
      CRC_OK = 0;
   }else {
      CRC_OK = 1;
         if (p1->STSign != enReqSign) {
            KwRunStat.PktErr++;
         }else {
         if (p1->DstAddr != MixAddr(nRadioChannel,nRadioAddr)) {
            KwRunStat.ChnErr++;
         }
         }
   }
//*/
      if(CRC_OK && p1->STSign == enReqSign && p1->DstAddr == MixAddr(nRadioChannel,nRadioAddr))// memcmp(RX_Buffer,PingMsg,4)==0 && )
      {
        LedToggle();//LED闪烁
            KwRunStat.lastRecvdtime=GetTick();
            KwRunStat.lastAckTime = GetTick();
            KwRunStat.CtnLstPkts=0;
            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) {
            }
            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);
        KWLSlaveSendRplyPkt(1);
//            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();
      }
   return 0;
}
int KWLMasterSendReqPkt(int nChn)
{
   int len1=12;
   pstKLPacket p1 = (pstKLPacket) TX_Buffer;
   p1->STSign = enReqSign;
   p1->DstAddr = MixAddr(nRadioChannel,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] = 'I';
         TX_Buffer[2] = 'N';
@@ -411,7 +585,19 @@
         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;
   }else if (p1->Stat == 1){
      memcpy(TX_Buffer+8,&KwRunStat.sentCount,4);
   }else if (p1->Stat == 2) {
      memcpy(TX_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;
@@ -419,11 +605,11 @@
         KMem.WDT[56]=crc_value;
   
         KwRunStat.sentCount++;
         KwRunStat.cycleTime = GetuS()- KwRunStat.lastSendtime ;
         KwRunStat.lastSendtime = GetuS();
         KwRunStat.cycleTime = GetTick()- KwRunStat.lastSendtime ;
         KwRunStat.lastSendtime = GetTick();
         Radio.Send( TX_Buffer, len1+2);
         KwRunStat.runStep=RS_SENDING;
         KwRunStat.lastActTime = GetuS();
         KwRunStat.lastActTime = GetTick();
   
   return 0;
}
@@ -431,6 +617,16 @@
int KWLSlaveSendRplyPkt(int nChn)
{
   int len1=12;
   pstKLPacket p1 = (pstKLPacket) TX_Buffer;
   p1->STSign = enRplySign;
   p1->DstAddr = MixAddr(nRadioChannel,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';
@@ -439,19 +635,28 @@
         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;
   }else if (p1->Stat == 1){
      memcpy(TX_Buffer+8,&KwRunStat.sentCount,4);
   }else if (p1->Stat == 2) {
      memcpy(TX_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);   
         KwRunStat.runStep=RS_SENDING;
   
         KwRunStat.lastActTime = GetuS();
         KwRunStat.lastActTime = GetTick();
         KwRunStat.sentCount++;
         KwRunStat.lastSendtime = GetuS();
         KwRunStat.lastSendtime = GetTick();
   return 0;
}
@@ -463,6 +668,44 @@
int KWLSlaveProc(int nChn)
{
         RadioState_t stat = Radio.GetStatus();
         if (stat == RF_IDLE){
               KMem.WDT[48]++;
               Radio.Standby();
               KWireLessStart();
         }
            if (stat == RF_RX_RUNNING ){
               if (GetTick() - KwRunStat.lastRecvtime > ((SLAVE_RX_TIMEOUT_VALUE + 10 )*10)){
                  KwRunStat.lastRecvtime = GetTick();
                  KwRunStat.StepErr1++;
                  KMem.WDT[49]++;
                  Radio.Standby();
                  KWireLessStart();
               }
            }
            if (stat == RF_CAD && GetTick() - KwRunStat.lastRecvtime > ((1 )*10)){
                  KwRunStat.StepErr2++;
                  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]++;
                  LoadKwConfig();
                  KWireLessInit(RadioEnableMaster,nRadioChannel);
                  Radio.Standby();
                  KWireLessStart();
               KwRunStat.lastRecvtime = GetTick();
            }
   return 0;
}
@@ -472,42 +715,52 @@
      KMem.WDT[32]=stat;
//      KMem.WDT[38]=Radio.Rssi(MODEM_FSK);
      if (RadioEnableMaster){
         if (GetuS() - KwRunStat.lastSendtime >100000 && KwRunStat.curStat == 0 ) //&& stat == RF_IDLE )
         {
         KWireLessStart();
         }
      }else
      {
         if (stat == RF_IDLE){
               KMem.WDT[48]++;
         if (GetTick() - KwRunStat.lastSendtime > CYCLE_TIME *10 && Radio.IsChannelFree(MODEM_LORA,KwRunStat.RF_Freq,-60,1)){
            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();
            }
         }
            if (stat == RF_RX_RUNNING ){
               if (GetuS() - KwRunStat.lastRecvtime > 300000){
                  KMem.WDT[49]++;
                  Radio.Standby();
                  KWireLessStart();
               }
            }
            if (stat == RF_CAD && GetuS() - KwRunStat.lastRecvtime > 400000){
                  KMem.WDT[50]++;
                  Radio.Standby();
                  KWireLessStart();
            }
      }else         //slave
      {
            KWLSlaveProc(nChn);
      }
   if (KwRunStat.RunStat) KwRunStat.RunStat--;
   if (KwRunStat.ErrStat) KwRunStat.ErrStat--;
      KwRunStat.Tx_Power = WLCfg.Tx_Power;
      KwRunStat.LoraBandWidth = WLCfg.LoraBandWidth;
      KwRunStat.LoRaFactor = WLCfg.LoRaFactor;
      KwRunStat.LoRaCodingRate = WLCfg.LoRaCodingRate;
      KwRunStat.LoRaPreambleLen = WLCfg.LoRaPreambleLen;
   return 0;
}
int KWLMasterParsePkt(int nChn)
{
   return 0;
}
int KWLSlaveParsePkt(int nChn)
{
   return 0;
}