FEP interrupt, response, ring buffer
Dependents: 087_myFEP_TX 087_myFEP_RX
FEP.cpp@4:8d754f144b96, 2021-10-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |