From 87da5ef63da7195aac254f006e03d4e3fd892909 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Tue, 31 May 2022 18:53:45 +0200 Subject: [PATCH] Renamed packet_t to fragment_t and implemented fragment crc check --- lib/Hoymiles/src/HoymilesRadio.cpp | 55 +++++++++++++++++++++--------- lib/Hoymiles/src/HoymilesRadio.h | 13 ++++--- 2 files changed, 47 insertions(+), 21 deletions(-) diff --git a/lib/Hoymiles/src/HoymilesRadio.cpp b/lib/Hoymiles/src/HoymilesRadio.cpp index e1357753..7f98c878 100644 --- a/lib/Hoymiles/src/HoymilesRadio.cpp +++ b/lib/Hoymiles/src/HoymilesRadio.cpp @@ -1,4 +1,5 @@ #include "HoymilesRadio.h" +#include "crc.h" #include #include @@ -12,9 +13,7 @@ void HoymilesRadio::init() _radio->enableDynamicPayloads(); _radio->setCRCLength(RF24_CRC_16); _radio->setAddressWidth(5); - _radio->setAutoAck(false); _radio->setRetries(0, 0); - _radio->setPALevel(RF_PWR_LOW); _radio->maskIRQ(true, true, false); // enable only receiving interrupts if (_radio->isChipConnected()) { Serial.println(F("Connection successfull")); @@ -22,9 +21,9 @@ void HoymilesRadio::init() Serial.println(F("Connection error!!")); } - setDtuSerial(_dtuSerial.u64); - attachInterrupt(digitalPinToInterrupt(16), std::bind(&HoymilesRadio::handleIntr, this), FALLING); + + openReadingPipe(); _radio->startListening(); } @@ -42,24 +41,36 @@ void HoymilesRadio::loop() Serial.println(F("Interrupt received")); while (_radio->available()) { if (!_rxBuffer.full()) { - packet_t* p; - uint8_t len; - p = _rxBuffer.getFront(); - memset(p->packet, 0xcc, MAX_RF_PAYLOAD_SIZE); - p->rxCh = _rxChLst[_rxChIdx]; - len = _radio->getPayloadSize(); - if (len > MAX_RF_PAYLOAD_SIZE) - len = MAX_RF_PAYLOAD_SIZE; + fragment_t* f; + f = _rxBuffer.getFront(); + memset(f->fragment, 0xcc, MAX_RF_PAYLOAD_SIZE); + f->rxCh = _rxChLst[_rxChIdx]; + f->len = _radio->getDynamicPayloadSize(); + if (f->len > MAX_RF_PAYLOAD_SIZE) + f->len = MAX_RF_PAYLOAD_SIZE; - _radio->read(p->packet, len); - _rxBuffer.pushFront(p); + _radio->read(f->fragment, f->len); + _rxBuffer.pushFront(f); } else { Serial.println(F("Buffer full")); _radio->flush_rx(); } } - _packetReceived = false; + + } else { + // Perform package parsing only if no packages are received + if (!_rxBuffer.empty()) { + fragment_t* f = _rxBuffer.getBack(); + if (checkFragmentCrc(f)) { + Serial.println("Frame Ok"); + } else { + Serial.println("Frame kaputt"); + } + + // Remove paket from buffer even it was corrupted + _rxBuffer.popBack(); + } } } @@ -75,8 +86,13 @@ serial_u HoymilesRadio::DtuSerial() void HoymilesRadio::setDtuSerial(uint64_t serial) { - serial_u s; _dtuSerial.u64 = serial; + openReadingPipe(); +} + +void HoymilesRadio::openReadingPipe() +{ + serial_u s; s = convertSerialToRadioId(_dtuSerial); _radio->openReadingPipe(1, s.u64); } @@ -110,10 +126,17 @@ bool HoymilesRadio::switchRxCh(uint8_t addLoop) serial_u HoymilesRadio::convertSerialToRadioId(serial_u serial) { serial_u radioId; + radioId.u64 = 0; radioId.b[4] = serial.b[0]; radioId.b[3] = serial.b[1]; radioId.b[2] = serial.b[2]; radioId.b[1] = serial.b[3]; radioId.b[0] = 0x01; return radioId; +} + +bool HoymilesRadio::checkFragmentCrc(fragment_t* fragment) +{ + uint8_t crc = crc8(fragment->fragment, fragment->len - 1); + return (crc == fragment->fragment[fragment->len - 1]); } \ No newline at end of file diff --git a/lib/Hoymiles/src/HoymilesRadio.h b/lib/Hoymiles/src/HoymilesRadio.h index 9c646945..63caf716 100644 --- a/lib/Hoymiles/src/HoymilesRadio.h +++ b/lib/Hoymiles/src/HoymilesRadio.h @@ -9,13 +9,14 @@ // maximum buffer length of packet received / sent to RF24 module #define MAX_RF_PAYLOAD_SIZE 32 -// number of packets hold in buffer -#define PACKET_BUFFER_SIZE 30 +// number of fragments hold in buffer +#define FRAGMENT_BUFFER_SIZE 30 typedef struct { uint8_t rxCh; - uint8_t packet[MAX_RF_PAYLOAD_SIZE]; -} packet_t; + uint8_t fragment[MAX_RF_PAYLOAD_SIZE]; + uint8_t len; +} fragment_t; class HoymilesRadio { public: @@ -31,6 +32,8 @@ private: static serial_u convertSerialToRadioId(serial_u serial); uint8_t getRxNxtChannel(); bool switchRxCh(uint8_t addLoop = 0); + void openReadingPipe(); + bool checkFragmentCrc(fragment_t* fragment); std::unique_ptr _radio; uint8_t _rxChLst[4] = { 3, 23, 61, 75 }; @@ -39,7 +42,7 @@ private: volatile bool _packetReceived; - CircularBuffer _rxBuffer; + CircularBuffer _rxBuffer; serial_u _dtuSerial; }; \ No newline at end of file