Files
TrafficMonitor/OpenHardwareMonitorApi/OpenHardwareMonitorImp.cpp
T

250 lines
7.5 KiB
C++

// 这是主 DLL 文件。
#include "stdafx.h"
#include "OpenHardwareMonitorImp.h"
#include <vector>
namespace OpenHardwareMonitorApi
{
//将CRL的String类型转换成C++的std::wstring类型
static std::wstring ClrStringToStdWstring(System::String^ str)
{
const wchar_t* chars = reinterpret_cast<const wchar_t*>((System::Runtime::InteropServices::Marshal::StringToHGlobalUni(str)).ToPointer());
return std::wstring(chars);
}
std::shared_ptr<IOpenHardwareMonitor> CreateInstance()
{
MonitorGlobal::Instance()->Init();
return std::make_shared<COpenHardwareMonitor>();
}
float COpenHardwareMonitor::CpuTemperature()
{
return m_cpu_temperature;
}
float COpenHardwareMonitor::GpuTemperature()
{
if (m_gpu_nvidia_temperature >= 0)
return m_gpu_nvidia_temperature;
else
return m_gpu_ati_temperature;
}
float COpenHardwareMonitor::HDDTemperature()
{
return m_hdd_temperature;
}
float COpenHardwareMonitor::MainboardTemperature()
{
return m_main_board_temperature;
}
float COpenHardwareMonitor::GpuUsage()
{
if (m_gpu_nvidia_usage >= 0)
return m_gpu_nvidia_usage;
else
return m_gpu_ati_usage;
}
const std::map<std::wstring, float>& COpenHardwareMonitor::AllHDDTemperature()
{
return m_all_hdd_temperature;
}
const std::map<std::wstring, float>& COpenHardwareMonitor::AllCpuTemperature()
{
return m_all_cpu_temperature;
}
void COpenHardwareMonitor::SetCpuEnable(bool enable)
{
MonitorGlobal::Instance()->computer->IsCpuEnabled = enable;
}
void COpenHardwareMonitor::SetGpuEnable(bool enable)
{
MonitorGlobal::Instance()->computer->IsGpuEnabled = enable;
}
void COpenHardwareMonitor::SetHddEnable(bool enable)
{
MonitorGlobal::Instance()->computer->IsStorageEnabled = enable;
}
void COpenHardwareMonitor::SetMainboardEnable(bool enable)
{
MonitorGlobal::Instance()->computer->IsMotherboardEnabled = enable;
}
bool COpenHardwareMonitor::GetHardwareTemperature(IHardware^ hardware, float& temperature)
{
temperature = -1;
std::vector<float> all_temperature;
for (int i = 0; i < hardware->Sensors->Length; i++)
{
//找到温度传感器
if (hardware->Sensors[i]->SensorType == SensorType::Temperature)
{
float cur_temperture = Convert::ToDouble(hardware->Sensors[i]->Value);
all_temperature.push_back(cur_temperture);
}
}
if (!all_temperature.empty())
{
//如果有多个温度传感器,则取平均值
float sum{};
for (auto i : all_temperature)
sum += i;
temperature = sum / all_temperature.size();
return true;
}
//如果没有找到温度传感器,则在SubHardware中寻找
for (int i = 0; i < hardware->SubHardware->Length; i++)
{
if (GetHardwareTemperature(hardware->SubHardware[i], temperature))
return true;
}
return false;
}
bool COpenHardwareMonitor::GetCpuTemperature(IHardware^ hardware, float& temperature)
{
temperature = -1;
m_all_cpu_temperature.clear();
for (int i = 0; i < hardware->Sensors->Length; i++)
{
//找到温度传感器
if (hardware->Sensors[i]->SensorType == SensorType::Temperature)
{
String^ name = hardware->Sensors[i]->Name;
//保存每个CPU传感器的温度
m_all_cpu_temperature[ClrStringToStdWstring(name)] = Convert::ToDouble(hardware->Sensors[i]->Value);
}
}
//计算平均温度
if (!m_all_cpu_temperature.empty())
{
float sum{};
for (const auto& item : m_all_cpu_temperature)
sum += item.second;
temperature = sum / m_all_cpu_temperature.size();
}
return temperature > 0;
}
bool COpenHardwareMonitor::GetGpuUsage(IHardware^ hardware, float& gpu_usage)
{
for (int i = 0; i < hardware->Sensors->Length; i++)
{
//找到负载
if (hardware->Sensors[i]->SensorType == SensorType::Load)
{
if (hardware->Sensors[i]->Name == L"GPU Core")
{
gpu_usage = Convert::ToDouble(hardware->Sensors[i]->Value);
return true;
}
}
}
return false;
}
COpenHardwareMonitor::COpenHardwareMonitor()
{
ResetAllValues();
}
COpenHardwareMonitor::~COpenHardwareMonitor()
{
MonitorGlobal::Instance()->UnInit();
}
void COpenHardwareMonitor::ResetAllValues()
{
m_cpu_temperature = -1;
m_gpu_nvidia_temperature = -1;
m_gpu_ati_temperature = -1;
m_hdd_temperature = -1;
m_main_board_temperature = -1;
m_gpu_nvidia_usage = -1;
m_gpu_ati_usage = -1;
m_all_hdd_temperature.clear();
}
void COpenHardwareMonitor::GetHardwareInfo()
{
ResetAllValues();
auto computer = MonitorGlobal::Instance()->computer;
computer->Accept(MonitorGlobal::Instance()->updateVisitor);
for (int i = 0; i < computer->Hardware->Count; i++)
{
//查找硬件类型
switch (computer->Hardware[i]->HardwareType)
{
case HardwareType::Cpu:
if (m_cpu_temperature < 0)
GetCpuTemperature(computer->Hardware[i], m_cpu_temperature);
break;
case HardwareType::GpuNvidia:
if (m_gpu_nvidia_temperature < 0)
GetHardwareTemperature(computer->Hardware[i], m_gpu_nvidia_temperature);
if (m_gpu_nvidia_usage < 0)
GetGpuUsage(computer->Hardware[i], m_gpu_nvidia_usage);
break;
case HardwareType::GpuAmd:
if (m_gpu_ati_temperature < 0)
GetHardwareTemperature(computer->Hardware[i], m_gpu_ati_temperature);
if (m_gpu_ati_usage < 0)
GetGpuUsage(computer->Hardware[i], m_gpu_ati_usage);
break;
case HardwareType::Storage:
{
float cur_hdd_temperature = -1;
GetHardwareTemperature(computer->Hardware[i], cur_hdd_temperature);
m_all_hdd_temperature[ClrStringToStdWstring(computer->Hardware[i]->Name)] = cur_hdd_temperature;
if (m_hdd_temperature < 0)
m_hdd_temperature = cur_hdd_temperature;
}
break;
case HardwareType::Motherboard:
if (m_main_board_temperature < 0)
GetHardwareTemperature(computer->Hardware[i], m_main_board_temperature);
break;
default:
break;
}
}
}
////////////////////////////////////////////////////////////////////////////////////
MonitorGlobal::MonitorGlobal()
{
}
MonitorGlobal::~MonitorGlobal()
{
}
void MonitorGlobal::Init()
{
updateVisitor = gcnew UpdateVisitor();
computer = gcnew Computer();
computer->Open();
}
void MonitorGlobal::UnInit()
{
computer->Close();
}
}