edrx

Files at this revision

API Documentation at this revision

Comitter:
fahimalavi
Date:
Thu Aug 01 18:57:01 2019 +0500
Parent:
25:e67d3d9d2e7e
Commit message:
edrx support added

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 e67d3d9d2e7e -r e4e444cc7b14 UbloxCellularBase.cpp
--- a/UbloxCellularBase.cpp	Wed May 29 12:39:28 2019 +0500
+++ b/UbloxCellularBase.cpp	Thu Aug 01 18:57:01 2019 +0500
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017 ublox Limited
+/* Copyright (c) 2019 ublox Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -499,6 +499,9 @@
     _cb_param_psm_coming_out = NULL;
     _func_psm_coming_out = NULL;
 #endif
+#ifdef TARGET_UBLOX_C030_R41XM
+    _edrx_configured = false;
+#endif
 }
 
 // Destructor.
@@ -813,6 +816,8 @@
             if (set_functionality_mode(FUNC_AIRPLANE)) {
 #endif
                 if (initialise_sim_card()) {
+                    int mno_profile;
+
 #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);
@@ -822,6 +827,18 @@
                     if (_at->is_idle_mode_enabled() == false) {
                         set_idle_mode(false); //disable idle mode at start up
                     }
+                    if(_edrx_configured == false) {
+                        // A special form of the command can be given as +CEDRXS=3.
+                        // In this form, eDRX will be disabled and data for all parameters in the command +CEDRXS will be removed or,
+                        // if available, set to the manufacturer specific default values.
+                        set_receive_period(3,UbloxCellularBase::EDRXGSM_A_Gb_mode);
+                        set_receive_period(3,UbloxCellularBase::EDRXEUTRAN_WB_S1_mode);
+                        set_receive_period(3,UbloxCellularBase::EDRXEUTRAN_NB_S1_mode);
+                    }
+                    get_receive_period();
+
+                    if (get_mno_profile(&mno_profile))
+                        tr_info("Current MNO profile is: %d", mno_profile);
 #endif
                     if (set_device_identity(&_dev_info.dev) && // Set up device identity
                         device_init(_dev_info.dev)) {// Initialise this device
@@ -840,6 +857,7 @@
                                     set_sms()) { // And set up SMS
                                     // The modem is initialised.
                                     _modem_initialised = true;
+                                    tr_info("Modem initialized");
                                 }
                             }
                         }
@@ -956,6 +974,8 @@
 
     MBED_ASSERT(_at != NULL);
 
+    at_set_timeout(3*60*1000); //command has 3 minutes timeout
+
     if (_at->send("AT+COPS=2") && _at->recv("OK")) {
         _dev_info.reg_status_csd = CSD_NOT_REGISTERED_NOT_SEARCHING;
         _dev_info.reg_status_psd = PSD_NOT_REGISTERED_NOT_SEARCHING;
@@ -1630,11 +1650,112 @@
     }
 }
 
+uint32_t UbloxCellularBase::binary_str_to_uint(const char *binary_string, int binary_string_length)
+{
+    if (!binary_string || !binary_string_length) {
+        return 0;
+    }
+
+    int integer_output = 0, base_exp = 1;
+
+    for (int i = binary_string_length - 1; i >= 0; i--) {
+        if (binary_string[i] == '1') {
+            integer_output += (base_exp << (binary_string_length - (i+1)));
+        }
+    }
+
+    return integer_output;
+}
+
 bool UbloxCellularBase::is_modem_awake()
 {
   return (_dev_info.modem_psm_state == AWAKE);
 }
 
+#ifdef TARGET_UBLOX_C030_R41XM
+int UbloxCellularBase::set_receive_period(int mode, tEDRXAccessTechnology act_type, uint8_t edrx_value) {
+    char edrx[5];
+    uint_to_binary_str(edrx_value, edrx, 5, 4);
+    edrx[4] = '\0';
+    int status = 1;
+
+    LOCK();
+
+    if (_at->send("AT+CEDRXS=%d,%d,\"%s\"", mode, act_type, edrx) && _at->recv("OK")) {
+        _edrx_configured = true;
+        status = 0;
+    }
+    else {
+        status = 1;
+    }
+
+
+    UNLOCK();
+
+    return status;
+}
+
+int UbloxCellularBase::set_receive_period(int mode, tEDRXAccessTechnology act_type) {
+    int status = 1;
+
+    LOCK();
+
+    if (_at->send("AT+CEDRXS=%d,%d", mode, act_type) && _at->recv("OK")) {
+
+        status = 0;
+    }
+    else {
+        status = 1;
+    }
+
+    UNLOCK();
+
+    return status;
+}
+
+int UbloxCellularBase::set_receive_period(int mode) {
+    int status = 1;
+
+    LOCK();
+
+    if (_at->send("AT+CEDRXS=%d", mode) && _at->recv("OK")) {
+
+        status = 0;
+    }
+    else {
+        status = 1;
+    }
+
+    UNLOCK();
+
+    return status;
+}
+
+uint32_t UbloxCellularBase::get_receive_period() {
+    uint32_t edrx_value = 2;
+    char buf[24] = {0x00};
+    char edrx_val[5];
+    tEDRXAccessTechnology act_type;
+
+    LOCK();
+
+    if (_at->send("AT+CEDRXS?") && _at->recv("%23[^\n]\nOK\n", buf)) {
+        if (sscanf(buf, "+CEDRXS: %d,\"%s\"", (int *)&act_type, edrx_val) == 2) {
+
+            edrx_value = binary_str_to_uint(edrx_val,4);
+        }
+    }
+
+    if (_at->send("AT+CEDRXRDP") && _at->recv("OK")) {
+    }
+
+    tr_info("edrx_value. %d", edrx_value);
+
+    UNLOCK();
+    return edrx_value;
+}
+#endif //TARGET_UBLOX_C030_R41XM
+
 //application should call init() or connect() in order to initialize the modem
 void UbloxCellularBase::wakeup_modem()
 {
diff -r e67d3d9d2e7e -r e4e444cc7b14 UbloxCellularBase.h
--- a/UbloxCellularBase.h	Wed May 29 12:39:28 2019 +0500
+++ b/UbloxCellularBase.h	Thu Aug 01 18:57:01 2019 +0500
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017 ARM Limited
+/* Copyright (c) 2019 ARM Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -83,6 +83,17 @@
         ASLEEP = 1
     } ModemPSMState;
 
+    /**
+     * edrx access technology
+     */
+    typedef enum {
+        EDRXGSM_EC_GSM_IoT_mode = 1,
+        EDRXGSM_A_Gb_mode,
+        EDRXUTRAN_Iu_mode,
+        EDRXEUTRAN_WB_S1_mode,
+        EDRXEUTRAN_NB_S1_mode
+    }tEDRXAccessTechnology;
+
     /** Initialise the modem, ready for use.
      *
      *  @param pin     PIN for the SIM card.
@@ -400,6 +411,54 @@
     bool is_modem_awake();
 #endif
 
+#ifdef TARGET_UBLOX_C030_R41XM
+    /** Set discontinuous reception time on cellular device.
+     * SARA-R404M / SARA-R410M-02B / SARA-R410M-52B / SARA-R412M / SARA-N4 : The <Paging_time_window> parameter cannot be set by means of the set command.
+     *
+     *
+     *  @remark See 3GPP TS 27.007 eDRX for details.
+     *
+     *  @param mode          disable or enable the use of eDRX
+     *  @param act_type      type of access technology
+     *  @param edrx_value    requested edxr value. Extended DRX parameters information element.
+     *
+     *  @return              0 on success
+     *                       1 on failure
+     */
+    int set_receive_period(int mode, tEDRXAccessTechnology act_type, uint8_t edrx_value);
+
+    /** Set discontinuous reception time on cellular device.
+     *
+     *  @remark See 3GPP TS 27.007 eDRX for details.
+     *
+     *  @param mode          disable or enable the use of eDRX
+     *  @param act_type      type of access technology
+     *
+     *  @return              0 on success
+     *                       1 on failure
+     */
+    int set_receive_period(int mode, tEDRXAccessTechnology act_type);
+
+    /** Set discontinuous reception time on cellular device. (Disable)
+     *
+     *  @remark See 3GPP TS 27.007 eDRX for details.
+     *
+     *  @param mode          disable or enable the use of eDRX
+     *
+     *  @return              0 on success
+     *                       1 on failure
+     */
+    int set_receive_period(int mode);
+
+    /** get discontinuous reception time on cellular device.
+     *
+     *  @remark See 3GPP TS 27.007 eDRX for details.
+     *
+     *  @return              uint32_t
+     */
+    uint32_t get_receive_period();
+#endif
+
 protected:
 
     #define OUTPUT_ENTER_KEY  "\r"
@@ -649,6 +708,16 @@
      *  @param bit_cnt   defines how many bits are filled to buffer started from lsb
      */
     void uint_to_binary_str(uint32_t num, char* str, int str_size, int bit_cnt);
+
+    /** Converts the given binary string to uint.
+     *  For example binary_str_to_uint("0000001001", 10) would return 9
+     *
+     *  @param binary_string           binary string from where chars are converted to uint
+     *  @param binary_string_length    length of the param binary_string
+     *  @return                        uint represented by the binary string
+     */
+    uint32_t binary_str_to_uint(const char *binary_string, int binary_string_length);
+
 #endif
 
 private:
@@ -677,6 +746,9 @@
     Callback<void(void*)>    _func_psm_coming_out;  /**< Callback. */
     void set_modem_psm_state(int state);
 #endif
+#ifdef TARGET_UBLOX_C030_R41XM
+    bool _edrx_configured;
+#endif
 };
 
 #endif // _UBLOX_CELLULAR_BASE_