C027_SupportTest_xively_locationで使用しているC027用ライブラリ

Fork of C027_Support by u-blox

下記のプログラムC027_SupportTest_xively_locationで使用しているC027用ライブラリです。

Import programC027_SupportTest_xively_location

インターフェース2014年10月号のu-blox C027で3G通信する記事で使用したプログラム。   CQ publishing Interface 2014.10 issue, C027 3G test program.

オリジナルのライブラリは下記を参照してください。

Import libraryC027_Support

support library for C027 helper functions for Buffer Pipes, Buffered Serial Port (rtos capable) and GPS parsing. It includes modem APIs for USSD, SMS and Sockets.

SerialPipe.cpp

Committer:
mazgch
Date:
2014-05-05
Revision:
45:ebc2fd8dcf21
Parent:
35:9275215a3a5b
Child:
70:0a87d256cd24

File content as of revision 45:ebc2fd8dcf21:

#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 */;
    }
}