示例#1
0
	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());
			}
		} 
	}
示例#2
0
        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;
            }
        }
示例#3
0
        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;
            }
        }
示例#4
0
 void confluentTransitions(
     const vle::devs::Time& time,
     const vle::devs::ExternalEventList& /* events */)
 {
     TraceModel(vle::fmt(" [%1%:%2%] at %3% -> confluent !") %
                getModel().getParentName() % getModelName() %
                time);
 }
示例#5
0
	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);
	}
示例#6
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);
        }
示例#7
0
        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);
            }
        }
示例#8
0
        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;
                }
            }
        }
示例#9
0
	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\"");
				}
		    }
		}
	}