mirror of https://github.com/ARMmbed/mbed-os.git
Fixing premature RX2 abort
A bug while setting up RX start timers would result in premature closusre of RX2 window. The 'ack_Timeout_timer' would be invoked prematurely and at that time RX2 window may be being demodulating. This resulted in massive instability with any test that relied on Confirmed traffic or lower data rates. To fix the issue, we must know the length of the RX window in milliseconds and for this purpose we have extended the 'get_rx_window_params(...)' API. The length of the time the window may remain open must be accounted for while setting up 'ack_timeout_timer'.pull/10196/head
parent
2618813c70
commit
2691b83c4e
|
@ -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 {
|
||||
|
@ -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) {
|
||||
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -848,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);
|
||||
}
|
||||
|
||||
|
|
|
@ -626,7 +626,8 @@ protected:
|
|||
*/
|
||||
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);
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue