Advertisement
Guest User

Untitled

a guest
Jun 26th, 2025
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.93 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <sys/ioctl.h>
  6. #include <linux/input.h>
  7. #include <sys/select.h>
  8. #include <sys/time.h>
  9. #include <string.h>
  10. #include <errno.h>
  11. #include <dirent.h>
  12. #include <time.h>
  13.  
  14. // Константы
  15. #define MOUSE_DEVICE "/dev/input/event11"  // Устройство мыши
  16. #define KEYBOARD_DEVICE "/dev/input/event4"  // Устройство клавиатуры
  17. #define SIGNAL_FILE "/tmp/signalS"  // Файл сигнала для управления программой
  18. #define SENSOR_FILE "/tmp/mySensors"  // Файл с данными датчиков
  19. #define SCRIPT_PATH "/home/diver/Скрипты/sensors.sh"  // Скрипт для получения данных датчиков
  20. #define IDLE_TIMEOUT 60  // Время бездействия перед переходом в спящий режим (секунды)
  21. #define TIMEOUT 1  // Таймаут проверки активности устройств (секунды)
  22. #define BRIGHTNESS_LOW 60  // Минимальная яркость экрана
  23. #define BRIGHTNESS_OFF 0  // Выключенная яркость экрана
  24. #define TEMP_THRESHOLD 60  // Пороговая температура для изменения частоты процессора
  25. #define FREQ_LOW "800MHz"  // Низкая частота процессора
  26. #define FREQ_HIGH "4.0GHz"  // Высокая частота процессора
  27.  
  28. // Функция для выполнения внешних команд
  29. void run_command(const char *command) {
  30.     FILE *fp = popen(command, "r");
  31.     if (!fp) {
  32.         fprintf(stderr, "Не удалось выполнить команду: %s\n", command);
  33.         return;
  34.     }
  35.     char buffer[128];
  36.     while (fgets(buffer, sizeof(buffer), fp)) {
  37.         printf("%s", buffer);
  38.     }
  39.     pclose(fp);
  40. }
  41.  
  42. // Функция для получения текущей частоты процессора
  43. void get_current_cpu_frequency() {
  44.     printf("Текущая частота процессора:\n");
  45.     run_command("cpupower frequency-info | grep 'current CPU freq'");
  46. }
  47.  
  48. // Функция для проверки активности устройства
  49. int check_device_activity(const char *device_path, int timeout) {
  50.     int fd = open(device_path, O_RDONLY | O_NONBLOCK);
  51.     if (fd < 0) {
  52.         perror("Не удалось открыть устройство");
  53.         return 0;
  54.     }
  55.     fd_set fds;
  56.     FD_ZERO(&fds);
  57.     FD_SET(fd, &fds);
  58.     struct timeval tv = {timeout, 0};
  59.     int ret = select(fd + 1, &fds, NULL, NULL, &tv);
  60.     close(fd);
  61.     if (ret > 0) {
  62.         printf("Активность обнаружена на %s\n", device_path);
  63.         return 1;
  64.     }
  65.     return 0;
  66. }
  67.  
  68. // Функция для проверки работы mpv
  69. int is_mpv_running() {
  70.     DIR *dir = opendir("/proc");
  71.     if (!dir) {
  72.         perror("Не удалось открыть /proc");
  73.         return 0;
  74.     }
  75.     struct dirent *entry;
  76.     while ((entry = readdir(dir)) != NULL) {
  77.         if (entry->d_type == DT_DIR) {
  78.             char path[256];
  79.             snprintf(path, sizeof(path), "/proc/%s/comm", entry->d_name);
  80.             FILE *fp = fopen(path, "r");
  81.             if (fp) {
  82.                 char comm[16];
  83.                 if (fgets(comm, sizeof(comm), fp)) {
  84.                     if (strncmp(comm, "mpv", 3) == 0) {
  85.                         fclose(fp);
  86.                         closedir(dir);
  87.                         return 1;
  88.                     }
  89.                 }
  90.                 fclose(fp);
  91.             }
  92.         }
  93.     }
  94.     closedir(dir);
  95.     return 0;
  96. }
  97.  
  98. // Функция для установки яркости экрана
  99. void set_screen_brightness(int level) {
  100.     char command[64];
  101.     snprintf(command, sizeof(command), "xbacklight -set %d", level);
  102.     run_command(command);
  103. }
  104.  
  105. // Основная функция
  106. int main() {
  107.     // Проверка и создание сигнального файла
  108.     if (access(SIGNAL_FILE, F_OK) == 0) {
  109.         remove(SIGNAL_FILE);
  110.         printf("Сигнальный файл удален. Выход.\n");
  111.         return 0;
  112.     }
  113.     FILE *file = fopen(SIGNAL_FILE, "w");
  114.     if (!file) {
  115.         perror("Не удалось создать сигнальный файл");
  116.         return 1;
  117.     }
  118.     fclose(file);
  119.  
  120.     // Проверка устройств
  121.     if (access(MOUSE_DEVICE, F_OK) != 0) {
  122.         printf("Устройство мыши не найдено!\n");
  123.         return 1;
  124.     }
  125.     if (access(KEYBOARD_DEVICE, F_OK) != 0) {
  126.         printf("Устройство клавиатуры не найдено!\n");
  127.         return 1;
  128.     }
  129.  
  130.     // Основной цикл
  131.     char last_frequency[16] = "";
  132.     time_t last_activity_time = time(NULL);  // Время последней активности
  133.     int in_sleep_mode = 0;  // Флаг спящего режима
  134.     int in_game_mode = 0;  // Флаг игрового режима
  135.  
  136.     while (access(SIGNAL_FILE, F_OK) == 0) {
  137.         printf("\n--- Новая итерация ---\n");
  138.  
  139.         // Проверка активности
  140.         int mouse_active = check_device_activity(MOUSE_DEVICE, TIMEOUT);
  141.         int keyboard_active = check_device_activity(KEYBOARD_DEVICE, TIMEOUT);
  142.         int mpv_active = is_mpv_running();
  143.  
  144.         // Обновление времени последней активности
  145.         if (mouse_active || keyboard_active || mpv_active) {
  146.             last_activity_time = time(NULL);
  147.             if (in_sleep_mode) {
  148.                 printf("Активность обнаружена. Возобновление нормального режима.\n");
  149.                 in_sleep_mode = 0;
  150.                 set_screen_brightness(BRIGHTNESS_LOW);
  151.  
  152.                 // Если выходим из спящего режима, восстанавливаем частоту процессора
  153.                 printf("Восстановление частоты процессора до стандартных значений...\n");
  154.                 run_command("cpupower frequency-set -g powersave -d 800MHz -u 4.0GHz");
  155.                 get_current_cpu_frequency();
  156.             }
  157.         }
  158.  
  159.         // Проверка времени бездействия
  160.         if (!in_sleep_mode && (time(NULL) - last_activity_time) >= IDLE_TIMEOUT) {
  161.             printf("Нет активности более %d секунд. Переход в спящий режим...\n", IDLE_TIMEOUT);
  162.             in_sleep_mode = 1;
  163.             set_screen_brightness(BRIGHTNESS_OFF);
  164.  
  165.             // В спящем режиме принудительно устанавливаем частоту процессора на 800 МГц
  166.             printf("Принудительное снижение частоты процессора до 800 МГц...\n");
  167.             run_command("cpupower frequency-set -g powersave -d 800MHz -u 800MHz");
  168.             get_current_cpu_frequency();
  169.         }
  170.  
  171.         // Проверка игрового режима
  172.         if (mpv_active) {
  173.             if (!in_game_mode) {
  174.                 printf("Обнаружен игровой режим (mpv запущен).\n");
  175.                 in_game_mode = 1;
  176.             }
  177.         } else {
  178.             if (in_game_mode) {
  179.                 printf("Игровой режим завершен (mpv остановлен).\n");
  180.                 in_game_mode = 0;
  181.  
  182.                 // При выходе из игрового режима восстанавливаем частоту процессора
  183.                 printf("Восстановление частоты процессора после игрового режима...\n");
  184.                 run_command("cpupower frequency-set -g powersave -d 800MHz -u 4.0GHz");
  185.                 get_current_cpu_frequency();
  186.             }
  187.         }
  188.  
  189.         // Проверка температуры
  190.         run_command(SCRIPT_PATH);
  191.         FILE *sensor_file = fopen(SENSOR_FILE, "r");
  192.         if (sensor_file) {
  193.             char buffer[32];
  194.             if (fgets(buffer, sizeof(buffer), sensor_file)) {
  195.                 float temperature = atof(buffer);
  196.                 printf("Текущая температура: %.2f°C\n", temperature);
  197.  
  198.                 // Управление частотой процессора
  199.                 const char *target_frequency = (temperature >= TEMP_THRESHOLD)
  200.                     ? FREQ_LOW
  201.                     : FREQ_HIGH;
  202.  
  203.                 if (strcmp(target_frequency, last_frequency) != 0) {
  204.                     printf("Температура %.2f°C превышает порог %d°C. Переключение частоты процессора на %s...\n",
  205.                            temperature, TEMP_THRESHOLD, target_frequency);
  206.                     char command[128];
  207.                     snprintf(command, sizeof(command),
  208.                         "cpupower frequency-set -g powersave -d 800MHz -u %s",
  209.                         target_frequency);
  210.                     run_command(command);
  211.                     strncpy(last_frequency, target_frequency, sizeof(last_frequency) - 1);
  212.                     get_current_cpu_frequency();
  213.                 } else {
  214.                     printf("Температура %.2f°C в пределах нормы. Частота процессора остается на %s.\n",
  215.                            temperature, target_frequency);
  216.                 }
  217.             } else {
  218.                 printf("Не удалось прочитать данные из файла сенсоров.\n");
  219.             }
  220.             fclose(sensor_file);
  221.         } else {
  222.             printf("Не удалось открыть файл сенсоров.\n");
  223.         }
  224.  
  225.         sleep(TIMEOUT);
  226.     }
  227.  
  228.     printf("Сигнальный файл удален. Выход.\n");
  229.     return 0;
  230. }
  231.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement