ublox-cellular-base_R4_PR

Files at this revision

API Documentation at this revision

Comitter:
wajahat.abbas@u-blox.com
Date:
Mon Sep 23 14:29:32 2019 +0500
Parent:
32:d961d0c06cdf
Commit message:
Default mno profile to 100, PSM is disabled for R410M

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
mbed_lib.json Show annotated file Show diff for this revision Revisions of this file
--- a/UbloxCellularBase.cpp	Thu Sep 05 15:46:11 2019 +0500
+++ b/UbloxCellularBase.cpp	Mon Sep 23 14:29:32 2019 +0500
@@ -841,6 +841,8 @@
                     } else if (_psm_status == ENABLED && !_func_psm_going_in){
                         tr_critical("!!PSM IS ENABLED, CALLBACK NOT ATTACHED. PLEASE REGISTER ONE!!");
                     }
+#elif TARGET_UBLOX_C030_R410M
+                    disable_psm(); //PSM is currently not supported by driver for R410M due to lack of URCs
 #endif
                     if (_at->is_idle_mode_enabled() == false) {
                         set_idle_mode(false); //disable idle mode at start up
@@ -1303,7 +1305,7 @@
     bool return_val = false;
     int current_profile;
     MNOProfile arr[MAX_NUM_PROFILES] = { SW_DEFAULT, SIM_ICCID, ATT, TMO, VODAFONE, DT, STANDARD_EU
-#ifdef  TARGET_UBLOX_C030_R410M
+#ifdef TARGET_UBLOX_C030_R410M
                                          , VERIZON, TELSTRA, CT, SPRINT, TELUS
 #endif
                                        };
@@ -1591,8 +1593,22 @@
 
     return status;
 }
+
+bool UbloxCellularBase::disable_psm()
+{
+    bool return_value = false;
+
+    LOCK();
+    if (_at->send("AT+CPSMS=0") && _at->recv("OK")) {
+        return_value = true;
+    }
+    UNLOCK();
+
+    return return_value;
+}
 #endif //TARGET_UBLOX_C030_R41XM
 
+
 #ifdef TARGET_UBLOX_C030_R412M
 bool UbloxCellularBase::get_power_saving_mode(int *status, int *periodic_time, int *active_time)
 {
@@ -1715,133 +1731,129 @@
     int at_timeout = _at_timeout;
     at_set_timeout(10000); //AT+CPSMS has response time of < 10s
 
-    //check if modem supports PSM URCs
-    if (_at->send("AT+UPSMR?") && _at->recv("OK")) {
-        if (periodic_time == 0 && active_time == 0) {
-            // disable PSM
-            if (_at->send("AT+CPSMS=0") && _at->recv("OK")) {
-                if (set_psm_urcs(false)) {//disable the URC
-                    //de-register the callback
-                    detach_cb_psm_going_in();
-                    detach_cb_psm_coming_out();
-                    _psm_status = DISABLED;
-                    return_val = true;
-                }
-            }
-        } else { //PSM string encoding code borrowed from AT_CellularPower.cpp
-            /**
-                Table 10.5.163a/3GPP TS 24.008: GPRS Timer 3 information element
+    if (periodic_time == 0 && active_time == 0) {
+        // disable PSM
+        if (_at->send("AT+CPSMS=0") && _at->recv("OK")) {
+            set_psm_urcs(false); //disable the URC
+            _psm_status = DISABLED;
+            return_val = true;
+        }
+    } else if (_at->send("AT+UPSMR?") && _at->recv("OK")) { //PSM string encoding code borrowed from AT_CellularPower.cpp
+        /**
+            Table 10.5.163a/3GPP TS 24.008: GPRS Timer 3 information element
 
-                Bits 5 to 1 represent the binary coded timer value.
+            Bits 5 to 1 represent the binary coded timer value.
 
-                Bits 6 to 8 defines the timer value unit for the GPRS timer as follows:
-                8 7 6
-                0 0 0 value is incremented in multiples of 10 minutes
-                0 0 1 value is incremented in multiples of 1 hour
-                0 1 0 value is incremented in multiples of 10 hours
-                0 1 1 value is incremented in multiples of 2 seconds
-                1 0 0 value is incremented in multiples of 30 seconds
-                1 0 1 value is incremented in multiples of 1 minute
-                1 1 0 value is incremented in multiples of 320 hours (NOTE 1)
-                1 1 1 value indicates that the timer is deactivated (NOTE 2).
-             */
-            char pt[8+1];// timer value encoded as 3GPP IE
-            const int ie_value_max = 0x1f;
-            uint32_t periodic_timer = 0;
-            if (periodic_time <= 2*ie_value_max) { // multiples of 2 seconds
-                periodic_timer = periodic_time/2;
-                strcpy(pt, "01100000");
+            Bits 6 to 8 defines the timer value unit for the GPRS timer as follows:
+            8 7 6
+            0 0 0 value is incremented in multiples of 10 minutes
+            0 0 1 value is incremented in multiples of 1 hour
+            0 1 0 value is incremented in multiples of 10 hours
+            0 1 1 value is incremented in multiples of 2 seconds
+            1 0 0 value is incremented in multiples of 30 seconds
+            1 0 1 value is incremented in multiples of 1 minute
+            1 1 0 value is incremented in multiples of 320 hours (NOTE 1)
+            1 1 1 value indicates that the timer is deactivated (NOTE 2).
+         */
+        char pt[8+1];// timer value encoded as 3GPP IE
+        const int ie_value_max = 0x1f;
+        uint32_t periodic_timer = 0;
+        if (periodic_time <= 2*ie_value_max) { // multiples of 2 seconds
+            periodic_timer = periodic_time/2;
+            strcpy(pt, "01100000");
+        } else {
+            if (periodic_time <= 30*ie_value_max) { // multiples of 30 seconds
+                periodic_timer = periodic_time/30;
+                strcpy(pt, "10000000");
             } else {
-                if (periodic_time <= 30*ie_value_max) { // multiples of 30 seconds
-                    periodic_timer = periodic_time/30;
-                    strcpy(pt, "10000000");
+                if (periodic_time <= 60*ie_value_max) { // multiples of 1 minute
+                    periodic_timer = periodic_time/60;
+                    strcpy(pt, "10100000");
                 } else {
-                    if (periodic_time <= 60*ie_value_max) { // multiples of 1 minute
-                        periodic_timer = periodic_time/60;
-                        strcpy(pt, "10100000");
+                    if (periodic_time <= 10*60*ie_value_max) { // multiples of 10 minutes
+                        periodic_timer = periodic_time/(10*60);
+                        strcpy(pt, "00000000");
                     } else {
-                        if (periodic_time <= 10*60*ie_value_max) { // multiples of 10 minutes
-                            periodic_timer = periodic_time/(10*60);
-                            strcpy(pt, "00000000");
+                        if (periodic_time <= 60*60*ie_value_max) { // multiples of 1 hour
+                            periodic_timer = periodic_time/(60*60);
+                            strcpy(pt, "00100000");
                         } else {
-                            if (periodic_time <= 60*60*ie_value_max) { // multiples of 1 hour
-                                periodic_timer = periodic_time/(60*60);
-                                strcpy(pt, "00100000");
-                            } else {
-                                if (periodic_time <= 10*60*60*ie_value_max) { // multiples of 10 hours
-                                    periodic_timer = periodic_time/(10*60*60);
-                                    strcpy(pt, "01000000");
-                                } else { // multiples of 320 hours
-                                    int t = periodic_time / (320*60*60);
-                                    if (t > ie_value_max) {
-                                        t = ie_value_max;
-                                    }
-                                    periodic_timer = t;
-                                    strcpy(pt, "11000000");
+                            if (periodic_time <= 10*60*60*ie_value_max) { // multiples of 10 hours
+                                periodic_timer = periodic_time/(10*60*60);
+                                strcpy(pt, "01000000");
+                            } else { // multiples of 320 hours
+                                int t = periodic_time / (320*60*60);
+                                if (t > ie_value_max) {
+                                    t = ie_value_max;
                                 }
+                                periodic_timer = t;
+                                strcpy(pt, "11000000");
                             }
                         }
                     }
                 }
             }
+        }
 
-            uint_to_binary_str(periodic_timer, &pt[3], sizeof(pt)-3, 5);
-            pt[8] = '\0';
+        uint_to_binary_str(periodic_timer, &pt[3], sizeof(pt)-3, 5);
+        pt[8] = '\0';
+
+        /**
+            Table 10.5.172/3GPP TS 24.008: GPRS Timer information element
 
-            /**
-                Table 10.5.172/3GPP TS 24.008: GPRS Timer information element
+            Bits 5 to 1 represent the binary coded timer value.
+
+            Bits 6 to 8 defines the timer value unit for the GPRS timer as follows:
 
-                Bits 5 to 1 represent the binary coded timer value.
-
-                Bits 6 to 8 defines the timer value unit for the GPRS timer as follows:
+            8 7 6
+            0 0 0  value is incremented in multiples of 2 seconds
+            0 0 1  value is incremented in multiples of 1 minute
+            0 1 0  value is incremented in multiples of decihours
+            1 1 1  value indicates that the timer is deactivated.
 
-                8 7 6
-                0 0 0  value is incremented in multiples of 2 seconds
-                0 0 1  value is incremented in multiples of 1 minute
-                0 1 0  value is incremented in multiples of decihours
-                1 1 1  value indicates that the timer is deactivated.
+            Other values shall be interpreted as multiples of 1 minute in this version of the protocol.
+        */
+        char at[8+1];
+        uint32_t active_timer; // timer value encoded as 3GPP IE
+        if (active_time <= 2*ie_value_max) { // multiples of 2 seconds
+            active_timer = active_time/2;
+            strcpy(at, "00000000");
+        } else {
+            if (active_time <= 60*ie_value_max) { // multiples of 1 minute
+                active_timer = (1<<5) | (active_time/60);
+                strcpy(at, "00100000");
+            } else { // multiples of decihours
+                int t = active_time / (6*60);
+                if (t > ie_value_max) {
+                    t = ie_value_max;
+                }
+                active_timer = t;
+                strcpy(at, "01000000");
+            }
+        }
 
-                Other values shall be interpreted as multiples of 1 minute in this version of the protocol.
-            */
-            char at[8+1];
-            uint32_t active_timer; // timer value encoded as 3GPP IE
-            if (active_time <= 2*ie_value_max) { // multiples of 2 seconds
-                active_timer = active_time/2;
-                strcpy(at, "00000000");
+        uint_to_binary_str(active_timer, &at[3], sizeof(at)-3, 5);
+        at[8] = '\0';
+
+        if (_at->send("AT+CPSMS=1,,,\"%s\",\"%s\"", pt, at) && _at->recv("OK")) {
+            if (set_psm_urcs(true)) {//enable the PSM URC
+                tr_info("PSM enabled successfully!");
+                _psm_status = ENABLED;
+                return_val = true;
             } else {
-                if (active_time <= 60*ie_value_max) { // multiples of 1 minute
-                    active_timer = (1<<5) | (active_time/60);
-                    strcpy(at, "00100000");
-                } else { // multiples of decihours
-                    int t = active_time / (6*60);
-                    if (t > ie_value_max) {
-                        t = ie_value_max;
-                    }
-                    active_timer = t;
-                    strcpy(at, "01000000");
-                }
-            }
-
-            uint_to_binary_str(active_timer, &at[3], sizeof(at)-3, 5);
-            at[8] = '\0';
-
-            if (_at->send("AT+CPSMS=1,,,\"%s\",\"%s\"", pt, at) && _at->recv("OK")) {
-                if (set_psm_urcs(true)) {//enable the PSM URC
-                    tr_info("PSM enabled successfully!");
-                    _psm_status = ENABLED;
-                    return_val = true;
-                } else {
-                    tr_error("PSM URCs not supported");
-                    return_val = false;
-                }
-            } else {
-                tr_error("+CPSMS command failed");
+                tr_error("Error enabling PSM URCs, PSM not enabled");
+                _at->send("AT+CPSMS=0");
+                _at->recv("OK");
                 return_val = false;
             }
+        } else {
+            tr_error("+CPSMS command failed");
+            return_val = false;
         }
     } else {
         tr_error("PSM URCs not supported by this version of modem");
     }
+
     at_set_timeout(at_timeout);
     UNLOCK();
     return return_val;
--- a/UbloxCellularBase.h	Thu Sep 05 15:46:11 2019 +0500
+++ b/UbloxCellularBase.h	Mon Sep 23 14:29:32 2019 +0500
@@ -263,7 +263,7 @@
     #if MBED_CONF_UBLOX_CELL_DEFAULT_MNO_PROFILE
     #define DEFAULT_MNO_PROFILE     (MNOProfile)MBED_CONF_UBLOX_CELL_DEFAULT_MNO_PROFILE
     #else
-    #define DEFAULT_MNO_PROFILE     SW_DEFAULT
+    #define DEFAULT_MNO_PROFILE     STANDARD_EU
     #endif
 
     /** Reads the current MNO profile from modem and sets it to user specified profile.
@@ -494,6 +494,12 @@
      *  @return           True if successful, otherwise false.
      */
     bool get_band_bitmask(uint64_t *m1_bitmask, uint64_t *nb1_bitmask);
+
+    /** disables the PSM
+     *
+     *  @return           True if successful, otherwise false.
+     */
+    bool disable_psm();
 #endif
 
 protected:
--- a/mbed_lib.json	Thu Sep 05 15:46:11 2019 +0500
+++ b/mbed_lib.json	Mon Sep 23 14:29:32 2019 +0500
@@ -4,6 +4,6 @@
         "baud-rate": 115200,
         "at-parser-buffer-size": 256,
         "at-parser-timeout": 8000,
-        "default-mno-profile": 0
+        "default-mno-profile": 100
     }
 }