2020-12-03 18:24:51 +01:00
|
|
|
#ifndef FSFW_MONITORING_MONITORBASE_H_
|
|
|
|
#define FSFW_MONITORING_MONITORBASE_H_
|
2016-06-15 23:48:41 +02:00
|
|
|
|
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
|
|
|
|
2016-06-15 23:48:41 +02: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.
|
2016-06-15 23:48:41 +02:00
|
|
|
*/
|
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() {}
|
2016-06-15 23:48:41 +02:00
|
|
|
|
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-15 20:28:16 +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);
|
|
|
|
}
|
2016-06-15 23:48:41 +02:00
|
|
|
|
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-15 20:28:16 +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-15 20:28:16 +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;
|
2016-06-15 23:48:41 +02:00
|
|
|
};
|
|
|
|
|
2020-12-03 18:24:51 +01:00
|
|
|
#endif /* FSFW_MONITORING_MONITORBASE_H_ */
|