#ifndef FRAMEWORK_MONITORING_TWOVALUELIMITMONITOR_H_ #define FRAMEWORK_MONITORING_TWOVALUELIMITMONITOR_H_ #include "monitoringConf.h" #include "LimitMonitor.h" template class TwoValueLimitMonitor: public LimitMonitor { public: TwoValueLimitMonitor(object_id_t reporterId, uint8_t monitorId, uint32_t lowParameterId, uint32_t highParameterId, uint16_t confirmationLimit, T lowerLimit, T upperLimit, Event belowLowEvent = MonitoringIF::VALUE_BELOW_LOW_LIMIT, Event aboveHighEvent = MonitoringIF::VALUE_ABOVE_HIGH_LIMIT) : LimitMonitor(reporterId, monitorId, lowParameterId, confirmationLimit, lowerLimit, upperLimit, belowLowEvent, aboveHighEvent), highValueParameterId(highParameterId) { } virtual ~TwoValueLimitMonitor() { } ReturnValue_t doCheck(T lowSample, T highSample) { T crossedLimit; ReturnValue_t currentState = this->checkSample(lowSample, &crossedLimit); if (currentState != HasReturnvaluesIF::RETURN_OK) { return this->monitorStateIs(currentState, lowSample, crossedLimit); } currentState = this->checkSample(highSample, &crossedLimit); return this->monitorStateIs(currentState, highSample, crossedLimit); } protected: virtual void sendTransitionReport(T parameterValue, T crossedLimit, ReturnValue_t state) { uint32_t usedParameterId = this->parameterId; if (state == MonitoringIF::ABOVE_HIGH_LIMIT) { usedParameterId = this->highValueParameterId; } MonitoringReportContent report(usedParameterId, parameterValue, crossedLimit, this->oldState, state); LimitViolationReporter::sendLimitViolationReport(&report); } private: const uint32_t highValueParameterId; }; #endif /* FRAMEWORK_MONITORING_TWOVALUELIMITMONITOR_H_ */