FUSIONPump.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Globalization;
  5. using System.Threading;
  6. using System.Linq;
  7. using Wayne.FDCPOSLibrary;
  8. using Wayne.Lib;
  9. using Wayne.Lib.Log;
  10. namespace Wayne.ForecourtControl.Fusion
  11. {
  12. public class FUSIONPump : IPumpEx, IIdentifiableEntity, IDisposable
  13. {
  14. // Fields
  15. private bool capFuelGradeSelected;
  16. private bool capNozzleDetection;
  17. private bool capSetLight;
  18. private bool capSuspendFuelling;
  19. private IFuelling currentFuelling;
  20. private string entitySubType;
  21. private bool fuelGradeSelected;
  22. private List<IFuelling> fuellingList;
  23. private FUSIONManager manager;
  24. private int nfsPumpSymbol;
  25. private List<INozzle> nozzles;
  26. private bool open;
  27. private IIdentifiableEntity parerentDevice;
  28. private PriceGroup priceGroup;
  29. private int pumpId;
  30. private int offsetedPumpId;
  31. private int reservedBy;
  32. private Timer runningFuellingDataTimer;
  33. private bool _runningFuellingUpdates;
  34. private PumpState state;
  35. private TankLevelSwitchStatus tankLevelSwitchStatus;
  36. private int fuelMode;
  37. private ushort operationMode;
  38. // Events
  39. public event EventHandler<PumpEventOccuredEventArgs> OnEventOccured;
  40. public event EventHandler<FuellingDataChangeEventArgs> OnFuellingDataChange;
  41. public event EventHandler<FuellingStateChangeEventArgs> OnFuellingStateChange;
  42. public event EventHandler<NozzleStateChangeEventArgs> OnNozzleStateChange;
  43. public event EventHandler<PumpStateChangeEventArgs> OnStateChange;
  44. public event EventHandler<TankLevelSwitchStatusChangeEventArgs> OnTankLevelSwitchStatusChange;
  45. public event EventHandler<FuelModeChangeEventArgs> OnFuelModeChange;
  46. public event EventHandler<OperationModeChangeEventArgs> OnOperationModeChange;
  47. public event EventHandler<PumpReservationStateChangeEventArgs> OnReservationStateChange;
  48. private readonly DebugLogger debugLogger;
  49. // Methods
  50. public FUSIONPump(FUSIONManager manager)
  51. {
  52. this.manager = manager;
  53. this.fuellingList = new List<IFuelling>();
  54. this.nozzles = new List<INozzle>();
  55. this.currentFuelling = new FUSIONFuelling(manager, this);
  56. this.state = PumpState.Unknown;
  57. debugLogger = manager.DebugLogger;
  58. }
  59. private void DebugLog(string s)
  60. {
  61. if (debugLogger.IsActive())
  62. debugLogger.Add(s);
  63. }
  64. public void AuthorizeAsync(byte? deviceId, IAuthorizeParameters authorizeParams, EventHandler<AsyncCompletedEventArgs<long>> requestCompleted, object userToken)
  65. {
  66. //this.CheckDisposed();
  67. //if (authorizeParams == null)
  68. //{
  69. // throw new ArgumentException("Must supply a valid IAuthorizeParams object");
  70. //}
  71. //FUSIONAsyncOperation<ushort> operation = this.manager.AsyncManager.RegisterOperation<AsyncCompletedEventArgs<long>>(this, requestCompleted, userToken);
  72. //this.SendAuthorizationRequest(0xcd, operation.Id, authorizeParams);
  73. while (this.manager.forecourtControl.fuelPriceReserved)
  74. {
  75. Thread.Sleep(200);
  76. DebugLog(String.Format("FUSIONPump.AuthorizeAsync: pumpId={0} - fuel price running, wait ...", this.realId));
  77. }
  78. //generate the release token for the authorized fuelling
  79. int authorizationId = manager.PumpAuthIdSequence.GetNext(authorizeParams);
  80. FUSIONFuelling currentFuelling = null;
  81. currentFuelling = (FUSIONFuelling)(CurrentFuelling);
  82. currentFuelling.WritablePrice = 0;
  83. currentFuelling.WritableAmount = 0;
  84. currentFuelling.WritableQuantity = 0;
  85. currentFuelling.WritableNozzle = null;
  86. currentFuelling.WritableFuelGrade = 1;
  87. currentFuelling.WritableTransactionId = 0;
  88. currentFuelling.WritableFuellingSequenceNumber = 0;
  89. currentFuelling.WritableAuthorizationId = authorizationId;
  90. currentFuelling.WritablePresetType = authorizeParams.PresetType;
  91. currentFuelling.WritablePresetValue = authorizeParams.PresetValue;
  92. currentFuelling.WritablePriceGroup = authorizeParams.PriceGroup;
  93. currentFuelling.WritableCompletionDateTime = DateTime.Now;
  94. currentFuelling.WritableState = FuellingState.Unknown;
  95. DebugLog(String.Format("FUSIONPump.AuthorizeAsync: pumpId={0}, presetAmount={1}, reservingDeviceId={2}, fuellingType={3}",
  96. this.realId, currentFuelling.PresetValue, currentFuelling.ReservingDeviceId, currentFuelling.WritableReservingType));
  97. this.manager.ifsfManager.AuthoriseFuelPoint(this.realId, authorizationId, currentFuelling.WritableReservingType, currentFuelling.ReservingDeviceId, authorizeParams, requestCompleted, userToken, this);
  98. }
  99. public void AuthorizeAsync(IAuthorizeParameters authorizeParams, EventHandler<AsyncCompletedEventArgs<long>> requestCompleted, object userToken)
  100. {
  101. AuthorizeAsync(0, authorizeParams, requestCompleted, userToken);
  102. }
  103. public void AuthorizeUpdateAsync(byte? deviceId, IAuthorizeParameters authorizeParams, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  104. {
  105. //this.CheckDisposed();
  106. //if (authorizeParams == null)
  107. //{
  108. // throw new ArgumentException("Must supply a valid IAuthorizeParams object");
  109. //}
  110. //FUSIONAsyncOperation<ushort> operation = this.manager.AsyncManager.RegisterOperation<AsyncCompletedEventArgs>(this, requestCompleted, userToken);
  111. //this.SendAuthorizationRequest(0xd5, operation.Id, authorizeParams);
  112. }
  113. public void AuthorizeUpdateAsync(IAuthorizeParameters authorizeParams, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  114. {
  115. AuthorizeUpdateAsync(0, authorizeParams, requestCompleted, userToken);
  116. }
  117. private void CheckDisposed()
  118. {
  119. if (this.manager == null)
  120. {
  121. throw new ObjectDisposedException("", "The pump object is not available anymore.");
  122. }
  123. }
  124. public void Dispose()
  125. {
  126. //if (this.runningFuellingDataTimer != null)
  127. //{
  128. // this.runningFuellingDataTimer.Dispose();
  129. //}
  130. this.manager = null;
  131. foreach (FUSIONNozzle nozzle in this.nozzles)
  132. {
  133. nozzle.Dispose();
  134. }
  135. foreach (FUSIONFuelling fuelling in this.fuellingList)
  136. {
  137. fuelling.Dispose();
  138. }
  139. ((FUSIONFuelling)this.currentFuelling).Dispose();
  140. }
  141. internal void FireFuellingDataChange(IFuelling fuelling, decimal amount, decimal quantity)
  142. {
  143. OnFuellingDataChange.Fire(this, new FuellingDataChangeEventArgs(fuelling, amount, quantity));
  144. }
  145. internal void FireFuellingStateChange(IFuelling fuelling, FuellingState state)
  146. {
  147. OnFuellingStateChange.Fire(this, new FuellingStateChangeEventArgs(fuelling, state));
  148. }
  149. internal void FireNozzleStateChange(INozzle nozzle, NozzleState nozzleState)
  150. {
  151. OnNozzleStateChange.Fire(this, new NozzleStateChangeEventArgs(nozzle, nozzleState));
  152. }
  153. internal void FirePumpEventOccured(PumpEventType pumpEventType)
  154. {
  155. OnEventOccured.Fire(this, new PumpEventOccuredEventArgs(pumpEventType));
  156. }
  157. internal void FireFuelModeChange(int mode)
  158. {
  159. OnFuelModeChange.Fire(this, new FuelModeChangeEventArgs(this, mode));
  160. }
  161. internal void FireOperationModeChange(ushort mode)
  162. {
  163. OnOperationModeChange.Fire(this, new OperationModeChangeEventArgs(this, mode));
  164. }
  165. private void PerformStopPump(EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  166. {
  167. //FUSIONAsyncOperation<ushort, AsyncCompletedEventArgs> operation = this.manager.AsyncManager.RegisterOperation<AsyncCompletedEventArgs>(this, requestCompleted, userToken);
  168. //Function function = new Function(0xc9, ParserDomain.FillingServer, new Parameter[] { new PrimitiveParameter(0x17, PrimitiveType.Byte, this.pumpId) });
  169. //this.manager.Send(function);
  170. //AsyncCompletedEventArgs resultEventArgs = new AsyncCompletedEventArgs(true, operation.UserToken);
  171. //operation.Complete(resultEventArgs);
  172. this.manager.ifsfManager.TerminateFuelling(this.realId, requestCompleted, userToken, this);
  173. }
  174. /// <summary>
  175. /// Reserve a pump
  176. /// </summary>
  177. /// <param name="fuellingType"></param>
  178. /// <param name="deviceId"></param>
  179. /// <param name="reservedCompleted"></param>
  180. /// <param name="userToken"></param>
  181. public void ReserveAsync(FuellingType fuellingType, byte deviceId, EventHandler<AsyncCompletedEventArgs> reservedCompleted, object userToken)
  182. {
  183. FUSIONFuelling currentFuelling = (FUSIONFuelling)(CurrentFuelling);
  184. DebugLog(String.Format("FUSIONPump.ReserveAsync: pumpId={0}\r\n\t" +
  185. "reservedBy={1}, this.manager.ifsfManager.clientSocket.applicationSender={2}\r\n\t" +
  186. "currentFuelling.WritableReservingType={3}, fuellingType={4}\r\n\t" +
  187. "currentFuelling.ReservingDeviceId={5}, deviceId={6}",
  188. this.realId, reservedBy, this.manager.ifsfManager.clientSocket.applicationSender, currentFuelling.WritableReservingType, fuellingType, currentFuelling.ReservingDeviceId, deviceId));
  189. if (reservedBy == int.Parse(this.manager.ifsfManager.clientSocket.applicationSender) &&
  190. currentFuelling.WritableReservingType == fuellingType &&
  191. currentFuelling.ReservingDeviceId == deviceId &&
  192. reservedCompleted != null)
  193. {
  194. DebugLog(String.Format("FUSIONPump.ReserveAsync: pumpId={0}, reservingDeviceId={1}, fuellingType={2} ALREADY RESERVED by the same DeviceId!", this.realId, currentFuelling.ReservingDeviceId, currentFuelling.WritableReservingType));
  195. reservedCompleted(this, new AsyncCompletedEventArgs(true, userToken));
  196. }
  197. else
  198. {
  199. currentFuelling.WritableReservingType = fuellingType;
  200. currentFuelling.WritableReservingDeviceId = deviceId;
  201. this.manager.ifsfManager.ReserveFuelPoint(this.realId, reservedCompleted, userToken, this);
  202. }
  203. }
  204. public void ResumeAsync(EventHandler<AsyncCompletedEventArgs> resumeCompleted, object userToken)
  205. {
  206. //this.CheckDisposed();
  207. //FUSIONAsyncOperation<ushort> operation = this.manager.AsyncManager.RegisterOperation<AsyncCompletedEventArgs>(this, resumeCompleted, userToken);
  208. //this.manager.Send(new Function(0xcb, ParserDomain.FillingServer, new Parameter[] { new PrimitiveParameter(0x66, PrimitiveType.UInt16, operation), new PrimitiveParameter(0x17, PrimitiveType.Byte, this.Id) }));
  209. this.manager.ifsfManager.ResumeFuelling(this.realId, resumeCompleted, userToken, this);
  210. //if (resumeCompleted != null)
  211. // resumeCompleted.Invoke(this, new AsyncCompletedEventArgs(true, userToken));
  212. }
  213. public void StartFuelPointAsync(EventHandler<AsyncCompletedEventArgs> startCompleted, object userToken)
  214. {
  215. this.manager.ifsfManager.StartFuelPoint(this.realId, startCompleted, userToken, this);
  216. }
  217. public void StopFuelPointAsync(EventHandler<AsyncCompletedEventArgs> startCompleted, object userToken)
  218. {
  219. this.manager.ifsfManager.StopFuelPoint(this.realId, startCompleted, userToken, this);
  220. }
  221. private void RunningFuellingTimerProc(object state)
  222. {
  223. if (this.RunningFuellingUpdates && (this.manager != null))
  224. {
  225. this.manager.RequestFillingData(this.pumpId, true);
  226. }
  227. }
  228. private void SendAuthorizationRequest(ushort fid, int sequenceNumber, IAuthorizeParameters authorizeParams)
  229. {
  230. //this.CheckDisposed();
  231. //Function function = new Function(fid, ParserDomain.FillingServer, new Parameter[] { new PrimitiveParameter(0x66, PrimitiveType.UInt16, sequenceNumber), new PrimitiveParameter(0x17, PrimitiveType.Byte, this.pumpId), new PrimitiveParameter(0x16, PrimitiveType.Byte, NfsConvert.DecodePresetType(authorizeParams.PresetType)), new PrimitiveParameter(0x10, PrimitiveType.Decimal, authorizeParams.PresetValue), new PrimitiveParameter(0x27, PrimitiveType.Byte, NfsConvert.DecodePriceGroup(authorizeParams.PriceGroup)), new PrimitiveParameter(0x25, PrimitiveType.Byte, 0), new PrimitiveParameter(120, PrimitiveType.Byte, Convert.ToInt32(authorizeParams.LockToReleaseClient)) });
  232. //ArrayParameter parameter = new ArrayParameter(14);
  233. //for (int i = 0; i < authorizeParams.AllowedFuelGrade.Count; i++)
  234. //{
  235. // if (!authorizeParams.AllowedFuelGrade[i])
  236. // {
  237. // parameter.Add(new PrimitiveParameter(0x1c, PrimitiveType.Byte, i));
  238. // }
  239. //}
  240. //function.Add(parameter);
  241. //this.manager.Send(function);
  242. }
  243. public void SetBlockedAsync(bool blocked, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  244. {
  245. //if (blocked)
  246. // this.manager.ifsfManager.LockNozzle(this.Id, -1, requestCompleted, userToken);
  247. //else
  248. // this.manager.ifsfManager.UnlockNozzle(this.Id, -1, requestCompleted, userToken);
  249. if (blocked)
  250. {
  251. this.manager.ifsfManager.CloseDevice(this.realId, requestCompleted, userToken, this);
  252. }
  253. else
  254. {
  255. this.manager.ifsfManager.GetDeviceState(Wayne.FDCPOSLibrary.DeviceType.DT_FuellingPoint, this.realId,
  256. null, null, null);
  257. this.manager.ifsfManager.OpenDevice(this.realId, requestCompleted, userToken, this);
  258. }
  259. //if (requestCompleted != null)
  260. // requestCompleted.Invoke(this, new AsyncCompletedEventArgs(true, userToken));
  261. }
  262. public void TriggerStatusChangedEvent()
  263. {
  264. if (OnStateChange != null)
  265. {
  266. OnStateChange(this, new PumpStateChangeEventArgs(this, State));
  267. }
  268. }
  269. public void SetPriceGroupAsync(PriceGroup priceGroup, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  270. {
  271. var newFuelMode = manager.forecourtControl.ForecourtConfiguration.GetDefaultFuelMode(priceGroup);
  272. if (this.manager.forecourtControl.fuelPriceReserved)
  273. this.manager.ifsfManager.ChangeFuelModeAdd(this.manager.forecourtControl.srChangeMode, this.realId, newFuelMode, operationMode, requestCompleted, userToken, this);
  274. else
  275. this.manager.ifsfManager.ChangeFuelMode(this.realId, newFuelMode, operationMode, requestCompleted, userToken, this);
  276. // Update fuelling type for current fuelling
  277. //var currentFuelling = (FUSIONFuelling)(CurrentFuelling);
  278. //currentFuelling.WritableType = FuelModeMap.GetFuellingType(newFuelMode);
  279. }
  280. public void SetFuelModeAsync(int fuelMode, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  281. {
  282. //var opMode = manager.forecourtControl.ForecourtConfiguration.Pumps.First(P => P.PumpNumber.Index == this.realId).GetOperationMode((OperationModeType)manager.forecourtControl.SiteMode);
  283. this.manager.ifsfManager.ChangeFuelMode(this.realId, fuelMode, null, requestCompleted, userToken, this);
  284. // Update fuelling type for current fuelling
  285. //var currentFuelling = (FUSIONFuelling)(CurrentFuelling);
  286. //currentFuelling.WritableType = FuelModeMap.GetFuellingType(fuelMode);
  287. }
  288. public void SetFuelModeAsync(int fuelMode, ushort opMode, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  289. {
  290. this.manager.ifsfManager.ChangeFuelMode(this.realId, fuelMode, opMode, requestCompleted, userToken, this);
  291. }
  292. public void SignalEventAsync(PumpEventType eventType, EventHandler<AsyncCompletedEventArgs> signalEventCompleted, object userToken)
  293. {
  294. //this.CheckDisposed();
  295. //FUSIONAsyncOperation<ushort> operation = this.manager.AsyncManager.RegisterOperation<AsyncCompletedEventArgs>(this, signalEventCompleted, userToken);
  296. //Function function = new Function(0xd8, ParserDomain.FillingServer, new Parameter[] { new PrimitiveParameter(0x66, PrimitiveType.UInt16, operation.Id), new PrimitiveParameter(0x17, PrimitiveType.Byte, this.Id), new PrimitiveParameter(0x7a, PrimitiveType.UInt16, eventType) });
  297. //this.manager.Send(function);
  298. }
  299. public void StopAsync(EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  300. {
  301. this.CheckDisposed();
  302. this.PerformStopPump(requestCompleted, userToken);
  303. }
  304. public void SuspendAsync(EventHandler<AsyncCompletedEventArgs> suspendCompleted, object userToken)
  305. {
  306. this.CheckDisposed();
  307. // FUSIONAsyncOperation<ushort> operation = this.manager.AsyncManager.RegisterOperation<AsyncCompletedEventArgs>(this, suspendCompleted, userToken);
  308. // this.manager.Send(new Function(0xca, ParserDomain.FillingServer, new Parameter[] { new PrimitiveParameter(0x66, PrimitiveType.UInt16, operation), new PrimitiveParameter(0x17, PrimitiveType.Byte, this.Id) }));
  309. this.manager.ifsfManager.SuspendFuelling(this.realId, suspendCompleted, userToken, this);
  310. }
  311. public override string ToString()
  312. {
  313. return this.ToString("", CultureInfo.InvariantCulture);
  314. }
  315. public string ToString(IFormatProvider provider)
  316. {
  317. return this.ToString("", provider);
  318. }
  319. public string ToString(string format)
  320. {
  321. return this.ToString(format, CultureInfo.InvariantCulture);
  322. }
  323. public string ToString(string format, IFormatProvider provider)
  324. {
  325. return ("Pump DeviceId=" + this.pumpId.ToString(format, provider));
  326. }
  327. public void UnauthorizeAsync(EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  328. {
  329. this.CheckDisposed();
  330. this.PerformStopPump(requestCompleted, userToken);
  331. }
  332. public void UnreserveAsync(byte? deviceId, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  333. {
  334. //this.CheckDisposed();
  335. //FUSIONAsyncOperation<ushort> operation = this.manager.AsyncManager.RegisterOperation<AsyncCompletedEventArgs>(this, requestCompleted, userToken);
  336. //Function function = new Function(210, ParserDomain.FillingServer, new Parameter[] { new PrimitiveParameter(0x66, PrimitiveType.UInt16, operation.Id), new PrimitiveParameter(0x17, PrimitiveType.Byte, this.pumpId) });
  337. //this.manager.Send(function);
  338. FUSIONFuelling currentFuelling = (FUSIONFuelling)(CurrentFuelling);
  339. DebugLog(String.Format("FUSIONPump.UnreserveAsync: pumpId={0}, reservingDeviceId={1}, fuellingType={2}", this.realId, currentFuelling.ReservingDeviceId, currentFuelling.WritableReservingType));
  340. currentFuelling.WritableReservingType = FuellingType.Unknown;
  341. currentFuelling.WritableReservingDeviceId = 0;
  342. this.manager.ifsfManager.FreeFuelPoint(this.realId, requestCompleted, userToken, this);
  343. //if (requestCompleted != null)
  344. // requestCompleted.Invoke(this, new AsyncCompletedEventArgs(true, userToken));
  345. }
  346. public void UnreserveAsync(EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken)
  347. {
  348. UnreserveAsync(null, requestCompleted, userToken);
  349. }
  350. public PumpState convertPumpState(LogicalDeviceState fdcState, LogicalDeviceState fdcSubState)
  351. {
  352. if (fdcState == LogicalDeviceState.FDC_FUELLING && fdcSubState == LogicalDeviceState.FDC_FUELLING_TERMINATED) return PumpState.Suspended;
  353. else if (fdcState == LogicalDeviceState.FDC_REQUESTED) return PumpState.WaitingForConsent;
  354. else if (fdcState == LogicalDeviceState.FDC_AUTHORISED) return PumpState.Authorized;
  355. else if (fdcState == LogicalDeviceState.FDC_CALLING) return PumpState.Calling;
  356. //else if (fdcState == LogicalDeviceState.FDC_INACTIVATED) return PumpState.Closed;
  357. else if (fdcState == LogicalDeviceState.FDC_DISABLED) return PumpState.Closed;
  358. else if (fdcState == LogicalDeviceState.FDC_CLOSED) return PumpState.Closed;
  359. else if (fdcState == LogicalDeviceState.FDC_FUELLING) return PumpState.Fuelling;
  360. else if (fdcState == LogicalDeviceState.FDC_STARTED) return PumpState.Fuelling;
  361. else if (fdcState == LogicalDeviceState.FDC_READY && fdcSubState != LogicalDeviceState.FDC_STOPPED) return PumpState.Idle;
  362. else if (fdcState == LogicalDeviceState.FDC_OUTOFORDER) return PumpState.Inoperative;
  363. else if (fdcState == LogicalDeviceState.FDC_OFFLINE) return PumpState.Inoperative;
  364. else if (fdcState == LogicalDeviceState.FDC_SUSPENDED) return PumpState.Suspended;
  365. else if (fdcState == LogicalDeviceState.FDC_SUSPENDED_STARTED && fdcSubState != LogicalDeviceState.FDC_STOPPED) return PumpState.Suspended;
  366. else if (fdcState == LogicalDeviceState.FDC_SUSPENDED_FUELLING) return PumpState.Suspended;
  367. else if (fdcState == LogicalDeviceState.FDC_INVALIDSTATE) return PumpState.Unknown;
  368. else if (fdcState == LogicalDeviceState.FDC_UNDEFINED) return PumpState.Unknown;
  369. else if (fdcState == LogicalDeviceState.FDC_CONFIGURE) return PumpState.Closed;
  370. else if (fdcSubState == LogicalDeviceState.FDC_STOPPED) return PumpState.Stopped;
  371. #if !_USE_OLD_FCONTROL_
  372. else if (fdcState == LogicalDeviceState.FDC_ERRORSTATE) return PumpState.Error;
  373. #else
  374. else if (fdcState == LogicalDeviceState.FDC_ERRORSTATE) return PumpState.Inoperative;
  375. #endif
  376. //else if (fdcState == LogicalDeviceState.FDC_LOCKED) return PumpState.Closed;
  377. else return PumpState.Unknown;
  378. }
  379. public IFuelling getFuellingByTransactionId(int transactionId, int releaseToken)
  380. {
  381. // first look for transactionId or for the authorizationId
  382. foreach (FUSIONFuelling fuelling in fuellingList)
  383. {
  384. if (transactionId > 0 && fuelling.TransactionId == transactionId ||
  385. transactionId == 0 && fuelling.AuthorizationId == releaseToken)
  386. return fuelling;
  387. }
  388. return null;
  389. }
  390. #region Properties
  391. public bool Blocked
  392. {
  393. get
  394. {
  395. return this.State == PumpState.Closed;
  396. }
  397. }
  398. public bool CapFuelGradeSelected
  399. {
  400. get
  401. {
  402. return this.capFuelGradeSelected;
  403. }
  404. }
  405. public bool CapNozzleDetection
  406. {
  407. get
  408. {
  409. return this.capNozzleDetection;
  410. }
  411. }
  412. public bool CapSetLight
  413. {
  414. get
  415. {
  416. return this.capSetLight;
  417. }
  418. }
  419. public bool CapSuspendFuelling
  420. {
  421. get
  422. {
  423. return this.capSuspendFuelling;
  424. }
  425. }
  426. public bool Connected
  427. {
  428. get
  429. {
  430. return true; // Configured pumps should be always considered as connected
  431. }
  432. }
  433. public IFuelling CurrentFuelling
  434. {
  435. get
  436. {
  437. return this.currentFuelling;
  438. }
  439. }
  440. public string EntitySubType
  441. {
  442. get
  443. {
  444. return "";
  445. }
  446. }
  447. public string EntityType
  448. {
  449. get
  450. {
  451. return "Pump";
  452. }
  453. }
  454. /// <summary>
  455. /// This is used by the logger and should never be set by inheriting classes
  456. /// </summary>
  457. public string FullEntityName { get; set; }
  458. public FUSIONManager Manager
  459. {
  460. get
  461. {
  462. return this.manager;
  463. }
  464. }
  465. public bool FuelGradeSelected
  466. {
  467. get
  468. {
  469. return this.fuelGradeSelected;
  470. }
  471. }
  472. public ReadOnlyCollection<IFuelling> Fuellings
  473. {
  474. get
  475. {
  476. return this.fuellingList.AsReadOnly();
  477. }
  478. }
  479. public int Id
  480. {
  481. get
  482. {
  483. return this.offsetedPumpId;
  484. }
  485. }
  486. public int realId
  487. {
  488. get
  489. {
  490. return this.pumpId;
  491. }
  492. }
  493. internal int NfsPumpSymbol
  494. {
  495. get
  496. {
  497. return this.nfsPumpSymbol;
  498. }
  499. set
  500. {
  501. this.nfsPumpSymbol = value;
  502. }
  503. }
  504. public ReadOnlyCollection<INozzle> Nozzles
  505. {
  506. get
  507. {
  508. return new ReadOnlyCollection<INozzle>(new List<INozzle>(this.nozzles));
  509. }
  510. }
  511. public bool Open
  512. {
  513. get
  514. {
  515. return this.State != PumpState.Closed && this.State != PumpState.Error &&
  516. this.State != PumpState.Inoperative && this.State != PumpState.Unknown;
  517. }
  518. }
  519. public IIdentifiableEntity ParentEntity
  520. {
  521. get
  522. {
  523. return this.parerentDevice;
  524. }
  525. }
  526. public PriceGroup PriceGroup
  527. {
  528. get
  529. {
  530. return priceGroup;
  531. }
  532. }
  533. public int ReservedBy
  534. {
  535. get
  536. {
  537. return this.reservedBy;
  538. }
  539. }
  540. public bool RunningFuellingUpdates
  541. {
  542. get
  543. {
  544. //return (this.runningFuellingDataTimer != null);
  545. return _runningFuellingUpdates;
  546. }
  547. set
  548. {
  549. this.CheckDisposed();
  550. if (value)
  551. {
  552. var timeout = manager.ifsfManager.clientSocket.runningFuellingTimeout;
  553. // Request current filling data immediately
  554. if (this.manager != null && timeout != 0)
  555. {
  556. this.manager.RequestFillingData(this.pumpId, true);
  557. this.runningFuellingDataTimer = new Timer(new TimerCallback(this.RunningFuellingTimerProc), null, timeout, timeout);
  558. }
  559. else
  560. {
  561. DebugLog("Running fuelling updates disabled by connection string");
  562. }
  563. }
  564. else if (this.runningFuellingDataTimer != null)
  565. {
  566. this.runningFuellingDataTimer.Dispose();
  567. this.runningFuellingDataTimer = null;
  568. }
  569. //if (value && !_runningFuellingUpdates)
  570. //{
  571. // // send GetCurrentFuellingUpdates command
  572. // this.manager.ifsfManager.GetCurrentFuellingStatus(this.Id);
  573. //}
  574. //else if (!value && _runningFuellingUpdates)
  575. //{
  576. //}
  577. _runningFuellingUpdates = value;
  578. }
  579. }
  580. public PumpState State
  581. {
  582. get
  583. {
  584. return this.state;
  585. }
  586. }
  587. public void NozzleStateChange(INozzle nozzle, NozzleState nozzleState)
  588. {
  589. if (this.OnNozzleStateChange != null)
  590. {
  591. DebugLog("OnNozzleStateChange.Invoke");
  592. this.OnNozzleStateChange(this, new NozzleStateChangeEventArgs(nozzle, nozzleState));
  593. }
  594. }
  595. public TankLevelSwitchStatus TankLevelSwitchStatus
  596. {
  597. get
  598. {
  599. return this.tankLevelSwitchStatus;
  600. }
  601. }
  602. public int FuelMode
  603. {
  604. get
  605. {
  606. return this.fuelMode;
  607. }
  608. }
  609. public ushort OperationMode
  610. {
  611. get { return operationMode; }
  612. }
  613. internal bool WritableCapFuelGradeSelected
  614. {
  615. get
  616. {
  617. return this.capFuelGradeSelected;
  618. }
  619. set
  620. {
  621. this.capFuelGradeSelected = value;
  622. }
  623. }
  624. internal bool WritableCapNozzleDetection
  625. {
  626. get
  627. {
  628. return this.capNozzleDetection;
  629. }
  630. set
  631. {
  632. this.capNozzleDetection = value;
  633. }
  634. }
  635. internal bool WritableCapSetLight
  636. {
  637. get
  638. {
  639. return this.capSetLight;
  640. }
  641. set
  642. {
  643. this.capSetLight = value;
  644. }
  645. }
  646. internal bool WritableCapSuspendFuelling
  647. {
  648. get
  649. {
  650. return this.capSuspendFuelling;
  651. }
  652. set
  653. {
  654. this.capSuspendFuelling = value;
  655. }
  656. }
  657. internal IFuelling WritableCurrentFuelling
  658. {
  659. get
  660. {
  661. return this.currentFuelling;
  662. }
  663. }
  664. internal string WritableDeviceName
  665. {
  666. get
  667. {
  668. return this.entitySubType;
  669. }
  670. set
  671. {
  672. this.entitySubType = value;
  673. }
  674. }
  675. internal bool WritableFuelGradeSelected
  676. {
  677. get
  678. {
  679. return this.fuelGradeSelected;
  680. }
  681. set
  682. {
  683. this.fuelGradeSelected = value;
  684. }
  685. }
  686. internal List<IFuelling> WritableFuellingList
  687. {
  688. get
  689. {
  690. return this.fuellingList;
  691. }
  692. }
  693. internal List<INozzle> WritableNozzleList
  694. {
  695. get
  696. {
  697. return this.nozzles;
  698. }
  699. }
  700. internal IIdentifiableEntity WritableParentDevice
  701. {
  702. get
  703. {
  704. return this.parerentDevice;
  705. }
  706. set
  707. {
  708. this.parerentDevice = value;
  709. }
  710. }
  711. internal PriceGroup WritablePriceGroup
  712. {
  713. get
  714. {
  715. return this.priceGroup;
  716. }
  717. set
  718. {
  719. this.priceGroup = value;
  720. }
  721. }
  722. internal int WritablePumpId
  723. {
  724. get
  725. {
  726. return this.pumpId;
  727. }
  728. set
  729. {
  730. this.pumpId = value;
  731. if (manager.IdPumpShift != 0)
  732. this.offsetedPumpId = value + manager.IdPumpShift;
  733. else
  734. this.offsetedPumpId = value + manager.IdShift;
  735. }
  736. }
  737. internal int WritableReservedBy
  738. {
  739. get
  740. {
  741. return this.reservedBy;
  742. }
  743. set
  744. {
  745. if (this.reservedBy != value)
  746. {
  747. this.reservedBy = value;
  748. DebugLog("reservation state is different");
  749. if (this.OnReservationStateChange != null)
  750. {
  751. DebugLog("OnReservationStateChange.Invoke");
  752. this.OnReservationStateChange(this, new PumpReservationStateChangeEventArgs(this, this.reservedBy));
  753. }
  754. }
  755. }
  756. }
  757. internal PumpState WritableState
  758. {
  759. get
  760. {
  761. return this.state;
  762. }
  763. set
  764. {
  765. if (this.state != value)
  766. {
  767. DebugLog("state is different");
  768. if (this.OnStateChange != null)
  769. {
  770. this.state = value;
  771. DebugLog("OnStateChange.Invoke");
  772. this.OnStateChange(this, new PumpStateChangeEventArgs(this, this.state));
  773. }
  774. }
  775. }
  776. }
  777. internal TankLevelSwitchStatus WritableTankLevelSwitchStatus
  778. {
  779. get
  780. {
  781. return this.tankLevelSwitchStatus;
  782. }
  783. set
  784. {
  785. if (this.tankLevelSwitchStatus != value)
  786. {
  787. this.tankLevelSwitchStatus = value;
  788. if (this.OnTankLevelSwitchStatusChange != null)
  789. {
  790. this.OnTankLevelSwitchStatusChange(this, new TankLevelSwitchStatusChangeEventArgs(this, this.tankLevelSwitchStatus));
  791. }
  792. }
  793. }
  794. }
  795. internal int WritableFuelMode
  796. {
  797. get
  798. {
  799. return this.fuelMode;
  800. }
  801. set
  802. {
  803. this.fuelMode = value;
  804. }
  805. }
  806. internal ushort WritableOperationMode
  807. {
  808. get { return this.operationMode; }
  809. set { this.operationMode = value; }
  810. }
  811. #endregion // properties
  812. }
  813. }