Base class for the ublox-xxx-cellular-xxx classes. Cannot be used standalone, only inherited by classes that do properly useful stuff. Or, to put it another way, if you are using any of the ublox-xxx-cellular-xxx classes, you will need this class also.
Dependents: example-ublox-cellular-interface example-ublox-cellular-driver-gen HelloMQTT example-ublox-cellular-interface_r410M ... more
Revision 25:e67d3d9d2e7e, committed 2019-05-29
- Comitter:
- wajahat.abbas@u-blox.com
- Date:
- Wed May 29 12:39:28 2019 +0500
- Parent:
- 24:e26a6ab0dd75
- Child:
- 26:e4e444cc7b14
- Commit message:
- Added support for +UPSV (idle mode) for C030_R412M
Changed in this revision
--- /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 */
--- /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
+
--- 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();
--- 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.
*/
u-blox