Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
CellularConnectionFSM.cpp
00001 /* 00002 * Copyright (c) 2017, Arm Limited and affiliates. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 */ 00017 00018 #include "CellularConnectionFSM.h" 00019 00020 #ifdef CELLULAR_DEVICE 00021 00022 #ifndef MBED_TRACE_MAX_LEVEL 00023 #define MBED_TRACE_MAX_LEVEL TRACE_LEVEL_INFO 00024 #endif 00025 #include "CellularLog.h" 00026 #include "CellularCommon.h" 00027 00028 // timeout to wait for AT responses 00029 #define TIMEOUT_POWER_ON (1*1000) 00030 #define TIMEOUT_SIM_PIN (1*1000) 00031 #define TIMEOUT_NETWORK (10*1000) 00032 #define TIMEOUT_CONNECT (60*1000) 00033 #define TIMEOUT_REGISTRATION (180*1000) 00034 00035 // maximum time when retrying network register, attach and connect in seconds ( 20minutes ) 00036 #define TIMEOUT_NETWORK_MAX (20*60) 00037 00038 #define RETRY_COUNT_DEFAULT 3 00039 00040 namespace mbed { 00041 00042 CellularConnectionFSM::CellularConnectionFSM() : 00043 _serial(0), _state(STATE_INIT), _next_state(_state), _status_callback(0), _event_status_cb(0), _network(0), _power(0), _sim(0), 00044 _queue(8 * EVENTS_EVENT_SIZE), _queue_thread(0), _cellularDevice(0), _retry_count(0), _event_timeout(-1), 00045 _at_queue(8 * EVENTS_EVENT_SIZE), _event_id(0), _plmn(0), _command_success(false), _plmn_network_found(false) 00046 { 00047 memset(_sim_pin, 0, sizeof(_sim_pin)); 00048 #if MBED_CONF_CELLULAR_RANDOM_MAX_START_DELAY == 0 00049 _start_time = 0; 00050 #else 00051 // so that not every device don't start at the exact same time (for example after power outage) 00052 _start_time = rand() % (MBED_CONF_CELLULAR_RANDOM_MAX_START_DELAY); 00053 #endif // MBED_CONF_CELLULAR_RANDOM_MAX_START_DELAY 00054 00055 // set initial retry values in seconds 00056 _retry_timeout_array[0] = 1; // double time on each retry in order to keep network happy 00057 _retry_timeout_array[1] = 2; 00058 _retry_timeout_array[2] = 4; 00059 _retry_timeout_array[3] = 8; 00060 _retry_timeout_array[4] = 16; 00061 _retry_timeout_array[5] = 32; 00062 _retry_timeout_array[6] = 64; 00063 _retry_timeout_array[7] = 128; // if around two minutes was not enough then let's wait much longer 00064 _retry_timeout_array[8] = 600; 00065 _retry_timeout_array[9] = TIMEOUT_NETWORK_MAX; 00066 _retry_array_length = MAX_RETRY_ARRAY_SIZE; 00067 } 00068 00069 CellularConnectionFSM::~CellularConnectionFSM() 00070 { 00071 stop(); 00072 } 00073 00074 void CellularConnectionFSM::stop() 00075 { 00076 _queue.cancel(_event_id); 00077 _queue.break_dispatch(); 00078 00079 if (_queue_thread) { 00080 _queue_thread->terminate(); 00081 delete _queue_thread; 00082 _queue_thread = NULL; 00083 } 00084 00085 delete _cellularDevice; 00086 _cellularDevice = NULL; 00087 // _cellularDevice closes all interfaces in destructor 00088 _power = NULL; 00089 _network = NULL; 00090 _sim = NULL; 00091 00092 _state = STATE_INIT; 00093 _next_state = _state; 00094 } 00095 00096 nsapi_error_t CellularConnectionFSM::init() 00097 { 00098 tr_info("CELLULAR_DEVICE: %s", CELLULAR_STRINGIFY(CELLULAR_DEVICE)); 00099 _cellularDevice = new CELLULAR_DEVICE(_at_queue); 00100 if (!_cellularDevice) { 00101 stop(); 00102 return NSAPI_ERROR_NO_MEMORY ; 00103 } 00104 00105 _power = _cellularDevice->open_power(_serial); 00106 if (!_power) { 00107 stop(); 00108 return NSAPI_ERROR_NO_MEMORY ; 00109 } 00110 00111 _network = _cellularDevice->open_network(_serial); 00112 if (!_network) { 00113 stop(); 00114 return NSAPI_ERROR_NO_MEMORY ; 00115 } 00116 00117 _sim = _cellularDevice->open_sim(_serial); 00118 if (!_sim) { 00119 stop(); 00120 return NSAPI_ERROR_NO_MEMORY ; 00121 } 00122 00123 _at_queue.chain(&_queue); 00124 00125 _retry_count = 0; 00126 _state = STATE_INIT; 00127 _next_state = STATE_INIT; 00128 00129 return _network->init(); 00130 } 00131 00132 bool CellularConnectionFSM::power_on() 00133 { 00134 nsapi_error_t err = _power->on(); 00135 if (err != NSAPI_ERROR_OK && err != NSAPI_ERROR_UNSUPPORTED ) { 00136 tr_warn("Cellular start failed. Power off/on."); 00137 err = _power->off(); 00138 if (err != NSAPI_ERROR_OK && err != NSAPI_ERROR_UNSUPPORTED ) { 00139 tr_error("Cellular power down failing after failed power up attempt!"); 00140 } 00141 return false; 00142 } 00143 return true; 00144 } 00145 00146 void CellularConnectionFSM::set_sim_pin(const char *sim_pin) 00147 { 00148 strncpy(_sim_pin, sim_pin, sizeof(_sim_pin)); 00149 _sim_pin[sizeof(_sim_pin) - 1] = '\0'; 00150 } 00151 00152 void CellularConnectionFSM::set_plmn(const char *plmn) 00153 { 00154 _plmn = plmn; 00155 } 00156 00157 bool CellularConnectionFSM::open_sim() 00158 { 00159 CellularSIM::SimState state = CellularSIM::SimStateUnknown; 00160 // wait until SIM is readable 00161 // here you could add wait(secs) if you know start delay of your SIM 00162 if (_sim->get_sim_state(state) != NSAPI_ERROR_OK ) { 00163 tr_info("Waiting for SIM (err while reading)..."); 00164 if (_event_status_cb) { 00165 _event_status_cb((nsapi_event_t)CellularSIMStatusChanged, state); 00166 } 00167 return false; 00168 } 00169 00170 // report current state so callback can set sim pin if needed 00171 if (_event_status_cb) { 00172 _event_status_cb((nsapi_event_t)CellularSIMStatusChanged, state); 00173 } 00174 00175 if (state == CellularSIM::SimStatePinNeeded) { 00176 if (strlen(_sim_pin)) { 00177 tr_info("SIM pin required, entering pin"); 00178 nsapi_error_t err = _sim->set_pin(_sim_pin); 00179 if (err) { 00180 tr_error("SIM pin set failed with: %d, bailing out...", err); 00181 } 00182 } else { 00183 // No sim pin provided even it's needed, stop state machine 00184 tr_error("PIN required but No SIM pin provided."); 00185 _retry_count = MAX_RETRY_ARRAY_SIZE; 00186 return false; 00187 } 00188 } 00189 00190 return state == CellularSIM::SimStateReady; 00191 } 00192 00193 bool CellularConnectionFSM::is_registered() 00194 { 00195 CellularNetwork::RegistrationStatus status; 00196 bool is_registered = false; 00197 00198 for (int type = 0; type < CellularNetwork::C_MAX; type++) { 00199 if (get_network_registration((CellularNetwork::RegistrationType) type, status, is_registered)) { 00200 tr_debug("get_network_registration: type=%d, status=%d", type, status); 00201 if (is_registered) { 00202 break; 00203 } 00204 } 00205 } 00206 00207 return is_registered; 00208 } 00209 00210 bool CellularConnectionFSM::get_network_registration(CellularNetwork::RegistrationType type, 00211 CellularNetwork::RegistrationStatus &status, bool &is_registered) 00212 { 00213 is_registered = false; 00214 bool is_roaming = false; 00215 nsapi_error_t err = _network->get_registration_status(type, status); 00216 if (err != NSAPI_ERROR_OK ) { 00217 if (err != NSAPI_ERROR_UNSUPPORTED ) { 00218 tr_warn("Get network registration failed (type %d)!", type); 00219 } 00220 return false; 00221 } 00222 switch (status) { 00223 case CellularNetwork::RegisteredRoaming: 00224 is_roaming = true; 00225 // fall-through 00226 case CellularNetwork::RegisteredHomeNetwork: 00227 is_registered = true; 00228 break; 00229 case CellularNetwork::RegisteredSMSOnlyRoaming: 00230 is_roaming = true; 00231 // fall-through 00232 case CellularNetwork::RegisteredSMSOnlyHome: 00233 tr_warn("SMS only network registration!"); 00234 break; 00235 case CellularNetwork::RegisteredCSFBNotPreferredRoaming: 00236 is_roaming = true; 00237 // fall-through 00238 case CellularNetwork::RegisteredCSFBNotPreferredHome: 00239 tr_warn("Not preferred network registration!"); 00240 break; 00241 case CellularNetwork::AttachedEmergencyOnly: 00242 tr_warn("Emergency only network registration!"); 00243 break; 00244 case CellularNetwork::RegistrationDenied: 00245 case CellularNetwork::NotRegistered: 00246 case CellularNetwork::Unknown: 00247 case CellularNetwork::SearchingNetwork: 00248 default: 00249 break; 00250 } 00251 00252 if (is_roaming) { 00253 tr_warn("Roaming cellular network!"); 00254 } 00255 00256 return true; 00257 } 00258 00259 void CellularConnectionFSM::report_failure(const char *msg) 00260 { 00261 tr_error("Cellular network failed: %s", msg); 00262 if (_status_callback) { 00263 _status_callback(_state, _next_state); 00264 } 00265 } 00266 00267 const char *CellularConnectionFSM::get_state_string(CellularState state) 00268 { 00269 #if MBED_CONF_MBED_TRACE_ENABLE 00270 static const char *strings[] = { "Init", "Power", "Device ready", "SIM pin", "Registering network", "Manual registering", "Attaching network", "Activating PDP Context", "Connecting network", "Connected"}; 00271 return strings[state]; 00272 #else 00273 return NULL; 00274 #endif // #if MBED_CONF_MBED_TRACE_ENABLE 00275 } 00276 00277 bool CellularConnectionFSM::is_registered_to_plmn() 00278 { 00279 int format; 00280 CellularNetwork::operator_t op; 00281 00282 nsapi_error_t err = _network->get_operator_params(format, op); 00283 if (err == NSAPI_ERROR_OK ) { 00284 if (format == 2) { 00285 // great, numeric format we can do comparison for that 00286 if (strcmp(op.op_num, _plmn) == 0) { 00287 return true; 00288 } 00289 return false; 00290 } 00291 00292 // format was alpha, get operator names to do the comparing 00293 CellularNetwork::operator_names_list names_list; 00294 nsapi_error_t err = _network->get_operator_names(names_list); 00295 if (err == NSAPI_ERROR_OK ) { 00296 CellularNetwork::operator_names_t *op_names = names_list.get_head(); 00297 bool found_match = false; 00298 while (op_names) { 00299 if (format == 0) { 00300 if (strcmp(op.op_long, op_names->alpha) == 0) { 00301 found_match = true; 00302 } 00303 } else if (format == 1) { 00304 if (strcmp(op.op_short, op_names->alpha) == 0) { 00305 found_match = true; 00306 } 00307 } 00308 00309 if (found_match) { 00310 if (strcmp(_plmn, op_names->numeric)) { 00311 names_list.delete_all(); 00312 return true; 00313 } 00314 names_list.delete_all(); 00315 return false; 00316 } 00317 } 00318 } 00319 names_list.delete_all(); 00320 } 00321 00322 return false; 00323 } 00324 00325 nsapi_error_t CellularConnectionFSM::continue_from_state(CellularState state) 00326 { 00327 tr_info("Continue state from %s to %s", get_state_string((CellularConnectionFSM::CellularState)_state), 00328 get_state_string((CellularConnectionFSM::CellularState)state)); 00329 _state = state; 00330 _next_state = state; 00331 _retry_count = 0; 00332 if (!_queue.call_in(0, callback(this, &CellularConnectionFSM::event))) { 00333 stop(); 00334 return NSAPI_ERROR_NO_MEMORY ; 00335 } 00336 00337 return NSAPI_ERROR_OK ; 00338 } 00339 00340 nsapi_error_t CellularConnectionFSM::continue_to_state(CellularState state) 00341 { 00342 MBED_ASSERT(_cellularDevice); 00343 _retry_count = 0; 00344 if (state < _state) { 00345 _state = state; 00346 } else { 00347 // update next state so that we don't continue from previous state 00348 _state = _next_state; 00349 } 00350 if (!_queue.call_in(0, callback(this, &CellularConnectionFSM::event))) { 00351 stop(); 00352 return NSAPI_ERROR_NO_MEMORY ; 00353 } 00354 00355 return NSAPI_ERROR_OK ; 00356 } 00357 00358 void CellularConnectionFSM::enter_to_state(CellularState state) 00359 { 00360 _next_state = state; 00361 _retry_count = 0; 00362 _command_success = false; 00363 } 00364 00365 void CellularConnectionFSM::retry_state_or_fail() 00366 { 00367 if (++_retry_count < MAX_RETRY_ARRAY_SIZE) { 00368 tr_debug("Retry State %s, retry %d/%d", get_state_string(_state), _retry_count, MAX_RETRY_ARRAY_SIZE); 00369 _event_timeout = _retry_timeout_array[_retry_count]; 00370 } else { 00371 report_failure(get_state_string(_state)); 00372 return; 00373 } 00374 } 00375 00376 void CellularConnectionFSM::state_init() 00377 { 00378 // we should check that if power is already on then we can jump to device ready state 00379 _cellularDevice->set_timeout(TIMEOUT_POWER_ON); 00380 tr_info("Cellular state init (timeout %d ms)", TIMEOUT_POWER_ON); 00381 nsapi_error_t err = _power->is_device_ready(); 00382 if (err != NSAPI_ERROR_OK ) { 00383 _event_timeout = _start_time; 00384 tr_info("Init state, waiting %d ms before POWER state)", _start_time); 00385 enter_to_state(STATE_POWER_ON); 00386 } else { 00387 tr_info("Device was ready to accept commands, jump to device ready"); 00388 enter_to_state(STATE_DEVICE_READY); 00389 } 00390 } 00391 00392 void CellularConnectionFSM::state_power_on() 00393 { 00394 _cellularDevice->set_timeout(TIMEOUT_POWER_ON); 00395 tr_info("Cellular power ON (timeout %d ms)", TIMEOUT_POWER_ON); 00396 if (power_on()) { 00397 enter_to_state(STATE_DEVICE_READY); 00398 } else { 00399 // retry to power on device 00400 retry_state_or_fail(); 00401 } 00402 } 00403 00404 bool CellularConnectionFSM::device_ready() 00405 { 00406 if (_cellularDevice->init_module(_serial) != NSAPI_ERROR_OK ) { 00407 return false; 00408 } 00409 tr_info("Cellular device ready"); 00410 if (_event_status_cb) { 00411 _event_status_cb((nsapi_event_t)CellularDeviceReady, 0); 00412 } 00413 _power->remove_device_ready_urc_cb(mbed::callback(this, &CellularConnectionFSM::ready_urc_cb)); 00414 _cellularDevice->close_power(); 00415 _power = NULL; 00416 return true; 00417 } 00418 00419 void CellularConnectionFSM::state_device_ready() 00420 { 00421 _cellularDevice->set_timeout(TIMEOUT_POWER_ON); 00422 if (_power->set_at_mode() == NSAPI_ERROR_OK ) { 00423 if (device_ready()) { 00424 enter_to_state(STATE_SIM_PIN); 00425 } 00426 } else { 00427 if (_retry_count == 0) { 00428 (void)_power->set_device_ready_urc_cb(mbed::callback(this, &CellularConnectionFSM::ready_urc_cb)); 00429 } 00430 retry_state_or_fail(); 00431 } 00432 } 00433 00434 void CellularConnectionFSM::state_sim_pin() 00435 { 00436 _cellularDevice->set_timeout(TIMEOUT_SIM_PIN); 00437 tr_info("Sim state (timeout %d ms)", TIMEOUT_SIM_PIN); 00438 if (open_sim()) { 00439 bool success = false; 00440 for (int type = 0; type < CellularNetwork::C_MAX; type++) { 00441 if (!_network->set_registration_urc((CellularNetwork::RegistrationType)type, true)) { 00442 success = true; 00443 } 00444 } 00445 if (!success) { 00446 tr_warn("Failed to set any URC's for registration"); 00447 retry_state_or_fail(); 00448 return; 00449 } 00450 if (_plmn) { 00451 enter_to_state(STATE_MANUAL_REGISTERING_NETWORK); 00452 } else { 00453 enter_to_state(STATE_REGISTERING_NETWORK); 00454 } 00455 } else { 00456 retry_state_or_fail(); 00457 } 00458 } 00459 00460 void CellularConnectionFSM::state_registering() 00461 { 00462 _cellularDevice->set_timeout(TIMEOUT_NETWORK); 00463 if (is_registered()) { 00464 // we are already registered, go to attach 00465 enter_to_state(STATE_ATTACHING_NETWORK); 00466 } else { 00467 _cellularDevice->set_timeout(TIMEOUT_REGISTRATION); 00468 if (!_command_success) { 00469 _command_success = (_network->set_registration() == NSAPI_ERROR_OK ); 00470 } 00471 retry_state_or_fail(); 00472 } 00473 } 00474 00475 // only used when _plmn is set 00476 void CellularConnectionFSM::state_manual_registering_network() 00477 { 00478 _cellularDevice->set_timeout(TIMEOUT_REGISTRATION); 00479 tr_info("state_manual_registering_network"); 00480 if (!_plmn_network_found) { 00481 if (is_registered() && is_registered_to_plmn()) { 00482 _plmn_network_found = true; 00483 enter_to_state(STATE_ATTACHING_NETWORK); 00484 } else { 00485 if (!_command_success) { 00486 _command_success = (_network->set_registration(_plmn) == NSAPI_ERROR_OK ); 00487 } 00488 retry_state_or_fail(); 00489 } 00490 } 00491 } 00492 00493 void CellularConnectionFSM::state_attaching() 00494 { 00495 _cellularDevice->set_timeout(TIMEOUT_CONNECT); 00496 if (_network->set_attach() == NSAPI_ERROR_OK ) { 00497 _cellularDevice->close_sim(); 00498 _sim = NULL; 00499 enter_to_state(STATE_ACTIVATING_PDP_CONTEXT); 00500 } else { 00501 retry_state_or_fail(); 00502 } 00503 } 00504 00505 void CellularConnectionFSM::state_activating_pdp_context() 00506 { 00507 _cellularDevice->set_timeout(TIMEOUT_CONNECT); 00508 tr_info("Activate PDP Context (timeout %d ms)", TIMEOUT_CONNECT); 00509 if (_network->activate_context() == NSAPI_ERROR_OK ) { 00510 // when using modems stack connect is synchronous 00511 _next_state = STATE_CONNECTING_NETWORK; 00512 } else { 00513 retry_state_or_fail(); 00514 } 00515 } 00516 00517 void CellularConnectionFSM::state_connect_to_network() 00518 { 00519 _cellularDevice->set_timeout(TIMEOUT_CONNECT); 00520 tr_info("Connect to cellular network (timeout %d ms)", TIMEOUT_CONNECT); 00521 if (_network->connect() == NSAPI_ERROR_OK ) { 00522 _cellularDevice->set_timeout(TIMEOUT_NETWORK); 00523 tr_debug("Connected to cellular network, set at timeout (timeout %d ms)", TIMEOUT_NETWORK); 00524 // when using modems stack connect is synchronous 00525 _next_state = STATE_CONNECTED; 00526 } else { 00527 retry_state_or_fail(); 00528 } 00529 } 00530 00531 void CellularConnectionFSM::state_connected() 00532 { 00533 _cellularDevice->set_timeout(TIMEOUT_NETWORK); 00534 tr_debug("Cellular ready! (timeout %d ms)", TIMEOUT_NETWORK); 00535 if (_status_callback) { 00536 _status_callback(_state, _next_state); 00537 } 00538 } 00539 00540 void CellularConnectionFSM::event() 00541 { 00542 _event_timeout = -1; 00543 switch (_state) { 00544 case STATE_INIT: 00545 state_init(); 00546 break; 00547 case STATE_POWER_ON: 00548 state_power_on(); 00549 break; 00550 case STATE_DEVICE_READY: 00551 state_device_ready(); 00552 break; 00553 case STATE_SIM_PIN: 00554 state_sim_pin(); 00555 break; 00556 case STATE_REGISTERING_NETWORK: 00557 state_registering(); 00558 break; 00559 case STATE_MANUAL_REGISTERING_NETWORK: 00560 state_manual_registering_network(); 00561 break; 00562 case STATE_ATTACHING_NETWORK: 00563 state_attaching(); 00564 break; 00565 case STATE_ACTIVATING_PDP_CONTEXT: 00566 state_activating_pdp_context(); 00567 break; 00568 case STATE_CONNECTING_NETWORK: 00569 state_connect_to_network(); 00570 break; 00571 case STATE_CONNECTED: 00572 state_connected(); 00573 break; 00574 default: 00575 MBED_ASSERT(0); 00576 break; 00577 } 00578 00579 if (_next_state != _state || _event_timeout >= 0) { 00580 if (_next_state != _state) { // state exit condition 00581 tr_info("Cellular state from %s to %s", get_state_string((CellularConnectionFSM::CellularState)_state), 00582 get_state_string((CellularConnectionFSM::CellularState)_next_state)); 00583 if (_status_callback) { 00584 if (!_status_callback(_state, _next_state)) { 00585 return; 00586 } 00587 } 00588 } else { 00589 tr_info("Cellular event in %d seconds", _event_timeout); 00590 } 00591 _state = _next_state; 00592 if (_event_timeout == -1) { 00593 _event_timeout = 0; 00594 } 00595 _event_id = _queue.call_in(_event_timeout * 1000, callback(this, &CellularConnectionFSM::event)); 00596 if (!_event_id) { 00597 report_failure("Cellular event failure!"); 00598 return; 00599 } 00600 } 00601 } 00602 00603 nsapi_error_t CellularConnectionFSM::start_dispatch() 00604 { 00605 MBED_ASSERT(!_queue_thread); 00606 00607 _queue_thread = new rtos::Thread(osPriorityNormal, 2048); 00608 if (!_queue_thread) { 00609 stop(); 00610 return NSAPI_ERROR_NO_MEMORY ; 00611 } 00612 if (_queue_thread->start(callback(&_queue, &events::EventQueue::dispatch_forever)) != osOK) { 00613 stop(); 00614 return NSAPI_ERROR_NO_MEMORY ; 00615 } 00616 00617 return NSAPI_ERROR_OK ; 00618 } 00619 00620 void CellularConnectionFSM::set_serial(UARTSerial *serial) 00621 { 00622 _serial = serial; 00623 } 00624 00625 void CellularConnectionFSM::set_callback(mbed::Callback<bool(int, int)> status_callback) 00626 { 00627 _status_callback = status_callback; 00628 } 00629 00630 void CellularConnectionFSM::attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb) 00631 { 00632 MBED_ASSERT(_network); 00633 _event_status_cb = status_cb; 00634 if (status_cb) { 00635 _network->attach(callback(this, &CellularConnectionFSM::network_callback)); 00636 } else { 00637 _network->attach(NULL); 00638 } 00639 } 00640 00641 void CellularConnectionFSM::network_callback(nsapi_event_t ev, intptr_t ptr) 00642 { 00643 tr_info("FSM: network_callback called with event: %d, intptr: %d, _state: %s", ev, ptr, get_state_string(_state)); 00644 if ((cellular_connection_status_t)ev == CellularRegistrationStatusChanged && 00645 (_state == STATE_REGISTERING_NETWORK || _state == STATE_MANUAL_REGISTERING_NETWORK)) { 00646 // expect packet data so only these states are valid 00647 if (ptr == CellularNetwork::RegisteredHomeNetwork || ptr == CellularNetwork::RegisteredRoaming) { 00648 if (_plmn) { 00649 if (is_registered_to_plmn()) { 00650 if (!_plmn_network_found) { 00651 _plmn_network_found = true; 00652 _queue.cancel(_event_id); 00653 continue_from_state(STATE_ATTACHING_NETWORK); 00654 } 00655 } 00656 } else { 00657 _queue.cancel(_event_id); 00658 continue_from_state(STATE_ATTACHING_NETWORK); 00659 } 00660 } 00661 } 00662 00663 if (_event_status_cb) { 00664 _event_status_cb(ev, ptr); 00665 } 00666 } 00667 00668 void CellularConnectionFSM::ready_urc_cb() 00669 { 00670 tr_debug("Device ready URC func called"); 00671 if (_state == STATE_DEVICE_READY && _power->set_at_mode() == NSAPI_ERROR_OK ) { 00672 tr_debug("State was STATE_DEVICE_READY and at mode ready, cancel state and move to next"); 00673 if (device_ready()) { 00674 _queue.cancel(_event_id); 00675 continue_from_state(STATE_SIM_PIN); 00676 } 00677 } 00678 } 00679 00680 events::EventQueue *CellularConnectionFSM::get_queue() 00681 { 00682 return &_queue; 00683 } 00684 00685 CellularNetwork *CellularConnectionFSM::get_network() 00686 { 00687 return _network; 00688 } 00689 00690 CellularDevice *CellularConnectionFSM::get_device() 00691 { 00692 return _cellularDevice; 00693 } 00694 00695 CellularSIM *CellularConnectionFSM::get_sim() 00696 { 00697 return _sim; 00698 } 00699 00700 NetworkStack *CellularConnectionFSM::get_stack() 00701 { 00702 return _cellularDevice->get_stack(); 00703 } 00704 00705 void CellularConnectionFSM::set_retry_timeout_array(uint16_t timeout[], int array_len) 00706 { 00707 _retry_array_length = array_len > MAX_RETRY_ARRAY_SIZE ? MAX_RETRY_ARRAY_SIZE : array_len; 00708 00709 for (int i = 0; i < _retry_array_length; i++) { 00710 _retry_timeout_array[i] = timeout[i]; 00711 } 00712 } 00713 00714 } // namespace 00715 00716 #endif // CELLULAR_DEVICE
Generated on Tue Jul 12 2022 20:52:39 by
1.7.2