Renamed packet_t to fragment_t and implemented fragment crc check

This commit is contained in:
Thomas Basler 2022-05-31 18:53:45 +02:00
parent 891b2b2917
commit 87da5ef63d
2 changed files with 47 additions and 21 deletions

View File

@ -1,4 +1,5 @@
#include "HoymilesRadio.h"
#include "crc.h"
#include <Every.h>
#include <FunctionalInterrupt.h>
@ -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]);
}

View File

@ -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<RF24> _radio;
uint8_t _rxChLst[4] = { 3, 23, 61, 75 };
@ -39,7 +42,7 @@ private:
volatile bool _packetReceived;
CircularBuffer<packet_t, PACKET_BUFFER_SIZE> _rxBuffer;
CircularBuffer<fragment_t, FRAGMENT_BUFFER_SIZE> _rxBuffer;
serial_u _dtuSerial;
};