drx

Revision:
25:e67d3d9d2e7e
--- /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 */