FEP receive
Dependents: 34_emStop_FEP_receive
FEP.cpp@0:b0bd3bee5ab4, 2021-10-08 (annotated)
- Committer:
- THtakahiro702286
- Date:
- Fri Oct 08 07:23:21 2021 +0000
- Revision:
- 0:b0bd3bee5ab4
new
Who changed what in which revision?
User | Revision | Line number | New 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 | } |