Fork of Semtech LoRaWAN stack
Fork of LoRaWAN-lib by
Revision 43:eed39925bade, committed 2017-08-21
- Comitter:
- Shaun Nelson
- Date:
- Mon Aug 21 16:09:09 2017 -0400
- Branch:
- india_support
- Parent:
- 36:fc9baa35ae1a
- Commit message:
- Added India channel plan
Changed in this revision
| LoRaMac-board.h | Show annotated file Show diff for this revision Revisions of this file |
| LoRaMac.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/LoRaMac-board.h Tue Aug 08 11:21:18 2017 -0400
+++ b/LoRaMac-board.h Mon Aug 21 16:09:09 2017 -0400
@@ -376,6 +376,123 @@
* LoRaMac channels which are allowed for the join procedure
*/
#define JOIN_CHANNELS ( uint16_t )( LC( 1 ) | LC( 2 ) | LC( 3 ) )
+#elif defined( USE_BAND_INDIA_865 )
+
+/*!
+ * LoRaMac maximum number of channels
+ */
+#define LORA_MAX_NB_CHANNELS 16
+
+/*!
+ * Minimal datarate that can be used by the node
+ */
+#define LORAMAC_TX_MIN_DATARATE DR_0
+
+/*!
+ * Maximal datarate that can be used by the node
+ */
+#define LORAMAC_TX_MAX_DATARATE DR_7
+
+/*!
+ * Minimal datarate that can be used by the node
+ */
+#define LORAMAC_RX_MIN_DATARATE DR_0
+
+/*!
+ * Maximal datarate that can be used by the node
+ */
+#define LORAMAC_RX_MAX_DATARATE DR_7
+
+/*!
+ * Default datarate used by the node
+ */
+#define LORAMAC_DEFAULT_DATARATE DR_0
+
+/*!
+ * Minimal Rx1 receive datarate offset
+ */
+#define LORAMAC_MIN_RX1_DR_OFFSET 0
+
+/*!
+ * Maximal Rx1 receive datarate offset
+ */
+#define LORAMAC_MAX_RX1_DR_OFFSET 7
+
+/*!
+ * Minimal Tx output power that can be used by the node
+ */
+#define LORAMAC_MIN_TX_POWER TX_POWER_10_DBM
+
+/*!
+ * Maximal Tx output power that can be used by the node
+ */
+#define LORAMAC_MAX_TX_POWER TX_POWER_20_DBM
+
+/*!
+ * Default Tx output power used by the node
+ */
+#define LORAMAC_DEFAULT_TX_POWER TX_POWER_20_DBM
+
+/*!
+ * LoRaMac TxPower definition
+ */
+#define TX_POWER_30_DBM 0
+#define TX_POWER_28_DBM 1
+#define TX_POWER_26_DBM 2
+#define TX_POWER_24_DBM 3
+#define TX_POWER_22_DBM 4
+#define TX_POWER_20_DBM 5
+#define TX_POWER_18_DBM 6
+#define TX_POWER_16_DBM 7
+#define TX_POWER_14_DBM 8
+#define TX_POWER_12_DBM 9
+#define TX_POWER_10_DBM 10
+
+/*!
+ * LoRaMac datarates definition
+ */
+#define DR_0 0 // SF12 - BW125
+#define DR_1 1 // SF11 - BW125
+#define DR_2 2 // SF10 - BW125
+#define DR_3 3 // SF9 - BW125
+#define DR_4 4 // SF8 - BW125
+#define DR_5 5 // SF7 - BW125
+#define DR_6 6 // SF7 - BW250
+#define DR_7 7 // FSK
+
+/*!
+ * Verification of default datarate
+ */
+#if ( LORAMAC_DEFAULT_DATARATE > DR_5 )
+#error "A default DR higher than DR_5 may lead to connectivity loss."
+#endif
+
+/*!
+ * Second reception window channel definition.
+ */
+// Channel = { Frequency [Hz], Datarate }
+#define RX_WND_2_CHANNEL { 866550000, DR_2 }
+
+/*!
+ * LoRaMac maximum number of bands
+ */
+#define LORA_MAX_NB_BANDS 1
+
+// Band = { DutyCycle, TxMaxPower, LastTxDoneTime, TimeOff }
+#define BAND0 { 1, TX_POWER_20_DBM, 0, 0 } // 100.0 %
+
+/*!
+ * LoRaMac default channels
+ */
+// Channel = { Frequency [Hz], { ( ( DrMax << 4 ) | DrMin ) }, Band }
+#define LC1 { 865062500, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
+#define LC2 { 865402500, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
+#define LC3 { 865985000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
+
+/*!
+ * LoRaMac channels which are allowed for the join procedure
+ */
+#define JOIN_CHANNELS ( uint16_t )( LC( 1 ) | LC( 2 ) | LC( 3 ) )
#elif defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
@@ -506,6 +623,7 @@
* }
* \endcode
*/
+
#else
#error "Please define a frequency band in the compiler options."
#endif
--- a/LoRaMac.cpp Tue Aug 08 11:21:18 2017 -0400
+++ b/LoRaMac.cpp Mon Aug 21 16:09:09 2017 -0400
@@ -329,6 +329,65 @@
LC2,
LC3,
};
+#elif defined( USE_BAND_INDIA_865 )
+/*!
+ * Data rates table definition
+ */
+const uint8_t Datarates[] = { 12, 11, 10, 9, 8, 7, 7, 50 };
+
+/*!
+ * Bandwidths table definition in Hz
+ */
+const uint32_t Bandwidths[] = { 125000, 125000, 125000, 125000, 125000, 125000, 250000, 0 };
+
+/*!
+ * Up/Down link data rates offset definition
+ */
+const int8_t DatarateOffsets[8] =
+{
+ DR_0, // DR_0
+ DR_1, // DR_1
+ DR_2, // DR_2
+ DR_3, // DR_3
+ DR_4, // DR_4
+ DR_5, // DR_5
+ -1, // DR_6
+ -2, // DR_7
+};
+
+/*!
+ * Maximum payload with respect to the datarate index. Cannot operate with repeater.
+ */
+const uint8_t MaxPayloadOfDatarate[] = { 51, 51, 51, 115, 242, 242, 242, 242 };
+
+/*!
+ * Maximum payload with respect to the datarate index. Can operate with repeater.
+ */
+const uint8_t MaxPayloadOfDatarateRepeater[] = { 51, 51, 51, 115, 222, 222, 222, 222 };
+
+/*!
+ * Tx output powers table definition
+ */
+const int8_t TxPowers[] = { 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10 };
+
+/*!
+ * LoRaMac bands
+ */
+static Band_t Bands[LORA_MAX_NB_BANDS] =
+{
+ BAND0,
+};
+
+/*!
+ * LoRaMAC channels
+ */
+static ChannelParams_t Channels[LORA_MAX_NB_CHANNELS] =
+{
+ LC1,
+ LC2,
+ LC3,
+};
+
#elif defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
/*!
* Data rates table definition
@@ -1565,7 +1624,7 @@
}
else
{
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined(USE_BAND_INDIA_865)
// Re-enable default channels LC1, LC2, LC3
ChannelsMask[0] = ChannelsMask[0] | ( LC( 1 ) + LC( 2 ) + LC( 3 ) );
#elif !defined( USE_BAND_915 ) && !defined( USE_BAND_915_HYBRID )
@@ -1654,7 +1713,7 @@
Radio.Standby( );
}
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined(USE_BAND_INDIA_865)
datarate = ChannelsDatarate - Rx1DrOffset;
if( datarate < 0 )
{
@@ -1731,7 +1790,7 @@
TimerStop( &RxWindowTimer2 );
RxSlot = 1;
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined( USE_BAND_INDIA_865)
// For higher datarates, we increase the number of symbols generating a Rx Timeout
if( ( Rx2Channel.Datarate == DR_3 ) || ( Rx2Channel.Datarate == DR_4 ) )
{ // DR_4, DR_3
@@ -1979,7 +2038,7 @@
{ // Check if the channel is enabled
continue;
}
-#if defined( USE_BAND_868 ) || defined( USE_BAND_433 ) || defined( USE_BAND_780 )
+#if defined( USE_BAND_868 ) || defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_INDIA_865)
if( IsLoRaMacNetworkJoined == false )
{
if( ( JOIN_CHANNELS & ( 1 << j ) ) == 0 )
@@ -2095,7 +2154,7 @@
// Store downlink datarate
McpsIndication.RxDatarate = ( uint8_t ) datarate;
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined( USE_BAND_INDIA_865)
if( datarate == DR_7 )
{
modem = MODEM_FSK;
@@ -2133,7 +2192,7 @@
static bool Rx2FreqInRange( uint32_t freq )
{
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined( USE_BAND_INDIA_865)
if( Radio.CheckRfFrequency( freq ) == true )
#elif ( defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID ) )
if( ( Radio.CheckRfFrequency( freq ) == true ) &&
@@ -2316,7 +2375,7 @@
if( ( AdrAckCounter % ADR_ACK_DELAY ) == 0 )
{
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined( USE_BAND_INDIA_865)
if( datarate > LORAMAC_TX_MIN_DATARATE )
{
datarate--;
@@ -2496,8 +2555,8 @@
int8_t txPower = 0;
int8_t datarate = 0;
uint8_t nbRep = 0;
+ uint8_t LinkAdrMacCmdBufferIndex = 0;
uint16_t channelsMask[6] = {0,0,0,0,0,0};
- uint8_t LinkAdrMacCmdBufferIndex = 0;
while( macIndex < commandsSize )
{
@@ -2537,9 +2596,9 @@
{
channelsMask[i] = ChannelsMask[i];
}
+
}
-
chMask = ( uint16_t )payload[macIndex++];
chMask |= ( uint16_t )payload[macIndex++] << 8;
@@ -2550,7 +2609,7 @@
{
nbRep = 1;
}
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined( USE_BAND_INDIA_865)
if( ( chMaskCntl == 0 ) && ( chMask == 0 ) )
{
status &= 0xFE; // Channel mask KO
@@ -2563,7 +2622,7 @@
}
else
{
- for( i = 0; i < LORA_MAX_NB_CHANNELS; i++ )
+ for( uint8_t i = 0; i < LORA_MAX_NB_CHANNELS; i++ )
{
if( chMaskCntl == 6 )
{
@@ -2794,10 +2853,11 @@
// Process accumulated Link ADR channel mask changes
if( validLinkAdrCmds > 0 )
{
- uint8_t drOkCounter = 0;
- uint8_t status = 0x07;
+ uint8_t status = 0x07;
#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
+
+ uint8_t drOkCounter = 0;
for(uint8_t i=0; i< 6; i++)
{
for( uint8_t j = 0; j < 16; j++ )
@@ -2836,12 +2896,14 @@
#endif
#endif
+
if( ( status & 0x07 ) == 0x07 )
{
ChannelsDatarate = datarate;
ChannelsDefaultDatarate = datarate;
ChannelsTxPower = txPower;
+#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
ChannelsMask[0] = channelsMask[0];
ChannelsMask[1] = channelsMask[1];
ChannelsMask[2] = channelsMask[2];
@@ -2849,10 +2911,11 @@
ChannelsMask[4] = channelsMask[4];
ChannelsMask[5] = channelsMask[5];
- ChannelsNbRep = nbRep;
// Clear remaining channels mask
memcpy1( ( uint8_t* ) ChannelsMaskRemaining, ( uint8_t* ) ChannelsMask, 10 );
+#endif
+ ChannelsNbRep = nbRep;
}
// Channel Mask KO
else
@@ -2917,7 +2980,7 @@
// Set the default datarate
ChannelsDatarate = ChannelsDefaultDatarate;
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined( USE_BAND_INDIA_865)
// Re-enable default channels LC1, LC2, LC3
ChannelsMask[0] = ChannelsMask[0] | ( LC( 1 ) + LC( 2 ) + LC( 3 ) );
#endif
@@ -3137,7 +3200,7 @@
Radio.SetChannel( channel.Frequency );
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined( USE_BAND_INDIA_865)
if( ChannelsDatarate == DR_7 )
{ // High Speed FSK channel
Radio.SetMaxPayloadLength( MODEM_FSK, LoRaMacBufferPktLen );
@@ -3244,6 +3307,8 @@
ChannelsMask[0] = LC( 1 ) + LC( 2 ) + LC( 3 );
#elif defined( USE_BAND_868 )
ChannelsMask[0] = LC( 1 ) + LC( 2 ) + LC( 3 );
+#elif defined( USE_BAND_INDIA_865 )
+ ChannelsMask[0] = LC( 1 ) + LC( 2 ) + LC( 3 );
#elif defined( USE_BAND_915 )
ChannelsMask[0] = 0xFFFF;
ChannelsMask[1] = 0xFFFF;
@@ -3288,9 +3353,11 @@
ChannelsNbRep = 1;
ChannelsNbRepCounter = 0;
+#if defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
Rx2Channel.Frequency = 923300000;
Rx2Channel.Datarate = DR_8;
Rx1DrOffset = 0;
+#endif
MaxDCycle = 0;
@@ -3304,6 +3371,8 @@
DutyCycleOn = false;
#elif defined( USE_BAND_868 )
DutyCycleOn = true;
+#elif defined( USE_BAND_INDIA_865 )
+ DutyCycleOn = false;
#elif defined( USE_BAND_915 ) || defined( USE_BAND_915_HYBRID )
DutyCycleOn = false;
#else
@@ -3828,7 +3897,7 @@
datarateInvalid = true;
}
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined( USE_BAND_INDIA_865 )
if( id < 3 )
{
if( params.Frequency != Channels[id].Frequency )
@@ -3906,7 +3975,7 @@
LoRaMacStatus_t LoRaMacChannelRemove( uint8_t id )
{
-#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 )
+#if defined( USE_BAND_433 ) || defined( USE_BAND_780 ) || defined( USE_BAND_868 ) || defined( USE_BAND_INDIA_865)
if( ( LoRaMacState & MAC_TX_RUNNING ) == MAC_TX_RUNNING )
{
if( ( LoRaMacState & MAC_TX_CONFIG ) != MAC_TX_CONFIG )
@@ -4225,7 +4294,7 @@
TimerTime_t period;
TimerTime_t onAirTimeMax;
TimerTime_t lastJoinTime;
- TimerTime_t elapsedTime;
+ TimerTime_t elapsedTime = 0;
uint8_t dcyclePeriod;
// Check retransmit duty-cycle is enabled
