Skip to content

LoRaWAN: Fixing premature RX2 closure #10196

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion UNITTESTS/stubs/LoRaPHY_stub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,8 @@ uint8_t LoRaPHY::verify_link_ADR_req(verify_adr_params_t *verify_params,

void LoRaPHY::get_rx_window_params(float t_symbol, uint8_t min_rx_symbols,
float rx_error, float wakeup_time,
uint32_t *window_length, int32_t *window_offset,
uint32_t *window_length, uint32_t *window_length_ms,
int32_t *window_offset,
uint8_t phy_dr)
{
}
Expand Down
12 changes: 9 additions & 3 deletions features/lorawan/lorastack/mac/LoRaMac.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -667,13 +667,14 @@ void LoRaMac::on_radio_tx_done(lorawan_time_t timestamp)
if (get_device_class() == CLASS_C) {
_lora_time.start(_rx2_closure_timer_for_class_c,
(_params.rx_window2_delay - time_diff) +
_params.rx_window2_config.window_timeout);
_params.rx_window2_config.window_timeout_ms);
}

// start timer after which ack wait will timeout (for Confirmed messages)
if (_params.is_node_ack_requested) {
_lora_time.start(_params.timers.ack_timeout_timer,
(_params.rx_window2_delay - time_diff) +
_params.rx_window2_config.window_timeout_ms +
_lora_phy->get_ack_timeout());
}
} else {
Expand Down Expand Up @@ -1097,6 +1098,8 @@ lorawan_status_t LoRaMac::schedule_tx()
{
channel_selection_params_t next_channel;
lorawan_time_t backoff_time = 0;
lorawan_time_t aggregated_timeoff = 0;
uint8_t channel = 0;
uint8_t fopts_len = 0;

if (_params.sys_params.max_duty_cycle == 255) {
Expand All @@ -1122,9 +1125,12 @@ lorawan_status_t LoRaMac::schedule_tx()
next_channel.last_aggregate_tx_time = _params.timers.aggregated_last_tx_time;

lorawan_status_t status = _lora_phy->set_next_channel(&next_channel,
&_params.channel,
&channel,
&backoff_time,
&_params.timers.aggregated_timeoff);
&aggregated_timeoff);

_params.channel = channel;
_params.timers.aggregated_timeoff = aggregated_timeoff;

switch (status) {
case LORAWAN_STATUS_NO_CHANNEL_FOUND:
Expand Down
10 changes: 6 additions & 4 deletions features/lorawan/lorastack/phy/LoRaPHY.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,8 @@ float LoRaPHY::compute_symb_timeout_fsk(uint8_t phy_dr)

void LoRaPHY::get_rx_window_params(float t_symb, uint8_t min_rx_symb,
float error_fudge, float wakeup_time,
uint32_t *window_length, int32_t *window_offset,
uint32_t *window_length, uint32_t *window_length_ms,
int32_t *window_offset,
uint8_t phy_dr)
{
float target_rx_window_offset;
Expand Down Expand Up @@ -442,6 +443,7 @@ void LoRaPHY::get_rx_window_params(float t_symb, uint8_t min_rx_symb,
// Setting the window_length in terms of 'symbols' for LoRa modulation or
// in terms of 'bytes' for FSK
*window_length = (uint32_t) ceil(window_len_in_ms / t_symb);
*window_length_ms = window_len_in_ms;
}

int8_t LoRaPHY::compute_tx_power(int8_t tx_power_idx, float max_eirp,
Expand Down Expand Up @@ -628,8 +630,7 @@ uint16_t LoRaPHY::get_maximum_frame_counter_gap()
uint32_t LoRaPHY::get_ack_timeout()
{
uint16_t ack_timeout_rnd = phy_params.ack_timeout_rnd;
return (phy_params.ack_timeout
+ get_random(-ack_timeout_rnd, ack_timeout_rnd));
return (phy_params.ack_timeout + get_random(0, ack_timeout_rnd));
}

uint32_t LoRaPHY::get_default_rx2_frequency()
Expand Down Expand Up @@ -849,7 +850,8 @@ void LoRaPHY::compute_rx_win_params(int8_t datarate, uint8_t min_rx_symbols,
}

get_rx_window_params(t_symbol, min_rx_symbols, (float) rx_error, MBED_CONF_LORA_WAKEUP_TIME,
&rx_conf_params->window_timeout, &rx_conf_params->window_offset,
&rx_conf_params->window_timeout, &rx_conf_params->window_timeout_ms,
&rx_conf_params->window_offset,
rx_conf_params->datarate);
}

Expand Down
3 changes: 2 additions & 1 deletion features/lorawan/lorastack/phy/LoRaPHY.h
Original file line number Diff line number Diff line change
Expand Up @@ -626,7 +626,8 @@ class LoRaPHY : private mbed::NonCopyable<LoRaPHY> {
*/
void get_rx_window_params(float t_symbol, uint8_t min_rx_symbols,
float rx_error, float wakeup_time,
uint32_t *window_length, int32_t *window_offset,
uint32_t *window_length, uint32_t *window_length_ms,
int32_t *window_offset,
uint8_t phy_dr);

/**
Expand Down
6 changes: 5 additions & 1 deletion features/lorawan/system/lorawan_data_structures.h
Original file line number Diff line number Diff line change
Expand Up @@ -1007,9 +1007,13 @@ typedef struct {
*/
uint32_t frequency;
/*!
* The RX window timeout
* The RX window timeout - Symbols
*/
uint32_t window_timeout;
/*!
* The RX window timeout - Milliseconds
*/
uint32_t window_timeout_ms;
/*!
* The RX window offset
*/
Expand Down