HarewareMonitors.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using MinicsConsole.Helper.RawDataFilter;
  2. namespace MinicsConsole.Helper;
  3. public class HardWareMonitor(HardwareAddress address, Hardwares hardwares, Mini8DataDispatcher dataDispatcher, BasicInfo basicInfo, ILog log) : IOrmProvider
  4. {
  5. public ConcurrentDictionary<byte, IMini8Communicator> Mini8Communicators { get; } = [];
  6. public ConcurrentDictionary<byte, Mini8Provider> Mini8Providers { get; } = [];
  7. private ConcurrentDictionary<byte, IORM> ORMs { get; } = [];
  8. public bool ParallelCreateConnections()
  9. {
  10. if (address is null || address.Mini8sAddress is null)
  11. return false;
  12. Parallel.ForEach(address.Mini8sAddress.Keys, mini8 => CreateConnection(mini8, false));
  13. return true;
  14. }
  15. public bool ParallelStartDataCollecion()
  16. {
  17. Parallel.ForEach(Mini8Communicators.Values, comm => comm.StartDataCollector());
  18. return true;
  19. }
  20. public bool CloseConnections()
  21. {
  22. Parallel.ForEach(Mini8Communicators.Values, t => t?.Close());
  23. Mini8Providers.Values.Foreach(t => ((IDisposable)t)?.Dispose());
  24. ORMs.Values.Foreach(t => t?.Dispose());
  25. Mini8Communicators.Clear();
  26. Mini8Providers.Clear();
  27. ORMs.Clear();
  28. return true;
  29. }
  30. public void FullyReset()
  31. {
  32. CloseConnections();
  33. ParallelCreateConnections();
  34. ParallelStartDataCollecion();
  35. }
  36. public bool CreateConnection(byte mini8, bool startCollection)
  37. {
  38. string info = string.Empty;
  39. if (string.IsNullOrEmpty(basicInfo.DBConnectionString))
  40. {
  41. info = "DB Connection String Empty";
  42. goto @return;
  43. }
  44. if (!address.Mini8sAddress.TryGetValueNotNull(mini8, out Mini8Address mini8Address))
  45. {
  46. info = "Mini8 Address not Exist";
  47. goto @return;
  48. }
  49. if (string.IsNullOrEmpty(mini8Address.Address) || mini8Address.Port == 0)
  50. {
  51. info = "Mini8 Address Empty or Port not correct";
  52. goto @return;
  53. }
  54. if (!address.Mini8ChannelsAddress.TryGetValueNotNull(mini8, out var channelAddress))
  55. {
  56. info = "Channel Address Not Exist";
  57. goto @return;
  58. }
  59. if (!hardwares.Mini8Channels.TryGetValueNotNull(mini8, out var channels))
  60. {
  61. info = "Channels Not Exist";
  62. goto @return;
  63. }
  64. if (!this.ORMs.TryGetValue(mini8, out IORM? orm) || orm is null)
  65. {
  66. orm = new SqlSugarCustom();
  67. if (!orm.Initialize(this))
  68. {
  69. info = "ORM Initialize failed";
  70. goto @return;
  71. }
  72. if (!orm.Open(basicInfo.DBConnectionString, DbType.PostgreSQL))
  73. {
  74. info = $"{basicInfo.DBConnectionString} DB Connect failed";
  75. goto @return;
  76. }
  77. if (!channels.Values.TryForeach(channel => orm.CreateTable<DBFormat>($"Mini8-{mini8}-{channel.ChannelIndex}")))
  78. {
  79. info = "DB Create DBFormat Table Failed";
  80. goto @return;
  81. }
  82. if (!orm.CreateTable<DBWarning>($"Error-Mini8-{mini8}"))
  83. {
  84. info = "DB Create DBWarning Table Failed";
  85. goto @return;
  86. }
  87. this.ORMs[mini8] = orm;
  88. }
  89. if (!this.Mini8Providers.TryGetValue(mini8, out Mini8Provider? mini8Provider) || mini8Provider is null)
  90. {
  91. mini8Provider ??= new(mini8, log, basicInfo, channels, dataDispatcher);
  92. mini8Provider.ORM = orm;
  93. Mini8Providers[mini8] = mini8Provider;
  94. }
  95. if (this.Mini8Communicators.TryGetValue(mini8, out IMini8Communicator? mini8Communicator))
  96. mini8Communicator?.Close();
  97. IMini8Communicator sender = new Mini8CommunicatorModbus.Mini8Communcator_Modbus_FluentModbus();
  98. sender.Initialize(mini8Provider, mini8Address, channelAddress);
  99. if (!sender.Open())
  100. {
  101. info = $"Unable to connect to {mini8Address.Address}:{mini8Address.Port}";
  102. goto @return;
  103. }
  104. mini8Provider.Mini8Communicator = sender;
  105. if (startCollection)
  106. sender.StartDataCollector();
  107. this.Mini8Communicators[mini8] = sender;
  108. log.Info($"Mini8 {mini8} Connected - {mini8Address.Address}:{mini8Address.Port} ");
  109. return true;
  110. @return:
  111. log.Error($" Connect to Mini8 {mini8} Failed - {info}");
  112. return false;
  113. }
  114. public IEnumerable<(byte channelIndex, Dictionary<byte, Mini8Output>? realtimeData)> GetCurrentStatus()
  115. {
  116. List<(byte channelIndex, Dictionary<byte, Mini8Output>? realtimeData)> list = [];
  117. foreach (KeyValuePair<byte, IMini8Communicator> communicator in this.Mini8Communicators)
  118. {
  119. communicator.Value.GetRealtimeDataFromDevice(out Dictionary<byte, Mini8Output>? output);
  120. list.Add((communicator.Key, output));
  121. }
  122. return list;
  123. }
  124. public IEnumerable<(byte channelIndex, Dictionary<byte, Mini8Limit>? limits)> GetCurrentLimit()
  125. {
  126. List<(byte channelIndex, Dictionary<byte, Mini8Limit>? limits)> list = [];
  127. foreach (KeyValuePair<byte, IMini8Communicator> communicator in this.Mini8Communicators)
  128. {
  129. communicator.Value.GetRealtimeLimit(out Dictionary<byte, Mini8Limit>? output);
  130. list.Add((communicator.Key, output));
  131. }
  132. return list;
  133. }
  134. void IOrmProvider.Log(string logInfo, DateTime dateTime, ORM.LogLevel logLevel)
  135. {
  136. if (logLevel == ORM.LogLevel.Error)
  137. log.Error($"DataBase {logLevel}-{dateTime:hh:mm:ss} {logInfo}");
  138. }
  139. }