SysMonitor.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Diagnostics;
  8. namespace Uestc.Auto6.Dso.Hardware.Driver
  9. {
  10. public class SysMonitor
  11. {
  12. internal static SysMonitor Default = new SysMonitor();
  13. private static List<double> _AnalogChannelTemperatures = new List<double>() { 40.0,-40.0};
  14. internal List<double> AnalogChannelTemperatures
  15. {
  16. get { return _AnalogChannelTemperatures; }
  17. }
  18. //Stopwatch _Stopwatch=new Stopwatch();
  19. internal void ReadAnalogChannelTemperatures()
  20. {
  21. ////test code
  22. //if (!_Stopwatch.IsRunning)
  23. // _Stopwatch.Start();
  24. //if (_Stopwatch.ElapsedMilliseconds>5000)
  25. //{
  26. // _Stopwatch.Restart();
  27. // _AnalogChannelTemperatures[0] = _AnalogChannelTemperatures[0] * 1.1;
  28. // _AnalogChannelTemperatures[1] = _AnalogChannelTemperatures[1] * 1.1;
  29. //}
  30. //return;
  31. ////end test code
  32. #region 非8G通道
  33. UInt32 data_H = HdIO.ReadReg(PcieBdReg.R.AnalogChCtrl_CH_temp_H);
  34. UInt32 data_L = HdIO.ReadReg(PcieBdReg.R.AnalogChCtrl_CH_temp_L);
  35. UInt32 Temperatures = (data_H << 16) | (data_L);
  36. if ((Temperatures & 0xff0000ff) == 0x550000aa)
  37. {
  38. Temperatures = (Temperatures >> 8) & 0xffff;
  39. int tmp = ComplementConvert(Temperatures);
  40. _AnalogChannelTemperatures[0] = tmp * 1.0 / 10;//单片机有误
  41. }
  42. #endregion
  43. #region 8G通道
  44. data_H = HdIO.ReadReg(PcieBdReg.R.AnalogChCtrl_CH_temp2_H);
  45. data_L = HdIO.ReadReg(PcieBdReg.R.AnalogChCtrl_CH_temp2_L);
  46. Temperatures = (data_H << 16) | (data_L);
  47. if ((Temperatures & 0xff0000ff) == 0x550000aa)
  48. {
  49. int tmp = ComplementConvert(Temperatures);
  50. _AnalogChannelTemperatures[1] = tmp * 1.0 / 10;//单片机有误
  51. }
  52. #endregion
  53. HdIO.WriteReg(PcieBdReg.W.AnalogChCtrl_ch_temp_setting, 1);
  54. HdIO.WriteReg(PcieBdReg.W.AnalogChCtrl_ch_temp_setting, 0);
  55. }
  56. internal string ReadAndGetAnalogChannelTemperatures(int whichType)
  57. {
  58. ReadAnalogChannelTemperatures();
  59. return whichType switch
  60. {
  61. 0 => _AnalogChannelTemperatures[0].ToString(),
  62. 1 => _AnalogChannelTemperatures[1].ToString(),
  63. _ => "0.0"
  64. };
  65. }
  66. private int ComplementConvert(UInt32 data)
  67. {
  68. data &= 0x7ff;
  69. int mark = 1;
  70. if ((data & 0x400) != 0)
  71. {
  72. mark = -1;
  73. data &= 0x3ff;
  74. data = ~data;
  75. data &= 0x3ff;
  76. data = +1;
  77. }
  78. //补码运算
  79. int temprature = (int)data;
  80. temprature *= mark;
  81. return temprature;
  82. }
  83. internal string Read()
  84. {
  85. StringBuilder stringBuilder = new StringBuilder();
  86. #region Pcie board
  87. string boardName = "PcieBoard:";
  88. HdIO.WriteReg(PcieBdReg.W.SysMon_Reset, 0);
  89. HdIO.WriteReg(PcieBdReg.W.SysMon_Reset, 1);
  90. Thread.Sleep(5);
  91. UInt32 data = 0;
  92. data = HdIO.ReadReg(PcieBdReg.R.SysMon_ReadData);
  93. stringBuilder.AppendLine($"{boardName}SysMon_ReadData={((uint)data).ToString()}");
  94. ReadAnalogChannelTemperatures();
  95. stringBuilder.AppendLine($"{boardName}PhyChannelTemperatures={AnalogChannelTemperatures[0].ToString()}");
  96. stringBuilder.AppendLine($"{boardName}PhyChannelTemperatures_8G={AnalogChannelTemperatures[1].ToString()}");
  97. HdIO.WriteReg(PcieBdReg.W.SysMon_Reset, 0);
  98. #endregion
  99. stringBuilder.AppendLine("======================================");
  100. #region S6Board
  101. #endregion
  102. stringBuilder.AppendLine("======================================");
  103. #region ProcessBoard
  104. boardName = "ProcBoard:";
  105. HdIO.WriteReg(ProcBdReg.W.SysMon_pro_sysmon_rst, 0);
  106. //HdIO.WriteReg(ProcBdReg.W.SysMon_pro_sysmon_rst, 1);
  107. Thread.Sleep(5);
  108. data = HdIO.ReadReg(ProcBdReg.R.SysMon_pro_fpga_temp);
  109. data &= 0xfff;
  110. double temprature = 0.0;
  111. temprature = (int)data;
  112. temprature = (temprature * 503.975) / 4096 - 273.15;
  113. stringBuilder.AppendLine($"{boardName}SysMon_pro_fpga_temp={temprature.ToString()}℃");
  114. data = HdIO.ReadReg(ProcBdReg.R.SysMon_pro_fpga_vccaux);
  115. data &= 0xfff;
  116. temprature = (int)data;
  117. temprature = temprature / 4096 * 3;
  118. stringBuilder.AppendLine($"{boardName}SysMon_pro_fpga_vccaux={temprature.ToString()}");
  119. data = HdIO.ReadReg(ProcBdReg.R.SysMon_pro_fpga_vccbram);
  120. data &= 0xfff;
  121. temprature = (int)data;
  122. temprature = temprature / 4096 * 3;
  123. stringBuilder.AppendLine($"{boardName}SysMon_pro_fpga_vccbram={temprature.ToString()}");
  124. data = HdIO.ReadReg(ProcBdReg.R.SysMon_pro_fpga_vccint);
  125. data &= 0xfff;
  126. temprature = (int)data;
  127. temprature = temprature / 4096 * 3;
  128. stringBuilder.AppendLine($"{boardName}SysMon_pro_fpga_vccint={temprature.ToString()}");
  129. //HdIO.WriteReg(ProcBdReg.W.SysMon_pro_sysmon_rst, 0);
  130. #endregion
  131. stringBuilder.AppendLine("======================================");
  132. #region AcqBoard
  133. for (int acqBdIndex = 0; acqBdIndex < Hd.currProduct!.AcqBd!.ExistsDefines.Count; acqBdIndex++)
  134. {
  135. if (Hd.currProduct!.AcqBd!.ExistsDefines[acqBdIndex])
  136. {
  137. AcqBdNo acqBdNo = (AcqBdNo)acqBdIndex;
  138. boardName = "AcqBoard_" + acqBdNo.ToString()+":";
  139. data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_fpga_temp, acqBdNo);
  140. data &= 0x3ff;
  141. temprature = (int)data;
  142. temprature = (temprature * 501.3743) / 1024 - 273.6777;
  143. stringBuilder.AppendLine($"{boardName}SysMon_acq_fpga_temp={temprature.ToString()}℃");
  144. data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_fpga_vccaux, acqBdNo);
  145. data &= 0x3ff;
  146. temprature = (int)data;
  147. temprature = temprature / 1024 * 3;
  148. stringBuilder.AppendLine($"{boardName}SysMon_acq_fpga_vccaux={temprature.ToString()}");
  149. data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_fpga_vccbram, acqBdNo);
  150. data &= 0x3ff;
  151. temprature = (int)data;
  152. temprature = temprature / 1024 * 3;
  153. stringBuilder.AppendLine($"{boardName}SysMon_acq_fpga_vccbram={temprature.ToString()}");
  154. data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_fpga_vccint, acqBdNo);
  155. data &= 0x3ff;
  156. temprature = (int)data;
  157. temprature = temprature / 1024 * 3;
  158. stringBuilder.AppendLine($"{boardName}SysMon_acq_fpga_vccint={temprature.ToString()}");
  159. data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_temp_adc1, acqBdNo);
  160. data &= 0x3ff;
  161. temprature = (int)data;
  162. temprature = temprature * 0.125;
  163. stringBuilder.AppendLine($"{boardName}SysMon_acq_temp_adc1={temprature.ToString()}℃");
  164. data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_temp_adc2, acqBdNo);
  165. data &= 0x3ff;
  166. temprature = (int)data;
  167. temprature = temprature * 0.125;
  168. stringBuilder.AppendLine($"{boardName}SysMon_acq_temp_adc2={temprature.ToString()}℃");
  169. data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_temp_pcb1, acqBdNo);
  170. temprature=ComplementConvert(data)* 0.125;
  171. stringBuilder.AppendLine($"{boardName}SysMon_acq_temp_pcb1={temprature.ToString()}℃");
  172. data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_temp_pcb2, acqBdNo);
  173. temprature = ComplementConvert(data) * 0.125;
  174. stringBuilder.AppendLine($"{boardName}SysMon_acq_temp_pcb2={temprature.ToString()}℃");
  175. stringBuilder.AppendLine("======================================");
  176. }
  177. }
  178. #endregion
  179. return stringBuilder.ToString();
  180. }
  181. public double GetAnalogChannelTemperature(int whichType=0)
  182. {
  183. ReadAnalogChannelTemperatures();
  184. return whichType switch
  185. {
  186. 0 => _AnalogChannelTemperatures[0],
  187. 1 => _AnalogChannelTemperatures[1],
  188. _ => 0.0,
  189. };
  190. }
  191. }
  192. }