Skip to content

Commit 9b2507d

Browse files
author
Hasnain Virk
committed
Adding helpers for Channel mask manipulation
A few protected member functions are introduced in LoRaPHY class that help manipulate channel masks in various ways.
1 parent 8f0bb07 commit 9b2507d

File tree

4 files changed

+84
-45
lines changed

4 files changed

+84
-45
lines changed

features/lorawan/lorastack/phy/LoRaPHY.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,45 @@ void LoRaPHY::copy_channel_mask(uint16_t *dest_mask, uint16_t *src_mask, uint8_t
248248
}
249249
}
250250

251+
void LoRaPHY::intersect_channel_mask(const uint16_t *source,
252+
uint16_t *destination, uint8_t size)
253+
{
254+
if (!source || !destination || size == 0) {
255+
return;
256+
}
257+
258+
for (uint8_t i = 0; i < size; i++) {
259+
destination[i] &= source[i];
260+
}
261+
}
262+
263+
void LoRaPHY::fill_channel_mask_with_fsb(const uint16_t *expectation,
264+
const uint16_t *fsb_mask,
265+
uint16_t *destination,
266+
uint8_t size)
267+
{
268+
if (!expectation || !fsb_mask || !destination || size == 0) {
269+
return;
270+
}
271+
272+
for (uint8_t i = 0; i < size; i++) {
273+
destination[i] = expectation[i] & fsb_mask[i];
274+
}
275+
276+
}
277+
278+
void LoRaPHY::fill_channel_mask_with_value(uint16_t *channel_mask,
279+
uint16_t value, uint8_t size)
280+
{
281+
if (!channel_mask || size == 0) {
282+
return;
283+
}
284+
285+
for (uint8_t i = 0; i < size; i++) {
286+
channel_mask[i] = value;
287+
}
288+
}
289+
251290
void LoRaPHY::set_last_tx_done(uint8_t channel, bool joined, lorawan_time_t last_tx_done_time)
252291
{
253292
band_t *band_table = (band_t *) phy_params.bands.table;

features/lorawan/lorastack/phy/LoRaPHY.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,26 @@ class LoRaPHY : private mbed::NonCopyable<LoRaPHY> {
535535
protected:
536536
LoRaPHY();
537537

538+
/**
539+
* Sets the intersection of source and destination channel masks
540+
* into the destination.
541+
*/
542+
void intersect_channel_mask(const uint16_t *source, uint16_t *destination,
543+
uint8_t size);
544+
545+
/**
546+
* Fills channel mask array based upon the provided FSB mask
547+
*/
548+
void fill_channel_mask_with_fsb(const uint16_t *expectation,
549+
const uint16_t *fsb_mask,
550+
uint16_t *channel_mask, uint8_t size);
551+
552+
/**
553+
* Fills channel mask array with a given value
554+
*/
555+
void fill_channel_mask_with_value(uint16_t *channel_mask,
556+
uint16_t value, uint8_t size);
557+
538558
/**
539559
* Looks up corresponding band for a frequency. Returns -1 if not in any band.
540560
*/

features/lorawan/lorastack/phy/LoRaPHYAU915.cpp

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ static const uint8_t max_payload_with_repeater_AU915[] = { 51, 51, 51, 115,
222222

223223
static const uint16_t fsb_mask[] = MBED_CONF_LORA_FSB_MASK;
224224

225+
static const uint16_t full_channel_mask [] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00FF};
226+
225227
LoRaPHYAU915::LoRaPHYAU915()
226228
{
227229
bands[0] = AU915_BAND0;
@@ -244,18 +246,10 @@ LoRaPHYAU915::LoRaPHYAU915()
244246
// Initialize channels default mask
245247
// All channels are default channels here
246248
// Join request needs to alternate between 125 KHz and 500 KHz channels
247-
// randomly.
248-
// ChannelsMask
249-
for (uint8_t i = 0; i < AU915_MAX_NB_CHANNELS; i++) {
250-
if (i == (AU915_MAX_NB_CHANNELS - 1)) {
251-
// 64 - 71, 500 kHz channels will get enabled
252-
default_channel_mask[i] = 0x00FF & fsb_mask[i];
253-
continue;
254-
}
255-
256-
// 0 - 63 125 kHz channels will get enabled
257-
default_channel_mask[i] = 0xFFFF & fsb_mask[i];
258-
}
249+
// randomly. Fill in the default channel mask depending upon the given
250+
// fsb_mask
251+
fill_channel_mask_with_fsb(full_channel_mask, fsb_mask,
252+
default_channel_mask, AU915_CHANNEL_MASK_SIZE);
259253

260254
memset(channel_mask, 0, sizeof(channel_mask));
261255
memset(current_channel_mask, 0, sizeof(current_channel_mask));
@@ -452,17 +446,15 @@ uint8_t LoRaPHYAU915::link_ADR_request(adr_req_params_t* params,
452446

453447
if (adr_settings.ch_mask_ctrl == 6) {
454448
// Enable all 125 kHz channels
455-
for (uint8_t i = 0; i < AU915_CHANNEL_MASK_SIZE - 1; i++) {
456-
temp_channel_masks[i] = 0xFFFF;
457-
}
449+
fill_channel_mask_with_value(temp_channel_masks, 0xFFFF,
450+
AU915_CHANNEL_MASK_SIZE - 1);
458451

459452
// Apply chMask to channels 64 to 71
460453
temp_channel_masks[4] = adr_settings.channel_mask;
461454
} else if (adr_settings.ch_mask_ctrl == 7) {
462455
// Disable all 125 kHz channels
463-
for (uint8_t i = 0; i < AU915_CHANNEL_MASK_SIZE - 1; i++) {
464-
temp_channel_masks[i] = 0x0000;
465-
}
456+
fill_channel_mask_with_value(temp_channel_masks, 0x0000,
457+
AU915_CHANNEL_MASK_SIZE - 1);
466458

467459
// Apply chMask to channels 64 to 71
468460
temp_channel_masks[4] = adr_settings.channel_mask;
@@ -500,9 +492,8 @@ uint8_t LoRaPHYAU915::link_ADR_request(adr_req_params_t* params,
500492
// Copy Mask
501493
copy_channel_mask(channel_mask, temp_channel_masks, AU915_CHANNEL_MASK_SIZE);
502494

503-
for (uint8_t i = 0; i < AU915_CHANNEL_MASK_SIZE; i++) {
504-
current_channel_mask[i] &= channel_mask[i];
505-
}
495+
intersect_channel_mask(channel_mask, current_channel_mask,
496+
AU915_CHANNEL_MASK_SIZE);
506497
}
507498

508499
// Update status variables

features/lorawan/lorastack/phy/LoRaPHYUS915.cpp

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ static const uint8_t max_payloads_US915[] = {11, 53, 125, 242, 242, 0, 0, 0, 53,
212212
static const uint8_t max_payloads_with_repeater_US915[] = {11, 53, 125, 242, 242, 0, 0, 0, 33, 109, 222, 222, 222, 222, 0, 0};
213213

214214
static const uint16_t fsb_mask[] = MBED_CONF_LORA_FSB_MASK;
215+
static const uint16_t full_channel_mask [] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00FF};
215216

216217
LoRaPHYUS915::LoRaPHYUS915()
217218
{
@@ -231,17 +232,9 @@ LoRaPHYUS915::LoRaPHYUS915()
231232
channels[i].band = 0;
232233
}
233234

234-
// ChannelsMask
235-
for (uint8_t i = 0; i < US915_MAX_NB_CHANNELS; i++) {
236-
if (i == (US915_MAX_NB_CHANNELS - 1)) {
237-
// 64 - 71, 500 kHz channels will get enabled
238-
default_channel_mask[i] = 0x00FF & fsb_mask[i];
239-
continue;
240-
}
241-
242-
// 0 - 63 125 kHz channels will get enabled
243-
default_channel_mask[i] = 0xFFFF & fsb_mask[i];
244-
}
235+
// Fill-up default channel mask and apply FSB mask too
236+
fill_channel_mask_with_fsb(full_channel_mask, fsb_mask,
237+
default_channel_mask, US915_CHANNEL_MASK_SIZE);
245238

246239
memset(channel_mask, 0, sizeof(channel_mask));
247240
memset(current_channel_mask, 0, sizeof(current_channel_mask));
@@ -353,10 +346,8 @@ void LoRaPHYUS915::restore_default_channels()
353346
// Copy channels default mask
354347
copy_channel_mask(channel_mask, default_channel_mask, US915_CHANNEL_MASK_SIZE);
355348

356-
for (uint8_t i = 0; i < US915_CHANNEL_MASK_SIZE; i++) {
357-
// Copy-And the channels mask
358-
current_channel_mask[i] &= channel_mask[i];
359-
}
349+
// Update running channel mask
350+
intersect_channel_mask(channel_mask, current_channel_mask, US915_CHANNEL_MASK_SIZE);
360351
}
361352

362353
bool LoRaPHYUS915::rx_config(rx_config_params_t* config)
@@ -487,19 +478,17 @@ uint8_t LoRaPHYUS915::link_ADR_request(adr_req_params_t* params,
487478
if (adr_settings.ch_mask_ctrl == 6) {
488479

489480
// Enable all 125 kHz channels
490-
for (uint8_t i = 0; i < US915_CHANNEL_MASK_SIZE - 1; i++) {
491-
temp_channel_masks[i] = 0xFFFF;
492-
}
481+
fill_channel_mask_with_value(temp_channel_masks, 0xFFFF,
482+
US915_CHANNEL_MASK_SIZE - 1);
493483

494484
// Apply chMask to channels 64 to 71
495485
temp_channel_masks[4] = adr_settings.channel_mask;
496486

497487
} else if (adr_settings.ch_mask_ctrl == 7) {
498488

499489
// Disable all 125 kHz channels
500-
for (uint8_t i = 0; i < US915_CHANNEL_MASK_SIZE - 1; i++) {
501-
temp_channel_masks[i] = 0x0000;
502-
}
490+
fill_channel_mask_with_value(temp_channel_masks, 0x0000,
491+
US915_CHANNEL_MASK_SIZE - 1);
503492

504493
// Apply chMask to channels 64 to 71
505494
temp_channel_masks[4] = adr_settings.channel_mask;
@@ -540,9 +529,9 @@ uint8_t LoRaPHYUS915::link_ADR_request(adr_req_params_t* params,
540529
// Copy Mask
541530
copy_channel_mask(channel_mask, temp_channel_masks, US915_CHANNEL_MASK_SIZE);
542531

543-
for (uint8_t i = 0; i < US915_CHANNEL_MASK_SIZE; i++) {
544-
current_channel_mask[i] &= channel_mask[i];
545-
}
532+
// update running channel mask
533+
intersect_channel_mask(channel_mask, current_channel_mask,
534+
US915_CHANNEL_MASK_SIZE);
546535
}
547536

548537
// Update status variables

0 commit comments

Comments
 (0)