Fork of Semtech LoRaWAN stack
Fork of LoRaWAN-lib by
Revision 9:ad93de20d720, committed 2016-08-26
- Comitter:
- snelson
- Date:
- Fri Aug 26 11:32:12 2016 -0400
- Branch:
- v4.2.0
- Parent:
- 8:4816c8449bf2
- Child:
- 10:be956b45a7ba
- Commit message:
- Merge of senet v4.2 join retransmission back-off change
Changed in this revision
| LoRaMac.cpp | Show annotated file Show diff for this revision Revisions of this file |
| LoRaMac.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/LoRaMac.cpp Mon Aug 22 20:30:06 2016 -0400
+++ b/LoRaMac.cpp Fri Aug 26 11:32:12 2016 -0400
@@ -593,32 +593,9 @@
*/
LoRaMacFlags_t LoRaMacFlags;
-/* LoRaWAN 1.1 Section 9 Retransmission back-off
- *
- * Applies to uplink frames that:
- * - Require acknowledgement or answer, and are
- * retransmitted by the device if the answer is not received
- * and
- * - Can be triggered by an external event causing synchronization
- *
- * Transmission duty-cylce for such messages shall respect the local regulations
- * and the following limits
- * - Aggregated during the first hour 36 seconds
- * - Aggregated during the next 10 hours 36 seconds
- * - After the first 11 hours aggregated over 24h 8.7seconds
+/*!
+ * Join Retransmission back-off configuration
*/
-#ifndef JOIN_RETRANSMISSION_DCYCLE1
-#define JOIN_RETRANSMISSION_DCYCLE1 { 3600, 1000000 } // (period, onAirTimeMax)
-#endif
-
-#ifndef JOIN_RETRANSMISSION_DCYCLE2
-#define JOIN_RETRANSMISSION_DCYCLE2 { 10*3600, 36000000 } // (period, onAirTimeMax)
-#endif
-
-#ifndef JOIN_RETRANSMISSION_DCYCLE3
-#define JOIN_RETRANSMISSION_DCYCLE3 { 24*3600, 8700000 } // (period, onAirTimeMax)
-#endif
-
LoRaMacRetransmissionDCycle_t JoinReTransmitDCycle[JOIN_NB_RETRANSMISSION_DCYCLES] =
{
JOIN_RETRANSMISSION_DCYCLE1,
@@ -1068,16 +1045,6 @@
// DLSettings
Rx1DrOffset = ( LoRaMacRxPayload[11] >> 4 ) & 0x07;
Rx2Channel.Datarate = LoRaMacRxPayload[11] & 0x0F;
-#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
- /*
- * WARNING: To be removed once Semtech server implementation
- * is corrected.
- */
- if( Rx2Channel.Datarate == DR_3 )
- {
- Rx2Channel.Datarate = DR_8;
- }
-#endif
// RxDelay
ReceiveDelay1 = ( LoRaMacRxPayload[12] & 0x0F );
if( ReceiveDelay1 == 0 )
@@ -3074,31 +3041,6 @@
IsLoRaMacNetworkJoined = false;
LoRaMacState = MAC_IDLE;
- MulticastChannels = NULL;
- IsUpLinkCounterFixed = false;
- IsRxWindowsEnabled = true;
- IsLoRaMacNetworkJoined = false;
- AdrCtrlOn = false;
- AdrAckCounter = 0;
- NodeAckRequested = false;
- SrvAckRequested = false;
- MacCommandsInNextTx = false;
- MacCommandsBufferIndex = 0;
- AckTimeoutRetries = 1;
- AckTimeoutRetriesCounter = 1;
- AckTimeoutRetry = false;
- TxTimeOnAir = 0;
- RxSlot = 0;
- //Rx2Channel = RX_WND_2_CHANNEL;
- Rx1DrOffset = 0;
- ChannelsTxPower = LORAMAC_DEFAULT_TX_POWER;
- ChannelsDatarate = LORAMAC_DEFAULT_DATARATE;
- ChannelsDefaultDatarate = LORAMAC_DEFAULT_DATARATE;
- ChannelsNbRep = 1;
- ChannelsNbRepCounter = 0;
- MaxDCycle = 0;
-
-
#if defined( USE_BAND_433 )
ChannelsMask[0] = LC( 1 ) + LC( 2 ) + LC( 3 );
#elif defined( USE_BAND_780 )
@@ -3613,7 +3555,19 @@
if( ValueInRange( mibSet->Param.ChannelsTxPower,
LORAMAC_MAX_TX_POWER, LORAMAC_MIN_TX_POWER ) )
{
+#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
+ int8_t txPower = LimitTxPower( mibSet->Param.ChannelsTxPower );
+ if( txPower == mibSet->Param.ChannelsTxPower )
+ {
+ ChannelsTxPower = mibSet->Param.ChannelsTxPower;
+ }
+ else
+ {
+ status = LORAMAC_STATUS_PARAMETER_INVALID;
+ }
+#else
ChannelsTxPower = mibSet->Param.ChannelsTxPower;
+#endif
}
else
{
@@ -4062,57 +4016,66 @@
TimerTime_t prevDCycleEndTime;
TimerTime_t period;
TimerTime_t onAirTimeMax;
- uint8_t dcycleNum;
-
- // Check retransmit duty-cycle exists
+ TimerTime_t lastJoinTime;
+ TimerTime_t elapsedTime;
+ uint8_t dcyclePeriod;
+
+ // Check retransmit duty-cycle is enabled
if ( JOIN_NB_RETRANSMISSION_DCYCLES == 0 )
return 0;
- uptime = TimerGetCurrentTime( ) / 1e6;
-
- // Get uptime dutycycle
+ // Normalize system time values to seconds
+ uptime = TimerGetCurrentTime( ) / 1e3;
+ lastJoinTime = LastJoinTxTime / 1e3;
+
+ // Get dutycycle for current time
prevDCycleEndTime = 0;
currDCycleEndTime = 0;
- for(dcycleNum = 0; dcycleNum < JOIN_NB_RETRANSMISSION_DCYCLES; dcycleNum++)
+ for(dcyclePeriod = 0; dcyclePeriod < JOIN_NB_RETRANSMISSION_DCYCLES; dcyclePeriod++)
{
prevDCycleEndTime = currDCycleEndTime;
- currDCycleEndTime += JoinReTransmitDCycle[dcycleNum].period;
+ currDCycleEndTime += JoinReTransmitDCycle[dcyclePeriod].period;
bool isCurrentPeriod = uptime < currDCycleEndTime;
- if( isCurrentPeriod || ( dcycleNum == ( JOIN_NB_RETRANSMISSION_DCYCLES-1 ) ) )
+ if( isCurrentPeriod || ( dcyclePeriod == ( JOIN_NB_RETRANSMISSION_DCYCLES-1 ) ) )
{
- period = JoinReTransmitDCycle[dcycleNum].period;
- onAirTimeMax = JoinReTransmitDCycle[dcycleNum].onAirTimeMax;
+ period = JoinReTransmitDCycle[dcyclePeriod].period;
+ onAirTimeMax = JoinReTransmitDCycle[dcyclePeriod].onAirTimeMax;
if( isCurrentPeriod == true )
break;
}
}
- // Clear aggregate on air time if last join occured during a previous period
- if( LastJoinTxTime < prevDCycleEndTime )
+ // Clear aggregate on air time if dutycycle period of last join has elapsed
+ if( lastJoinTime < prevDCycleEndTime )
{
JoinAggTimeOnAir = 0;
}
- // For last dutycyle, the current & previous period end time must be calculated
- else if( dcycleNum == JOIN_NB_RETRANSMISSION_DCYCLES )
+ else
{
- if( ( TimerGetElapsedTime( LastJoinTxTime )/1e6 ) >= period )
+ elapsedTime = ( uptime - prevDCycleEndTime ) % period;
+
+ if( dcyclePeriod == JOIN_NB_RETRANSMISSION_DCYCLES )
{
- JoinAggTimeOnAir = 0;
+ if( ( ( uptime - prevDCycleEndTime ) / period ) > ( ( lastJoinTime - prevDCycleEndTime ) / period ) )
+ {
+ JoinAggTimeOnAir = 0;
+ }
}
}
if ( JoinAggTimeOnAir >= onAirTimeMax )
{
- // current period elapsed time
- TimerTime_t elapsedTime = ( uptime - prevDCycleEndTime ) % period;
-
// time off is remaining time until beginning of next period
- timeOff = ( period - elapsedTime ) * 1e6;
+ timeOff = ( period - elapsedTime );
+
+ DEBUG_LOG("%s: timeOff=%u, onAir=%u/%u, period=%u, uptime=%u",
+ __func__, timeOff, JoinAggTimeOnAir, onAirTimeMax, period, uptime);
}
- return timeOff;
+
+ return ( timeOff * 1e6);
}
void LoRaMacTestRxWindowsOn( bool enable )
--- a/LoRaMac.h Mon Aug 22 20:30:06 2016 -0400
+++ b/LoRaMac.h Fri Aug 26 11:32:12 2016 -0400
@@ -156,6 +156,27 @@
*/
#define JOIN_NB_RETRANSMISSION_DCYCLES 3
+/*!
+ * Join Aggregated duty cycle during the first hour
+ */
+#ifndef JOIN_RETRANSMISSION_DCYCLE1
+#define JOIN_RETRANSMISSION_DCYCLE1 { 3600, 36000000 }
+#endif
+
+/*!
+ * Join Aggregated duty cycle during the next 10 hours
+ */
+#ifndef JOIN_RETRANSMISSION_DCYCLE2
+#define JOIN_RETRANSMISSION_DCYCLE2 { 10*3600, 36000000 }
+#endif
+
+/*!
+ * Join Aggregated after the first 11 hours
+ */
+#ifndef JOIN_RETRANSMISSION_DCYCLE3
+#define JOIN_RETRANSMISSION_DCYCLE3 { 24*3600, 8700000 }
+#endif
+
/*!
* LoRaMac internal state
*/
@@ -1466,13 +1487,12 @@
/*!
- * LoRaMAC Retransmission duty cylcle structure
- * Used for Retransmission back-off duty cycle configuration
+ * LoRaMAC Join Retransmission duty cycle structure
*/
typedef struct sLoRaMacRetransmissionDCycle
{
TimerTime_t period; // Retransmission period in seconds
- TimerTime_t onAirTimeMax; // Max on air time in time units used by Radio.TimeOnAir()
+ TimerTime_t onAirTimeMax; // Max on air time in units returned by Radio.TimeOnAir()
} LoRaMacRetransmissionDCycle_t;
@@ -1733,14 +1753,7 @@
*/
TimerTime_t LoRaMacCalcJoinBackOff( );
-/*!
- * \brief LoRaMacGetMaxAppPayloadLength
- *
- * \retval The maximum application payload length based on the current datarate
- * and repeater support
- *
- */
-uint8_t LoRaMacGetMaxAppPayloadLength();
+
/*! \} defgroup LORAMAC */
