private TrainLeg GetTrainLeg(RealTimeMessage message, InfrastructureMapping mapping) { var ebuefZeitVon = TimeSpan.FromSeconds(mapping.EBuEfVonVerschiebungSekunden.ToInt()); var ebuefZeitpunktVon = message.SimulationsZeit.Value.Add(ebuefZeitVon).TimeOfDay; var ebuefZeitNach = TimeSpan.FromSeconds(mapping.EBuEfNachVerschiebungSekunden.ToInt()); var ebuefZeitpunktNach = message.SimulationsZeit.Value.Add(ebuefZeitNach).TimeOfDay; var ivuZeit = TimeSpan.FromSeconds(mapping.IVUVerschiebungSekunden.ToInt()); var ivuZeitpunkt = message.SimulationsZeit.Value.Add(ivuZeit).TimeOfDay; var fahrzeuge = message?.Decoder.AsEnumerable(); var result = new TrainLeg { EBuEfBetriebsstelleNach = mapping.EBuEfNachBetriebsstelle, EBuEfBetriebsstelleVon = mapping.EBuEfVonBetriebsstelle, EBuEfGleisNach = message.EndGleis, EBuEfGleisVon = message.StartGleis, EBuEfZeitpunktNach = ebuefZeitpunktNach, EBuEfZeitpunktVon = ebuefZeitpunktVon, Fahrzeuge = fahrzeuge, IstPrognose = message.Modus == MessageType.Prognose, IVUGleis = mapping.IVUGleis, IVULegTyp = mapping.IVUTrainPositionType, IVUNetzpunkt = mapping.IVUNetzpunkt, IVUZeitpunkt = ivuSessionDate.Add(ivuZeitpunkt), Zugnummer = message.Zugnummer, }; return(result); }
public static int GetClassifier(this TrainLeg leg) { var result = leg.IstPrognose ? RealtimeInfoConstants.ClassifierPrognosis : RealtimeInfoConstants.ClassifierActual; return(result); }
public static int?GetEBuEfGleis(this TrainLeg leg, bool istVon) { var result = istVon ? leg.EBuEfGleisVon.ToInt() : leg.EBuEfGleisNach.ToInt(); return(result); }
public Task AddRealtimeAsync(TrainLeg leg) { var result = retryPolicy.ExecuteAsync( action: (queryCancellationToken) => SaveTrainPositionsAsync( leg: leg, queryCancellationToken: queryCancellationToken), cancellationToken: cancellationToken); return(result); }
public void Add(TrainLeg trainLeg) { if (trainLeg != default) { var info = converter.Get(trainLeg); if (info != default) { infosQueue.Enqueue(info); } } }
public RealTimeInfoTO Get(TrainLeg leg) { var result = GetRealtimeInfo( eventCode: leg.GetEventcode(), classifier: leg.GetClassifier(), tripNumber: leg.Zugnummer, timeStamp: leg.IVUZeitpunkt, stopArea: leg.IVUNetzpunkt, track: leg.IVUGleis, vehicles: leg.Fahrzeuge); return(result); }
private async Task SaveTrainPositionAsync(TrainLeg leg, bool istVon, CancellationToken queryCancellationToken) { var betriebsstelle = istVon ? leg.EBuEfBetriebsstelleVon : leg.EBuEfBetriebsstelleNach; if (!string.IsNullOrWhiteSpace(betriebsstelle)) { logger.LogDebug( "Suche in der EBuEf-DB nach dem letzten Halt von Zug {train} in {location}.", leg.Zugnummer, betriebsstelle); using var context = new HaltDispoContext(connectionString); var halt = context.Halte .Where(h => h.Betriebsstelle == betriebsstelle) .Include(h => h.Zug) .FirstOrDefault(h => h.Zug.Zugnummer.ToString() == leg.Zugnummer); if (halt != null) { logger.LogDebug( "Schreibe {positionType}-Position in Session-Fahrplan.", istVon.GetName()); halt.GleisIst = leg.GetEBuEfGleis(istVon); if (istVon) { halt.AbfahrtIst = leg.EBuEfZeitpunktVon; } else { halt.AnkunftIst = leg.EBuEfZeitpunktNach; } await context.SaveChangesAsync(queryCancellationToken); logger.LogDebug( "Das Update des Halts wurde gespeichert."); } else { logger.LogDebug( "In Session-Fahrplan wurde {positionType}-Position nicht gefunden.", istVon.GetName()); } } }
private async Task SaveTrainPositionsAsync(TrainLeg leg, CancellationToken queryCancellationToken) { if (leg != null && !queryCancellationToken.IsCancellationRequested) { logger.LogDebug( "Suche in Session-Fahrplan nach: {leg}", leg); await SaveTrainPositionAsync( leg : leg, istVon : true, queryCancellationToken : queryCancellationToken); await SaveTrainPositionAsync( leg : leg, istVon : false, queryCancellationToken : queryCancellationToken); } }
public static int GetEventcode(this TrainLeg leg) { int result; if (leg.IstPrognose) { result = leg.IVULegTyp switch { LegType.Ankunft => RealtimeInfoConstants.EventCodeArrivalPrognosis, _ => RealtimeInfoConstants.EventCodeDeparturePrognosis, }; } else { result = leg.IVULegTyp switch { LegType.Durchfahrt => RealtimeInfoConstants.EventCodePassing, LegType.Ankunft => RealtimeInfoConstants.EventCodeArrival, _ => RealtimeInfoConstants.EventCodeDeparture, }; } return(result); }