next up previous contents index
Next: Monorail System Up: Monorail System Previous: Monorail System   Contents   Index

Station

First of all, we define several constant strings for indicating the phase of Station. And a macro REMEMBERING is defined for testing the effect of monitoring the next station's status using nso.
const string EMPTY="E";
const string LOADING="L";
const string SENDING="S";
const string WAITING="W";
const string COLLIDED="C";

#define REMEMBERING // for testing the effect of using nso

The class Station has several state variables: a string m_phase; bool init_occupied indicating the initial occupation state of the station, bool nso which indicates if the next station is occupied or not; and the constant variable TimeSpan loading_t indicating the lifespan of a state when its phase is LOADING.

Station has two input port pointers ipull and ivehicle, one output port pointer ovehicle. These variables, including ports, are assigned in the constructor as follows.

class Station: public Atomic {
public:
    string m_phase;
    bool   init_occupied;
    bool   nso;//next_state_occpied
    const TimeSpan loading_t;

    InputPort* ipull, *ivehicle;
    OutputPort* ovehicle;

    Station(const string& name, bool occupied, TimeSpan lt):
        Atomic(name), init_occupied(occupied), loading_t(lt), nso(true)
        {
            ipull = AddIP("pull"); ivehicle = AddIP("vehicle");
            ovehicle = AddOP("vehicle");
            init();
        }

Station::init() initializes m_phase depending on init_occupied such that m_phase = SENDING if init_occupied is true, otherwise, m_phase = EMPTY.

    /*virtual*/ void init()
    {
        if(init_occupied == true)
            m_phase = SENDING;
        else
            m_phase = EMPTY;
        //cout << Name << ":" << Get_s()<<endl;
    }
Station::::tau() returns the lifespan of each state; 10 for SENDING; loading_t for LOADING; $ \infty$ otherwise.
    /*virtual*/ TimeSpan tau() const
    {
        if (m_phase == SENDING)
            return 10;
        else if (m_phase == LOADING)
            return loading_t;
        else
            return DBL_MAX;
    }
Station::delta_x defines the input transition such that if it receives an input through ipull, it sets nso = false. At that time, if the station's phase is WAITING, then nso had previously been set by true for remembering that the next station had been occupied, delta_x then changes the phase to SENDING and returns true.

When a station receives a vehicle through ivehicle port, if phase is EMPTY, its phase changes into LOADING; otherwise the phase changes into COLLIDED.

/*virtual*/ bool delta_x(const PortValue& x)
    {
        if( x.port == ipull) {
            nso = false;
            if( m_phase == WAITING){
#ifdef REMEMBERING
                nso = true;
#endif
                m_phase = SENDING;
                return true;
            }
        }
        else if(x.port == ivehicle) {
            if(m_phase == EMPTY)
                m_phase = LOADING;
            else // rest cases lead to Colided!
                m_phase = COLLIDED;
            return true;
        }
        return false;
    }
Station::delta_y defines the output transition behavior such that, at the end of LOADING phase, if nso=true, then delta_y changes the stations' phase into WAITING. But if nso=false, delta_y marks nso=true for remembering the next station's occupation and changes the station's phase to SENDING. At the end of SENDING phase, it sends out the vehicle through ovehicle port and changes the station's phase to IDLE.
     /*virtual*/ void delta_y(PortValue& y) {
        if(m_phase == LOADING){
            if(nso == true)
                m_phase = WAITING;
            else {
#ifdef REMEMBERING
                nso = true;
#endif
                m_phase = SENDING;
            }
        }  else if(m_phase == SENDING) {
            y.Set(ovehicle);
            m_phase = EMPTY;
        }
    }
The displaying function Get_s() is overridden to return a string containing information about m_phase and nso as follows.
    /*virtual*/ string Get_s() const
    {
        string str = "phase="+m_phase +",nso=";
        if(nso) str +="true";
        else    str +="false";
        return str;
    }


next up previous contents index
Next: Monorail System Up: Monorail System Previous: Monorail System   Contents   Index
MHHwang 2007-05-07