diff --git a/include/rosa/agent/SystemState.hpp b/include/rosa/agent/SystemState.hpp index 808c7c0..0521a50 100644 --- a/include/rosa/agent/SystemState.hpp +++ b/include/rosa/agent/SystemState.hpp @@ -1,131 +1,161 @@ //===-- rosa/agent/SystemState.hpp ------------------------------*- C++ -*-===// // // The RoSA Framework // //===----------------------------------------------------------------------===// /// /// \file rosa/agent/SystemState.hpp /// /// \author Maximilian Götzinger (maximilian.goetzinger@tuwien.ac.at) /// /// \date 2019 /// /// \brief Definition of *system state* *functionality*. /// //===----------------------------------------------------------------------===// #ifndef ROSA_AGENT_SYSTEMSTATE_HPP #define ROSA_AGENT_SYSTEMSTATE_HPP #include "rosa/agent/Functionality.h" #include "rosa/agent/SignalState.hpp" #include "rosa/support/debug.hpp" #include namespace rosa { namespace agent { // System state conditions defining how the condition of a \c /// rosa::agent::SystemState is saved in \c rosa::agent::SystemStateInformation. enum class SystemStateCondition { STABLE, ///< The system state is stable DRIFTING, ///< The system state is drifting MALFUNCTIONING, ///< The system state is malfunctioning UNKNOWN ///< The system state is unknown }; /// TODO: write description template struct SystemStateInformation { // Make sure the actual type arguments are matching our expectations. STATIC_ASSERT((std::is_arithmetic::value), "confidence type is not to arithmetic"); /// The system state ID saved as an uint32_teger number uint32_t SystemStateID; /// The SystemStateConfidence shows the overall confidence value of the system /// state. CONFDATATYPE OverallDetectionConfidence; /// The SystemStateCondition shows the condition of a system state (stable, /// drifting, malfunctioning, or unknown) SystemStateCondition SystemStateCondition; /// The SystemStateIsValid saves the number of samples which have been /// inserted into the state after entering it. uint32_t NumberOfInsertedSamplesAfterEntrance; /// The SystemStateIsValid shows whether a state is valid or invalid. /// In this context, valid means that enough samples which are in close /// proximitry have been inserted into the state. bool SystemStateIsValid; /// The SystemStateJustGotValid shows whether a system state got valid /// (toggled from invalid to valid) during the current inserted sample. bool SystemStateJustGotValid; /// The SystemStateIsValidAfterReentrance shows whether a system state is /// valid after the variable changed back to it again. bool SystemStateIsValidAfterReentrance; }; // todo: do we need PROCDATATYPE? /// TODO TEXT template class SystemState : public Functionality { // Make sure the actual type arguments are matching our expectations. STATIC_ASSERT(std::is_arithmetic::value, "input data type is not to arithmetic"); STATIC_ASSERT(std::is_arithmetic::value, "confidence abstraction type is not to arithmetic"); STATIC_ASSERT(std::is_arithmetic::value, "process data type is not to arithmetic"); private: SystemStateInformation SystemStateInfo; std::vector> Signals; uint32_t NumberOfSignals; public: /// TODO write SystemState(uint32_t SignalStateID, uint32_t NumberOfSignals) noexcept : SystemStateInfo{SignalStateID, 0, SystemStateCondition::UNKNOWN, 0, false, false, false}, NumberOfSignals(NumberOfSignals) { Signals.resize(NumberOfSignals); } /// Destroys \p this object. ~SystemState(void) = default; template void insertSignalStateInfos(const std::array, size> &Data) noexcept { ASSERT(size <= NumberOfSignals); std::size_t counter = 0; for (auto tmp : Data) { Signals.at(counter) = tmp; counter++; } } template std::enable_if_t>...>, void> insertSignalStateInfos(Types... Data) { insertSignalStateInfos( std::array, sizeof...(Data)>( {Data...})); } + + + // returns true if they are identical + template + bool + compareSignalStateInfos(const std::array, + size> &Data) noexcept { + std::size_t counter = 0; + for (auto tmp : Data) { + if(Signals.at(counter) != tmp) + return false; + counter++; + } + return true; + } + + // checks only the given amount + template + std::enable_if_t>...>, + bool> + compareSignalStateInfos(Types... Data) { + return compareSignalStateInfos( + std::array, sizeof...(Data)>( + {Data...})); + } + + + + }; } // End namespace agent } // End namespace rosa #endif // ROSA_AGENT_SYSTEMSTATE_HPP