with 36errors

Dependencies:   MTS-Serial libxDot-dev-mbed5-deprecated

Fork of Dot-AT-Firmware by MultiTech

Revision:
9:ff62b20f7000
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ATSerial.cpp	Mon Apr 04 09:00:31 2016 -0500
@@ -0,0 +1,141 @@
+#include "mbed.h"
+#include "ATSerial.h"
+#include "MTSLog.h"
+
+using namespace mts;
+
+ATSerial::ATSerial(PinName TXD, PinName RXD, int txBufferSize, int rxBufferSize)
+    : MTSSerial(TXD, RXD, txBufferSize, rxBufferSize)
+    , _serial(new RawSerial(TXD,RXD)),
+    _baudrate(9600),
+    _bits(8),
+    _parity(mbed::SerialBase::None),
+    _stop_bits(1),
+    _last_time(0),
+    _esc_cnt(0),
+    _esc_ch('+'),
+    _escaped(false)
+{
+    timer.start();
+    _serial->attach(this, &ATSerial::handleRead, Serial::RxIrq);
+}
+
+ATSerial::~ATSerial()
+{
+    delete _serial;
+}
+
+
+
+void ATSerial::baud(int baudrate)
+{
+    _baudrate = baudrate;
+    _serial->baud(_baudrate);
+}
+
+void ATSerial::format(int bits, SerialBase::Parity parity, int stop_bits)
+{
+    _bits = bits;
+    _parity = parity;
+    _stop_bits = stop_bits;
+    _serial->format(_bits, _parity, _stop_bits);
+}
+
+void ATSerial::handleWrite()
+{
+    while(txBuffer.size() != 0) {
+        if (_serial->writeable()) {
+            char byte;
+            if(txBuffer.read(byte) == 1) {
+                _serial->attach(NULL, Serial::RxIrq);
+                _serial->putc(byte);
+                _serial->attach(this, &ATSerial::handleRead, Serial::RxIrq);
+            }
+        } else {
+            return;
+        }
+    }
+}
+
+void mts::ATSerial::reattach(PinName TXD, PinName RXD) {
+    delete _serial;
+    _serial = new RawSerial(TXD, RXD);
+    _serial->attach(this, &ATSerial::handleRead, Serial::RxIrq);
+    _serial->baud(_baudrate);
+    _serial->format(_bits, _parity, _stop_bits);
+    rxBuffer.clear();
+    txBuffer.clear();
+}
+
+void mts::ATSerial::sendBreak() {
+    _serial->send_break();
+}
+
+bool ATSerial::escaped() {
+
+    int now = timer.read_ms();
+
+    // Have we seen three esc chars and 1 sec end guard has passed
+    if (_escaped || (_esc_cnt == 3 && (now - _last_time > 1000))) {
+        _escaped = true;
+        return true;
+
+    // Have we seen a couple esc chars but nothing in 500 ms
+    } else if (_esc_cnt > 0 && _esc_cnt != 3 && now - _last_time > 500) {
+        // Write seen esc chars
+        while (_esc_cnt) {
+            rxBuffer.write(_esc_ch);
+            _esc_cnt--;
+        }
+    }
+
+    return false;
+}
+
+void ATSerial::clearEscaped() {
+    _esc_cnt = 0;
+    _escaped = false;
+}
+
+void ATSerial::handleRead()
+{
+    char byte = _serial->getc();
+    int now = timer.read_ms();
+
+    // Have we seen 3 esc chars but this char is before 1 sec end guard time
+    if (_esc_cnt == 3 && (now - _last_time < 1000)) {
+        // Write the three chars we held back
+        while (_esc_cnt) {
+            rxBuffer.write(_esc_ch);
+            _esc_cnt--;
+        }
+    } else if (byte == _esc_ch) {
+        // Has 1 second passed before last char
+        if (now - _last_time > 1000) {
+            _esc_cnt = 1;
+        // Is this second or third esc char
+        } else if (_esc_cnt > 0 && _esc_cnt < 3) {
+            _esc_cnt++;
+        }
+    } else if (_esc_cnt > 0) {
+        // Write any esc chars held back
+        while (_esc_cnt) {
+            rxBuffer.write(_esc_ch);
+            _esc_cnt--;
+        }
+    }
+
+    if(_esc_cnt == 0 && rxBuffer.write(byte) != 1) {
+        // logError("Serial Rx Byte Dropped [%c][0x%02X]", byte, byte);
+    }
+
+    _last_time = timer.read_ms();
+}
+
+void ATSerial::escapeChar(char esc) {
+    _esc_ch = esc;
+}
+
+char ATSerial::escapeChar() {
+    return _esc_ch;
+}