diff --git a/simulations/batchTest.ini b/simulations/batchTest.ini index 7a3f82d..1c92154 100644 --- a/simulations/batchTest.ini +++ b/simulations/batchTest.ini @@ -36,6 +36,7 @@ simtime-resolution = -11 **.loRaNodes[*].**initialLoRaBW = 125 kHz **.loRaNodes[*].**initialLoRaCR = 4 **.loRaNodes[*].**initialLoRaTP = (2dBm + 3dBm*intuniform(0, 4)) #2dBm + (3*intuniform(0, 4))dBm #14dBm #25mW #uniform(1mW, 25mW)#8.118864315mW +**.loRaNodes[*].**initialLoRaDC = 1 #DutyCycle, value as a percentage. Eg. 1 means we're transmitting no more than 1% of the time #gateway features **.loRaGW[*].**.initFromDisplayString = false diff --git a/src/LoRaApp/SimpleLoRaApp.cc b/src/LoRaApp/SimpleLoRaApp.cc index 70fb51e..c5f6bca 100644 --- a/src/LoRaApp/SimpleLoRaApp.cc +++ b/src/LoRaApp/SimpleLoRaApp.cc @@ -61,10 +61,19 @@ void SimpleLoRaApp::initialize(int stage) loRaSF = par("initialLoRaSF"); loRaBW = inet::units::values::Hz(par("initialLoRaBW").doubleValue()); loRaCR = par("initialLoRaCR"); + loRaDC = par("initialLoRaDC").doubleValue(); //no sense to use inet::units::values::percent cuz % no allowed in ned loRaUseHeader = par("initialUseHeader"); evaluateADRinNode = par("evaluateADRinNode"); sfVector.setName("SF Vector"); tpVector.setName("TP Vector"); + + // Calculate transmission time according to duty cycle and coding rate + transmissionTimeTable[0] = (49.408 + loRaCR*7.168) / loRaDC / 10.0; //SF 7 + transmissionTimeTable[1] = (90.624 + loRaCR*12.288) / loRaDC / 10.0; //SF 8 + transmissionTimeTable[2] = (164.864 + loRaCR*20.48) / loRaDC / 10.0; //SF 9 + transmissionTimeTable[3] = (329.728 + loRaCR*40.96) / loRaDC / 10.0; //SF 10 + transmissionTimeTable[4] = (659.456 + loRaCR*81.92) / loRaDC / 10.0; //SF 11 + transmissionTimeTable[5] = (1187.84 + loRaCR*131.072) / loRaDC / 10.0; //SF 12 } } @@ -108,12 +117,12 @@ void SimpleLoRaApp::handleMessage(cMessage *msg) if(numberOfPacketsToSend == 0 || sentPackets < numberOfPacketsToSend) { double time; - if(loRaSF == 7) time = 7.808; - if(loRaSF == 8) time = 13.9776; - if(loRaSF == 9) time = 24.6784; - if(loRaSF == 10) time = 49.3568; - if(loRaSF == 11) time = 85.6064; - if(loRaSF == 12) time = 171.2128; + if(loRaSF == 7) time = transmissionTimeTable[0]; + if(loRaSF == 8) time = transmissionTimeTable[1]; + if(loRaSF == 9) time = transmissionTimeTable[2]; + if(loRaSF == 10) time = transmissionTimeTable[3]; + if(loRaSF == 11) time = transmissionTimeTable[4]; + if(loRaSF == 12) time = transmissionTimeTable[5]; do { timeToNextPacket = par("timeToNextPacket"); //if(timeToNextPacket < 3) error("Time to next packet must be grater than 3"); diff --git a/src/LoRaApp/SimpleLoRaApp.h b/src/LoRaApp/SimpleLoRaApp.h index f039ac7..e6706b6 100644 --- a/src/LoRaApp/SimpleLoRaApp.h +++ b/src/LoRaApp/SimpleLoRaApp.h @@ -52,6 +52,7 @@ class INET_API SimpleLoRaApp : public cSimpleModule, public ILifecycle int lastSentMeasurement; simtime_t timeToFirstPacket; simtime_t timeToNextPacket; + double transmissionTimeTable[6]; cMessage *configureLoRaParameters; cMessage *sendMeasurements; @@ -79,6 +80,7 @@ class INET_API SimpleLoRaApp : public cSimpleModule, public ILifecycle units::values::Hz loRaBW; int loRaCR; bool loRaUseHeader; + double loRaDC; }; } diff --git a/src/LoRaApp/SimpleLoRaApp.ned b/src/LoRaApp/SimpleLoRaApp.ned index 38b652f..6a286e6 100644 --- a/src/LoRaApp/SimpleLoRaApp.ned +++ b/src/LoRaApp/SimpleLoRaApp.ned @@ -32,6 +32,7 @@ simple SimpleLoRaApp double initialLoRaBW @unit(Hz) = default(125kHz); int initialLoRaCR = default(4); bool initialUseHeader = default(true); + double initialLoRaDC = default(1); @class(inet::SimpleLoRaApp); bool evaluateADRinNode = default(false); gates: