Cellular: added to reset state machine is we get disconnected so application can try again.

pull/8579/head
Teppo Järvelin 2018-10-29 14:05:08 +02:00
parent 609b0f71be
commit d1ff9ed68d
4 changed files with 24 additions and 12 deletions

View File

@ -73,12 +73,12 @@ AT_CellularNetwork::~AT_CellularNetwork()
for (int type = 0; type < CellularNetwork::C_MAX; type++) { for (int type = 0; type < CellularNetwork::C_MAX; type++) {
if (has_registration((RegistrationType)type) != RegistrationModeDisable) { if (has_registration((RegistrationType)type) != RegistrationModeDisable) {
_at.remove_urc_handler(at_reg[type].urc_prefix, _urc_funcs[type]); _at.remove_urc_handler(at_reg[type].urc_prefix);
} }
} }
_at.remove_urc_handler("NO CARRIER", callback(this, &AT_CellularNetwork::urc_no_carrier)); _at.remove_urc_handler("NO CARRIER");
_at.remove_urc_handler("+CGEV:", callback(this, &AT_CellularNetwork::urc_cgev)); _at.remove_urc_handler("+CGEV:");
} }
void AT_CellularNetwork::urc_no_carrier() void AT_CellularNetwork::urc_no_carrier()

View File

@ -184,6 +184,12 @@ void CellularDevice::cellular_callback(nsapi_event_t ev, intptr_t ptr)
} }
} else { } else {
tr_debug("Device: network_callback called with event: %d, ptr: %d", ev, ptr); tr_debug("Device: network_callback called with event: %d, ptr: %d", ev, ptr);
if (ev == NSAPI_EVENT_CONNECTION_STATUS_CHANGE && ptr == NSAPI_STATUS_DISCONNECTED) {
// we have been disconnected, reset state machine so that application can start connect sequence again
if (_state_machine) {
_state_machine->reset();
}
}
} }
// broadcast network and cellular changes to state machine and CellularContext. // broadcast network and cellular changes to state machine and CellularContext.

View File

@ -74,6 +74,17 @@ CellularStateMachine::~CellularStateMachine()
stop(); stop();
} }
void CellularStateMachine::reset()
{
_state = STATE_INIT;
_event_timeout = -1;
_event_id = -1;
_plmn_network_found = false;
_is_retry = false;
_active_context = false;
enter_to_state(STATE_INIT);
}
void CellularStateMachine::stop() void CellularStateMachine::stop()
{ {
_queue.cancel(_event_id); _queue.cancel(_event_id);
@ -85,15 +96,7 @@ void CellularStateMachine::stop()
_queue_thread = NULL; _queue_thread = NULL;
} }
_state = STATE_INIT; reset();
_next_state = _state;
_target_state = _state;
_cb_data.error = NSAPI_ERROR_OK;
_cb_data.status_data = -1;
_cb_data.final_try = false;
_event_id = -1;
_is_retry = false;
if (_power) { if (_power) {
_cellularDevice.close_power(); _cellularDevice.close_power();
_power = NULL; _power = NULL;

View File

@ -135,6 +135,9 @@ private:
*/ */
void cellular_event_changed(nsapi_event_t ev, intptr_t ptr); void cellular_event_changed(nsapi_event_t ev, intptr_t ptr);
/** Reset the state machine to init state. After reset state machine can be used again to run to wanted state.
*/
void reset();
private: private:
bool power_on(); bool power_on();
bool open_sim(); bool open_sim();