-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcpuslider.py
executable file
·113 lines (98 loc) · 4.29 KB
/
cpuslider.py
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
#!/usr/bin/env python
from cpusliderwindow import Ui_cpuSliderWindow
import sys
from functools import partial
from PyQt4 import QtGui, QtCore
CPUFREQ = '/sys/devices/system/cpu/cpu0/cpufreq/'
class CPUSlider(QtGui.QMainWindow):
def __init__(self):
super(CPUSlider, self).__init__()
self.ui = Ui_cpuSliderWindow()
self.ui.setupUi(self)
self.setup()
self.refresh()
def setup(self):
self.statusLabel = QtGui.QLabel()
self.ui.statusbar.addWidget(self.statusLabel)
self.layout = QtGui.QGridLayout()
with open(CPUFREQ + 'scaling_available_governors') as f:
governors = f.read().split()
self.buttons = []
for i, line in enumerate(governors):
button = QtGui.QRadioButton(line)
self.layout.addWidget(button, i, 0)
self.layout.setRowStretch(i, 1)
self.connect(button, QtCore.SIGNAL('toggled(bool)'),
partial(self.buttonToggled, line))
self.buttons.append(button)
with open(CPUFREQ + 'scaling_available_frequencies') as f:
self.freqs = f.read().split()
with open(CPUFREQ + 'scaling_cur_freq') as f:
cur_freq = f.read().strip()
self.slider = QtGui.QSlider(QtCore.Qt.Vertical)
self.slider.setMaximum(len(self.freqs) - 1) # minimum defaults to 0
# The value will be set in refresh.
self.layout.addWidget(self.slider, 0, 1, len(governors) - 1, 1)
self.connect(self.slider, QtCore.SIGNAL('valueChanged(int)'),
self.updateLabel)
self.label = QtGui.QLabel("%.1fGHz" % (float(cur_freq) / 1e6))
self.layout.addWidget(self.label, len(governors) - 1, 1)
self.ui.groupBox.setLayout(self.layout)
def refresh(self):
# Set the status bar to the current governor
with open(CPUFREQ + 'scaling_governor') as f:
governor = f.read().strip()
self.statusLabel.setText(governor)
with open(CPUFREQ + 'scaling_available_governors') as f:
governors = f.read().split()
# Remove governors which no longer exist
for button in self.buttons: # TODO Can't test this easily...
if button.text() not in governors:
button.deleteLater()
self.buttons.remove(button)
elif button.text() == governor:
button.setChecked(True)
with open(CPUFREQ + 'scaling_available_frequencies') as f:
self.freqs = f.read().split()
# Set the slider bar to the current frequency.
with open(CPUFREQ + 'scaling_cur_freq') as f:
freq = f.read().strip()
# Set the slider value without invoking updateLabel, because it
# changes the governor and the frequency.
self.disconnect(self.slider, QtCore.SIGNAL('valueChanged(int)'),
self.updateLabel)
self.slider.setValue(len(self.freqs) - self.freqs.index(freq) - 1)
self.connect(self.slider, QtCore.SIGNAL('valueChanged(int)'),
self.updateLabel)
if governor in ("userspace", "powersave", "performance"):
self.label.setText("%.1fGHz" % (float(freq) / 1e6))
else:
self.label.setText("Dynamic")
def updateLabel(self, value):
new_freq = self.freqs[-value - 1]
with open(CPUFREQ + 'scaling_governor') as f:
governor = f.read().strip()
if governor in ("userspace", "powersave", "performance"):
self.label.setText("%.1fGHz" % (float(new_freq) / 1e6))
else:
self.label.setText("Dynamic")
if governor != "userspace":
with open(CPUFREQ + 'scaling_governor', 'w') as f:
f.write("userspace\n")
for button in self.buttons:
if button.text() == "userspace":
button.setChecked(True)
with open(CPUFREQ + 'scaling_setspeed', 'w') as f:
f.write(new_freq + '\n')
def buttonToggled(self, name, checked):
if checked:
with open(CPUFREQ + 'scaling_governor', 'w') as f:
f.write(name + '\n')
self.refresh()
def main():
app = QtGui.QApplication(sys.argv)
mainwindow = CPUSlider()
mainwindow.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()