#ifndef FSFW_MONITORING_MONITORBASE_H_ #define FSFW_MONITORING_MONITORBASE_H_ #include "LimitViolationReporter.h" #include "MonitoringIF.h" #include "MonitoringMessageContent.h" #include "MonitorReporter.h" #include "../datapoolglob/GlobalDataSet.h" #include "../datapoolglob/PIDReader.h" /** * @brief Base class for monitoring of parameters. * @details * Can be used anywhere, specializations need to implement checkSample and * should override sendTransitionEvent. * Manages state handling, enabling and disabling of events/reports and * forwarding of transition reports via MonitorReporter. * * In addition, it provides default implementations for fetching the * parameter sample from the data pool and a simple confirmation counter. */ template class MonitorBase: public MonitorReporter { public: MonitorBase(object_id_t reporterId, uint8_t monitorId, uint32_t parameterId, uint16_t confirmationLimit) : MonitorReporter(reporterId, monitorId, parameterId, confirmationLimit) { } virtual ~MonitorBase() { } virtual ReturnValue_t check() { // 1. Fetch sample of type T, return validity. T sample = 0; ReturnValue_t validity = fetchSample(&sample); // 2. If returning from fetch != OK, parameter is invalid. // Report (if oldState is != invalidity). if (validity != HasReturnvaluesIF::RETURN_OK) { this->monitorStateIs(validity, sample, 0); //3. Otherwise, check sample. } else { this->oldState = doCheck(sample); } return this->oldState; } virtual ReturnValue_t doCheck(T sample) { T crossedLimit = 0.0; ReturnValue_t currentState = checkSample(sample, &crossedLimit); return this->monitorStateIs(currentState,sample, crossedLimit); } // Abstract or default. virtual ReturnValue_t checkSample(T sample, T* crossedLimit) = 0; protected: virtual ReturnValue_t fetchSample(T* sample) { GlobDataSet mySet; PIDReader parameter(this->parameterId, &mySet); mySet.read(); if (!parameter.isValid()) { return MonitoringIF::INVALID; } *sample = parameter.value; return HasReturnvaluesIF::RETURN_OK; } }; #endif /* FSFW_MONITORING_MONITORBASE_H_ */