App.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using Edge.Core.IndustryStandardInterface.ATG;
  2. using Edge.Core.Processor;
  3. using Edge.Core.Processor.Dispatcher.Attributes;
  4. using Edge.Core.UniversalApi;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9. namespace Bogus_ATG
  10. {
  11. [UniversalApi(Name = "OnStateChange", EventDataType = typeof(AtgStateChangeEventArg))]
  12. [UniversalApi(Name = "OnAlarm", EventDataType = typeof(AtgAlarmEventArg))]
  13. [MetaPartsDescriptor(
  14. "lang-zh-cn:液位仪模拟器lang-en-us:ATG Simulator",
  15. "lang-zh-cn:用于模拟液位仪(可配置多个油罐), 每个虚拟油罐数据会自动变化lang-en-us:Used for simulate Auto Tank Gauge which have multiple tanks linked, each virutal tank has its data updated randomly and timely",
  16. new[] { "lang-zh-cn:液位仪lang-en-us:ATG" })]
  17. public class App : IAutoTankGaugeController, IAppProcessor, IDisposable
  18. {
  19. private IEnumerable<Tank> tanks;
  20. public string MetaConfigName { get; set; }
  21. public int DeviceId => 1;
  22. public IEnumerable<Tank> Tanks { get; set; }
  23. public AtgState State => AtgState.Idle;
  24. public SystemUnit SystemUnit => SystemUnit.Metric;
  25. public event EventHandler<AtgStateChangeEventArg> OnStateChange;
  26. public event EventHandler<AtgAlarmEventArg> OnAlarm;
  27. public App(int tanksCount)
  28. {
  29. this.tanks = Enumerable.Range(1, tanksCount).Select(i =>
  30. {
  31. Tank tank = new Tank();
  32. tank.TankNumber = (byte)i;
  33. tank.Diameter = 2000.0 + i * 200;
  34. tank.Label = "我是油罐" + i + "的标签";
  35. Product product = new Product();
  36. product.ProductCode = (i == 1 ? 0 : (i + 90)).ToString();
  37. product.ProductLabel = (i == 1 ? 0 : (i + 90)) + "#";
  38. tank.Product = product;
  39. TankLimit tankLimit = new TankLimit();
  40. tankLimit.FullVolume = 3000.0 + i * 150;
  41. tankLimit.FuelTemperatureHighLimit = (60.0);
  42. tankLimit.FuelTemperatureLowLimit = (10.0);
  43. tankLimit.HighProduct = (0.85) + i * 0.05;
  44. tankLimit.HighWaterAlarm = (100.0);
  45. tankLimit.HighWaterWarning = (50.0);
  46. tankLimit.LowProduct = (25.0) + i * 2;
  47. tankLimit.MaxVolume = 2700.0 + i * 150;
  48. tank.Limit = tankLimit;
  49. Probe probe = new Probe();
  50. probe.ProbeLength = 2000.0 + i * 150;
  51. probe.ProbeOffset = (1.0);
  52. probe.WaterOffset = (3.0);
  53. probe.DeviceId = (i);
  54. tank.Probe = probe;
  55. return tank;
  56. });
  57. this.Tanks = this.tanks;
  58. }
  59. public void Dispose()
  60. {
  61. }
  62. [UniversalApi()]
  63. public Task<IEnumerable<Tank>> GetTanksAsync()
  64. {
  65. return Task.FromResult(this.tanks);
  66. }
  67. /// <summary>
  68. ///
  69. /// </summary>
  70. /// <param name="tankNumber">0 or null for query all tanks</param>
  71. /// <returns></returns>
  72. [UniversalApi(Description = "", InputParametersExampleJson = "[1]")]
  73. public async Task<TankReading> GetTankReadingAsync(int tankNumber)
  74. {
  75. TankReading tankReading = new TankReading();
  76. tankReading.Density = 1.0;
  77. tankReading.Height = new Random().Next(200, 1800);
  78. tankReading.TcVolume = new Random().Next(200, 1800);
  79. tankReading.Ullage = new Random().Next(100, 500);
  80. tankReading.Volume = new Random().Next(200, 1800);
  81. tankReading.Water = new Random().Next(10, 150);
  82. tankReading.WaterVolume = new Random().Next(10, 150);
  83. tankReading.Temperature = new Random().Next(1, 100);
  84. tankReading.TankNumber = tankNumber;
  85. return await Task.FromResult<TankReading>(tankReading);
  86. }
  87. [UniversalApi(Description = "", InputParametersExampleJson = "[1,8,0,\"2020-04-01T18:25:43.511Z\"]")]
  88. public Task<IEnumerable<Delivery>> GetTankDeliveryAsync(int tankNumber, int pageRowCount = 10, int pageIndex = 0, DateTime? filterTimestamp = null)
  89. {
  90. return Task.FromResult(Enumerable.Range(1, pageRowCount).Select(i =>
  91. {
  92. Delivery delivery = new Delivery();
  93. delivery.TankNumber = (byte)tankNumber;
  94. delivery.StartingDateTime = DateTime.Now.Subtract(new TimeSpan(i, 0, 0));
  95. delivery.EndingDateTime = DateTime.Now.Subtract(new TimeSpan(0, i, 0));
  96. delivery.StartingFuelHeight = 1.0 + i * 10;
  97. delivery.EndingFuelHeight = 3000.0 + i * 100;
  98. delivery.Description = "man made fake Delivery for tank: " + tankNumber;
  99. return delivery;
  100. }));
  101. }
  102. [UniversalApi(Description = "", InputParametersExampleJson = "[1,8,0,\"2020-04-01T18:25:43.511Z\"]")]
  103. public async Task<IEnumerable<Inventory>> GetTankInventoryAsync(int tankNumber, int pageRowCount = 10, int pageIndex = 0, DateTime? filterTimestamp = null)
  104. {
  105. var reading = await this.GetTankReadingAsync(tankNumber);
  106. if (reading == null) return null;
  107. var inventory = new Inventory()
  108. {
  109. TankNumber = tankNumber,
  110. FuelHeight = reading.Height ?? -1,
  111. FuelVolume = reading.Volume ?? -1,
  112. FuelTCVolume = reading.TcVolume ?? -1,
  113. WaterHeight = reading.Water ?? -1,
  114. Temperture = reading.Temperature ?? int.MinValue,
  115. TimeStamp = DateTime.Now,
  116. };
  117. return new[] { inventory };
  118. }
  119. [UniversalApi(Description = "", InputParametersExampleJson = "[1,8,0,\"2020-04-01T18:25:43.511Z\"]")]
  120. public Task<IEnumerable<Alarm>> GetTankAlarmAsync(int tankNumber, int pageRowCount = 10, int pageIndex = 0, DateTime? filterTimestamp = null)
  121. {
  122. return Task.FromResult(Enumerable.Range(1, pageRowCount).Select(i =>
  123. {
  124. Alarm alarm = new Alarm();
  125. alarm.Id = i;
  126. alarm.CreatedTimeStamp = DateTime.Now.Subtract(new TimeSpan(i, 0, 0));
  127. alarm.Priority = AlarmPriority.Alarm;
  128. alarm.TankNumber = (byte)tankNumber;
  129. alarm.Type = AlarmType.TankHighProductAlarm;
  130. alarm.Description = "man made fake Alarm for tank: " + tankNumber;
  131. return alarm;
  132. }));
  133. }
  134. public void Init(IEnumerable<IProcessor> processors)
  135. {
  136. }
  137. [UniversalApi]
  138. public Task<IEnumerable<TankReading>> GetTanksReadingAsync()
  139. {
  140. return Task.FromResult(Enumerable.Range(1, this.tanks.Count()).Select(i =>
  141. {
  142. TankReading tankReading = new TankReading();
  143. tankReading.Density = 1.0;
  144. tankReading.Height = new Random().Next(200, 1800);
  145. tankReading.TcVolume = new Random().Next(200, 1800);
  146. tankReading.Ullage = new Random().Next(100, 500);
  147. tankReading.Volume = new Random().Next(200, 1800);
  148. tankReading.Water = new Random().Next(10, 150);
  149. tankReading.WaterVolume = new Random().Next(10, 150);
  150. tankReading.Temperature = new Random().Next(1, 100);
  151. tankReading.TankNumber = i;
  152. return tankReading;
  153. }));
  154. }
  155. }
  156. }