diff --git a/simulators/c++av/src_simulator/app/AvActionCmd.cpp b/simulators/c++av/src_simulator/app/AvActionCmd.cpp index 56b8ab3ca1ab5c1855beee2f8590dbf0784d734e..820e6cdddb8cce5f9b54180af9dbecf63f2f1f56 100644 --- a/simulators/c++av/src_simulator/app/AvActionCmd.cpp +++ b/simulators/c++av/src_simulator/app/AvActionCmd.cpp @@ -40,14 +40,16 @@ Ludovic Apvrille, Renaud Pacalet #include<AvActionCmd.h> #include<AvTransition.h> -AvActionCmd::AvActionCmd(ID iID, AvBlock* iBlock, ActionFuncPointer iActionFunc, std::string iActionDescr, bool iDirectExec=false): AvSingleTransCmd(iID, "Action", iBlock,1), _actionFunc(iActionFunc), _actionDescr(iActionDescr), _directExec(iDirectExec){ +AvActionCmd::AvActionCmd(ID iID, AvBlock* iBlock, ActionFuncPointer iActionFunc, std::string iActionDescr, bool iDirectExec): AvSingleTransCmd(iID, "Action", iBlock,1), _actionFunc(iActionFunc), _actionDescr(iActionDescr), _directExec(iDirectExec){ } AvActionCmd::~AvActionCmd(){ } AvNode* AvActionCmd::prepare(bool iControlTransfer){ + //std::cout << "action prepare"; if (iControlTransfer && _directExec){ + //std::cout << "go on\n"; (_block->*_actionFunc)(); return _outgoingTrans[0]->prepare(true); } @@ -55,8 +57,11 @@ AvNode* AvActionCmd::prepare(bool iControlTransfer){ } AvNode* AvActionCmd::execute(const SystemTransition& iTrans){ + //std::cout << "action execute\n"; (_block->*_actionFunc)(); + //std::cout << "action exec after func\n"; _outgoingTrans[0]->prepare(true); + //std::cout << "end action execute\n"; return this; } @@ -70,3 +75,7 @@ bool AvActionCmd::isEnabled(EnabledTransList& iEnaTransList, AvTransition* iInco AvNode* AvActionCmd::cancel(){ return this; } + +bool AvActionCmd::directExecution(){ + return _directExec; +} diff --git a/simulators/c++av/src_simulator/app/AvActionCmd.h b/simulators/c++av/src_simulator/app/AvActionCmd.h index 7c9eae0de2569043e507b8c97b0548954366dbde..c0e320ab132704c3ea486667063a94b45db8cf59 100644 --- a/simulators/c++av/src_simulator/app/AvActionCmd.h +++ b/simulators/c++av/src_simulator/app/AvActionCmd.h @@ -47,12 +47,13 @@ class AvBlock; class AvActionCmd: public AvSingleTransCmd{ public: - AvActionCmd(ID iID, AvBlock* iBlock, ActionFuncPointer iActionFunc, std::string iActionDescr, bool iDirectExec); + AvActionCmd(ID iID, AvBlock* iBlock, ActionFuncPointer iActionFunc, std::string iActionDescr, bool iDirectExec=true); ~AvActionCmd(); AvNode* prepare(bool iControlTransfer); AvNode* execute(const SystemTransition& iTrans); bool isEnabled(EnabledTransList& iEnaTransList, AvTransition* iIncomingTrans); AvNode* cancel(); + bool directExecution(); protected: ActionFuncPointer _actionFunc; std::string _actionDescr; diff --git a/simulators/c++av/src_simulator/app/AvBlock.cpp b/simulators/c++av/src_simulator/app/AvBlock.cpp index 0ba01a8ef63022501aa7d032caa03f085b5092d9..3ec319169b5e0dd568bedad60637e1df4399f4cb 100644 --- a/simulators/c++av/src_simulator/app/AvBlock.cpp +++ b/simulators/c++av/src_simulator/app/AvBlock.cpp @@ -84,5 +84,6 @@ AvCmd* AvBlock::getCommandByID(ID iID){ } void AvBlock::setCurrCommand(AvCheckpoint* iCmd){ + //std::cout << toString() << ".setCurrCmd: " << iCmd->toString() << "\n"; _currCommand = iCmd; } diff --git a/simulators/c++av/src_simulator/app/AvBlock.h b/simulators/c++av/src_simulator/app/AvBlock.h index b18c1907f4c0924d0d42ab9fbee689f96f8265f6..a5d4547d6870d198265d343c584dcee148abdb63 100644 --- a/simulators/c++av/src_simulator/app/AvBlock.h +++ b/simulators/c++av/src_simulator/app/AvBlock.h @@ -70,5 +70,9 @@ protected: AvCheckpoint* _currCommand; ///Pointer to the first command of the task AvCmd* _firstCommand; + ///Look up table for task variables (by name) + VariableLookUpTableName _varLookUpName; + ///Look up table for task variables (by ID) + VariableLookUpTableID _varLookUpID; }; #endif diff --git a/simulators/c++av/src_simulator/app/AvCheckpoint.h b/simulators/c++av/src_simulator/app/AvCheckpoint.h index 28709e3aa4fa637f57ba4417a36645b44d5cd3ac..59aa43f8c48db1d42612def9af5ff5f879c6f4a7 100644 --- a/simulators/c++av/src_simulator/app/AvCheckpoint.h +++ b/simulators/c++av/src_simulator/app/AvCheckpoint.h @@ -48,6 +48,8 @@ public: AvCheckpoint(){} virtual AvNode* execute(const SystemTransition& iTrans)=0; virtual bool isEnabled(EnabledTransList& iEnaTransList, AvTransition* iIncomingTrans)=0; + //virtual AvNode* prepare(bool iControlTransfer)=0; + virtual std::string toString() const=0; virtual ~AvCheckpoint() {} protected: }; diff --git a/simulators/c++av/src_simulator/app/AvNode.cpp b/simulators/c++av/src_simulator/app/AvNode.cpp index 9e6289568bd7268317f722f2b776f46f7aff6e9f..3bb226314c1710e96d0e55f4ce7dc75eef8b1afa 100644 --- a/simulators/c++av/src_simulator/app/AvNode.cpp +++ b/simulators/c++av/src_simulator/app/AvNode.cpp @@ -38,6 +38,7 @@ Ludovic Apvrille, Renaud Pacalet * */ #include<AvNode.h> +#include<AvBlock.h> AvNode::AvNode(ID iID, std::string iName, AvBlock* iBlock): _ID(iID), _name(iName), _block(iBlock){ } @@ -51,7 +52,7 @@ ID AvNode::getID() const{ std::string AvNode::toString() const{ std::ostringstream aTransText; - aTransText << _name << "_" << _ID; + aTransText << _block->toString() << "." << _name << "(" << _ID << ")"; return aTransText.str(); } diff --git a/simulators/c++av/src_simulator/app/AvNode.h b/simulators/c++av/src_simulator/app/AvNode.h index 2c639805c411d616f44667d42a193b349fb0354f..48deac7fb10ef26aa820407e42b1a343886b8dcf 100644 --- a/simulators/c++av/src_simulator/app/AvNode.h +++ b/simulators/c++av/src_simulator/app/AvNode.h @@ -49,12 +49,13 @@ public: AvNode(ID iID, std::string iName, AvBlock* iBlock); virtual ~AvNode(); ID getID() const; - std::string toString() const; + virtual std::string toString() const; AvBlock* getBlock() const; virtual AvNode* prepare(bool iControlTransfer)=0; virtual AvNode* execute(const SystemTransition& iTrans)=0; virtual bool isEnabled(EnabledTransList& iEnaTransList, AvTransition* iIncomingTrans)=0; virtual AvNode* cancel()=0; + virtual bool directExecution(){return false;} //virtual AvTransition* getIncomingTrans(); //virtual void setParams(Parameter<ParamType>& ioParam); protected: diff --git a/simulators/c++av/src_simulator/app/AvReceiveCmd.cpp b/simulators/c++av/src_simulator/app/AvReceiveCmd.cpp index ed4ff7c4d3abd4570a956c7b1fb897aaa3123147..7ce76596bad941e17687745fa738a6f686d78108 100644 --- a/simulators/c++av/src_simulator/app/AvReceiveCmd.cpp +++ b/simulators/c++av/src_simulator/app/AvReceiveCmd.cpp @@ -57,12 +57,17 @@ AvNode* AvReceiveCmd::prepare(bool iControlTransfer){ } AvNode* AvReceiveCmd::execute(const SystemTransition& iTrans){ + //std::cout << "execute receive 1\n"; Parameter* aParamData = _signal->read(_incomingTrans); + //std::cout << "execute receive 2\n"; if (aParamData!=0){ + //std::cout << "execute receive 3\n"; if(_paramSetFunc!=0) (_block->*_paramSetFunc)(aParamData); delete aParamData; } + //std::cout << "execute receive 4\n"; _outgoingTrans[0]->prepare(true); + //std::cout << "execute receive 5\n"; return this; } diff --git a/simulators/c++av/src_simulator/app/AvSendCmd.cpp b/simulators/c++av/src_simulator/app/AvSendCmd.cpp index a195b0181429bc50ce198ca8fbcb4d0c5b8bfb35..3e83addee166f1dc9d269b7cbef043c73b95510e 100644 --- a/simulators/c++av/src_simulator/app/AvSendCmd.cpp +++ b/simulators/c++av/src_simulator/app/AvSendCmd.cpp @@ -58,9 +58,13 @@ AvNode* AvSendCmd::prepare(bool iControlTransfer){ AvNode* AvSendCmd::execute(const SystemTransition& iTrans){ Parameter* aParamData; + //std::cout << "execute send 1\n"; aParamData = (_paramGetFunc==0)? 0: (_block->*_paramGetFunc)(); + //std::cout << "execute send 2\n"; _signal->write(_incomingTrans, iTrans.syncTrans, aParamData); + //std::cout << "execute send 3\n"; _outgoingTrans[0]->prepare(true); + //std::cout << "execute send 4\n"; return this; } diff --git a/simulators/c++av/src_simulator/app/AvState.cpp b/simulators/c++av/src_simulator/app/AvState.cpp index cecc51dab0e2bf2813c01823a916c9124b2c17b4..9e47c87e27a5387af862c35edaa7a9fa16343db7 100644 --- a/simulators/c++av/src_simulator/app/AvState.cpp +++ b/simulators/c++av/src_simulator/app/AvState.cpp @@ -50,12 +50,20 @@ AvState::~AvState(){ AvNode* AvState::prepare(bool iControlTransfer){ //if _lastControlTransfer==true set actual cmd in block to this one and call execute + std::cout<< "prepare " << _name << "\n"; _lastControlTransfer=iControlTransfer; if(_lastControlTransfer){ + AvTransition* directAccessTrans = determineDirectAccessTrans(); + if (directAccessTrans!=0){ + std::cout<< _name << " go on to next\n"; + return directAccessTrans->prepare(true); + } + std::cout<< "prepare transitions " << _name << "\n"; _block->setCurrCommand(this); for (unsigned int i=0; i<_nbOfOutgoingTrans; i++) _outgoingTrans[i]->prepare(false); } + std::cout<< "end prepare " << _name << "\n"; return this; } @@ -92,10 +100,30 @@ AvNode* AvState::cancel(){ return this; } +void AvState::setIncomingTrans(AvTransition* iTrans){ +} + +std::string AvState::toString() const{ + return AvNode::toString(); +} + +bool AvState::directExecution(){ + return true; +} + +AvTransition* AvState::determineDirectAccessTrans(){ + AvTransition* aResTrans=0; + for (unsigned int i=0; i<_nbOfOutgoingTrans; i++){ + if (_outgoingTrans[i]->directExecution()){ + if (aResTrans!=0) return 0; + aResTrans=_outgoingTrans[i]; + }else{ + return 0; + } + } + return aResTrans; +} + //void AvState::setOutgoingTrans(AvTransition** iTrans){ // _outgoingTrans=iTrans; //} - -//void AvState::setIncomingTrans(AvTransition* iTrans){ - //empty -//} diff --git a/simulators/c++av/src_simulator/app/AvState.h b/simulators/c++av/src_simulator/app/AvState.h index 8040b405feedc5423eeaf1ecee5b5dfd7e54d275..2fd23b8502857b87f8779ef3156a0e779692f09d 100644 --- a/simulators/c++av/src_simulator/app/AvState.h +++ b/simulators/c++av/src_simulator/app/AvState.h @@ -54,8 +54,12 @@ public: AvNode* execute(const SystemTransition& iTrans); bool isEnabled(EnabledTransList& iEnaTransList, AvTransition* iIncomingTrans); AvNode* cancel(); + void setIncomingTrans(AvTransition* iTrans); + std::string toString() const; + bool directExecution(); //void setOutgoingTrans(AvTransition** iTrans); protected: bool _lastControlTransfer; + AvTransition* determineDirectAccessTrans(); }; #endif diff --git a/simulators/c++av/src_simulator/app/AvSyncSignal.cpp b/simulators/c++av/src_simulator/app/AvSyncSignal.cpp index a606e58060bbc4804a86e904eb2d78045867e678..e7536a65dc7468950896ff4ff71e955fbeb302ce 100644 --- a/simulators/c++av/src_simulator/app/AvSyncSignal.cpp +++ b/simulators/c++av/src_simulator/app/AvSyncSignal.cpp @@ -40,6 +40,7 @@ Ludovic Apvrille, Renaud Pacalet #include <AvSyncSignal.h> #include <AvTransition.h> #include <AvCmd.h> +#include<AvBlock.h> AvSyncSignal::AvSyncSignal(ID iID, std::string iName): AvSignal(iID, iName), _paramData(0){ } @@ -70,17 +71,18 @@ Parameter* AvSyncSignal::read(AvTransition* iReader){ } void AvSyncSignal::write(AvTransition* iWriter, AvTransition* iReader, Parameter* iParamData){ - SystemTransition aDummy; + //(AvBlock* iBlock, AvTransition* iFiringTrans, AvTransition* iSyncTrans, std::string iText + SystemTransition aSysTrans(iReader->getBlock(), iReader, 0, ""); _paramData = iParamData; - iReader->execute(aDummy); - //cancelWriter(iWriter); + //iReader->execute(aDummy); + aSysTrans.block->execute(aSysTrans); _writers.erase(iWriter); } bool AvSyncSignal::getSyncTransitionsWriter(AvBlock* iBlock, AvTransition* iWriter, EnabledTransList& iTransList){ for(AvTransSet::iterator i=_readers.begin(); i != _readers.end(); ++i){ std::ostringstream aTransText; - aTransText << iWriter->getOutgoingCmd()->toString() << " synchronizes with " << (*i)->getOutgoingCmd()->toString(); + aTransText << iWriter->getOutgoingCmd()->toString() << " synchronizes with " << (*i)->getOutgoingCmd()->toString() << " via signal " << toString(); iTransList.push_back(SystemTransition(iBlock, iWriter, *i, aTransText.str())); return true; } diff --git a/simulators/c++av/src_simulator/app/AvTimer.h b/simulators/c++av/src_simulator/app/AvTimer.h index 6cfbcc5890da322dd069d80d0e023f853f68a1e6..59fab5f17020f3bd69a824dd4a849a189f336eb5 100644 --- a/simulators/c++av/src_simulator/app/AvTimer.h +++ b/simulators/c++av/src_simulator/app/AvTimer.h @@ -51,11 +51,14 @@ public: } void set(AVTTime iSetTime){ + std::cout << "set timer\n"; _expired=false; registerEventIn(iSetTime); + std::cout << "end set timer\n"; } void reset(){ + std::cout << "reset timer\n"; cancelEvent(); } @@ -64,6 +67,7 @@ public: } void eventQCallback(){ + std::cout << "timer expired\n"; _expired=true; } diff --git a/simulators/c++av/src_simulator/app/AvTimerExpCmd.cpp b/simulators/c++av/src_simulator/app/AvTimerExpCmd.cpp index 03c4b3b6f98e9ddc3708f09750d4297035e53916..1c61f656b8bf5bce8642e714ac8b056ece32b6c8 100644 --- a/simulators/c++av/src_simulator/app/AvTimerExpCmd.cpp +++ b/simulators/c++av/src_simulator/app/AvTimerExpCmd.cpp @@ -42,7 +42,7 @@ Ludovic Apvrille, Renaud Pacalet #include<AvTimer.h> #include<AvTransition.h> -AvTimerExpCmd::AvTimerExpCmd(ID iID, AvBlock* iBlock, AvTimer* iTimer): AvSingleTransCmd(iID, "TimerExp", iBlock, 1){ +AvTimerExpCmd::AvTimerExpCmd(ID iID, AvBlock* iBlock, AvTimer* iTimer): AvSingleTransCmd(iID, "TimerExp", iBlock, 1), _timer(iTimer){ } AvTimerExpCmd::~AvTimerExpCmd(){ diff --git a/simulators/c++av/src_simulator/app/AvTransition.cpp b/simulators/c++av/src_simulator/app/AvTransition.cpp index 640cd3b69c068142e0577dac3a56745a41d6937a..0851ca26b17e3bad22b3fa39b0ea8fabd9057cf8 100644 --- a/simulators/c++av/src_simulator/app/AvTransition.cpp +++ b/simulators/c++av/src_simulator/app/AvTransition.cpp @@ -42,7 +42,7 @@ Ludovic Apvrille, Renaud Pacalet #include<AvCmd.h> #include<AvBlock.h> -AvTransition::AvTransition(ID iID, AvBlock* iBlock, CondFuncPointer iCondFunc, AVTTime iAfterMin, AVTTime iAfterMax, AVTTime iComputeMin, AVTTime iComputeMax, ActionFuncPointer iActionFunc): AvNode(iID, "Transition", iBlock), AvCheckpoint(), _outgoingCmd(0), _condFunc(iCondFunc), _afterMin(iAfterMin), _afterMax(iAfterMax), _computeMin(iComputeMin), _computeMax(iComputeMax), _actionFunc(iActionFunc), _state(DISABLED), _lastControlTransfer(true){ +AvTransition::AvTransition(ID iID, AvBlock* iBlock, CondFuncPointer iCondFunc, ParamType iAfterMin, ParamType iAfterMax, ParamType iComputeMin, ParamType iComputeMax, ActionFuncPointer iActionFunc): AvNode(iID, "Transition", iBlock), AvCheckpoint(), _outgoingCmd(0), _condFunc(iCondFunc), _afterMin(iAfterMin), _afterMax(iAfterMax), _computeMin(iComputeMin), _computeMax(iComputeMax), _computeFor(0), _actionFunc(iActionFunc), _state(DISABLED), _lastControlTransfer(true){ } AvTransition::~AvTransition(){ @@ -50,38 +50,62 @@ AvTransition::~AvTransition(){ AvNode* AvTransition::prepare(bool iControlTransfer){ _lastControlTransfer=iControlTransfer; + std::cout << "trans prepare 1\n"; if (_lastControlTransfer){ + std::cout << "trans prepare 2\n"; _block->setCurrCommand(this); if (_actionFunc!=0) (_block->*_actionFunc)(); } + std::cout << "trans prepare 3\n"; if(_condFunc!=0 && (_block->*_condFunc)()==0){ _state=DISABLED; }else{ + std::cout << "trans prepare 4\n"; AVTTime aTime2Wait = myrand(_afterMin, _afterMax); if (aTime2Wait==0){ - aTime2Wait = myrand(_computeMin, _computeMax); - if(aTime2Wait==0){ + std::cout << "trans prepare 5\n"; + _computeFor = myrand(_computeMin, _computeMax); + if(_computeFor==0){ + std::cout << "trans prepare 5a\n"; _state = WAIT4CMD; return _outgoingCmd->prepare(_lastControlTransfer); }else{ - registerEventIn(aTime2Wait); - _state = WAIT4COMP; + std::cout << "trans prepare 5b\n"; + //registerEventIn(_computeFor); + _state = PREPCOMP; } }else{ + std::cout << "trans prepare 6\n"; registerEventIn(aTime2Wait); _state = WAIT4AFTER; } } + //std::cout << "trans prepare 7\n"; return this; } AvNode* AvTransition::execute(const SystemTransition& iSyncCmd){ - if (!_lastControlTransfer && _actionFunc!=0) (_block->*_actionFunc)(); - return _outgoingCmd->execute(iSyncCmd); + if (_state==PREPCOMP){ + registerEventIn(_computeFor); + _block->setCurrCommand(this); + _state=WAIT4COMP; + return this; + } + if (_state==WAIT4CMD){ + if (!_lastControlTransfer && _actionFunc!=0) (_block->*_actionFunc)(); + return _outgoingCmd->execute(iSyncCmd); + } + return this; } bool AvTransition::isEnabled(EnabledTransList& iEnaTransList, AvTransition* iIncomingTrans){ + if (_state==PREPCOMP){ + std::ostringstream aTransText; + aTransText << "compute for " << _computeFor << " in " << toString(); + iEnaTransList.push_back(SystemTransition(_block, this, 0, aTransText.str())); + return true; + } if (_state==WAIT4CMD) return _outgoingCmd->isEnabled(iEnaTransList,this); return false; } @@ -90,7 +114,6 @@ AvNode* AvTransition::cancel(){ AvNode* aResult=0; switch(_state){ case WAIT4AFTER: - case WAIT4COMP: cancelEvent(); break; case WAIT4CMD: @@ -102,10 +125,9 @@ AvNode* AvTransition::cancel(){ } void AvTransition::eventQCallback(){ - AVTTime aTime2Wait; - if(_state==WAIT4AFTER && (aTime2Wait = myrand(_computeMin, _computeMax))!=0){ - registerEventIn(aTime2Wait); - _state = WAIT4COMP; + if(_state==WAIT4AFTER && (_computeFor = myrand(_computeMin, _computeMax))!=0){ + //registerEventIn(_computeFor); + _state = PREPCOMP; }else{ _state = WAIT4CMD; _outgoingCmd->prepare(_lastControlTransfer); @@ -115,8 +137,20 @@ void AvTransition::eventQCallback(){ void AvTransition::setOutgoingCmd(AvCmd* iCmd){ _outgoingCmd = iCmd; + _outgoingCmd->setIncomingTrans(this); } AvCmd* AvTransition::getOutgoingCmd(){ return _outgoingCmd; } + +std::string AvTransition::toString() const{ + return AvNode::toString(); +} + +bool AvTransition::directExecution(){ + std::cout << "let's crash\n"; + bool anErg = !(_afterMin!=0 || _afterMax!=0 || (_actionFunc==0 && _computeMin==0 && _computeMax==0 && !_outgoingCmd->directExecution()) || (_condFunc!=0 && (_block->*_condFunc)()==0)); + std::cout << "not crashed\n"; + return anErg; +} diff --git a/simulators/c++av/src_simulator/app/AvTransition.h b/simulators/c++av/src_simulator/app/AvTransition.h index dd2267349a2fe3a2a1c76060e39d342780da57f1..eed402e11d2b54234e545fe0cb1807f179727ee7 100644 --- a/simulators/c++av/src_simulator/app/AvTransition.h +++ b/simulators/c++av/src_simulator/app/AvTransition.h @@ -45,14 +45,14 @@ Ludovic Apvrille, Renaud Pacalet #include <AvCheckpoint.h> #include <EventQueueCallback.h> -enum state_enum{DISABLED, WAIT4AFTER, WAIT4COMP, WAIT4CMD}; +enum state_enum{DISABLED, WAIT4AFTER, PREPCOMP, WAIT4COMP, WAIT4CMD}; typedef enum state_enum TransitionState; class AvCmd; class AvTransition: public AvNode, public AvCheckpoint, public EventQueueCallback{ public: - AvTransition(ID iID, AvBlock* iBlock, CondFuncPointer iCondFunc, AVTTime iAfterMin, AVTTime iAfterMax, AVTTime iComputeMin, AVTTime iComputeMax, ActionFuncPointer iActionFunc); + AvTransition(ID iID, AvBlock* iBlock, CondFuncPointer iCondFunc, ParamType iAfterMin, ParamType iAfterMax, ParamType iComputeMin, ParamType iComputeMax, ActionFuncPointer iActionFunc); ~AvTransition(); AvNode* prepare(bool iControlTransfer); AvNode* execute(const SystemTransition& iSyncCmd); @@ -61,10 +61,12 @@ public: void eventQCallback(); void setOutgoingCmd(AvCmd* iCmd); AvCmd* getOutgoingCmd(); + std::string toString() const; + bool directExecution(); protected: AvCmd* _outgoingCmd; CondFuncPointer _condFunc; - AVTTime _afterMin, _afterMax, _computeMin, _computeMax; + ParamType _afterMin, _afterMax, _computeMin, _computeMax, _computeFor; ActionFuncPointer _actionFunc; TransitionState _state; bool _lastControlTransfer; diff --git a/simulators/c++av/src_simulator/definitions.h b/simulators/c++av/src_simulator/definitions.h index bc481cec0b54a0f469844bcc136bc11319fe2acb..02b9f274523d3c0db944ad46a4fff9d3d44dbf70 100644 --- a/simulators/c++av/src_simulator/definitions.h +++ b/simulators/c++av/src_simulator/definitions.h @@ -68,8 +68,9 @@ Ludovic Apvrille, Renaud Pacalet #define xx__VARS(a1, a2, a3, a4, a5, a6, a7, a8, ...) (void*)&(a1), sizeof(a1), (void*)&(a2), sizeof(a2), (void*)&(a3), sizeof(a3), (void*)&(a4), sizeof(a4), (void*)&(a5), sizeof(a5), (void*)&(a6), sizeof(a6), (void*)&(a7), sizeof(a7), (void*)&(a8), sizeof(a8) #define xx__SIZE(a1, a2, a3, a4, a5, a6, a7, a8, ...) sizeof(a1)+sizeof(a2)+sizeof(a3)+sizeof(a4)+sizeof(a5)+sizeof(a6)+sizeof(a7)+sizeof(a8) -#define PARAM_CPY(nb, a1, ...) nb, xx__VARS(a1, __VA_ARGS__, a1, a1, a1, a1, a1, a1, a1, a1) +#define PARAM_CPY(nb, a1, ...) nb, xx__VARS(a1, ##__VA_ARGS__, a1, a1, a1, a1, a1, a1, a1, a1) #define PARAM_INIT(nb, ...) xx__SIZE(__VA_ARGS__, int[0], int[0], int[0], int[0], int[0], int[0], int[0], int[0]), PARAM_CPY(nb, __VA_ARGS__) +#define COMMENTS class AvBlock; class TMLTask; @@ -85,8 +86,8 @@ typedef unsigned int EventID; typedef unsigned int ID; typedef unsigned int AVTTime; typedef unsigned int (AvBlock::*CondFuncPointer) (); -typedef unsigned int (AvBlock::*ActionFuncPointer) (); -typedef unsigned int (AvBlock::*ParamSetFuncPointer) (Parameter*); +typedef void (AvBlock::*ActionFuncPointer) (); +typedef void (AvBlock::*ParamSetFuncPointer) (Parameter*); typedef Parameter* (AvBlock::*ParamGetFuncPointer) (); typedef std::vector<SystemTransition> EnabledTransList; ///keep track of reading/writing transitions in channels @@ -94,6 +95,17 @@ typedef std::set<AvTransition*> AvTransSet; typedef std::queue<Parameter*> ParamQueue; typedef std::priority_queue< EvtQueueNode, std::vector<EvtQueueNode>, std::greater<EvtQueueNode> > PrioEventQueue; typedef std::list<AvBlock*> BlockList; +struct ltstr{ + bool operator()(const char* s1, const char* s2) const{ + return strcmp(s1, s2) < 0; + } +}; + +///Datatype which associates a variable name with the coresponding pointer to that variable, used for look-up table of tasks +typedef std::map<const char*, ParamType*, ltstr> VariableLookUpTableName; +///Datatype which associates a variable ID with the coresponding pointer to that variable, used for look-up table of tasks +typedef std::map<ID, ParamType*> VariableLookUpTableID; + class SystemTransition{ public: diff --git a/simulators/c++av/src_simulator/sim/EventQueueCallback.h b/simulators/c++av/src_simulator/sim/EventQueueCallback.h index 374afca20cb2bafb5ccfb2d602be23613d4d4fbc..644b9435cc26e5f305d1715e3aa9813c47820521 100644 --- a/simulators/c++av/src_simulator/sim/EventQueueCallback.h +++ b/simulators/c++av/src_simulator/sim/EventQueueCallback.h @@ -62,7 +62,9 @@ protected: } void registerEventIn(AVTTime iTime){ + std::cout << "register event in " << _simulator << "\n"; _simulator->registerEvent(EvtQueueNode(this, iTime + _simulator->getSimulationTime(), _evtID)); + std::cout << "register event in end\n"; } void cancelEvent(){ diff --git a/simulators/c++av/src_simulator/sim/Simulator.cpp b/simulators/c++av/src_simulator/sim/Simulator.cpp index 707dbf5d819db1c6df69eee011ca9bd51ae20779..51e200e62348b80bfb53dd18ab3742a1cba3e88a 100644 --- a/simulators/c++av/src_simulator/sim/Simulator.cpp +++ b/simulators/c++av/src_simulator/sim/Simulator.cpp @@ -40,6 +40,7 @@ Ludovic Apvrille, Renaud Pacalet #include<Simulator.h> #include<AvBlock.h> #include<EventQueueCallback.h> +#include<AvCheckpoint.h> Simulator::Simulator(): _simTime(0){ } @@ -51,6 +52,7 @@ Simulator::~Simulator(){ //} void Simulator::registerEvent(const EvtQueueNode &iNode){ + std::cout << "evt queue register event for time: " << iNode.time << "\n"; _evtQueue.push(iNode); } @@ -58,40 +60,52 @@ void Simulator::registerEvent(const EvtQueueNode &iNode){ //} void Simulator::run(){ - EnabledTransList aTransList(100); - unsigned int aUserChoice; - for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){ - (*i)->isEnabled(aTransList); - } - while(!aTransList.empty()){ + EnabledTransList aTransList; + unsigned int aUserChoice=1; + while(aUserChoice>0 && advanceSimulationTime(aTransList)){ + displaySystemState(); std::cout << "*** Enabled System Transitions ***\n"; for (unsigned int i=0; i< aTransList.size(); ++i){ - std::cout << "(" << i+1 << ") " << aTransList[i].text << "\n"; + std::cout << "(" << i+1 << ") in Block " << aTransList[i].block->toString() << " " << aTransList[i].text << "\n"; } + std::cout << "(0) Quit simulation\n"; aUserChoice=0; - while(aUserChoice<1 || aUserChoice>aTransList.size()){ + do{ std::cout << "Please enter a transition no: "; std::cin >> aUserChoice; std::cout << "\n"; + }while(aUserChoice>aTransList.size()); + if (aUserChoice!=0){ + aTransList[aUserChoice-1].block->execute(aTransList[aUserChoice-1]); + aTransList.clear(); + //std::cout << "run: is enabled\n"; } - aUserChoice--; - aTransList[aUserChoice].block->execute(aTransList[aUserChoice]); - aTransList.clear(); - for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){ - (*i)->isEnabled(aTransList); + } + displaySystemState(); +} + +void Simulator::displaySystemState(){ + std::cout << "*** Current System State at time "<< _simTime << " ***\n"; + for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){ + std::cout << "Block " << (*i)->toString() << ": " << (*i)->getCurrCommand()->toString() << "\n"; + } +} + +bool Simulator::advanceSimulationTime(EnabledTransList& iTransList){ + for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){ + (*i)->isEnabled(iTransList); + } + while(iTransList.empty() && !_evtQueue.empty()){ + _simTime = _evtQueue.top().time; + while(!_evtQueue.empty() && _simTime == _evtQueue.top().time){ + _evtQueue.top().callBack->notifyEvent(_evtQueue.top().evtID); + _evtQueue.pop(); } - while(aTransList.empty() && !_evtQueue.empty()){ - _simTime = _evtQueue.top().time; - while(!_evtQueue.empty() && _simTime == _evtQueue.top().time){ - _evtQueue.top().callBack->notifyEvent(_evtQueue.top().evtID); - _evtQueue.pop(); - } - for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){ - (*i)->isEnabled(aTransList); - } + for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){ + (*i)->isEnabled(iTransList); } - } + return !(iTransList.empty()); } AVTTime Simulator::getSimulationTime(){ diff --git a/simulators/c++av/src_simulator/sim/Simulator.h b/simulators/c++av/src_simulator/sim/Simulator.h index 1de03af322e0384c87b465bc645b16a91ccc3871..75c060325b89971c6d4664bc1f7cd25af195c8e8 100644 --- a/simulators/c++av/src_simulator/sim/Simulator.h +++ b/simulators/c++av/src_simulator/sim/Simulator.h @@ -54,6 +54,8 @@ public: AVTTime getSimulationTime(); void addBlock(AvBlock* iBlock); protected: + bool advanceSimulationTime(EnabledTransList& iTransList); + void displaySystemState(); AVTTime _simTime; PrioEventQueue _evtQueue; BlockList _blockList;