|
|
@@ -1,12 +1,11 @@
|
|
|
from pypdevs.tracers.tracerBase import BaseTracer
|
|
|
from pypdevs.util import runTraceAtController
|
|
|
-import sys
|
|
|
from dataclasses import dataclass
|
|
|
+import sys
|
|
|
|
|
|
-from de2.elements import Pool, Sailer
|
|
|
+from de2.elements import Pool, Sailer, Clock, Scheduler
|
|
|
|
|
|
|
|
|
-# TODO: Update always!
|
|
|
class TracerPort(BaseTracer):
|
|
|
"""
|
|
|
A tracer for port simulation output
|
|
|
@@ -25,6 +24,7 @@ class TracerPort(BaseTracer):
|
|
|
else:
|
|
|
self.filename = None
|
|
|
self.prevtime = (-1, -1)
|
|
|
+ self.starting_time = 0
|
|
|
|
|
|
def startTracer(self, recover):
|
|
|
"""
|
|
|
@@ -64,7 +64,7 @@ class TracerPort(BaseTracer):
|
|
|
|
|
|
def _vesselStr(self, vessel):
|
|
|
# VESSEL: mmsi, name, source, target, task, total distance, distance left, velocity
|
|
|
- return "'%s', '%s', %s, %s, '%s', %.6f, %.6f, %.6f" % vessel.tuple()
|
|
|
+ return "%s, %s, %s, %s, %s, %.6f, %.6f, %.6f" % vessel.tuple()
|
|
|
|
|
|
def traceInternal(self, aDEVS):
|
|
|
"""
|
|
|
@@ -72,29 +72,23 @@ class TracerPort(BaseTracer):
|
|
|
|
|
|
:param aDEVS: the model that transitioned
|
|
|
"""
|
|
|
- if isinstance(aDEVS, Pool):
|
|
|
- for vessel in aDEVS.state["waiting"].values():
|
|
|
- runTraceAtController(self.server, self.uid, aDEVS,
|
|
|
- [aDEVS.time_last, '"' + self._vesselStr(vessel) + '"'])
|
|
|
- elif isinstance(aDEVS, Sailer):
|
|
|
- for vessel in aDEVS.state["vessels"]:
|
|
|
- runTraceAtController(self.server, self.uid, aDEVS,
|
|
|
- [aDEVS.time_last, '"' + self._vesselStr(vessel) + '"'])
|
|
|
-
|
|
|
- def traceExternal(self, aDEVS):
|
|
|
- """
|
|
|
- Tracing done for the external transition function
|
|
|
-
|
|
|
- :param aDEVS: the model that transitioned
|
|
|
- """
|
|
|
- if isinstance(aDEVS, Pool):
|
|
|
- for vessel in aDEVS.state["waiting"].values():
|
|
|
- runTraceAtController(self.server, self.uid, aDEVS,
|
|
|
- [aDEVS.time_last, '"' + self._vesselStr(vessel) + '"'])
|
|
|
- elif isinstance(aDEVS, Sailer):
|
|
|
- for vessel in aDEVS.state["vessels"]:
|
|
|
- runTraceAtController(self.server, self.uid, aDEVS,
|
|
|
- [aDEVS.time_last, '"' + self._vesselStr(vessel) + '"'])
|
|
|
+ if isinstance(aDEVS, Clock):
|
|
|
+ par = aDEVS.parent
|
|
|
+ for model in par.component_set:
|
|
|
+ if isinstance(model, Pool):
|
|
|
+ for vessel in model.state["waiting"].values():
|
|
|
+ runTraceAtController(self.server, self.uid, aDEVS,
|
|
|
+ [aDEVS.time_last, '"' + self._vesselStr(vessel) + '"'])
|
|
|
+ elif isinstance(model, Sailer):
|
|
|
+ for vessel in model.state["vessels"]:
|
|
|
+ runTraceAtController(self.server, self.uid, aDEVS,
|
|
|
+ [aDEVS.time_last, '"' + self._vesselStr(vessel) + '"'])
|
|
|
+
|
|
|
+ def traceInit(self, aDEVS, t):
|
|
|
+ if isinstance(aDEVS, Scheduler):
|
|
|
+ self.starting_time = aDEVS.starting_time / 1000
|
|
|
+ runTraceAtController(self.server, self.uid, aDEVS,
|
|
|
+ [aDEVS.time_last, '"START: %10.6f"' % self.starting_time])
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
@@ -108,22 +102,43 @@ class StreamedVessel:
|
|
|
distance_left: float
|
|
|
velocity: float
|
|
|
|
|
|
+ @staticmethod
|
|
|
+ def from_str(args):
|
|
|
+ vec = args.split(", ")
|
|
|
+
|
|
|
+ if vec[2] == "None":
|
|
|
+ st = None
|
|
|
+ if vec[3] == "None":
|
|
|
+ tt = None
|
|
|
+ else:
|
|
|
+ tt = float(vec[3][1:]), float(vec[4][:-1])
|
|
|
+ else:
|
|
|
+ st = float(vec[2][1:]), float(vec[3][:-1])
|
|
|
+ if vec[4] == "None":
|
|
|
+ tt = None
|
|
|
+ else:
|
|
|
+ tt = float(vec[4][1:]), float(vec[5][:-1])
|
|
|
+
|
|
|
+ alist = vec[:2] + [st, tt, vec[-4]] + [float(x) for x in vec[-3:]]
|
|
|
+ return StreamedVessel(*alist)
|
|
|
+
|
|
|
|
|
|
class Streamer:
|
|
|
def __init__(self):
|
|
|
self.time = 0
|
|
|
- self.starting_time = None
|
|
|
+ self.starting_time = 0
|
|
|
self.vessels = []
|
|
|
|
|
|
def write(self, text: str):
|
|
|
+ # print(text, end='')
|
|
|
texts = text.split("\n")
|
|
|
for t in texts:
|
|
|
if t.startswith("TIME: "):
|
|
|
self.time = float(t[6:])
|
|
|
- if self.starting_time is None:
|
|
|
- self.starting_time = self.time
|
|
|
self.vessels.clear()
|
|
|
+ elif t.startswith("START: "):
|
|
|
+ self.starting_time = float(t[7:])
|
|
|
elif len(t) > 0:
|
|
|
- self.vessels.append(StreamedVessel(*eval(t)))
|
|
|
+ self.vessels.append(StreamedVessel.from_str(text))
|
|
|
|
|
|
def flush(self): pass
|