Generate a second class abstraction to support different inverter types in future

This commit is contained in:
Thomas Basler 2022-06-24 17:49:14 +02:00
parent 183b919ae6
commit db0a3da803
12 changed files with 63 additions and 36 deletions

View File

@ -27,14 +27,7 @@ void HoymilesClass::loop()
Serial.println(iv->serial());
iv->clearRxFragmentBuffer();
time_t now;
time(&now);
if (now > 0) {
_radio->sendTimePacket(iv, now);
} else {
Serial.println(F("Cancled. Time not yet synced."));
}
_radio->sendTimePacket(iv);
}
if (++inverterPos >= getNumInverters()) {

View File

@ -250,29 +250,21 @@ void HoymilesRadio::sendEsbPacket(serial_u target, uint8_t mainCmd, uint8_t subC
_rxTimeout.set(timeout);
}
void HoymilesRadio::sendTimePacket(std::shared_ptr<InverterAbstract> iv, time_t ts)
void HoymilesRadio::sendTimePacket(std::shared_ptr<InverterAbstract> iv)
{
uint8_t payload[16] = { 0 };
inverter_transaction_t payload;
if (iv->getStatsRequest(&payload)) {
serial_u s;
s.u64 = iv->serial();
_activeSerial.u64 = iv->serial();
payload[0] = 0x0b;
payload[1] = 0x00;
u32CpyLittleEndian(&payload[2], ts); // sets the 4 following elements {2, 3, 4, 5}
payload[9] = 0x05;
uint16_t crc = crc16(&payload[0], 14);
payload[14] = (crc >> 8) & 0xff;
payload[15] = (crc)&0xff;
serial_u s;
s.u64 = iv->serial();
_activeSerial.u64 = iv->serial();
sendEsbPacket(s, 0x15, 0x80, payload, sizeof(payload) / sizeof(uint8_t), 200);
sendEsbPacket(s, payload.mainCmd, payload.subCmd, payload.payload, payload.len, payload.timeout);
}
}
void HoymilesRadio::sendRetransmitPacket(uint8_t fragment_id)
{
sendEsbPacket(_activeSerial, 0x15, (uint8_t)(0x80 + fragment_id), 0, 0, 60);
sendEsbPacket(_activeSerial, currentTransaction.mainCmd, (uint8_t)(0x80 + fragment_id), 0, 0, 60);
}
void HoymilesRadio::sendLastPacketAgain()

View File

@ -24,10 +24,12 @@ public:
bool isIdle();
void sendEsbPacket(serial_u target, uint8_t mainCmd, uint8_t subCmd, uint8_t payload[], uint8_t len, uint32_t timeout, bool resend = false);
void sendTimePacket(std::shared_ptr<InverterAbstract> iv, time_t ts);
void sendTimePacket(std::shared_ptr<InverterAbstract> iv);
void sendRetransmitPacket(uint8_t fragment_id);
void sendLastPacketAgain();
static void u32CpyLittleEndian(uint8_t dest[], uint32_t src);
private:
void ARDUINO_ISR_ATTR handleIntr();
static serial_u convertSerialToRadioId(serial_u serial);
@ -39,7 +41,6 @@ private:
void openWritingPipe(serial_u serial);
bool checkFragmentCrc(fragment_t* fragment);
void dumpBuf(const char* info, uint8_t buf[], uint8_t len);
void u32CpyLittleEndian(uint8_t dest[], uint32_t src);
std::unique_ptr<RF24> _radio;
uint8_t _rxChLst[5] = { 3, 23, 40, 61, 75 };

View File

@ -1,7 +1,7 @@
#include "HM_1CH.h"
HM_1CH::HM_1CH(uint64_t serial)
: InverterAbstract(serial) {};
: HM_Abstract(serial) {};
bool HM_1CH::isValidSerial(uint64_t serial)
{

View File

@ -1,8 +1,8 @@
#pragma once
#include "InverterAbstract.h"
#include "HM_Abstract.h"
class HM_1CH : public InverterAbstract {
class HM_1CH : public HM_Abstract {
public:
HM_1CH(uint64_t serial);
static bool isValidSerial(uint64_t serial);

View File

@ -1,7 +1,7 @@
#include "HM_2CH.h"
HM_2CH::HM_2CH(uint64_t serial)
: InverterAbstract(serial) {};
: HM_Abstract(serial) {};
bool HM_2CH::isValidSerial(uint64_t serial)
{

View File

@ -1,8 +1,8 @@
#pragma once
#include "InverterAbstract.h"
#include "HM_Abstract.h"
class HM_2CH : public InverterAbstract {
class HM_2CH : public HM_Abstract {
public:
HM_2CH(uint64_t serial);
static bool isValidSerial(uint64_t serial);

View File

@ -1,7 +1,7 @@
#include "HM_4CH.h"
HM_4CH::HM_4CH(uint64_t serial)
: InverterAbstract(serial) {};
: HM_Abstract(serial) {};
bool HM_4CH::isValidSerial(uint64_t serial)
{

View File

@ -1,8 +1,8 @@
#pragma once
#include "InverterAbstract.h"
#include "HM_Abstract.h"
class HM_4CH : public InverterAbstract {
class HM_4CH : public HM_Abstract {
public:
HM_4CH(uint64_t serial);
static bool isValidSerial(uint64_t serial);

View File

@ -0,0 +1,31 @@
#include "HM_Abstract.h"
#include "HoymilesRadio.h"
#include "crc.h"
HM_Abstract::HM_Abstract(uint64_t serial)
: InverterAbstract(serial) {};
bool HM_Abstract::getStatsRequest(inverter_transaction_t* payload)
{
time_t now;
time(&now);
memset(payload->payload, 0, MAX_RF_PAYLOAD_SIZE);
payload->mainCmd = 0x15;
payload->subCmd = 0x80;
payload->timeout = 200;
payload->len = 16;
payload->payload[0] = 0x0b;
payload->payload[1] = 0x00;
HoymilesRadio::u32CpyLittleEndian(&payload->payload[2], now); // sets the 4 following elements {2, 3, 4, 5}
payload->payload[9] = 0x05;
uint16_t crc = crc16(&payload->payload[0], 14);
payload->payload[14] = (crc >> 8) & 0xff;
payload->payload[15] = (crc)&0xff;
return now > 0;
}

View File

@ -0,0 +1,9 @@
#pragma once
#include "InverterAbstract.h"
class HM_Abstract : public InverterAbstract {
public:
HM_Abstract(uint64_t serial);
bool getStatsRequest(inverter_transaction_t* payload);
};

View File

@ -111,6 +111,7 @@ public:
const char* getUnit(uint8_t channel, uint8_t fieldId);
const char* getName(uint8_t channel, uint8_t fieldId);
virtual bool getStatsRequest(inverter_transaction_t* payload) = 0;
uint32_t getLastStatsUpdate();
private: