Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        public static int GetClassifier(this TrainLeg leg)
        {
            var result = leg.IstPrognose
                ? RealtimeInfoConstants.ClassifierPrognosis
                : RealtimeInfoConstants.ClassifierActual;

            return(result);
        }
Ejemplo n.º 3
0
        public static int?GetEBuEfGleis(this TrainLeg leg, bool istVon)
        {
            var result = istVon
                ? leg.EBuEfGleisVon.ToInt()
                : leg.EBuEfGleisNach.ToInt();

            return(result);
        }
Ejemplo n.º 4
0
        public Task AddRealtimeAsync(TrainLeg leg)
        {
            var result = retryPolicy.ExecuteAsync(
                action: (queryCancellationToken) => SaveTrainPositionsAsync(
                    leg: leg,
                    queryCancellationToken: queryCancellationToken),
                cancellationToken: cancellationToken);

            return(result);
        }
Ejemplo n.º 5
0
        public void Add(TrainLeg trainLeg)
        {
            if (trainLeg != default)
            {
                var info = converter.Get(trainLeg);

                if (info != default)
                {
                    infosQueue.Enqueue(info);
                }
            }
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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());
                }
            }
        }
Ejemplo n.º 8
0
        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);
            }
        }
Ejemplo n.º 9
0
        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);
        }