CQ出版 Interface 2014年10月号のC027(MAX7-Q)GPSテスト記事のプログラム。 CQ publishing Interface 2014.10 issue, C027 GPS(MAX-7Q) test program.
Dependencies: C027 C027_Support mbed
Diff: C027_Support/SerialPipe.cpp
- Revision:
- 0:1ababa0d0c42
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/C027_Support/SerialPipe.cpp Wed Jun 04 02:37:42 2014 +0000 @@ -0,0 +1,109 @@ +#pragma once + +#include "SerialPipe.h" + +SerialPipe::SerialPipe(PinName tx, PinName rx, int rxSize, int txSize) + : _SerialPipeBase(tx,rx), _pipeRx(rxSize), _pipeTx(txSize) +{ + attach(this, &SerialPipe::rxIrqBuf, RxIrq); +#if defined(TARGET_UBLOX_C027) || defined(TARGET_LPC1768) + // the lpc1768 supports interrupt driven tx + attach(this, &SerialPipe::txIrqBuf, TxIrq); +#endif +} + +SerialPipe::~SerialPipe(void) +{ + attach(NULL, RxIrq); +#if defined(TARGET_UBLOX_C027) || defined(TARGET_LPC1768) + attach(NULL, TxIrq); +#endif +} + +// 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); + ptr += written; + count -= written; + txStart(); + } + while (count && blocking); + } + return (length - count); +} + +void SerialPipe::txIrqBuf(void) +{ + while (_SerialPipeBase::writeable() && _pipeTx.readable()) + { + char c = _pipeTx.getc(); + _SerialPipeBase::_base_putc(c); + } +} + +void SerialPipe::txStart(void) +{ +#if defined(TARGET_UBLOX_C027) || defined(TARGET_LPC1768) + __disable_irq(); + txIrqBuf(); + __enable_irq(); +#else + while (_pipeTx.readable()) + { + char c = _pipeTx.getc(); + while (!_SerialPipeBase::writeable()) + /*wait*/; + _SerialPipeBase::_base_putc(c); + } +#endif +} + +// 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 */; + } +} +