@@ -204,45 +204,45 @@ static const int8_t datarate_offsets_US915[5][4] =
204
204
/* !
205
205
* Maximum payload with respect to the datarate index. Cannot operate with repeater.
206
206
*/
207
- static const uint8_t max_payloads_US915[] = { 11 , 53 , 125 , 242 , 242 , 0 , 0 , 0 , 53 , 129 , 242 , 242 , 242 , 242 , 0 , 0 };
207
+ static const uint8_t max_payloads_US915[] = {11 , 53 , 125 , 242 , 242 , 0 , 0 , 0 , 53 , 129 , 242 , 242 , 242 , 242 , 0 , 0 };
208
208
209
209
/* !
210
210
* Maximum payload with respect to the datarate index. Can operate with repeater.
211
211
*/
212
212
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 };
213
213
214
+ static const uint16_t fsb_mask[] = MBED_CONF_LORA_FSB_MASK;
215
+ static const uint16_t full_channel_mask [] = {0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0x00FF };
216
+
214
217
LoRaPHYUS915::LoRaPHYUS915 ()
215
218
{
216
219
bands[0 ] = US915_BAND0;
217
220
218
221
// Channels
219
- // 125 kHz channels
222
+ // 125 kHz channels - Upstream
220
223
for (uint8_t i = 0 ; i < US915_MAX_NB_CHANNELS - 8 ; i++) {
221
224
channels[i].frequency = 902300000 + i * 200000 ;
222
225
channels[i].dr_range .value = ( DR_3 << 4 ) | DR_0;
223
226
channels[i].band = 0 ;
224
227
}
225
- // 500 kHz channels
228
+ // 500 kHz channels - Upstream
226
229
for (uint8_t i = US915_MAX_NB_CHANNELS - 8 ; i < US915_MAX_NB_CHANNELS; i++) {
227
230
channels[i].frequency = 903000000 + (i - ( US915_MAX_NB_CHANNELS - 8 )) * 1600000 ;
228
231
channels[i].dr_range .value = ( DR_4 << 4 ) | DR_4;
229
232
channels[i].band = 0 ;
230
233
}
231
234
232
- // ChannelsMask
233
- default_channel_mask[0 ] = 0xFFFF ;
234
- default_channel_mask[1 ] = 0xFFFF ;
235
- default_channel_mask[2 ] = 0xFFFF ;
236
- default_channel_mask[3 ] = 0xFFFF ;
237
- default_channel_mask[4 ] = 0x00FF ;
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);
238
238
239
239
memset (channel_mask, 0 , sizeof (channel_mask));
240
240
memset (current_channel_mask, 0 , sizeof (current_channel_mask));
241
241
242
242
// Copy channels default mask
243
243
copy_channel_mask (channel_mask, default_channel_mask, US915_CHANNEL_MASK_SIZE);
244
244
245
- // current channel masks keep track what of the
245
+ // current channel masks keep track of the
246
246
// channels previously used, i.e., which channels should be avoided in
247
247
// next transmission
248
248
copy_channel_mask (current_channel_mask, channel_mask, US915_CHANNEL_MASK_SIZE);
@@ -346,10 +346,8 @@ void LoRaPHYUS915::restore_default_channels()
346
346
// Copy channels default mask
347
347
copy_channel_mask (channel_mask, default_channel_mask, US915_CHANNEL_MASK_SIZE);
348
348
349
- for ( uint8_t i = 0 ; i < US915_CHANNEL_MASK_SIZE; i++ ) {
350
- // Copy-And the channels mask
351
- current_channel_mask[i] &= channel_mask[i];
352
- }
349
+ // Update running channel mask
350
+ intersect_channel_mask (channel_mask, current_channel_mask, US915_CHANNEL_MASK_SIZE);
353
351
}
354
352
355
353
bool LoRaPHYUS915::rx_config (rx_config_params_t * config)
@@ -384,10 +382,11 @@ bool LoRaPHYUS915::rx_config(rx_config_params_t* config)
384
382
385
383
_radio->lock ();
386
384
387
- _radio->set_channel ( frequency );
385
+ _radio->set_channel (frequency);
388
386
389
387
// Radio configuration
390
- _radio->set_rx_config (MODEM_LORA, config->bandwidth , phy_dr, 1 , 0 , 8 ,
388
+ _radio->set_rx_config (MODEM_LORA, config->bandwidth , phy_dr, 1 , 0 ,
389
+ MBED_CONF_LORA_DOWNLINK_PREAMBLE_LENGTH,
391
390
config->window_timeout , false , 0 , false , 0 , 0 , true ,
392
391
config->is_rx_continuous );
393
392
_radio->unlock ();
@@ -429,7 +428,8 @@ bool LoRaPHYUS915::tx_config(tx_config_params_t* config, int8_t* tx_power,
429
428
430
429
_radio->set_channel (channels[config->channel ].frequency );
431
430
432
- _radio->set_tx_config (MODEM_LORA, phy_tx_power, 0 , bandwidth, phy_dr, 1 , 8 ,
431
+ _radio->set_tx_config (MODEM_LORA, phy_tx_power, 0 , bandwidth, phy_dr, 1 ,
432
+ MBED_CONF_LORA_UPLINK_PREAMBLE_LENGTH,
433
433
false , true , 0 , 0 , false , 3000 );
434
434
435
435
// Setup maximum payload lenght of the radio driver
@@ -478,20 +478,18 @@ uint8_t LoRaPHYUS915::link_ADR_request(adr_req_params_t* params,
478
478
if (adr_settings.ch_mask_ctrl == 6 ) {
479
479
480
480
// Enable all 125 kHz channels
481
- temp_channel_masks[0 ] = 0xFFFF ;
482
- temp_channel_masks[1 ] = 0xFFFF ;
483
- temp_channel_masks[2 ] = 0xFFFF ;
484
- temp_channel_masks[3 ] = 0xFFFF ;
481
+ fill_channel_mask_with_value (temp_channel_masks, 0xFFFF ,
482
+ US915_CHANNEL_MASK_SIZE - 1 );
483
+
485
484
// Apply chMask to channels 64 to 71
486
485
temp_channel_masks[4 ] = adr_settings.channel_mask ;
487
486
488
487
} else if (adr_settings.ch_mask_ctrl == 7 ) {
489
488
490
489
// Disable all 125 kHz channels
491
- temp_channel_masks[0 ] = 0x0000 ;
492
- temp_channel_masks[1 ] = 0x0000 ;
493
- temp_channel_masks[2 ] = 0x0000 ;
494
- temp_channel_masks[3 ] = 0x0000 ;
490
+ fill_channel_mask_with_value (temp_channel_masks, 0x0000 ,
491
+ US915_CHANNEL_MASK_SIZE - 1 );
492
+
495
493
// Apply chMask to channels 64 to 71
496
494
temp_channel_masks[4 ] = adr_settings.channel_mask ;
497
495
@@ -531,11 +529,9 @@ uint8_t LoRaPHYUS915::link_ADR_request(adr_req_params_t* params,
531
529
// Copy Mask
532
530
copy_channel_mask (channel_mask, temp_channel_masks, US915_CHANNEL_MASK_SIZE);
533
531
534
- current_channel_mask[0 ] &= channel_mask[0 ];
535
- current_channel_mask[1 ] &= channel_mask[1 ];
536
- current_channel_mask[2 ] &= channel_mask[2 ];
537
- current_channel_mask[3 ] &= channel_mask[3 ];
538
- current_channel_mask[4 ] = channel_mask[4 ];
532
+ // update running channel mask
533
+ intersect_channel_mask (channel_mask, current_channel_mask,
534
+ US915_CHANNEL_MASK_SIZE);
539
535
}
540
536
541
537
// Update status variables
@@ -553,7 +549,7 @@ uint8_t LoRaPHYUS915::accept_rx_param_setup_req(rx_param_setup_req_t* params)
553
549
uint32_t freq = params->frequency ;
554
550
555
551
// Verify radio frequency
556
- if ((_radio->check_rf_frequency ( freq ) == false )
552
+ if ((_radio->check_rf_frequency (freq) == false )
557
553
|| (freq < US915_FIRST_RX1_CHANNEL)
558
554
|| (freq > US915_LAST_RX1_CHANNEL)
559
555
|| (((freq - (uint32_t ) US915_FIRST_RX1_CHANNEL) % (uint32_t ) US915_STEPWIDTH_RX1_CHANNEL) != 0 )) {
@@ -588,9 +584,6 @@ int8_t LoRaPHYUS915::get_alternate_DR(uint8_t nb_trials)
588
584
{
589
585
int8_t datarate = 0 ;
590
586
591
- // Re-enable 500 kHz default channels
592
- channel_mask[4 ] = 0x00FF ;
593
-
594
587
if ((nb_trials & 0x01 ) == 0x01 ) {
595
588
datarate = DR_4;
596
589
} else {
@@ -616,11 +609,10 @@ lorawan_status_t LoRaPHYUS915::set_next_channel(channel_selection_params_t* para
616
609
copy_channel_mask (current_channel_mask, channel_mask, 4 );
617
610
}
618
611
619
- // Check other channels
620
- if (params->current_datarate >= DR_4) {
621
- if ((current_channel_mask[4 ] & 0x00FF ) == 0 ) {
622
- current_channel_mask[4 ] = channel_mask[4 ];
623
- }
612
+ // Update the 500 kHz channels in the running mask
613
+ if ((params->current_datarate >= DR_4)
614
+ && (current_channel_mask[4 ] & 0x00FF ) == 0 ) {
615
+ current_channel_mask[4 ] = channel_mask[4 ];
624
616
}
625
617
626
618
if (params->aggregate_timeoff <= _lora_time->get_elapsed_time (params->last_aggregate_tx_time )) {
@@ -641,9 +633,9 @@ lorawan_status_t LoRaPHYUS915::set_next_channel(channel_selection_params_t* para
641
633
642
634
if (nb_enabled_channels > 0 ) {
643
635
// We found a valid channel
644
- *channel = enabled_channels[get_random ( 0 , nb_enabled_channels - 1 )];
636
+ *channel = enabled_channels[get_random (0 , nb_enabled_channels - 1 )];
645
637
// Disable the channel in the mask
646
- disable_channel (current_channel_mask, *channel, US915_MAX_NB_CHANNELS - 8 );
638
+ disable_channel (current_channel_mask, *channel, US915_MAX_NB_CHANNELS);
647
639
648
640
*time = 0 ;
649
641
return LORAWAN_STATUS_OK;
0 commit comments