ublox-cellular-base_mno_pr
Diff: UbloxCellularBase.cpp
- Revision:
- 20:31d5e048fbfa
- Parent:
- 19:15f31e074d67
- Child:
- 22:779971811c46
--- a/UbloxCellularBase.cpp Mon Sep 17 10:46:14 2018 +0000 +++ b/UbloxCellularBase.cpp Fri Mar 22 13:45:51 2019 +0500 @@ -1061,5 +1061,152 @@ return rssiRet; } +//RAT should be set in a detached state (AT+COPS=2) +bool UbloxCellularBase::set_modem_rat(RAT selected_rat, RAT preferred_rat, RAT second_preferred_rat) +{ + bool success = false; + char command[16] = {0x00}; + + //check if modem is registered with network + if (is_registered_csd() || is_registered_psd() || is_registered_eps()) { + tr_error("RAT should only be set in detached state"); + return false; + } + + if (preferred_rat != NOT_USED && second_preferred_rat != NOT_USED) { + sprintf(command, "AT+URAT=%d,%d,%d", selected_rat, preferred_rat, second_preferred_rat); + } else if (preferred_rat != NOT_USED) { + sprintf(command, "AT+URAT=%d,%d", selected_rat, preferred_rat); + } else if (second_preferred_rat != NOT_USED) { + sprintf(command, "AT+URAT=%d,%d", selected_rat, second_preferred_rat); + } else { + sprintf(command, "AT+URAT=%d", selected_rat); + } + + LOCK(); + if (_at->send(command) && _at->recv("OK")) { + success = true; + } else { + tr_error("unable to set the specified RAT"); + success = false; + } + UNLOCK(); + + return success; +} + +bool UbloxCellularBase::get_modem_rat(RAT *selected_rat, RAT *preferred_rat, RAT *second_preferred_rat) +{ + bool success = false; + char buf[24] = {0x00}; + + if (selected_rat == NULL || preferred_rat == NULL || second_preferred_rat == NULL) { + tr_info("invalid pointers"); + return false; + } + + MBED_ASSERT(_at != NULL); + + *selected_rat = NOT_USED; + *preferred_rat = NOT_USED; + *second_preferred_rat = NOT_USED; + + LOCK(); + + if (_at->send("AT+URAT?") && _at->recv("%23[^\n]\nOK\n", buf)) { + if (sscanf(buf, "+URAT: %d,%d,%d", (int*)selected_rat, (int*)preferred_rat, (int*)second_preferred_rat) == 3) { + success = true; + } else if (sscanf(buf, "+URAT: %d,%d", (int*)selected_rat, (int*)preferred_rat) == 2) { + success = true; + } else if (sscanf(buf, "+URAT: %d", (int*)selected_rat) == 1) { + success = true; + } + } + + UNLOCK(); + return success; +} + +// Power down modem via AT interface. +bool UbloxCellularBase::reboot_modem() +{ + bool return_val = false; + int at_timeout; + LOCK(); + + MBED_ASSERT(_at != NULL); + + at_timeout = _at_timeout; // Has to be inside LOCK()s + at_set_timeout(3*60*1000); //command has 3 minutes timeout + tr_info("rebooting modem..."); + + if (_at->send("AT+CFUN=15") && _at->recv("OK")) { + tr_info("reboot successful"); + return_val = true; + } + + _dev_info.reg_status_csd = CSD_NOT_REGISTERED_NOT_SEARCHING; + _dev_info.reg_status_psd = PSD_NOT_REGISTERED_NOT_SEARCHING; + _dev_info.reg_status_eps = EPS_NOT_REGISTERED_NOT_SEARCHING; + _modem_initialised = false; + at_set_timeout(at_timeout); + UNLOCK(); + + return return_val; +} + +#ifdef TARGET_UBLOX_C030_R41XM +bool UbloxCellularBase::set_mno_profile(MNOProfile profile) +{ + bool return_val = false; + + MNOProfile mno_profile; + if (get_mno_profile(&mno_profile)) { + tr_info("Current MNO profile is: %d", (int)mno_profile); + if (mno_profile != profile) { + + if (is_registered_csd() || is_registered_psd() || is_registered_eps()) { + tr_error("MNO profile should only be set in detached state"); + return false; + } + + LOCK(); + if (_at->send("AT+UMNOPROF=%d", profile) && _at->recv("OK")) { + return_val = true; + } else { + tr_error("unable to set specified profile"); + } + UNLOCK(); + + } else { + return_val = true; + } + } else { + tr_error("could not read MNO profile"); + } + + return return_val; +} + +bool UbloxCellularBase::get_mno_profile(MNOProfile *profile) +{ + bool return_val = false; + + if (profile == NULL) { + return false; + } + + LOCK(); + MBED_ASSERT(_at != NULL); + + if ( (_at->send("AT+UMNOPROF?") && _at->recv("+UMNOPROF: %d", (int*)profile) && _at->recv("OK")) ) { + return_val = true; + } + + UNLOCK(); + return return_val; +} +#endif + // End of File