FEP receive

Dependents:   34_emStop_FEP_receive

Committer:
THtakahiro702286
Date:
Fri Oct 08 07:23:21 2021 +0000
Revision:
0:b0bd3bee5ab4
new

Who changed what in which revision?

UserRevisionLine numberNew contents of line
THtakahiro702286 0:b0bd3bee5ab4 1 #include "FEP.h"
THtakahiro702286 0:b0bd3bee5ab4 2
THtakahiro702286 0:b0bd3bee5ab4 3 FEP::FEP(PinName tx, PinName rx, uint8_t addr, int baud) :
THtakahiro702286 0:b0bd3bee5ab4 4 RawSerial(tx, rx, baud),
THtakahiro702286 0:b0bd3bee5ab4 5 timeout(TIMEOUT_COUNT),
THtakahiro702286 0:b0bd3bee5ab4 6 status(false)
THtakahiro702286 0:b0bd3bee5ab4 7 {
THtakahiro702286 0:b0bd3bee5ab4 8 _address = addr;
THtakahiro702286 0:b0bd3bee5ab4 9 }
THtakahiro702286 0:b0bd3bee5ab4 10
THtakahiro702286 0:b0bd3bee5ab4 11 void FEP::startReceive(uint16_t dataSize)
THtakahiro702286 0:b0bd3bee5ab4 12 {
THtakahiro702286 0:b0bd3bee5ab4 13 bufferSize = dataSize + 15;
THtakahiro702286 0:b0bd3bee5ab4 14 bufferPoint = 0;
THtakahiro702286 0:b0bd3bee5ab4 15 receivedBytes = 0;
THtakahiro702286 0:b0bd3bee5ab4 16 buffer = new uint8_t[bufferSize];
THtakahiro702286 0:b0bd3bee5ab4 17 data = new uint8_t[dataSize];
THtakahiro702286 0:b0bd3bee5ab4 18 attach(callback(this, &FEP::receiveByte));
THtakahiro702286 0:b0bd3bee5ab4 19 timeoutTicker.attach(callback(this, &FEP::timeoutLoop), 0.1);
THtakahiro702286 0:b0bd3bee5ab4 20 }
THtakahiro702286 0:b0bd3bee5ab4 21
THtakahiro702286 0:b0bd3bee5ab4 22 void FEP::getData(uint8_t data_[])
THtakahiro702286 0:b0bd3bee5ab4 23 {
THtakahiro702286 0:b0bd3bee5ab4 24 for(int i = 0; i < bufferSize - 15; i++) {
THtakahiro702286 0:b0bd3bee5ab4 25 data_[i] = data[i];
THtakahiro702286 0:b0bd3bee5ab4 26 }
THtakahiro702286 0:b0bd3bee5ab4 27 }
THtakahiro702286 0:b0bd3bee5ab4 28
THtakahiro702286 0:b0bd3bee5ab4 29 void FEP::sendData(uint8_t data_[], uint8_t length)
THtakahiro702286 0:b0bd3bee5ab4 30 {
THtakahiro702286 0:b0bd3bee5ab4 31 uint8_t checksum = 0x00;
THtakahiro702286 0:b0bd3bee5ab4 32
THtakahiro702286 0:b0bd3bee5ab4 33 printf("@TBN%03d%03d", _address, length + 1);
THtakahiro702286 0:b0bd3bee5ab4 34 for (int j = 0; j < length; j++) {
THtakahiro702286 0:b0bd3bee5ab4 35 checksum += data_[j];
THtakahiro702286 0:b0bd3bee5ab4 36 putc(data_[j]);
THtakahiro702286 0:b0bd3bee5ab4 37 }
THtakahiro702286 0:b0bd3bee5ab4 38 putc(checksum);
THtakahiro702286 0:b0bd3bee5ab4 39 putc('\r');
THtakahiro702286 0:b0bd3bee5ab4 40 putc('\n');
THtakahiro702286 0:b0bd3bee5ab4 41 }
THtakahiro702286 0:b0bd3bee5ab4 42
THtakahiro702286 0:b0bd3bee5ab4 43 void FEP::receiveByte()
THtakahiro702286 0:b0bd3bee5ab4 44 {
THtakahiro702286 0:b0bd3bee5ab4 45 buffer[bufferPoint % bufferSize] = getc();
THtakahiro702286 0:b0bd3bee5ab4 46 timeout = 0;
THtakahiro702286 0:b0bd3bee5ab4 47
THtakahiro702286 0:b0bd3bee5ab4 48 if(bufferPoint != 0xff) {
THtakahiro702286 0:b0bd3bee5ab4 49 ++bufferPoint;
THtakahiro702286 0:b0bd3bee5ab4 50 } else {
THtakahiro702286 0:b0bd3bee5ab4 51 bufferPoint = (255%bufferSize)+1;
THtakahiro702286 0:b0bd3bee5ab4 52 }
THtakahiro702286 0:b0bd3bee5ab4 53
THtakahiro702286 0:b0bd3bee5ab4 54 ++receivedBytes;
THtakahiro702286 0:b0bd3bee5ab4 55
THtakahiro702286 0:b0bd3bee5ab4 56 if(receivedBytes >= bufferSize) checkData();
THtakahiro702286 0:b0bd3bee5ab4 57 }
THtakahiro702286 0:b0bd3bee5ab4 58
THtakahiro702286 0:b0bd3bee5ab4 59 void FEP::timeoutLoop()
THtakahiro702286 0:b0bd3bee5ab4 60 {
THtakahiro702286 0:b0bd3bee5ab4 61 if(timeout >= TIMEOUT_COUNT) {
THtakahiro702286 0:b0bd3bee5ab4 62 status = false;
THtakahiro702286 0:b0bd3bee5ab4 63 return;
THtakahiro702286 0:b0bd3bee5ab4 64 }
THtakahiro702286 0:b0bd3bee5ab4 65 status = true;
THtakahiro702286 0:b0bd3bee5ab4 66 timeout++;
THtakahiro702286 0:b0bd3bee5ab4 67 }
THtakahiro702286 0:b0bd3bee5ab4 68
THtakahiro702286 0:b0bd3bee5ab4 69 void FEP::checkData()
THtakahiro702286 0:b0bd3bee5ab4 70 {
THtakahiro702286 0:b0bd3bee5ab4 71 for(int i = 0; i < bufferSize; i++) {
THtakahiro702286 0:b0bd3bee5ab4 72 if(buffer[i % bufferSize] == FEP_HEADER0 && buffer[(i + 1) % bufferSize] == FEP_HEADER1 && buffer[(i + 2) % bufferSize] == FEP_HEADER2) {
THtakahiro702286 0:b0bd3bee5ab4 73 uint8_t checksum = 0x00;
THtakahiro702286 0:b0bd3bee5ab4 74 for(int j = 9; j < bufferSize - 6; j++) {
THtakahiro702286 0:b0bd3bee5ab4 75 checksum += buffer[(i + j)% bufferSize];
THtakahiro702286 0:b0bd3bee5ab4 76 }
THtakahiro702286 0:b0bd3bee5ab4 77 if(checksum == buffer[(i + bufferSize - 6)% bufferSize]) {
THtakahiro702286 0:b0bd3bee5ab4 78 for(int j = 9; j < bufferSize - 6; j++) {
THtakahiro702286 0:b0bd3bee5ab4 79 data[j - 9] = buffer[(i + j) % bufferSize];
THtakahiro702286 0:b0bd3bee5ab4 80 }
THtakahiro702286 0:b0bd3bee5ab4 81 receivedBytes = 0;
THtakahiro702286 0:b0bd3bee5ab4 82 return;
THtakahiro702286 0:b0bd3bee5ab4 83 }
THtakahiro702286 0:b0bd3bee5ab4 84 }
THtakahiro702286 0:b0bd3bee5ab4 85 }
THtakahiro702286 0:b0bd3bee5ab4 86 }