Guest User

HelloWorld

a guest
May 13th, 2014
222
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * @file   sbacklight.c
  3.  * @author Mikhail Klementyev jollheef<AT>riseup.net
  4.  * @license GNU GPLv3
  5.  * @date   March, 2014
  6.  * @brief  Manage backlight
  7.  *
  8.  * Управление яркостью подсветки дисплея.
  9.  */
  10.  
  11. #define IN
  12. #define OUT
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <pthread.h>
  18. #include <signal.h>
  19. #include <unistd.h>
  20. #include <errno.h>
  21. #include <getopt.h>
  22.  
  23. //#define DEBUG
  24.  
  25. #define ERROR (-1)
  26. #define TEMP_FILE_PATH "/tmp/.sbacklight"
  27.  
  28. #ifdef DEBUG
  29. #define error(message)              \
  30.   perror(message);              \
  31.   if (errno)                    \
  32.     {                       \
  33.       return -1;                \
  34.     }
  35. #else
  36. #define error(message)              \
  37.   if (errno)                    \
  38.     {                       \
  39.       perror(message);              \
  40.       return -1;                \
  41.     }
  42. #endif
  43.  
  44. #define BRIGHTNESS_PATH "/sys/class/backlight/acpi_video0/brightness"
  45.  
  46. /**
  47.  * Получает яркость.
  48.  *
  49.  * @param filePath [in] -- путь к файлу.
  50.  * @return уровень яркости подсветки, в процентах или -1 в случае ошибки.
  51.  */
  52. int
  53. getBacklight(IN char* filePath)
  54. {
  55.   int value;
  56.  
  57.   FILE* file = fopen(filePath, "r");
  58.  
  59.   error("Open file");
  60.  
  61.   fscanf(file, "%d", &value);
  62.  
  63.   error("Read file");
  64.  
  65.   fclose(file);
  66.  
  67.   return value;
  68. }
  69.  
  70. /**
  71.  * Устанавливает яркость плавно.
  72.  *
  73.  * @param filePath [in] -- путь к файлу.
  74.  * @param value [in] -- уровень яркости подсветки, в процентах.
  75.  * @return 0 в случае успеха, -1 в случае ошибки.
  76.  */
  77. int
  78. setBacklightSmooth(IN char* filePath, IN int value)
  79. {
  80.   /* Нормализуем значение */
  81.   if (value > 100)
  82.     {
  83.       value = 100;
  84.     }
  85.   if (value <= 0)
  86.     {
  87.       value = 1;
  88.     }
  89.  
  90.   int oldValue = getBacklight(BRIGHTNESS_PATH);
  91.  
  92.   int step = oldValue > value ? -1 : 1;
  93.  
  94.   for (; oldValue != (value + step); oldValue += step)
  95.     {
  96.       FILE* file = fopen(filePath, "w");
  97.  
  98.       error("Open file");
  99.  
  100.       fprintf(file, "%d\n", oldValue);
  101.  
  102.       error("Write file");
  103.  
  104.       fclose(file);
  105.     }
  106.  
  107.   return 0;
  108. }
  109.  
  110. /**
  111.  * Устанавливает яркость.
  112.  *
  113.  * @param filePath [in] -- путь к файлу.
  114.  * @param value [in] -- уровень яркости подсветки, в процентах.
  115.  * @return 0 в случае успеха, -1 в случае ошибки.
  116.  */
  117. int
  118. setBacklight(IN char* filePath, IN int value)
  119. {
  120.   /* Нормализуем значение */
  121.   if (value > 100)
  122.     {
  123.       value = 100;
  124.     }
  125.   if (value < 0)
  126.     {
  127.       value = 0;
  128.     }
  129.  
  130.   FILE* file = fopen(filePath, "w");
  131.  
  132.   error("Open file");
  133.    
  134.   fprintf(file, "%d\n", value);
  135.    
  136.   error("Write file");
  137.  
  138.   fclose(file);
  139.  
  140.   return 0;
  141. }
  142.  
  143. /**
  144.  * Увеличивает яркость.
  145.  *
  146.  * @param value [in] -- величина увеличения яркости.
  147.  * @return 0 в случае успеха, -1 в случае ошибки.
  148.  */
  149. int
  150. incBacklight(IN int value)
  151. {
  152.   int backlight = getBacklight(BRIGHTNESS_PATH);
  153.  
  154.   if (ERROR != backlight)
  155.     {
  156.       return setBacklightSmooth(BRIGHTNESS_PATH,
  157.                 getBacklight(BRIGHTNESS_PATH) + value);      
  158.     }
  159.  
  160.   return -1;
  161. }
  162.  
  163. /**
  164.  * Уменьшает яркость.
  165.  *
  166.  * @param value [in] -- величина уменьшения яркости.
  167.  * @return 0 в случае успеха, -1 в случае ошибки.
  168.  */
  169. int
  170. decBacklight(IN int value)
  171. {
  172.   int backlight = getBacklight(BRIGHTNESS_PATH);
  173.  
  174.   if (ERROR != backlight)
  175.     {
  176.       return setBacklightSmooth(BRIGHTNESS_PATH,
  177.                 getBacklight(BRIGHTNESS_PATH) - value);
  178.     }
  179.  
  180.   return -1;
  181. }
  182.  
  183. /**
  184.  * Переключает яркость.
  185.  *
  186.  * @return 0 в случае успеха, -1 в случае ошибки.
  187.  */
  188. int
  189. toggleBacklight()
  190. {
  191.   int brightness = getBacklight(BRIGHTNESS_PATH);
  192.  
  193.   if (0 == brightness)
  194.     {
  195.       brightness = getBacklight(TEMP_FILE_PATH);
  196.  
  197.       setBacklight(BRIGHTNESS_PATH, brightness);
  198.     }
  199.   else
  200.     {
  201.       setBacklight(TEMP_FILE_PATH, brightness);
  202.      
  203.       setBacklight(BRIGHTNESS_PATH, 0);
  204.     }
  205.  
  206.   return 0;
  207. }
  208.  
  209. /**
  210.  * Инициализирует временный файл, содержащий значение яркости.
  211.  *
  212.  * @param filePath [in] -- путь к файлу.
  213.  * @return 0 в случае успеха, -1 в случае ошибки.
  214.  */
  215. int
  216. initTempFile(IN char* filePath)
  217. {
  218.   FILE* file = fopen(filePath, "w");
  219.  
  220.   error("Open file");
  221.  
  222.   fprintf(file, "%d\n", 80);
  223.  
  224.   error("Write file");
  225.  
  226.   fclose(file);
  227.  
  228.   return 0;
  229. }
  230.  
  231. /**
  232.  * Точка входа в программу.
  233.  *
  234.  * @param argc [in] -- количество аргументов.
  235.  * @param argv [in] -- указатель на массив аргументов.
  236.  * @return статус завершения.
  237.  */
  238. int
  239. main(IN int argc, IN char* argv[])
  240. {
  241.   int opt, option_index;
  242.  
  243.   struct option longOpts[] = {
  244.     {"inc", required_argument, NULL, 'i'},
  245.     {"dec", required_argument, NULL, 'd'},
  246.     {"set", required_argument, NULL, 's'},
  247.     {"toggle", no_argument, NULL, 't'},
  248.     {"get", no_argument, NULL, 'g'},
  249.     {NULL, no_argument, NULL, 0}
  250.   };
  251.    
  252.   //initTempFile(TEMP_FILE_PATH);
  253.  
  254.   if ((opt = getopt_long(argc, argv, "i:d:s:tg", longOpts, &option_index)) != -1)
  255.     {
  256.       int value;
  257.      
  258.       switch (opt) {
  259.       case 'i':
  260.     value = atoi(strdup(optarg));
  261.     incBacklight(value);
  262.     return 0;
  263.    
  264.       case 'd':
  265.     value = atoi(strdup(optarg));
  266.     decBacklight(value);
  267.     return 0;
  268.  
  269.       case 's':
  270.     value = atoi(strdup(optarg));
  271.     setBacklightSmooth(BRIGHTNESS_PATH, value);
  272.     return 0;
  273.  
  274.       case 't':
  275.     toggleBacklight();
  276.     return 0;
  277.  
  278.       case 'g':
  279.     printf("%d\n", getBacklight(BRIGHTNESS_PATH));
  280.     return 0;
  281.       }
  282.     }
  283.  
  284.   fprintf(stderr, "Usage: %s -[i|d|s|t] value.\n", argv[0]);
  285.  
  286.   return 0;
  287. }
RAW Paste Data