mirror of https://github.com/shirou/gopsutil
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
1 year ago
|
// SPDX-License-Identifier: BSD-3-Clause
|
||
|
//go:build windows
|
||
|
|
||
|
package sensors
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"math"
|
||
|
|
||
|
"github.com/shirou/gopsutil/v4/internal/common"
|
||
|
"github.com/yusufpapurcu/wmi"
|
||
|
)
|
||
|
|
||
|
type msAcpi_ThermalZoneTemperature struct {
|
||
|
Active bool
|
||
|
CriticalTripPoint uint32
|
||
|
CurrentTemperature uint32
|
||
|
InstanceName string
|
||
|
}
|
||
|
|
||
|
func TemperaturesWithContext(ctx context.Context) ([]TemperatureStat, error) {
|
||
|
var ret []TemperatureStat
|
||
|
var dst []msAcpi_ThermalZoneTemperature
|
||
|
q := wmi.CreateQuery(&dst, "")
|
||
|
if err := common.WMIQueryWithContext(ctx, q, &dst, nil, "root/wmi"); err != nil {
|
||
|
return ret, err
|
||
|
}
|
||
|
|
||
|
for _, v := range dst {
|
||
|
ts := TemperatureStat{
|
||
|
SensorKey: v.InstanceName,
|
||
|
Temperature: kelvinToCelsius(v.CurrentTemperature, 2),
|
||
|
}
|
||
|
ret = append(ret, ts)
|
||
|
}
|
||
|
|
||
|
return ret, nil
|
||
|
}
|
||
|
|
||
|
func kelvinToCelsius(temp uint32, n int) float64 {
|
||
|
// wmi return temperature Kelvin * 10, so need to divide the result by 10,
|
||
|
// and then minus 273.15 to get °Celsius.
|
||
|
t := float64(temp/10) - 273.15
|
||
|
n10 := math.Pow10(n)
|
||
|
return math.Trunc((t+0.5/n10)*n10) / n10
|
||
|
}
|