-
Notifications
You must be signed in to change notification settings - Fork 1
/
utils.go
132 lines (103 loc) · 3.06 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package main
import (
"io/ioutil"
"regexp"
"strconv"
"strings"
)
func readSysFile(path string) string {
f, _ := ioutil.ReadFile(path)
return strings.TrimSpace(string(f))
}
func readSysFileToInt(path string) int {
val, _ := strconv.ParseInt(readSysFile(path), 10, 64)
return int(val)
}
func overrideSysFile(path, data string) {
err := ioutil.WriteFile(path, []byte(data), 0644)
if err != nil {
panic(err.Error())
}
}
func overrideSysFileWithInt(path string, data int) {
overrideSysFile(path, strconv.FormatInt(int64(data), 10))
}
func percentage(x, a, b int) int {
fx := float64(x)
fa := float64(a)
fb := float64(b)
val := (fx - fa) / (fb - fa)
val *= 100
return int(val)
}
type card struct {
card string
name string
temp string
fan string
fanm int
}
func newCard(c string) card {
return card{c, getCardName(c), getTemperatureAsString(c), getFanSpeedAsString(c), getFanMode(c)}
}
// List card information
func listCards() []string {
list := make([]string, 0)
files, _ := ioutil.ReadDir("/sys/class/drm")
for _, f := range files {
matched, _ := regexp.MatchString("^card\\d$", f.Name())
if matched {
list = append(list, f.Name())
}
}
return list
}
func listCardsS() []card {
list := make([]card, 0)
files, _ := ioutil.ReadDir("/sys/class/drm")
for _, f := range files {
matched, _ := regexp.MatchString("^card\\d$", f.Name())
if matched {
list = append(list, newCard(f.Name()))
}
}
return list
}
// Sysfs getters
func getFanSpeed(card string) int {
min := readSysFileToInt("/sys/class/drm/" + card + "/device/hwmon/hwmon1/pwm1_min")
max := readSysFileToInt("/sys/class/drm/" + card + "/device/hwmon/hwmon1/pwm1_max")
val := readSysFileToInt("/sys/class/drm/" + card + "/device/hwmon/hwmon1/pwm1")
return percentage(val, min, max)
}
func getFanSpeedAsString(card string) string {
return strconv.FormatInt(int64(getFanSpeed(card)), 10)
}
func getCardName(card string) string {
name := readSysFile("/sys/class/drm/" + card + "/device/hwmon/hwmon1/name")
return name
}
func getTemperature(card string) float64 {
tempStr := readSysFile("/sys/class/drm/" + card + "/device/hwmon/hwmon1/temp1_input")
tempStr = tempStr[:2] + "." + tempStr[2:4]
temp, _ := strconv.ParseFloat(tempStr, 64)
return temp
}
func getTemperatureAsString(card string) string {
tempStr := readSysFile("/sys/class/drm/" + card + "/device/hwmon/hwmon1/temp1_input")
tempStr = tempStr[:2] + "." + tempStr[2:3]
return tempStr
}
func getFanMode(card string) int {
tempStr := readSysFileToInt("/sys/class/drm/" + card + "/device/hwmon/hwmon1/pwm1_enable")
return tempStr
}
func setFanMode(card string, m int) {
overrideSysFileWithInt("/sys/class/drm/"+card+"/device/hwmon/hwmon1/pwm1_enable", m)
}
func setFanSpeed(card string, p int) {
min := readSysFileToInt("/sys/class/drm/" + card + "/device/hwmon/hwmon1/pwm1_min")
max := readSysFileToInt("/sys/class/drm/" + card + "/device/hwmon/hwmon1/pwm1_max")
speed := int(((float64(p)/100.0)*(float64(max)-float64(min)) + float64(min)))
overrideSysFileWithInt("/sys/class/drm/"+card+"/device/hwmon/hwmon1/pwm1", speed)
}