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
io/MTSBufferedIO.cpp
- Committer:
- mfiore
- Date:
- 2014-09-02
- Revision:
- 152:9a2c7ed27744
- Parent:
- 141:571e0ef6c8dc
File content as of revision 152:9a2c7ed27744:
/* Universal Socket Modem Interface Library * Copyright (c) 2013 Multi-Tech Systems * * 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. */ #include "MTSBufferedIO.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(); }