]> rtime.felk.cvut.cz Git - frescor/frsh.git/blob - resources/acpi_lcd/fra_acpi_lcd.c
Added speed reading functions.
[frescor/frsh.git] / resources / acpi_lcd / fra_acpi_lcd.c
1 /**
2  * @file   fres_acpi_cpu.c
3  * @author Dario Faggioli <faggioli@gandalf.sssup.it>
4  *         Michael Trimarchi <trimarchimichael@yahoo.it>
5  * 
6  * @brief  Implementation of LCD related ACPI functions.
7  * 
8  */
9
10 #include "fra_acpi_lcd.h"
11
12 static unsigned long bright[3];
13
14 static lcd_type_t lcd_initialized = NONE;
15
16 static int __parse_proc_brightness(FILE *fd)
17 {
18         char buffer[1024];
19         int bright_buf[100], n_bright = 0;
20         char *token, *ptr = buffer;
21
22         if (!fscanf(fd, "levels:%[^\n]", buffer))
23                 return -1;
24
25         while ((token = strtok(ptr, " ")) > 0 &&
26                n_bright < 100) {
27                 bright_buf[n_bright] = atoi(token);
28
29                 ptr = NULL;
30                 n_bright++;
31         }
32
33         bright[0] = bright_buf[n_bright];
34         bright[1] = bright_buf[((int)ceil((double)n_bright / 2.0f))];
35         bright[3] = bright_buf[0];
36
37         return 0;
38 }
39
40 static inline int __setup_lcd_type()
41 {
42         int ret = 0;
43         FILE *fd;
44
45         if (lcd_initialized != NONE)
46                 return 0;
47
48         fd = fopen(PROC_LCD_PATH_1 "/brightness", "r");
49         if (fd) {
50                 ret = __parse_proc_brightness(fd);
51                 if (ret) goto end;
52
53                 lcd_initialized = PROC_1;
54
55                 goto end;
56         }
57
58         fd = fopen(PROC_LCD_PATH_2 "/brightness", "r");
59         if (fd) {
60                 ret = __parse_proc_brightness(fd);
61                 if (ret) goto end;
62
63                 lcd_initialized = PROC_2;
64
65                 goto end;
66         }
67
68         fd = fopen(SYS_LCD_PATH_1 "/brightness", "r");
69         if (fd) {
70                 /* @TODO: to be done! */
71
72                 lcd_initialized = SYS_1;
73
74                 goto end;
75         }
76
77         fd = popen("smartdimmer -g", "r");
78         if (fd) {
79                 ret = pclose(fd);
80                 if (ret) {
81                         fprintf(stderr, "Problems using smartdimmer\n");
82                         return errno;
83                 }
84                 bright[0] = 100;
85                 bright[1] = 43;
86                 bright[3] = 15;
87
88                 lcd_initialized = NV;
89
90                 goto end;
91         }
92
93         return EINVAL;
94
95 end:
96         fclose(fd);
97         return ret;
98 }
99
100 static int __set_proc_brightness(FILE *fd, int level)
101 {
102         int ret;
103
104         ret = fprintf(fd, "%d", bright[level]);
105         if (ret <= 0) {
106                 fprintf(stderr,
107                         "Could not set brightness level %d\n",
108                         level);
109                 return errno;
110         }
111
112         return 0;
113 }
114
115 static int __set_lcd_brightness(int level)
116 {
117         FILE *fd;
118         int ret = 0;
119         char str[128];
120
121         if (lcd_initialized == NONE)
122                 return EINVAL;
123
124         if (lcd_initialized == PROC_1) {
125                 fd = fopen(PROC_LCD_PATH_1 "/brightness", "w");
126                 if (!fd)
127                         goto err;
128
129                 ret = __set_proc_brightness(fd, level);
130                 if (ret)
131                         return EINVAL;
132         } else if (lcd_initialized == PROC_2) {
133                 fd = fopen(PROC_LCD_PATH_2 "/brightness", "w");
134                 if (!fd)
135                         goto err;
136
137                 ret = __set_proc_brightness(fd, level);
138                 if (ret)
139                         return EINVAL;
140         } else if (lcd_initialized == SYS_1) {
141                 /* @TODO: to be done! */        
142         } else if (lcd_initialized == NV) {
143                 sprintf(str, "smartdimmer -s %lu", bright[level]);
144                 fd = popen(str, "r");
145                 if (!fd) {
146                         fprintf(stderr,
147                                 "Could not set brightness level %d\n",
148                                 level);
149                         return errno;
150                 }
151         }
152
153         fclose(fd);
154 err:
155         return ret;
156 }
157
158 int fra_LCD_power_init(int lcd)
159 {
160         return __setup_lcd_type();
161 }
162
163 int fra_LCD_get_power(int lcd, int *level)
164 {
165         /**
166          * @TODO: to be implemented!
167          **/
168         return EINVAL;
169 }
170
171 int fra_LCD_set_power(int lcd, int level)
172 {
173         return __set_lcd_brightness(level);
174 }
175
176 int fra_LCD_get_speed(int lcd, int level, double *ratio)
177 {
178         if (lcd_initialized == NONE || level >= 3)
179                         return EINVAL;
180
181         *ratio = bright[level]/bright[0];
182
183         return 0;
184 }
185