ublox-cellular-base_mno

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