5555+

Dependencies:   RingBuffer

Fork of iSerial by BE@R lab

Revision:
2:3fc74f4d685a
Parent:
0:1d193cb1a933
Child:
3:d5353b68105f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iSerial.cpp	Fri Aug 31 17:32:00 2012 +0000
@@ -0,0 +1,138 @@
+//
+//  iSerial.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 "iSerial.h"
+
+
+/*
+ *    Interrupt Function
+ */
+void
+ISerial::rx_handler(void)
+{
+    if(Serial::readable()){
+        rxbuf.save(Serial::getc());
+    }
+
+    NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
+}
+
+void
+ISerial::tx_handler(void)
+{
+    if(Serial::writeable()){
+        if(txbuf.check()){
+            Serial::putc( txbuf.read() );
+        }
+    }
+    NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
+}
+
+/*
+ *  void sci_init(void)
+ *
+ * ポート初期化関数....すべてのI/Oの設定を行っている.
+ *
+ *  引数:なし
+ *  戻り値:なし
+ *
+ */
+ISerial::ISerial(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, &ISerial::tx_handler, Serial::TxIrq);
+    attach(this, &ISerial::rx_handler, Serial::RxIrq);
+
+//  format(8,Serial::None,1);   // default
+//  baud(baudrate);
+
+    __enable_irq();
+    NVIC_EnableIRQ(UART_IRQn); // UART1_IRQn);
+}
+
+/*
+ *  シリアル入力に文字があるかどうかチェック
+ *  返値:    バッファにある文字数
+ */
+int
+ISerial::readable(void)
+{
+    return rxbuf.check();
+}
+
+/*
+ *  シリアルから一文字入力
+ *    --- 文字入力を待つ
+ */
+int
+ISerial::getc(void)
+{
+    unsigned short int c;
+
+    while(!rxbuf.check());
+    c = rxbuf.read();
+
+    return c;
+}
+
+
+/*
+ * シリアルへ一文字出力
+ */
+void
+ISerial::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
+ISerial::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
+ISerial::puts(const char* s)
+{
+    short int n = putstr(s);
+    putc(CR);
+    putc(LF);
+    return n;
+}
+