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 )
@@ -59,9 +60,45 @@
    #error "Please define a frequency band in the compiler options."
#endif
*/
/*
#if defined( USE_MODEM_LORA )
#define LORA_BANDWIDTH                              1         // [0: 125 kHz,
                                                              //  1: 250 kHz,
                                                              //  2: 500 kHz,
                                                              //  3: Reserved]
#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
#define FSK_DATARATE                                19.2e3      // bps
#define FSK_BANDWIDTH                               60e3     // Hz >> DSB in sx126x
#define FSK_AFC_BANDWIDTH                           200e3     // Hz
#define FSK_PREAMBLE_LENGTH                         5         // Same for Tx and Rx
#define FSK_FIX_LENGTH_PAYLOAD_ON                   false
#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;
@@ -75,38 +112,30 @@
 * 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;
#if defined( USE_MODEM_LORA )
#define LORA_BANDWIDTH                              1         // [0: 125 kHz,
                                                              //  1: 250 kHz,
                                                              //  2: 500 kHz,
                                                              //  3: Reserved]
#define LORA_SPREADING_FACTOR                       8         // [SF7..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
#define FSK_DATARATE                                19.2e3      // bps
#define FSK_BANDWIDTH                               60e3     // Hz >> DSB in sx126x
#define FSK_AFC_BANDWIDTH                           200e3     // Hz
#define FSK_PREAMBLE_LENGTH                         5         // Same for Tx and Rx
#define FSK_FIX_LENGTH_PAYLOAD_ON                   false
#else
    #error "Please define a modem in the compiler options."
#endif
typedef enum
{
@@ -119,17 +148,22 @@
}States_t;
#define MASTER_RX_TIMEOUT_VALUE                 80         //mS
#define SLAVE_RX_TIMEOUT_VALUE                  250         //mS
#define CYCLE_TIME                                             200         //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];
uint8_t RX_Buffer[WL_RX_BUFFER_SIZE];
uint8_t TX_Buffer[WL_TX_BUFFER_SIZE];
States_t State = LOWPOWER;
@@ -148,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;
@@ -162,7 +224,9 @@
    
    Radio.Init( &RadioEvents );
      nRadioChannel = nChn;
    Radio.SetChannel( RF_FREQUENCY + nRadioChannel * nChannelSpacing );
      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);
@@ -178,15 +242,15 @@
                                   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, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
                                   LORA_SPREADING_FACTOR, LORA_CODINGRATE,
                                   LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
    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, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
                                   LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
    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 );                                                    
                                                    
@@ -204,13 +268,15 @@
                                  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(2,0,1,0,1);
      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;
}
@@ -239,6 +305,8 @@
void OnTxDone( void )
{   
      KwRunStat.bMasterSent = 1;
      KwRunStat.bMasterRecved = 0;
      KwRunStat.runStep=RS_IDEL;
      KMem.WDT[42]++;
      KwRunStat.lastSenttime = GetTick();
@@ -275,14 +343,13 @@
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;
         return;
      }
      
      KwRunStat.curStat = 0;
@@ -305,7 +372,6 @@
    else         //slave
    {
            KWLSlaveParsePkt(nRadioChannel,size);
    }
}
@@ -321,20 +387,27 @@
      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++;}
//      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 = GetTick();         
@@ -345,8 +418,12 @@
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;
@@ -363,14 +440,16 @@
         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)
@@ -386,7 +465,7 @@
   if (RX_Buffer[size-2] != (crc_value&0xff) && RX_Buffer[size-1] != (crc_value >> 8))
   {
      KwRunStat.CRCErr++;
      KMem.ErrStat=500;
      KwRunStat.ErrStat=500;
      CRC_OK = 0;
   }else {
      CRC_OK = 1;
@@ -397,6 +476,7 @@
      {
            if (p1->DstAddr == MixAddr(nRadioChannel,nRadioAddr))
               {
                  KwRunStat.bMasterRecved = 1;
                  LedToggle();//LED闪烁
                  KwRunStat.lastRecvdtime=GetTick();
                  KwRunStat.lastAckTime = GetTick();                  
@@ -432,12 +512,20 @@
   if (RX_Buffer[size-2] != (crc_value&0xff) && RX_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(nRadioChannel,nRadioAddr)) {
            KwRunStat.ChnErr++;
         }
         }
   }
//*/   
      if(CRC_OK && p1->STSign == enReqSign && p1->DstAddr == MixAddr(nRadioChannel,nRadioAddr))// memcmp(RX_Buffer,PingMsg,4)==0 && )
      {
@@ -580,21 +668,7 @@
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 > CYCLE_TIME *10 && KwRunStat.curStat == 0 ) //&& stat == RF_IDLE )   //200mS
         {
            KWireLessStart();
         }
      }else         //slave
      {
         RadioState_t stat = Radio.GetStatus();
         if (stat == RF_IDLE){
               KMem.WDT[48]++;
               Radio.Standby();
@@ -616,13 +690,74 @@
                  KWireLessStart();
            }
            if (GetTick() - KwRunStat.lastRecvdtime > 4000){   // 200mS
         //         KMem.ErrStat=500;
                  KMem.ErrStat=500;
         //         KwRunStat.ErrStat=500;
                  KwRunStat.ErrStat=500;
//                  Radio.Standby();
//                  KWireLessStart();
            }
            if (GetTick() - KwRunStat.lastRecvdtime > 12000){   // 1200mS
                  KMem.ErrStat=5000; KMem.WFX[1]=0;
            }
                  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;
}
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 > 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();
            }
         }
      }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;
}