cfun

Files at this revision

API Documentation at this revision

Comitter:
wajahat.abbas@u-blox.com
Date:
Tue May 28 15:39:51 2019 +0500
Parent:
23:eaab8e812a5d
Commit message:
+CFUN support

Changed in this revision

UbloxCellularBase.cpp Show annotated file Show diff for this revision Revisions of this file
UbloxCellularBase.h Show annotated file Show diff for this revision Revisions of this file
diff -r eaab8e812a5d -r e26a6ab0dd75 UbloxCellularBase.cpp
--- a/UbloxCellularBase.cpp	Fri May 03 13:43:49 2019 +0500
+++ b/UbloxCellularBase.cpp	Tue May 28 15:39:51 2019 +0500
@@ -802,29 +802,35 @@
             if (pin != NULL) {
                 _pin = pin;
             }
-            if (initialise_sim_card()) {
+#ifdef TARGET_UBLOX_C027
+            if (set_functionality_mode(FUNC_MIN)) {
+#else
+            if (set_functionality_mode(FUNC_AIRPLANE)) {
+#endif
+                if (initialise_sim_card()) {
 #ifdef TARGET_UBLOX_C030_R412M
-                if (_psm_status ==  false) { //psm is not enabled by application yet so disable it at start-up
-                    set_power_saving_mode(0, 0);
-                }
+                    if (_psm_status ==  false) { //psm is not enabled by application yet so disable it at start-up
+                        set_power_saving_mode(0, 0);
+                    }
 #endif
-                if (set_device_identity(&_dev_info.dev) && // Set up device identity
-                    device_init(_dev_info.dev)) {// Initialise this device
-                    // Get the integrated circuit ID of the SIM
-                    if (get_iccid()) {
-                        // Try a few times to get the IMSI (since on some modems this can
-                        // take a while to be retrieved, especially if a SIM PIN
-                        // was set)
-                        for (x = 0; (x < 3) && !get_imsi(); x++) {
-                            wait_ms(1000);
-                        }
-                        
-                        if (x < 3) { // If we got the IMSI, can get the others
-                            if (get_imei() && // Get international mobile equipment identifier
-                                get_meid() && // Probably the same as the IMEI
-                                set_sms()) { // And set up SMS
-                                // The modem is initialised.
-                                _modem_initialised = true;
+                    if (set_device_identity(&_dev_info.dev) && // Set up device identity
+                        device_init(_dev_info.dev)) {// Initialise this device
+                        // Get the integrated circuit ID of the SIM
+                        if (get_iccid()) {
+                            // Try a few times to get the IMSI (since on some modems this can
+                            // take a while to be retrieved, especially if a SIM PIN
+                            // was set)
+                            for (x = 0; (x < 3) && !get_imsi(); x++) {
+                                wait_ms(1000);
+                            }
+
+                            if (x < 3) { // If we got the IMSI, can get the others
+                                if (get_imei() && // Get international mobile equipment identifier
+                                    get_meid() && // Probably the same as the IMEI
+                                    set_sms()) { // And set up SMS
+                                    // The modem is initialised.
+                                    _modem_initialised = true;
+                                }
                             }
                         }
                     }
@@ -850,58 +856,60 @@
     MBED_ASSERT(_at != NULL);
 
     if (!is_registered_psd() && !is_registered_csd() && !is_registered_eps()) {
-        tr_info("Searching Network...");
-        // Enable the packet switched and network registration unsolicited result codes
-        if (_at->send("AT+CREG=1") && _at->recv("OK") &&
-            _at->send("AT+CGREG=1") && _at->recv("OK")) {
-            atSuccess = true;
-            if (_at->send("AT+CEREG=1")) {
-                _at->recv("OK");
-                // Don't check return value as this works for LTE only
-            }
-
-            if (atSuccess) {
-                // See if we are already in automatic mode
-                if (_at->send("AT+COPS?") && _at->recv("+COPS: %d", &status) &&
-                    _at->recv("OK")) {
-                    // If not, set it
-                    if (status != 0) {
-                        // Don't check return code here as there's not much
-                        // we can do if this fails.
-                        _at->send("AT+COPS=0") && _at->recv("OK");
-                    }
-                }
-
-                // Query the registration status directly as well,
-                // just in case
-                if (_at->send("AT+CREG?") && _at->recv("OK")) {
-                    // Answer will be processed by URC
-                }
-                if (_at->send("AT+CGREG?") && _at->recv("OK")) {
-                    // Answer will be processed by URC
-                }
-                if (_at->send("AT+CEREG?")) {
+        if (set_functionality_mode(FUNC_FULL)) {
+            tr_info("Searching Network...");
+            // Enable the packet switched and network registration unsolicited result codes
+            if (_at->send("AT+CREG=1") && _at->recv("OK") &&
+                _at->send("AT+CGREG=1") && _at->recv("OK")) {
+                atSuccess = true;
+                if (_at->send("AT+CEREG=1")) {
                     _at->recv("OK");
                     // Don't check return value as this works for LTE only
                 }
+
+                if (atSuccess) {
+                    // See if we are already in automatic mode
+                    if (_at->send("AT+COPS?") && _at->recv("+COPS: %d", &status) &&
+                        _at->recv("OK")) {
+                        // If not, set it
+                        if (status != 0) {
+                            // Don't check return code here as there's not much
+                            // we can do if this fails.
+                            _at->send("AT+COPS=0") && _at->recv("OK");
+                        }
+                    }
+
+                    // Query the registration status directly as well,
+                    // just in case
+                    if (_at->send("AT+CREG?") && _at->recv("OK")) {
+                        // Answer will be processed by URC
+                    }
+                    if (_at->send("AT+CGREG?") && _at->recv("OK")) {
+                        // Answer will be processed by URC
+                    }
+                    if (_at->send("AT+CEREG?")) {
+                        _at->recv("OK");
+                        // Don't check return value as this works for LTE only
+                    }
+                }
             }
-        }
-        // Wait for registration to succeed
-        at_set_timeout(1000);
-        for (int waitSeconds = 0; !registered && (waitSeconds < 180); waitSeconds++) {
-            registered = is_registered_psd() || is_registered_csd() || is_registered_eps();
-            _at->recv(UNNATURAL_STRING);
-        }
-        at_set_timeout(at_timeout);
-
-        if (registered) {
-            // This should return quickly but sometimes the status field is not returned
-            // so make the timeout short
+            // Wait for registration to succeed
             at_set_timeout(1000);
-            if (_at->send("AT+COPS?") && _at->recv("+COPS: %*d,%*d,\"%*[^\"]\",%d\n", &status)) {
-                set_rat(status);
+            for (int waitSeconds = 0; !registered && (waitSeconds < 180); waitSeconds++) {
+                registered = is_registered_psd() || is_registered_csd() || is_registered_eps();
+                _at->recv(UNNATURAL_STRING);
             }
             at_set_timeout(at_timeout);
+
+            if (registered) {
+                // This should return quickly but sometimes the status field is not returned
+                // so make the timeout short
+                at_set_timeout(1000);
+                if (_at->send("AT+COPS?") && _at->recv("+COPS: %*d,%*d,\"%*[^\"]\",%d\n", &status)) {
+                    set_rat(status);
+                }
+                at_set_timeout(at_timeout);
+            }
         }
     } else {
         registered = true;
@@ -1190,6 +1198,11 @@
 //application should call init() or connect() in order to initialize the modem
 bool UbloxCellularBase::reboot_modem()
 {
+    return (set_functionality_mode(FUNC_RESET));
+}
+
+bool UbloxCellularBase::set_functionality_mode(FunctionalityMode mode)
+{
     bool return_val = false;
     int at_timeout;
     LOCK();
@@ -1198,23 +1211,40 @@
 
     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");
+    if (_at->send("AT+CFUN=%d", mode) && _at->recv("OK")) {
         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;
+    if (mode == FUNC_RESET || mode == FUNC_RESET_WITH_SIM) {
+        _modem_initialised = false;
+    }
+
     at_set_timeout(at_timeout);
     UNLOCK();
 
     return return_val;
 }
 
+bool UbloxCellularBase::get_functionality_mode(int *mode)
+{
+    bool return_val = false;
+
+    if (mode == NULL) {
+        return false;
+    }
+
+    LOCK();
+    MBED_ASSERT(_at != NULL);
+
+    if ( (_at->send("AT+CFUN?") && _at->recv("+CFUN: %d", mode) && _at->recv("OK")) )  {
+        return_val = true;
+    }
+
+    UNLOCK();
+    return return_val;
+}
+
 #ifdef TARGET_UBLOX_C030_R41XM
 bool UbloxCellularBase::set_mno_profile(MNOProfile profile)
 {
diff -r eaab8e812a5d -r e26a6ab0dd75 UbloxCellularBase.h
--- a/UbloxCellularBase.h	Fri May 03 13:43:49 2019 +0500
+++ b/UbloxCellularBase.h	Tue May 28 15:39:51 2019 +0500
@@ -199,6 +199,21 @@
         NOT_USED = -1
     } RAT;
 
+    /** Module functionality modes. Ref to section 5.3.3 of UBX-13002752 for details.
+     */
+    typedef enum {
+        FUNC_MIN = 0,
+        FUNC_FULL = 1,
+        FUNC_AIRPLANE = 4,
+        FUNC_EN_SIM_TLKT_DEDICATED = 6,
+        FUNC_DS_SIM_TLKT = 7,
+        FUNC_EN_SIM_TLKT_RAW = 9,
+        FUNC_RESET = 15,
+        FUNC_RESET_WITH_SIM = 16,
+        FUNC_MIN_WITH_SIM = 19,
+        FUNC_HALT = 127
+    } FunctionalityMode;
+
 #ifdef TARGET_UBLOX_C030_R41XM
     /** Supported MNO profiles for SARA-R4.
      */
@@ -264,6 +279,18 @@
      */
     bool get_modem_rat(int *selected_rat, int *preferred_rat, int *second_preferred_rat);
 
+    /** Sets the modem to specified functionality mode.
+     *
+     * @return true if successful, otherwise false.
+     */
+    bool set_functionality_mode(FunctionalityMode mode);
+
+    /** Get the modem functionality mode
+     *
+     * @return true if successful, otherwise false.
+     */
+    bool get_functionality_mode(int *mode);
+
     /** reboot the modem using AT+CFUN=15. Application should call init() or connect() before making any other API calls.
      *
      * @return        true if successful, otherwise false.