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

Committer:
ntaka206
Date:
Wed Jun 04 02:37:42 2014 +0000
Revision:
0:1ababa0d0c42
Initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ntaka206 0:1ababa0d0c42 1 #pragma once
ntaka206 0:1ababa0d0c42 2
ntaka206 0:1ababa0d0c42 3 #include "SerialPipe.h"
ntaka206 0:1ababa0d0c42 4
ntaka206 0:1ababa0d0c42 5 SerialPipe::SerialPipe(PinName tx, PinName rx, int rxSize, int txSize)
ntaka206 0:1ababa0d0c42 6 : _SerialPipeBase(tx,rx), _pipeRx(rxSize), _pipeTx(txSize)
ntaka206 0:1ababa0d0c42 7 {
ntaka206 0:1ababa0d0c42 8 attach(this, &SerialPipe::rxIrqBuf, RxIrq);
ntaka206 0:1ababa0d0c42 9 #if defined(TARGET_UBLOX_C027) || defined(TARGET_LPC1768)
ntaka206 0:1ababa0d0c42 10 // the lpc1768 supports interrupt driven tx
ntaka206 0:1ababa0d0c42 11 attach(this, &SerialPipe::txIrqBuf, TxIrq);
ntaka206 0:1ababa0d0c42 12 #endif
ntaka206 0:1ababa0d0c42 13 }
ntaka206 0:1ababa0d0c42 14
ntaka206 0:1ababa0d0c42 15 SerialPipe::~SerialPipe(void)
ntaka206 0:1ababa0d0c42 16 {
ntaka206 0:1ababa0d0c42 17 attach(NULL, RxIrq);
ntaka206 0:1ababa0d0c42 18 #if defined(TARGET_UBLOX_C027) || defined(TARGET_LPC1768)
ntaka206 0:1ababa0d0c42 19 attach(NULL, TxIrq);
ntaka206 0:1ababa0d0c42 20 #endif
ntaka206 0:1ababa0d0c42 21 }
ntaka206 0:1ababa0d0c42 22
ntaka206 0:1ababa0d0c42 23 // tx channel
ntaka206 0:1ababa0d0c42 24 int SerialPipe::writeable(void)
ntaka206 0:1ababa0d0c42 25 {
ntaka206 0:1ababa0d0c42 26 return _pipeTx.free();
ntaka206 0:1ababa0d0c42 27 }
ntaka206 0:1ababa0d0c42 28
ntaka206 0:1ababa0d0c42 29 int SerialPipe::putc(int c)
ntaka206 0:1ababa0d0c42 30 {
ntaka206 0:1ababa0d0c42 31 c = _pipeTx.putc(c);
ntaka206 0:1ababa0d0c42 32 txStart();
ntaka206 0:1ababa0d0c42 33 return c;
ntaka206 0:1ababa0d0c42 34 }
ntaka206 0:1ababa0d0c42 35
ntaka206 0:1ababa0d0c42 36 int SerialPipe::put(const void* buffer, int length, bool blocking)
ntaka206 0:1ababa0d0c42 37 {
ntaka206 0:1ababa0d0c42 38 int count = length;
ntaka206 0:1ababa0d0c42 39 const char* ptr = (const char*)buffer;
ntaka206 0:1ababa0d0c42 40 if (count)
ntaka206 0:1ababa0d0c42 41 {
ntaka206 0:1ababa0d0c42 42 do
ntaka206 0:1ababa0d0c42 43 {
ntaka206 0:1ababa0d0c42 44 int written = _pipeTx.put(ptr, count, false);
ntaka206 0:1ababa0d0c42 45 ptr += written;
ntaka206 0:1ababa0d0c42 46 count -= written;
ntaka206 0:1ababa0d0c42 47 txStart();
ntaka206 0:1ababa0d0c42 48 }
ntaka206 0:1ababa0d0c42 49 while (count && blocking);
ntaka206 0:1ababa0d0c42 50 }
ntaka206 0:1ababa0d0c42 51 return (length - count);
ntaka206 0:1ababa0d0c42 52 }
ntaka206 0:1ababa0d0c42 53
ntaka206 0:1ababa0d0c42 54 void SerialPipe::txIrqBuf(void)
ntaka206 0:1ababa0d0c42 55 {
ntaka206 0:1ababa0d0c42 56 while (_SerialPipeBase::writeable() && _pipeTx.readable())
ntaka206 0:1ababa0d0c42 57 {
ntaka206 0:1ababa0d0c42 58 char c = _pipeTx.getc();
ntaka206 0:1ababa0d0c42 59 _SerialPipeBase::_base_putc(c);
ntaka206 0:1ababa0d0c42 60 }
ntaka206 0:1ababa0d0c42 61 }
ntaka206 0:1ababa0d0c42 62
ntaka206 0:1ababa0d0c42 63 void SerialPipe::txStart(void)
ntaka206 0:1ababa0d0c42 64 {
ntaka206 0:1ababa0d0c42 65 #if defined(TARGET_UBLOX_C027) || defined(TARGET_LPC1768)
ntaka206 0:1ababa0d0c42 66 __disable_irq();
ntaka206 0:1ababa0d0c42 67 txIrqBuf();
ntaka206 0:1ababa0d0c42 68 __enable_irq();
ntaka206 0:1ababa0d0c42 69 #else
ntaka206 0:1ababa0d0c42 70 while (_pipeTx.readable())
ntaka206 0:1ababa0d0c42 71 {
ntaka206 0:1ababa0d0c42 72 char c = _pipeTx.getc();
ntaka206 0:1ababa0d0c42 73 while (!_SerialPipeBase::writeable())
ntaka206 0:1ababa0d0c42 74 /*wait*/;
ntaka206 0:1ababa0d0c42 75 _SerialPipeBase::_base_putc(c);
ntaka206 0:1ababa0d0c42 76 }
ntaka206 0:1ababa0d0c42 77 #endif
ntaka206 0:1ababa0d0c42 78 }
ntaka206 0:1ababa0d0c42 79
ntaka206 0:1ababa0d0c42 80 // rx channel
ntaka206 0:1ababa0d0c42 81 int SerialPipe::readable(void)
ntaka206 0:1ababa0d0c42 82 {
ntaka206 0:1ababa0d0c42 83 return _pipeRx.readable();
ntaka206 0:1ababa0d0c42 84 }
ntaka206 0:1ababa0d0c42 85
ntaka206 0:1ababa0d0c42 86 int SerialPipe::getc(void)
ntaka206 0:1ababa0d0c42 87 {
ntaka206 0:1ababa0d0c42 88 if (!_pipeRx.readable())
ntaka206 0:1ababa0d0c42 89 return EOF;
ntaka206 0:1ababa0d0c42 90 return _pipeRx.getc();
ntaka206 0:1ababa0d0c42 91 }
ntaka206 0:1ababa0d0c42 92
ntaka206 0:1ababa0d0c42 93 int SerialPipe::get(void* buffer, int length, bool blocking)
ntaka206 0:1ababa0d0c42 94 {
ntaka206 0:1ababa0d0c42 95 return _pipeRx.get((char*)buffer,length,blocking);
ntaka206 0:1ababa0d0c42 96 }
ntaka206 0:1ababa0d0c42 97
ntaka206 0:1ababa0d0c42 98 void SerialPipe::rxIrqBuf(void)
ntaka206 0:1ababa0d0c42 99 {
ntaka206 0:1ababa0d0c42 100 while (_SerialPipeBase::readable())
ntaka206 0:1ababa0d0c42 101 {
ntaka206 0:1ababa0d0c42 102 char c = _SerialPipeBase::_base_getc();
ntaka206 0:1ababa0d0c42 103 if (_pipeRx.writeable())
ntaka206 0:1ababa0d0c42 104 _pipeRx.putc(c);
ntaka206 0:1ababa0d0c42 105 else
ntaka206 0:1ababa0d0c42 106 /* overflow */;
ntaka206 0:1ababa0d0c42 107 }
ntaka206 0:1ababa0d0c42 108 }
ntaka206 0:1ababa0d0c42 109