40
40
const int STM_STOPPED = -99 ;
41
41
const int ACTIVE_PDP_CONTEXT = 0x01 ;
42
42
const int ATTACHED_TO_NETWORK = 0x02 ;
43
+ const int DEVICE_READY = 0x04 ;
43
44
44
45
namespace mbed {
45
46
@@ -48,7 +49,7 @@ CellularStateMachine::CellularStateMachine(CellularDevice &device, events::Event
48
49
_event_status_cb (0 ), _network(0 ), _queue(queue), _queue_thread(0 ), _sim_pin(0 ),
49
50
_retry_count (0 ), _event_timeout(-1 ), _event_id(-1 ), _plmn(0 ), _command_success(false ),
50
51
_plmn_network_found (false ), _is_retry(false ), _cb_data(), _current_event(NSAPI_EVENT_CONNECTION_STATUS_CHANGE),
51
- _network_status (0 )
52
+ _status (0 )
52
53
{
53
54
#if MBED_CONF_CELLULAR_RANDOM_MAX_START_DELAY == 0
54
55
_start_time = 0 ;
@@ -84,7 +85,7 @@ void CellularStateMachine::reset()
84
85
_event_id = -1 ;
85
86
_plmn_network_found = false ;
86
87
_is_retry = false ;
87
- _network_status = 0 ;
88
+ _status = 0 ;
88
89
_target_state = STATE_INIT;
89
90
enter_to_state (STATE_INIT);
90
91
}
@@ -112,7 +113,7 @@ bool CellularStateMachine::power_on()
112
113
{
113
114
_cb_data.error = _cellularDevice.hard_power_on ();
114
115
if (_cb_data.error != NSAPI_ERROR_OK) {
115
- tr_warn (" Power on failed." );
116
+ tr_warn (" Hard power on failed." );
116
117
return false ;
117
118
}
118
119
return true ;
@@ -177,7 +178,7 @@ bool CellularStateMachine::is_registered()
177
178
}
178
179
179
180
_cb_data.status_data = status;
180
- return is_registered || _network_status ;
181
+ return is_registered || _status ;
181
182
}
182
183
183
184
bool CellularStateMachine::get_network_registration (CellularNetwork::RegistrationType type,
@@ -330,6 +331,7 @@ void CellularStateMachine::state_init()
330
331
_cellularDevice.set_timeout (TIMEOUT_POWER_ON);
331
332
tr_info (" Start connecting (timeout %d s)" , TIMEOUT_POWER_ON / 1000 );
332
333
_cb_data.error = _cellularDevice.is_ready ();
334
+ _status = _cb_data.error ? 0 : DEVICE_READY;
333
335
if (_cb_data.error != NSAPI_ERROR_OK) {
334
336
_event_timeout = _start_time;
335
337
if (_start_time > 0 ) {
@@ -381,11 +383,15 @@ bool CellularStateMachine::device_ready()
381
383
void CellularStateMachine::state_device_ready ()
382
384
{
383
385
_cellularDevice.set_timeout (TIMEOUT_POWER_ON);
384
- _cb_data.error = _cellularDevice.soft_power_on ();
386
+ if (!(_status & DEVICE_READY)) {
387
+ tr_debug (" Device was not ready, calling soft_power_on()" );
388
+ _cb_data.error = _cellularDevice.soft_power_on ();
389
+ }
385
390
if (_cb_data.error == NSAPI_ERROR_OK) {
386
391
_cb_data.error = _cellularDevice.init ();
387
392
if (_cb_data.error == NSAPI_ERROR_OK) {
388
393
if (device_ready ()) {
394
+ _status = 0 ;
389
395
enter_to_state (STATE_SIM_PIN);
390
396
}
391
397
}
@@ -419,11 +425,11 @@ void CellularStateMachine::state_sim_pin()
419
425
420
426
if (_network->is_active_context ()) { // check if context was already activated
421
427
tr_debug (" Active context found." );
422
- _network_status |= ACTIVE_PDP_CONTEXT;
428
+ _status |= ACTIVE_PDP_CONTEXT;
423
429
}
424
430
CellularNetwork::AttachStatus status; // check if modem is already attached to a network
425
431
if (_network->get_attach (status) == NSAPI_ERROR_OK && status == CellularNetwork::Attached) {
426
- _network_status |= ATTACHED_TO_NETWORK;
432
+ _status |= ATTACHED_TO_NETWORK;
427
433
tr_debug (" Cellular already attached." );
428
434
}
429
435
if (_plmn) {
@@ -483,7 +489,7 @@ void CellularStateMachine::state_attaching()
483
489
{
484
490
_cellularDevice.set_timeout (TIMEOUT_CONNECT);
485
491
tr_info (" Attaching network (timeout %d s)" , TIMEOUT_CONNECT / 1000 );
486
- if (_network_status != ATTACHED_TO_NETWORK) {
492
+ if (_status != ATTACHED_TO_NETWORK) {
487
493
_cb_data.error = _network->set_attach ();
488
494
}
489
495
if (_cb_data.error == NSAPI_ERROR_OK) {
@@ -724,6 +730,7 @@ void CellularStateMachine::device_ready_cb()
724
730
_event_id = -1 ;
725
731
if (device_ready ()) {
726
732
_is_retry = false ;
733
+ _status = 0 ;
727
734
if (!check_is_target_reached ()) {
728
735
continue_from_state (STATE_SIM_PIN);
729
736
}
0 commit comments