Skip to content

Commit d2b4a42

Browse files
committed
Improved GetNextLowerTxDr function implementation.
1 parent f8d1950 commit d2b4a42

File tree

12 files changed

+122
-56
lines changed

12 files changed

+122
-56
lines changed

src/mac/region/RegionAS923.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -195,14 +195,16 @@ PhyParam_t RegionAS923GetPhyParam( GetPhyParams_t* getPhy )
195195
}
196196
case PHY_NEXT_LOWER_TX_DR:
197197
{
198-
if( getPhy->UplinkDwellTime == 0 )
198+
RegionCommonGetNextLowerTxDrParams_t nextLowerTxDrParams =
199199
{
200-
phyParam.Value = RegionCommonGetNextLowerTxDr( getPhy->Datarate, AS923_TX_MIN_DATARATE );
201-
}
202-
else
203-
{
204-
phyParam.Value = RegionCommonGetNextLowerTxDr( getPhy->Datarate, AS923_DWELL_LIMIT_DATARATE );
205-
}
200+
.CurrentDr = getPhy->Datarate,
201+
.MaxDr = ( int8_t )AS923_TX_MAX_DATARATE,
202+
.MinDr = ( int8_t )( ( getPhy->UplinkDwellTime == 0 ) ? AS923_TX_MIN_DATARATE : AS923_DWELL_LIMIT_DATARATE ),
203+
.NbChannels = AS923_MAX_NB_CHANNELS,
204+
.ChannelsMask = NvmCtx.ChannelsMask,
205+
.Channels = NvmCtx.Channels,
206+
};
207+
phyParam.Value = RegionCommonGetNextLowerTxDr( &nextLowerTxDrParams );
206208
break;
207209
}
208210
case PHY_MAX_TX_POWER:

src/mac/region/RegionAU915.c

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,6 @@ typedef struct sRegionAU915NvmCtx
8080
*/
8181
static RegionAU915NvmCtx_t NvmCtx;
8282

83-
// Static functions
84-
static int8_t GetNextLowerTxDr( int8_t dr, int8_t minDr )
85-
{
86-
if( dr == DR_8 )
87-
{ // DR_7 is not allowed
88-
return DR_6;
89-
}
90-
else
91-
{
92-
return RegionCommonGetNextLowerTxDr( dr, minDr );
93-
}
94-
}
95-
9683
static bool VerifyRfFreq( uint32_t freq )
9784
{
9885
// Check radio driver support
@@ -162,14 +149,16 @@ PhyParam_t RegionAU915GetPhyParam( GetPhyParams_t* getPhy )
162149
}
163150
case PHY_NEXT_LOWER_TX_DR:
164151
{
165-
if( getPhy->UplinkDwellTime == 0)
166-
{
167-
phyParam.Value = GetNextLowerTxDr( getPhy->Datarate, AU915_TX_MIN_DATARATE );
168-
}
169-
else
152+
RegionCommonGetNextLowerTxDrParams_t nextLowerTxDrParams =
170153
{
171-
phyParam.Value = GetNextLowerTxDr( getPhy->Datarate, AU915_DWELL_LIMIT_DATARATE );
172-
}
154+
.CurrentDr = getPhy->Datarate,
155+
.MaxDr = ( int8_t )AU915_TX_MAX_DATARATE,
156+
.MinDr = ( int8_t )( ( getPhy->UplinkDwellTime == 0 ) ? AU915_TX_MIN_DATARATE : AU915_DWELL_LIMIT_DATARATE ),
157+
.NbChannels = AU915_MAX_NB_CHANNELS,
158+
.ChannelsMask = NvmCtx.ChannelsMask,
159+
.Channels = NvmCtx.Channels,
160+
};
161+
phyParam.Value = RegionCommonGetNextLowerTxDr( &nextLowerTxDrParams );
173162
break;
174163
}
175164
case PHY_MAX_TX_POWER:

src/mac/region/RegionCN470.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,16 @@ PhyParam_t RegionCN470GetPhyParam( GetPhyParams_t* getPhy )
121121
}
122122
case PHY_NEXT_LOWER_TX_DR:
123123
{
124-
phyParam.Value = RegionCommonGetNextLowerTxDr( getPhy->Datarate, CN470_TX_MIN_DATARATE );
124+
RegionCommonGetNextLowerTxDrParams_t nextLowerTxDrParams =
125+
{
126+
.CurrentDr = getPhy->Datarate,
127+
.MaxDr = ( int8_t )CN470_TX_MAX_DATARATE,
128+
.MinDr = ( int8_t )CN470_TX_MIN_DATARATE,
129+
.NbChannels = CN470_MAX_NB_CHANNELS,
130+
.ChannelsMask = NvmCtx.ChannelsMask,
131+
.Channels = NvmCtx.Channels,
132+
};
133+
phyParam.Value = RegionCommonGetNextLowerTxDr( &nextLowerTxDrParams );
125134
break;
126135
}
127136
case PHY_MAX_TX_POWER:

src/mac/region/RegionCN779.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,16 @@ PhyParam_t RegionCN779GetPhyParam( GetPhyParams_t* getPhy )
120120
}
121121
case PHY_NEXT_LOWER_TX_DR:
122122
{
123-
phyParam.Value = RegionCommonGetNextLowerTxDr( getPhy->Datarate, CN779_TX_MIN_DATARATE );
123+
RegionCommonGetNextLowerTxDrParams_t nextLowerTxDrParams =
124+
{
125+
.CurrentDr = getPhy->Datarate,
126+
.MaxDr = ( int8_t )CN779_TX_MAX_DATARATE,
127+
.MinDr = ( int8_t )CN779_TX_MIN_DATARATE,
128+
.NbChannels = CN779_MAX_NB_CHANNELS,
129+
.ChannelsMask = NvmCtx.ChannelsMask,
130+
.Channels = NvmCtx.Channels,
131+
};
132+
phyParam.Value = RegionCommonGetNextLowerTxDr( &nextLowerTxDrParams );
124133
break;
125134
}
126135
case PHY_MAX_TX_POWER:

src/mac/region/RegionCommon.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -629,15 +629,23 @@ LoRaMacStatus_t RegionCommonIdentifyChannels( RegionCommonIdentifyChannelsParam_
629629
}
630630
}
631631

632-
int8_t RegionCommonGetNextLowerTxDr( int8_t dr, int8_t minDr )
632+
int8_t RegionCommonGetNextLowerTxDr( RegionCommonGetNextLowerTxDrParams_t *params )
633633
{
634-
if( dr == minDr )
634+
int8_t drLocal = params->CurrentDr;
635+
636+
if( params->CurrentDr == params->MinDr )
635637
{
636-
return minDr;
638+
return params->MinDr;
637639
}
638640
else
639641
{
640-
return( dr - 1 );
642+
do
643+
{
644+
drLocal = ( drLocal - 1 );
645+
} while( ( drLocal != params->MinDr ) &&
646+
( RegionCommonChanVerifyDr( params->NbChannels, params->ChannelsMask, drLocal, params->MinDr, params->MaxDr, params->Channels ) == false ) );
647+
648+
return drLocal;
641649
}
642650
}
643651

src/mac/region/RegionCommon.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,16 @@ typedef struct sRegionCommonSetDutyCycleParams
322322
Band_t* Bands;
323323
}RegionCommonSetDutyCycleParams_t;
324324

325+
typedef struct sRegionCommonGetNextLowerTxDrParams
326+
{
327+
int8_t CurrentDr;
328+
int8_t MaxDr;
329+
int8_t MinDr;
330+
uint8_t NbChannels;
331+
uint16_t* ChannelsMask;
332+
ChannelParams_t* Channels;
333+
}RegionCommonGetNextLowerTxDrParams_t;
334+
325335
/*!
326336
* \brief Verifies, if a value is in a given range.
327337
* This is a generic function and valid for all regions.
@@ -573,13 +583,11 @@ LoRaMacStatus_t RegionCommonIdentifyChannels( RegionCommonIdentifyChannelsParam_
573583
/*!
574584
* \brief Selects the next lower datarate.
575585
*
576-
* \param [IN] dr Current datarate.
577-
*
578-
* \param [IN] minDr Minimum possible datarate.
586+
* \param [IN] params Data structure providing parameters based on \ref RegionCommonGetNextLowerTxDrParams_t
579587
*
580588
* \retval The next lower datarate.
581589
*/
582-
int8_t RegionCommonGetNextLowerTxDr( int8_t dr, int8_t minDr );
590+
int8_t RegionCommonGetNextLowerTxDr( RegionCommonGetNextLowerTxDrParams_t *params );
583591

584592
/*!
585593
* \brief Limits the TX power.

src/mac/region/RegionEU433.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,16 @@ PhyParam_t RegionEU433GetPhyParam( GetPhyParams_t* getPhy )
120120
}
121121
case PHY_NEXT_LOWER_TX_DR:
122122
{
123-
phyParam.Value = RegionCommonGetNextLowerTxDr( getPhy->Datarate, EU433_TX_MIN_DATARATE );
123+
RegionCommonGetNextLowerTxDrParams_t nextLowerTxDrParams =
124+
{
125+
.CurrentDr = getPhy->Datarate,
126+
.MaxDr = ( int8_t )EU433_TX_MAX_DATARATE,
127+
.MinDr = ( int8_t )EU433_TX_MIN_DATARATE,
128+
.NbChannels = EU433_MAX_NB_CHANNELS,
129+
.ChannelsMask = NvmCtx.ChannelsMask,
130+
.Channels = NvmCtx.Channels,
131+
};
132+
phyParam.Value = RegionCommonGetNextLowerTxDr( &nextLowerTxDrParams );
124133
break;
125134
}
126135
case PHY_MAX_TX_POWER:

src/mac/region/RegionEU868.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,16 @@ PhyParam_t RegionEU868GetPhyParam( GetPhyParams_t* getPhy )
145145
}
146146
case PHY_NEXT_LOWER_TX_DR:
147147
{
148-
phyParam.Value = RegionCommonGetNextLowerTxDr( getPhy->Datarate, EU868_TX_MIN_DATARATE );
148+
RegionCommonGetNextLowerTxDrParams_t nextLowerTxDrParams =
149+
{
150+
.CurrentDr = getPhy->Datarate,
151+
.MaxDr = ( int8_t )EU868_TX_MAX_DATARATE,
152+
.MinDr = ( int8_t )EU868_TX_MIN_DATARATE,
153+
.NbChannels = EU868_MAX_NB_CHANNELS,
154+
.ChannelsMask = NvmCtx.ChannelsMask,
155+
.Channels = NvmCtx.Channels,
156+
};
157+
phyParam.Value = RegionCommonGetNextLowerTxDr( &nextLowerTxDrParams );
149158
break;
150159
}
151160
case PHY_MAX_TX_POWER:

src/mac/region/RegionIN865.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -64,19 +64,6 @@ typedef struct sRegionIN865NvmCtx
6464
*/
6565
static RegionIN865NvmCtx_t NvmCtx;
6666

67-
// Static functions
68-
static int8_t GetNextLowerTxDr( int8_t dr, int8_t minDr )
69-
{
70-
if( dr == DR_7 )
71-
{
72-
return DR_5;
73-
}
74-
else
75-
{
76-
return RegionCommonGetNextLowerTxDr( dr, minDr );
77-
}
78-
}
79-
8067
static bool VerifyRfFreq( uint32_t freq )
8168
{
8269
// Check radio driver support
@@ -132,7 +119,16 @@ PhyParam_t RegionIN865GetPhyParam( GetPhyParams_t* getPhy )
132119
}
133120
case PHY_NEXT_LOWER_TX_DR:
134121
{
135-
phyParam.Value = GetNextLowerTxDr( getPhy->Datarate, IN865_TX_MIN_DATARATE );
122+
RegionCommonGetNextLowerTxDrParams_t nextLowerTxDrParams =
123+
{
124+
.CurrentDr = getPhy->Datarate,
125+
.MaxDr = ( int8_t )IN865_TX_MAX_DATARATE,
126+
.MinDr = ( int8_t )IN865_TX_MIN_DATARATE,
127+
.NbChannels = IN865_MAX_NB_CHANNELS,
128+
.ChannelsMask = NvmCtx.ChannelsMask,
129+
.Channels = NvmCtx.Channels,
130+
};
131+
phyParam.Value = RegionCommonGetNextLowerTxDr( &nextLowerTxDrParams );
136132
break;
137133
}
138134
case PHY_MAX_TX_POWER:

src/mac/region/RegionKR920.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,16 @@ PhyParam_t RegionKR920GetPhyParam( GetPhyParams_t* getPhy )
136136
}
137137
case PHY_NEXT_LOWER_TX_DR:
138138
{
139-
phyParam.Value = RegionCommonGetNextLowerTxDr( getPhy->Datarate, KR920_TX_MIN_DATARATE );
139+
RegionCommonGetNextLowerTxDrParams_t nextLowerTxDrParams =
140+
{
141+
.CurrentDr = getPhy->Datarate,
142+
.MaxDr = ( int8_t )KR920_TX_MAX_DATARATE,
143+
.MinDr = ( int8_t )KR920_TX_MIN_DATARATE,
144+
.NbChannels = KR920_MAX_NB_CHANNELS,
145+
.ChannelsMask = NvmCtx.ChannelsMask,
146+
.Channels = NvmCtx.Channels,
147+
};
148+
phyParam.Value = RegionCommonGetNextLowerTxDr( &nextLowerTxDrParams );
140149
break;
141150
}
142151
case PHY_MAX_TX_POWER:

0 commit comments

Comments
 (0)