fsfw/src/fsfw/monitoring/MonitorBase.h

73 lines
2.2 KiB
C
Raw Normal View History

2020-12-03 18:24:51 +01:00
#ifndef FSFW_MONITORING_MONITORBASE_H_
#define FSFW_MONITORING_MONITORBASE_H_
2022-02-02 10:29:30 +01:00
#include "../datapoollocal/LocalPoolVariable.h"
2020-08-13 20:53:35 +02:00
#include "LimitViolationReporter.h"
2022-02-02 10:29:30 +01:00
#include "MonitorReporter.h"
2020-08-13 20:53:35 +02:00
#include "MonitoringIF.h"
#include "MonitoringMessageContent.h"
2022-02-02 10:29:30 +01:00
#include "monitoringConf.h"
2020-12-03 18:24:51 +01:00
/**
2020-12-03 18:24:51 +01:00
* @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.
*/
2022-02-02 10:29:30 +01:00
template <typename T>
class MonitorBase : public MonitorReporter<T> {
public:
MonitorBase(object_id_t reporterId, uint8_t monitorId, gp_id_t globalPoolId,
uint16_t confirmationLimit)
: MonitorReporter<T>(reporterId, monitorId, globalPoolId, confirmationLimit),
poolVariable(globalPoolId) {}
2020-12-03 18:24:51 +01:00
2022-02-02 10:29:30 +01:00
virtual ~MonitorBase() {}
2022-02-02 10:29:30 +01:00
virtual ReturnValue_t check() {
// 1. Fetch sample of type T, return validity.
T sample = 0;
ReturnValue_t validity = fetchSample(&sample);
2020-12-03 18:24:51 +01:00
2022-02-02 10:29:30 +01:00
// 2. If returning from fetch != OK, parameter is invalid.
// Report (if oldState is != invalidity).
2022-08-16 01:08:26 +02:00
if (validity != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
this->monitorStateIs(validity, sample, 0);
} else {
// 3. Otherwise, check sample.
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);
}
2022-02-02 10:29:30 +01:00
// Abstract or default.
virtual ReturnValue_t checkSample(T sample, T* crossedLimit) = 0;
2020-12-03 18:24:51 +01:00
2022-02-02 10:29:30 +01:00
protected:
virtual ReturnValue_t fetchSample(T* sample) {
ReturnValue_t result = poolVariable.read();
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
return result;
}
if (not poolVariable.isValid()) {
return MonitoringIF::INVALID;
}
*sample = poolVariable.value;
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2022-02-02 10:29:30 +01:00
}
2020-12-03 18:24:51 +01:00
2022-02-02 10:29:30 +01:00
LocalPoolVariable<T> poolVariable;
};
2020-12-03 18:24:51 +01:00
#endif /* FSFW_MONITORING_MONITORBASE_H_ */