Akinori Hashimoto / HC05

Dependencies:   RingBuffer

Dependents:   semaforinoprova

Committer:
AkinoriHashimoto
Date:
Mon Nov 02 07:19:11 2015 +0000
Revision:
4:488e26ebc411
Parent:
3:df094ed45a88
Include Ring Buffer for with using RTOS.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AkinoriHashimoto 0:a4ddaf82d43d 1 #include "HC05.h"
AkinoriHashimoto 0:a4ddaf82d43d 2
AkinoriHashimoto 1:75bb445594e2 3 HC05::HC05(PinName TX, PinName RX)
AkinoriHashimoto 1:75bb445594e2 4 : hc05(TX, RX)
AkinoriHashimoto 0:a4ddaf82d43d 5 {
AkinoriHashimoto 1:75bb445594e2 6 }
AkinoriHashimoto 1:75bb445594e2 7 void HC05::init(int baudrate, int bit, int parity, int stop, bool CRLN)
AkinoriHashimoto 1:75bb445594e2 8 {
AkinoriHashimoto 0:a4ddaf82d43d 9 hc05.baud(baudrate);
AkinoriHashimoto 0:a4ddaf82d43d 10
AkinoriHashimoto 0:a4ddaf82d43d 11 // 力技
AkinoriHashimoto 0:a4ddaf82d43d 12 if (parity == SerialBase::Odd)
AkinoriHashimoto 0:a4ddaf82d43d 13 hc05.format(bit, SerialBase::Odd, stop);
AkinoriHashimoto 0:a4ddaf82d43d 14 else if (parity == SerialBase::Even)
AkinoriHashimoto 0:a4ddaf82d43d 15 hc05.format(bit, SerialBase::Even, stop); // 8bit, NonParity, 1stopbit
AkinoriHashimoto 0:a4ddaf82d43d 16 else// if (parity == SerialBase::None)
AkinoriHashimoto 0:a4ddaf82d43d 17 hc05.format(bit, SerialBase::None, stop); // 8bit, NonParity, 1stopbit
AkinoriHashimoto 0:a4ddaf82d43d 18
AkinoriHashimoto 3:df094ed45a88 19 // attach rxIrq. because, rx buf of serial equals to 16 Bytes.
AkinoriHashimoto 3:df094ed45a88 20 this->hc05.attach(this, &HC05::_readIrq, Serial::RxIrq);
AkinoriHashimoto 3:df094ed45a88 21
AkinoriHashimoto 0:a4ddaf82d43d 22 CR= '\r';
AkinoriHashimoto 0:a4ddaf82d43d 23 if(CRLN)
AkinoriHashimoto 0:a4ddaf82d43d 24 CR= "\r\n";
AkinoriHashimoto 1:75bb445594e2 25 return;
AkinoriHashimoto 0:a4ddaf82d43d 26 }
AkinoriHashimoto 0:a4ddaf82d43d 27
AkinoriHashimoto 4:488e26ebc411 28 void HC05::setAttachRx(void (*fptr)(char))
AkinoriHashimoto 2:931bef8c7fac 29 {
AkinoriHashimoto 4:488e26ebc411 30 // Serial.attachから呼ばれる_readIrq()内から、fptrをCall.
AkinoriHashimoto 3:df094ed45a88 31 fptrRxIrq= fptr;
AkinoriHashimoto 2:931bef8c7fac 32 return;
AkinoriHashimoto 2:931bef8c7fac 33 }
AkinoriHashimoto 2:931bef8c7fac 34
AkinoriHashimoto 1:75bb445594e2 35 bool HC05::readable()
AkinoriHashimoto 1:75bb445594e2 36 {
AkinoriHashimoto 4:488e26ebc411 37 return hc05.readable() || !ringBuf.empty();
AkinoriHashimoto 3:df094ed45a88 38 }
AkinoriHashimoto 3:df094ed45a88 39
AkinoriHashimoto 3:df094ed45a88 40 string HC05::read() // public:
AkinoriHashimoto 3:df094ed45a88 41 {
AkinoriHashimoto 3:df094ed45a88 42 _read();
AkinoriHashimoto 4:488e26ebc411 43 if(ringBuf.empty())
AkinoriHashimoto 3:df094ed45a88 44 return "";
AkinoriHashimoto 4:488e26ebc411 45 return ringBuf.get();
AkinoriHashimoto 1:75bb445594e2 46 }
AkinoriHashimoto 0:a4ddaf82d43d 47
AkinoriHashimoto 3:df094ed45a88 48 string HC05::getLine()
AkinoriHashimoto 3:df094ed45a88 49 {
AkinoriHashimoto 3:df094ed45a88 50 string tmp= this->read();
AkinoriHashimoto 3:df094ed45a88 51 if(tmp.empty())
AkinoriHashimoto 3:df094ed45a88 52 return "";
AkinoriHashimoto 3:df094ed45a88 53
AkinoriHashimoto 3:df094ed45a88 54 // tmp is not empty.
AkinoriHashimoto 3:df094ed45a88 55 int idx= tmp.rfind('\r');
AkinoriHashimoto 3:df094ed45a88 56 if(idx == string::npos) {
AkinoriHashimoto 4:488e26ebc411 57 ringBuf.set(tmp); // 戻す
AkinoriHashimoto 3:df094ed45a88 58 return "";
AkinoriHashimoto 3:df094ed45a88 59 }
AkinoriHashimoto 3:df094ed45a88 60
AkinoriHashimoto 3:df094ed45a88 61 // find \r
AkinoriHashimoto 3:df094ed45a88 62 if(tmp[++idx] == '\n')
AkinoriHashimoto 3:df094ed45a88 63 idx++;
AkinoriHashimoto 3:df094ed45a88 64
AkinoriHashimoto 3:df094ed45a88 65 // idxは改行後の文字先頭Indexを示す。
AkinoriHashimoto 3:df094ed45a88 66 string rtn= tmp.substr(0, idx);
AkinoriHashimoto 4:488e26ebc411 67 tmp= tmp.substr(idx);
AkinoriHashimoto 4:488e26ebc411 68 ringBuf.set(tmp);
AkinoriHashimoto 3:df094ed45a88 69 return rtn;
AkinoriHashimoto 3:df094ed45a88 70 }
AkinoriHashimoto 3:df094ed45a88 71
AkinoriHashimoto 0:a4ddaf82d43d 72 void HC05::sendLine(string str, bool addCR)
AkinoriHashimoto 0:a4ddaf82d43d 73 {
AkinoriHashimoto 0:a4ddaf82d43d 74 if(addCR)
AkinoriHashimoto 0:a4ddaf82d43d 75 str += "\r\n";
AkinoriHashimoto 0:a4ddaf82d43d 76 hc05.printf(str.c_str());
AkinoriHashimoto 0:a4ddaf82d43d 77 return;
AkinoriHashimoto 0:a4ddaf82d43d 78 }
AkinoriHashimoto 4:488e26ebc411 79
AkinoriHashimoto 1:75bb445594e2 80 int HC05::_putc(int val) // for printf()
AkinoriHashimoto 1:75bb445594e2 81 {
AkinoriHashimoto 1:75bb445594e2 82 hc05.putc(val);
AkinoriHashimoto 1:75bb445594e2 83 return val;
AkinoriHashimoto 1:75bb445594e2 84 }
AkinoriHashimoto 1:75bb445594e2 85
AkinoriHashimoto 4:488e26ebc411 86 int HC05::_getc() // for "Stream"
AkinoriHashimoto 1:75bb445594e2 87 {
AkinoriHashimoto 3:df094ed45a88 88 return -1;//hc05.getc();
AkinoriHashimoto 1:75bb445594e2 89 }
AkinoriHashimoto 0:a4ddaf82d43d 90
AkinoriHashimoto 4:488e26ebc411 91 // Internal READ()
AkinoriHashimoto 3:df094ed45a88 92 void HC05::_readIrq(void)
AkinoriHashimoto 0:a4ddaf82d43d 93 {
AkinoriHashimoto 0:a4ddaf82d43d 94 if(!hc05.readable())
AkinoriHashimoto 3:df094ed45a88 95 return;
AkinoriHashimoto 3:df094ed45a88 96
AkinoriHashimoto 4:488e26ebc411 97 char chr= hc05.getc();
AkinoriHashimoto 4:488e26ebc411 98 ringBuf.set(chr);
AkinoriHashimoto 0:a4ddaf82d43d 99
AkinoriHashimoto 3:df094ed45a88 100 if(this->fptrRxIrq == NULL)
AkinoriHashimoto 3:df094ed45a88 101 return;
AkinoriHashimoto 3:df094ed45a88 102 fptrRxIrq(chr);
AkinoriHashimoto 3:df094ed45a88 103
AkinoriHashimoto 3:df094ed45a88 104 return;
AkinoriHashimoto 3:df094ed45a88 105 }
AkinoriHashimoto 3:df094ed45a88 106 void HC05::_read()
AkinoriHashimoto 3:df094ed45a88 107 {
AkinoriHashimoto 0:a4ddaf82d43d 108 // Bufferを吸い尽くす
AkinoriHashimoto 3:df094ed45a88 109 while(hc05.readable())
AkinoriHashimoto 4:488e26ebc411 110 ringBuf.set((char)hc05.getc());
AkinoriHashimoto 3:df094ed45a88 111 return; // Bufferになくなった
AkinoriHashimoto 0:a4ddaf82d43d 112 }
AkinoriHashimoto 0:a4ddaf82d43d 113
AkinoriHashimoto 2:931bef8c7fac 114 // EOF