Axeda Corp
/
AxedaGo-ubloxC027
Axeda demo software for u-blox C027 (GSM)
Diff: C027_Support/SerialPipe.cpp
- Revision:
- 0:a725e8eab383
diff -r 000000000000 -r a725e8eab383 C027_Support/SerialPipe.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/C027_Support/SerialPipe.cpp Mon Aug 11 19:02:42 2014 +0000 @@ -0,0 +1,112 @@ +#pragma once + +#include "SerialPipe.h" + +SerialPipe::SerialPipe(PinName tx, PinName rx, int rxSize, int txSize) : + _SerialPipeBase(tx,rx), + _pipeRx( (rx!=NC) ? rxSize : 0), + _pipeTx( (tx!=NC) ? txSize : 0) +{ + if (rx!=NC) + attach(this, &SerialPipe::rxIrqBuf, RxIrq); +} + +SerialPipe::~SerialPipe(void) +{ + attach(NULL, RxIrq); + attach(NULL, TxIrq); +} + +// tx channel +int SerialPipe::writeable(void) +{ + return _pipeTx.free(); +} + +int SerialPipe::putc(int c) +{ + c = _pipeTx.putc(c); + txStart(); + return c; +} + +int SerialPipe::put(const void* buffer, int length, bool blocking) +{ + int count = length; + const char* ptr = (const char*)buffer; + if (count) + { + do + { + int written = _pipeTx.put(ptr, count, false); + if (written) { + ptr += written; + count -= written; + txStart(); + } + else if (!blocking) + break; + /* nothing / just wait */; + } + while (count); + } + return (length - count); +} + +void SerialPipe::txCopy(void) +{ + while (_SerialPipeBase::writeable() && _pipeTx.readable()) + { + char c = _pipeTx.getc(); + _SerialPipeBase::_base_putc(c); + } +} + +void SerialPipe::txIrqBuf(void) +{ + txCopy(); + // detach tx isr if we are done + if (!_pipeTx.readable()) + attach(NULL, TxIrq); +} + +void SerialPipe::txStart(void) +{ + // disable the tx isr to avoid interruption + attach(NULL, TxIrq); + txCopy(); + // attach the tx isr to handle the remaining data + if (_pipeTx.readable()) + attach(this, &SerialPipe::txIrqBuf, TxIrq); +} + +// rx channel +int SerialPipe::readable(void) +{ + return _pipeRx.readable(); +} + +int SerialPipe::getc(void) +{ + if (!_pipeRx.readable()) + return EOF; + return _pipeRx.getc(); +} + +int SerialPipe::get(void* buffer, int length, bool blocking) +{ + return _pipeRx.get((char*)buffer,length,blocking); +} + +void SerialPipe::rxIrqBuf(void) +{ + while (_SerialPipeBase::readable()) + { + char c = _SerialPipeBase::_base_getc(); + if (_pipeRx.writeable()) + _pipeRx.putc(c); + else + /* overflow */; + } +} +