Generate a second class abstraction to support different inverter types in future
This commit is contained in:
parent
183b919ae6
commit
db0a3da803
@ -27,14 +27,7 @@ void HoymilesClass::loop()
|
|||||||
Serial.println(iv->serial());
|
Serial.println(iv->serial());
|
||||||
|
|
||||||
iv->clearRxFragmentBuffer();
|
iv->clearRxFragmentBuffer();
|
||||||
|
_radio->sendTimePacket(iv);
|
||||||
time_t now;
|
|
||||||
time(&now);
|
|
||||||
if (now > 0) {
|
|
||||||
_radio->sendTimePacket(iv, now);
|
|
||||||
} else {
|
|
||||||
Serial.println(F("Cancled. Time not yet synced."));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (++inverterPos >= getNumInverters()) {
|
if (++inverterPos >= getNumInverters()) {
|
||||||
|
|||||||
@ -250,29 +250,21 @@ void HoymilesRadio::sendEsbPacket(serial_u target, uint8_t mainCmd, uint8_t subC
|
|||||||
_rxTimeout.set(timeout);
|
_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)) {
|
||||||
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;
|
serial_u s;
|
||||||
s.u64 = iv->serial();
|
s.u64 = iv->serial();
|
||||||
_activeSerial.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)
|
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()
|
void HoymilesRadio::sendLastPacketAgain()
|
||||||
|
|||||||
@ -24,10 +24,12 @@ public:
|
|||||||
|
|
||||||
bool isIdle();
|
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 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 sendRetransmitPacket(uint8_t fragment_id);
|
||||||
void sendLastPacketAgain();
|
void sendLastPacketAgain();
|
||||||
|
|
||||||
|
static void u32CpyLittleEndian(uint8_t dest[], uint32_t src);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void ARDUINO_ISR_ATTR handleIntr();
|
void ARDUINO_ISR_ATTR handleIntr();
|
||||||
static serial_u convertSerialToRadioId(serial_u serial);
|
static serial_u convertSerialToRadioId(serial_u serial);
|
||||||
@ -39,7 +41,6 @@ private:
|
|||||||
void openWritingPipe(serial_u serial);
|
void openWritingPipe(serial_u serial);
|
||||||
bool checkFragmentCrc(fragment_t* fragment);
|
bool checkFragmentCrc(fragment_t* fragment);
|
||||||
void dumpBuf(const char* info, uint8_t buf[], uint8_t len);
|
void dumpBuf(const char* info, uint8_t buf[], uint8_t len);
|
||||||
void u32CpyLittleEndian(uint8_t dest[], uint32_t src);
|
|
||||||
|
|
||||||
std::unique_ptr<RF24> _radio;
|
std::unique_ptr<RF24> _radio;
|
||||||
uint8_t _rxChLst[5] = { 3, 23, 40, 61, 75 };
|
uint8_t _rxChLst[5] = { 3, 23, 40, 61, 75 };
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#include "HM_1CH.h"
|
#include "HM_1CH.h"
|
||||||
|
|
||||||
HM_1CH::HM_1CH(uint64_t serial)
|
HM_1CH::HM_1CH(uint64_t serial)
|
||||||
: InverterAbstract(serial) {};
|
: HM_Abstract(serial) {};
|
||||||
|
|
||||||
bool HM_1CH::isValidSerial(uint64_t serial)
|
bool HM_1CH::isValidSerial(uint64_t serial)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "InverterAbstract.h"
|
#include "HM_Abstract.h"
|
||||||
|
|
||||||
class HM_1CH : public InverterAbstract {
|
class HM_1CH : public HM_Abstract {
|
||||||
public:
|
public:
|
||||||
HM_1CH(uint64_t serial);
|
HM_1CH(uint64_t serial);
|
||||||
static bool isValidSerial(uint64_t serial);
|
static bool isValidSerial(uint64_t serial);
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#include "HM_2CH.h"
|
#include "HM_2CH.h"
|
||||||
|
|
||||||
HM_2CH::HM_2CH(uint64_t serial)
|
HM_2CH::HM_2CH(uint64_t serial)
|
||||||
: InverterAbstract(serial) {};
|
: HM_Abstract(serial) {};
|
||||||
|
|
||||||
bool HM_2CH::isValidSerial(uint64_t serial)
|
bool HM_2CH::isValidSerial(uint64_t serial)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "InverterAbstract.h"
|
#include "HM_Abstract.h"
|
||||||
|
|
||||||
class HM_2CH : public InverterAbstract {
|
class HM_2CH : public HM_Abstract {
|
||||||
public:
|
public:
|
||||||
HM_2CH(uint64_t serial);
|
HM_2CH(uint64_t serial);
|
||||||
static bool isValidSerial(uint64_t serial);
|
static bool isValidSerial(uint64_t serial);
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#include "HM_4CH.h"
|
#include "HM_4CH.h"
|
||||||
|
|
||||||
HM_4CH::HM_4CH(uint64_t serial)
|
HM_4CH::HM_4CH(uint64_t serial)
|
||||||
: InverterAbstract(serial) {};
|
: HM_Abstract(serial) {};
|
||||||
|
|
||||||
bool HM_4CH::isValidSerial(uint64_t serial)
|
bool HM_4CH::isValidSerial(uint64_t serial)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "InverterAbstract.h"
|
#include "HM_Abstract.h"
|
||||||
|
|
||||||
class HM_4CH : public InverterAbstract {
|
class HM_4CH : public HM_Abstract {
|
||||||
public:
|
public:
|
||||||
HM_4CH(uint64_t serial);
|
HM_4CH(uint64_t serial);
|
||||||
static bool isValidSerial(uint64_t serial);
|
static bool isValidSerial(uint64_t serial);
|
||||||
|
|||||||
31
lib/Hoymiles/src/inverters/HM_Abstract.cpp
Normal file
31
lib/Hoymiles/src/inverters/HM_Abstract.cpp
Normal 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;
|
||||||
|
}
|
||||||
9
lib/Hoymiles/src/inverters/HM_Abstract.h
Normal file
9
lib/Hoymiles/src/inverters/HM_Abstract.h
Normal 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);
|
||||||
|
};
|
||||||
@ -111,6 +111,7 @@ public:
|
|||||||
const char* getUnit(uint8_t channel, uint8_t fieldId);
|
const char* getUnit(uint8_t channel, uint8_t fieldId);
|
||||||
const char* getName(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();
|
uint32_t getLastStatsUpdate();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user