using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Text; using System.Threading.Tasks; using System.Diagnostics; namespace Uestc.Auto6.Dso.Hardware.Driver { public class SysMonitor { internal static SysMonitor Default = new SysMonitor(); private static List _AnalogChannelTemperatures = new List() { 40.0,-40.0}; internal List AnalogChannelTemperatures { get { return _AnalogChannelTemperatures; } } //Stopwatch _Stopwatch=new Stopwatch(); internal void ReadAnalogChannelTemperatures() { ////test code //if (!_Stopwatch.IsRunning) // _Stopwatch.Start(); //if (_Stopwatch.ElapsedMilliseconds>5000) //{ // _Stopwatch.Restart(); // _AnalogChannelTemperatures[0] = _AnalogChannelTemperatures[0] * 1.1; // _AnalogChannelTemperatures[1] = _AnalogChannelTemperatures[1] * 1.1; //} //return; ////end test code #region 非8G通道 UInt32 data_H = HdIO.ReadReg(PcieBdReg.R.AnalogChCtrl_CH_temp_H); UInt32 data_L = HdIO.ReadReg(PcieBdReg.R.AnalogChCtrl_CH_temp_L); UInt32 Temperatures = (data_H << 16) | (data_L); if ((Temperatures & 0xff0000ff) == 0x550000aa) { Temperatures = (Temperatures >> 8) & 0xffff; int tmp = ComplementConvert(Temperatures); _AnalogChannelTemperatures[0] = tmp * 1.0 / 10;//单片机有误 } #endregion #region 8G通道 data_H = HdIO.ReadReg(PcieBdReg.R.AnalogChCtrl_CH_temp2_H); data_L = HdIO.ReadReg(PcieBdReg.R.AnalogChCtrl_CH_temp2_L); Temperatures = (data_H << 16) | (data_L); if ((Temperatures & 0xff0000ff) == 0x550000aa) { int tmp = ComplementConvert(Temperatures); _AnalogChannelTemperatures[1] = tmp * 1.0 / 10;//单片机有误 } #endregion HdIO.WriteReg(PcieBdReg.W.AnalogChCtrl_ch_temp_setting, 1); HdIO.WriteReg(PcieBdReg.W.AnalogChCtrl_ch_temp_setting, 0); } internal string ReadAndGetAnalogChannelTemperatures(int whichType) { ReadAnalogChannelTemperatures(); return whichType switch { 0 => _AnalogChannelTemperatures[0].ToString(), 1 => _AnalogChannelTemperatures[1].ToString(), _ => "0.0" }; } private int ComplementConvert(UInt32 data) { data &= 0x7ff; int mark = 1; if ((data & 0x400) != 0) { mark = -1; data &= 0x3ff; data = ~data; data &= 0x3ff; data = +1; } //补码运算 int temprature = (int)data; temprature *= mark; return temprature; } internal string Read() { StringBuilder stringBuilder = new StringBuilder(); #region Pcie board string boardName = "PcieBoard:"; HdIO.WriteReg(PcieBdReg.W.SysMon_Reset, 0); HdIO.WriteReg(PcieBdReg.W.SysMon_Reset, 1); Thread.Sleep(5); UInt32 data = 0; data = HdIO.ReadReg(PcieBdReg.R.SysMon_ReadData); stringBuilder.AppendLine($"{boardName}SysMon_ReadData={((uint)data).ToString()}"); ReadAnalogChannelTemperatures(); stringBuilder.AppendLine($"{boardName}PhyChannelTemperatures={AnalogChannelTemperatures[0].ToString()}"); stringBuilder.AppendLine($"{boardName}PhyChannelTemperatures_8G={AnalogChannelTemperatures[1].ToString()}"); HdIO.WriteReg(PcieBdReg.W.SysMon_Reset, 0); #endregion stringBuilder.AppendLine("======================================"); #region S6Board #endregion stringBuilder.AppendLine("======================================"); #region ProcessBoard boardName = "ProcBoard:"; HdIO.WriteReg(ProcBdReg.W.SysMon_pro_sysmon_rst, 0); //HdIO.WriteReg(ProcBdReg.W.SysMon_pro_sysmon_rst, 1); Thread.Sleep(5); data = HdIO.ReadReg(ProcBdReg.R.SysMon_pro_fpga_temp); data &= 0xfff; double temprature = 0.0; temprature = (int)data; temprature = (temprature * 503.975) / 4096 - 273.15; stringBuilder.AppendLine($"{boardName}SysMon_pro_fpga_temp={temprature.ToString()}℃"); data = HdIO.ReadReg(ProcBdReg.R.SysMon_pro_fpga_vccaux); data &= 0xfff; temprature = (int)data; temprature = temprature / 4096 * 3; stringBuilder.AppendLine($"{boardName}SysMon_pro_fpga_vccaux={temprature.ToString()}"); data = HdIO.ReadReg(ProcBdReg.R.SysMon_pro_fpga_vccbram); data &= 0xfff; temprature = (int)data; temprature = temprature / 4096 * 3; stringBuilder.AppendLine($"{boardName}SysMon_pro_fpga_vccbram={temprature.ToString()}"); data = HdIO.ReadReg(ProcBdReg.R.SysMon_pro_fpga_vccint); data &= 0xfff; temprature = (int)data; temprature = temprature / 4096 * 3; stringBuilder.AppendLine($"{boardName}SysMon_pro_fpga_vccint={temprature.ToString()}"); //HdIO.WriteReg(ProcBdReg.W.SysMon_pro_sysmon_rst, 0); #endregion stringBuilder.AppendLine("======================================"); #region AcqBoard for (int acqBdIndex = 0; acqBdIndex < Hd.currProduct!.AcqBd!.ExistsDefines.Count; acqBdIndex++) { if (Hd.currProduct!.AcqBd!.ExistsDefines[acqBdIndex]) { AcqBdNo acqBdNo = (AcqBdNo)acqBdIndex; boardName = "AcqBoard_" + acqBdNo.ToString()+":"; data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_fpga_temp, acqBdNo); data &= 0x3ff; temprature = (int)data; temprature = (temprature * 501.3743) / 1024 - 273.6777; stringBuilder.AppendLine($"{boardName}SysMon_acq_fpga_temp={temprature.ToString()}℃"); data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_fpga_vccaux, acqBdNo); data &= 0x3ff; temprature = (int)data; temprature = temprature / 1024 * 3; stringBuilder.AppendLine($"{boardName}SysMon_acq_fpga_vccaux={temprature.ToString()}"); data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_fpga_vccbram, acqBdNo); data &= 0x3ff; temprature = (int)data; temprature = temprature / 1024 * 3; stringBuilder.AppendLine($"{boardName}SysMon_acq_fpga_vccbram={temprature.ToString()}"); data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_fpga_vccint, acqBdNo); data &= 0x3ff; temprature = (int)data; temprature = temprature / 1024 * 3; stringBuilder.AppendLine($"{boardName}SysMon_acq_fpga_vccint={temprature.ToString()}"); data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_temp_adc1, acqBdNo); data &= 0x3ff; temprature = (int)data; temprature = temprature * 0.125; stringBuilder.AppendLine($"{boardName}SysMon_acq_temp_adc1={temprature.ToString()}℃"); data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_temp_adc2, acqBdNo); data &= 0x3ff; temprature = (int)data; temprature = temprature * 0.125; stringBuilder.AppendLine($"{boardName}SysMon_acq_temp_adc2={temprature.ToString()}℃"); data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_temp_pcb1, acqBdNo); temprature=ComplementConvert(data)* 0.125; stringBuilder.AppendLine($"{boardName}SysMon_acq_temp_pcb1={temprature.ToString()}℃"); data = Hd.currProduct!.AcqBd.ReadReg(AcqBdReg.R.SysMon_acq_temp_pcb2, acqBdNo); temprature = ComplementConvert(data) * 0.125; stringBuilder.AppendLine($"{boardName}SysMon_acq_temp_pcb2={temprature.ToString()}℃"); stringBuilder.AppendLine("======================================"); } } #endregion return stringBuilder.ToString(); } public double GetAnalogChannelTemperature(int whichType=0) { ReadAnalogChannelTemperatures(); return whichType switch { 0 => _AnalogChannelTemperatures[0], 1 => _AnalogChannelTemperatures[1], _ => 0.0, }; } } }