FEP interrupt, response, ring buffer
Dependents: 087_myFEP_TX 087_myFEP_RX
FEP.cpp@3:12dcc46fb9dc, 2021-10-11 (annotated)
- Committer:
- piroro4560
- Date:
- Mon Oct 11 13:22:16 2021 +0000
- Revision:
- 3:12dcc46fb9dc
- Parent:
- 2:aa9a344a42a8
- Child:
- 4:8d754f144b96
fixed fixed fixed
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 | 3:12dcc46fb9dc | 3 | myFEP::myFEP(PinName tx, PinName rx, uint8_t addr_, int baud) : |
piroro4560 | 3:12dcc46fb9dc | 4 | RawSerial(tx, rx, baud) |
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 | 2:aa9a344a42a8 | 19 | buffer[bufindex] = getc(); // get data |
piroro4560 | 0:b01dc5fd59bc | 20 | |
piroro4560 | 3:12dcc46fb9dc | 21 | if ((!strncmp((char*)(buffer + ((256 + bufindex - 1)%256) ), "\r\n", 2)) ) { // <CR><LF> |
piroro4560 | 2:aa9a344a42a8 | 22 | CheckData(); // check message |
piroro4560 | 0:b01dc5fd59bc | 23 | } |
piroro4560 | 3:12dcc46fb9dc | 24 | bufindex++; |
piroro4560 | 0:b01dc5fd59bc | 25 | } |
piroro4560 | 0:b01dc5fd59bc | 26 | |
piroro4560 | 3:12dcc46fb9dc | 27 | void myFEP::CheckData() |
piroro4560 | 0:b01dc5fd59bc | 28 | { |
piroro4560 | 2:aa9a344a42a8 | 29 | uint8_t temp=0, length=0; // temp:where's array length:length of array |
piroro4560 | 0:b01dc5fd59bc | 30 | for (uint16_t i=0; i<256; i++) { |
piroro4560 | 0:b01dc5fd59bc | 31 | temp = (256 + bufindex - i) % 256; |
piroro4560 | 3:12dcc46fb9dc | 32 | if ( !strncmp((char*)(buffer + temp) , "RBN", 3) ) { // check header |
piroro4560 | 2:aa9a344a42a8 | 33 | length = ctoi(buffer[temp+6])*100 + ctoi(buffer[temp+7])*10 + ctoi(buffer[temp+8]); // calculate length of message |
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 | 3:12dcc46fb9dc | 41 | void myFEP::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 | 3:12dcc46fb9dc | 46 | int8_t myFEP::SendData(uint8_t *data) |
piroro4560 | 0:b01dc5fd59bc | 47 | { |
piroro4560 | 0:b01dc5fd59bc | 48 | return SendData(data, sizeof(data)); |
piroro4560 | 0:b01dc5fd59bc | 49 | } |
piroro4560 | 0:b01dc5fd59bc | 50 | |
piroro4560 | 3:12dcc46fb9dc | 51 | int8_t myFEP::SendData(uint8_t *data, uint8_t length) |
piroro4560 | 0:b01dc5fd59bc | 52 | { |
piroro4560 | 0:b01dc5fd59bc | 53 | if(length > 128) return 1; |
piroro4560 | 2:aa9a344a42a8 | 54 | uint8_t sendindex; // index of 'data' |
piroro4560 | 2:aa9a344a42a8 | 55 | printf("@TBN%03d%03d", addr, length); // send comand |
piroro4560 | 3:12dcc46fb9dc | 56 | for (sendindex=0; sendindex<length; sendindex++) { |
piroro4560 | 2:aa9a344a42a8 | 57 | putc(data[sendindex]); // send message |
piroro4560 | 0:b01dc5fd59bc | 58 | } |
piroro4560 | 0:b01dc5fd59bc | 59 | printf("\r\n"); // <cr><lf> |
piroro4560 | 2:aa9a344a42a8 | 60 | return GetResponse(); // check response |
piroro4560 | 0:b01dc5fd59bc | 61 | } |
piroro4560 | 0:b01dc5fd59bc | 62 | |
piroro4560 | 3:12dcc46fb9dc | 63 | int8_t myFEP::GetResponse() |
piroro4560 | 0:b01dc5fd59bc | 64 | { |
piroro4560 | 3:12dcc46fb9dc | 65 | char res[256]; // array of storing response |
piroro4560 | 3:12dcc46fb9dc | 66 | for (uint8_t resindex=0; resindex<256; resindex++) { |
piroro4560 | 0:b01dc5fd59bc | 67 | res[resindex] = getc(); |
piroro4560 | 3:12dcc46fb9dc | 68 | if (!strncmp(res+resindex-1, "\r\n", 2)) { |
piroro4560 | 3:12dcc46fb9dc | 69 | if (!strncmp(res+resindex-3, "P0", 2)) return 0; |
piroro4560 | 3:12dcc46fb9dc | 70 | else if (!strncmp(res+resindex-3, "N0", 2)) return 2; |
piroro4560 | 3:12dcc46fb9dc | 71 | else if (!strncmp(res+resindex-3, "N1", 2)) return 3; |
piroro4560 | 3:12dcc46fb9dc | 72 | else if (!strncmp(res+resindex-3, "N3", 2)) return 4; |
piroro4560 | 0:b01dc5fd59bc | 73 | } |
piroro4560 | 0:b01dc5fd59bc | 74 | } |
piroro4560 | 3:12dcc46fb9dc | 75 | return -1; |
piroro4560 | 0:b01dc5fd59bc | 76 | } |
piroro4560 | 0:b01dc5fd59bc | 77 | |
piroro4560 | 3:12dcc46fb9dc | 78 | int8_t myFEP::ctoi(char c) |
piroro4560 | 0:b01dc5fd59bc | 79 | { |
piroro4560 | 0:b01dc5fd59bc | 80 | if('0' <= c && c <= '9') return (c-'0'); |
piroro4560 | 0:b01dc5fd59bc | 81 | else return -1; |
piroro4560 | 0:b01dc5fd59bc | 82 | } |