diff --git a/features/cellular/framework/API/CellularNetwork.h b/features/cellular/framework/API/CellularNetwork.h index 89afd836f9..60162eecfb 100644 --- a/features/cellular/framework/API/CellularNetwork.h +++ b/features/cellular/framework/API/CellularNetwork.h @@ -211,6 +211,7 @@ public: /** Does all the needed initializations that can fail * + * @remark must be called immediately after constructor. * @return zero on success */ virtual nsapi_error_t init() = 0; @@ -229,6 +230,15 @@ public: */ virtual nsapi_error_t get_network_registering_mode(NWRegisteringMode& mode) = 0; + /** Activate/deactivate listening of network events for the given RegistrationType. + * This should be called after network class is created and ready to receive AT commands. + * After successful call network class starts to get information about network changes like + * registration statue, access technology, cell id... + * + * @param type RegistrationType to set urc on/off + * @param on Controls are urc' active or not + * @return zero on success + */ virtual nsapi_error_t set_registration_urc(RegistrationType type, bool on) = 0; /** Gets the network registration status. @@ -299,6 +309,11 @@ public: */ virtual nsapi_error_t set_access_technology(RadioAccessTechnology rat) = 0; + /** Get current radio access technology. + * + * @param rat Radio access technology + * @return zero on success + */ virtual nsapi_error_t get_access_technology(RadioAccessTechnology& rat) = 0; /** Scans for operators module can reach. diff --git a/features/cellular/framework/AT/ATHandler.cpp b/features/cellular/framework/AT/ATHandler.cpp index b09a4cc80c..f47b5ef3e8 100644 --- a/features/cellular/framework/AT/ATHandler.cpp +++ b/features/cellular/framework/AT/ATHandler.cpp @@ -155,7 +155,7 @@ void ATHandler::set_file_handle(FileHandle *fh) nsapi_error_t ATHandler::set_urc_handler(const char *prefix, mbed::Callback callback) { - if (check_urc_existance(prefix, callback)) { + if (find_urc_handler(prefix, callback)) { tr_warn("URC already added with prefix: %s", prefix); return NSAPI_ERROR_OK; } @@ -200,7 +200,7 @@ void ATHandler::remove_urc_handler(const char *prefix, mbed::Callback ca } } -bool ATHandler::check_urc_existance(const char *prefix, mbed::Callback callback) +bool ATHandler::find_urc_handler(const char *prefix, mbed::Callback callback) { struct oob_t *oob = _oobs; while (oob) { diff --git a/features/cellular/framework/AT/ATHandler.h b/features/cellular/framework/AT/ATHandler.h index 699f4b46ad..05cc264c8b 100644 --- a/features/cellular/framework/AT/ATHandler.h +++ b/features/cellular/framework/AT/ATHandler.h @@ -480,8 +480,8 @@ private: */ const char* mem_str(const char* dest, size_t dest_len, const char* src, size_t src_len); - // check is urc is already added so we don't add it twice - bool check_urc_existance(const char *prefix, mbed::Callback callback); + // check is urc is already added + bool find_urc_handler(const char *prefix, mbed::Callback callback); }; } // namespace mbed diff --git a/features/cellular/framework/AT/AT_CellularDevice.cpp b/features/cellular/framework/AT/AT_CellularDevice.cpp index fc8fce6113..fe62761ccd 100644 --- a/features/cellular/framework/AT/AT_CellularDevice.cpp +++ b/features/cellular/framework/AT/AT_CellularDevice.cpp @@ -108,8 +108,6 @@ CellularNetwork *AT_CellularDevice::open_network(FileHandle *fh) _network = new AT_CellularNetwork(*atHandler); if (!_network) { release_at_handler(atHandler); - } else { - // TODO: set urc's if sync mode } } } diff --git a/features/cellular/framework/AT/AT_CellularNetwork.cpp b/features/cellular/framework/AT/AT_CellularNetwork.cpp index 18865b165e..caa0402dd0 100644 --- a/features/cellular/framework/AT/AT_CellularNetwork.cpp +++ b/features/cellular/framework/AT/AT_CellularNetwork.cpp @@ -39,13 +39,11 @@ static const at_reg_t at_reg[] = { }; AT_CellularNetwork::AT_CellularNetwork(ATHandler &atHandler) : AT_CellularBase(atHandler), - _stack(NULL), _apn(NULL), _uname(NULL), _pwd(NULL), _ip_stack_type_requested(DEFAULT_STACK), _ip_stack_type(DEFAULT_STACK), _cid(-1), - _connection_status_cb(NULL), _op_act(RAT_UNKNOWN), _authentication_type(CHAP), _last_reg_type(C_REG), - _connect_status(NSAPI_STATUS_DISCONNECTED), _new_context_set(false), _reg_status(NotRegistered) + _stack(NULL), _apn(NULL), _uname(NULL), _pwd(NULL), _ip_stack_type_requested(DEFAULT_STACK), + _ip_stack_type(DEFAULT_STACK), _cid(-1), _connection_status_cb(NULL), _op_act(RAT_UNKNOWN), + _authentication_type(CHAP), _cell_id(-1), _connect_status(NSAPI_STATUS_DISCONNECTED), _new_context_set(false), + _reg_status(NotRegistered), _current_act(RAT_UNKNOWN) { - _urc_funcs[C_EREG] = callback(this, &AT_CellularNetwork::urc_cereg); - _urc_funcs[C_GREG] = callback(this, &AT_CellularNetwork::urc_cgreg); - _urc_funcs[C_REG] = callback(this, &AT_CellularNetwork::urc_creg); } AT_CellularNetwork::~AT_CellularNetwork() @@ -55,9 +53,13 @@ AT_CellularNetwork::~AT_CellularNetwork() nsapi_error_t AT_CellularNetwork::init() { + _urc_funcs[C_EREG] = callback(this, &AT_CellularNetwork::urc_cereg); + _urc_funcs[C_GREG] = callback(this, &AT_CellularNetwork::urc_cgreg); + _urc_funcs[C_REG] = callback(this, &AT_CellularNetwork::urc_creg); + for (int type = 0; type < CellularNetwork::C_MAX; type++) { if (has_registration((RegistrationType)type)) { - if (_at.set_urc_handler(at_reg[type].urc_prefix, _urc_funcs[type])) { + if (_at.set_urc_handler(at_reg[type].urc_prefix, _urc_funcs[type]) != NSAPI_ERROR_OK) { return NSAPI_ERROR_NO_MEMORY; } } @@ -96,17 +98,15 @@ void AT_CellularNetwork::read_reg_params_and_compare(RegistrationType type) read_reg_params(type, reg_status, lac, cell_id, act); - if (_at.get_last_error() == NSAPI_ERROR_OK) { + if (_at.get_last_error() == NSAPI_ERROR_OK && _connection_status_cb) { tr_debug("stat: %d, lac: %d, cellID: %d, act: %d", reg_status, lac, cell_id, act); - if (reg_status != _reg_status && _connection_status_cb) { + if (reg_status != _reg_status) { _connection_status_cb(NSAPI_EVENT_CELLULAR_STATUS_CHANGE, CellularRegistrationStatusChanged); } - - if (cell_id != -1 && cell_id != _cell_id && _connection_status_cb) { + if (cell_id != -1 && cell_id != _cell_id) { _connection_status_cb(NSAPI_EVENT_CELLULAR_STATUS_CHANGE, CellularCellIDChanged); } - - if (act != -1 && (RadioAccessTechnology)act != _current_act && _connection_status_cb) { + if (act != -1 && (RadioAccessTechnology)act != _current_act) { _connection_status_cb(NSAPI_EVENT_CELLULAR_STATUS_CHANGE, CellularRadioAccessTechnologyChanged); } } @@ -581,15 +581,16 @@ nsapi_error_t AT_CellularNetwork::set_registration_urc(RegistrationType type, bo int index = (int)type; MBED_ASSERT(index >= 0 && index < C_MAX); - if (has_registration(type)) { + if (!has_registration(type)) { + return NSAPI_ERROR_UNSUPPORTED; + } else { _at.lock(); - _last_reg_type = type; if (urc_on) { - _at.cmd_start(at_reg[type].cmd); + _at.cmd_start(at_reg[index].cmd); _at.write_string("=2", false); _at.cmd_stop(); } else { - _at.cmd_start(at_reg[type].cmd); + _at.cmd_start(at_reg[index].cmd); _at.write_string("=0", false); _at.cmd_stop(); } @@ -597,8 +598,6 @@ nsapi_error_t AT_CellularNetwork::set_registration_urc(RegistrationType type, bo _at.resp_start(); _at.resp_stop(); return _at.unlock_return_error(); - } else { - return NSAPI_ERROR_UNSUPPORTED; } } @@ -608,10 +607,9 @@ nsapi_error_t AT_CellularNetwork::get_network_registering_mode(NWRegisteringMode _at.cmd_start("AT+COPS?"); _at.cmd_stop(); _at.resp_start("+COPS:"); - int tmpmode = (NWRegisteringMode)_at.read_int(); + mode = (NWRegisteringMode)_at.read_int(); _at.resp_stop(); - mode = (NWRegisteringMode)tmpmode; return _at.unlock_return_error(); } @@ -674,10 +672,6 @@ void AT_CellularNetwork::read_reg_params(RegistrationType type, RegistrationStat cell_id = hex_str_to_int(cell_id_string, CELL_ID_LENGTH); tr_debug("cell_id %s %d", cell_id_string, cell_id ); } - - if (_at.get_last_error() == NSAPI_ERROR_OK) { - _last_reg_type = type; - } } nsapi_error_t AT_CellularNetwork::get_registration_status(RegistrationType type, RegistrationStatus &status) @@ -697,7 +691,7 @@ nsapi_error_t AT_CellularNetwork::get_registration_status(RegistrationType type, _at.cmd_stop(); _at.resp_start(rsp[i]); - _at.read_int(); // ignore urc mode subparam + (void)_at.read_int(); // ignore urc mode subparam int lac = -1, cell_id = -1, act = -1; read_reg_params(type, status, lac, cell_id, act); _at.resp_stop(); @@ -760,7 +754,6 @@ nsapi_error_t AT_CellularNetwork::get_attach(AttachStatus &status) return _at.unlock_return_error(); } - nsapi_error_t AT_CellularNetwork::get_apn_backoff_timer(int &backoff_timer) { // If apn is set diff --git a/features/cellular/framework/AT/AT_CellularNetwork.h b/features/cellular/framework/AT/AT_CellularNetwork.h index f38c2e3dfb..4cfa96ee00 100644 --- a/features/cellular/framework/AT/AT_CellularNetwork.h +++ b/features/cellular/framework/AT/AT_CellularNetwork.h @@ -174,7 +174,6 @@ protected: RadioAccessTechnology _op_act; AuthenticationType _authentication_type; int _cell_id; - RegistrationType _last_reg_type; nsapi_connection_status_t _connect_status; bool _new_context_set; RegistrationStatus _reg_status; diff --git a/features/cellular/framework/AT/AT_CellularPower.cpp b/features/cellular/framework/AT/AT_CellularPower.cpp index 23d379c547..3c614df439 100644 --- a/features/cellular/framework/AT/AT_CellularPower.cpp +++ b/features/cellular/framework/AT/AT_CellularPower.cpp @@ -18,6 +18,7 @@ #include "AT_CellularPower.h" #include "CellularUtil.h" #include "CellularLog.h" +#include "CellularTargets.h" #include "nsapi_types.h" #include CELLULAR_STRINGIFY(CELLULAR_DEVICE.h)