#pragma once #include #include "VeDirectData.h" #include "VeDirectFrameHandler.h" template 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(_sum) / _count; } private: std::array _window; T _sum; size_t _index; size_t _count; }; class VeDirectMpptController : public VeDirectFrameHandler { 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 _efficiency; };