Removed duplicate code by moving it into the radio base class
This commit is contained in:
parent
c5a31de5a8
commit
82b0272ceb
@ -51,6 +51,69 @@ void HoymilesRadio::sendLastPacketAgain()
|
|||||||
sendEsbPacket(cmd);
|
sendEsbPacket(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HoymilesRadio::handleReceivedPackage()
|
||||||
|
{
|
||||||
|
if (_busyFlag && _rxTimeout.occured()) {
|
||||||
|
Hoymiles.getMessageOutput()->println("RX Period End");
|
||||||
|
std::shared_ptr<InverterAbstract> inv = Hoymiles.getInverterBySerial(_commandQueue.front().get()->getTargetAddress());
|
||||||
|
|
||||||
|
if (nullptr != inv) {
|
||||||
|
CommandAbstract* cmd = _commandQueue.front().get();
|
||||||
|
uint8_t verifyResult = inv->verifyAllFragments(cmd);
|
||||||
|
if (verifyResult == FRAGMENT_ALL_MISSING_RESEND) {
|
||||||
|
Hoymiles.getMessageOutput()->println("Nothing received, resend whole request");
|
||||||
|
sendLastPacketAgain();
|
||||||
|
|
||||||
|
} else if (verifyResult == FRAGMENT_ALL_MISSING_TIMEOUT) {
|
||||||
|
Hoymiles.getMessageOutput()->println("Nothing received, resend count exeeded");
|
||||||
|
_commandQueue.pop();
|
||||||
|
_busyFlag = false;
|
||||||
|
|
||||||
|
} else if (verifyResult == FRAGMENT_RETRANSMIT_TIMEOUT) {
|
||||||
|
Hoymiles.getMessageOutput()->println("Retransmit timeout");
|
||||||
|
_commandQueue.pop();
|
||||||
|
_busyFlag = false;
|
||||||
|
|
||||||
|
} else if (verifyResult == FRAGMENT_HANDLE_ERROR) {
|
||||||
|
Hoymiles.getMessageOutput()->println("Packet handling error");
|
||||||
|
_commandQueue.pop();
|
||||||
|
_busyFlag = false;
|
||||||
|
|
||||||
|
} else if (verifyResult > 0) {
|
||||||
|
// Perform Retransmit
|
||||||
|
Hoymiles.getMessageOutput()->print("Request retransmit: ");
|
||||||
|
Hoymiles.getMessageOutput()->println(verifyResult);
|
||||||
|
sendRetransmitPacket(verifyResult);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Successful received all packages
|
||||||
|
Hoymiles.getMessageOutput()->println("Success");
|
||||||
|
_commandQueue.pop();
|
||||||
|
_busyFlag = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If inverter was not found, assume the command is invalid
|
||||||
|
Hoymiles.getMessageOutput()->println("RX: Invalid inverter found");
|
||||||
|
_commandQueue.pop();
|
||||||
|
_busyFlag = false;
|
||||||
|
}
|
||||||
|
} else if (!_busyFlag) {
|
||||||
|
// Currently in idle mode --> send packet if one is in the queue
|
||||||
|
if (!_commandQueue.empty()) {
|
||||||
|
CommandAbstract* cmd = _commandQueue.front().get();
|
||||||
|
|
||||||
|
auto inv = Hoymiles.getInverterBySerial(cmd->getTargetAddress());
|
||||||
|
if (nullptr != inv) {
|
||||||
|
inv->clearRxFragmentBuffer();
|
||||||
|
sendEsbPacket(cmd);
|
||||||
|
} else {
|
||||||
|
Hoymiles.getMessageOutput()->println("TX: Invalid inverter found");
|
||||||
|
_commandQueue.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void HoymilesRadio::dumpBuf(const uint8_t buf[], uint8_t len, bool appendNewline)
|
void HoymilesRadio::dumpBuf(const uint8_t buf[], uint8_t len, bool appendNewline)
|
||||||
{
|
{
|
||||||
for (uint8_t i = 0; i < len; i++) {
|
for (uint8_t i = 0; i < len; i++) {
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "TimeoutHelper.h"
|
||||||
#include "commands/CommandAbstract.h"
|
#include "commands/CommandAbstract.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -30,9 +31,12 @@ protected:
|
|||||||
virtual void sendEsbPacket(CommandAbstract* cmd) = 0;
|
virtual void sendEsbPacket(CommandAbstract* cmd) = 0;
|
||||||
void sendRetransmitPacket(uint8_t fragment_id);
|
void sendRetransmitPacket(uint8_t fragment_id);
|
||||||
void sendLastPacketAgain();
|
void sendLastPacketAgain();
|
||||||
|
void handleReceivedPackage();
|
||||||
|
|
||||||
serial_u _dtuSerial;
|
serial_u _dtuSerial;
|
||||||
std::queue<std::shared_ptr<CommandAbstract>> _commandQueue;
|
std::queue<std::shared_ptr<CommandAbstract>> _commandQueue;
|
||||||
bool _isInitialized = false;
|
bool _isInitialized = false;
|
||||||
bool _busyFlag = false;
|
bool _busyFlag = false;
|
||||||
|
|
||||||
|
TimeoutHelper _rxTimeout;
|
||||||
};
|
};
|
||||||
@ -151,65 +151,7 @@ void HoymilesRadio_CMT::loop()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_busyFlag && _rxTimeout.occured()) {
|
handleReceivedPackage();
|
||||||
Hoymiles.getMessageOutput()->println("RX Period End");
|
|
||||||
std::shared_ptr<InverterAbstract> inv = Hoymiles.getInverterBySerial(_commandQueue.front().get()->getTargetAddress());
|
|
||||||
|
|
||||||
if (nullptr != inv) {
|
|
||||||
CommandAbstract* cmd = _commandQueue.front().get();
|
|
||||||
uint8_t verifyResult = inv->verifyAllFragments(cmd);
|
|
||||||
if (verifyResult == FRAGMENT_ALL_MISSING_RESEND) {
|
|
||||||
Hoymiles.getMessageOutput()->println("Nothing received, resend whole request");
|
|
||||||
sendLastPacketAgain();
|
|
||||||
|
|
||||||
} else if (verifyResult == FRAGMENT_ALL_MISSING_TIMEOUT) {
|
|
||||||
Hoymiles.getMessageOutput()->println("Nothing received, resend count exeeded");
|
|
||||||
_commandQueue.pop();
|
|
||||||
_busyFlag = false;
|
|
||||||
|
|
||||||
} else if (verifyResult == FRAGMENT_RETRANSMIT_TIMEOUT) {
|
|
||||||
Hoymiles.getMessageOutput()->println("Retransmit timeout");
|
|
||||||
_commandQueue.pop();
|
|
||||||
_busyFlag = false;
|
|
||||||
|
|
||||||
} else if (verifyResult == FRAGMENT_HANDLE_ERROR) {
|
|
||||||
Hoymiles.getMessageOutput()->println("Packet handling error");
|
|
||||||
_commandQueue.pop();
|
|
||||||
_busyFlag = false;
|
|
||||||
|
|
||||||
} else if (verifyResult > 0) {
|
|
||||||
// Perform Retransmit
|
|
||||||
Hoymiles.getMessageOutput()->print("Request retransmit: ");
|
|
||||||
Hoymiles.getMessageOutput()->println(verifyResult);
|
|
||||||
sendRetransmitPacket(verifyResult);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// Successful received all packages
|
|
||||||
Hoymiles.getMessageOutput()->println("Success");
|
|
||||||
_commandQueue.pop();
|
|
||||||
_busyFlag = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// If inverter was not found, assume the command is invalid
|
|
||||||
Hoymiles.getMessageOutput()->println("RX: Invalid inverter found");
|
|
||||||
_commandQueue.pop();
|
|
||||||
_busyFlag = false;
|
|
||||||
}
|
|
||||||
} else if (!_busyFlag) {
|
|
||||||
// Currently in idle mode --> send packet if one is in the queue
|
|
||||||
if (!_commandQueue.empty()) {
|
|
||||||
CommandAbstract* cmd = _commandQueue.front().get();
|
|
||||||
|
|
||||||
auto inv = Hoymiles.getInverterBySerial(cmd->getTargetAddress());
|
|
||||||
if (nullptr != inv) {
|
|
||||||
inv->clearRxFragmentBuffer();
|
|
||||||
sendEsbPacket(cmd);
|
|
||||||
} else {
|
|
||||||
Hoymiles.getMessageOutput()->println("TX: Invalid inverter found");
|
|
||||||
_commandQueue.pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HoymilesRadio_CMT::setPALevel(int8_t paLevel)
|
void HoymilesRadio_CMT::setPALevel(int8_t paLevel)
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "HoymilesRadio.h"
|
#include "HoymilesRadio.h"
|
||||||
#include "TimeoutHelper.h"
|
|
||||||
#include "commands/CommandAbstract.h"
|
#include "commands/CommandAbstract.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
@ -48,7 +47,6 @@ private:
|
|||||||
bool _gpio3_configured = false;
|
bool _gpio3_configured = false;
|
||||||
|
|
||||||
std::queue<fragment_t> _rxBuffer;
|
std::queue<fragment_t> _rxBuffer;
|
||||||
TimeoutHelper _rxTimeout;
|
|
||||||
TimeoutHelper _txTimeout;
|
TimeoutHelper _txTimeout;
|
||||||
|
|
||||||
uint32_t _inverterTargetFrequency = HOYMILES_CMT_WORK_FREQ;
|
uint32_t _inverterTargetFrequency = HOYMILES_CMT_WORK_FREQ;
|
||||||
|
|||||||
@ -94,65 +94,7 @@ void HoymilesRadio_NRF::loop()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_busyFlag && _rxTimeout.occured()) {
|
handleReceivedPackage();
|
||||||
Hoymiles.getMessageOutput()->println("RX Period End");
|
|
||||||
std::shared_ptr<InverterAbstract> inv = Hoymiles.getInverterBySerial(_commandQueue.front().get()->getTargetAddress());
|
|
||||||
|
|
||||||
if (nullptr != inv) {
|
|
||||||
CommandAbstract* cmd = _commandQueue.front().get();
|
|
||||||
uint8_t verifyResult = inv->verifyAllFragments(cmd);
|
|
||||||
if (verifyResult == FRAGMENT_ALL_MISSING_RESEND) {
|
|
||||||
Hoymiles.getMessageOutput()->println("Nothing received, resend whole request");
|
|
||||||
sendLastPacketAgain();
|
|
||||||
|
|
||||||
} else if (verifyResult == FRAGMENT_ALL_MISSING_TIMEOUT) {
|
|
||||||
Hoymiles.getMessageOutput()->println("Nothing received, resend count exeeded");
|
|
||||||
_commandQueue.pop();
|
|
||||||
_busyFlag = false;
|
|
||||||
|
|
||||||
} else if (verifyResult == FRAGMENT_RETRANSMIT_TIMEOUT) {
|
|
||||||
Hoymiles.getMessageOutput()->println("Retransmit timeout");
|
|
||||||
_commandQueue.pop();
|
|
||||||
_busyFlag = false;
|
|
||||||
|
|
||||||
} else if (verifyResult == FRAGMENT_HANDLE_ERROR) {
|
|
||||||
Hoymiles.getMessageOutput()->println("Packet handling error");
|
|
||||||
_commandQueue.pop();
|
|
||||||
_busyFlag = false;
|
|
||||||
|
|
||||||
} else if (verifyResult > 0) {
|
|
||||||
// Perform Retransmit
|
|
||||||
Hoymiles.getMessageOutput()->print("Request retransmit: ");
|
|
||||||
Hoymiles.getMessageOutput()->println(verifyResult);
|
|
||||||
sendRetransmitPacket(verifyResult);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// Successful received all packages
|
|
||||||
Hoymiles.getMessageOutput()->println("Success");
|
|
||||||
_commandQueue.pop();
|
|
||||||
_busyFlag = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// If inverter was not found, assume the command is invalid
|
|
||||||
Hoymiles.getMessageOutput()->println("RX: Invalid inverter found");
|
|
||||||
_commandQueue.pop();
|
|
||||||
_busyFlag = false;
|
|
||||||
}
|
|
||||||
} else if (!_busyFlag) {
|
|
||||||
// Currently in idle mode --> send packet if one is in the queue
|
|
||||||
if (!_commandQueue.empty()) {
|
|
||||||
CommandAbstract* cmd = _commandQueue.front().get();
|
|
||||||
|
|
||||||
auto inv = Hoymiles.getInverterBySerial(cmd->getTargetAddress());
|
|
||||||
if (nullptr != inv) {
|
|
||||||
inv->clearRxFragmentBuffer();
|
|
||||||
sendEsbPacket(cmd);
|
|
||||||
} else {
|
|
||||||
Hoymiles.getMessageOutput()->println("TX: Invalid inverter found");
|
|
||||||
_commandQueue.pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HoymilesRadio_NRF::setPALevel(rf24_pa_dbm_e paLevel)
|
void HoymilesRadio_NRF::setPALevel(rf24_pa_dbm_e paLevel)
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "HoymilesRadio.h"
|
#include "HoymilesRadio.h"
|
||||||
#include "TimeoutHelper.h"
|
|
||||||
#include "commands/CommandAbstract.h"
|
#include "commands/CommandAbstract.h"
|
||||||
#include <RF24.h>
|
#include <RF24.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -44,5 +43,4 @@ private:
|
|||||||
volatile bool _packetReceived = false;
|
volatile bool _packetReceived = false;
|
||||||
|
|
||||||
std::queue<fragment_t> _rxBuffer;
|
std::queue<fragment_t> _rxBuffer;
|
||||||
TimeoutHelper _rxTimeout;
|
|
||||||
};
|
};
|
||||||
Loading…
Reference in New Issue
Block a user