Multi-Hackers / SocketModem

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

io/MTSBufferedIO.cpp

Committer:
jengbrecht
Date:
2013-12-26
Revision:
77:d7b14688a704
Parent:
68:c490e4a51778
Child:
84:77c5ab16534d

File content as of revision 77:d7b14688a704:

#ifndef MTSBUFFEREDIO_CPP
#define MTSBUFFEREDIO_CPP

#include "MTSBufferedIO.h"

using namespace mts;

MTSBufferedIO::MTSBufferedIO(int txBufferSize, int rxBufferSize)
{
    txBuffer = new MTSCircularBuffer(txBufferSize);
    rxBuffer = new MTSCircularBuffer(rxBufferSize);
}

MTSBufferedIO::~MTSBufferedIO()
{
    delete txBuffer;
    delete rxBuffer;
}

int MTSBufferedIO::write(const char* data, int length, unsigned int timeoutMillis) 
{
    int bytesWritten = 0;
    Timer tmr;
    tmr.start();
    do {
        bytesWritten += write(&data[bytesWritten], length - bytesWritten);
    } while(tmr.read_ms() <= timeoutMillis && bytesWritten < length);
    return bytesWritten;
}

int MTSBufferedIO::write(const char* data, int length)
{
    //Once tx irq is working, we can remove bytesWrittenSwBuffer, bytesRemainingSwBuffer, and actuallyWritten
    //b/c tx buffer will be emptied async
    int bytesWrittenSwBuffer = txBuffer->write(data, length);
    handleWrite();
    int bytesRemainingSwBuffer = txBuffer->size();
    txBuffer->clear();
    int actualWritten = bytesWrittenSwBuffer - bytesRemainingSwBuffer;
    //if(actualWritten) {
//        printf("BYTES ACTUALLY WRITTEN [%d]\r\n", actualWritten);
//    }
    return actualWritten;
}

int MTSBufferedIO::write(char data, unsigned int timeoutMillis) 
{
    return write(&data, 1, timeoutMillis);
}

int MTSBufferedIO::write(char data)
{
    if(txBuffer->write(data)) {
        handleWrite();
        return 1;
    }
    return 0;
}

int MTSBufferedIO::writeable() {
    return txBuffer->remaining();   
}

int MTSBufferedIO::read(char* data, int length, unsigned int timeoutMillis) 
{
    int bytesRead = 0;
    Timer tmr;
    tmr.start();
    do {
        bytesRead += read(&data[bytesRead], length - bytesRead);
    } while(tmr.read_ms() <= timeoutMillis && bytesRead < length);
    return bytesRead;
}

int MTSBufferedIO::read(char* data, int length)
{
    return rxBuffer->read(data, length);
}

int MTSBufferedIO::read(char& data, unsigned int timeoutMillis) 
{
    return read(&data, 1, timeoutMillis);
}

int MTSBufferedIO::read(char& data)
{
    return rxBuffer->read(data);
}

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();
}

#endif /* MTSBUFFEREDSERIAL_CPP */