/******************************************************* * * DESCRIPTION: QBG source classes (effort and flow) * * AUTHOR: Mariana C. D'Abreu * * EMAIL: mdabreu@dc.uba.ar * ********************************************************/ #ifndef _QBG_SOURCE_H #define _QBG_SOURCE_H #include "atomic.h" #include "except.h" #include "signal.h" #include "quantizer.h" #include "defaults.h" #include "value.h" #include "fstream.h" #define QBG_SOURCE_NAME "QBGSource" /*************************************** * * Quantized Bond Graph atomic model of * a generic source * ****************************************/ class QBGSource : public Atomic { public: QBGSource( const string &signalName, const string &name = QBG_SOURCE_NAME, const string &opname = DEFAULT_PORT_NAME, const string &ipname = DEFAULT_PORT_NAME ); virtual ~QBGSource(); static const RealValue DefaultStartTime; static const RealValue DefaultOffset; protected: virtual QBGSource &createSourceSignal( const string & ); virtual QBGSource &createSourceQuantizer(); virtual Model &initFunction(); virtual Model &externalFunction( const ExternalMessage &msg ); virtual Model &internalFunction( const InternalMessage &msg ) = 0; virtual Model &outputFunction( const InternalMessage &msg ); Port &out; // puerto de emision de valor const Port ∈ RealValue value; // valor emitido por la fuente RealValue quantum; // quantum RealValue hystWindow; // ventana de hysteresis RealValue offset; // offset de la fuente RealValue startTime; // start time RealValue timeUnit; // unit of time Signal *signal; // senial de la fuente Quantizer *quantizer; // cuantificador string classname; ofstream outFile; // output file string outFileName; }; /*************************************** * * Constant signal source * ****************************************/ class QBGSource_Constant : public QBGSource { public: QBGSource_Constant( const string &name = "QBGSource_Constant", const string &opname = DEFAULT_PORT_NAME, const string &ipname = DEFAULT_PORT_NAME ) :QBGSource( "Constant", name, opname, ipname ) {}; virtual ~QBGSource_Constant() {}; protected: virtual Model &initFunction(); virtual Model &internalFunction( const InternalMessage &msg ); }; class QBGSourceEffort_Constant : public QBGSource_Constant { public: QBGSourceEffort_Constant( const string &name = "QBGSourceEffort_Constant" ) :QBGSource_Constant( name, DEFAULT_EFFORT_PORT, DEFAULT_FLOW_PORT ) {}; virtual ~QBGSourceEffort_Constant() {}; }; class QBGSourceFlow_Constant : public QBGSource_Constant { public: QBGSourceFlow_Constant( const string &name = "QBGSourceFlow_Constant" ) :QBGSource_Constant( name, DEFAULT_FLOW_PORT, DEFAULT_EFFORT_PORT ) {}; virtual ~QBGSourceFlow_Constant() {}; }; /*************************************** * * Step signal source * ****************************************/ class QBGSource_Step : public QBGSource { public: QBGSource_Step( const string &name = "QBGSource_Step", const string &opname = DEFAULT_PORT_NAME, const string &ipname = DEFAULT_PORT_NAME ) :QBGSource( "Step", name, opname, ipname ) {}; virtual ~QBGSource_Step() {}; protected: virtual Model &initFunction(); virtual Model &internalFunction( const InternalMessage &msg ); private: }; class QBGSourceEffort_Step : public QBGSource_Step { public: QBGSourceEffort_Step( const string &name = "QBGSourceEffort_Step" ) :QBGSource_Step( name, DEFAULT_EFFORT_PORT, DEFAULT_FLOW_PORT ) {}; virtual ~QBGSourceEffort_Step() {}; }; class QBGSourceFlow_Step : public QBGSource_Step { public: QBGSourceFlow_Step( const string &name = "QBGSourceFlow_Step" ) :QBGSource_Step( name, DEFAULT_FLOW_PORT, DEFAULT_EFFORT_PORT ) {}; virtual ~QBGSourceFlow_Step() {}; }; /*************************************** * * Sine signal source * ****************************************/ class QBGSource_Sine : public QBGSource { public: QBGSource_Sine( const string &name = "QBGSource_Sine", const string &opname = DEFAULT_PORT_NAME, const string &ipname = DEFAULT_PORT_NAME ) :QBGSource( "Sine", name, opname, ipname ) {}; virtual ~QBGSource_Sine() {}; protected: virtual Model &initFunction(); virtual Model &internalFunction( const InternalMessage &msg ); virtual Model &outputFunction( const InternalMessage &msg ); private: RealValue qvalue; RealValue qvaluePrev; }; class QBGSourceEffort_Sine : public QBGSource_Sine { public: QBGSourceEffort_Sine( const string &name = "QBGSourceEffort_Sine" ) :QBGSource_Sine( name, DEFAULT_EFFORT_PORT, DEFAULT_FLOW_PORT ) {}; virtual ~QBGSourceEffort_Sine() {}; }; class QBGSourceFlow_Sine : public QBGSource_Sine { public: QBGSourceFlow_Sine( const string &name = "QBGSourceFlow_Sine" ) :QBGSource_Sine( name, DEFAULT_FLOW_PORT, DEFAULT_EFFORT_PORT ) {}; virtual ~QBGSourceFlow_Sine() {}; }; /*************************************** * * Pulse signal source * ****************************************/ class QBGSource_Pulse : public QBGSource { public: QBGSource_Pulse( const string &name = "QBGSource_Pulse", const string &opname = DEFAULT_PORT_NAME, const string &ipname = DEFAULT_PORT_NAME ) :QBGSource( "Pulse", name, opname, ipname ) {}; virtual ~QBGSource_Pulse() {}; protected: virtual Model &initFunction(); virtual Model &internalFunction( const InternalMessage &msg ); private: RealValue upvalue; RealValue dwvalue; RealValue widthup; RealValue widthdw; bool up; }; class QBGSourceEffort_Pulse : public QBGSource_Pulse { public: QBGSourceEffort_Pulse( const string &name = "QBGSourceEffort_Pulse" ) :QBGSource_Pulse( name, DEFAULT_EFFORT_PORT, DEFAULT_FLOW_PORT ) {}; virtual ~QBGSourceEffort_Pulse() {}; }; class QBGSourceFlow_Pulse : public QBGSource_Pulse { public: QBGSourceFlow_Pulse( const string &name = "QBGSourceFlow_Pulse" ) :QBGSource_Pulse( name, DEFAULT_FLOW_PORT, DEFAULT_EFFORT_PORT ) {}; virtual ~QBGSourceFlow_Pulse() {}; }; #endif