A library for talking to Multi-Tech's Cellular SocketModem Devices.

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
sgodinez
Date:
Fri Dec 27 20:54:26 2013 +0000
Revision:
91:9439ad14d7f0
Parent:
86:186bbf974c7c
Child:
110:8f3149c99112
fixed blocking and non-blocking read/write calls.  Fixed sendCmd to allow read() to timeout.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jengbrecht 0:563b70517320 1 #include "MTSBufferedIO.h"
jengbrecht 0:563b70517320 2
mfiore 39:6e94520a3217 3 using namespace mts;
mfiore 39:6e94520a3217 4
jengbrecht 0:563b70517320 5 MTSBufferedIO::MTSBufferedIO(int txBufferSize, int rxBufferSize)
sgodinez 86:186bbf974c7c 6 : txBuffer(txBufferSize)
sgodinez 86:186bbf974c7c 7 , rxBuffer(rxBufferSize)
jengbrecht 0:563b70517320 8 {
sgodinez 86:186bbf974c7c 9
jengbrecht 0:563b70517320 10 }
jengbrecht 0:563b70517320 11
jengbrecht 0:563b70517320 12 MTSBufferedIO::~MTSBufferedIO()
jengbrecht 0:563b70517320 13 {
sgodinez 86:186bbf974c7c 14
jengbrecht 0:563b70517320 15 }
jengbrecht 0:563b70517320 16
sgodinez 68:c490e4a51778 17 int MTSBufferedIO::write(const char* data, int length, unsigned int timeoutMillis)
sgodinez 68:c490e4a51778 18 {
sgodinez 91:9439ad14d7f0 19 //Writes until empty or timeout is reached (different implementation planned once tx isr is working)
sgodinez 68:c490e4a51778 20 int bytesWritten = 0;
sgodinez 68:c490e4a51778 21 Timer tmr;
sgodinez 68:c490e4a51778 22 tmr.start();
sgodinez 68:c490e4a51778 23 do {
sgodinez 91:9439ad14d7f0 24 int bytesWrittenSwBuffer = txBuffer.write(&data[bytesWritten], length - bytesWritten);
sgodinez 91:9439ad14d7f0 25 if(bytesWrittenSwBuffer > 0) {
sgodinez 91:9439ad14d7f0 26 handleWrite();
sgodinez 91:9439ad14d7f0 27 int bytesRemainingSwBuffer = txBuffer.size();
sgodinez 91:9439ad14d7f0 28 txBuffer.clear();
sgodinez 91:9439ad14d7f0 29 bytesWritten += (bytesWrittenSwBuffer - bytesRemainingSwBuffer);
sgodinez 91:9439ad14d7f0 30 }
sgodinez 68:c490e4a51778 31 } while(tmr.read_ms() <= timeoutMillis && bytesWritten < length);
sgodinez 68:c490e4a51778 32 return bytesWritten;
sgodinez 68:c490e4a51778 33 }
sgodinez 68:c490e4a51778 34
sgodinez 41:81d035fb0b6a 35 int MTSBufferedIO::write(const char* data, int length)
sgodinez 91:9439ad14d7f0 36 {
sgodinez 91:9439ad14d7f0 37 //Blocks until all bytes are written (different implementation planned once tx isr is working)
sgodinez 91:9439ad14d7f0 38 int bytesWritten = 0;
sgodinez 91:9439ad14d7f0 39 do {
sgodinez 91:9439ad14d7f0 40 int bytesWrittenSwBuffer = txBuffer.write(&data[bytesWritten], length - bytesWritten);
sgodinez 91:9439ad14d7f0 41 handleWrite();
sgodinez 91:9439ad14d7f0 42 int bytesRemainingSwBuffer = txBuffer.size();
sgodinez 91:9439ad14d7f0 43 txBuffer.clear();
sgodinez 91:9439ad14d7f0 44 bytesWritten += bytesWrittenSwBuffer - bytesRemainingSwBuffer;
sgodinez 91:9439ad14d7f0 45 } while(bytesWritten < length);
sgodinez 91:9439ad14d7f0 46 return length;
jengbrecht 0:563b70517320 47 }
jengbrecht 0:563b70517320 48
sgodinez 68:c490e4a51778 49 int MTSBufferedIO::write(char data, unsigned int timeoutMillis)
sgodinez 68:c490e4a51778 50 {
sgodinez 68:c490e4a51778 51 return write(&data, 1, timeoutMillis);
sgodinez 68:c490e4a51778 52 }
sgodinez 68:c490e4a51778 53
jengbrecht 0:563b70517320 54 int MTSBufferedIO::write(char data)
jengbrecht 0:563b70517320 55 {
sgodinez 91:9439ad14d7f0 56 return write(&data, 1);
jengbrecht 0:563b70517320 57 }
jengbrecht 0:563b70517320 58
sgodinez 17:2d7c4ea7491b 59 int MTSBufferedIO::writeable() {
sgodinez 86:186bbf974c7c 60 return txBuffer.remaining();
sgodinez 17:2d7c4ea7491b 61 }
sgodinez 17:2d7c4ea7491b 62
sgodinez 68:c490e4a51778 63 int MTSBufferedIO::read(char* data, int length, unsigned int timeoutMillis)
sgodinez 68:c490e4a51778 64 {
sgodinez 68:c490e4a51778 65 int bytesRead = 0;
sgodinez 68:c490e4a51778 66 Timer tmr;
sgodinez 68:c490e4a51778 67 tmr.start();
sgodinez 68:c490e4a51778 68 do {
sgodinez 91:9439ad14d7f0 69 bytesRead += rxBuffer.read(&data[bytesRead], length - bytesRead);
sgodinez 68:c490e4a51778 70 } while(tmr.read_ms() <= timeoutMillis && bytesRead < length);
sgodinez 68:c490e4a51778 71 return bytesRead;
sgodinez 68:c490e4a51778 72 }
sgodinez 68:c490e4a51778 73
jengbrecht 0:563b70517320 74 int MTSBufferedIO::read(char* data, int length)
jengbrecht 0:563b70517320 75 {
sgodinez 91:9439ad14d7f0 76 int bytesRead = 0;
sgodinez 91:9439ad14d7f0 77 while(bytesRead < length) {
sgodinez 91:9439ad14d7f0 78 bytesRead += rxBuffer.read(&data[bytesRead], length - bytesRead);
sgodinez 91:9439ad14d7f0 79 }
sgodinez 91:9439ad14d7f0 80 return length;
jengbrecht 0:563b70517320 81 }
jengbrecht 0:563b70517320 82
sgodinez 68:c490e4a51778 83 int MTSBufferedIO::read(char& data, unsigned int timeoutMillis)
sgodinez 68:c490e4a51778 84 {
sgodinez 68:c490e4a51778 85 return read(&data, 1, timeoutMillis);
sgodinez 68:c490e4a51778 86 }
sgodinez 68:c490e4a51778 87
sgodinez 17:2d7c4ea7491b 88 int MTSBufferedIO::read(char& data)
jengbrecht 0:563b70517320 89 {
sgodinez 91:9439ad14d7f0 90 return rxBuffer.read(&data, 1);
sgodinez 17:2d7c4ea7491b 91 }
sgodinez 17:2d7c4ea7491b 92
sgodinez 17:2d7c4ea7491b 93 int MTSBufferedIO::readable() {
sgodinez 86:186bbf974c7c 94 return rxBuffer.size();
jengbrecht 0:563b70517320 95 }
jengbrecht 0:563b70517320 96
jengbrecht 0:563b70517320 97 bool MTSBufferedIO::txEmpty()
jengbrecht 0:563b70517320 98 {
sgodinez 86:186bbf974c7c 99 return txBuffer.isEmpty();
jengbrecht 0:563b70517320 100 }
jengbrecht 0:563b70517320 101
jengbrecht 0:563b70517320 102 bool MTSBufferedIO::rxEmpty()
jengbrecht 0:563b70517320 103 {
sgodinez 86:186bbf974c7c 104 return rxBuffer.isEmpty();
jengbrecht 0:563b70517320 105 }
jengbrecht 0:563b70517320 106
jengbrecht 0:563b70517320 107 bool MTSBufferedIO::txFull()
jengbrecht 0:563b70517320 108 {
sgodinez 86:186bbf974c7c 109 return txBuffer.isFull();
jengbrecht 0:563b70517320 110 }
jengbrecht 0:563b70517320 111
jengbrecht 0:563b70517320 112 bool MTSBufferedIO::rxFull()
jengbrecht 0:563b70517320 113 {
sgodinez 86:186bbf974c7c 114 return rxBuffer.isFull();
jengbrecht 0:563b70517320 115 }
jengbrecht 0:563b70517320 116
jengbrecht 0:563b70517320 117 void MTSBufferedIO::txClear()
jengbrecht 0:563b70517320 118 {
sgodinez 86:186bbf974c7c 119 txBuffer.clear();
jengbrecht 0:563b70517320 120 }
jengbrecht 0:563b70517320 121
jengbrecht 0:563b70517320 122 void MTSBufferedIO::rxClear()
jengbrecht 0:563b70517320 123 {
sgodinez 86:186bbf974c7c 124 rxBuffer.clear();
sgodinez 84:77c5ab16534d 125 }