@@ -641,8 +641,10 @@ void LoRaMac::handle_data_frame(const uint8_t* const payload,
641
641
_mcps_indication.buffer_size = size - ptr_pos;
642
642
}
643
643
644
- check_to_disable_ack_timeout (_params.is_node_ack_requested , _device_class, _mcps_confirmation.ack_received ,
645
- _params.ack_timeout_retry_counter , _params.max_ack_timeout_retries );
644
+ // only stop act timer, if the ack is actuall recieved
645
+ if (_mcps_confirmation.ack_received ) {
646
+ _lora_time.stop (_params.timers .ack_timeout_timer );
647
+ }
646
648
}
647
649
648
650
void LoRaMac::set_batterylevel_callback (mbed::Callback<uint8_t (void )> battery_level)
@@ -775,7 +777,7 @@ bool LoRaMac::continue_joining_process()
775
777
776
778
bool LoRaMac::continue_sending_process ()
777
779
{
778
- if (_params.ack_timeout_retry_counter >= _params.max_ack_timeout_retries ) {
780
+ if (_params.ack_timeout_retry_counter > _params.max_ack_timeout_retries ) {
779
781
_mac_commands.clear_command_buffer ();
780
782
_params.adr_ack_counter ++;
781
783
return false ;
@@ -892,38 +894,20 @@ void LoRaMac::open_rx2_window()
892
894
}
893
895
}
894
896
895
- void LoRaMac::check_to_disable_ack_timeout (bool node_ack_requested,
896
- device_class_t dev_class,
897
- bool ack_received,
898
- uint8_t ack_timeout_retries_counter,
899
- uint8_t ack_timeout_retries)
897
+ void LoRaMac::on_ack_timeout_timer_event (void )
900
898
{
901
- // There are three cases where we need to stop the AckTimeoutTimer:
902
- if ( node_ack_requested == false ) {
903
- if ( dev_class == CLASS_C ) {
904
- // FIRST CASE
905
- // We have performed an unconfirmed uplink in class c mode
906
- // and have received a downlink in RX1 or RX2.
907
- _lora_time.stop (_params.timers .ack_timeout_timer );
908
- }
909
- } else {
910
- if ( ack_received == 1 ) {
911
- // SECOND CASE
912
- // We received an ACK for previously sent confirmable message
913
- _lora_time.stop (_params.timers .ack_timeout_timer );
914
- } else {
915
- // THIRD CASE
916
- // Max number of retries exceeded for confirmable message
917
- if ( ack_timeout_retries_counter > ack_timeout_retries ) {
918
- _lora_time.stop (_params.timers .ack_timeout_timer );
919
- }
899
+ Lock lock (*this );
900
+
901
+ if (_params.ack_timeout_retry_counter > _params.max_ack_timeout_retries ) {
902
+ if (get_device_class () == CLASS_C) {
903
+ // no need to use EventQueue as LoRaWANStack and LoRaMac are always
904
+ // in same context
905
+ _mcps_confirmation.status = LORAMAC_EVENT_INFO_STATUS_ERROR;
906
+ _ack_expiry_handler_for_class_c.call ();
920
907
}
908
+ return ;
921
909
}
922
- }
923
910
924
- void LoRaMac::on_ack_timeout_timer_event (void )
925
- {
926
- Lock lock (*this );
927
911
tr_debug (" ACK_TIMEOUT Elapses, Retrying ..." );
928
912
_lora_time.stop (_params.timers .ack_timeout_timer );
929
913
@@ -1318,11 +1302,14 @@ device_class_t LoRaMac::get_device_class() const
1318
1302
return _device_class;
1319
1303
}
1320
1304
1321
- void LoRaMac::set_device_class (const device_class_t & device_class)
1305
+ void LoRaMac::set_device_class (const device_class_t & device_class,
1306
+ mbed::Callback<void (void )>ack_expiry_handler)
1322
1307
{
1323
1308
_device_class = device_class;
1309
+ _ack_expiry_handler_for_class_c = ack_expiry_handler;
1324
1310
1325
1311
if (CLASS_A == _device_class) {
1312
+ tr_debug (" Changing device class to -> CLASS_A" );
1326
1313
_lora_phy.put_radio_to_sleep ();
1327
1314
} else if (CLASS_C == _device_class) {
1328
1315
_params.is_node_ack_requested = false ;
@@ -1334,8 +1321,11 @@ void LoRaMac::set_device_class(const device_class_t& device_class)
1334
1321
&_params.rx_window2_config );
1335
1322
}
1336
1323
if (CLASS_C == _device_class) {
1324
+ tr_debug (" Changing device class to -> CLASS_C" );
1337
1325
open_rx2_window ();
1338
1326
}
1327
+
1328
+
1339
1329
}
1340
1330
1341
1331
void LoRaMac::setup_link_check_request ()
0 commit comments