Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
.vscode/settings.json
.pio/
.vscode/
platformio-device-monitor*.log
10 changes: 0 additions & 10 deletions .vscode/extensions.json

This file was deleted.

7 changes: 7 additions & 0 deletions include/Clock_Impl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "Clock.h"

class Clock_Impl : public Clock {
public:
int getTimezoneOffset();
bool getNow(time_t* nowPtr);
};
14 changes: 14 additions & 0 deletions lib/Hoymiles/src/Clock.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#pragma once

#include <time.h>

class Clock {

public:
virtual int getTimezoneOffset() = 0;

/**
* @brief Gets the instant in epoch time. Returns false if no time is available
*/
virtual bool getNow(time_t* timePtr) = 0;
};
12 changes: 7 additions & 5 deletions lib/Hoymiles/src/Hoymiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@
#include "inverters/HM_2CH.h"
#include "inverters/HM_4CH.h"
#include <Arduino.h>
#include "Clock.h"

HoymilesClass Hoymiles;

void HoymilesClass::init()
void HoymilesClass::init(_SPI* initialisedSpiBus, Clock* clock)
{
_pollInterval = 0;
_radio.reset(new HoymilesRadio());
_radio->init();
_radio->init(initialisedSpiBus);
_clock = clock;
}

void HoymilesClass::loop()
Expand Down Expand Up @@ -57,11 +59,11 @@ std::shared_ptr<InverterAbstract> HoymilesClass::addInverter(const char* name, u
{
std::shared_ptr<InverterAbstract> i = nullptr;
if (HM_4CH::isValidSerial(serial)) {
i = std::make_shared<HM_4CH>(serial);
i = std::make_shared<HM_4CH>(serial, _clock);
} else if (HM_2CH::isValidSerial(serial)) {
i = std::make_shared<HM_2CH>(serial);
i = std::make_shared<HM_2CH>(serial, _clock);
} else if (HM_1CH::isValidSerial(serial)) {
i = std::make_shared<HM_1CH>(serial);
i = std::make_shared<HM_1CH>(serial, _clock);
}

if (i) {
Expand Down
10 changes: 6 additions & 4 deletions lib/Hoymiles/src/Hoymiles.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
#include "inverters/InverterAbstract.h"
#include "types.h"
#include <SPI.h>
#include <memory>
#include <vector>
#include "mp_memory.h"
#include "mp_vector.h"
#include "Clock.h"

#define HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL (10 * 60 * 1000) // 10 minutes
#define HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL ((uint32_t) 10 * 60 * 1000) // 10 minutes

class HoymilesClass {
public:
void init();
void init(_SPI* initialisedSpiBus, Clock* clock);
void loop();

std::shared_ptr<InverterAbstract> addInverter(const char* name, uint64_t serial);
Expand All @@ -30,6 +31,7 @@ class HoymilesClass {
std::vector<std::shared_ptr<InverterAbstract>> _inverters;
std::unique_ptr<HoymilesRadio> _radio;

Clock* _clock;
uint32_t _pollInterval = 0;
uint32_t _lastPoll = 0;
};
Expand Down
17 changes: 10 additions & 7 deletions lib/Hoymiles/src/HoymilesRadio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@
#include "commands/RequestFrameCommand.h"
#include "crc.h"
#include <Every.h>
#include <FunctionalInterrupt.h>

void HoymilesRadio::init()
volatile bool HoymilesRadio::_packetReceived = false;

void HoymilesRadio::init(_SPI* initialisedSpiBus)
{
_dtuSerial.u64 = 0;

_hspi.reset(new SPIClass(HSPI));
_spiPtr.reset(initialisedSpiBus);
// https://www.reddit.com/r/embedded/comments/k8zix6/comment/gf18kbs/?utm_source=share&utm_medium=web2x&context=3
// Only for nRF Lib:
// > The chip enable pin (together with a few register settings) is used to change between RX and TX mode
_radio.reset(new RF24(HOYMILES_PIN_CE, HOYMILES_PIN_CS));

_hspi->begin(HOYMILES_PIN_SCLK, HOYMILES_PIN_MISO, HOYMILES_PIN_MOSI, HOYMILES_PIN_CS);
_radio->begin(_hspi.get());
_radio->begin(_spiPtr.get());

_radio->setDataRate(RF24_250KBPS);
_radio->enableDynamicPayloads();
Expand All @@ -27,7 +30,7 @@ void HoymilesRadio::init()
Serial.println(F("Connection error!!"));
}

attachInterrupt(digitalPinToInterrupt(HOYMILES_PIN_IRQ), std::bind(&HoymilesRadio::handleIntr, this), FALLING);
attachInterrupt(digitalPinToInterrupt(HOYMILES_PIN_IRQ), handleIntr, FALLING);

openReadingPipe();
_radio->startListening();
Expand Down Expand Up @@ -178,7 +181,7 @@ void HoymilesRadio::openWritingPipe(serial_u serial)

void ARDUINO_ISR_ATTR HoymilesRadio::handleIntr()
{
_packetReceived = true;
HoymilesRadio::_packetReceived = true;
}

uint8_t HoymilesRadio::getRxNxtChannel()
Expand Down
18 changes: 11 additions & 7 deletions lib/Hoymiles/src/HoymilesRadio.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,13 @@
#include "commands/CommandAbstract.h"
#include "types.h"
#include <RF24.h>
#include <memory>
#include "mp_memory.h"
#include <nRF24L01.h>
#include <queue>
#include "mp_queue.h"

#ifdef __AVR__
#define ARDUINO_ISR_ATTR
#endif

// number of fragments hold in buffer
#define FRAGMENT_BUFFER_SIZE 30
Expand Down Expand Up @@ -40,7 +44,7 @@

class HoymilesRadio {
public:
void init();
void init(_SPI* initialisedSpiBus);
void loop();
void setPALevel(rf24_pa_dbm_e paLevel);

Expand All @@ -59,8 +63,10 @@ class HoymilesRadio {
return static_cast<T*>(_commandQueue.back().get());
}

volatile static bool _packetReceived;

private:
void ARDUINO_ISR_ATTR handleIntr();
static void ARDUINO_ISR_ATTR handleIntr();
static serial_u convertSerialToRadioId(serial_u serial);
uint8_t getRxNxtChannel();
uint8_t getTxNxtChannel();
Expand All @@ -70,16 +76,14 @@ class HoymilesRadio {
bool checkFragmentCrc(fragment_t* fragment);
void dumpBuf(const char* info, uint8_t buf[], uint8_t len);

std::unique_ptr<SPIClass> _hspi;
std::unique_ptr<_SPI> _spiPtr;
std::unique_ptr<RF24> _radio;
uint8_t _rxChLst[5] = { 3, 23, 40, 61, 75 };
uint8_t _rxChIdx = 0;

uint8_t _txChLst[5] = { 3, 23, 40, 61, 75 };
uint8_t _txChIdx = 0;

volatile bool _packetReceived = false;

CircularBuffer<fragment_t, FRAGMENT_BUFFER_SIZE> _rxBuffer;
TimeoutHelper _rxTimeout;

Expand Down
8 changes: 4 additions & 4 deletions lib/Hoymiles/src/commands/MultiDataCommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ void MultiDataCommand::setTime(time_t time)

time_t MultiDataCommand::getTime()
{
return (time_t)(_payload[12] << 24)
| (time_t)(_payload[13] << 16)
| (time_t)(_payload[14] << 8)
| (time_t)(_payload[15]);
return ((time_t) _payload[12] << 24)
| ((time_t) _payload[13] << 16)
| ((time_t) _payload[14] << 8)
| ((time_t) _payload[15]);
}

CommandAbstract* MultiDataCommand::getRequestFrameCommand(uint8_t frame_no)
Expand Down
2 changes: 1 addition & 1 deletion lib/Hoymiles/src/commands/MultiDataCommand.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#include "CommandAbstract.h"
#include "RequestFrameCommand.h"
#include <sys/time.h>
#include <time.h>

class MultiDataCommand : public CommandAbstract {
public:
Expand Down
4 changes: 2 additions & 2 deletions lib/Hoymiles/src/inverters/HM_1CH.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "HM_1CH.h"

HM_1CH::HM_1CH(uint64_t serial)
: HM_Abstract(serial) {};
HM_1CH::HM_1CH(uint64_t serial, Clock* clock)
: HM_Abstract(serial, clock) {};

bool HM_1CH::isValidSerial(uint64_t serial)
{
Expand Down
3 changes: 2 additions & 1 deletion lib/Hoymiles/src/inverters/HM_1CH.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

class HM_1CH : public HM_Abstract {
public:
explicit HM_1CH(uint64_t serial);
explicit HM_1CH(uint64_t serial, Clock* clock);
static bool isValidSerial(uint64_t serial);
String typeName();
const byteAssign_t* getByteAssignment();
Expand All @@ -31,4 +31,5 @@ class HM_1CH : public HM_Abstract {
{ FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC },
{ FLD_EFF, UNIT_PCT, CH0, CALC_EFF_CH0, 0, CMD_CALC }
};
Clock* _clock;
};
4 changes: 2 additions & 2 deletions lib/Hoymiles/src/inverters/HM_2CH.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "HM_2CH.h"

HM_2CH::HM_2CH(uint64_t serial)
: HM_Abstract(serial) {};
HM_2CH::HM_2CH(uint64_t serial, Clock* clock)
: HM_Abstract(serial, clock) {};

bool HM_2CH::isValidSerial(uint64_t serial)
{
Expand Down
3 changes: 2 additions & 1 deletion lib/Hoymiles/src/inverters/HM_2CH.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

class HM_2CH : public HM_Abstract {
public:
explicit HM_2CH(uint64_t serial);
explicit HM_2CH(uint64_t serial, Clock* clock);
static bool isValidSerial(uint64_t serial);
String typeName();
const byteAssign_t* getByteAssignment();
Expand Down Expand Up @@ -38,4 +38,5 @@ class HM_2CH : public HM_Abstract {
{ FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC },
{ FLD_EFF, UNIT_PCT, CH0, CALC_EFF_CH0, 0, CMD_CALC }
};
Clock* _clock;
};
4 changes: 2 additions & 2 deletions lib/Hoymiles/src/inverters/HM_4CH.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "HM_4CH.h"

HM_4CH::HM_4CH(uint64_t serial)
: HM_Abstract(serial) {};
HM_4CH::HM_4CH(uint64_t serial, Clock* clock)
: HM_Abstract(serial, clock) {};

bool HM_4CH::isValidSerial(uint64_t serial)
{
Expand Down
3 changes: 2 additions & 1 deletion lib/Hoymiles/src/inverters/HM_4CH.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

class HM_4CH : public HM_Abstract {
public:
explicit HM_4CH(uint64_t serial);
explicit HM_4CH(uint64_t serial, Clock* clock);
static bool isValidSerial(uint64_t serial);
String typeName();
const byteAssign_t* getByteAssignment();
Expand Down Expand Up @@ -53,4 +53,5 @@ class HM_4CH : public HM_Abstract {
{ FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC },
{ FLD_EFF, UNIT_PCT, CH0, CALC_EFF_CH0, 0, CMD_CALC }
};
Clock* _clock;
};
Loading