今日编程感想

于 2019-04-10 发布

原来一直用C写的温控,但是想实现的很多功能都做不到——主要是C学得一点毛皮就开始写——但是习惯了Java想要什么功能就有什么包,以及成熟的IDE(好吧就是我智障总是写bug),所以决定改写成Java版本的。但是之前一直习惯了C和Linux的紧密相连,思路也是shell的思路,所以在Java里面也下意识想要用Process类的exec()来执行echo命令——风扇控制、频率限制都是通过写入文件来实现的。实际上因为exec()并不是一个shell,所以这样做是不行的。要想写入文件,还是要通过正式的FileWriter等类来实现。

现在剩下的问题是怎么在IDE里实现用root权限测试程序,不然每次都要去terminal里sudo真是很烦恼。

参考了: Java FileWriter类 Java FileReader类 CSDN - Java将字符串写入文件与将文件内容读取到字符串 Techie Delight - Convert char array to String in Java CSDN - intellij idea 导出可执行jar

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
import java.io.*;

import static java.lang.Thread.sleep;

public class Thermal {
    private static int[] tempSteps = {48, 50, 55, 60, 70, 80, 84, 90};
    private static Boolean freqLimitOn = false;

    private static int temperatureReader() throws IOException {
        char[] temp = new char[2];
        FileReader reader0 = new FileReader(new File("/sys/class/thermal/thermal_zone0/temp"));
        FileReader reader1 = new FileReader(new File("/sys/class/thermal/thermal_zone1/temp"));

        reader0.read(temp);
        int temp0 = Integer.parseInt(String.valueOf(temp));
        reader1.read(temp);
        int temp1 = Integer.parseInt(String.valueOf(temp));

        return ((temp0 >= temp1) ? temp0 : temp1);

    }

    private void fancontroller(int level) throws IOException {
        FileWriter fw = new FileWriter("/proc/acpi/ibm/fan", false);
        fw.write("level " + level);
        fw.flush();
    }

    private void levelJudge(int temperature) throws IOException {
        for (int i = tempSteps.length - 1; i >= 0; i--) {
            if (temperature >= tempSteps[i]) {
                fancontroller(i);
                break;
            }

        }
    }

    private static void freqLimitSetter(long freq) throws IOException {
        FileWriter fw;
        String filepath;
        for (int i = 0; i <= 7; i++) {
            filepath = String.format("/sys/devices/system/cpu/cpufreq/policy%d/scaling_max_freq", i);
            fw = new FileWriter(filepath, false);
            fw.write("" + freq);
            fw.flush();
            fw.close();
        }
    }

    private void freqthrottle() throws IOException {


        if ((temperatureReader() > 84) && !freqLimitOn) {
            freqLimitSetter(2100000);
            freqLimitOn = true;
            System.out.println("limited cpu freq");
        } else if (freqLimitOn) {
            freqLimitSetter(3500000);
            System.out.println("unlimited cpu freq");
        }


    }


    public static void main(String[] args) {
        Thermal thermal = new Thermal();
        try {
            while (true) {
                thermal.levelJudge(temperatureReader());
                thermal.freqthrottle();
                sleep(5000);
            }

        } catch (InterruptedException | IOException e) {
            e.printStackTrace();
        }

    }

}

目录