Serial library for MTS Socket Modem Arduino Shield devices from Multi-Tech Systems

Dependents:   mDot_AT_firmware mtsas mtsas MTDOT-EVB-LinkCheck-AL ... more

Revision:
1:d34b566d6f47
Child:
3:8e3cb3371b09
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MTSBufferedIO.cpp	Mon May 19 11:18:10 2014 -0500
@@ -0,0 +1,128 @@
+#include "MTSBufferedIO.h"
+#include "Vars.h"
+
+using namespace mts;
+
+MTSBufferedIO::MTSBufferedIO(int txBufferSize, int rxBufferSize)
+: txBuffer(txBufferSize)
+, rxBuffer(rxBufferSize)
+{
+}
+
+MTSBufferedIO::~MTSBufferedIO()
+{
+}
+
+int MTSBufferedIO::write(const char* data, int length, unsigned int timeoutMillis) 
+{
+    //Writes until empty or timeout is reached (different implementation planned once tx isr is working)
+    int bytesWritten = 0;
+    Timer tmr;
+    tmr.start();
+    length = MAX(0,length);
+    do {
+        int bytesWrittenSwBuffer = txBuffer.write(&data[bytesWritten], length - bytesWritten);
+        if(bytesWrittenSwBuffer > 0) {
+            handleWrite();
+            int bytesRemainingSwBuffer = txBuffer.size();
+            txBuffer.clear();
+            bytesWritten += (bytesWrittenSwBuffer - bytesRemainingSwBuffer);
+        }
+    } while(tmr.read_ms() <= timeoutMillis && bytesWritten < length);
+    return bytesWritten;
+}
+
+int MTSBufferedIO::write(const char* data, int length)
+{   
+    //Blocks until all bytes are written (different implementation planned once tx isr is working)
+    int bytesWritten = 0;
+    length = MAX(0,length);
+    do {
+        int bytesWrittenSwBuffer = txBuffer.write(&data[bytesWritten], length - bytesWritten);
+        handleWrite();
+        int bytesRemainingSwBuffer = txBuffer.size();
+        txBuffer.clear();
+        bytesWritten += bytesWrittenSwBuffer - bytesRemainingSwBuffer;
+    } while(bytesWritten < length);
+    return length;
+}
+
+int MTSBufferedIO::write(char data, unsigned int timeoutMillis) 
+{
+    return write(&data, 1, timeoutMillis);
+}
+
+int MTSBufferedIO::write(char data)
+{
+    return write(&data, 1);
+}
+
+int MTSBufferedIO::writeable() {
+    return txBuffer.remaining();   
+}
+
+int MTSBufferedIO::read(char* data, int length, unsigned int timeoutMillis) 
+{
+    int bytesRead = 0;
+    Timer tmr;
+    tmr.start();
+    length = MAX(0,length);
+    do {
+        bytesRead += rxBuffer.read(&data[bytesRead], length - bytesRead);
+    } while(tmr.read_ms() <= timeoutMillis && bytesRead < length);
+    return bytesRead;
+}
+
+int MTSBufferedIO::read(char* data, int length)
+{
+    int bytesRead = 0;
+    length = MAX(0,length);
+    while(bytesRead < length) {
+        bytesRead += rxBuffer.read(&data[bytesRead], length - bytesRead);
+    }
+    return length;
+}
+
+int MTSBufferedIO::read(char& data, unsigned int timeoutMillis) 
+{
+    return read(&data, 1, timeoutMillis);
+}
+
+int MTSBufferedIO::read(char& data)
+{
+    return rxBuffer.read(&data, 1);
+}
+
+int MTSBufferedIO::readable() {
+    return rxBuffer.size();   
+}
+
+bool MTSBufferedIO::txEmpty()
+{
+    return txBuffer.isEmpty();
+}
+
+bool MTSBufferedIO::rxEmpty()
+{
+    return rxBuffer.isEmpty();
+}
+
+bool MTSBufferedIO::txFull()
+{
+    return txBuffer.isFull();
+}
+
+bool MTSBufferedIO::rxFull()
+{
+    return rxBuffer.isFull();
+}
+
+void MTSBufferedIO::txClear()
+{
+    txBuffer.clear();
+}
+
+void MTSBufferedIO::rxClear()
+{
+    rxBuffer.clear();
+}