FEP interrupt, response, ring buffer

Dependents:   087_myFEP_TX 087_myFEP_RX

Committer:
piroro4560
Date:
Fri Oct 15 13:23:15 2021 +0000
Revision:
4:8d754f144b96
Parent:
3:12dcc46fb9dc
Completed for the time being

Who changed what in which revision?

UserRevisionLine numberNew contents of line
piroro4560 4:8d754f144b96 1 /**
piroro4560 4:8d754f144b96 2 * @file FEP.cpp
piroro4560 4:8d754f144b96 3 * @author 安澤瑠
piroro4560 4:8d754f144b96 4 * @date 21/10/15
piroro4560 4:8d754f144b96 5 */
piroro4560 0:b01dc5fd59bc 6 #include "FEP.h"
piroro4560 0:b01dc5fd59bc 7
piroro4560 3:12dcc46fb9dc 8 myFEP::myFEP(PinName tx, PinName rx, uint8_t addr_, int baud) :
piroro4560 3:12dcc46fb9dc 9 RawSerial(tx, rx, baud)
piroro4560 0:b01dc5fd59bc 10 {
piroro4560 0:b01dc5fd59bc 11 addr = addr_;
piroro4560 4:8d754f144b96 12 timeout = TIMEOUT_COUNT;
piroro4560 0:b01dc5fd59bc 13 bufindex = 0;
piroro4560 0:b01dc5fd59bc 14 retindex = 0;
piroro4560 4:8d754f144b96 15 length = 0;
piroro4560 0:b01dc5fd59bc 16 }
piroro4560 0:b01dc5fd59bc 17
piroro4560 0:b01dc5fd59bc 18 void myFEP::StartReceive()
piroro4560 0:b01dc5fd59bc 19 {
piroro4560 0:b01dc5fd59bc 20 attach(callback(this, &myFEP::ReceiveBytes));
piroro4560 4:8d754f144b96 21 timeoutTimer.attach(callback(this, &myFEP::TimeoutLoop), 0.1);
piroro4560 4:8d754f144b96 22 }
piroro4560 4:8d754f144b96 23
piroro4560 4:8d754f144b96 24 void myFEP::TimeoutLoop()
piroro4560 4:8d754f144b96 25 {
piroro4560 4:8d754f144b96 26 if (timeout >= TIMEOUT_COUNT) {
piroro4560 4:8d754f144b96 27 status = false;
piroro4560 4:8d754f144b96 28 } else {
piroro4560 4:8d754f144b96 29 status = true;
piroro4560 4:8d754f144b96 30 timeout++;
piroro4560 4:8d754f144b96 31 }
piroro4560 0:b01dc5fd59bc 32 }
piroro4560 0:b01dc5fd59bc 33
piroro4560 0:b01dc5fd59bc 34 void myFEP::ReceiveBytes()
piroro4560 0:b01dc5fd59bc 35 {
piroro4560 4:8d754f144b96 36 buffer[bufindex] = getc(); // Receive 1byte
piroro4560 4:8d754f144b96 37 timeout = 0;
piroro4560 0:b01dc5fd59bc 38
piroro4560 4:8d754f144b96 39 if ( (!strncmp((char*)(buffer + ((256 + bufindex - 1)%256) ), "\r\n", 2)) ) { // <CR><LF> bufindex = <LF>(='\n')
piroro4560 4:8d754f144b96 40 CheckData(); // check and extract message
piroro4560 0:b01dc5fd59bc 41 }
piroro4560 3:12dcc46fb9dc 42 bufindex++;
piroro4560 0:b01dc5fd59bc 43 }
piroro4560 0:b01dc5fd59bc 44
piroro4560 3:12dcc46fb9dc 45 void myFEP::CheckData()
piroro4560 0:b01dc5fd59bc 46 {
piroro4560 4:8d754f144b96 47 uint8_t temp=0;
piroro4560 0:b01dc5fd59bc 48 for (uint16_t i=0; i<256; i++) {
piroro4560 0:b01dc5fd59bc 49 temp = (256 + bufindex - i) % 256;
piroro4560 4:8d754f144b96 50 if ( !strncmp((char*)(buffer + temp) , "RBN", 3) ) { // check header temp='R'
piroro4560 4:8d754f144b96 51 length = buffer[(temp+9)%256];
piroro4560 4:8d754f144b96 52 for (int j = 10; j < length+10; j++) {
piroro4560 4:8d754f144b96 53 retdata[j-10] = buffer[(temp+j)%256]; // get message
piroro4560 0:b01dc5fd59bc 54 }
piroro4560 4:8d754f144b96 55 return;
piroro4560 0:b01dc5fd59bc 56 }
piroro4560 0:b01dc5fd59bc 57 }
piroro4560 0:b01dc5fd59bc 58 }
piroro4560 0:b01dc5fd59bc 59
piroro4560 4:8d754f144b96 60 uint8_t myFEP::GetData(uint8_t *data)
piroro4560 0:b01dc5fd59bc 61 {
piroro4560 4:8d754f144b96 62 for (int i=0; i<length; i++) data[i] = retdata[i];
piroro4560 4:8d754f144b96 63 return length;
piroro4560 0:b01dc5fd59bc 64 }
piroro4560 0:b01dc5fd59bc 65
piroro4560 4:8d754f144b96 66 int8_t myFEP::SendData(uint8_t *data, uint8_t length_)
piroro4560 0:b01dc5fd59bc 67 {
piroro4560 4:8d754f144b96 68 if(length_ > 126) return 1;
piroro4560 2:aa9a344a42a8 69 uint8_t sendindex; // index of 'data'
piroro4560 4:8d754f144b96 70 printf("@TBN%03d%03d", addr, length_+1); // send comand
piroro4560 4:8d754f144b96 71 putc(length_);
piroro4560 4:8d754f144b96 72 for (sendindex=0; sendindex<length_; sendindex++) {
piroro4560 2:aa9a344a42a8 73 putc(data[sendindex]); // send message
piroro4560 0:b01dc5fd59bc 74 }
piroro4560 0:b01dc5fd59bc 75 printf("\r\n"); // <cr><lf>
piroro4560 2:aa9a344a42a8 76 return GetResponse(); // check response
piroro4560 0:b01dc5fd59bc 77 }
piroro4560 0:b01dc5fd59bc 78
piroro4560 3:12dcc46fb9dc 79 int8_t myFEP::GetResponse()
piroro4560 0:b01dc5fd59bc 80 {
piroro4560 3:12dcc46fb9dc 81 char res[256]; // array of storing response
piroro4560 3:12dcc46fb9dc 82 for (uint8_t resindex=0; resindex<256; resindex++) {
piroro4560 0:b01dc5fd59bc 83 res[resindex] = getc();
piroro4560 3:12dcc46fb9dc 84 if (!strncmp(res+resindex-1, "\r\n", 2)) {
piroro4560 3:12dcc46fb9dc 85 if (!strncmp(res+resindex-3, "P0", 2)) return 0;
piroro4560 3:12dcc46fb9dc 86 else if (!strncmp(res+resindex-3, "N0", 2)) return 2;
piroro4560 3:12dcc46fb9dc 87 else if (!strncmp(res+resindex-3, "N1", 2)) return 3;
piroro4560 3:12dcc46fb9dc 88 else if (!strncmp(res+resindex-3, "N3", 2)) return 4;
piroro4560 0:b01dc5fd59bc 89 }
piroro4560 0:b01dc5fd59bc 90 }
piroro4560 3:12dcc46fb9dc 91 return -1;
piroro4560 0:b01dc5fd59bc 92 }