Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/ioctl.h>
- #include <linux/input.h>
- #include <sys/select.h>
- #include <sys/time.h>
- #include <string.h>
- #include <errno.h>
- #include <dirent.h>
- #include <time.h>
- // Константы
- #define MOUSE_DEVICE "/dev/input/event11" // Устройство мыши
- #define KEYBOARD_DEVICE "/dev/input/event4" // Устройство клавиатуры
- #define SIGNAL_FILE "/tmp/signalS" // Файл сигнала для управления программой
- #define SENSOR_FILE "/tmp/mySensors" // Файл с данными датчиков
- #define SCRIPT_PATH "/home/diver/Скрипты/sensors.sh" // Скрипт для получения данных датчиков
- #define IDLE_TIMEOUT 60 // Время бездействия перед переходом в спящий режим (секунды)
- #define TIMEOUT 1 // Таймаут проверки активности устройств (секунды)
- #define BRIGHTNESS_LOW 60 // Минимальная яркость экрана
- #define BRIGHTNESS_OFF 0 // Выключенная яркость экрана
- #define TEMP_THRESHOLD 60 // Пороговая температура для изменения частоты процессора
- #define FREQ_LOW "800MHz" // Низкая частота процессора
- #define FREQ_HIGH "4.0GHz" // Высокая частота процессора
- // Функция для выполнения внешних команд
- void run_command(const char *command) {
- FILE *fp = popen(command, "r");
- if (!fp) {
- fprintf(stderr, "Не удалось выполнить команду: %s\n", command);
- return;
- }
- char buffer[128];
- while (fgets(buffer, sizeof(buffer), fp)) {
- printf("%s", buffer);
- }
- pclose(fp);
- }
- // Функция для получения текущей частоты процессора
- void get_current_cpu_frequency() {
- printf("Текущая частота процессора:\n");
- run_command("cpupower frequency-info | grep 'current CPU freq'");
- }
- // Функция для проверки активности устройства
- int check_device_activity(const char *device_path, int timeout) {
- int fd = open(device_path, O_RDONLY | O_NONBLOCK);
- if (fd < 0) {
- perror("Не удалось открыть устройство");
- return 0;
- }
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(fd, &fds);
- struct timeval tv = {timeout, 0};
- int ret = select(fd + 1, &fds, NULL, NULL, &tv);
- close(fd);
- if (ret > 0) {
- printf("Активность обнаружена на %s\n", device_path);
- return 1;
- }
- return 0;
- }
- // Функция для проверки работы mpv
- int is_mpv_running() {
- DIR *dir = opendir("/proc");
- if (!dir) {
- perror("Не удалось открыть /proc");
- return 0;
- }
- struct dirent *entry;
- while ((entry = readdir(dir)) != NULL) {
- if (entry->d_type == DT_DIR) {
- char path[256];
- snprintf(path, sizeof(path), "/proc/%s/comm", entry->d_name);
- FILE *fp = fopen(path, "r");
- if (fp) {
- char comm[16];
- if (fgets(comm, sizeof(comm), fp)) {
- if (strncmp(comm, "mpv", 3) == 0) {
- fclose(fp);
- closedir(dir);
- return 1;
- }
- }
- fclose(fp);
- }
- }
- }
- closedir(dir);
- return 0;
- }
- // Функция для установки яркости экрана
- void set_screen_brightness(int level) {
- char command[64];
- snprintf(command, sizeof(command), "xbacklight -set %d", level);
- run_command(command);
- }
- // Основная функция
- int main() {
- // Проверка и создание сигнального файла
- if (access(SIGNAL_FILE, F_OK) == 0) {
- remove(SIGNAL_FILE);
- printf("Сигнальный файл удален. Выход.\n");
- return 0;
- }
- FILE *file = fopen(SIGNAL_FILE, "w");
- if (!file) {
- perror("Не удалось создать сигнальный файл");
- return 1;
- }
- fclose(file);
- // Проверка устройств
- if (access(MOUSE_DEVICE, F_OK) != 0) {
- printf("Устройство мыши не найдено!\n");
- return 1;
- }
- if (access(KEYBOARD_DEVICE, F_OK) != 0) {
- printf("Устройство клавиатуры не найдено!\n");
- return 1;
- }
- // Основной цикл
- char last_frequency[16] = "";
- time_t last_activity_time = time(NULL); // Время последней активности
- int in_sleep_mode = 0; // Флаг спящего режима
- int in_game_mode = 0; // Флаг игрового режима
- while (access(SIGNAL_FILE, F_OK) == 0) {
- printf("\n--- Новая итерация ---\n");
- // Проверка активности
- int mouse_active = check_device_activity(MOUSE_DEVICE, TIMEOUT);
- int keyboard_active = check_device_activity(KEYBOARD_DEVICE, TIMEOUT);
- int mpv_active = is_mpv_running();
- // Обновление времени последней активности
- if (mouse_active || keyboard_active || mpv_active) {
- last_activity_time = time(NULL);
- if (in_sleep_mode) {
- printf("Активность обнаружена. Возобновление нормального режима.\n");
- in_sleep_mode = 0;
- set_screen_brightness(BRIGHTNESS_LOW);
- // Если выходим из спящего режима, восстанавливаем частоту процессора
- printf("Восстановление частоты процессора до стандартных значений...\n");
- run_command("cpupower frequency-set -g powersave -d 800MHz -u 4.0GHz");
- get_current_cpu_frequency();
- }
- }
- // Проверка времени бездействия
- if (!in_sleep_mode && (time(NULL) - last_activity_time) >= IDLE_TIMEOUT) {
- printf("Нет активности более %d секунд. Переход в спящий режим...\n", IDLE_TIMEOUT);
- in_sleep_mode = 1;
- set_screen_brightness(BRIGHTNESS_OFF);
- // В спящем режиме принудительно устанавливаем частоту процессора на 800 МГц
- printf("Принудительное снижение частоты процессора до 800 МГц...\n");
- run_command("cpupower frequency-set -g powersave -d 800MHz -u 800MHz");
- get_current_cpu_frequency();
- }
- // Проверка игрового режима
- if (mpv_active) {
- if (!in_game_mode) {
- printf("Обнаружен игровой режим (mpv запущен).\n");
- in_game_mode = 1;
- }
- } else {
- if (in_game_mode) {
- printf("Игровой режим завершен (mpv остановлен).\n");
- in_game_mode = 0;
- // При выходе из игрового режима восстанавливаем частоту процессора
- printf("Восстановление частоты процессора после игрового режима...\n");
- run_command("cpupower frequency-set -g powersave -d 800MHz -u 4.0GHz");
- get_current_cpu_frequency();
- }
- }
- // Проверка температуры
- run_command(SCRIPT_PATH);
- FILE *sensor_file = fopen(SENSOR_FILE, "r");
- if (sensor_file) {
- char buffer[32];
- if (fgets(buffer, sizeof(buffer), sensor_file)) {
- float temperature = atof(buffer);
- printf("Текущая температура: %.2f°C\n", temperature);
- // Управление частотой процессора
- const char *target_frequency = (temperature >= TEMP_THRESHOLD)
- ? FREQ_LOW
- : FREQ_HIGH;
- if (strcmp(target_frequency, last_frequency) != 0) {
- printf("Температура %.2f°C превышает порог %d°C. Переключение частоты процессора на %s...\n",
- temperature, TEMP_THRESHOLD, target_frequency);
- char command[128];
- snprintf(command, sizeof(command),
- "cpupower frequency-set -g powersave -d 800MHz -u %s",
- target_frequency);
- run_command(command);
- strncpy(last_frequency, target_frequency, sizeof(last_frequency) - 1);
- get_current_cpu_frequency();
- } else {
- printf("Температура %.2f°C в пределах нормы. Частота процессора остается на %s.\n",
- temperature, target_frequency);
- }
- } else {
- printf("Не удалось прочитать данные из файла сенсоров.\n");
- }
- fclose(sensor_file);
- } else {
- printf("Не удалось открыть файл сенсоров.\n");
- }
- sleep(TIMEOUT);
- }
- printf("Сигнальный файл удален. Выход.\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement