FEP interrupt, response, ring buffer

Dependents:   087_myFEP_TX 087_myFEP_RX

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?

UserRevisionLine numberNew 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 }