diff --git a/src/LoRa.cpp b/src/LoRa.cpp index 210a589..a8c459d 100644 --- a/src/LoRa.cpp +++ b/src/LoRa.cpp @@ -565,7 +565,7 @@ void LoRaClass::setCodingRate4(int denominator) } else if (denominator > 8) { denominator = 8; } - + _coderate = denominator; // save coderate int cr = denominator - 4; writeRegister(REG_MODEM_CONFIG_1, (readRegister(REG_MODEM_CONFIG_1) & 0xf1) | (cr << 1)); @@ -751,4 +751,32 @@ ISR_PREFIX void LoRaClass::onDio0Rise() LoRa.handleDio0Rise(); } +double LoRaClass::Airtime_Message() +{ + int SF = getSpreadingFactor(); + int BW = getSignalBandwidth(); + int H = _implicitHeaderMode; // save header mode + int PL = readRegister(REG_PAYLOAD_LENGTH); + int DE = 0; + if (((BW == 125E3) && ((SF == 11) || (SF == 12))) || + ((BW == 250E3) && (SF == 12))) + { + DE = 1; + } + else + { + DE = 0; + } + + int CR = (readRegister(REG_MODEM_CONFIG_1) & 0xf1) + 4; + + double Tsym = pow(2, SF) / (BW)*1000; + double Tpreamble = (8 + 4.25) * Tsym; + int PrePay = ceil((8.0 * PL - 4.0 * SF + 28 + 16 - 20 * (1 - H)) / (4.0 * (SF - 2.0 * DE))) * (CR); + int payloadSymbNb = 8 + _max(PrePay, 0); + double Tpayload = payloadSymbNb * Tsym; + double Tpacket = Tpreamble + Tpayload; + return Tpacket; +} + LoRaClass LoRa; diff --git a/src/LoRa.h b/src/LoRa.h index b312db5..258e778 100644 --- a/src/LoRa.h +++ b/src/LoRa.h @@ -93,7 +93,7 @@ class LoRaClass : public Stream { void setSPIFrequency(uint32_t frequency); void dumpRegisters(Stream& out); - + double Airtime_Message(); private: void explicitHeaderMode(); void implicitHeaderMode(); @@ -123,6 +123,7 @@ class LoRaClass : public Stream { int _implicitHeaderMode; void (*_onReceive)(int); void (*_onTxDone)(); + int _coderate; }; extern LoRaClass LoRa;