/// <summary>Convert ground station data to train station data.</summary>
        /// <param name="inputDataList">List of input data.</param>
        /// <param name="outputDataList">[out] List of output data.</param>
        public static void ConvertGroundStationDataToTrainStationData(List <RealTimeStationStatusType> inputDataList, out Train.RealTime.ListOfStationDataType outputDataList)
        {
            outputDataList = null;
            if (inputDataList != null)
            {
                outputDataList = new Train.RealTime.ListOfStationDataType();
                foreach (var stationData in inputDataList)
                {
                    if (stationData != null)
                    {
                        Train.RealTime.StationDataType stationDataTrain = new Train.RealTime.StationDataType()
                        {
                            StationCode = stationData.StationID
                        };
                        Train.RealTime.StationDataStructureType stationDataStructureTrain = new Train.RealTime.StationDataStructureType();

                        if (stationData.StationDelay == null)
                        {
                            stationDataStructureTrain.StationDelayAction = Train.RealTime.ActionTypeEnum.Delete;
                            stationDataStructureTrain.StationDelay       = null;
                        }
                        else
                        {
                            TimeSpan age = DateTime.Now - stationData.StationDelay.UpdateDate;
                            stationDataStructureTrain.StationDelayAction = Train.RealTime.ActionTypeEnum.Set;
                            stationDataStructureTrain.StationDelay       = new Train.RealTime.DelayType()
                            {
                                Age             = (uint)age.TotalSeconds,
                                DelayValue      = stationData.StationDelay.Delay,
                                DelayReason     = stationData.StationDelay.DelayReason,
                                DelayReasonCode = stationData.StationDelay.DelayReasonCode,
                            };
                        }

                        if (stationData.StationWeather == null)
                        {
                            stationDataStructureTrain.StationWeatherAction = Train.RealTime.ActionTypeEnum.Delete;
                            stationDataStructureTrain.StationWeather       = null;
                        }
                        else
                        {
                            TimeSpan age = DateTime.Now - stationData.StationWeather.UpdateDate;
                            stationDataStructureTrain.StationWeatherAction = Train.RealTime.ActionTypeEnum.Set;
                            stationDataStructureTrain.StationWeather       = new Train.RealTime.WeatherType()
                            {
                                Age = (uint)age.TotalSeconds,
                                WeatherCondition        = stationData.StationWeather.WeatherCondition,
                                WeatherConditionCode    = stationData.StationWeather.WeatherConditionCode,
                                TemperatureInCentigrade = stationData.StationWeather.TemperatureInCentigrade,
                                TemperatureInFahrenheit = stationData.StationWeather.TemperatureInFahrenheit,
                                Humidity = stationData.StationWeather.Humidity
                            };
                        }

                        if (stationData.StationPlatform == null)
                        {
                            stationDataStructureTrain.StationPlatformAction = Train.RealTime.ActionTypeEnum.Delete;
                            stationDataStructureTrain.StationPlatform       = null;
                        }
                        else
                        {
                            TimeSpan age = DateTime.Now - stationData.StationPlatform.UpdateDate;
                            stationDataStructureTrain.StationPlatformAction = Train.RealTime.ActionTypeEnum.Set;
                            stationDataStructureTrain.StationPlatform       = new Train.RealTime.PlatformType()
                            {
                                Age                          = (uint)age.TotalSeconds,
                                Platform                     = stationData.StationPlatform.Platform,
                                Track                        = stationData.StationPlatform.Track,
                                TrackCode                    = stationData.StationPlatform.TrackCode,
                                ExitSide                     = stationData.StationPlatform.ExitSide,
                                ExitSideCode                 = stationData.StationPlatform.ExitSideCode,
                                PlatformIssueDescription     = stationData.StationPlatform.IssueDescription,
                                PlatformIssueDescriptionCode = stationData.StationPlatform.IssueDescriptionCode ?? default(int),
                            };
                        }

                        if (stationData.StationConnectionList == null)
                        {
                            stationDataStructureTrain.StationConnectionListAction = Train.RealTime.ActionTypeEnum.Delete;
                            stationDataStructureTrain.StationConnectionList       = null;
                        }
                        else
                        {
                            stationDataStructureTrain.StationConnectionListAction = Train.RealTime.ActionTypeEnum.Set;
                            stationDataStructureTrain.StationConnectionList       = new Train.RealTime.ListOfConnectionEntryType();
                            foreach (var stationConnectionData in stationData.StationConnectionList)
                            {
                                if (stationConnectionData != null)
                                {
                                    TimeSpan age = DateTime.Now - stationConnectionData.UpdateDate;
                                    Train.RealTime.ConnectionType connectionDataTrain = new Train.RealTime.ConnectionType()
                                    {
                                        Age                = (uint)age.TotalSeconds,
                                        Operator           = stationConnectionData.Operator,
                                        OperatorCode       = stationConnectionData.OperatorCode,
                                        CommercialNumber   = stationConnectionData.CommercialNumber,
                                        ModelType          = stationConnectionData.ModelType,
                                        ModelTypeCode      = stationConnectionData.ModelTypeCode,
                                        Line               = stationConnectionData.Line,
                                        LineCode           = stationConnectionData.LineCode,
                                        DepartureTime      = stationConnectionData.DepartureTime,
                                        NextDepartureTime  = stationConnectionData.NextDepartureTime,
                                        DepartureFrequency = stationConnectionData.DepartureFrequency,
                                        Platform           = stationConnectionData.ConnectionPlatform,
                                        Delay              = stationConnectionData.ConnectionDelay,
                                        DestinationLabel   = stationConnectionData.DestinationName,
                                    };

                                    stationDataStructureTrain.StationConnectionList.Add(connectionDataTrain);
                                }
                            }
                        }

                        stationDataTrain.StationDataStructure = stationDataStructureTrain;
                        outputDataList.Add(stationDataTrain);
                    }
                }
            }
        }
Exemple #2
0
        /// <summary>Process the station data sending.</summary>
        /// <param name="elementId">Identifier for the element.</param>
        /// <param name="stationCodeList">List of station codes.</param>
        private static void ProcessStationDataSending(string elementId, KeyValuePair <string, List <string> > stationCodeList)
        {
            List <RealTimeStationStatusType> stationDataList = _rtpisDataStore.GetStationRealTimeInformation(stationCodeList.Key, stationCodeList.Value);

            if (stationDataList == null)
            {
                stationDataList = new List <RealTimeStationStatusType>();
            }

            if (stationDataList.Count == 0)
            {
                RealTimeRetrieveStationListResult result = new RealTimeRetrieveStationListResult();
                AvailableElementData elementData         = null;

                T2GManagerErrorEnum t2gTmpResult = _t2gManager.GetAvailableElementDataByElementNumber(elementId, out elementData);

                if (t2gTmpResult == T2GManagerErrorEnum.eSuccess)
                {
                    RealTimeService.GetStationListFromLMTDataBase(stationCodeList.Key, elementId, elementData, ref result);

                    if (result.ResultCode == RealTimeServiceErrorEnum.RequestAccepted)
                    {
                        stationDataList.Capacity = result.StationList.Count;
                        foreach (var station in result.StationList)
                        {
                            stationDataList.Add(new RealTimeStationStatusType()
                            {
                                StationID = station
                            });
                        }
                    }
                    else
                    {
                        LogManager.WriteLog(TraceType.ERROR, string.Format(CultureInfo.CurrentCulture, Logs.ERROR_ACCESSING_STATIONLIST_FOR_ELEMENT, elementId, "GetStationListFromLMTDataBase", result.ResultCode), "PIS.Ground.RealTime.RealTimeService.ProcessStationDataSending", null, EventIdEnum.RealTime);
                    }
                }
                else
                {
                    LogManager.WriteLog(TraceType.ERROR, string.Format(CultureInfo.CurrentCulture, Logs.ERROR_ACCESSING_STATIONLIST_FOR_ELEMENT, elementId, "GetAvailableElementDataByElementNumber", t2gTmpResult), "PIS.Ground.RealTime.RealTimeService.ProcessStationDataSending", null, EventIdEnum.RealTime);
                }
            }

            // Updating the train is important only when the data of at least one station need to be updated.
            if (stationDataList.Count != 0)
            {
                ServiceInfo         serviceInfo = null;
                T2GManagerErrorEnum t2gResult   = _t2gManager.GetAvailableServiceData(elementId, (int)eServiceID.eSrvSIF_RealTimeServer, out serviceInfo);

                if (t2gResult == T2GManagerErrorEnum.eSuccess)
                {
                    string endpoint = "http://" + serviceInfo.ServiceIPAddress + ":" + serviceInfo.ServicePortNumber;
                    try
                    {
                        // Call RealTime train service and send the request.
                        using (Train.RealTime.RealTimeTrainServiceClient lTrainClient = new Train.RealTime.RealTimeTrainServiceClient("RealTimeTrainEndpoint", endpoint))
                        {
                            try
                            {
                                Train.RealTime.ListOfStationDataType stationDataListType = null;

                                RealTimeUtils.ConvertGroundStationDataToTrainStationData(
                                    stationDataList,
                                    out stationDataListType);

                                Train.RealTime.SetStationRealTimeRequest  request  = new Train.RealTime.SetStationRealTimeRequest(stationCodeList.Key, stationDataListType);
                                Train.RealTime.SetStationRealTimeResponse response = ((Train.RealTime.IRealTimeTrainService)lTrainClient).SetStationRealTime(request);

                                ProcessCommandResultList(elementId, stationCodeList.Key, response.ResultList);
                            }
                            catch (Exception ex)
                            {
                                LogManager.WriteLog(TraceType.EXCEPTION, string.Format(CultureInfo.CurrentCulture, Logs.ERROR_FAILED_SEND_REQUEST_TO_EMBEDDED, elementId), "PIS.Ground.RealTime.RealTimeService.ProcessStationDataSending", ex, EventIdEnum.RealTime);
                            }
                            finally
                            {
                                if (lTrainClient.State == CommunicationState.Faulted)
                                {
                                    lTrainClient.Abort();
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        LogManager.WriteLog(TraceType.EXCEPTION, string.Format(CultureInfo.CurrentCulture, Logs.ERROR_FAILED_SEND_REQUEST_TO_EMBEDDED, elementId), "PIS.Ground.RealTime.RealTimeService.ProcessStationDataSending", ex, EventIdEnum.RealTime);
                    }
                }
                else if (t2gResult == T2GManagerErrorEnum.eElementNotFound)
                {
                    LogManager.WriteLog(TraceType.WARNING, string.Format(CultureInfo.CurrentCulture, Logs.ERROR_GET_SERVICE_DATA_FOR_ELEMENT, elementId, t2gResult), "PIS.Ground.RealTime.RealTimeService.ProcessStationDataSending", null, EventIdEnum.RealTime);
                }
                else if (LogManager.IsTraceActive(TraceType.DEBUG))
                {
                    LogManager.WriteLog(TraceType.DEBUG, string.Format(CultureInfo.CurrentCulture, Logs.DEBUG_GET_SERVICE_DATA_FOR_ELEMENT, elementId, t2gResult), "PIS.Ground.RealTime.RealTimeService.ProcessStationDataSending", null, EventIdEnum.RealTime);
                }
            }
        }