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:
Tue Dec 31 17:30:07 2013 +0000
Revision:
110:8f3149c99112
Parent:
91:9439ad14d7f0
Child:
141:571e0ef6c8dc
Improved robustness of close() call

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 110:8f3149c99112 23 length = MAX(0,length);
sgodinez 68:c490e4a51778 24 do {
sgodinez 91:9439ad14d7f0 25 int bytesWrittenSwBuffer = txBuffer.write(&data[bytesWritten], length - bytesWritten);
sgodinez 91:9439ad14d7f0 26 if(bytesWrittenSwBuffer > 0) {
sgodinez 91:9439ad14d7f0 27 handleWrite();
sgodinez 91:9439ad14d7f0 28 int bytesRemainingSwBuffer = txBuffer.size();
sgodinez 91:9439ad14d7f0 29 txBuffer.clear();
sgodinez 91:9439ad14d7f0 30 bytesWritten += (bytesWrittenSwBuffer - bytesRemainingSwBuffer);
sgodinez 91:9439ad14d7f0 31 }
sgodinez 68:c490e4a51778 32 } while(tmr.read_ms() <= timeoutMillis && bytesWritten < length);
sgodinez 68:c490e4a51778 33 return bytesWritten;
sgodinez 68:c490e4a51778 34 }
sgodinez 68:c490e4a51778 35
sgodinez 41:81d035fb0b6a 36 int MTSBufferedIO::write(const char* data, int length)
sgodinez 91:9439ad14d7f0 37 {
sgodinez 91:9439ad14d7f0 38 //Blocks until all bytes are written (different implementation planned once tx isr is working)
sgodinez 91:9439ad14d7f0 39 int bytesWritten = 0;
sgodinez 110:8f3149c99112 40 length = MAX(0,length);
sgodinez 91:9439ad14d7f0 41 do {
sgodinez 91:9439ad14d7f0 42 int bytesWrittenSwBuffer = txBuffer.write(&data[bytesWritten], length - bytesWritten);
sgodinez 91:9439ad14d7f0 43 handleWrite();
sgodinez 91:9439ad14d7f0 44 int bytesRemainingSwBuffer = txBuffer.size();
sgodinez 91:9439ad14d7f0 45 txBuffer.clear();
sgodinez 91:9439ad14d7f0 46 bytesWritten += bytesWrittenSwBuffer - bytesRemainingSwBuffer;
sgodinez 91:9439ad14d7f0 47 } while(bytesWritten < length);
sgodinez 91:9439ad14d7f0 48 return length;
jengbrecht 0:563b70517320 49 }
jengbrecht 0:563b70517320 50
sgodinez 68:c490e4a51778 51 int MTSBufferedIO::write(char data, unsigned int timeoutMillis)
sgodinez 68:c490e4a51778 52 {
sgodinez 68:c490e4a51778 53 return write(&data, 1, timeoutMillis);
sgodinez 68:c490e4a51778 54 }
sgodinez 68:c490e4a51778 55
jengbrecht 0:563b70517320 56 int MTSBufferedIO::write(char data)
jengbrecht 0:563b70517320 57 {
sgodinez 91:9439ad14d7f0 58 return write(&data, 1);
jengbrecht 0:563b70517320 59 }
jengbrecht 0:563b70517320 60
sgodinez 17:2d7c4ea7491b 61 int MTSBufferedIO::writeable() {
sgodinez 86:186bbf974c7c 62 return txBuffer.remaining();
sgodinez 17:2d7c4ea7491b 63 }
sgodinez 17:2d7c4ea7491b 64
sgodinez 68:c490e4a51778 65 int MTSBufferedIO::read(char* data, int length, unsigned int timeoutMillis)
sgodinez 68:c490e4a51778 66 {
sgodinez 68:c490e4a51778 67 int bytesRead = 0;
sgodinez 68:c490e4a51778 68 Timer tmr;
sgodinez 68:c490e4a51778 69 tmr.start();
sgodinez 110:8f3149c99112 70 length = MAX(0,length);
sgodinez 68:c490e4a51778 71 do {
sgodinez 91:9439ad14d7f0 72 bytesRead += rxBuffer.read(&data[bytesRead], length - bytesRead);
sgodinez 68:c490e4a51778 73 } while(tmr.read_ms() <= timeoutMillis && bytesRead < length);
sgodinez 68:c490e4a51778 74 return bytesRead;
sgodinez 68:c490e4a51778 75 }
sgodinez 68:c490e4a51778 76
jengbrecht 0:563b70517320 77 int MTSBufferedIO::read(char* data, int length)
jengbrecht 0:563b70517320 78 {
sgodinez 91:9439ad14d7f0 79 int bytesRead = 0;
sgodinez 110:8f3149c99112 80 length = MAX(0,length);
sgodinez 91:9439ad14d7f0 81 while(bytesRead < length) {
sgodinez 91:9439ad14d7f0 82 bytesRead += rxBuffer.read(&data[bytesRead], length - bytesRead);
sgodinez 91:9439ad14d7f0 83 }
sgodinez 91:9439ad14d7f0 84 return length;
jengbrecht 0:563b70517320 85 }
jengbrecht 0:563b70517320 86
sgodinez 68:c490e4a51778 87 int MTSBufferedIO::read(char& data, unsigned int timeoutMillis)
sgodinez 68:c490e4a51778 88 {
sgodinez 68:c490e4a51778 89 return read(&data, 1, timeoutMillis);
sgodinez 68:c490e4a51778 90 }
sgodinez 68:c490e4a51778 91
sgodinez 17:2d7c4ea7491b 92 int MTSBufferedIO::read(char& data)
jengbrecht 0:563b70517320 93 {
sgodinez 91:9439ad14d7f0 94 return rxBuffer.read(&data, 1);
sgodinez 17:2d7c4ea7491b 95 }
sgodinez 17:2d7c4ea7491b 96
sgodinez 17:2d7c4ea7491b 97 int MTSBufferedIO::readable() {
sgodinez 86:186bbf974c7c 98 return rxBuffer.size();
jengbrecht 0:563b70517320 99 }
jengbrecht 0:563b70517320 100
jengbrecht 0:563b70517320 101 bool MTSBufferedIO::txEmpty()
jengbrecht 0:563b70517320 102 {
sgodinez 86:186bbf974c7c 103 return txBuffer.isEmpty();
jengbrecht 0:563b70517320 104 }
jengbrecht 0:563b70517320 105
jengbrecht 0:563b70517320 106 bool MTSBufferedIO::rxEmpty()
jengbrecht 0:563b70517320 107 {
sgodinez 86:186bbf974c7c 108 return rxBuffer.isEmpty();
jengbrecht 0:563b70517320 109 }
jengbrecht 0:563b70517320 110
jengbrecht 0:563b70517320 111 bool MTSBufferedIO::txFull()
jengbrecht 0:563b70517320 112 {
sgodinez 86:186bbf974c7c 113 return txBuffer.isFull();
jengbrecht 0:563b70517320 114 }
jengbrecht 0:563b70517320 115
jengbrecht 0:563b70517320 116 bool MTSBufferedIO::rxFull()
jengbrecht 0:563b70517320 117 {
sgodinez 86:186bbf974c7c 118 return rxBuffer.isFull();
jengbrecht 0:563b70517320 119 }
jengbrecht 0:563b70517320 120
jengbrecht 0:563b70517320 121 void MTSBufferedIO::txClear()
jengbrecht 0:563b70517320 122 {
sgodinez 86:186bbf974c7c 123 txBuffer.clear();
jengbrecht 0:563b70517320 124 }
jengbrecht 0:563b70517320 125
jengbrecht 0:563b70517320 126 void MTSBufferedIO::rxClear()
jengbrecht 0:563b70517320 127 {
sgodinez 86:186bbf974c7c 128 rxBuffer.clear();
sgodinez 84:77c5ab16534d 129 }