virtual void output(const vd::Time& time, vd::ExternalEventList& output) const { TraceAlways(vu::DateTime::simpleCurrentDate() + " - MMSExecute - Output at time : " + time.toString()); //Send event on external port (port "OUT") vd::ExternalEvent* evt = NULL; evt = new vd::ExternalEvent("bfalse"); if(evt != NULL) { vv::Value* val = Logical_toValue(this->bfalse); if(val != NULL) { evt << vd::attribute("bfalse", val); output.addEvent(evt); TraceModel(vu::DateTime::simpleCurrentDate() + " - Output port bfalse is changed to " + val->writeToString() + " at time " + time.toString()); } } evt = new vd::ExternalEvent("btrue"); if(evt != NULL) { vv::Value* val = Logical_toValue(this->btrue); if(val != NULL) { evt << vd::attribute("btrue", val); output.addEvent(evt); TraceModel(vu::DateTime::simpleCurrentDate() + " - Output port btrue is changed to " + val->writeToString() + " at time " + time.toString()); } } }
void externalTransition( const vle::devs::ExternalEventList& events, const vle::devs::Time& time) { vle::devs::ExternalEventList::const_iterator it = events.begin(); while (it != events.end()) { if ((*it)->onPort("available")) { bool available = (*it)->getBooleanAttributeValue("available"); unsigned int number = (*it)->getIntegerAttributeValue("number"); std::string type = (*it)->getStringAttributeValue("type"); if (available) { mAvailableResourceNumber += number; } else { mUnavailableResources[type] = mResourceConstraints->quantity(type) - number; } ++mResponseNumber; TraceModel( vle::fmt(" [%1%:%2%] at %3% -> available: %4% / %5%") % getModel().getParentName() % getModelName() % time % mAvailableResourceNumber % mResourceConstraints->quantity()); if (mAvailableResourceNumber == mResourceConstraints->quantity()) { mPhase = SEND_ASSIGN; } else { if (mResponseNumber == mResourceConstraints->size()) { clearDemand(); mPhase = SEND_UNAVAILABLE; } else { mPhase = WAIT_AVAILABLE; } } } else if ((*it)->onPort("demand")) { mResourceConstraints = ResourceConstraints::build(Resources::get(*it)); TraceModel(vle::fmt(" [%1%:%2%] at %3% -> demand: %4%") % getModel().getParentName() % getModelName() % time % mResourceConstraints->quantity()); mPhase = SEND_DEMAND; } else if ((*it)->onPort("release")) { mReleasedResources = Resources::build(Resources::get(*it)); TraceModel(vle::fmt(" [%1%:%2%] at %3% -> release: %4%") % getModel().getParentName() % getModelName() % time % *mReleasedResources); mPhase = SEND_RELEASE; } ++it; } }
void externalTransition( const vle::devs::ExternalEventList& events, const vle::devs::Time& time) { vle::devs::ExternalEventList::const_iterator it = events.begin(); while (it != events.end()) { if ((*it)->onPort("start")) { if (mPhase == INIT) { mActivities.starting(time); if (mActivities.startingActivities().empty()) { mPhase = WAIT; } else { mPhase = SEND; } } } else if ((*it)->onPort("done")) { Activity* a = Activity::build(Activity::get(*it)); TraceModel(vle::fmt(" [%1%:%2%] at %3% -> %4% DONE") % getModel().getParentName() % getModelName() % time % a->name()); mDoneActivities.push_back(a); } ++it; } if (mSigma > 0) { mSigma -= (time - mLastTime); mLastTime = time; } }
void confluentTransitions( const vle::devs::Time& time, const vle::devs::ExternalEventList& /* events */) { TraceModel(vle::fmt(" [%1%:%2%] at %3% -> confluent !") % getModel().getParentName() % getModelName() % time); }
virtual vd::Time init(const vd::Time& time) { TraceAlways(vu::DateTime::simpleCurrentDate() + " - MMSExecute - Init at time : " + time.toString()); _pMMSExecute = (void (*)(const Long& time, const Long& timestep, const Long& NID)) _pFuncDirectory->getFunction("pMMSExecute"); this->time = 0; TraceModel(vu::DateTime::simpleCurrentDate() + " - Initialize reference \"time\" to \"0\" at time : " + time.toString()); this->timestep = 0; TraceModel(vu::DateTime::simpleCurrentDate() + " - Initialize reference \"timestep\" to \"0\" at time : " + time.toString()); this->cycle = 0; TraceModel(vu::DateTime::simpleCurrentDate() + " - Initialize reference \"cycle\" to \"0\" at time : " + time.toString()); this->NID = 0; TraceModel(vu::DateTime::simpleCurrentDate() + " - Initialize reference \"NID\" to \"0\" at time : " + time.toString()); this->timestep = 1; this->time = 0; return vd::Time(0.0); }
virtual void start(const vle::devs::Time& time, Activity* a) { TraceModel(vle::fmt(" [%1%:%2%] at %3% -> %4% starts") % getModel().getParentName() % getModelName() % time % a->name()); a->start(time); mRunningActivities.push_back(a); }
void output(const vle::devs::Time& time, vle::devs::ExternalEventList& output) const { if (mPhase == SEND_ASSIGN) { for (ResourceConstraints::const_iterator it = mResourceConstraints->begin(); it != mResourceConstraints->end(); ++it) { vle::devs::ExternalEvent* ee = new vle::devs::ExternalEvent("assign"); ee << vle::devs::attribute("type", it->type()); ee << vle::devs::attribute("quantity", (int)it->quantity()); output.push_back(ee); } } else if (mPhase == SEND_DEMAND) { for (ResourceConstraints::const_iterator it = mResourceConstraints->begin(); it != mResourceConstraints->end(); ++it) { vle::devs::ExternalEvent* ee = new vle::devs::ExternalEvent("demand"); TraceModel( vle::fmt(" [%1%:%2%] at %3% -> demand: %4% = %5%") % getModel().getParentName() % getModelName() % time % it->type() % it->quantity()); ee << vle::devs::attribute("type", it->type()); ee << vle::devs::attribute("quantity", (int)it->quantity()); output.push_back(ee); } } else if (mPhase == SEND_RELEASE) { vle::devs::ExternalEvent* ee = new vle::devs::ExternalEvent("release"); ee << vle::devs::attribute("resources", mReleasedResources->toValue()); output.push_back(ee); } else if (mPhase == SEND_UNAVAILABLE) { vle::devs::ExternalEvent* ee = new vle::devs::ExternalEvent("unavailable"); ee << vle::devs::attribute("resources", mUnavailableResources.toValue()); output.push_back(ee); } }
virtual void finish(const vle::devs::Time& time) { Activities::iterator it = mRunningActivities.begin(); while (it != mRunningActivities.end()) { if ((*it)->done(time)) { TraceModel(vle::fmt(" [%1%:%2%] at %3% -> %4% finishs") % getModel().getParentName() % getModelName() % time % (*it)->name()); (*it)->finish(time); mDoneActivities.push_back(*it); mRunningActivities.erase(it); it = mRunningActivities.begin(); } else { ++it; } } }
virtual void externalTransition(const vd::ExternalEventList& eventList, const vd::Time& time) { TraceAlways(vu::DateTime::simpleCurrentDate() + " - MMSExecute - externalTransition at time : " + time.toString()); //Update input port vd::ExternalEventList::const_iterator it = eventList.begin(); for (;it != eventList.end(); it++) { const vd::ExternalEvent& event = *(*it); if (event.onPort("time")) { TraceModel(vu::DateTime::simpleCurrentDate() + " - Trying to update \"time\" port"); if(event.existAttributeValue("time")) { const vv::Value& val = event.getAttributeValue("time"); this->time = Long_fromValue(&val); if(val.isNull() == false) { TraceModel(vu::DateTime::simpleCurrentDate() + " - Update \"time\" input port to \"" + val.writeToString() + "\" at time " + time.toString()); } else { TraceModel(vu::DateTime::simpleCurrentDate() + " - NULL value for \"time\" input port at time " + time.toString()); } } else { TraceModel(vu::DateTime::simpleCurrentDate() + " - Unknown attribute value \"time\" for the port \"time\""); } } if (event.onPort("timestep")) { TraceModel(vu::DateTime::simpleCurrentDate() + " - Trying to update \"timestep\" port"); if(event.existAttributeValue("timestep")) { const vv::Value& val = event.getAttributeValue("timestep"); this->timestep = Long_fromValue(&val); if(val.isNull() == false) { TraceModel(vu::DateTime::simpleCurrentDate() + " - Update \"timestep\" input port to \"" + val.writeToString() + "\" at time " + time.toString()); } else { TraceModel(vu::DateTime::simpleCurrentDate() + " - NULL value for \"timestep\" input port at time " + time.toString()); } } else { TraceModel(vu::DateTime::simpleCurrentDate() + " - Unknown attribute value \"timestep\" for the port \"timestep\""); } } if (event.onPort("cycle")) { TraceModel(vu::DateTime::simpleCurrentDate() + " - Trying to update \"cycle\" port"); if(event.existAttributeValue("cycle")) { const vv::Value& val = event.getAttributeValue("cycle"); this->cycle = Long_fromValue(&val); if(val.isNull() == false) { TraceModel(vu::DateTime::simpleCurrentDate() + " - Update \"cycle\" input port to \"" + val.writeToString() + "\" at time " + time.toString()); } else { TraceModel(vu::DateTime::simpleCurrentDate() + " - NULL value for \"cycle\" input port at time " + time.toString()); } } else { TraceModel(vu::DateTime::simpleCurrentDate() + " - Unknown attribute value \"cycle\" for the port \"cycle\""); } } if (event.onPort("NID")) { TraceModel(vu::DateTime::simpleCurrentDate() + " - Trying to update \"NID\" port"); if(event.existAttributeValue("NID")) { const vv::Value& val = event.getAttributeValue("NID"); this->NID = Long_fromValue(&val); if(val.isNull() == false) { TraceModel(vu::DateTime::simpleCurrentDate() + " - Update \"NID\" input port to \"" + val.writeToString() + "\" at time " + time.toString()); } else { TraceModel(vu::DateTime::simpleCurrentDate() + " - NULL value for \"NID\" input port at time " + time.toString()); } } else { TraceModel(vu::DateTime::simpleCurrentDate() + " - Unknown attribute value \"NID\" for the port \"NID\""); } } } }