//----------------------------------------------------------------------------- // 2024 Ahoy, https://github.com/lumpapu/ahoy // Creative Commons - http://creativecommons.org/licenses/by-nc-sa/4.0/deed //----------------------------------------------------------------------------- #ifndef __MAX_VALUE__ #define __MAX_VALUE__ #pragma once #include #include #include "../hm/hmDefines.h" template class MaxPower { public: MaxPower() { mTs = nullptr; mMaxDiff = 60; reset(); } void setup(uint32_t *ts, uint16_t interval) { mTs = ts; mMaxDiff = interval * 4; } void reset(void) { mValues.fill(std::make_pair(0, 0.0)); mLast = 0.0; } void payloadEvent(uint8_t cmd, Inverter<> *iv) { if(RealTimeRunData_Debug != cmd) return; if(nullptr == iv) return; if(iv->id >= MAX_NUM_INVERTERS) return; record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); mValues[iv->id] = std::make_pair(*mTs, iv->getChannelFieldValue(CH0, FLD_PAC, rec)); } T getTotalMaxPower(void) { T val = 0; for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { if((mValues[i].first + mMaxDiff) >= *mTs) val += mValues[i].second; else if(mValues[i].first > 0) break; // old data } if(val > mLast) mLast = val; return mLast; } private: uint32_t *mTs; uint32_t mMaxDiff; float mLast; std::array, MAX_NUM_INVERTERS> mValues; }; #endif