Skip to content

Commit 0253b42

Browse files
committed
updating tls representation to contain earlyTarget and conditions #15230 #15226
1 parent 073b0fc commit 0253b42

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

tools/sumolib/net/__init__.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def getPrograms(self):
103103

104104
class Phase:
105105

106-
def __init__(self, duration, state, minDur=None, maxDur=None, next=tuple(), name=""):
106+
def __init__(self, duration, state, minDur=None, maxDur=None, next=tuple(), name="", earlyTarget=""):
107107
"""
108108
Constructs a traffic light phase
109109
duration (float): the duration of the phase in seconds
@@ -112,6 +112,7 @@ def __init__(self, duration, state, minDur=None, maxDur=None, next=tuple(), name
112112
maxDur (float): the maximum duration (ignored by static tls)
113113
next (intList): possible succesor phase (optional)
114114
name (string): the name of the phase
115+
earlyTarget (string): early switching to phase with the given index(es)
115116
"""
116117
self.duration = duration
117118
self.state = state
@@ -120,12 +121,14 @@ def __init__(self, duration, state, minDur=None, maxDur=None, next=tuple(), name
120121
self.maxDur = maxDur if maxDur is not None else duration
121122
self.next = next
122123
self.name = name
124+
self.earlyTarget = earlyTarget
123125

124126
def __repr__(self):
125127
name = (", name='%s'" % self.name) if self.name else ""
126128
next = (", next='%s'" % str(self.next)) if self.next else ""
127-
return ("Phase(duration=%s, state='%s', minDur=%s, maxDur=%s%s%s)" %
128-
(self.duration, self.state, self.minDur, self.maxDur, name, next))
129+
earlyTarget = (", earlyTarget='%s'" % self.earlyTarget) if self.earlyTarget else ""
130+
return ("Phase(duration=%s, state='%s', minDur=%s, maxDur=%s%s%s%s)"
131+
% (self.duration, self.state, self.minDur, self.maxDur, name, next, earlyTarget))
129132

130133

131134
class TLSProgram:
@@ -136,9 +139,13 @@ def __init__(self, id, offset, type):
136139
self._offset = offset
137140
self._phases = []
138141
self._params = {}
142+
self._conditions = {}
139143

140-
def addPhase(self, state, duration, minDur=-1, maxDur=-1, next=None, name=""):
141-
self._phases.append(Phase(duration, state, minDur, maxDur, next, name))
144+
def addPhase(self, state, duration, minDur=-1, maxDur=-1, next=None, name="", earlyTarget=""):
145+
self._phases.append(Phase(duration, state, minDur, maxDur, next, name, earlyTarget))
146+
147+
def addCondition(self, id, value):
148+
self._conditions[id] = value
142149

143150
def toXML(self, tlsID):
144151
ret = ' <tlLogic id="%s" type="%s" programID="%s" offset="%s">\n' % (
@@ -148,10 +155,13 @@ def toXML(self, tlsID):
148155
maxDur = '' if p.maxDur < 0 else ' maxDur="%s"' % p.maxDur
149156
name = '' if p.name == '' else ' name="%s"' % p.name
150157
next = '' if len(p.next) == 0 else ' next="%s"' % ' '.join(map(str, p.next))
151-
ret += ' <phase duration="%s" state="%s"%s%s%s%s/>\n' % (
152-
p.duration, p.state, minDur, maxDur, name, next)
158+
earlyTarget = '' if p.earlyTarget == '' else ' earlyTarget="%s"' % p.earlyTarget
159+
ret += ' <phase duration="%s" state="%s"%s%s%s%s%s/>\n' % (
160+
p.duration, p.state, minDur, maxDur, name, next, earlyTarget)
153161
for k, v in self._params.items():
154162
ret += ' <param key="%s" value="%s"/>\n' % (k, v)
163+
for i, v in self._conditions.items():
164+
ret += ' <condition id="%s" value="%s"/>\n' % (i, v)
155165
ret += ' </tlLogic>\n'
156166
return ret
157167

@@ -170,6 +180,17 @@ def getParam(self, key, default=None):
170180
def getParams(self):
171181
return self._params
172182

183+
def getStages(self):
184+
stages = dict()
185+
for idx, phase in enumerate(self.getPhases()):
186+
if phase not in stages.values():
187+
if 'G' in phase.state and 'y' not in phase.state and phase.name:
188+
stages[idx] = phase
189+
return stages
190+
191+
def getOffset(self):
192+
return self._offset
193+
173194

174195
class EdgeType:
175196
def __init__(self, id, allow, disallow):

tools/sumolib/sensors/inductive_loop.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,18 @@
2727

2828
class InductiveLoop:
2929

30-
def __init__(self, id, lane, pos, frequency=60, file="NUL", friendlyPos=True):
30+
def __init__(self, id, lane, pos, frequency=60, file="NUL", friendlyPos=True, vTypes=""):
3131
self.id = id
3232
self.lane = lane
3333
self.pos = pos
3434
self.frequency = frequency
3535
self.file = file
3636
self.friendlyPos = friendlyPos
37+
self.vTypes = vTypes
3738

3839
def toXML(self):
39-
return '<e1Detector id="%s" lane="%s" pos="%s" freq="%s" file="%s" friendlyPos="%s"/>' % (
40-
self.id, self.lane, self.pos, self.frequency, self.file, self.friendlyPos)
40+
return '<e1Detector id="%s" lane="%s" pos="%s" freq="%s" file="%s" friendlyPos="%s" vTypes="%s"/>' % (
41+
self.id, self.lane, self.pos, self.frequency, self.file, self.friendlyPos, self.vTypes)
4142

4243

4344
class InductiveLoopReader(handler.ContentHandler):

0 commit comments

Comments
 (0)