stsgraph
Classes:
-
GraphClient–Erweiterter PluginClient mit Graphdarstellung der Basisdaten vom Simulator.
Functions:
-
test–Testprogramm
GraphClient
flowchart TD
stskit.plugin.stsgraph.GraphClient[GraphClient]
stskit.plugin.stsplugin.PluginClient[PluginClient]
stskit.plugin.stsplugin.PluginClient --> stskit.plugin.stsgraph.GraphClient
click stskit.plugin.stsgraph.GraphClient href "" "stskit.plugin.stsgraph.GraphClient"
click stskit.plugin.stsplugin.PluginClient href "" "stskit.plugin.stsplugin.PluginClient"
Erweiterter PluginClient mit Graphdarstellung der Basisdaten vom Simulator.
Attributes:
-
signalgraph–Der Signalgraph enthält das Gleisbild aus der Wegeliste der Plugin-Schnittstelle mit sämtlichen Knoten und Kanten. Das 'typ'-Attribut wird auf den sts-Knotentyp (int) gesetzt. Kanten werden entsprechend der Nachbarrelationen aus der Wegeliste ('typ'-attribut 'gleis') gesetzt. Der Graph ist gerichtet, da die nachbarbeziehung i.a. nicht reziprok ist. Die Kante zeigt auf die Knoten, die als Nachbarn aufgeführt sind. Meist werden von der Schnittstelle jedoch Kanten in beide Richtungen angegeben, weshalb z.B. nicht herausgefunden werden kann, für welche Richtung ein Signal gilt.
Der Graph sollte nicht verändert werden. Es wird nicht erwartet, dass sich der Graph im Laufe eines Spiels ändert.
Die Signaldistanz wird am Anfang auf 1 gesetzt.
-
bahnsteiggraph–Der Bahnsteiggraph enthält alle Bahnsteige aus der Bahnsteigliste der Plugin-Schnittstelle als Knoten. Kanten werden entsprechend der Nachbarrelationen gesetzt. Der Graph ist ungerichtet, da die Nachbarbeziehung als reziprok aufgefasst wird.
Der Graph sollte nicht verändert werden. Es wird nicht erwartet, dass sich der Graph im Laufe eines Spiels ändert.
-
zuggraph–Der Zuggraph enthält alle Züge aus der Zugliste der Plugin-Schnittstelle als Knoten. Kanten werden aus den Ersatz-, Kuppeln- und Flügeln-Flags gebildet.
Der Zuggraph verändert sich im Laufe eines Spiels. Neue Züge werden hinzugefügt. Ausgefahrene und ersetzte Züge werden beibehalten und als "ausgefahren" markiert.
-
zielgraph–Der Zielgraph enthält die Zielpunkte aller Züge. Die Punkte sind gemäss Anordnung im Fahrplan sowie planmässigen Abhängigkeiten (Ersatz, Kuppeln, Flügeln) verbunden.
Bei Ein- und Ausfahrten wird die Ankunfts- und Abfahrtszeit auf 1 Minute vor bzw. nach dem Halt geschätzt.
-
bahnhofteile(dict[str, str]) –Ordnet jedem Gleis einen Bahnhofteil zu. Der Bahnhofteil entspricht dem alphabetisch ersten Gleis in der Nachbarschaft. Der Dictionary wird durch _bahnhofteile_gruppieren gefüllt.
Methods:
-
calc_simzeit–Simulatorzeit ohne Serverabfrage abschätzen.
-
gleis_abgleichen–Gleisnamen mit Bahnsteigliste abgleichen und ev. korrigieren
-
receiver–Empfangsschleife: Antworten empfangen und verteilen
-
register–Klient beim Simulator registrieren.
-
request_anlageninfo–Anlageninfo anfordern.
-
request_ereignis–Ereignismeldung anfordern
-
request_simzeit–Simulatorzeit anfragen.
-
request_zug–Einzelnen Zug und Fahrplan anfragen.
-
request_zugdetails–ZugDetails eines, mehrerer oder aller Züge anfragen.
-
request_zugfahrplan–Fahrplan eines, mehrerer oder aller Züge anfragen.
-
resolve_zugflags–Folgezüge aus den Zugflags auflösen.
-
update_bahnsteig_zuege–Züge in Bahnsteigliste eintragen.
-
update_wege_zuege–Züge in Wegelisten eintragen.
Source code in stskit/plugin/stsgraph.py
antwort_channel_in
property
Eingang asynchrone Warteschlange für Antworten vom Simulator
Antworten vom Simulator werden während des Parsens als Element-Objekte an diese Warteschlange übergeben.
antwort_channel_out
property
Ausgang asynchrone Warteschlange für Antworten vom Simulator
Antworten vom Simulator können asynchron als Element-Objekte aus dieser Warteschlange entnommen und verarbeitet werden.
ereignis_channel_in
property
ereignis_channel_in: SendChannel[Ereignis]
Eingang asynchrone Warteschlange für Ereignismeldungen vom Simulator
Ereignismeldungen vom Simulator werden während des Parsens als Ereignis-Objekte an diese Warteschlange übergeben.
ereignis_channel_out
property
ereignis_channel_out: ReceiveChannel[Ereignis]
Ausgang asynchrone Warteschlange für Ereignismeldungen vom Simulator
Ereignismeldungen vom Simulator können asynchron als Ereignis-Objekte aus dieser Warteschlange entnommen und verarbeitet werden.
calc_simzeit
calc_simzeit() -> datetime
Simulatorzeit ohne Serverabfrage abschätzen.
Der time_offset muss vorher einmal mittels request_simzeit kalibriert worden sein.
Der Rückgabewert enthält das aktuelle (Client-)Datum.
Das ist nötig, damit mit der Uhrzeit gerechnet werden kann.
Da der Simulator kein Datum kennt, sollten die Datumsfelder nach der Rechnung nicht beachtet werden.
Der Fahrplan (in FahrplanZeile) enthält lediglich datetime.time-Objekte.
Ein datetime.time-Objekt kann einfach über die time-Methode extrahiert werden.
Returns:
-
datetime–Extrapolierte Simulatorzeit
Source code in stskit/plugin/stsplugin.py
gleis_abgleichen
gleis_abgleichen(gleis_name: str) -> str
Gleisnamen mit Bahnsteigliste abgleichen und ev. korrigieren
Die Methode versucht, Gleisnamen, die in der Bahnsteigliste nicht enthalten sind, mittels des gleisabgleich-Dict aufzulösen, um Gross/Kleinschreibung und ggf. andere Schreibfehler im Zugfahrplan zu korrigieren.
Parameters:
-
(gleis_namestr) –Original-Gleisname
Returns:
-
str–abgeglichener Name
Source code in stskit/plugin/stsplugin.py
receiver
async
Empfangsschleife: Antworten empfangen und verteilen
Alle Antworten ausser Ereignisse werden in untangle.Element-Objekte gepackt und an die Antworten-Queue übergeben. Ereignisse werden als stskit.model.Ereignis-Objekte an die Ereignisse-Queue übergeben.
Diese Coroutine muss explizit in einer trio.nursery gestartet werden und läuft, bis die Verbindung unterbrochen wird.
Source code in stskit/plugin/stsplugin.py
register
async
Klient beim Simulator registrieren.
Diese Funktion muss als erste nach dem Verbinden aufgerufen werden, da sie auch die Statusantwort nach der Verbindungsaufnahme auswertet.
Source code in stskit/plugin/stsplugin.py
request_anlageninfo
async
Anlageninfo anfordern.
Die Antwort wird im anlageninfo-Attribut gespeichert.
Source code in stskit/plugin/stsplugin.py
request_ereignis
async
Ereignismeldung anfordern
Nach Nummernwechsel muss man Ereignismeldungen neu anfordern. Ausser für "Einfahrt" schicken wir daher Anforderungen nur, wenn der Zug sichtbar ist.
Anforderungen werden in registrierte_ereignisse notiert,
damit sie nicht wiederholt gesendet werden.
Parameters:
-
(artstr) –art des ereignisses, cf. model.Ereignis.arten
-
(zidsIterable[int]) –menge oder sequenz von zug-id-nummern
Source code in stskit/plugin/stsplugin.py
request_simzeit
async
request_simzeit() -> datetime
Simulatorzeit anfragen.
Die Funktion fragt die aktuelle Simulatorzeit an und liefert sie in einem datetime.time-Objekt.
Basierend auf der Antwort setzt sie ausserdem client_datetime, server_datetime und time_offset.
Diese Attribute können benutzt werden, um die Simulatorzeit zu berechnen (calc_simzeit-Funktion),
ohne dass eine erneute Anfrage geschickt werden muss.
Info
client_datetime und server_datetime enthalten das aktuelle Datum.
Das ist nötig, um den time_offset als timedelta zu berechnen.
Da der Simulator kein Datum kennt, sollten die Datumsfelder nicht beachtet werden.
Die datetime.datetime.time-Methode ist ein schneller Weg, ein datetime.time-Objekt zu erhalten.
Returns:
-
datetime–Aktuelle Simulatorzeit
Source code in stskit/plugin/stsplugin.py
request_zug
async
request_zug(zid: int) -> ZugDetails | None
Einzelnen Zug und Fahrplan anfragen.
Der Zug wird in die Zugliste eingetragen bzw. aktualisiert und als ZugDetails-Objekt zurückgegeben.
Parameters:
-
(zidint) –einzelne zug-id
Returns:
-
ZugDetails | None–ZugDetailsinkl. Fahrplan. -
ZugDetails | None–None, wenn der Zug nicht verzeichnet ist.
Source code in stskit/plugin/stsplugin.py
request_zugdetails
async
ZugDetails eines, mehrerer oder aller Züge anfragen.
Wenn ein ZugDetails-Objekt mit der zid bereits in der Zugliste angelegt ist, wird es aktualisiert, andernfalls neu angelegt. Wenn ein Fehler auftritt (weil z.B. der Zug nicht mehr im Stellwerk ist), wird der Zug aus der Zugliste gelöscht.
Parameters:
-
(zidint | Iterable[int] | None, default:None) –Einzelne Zug-ID, Iterable von Zug-IDs, oder None (alle in der Zugliste).
Source code in stskit/plugin/stsplugin.py
request_zugfahrplan
async
Fahrplan eines, mehrerer oder aller Züge anfragen.
Das ZugDetails-Objekt muss in der Zugliste bereits existieren.
Abgefahrene Wegpunkte sind im Fahrplan nicht mehr vorhanden.
Parameters:
-
(zidint | Iterable[int] | None, default:None) –einzelne zug-id, iterable von zug-ids, oder None (alle in der liste).
Source code in stskit/plugin/stsplugin.py
resolve_zugflags
async
Folgezüge aus den Zugflags auflösen.
Da request_zugliste die Folgezüge (Ersatz-, Flügel- und Kuppelzüge) nicht automatisch erhält,
lesen wir diese aus den Zugflags aus und fragen ihre Details und Fahrpläne explizit an.
Die Funktion arbeitet iterativ, bis alle Folgezüge aufgelöst sind.
Die Züge werden in die Zugliste eingetragen und im Stammzug referenziert.
Info
zids sind nicht geordnet. Ersatzzüge können eine tiefere zid als der Stammzug haben.
Parameters:
-
(zidint | Iterable[int] | None, default:None) –Einzelne Zug-ID, Iterable von Zug-IDs, oder None (alle in der Liste).
Source code in stskit/plugin/stsplugin.py
update_bahnsteig_zuege
Züge in Bahnsteigliste eintragen.
Im zuege-attribut der Bahnsteige werden die an den Bahnsteig disponierten Züge aufgelistet.
zuege ist ein Dictionary und bildet zid auf ZugDetails ab.
Die ZugDetails sind weak References.
Source code in stskit/plugin/stsplugin.py
update_wege_zuege
Züge in Wegelisten eintragen.
Im Züge-Attribut der Wege und Knoten (Einfahrten, Ausfahrten, Haltepunkte) werden die fahrplanmässig daran vorbei kommenden Züge aufgelistet.
Source code in stskit/plugin/stsplugin.py
test
async
test(*args, **kwargs) -> GraphClient
Testprogramm
Das testprogramm fragt alle Daten einmalig vom Simulator ab.
Der GraphClient bleibt bestehen, damit weitere Details aus den statischen Attributen ausgelesen werden können. Die Kommunikation mit dem Simulator wird jedoch geschlossen.