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.
Dependents: example-ublox-cellular-psm
Diff: UbloxCellularBase.cpp
- Revision:
- 20:31d5e048fbfa
- Parent:
- 19:15f31e074d67
- Child:
- 22:779971811c46
diff -r 15f31e074d67 -r 31d5e048fbfa UbloxCellularBase.cpp
--- 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