/// <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); } } } }
/// <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); } } }