44#define TRACI_PROGRAM "online"
53 myCurrentProgram(nullptr),
54 myDefaultProgram(nullptr) {
59 std::map<std::string, MSTrafficLightLogic*>::const_iterator j;
60 for (
const auto& var : myVariants) {
71 bool hadErrors =
false;
72 for (std::map<std::string, MSTrafficLightLogic*>::const_iterator j = myVariants.begin(); j != myVariants.end(); ++j) {
74 int linkNo = (int)(*j).second->getLinks().size();
75 bool hadProgramErrors =
false;
76 for (MSTrafficLightLogic::Phases::const_iterator i = phases.begin(); i != phases.end(); ++i) {
77 if ((
int)(*i)->getState().length() < linkNo) {
78 hadProgramErrors =
true;
81 if (hadProgramErrors) {
82 WRITE_ERRORF(
TL(
"Mismatching phase size in tls '%', program '%'."), (*j).second->getID(), (*j).first);
92 myOriginalLinkStates = myCurrentProgram->collectLinkStates();
98 for (
const auto& item : myVariants) {
99 item.second->saveState(out);
107 if (myVariants.find(programID) != myVariants.end()) {
114 if (myCurrentProgram ==
nullptr) {
115 const std::string
id = logic->
getID();
117 throw ProcessError(
TLF(
"No initial signal plan loaded for tls '%'.",
id));
121 const std::string
id = logic->
getID();
123 throw ProcessError(
"Mismatching phase size in tls '" +
id +
"', program '" + programID +
"'.");
127 if (myVariants.size() == 0 || isNewDefault) {
128 if (myCurrentProgram !=
nullptr) {
129 myCurrentProgram->deactivateProgram();
131 myCurrentProgram = logic;
133 if (myVariants.size() == 0) {
134 myDefaultProgram = logic;
138 myVariants[programID] = logic;
139 if (myVariants.size() == 1 || isNewDefault) {
141 executeOnSwitchActions();
149 if (myVariants.find(programID) == myVariants.end()) {
152 return myVariants.find(programID)->second;
158 if (myVariants.find(programID) == myVariants.end()) {
159 if (programID ==
"off") {
162 if (!addLogic(
"off", tlLogic,
true,
true)) {
164 throw ProcessError(
TLF(
"Could not build an off-state for tls '%'.", myCurrentProgram->getID()));
168 throw ProcessError(
"Can not switch tls '" + myCurrentProgram->getID() +
"' to program '" + programID +
"';\n The program is not known.");
171 return getLogic(programID);
177 const std::string& state) {
180 if (logic ==
nullptr) {
182 std::vector<MSPhaseDefinition*> phases;
183 phases.push_back(phase);
200 mySwitchActions.push_back(c);
204std::vector<MSTrafficLightLogic*>
206 std::vector<MSTrafficLightLogic*> ret;
207 std::map<std::string, MSTrafficLightLogic*>::const_iterator i;
208 for (i = myVariants.begin(); i != myVariants.end(); ++i) {
209 ret.push_back((*i).second);
217 return tl == myCurrentProgram;
223 return myCurrentProgram;
228 return myDefaultProgram;
236 myCurrentProgram = getLogicInstantiatingOff(tlc, programID);
237 myCurrentProgram->activateProgram();
239 executeOnSwitchActions();
245 for (std::vector<OnSwitchAction*>::const_iterator i = mySwitchActions.begin(); i != mySwitchActions.end(); ++i) {
253 for (std::map<std::string, MSTrafficLightLogic*>::iterator i = myVariants.begin(); i != myVariants.end(); ++i) {
254 (*i).second->addLink(link, lane, pos);
260 for (std::map<std::string, MSTrafficLightLogic*>::iterator i = myVariants.begin(); i != myVariants.end(); ++i) {
261 (*i).second->ignoreLinkIndex(pos);
275 if (isPosAtGSP(step, *myFrom)) {
277 if (mySwitchSynchron) {
280 switchToPos(step, *myTo, getGSPTime(*myTo));
300 return gspTime == programTime;
308 assert(toTime >= startOfPhase);
309 return toTime - startOfPhase;
316 SUMOTime diff = getDiffToStartOfPhase(logic, toTime);
357 const SUMOTime gspTo = getGSPTime(*myTo) % myTo->getDefaultCycleTime();
358 const SUMOTime currentPosTo = myTo->getOffsetFromIndex(myTo->getCurrentPhaseIndex()) + myTo->getSpentDuration(step);
359 SUMOTime deltaToStretch = gspTo - currentPosTo;
360 if (deltaToStretch < 0) {
361 deltaToStretch += myTo->getDefaultCycleTime();
363 const int stepTo = myTo->getIndexFromOffset(gspTo);
364 const SUMOTime newdur = myTo->getPhase(stepTo).duration - getDiffToStartOfPhase(*myTo, gspTo) + deltaToStretch;
365 myTo->changeStepAndDuration(myControl, step, stepTo, newdur);
395 SUMOTime cycleTime = myTo->getDefaultCycleTime();
397 SUMOTime posAfterSyn = myTo->getPhaseIndexAtTime(step);
400 if (posAfterSyn < gspTo) {
401 deltaToCut = posAfterSyn + cycleTime - gspTo;
403 deltaToCut = posAfterSyn - gspTo;
408 assert(def.end >= def.begin);
409 deltaPossible += def.end - def.begin;
412 deltaPossible = stretchUmlaufAnz * deltaPossible;
413 if ((deltaPossible > deltaToCut) && (deltaToCut < (cycleTime / 2))) {
414 cutLogic(step, gspTo, deltaToCut);
416 SUMOTime deltaToStretch = (cycleTime - deltaToCut) % cycleTime;
417 stretchLogic(step, gspTo, deltaToStretch);
424 int actStep = myTo->getIndexFromOffset(startPos);
428 int stepOfBegin = myTo->getIndexFromOffset(def.begin);
429 if (stepOfBegin == actStep) {
430 if (def.begin < startPos) {
431 toCut = def.end - startPos;
433 toCut = def.end - def.begin;
435 toCut =
MIN2(allCutTime, toCut);
436 allCutTime = allCutTime - toCut;
439 SUMOTime remainingDur = myTo->getPhase(actStep).duration - getDiffToStartOfPhase(*myTo, startPos);
440 SUMOTime newDur = remainingDur - toCut;
441 myTo->changeStepAndDuration(myControl, step, actStep, newDur);
444 int currStep = (actStep + 1) % (
int)myTo->getPhases().size();
445 while (allCutTime > 0) {
446 for (
int i = currStep; i < (int) myTo->getPhases().size(); i++) {
447 SUMOTime beginOfPhase = myTo->getOffsetFromIndex(i);
448 SUMOTime durOfPhase = myTo->getPhase(i).duration;
449 SUMOTime endOfPhase = beginOfPhase + durOfPhase;
451 if ((beginOfPhase <= def.begin) && (endOfPhase >= def.end)) {
452 SUMOTime maxCutOfPhase =
MIN2(def.end - def.begin, allCutTime);
453 allCutTime = allCutTime - maxCutOfPhase;
454 durOfPhase = durOfPhase - maxCutOfPhase;
457 myTo->addOverridingDuration(durOfPhase);
465 int currStep = myTo->getIndexFromOffset(startPos);
466 SUMOTime durOfPhase = myTo->getPhase(currStep).duration;
467 SUMOTime remainingStretchTime = allStretchTime;
474 facSum *= stretchUmlaufAnz;
477 SUMOTime diffToStart = getDiffToStartOfPhase(*myTo, startPos);
479 SUMOTime endOfPhase = (startPos + durOfPhase - diffToStart);
480 if (def.end <= endOfPhase && def.end >= startPos) {
481 double actualfac = def.fac / facSum;
482 facSum = facSum - def.fac;
484 remainingStretchTime = allStretchTime - StretchTimeOfPhase;
491 durOfPhase = durOfPhase - diffToStart + StretchTimeOfPhase;
492 myTo->changeStepAndDuration(myControl, step, currStep, durOfPhase);
494 currStep = (currStep + 1) % (
int)myTo->getPhases().size();
496 while (remainingStretchTime > 0) {
497 for (
int i = currStep; i < (int)myTo->getPhases().size() && remainingStretchTime > 0; i++) {
498 durOfPhase = myTo->getPhase(i).duration;
499 SUMOTime beginOfPhase = myTo->getOffsetFromIndex(i);
500 SUMOTime endOfPhase = beginOfPhase + durOfPhase;
502 if ((beginOfPhase <= def.end) && (endOfPhase >= def.end)) {
503 double actualfac = def.fac / facSum;
506 durOfPhase += StretchTimeOfPhase;
507 remainingStretchTime -= StretchTimeOfPhase;
510 myTo->addOverridingDuration(durOfPhase);
526 for (std::map<std::string, TLSLogicVariants*>::const_iterator i =
myLogics.begin(); i !=
myLogics.end(); ++i) {
530 for (std::map<std::string, WAUT*>::const_iterator i =
myWAUTs.begin(); i !=
myWAUTs.end(); ++i) {
538 for (std::map<std::string, TLSLogicVariants*>::const_iterator i =
myLogics.begin(); i !=
myLogics.end(); ++i) {
539 (*i).second->getActive()->setTrafficLightSignals(t);
544std::vector<MSTrafficLightLogic*>
546 std::vector<MSTrafficLightLogic*> ret;
547 std::map<std::string, TLSLogicVariants*>::const_iterator i;
549 std::vector<MSTrafficLightLogic*> s = (*i).second->getAllLogics();
550 copy(s.begin(), s.end(), back_inserter(ret));
557 std::map<std::string, TLSLogicVariants*>::const_iterator i =
myLogics.find(
id);
567 std::map<std::string, TLSLogicVariants*>::const_iterator i =
myLogics.find(
id);
571 return (*i).second->
getLogic(programID);
575std::vector<std::string>
577 std::vector<std::string> ret;
578 for (std::map<std::string, TLSLogicVariants*>::const_iterator i =
myLogics.begin(); i !=
myLogics.end(); ++i) {
579 ret.push_back((*i).first);
588 std::map<std::string, TLSLogicVariants*>::iterator it =
myLogics.find(
id);
607 bool hadErrors =
false;
609 hadErrors |= !it.second->checkOriginalTLS();
610 it.second->saveInitialStates();
619 std::map<std::string, TLSLogicVariants*>::const_iterator i =
myLogics.find(tl->
getID());
623 return (*i).second->isActive(tl);
629 std::map<std::string, TLSLogicVariants*>::const_iterator i =
myLogics.find(
id);
633 return (*i).second->getActive();
640 std::map<std::string, TLSLogicVariants*>::iterator i =
myLogics.find(
id);
643 throw ProcessError(
"Could not switch tls '" +
id +
"' to program '" + programID +
"': No such tls exists.");
645 (*i).second->switchTo(*
this, programID);
651 const std::string& startProg,
SUMOTime period) {
668 SUMOTime when,
const std::string& to) {
682 myWAUTs[wautid]->switches.push_back(s);
688 const std::string& tls,
689 const std::string& proc,
699 throw InvalidArgument(
"TLS '" + tls +
"' to switch in WAUT '" + wautid +
"' was not yet defined.");
705 myWAUTs[wautid]->junctions.push_back(j);
707 std::string initProg =
myWAUTs[wautid]->startProg;
708 std::vector<WAUTSwitch>::const_iterator first =
myWAUTs[wautid]->switches.end();
710 for (std::vector<WAUTSwitch>::const_iterator i =
myWAUTs[wautid]->switches.begin(); i !=
myWAUTs[wautid]->switches.end(); ++i) {
712 minExecTime = (*i).when;
715 if (first !=
myWAUTs[wautid]->switches.begin()) {
716 initProg = (*(first - 1)).to;
734 std::vector<WAUTSwitch>::const_iterator first = w->
switches.end();
736 for (std::vector<WAUTSwitch>::const_iterator i = w->
switches.begin(); i != w->
switches.end(); ++i) {
738 minExecTime = (*i).when;
744 std::vector<WAUTSwitch>::const_iterator mbegin = w->
switches.begin();
760 const std::string& wautid = cmd.
getWAUTID();
764 for (std::vector<WAUTJunction>::iterator i =
myWAUTs[wautid]->junctions.begin(); i !=
myWAUTs[wautid]->junctions.end(); ++i) {
770 if ((*i).procedure ==
"GSP") {
772 }
else if ((*i).procedure ==
"Stretch") {
787 if (index == (
int)waut->
switches.size()) {
819std::pair<SUMOTime, MSPhaseDefinition>
828 for (
const auto& logic :
myLogics) {
837 for (
const auto& logic :
myLogics) {
838 logic.second->saveState(out);
848 for (
const auto& variants :
myLogics) {
849 for (
auto& logic : variants.second->getAllLogics()) {
856 const SUMOTime cycleTime = logic->getDefaultCycleTime();
857 auto& phases = logic->getPhases();
858 SUMOTime offset = logic->getOffset();
860 offset = (time + cycleTime - (offset % cycleTime)) % cycleTime;
862 offset = (time + ((-offset) % cycleTime)) % cycleTime;
865 while (offset >= phases[step]->duration) {
866 offset -= phases[step]->duration;
869 logic->loadState(*
this, time, step, offset);
#define WRITE_WARNINGF(...)
#define WRITE_ERRORF(...)
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
static void saveState(OutputDevice &out)
Save driveway occupancy into the given stream.
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
Representation of a lane in the micro simulation.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
virtual void createTLWrapper(MSTrafficLightLogic *)
creates a wrapper for the given logic (see GUINet)
A traffic lights logic which represents a tls in an off-mode.
The definition of a single phase of a tls logic.
const std::string & getState() const
Returns the state within this phase.
SUMOTime duration
The duration of the phase.
static void saveState(OutputDevice &out)
Saves the current constraint states into the given stream.
static void clearState()
Clear all constraint states before quick-loading state.
A fixed traffic light logic.
Base class for things to execute if a tls switches to a new phase.
This event-class is used to initialise a WAUT switch at a certain time.
const std::string & getWAUTID() const
Returns the WAUT-id.
int & getIndex()
Returns a reference to the index.
Storage for all programs of a single tls.
void addLink(MSLink *link, MSLane *lane, int pos)
void switchTo(MSTLLogicControl &tlc, const std::string &programID)
void addSwitchCommand(OnSwitchAction *c)
void ignoreLinkIndex(int pos)
void setStateInstantiatingOnline(MSTLLogicControl &tlc, const std::string &state)
bool checkOriginalTLS() const
Verifies traffic lights loaded from the network.
std::vector< MSTrafficLightLogic * > getAllLogics() const
void saveState(OutputDevice &out)
MSTrafficLightLogic * getLogic(const std::string &programID) const
TLSLogicVariants()
Constructor.
void executeOnSwitchActions() const
bool addLogic(const std::string &programID, MSTrafficLightLogic *logic, bool netWasLoaded, bool isNewDefault=true)
Adds a logic (program). In case of an error the logic gets deleted.
~TLSLogicVariants()
Destructor.
MSTrafficLightLogic * getActive() const
MSTrafficLightLogic * getDefault() const
return the default program (that last used program except TRACI_PROGRAM)
MSTrafficLightLogic * getLogicInstantiatingOff(MSTLLogicControl &tlc, const std::string &programID)
bool isActive(const MSTrafficLightLogic *tl) const
This class switches using the GSP algorithm.
~WAUTSwitchProcedure_GSP()
Destructor.
WAUTSwitchProcedure_GSP(MSTLLogicControl &control, WAUT &waut, MSTrafficLightLogic *from, MSTrafficLightLogic *to, bool synchron)
Constructor.
void adaptLogic(SUMOTime step)
Stretches the destination program's phase to which the tls was switched.
This class simply switches to the next program.
bool trySwitch(SUMOTime step)
Determines whether a switch is possible.
~WAUTSwitchProcedure_JustSwitch()
Destructor.
WAUTSwitchProcedure_JustSwitch(MSTLLogicControl &control, WAUT &waut, MSTrafficLightLogic *from, MSTrafficLightLogic *to, bool synchron)
Constructor.
This class switches using the Stretch algorithm.
~WAUTSwitchProcedure_Stretch()
Destructor.
void adaptLogic(SUMOTime step)
Determines the destination program's changes and applies them.
std::vector< StretchRange > myStretchRanges
the given Stretch-areas for the "to" program, this is 0-based indexed, while the input is 1-based
WAUTSwitchProcedure_Stretch(MSTLLogicControl &control, WAUT &waut, MSTrafficLightLogic *from, MSTrafficLightLogic *to, bool synchron)
Constructor.
void cutLogic(SUMOTime step, SUMOTime startPos, SUMOTime allCutTime)
Cuts the logic to synchronize.
void stretchLogic(SUMOTime step, SUMOTime startPos, SUMOTime allStretchTime)
Stretches the logic to synchronize.
This is the abstract base class for switching from one tls program to another.
virtual bool trySwitch(SUMOTime step)
Determines whether a switch is possible.
MSTrafficLightLogic * myTo
The program to switch the tls to.
bool isPosAtGSP(SUMOTime currentTime, const MSTrafficLightLogic &logic)
Checks, whether the position of a signal programm is at the GSP ("Good Switching Point")
SUMOTime getGSPTime(const MSTrafficLightLogic &logic) const
Returns the GSP-value.
SUMOTime getDiffToStartOfPhase(MSTrafficLightLogic &logic, SUMOTime toTime)
Returns the difference between a given time and the start of the phase.
void switchToPos(SUMOTime simStep, MSTrafficLightLogic &logic, SUMOTime toTime)
switches the given logic directly to the given position
A class that stores and controls tls and switching of their programs.
void addWAUTJunction(const std::string &wautid, const std::string &tls, const std::string &proc, bool synchron)
Adds a tls to the list of tls to be switched by the named WAUT.
void clearState(SUMOTime time, bool quickReload=false)
Clear all tls states before quick-loading state.
std::vector< MSTrafficLightLogic * > getAllLogics() const
Returns a vector which contains all logics.
std::vector< WAUTSwitchProcess > myCurrentlySwitched
A list of currently running switching procedures.
std::pair< SUMOTime, MSPhaseDefinition > getPhaseDef(const std::string &tlid) const
return the complete phase definition for a named traffic lights logic
std::map< std::string, TLSLogicVariants * > myLogics
A map from ids to the corresponding variants.
void addWAUT(SUMOTime refTime, const std::string &id, const std::string &startProg, SUMOTime period)
Adds a WAUT definition.
std::vector< std::string > getAllTLIds() const
void switchTo(const std::string &id, const std::string &programID)
Switches the named (id) tls to the named (programID) program.
MSTrafficLightLogic * getActive(const std::string &id) const
Returns the active program of a named tls.
bool closeNetworkReading()
Lets MSTLLogicControl know that the network has been loaded.
void setTrafficLightSignals(SUMOTime t) const
Lets all running (current) tls programs apply their current signal states to links they control.
bool knows(const std::string &id) const
Returns the information whether the named tls is stored.
void saveState(OutputDevice &out)
Saves the current tls states into the given stream.
bool myNetWasLoaded
Information whether the net was completely loaded.
void switchOffAll()
switch all logic variants to 'off'
void addWAUTSwitch(const std::string &wautid, SUMOTime when, const std::string &to)
Adds a WAUT switch step to a previously built WAUT.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
MSTLLogicControl()
Constructor.
SUMOTime initWautSwitch(SwitchInitCommand &cmd)
Initialises switching a WAUT.
~MSTLLogicControl()
Destructor.
void check2Switch(SUMOTime step)
Checks whether any WAUT is trying to switch a tls into another program.
std::map< std::string, WAUT * > myWAUTs
A map of ids to corresponding WAUTs.
bool isActive(const MSTrafficLightLogic *tl) const
Returns whether the given tls program is the currently active for his tls.
bool add(const std::string &id, const std::string &programID, MSTrafficLightLogic *logic, bool newDefault=true)
Adds a tls program to the container.
void closeWAUT(const std::string &wautid)
Closes loading of a WAUT.
The parent class for traffic light logics.
const LinkVectorVector & getLinks() const
Returns the list of lists of all affected links.
virtual void adaptLinkInformationFrom(const MSTrafficLightLogic &logic)
Applies information about controlled links and lanes from the given logic.
virtual const MSPhaseDefinition & getCurrentPhaseDef() const =0
Returns the definition of the current phase.
virtual int getCurrentPhaseIndex() const =0
Returns the current index within the program.
virtual void deactivateProgram()
virtual SUMOTime getOffsetFromIndex(int index) const =0
Returns the position (start of a phase during a cycle) from of a given step.
virtual void changeStepAndDuration(MSTLLogicControl &tlcontrol, SUMOTime simStep, int step, SUMOTime stepDuration)=0
Changes the current phase and her duration.
virtual const MSPhaseDefinition & getPhase(int givenstep) const =0
Returns the definition of the phase from the given position within the plan.
const std::string & getProgramID() const
Returns this tl-logic's id.
virtual int getIndexFromOffset(SUMOTime offset) const =0
Returns the step (the phasenumber) of a given position of the cycle.
SUMOTime getDefaultCycleTime() const
Returns the cycle time (in ms)
virtual void activateProgram()
called when switching programs
SUMOTime getSpentDuration(SUMOTime simStep=-1) const
Returns the duration spent in the current phase.
bool setTrafficLightSignals(SUMOTime t) const
Applies the current signal states to controlled links.
std::vector< MSPhaseDefinition * > Phases
Definition of a list of phases, being the junction logic.
const std::string & getID() const
Returns the id.
Static storage of an output device and its base (abstract) implementation.
bool hasParameter(const std::string &key) const
Returns whether the parameter is set.
std::map< std::string, std::string > Map
parameters map
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
std::string startProg
The name of the start program.
std::vector< WAUTSwitch > switches
The list of switches to be done by the WAUT.
SUMOTime period
The period with which to repeat switches.
std::string id
The id of the WAUT.
SUMOTime refTime
The reference time (offset to the switch times)
Storage for a junction assigned to a WAUT.
std::string procedure
The procedure to switch the junction with.
bool synchron
Information whether this junction shall be switched synchron.
std::string junction
The junction name.
Storage for a WAUTs switch point.
SUMOTime when
The time the WAUT shall switch the TLS.
std::string to
The program name the WAUT shall switch the TLS to.
A definition of a stretch - Bereich.
double fac
The weight factor of a stretch/cut area.
SUMOTime end
The end of a stretch/cut area.
SUMOTime begin
The begin of a stretch/cut area.
An initialised switch process.
MSTrafficLightLogic * to
The program to switch the tls to.
std::string junction
The id of the junction to switch.
MSTrafficLightLogic * from
The current program of the tls.
WAUTSwitchProcedure * proc
The used procedure.