FEP interrupt, response, ring buffer

Dependents:   087_myFEP_TX 087_myFEP_RX

Committer:
piroro4560
Date:
Sat Oct 09 13:35:40 2021 +0000
Revision:
2:aa9a344a42a8
Parent:
0:b01dc5fd59bc
Child:
3:12dcc46fb9dc
rework doxygen

Who changed what in which revision?

UserRevisionLine numberNew 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 2:aa9a344a42a8 20 buffer[bufindex] = getc(); // get data
piroro4560 0:b01dc5fd59bc 21
piroro4560 2:aa9a344a42a8 22 if ( (bufindex > 0) && (!strcmp((char*)(buffer + bufindex - 1) , "\r\n")) ) { // <CR><LF>
piroro4560 2:aa9a344a42a8 23 CheckData(); // check message
piroro4560 0:b01dc5fd59bc 24 }
piroro4560 0:b01dc5fd59bc 25 }
piroro4560 0:b01dc5fd59bc 26
piroro4560 0:b01dc5fd59bc 27 void 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 2:aa9a344a42a8 32 if ( !str((char*)(buffer + temp) , "RBN") ) { // 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 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 2:aa9a344a42a8 55 uint8_t sendindex; // index of 'data'
piroro4560 2:aa9a344a42a8 56 printf("@TBN%03d%03d", addr, length); // send comand
piroro4560 0:b01dc5fd59bc 57 for (sendindex=0; sendindex<length; sendindex++) {
piroro4560 2:aa9a344a42a8 58 putc(data[sendindex]); // send message
piroro4560 0:b01dc5fd59bc 59 }
piroro4560 0:b01dc5fd59bc 60 printf("\r\n"); // <cr><lf>
piroro4560 2:aa9a344a42a8 61 return GetResponse(); // check response
piroro4560 0:b01dc5fd59bc 62 }
piroro4560 0:b01dc5fd59bc 63
piroro4560 0:b01dc5fd59bc 64 uint8_t GetResponse()
piroro4560 0:b01dc5fd59bc 65 {
piroro4560 2:aa9a344a42a8 66 char res[4]; // array of storing response
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 }