only on ESP32-S3-USB. this fiddles with the available hardware UARTs to make it possible to use a third Victron MPPT. if three MPPTs are defined int the pin mapping, you will not be able to use the SmartShunt and JK BMS battery interfaces. note that using a second MPPT will also conflict with the SDM power meter, and that conflict is not detected, yet.
56 lines
1.2 KiB
C++
56 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#include <Arduino.h>
|
|
#include "VeDirectData.h"
|
|
#include "VeDirectFrameHandler.h"
|
|
|
|
template<typename T, size_t WINDOW_SIZE>
|
|
class MovingAverage {
|
|
public:
|
|
MovingAverage()
|
|
: _sum(0)
|
|
, _index(0)
|
|
, _count(0) { }
|
|
|
|
void addNumber(T num) {
|
|
if (_count < WINDOW_SIZE) {
|
|
_count++;
|
|
} else {
|
|
_sum -= _window[_index];
|
|
}
|
|
|
|
_window[_index] = num;
|
|
_sum += num;
|
|
_index = (_index + 1) % WINDOW_SIZE;
|
|
}
|
|
|
|
float getAverage() const {
|
|
if (_count == 0) { return 0.0; }
|
|
return static_cast<float>(_sum) / _count;
|
|
}
|
|
|
|
private:
|
|
std::array<T, WINDOW_SIZE> _window;
|
|
T _sum;
|
|
size_t _index;
|
|
size_t _count;
|
|
};
|
|
|
|
class VeDirectMpptController : public VeDirectFrameHandler<veMpptStruct> {
|
|
public:
|
|
VeDirectMpptController() = default;
|
|
|
|
void init(int8_t rx, int8_t tx, Print* msgOut,
|
|
bool verboseLogging, uint8_t hwSerialPort);
|
|
|
|
using data_t = veMpptStruct;
|
|
|
|
void loop() final;
|
|
|
|
private:
|
|
bool hexDataHandler(VeDirectHexData const &data) final;
|
|
bool processTextDataDerived(std::string const& name, std::string const& value) final;
|
|
void frameValidEvent() final;
|
|
MovingAverage<float, 5> _efficiency;
|
|
};
|