upsv

Files at this revision

API Documentation at this revision

Comitter:
wajahat.abbas@u-blox.com
Date:
Wed May 29 12:39:28 2019 +0500
Parent:
24:e26a6ab0dd75
Commit message:
Added support for +UPSV (idle mode) for C030_R412M

Changed in this revision

UbloxATCmdParser.cpp Show annotated file Show diff for this revision Revisions of this file
UbloxATCmdParser.h Show annotated file Show diff for this revision Revisions of this file
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 e26a6ab0dd75 -r e67d3d9d2e7e UbloxATCmdParser.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UbloxATCmdParser.cpp	Wed May 29 12:39:28 2019 +0500
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2017, Arm Limited and affiliates.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifdef TARGET_UBLOX_C030_R41XM
+
+#include "UbloxATCmdParser.h"
+#include "rtos/Thread.h"
+
+using namespace mbed;
+
+UbloxATCmdParser::UbloxATCmdParser(FileHandle *fh, const char *output_delimiter, int buffer_size, int timeout, bool debug) : ATCmdParser(fh, output_delimiter, buffer_size, timeout, debug)
+{
+    idle_mode_disabled();
+}
+UbloxATCmdParser::~UbloxATCmdParser()
+{
+
+}
+
+
+bool UbloxATCmdParser::send(const char *command, ...)
+{
+    bool status = false;
+
+    if (_idle_mode_status == true) { //idle mode is active
+        if ( _wakeup_timer.read_ms() >= 5000) { //if more than 5 secs have passed since last TX activity, wake up the modem.
+            uint8_t retries = 3;
+            ATCmdParser::set_timeout(1000);
+            while(retries--) {
+                ATCmdParser::putc('A');
+                wait_ms(10); //wait a little
+                if ( (ATCmdParser::send("AT")) && (ATCmdParser::recv("OK")) ) { //check if modem is awake and accepting commands
+                    status = true;
+                    break;
+                }
+            }
+            ATCmdParser::set_timeout(_timeout);
+            if (status == false) { //all tries failed, return false
+                _wakeup_timer.reset();
+                return status;
+            }
+        }
+        _wakeup_timer.reset(); //Any activity on tx will reset the timer. Timer will expire if no activity since last 5 secs
+    }
+
+    va_list args;
+    va_start(args, command);
+    status = ATCmdParser::vsend(command, args);
+    va_end(args);
+    return status;
+}
+
+void UbloxATCmdParser::idle_mode_enabled()
+{
+    _idle_mode_status = true;
+    _wakeup_timer.start();
+}
+
+void UbloxATCmdParser::idle_mode_disabled()
+{
+    _idle_mode_status = false;
+    _wakeup_timer.stop();
+}
+
+bool UbloxATCmdParser::is_idle_mode_enabled()
+{
+	return _idle_mode_status;
+}
+
+void UbloxATCmdParser::set_timeout(int timeout) {
+    _timeout = timeout;
+    ATCmdParser::set_timeout(timeout);
+}
+#endif /* TARGET_UBLOX_C030_R41XM */
diff -r e26a6ab0dd75 -r e67d3d9d2e7e UbloxATCmdParser.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UbloxATCmdParser.h	Wed May 29 12:39:28 2019 +0500
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2017, Arm Limited and affiliates.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifdef TARGET_UBLOX_C030_R41XM
+#ifndef UBLOXATCMDPARSER_H_
+#define UBLOXATCMDPARSER_H_
+
+#include "ATCmdParser.h"
+#include "mbed.h"
+
+namespace mbed {
+
+/**
+ *  Class UbloxATCmdParser
+ *
+ */
+class UbloxATCmdParser : public ATCmdParser
+{
+public:
+    UbloxATCmdParser(FileHandle *fh, const char *output_delimiter = "\r",
+             int buffer_size = 256, int timeout = 8000, bool debug = false);
+    ~UbloxATCmdParser();
+
+    bool send(const char *command, ...) MBED_PRINTF_METHOD(1,2);
+
+    void set_timeout(int timeout);
+
+    bool is_idle_mode_enabled();
+
+	void idle_mode_enabled();
+
+    void idle_mode_disabled();
+	
+private:
+    bool _idle_mode_status;
+    Timer _wakeup_timer;
+    int _timeout;
+};
+
+
+} // namespace mbed
+
+#endif
+#endif
+
diff -r e26a6ab0dd75 -r e67d3d9d2e7e UbloxCellularBase.cpp
--- a/UbloxCellularBase.cpp	Tue May 28 15:39:51 2019 +0500
+++ b/UbloxCellularBase.cpp	Wed May 29 12:39:28 2019 +0500
@@ -532,8 +532,13 @@
         _fh = new UARTSerial(tx, rx, baud);
 
         // Set up the AT parser
+#ifdef TARGET_UBLOX_C030_R41XM
+        _at = new UbloxATCmdParser(_fh, OUTPUT_ENTER_KEY, AT_PARSER_BUFFER_SIZE,
+                              _at_timeout, _debug_trace_on);
+#else
         _at = new ATCmdParser(_fh, OUTPUT_ENTER_KEY, AT_PARSER_BUFFER_SIZE,
                               _at_timeout, _debug_trace_on);
+#endif
 
         // Error cases, out of band handling
         _at->oob("ERROR", callback(this, &UbloxCellularBase::parser_abort_cb));
@@ -813,6 +818,11 @@
                         set_power_saving_mode(0, 0);
                     }
 #endif
+#ifdef TARGET_UBLOX_C030_R41XM
+                    if (_at->is_idle_mode_enabled() == false) {
+                        set_idle_mode(false); //disable idle mode at start up
+                    }
+#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
@@ -1296,7 +1306,57 @@
     UNLOCK();
     return return_val;
 }
+// Enable or Disable the UPSV power saving mode
+bool UbloxCellularBase::set_idle_mode(bool enable)
+{
+#ifdef TARGET_UBLOX_C030_R412M
+    if (_psm_status == true && enable == true) {
+        return false;
+    }
 #endif
+
+    bool success = false;
+    LOCK();
+
+    MBED_ASSERT(_at != NULL);
+
+    if (_at->send("AT+UPSV=%d", enable ? 4 : 0) && _at->recv("OK")) {
+        if (enable == true) {
+            _at->idle_mode_enabled();
+        }
+        else {
+            _at->idle_mode_disabled();
+        }
+        success = true;
+    }
+
+    UNLOCK();
+    return success;
+}
+
+bool UbloxCellularBase::get_idle_mode(int *status)
+{
+    bool return_val = false;
+
+    if (status == NULL) {
+        return false;
+    }
+
+    LOCK();
+    MBED_ASSERT(_at != NULL);
+
+    if ( (_at->send("AT+UPSV?") && _at->recv("+UPSV: %d", status) && _at->recv("OK")) )  {
+        if (*status == 4) {
+            *status = 1;
+        }
+        return_val = true;
+    }
+
+    UNLOCK();
+    return return_val;
+}
+#endif
+
 #ifdef TARGET_UBLOX_C030_R412M
 bool UbloxCellularBase::get_power_saving_mode(int *status, int *periodic_time, int *active_time)
 {
@@ -1305,6 +1365,10 @@
     int value, multiplier;
     bool return_val;
 
+    if (status == NULL || periodic_time == NULL || active_time == NULL) {
+        return false;
+    }
+
     LOCK();
     //+UCPSMS:1,,,"01000011","01000011"
     if (_at->send("AT+UCPSMS?") && _at->recv("+UCPSMS:%d,,,\"%8c\",\"%8c\"\n", status, pt_encoded, at_encoded)) {
@@ -1405,6 +1469,9 @@
 
 bool UbloxCellularBase::set_power_saving_mode(int periodic_time, int active_time)
 {
+    if (_at->is_idle_mode_enabled() == true && periodic_time != 0 && active_time != 0 ) {
+        return false;
+    }
     bool return_val = false;
 
     LOCK();
diff -r e26a6ab0dd75 -r e67d3d9d2e7e UbloxCellularBase.h
--- a/UbloxCellularBase.h	Tue May 28 15:39:51 2019 +0500
+++ b/UbloxCellularBase.h	Wed May 29 12:39:28 2019 +0500
@@ -18,7 +18,7 @@
 
 #include "mbed.h"
 #include "mbed_toolchain.h" // for MBED_DEPRECATED
-#include "ATCmdParser.h"
+#include "ubloxATCmdParser.h"
 #include "FileHandle.h"
 
 /**********************************************************************
@@ -253,6 +253,23 @@
      * @return    true if operation was successful, false if there was an error
      */
     bool get_mno_profile(int *profile);
+
+    /** Enable or disable the UPSV Power Saving Mode.
+     *
+     * @param idle_mode_value  1: enable idle mode
+     *                         0: disable idle mode
+     * @return                 true if successful, otherwise false.
+     */
+    bool set_idle_mode(bool enable = false);
+
+    /** Queries the modem for idle mode status.
+     *
+     * @param status pointer to variable that can hold the value for idle mode status
+     *                         1: enabled
+     *                         0: disabled
+     * @return                 true if successful, otherwise false.
+     */
+    bool get_idle_mode(int *status);
 #endif
 
     /** Set Radio Access Technology on modem.
@@ -458,7 +475,11 @@
 
     /** Point to the instance of the AT parser in use.
      */
+#ifdef TARGET_UBLOX_C030_R41XM
+    UbloxATCmdParser *_at;
+#else
     ATCmdParser *_at;
+#endif
 
     /** The current AT parser timeout value.
      */