MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/schematic/SignalMath.hpp

77 lines
2.1 KiB
C++

/*
* SignalMath.hpp
*
* Created on: 9 èþí. 2020 ã.
* Author: LeonidTitov
*/
#ifndef UMLIBRARY_SCHEMATIC_SIGNALMATH_HPP_
#define UMLIBRARY_SCHEMATIC_SIGNALMATH_HPP_
#include "../systemic/ISignal.hh"
#include <cmath>
#include <functional>
namespace systemic { namespace detail {
//!Àáñîëþòíîå çíà÷åíèå ñèãíàëà. Ðåàëèçóåò ôóíêöèþ float = |value|.
class SignalAbs : public systemic::ISignal {
public:
SignalAbs( systemic::ISignal & value ) : value(value) {}
operator float() const {
return fabsf( value );
}
private:
systemic::ISignal & value;
};
template<typename Equation>
class SignalEquation2 : public systemic::ISignal {
public:
SignalEquation2( systemic::ISignal & a, systemic::ISignal & b, Equation eq = Equation() ) : a(a), b(b), equation(eq) {}
operator float() const {
return equation( a, b );
}
private:
Equation equation;
systemic::ISignal & a;
systemic::ISignal & b;
};
//!Ðàçíèöà äâóõ ñèãíàëîâ. Ðåàëèçóåò ôóíêöèþ float = a - b.
typedef SignalEquation2< std::minus<float> > SignalSubtraction;
typedef SignalEquation2< std::plus<float> > SignalAddition;
typedef SignalEquation2< std::multiplies<float> > SignalMultiplication;
typedef SignalEquation2< std::divides<float> > SignalDivision;
typedef SignalEquation2< std::modulus<float> > SignalModulation;
typedef SignalEquation2< std::pointer_to_binary_function<float, float, float> >
SignalBinaryFunction;
template<typename Equation>
class SignalEquation1 : public systemic::ISignal {
public:
SignalEquation1( systemic::ISignal & a, Equation eq = Equation() ) : a(a), equation(eq) {}
operator float() const {
return equation( a );
}
private:
Equation equation;
systemic::ISignal & a;
};
typedef SignalEquation1< std::negate<float> > SignalNegation;
typedef SignalEquation1< std::pointer_to_unary_function<float, float> > SignalUnaryFunction;
}}
#endif /* UMLIBRARY_SCHEMATIC_SIGNALMATH_HPP_ */