App.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. using Edge.Core.Processor;
  2. using Edge.Core.Processor.Dispatcher.Attributes;
  3. using Edge.Core.UniversalApi;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Threading.Tasks;
  8. using Wayne_VaporRecoveryDataCollectorBoard.MessageEntity;
  9. using Wayne_VaporRecoveryDataCollectorBoard.MessageEntity.Incoming;
  10. namespace Bogus_VaporRecoveryDataCollectorBoard
  11. {
  12. [MetaPartsDescriptor(
  13. "lang-zh-cn:气液比数据收集板 模拟器lang-en-us:气液比数据收集板 模拟器",
  14. "lang-zh-cn:模拟器,气体和液体小数点位数请设置2,用于驱动 气液比数据收集板 模拟器, 请调用API: ManualSetNextVaporAndLiquid来人工设置模拟气液比值lang-en-us:模拟器,气体和液体小数点位数请设置2,用于驱动 气液比数据收集板 模拟器, 请调用API: ManualSetNextVaporAndLiquid来人工设置模拟气液比值",
  15. new[] { "lang-zh-cn:在线监测lang-zh-tw:在線監測lang-en-us:OnlineWatch" })]
  16. public class App : Wayne_VaporRecoveryDataCollectorBoard.GroupHandler, IAppProcessor
  17. {
  18. private bool isStop = false;
  19. private int vaporLitre = 990; int liquidLiter = 1000;
  20. public App(DeviceConfigV1 deviceConfig, IServiceProvider services) : base(deviceConfig, services)
  21. { }
  22. public string MetaConfigName { get; set; }
  23. public void Init(IEnumerable<IProcessor> processors)
  24. {
  25. }
  26. public Task<bool> Start()
  27. {
  28. Task.Run(async () =>
  29. {
  30. await Task.Delay(5000);
  31. foreach (var b in base.Boards)
  32. {
  33. b.State = Wayne_VaporRecoveryDataCollectorBoard.BoardStateEnum.Initializing;
  34. base.FireOnBoardStateChangeEvent(b);
  35. }
  36. await Task.Delay(3000);
  37. foreach (var b in base.Boards)
  38. {
  39. b.State = Wayne_VaporRecoveryDataCollectorBoard.BoardStateEnum.Initialized;
  40. base.FireOnBoardStateChangeEvent(b);
  41. }
  42. foreach (var b in base.Boards)
  43. {
  44. foreach (var n in b.Nozzles)
  45. {
  46. n.NozzleState = Wayne_VaporRecoveryDataCollectorBoard.MessageEntity.NozzleStateEnum.Idle;
  47. base.FireOnBoardNozzleStateChangeEvent(n);
  48. }
  49. }
  50. while (true)
  51. {
  52. if (this.isStop) break;
  53. await Task.Delay(3000);
  54. foreach (var b in base.Boards)
  55. {
  56. foreach (var n in b.Nozzles)
  57. {
  58. n.NozzleState = Wayne_VaporRecoveryDataCollectorBoard.MessageEntity.NozzleStateEnum.Fuelling;
  59. base.FireOnBoardNozzleStateChangeEvent(n);
  60. #region real time data
  61. for (int i = 0; i <= 7; i++)
  62. {
  63. var realTimeFlowData = new FakeRealTimeFlowData()
  64. {
  65. Address = b.BoardPhysicalAddress,
  66. NozzleStates = new List<KeyValuePair<byte, NozzleStateEnum>>()
  67. {
  68. new KeyValuePair<byte, NozzleStateEnum>((byte)n.NozzleNumberOnBoard, NozzleStateEnum.Fuelling)
  69. },
  70. NozzleLiquidAndAirFlowData = new List<Tuple<byte, double, double>>()
  71. {
  72. new Tuple<byte, double, double>((byte)n.NozzleNumberOnBoard,this.liquidLiter*(1+(double)i/100),this.vaporLitre*(1+(double)i/100))
  73. }
  74. };
  75. base.FireOnDataReceivedEvent(realTimeFlowData);
  76. await Task.Delay(1500);
  77. }
  78. #endregion
  79. await Task.Delay(1000);
  80. n.NozzleState = Wayne_VaporRecoveryDataCollectorBoard.MessageEntity.NozzleStateEnum.Idle;
  81. base.FireOnBoardNozzleStateChangeEvent(n);
  82. await Task.Delay(3000);
  83. var trxFlowData = new FakeTrxFlowData()
  84. {
  85. Address = b.BoardPhysicalAddress,
  86. NozzleNumber = (byte)n.NozzleNumberOnBoard,
  87. AirVolume = this.vaporLitre * 10,// 1100,
  88. LiquidVolume = this.liquidLiter * 10,//1000,
  89. FuellingStartTime = DateTime.Now.Subtract(new TimeSpan(0, 5, 0)),
  90. FuellingEndTime = DateTime.Now.Subtract(new TimeSpan(0, 0, 30)),
  91. 是否需要处理合并流量 = false,
  92. };
  93. base.FireOnDataReceivedEvent(trxFlowData);
  94. }
  95. }
  96. }
  97. });
  98. return Task.FromResult(true);
  99. }
  100. public Task<bool> Stop()
  101. {
  102. base.Dispose();
  103. this.isStop = true;
  104. return Task.FromResult(true);
  105. }
  106. public override async Task<READ_PARA_Response> ReadBoardNozzleInitParameters(byte boardPhysicalAddress, byte onBoardNozzleNumber)
  107. {
  108. var exists = this.boardNozzleInitParameters.FirstOrDefault(p => p.BoardPhysicalAddress == boardPhysicalAddress && p.OnBoardNozzleNumber == onBoardNozzleNumber);
  109. if (exists != null)
  110. {
  111. return new FakeREAD_PARA_Response()
  112. {
  113. Address = boardPhysicalAddress,
  114. NozzleNumber = onBoardNozzleNumber,
  115. 停止加油阀值 = exists.ParametersConfig.停止加油阀值,
  116. 加油脉冲当量 = exists.ParametersConfig.加油脉冲当量,
  117. 开始加油阀值 = exists.ParametersConfig.开始加油阀值,
  118. 最大未变化次数 = exists.ParametersConfig.最大未变化次数,
  119. 最小加油量 = exists.ParametersConfig.最小加油量,
  120. Raw_气液比值 = (int)(exists.ParametersConfig.气液比值 * 1000),
  121. 油气脉冲当量 = exists.ParametersConfig.油气脉冲当量,
  122. };
  123. }
  124. else
  125. return new FakeREAD_PARA_Response()
  126. {
  127. Address = boardPhysicalAddress,
  128. NozzleNumber = onBoardNozzleNumber,
  129. 停止加油阀值 = new Random().Next(100, 200),
  130. 加油脉冲当量 = new Random().Next(200, 400),
  131. 开始加油阀值 = new Random().Next(400, 700),
  132. 最大未变化次数 = (byte)new Random().Next(1, 100),
  133. 最小加油量 = new Random().Next(10000, 100000),
  134. Raw_气液比值 = 1 * 1000,
  135. 油气脉冲当量 = new Random().Next(400, 1500),
  136. };
  137. }
  138. private class BoardNozzleInitParameter
  139. {
  140. public byte BoardPhysicalAddress { get; set; }
  141. public byte OnBoardNozzleNumber { get; set; }
  142. public BoardInitParameterConfigV1 ParametersConfig { get; set; }
  143. }
  144. private List<BoardNozzleInitParameter> boardNozzleInitParameters = new List<BoardNozzleInitParameter>();
  145. public override async Task<bool> WriteBoardNozzleInitParameters(byte boardPhysicalAddress, byte onBoardNozzleNumber, BoardInitParameterConfigV1 parametersConfig)
  146. {
  147. var exists = this.boardNozzleInitParameters.FirstOrDefault(p => p.BoardPhysicalAddress == boardPhysicalAddress && p.OnBoardNozzleNumber == onBoardNozzleNumber);
  148. if (exists != null)
  149. this.boardNozzleInitParameters.Remove(exists);
  150. this.boardNozzleInitParameters.Add(new BoardNozzleInitParameter() { BoardPhysicalAddress = boardPhysicalAddress, OnBoardNozzleNumber = onBoardNozzleNumber, ParametersConfig = parametersConfig });
  151. return true;
  152. }
  153. [UniversalApi(Description = "人为指定接下来的模拟过程中的气体与液体的升数,数值均为不包括小数点的,即输入123,则实际代表1.23升(假设你之前的设置小数点位数是2)。" +
  154. "此数据将以极小的波动(为了更精确模拟实际的波动)应用于所有加油过程中的油气值,且将 输入值x10 作为加油完成后的油气值,一般的,0.83<=气液比值<=1.35为合格值,否则为不合格。")]
  155. public async Task<bool> ManualSetNextVaporAndLiquid(int vaporLitre, int liquidLiter)
  156. {
  157. this.vaporLitre = vaporLitre;
  158. this.liquidLiter = liquidLiter;
  159. return true;
  160. }
  161. }
  162. internal class FakeTrxFlowData : READ_ONE_HISTORY_DATA_Response
  163. {
  164. public override byte NozzleNumber { get; set; }
  165. public override int AirVolume { get; set; }
  166. public override int LiquidVolume { get; set; }
  167. public override DateTime FuellingStartTime { get; set; }
  168. public override DateTime FuellingEndTime { get; set; }
  169. public override bool 是否需要处理合并流量 { get; set; }
  170. }
  171. internal class FakeRealTimeFlowData : READ_WORKING_AND_TYPE_Response
  172. {
  173. public override IEnumerable<KeyValuePair<byte, NozzleHistoryDataStateEnum>> NozzleHistoryDataStates { get; set; }
  174. public override IEnumerable<Tuple<byte, double, double>> NozzleLiquidAndAirFlowData { get; set; }
  175. public override IEnumerable<KeyValuePair<byte, NozzleStateEnum>> NozzleStates { get; set; }
  176. }
  177. internal class FakeREAD_PARA_Response : READ_PARA_Response
  178. {
  179. public override byte NozzleNumber { get; set; }
  180. public override byte 最大未变化次数 { get; set; }
  181. public override int 开始加油阀值 { get; set; }
  182. public override int 停止加油阀值 { get; set; }
  183. public override int 最小加油量 { get; set; }
  184. public override int 加油脉冲当量 { get; set; }
  185. public override int 油气脉冲当量 { get; set; }
  186. public override int? Raw_气液比值 { get; set; }
  187. }
  188. }