kopia lustrzana https://github.com/pjalocha/esp32-ogn-tracker
Back-off timer instead of pure random transmission decision for LoRaWAN
rodzic
04d27c5ce1
commit
b1a720b18f
26
main/rf.cpp
26
main/rf.cpp
|
@ -204,10 +204,14 @@ static uint8_t StartRFchip(void)
|
||||||
#endif
|
#endif
|
||||||
return Version; } // read the RF chip version and return it
|
return Version; } // read the RF chip version and return it
|
||||||
|
|
||||||
|
// some LoRaWAN variables
|
||||||
|
#ifdef WITH_LORAWAN
|
||||||
|
static uint8_t WAN_BackOff = 60; // back-off timer
|
||||||
static TickType_t WAN_RespTick = 0; // when to expect the WAN response
|
static TickType_t WAN_RespTick = 0; // when to expect the WAN response
|
||||||
static RFM_LoRa_RxPacket WAN_RxPacket; // packet received from WAN
|
static RFM_LoRa_RxPacket WAN_RxPacket; // packet received from WAN
|
||||||
// static WAN_Setup()
|
// static WAN_Setup()
|
||||||
// static WAN_Back()
|
// static WAN_Back()
|
||||||
|
#endif
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
void vTaskRF(void* pvParameters)
|
void vTaskRF(void* pvParameters)
|
||||||
|
@ -268,10 +272,10 @@ extern "C"
|
||||||
|
|
||||||
#ifdef WITH_LORAWAN
|
#ifdef WITH_LORAWAN
|
||||||
bool WANrx=0;
|
bool WANrx=0;
|
||||||
int WAN_RespLeft = WAN_RespTick-xTaskGetTickCount();
|
int WAN_RespLeft = WAN_RespTick-xTaskGetTickCount(); // [tick] how much time left before expected response
|
||||||
if(WANdev.State==1 || WANdev.State==3)
|
if(WANdev.State==1 || WANdev.State==3) // if State indicates we are waiting for the response
|
||||||
{ if(WAN_RespLeft<=5) WANdev.State--;
|
{ if(WAN_RespLeft<=5) WANdev.State--; // if time below 5 ticks we have not enough time
|
||||||
else if(WAN_RespLeft<200) { WANrx=1; }
|
else if(WAN_RespLeft<200) { WANrx=1; } // if more than 200ms then we can't wait this long now
|
||||||
xSemaphoreTake(CONS_Mutex, portMAX_DELAY);
|
xSemaphoreTake(CONS_Mutex, portMAX_DELAY);
|
||||||
Format_UnsDec(CONS_UART_Write, xTaskGetTickCount(), 4, 3);
|
Format_UnsDec(CONS_UART_Write, xTaskGetTickCount(), 4, 3);
|
||||||
Format_String(CONS_UART_Write, "s LoRaWAN Rx: ");
|
Format_String(CONS_UART_Write, "s LoRaWAN Rx: ");
|
||||||
|
@ -463,11 +467,13 @@ extern "C"
|
||||||
XorShift32(RX_Random);
|
XorShift32(RX_Random);
|
||||||
TxTime = (RX_Random&0x3F)+1; TxTime*=6; // [ms] (1..64)*6 = 6..384ms
|
TxTime = (RX_Random&0x3F)+1; TxTime*=6; // [ms] (1..64)*6 = 6..384ms
|
||||||
#ifdef WITH_LORAWAN
|
#ifdef WITH_LORAWAN
|
||||||
bool WANtx = 0; // decide if send Join-Request
|
bool WANtx = 0;
|
||||||
uint16_t SlotEnd = 1240;
|
if(WAN_BackOff) WAN_BackOff--;
|
||||||
|
else // decide to transmit in this slot
|
||||||
|
{ uint16_t SlotEnd = 1240;
|
||||||
if(WANdev.State==0 || WANdev.State==2)
|
if(WANdev.State==0 || WANdev.State==2)
|
||||||
{ XorShift32(RX_Random); if((RX_Random&0x3F)==0x20) WANtx=1; SlotEnd=1200; }
|
{ XorShift32(RX_Random); if((RX_Random&0x1F)==0x10) WANtx=1; SlotEnd=1200; } // random decision 1/32
|
||||||
TimeSlot(TxChan, SlotEnd-TimeSync_msTime(), TxPktData1, TRX.averRSSI, 0, TxTime);
|
TimeSlot(TxChan, SlotEnd-TimeSync_msTime(), TxPktData1, TRX.averRSSI, 0, TxTime); }
|
||||||
#else
|
#else
|
||||||
TimeSlot(TxChan, 1250-TimeSync_msTime(), TxPktData1, TRX.averRSSI, 0, TxTime);
|
TimeSlot(TxChan, 1250-TimeSync_msTime(), TxPktData1, TRX.averRSSI, 0, TxTime);
|
||||||
#endif
|
#endif
|
||||||
|
@ -489,6 +495,7 @@ extern "C"
|
||||||
if(WANdev.State==0)
|
if(WANdev.State==0)
|
||||||
{ uint8_t *TxPacket; TxPktLen=WANdev.getJoinRequest(&TxPacket); // produce Join-Request packet
|
{ uint8_t *TxPacket; TxPktLen=WANdev.getJoinRequest(&TxPacket); // produce Join-Request packet
|
||||||
TRX.LoRa_SendPacket(TxPacket, TxPktLen); RespDelay=5000; // transmit join-request packet
|
TRX.LoRa_SendPacket(TxPacket, TxPktLen); RespDelay=5000; // transmit join-request packet
|
||||||
|
WAN_BackOff=30;
|
||||||
} else if(WANdev.State==2)
|
} else if(WANdev.State==2)
|
||||||
{ const uint8_t *PktData=TxPktData0;
|
{ const uint8_t *PktData=TxPktData0;
|
||||||
if(PktData==0) PktData=TxPktData1;
|
if(PktData==0) PktData=TxPktData1;
|
||||||
|
@ -500,7 +507,8 @@ extern "C"
|
||||||
{ TxPktLen=WANdev.getDataPacket(&TxPacket, PktData+4, 16, 1, ((RX_Random>>16)&0xF)==0x8 ); }
|
{ TxPktLen=WANdev.getDataPacket(&TxPacket, PktData+4, 16, 1, ((RX_Random>>16)&0xF)==0x8 ); }
|
||||||
else
|
else
|
||||||
{ TxPktLen=WANdev.getDataPacket(&TxPacket, PktData, 20, 1, ((RX_Random>>16)&0xF)==0x8 ); }
|
{ TxPktLen=WANdev.getDataPacket(&TxPacket, PktData, 20, 1, ((RX_Random>>16)&0xF)==0x8 ); }
|
||||||
TRX.LoRa_SendPacket(TxPacket, TxPktLen); RespDelay=1000; }
|
TRX.LoRa_SendPacket(TxPacket, TxPktLen); RespDelay=1000;
|
||||||
|
WAN_BackOff=32; }
|
||||||
}
|
}
|
||||||
if(RespDelay)
|
if(RespDelay)
|
||||||
{ vTaskDelay(8);
|
{ vTaskDelay(8);
|
||||||
|
|
Ładowanie…
Reference in New Issue