using FControlFUSIONCF; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Xml; using System.Xml.Serialization; using Wayne.FDCPOSLibrary; using Wayne.FDCPOSLibrary.Configuration; using Wayne.ForecourtControl.OptBridge; using Wayne.Lib; using Wayne.Lib.Log; namespace Wayne.ForecourtControl.Fusion { public class Heartbeat : DisposableBase { private readonly Timer heartbeatTimer; private readonly Timer disconnectionTimer; public event EventHandler OnHeartbeatTimeout; public event EventHandler OnHeartbeatInterval; public long heartbeatTimeout; public long heartbeatInterval; public bool tryingConnect; private IFSFManager ifsfManager; private readonly DebugLogger debugLogger; public Heartbeat(IFSFManager _ifsfManager, long _heartbeatInterval, long _heartbeatTimeout) { ifsfManager = _ifsfManager; heartbeatInterval = _heartbeatInterval; heartbeatTimeout = _heartbeatTimeout; debugLogger = ifsfManager.DebugLogger; disconnectionTimer = new Timer(HeartbeatTimeout, null, Timeout.Infinite, Timeout.Infinite); heartbeatTimer = new Timer(HeartbeatInterval, null, Timeout.Infinite, Timeout.Infinite); } private void HeartbeatTimeout(Object state) { if (IsDisposed) { return; } if (debugLogger.IsActive()) debugLogger.Add("Heartbeat Timeout"); if (OnHeartbeatTimeout != null) OnHeartbeatTimeout.Invoke(this, null); if (heartbeatTimeout > 0) { disconnectionTimer.Change(heartbeatTimeout, Timeout.Infinite); } } private void HeartbeatInterval(Object state) { if (IsDisposed) { return; } if (OnHeartbeatInterval != null) OnHeartbeatInterval.Invoke(this, null); } public void ResetDisconnectionTimeout() { if (IsDisposed) { return; } // read HeartbeatTimeout config parameter string sValue = IniFile.IniReadValue(ConfigurationParams.inifile, "FUSION-Connection", "HeartbeatTimeout"); try { if (sValue.Length > 0) heartbeatTimeout = Convert.ToInt32(sValue); } catch (Exception ex) { if (debugLogger.IsActive()) debugLogger.Add(string.Format("Exception reading heartbeatTimeout: {0}", ex)); } if (heartbeatTimeout > 0) { disconnectionTimer.Change(heartbeatTimeout, Timeout.Infinite); } } public void Restart() { if (IsDisposed) { return; } // start sending heartbeat when receive logon and send if (heartbeatInterval > 0) { heartbeatTimer.Change(heartbeatInterval, Timeout.Infinite); } } public void Stop() { if (IsDisposed) { return; } heartbeatTimer.Change(Timeout.Infinite, Timeout.Infinite); } public void NotifyDisconnection() { if (IsDisposed) { return; } heartbeatTimer.Change(Timeout.Infinite, Timeout.Infinite); tryingConnect = true; disconnectionTimer.Change(Timeout.Infinite, Timeout.Infinite); Restart(); } public void SetReconnected() { if (IsDisposed) { return; } tryingConnect = false; } protected override void DoDispose() { heartbeatTimer.Dispose(); disconnectionTimer.Dispose(); } } #region Event Args public class DeviceStateChangedEventArgs : EventArgs { public string deviceType; public int deviceId; public LogicalDeviceState state; public LogicalDeviceState substate; public string lockingAS; public int nozzleUp; public DeviceStateChangedEventArgs(string _deviceType, int _deviceId, LogicalDeviceState _state, LogicalDeviceState _substate, string _lockingAS, int _nozzleUp) { deviceType = _deviceType; deviceId = _deviceId; state = _state; substate = _substate; lockingAS = _lockingAS; nozzleUp = _nozzleUp; } } public class VIRStateChangedEventArgs : EventArgs { public int deviceId; public string virId; public DeviceConnectionState state; public VIRStateChangedEventArgs(int _deviceId, string _virId, DeviceConnectionState _state) { deviceId = _deviceId; virId = _virId; state = _state; } } public class FuelModeChangedEventArgs : EventArgs { public string deviceType; public int deviceId; public int mode; public FuelModeChangedEventArgs(string _deviceType, int _deviceId, int _mode) { deviceType = _deviceType; deviceId = _deviceId; mode = _mode; } } public class OperationModeChangedEventArgs : EventArgs { public string deviceType; public int deviceId; public ushort mode; public OperationModeChangedEventArgs(string _deviceType, int _deviceId, ushort _mode) { deviceType = _deviceType; deviceId = _deviceId; mode = _mode; } } public class CurrentFuellingStatusEventArgs : EventArgs { public string deviceType; public int deviceId; public int nozzleId; public decimal volume; public decimal amount; public decimal price; public string authAS; /// /// The fuel period id of the current fuelling /// public int FuelPeriodSequenceNo { get; set; } /// /// The AuthorizationId /// public int ReleaseId { get; set; } /// /// The TransactionSeqNo /// public int TransactionId { get; set; } /// /// The Reserving Device Id /// public int ReservingDeviceId { get; set; } public CurrentFuellingStatusEventArgs(string _deviceType, int _deviceId, int _nozzleId, decimal _volume, decimal _amount, decimal _price, string _authAS) { deviceType = _deviceType; deviceId = _deviceId; nozzleId = _nozzleId; volume = _volume; amount = _amount; price = _price; authAS = _authAS; } } public class FuelPointTotalsEventArgs : EventArgs { public int requestId; public bool overallResult; public string deviceType; public int deviceId; public int nozzleId; public decimal volume; public decimal amount; public decimal price; public string originalTransactionData; public FuelPointTotalsEventArgs(int _requestId, bool _overallResult, string _deviceType, int _deviceId, int _nozzleId, decimal _volume, decimal _amount, decimal _price, string _originalTransactionData) { requestId = _requestId; overallResult = _overallResult; deviceType = _deviceType; deviceId = _deviceId; nozzleId = _nozzleId; volume = _volume; amount = _amount; price = _price; originalTransactionData = _originalTransactionData; } } public class FuelSaleTrxEventArgs : EventArgs { public int transactionId; public int fuellingSeqNo; public Wayne.FDCPOSLibrary.FuellingState transactionStatus; public int completionReason; public string deviceType; public int deviceId; public int nozzleId; public decimal volume; public decimal amount; public decimal price; public int fuelMode; public DateTime trxStartDateTime; public DateTime trxEndDateTime; public string lockingAS; public string authAS; public string DSPFields; public string CRCMode; public string MIDLinesNarrow; public string MIDLinesWide; public int releaseToken; public byte reservingDeviceId; public FuellingType fuellingType; public string origMessageXml; /// /// The fuel period id for the transaction /// public int FuelPeriodSequenceNo { get; set; } public FuelSaleTrxEventArgs(int _transactionId, int _fuellingSeqNo, Wayne.FDCPOSLibrary.FuellingState _transactionStatus, int _completionReason, string _deviceType, int _deviceId, int _nozzleId, decimal _volume, decimal _amount, decimal _price, int _fuelMode, DateTime _trxStartDateTime, DateTime _trxEndDateTime, string _lockingAS, string _authAS, string _DSPFields, string _CRCMode, string _MIDLinesNarrow, string _MIDLinesWide, int _releaseToken, byte _reservingDeviceId, FuellingType _fuellingType, string _originalMessageXml = null) { transactionId = _transactionId; fuellingSeqNo = _fuellingSeqNo; transactionStatus = _transactionStatus; completionReason = _completionReason; deviceType = _deviceType; deviceId = _deviceId; nozzleId = _nozzleId; volume = _volume; amount = _amount; price = _price; fuelMode = _fuelMode; trxStartDateTime = _trxStartDateTime; trxEndDateTime = _trxEndDateTime; lockingAS = _lockingAS; authAS = _authAS; DSPFields = _DSPFields; CRCMode = _CRCMode; MIDLinesNarrow = _MIDLinesNarrow; MIDLinesWide = _MIDLinesWide; releaseToken = _releaseToken; reservingDeviceId = _reservingDeviceId; fuellingType = _fuellingType; origMessageXml = _originalMessageXml; } } public class ChangeFuelPriceEventArgs : EventArgs { public int productId; public int mode; public decimal oldPrice; public decimal newPrice; public ChangeFuelPriceEventArgs(int _productId, int _mode, decimal _oldPrice, decimal _newPrice) { productId = _productId; mode = _mode; oldPrice = _oldPrice; newPrice = _newPrice; } } public class DeviceAlarmEventArgs : EventArgs { public string deviceType; public int deviceId; public int alarmId; public string alarmDescr; public DeviceAlarmEventArgs(string _deviceType, int _deviceId, int _alarmId, string _alarmDescr) { deviceType = _deviceType; deviceId = _deviceId; alarmId = _alarmId; alarmDescr = _alarmDescr; } } public class VersionInfoEventArgs : EventArgs { public string release; public string version; public string hotfix; public VersionInfoEventArgs(string _release, string _version, string _hotfix) { version = _version; release = _release; hotfix = _hotfix; } } public class TankDataEventArgs : EventArgs { int DeviceID; int TankNo; string Type; int ManualMode; decimal AverageTemp; decimal GrossStandardVolume; decimal ObservedDensity; decimal ProductLevel; decimal TotalObservedVolume; decimal WaterLevel; int TPStatus; public TankDataEventArgs(int _DeviceID, int _TankNo, string _Type, int _ManualMode, decimal _AverageTemp, decimal _GrossStandardVolume, decimal _ObservedDensity, decimal _ProductLevel, decimal _TotalObservedVolume, decimal _WaterLevel, int _TPStatus) { DeviceID = _DeviceID; TankNo = _TankNo; Type = _Type; ManualMode = _ManualMode; AverageTemp = _AverageTemp; GrossStandardVolume = _GrossStandardVolume; ObservedDensity = _ObservedDensity; ProductLevel = _ProductLevel; TotalObservedVolume = _TotalObservedVolume; WaterLevel = _WaterLevel; TPStatus = _TPStatus; } } public class OptReadEventArgs : EventArgs { public string deviceType; public int deviceId; public byte[] message; public OptReadEventArgs(string _deviceType, int _deviceId, byte[] _message) { deviceType = _deviceType; deviceId = _deviceId; message = _message; } } #endregion public class IFSFManager : DisposableBase { public ServiceRequest serviceRequestLogOn; private IFSFSockets _clientSocket; public IFSFSockets clientSocket { get { return _clientSocket; } } private Heartbeat _heartbeat; public Heartbeat heartbeat { get { return _heartbeat; } } private FUSIONManager manager; public bool authentificationErrorRetry; public event EventHandler OnDeviceStateChange; public event EventHandler OnVirStateChange; public event EventHandler OnFuelModeChange; public event EventHandler OnOperationModeChange; public event EventHandler OnCurrentFuellingStatus; public event EventHandler OnFuelPointTotals; public event EventHandler OnFuelSaleTrx; public event EventHandler OnDeviceAlarm; public event EventHandler OnVersionInfo; public event EventHandler OnChangeFuelPrice; public event EventHandler OnLockFuelSaleTrx; public event EventHandler OnUnlockFuelSaleTrx; public event EventHandler OnClearFuelSaleTrx; public event EventHandler OnGetAvailableFuelSaleTrx; public event EventHandler OnGetFuelSaleTrxDetails; public event EventHandler OnOptRead; public event EventHandler OnTankData; public event EventHandler OnConfigurationChange; public event EventHandler OnTwinMasterReady; private readonly Dictionary unsolicitedFPStateChangeDictionary = new Dictionary(); private readonly DebugLogger debugLogger; public DebugLogger DebugLogger { get { return debugLogger; } } public IFSFManager(FUSIONManager manager, int id) { debugLogger = manager.DebugLogger; this._clientSocket = new IFSFSockets(id, this); this._clientSocket.OnResponseTimeout += new EventHandler(_clientSocket_OnResponseTimeout); this.manager = manager; this._heartbeat = new Heartbeat(this, this._clientSocket.heartbeatInterval, this._clientSocket.heartbeatTimeout); heartbeat.OnHeartbeatInterval += new EventHandler(heartbeat_OnHeartbeatInterval); heartbeat.OnHeartbeatTimeout += new EventHandler(heartbeat_OnHeartbeatTimeout); authentificationErrorRetry = true; } private void DebugLog(string s) { if (debugLogger.IsActive()) debugLogger.Add(s); } public static void ArrayResize(ref T[] array, int newSize) { int oldSize = (array == null) ? 0 : array.Length; T[] newArray = new T[newSize]; int preserveLength = System.Math.Min(oldSize, newSize); for (int i = 0; i < preserveLength; i++) newArray[i] = array[i]; array = newArray; } public LogicalDeviceState convertLogicalDeviceState(string state) { if (state == LogicalDeviceState.FDC_CALLING.ToString()) return LogicalDeviceState.FDC_CALLING; else if (state == LogicalDeviceState.FDC_CONFIGURE.ToString()) return LogicalDeviceState.FDC_CONFIGURE; else if (state == LogicalDeviceState.FDC_DISABLED.ToString()) return LogicalDeviceState.FDC_DISABLED; else if (state == LogicalDeviceState.FDC_ERRORSTATE.ToString()) return LogicalDeviceState.FDC_ERRORSTATE; else if (state == LogicalDeviceState.FDC_FUELLING.ToString()) return LogicalDeviceState.FDC_FUELLING; else if (state == LogicalDeviceState.FDC_INVALIDSTATE.ToString()) return LogicalDeviceState.FDC_INVALIDSTATE; else if (state == LogicalDeviceState.FDC_LOCKED.ToString()) return LogicalDeviceState.FDC_LOCKED; else if (state == LogicalDeviceState.FDC_OFFLINE.ToString()) return LogicalDeviceState.FDC_OFFLINE; else if (state == LogicalDeviceState.FDC_OUTOFORDER.ToString()) return LogicalDeviceState.FDC_OUTOFORDER; else if (state == LogicalDeviceState.FDC_READY.ToString()) return LogicalDeviceState.FDC_READY; else if (state == LogicalDeviceState.FDC_REQUESTED.ToString()) return LogicalDeviceState.FDC_REQUESTED; else if (state == LogicalDeviceState.FDC_STARTED.ToString()) return LogicalDeviceState.FDC_STARTED; else if (state == LogicalDeviceState.FDC_SUSPENDED.ToString()) return LogicalDeviceState.FDC_SUSPENDED; else if (state == LogicalDeviceState.FDC_TEST.ToString()) return LogicalDeviceState.FDC_TEST; else if (state == LogicalDeviceState.FDC_SUSPENDED_STARTED.ToString()) return LogicalDeviceState.FDC_SUSPENDED_STARTED; else if (state == LogicalDeviceState.FDC_SUSPENDED_FUELLING.ToString()) return LogicalDeviceState.FDC_SUSPENDED_FUELLING; else if (state == LogicalDeviceState.FDC_CLOSED.ToString()) return LogicalDeviceState.FDC_CLOSED; else if (state == LogicalDeviceState.FDC_AUTHORISED.ToString()) return LogicalDeviceState.FDC_AUTHORISED; else if (state == LogicalDeviceState.FDC_FUELLING_TERMINATED.ToString()) return LogicalDeviceState.FDC_FUELLING_TERMINATED; return 0; } private Wayne.FDCPOSLibrary.FuellingState convertFuellingState(string state) { if (state == Wayne.FDCPOSLibrary.FuellingState.Locked.ToString()) return Wayne.FDCPOSLibrary.FuellingState.Locked; else if (state == Wayne.FDCPOSLibrary.FuellingState.Payable.ToString()) return Wayne.FDCPOSLibrary.FuellingState.Payable; else if (state == Wayne.FDCPOSLibrary.FuellingState.Paid.ToString() || state == Wayne.FDCPOSLibrary.FuellingState.Cleared.ToString()) return Wayne.FDCPOSLibrary.FuellingState.Paid; return 0; } private int convertCompletionReason(string reason) { // Fusion 4.4 if (reason == Wayne.FDCPOSLibrary.CompletionReason.NormalCompletion.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.NormalCompletion; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.AuthorizationTimeout.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.AuthorizationTimeout; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.FuellingTimeout.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.FuellingTimeout; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.NoFlowTimeout.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.NoFlowTimeout; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PumpDisconnected.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PumpDisconnected; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PumpStopped.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PumpStopped; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PumpGenericError.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PumpGenericError; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PumpPulserError.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PumpPulserError; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PumpLowLevelError.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PumpLowLevelError; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PumpDisplayError.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PumpDisplayError; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PumpCalculationError.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PumpCalculationError; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PumpAntiSpillError.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PumpAntiSpillError; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PumpBlenderError.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PumpBlenderError; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PumpVaporRecoveryError.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PumpVaporRecoveryError; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.ZeroFilling.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.ZeroFilling; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.PresetOverrun.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.PresetOverrun; else if (reason == Wayne.FDCPOSLibrary.CompletionReason.ReadFromTotalizers.ToString()) return (int)Wayne.FDCPOSLibrary.CompletionReason.ReadFromTotalizers; // Fusion 4.3 return Convert.ToInt32(reason); } public static string getClientID(string workstationID, string applicationSender) { return workstationID + "-" + applicationSender; } public void Disconnect() { clientSocket.Disconnect(); clientSocket.mainConnectionState = DeviceConnectionState.Disconnected; if (heartbeat != null) heartbeat.NotifyDisconnection(); } private void _clientSocket_OnResponseTimeout(object sender, EventArgs e) { } private void heartbeat_OnHeartbeatTimeout(object sender, EventArgs e) { DebugLog("Heartbeat Timeout - disconnecting"); Disconnect(); clientSocket.mainConnectionState = DeviceConnectionState.Disconnected; } private void heartbeat_OnHeartbeatInterval(object sender, EventArgs e) { Heartbeat(); } public string ReadResponse(string myString, int msglength, ref OverallResult result) //StreamReader networkStream) { string requestType = ""; int requestId = 0; try { requestType = GetRequestType("RequestType", myString); requestId = GetRequestID("RequestID", myString); } catch (Exception ex) { DebugLog(string.Format("Unable to get request type or id - Exception! {0}", ex)); //result = OverallResult.Failure; } if (result != OverallResult.Success) { DebugLog(string.Format("ReadResponse ERROR result='{0}'", result)); } else { if (requestType == "") { DebugLog(string.Format("ReadResponse INVALID requestType='{0}', requestId={1}", requestType, requestId)); result = OverallResult.FormatError; } int UTFlength = System.Text.Encoding.UTF8.GetBytes(myString).Length; if (result == OverallResult.Success && UTFlength != msglength) { DebugLog(string.Format("ReadResponse header='{0}' != msgLength={1}, requestType='{2}', requestId={3}", msglength, UTFlength, requestType, requestId)); result = OverallResult.FormatError; } else { try { DebugLog(string.Format("ReadResponse init: requestType='{0}', requestId={1}", requestType, requestId)); if (requestType == "LogOn") { ServiceResponseLogOn sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); LogOnResp(sr.RequestIDNumber, sr.OverallResult, sr.Value, sr.FDCdata[0].FDCTimeStamp); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "LogOff") { ServiceResponseLogOff sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); LogOffResp(sr.RequestIDNumber, sr.OverallResult); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "VersionInfo") { ServiceResponseVersionInfo sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); VersionInfoResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "StartForecourt") { ServiceResponseStartForecourt sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); string errorCode = (sr.FDCdata[0].FDCStatus != null) ? sr.FDCdata[0].FDCStatus : sr.FDCdata[0].ErrorCode; StartForecourtResp(sr.RequestIDNumber, sr.OverallResult, errorCode); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "TwinOpenMaster") { ServiceResponseTwinOpenMaster sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); string errorCode = (sr.FDCdata[0].FDCStatus != null) ? sr.FDCdata[0].FDCStatus : sr.FDCdata[0].ErrorCode; TwinOpenMasterResp(sr.RequestIDNumber, sr.OverallResult, errorCode); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "StopForecourt") { ServiceResponseStopForecourt sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); string errorCode = (sr.FDCdata[0].FDCStatus != null) ? sr.FDCdata[0].FDCStatus : sr.FDCdata[0].ErrorCode; StopForecourtResp(sr.RequestIDNumber, sr.OverallResult, errorCode); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetCurrentFuellingStatus") { ServiceResponseGetCurrentFuellingStatus sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetCurrentFuellingStatusResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetTotals") { ServiceResponseGetFuelPointTotals sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetFuelPointTotalsResp(sr.RequestIDNumber, sr.OverallResult, sr, myString); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetDeviceState") { ServiceResponseGetDeviceState sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetDeviceStateResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetFPState") { ServiceResponseGetFPState sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetFPStateResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetTPState") { ServiceResponseGetTPState sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetTPStateResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetPPState") { ServiceResponseGetPPState sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetPPStateResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetVIRState") { ServiceResponseGetVIRState sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetVIRStateResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "TerminateFuelling") { ServiceResponseTerminateFuelling sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); TerminateFuellingResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "AuthoriseFuelPoint") { ServiceResponseAuthoriseFuelPoint sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); AuthoriseFuelPointResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "ChangeFuelMode") { ServiceResponseChangeFuelMode sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); ChangeFuelModeResp(sr.RequestIDNumber, sr.OverallResult, sr.FDCdata); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "ChangeFPFuelMode") { ServiceResponseChangeFPFuelMode sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); ChangeFuelModeResp(sr.RequestIDNumber, sr.OverallResult, sr.FDCdata); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "ChangeFuelPrice") { ServiceResponseChangeFuelPrice sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); ChangeFuelPriceResp(sr.RequestIDNumber, sr.OverallResult, sr.FDCdata); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "LockFuelSaleTrx") { ServiceResponseLockFuelSaleTrx sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); LockFuelSaleTrxResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "UnlockFuelSaleTrx") { ServiceResponseUnlockFuelSaleTrx sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); UnlockFuelSaleTrxResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "ClearFuelSaleTrx") { ServiceResponseClearFuelSaleTrx sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); ClearFuelSaleTrxResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetAvailableFuelSaleTrxs") { ServiceResponseGetAvailableFuelSaleTrxs sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetAvailableFuelSaleTrxsResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetFuelSaleTrxDetails") { string res = ""; if (FDCGlobal.ProtocolVersion == FDCVersion.V0003) { ServiceResponseGetFuelSaleTrxDetailsV03 sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetFuelSaleTrxDetailsResp(sr.RequestIDNumber, sr.OverallResult, sr); res = sr.OverallResult; } else { ServiceResponseGetFuelSaleTrxDetails sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetFuelSaleTrxDetailsResp(sr.RequestIDNumber, sr.OverallResult, sr); res = sr.OverallResult; } result = FDCConvert.OverallResultToInt(res); } else if (requestType == "GetProductTable") { ServiceResponseGetProductTable sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetProductTableResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetModeTable") { ServiceResponseGetModeTable sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetModeTableResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetFuelMode") { ServiceResponseGetFuelMode sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetFuelModeResp(sr.RequestIDNumber, sr.OverallResult, sr.FDCdata); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetFPFuelMode") { ServiceResponseGetFPFuelMode sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetFuelModeResp(sr.RequestIDNumber, sr.OverallResult, sr.FDCdata); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetConfiguration") { ServiceResponseGetConfiguration sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetConfigurationResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetDSPConfiguration") { ServiceResponseGetDSPConfiguration sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetDSPConfigurationResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetTLGConfiguration") { ServiceResponseGetTLGConfiguration sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetTLGConfigurationResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetPPConfiguration") { ServiceResponseGetPPConfiguration sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "SetConfiguration") { ServiceResponseSetConfiguration sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); SetConfigurationResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "LockNozzle") { ServiceResponseLockNozzle sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); LockNozzleResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "UnlockNozzle") { ServiceResponseUnlockNozzle sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); UnlockNozzleResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetCountrySettings") { ServiceResponseGetCountrySettings sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetCountrySettingsResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetDSPLimits") { ServiceResponseGetDSPLimits sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetDSPLimitsResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "ChangeDSPLimits") { ServiceResponseChangeDSPLimits sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); ChangeDSPLimitsResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "SuspendFuelling") { ServiceResponseSuspendFuelling sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); SuspendFuellingResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "ResumeFuelling") { ServiceResponseResumeFuelling sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); ResumeFuellingResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "LockTank") { ServiceResponseLockTank sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); LockTankResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "UnlockTank") { ServiceResponseUnlockTank sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); UnlockTankResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetTankData") { ServiceResponseGetTankData sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetTankDataResp(sr.RequestIDNumber, sr.OverallResult, sr, myString); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetTankReconciliation") { ServiceResponseGetTankReconciliation sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetTankReconciliationResp(sr.RequestIDNumber, sr.OverallResult, sr, myString); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetTankDelivery") { ServiceResponseGetTankDelivery sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetTankDeliveryResp(sr.RequestIDNumber, sr.OverallResult, sr, myString); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "ReserveFuelPoint") { ServiceResponseReserveFuelPoint sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); ReserveFuelPointResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "FreeFuelPoint") { ServiceResponseFreeFuelPoint sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); FreeFuelPointResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "StartFuelPointTest") { ServiceResponseStartFuelPointTest sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); StartFuelPointTestResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "EndFuelPointTest") { ServiceResponseEndFuelPointTest sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); EndFuelPointTestResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "OpenFuelPoint") { ServiceResponseOpenFuelPoint sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); OpenFuelPointResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "CloseFuelPoint") { ServiceResponseCloseFuelPoint sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); CloseFuelPointResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "OpenDevice") { ServiceResponseOpenDevice sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); OpenDeviceResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "CloseDevice") { ServiceResponseCloseDevice sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); CloseDeviceResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "SetDeviceAlarm") { ServiceResponseSetDeviceAlarm sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); SetDeviceAlarmResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "OPTAdd") { ServiceResponseOPTAdd sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); OptAddResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "OPTRemove") { ServiceResponseOPTRemove sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); OptRemoveResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "OPTWrite") { ServiceResponseOPTWrite sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); OptWriteResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "ConfigStart") { ServiceResponseConfigStart sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().ConfigStartResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "DefProducts") { ServiceResponseDefProducts sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().DefProductsResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "DefGrades") { ServiceResponseDefGrades sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().DefGradesResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "DefTanks") { ServiceResponseDefTanks sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().DefTanksResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "DefTankSuctions") { ServiceResponseDefTankSuctions sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().DefTankSuctionsResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "DefFPFuelModes") { ServiceResponseDefFuelMode sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().DefFuelModeResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "DefFCFuelMode") { ServiceResponseDefFuellingMode sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().DefFuellingModeResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "DefFuelPoints") { ServiceResponseDefFuelPoints sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().DefFuelPointsResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "DefPricePoles") { ServiceResponseDefPricePole sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().DefPricePoleResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "DefTankMonitors") { ServiceResponseDefTankMonitor sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().DefTankMonitorResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "DefFPOperationModes") { ServiceResponseDefFPOperationModes sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().DefFPOperationModesResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "ConfigEnd") { ServiceResponseConfigEnd sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); if (FUSIONConfigFactory.getConfigurator() != null) FUSIONConfigFactory.getConfigurator().ConfigEndResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "GetFuelPrice") { ServiceResponseGetFuelPrices sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); GetFuelPricesResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "CloseReconciliationPeriod") { ServiceResponseCloseReconciliationPeriod sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); CloseReconciliationPeriodResp(sr.RequestIDNumber, sr.OverallResult, sr.FDCdata); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "StopFuelPoint") { ServiceResponseStopFuelPoint sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); StopFuelPointResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else if (requestType == "StartFuelPoint") { ServiceResponseStartFuelPoint sr = clientSocket.ifsfMessages.Deserialize(myString, ref result); StartFuelPointResp(sr.RequestIDNumber, sr.OverallResult, sr); result = FDCConvert.OverallResultToInt(sr.OverallResult); } else { } DebugLog(string.Format("ReadResponse end: requestType={0}, requestId={1}", requestType, requestId)); } catch (Exception ex) { DebugLog(string.Format("ReadResponse RequestType='{0}', requestId={1} Exception! {2}", requestType, requestId, ex)); result = OverallResult.Failure; } } } if (result != OverallResult.Success) { if (result != OverallResult.NoData) { string deviceType = ""; int deviceId = 0; int alarmId = 0; string alarmmsg = string.Format("Error '{0}' receiving Response for requestId:'{1}', requestType:'{2}'", result.ToString(), requestId, requestType); OnDeviceAlarm(this, new DeviceAlarmEventArgs(deviceType, deviceId, alarmId, alarmmsg)); } } return requestType; } public string ReadMessage(string myString, int msglength, ref OverallResult result) { if (result != OverallResult.Success) { DebugLog(string.Format("ReadMessage ERROR result='{0}'", result)); } string requestType = GetRequestType("MessageType", myString); int requestId = GetRequestID("MessageID", myString); DebugLog(string.Format("ReadMessage init: MessageType='{0}', requestId={1}", requestType, requestId)); if (requestType == "") { DebugLog(string.Format("ReadMessage INVALID requestType='{0}', requestId={1}", requestType, requestId)); return requestType; } int UTFlength = System.Text.Encoding.UTF8.GetBytes(myString).Length; if (UTFlength != msglength) { DebugLog(string.Format("ReadMessage header='{0}' != msgLength={1}", msglength, UTFlength)); result = OverallResult.FormatError; return requestType; } try { switch (requestType) { case "FDCHeartBeat": { HeartbeatMsg(); } break; case "FDCReady": case "FDC_Ready": { HeartbeatMsg(); } break; case "FDCStarted": { FDCMessageStarted msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); FDCStartedMsg(msg); } break; case "TwinMasterIsOn": { FDCMessageTwinMasterIsOn msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); TwinMasterReadyMsg(msg); } break; case "FDCStopped": { FDCMessageStopped msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); FDCStoppedMsg(msg); } break; case "DeviceStateChange": { FDCMessageDeviceStateChange msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); DeviceStateChangeMsg(msg); } break; case "FPStateChange": { FDCMessageFPStateChange msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); FPStateChangeMsg(msg); } break; case "TPStateChange": { FDCMessageTPStateChange msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); TPStateChangeMsg(msg); } break; case "VIRStateChange": { FDCMessageVIRStateChange msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); VIRStateChangeMsg(msg); } break; case "FuelPointCurrentFuellingStatus": { FDCMessageCurrentFuellingStatus msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); CurrentFuellingStatusMsg(msg); } break; case "DeviceAlarm": { FDCMessageDeviceAlarm msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); DeviceAlarmMsg(msg); } break; case "FuelSaleTrx": { FDCMessageFuelSaleTrx msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); FuelSaleTrxMsg(msg, myString); } break; case "FuelPriceChange": { FDCMessageFuelPriceChange msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); FuelPriceChangeMsg(msg); } break; case "FuelModeChange": { FDCMessageFuelModeChange msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); FuelModeChangeMsg(msg.FDCdata[0]); } break; case "FPModeChange": { FDCMessageFPModeChange msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); FuelModeChangeMsg(msg.FDCdata[0]); } break; case "FDCExceptionMsg": { FDCMessageFDCExceptionMsg msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); FDCExceptionMsg(msg); } break; case "ConfigurationChange": { FDCMessageConfigurationChange msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); FDCMessageConfigurationChangeMsg(msg); } break; case "OPTRead": if (FDCGlobal.ProtocolVersion <= FDCVersion.V0007) { FDCMessageOPTReadV07 msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); OptReadMsg(msg); } else { FDCMessageOPTRead msg = clientSocket.ifsfMessages.Deserialize(myString, ref result); OptReadMsg(msg); } break; } DebugLog("ReadMessage end"); } catch (Exception ex) { DebugLog(string.Format("ReadMessage MessageType='{0}', requestId={1} Exception! {2}", requestType, requestId, ex)); } return requestType; } private string GetRequestType(string typeField, string myString) { string requestType = ""; try { int pos; if ((pos = myString.IndexOf(typeField)) >= 0) { int si = myString.IndexOf('\"', pos) + 1; int ei = myString.IndexOf('\"', si); requestType = myString.Substring(si, ei - si); } } catch (Exception ex) { DebugLog("Exception! " + ex); } return requestType; } private int GetRequestID(string typeField, string myString) { int requestID = 0; try { int pos; if ((pos = myString.IndexOf(typeField)) >= 0) { int si = myString.IndexOf('\"', pos) + 1; int ei = myString.IndexOf('\"', si); requestID = Convert.ToInt32(myString.Substring(si, ei - si)); } } catch (Exception ex) { DebugLog("Exception! " + ex); } return requestID; } public void LogOn(string posInfo, string sFDCDateTime) { // POS open channel A and send LogOn command // FDC open channel B and C and send LogOn response LogOn(null, posInfo, sFDCDateTime); } public void LogOn(byte[][] validationInfoArray, string posInfo, string sFDCDateTime) { // POS open channel A and send LogOn command // FDC open channel B and C and send LogOn response try { DebugLog(string.Format("LogOn init, version={0}", FDCGlobal.ProtocolVersion)); ServiceRequest logOn; if (FDCGlobal.ProtocolVersion <= FDCVersion.V0007) { // create XML ServiceRequest object logOn = new ServiceRequestLogOnV07(); logOn.ApplicationSender = clientSocket.applicationSender; logOn.WorkstationID = clientSocket.workstationID; ServiceRequestPOSdataLogOnV07 posDataElem = new ServiceRequestPOSdataLogOnV07(); posDataElem.POSName = ""; if (sFDCDateTime == "") posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); else posDataElem.POSTimeStamp = sFDCDateTime; posDataElem.ResponsePort = clientSocket.iIPPortB.ToString(); posDataElem.UnsolicitedPort = clientSocket.iIPPortC.ToString(); posDataElem.interfaceVersion = FDCGlobal.VersionToString(); posDataElem.InterfaceVersion = FDCGlobal.VersionToString(); if (posInfo != "") { posDataElem.posInfo = UTF8Encoding.UTF8.GetBytes(posInfo); } if (validationInfoArray != null) posDataElem.ValidationInfo = validationInfoArray; ServiceRequestPOSdataLogOnV07[] posDataArray = { posDataElem }; ((ServiceRequestLogOnV07)logOn).POSdata = posDataArray; } else { // create XML ServiceRequest object logOn = new ServiceRequestLogOn(); logOn.ApplicationSender = clientSocket.applicationSender; logOn.WorkstationID = clientSocket.workstationID; ServiceRequestPOSdataLogOn posDataElem = new ServiceRequestPOSdataLogOn(); posDataElem.POSName = ""; if (sFDCDateTime == "") posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); else posDataElem.POSTimeStamp = sFDCDateTime; posDataElem.ResponsePort = clientSocket.iIPPortB.ToString(); posDataElem.UnsolicitedPort = clientSocket.iIPPortC.ToString(); posDataElem.InterfaceVersion = FDCGlobal.VersionToString(); if (posInfo != "") { // Get UTF16 bytes and convert UTF16 bytes to UTF8 bytes DebugLog(string.Format("EnqueueMessage logOn posInfo='{0}'", posInfo)); posDataElem.posInfo = posInfo; } if (validationInfoArray != null) { posDataElem.ValidationInfo = validationInfoArray; } // calculate posValidation string string posValidationSourceString = logOn.ApplicationSender + logOn.WorkstationID + posDataElem.POSTimeStamp; MD5Crypter crypter = new MD5Crypter(); byte[] posValidationSource = new byte[posValidationSourceString.Length + crypter.getPassphrase().GetLength(0)]; Array.Copy(System.Text.Encoding.ASCII.GetBytes(posValidationSourceString), posValidationSource, (int)posValidationSourceString.Length); Array.Copy(crypter.getPassphrase(), 0, posValidationSource, (int)posValidationSourceString.Length, (int)crypter.getPassphrase().Length); byte[] posValidation = crypter.ComputeHash(posValidationSource); posDataElem.posValidation = ""; StringBuilder sb = new StringBuilder(posValidation.Length * 2); foreach (byte b in posValidation) sb.Append(Convert.ToString(b, 16).PadLeft(2, '0')); posDataElem.posValidation = sb.ToString().ToUpper(); DebugLog(string.Format("EnqueueMessage logOn posValidationSource='{0}', posValidation='{1}'", System.Text.Encoding.ASCII.GetString(posValidationSource, 0, posValidationSource.Length), posDataElem.posValidation)); ServiceRequestPOSdataLogOn[] posDataArray = { posDataElem }; ((ServiceRequestLogOn)logOn).POSdata = posDataArray; } DebugLog("EnqueueMessage logOn"); clientSocket.ifsfMessages.EnqueueMessage(logOn, (EventHandler)null, null, null, true, 30000); DebugLog("LogOn2 end"); } catch (Exception ex) { DebugLog("LogOn Exception! " + ex); } } public void LogOnAddValidationInfo(byte[] validationInfo) { // POS open channel A and send LogOn command // FDC open channel B and C and send LogOn response try { if (validationInfo == null) { DebugLog("LogOnAddValidationInfo: null validationInfo"); return; } DebugLog("LogOnAddValidationInfo init"); if (this._clientSocket.logOnSendCalled && this._clientSocket.validationInfo != null) { this._clientSocket.validationInfo = null; this._clientSocket.logOnSendCalled = false; DebugLog("LogOnAddValidationInfo logOnSendCalled=false"); } byte[][] ValidationInfo = this._clientSocket.validationInfo; IFSFManager.ArrayResize(ref ValidationInfo, (ValidationInfo != null) ? ValidationInfo.Length + 1 : 1); this._clientSocket.validationInfo = ValidationInfo; this._clientSocket.validationInfo[this._clientSocket.validationInfo.Length - 1] = new byte[validationInfo.Length]; this._clientSocket.validationInfo[this._clientSocket.validationInfo.Length - 1] = validationInfo; DebugLog("LogOnAddValidationInfo end"); } catch (Exception ex) { DebugLog("LogOnAddValidationInfo Exception! " + ex); } } public void LogOnSend(string posInfo) { // POS open channel A and send LogOn command // FDC open channel B and C and send LogOn response try { DebugLog("LogOnSend init"); // create XML ServiceRequest object if (serviceRequestLogOn == null) { LogOn(posInfo, ""); } else { DebugLog("EnqueueMessage logOn"); var logOn = serviceRequestLogOn; serviceRequestLogOn = null; clientSocket.ifsfMessages.EnqueueMessage(logOn, null, null, null, true, 30000); } this._clientSocket.logOnSendCalled = true; DebugLog("LogOnSend end"); } catch (Exception ex) { DebugLog("LogOnSend Exception! " + ex); } } private void LogOnResp(int requestId, string sOverallResult, string seal, string sFDCTimeStamp) { try { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == FDCPOSLibrary.OverallResult.Success.ToString()); if (sOverallResult == OverallResult.Success.ToString()) { // must be called after LogOn successful because the server must register the client before receiving messages DebugLog(string.Format("Restarting HeartBeat next in {0}", heartbeat.heartbeatInterval)); heartbeat.SetReconnected(); heartbeat.Restart(); GetCountrySettings(null, null, null); // check if != Connected becose FDCStart (that set state to Connected) could became before LogOnResp if (clientSocket.mainConnectionState != DeviceConnectionState.Connected) clientSocket.mainConnectionState = DeviceConnectionState.Connecting; if (seal != "" && OnDeviceAlarm != null) { string deviceType = ""; int deviceId = 0; int alarmId = 2020; // FUSION_IMSG_SEAL string alarmmsg = seal; OnDeviceAlarm(this, new DeviceAlarmEventArgs(deviceType, deviceId, alarmId, alarmmsg)); } } else if (sOverallResult == OverallResult.AuthentificationError.ToString()) { DebugLog(string.Format("authentificationErrorRetry={0}, sFDCTimeStamp={1}", authentificationErrorRetry, sFDCTimeStamp)); if (authentificationErrorRetry) { authentificationErrorRetry = false; this.LogOn(clientSocket.validationInfo, clientSocket.posInfo, sFDCTimeStamp); } else if (OnDeviceAlarm != null) { authentificationErrorRetry = true; string deviceType = ""; int deviceId = 0; int alarmId = 1001; //FUSION_E_AUTHENTIFICATION_FAILED string alarmmsg = ""; OnDeviceAlarm(this, new DeviceAlarmEventArgs(deviceType, deviceId, alarmId, alarmmsg)); } } } catch (Exception ex) { DebugLog("LogOnResp Exception! " + ex); } } public void LogOff() { // POS send LogOff command and close channel A // FDC send LogOff response and close channel B and C try { DebugLog("LogOff init"); // create XML ServiceRequest object ServiceRequestLogOff logOff = new ServiceRequestLogOff(); logOff.ApplicationSender = clientSocket.applicationSender; logOff.WorkstationID = clientSocket.workstationID; ServiceRequestPOSdataLogOff posDataElem = new ServiceRequestPOSdataLogOff(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataLogOff[] posDataArray = { posDataElem }; logOff.POSdata = posDataArray; DebugLog("EnqueueMessage logOff"); clientSocket.ifsfMessages.EnqueueMessage(logOff, null, null, null, true, 30000); DebugLog("LogOff end"); } catch (Exception ex) { DebugLog("LogOff Exception! " + ex); } } private void LogOffResp(int requestId, string sOverallResult) { try { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString()); if (sOverallResult == OverallResult.Success.ToString()) { if (clientSocket.mainConnectionState != DeviceConnectionState.Connected || clientSocket.mainConnectionState != DeviceConnectionState.Connecting) clientSocket.mainConnectionState = DeviceConnectionState.Disconnecting; } } catch (Exception ex) { DebugLog("LogOffResp Exception! " + ex); } } private void Heartbeat() { try { if (!heartbeat.tryingConnect) { ServiceRequestHeartbeat heartbeatmsg = new ServiceRequestHeartbeat(); heartbeatmsg.ApplicationSender = this.clientSocket.applicationSender; heartbeatmsg.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSReady srPosready = new ServiceRequestPOSReady(); srPosready.ApplicationSender = this.clientSocket.applicationSender; srPosready.WorkstationID = this.clientSocket.workstationID; POSMessagePOSReady msgPOSReady = new POSMessagePOSReady(); msgPOSReady.ApplicationSender = this.clientSocket.applicationSender; msgPOSReady.WorkstationID = this.clientSocket.workstationID; DebugLog(string.Format("new POSReady: type={0},id={1}, counter={2}", msgPOSReady.MessageType, msgPOSReady.MessageID, FDCMessage.requestIDConter)); ServiceRequestPOSdataHeartbeat posDataElem = new ServiceRequestPOSdataHeartbeat(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataHeartbeat[] posDataArray = { posDataElem }; heartbeatmsg.POSdata = posDataArray; srPosready.POSdata = posDataArray; msgPOSReady.POSdata = posDataArray; heartbeat.Restart(); if (FDCGlobal.ProtocolVersion <= FDCVersion.V0007) clientSocket.ifsfMessages.EnqueueMessage(heartbeatmsg, null, null, null, false, 0); else clientSocket.ifsfMessages.EnqueueMessage(msgPOSReady, null, null, null, false, 0); } else { DebugLog("HeartBeat tryingToConnect"); var clientSocketRespChannelBThreadObj = this.clientSocket.respChannelBThreadObj; if (clientSocketRespChannelBThreadObj != null) { DebugLog(string.Format("HeartBeat true && {0}", !clientSocketRespChannelBThreadObj.bRunning)); } else { DebugLog("HeartBeat false "); } if (clientSocketRespChannelBThreadObj != null && !clientSocketRespChannelBThreadObj.bRunning) { DebugLog("HeartBeat reconnecting"); if (this.clientSocket.Connect("")) { heartbeat.tryingConnect = false; DebugLog("HeartBeat Restarting"); heartbeat.Restart(); } } } } catch (Exception ex) { DebugLog("HeartBeat Exception! " + ex); } } public void VersionInfo(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestVersionInfo sr = new ServiceRequestVersionInfo(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataVersionInfo posDataElem = new ServiceRequestPOSdataVersionInfo(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataVersionInfo[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("VersionInfo Exception! " + ex); } } private void VersionInfoResp(int requestId, string sOverallResult, ServiceResponseVersionInfo sr) { try { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString()); if (OnVersionInfo != null) { OnVersionInfo(this, new VersionInfoEventArgs(sr.FDCdata[0].FDCversion, sr.FDCdata[0].FDCrelease, sr.FDCdata[0].FDChotfix)); } } catch (Exception ex) { DebugLog("VersionInfoResp Exception! " + ex); } } public void StartForecourt(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestStartForecourt sr = new ServiceRequestStartForecourt(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataStartForecourt posDataElem = new ServiceRequestPOSdataStartForecourt(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataStartForecourt[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("StartForecourt Exception! " + ex); } } public void TwinOpenMaster(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestTwinOpenMaster sr = new ServiceRequestTwinOpenMaster(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataTwinOpenMaster posDataElem = new ServiceRequestPOSdataTwinOpenMaster(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataTwinOpenMaster[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("TwinOpenMaster Exception! " + ex); } } private void StartForecourtResp(int requestId, string sOverallResult, string errorCode) { try { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); } catch (Exception ex) { DebugLog("StartForecourtResp Exception! " + ex); } } private void TwinOpenMasterResp(int requestId, string sOverallResult, string errorCode) { try { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == FDCPOSLibrary.OverallResult.Success.ToString()); } catch (Exception ex) { DebugLog("TwinOpenMasterResp Exception! " + ex); } } public void StopForecourt(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestStopForecourt sr = new ServiceRequestStopForecourt(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataStopForecourt posDataElem = new ServiceRequestPOSdataStopForecourt(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); posDataElem.Emergencystop = "false"; ServiceRequestPOSdataStopForecourt[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("StopForecourt Exception! " + ex); } } private void StopForecourtResp(int requestId, string sOverallResult, string errorCode) { try { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == FDCPOSLibrary.OverallResult.Success.ToString()); } catch (Exception ex) { DebugLog("StopForecourtResp Exception! " + ex); } } public void GetCurrentFuellingStatus(int pumpId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetCurrentFuellingStatus sr = new ServiceRequestGetCurrentFuellingStatus(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetCurrentFuellingStatus posDataElem = new ServiceRequestPOSdataGetCurrentFuellingStatus(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetCurrentFuellingStatus[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetCurrentFuellingStatus Exception! " + ex); } } public void GetFuelPointTotals(int pumpId, int nozzleId, EventHandler> requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetFuelPointTotals sr = new ServiceRequestGetFuelPointTotals(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetFuelPointTotals posDataElem = new ServiceRequestPOSdataGetFuelPointTotals(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassGetFuelPointTotals deviceClass = new ServiceRequestDeviceClassGetFuelPointTotals(); deviceClass.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); deviceClass.NozzleNo = (nozzleId == -1) ? "*" : Convert.ToString(nozzleId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetFuelPointTotals[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; EventHandler proxy = (sender, e) => requestCompleted(sender, (AsyncCompletedEventArgs)e); clientSocket.ifsfMessages.EnqueueMessage(sr, proxy, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetFuelPointTotals Exception! " + ex); } } private void GetCurrentFuellingStatusResp(int requestId, string sOverallResult, ServiceResponseGetCurrentFuellingStatus sr) { try { DebugLog("GetCurrentFuellingStatusResp init"); if (OnCurrentFuellingStatus != null && sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) { for (int i = 0; i < sr.FDCdata[0].DeviceClass.Length; i++) { var deviceClass = sr.FDCdata[0].DeviceClass[i]; if (!string.IsNullOrEmpty(deviceClass.ReleaseToken) && !string.IsNullOrEmpty(deviceClass.CurrentAmount) && !string.IsNullOrEmpty(deviceClass.CurrentVolume)) { DebugLog(string.Format("type={0}, id={1}, volume={2}, amount={3}", deviceClass.Type, deviceClass.DeviceID, deviceClass.CurrentVolume, deviceClass.CurrentAmount)); string deviceType = deviceClass.Type; int deviceId = Convert.ToInt16(deviceClass.DeviceID); int nozzleId = Convert.ToInt16(deviceClass.CurrentNozzle); Decimal volume = FDCConvert.ToDecimal(deviceClass.CurrentVolume); Decimal amount = FDCConvert.ToDecimal(deviceClass.CurrentAmount); Decimal price = FDCConvert.ToDecimal(deviceClass.CurrentUnitPrice); string authAS = deviceClass.AuthorisationApplicationSender; var token = AuthReleaseTokenFactory.GenerateToken(deviceClass.ReleaseToken); //generate the event payload and add the ReleaseId parsed from the ReleaseToken var eventArgs = new CurrentFuellingStatusEventArgs(deviceType, deviceId, nozzleId, volume, amount, price, authAS) { ReleaseId = token.AuthorizationId, ReservingDeviceId = token.TerminalId, TransactionId = Convert.ToInt32(deviceClass.TransactionSeqNo), FuelPeriodSequenceNo = Convert.ToInt32(deviceClass.FuelPeriodSequenceNo) }; OnCurrentFuellingStatus(this, eventArgs); } else { DebugLog("fuelling status data empty"); } } } DebugLog("GetCurrentFuellingStatusResp end"); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == FDCPOSLibrary.OverallResult.Success.ToString()); } catch (Exception ex) { DebugLog("GetCurrentFuellingStatusResp Exception! " + ex); } } private void GetFuelPointTotalsResp(int requestId, string sOverallResult, ServiceResponseGetFuelPointTotals sr, string originalXml) { try { DebugLog("GetFuelPointTotalsResp init"); if (OnFuelPointTotals != null && sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) for (int i = 0; i < sr.FDCdata[0].DeviceClass.Length; i++) { DebugLog(string.Format("type={0}, id={1}, volume={2}, amount={3}", sr.FDCdata[0].DeviceClass[i].Type, sr.FDCdata[0].DeviceClass[i].DeviceID, sr.FDCdata[0].DeviceClass[i].Volume, sr.FDCdata[0].DeviceClass[i].Amount)); string deviceType = sr.FDCdata[0].DeviceClass[i].Type; int deviceId = Convert.ToInt16(sr.FDCdata[0].DeviceClass[i].DeviceID); int nozzleId = Convert.ToInt16(sr.FDCdata[0].DeviceClass[i].NozzleNo); Decimal volume = FDCConvert.ToDecimal(sr.FDCdata[0].DeviceClass[i].Volume); Decimal amount = FDCConvert.ToDecimal(sr.FDCdata[0].DeviceClass[i].Amount); Decimal price = FDCConvert.ToDecimal(sr.FDCdata[0].DeviceClass[i].UnitPrice); OnFuelPointTotals(this, new FuelPointTotalsEventArgs(requestId, sOverallResult == FDCPOSLibrary.OverallResult.Success.ToString(), deviceType, deviceId, nozzleId, volume, amount, price, originalXml)); } DebugLog("GetFuelPointTotalsResp end"); } catch (Exception ex) { DebugLog("GetFuelPointTotalsResp Exception! " + ex); } } public void GetDeviceState(string deviceType, int deviceId, EventHandler requestCompleted, object userToken, object src) { try { DebugLog(string.Format("GetDeviceState init: deviceId={0}, deviceType={1}", deviceId, deviceType)); // create XML ServiceRequest object if (deviceType == DeviceType.DT_FuellingPoint) { ServiceRequestGetFPState sr = new ServiceRequestGetFPState(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetDeviceState posDataElem = new ServiceRequestPOSdataGetDeviceState(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = (deviceId == -1) ? "*" : Convert.ToString(deviceId); deviceClass.Type = deviceType; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetDeviceState[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } else if (deviceType == DeviceType.DT_TankProbe || deviceType == DeviceType.DT_TankLevelGauge) { ServiceRequestGetTPState sr = new ServiceRequestGetTPState(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetDeviceState posDataElem = new ServiceRequestPOSdataGetDeviceState(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = (deviceId == -1) ? "*" : Convert.ToString(deviceId); deviceClass.Type = deviceType; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetDeviceState[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } else if (deviceType == DeviceType.DT_Vir) { ServiceRequestGetVIRState sr = new ServiceRequestGetVIRState(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetDeviceState posDataElem = new ServiceRequestPOSdataGetDeviceState(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = (deviceId == -1) ? "*" : Convert.ToString(deviceId); deviceClass.Type = deviceType; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetDeviceState[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } else if (deviceType == DeviceType.DT_PricePole || deviceType == DeviceType.DT_PricePolePoint) { ServiceRequestGetPPState sr = new ServiceRequestGetPPState(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetDeviceState posDataElem = new ServiceRequestPOSdataGetDeviceState(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = (deviceId == -1) ? "*" : Convert.ToString(deviceId); deviceClass.Type = deviceType; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetDeviceState[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } else { ServiceRequestGetDeviceState sr = new ServiceRequestGetDeviceState(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetDeviceState posDataElem = new ServiceRequestPOSdataGetDeviceState(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = (deviceId == -1) ? "*" : Convert.ToString(deviceId); deviceClass.Type = deviceType; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetDeviceState[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } DebugLog("GetDeviceState end"); } catch (Exception ex) { DebugLog("GetDeviceState Exception! " + ex); } } private void GetDeviceStateResp(int requestId, string sOverallResult, ServiceResponseGetDeviceState sr) { try { if (OnDeviceStateChange != null && sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) { for (int i = 0; i < sr.FDCdata[0].DeviceClass.Length; i++) { DebugLog(string.Format("GetDeviceStateResp type={0}, id={1}, state={2}, substate={3}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[i].DeviceID, sr.FDCdata[0].DeviceClass[i].LogicalState, sr.FDCdata[0].DeviceClass[i].LogicalSubState)); string deviceType = sr.FDCdata[0].DeviceClass[i].Type; int deviceId = Convert.ToInt16(sr.FDCdata[0].DeviceClass[i].DeviceID); LogicalDeviceState state = this.convertLogicalDeviceState(!string.IsNullOrEmpty(sr.FDCdata[0].DeviceClass[i].LogicalState) ? sr.FDCdata[0].DeviceClass[i].LogicalState : sr.FDCdata[0].DeviceClass[i].DeviceState.DeviceState); LogicalDeviceState substate = convertLogicalDeviceState(!string.IsNullOrEmpty(sr.FDCdata[0].DeviceClass[i].LogicalSubState) ? sr.FDCdata[0].DeviceClass[i].LogicalSubState : sr.FDCdata[0].DeviceClass[i].DeviceSubState); int nozzleUp = 0; if (sr.FDCdata[0].DeviceClass[i].Nozzle != null) { foreach (NozzleStateClass nozzleState in sr.FDCdata[0].DeviceClass[i].Nozzle) { if (nozzleState.LogicalNozzle == "NozzleUp") nozzleUp = Convert.ToInt32(nozzleState.NozzleNo); } } OnDeviceStateChange.Invoke(this, new DeviceStateChangedEventArgs(deviceType, deviceId, state, substate, "", nozzleUp)); } clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString()); } DebugLog("GetDeviceStateResp end"); } catch (Exception ex) { DebugLog("GetDeviceStateResp Exception! " + ex); } } private void GetFPStateResp(int requestId, string sOverallResult, ServiceResponseGetFPState sr) { try { if (OnDeviceStateChange != null && sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) { if (sOverallResult == OverallResult.Success.ToString()) { for (int i = 0; i < sr.FDCdata[0].DeviceClass.Length; i++) { DebugLog(string.Format("GetFPStateResp type={0}, id={1}, state={2}, substate={3}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[i].DeviceID, sr.FDCdata[0].DeviceClass[i].DeviceState, sr.FDCdata[0].DeviceClass[i].DeviceSubState)); string deviceType = sr.FDCdata[0].DeviceClass[i].Type; int deviceId = Convert.ToInt16(sr.FDCdata[0].DeviceClass[i].DeviceID); LogicalDeviceState state = this.convertLogicalDeviceState(sr.FDCdata[0].DeviceClass[i].DeviceState.DeviceState); LogicalDeviceState substate = convertLogicalDeviceState(sr.FDCdata[0].DeviceClass[i].DeviceSubState); if (!string.IsNullOrEmpty(sr.FDCdata[0].DeviceClass[i].DeviceState.Stopped) && XmlConvert.ToBoolean(sr.FDCdata[0].DeviceClass[i].DeviceState.Stopped)) substate = LogicalDeviceState.FDC_STOPPED; string lockingAS = sr.FDCdata[0].DeviceClass[i].LockingApplicationSender; int nozzleUp = 0; if (sr.FDCdata[0].DeviceClass[i].Nozzle != null) { foreach (NozzleStateClass nozzleState in sr.FDCdata[0].DeviceClass[i].Nozzle) { if (nozzleState.LogicalNozzle == "NozzleUp") nozzleUp = Convert.ToInt32(nozzleState.NozzleNo); } } OnDeviceStateChange.Invoke(this, new DeviceStateChangedEventArgs(deviceType, deviceId, state, substate, lockingAS, nozzleUp)); } } else DebugLog(string.Format("overallResult={0}", sOverallResult)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == FDCPOSLibrary.OverallResult.Success.ToString()); } DebugLog("GetFPStateResp end"); } catch (Exception ex) { DebugLog("GetFPStateResp Exception! " + ex); } } private void GetTPStateResp(int requestId, string sOverallResult, ServiceResponseGetTPState sr) { try { if (OnDeviceStateChange != null && sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) { for (int i = 0; i < sr.FDCdata[0].DeviceClass.Length; i++) { DebugLog(string.Format("GetTPStateResp type={0}, id={1}, state={2}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[i].DeviceID, sr.FDCdata[0].DeviceClass[i].DeviceState)); string deviceType = sr.FDCdata[0].DeviceClass[i].Type; int deviceId = Convert.ToInt16(sr.FDCdata[0].DeviceClass[i].DeviceID); LogicalDeviceState state = this.convertLogicalDeviceState(sr.FDCdata[0].DeviceClass[i].DeviceState.DeviceState); OnDeviceStateChange.Invoke(this, new DeviceStateChangedEventArgs(deviceType, deviceId, state, LogicalDeviceState.FDC_UNDEFINED, "", 0)); } } clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString()); DebugLog("GetTPStateResp end"); } catch (Exception ex) { DebugLog("GetTPStateResp Exception! " + ex); } } private void GetPPStateResp(int requestId, string sOverallResult, ServiceResponseGetPPState sr) { try { if (OnDeviceStateChange != null && sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) { for (int i = 0; i < sr.FDCdata[0].DeviceClass.Length; i++) { DebugLog(string.Format("GetPPStateResp type={0}, id={1}, state={2}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[i].DeviceID, sr.FDCdata[0].DeviceClass[i].DeviceState)); } clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString()); } DebugLog("GetPPStateResp end"); } catch (Exception ex) { DebugLog("GetPPStateResp Exception! " + ex); } } private void GetVIRStateResp(int requestId, string sOverallResult, ServiceResponseGetVIRState sr) { try { if (OnVirStateChange != null && sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) { for (int i = 0; i < sr.FDCdata[0].DeviceClass.Length; i++) { int deviceId = Convert.ToInt16(sr.FDCdata[0].DeviceClass[i].DeviceID); if (sr.FDCdata[0].DeviceClass[i].Vir != null) { foreach (VIRStateClass virState in sr.FDCdata[0].DeviceClass[i].Vir) { DebugLog(string.Format("GetVIRStateResp type={0}, id={1}, virId={2}, state={3}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[i].DeviceID, virState.VirID, virState.DeviceState)); LogicalDeviceState state = this.convertLogicalDeviceState(virState.DeviceState); DeviceConnectionState deviceState; if (state == LogicalDeviceState.FDC_READY) deviceState = DeviceConnectionState.Connected; else if (state == LogicalDeviceState.FDC_OFFLINE) deviceState = DeviceConnectionState.Disconnected; else deviceState = DeviceConnectionState.Unknown; OnVirStateChange(this, new VIRStateChangedEventArgs(deviceId, virState.VirID, deviceState)); } } } clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString()); } DebugLog("GetVIRStateResp end"); } catch (Exception ex) { DebugLog("GetVIRStateResp Exception! " + ex); } } public void TerminateFuelling(int pumpId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestTerminateFuelling sr = new ServiceRequestTerminateFuelling(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataTerminateFuelling posDataElem = new ServiceRequestPOSdataTerminateFuelling(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); deviceClass.Type = DeviceType.DT_FuellingPoint; deviceClass.CreateZeroSale = Convert.ToString(false); posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataTerminateFuelling[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("TerminateFuelling Exception! " + ex); } } private void TerminateFuellingResp(int requestId, string sOverallResult, ServiceResponseTerminateFuelling sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass[0].ErrorCode; DebugLog(string.Format("TerminateFuellingResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[0].DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); } catch (Exception ex) { DebugLog("TerminateFuellingResp Exception! " + ex); } } public void AuthoriseFuelPoint(int pumpId, int transactionId, FuellingType fuellingType, byte reservingDeviceId, IAuthorizeParameters authParams, EventHandler> requestCompleted, object userToken, object src) { try { DebugLog(String.Format("ISFSManager.AuthoriseFuelPoint: pumpId={0}, fuellingType={1}, reservingDeviceId={2}, request={3}, Token={4} Src={5}", pumpId, fuellingType, reservingDeviceId, requestCompleted, userToken, src)); DebugLog( String.Format( "ISFSManager.AuthoriseFuelPoint: authParams: PresetType={0}, PresetValue={1}, LockToClient={2}, Prepay={3}, ConsentGiven={4}, PriceGroup={5}, AllowedFuelGrade={6}, FuelGradeMaxVolume={7}", authParams.PresetType, authParams.PresetValue, authParams.LockToReleaseClient, authParams.Prepay, authParams.ConsentGiven, authParams.PriceGroup, authParams.AllowedFuelGrade, authParams.FuelGradeMaxVolume)); // create XML ServiceRequest object ServiceRequestAuthoriseFuelPoint sr = new ServiceRequestAuthoriseFuelPoint(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataAuthoriseFuelPoint posDataElem = new ServiceRequestPOSdataAuthoriseFuelPoint(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassAuthoriseFuelPoint authFP = new ServiceRequestDeviceClassAuthoriseFuelPoint(); authFP.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); authFP.Type = DeviceType.DT_FuellingPoint; if (authParams.PresetType == PresetType.Amount) { authFP.MaxTrxVolume = FDCConvert.ToString((Decimal)0); authFP.MaxTrxAmount = FDCConvert.ToString(authParams.PresetValue); } else { authFP.MaxTrxVolume = FDCConvert.ToString(authParams.PresetValue); authFP.MaxTrxAmount = FDCConvert.ToString((Decimal)0); } authFP.LockFuelSaleTrx = Convert.ToString(authParams.LockToReleaseClient); //Token is a composition of the terminal id and release id, this token is echoed back when the transaction is completed //Terminal Id is only needed for outdoor or prepaid transactions. All other have Terminal Id = 0. //Receipt no is only used for prepaid transactions, var terminalId = 0; if (fuellingType == FuellingType.OptCardPaid || fuellingType == FuellingType.OptCashPaid) terminalId = reservingDeviceId; if (fuellingType == FuellingType.Prepaid) terminalId = authParams.PrepayReceiptNo / 10000; var token = AuthReleaseTokenFactory.GenerateToken( terminalId, transactionId, fuellingType == FuellingType.Prepaid ? (int?)(authParams.PrepayReceiptNo % 10000) : null); authFP.ReleaseToken = token.ToString(); authFP.ReservingDeviceId = Convert.ToString(reservingDeviceId); authFP.FuellingType = Convert.ToString((int)fuellingType); if (authParams.Prepay) { var prepaidTrx = new PrepaidTrxElementClass(); prepaidTrx.IsPrepaid = Convert.ToString(true); authFP.PrepaidTrx = prepaidTrx; } if (authParams.ConsentGiven) authFP.ConsentGiven = Convert.ToString(true); authFP.ProcessZeroSale = Convert.ToString(authParams.ProcessZeroSale); authFP.ApplyAuthPresetRetries = Convert.ToString(authParams.ApplyAuthPresetRetries); var modeNo = manager.forecourtControl.ForecourtConfiguration.GetFuelMode(fuellingType, authParams.PriceGroup); DebugLog(String.Format("ISFSManager.AuthoriseFuelPoint.configuration.GetFuelMode: fuellingType={0}, PriceGroup={1}, modeNo={2}", fuellingType, authParams.PriceGroup, modeNo)); var pump = src as IPump; if (pump != null) { if ((pump.State == PumpState.Idle || pump.State == PumpState.Calling) && fuellingType == FuellingType.Postpaid) { // Authorized in advance for self service. Change fuel mode to use the specific one modeNo = manager.forecourtControl.ForecourtConfiguration.GetFuelMode(authParams.PriceGroup, true); DebugLog(String.Format("ISFSManager.AuthoriseFuelPoint.configuration.GetFuelMode: fuellingType={0}, PriceGroup=Postpaid, modeNo={1}", fuellingType, modeNo)); } } authFP.FuelMode = new FuelModeElementClass() { ModeNo = modeNo.ToString() }; ReleasedProductsClass products = new ReleasedProductsClass(); AllowedFuelGrades fgs = (AllowedFuelGrades)(authParams.AllowedFuelGrade); FuelGradeMaxVolumes vols = (FuelGradeMaxVolumes)(authParams.FuelGradeMaxVolume); int count = 0; products.Product = new ProductElementClass[fgs.Count]; for (int iFuelGrade = 0; iFuelGrade < fgs.Count; iFuelGrade++) { if (fgs[iFuelGrade]) { products.Product[count] = new ProductElementClass(); products.Product[count].ProductNo = Convert.ToString(iFuelGrade); //productNo = iFuelGrade(product index) + 1 if ((iFuelGrade < vols.Count) && vols[iFuelGrade].HasValue) products.Product[count].MaxTrxVolume = FDCConvert.ToString((decimal)vols[iFuelGrade]); count++; } } authFP.ReleasedProducts = products; posDataElem.DeviceClass = authFP; ServiceRequestPOSdataAuthoriseFuelPoint[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; //Transaction ID is sent in response from the proxy delegate. EventHandler proxy = (sender, e) => requestCompleted(sender, new AsyncCompletedEventArgs(e.Success, transactionId, e.UserToken)); clientSocket.ifsfMessages.EnqueueMessage(sr, proxy, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("AuthoriseFuelPoint Exception! " + ex); } } private void AuthoriseFuelPointResp(int requestId, string sOverallResult, ServiceResponseAuthoriseFuelPoint sr) { try { DebugLog("AuthoriseFuelPointResp init"); string errorCode = (sr.FDCdata[0].FDCStatus != null) ? sr.FDCdata[0].FDCStatus : sr.FDCdata[0].DeviceClass.ErrorCode; if ((errorCode == ErrorCode.ERRCD_OK.ToString()) && (sOverallResult == OverallResult.Success.ToString())) { // Ok so far, but wait for unsolicited FPStateChange before making decision about success. DebugLog(string.Format("Waiting for unsolicited FPStateChange, RequestId={0}.", requestId)); unsolicitedFPStateChangeDictionary[Convert.ToInt16(sr.FDCdata[0].DeviceClass.DeviceID)] = requestId; } else clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, false); DebugLog("AuthoriseFuelPointResp end"); } catch (Exception ex) { DebugLog("AuthoriseFuelPointResp Exception! " + ex); } } public void ChangeFuelMode(int pumpId, int mode, ushort? operationMode, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestChangeFuelMode sr = new ServiceRequestChangeFuelMode(); if (FDCGlobal.ProtocolVersion <= FDCVersion.V0007) sr.RequestType = "ChangeFuelMode"; else sr.RequestType = "ChangeFPFuelMode"; sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataChangeFuelMode posDataElem = new ServiceRequestPOSdataChangeFuelMode(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassChangeFuelMode deviceClass = new ServiceRequestDeviceClassChangeFuelMode(); deviceClass.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); deviceClass.Type = DeviceType.DT_FuellingPoint; deviceClass.FuelMode = new FuelModeElementClass(); deviceClass.FuelMode.ModeNo = Convert.ToString(mode); if (operationMode.HasValue) { deviceClass.FuelMode.OperationModeSpecified = true; deviceClass.FuelMode.OperationMode = (ushort)operationMode; } ServiceRequestDeviceClassChangeFuelMode[] deviceClassArray = { deviceClass }; posDataElem.DeviceClass = deviceClassArray; ServiceRequestPOSdataChangeFuelMode[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("ChangeFuelMode Exception! " + ex); } } public void ChangeFuelModeAdd(ServiceRequestChangeFuelMode sr, int pumpId, int mode, ushort? operationMode, EventHandler requestCompleted, object userToken, object src) { // create XML ServiceRequest object sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; DebugLog(string.Format("ChangeFuelModeAdd init: sr.ApplicationSender={0}, sr.WorkstationID={1}, pumpId={2}, mode={3}", sr.ApplicationSender, sr.WorkstationID, pumpId, mode)); ServiceRequestPOSdataChangeFuelMode POSDataElem; if (sr.POSdata != null) POSDataElem = sr.POSdata[0]; else { ServiceRequestPOSdataChangeFuelMode[] POSDataArray = null; DebugLog(string.Format("ChangeFuelModeAdd: new ServiceRequestPOSdataChangeFuelMode")); POSDataElem = new ServiceRequestPOSdataChangeFuelMode(); ArrayResize(ref POSDataArray, 1); POSDataArray[POSDataArray.Length - 1] = POSDataElem; POSDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); sr.POSdata = POSDataArray; } ServiceRequestDeviceClassChangeFuelMode devicemode = null; if (POSDataElem.DeviceClass != null) { foreach (ServiceRequestDeviceClassChangeFuelMode devicemodeTemp in POSDataElem.DeviceClass) if (devicemodeTemp.DeviceID == Convert.ToString(pumpId) && devicemodeTemp.ModeNo == Convert.ToString(mode)) { devicemode = devicemodeTemp; DebugLog(string.Format("ChangeFuelModeAdd: device/mode found")); } } if (devicemode == null) { DebugLog(string.Format("ChangeFuelModeAdd: new mode")); devicemode = new ServiceRequestDeviceClassChangeFuelMode(); devicemode.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); devicemode.Type = DeviceType.DT_FuellingPoint; devicemode.FuelMode = new FuelModeElementClass(); devicemode.FuelMode.ModeNo = Convert.ToString(mode); if (operationMode.HasValue) { devicemode.FuelMode.OperationModeSpecified = true; devicemode.FuelMode.OperationMode = (ushort)operationMode; } ServiceRequestDeviceClassChangeFuelMode[] devicemodeArray = POSDataElem.DeviceClass; ArrayResize(ref devicemodeArray, (devicemodeArray != null) ? devicemodeArray.Length + 1 : 1); DebugLog(string.Format("ChangeFuelModeAdd: resize devidemodeArray to '{0}' items", devicemodeArray.Length)); devicemodeArray[devicemodeArray.Length - 1] = devicemode; POSDataElem.DeviceClass = devicemodeArray; } DebugLog("ChangeFuelModeAdd end"); } public void ChangeFuelModeSend(ServiceRequestChangeFuelMode sr, EventHandler requestCompleted, object userToken, object src) { DebugLog(string.Format("ChangeFuelModeSend init: sr.ApplicationSender={0}, sr.WorkstationID={1}", sr.ApplicationSender, sr.WorkstationID)); clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); DebugLog(string.Format("ChangeFuelModeSend end: sr.ApplicationSender={0}, sr.WorkstationID={1}", sr.ApplicationSender, sr.WorkstationID)); } private void ChangeFuelModeResp(int requestId, string sOverallResult, ServiceResponseFDCdataChangeFuelMode[] fdcData) { try { DebugLog(string.Format("ChangeFuelModeResp init, sOverallResult={0}", sOverallResult)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == FDCPOSLibrary.OverallResult.Success.ToString()); if (fdcData[0] != null && fdcData[0].DeviceClass != null) { for (int i = 0; i < fdcData[0].DeviceClass.Length; i++) { if (fdcData[0].DeviceClass[i].ErrorCode != null && fdcData[0].DeviceClass[i].ErrorCode != ErrorCode.ERRCD_OK.ToString() && fdcData[0].DeviceClass[i].ErrorCode != ErrorCode.ERRCD_NO.ToString()) { DebugLog(string.Format("ChangeFuelModeResp type={0}, id={1}, errorCode={2}", fdcData[0].DeviceClass[i].Type, fdcData[0].DeviceClass[i].DeviceID, fdcData[0].DeviceClass[i].ErrorCode)); string deviceType = fdcData[0].DeviceClass[i].Type; int deviceId = Convert.ToInt16(fdcData[0].DeviceClass[i].DeviceID); int alarmId = -1; string alarmmsg = "Error " + fdcData[0].DeviceClass[i].ErrorCode + " changing fuel mode"; OnDeviceAlarm.Fire(this, new DeviceAlarmEventArgs(deviceType, deviceId, alarmId, alarmmsg)); } } } DebugLog("ChangeFuelModeResp end"); } catch (Exception ex) { DebugLog("ChangeFuelModeResp Exception! " + ex); } } public void ChangeFuelPrice(int productId, Decimal price, int mode, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestChangeFuelPrice sr = new ServiceRequestChangeFuelPrice(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataChangeFuelPrice posDataElem = new ServiceRequestPOSdataChangeFuelPrice(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestProductChangeFuelPrice[] products = new ServiceRequestProductChangeFuelPrice[1]; ServiceRequestProductChangeFuelPrice product = new ServiceRequestProductChangeFuelPrice(); product.ProductNo = (productId == -1) ? "*" : Convert.ToString(productId); ServiceRequestFuelModeChangeFuelPrice[] fuelModes = new ServiceRequestFuelModeChangeFuelPrice[1]; ServiceRequestFuelModeChangeFuelPrice fuelMode = new ServiceRequestFuelModeChangeFuelPrice(); fuelMode.PriceNew = FDCConvert.ToString(price); fuelMode.ModeNo = Convert.ToString(mode); fuelModes[0] = fuelMode; product.FuelMode = fuelModes; products[0] = product; posDataElem.Product = products; ServiceRequestPOSdataChangeFuelPrice[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("ChangeFuelPrice Exception! " + ex); } } public void ChangeFuelPriceAdd(ServiceRequestChangeFuelPrice sr, int productId, Decimal price, int mode) { // create XML ServiceRequest object sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; DebugLog(string.Format("ChangeFuelPriceAdd init: sr.ApplicationSender={0}, sr.WorkstationID={1}, productId={2}, price={3}, mode={4}", sr.ApplicationSender, sr.WorkstationID, productId, price, mode)); ServiceRequestPOSdataChangeFuelPrice POSDataElem; if (sr.POSdata != null) POSDataElem = sr.POSdata[0]; else { ServiceRequestPOSdataChangeFuelPrice[] POSDataArray = null; DebugLog("ChangeFuelPriceAdd: new ServiceRequestPOSdataChangeFuelPrice"); POSDataElem = new ServiceRequestPOSdataChangeFuelPrice(); ArrayResize(ref POSDataArray, 1); POSDataArray[POSDataArray.Length - 1] = POSDataElem; POSDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); sr.POSdata = POSDataArray; } ServiceRequestProductChangeFuelPrice product = null; if (POSDataElem.Product != null) { foreach (ServiceRequestProductChangeFuelPrice productTemp in POSDataElem.Product) if (productTemp.ProductNo == Convert.ToString(productId) && productTemp.ModeNo == Convert.ToString(mode)) { product = productTemp; DebugLog("ChangeFuelPriceAdd: product found"); } } if (product == null && productId > 0) { DebugLog("ChangeFuelPriceAdd: new product"); product = new ServiceRequestProductChangeFuelPrice(); product.ProductNo = (productId == -1) ? "*" : Convert.ToString(productId); ServiceRequestProductChangeFuelPrice[] productArray = POSDataElem.Product; ArrayResize(ref productArray, (productArray != null) ? productArray.Length + 1 : 1); DebugLog(string.Format("ChangeFuelPriceAdd: resize product to '{0}' items", productArray.Length)); productArray[productArray.Length - 1] = product; POSDataElem.Product = productArray; } ServiceRequestFuelModeChangeFuelPrice fuelMode = null; if (product.FuelMode != null) { foreach (ServiceRequestFuelModeChangeFuelPrice fuelModeTemp in product.FuelMode) if (product.ProductNo == Convert.ToString(productId) && fuelModeTemp.ModeNo == Convert.ToString(mode)) { fuelMode = fuelModeTemp; DebugLog("ChangeFuelPriceAdd: fuelMode found"); } } if (fuelMode == null && mode > 0) { fuelMode = new ServiceRequestFuelModeChangeFuelPrice(); fuelMode.PriceNew = FDCConvert.ToString(price); fuelMode.ModeNo = Convert.ToString(mode); ServiceRequestFuelModeChangeFuelPrice[] fuelModeArray = product.FuelMode; ArrayResize(ref fuelModeArray, (fuelModeArray != null) ? fuelModeArray.Length + 1 : 1); DebugLog(string.Format("ChangeFuelPriceAdd: resize fuelMode to '{0}' items", fuelModeArray.Length)); fuelModeArray[fuelModeArray.Length - 1] = fuelMode; product.FuelMode = fuelModeArray; } DebugLog(string.Format("ChangeFuelPriceAdd end: sr.ApplicationSender={0}, sr.WorkstationID={1}", sr.ApplicationSender, sr.WorkstationID)); } public void ChangeFuelPriceSend(ServiceRequestChangeFuelPrice sr, EventHandler requestCompleted, object userToken, object src) { DebugLog(string.Format("ChangeFuelPriceSend init: sr.ApplicationSender={0}, sr.WorkstationID={1}", sr.ApplicationSender, sr.WorkstationID)); if (sr.POSdata == null) { sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; var posDataArray = new ServiceRequestPOSdataChangeFuelPrice[1]; DebugLog("ChangeFuelPriceAdd: new ServiceRequestPOSdataChangeFuelPrice"); var posDataElem = new ServiceRequestPOSdataChangeFuelPrice(); posDataArray[0] = posDataElem; posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); sr.POSdata = posDataArray; } clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); DebugLog(string.Format("ChangeFuelPriceSend end: sr.ApplicationSender={0}, sr.WorkstationID={1}", sr.ApplicationSender, sr.WorkstationID)); } public void CloseReconciliationPeriodAsyncSend(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object var sr = new ServiceRequestCloseReconciliationPeriod(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; var posDataElem = new ServiceRequestPOSdataCloseReconciliationPeriod(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataCloseReconciliationPeriod[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("CloseReconciliationPeriodAsyncSend Exception! " + ex); } } private void ChangeFuelPriceResp(int requestId, string sOverallResult, ServiceResponseFDCdataChangeFuelPrice[] fdcData) { try { DebugLog("ChangeFuelPriceResp init"); string errorCode = (fdcData[0].FDCStatus != null) ? fdcData[0].FDCStatus : fdcData[0].ErrorCode; clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == FDCPOSLibrary.OverallResult.Success.ToString()); DebugLog("ChangeFuelPriceResp end"); } catch (Exception ex) { DebugLog("ChangeFuelPriceResp Exception! " + ex); } } private void CloseReconciliationPeriodResp(int requestId, string sOverallResult, ServiceResponseFDCdataCloseReconciliationPeriod[] fdcData) { try { DebugLog("CloseReconciliationPeriodResp init"); if (fdcData != null) { string errorCode = fdcData[0].FDCStatus ?? fdcData[0].ErrorCode; clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); } else { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, false); } DebugLog("CloseReconciliationPeriodResp end"); } catch (Exception ex) { DebugLog("CloseReconciliationPeriodResp Exception! " + ex); } } public void LockFuelSaleTrx(int pumpId, int transactionNo, int releaseToken, EventHandler requestCompleted, object userToken, object src) { try { ServiceRequestLockFuelSaleTrx sr = new ServiceRequestLockFuelSaleTrx(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataBaseFuelSaleTrx posDataElem = new ServiceRequestPOSdataBaseFuelSaleTrx(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassBaseFuelSaleTrx deviceClass = new ServiceRequestDeviceClassBaseFuelSaleTrx(); deviceClass.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); deviceClass.Type = DeviceType.DT_FuellingPoint; deviceClass.TransactionSeqNo = Convert.ToString(transactionNo); posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataBaseFuelSaleTrx[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("LockFuelSaleTrx Exception! " + ex); } } private void LockFuelSaleTrxResp(int requestId, string sOverallResult, ServiceResponseLockFuelSaleTrx sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass.ErrorCode; DebugLog(string.Format("LockFuelSaleTrxResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass.Type, sr.FDCdata[0].DeviceClass.DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("LockFuelSaleTrxResp end"); } catch (Exception ex) { DebugLog("LockFuelSaleTrxResp Exception! " + ex); } } public void UnlockFuelSaleTrx(int pumpId, int transactionNo, int releaseToken, EventHandler requestCompleted, object userToken, object src) { try { ServiceRequestUnlockFuelSaleTrx sr = new ServiceRequestUnlockFuelSaleTrx(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataBaseFuelSaleTrx posDataElem = new ServiceRequestPOSdataBaseFuelSaleTrx(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassBaseFuelSaleTrx deviceClass = new ServiceRequestDeviceClassBaseFuelSaleTrx(); deviceClass.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); deviceClass.Type = Wayne.FDCPOSLibrary.DeviceType.DT_FuellingPoint; deviceClass.TransactionSeqNo = Convert.ToString(transactionNo); posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataBaseFuelSaleTrx[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("UnlockFuelSaleTrx Exception! " + ex); } } private void UnlockFuelSaleTrxResp(int requestId, string sOverallResult, ServiceResponseUnlockFuelSaleTrx sr) { try { string errorCode = (sr.FDCdata[0].FDCStatus != null) ? sr.FDCdata[0].FDCStatus : sr.FDCdata[0].DeviceClass.ErrorCode; DebugLog(string.Format("UnlockFuelSaleTrxResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass.Type, sr.FDCdata[0].DeviceClass.DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("UnlockFuelSaleTrxResp end"); } catch (Exception ex) { DebugLog("UnlockFuelSaleTrxResp Exception! " + ex); } } public void ClearFuelSaleTrx(int pumpId, int transactionNo, int releaseToken, string note, EventHandler requestCompleted, object userToken, object src) { try { ServiceRequestClearFuelSaleTrx sr = new ServiceRequestClearFuelSaleTrx(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataClearFuelSaleTrx posDataElem = new ServiceRequestPOSdataClearFuelSaleTrx(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassClearFuelSaleTrx deviceClass = new ServiceRequestDeviceClassClearFuelSaleTrx(); deviceClass.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); deviceClass.Type = DeviceType.DT_FuellingPoint; deviceClass.TransactionSeqNo = Convert.ToString(transactionNo); // ignored by Fusion //deviceClass.FuelSaleNote = note; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataClearFuelSaleTrx[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("ClearFuelSaleTrx Exception! " + ex); } } private void ClearFuelSaleTrxResp(int requestId, string sOverallResult, ServiceResponseClearFuelSaleTrx sr) { try { string errorCode = (sr.FDCdata[0].FDCStatus != null) ? sr.FDCdata[0].FDCStatus : sr.FDCdata[0].DeviceClass.ErrorCode; DebugLog(string.Format("ClearFuelSaleTrxResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass.Type, sr.FDCdata[0].DeviceClass.DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("ClearFuelSaleTrxResp end"); } catch (Exception ex) { DebugLog("ClearFuelSaleTrxResp Exception! " + ex); } } public void SendConfig(string commandFileName, EventHandler requestCompleted, object userToken, object src) { clientSocket.SendConfig(commandFileName); } public void GetAvailableFuelSaleTrxs(int pumpId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetAvailableFuelSaleTrxs sr = new ServiceRequestGetAvailableFuelSaleTrxs(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetAvailableFuelSaleTrxs posDataElem = new ServiceRequestPOSdataGetAvailableFuelSaleTrxs(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetAvailableFuelSaleTrxs[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetAvailableFuelSaleTrxs Exception! " + ex); } } private void GetAvailableFuelSaleTrxsResp(int requestId, string sOverallResult, ServiceResponseGetAvailableFuelSaleTrxs sr) { try { DebugLog("GetAvailableFuelSaleTrxsResp init"); if (sr.FDCdata == null || sr.FDCdata[0].DeviceClass == null) { DebugLog("no fuel sale available - end"); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, true); return; } if (OnGetAvailableFuelSaleTrx != null && sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) { for (int i = 0; i < sr.FDCdata[0].DeviceClass.Length; i++) { if (sr.FDCdata[0].DeviceClass[i].ErrorCode != null && sr.FDCdata[0].DeviceClass[i].ErrorCode == ErrorCode.ERRCD_OK.ToString()) { string deviceType = sr.FDCdata[0].DeviceClass[i].Type; int deviceId = Convert.ToInt16(sr.FDCdata[0].DeviceClass[i].DeviceID); int transactionNo = Convert.ToInt32(sr.FDCdata[0].DeviceClass[i].TransactionSeqNo); int releaseToken; try { releaseToken = Int32.Parse(sr.FDCdata[0].DeviceClass[i].ReleaseToken, System.Globalization.NumberStyles.HexNumber); } catch (Exception ex) { releaseToken = 0; } OnGetAvailableFuelSaleTrx(this, new FuelSaleTrxEventArgs(transactionNo, 0, 0, 0, deviceType, deviceId, 0, 0, 0, 0, 0, DateTime.Now, DateTime.Now, "", "", null, null, null, null, releaseToken, 0, FuellingType.Unknown)); int timeout = 0; string sValue = IniFile.IniReadValue(ConfigurationParams.inifile, "FUSION-Connection", "GetFuelSaleTrxDetailTimeout"); if (sValue.Length > 0) timeout = Convert.ToInt16(sValue); DebugLog(string.Format("GetFuelSaleTrxDetailTimeout={0}", timeout)); Thread.Sleep(timeout); } else DebugLog(string.Format("Id={0} - Error={1}", sr.FDCdata[0].DeviceClass[i].DeviceID, sr.FDCdata[0].DeviceClass[i].ErrorCode)); } } clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, true); DebugLog("GetAvailableFuelSaleTrxsResp end"); } catch (Exception ex) { DebugLog("GetAvailableFuelSaleTrxsResp Exception! " + ex); } } public void GetFuelSaleTrxDetails(int pumpId, int transactionNo, int releaseToken, EventHandler requestCompleted, object userToken, object src) { // create XML ServiceRequest object try { ServiceRequestGetFuelSaleTrxDetails sr = new ServiceRequestGetFuelSaleTrxDetails(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetFuelSaleTrxDetails posDataElem = new ServiceRequestPOSdataGetFuelSaleTrxDetails(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassGetFuelSaleTrxDetails deviceClass = new ServiceRequestDeviceClassGetFuelSaleTrxDetails(); deviceClass.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); deviceClass.Type = Wayne.FDCPOSLibrary.DeviceType.DT_FuellingPoint; deviceClass.TransactionSeqNo = (transactionNo == -1) ? "*" : Convert.ToString(transactionNo); posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetFuelSaleTrxDetails[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetFuelSaleTrxDetails Exception! " + ex); } } private void GetFuelSaleTrxDetailsResp(int requestId, string sOverallResult, ServiceResponseGetFuelSaleTrxDetails sr) { try { DebugLog("GetFuelSaleTrxDetailsResp init"); if (sr.FDCdata == null || sr.FDCdata[0].DeviceClass == null) { DebugLog("no fuel sale details - end"); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, true); return; } if ((OnGetFuelSaleTrxDetails != null || OnFuelSaleTrx != null) && sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) { var serializer = new XmlSerializer(typeof(FDCMessageFuelSaleTrx)); foreach (ServiceResponseDeviceClassGetFuelSaleTrxDetails deviceClass in sr.FDCdata[0].DeviceClass) { if (deviceClass.ErrorCode == ErrorCode.ERRCD_OK.ToString()) { DebugLog(string.Format("type={0}, id={1}, nozzle={2}, price={3}, amount={4}, vol={5}, authAS={6}, lockAS={7}", deviceClass.Type, deviceClass.DeviceID, deviceClass.NozzleNo, deviceClass.UnitPrice, deviceClass.Amount, deviceClass.Volume, deviceClass.AuthorisationApplicationSender, deviceClass.LockingApplicationSender)); string deviceType = deviceClass.Type; int deviceId = Convert.ToInt16(deviceClass.DeviceID); int nozzleId = Convert.ToInt16(deviceClass.NozzleNo); decimal volume = FDCConvert.ToDecimal(deviceClass.Volume); decimal amount = FDCConvert.ToDecimal(deviceClass.Amount); decimal price = FDCConvert.ToDecimal(deviceClass.UnitPrice); int transactionSeqNum = Convert.ToInt32(deviceClass.TransactionSeqNo); // if fuelling sequence number not available, use transaction sequence number int fuellingSeqNum = string.IsNullOrEmpty(deviceClass.FuellingSequenceNo) ? transactionSeqNum : Convert.ToInt32(deviceClass.FuellingSequenceNo); Wayne.FDCPOSLibrary.FuellingState transactionState = convertFuellingState(deviceClass.State); int completionReason = 0; int fuelMode = (deviceClass.FuelMode != null && deviceClass.FuelMode.ModeNo != null && deviceClass.FuelMode.ModeNo != "") ? Convert.ToInt32(deviceClass.FuelMode.ModeNo) : 0; DateTime trxStartDateTime = Convert.ToDateTime(deviceClass.StartTimeStamp); DateTime trxEndDateTime = Convert.ToDateTime(deviceClass.EndTimeStamp); string authAS = deviceClass.AuthorisationApplicationSender; string lockingAS = deviceClass.LockingApplicationSender; string DSPFields = deviceClass.DSPFields; string CRCMode = deviceClass.CRCMode; string MIDLinesNarrow = deviceClass.MIDLinesNarrow; string MIDLinesWide = deviceClass.MIDLinesWide; FuellingType fuellingType = (deviceClass.FuellingType == "") ? FuellingType.Unknown : ((FuellingType)Convert.ToInt16(deviceClass.FuellingType)); if (fuellingType == FuellingType.Unknown) { DebugLog("Fuelling of unkown type received. Converting to DetectedFromAccumulators!!!"); fuellingType = FuellingType.DetectedFromAccumulators; } int releaseToken; try { IReleaseToken token = AuthReleaseTokenFactory.GenerateToken(deviceClass.ReleaseToken); releaseToken = token.AuthorizationId; } catch { releaseToken = 0; } byte reservingDeviceId; try { reservingDeviceId = Convert.ToByte(deviceClass.ReservingDeviceId); } catch (Exception ex) { reservingDeviceId = 0; } FDCMessageFDCdataFuelSaleTrx fdcData = new FDCMessageFDCdataFuelSaleTrx() { FDCTimeStamp = sr.FDCdata[0].FDCTimeStamp, DeviceClass = new FDCMessageDeviceClassFuelSaleTrx() { Amount = deviceClass.Amount, AuthorisationApplicationSender = deviceClass.AuthorisationApplicationSender, BlendRatio = deviceClass.BlendRatio, CompletionReason = "0", CRCMode = deviceClass.CRCMode, DeviceID = deviceClass.DeviceID, DSPFields = deviceClass.DSPFields, EndTimeStamp = deviceClass.EndTimeStamp, ErrorCode = deviceClass.ErrorCode, FuelPeriodSequenceNo = deviceClass.FuelPeriodSequenceNo, FuelMode = deviceClass.FuelMode, FuellingSequenceNo = deviceClass.FuellingSequenceNo, FuellingType = deviceClass.FuellingType, LockingApplicationSender = deviceClass.LockingApplicationSender, MIDLinesNarrow = deviceClass.MIDLinesNarrow, MIDLinesWide = deviceClass.MIDLinesWide, MaxTrxAmount = deviceClass.MaxTrxAmount, NozzleNo = deviceClass.NozzleNo, PrepaidTrx = deviceClass.PrepaidTrx, ProductName = deviceClass.ProductName, ProductNo = deviceClass.ProductNo, ProductNo1 = deviceClass.ProductNo1, ProductNo2 = deviceClass.ProductNo2, ProductUM = deviceClass.ProductUM, PumpNo = deviceClass.PumpNo, ReleaseToken = deviceClass.ReleaseToken, ReservingDeviceId = deviceClass.ReservingDeviceId, StartTimeStamp = deviceClass.StartTimeStamp, State = deviceClass.State, TransactionSeqNo = deviceClass.TransactionSeqNo, Type = deviceClass.Type, UnitPrice = deviceClass.UnitPrice, Volume = deviceClass.Volume, VolumeProduct1 = deviceClass.VolumeProduct1, VolumeProduct2 = deviceClass.VolumeProduct2, }, }; FDCMessageFuelSaleTrx fdcMessageFuelSaleTrx = new FDCMessageFuelSaleTrx() { MessageType = "FuelSaleTrx", ApplicationSender = sr.ApplicationSender, WorkstationID = sr.WorkstationID, MessageID = sr.RequestID, //? FDCdata = new FDCMessageFDCdataFuelSaleTrx[] { fdcData }, }; var builder = new StringBuilder(); using (var writer = new StringWriter(builder)) { serializer.Serialize(writer, fdcMessageFuelSaleTrx); } string derivedXml = builder.ToString(); if (OnGetFuelSaleTrxDetails != null) { var eventPayload = new FuelSaleTrxEventArgs( transactionSeqNum, fuellingSeqNum, transactionState, completionReason, deviceType, deviceId, nozzleId, volume, amount, price, fuelMode, trxStartDateTime, trxEndDateTime, lockingAS, authAS, DSPFields, CRCMode, MIDLinesNarrow, MIDLinesWide, releaseToken, reservingDeviceId, fuellingType, derivedXml) { FuelPeriodSequenceNo = Convert.ToInt32(deviceClass.FuelPeriodSequenceNo) }; OnGetFuelSaleTrxDetails(this, eventPayload); } if (OnFuelSaleTrx != null) { var eventPayload = new FuelSaleTrxEventArgs( transactionSeqNum, fuellingSeqNum, transactionState, completionReason, deviceType, deviceId, nozzleId, volume, amount, price, fuelMode, trxStartDateTime, trxEndDateTime, lockingAS, authAS, DSPFields, CRCMode, MIDLinesNarrow, MIDLinesWide, releaseToken, reservingDeviceId, fuellingType, derivedXml) { FuelPeriodSequenceNo = Convert.ToInt32(deviceClass.FuelPeriodSequenceNo) }; OnFuelSaleTrx(this, eventPayload); } } else DebugLog("no fuel sale details anymore"); } clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, true); } DebugLog("GetFuelSaleTrxDetailsResp end"); } catch (Exception ex) { DebugLog("GetFuelSaleTrxDetailsResp Exception! " + ex); } } private void GetFuelSaleTrxDetailsResp(int requestId, string sOverallResult, ServiceResponseGetFuelSaleTrxDetailsV03 sr) { try { DebugLog("GetFuelSaleTrxDetailsRespV03 init"); if (sr.FDCdata == null || sr.FDCdata[0].DeviceClass == null) { DebugLog("no fuel sale details - end"); return; } if ((OnGetFuelSaleTrxDetails != null || OnFuelSaleTrx != null) && sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) { for (int i = 0; i < sr.FDCdata[0].DeviceClass.Length; i++) { DebugLog(string.Format("type={0}, id={1}, nozzle={2}, amount={3}, vol={4}", sr.FDCdata[0].DeviceClass[i].Type, sr.FDCdata[0].DeviceClass[i].DeviceID, sr.FDCdata[0].DeviceClass[i].NozzleNo, sr.FDCdata[0].DeviceClass[i].Amount, sr.FDCdata[0].DeviceClass[i].Volume)); string deviceType = sr.FDCdata[0].DeviceClass[0].Type; int transactionSeqNum = Convert.ToInt32(sr.FDCdata[0].DeviceClass[i].TransactionNo); int deviceId = Convert.ToInt16(sr.FDCdata[0].DeviceClass[i].DeviceID); Wayne.FDCPOSLibrary.FuellingState transactionState = convertFuellingState(sr.FDCdata[0].DeviceClass[i].State); int completionReason = 0; int nozzleId = Convert.ToInt16(sr.FDCdata[0].DeviceClass[i].NozzleNo); decimal volume = FDCConvert.ToDecimal(sr.FDCdata[0].DeviceClass[i].Volume); decimal amount = FDCConvert.ToDecimal(sr.FDCdata[0].DeviceClass[i].Amount); decimal price = FDCConvert.ToDecimal(sr.FDCdata[0].DeviceClass[i].UnitPrice); int fuelMode = Convert.ToInt16(sr.FDCdata[0].DeviceClass[i].FuelMode); DateTime trxStartDateTime = Convert.ToDateTime(sr.FDCdata[0].DeviceClass[i].StartTimeStamp); DateTime trxEndDateTime = Convert.ToDateTime(sr.FDCdata[0].DeviceClass[i].EndTimeStamp); string lockingAS = ""; string authAS = ""; string DSPFields = sr.FDCdata[0].DeviceClass[i].DSPFields; string CRCMode = sr.FDCdata[0].DeviceClass[i].CRCMode; string MIDLinesNarrow = ""; string MIDLinesWide = ""; int authId; try { var token = AuthReleaseTokenFactory.GenerateToken(sr.FDCdata[0].DeviceClass[i].ReleaseToken); authId = token.AuthorizationId; } catch { authId = 0; } if (OnGetFuelSaleTrxDetails != null) OnGetFuelSaleTrxDetails(this, new FuelSaleTrxEventArgs(transactionSeqNum, 0, transactionState, completionReason, deviceType, deviceId, nozzleId, volume, amount, price, fuelMode, trxStartDateTime, trxEndDateTime, lockingAS, authAS, DSPFields, CRCMode, MIDLinesNarrow, MIDLinesWide, authId, 0, FuellingType.Unknown)); if (OnFuelSaleTrx != null) OnFuelSaleTrx(this, new FuelSaleTrxEventArgs(transactionSeqNum, 0, transactionState, completionReason, deviceType, deviceId, nozzleId, volume, amount, price, fuelMode, trxStartDateTime, trxEndDateTime, lockingAS, authAS, DSPFields, CRCMode, MIDLinesNarrow, MIDLinesWide, authId, 0, FuellingType.Unknown)); } clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, true); } DebugLog("GetFuelSaleTrxDetailsResp end"); } catch (Exception ex) { DebugLog("GetFuelSaleTrxDetailsResp Exception! " + ex); } } public void GetProductTable(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetProductTable sr = new ServiceRequestGetProductTable(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetProductTable posDataElem = new ServiceRequestPOSdataGetProductTable(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataGetProductTable[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetProductTable Exception! " + ex); } } private void GetProductTableResp(int requestId, string sOverallResult, ServiceResponseGetProductTable sr) { try { DebugLog("GetProductTableResp init"); if (sr == null || (sr.OverallResult != OverallResult.Success.ToString() && sr.OverallResult != "") || sr.FDCdata == null || sr.FDCdata.Length == 0 || sr.FDCdata[0].FuelProducts == null || sr.FDCdata[0].FuelProducts.Length == 0 || sr.FDCdata[0].FuelProducts[0].Product == null || sr.FDCdata[0].FuelProducts[0].Product.Length == 0) { DebugLog("error in ServiceResponseGetProductTable"); } //manage getConfigurationData clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, true, sr); DebugLog("GetProductTableResp end"); } catch (Exception ex) { DebugLog("GetProductTableResp Exception! " + ex); } } public void GetModeTable(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetModeTable sr = new ServiceRequestGetModeTable(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetModeTable posDataElem = new ServiceRequestPOSdataGetModeTable(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataGetModeTable[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetModeTable Exception! " + ex); } } private void GetModeTableResp(int requestId, string sOverallResult, ServiceResponseGetModeTable sr) { try { DebugLog("GetModeTableResp init"); DebugLog("GetModeTableResp end"); } catch (Exception ex) { DebugLog("GetModeTableResp Exception! " + ex); } } public void GetFuelMode(int pumpId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetFuelMode srV07 = new ServiceRequestGetFuelMode(); ServiceRequestGetFPFuelMode sr = new ServiceRequestGetFPFuelMode(); srV07.ApplicationSender = this.clientSocket.applicationSender; srV07.WorkstationID = this.clientSocket.workstationID; sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetFuelMode posDataElem = new ServiceRequestPOSdataGetFuelMode(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = (pumpId == -1) ? "*" : Convert.ToString(pumpId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetFuelMode[] posDataArray = { posDataElem }; srV07.POSdata = posDataArray; sr.POSdata = posDataArray; if (FDCGlobal.ProtocolVersion <= FDCVersion.V0007) clientSocket.ifsfMessages.EnqueueMessage(srV07, requestCompleted, userToken, src, true, 30000); else clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetFuelMode Exception! " + ex); } } private void GetFuelModeResp(int requestId, string sOverallResult, ServiceResponseFDCdataGetFuelMode[] fdcData) { try { DebugLog("GetFuelModeResp init"); if (fdcData == null || fdcData[0].DeviceClass == null) { DebugLog("no device available - end"); return; } // TO ADD if (OnFuelModeChange != null) { string deviceType = fdcData[0].DeviceClass[0].Type; int deviceId = Convert.ToInt16(fdcData[0].DeviceClass[0].DeviceID); int mode = 0; if (fdcData[0].DeviceClass[0].FuelMode.ModeNo != null) mode = Convert.ToInt16(fdcData[0].DeviceClass[0].FuelMode.ModeNo); else mode = Convert.ToInt16(fdcData[0].DeviceClass[0].ModeNo); DebugLog("Trigger FuelModeChanged"); OnFuelModeChange.Fire(this, new FuelModeChangedEventArgs(deviceType, deviceId, mode)); } if (OnOperationModeChange != null) { var deviceType = fdcData[0].DeviceClass[0].Type; int deviceId = Convert.ToInt16(fdcData[0].DeviceClass[0].DeviceID); if (fdcData[0].DeviceClass[0].FuelMode.OperationModeSpecified) { var mode = Convert.ToUInt16(fdcData[0].DeviceClass[0].FuelMode.OperationMode); DebugLog("Trigger OperationModeChanged"); OnOperationModeChange.Fire(this, new OperationModeChangedEventArgs(deviceType, deviceId, mode)); } } clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString()); DebugLog("GetFuelModeResp end"); } catch (Exception ex) { DebugLog("GetFuelModeResp Exception! " + ex); } } public void GetConfiguration(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetConfiguration sr = new ServiceRequestGetConfiguration(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetConfiguration posDataElem = new ServiceRequestPOSdataGetConfiguration(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataGetConfiguration[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetConfiguration Exception! " + ex); } } private void GetConfigurationResp(int requestId, string sOverallResult, ServiceResponseGetConfiguration sr) { try { DebugLog("GetConfigurationResp init: INVALID FOR V7 !"); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == "Success", sr); DebugLog("GetConfigurationResp end"); } catch (Exception ex) { DebugLog("GetConfigurationResp Exception! " + ex); } } public void GetDSPConfiguration(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetDSPConfiguration sr = new ServiceRequestGetDSPConfiguration(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetConfiguration posDataElem = new ServiceRequestPOSdataGetConfiguration(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataGetConfiguration[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetDSPConfiguration Exception! " + ex); } } private void GetDSPConfigurationResp(int requestId, string sOverallResult, ServiceResponseGetDSPConfiguration sr) { try { DebugLog("GetDSPConfigurationResp init"); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == FDCPOSLibrary.OverallResult.Success.ToString(), sr); DebugLog("GetDSPConfigurationResp end"); } catch (Exception ex) { DebugLog("GetDSPConfigurationResp Exception! " + ex); } } public void GetTLGConfiguration(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetTLGConfiguration sr = new ServiceRequestGetTLGConfiguration(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetConfiguration posDataElem = new ServiceRequestPOSdataGetConfiguration(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataGetConfiguration[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetTLGConfiguration Exception! " + ex); } } private void GetTLGConfigurationResp(int requestId, string sOverallResult, ServiceResponseGetTLGConfiguration sr) { try { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString(), sr); DebugLog("GetTLGConfigurationResp end"); } catch (Exception ex) { DebugLog("GetTLGConfigurationResp Exception! " + ex); } } private void SetConfigurationResp(int requestId, string sOverallResult, ServiceResponseSetConfiguration sr) { try { DebugLog("SetConfigurationResp init"); DebugLog("SetConfigurationResp end"); } catch (Exception ex) { DebugLog("SetConfigurationResp Exception! " + ex); } } public void LockNozzle(int deviceId, int nozzleNo, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestLockNozzle sr = new ServiceRequestLockNozzle(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataLockNozzle posDataElem = new ServiceRequestPOSdataLockNozzle(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassLockNozzle deviceClass = new ServiceRequestDeviceClassLockNozzle(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; deviceClass.NozzleNo = (nozzleNo == -1) ? "*" : Convert.ToString(nozzleNo); posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataLockNozzle[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("LockNozzle Exception! " + ex); } } private void LockNozzleResp(int requestId, string sOverallResult, ServiceResponseLockNozzle sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass.ErrorCode; DebugLog(string.Format("LockNozzleResp type={0}, id={1}, nozzleNo={2}, errorCode={3}", sr.FDCdata[0].DeviceClass.Type, sr.FDCdata[0].DeviceClass.DeviceID, sr.FDCdata[0].DeviceClass.NozzleNo, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == FDCPOSLibrary.OverallResult.Success.ToString()); DebugLog(string.Format("LockNozzleResp end")); } catch (Exception ex) { DebugLog("LockNozzleResp Exception! " + ex); } } public void UnlockNozzle(int deviceId, int nozzleNo, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestUnlockNozzle sr = new ServiceRequestUnlockNozzle(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataUnlockNozzle posDataElem = new ServiceRequestPOSdataUnlockNozzle(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassUnlockNozzle deviceClass = new ServiceRequestDeviceClassUnlockNozzle(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = Wayne.FDCPOSLibrary.DeviceType.DT_FuellingPoint; deviceClass.NozzleNo = (nozzleNo == -1) ? "*" : Convert.ToString(nozzleNo); posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataUnlockNozzle[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("UnlockNozzle Exception! " + ex); } } private void UnlockNozzleResp(int requestId, string sOverallResult, ServiceResponseUnlockNozzle sr) { try { string errorCode = (sr.FDCdata[0].FDCStatus != null) ? sr.FDCdata[0].FDCStatus : sr.FDCdata[0].DeviceClass.ErrorCode; DebugLog(string.Format("UnlockNozzleResp type={0}, id={1}, nozzleNo={2}, errorCode{3}", sr.FDCdata[0].DeviceClass.Type, sr.FDCdata[0].DeviceClass.DeviceID, sr.FDCdata[0].DeviceClass.NozzleNo, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("UnlockNozzleResp end"); } catch (Exception ex) { DebugLog("UnlockNozzleResp Exception! " + ex); } } public void GetCountrySettings(EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetCountrySettings sr = new ServiceRequestGetCountrySettings(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetCountrySettings posDataElem = new ServiceRequestPOSdataGetCountrySettings(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestPOSdataGetCountrySettings[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetCountrySettings Exception! " + ex); } } private void GetCountrySettingsResp(int requestId, string sOverallResult, ServiceResponseGetCountrySettings sr) { try { DebugLog("GetCountrySettingsResp init"); if (sr.FDCdata[0].DecimalSign != null) FDCConvert.DecimalSeparator = sr.FDCdata[0].DecimalSign; if (sr.FDCdata[0].ThousandDelimiter != null) FDCConvert.ThousandSeparator = sr.FDCdata[0].ThousandDelimiter; clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, true, sr); this.clientSocket.mainConnectionState = DeviceConnectionState.Connected; DebugLog(string.Format("GetCountrySettingsResp end: DecimalSeparator={0}, ThousandSeparator={1}, connectionState={2}", FDCConvert.DecimalSeparator, FDCConvert.ThousandSeparator, this.clientSocket.mainConnectionState)); } catch (Exception ex) { DebugLog("GetCountrySettingsResp Exception! " + ex); } } public void GetDSPLimits(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetDSPLimits sr = new ServiceRequestGetDSPLimits(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetDSPLimits posDataElem = new ServiceRequestPOSdataGetDSPLimits(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = (deviceId == -1) ? "*" : Convert.ToString(deviceId); deviceClass.Type = Wayne.FDCPOSLibrary.DeviceType.DT_FuelDispenser; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetDSPLimits[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetDSPLimits Exception! " + ex); } } private void GetDSPLimitsResp(int requestId, string sOverallResult, ServiceResponseGetDSPLimits sr) { try { if (sr.FDCdata[0] != null && sr.FDCdata[0].DeviceClass != null) for (int i = 0; i < sr.FDCdata[0].DeviceClass.Length; i++) { DebugLog(string.Format("GetDSPLimitsResp type={0}, id={1}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[i].DeviceID)); } DebugLog("GetDSPLimitsResp end"); } catch (Exception ex) { DebugLog("GetDSPLimitsResp Exception! " + ex); } } public void ChangeDSPLimits(int deviceId, int productNo, int modeNo, double maxTrxAmount, double maxTrxVolume, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestChangeDSPLimits sr = new ServiceRequestChangeDSPLimits(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataChangeDSPLimits posDataElem = new ServiceRequestPOSdataChangeDSPLimits(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassChangeDSPLimits deviceClass = new ServiceRequestDeviceClassChangeDSPLimits(); deviceClass.DeviceID = (deviceId == -1) ? "*" : Convert.ToString(deviceId); deviceClass.Type = Wayne.FDCPOSLibrary.DeviceType.DT_FuelDispenser; deviceClass.ProductNo = Convert.ToString(productNo); deviceClass.ModeNo = Convert.ToString(modeNo); System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo(); provider.NumberDecimalSeparator = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator; provider.NumberGroupSeparator = System.Globalization.NumberFormatInfo.CurrentInfo.NumberGroupSeparator; provider.NumberGroupSizes = System.Globalization.NumberFormatInfo.CurrentInfo.NumberGroupSizes; deviceClass.MaxTrxAmount = string.Format(provider, "{0:F2}", maxTrxAmount); provider.NumberDecimalDigits = 3; deviceClass.MaxTrxVolume = string.Format(provider, "{0:F3}", maxTrxVolume); posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataChangeDSPLimits[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("ChangeDSPLimits Exception! " + ex); } } private void ChangeDSPLimitsResp(int requestId, string sOverallResult, ServiceResponseChangeDSPLimits sr) { try { DebugLog("ChangeDSPLimitsResp init"); DebugLog("ChangeDSPLimitsResp end"); } catch (Exception ex) { DebugLog("ChangeDSPLimitsResp Exception! " + ex); } } public void SuspendFuelling(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestSuspendFuelling sr = new ServiceRequestSuspendFuelling(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataSuspendFuelling posDataElem = new ServiceRequestPOSdataSuspendFuelling(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataSuspendFuelling[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("SuspendFuelling Exception! " + ex); } } private void SuspendFuellingResp(int requestId, string sOverallResult, ServiceResponseSuspendFuelling sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass[0].ErrorCode; DebugLog(string.Format("SuspendFuellingResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[0].DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("SuspendFuellingResp end"); } catch (Exception ex) { DebugLog("SuspendFuellingResp Exception! " + ex); } } public void ResumeFuelling(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestResumeFuelling sr = new ServiceRequestResumeFuelling(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataResumeFuelling posDataElem = new ServiceRequestPOSdataResumeFuelling(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataResumeFuelling[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("ResumeFuelling Exception! " + ex); } } private void ResumeFuellingResp(int requestId, string sOverallResult, ServiceResponseResumeFuelling sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass[0].ErrorCode; DebugLog(string.Format("ResumeFuellingResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[0].DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("ResumeFuellingResp end"); } catch (Exception ex) { DebugLog("ResumeFuellingResp Exception! " + ex); } } public void StopFuelPoint(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestStopFuelPoint sr = new ServiceRequestStopFuelPoint(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataStopFuelPoint posDataElem = new ServiceRequestPOSdataStopFuelPoint(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; deviceClass.CreateZeroSale = Convert.ToString(false); if (src is FUSIONPump) { FUSIONPump p = (FUSIONPump)src; if (p.State == PumpState.Fuelling) deviceClass.CreateZeroSale = Convert.ToString(true); } posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataStopFuelPoint[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("StopFuelPoint Exception! " + ex); } } private void StopFuelPointResp(int requestId, string sOverallResult, ServiceResponseStopFuelPoint sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass[0].ErrorCode; DebugLog(string.Format("StopFuelPointResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[0].DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("StopFuelPointResp end"); } catch (Exception ex) { DebugLog("StopFuelPointResp Exception! " + ex); } } public void StartFuelPoint(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestStartFuelPoint sr = new ServiceRequestStartFuelPoint(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataStartFuelPoint posDataElem = new ServiceRequestPOSdataStartFuelPoint(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataStartFuelPoint[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("StartFuelPoint Exception! " + ex); } } private void StartFuelPointResp(int requestId, string sOverallResult, ServiceResponseStartFuelPoint sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass[0].ErrorCode; DebugLog(string.Format("StartFuelPointResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[0].DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("StartFuelPointResp end"); } catch (Exception ex) { DebugLog("StartFuelPointResp Exception! " + ex); } } public void LockTank(int deviceId, int tankNo, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestLockTank sr = new ServiceRequestLockTank(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataLockTank posDataElem = new ServiceRequestPOSdataLockTank(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassLockTank deviceClass = new ServiceRequestDeviceClassLockTank(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.TankNo = Convert.ToString(tankNo); deviceClass.Type = DeviceType.DT_TankProbe; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataLockTank[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("LockTank Exception! " + ex); } } private void LockTankResp(int requestId, string sOverallResult, ServiceResponseLockTank sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass[0].ErrorCode; DebugLog(string.Format("LockTankResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[0].DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("LockTankResp end"); } catch (Exception ex) { DebugLog("LockTankResp Exception! " + ex); } } public void UnlockTank(int deviceId, int tankNo, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestUnlockTank sr = new ServiceRequestUnlockTank(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataUnlockTank posDataElem = new ServiceRequestPOSdataUnlockTank(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassUnlockTank deviceClass = new ServiceRequestDeviceClassUnlockTank(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.TankNo = Convert.ToString(tankNo); deviceClass.Type = Wayne.FDCPOSLibrary.DeviceType.DT_TankProbe; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataUnlockTank[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("UnlockTank Exception! " + ex); } } private void UnlockTankResp(int requestId, string sOverallResult, ServiceResponseUnlockTank sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass[0].ErrorCode; DebugLog(string.Format("UnlockTankResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass[0].Type, sr.FDCdata[0].DeviceClass[0].DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("UnlockTankResp end"); } catch (Exception ex) { DebugLog("UnlockTankResp Exception! " + ex); } } public void GetTankData(int deviceId, int tankNo, EventHandler> requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetTankData sr = new ServiceRequestGetTankData(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetTankData posDataElem = new ServiceRequestPOSdataGetTankData(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassGetTankData deviceClass = new ServiceRequestDeviceClassGetTankData(); deviceClass.DeviceID = (deviceId == -1) ? "*" : Convert.ToString(deviceId); // Not standard deviceClass.Type = DeviceType.DT_TankProbe; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetTankData[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; EventHandler proxy = (sender, e) => requestCompleted(sender, (AsyncCompletedEventArgs)e); clientSocket.ifsfMessages.EnqueueMessage(sr, proxy, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetTankData Exception! " + ex); } } private void GetTankDataResp(int requestId, string sOverallResult, ServiceResponseGetTankData sr, string originalXml) { try { ServiceResponseDeviceClassGetTankData tankdata = sr.FDCdata[0].DeviceClass[0]; DebugLog(string.Format("GetTankDataResp init: tank={0}, date={1}", tankdata.TankNo, sr.FDCdata[0].FDCTimeStamp)); DateTime date; try { date = Convert.ToDateTime(sr.FDCdata[0].FDCTimeStamp); } catch (Exception ex) { DebugLog("GetTankDataResp: Exception! " + ex); DebugLog("GetTankDataResp: set datetime to now"); date = DateTime.Now; } string errorCode = sr.FDCdata[0].FDCStatus ?? tankdata.ErrorCode; ProbeState probeState = (errorCode != ErrorCode.ERRCD_OK.ToString()) || tankdata.DeviceState != null && convertLogicalDeviceState(tankdata.DeviceState) != LogicalDeviceState.FDC_READY ? ProbeState.Failed : ProbeState.Ok; FUSIONTankReading tankreading; if (probeState == ProbeState.Ok) { tankreading = new FUSIONTankReading(Convert.ToInt32(tankdata.TankNo), probeState, date, FDCConvert.ToDecimal( tankdata.MeasurementData.ProductLevel) / 1000, FDCConvert.ToDecimal( tankdata.MeasurementData .TotalObservedVolume), 0, FDCConvert.ToDecimal( tankdata.MeasurementData.WaterLevel) / 1000, FDCConvert.ToDecimal( tankdata.MeasurementData.WaterVolume), FDCConvert.ToDecimal( tankdata.MeasurementData.AverageTemp), UnitOfMeasure.Liters, UnitOfMeasure.Liters, false, originalXml); DebugLog(string.Format("GetTankDataResp data received: tank={0}, state={1}, fuelLevel={2}, fuelVolume={3}, waterLevel={4}, waterVolume={5}, temperature={6}", tankdata.TankNo, tankdata.MeasurementData.TPStatus, tankdata.MeasurementData.ProductLevel, tankdata.MeasurementData.TotalObservedVolume, tankdata.MeasurementData.WaterLevel, tankdata.MeasurementData.WaterVolume, tankdata.MeasurementData.AverageTemp)); } else { tankreading = new FUSIONTankReading(Convert.ToInt32(tankdata.TankNo), probeState, date, 0, 0, 0, 0, 0, 0, UnitOfMeasure.Liters, UnitOfMeasure.Liters, false, originalXml); DebugLog(string.Format("GetTankDataResp data received: tank={0}, probestate={1}", tankdata.TankNo, probeState)); } clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString(), (ITankReadingEx)tankreading); DebugLog("GetTankDataResp end"); } catch (Exception ex) { DebugLog("GetTankDataResp Exception! " + ex); } } public void GetTankReconciliation(int deviceId, EventHandler> requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetTankReconciliation sr = new ServiceRequestGetTankReconciliation(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetTankReconciliation posDataElem = new ServiceRequestPOSdataGetTankReconciliation(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassGetTankReconciliation deviceClass = new ServiceRequestDeviceClassGetTankReconciliation(); deviceClass.DeviceID = deviceId.ToString(); deviceClass.Type = DeviceType.DT_TankProbe; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetTankReconciliation[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; EventHandler proxy = (sender, e) => requestCompleted(sender, (AsyncCompletedEventArgs)e); clientSocket.ifsfMessages.EnqueueMessage(sr, proxy, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetTankReconciliation Exception! " + ex); } } private void GetTankReconciliationResp(int requestId, string sOverallResult, ServiceResponseGetTankReconciliation sr, string originalXml) { try { DebugLog("GetTankReconciliation init"); var tankReconciliation = new TankReconciliation(originalXml); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString(), (ITankReconciliation)tankReconciliation); DebugLog("GetTank ReconciliationResp end"); } catch (Exception ex) { DebugLog("GetTankReconciliation Exception! " + ex); } } public void GetTankDelivery(int deviceId, EventHandler> requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestGetTankDelivery sr = new ServiceRequestGetTankDelivery(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataGetTankDelivery posDataElem = new ServiceRequestPOSdataGetTankDelivery(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassGetTankDelivery deviceClass = new ServiceRequestDeviceClassGetTankDelivery(); deviceClass.DeviceID = deviceId.ToString(); deviceClass.Type = DeviceType.DT_TankProbe; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetTankDelivery[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; EventHandler proxy = (sender, e) => requestCompleted(sender, (AsyncCompletedEventArgs)e); clientSocket.ifsfMessages.EnqueueMessage(sr, proxy, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetTankDelivery Exception! " + ex); } } private void GetTankDeliveryResp(int requestId, string sOverallResult, ServiceResponseGetTankDelivery sr, string originalXml) { try { DebugLog("GetTankDelivery init"); var tankDelivery = new TankDelivery(originalXml); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString(), (ITankDelivery)tankDelivery); DebugLog("GetTankDeliveryResp end"); } catch (Exception ex) { DebugLog("GetTankDelivery Exception! " + ex); } } public void GetPumpTotals(ServiceRequestDeviceClassGetFuelPointTotals deviceClass, EventHandler> requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object DebugLog("Request all pump totals from Fusion"); var sr = new ServiceRequestGetFuelPointTotals(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; var posDataElem = new ServiceRequestPOSdataGetFuelPointTotals(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataGetFuelPointTotals[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; EventHandler completed = (sender, e) => requestCompleted(sender, (AsyncCompletedEventArgs)e); clientSocket.ifsfMessages.EnqueueMessage(sr, completed, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetFuelPrices Exception! " + ex); } } public void GetFuelPrices(EventHandler>> requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object DebugLog("Request all prices from Fusion"); var sr = new ServiceRequestGetFuelPrices(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; var posDataElem = new ServiceRequestPOSdataGetFuelPrices(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); var product = new ServiceRequestProductGetFuelPrices(); product.ProductNo = "*"; var products = new ServiceRequestProductGetFuelPrices[] { product }; posDataElem.Product = products; ServiceRequestPOSdataGetFuelPrices[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; EventHandler completed = (sender, e) => requestCompleted(sender, (AsyncCompletedEventArgs>)e); clientSocket.ifsfMessages.EnqueueMessage(sr, completed, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("GetFuelPrices Exception! " + ex); } } private void GetFuelPricesResp(int requestId, string sOverallResult, ServiceResponseGetFuelPrices sr) { try { DebugLog("GetFuelPriceResp: init"); var fuelPriceReadings = new List(); if (sr.FDCdata != null && sr.FDCdata[0].Prices != null && sr.FDCdata[0].Prices.Length > 0) { DebugLog("GetFuelPriceResp: Prices received from Fusion"); foreach (var product in sr.FDCdata[0].Prices) { if (product.FuelPrice != null && product.FuelPrice.Length > 0) { foreach (var mode in product.FuelPrice) { int productNo = Convert.ToInt32(product.ProductNo); decimal price = FDCConvert.ToDecimal(mode.Price); string fuelName = product.ProductName; var priceGroup = manager.forecourtControl.ForecourtConfiguration.GetPriceGroup(Convert.ToInt32(mode.ModeNo), FuellingType.OptCardPaid); if (string.IsNullOrEmpty(fuelName)) fuelName = string.Empty; DebugLog(string.Format("GetFuelPricesResp: Grade={0}, PriceGroup={1} , Price={2} , FuelName={3}", productNo, priceGroup, price, fuelName)); fuelPriceReadings.Add(new FuelPriceReading(productNo, priceGroup, price, fuelName)); } } } } clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString(), (IList)fuelPriceReadings); DebugLog("GetFuelPricesResp end"); } catch (Exception ex) { DebugLog("GetFuelPricesResp Exception! " + ex); } } public void ReserveFuelPoint(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestReserveFuelPoint sr = new ServiceRequestReserveFuelPoint(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataReserveFuelPoint posDataElem = new ServiceRequestPOSdataReserveFuelPoint(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataReserveFuelPoint[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("ReserveFuelPoint Exception! " + ex); } } private void ReserveFuelPointResp(int requestId, string sOverallResult, ServiceResponseReserveFuelPoint sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass.ErrorCode; DebugLog(string.Format("ReserveFuelPointResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass.Type, sr.FDCdata[0].DeviceClass.DeviceID, errorCode)); if ((errorCode == ErrorCode.ERRCD_OK.ToString()) && (sOverallResult == OverallResult.Success.ToString())) { // Ok so far, but wait for unsolicited FPStateChange before making decision about success. DebugLog(string.Format("Waiting for unsolicited FPStateChange, RequestId={0}.", requestId)); unsolicitedFPStateChangeDictionary[Convert.ToInt16(sr.FDCdata[0].DeviceClass.DeviceID)] = requestId; } else { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, false); DebugLog("ReserveFuelPointResp end"); } } catch (Exception ex) { DebugLog("ReserveFuelPointResp Exception! " + ex); } } public void FreeFuelPoint(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestFreeFuelPoint sr = new ServiceRequestFreeFuelPoint(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataFreeFuelPoint posDataElem = new ServiceRequestPOSdataFreeFuelPoint(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = Wayne.FDCPOSLibrary.DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataFreeFuelPoint[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("FreeFuelPoint Exception! " + ex); } } public void StartFuelPointTest(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestStartFuelPointTest sr = new ServiceRequestStartFuelPointTest(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataStartFuelPointTest posDataElem = new ServiceRequestPOSdataStartFuelPointTest(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataStartFuelPointTest[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("StartFuelPointTest Exception! " + ex); } } public void EndFuelPointTest(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestEndFuelPointTest sr = new ServiceRequestEndFuelPointTest(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataEndFuelPointTest posDataElem = new ServiceRequestPOSdataEndFuelPointTest(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataEndFuelPointTest[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("EndFuelPointTest Exception! " + ex); } } public void OpenFuelPoint(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestOpenFuelPoint sr = new ServiceRequestOpenFuelPoint(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataOpenFuelPoint posDataElem = new ServiceRequestPOSdataOpenFuelPoint(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataOpenFuelPoint[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("OpenFuelPoint Exception! " + ex); } } public void OpenDevice(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestOpenDevice sr = new ServiceRequestOpenDevice(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataOpenFuelPoint posDataElem = new ServiceRequestPOSdataOpenFuelPoint(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataOpenFuelPoint[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("Exception! " + ex); } } public void CloseFuelPoint(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestCloseFuelPoint sr = new ServiceRequestCloseFuelPoint(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataCloseFuelPoint posDataElem = new ServiceRequestPOSdataCloseFuelPoint(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = Wayne.FDCPOSLibrary.DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataCloseFuelPoint[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("CloseFuelPoint Exception! " + ex); } } public void CloseDevice(int deviceId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestCloseDevice sr = new ServiceRequestCloseDevice(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataCloseFuelPoint posDataElem = new ServiceRequestPOSdataCloseFuelPoint(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClass deviceClass = new ServiceRequestDeviceClass(); deviceClass.DeviceID = Convert.ToString(deviceId); deviceClass.Type = DeviceType.DT_FuellingPoint; posDataElem.DeviceClass = deviceClass; ServiceRequestPOSdataCloseFuelPoint[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("CloseDevice Exception! " + ex); } } public void SetDeviceAlarm(string deviceType, int deviceId, IEnumerable alarmCodes, IEnumerable alarmMsgs, EventHandler requestCompleted, object userToken, object src) { try { var alarms = new List(); if (alarmCodes != null && alarmMsgs != null) { if (alarmCodes.Count() == alarmMsgs.Count()) { for (int i = 0; i < alarmCodes.Count(); i++) { var alarmElem = new ServiceRequestDeviceAlarmMsg { Number = Convert.ToString(alarmCodes.ElementAt(i)), Text = alarmMsgs.ElementAt(i) }; alarms.Add(alarmElem); } } else { foreach (var alarmCode in alarmCodes) { var alarmElem = new ServiceRequestDeviceAlarmMsg { Number = Convert.ToString(alarmCode), Text = alarmMsgs.First() }; alarms.Add(alarmElem); } } } var deviceClass = new ServiceRequestDeviceClassSetDeviceAlarm { DeviceID = Convert.ToString(deviceId), Type = deviceType, AlarmMsg = alarms.ToArray() }; var posDataElem = new ServiceRequestPOSdataSetDeviceAlarm { POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat), DeviceClass = deviceClass }; // create XML ServiceRequest object var sr = new ServiceRequestSetDeviceAlarm { ApplicationSender = this.clientSocket.applicationSender, WorkstationID = this.clientSocket.workstationID, POSdata = new[] { posDataElem } }; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("SetDeviceAlarm Exception! " + ex); } } public void SetDeviceAlarm(string deviceType, int deviceId, int alarmCode, string alarmMsg, EventHandler requestCompleted, object userToken, object src) { SetDeviceAlarm(deviceType, deviceId, new[] { alarmCode }, new[] { alarmMsg }, requestCompleted, userToken, src); } private void FreeFuelPointResp(int requestId, string sOverallResult, ServiceResponseFreeFuelPoint sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass.ErrorCode; DebugLog(string.Format("FreeFuelPointResp type={0}, id={1}, errorCode={2}", sr.FDCdata[0].DeviceClass.Type, sr.FDCdata[0].DeviceClass.DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); } catch (Exception ex) { DebugLog("FreeFuelPointResp Exception! " + ex); } } private void StartFuelPointTestResp(int requestId, string sOverallResult, ServiceResponseStartFuelPointTest sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass.ErrorCode; DebugLog(string.Format("StartFuelPointTestResp type={0}, id={1}, errorCode{2}", sr.FDCdata[0].DeviceClass.Type, sr.FDCdata[0].DeviceClass.DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("StartFuelPointTestResp end"); } catch (Exception ex) { DebugLog("StartFuelPointTestResp Exception! " + ex); } } private void EndFuelPointTestResp(int requestId, string sOverallResult, ServiceResponseEndFuelPointTest sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass.ErrorCode; DebugLog(string.Format("EndFuelPointTestResp type={0}, id={1}, errorCode{2}", sr.FDCdata[0].DeviceClass.Type, sr.FDCdata[0].DeviceClass.DeviceID, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("EndFuelPointTestResp end"); } catch (Exception ex) { DebugLog("EndFuelPointTestResp Exception! " + ex); } } private void OpenFuelPointResp(int requestId, string sOverallResult, ServiceResponseOpenFuelPoint sr) { try { string errorCode = sr.FDCdata[0].FDCStatus; DebugLog(string.Format("OpenFuelPointResp requestId={0}, errorCode={1}", requestId, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("OpenFuelPointResp end"); } catch (Exception ex) { DebugLog("OpenFuelPointResp Exception! " + ex); } } private void CloseFuelPointResp(int requestId, string sOverallResult, ServiceResponseCloseFuelPoint sr) { try { string errorCode = sr.FDCdata[0].FDCStatus; DebugLog(string.Format("CloseFuelPointResp requestId={0}, errorCode={1}", requestId, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("CloseFuelPointResp end"); } catch (Exception ex) { DebugLog("CloseFuelPointResp Exception! " + ex); } } private void OpenDeviceResp(int requestId, string sOverallResult, ServiceResponseOpenDevice sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass[0].ErrorCode; DebugLog(string.Format("OpenDeviceResp requestId={0}, errorCode={1}", requestId, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("OpenDeviceResp end"); } catch (Exception ex) { DebugLog("OpenDeviceResp Exception! " + ex); } } private void CloseDeviceResp(int requestId, string sOverallResult, ServiceResponseCloseDevice sr) { try { string errorCode = sr.FDCdata[0].FDCStatus ?? sr.FDCdata[0].DeviceClass[0].ErrorCode; DebugLog(string.Format("CloseDeviceResp requestId={0}, errorCode={1}", requestId, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("CloseDeviceResp end"); } catch (Exception ex) { DebugLog("CloseDeviceResp Exception! " + ex); } } private void SetDeviceAlarmResp(int requestId, string sOverallResult, ServiceResponseSetDeviceAlarm sr) { try { string errorCode = sr.FDCdata[0].FDCStatus; DebugLog(string.Format("SetDeviceAlarmResp requestId={0}, errorCode={1}", requestId, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString() && sOverallResult == OverallResult.Success.ToString()); DebugLog("SetDeviceAlarmResp end"); } catch (Exception ex) { DebugLog("SetDeviceAlarmResp Exception! " + ex); } } public void OptAddSerialPort(int optId, string port, int baudRate, int dataBit, int stopBit, int parity, EventHandler requestCompleted, object userToken, object src) { try { DebugLog(string.Format("OptAddSerialPort init: tp={0}, port={1}", optId, port)); // create XML ServiceRequest object ServiceRequestOPTAdd sr = new ServiceRequestOPTAdd(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataOPTAdd posDataElem = new ServiceRequestPOSdataOPTAdd(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassOPTAdd optadd = new ServiceRequestDeviceClassOPTAdd(); optadd.DeviceID = (optId == -1) ? "*" : Convert.ToString(optId); optadd.Type = DeviceType.DT_OutdoorPaymentTerminal; ServiceRequestDeviceClassSerialPortOPTAdd serialPort = new ServiceRequestDeviceClassSerialPortOPTAdd(); serialPort.Port = port; serialPort.BaudRate = Convert.ToString(baudRate); serialPort.DataBit = Convert.ToString(dataBit); serialPort.StopBit = Convert.ToString(stopBit); serialPort.Parity = Convert.ToString(parity); optadd.serialPort = serialPort; posDataElem.DeviceClass = optadd; ServiceRequestPOSdataOPTAdd[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); DebugLog(string.Format("OptAddSerialPort end: tp={0}, port={1}", optId, port)); } catch (Exception ex) { DebugLog("OptAddSerialPort Exception! " + ex); } } public void OptAddTCP(int optId, string address, int port, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestOPTAdd sr = new ServiceRequestOPTAdd(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataOPTAdd posDataElem = new ServiceRequestPOSdataOPTAdd(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassOPTAdd optadd = new ServiceRequestDeviceClassOPTAdd(); optadd.DeviceID = (optId == -1) ? "*" : Convert.ToString(optId); optadd.Type = Wayne.FDCPOSLibrary.DeviceType.DT_OutdoorPaymentTerminal; ServiceRequestDeviceClassTCPOPTAdd tcp = new ServiceRequestDeviceClassTCPOPTAdd(); tcp.Address = address; tcp.Port = Convert.ToString(port); optadd.tcp = tcp; posDataElem.DeviceClass = optadd; ServiceRequestPOSdataOPTAdd[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("OptAddTCP Exception! " + ex); } } private void OptAddResp(int requestId, string sOverallResult, ServiceResponseOPTAdd sr) { try { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString()); } catch (Exception ex) { DebugLog("OptAddResp Exception! " + ex); } } public void OptRemove(int optId, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object ServiceRequestOPTRemove sr = new ServiceRequestOPTRemove(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataOPTRemove posDataElem = new ServiceRequestPOSdataOPTRemove(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassOPTRemove optRemove = new ServiceRequestDeviceClassOPTRemove(); optRemove.DeviceID = (optId == -1) ? "*" : Convert.ToString(optId); optRemove.Type = DeviceType.DT_OutdoorPaymentTerminal; posDataElem.DeviceClass = optRemove; ServiceRequestPOSdataOPTRemove[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; clientSocket.ifsfMessages.EnqueueMessage(sr, requestCompleted, userToken, src, true, 30000); } catch (Exception ex) { DebugLog("OptRemove Exception! " + ex); } } private void OptRemoveResp(int requestId, string sOverallResult, ServiceResponseOPTRemove sr) { try { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString()); } catch (Exception ex) { DebugLog("OptRemoveResp Exception! " + ex); } } public void OptWrite(int optId, byte[] message, EventHandler requestCompleted, object userToken, object src) { try { // create XML ServiceRequest object if (FDCGlobal.ProtocolVersion <= FDCVersion.V0007) { ServiceRequestOPTWriteV07 sr = new ServiceRequestOPTWriteV07(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataOPTWriteV07 posDataElem = new ServiceRequestPOSdataOPTWriteV07(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassOPTWriteV07 optwrite = new ServiceRequestDeviceClassOPTWriteV07(); optwrite.DeviceID = (optId == -1) ? "*" : Convert.ToString(optId); optwrite.Type = DeviceType.DT_OutdoorPaymentTerminal; optwrite.Message = message; posDataElem.DeviceClass = optwrite; ServiceRequestPOSdataOPTWriteV07[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; EventHandler proxy = (sender, e) => requestCompleted(sender, (OptWriteCompletedEventArgs)e); clientSocket.ifsfMessages.EnqueueMessage(sr, proxy, userToken, src, true, 30000); } else { ServiceRequestOPTWrite sr = new ServiceRequestOPTWrite(); sr.ApplicationSender = this.clientSocket.applicationSender; sr.WorkstationID = this.clientSocket.workstationID; ServiceRequestPOSdataOPTWrite posDataElem = new ServiceRequestPOSdataOPTWrite(); posDataElem.POSTimeStamp = DateTime.Now.ToString(FDCConvert.DateFormat); ServiceRequestDeviceClassOPTWrite optwrite = new ServiceRequestDeviceClassOPTWrite(); optwrite.DeviceID = (optId == -1) ? "*" : Convert.ToString(optId); optwrite.Type = DeviceType.DT_OutdoorPaymentTerminal; optwrite.Message = Encoding.UTF8.GetString(message, 0, message.GetLength(0)); ; posDataElem.DeviceClass = optwrite; ServiceRequestPOSdataOPTWrite[] posDataArray = { posDataElem }; sr.POSdata = posDataArray; EventHandler proxy = (sender, e) => requestCompleted(sender, (OptWriteCompletedEventArgs)e); clientSocket.ifsfMessages.EnqueueMessage(sr, proxy, userToken, src, true, 30000); } } catch (Exception ex) { DebugLog("OptWrite Exception! " + ex); } } private void OptWriteResp(int requestId, string sOverallResult, ServiceResponseOPTWrite sr) { try { clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, sOverallResult == OverallResult.Success.ToString()); } catch (Exception ex) { DebugLog("OptWriteResp Exception! " + ex); } } private void HeartbeatMsg() { try { // when the heartbeat is received the disconnection timer is reset (the timer that is activated when the heartbeat is no more received) DebugLog("Heartbeat message received"); heartbeat.ResetDisconnectionTimeout(); } catch (Exception ex) { DebugLog("HeartbeatMsg Exception! " + ex); } } private void DeviceStateChangeMsg(FDCMessageDeviceStateChange msg) { try { DebugLog(string.Format("DeviceStateChangeMsg init: type={0}, id={1}, state={2}, substate={3}", msg.FDCdata[0].DeviceClass[0].Type, msg.FDCdata[0].DeviceClass[0].DeviceID, msg.FDCdata[0].DeviceClass[0].LogicalState, msg.FDCdata[0].DeviceClass[0].LogicalSubState)); if (OnDeviceStateChange != null) { string deviceType = msg.FDCdata[0].DeviceClass[0].Type; int deviceId = Convert.ToInt16(msg.FDCdata[0].DeviceClass[0].DeviceID); LogicalDeviceState state = convertLogicalDeviceState(msg.FDCdata[0].DeviceClass[0].LogicalState); LogicalDeviceState substate = convertLogicalDeviceState(msg.FDCdata[0].DeviceClass[0].LogicalSubState); int nozzleUp = 0; if (msg.FDCdata[0].DeviceClass[0].Nozzle != null) { foreach (NozzleStateClass nozzleState in msg.FDCdata[0].DeviceClass[0].Nozzle) { if (nozzleState.LogicalNozzle == "NozzleUp") nozzleUp = Convert.ToInt32(nozzleState.NozzleNo); } } OnDeviceStateChange.Invoke(this, new DeviceStateChangedEventArgs(deviceType, deviceId, state, substate, "", nozzleUp)); } DebugLog("DeviceStateChangeMsg end"); } catch (Exception ex) { DebugLog("DeviceStateChangeMsg Exception! " + ex); } } private void FPStateChangeMsg(FDCMessageFPStateChange msg) { try { DebugLog(string.Format("FPStateChangeMsg: type={0}, id={1}, state={2}, substate={3}", msg.FDCdata[0].DeviceClass[0].Type, msg.FDCdata[0].DeviceClass[0].DeviceID, msg.FDCdata[0].DeviceClass[0].DeviceState, msg.FDCdata[0].DeviceClass[0].DeviceSubState)); int deviceId = Convert.ToInt16(msg.FDCdata[0].DeviceClass[0].DeviceID); int requestId; if (unsolicitedFPStateChangeDictionary.TryGetValue(deviceId, out requestId)) // Waiting for unsolicited FPStateChange? { string errorCode = msg.FDCdata[0].DeviceClass[0].ErrorCode; DebugLog(string.Format("Got unsolicited FPStateChange mapped to RequestId={0}, ErrorCode={1}", requestId, errorCode)); clientSocket.ifsfMessages.asyncResponseManager.SendResponse(requestId, errorCode == ErrorCode.ERRCD_OK.ToString()); unsolicitedFPStateChangeDictionary.Remove(deviceId); } if (OnDeviceStateChange != null) { string deviceType = msg.FDCdata[0].DeviceClass[0].Type; LogicalDeviceState state = convertLogicalDeviceState(msg.FDCdata[0].DeviceClass[0].DeviceState.DeviceState); LogicalDeviceState substate = convertLogicalDeviceState(msg.FDCdata[0].DeviceClass[0].DeviceSubState); if (!string.IsNullOrEmpty(msg.FDCdata[0].DeviceClass[0].DeviceState.Stopped) && XmlConvert.ToBoolean(msg.FDCdata[0].DeviceClass[0].DeviceState.Stopped)) substate = LogicalDeviceState.FDC_STOPPED; string lockingAS = msg.FDCdata[0].DeviceClass[0].LockingApplicationSender; int nozzleUp = 0; if (msg.FDCdata[0].DeviceClass[0].Nozzle != null) { foreach (NozzleStateClass nozzleState in msg.FDCdata[0].DeviceClass[0].Nozzle) { if (nozzleState.LogicalNozzle == "NozzleUp") nozzleUp = Convert.ToInt32(nozzleState.NozzleNo); } } OnDeviceStateChange.Invoke(this, new DeviceStateChangedEventArgs(deviceType, deviceId, state, substate, lockingAS, nozzleUp)); } DebugLog("FPStateChangeMsg end"); } catch (Exception ex) { DebugLog("FPStateChangeMsg Exception! " + ex); } } private void TPStateChangeMsg(FDCMessageTPStateChange msg) { try { DebugLog(string.Format("TPStateChangeMsg init: type={0}, id={1}, state={2}", msg.FDCdata[0].DeviceClass[0].Type, msg.FDCdata[0].DeviceClass[0].DeviceID, msg.FDCdata[0].DeviceClass[0].DeviceState)); if (OnDeviceStateChange != null) { string deviceType = msg.FDCdata[0].DeviceClass[0].Type; int deviceId = Convert.ToInt16(msg.FDCdata[0].DeviceClass[0].DeviceID); LogicalDeviceState state = convertLogicalDeviceState(msg.FDCdata[0].DeviceClass[0].DeviceState.DeviceState); OnDeviceStateChange.Invoke(this, new DeviceStateChangedEventArgs(deviceType, deviceId, state, LogicalDeviceState.FDC_UNDEFINED, "", 0)); } DebugLog("TPStateChangeMsg end"); } catch (Exception ex) { DebugLog("TPStateChangeMsg Exception! " + ex); } } private void VIRStateChangeMsg(FDCMessageVIRStateChange msg) { try { DebugLog(string.Format("VIRStateChangeMsg init: type={0}, id={1}, state={2}, substate={3}", msg.FDCdata[0].DeviceClass[0].Type, msg.FDCdata[0].DeviceClass[0].DeviceID, msg.FDCdata[0].DeviceClass[0].DeviceState, msg.FDCdata[0].DeviceClass[0].DeviceSubState)); if (OnVirStateChange != null) { int deviceId = Convert.ToInt16(msg.FDCdata[0].DeviceClass[0].DeviceID); if (msg.FDCdata[0].DeviceClass[0].Vir != null) { foreach (VIRStateClass virState in msg.FDCdata[0].DeviceClass[0].Vir) { var state = convertLogicalDeviceState(virState.DeviceState); DeviceConnectionState deviceState; if (state == LogicalDeviceState.FDC_READY) deviceState = DeviceConnectionState.Connected; else if (state == LogicalDeviceState.FDC_OFFLINE) deviceState = DeviceConnectionState.Disconnected; else deviceState = DeviceConnectionState.Unknown; DebugLog(string.Format("VIRStateChangeMsg: type={0}, id={1}, virID={2}, virstate={3}", msg.FDCdata[0].DeviceClass[0].Type, msg.FDCdata[0].DeviceClass[0].DeviceID, virState.VirID, virState.DeviceState)); OnVirStateChange(this, new VIRStateChangedEventArgs(deviceId, virState.VirID, deviceState)); } } } else DebugLog("OnVirStateChange == null"); DebugLog("VIRStateChangeMsg end"); } catch (Exception ex) { DebugLog("VIRStateChangeMsg Exception! " + ex); } } private void FDCStoppedMsg(FDCMessageStopped msg) { try { DebugLog("FDCStoppedMsg init"); this.clientSocket.mainConnectionState = DeviceConnectionState.Connecting; DebugLog("FDCStoppedMsg end"); } catch (Exception ex) { DebugLog("FDCStoppedMsg Exception! " + ex); } } private void FDCStartedMsg(FDCMessageStarted msg) { try { DebugLog("FDCStartedMsg init"); DebugLog("FDCStartedMsg end"); } catch (Exception ex) { DebugLog("FDCStartedMsg Exception! " + ex); } } private void TwinMasterReadyMsg(FDCMessageTwinMasterIsOn msg) { try { DebugLog("TwinMasterReadyMsg init"); if (OnTwinMasterReady != null) OnTwinMasterReady(this, null); DebugLog("TwinMasterReadyMsg end"); } catch (Exception ex) { DebugLog("TwinMasterReadyMsg Exception! " + ex); } } private void CurrentFuellingStatusMsg(FDCMessageCurrentFuellingStatus msg) { try { DebugLog(string.Format("CurrentFuellingStatusMsg init: type={0}, id={1}, volume={2}, amount={3}", msg.FDCdata[0].DeviceClass[0].Type, msg.FDCdata[0].DeviceClass[0].DeviceID, msg.FDCdata[0].DeviceClass[0].CurrentVolume, msg.FDCdata[0].DeviceClass[0].CurrentAmount)); if (OnCurrentFuellingStatus != null) { var deviceClass = msg.FDCdata[0].DeviceClass[0]; string deviceType = deviceClass.Type; int deviceId = Convert.ToInt16(deviceClass.DeviceID); int nozzleId; nozzleId = Convert.ToInt16(deviceClass.CurrentNozzleNo); if (nozzleId == 0) nozzleId = Convert.ToInt16(deviceClass.NozzleNo); Decimal volume; volume = FDCConvert.ToDecimal(deviceClass.CurrentVolume); if (volume == 0) volume = FDCConvert.ToDecimal(deviceClass.Volume); Decimal amount; amount = FDCConvert.ToDecimal(deviceClass.CurrentAmount); if (amount == 0) amount = FDCConvert.ToDecimal(deviceClass.Amount); Decimal price; price = FDCConvert.ToDecimal(deviceClass.CurrentUnitPrice); if (price == 0) price = FDCConvert.ToDecimal(deviceClass.UnitPrice); int releaseId; int reservingDeviceId; try { var token = AuthReleaseTokenFactory.GenerateToken(deviceClass.ReleaseToken); releaseId = token.AuthorizationId; reservingDeviceId = token.TerminalId; } catch { releaseId = 0; reservingDeviceId = 0; } var eventArgs = new CurrentFuellingStatusEventArgs(deviceType, deviceId, nozzleId, volume, amount, price, "") { ReleaseId = releaseId, ReservingDeviceId = reservingDeviceId, TransactionId = Convert.ToInt32(deviceClass.TransactionSeqNo), FuelPeriodSequenceNo = Convert.ToInt32(deviceClass.FuelPeriodSequenceNo) }; OnCurrentFuellingStatus(this, eventArgs); } DebugLog("CurrentFuellingStatusMsg end"); } catch (Exception ex) { DebugLog("CurrentFuellingStatusMsg Exception! " + ex); } } private void DeviceAlarmMsg(FDCMessageDeviceAlarm msg) { try { DebugLog(string.Format("DeviceAlarmMsg init: type={0}, id={1}", msg.FDCdata[0].DeviceClass[0].Type, msg.FDCdata[0].DeviceClass[0].DeviceID)); foreach (FDCMessageDeviceAlarmDeviceClass device in msg.FDCdata[0].DeviceClass) { var deviceType = device.Type; int deviceId = Convert.ToInt16(device.DeviceID); if (device.AlarmMsg != null && device.AlarmMsg.Length > 0) { foreach (FDCMessageDeviceAlarmMsg alarmmsg in device.AlarmMsg) { if (OnDeviceAlarm != null) { int alarmId = Convert.ToInt32(alarmmsg.Number); OnDeviceAlarm(this, new DeviceAlarmEventArgs(deviceType, deviceId, alarmId, alarmmsg.Text)); } } } else if (deviceType == "TP") // send empty message for Tank Probe { if (OnDeviceAlarm != null) { OnDeviceAlarm(this, new DeviceAlarmEventArgs(deviceType, deviceId, 0, "")); } } } DebugLog("DeviceAlarmMsg end"); } catch (Exception ex) { DebugLog("DeviceAlarmMsg Exception! " + ex); } } private void FuelSaleTrxMsg(FDCMessageFuelSaleTrx msg, string originalMessageXml) { try { DebugLog("FuelSaleTrxMsg init"); if (msg != null && msg.FDCdata != null && msg.FDCdata[0] != null && msg.FDCdata[0].DeviceClass != null) { FDCMessageDeviceClassFuelSaleTrx deviceClass = msg.FDCdata[0].DeviceClass; if (OnFuelSaleTrx != null) { DebugLog(string.Format("FuelSaleTrxMsg type={0}, id={1}, nozzle={2}, price={3}, amount={4}, vol={5}, authAS={6}, lockAS={7}", deviceClass.Type, deviceClass.DeviceID, deviceClass.NozzleNo, deviceClass.UnitPrice, deviceClass.Amount, deviceClass.Volume, deviceClass.AuthorisationApplicationSender, deviceClass.LockingApplicationSender)); string deviceType = deviceClass.Type; int deviceId = Convert.ToInt16(deviceClass.DeviceID); int nozzleId = Convert.ToInt16(deviceClass.NozzleNo); Decimal volume = FDCConvert.ToDecimal(deviceClass.Volume); Decimal amount = FDCConvert.ToDecimal(deviceClass.Amount); Decimal price = FDCConvert.ToDecimal(deviceClass.UnitPrice); int transactionSeqNum = Convert.ToInt32(deviceClass.TransactionSeqNo); // if fuelling sequence number not available, use transaction sequence number int fuellingSeqNum = string.IsNullOrEmpty(deviceClass.FuellingSequenceNo) ? transactionSeqNum : Convert.ToInt32(deviceClass.FuellingSequenceNo); Wayne.FDCPOSLibrary.FuellingState transactionState = convertFuellingState(deviceClass.State); int completionReason = string.IsNullOrEmpty(deviceClass.CompletionReason) ? 0 : convertCompletionReason(deviceClass.CompletionReason); int fuelMode = (deviceClass.FuelMode != null && deviceClass.FuelMode.ModeNo != null && deviceClass.FuelMode.ModeNo != "") ? Convert.ToInt32(deviceClass.FuelMode.ModeNo) : 0; DateTime trxStartDateTime = Convert.ToDateTime(deviceClass.StartTimeStamp); DateTime trxEndDateTime = Convert.ToDateTime(deviceClass.EndTimeStamp); string authAS = deviceClass.AuthorisationApplicationSender; string lockingAS = deviceClass.LockingApplicationSender; string DSPFields = deviceClass.DSPFields; string CRCMode = deviceClass.CRCMode; string MIDLinesNarrow = deviceClass.MIDLinesNarrow; string MIDLinesWide = deviceClass.MIDLinesWide; FuellingType fuellingType = (deviceClass.FuellingType == "") ? FuellingType.Unknown : ((FuellingType)Convert.ToInt16(deviceClass.FuellingType)); if (fuellingType == FuellingType.Unknown) { DebugLog("Fuelling of unkown type received. Converting to DetectedFromAccumulators!!!"); fuellingType = FuellingType.DetectedFromAccumulators; } int releaseToken; try { IReleaseToken token = AuthReleaseTokenFactory.GenerateToken(deviceClass.ReleaseToken); releaseToken = token.AuthorizationId; } catch { releaseToken = 0; } byte reservingDeviceId; try { reservingDeviceId = Convert.ToByte(deviceClass.ReservingDeviceId); } catch (Exception ex) { reservingDeviceId = 0; DebugLog("FuelSaleTrxMsg Exception! cannot convert ReservingDeviceId to Int32"); } var eventPayload = new FuelSaleTrxEventArgs( transactionSeqNum, fuellingSeqNum, transactionState, completionReason, deviceType, deviceId, nozzleId, volume, amount, price, fuelMode, trxStartDateTime, trxEndDateTime, lockingAS, authAS, DSPFields, CRCMode, MIDLinesNarrow, MIDLinesWide, releaseToken, reservingDeviceId, fuellingType, originalMessageXml) { FuelPeriodSequenceNo = Convert.ToInt32(deviceClass.FuelPeriodSequenceNo) }; OnFuelSaleTrx(this, eventPayload); } else DebugLog("FuelSaleTrxMsg OnFuelSaleTrx == null"); } else { if (msg == null) DebugLog("FuelSaleTrxMsg msg == null"); else if (msg.FDCdata == null) DebugLog("FuelSaleTrxMsg msg.FDCdata == null"); else if (msg.FDCdata[0] == null) DebugLog("FuelSaleTrxMsg msg.FDCdata[0] == null"); else if (msg.FDCdata[0].DeviceClass == null) DebugLog("FuelSaleTrxMsg msg.FDCdata[0].DeviceClass == null"); } DebugLog("FuelSaleTrxMsg end"); } catch (Exception ex) { DebugLog("FuelSaleTrxMsg Exception! " + ex); } } private void FuelPriceChangeMsg(FDCMessageFuelPriceChange msg) { try { DebugLog(string.Format("FuelPriceChangeMsg init: product={0}, modeno={1}, newprice={2}, oldprice={3}", msg.FDCdata[0].Product[0].ProductNo, msg.FDCdata[0].Product[0].FuelMode.ModeNo, msg.FDCdata[0].Product[0].FuelMode.NewPrice, msg.FDCdata[0].Product[0].FuelMode.OldPrice)); if (OnChangeFuelPrice != null) { OnChangeFuelPrice(this, new ChangeFuelPriceEventArgs(Convert.ToInt32(msg.FDCdata[0].Product[0].ProductNo), Convert.ToInt32(msg.FDCdata[0].Product[0].FuelMode.ModeNo), FDCConvert.ToDecimal(msg.FDCdata[0].Product[0].FuelMode.OldPrice), FDCConvert.ToDecimal(msg.FDCdata[0].Product[0].FuelMode.NewPrice))); } DebugLog("FuelPriceChangeMsg end"); } catch (Exception ex) { DebugLog("FuelPriceChangeMsg Exception! " + ex); } } private void FuelModeChangeMsg(FDCMessageFDCdataFuelModeChange fdcData) { try { DebugLog("FuelModeChangeMsg init"); foreach (FDCMessageDeviceClassFuelModeChange device in fdcData.DeviceClass) { if (OnFuelModeChange != null) { string deviceType = fdcData.DeviceClass[0].Type; int deviceId = Convert.ToInt16(fdcData.DeviceClass[0].DeviceID); int mode; if (fdcData.DeviceClass[0].FuelMode.ModeNo != null) mode = Convert.ToInt16(fdcData.DeviceClass[0].FuelMode.ModeNo); else mode = Convert.ToInt16(fdcData.DeviceClass[0].ModeNo); OnFuelModeChange(this, new FuelModeChangedEventArgs(deviceType, deviceId, mode)); } if (OnOperationModeChange != null) { //TODO Why is only first item in array used? if (fdcData.DeviceClass[0].FuelMode != null && fdcData.DeviceClass[0].FuelMode.OperationModeSpecified)//TODO Is enough? { OnOperationModeChange.Fire(this, new OperationModeChangedEventArgs(fdcData.DeviceClass[0].Type, Convert.ToInt16(fdcData.DeviceClass[0].DeviceID), fdcData.DeviceClass[0].FuelMode.OperationMode)); } } } DebugLog("FuelModeChangeMsg end"); } catch (Exception ex) { DebugLog("FuelModeChangeMsg Exception! " + ex); } } private void FDCExceptionMsg(FDCMessageFDCExceptionMsg msg) { try { DebugLog("FDCExceptionMsg init"); DebugLog("FDCExceptionMsg end"); } catch (Exception ex) { DebugLog("FDCExceptionMsg Exception! " + ex); } } private void FDCMessageConfigurationChangeMsg(FDCMessageConfigurationChange msg) { try { DebugLog("FDCMessageConfigurationChangeMsg init"); OnConfigurationChange.Invoke(this, null); DebugLog("FDCMessageConfigurationChangeMsg end"); } catch (Exception ex) { DebugLog("FDCMessageConfigurationChangeMsg Exception! " + ex); } } private void OptReadMsg(FDCMessageOPTRead msg) { try { DebugLog("OptReadMsg init"); foreach (FDCMessageDeviceClassOPTRead optdata in msg.FDCdata[0].DeviceClass) { if (OnOptRead != null) { string deviceType = optdata.Type; byte[] databytes = ASCIIEncoding.ASCII.GetBytes(optdata.Message); ; DebugLog(string.Format("type={0}, id={1}, msg={2}", optdata.Type, optdata.DeviceID, optdata.Message)); int deviceId = Convert.ToInt16(optdata.DeviceID); OnOptRead(this, new OptReadEventArgs(deviceType, deviceId, databytes)); } } DebugLog("OptReadMsg end"); } catch (Exception ex) { DebugLog("OptReadMsg Exception! " + ex); } } private void OptReadMsg(FDCMessageOPTReadV07 msg) { try { DebugLog("OptReadMsg init"); foreach (FDCMessageDeviceClassOPTReadV07 optdata in msg.FDCdata[0].DeviceClass) { if (OnOptRead != null) { string deviceType = optdata.Type; ASCIIEncoding encoding = new ASCIIEncoding(); DebugLog(string.Format("type={0}, id={1}, msg={2}", optdata.Type, optdata.DeviceID, encoding.GetString(optdata.Message, 0, optdata.Message.Length))); int deviceId = Convert.ToInt16(optdata.DeviceID); byte[] message = optdata.Message; OnOptRead(this, new OptReadEventArgs(deviceType, deviceId, message)); } } DebugLog("OptReadMsg end"); } catch (Exception ex) { DebugLog("OptReadMsg Exception! " + ex); } } protected override void DoDispose() { _heartbeat.Dispose(); } } }