From 947e96a890c75bae251f91b7e40f369bf6bdbae4 Mon Sep 17 00:00:00 2001 From: Pawel Jalocha Date: Wed, 6 May 2020 00:13:14 +0100 Subject: [PATCH] Working on FANET --- main/fanet.h | 7 +++++-- main/proc.cpp | 6 ++++-- main/rfm.h | 20 ++++++++++++++------ main/sx1276.h | 10 ++++++++++ 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/main/fanet.h b/main/fanet.h index 411c361..5ea93a2 100644 --- a/main/fanet.h +++ b/main/fanet.h @@ -17,7 +17,10 @@ class FANET_Packet union { uint8_t Flags; struct - { uint8_t CR:3; // Coding rate + { uint8_t CR:3; // Coding rate used (RX) or to be used (TX) + bool hasCRC:1; // CRC was there (RX) + bool badCRC:1; // CRC was bad (RX) + bool Done:1; } ; } ; uint8_t Len; // [bytes] packet length @@ -298,7 +301,7 @@ class FANET_RxPacket: public FANET_Packet void Print(char *Name=0) const { char HHMMSS[8]; Format_HHMMSS(HHMMSS, SlotTime()); HHMMSS[6]='h'; HHMMSS[7]=0; - printf("%s %3.1fdB/%de %+3.1fkHz ", HHMMSS, 0.25*SNR, BitErr, 1e-2*FreqOfs); + printf("%s CR%c%c%c %3.1fdB/%de %+3.1fkHz ", HHMMSS, '0'+CR, hasCRC?'c':'_', badCRC?'-':'+', 0.25*SNR, BitErr, 1e-2*FreqOfs); FANET_Packet::Print(Name); } int WriteAPRS(char *Out) diff --git a/main/proc.cpp b/main/proc.cpp index 8bb6695..b7109bf 100644 --- a/main/proc.cpp +++ b/main/proc.cpp @@ -580,10 +580,11 @@ void vTaskPROC(void* pvParameters) RF_TxFIFO.Write(); // complete the write into the TxFIFO Position->Sent=1; #ifdef WITH_FANET - if( (SlotTime&0x07)==4 ) // every 8sec + if( (SlotTime&0x07)==(RX_Random&0x07) ) // every 8sec { FANET_Packet *FNTpkt = FNT_TxFIFO.getWrite(); FNTpkt->setAddress(Parameters.Address); Position->EncodeAirPos(*FNTpkt, Parameters.AcftType, !Parameters.Stealth); + XorShift32(RX_Random); FNT_TxFIFO.Write(); } #endif #ifdef WITH_LOOKOUT @@ -676,10 +677,11 @@ void vTaskPROC(void* pvParameters) #endif #ifdef WITH_FANET - if(Parameters.Pilot[0] && (SlotTime&0xFF)==0 ) // every 256sec + if(Parameters.Pilot[0] && (SlotTime&0xFF)==(RX_Random&0xFF) ) // every 256sec { FANET_Packet *FNTpkt = FNT_TxFIFO.getWrite(); FNTpkt->setAddress(Parameters.Address); FNTpkt->setName(Parameters.Pilot); + XorShift32(RX_Random); FNT_TxFIFO.Write(); } #endif diff --git a/main/rfm.h b/main/rfm.h index 988eebb..18225c0 100644 --- a/main/rfm.h +++ b/main/rfm.h @@ -537,20 +537,28 @@ class RFM_TRX return 0; } // afterwards just wait for TX mode to stop int ReceivePacketFNT(FANET_RxPacket &Packet) - { uint8_t Stat = ReadByte(REG_LORA_MODEM_STATUS); // coding rate in three top bits + { uint8_t Flags = ReadByte(REG_LORA_IRQ_FLAGS); + if((Flags&LORA_FLAG_RX_DONE)==0) return 0; + uint8_t Stat = ReadByte(REG_LORA_MODEM_STATUS); // coding rate in three top bits + uint8_t HopChan = ReadByte(REG_LORA_HOP_CHANNEL); + Packet.CR = Stat>>5; // coding rate used for this packet + Packet.hasCRC = HopChan&0x40; // did this packet have CRC ? (flags should be checked for CRC error) + Packet.badCRC = Flags&LORA_FLAG_BAD_CRC; Packet.SNR = ReadByte(REG_LORA_PACKET_SNR); // [0.25dB] read SNR Packet.RSSI = -157+ReadByte(REG_LORA_PACKET_RSSI); // [dBm] read RSSI - int32_t FreqOfs = ReadFreq(REG_LORA_FREQ_ERR_MSB); // (FreqOfs*1718+0x8000)>>16 [10Hz] - Packet.FreqOfs = (FreqOfs*1718+0x8000)>>16; // [10Hz] + int32_t FreqOfs = ReadFreq(REG_LORA_FREQ_ERR_MSB); // if(FreqOfs&0x00080000) FreqOfs|=0xFFF00000; // extend the sign bit else FreqOfs&=0x000FFFFF; - Packet.BitErr=0; - Packet.CodeErr=0; + Packet.FreqOfs = (FreqOfs*1718+0x8000)>>16; // [10Hz] + Packet.BitErr = 0; + Packet.CodeErr = 0; int Len=ReceivePacketFNT(Packet.Byte, Packet.MaxBytes); // printf("ReceivePacketFNT() => %d %02X %3.1fdB %+ddBm 0x%08X=%+6.3fkHz, %02X%02X%02X%02X\n", // Packet.Len, Stat, 0.25*Packet.SNR, Packet.RSSI, FreqOfs, 0.5*0x1000000/32e9*FreqOfs, // Packet.Byte[0], Packet.Byte[1], Packet.Byte[2], Packet.Byte[3]); - Packet.Len=Len; return Len; } + Packet.Len=Len; + WriteByte(LORA_FLAG_RX_DONE | LORA_FLAG_BAD_CRC, REG_LORA_IRQ_FLAGS); + return Len; } int ReceivePacketFNT(uint8_t *Data, uint8_t MaxLen) { uint8_t Len=ReadByte(REG_LORA_PACKET_BYTES); // packet length diff --git a/main/sx1276.h b/main/sx1276.h index eb9d7b9..c16fb25 100644 --- a/main/sx1276.h +++ b/main/sx1276.h @@ -140,6 +140,16 @@ Maintainer: Miguel Luis and Gregory Cristian #define REG_LORA_DETECT_THRESHOLD 0x37 // for SF6 #define REG_LORA_SYNC 0x39 // 0xF1 for FANET, default = 0x12 (for old FANET) +// LoRa flags +#define LORA_FLAG_TIMEOUT 0x80 // timeout in single packet reception ? +#define LORA_FLAG_RX_DONE 0x40 // new packet received +#define LORA_FLAG_BAD_CRC 0x20 // packet received with bad CRC +#define LORA_FLAG_RX_HEADER 0x10 // received a valid header +#define LORA_FLAG_TX_DONE 0x08 // packet transmission completed +#define LORA_FLAG_CAD_DONE 0x04 // CArrier Detect completed +#define LORA_FLAG_FHSS_CHANGE 0x02 // hopping channel changed ? +#define LORA_FLAG_CAD_DETECT 0x01 // LoRa symbol(s) detected during CArrier Detection + /*! * ============================================================================ * SX1276 FSK bits control definition