SensorGroupHandler.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using Edge.Core.Processor;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using Microsoft.Extensions.Logging;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Threading.Tasks;
  7. using PressureGage_3051.MessageEntity;
  8. using Edge.Core.Processor.Dispatcher.Attributes;
  9. using Edge.Core.Processor.Communicator;
  10. namespace PressureGage_3051
  11. {
  12. [MetaPartsRequired(typeof(HalfDuplexActivePollingDeviceProcessor<,>))]
  13. [MetaPartsRequired(typeof(ComPortCommunicator<>))]
  14. [MetaPartsRequired(typeof(TcpClientCommunicator<>))]
  15. [MetaPartsDescriptor(
  16. "lang-zh-cn:麦克智能压力变送器lang-zh-tw:麥克智能壓力變送器lang-en-us:PressureGageGroup",
  17. "lang-zh-cn:用于驱动 Modbus 协议的压力变送器组lang-zh-tw:用於驅動 Modbus 協議的壓力變送器組lang-en-us:Used for driven Pressure Gage Group which use Modbus Protocol",
  18. new[] { "lang-zh-cn:传感器lang-zh-tw:傳感器lang-en-us:Sensor" })]
  19. public class SensorGroupHandler : TestableActivePollingDeviceHandler<byte[], MessageBase>
  20. {
  21. private IContext<byte[], MessageBase> context;
  22. private ILogger logger = null;
  23. private readonly List<SensorHandler> sensorHandlerList = new List<SensorHandler>();
  24. private int sensorHandlerIndex = 0;
  25. public List<SensorHandler> SensorHandlerList
  26. {
  27. get
  28. {
  29. return sensorHandlerList;
  30. }
  31. }
  32. public class SensorGroupConfiguration
  33. {
  34. public string DeviceAddressList { get; set; }
  35. }
  36. [ParamsJsonSchemas("PressureGageGroupParamsJsonSchemas")]
  37. public SensorGroupHandler(SensorGroupConfiguration config, IServiceProvider services)
  38. {
  39. if (services != null)
  40. {
  41. var loggerFactory = services.GetRequiredService<ILoggerFactory>();
  42. logger = loggerFactory.CreateLogger("DynamicPrivate_PressureGage");
  43. }
  44. var deviceAddressArray = config.DeviceAddressList.Split(';', StringSplitOptions.RemoveEmptyEntries);
  45. logger.LogInformation($"SensorGroupHandler will create {deviceAddressArray.Length} sensor handlers for pressure gage Group from local config");
  46. CreateSensorHandlers(deviceAddressArray);
  47. }
  48. private void CreateSensorHandlers(string[] deviceAddressArray)
  49. {
  50. foreach (string deviceAddress in deviceAddressArray)
  51. {
  52. var sensorHandler = new SensorHandler(Convert.ToByte(deviceAddress), logger);
  53. sensorHandlerList.Add(sensorHandler);
  54. }
  55. }
  56. public override void Init(IContext<byte[], MessageBase> context)
  57. {
  58. base.Init(context);
  59. this.context = context;
  60. context.Communicator.OnConnected += async (_, __) =>
  61. {
  62. logger.LogInformation($"SensorGroupHandler Connected to COM port");
  63. await Task.CompletedTask;
  64. };
  65. foreach (var handler in sensorHandlerList)
  66. {
  67. handler.Init(context);
  68. }
  69. var timeWindowWithActivePollingOutgoing = this.context.Outgoing as TimeWindowWithActivePollingOutgoing<byte[], MessageBase>;
  70. timeWindowWithActivePollingOutgoing.PollingMsgProducer = () =>
  71. {
  72. var sensorHandler = sensorHandlerList[sensorHandlerIndex++];
  73. sensorHandlerIndex = sensorHandlerIndex < sensorHandlerList.Count ? sensorHandlerIndex : 0;
  74. return sensorHandler.GetRequestMessage();
  75. };
  76. }
  77. public override Task Process(IContext<byte[], MessageBase> context)
  78. {
  79. this.context = context;
  80. var ph = this.sensorHandlerList.Find(p => (byte)(p.DeviceAddress) == context.Incoming.Message.Address);
  81. if (ph == null)
  82. {
  83. logger.LogError($"SensorGroupHandler does not contain sensorHandler with address: {context.Incoming.Message.Address.ToString("X2")}");
  84. return Task.CompletedTask;
  85. }
  86. return ph.Process(context);
  87. }
  88. }
  89. public enum DeviceState
  90. {
  91. /// <summary>
  92. /// first time eastalized the connection with FC, or disconnected from a established connection.
  93. /// </summary>
  94. Disconnected,
  95. Connected
  96. }
  97. }