今日编程感想

原来一直用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

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();
        }

    }

}

 

留下评论