FEP interrupt, response, ring buffer
Dependents: 087_myFEP_TX 087_myFEP_RX
FEP.cpp@0:b01dc5fd59bc, 2021-10-09 (annotated)
- Committer:
- piroro4560
- Date:
- Sat Oct 09 11:42:03 2021 +0000
- Revision:
- 0:b01dc5fd59bc
- Child:
- 2:aa9a344a42a8
make
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
piroro4560 | 0:b01dc5fd59bc | 1 | #include "FEP.h" |
piroro4560 | 0:b01dc5fd59bc | 2 | |
piroro4560 | 0:b01dc5fd59bc | 3 | myFEP::myFEP(PinName tx, PinName rx, uint8_t addr_, int baud=115200) : |
piroro4560 | 0:b01dc5fd59bc | 4 | RawSerial(tx, rx) |
piroro4560 | 0:b01dc5fd59bc | 5 | { |
piroro4560 | 0:b01dc5fd59bc | 6 | addr = addr_; |
piroro4560 | 0:b01dc5fd59bc | 7 | bufindex = 0; |
piroro4560 | 0:b01dc5fd59bc | 8 | retindex = 0; |
piroro4560 | 0:b01dc5fd59bc | 9 | } |
piroro4560 | 0:b01dc5fd59bc | 10 | |
piroro4560 | 0:b01dc5fd59bc | 11 | void myFEP::StartReceive() |
piroro4560 | 0:b01dc5fd59bc | 12 | { |
piroro4560 | 0:b01dc5fd59bc | 13 | attach(callback(this, &myFEP::ReceiveBytes)); |
piroro4560 | 0:b01dc5fd59bc | 14 | |
piroro4560 | 0:b01dc5fd59bc | 15 | } |
piroro4560 | 0:b01dc5fd59bc | 16 | |
piroro4560 | 0:b01dc5fd59bc | 17 | void myFEP::ReceiveBytes() |
piroro4560 | 0:b01dc5fd59bc | 18 | { |
piroro4560 | 0:b01dc5fd59bc | 19 | if (bufindex > 256) bufindex %= 256; |
piroro4560 | 0:b01dc5fd59bc | 20 | buffer[bufindex] = getc(); // データ取得 |
piroro4560 | 0:b01dc5fd59bc | 21 | |
piroro4560 | 0:b01dc5fd59bc | 22 | if ( (bufindex > 0) && (!strcmp((char*)(buffer + bufindex - 1) , "\r\n")) ) { // <CR><LF>確認 |
piroro4560 | 0:b01dc5fd59bc | 23 | CheckData(); // 集計 |
piroro4560 | 0:b01dc5fd59bc | 24 | } |
piroro4560 | 0:b01dc5fd59bc | 25 | } |
piroro4560 | 0:b01dc5fd59bc | 26 | |
piroro4560 | 0:b01dc5fd59bc | 27 | void CheckData() |
piroro4560 | 0:b01dc5fd59bc | 28 | { |
piroro4560 | 0:b01dc5fd59bc | 29 | uint8_t temp=0, length=0; // temp:配列の位置 length:配列の長さ |
piroro4560 | 0:b01dc5fd59bc | 30 | for (uint16_t i=0; i<256; i++) { |
piroro4560 | 0:b01dc5fd59bc | 31 | temp = (256 + bufindex - i) % 256; |
piroro4560 | 0:b01dc5fd59bc | 32 | if ( !str((char*)(buffer + temp) , "RBN") ) { // ヘッダ確認 |
piroro4560 | 0:b01dc5fd59bc | 33 | length = ctoi(buffer[temp+6])*100 + ctoi(buffer[temp+7])*10 + ctoi(buffer[temp+8]); // メッセージの長さを計算 |
piroro4560 | 0:b01dc5fd59bc | 34 | for (int j = 9; j < length+9; j++) { |
piroro4560 | 0:b01dc5fd59bc | 35 | retdata[j-9] = buffer[temp+j]; // |
piroro4560 | 0:b01dc5fd59bc | 36 | } |
piroro4560 | 0:b01dc5fd59bc | 37 | } |
piroro4560 | 0:b01dc5fd59bc | 38 | } |
piroro4560 | 0:b01dc5fd59bc | 39 | } |
piroro4560 | 0:b01dc5fd59bc | 40 | |
piroro4560 | 0:b01dc5fd59bc | 41 | void GetData(uint8_t *data) |
piroro4560 | 0:b01dc5fd59bc | 42 | { |
piroro4560 | 0:b01dc5fd59bc | 43 | strcpy((char*)data, (char*)retdata); |
piroro4560 | 0:b01dc5fd59bc | 44 | } |
piroro4560 | 0:b01dc5fd59bc | 45 | |
piroro4560 | 0:b01dc5fd59bc | 46 | |
piroro4560 | 0:b01dc5fd59bc | 47 | uint8_t SendData(uint8_t *data) |
piroro4560 | 0:b01dc5fd59bc | 48 | { |
piroro4560 | 0:b01dc5fd59bc | 49 | return SendData(data, sizeof(data)); |
piroro4560 | 0:b01dc5fd59bc | 50 | } |
piroro4560 | 0:b01dc5fd59bc | 51 | |
piroro4560 | 0:b01dc5fd59bc | 52 | uint8_t SendData(uint8_t *data, uint8_t length) |
piroro4560 | 0:b01dc5fd59bc | 53 | { |
piroro4560 | 0:b01dc5fd59bc | 54 | if(length > 128) return 1; |
piroro4560 | 0:b01dc5fd59bc | 55 | uint8_t sendindex; // dataの添え字用の変数 |
piroro4560 | 0:b01dc5fd59bc | 56 | printf("@TBN%03d%03d", addr, length); // コマンド送信 |
piroro4560 | 0:b01dc5fd59bc | 57 | for (sendindex=0; sendindex<length; sendindex++) { |
piroro4560 | 0:b01dc5fd59bc | 58 | putc(data[sendindex]); // データ部分送信 |
piroro4560 | 0:b01dc5fd59bc | 59 | } |
piroro4560 | 0:b01dc5fd59bc | 60 | printf("\r\n"); // <cr><lf> |
piroro4560 | 0:b01dc5fd59bc | 61 | return GetResponse(); // 応答確認 |
piroro4560 | 0:b01dc5fd59bc | 62 | } |
piroro4560 | 0:b01dc5fd59bc | 63 | |
piroro4560 | 0:b01dc5fd59bc | 64 | uint8_t GetResponse() |
piroro4560 | 0:b01dc5fd59bc | 65 | { |
piroro4560 | 0:b01dc5fd59bc | 66 | char res[4]; // 応答格納用変数 |
piroro4560 | 0:b01dc5fd59bc | 67 | uint8_t resindex=0; // |
piroro4560 | 0:b01dc5fd59bc | 68 | while (1) { |
piroro4560 | 0:b01dc5fd59bc | 69 | res[resindex] = getc(); |
piroro4560 | 0:b01dc5fd59bc | 70 | if (resindex >= 3) { |
piroro4560 | 0:b01dc5fd59bc | 71 | if (!strcmp(temp, "P0\r\n")) return 0; |
piroro4560 | 0:b01dc5fd59bc | 72 | else if (!strcmp(temp, "N0\r\n")) return 2; |
piroro4560 | 0:b01dc5fd59bc | 73 | else if (!strcmp(temp, "N1\r\n")) return 3; |
piroro4560 | 0:b01dc5fd59bc | 74 | else if (!strcmp(temp, "N3\r\n")) return 4; |
piroro4560 | 0:b01dc5fd59bc | 75 | } |
piroro4560 | 0:b01dc5fd59bc | 76 | if (++resindex > 3) return -1; |
piroro4560 | 0:b01dc5fd59bc | 77 | } |
piroro4560 | 0:b01dc5fd59bc | 78 | } |
piroro4560 | 0:b01dc5fd59bc | 79 | |
piroro4560 | 0:b01dc5fd59bc | 80 | uint8_t FEP::ctoi(char c) |
piroro4560 | 0:b01dc5fd59bc | 81 | { |
piroro4560 | 0:b01dc5fd59bc | 82 | if('0' <= c && c <= '9') return (c-'0'); |
piroro4560 | 0:b01dc5fd59bc | 83 | else return -1; |
piroro4560 | 0:b01dc5fd59bc | 84 | } |