5555+

Dependencies:   RingBuffer

Fork of iSerial by BE@R lab

SerialIntr.cpp

Committer:
ykuroda
Date:
2012-08-31
Revision:
0:1d193cb1a933

File content as of revision 0:1d193cb1a933:

//
//  SerialIntr.cpp ... Serial Driver with Interrupt Rec/Send
//
//  2009.11.13 ... Originally written by Y.Kuroda for Renesas H83664
//  2012.08.31 ... Code convert for mbed in C++
//
#include "mbed.h"
#include "RingBuffer.h"
#include "SerialIntr.h"


//DigitalOut led1(LED1);
//DigitalOut led2(LED2);
//DigitalOut led3(LED3);
//DigitalOut led4(LED4);

/*
 *    Interrupt Function
 */
void
SerialIntr::rx_handler(void)
{
//    led4 = !led4;

    if(Serial::readable()){
//        led1 = !led1;
        rxbuf.save(Serial::getc());
//            led2 = !led2;
            
    }
    
    NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
}

void
SerialIntr::tx_handler(void)
{
//    led3 = !led3;

    if(writeable()){
        if(txbuf.check()){
            Serial::putc( txbuf.read() );
        }
    }
    NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
}

/*
 *  void sci_init(void)
 *
 * ポート初期化関数....すべてのI/Oの設定を行っている.
 *
 *  引数:なし
 *  戻り値:なし
 *
 */
SerialIntr::SerialIntr(PinName _tx, PinName _rx, const char *_name, int _txbufsize, int _rxbufsize)
:   Serial(_tx, _rx, _name),
    txbuf(RingBuffer(_txbufsize)),
    rxbuf(RingBuffer(_rxbufsize))
{
    __disable_irq();

    attach(this, &SerialIntr::tx_handler, Serial::TxIrq);
    attach(this, &SerialIntr::rx_handler, Serial::RxIrq);

//  format(8,Serial::None,1);   // default
//  baud(baudrate);

    __enable_irq();
    NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
}

/*
 *  シリアル入力に文字があるかどうかチェック
 *  返値:    バッファにある文字数
 */
int
SerialIntr::readable(void)
{
    return rxbuf.check();
}

/*
 *  シリアルから一文字入力
 *    --- 文字入力を待つ
 */
int
SerialIntr::getc(void)
{
    unsigned short int c;

    while(!rxbuf.check());
    c = rxbuf.read();

    return c;
}


/*
 * シリアルへ一文字出力
 */
void
SerialIntr::putc(short ch)
{
    if(txbuf.check()==0 && Serial::writeable()){
        Serial::putc(ch);
        
    } else {
        while(txbuf.full());
        txbuf.save(ch);
        NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
    }
}

/*
 * シリアルへ文字列を出力
 *  注:一回の最大文字数はLINESIZE
 *  注:文字列の終わりにはヌル文字が必要.
 *
 *  引数:文字列へのポインタ
 *  返値:出力した文字数
 */
short int
SerialIntr::putstr(const char* s)
{
    int i=0;
    for(; ; i++){
        if(*s==0) break;
        putc(*s++);
    }
    return i;
}

/* short int sci_puts(char* s)
 * シリアルへ文字列を一行出力
 *  注:最後に改行コードを送る他はsci_putstrと同じ
 *
 *  引数:文字列へのポインタ
 *  返値:出力した文字数
 */
short int
SerialIntr::puts(const char* s)
{
    short int n = putstr(s);
    putc(CR);
    putc(LF);
    return n;
}