Renamed packet_t to fragment_t and implemented fragment crc check
This commit is contained in:
parent
891b2b2917
commit
87da5ef63d
@ -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,6 +126,7 @@ 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];
|
||||
@ -117,3 +134,9 @@ serial_u HoymilesRadio::convertSerialToRadioId(serial_u serial)
|
||||
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]);
|
||||
}
|
||||
@ -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;
|
||||
};
|
||||
Loading…
Reference in New Issue
Block a user