OpenDTU/lib/Hoymiles/src/HoymilesRadio.h
Thomas Basler 6a7bed0ecf Code Refactoring: Add inverter reference to each command
Instead of just adding the target_address to a command this patch adds a reference to the whole inverter instance
2024-05-16 19:54:09 +02:00

47 lines
1.2 KiB
C++

// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "commands/CommandAbstract.h"
#include "types.h"
#include <ThreadSafeQueue.h>
#include <TimeoutHelper.h>
#include <memory>
class HoymilesRadio {
public:
serial_u DtuSerial() const;
virtual void setDtuSerial(const uint64_t serial);
bool isIdle() const;
bool isQueueEmpty() const;
bool isInitialized() const;
void enqueCommand(std::shared_ptr<CommandAbstract> cmd)
{
_commandQueue.push(cmd);
}
template <typename T>
std::shared_ptr<T> prepareCommand(InverterAbstract* inv)
{
return std::make_shared<T>(inv);
}
protected:
static serial_u convertSerialToRadioId(const serial_u serial);
static void dumpBuf(const uint8_t buf[], const uint8_t len, const bool appendNewline = true);
bool checkFragmentCrc(const fragment_t& fragment) const;
virtual void sendEsbPacket(CommandAbstract& cmd) = 0;
void sendRetransmitPacket(const uint8_t fragment_id);
void sendLastPacketAgain();
void handleReceivedPackage();
serial_u _dtuSerial;
ThreadSafeQueue<std::shared_ptr<CommandAbstract>> _commandQueue;
bool _isInitialized = false;
bool _busyFlag = false;
TimeoutHelper _rxTimeout;
};