Files
qad/mbricks/brick_link.h
Бычков Андрей ba8bc27298 1
git-svn-id: svn://db.shs.com.ru/libs@1 a8b55f48-bf90-11e4-a774-851b48703e85
2015-02-28 21:28:53 +00:00

84 lines
3.0 KiB
C++

#ifndef BRICK_LINK_H
#define BRICK_LINK_H
#include "brick_math.h"
class BrickLinkBase: public BrickBase {
public:
BrickLinkBase(int inputs_num = 1, int outputs_num = 1, int parameters_num = 0): BrickBase(inputs_num, outputs_num, parameters_num + 1) {
lib = "Links";
paramNames[0] = "Method";
parameters[0].setValue(-1);
note_ = "Methods description you can find in help content.";//PIMathSolver::methods_desc;
}
};
class BrickLinkTransferFunction: public BrickLinkBase {
MBRICK(BrickLinkTransferFunction)
BrickLinkTransferFunction(const PIString & num = "1", const PIString & denom = "1 1");
virtual void parameterChanged(int index);
virtual void reset_specified() {started();}
virtual void started() {parameterChanged(1); KF.fromTF(TF);}
virtual bool tick_body(double time);
private:
void copied() {reset_specified();}
PIMathSolver KF;
TransferFunction TF;
};
class BrickLinkFilter1Degree: public BrickLinkBase {
MBRICK(BrickLinkFilter1Degree)
BrickLinkFilter1Degree(double t = 1., double k = 1.);
virtual void reset_specified() {s.reset(); a.reset(); i.reset(); i.setInputValue(1, 1.);}
enum Inputs {Input, T, K};
enum Outputs {LowPass, HighPass};
void setParameters(double t, double k) {inputs[T] = t; inputs[K] = k;}
virtual void started() {parameterChanged(0);}
virtual bool tick_body(double time);
virtual void parameterChanged(int index) {i.setParameterValue(index, parameters[index]);}
private:
void copied() {clearConnections(); makeConnections();}
void clearConnections() {s.clearConnections(); a.clearConnections(); i.clearConnections();}
void makeConnections() {connect(s, 0, a, BrickMathAmplifier::Input); BrickBase::connect(a, 0, i, 0); BrickBase::connect(i, 0, s, 1);}
BrickMathSum s;
BrickMathAmplifier a;
BrickMathIntegral i;
};
ADD_NEW_TO_COLLECTION(Links, BrickLinkFilter1Degree)
class BrickLinkFilterBandpass: public BrickLinkBase {
MBRICK(BrickLinkFilterBandpass)
BrickLinkFilterBandpass(double lf = 1., double hf = 2.);
enum Inputs {Input, LF, HF};
inline void setParameters(double lf, double hf) {inputs[LF] = lf; inputs[HF] = hf;}
virtual void parameterChanged(int index) {KF.setMethod((PIMathSolver::Method)parameters[0].toInt());}
virtual void reset_specified() {started();}
virtual void started() {pl = ph = 0.; setParameters(inputs[LF], inputs[HF]); KF.fromTF(TF);}
virtual bool tick_body(double time);
private:
double pl, ph, t0, t1;
PIMathSolver KF;
TransferFunction TF;
};
ADD_NEW_TO_COLLECTION(Links, BrickLinkFilterBandpass)
class BrickLinkFilterMedian: public BrickLinkBase {
MBRICK(BrickLinkFilterMedian)
BrickLinkFilterMedian(int count = 3);
inline void setParameters(int count) {parameters[0].setValue(piMaxi(count, 0)); hist_.resize(count);}
virtual void parameterChanged(int index) {hist_.resize(parameters[0].toInt()); hsort.resize(hist_.size());}
virtual void reset_specified() {started();}
virtual void started() {hist_.fill(0.);}
virtual bool tick_body(double time);
private:
PIVector<double> hist_, hsort;
};
ADD_NEW_TO_COLLECTION(Links, BrickLinkFilterMedian)
#endif // BRICK_LINK_H