tizen 2.3 release
[framework/system/deviced.git] / src / logd_grabber / display.c
1 #define _GNU_SOURCE
2 #include <dirent.h>
3 #include <string.h>
4 #include <errno.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7
8 #include "core/log.h"
9 #include "config.h"
10 #include "display.h"
11 #include "macro.h"
12
13 static int curr_brightness;
14 static int display_state;
15 static float total_power_cons = 0;
16 static time_t last_change_time;
17
18 static int get_brightness_file(char *file)
19 {
20         const char *brightness_dir = "/sys/class/backlight/";
21         struct dirent *entry = NULL;
22         DIR *dir = NULL;
23         int ret;
24         char buf[PATH_MAX];
25
26         dir = opendir(brightness_dir);
27         if (!dir) {
28                 ret = -errno;
29                 _E("opendir failed: %s", strerror(errno));
30                 return ret;
31         }
32
33         do {
34                 entry = readdir(dir);
35                 if (!entry) {
36                         ret = -errno;
37                         _E("readdir failed: %s", strerror(errno));
38                         closedir(dir);
39                         return ret;
40                 }
41         } while (entry->d_name[0] == '.');
42
43         ret = sprintf(file, "%s/%s/brightness", brightness_dir, entry->d_name);
44         if (ret < 0) {
45                 ret = -errno;
46                 _E("asprintf failed: %s", strerror(errno));
47                 closedir(dir);
48                 return ret;
49         }
50         ret = closedir(dir);
51         if (ret < 0) {
52                 ret = -errno;
53                 _E("closedir failed: %s", strerror(errno));
54                 return ret;
55         }
56
57         return 0;
58 }
59
60 static int read_curr_brightness()
61 {
62         FILE *fp = NULL;
63         char file[PATH_MAX];
64         int brightness;
65         int ret;
66
67         ret = get_brightness_file(file);
68         if (ret < 0) {
69                 _E("get_brightness_file failed");
70                 return ret;
71         }
72
73         fp = fopen(file, "r");
74         if (!fp) {
75                 ret = -errno;
76                 _E("fopen failed: %s", strerror(errno));
77                 return ret;
78         }
79
80         if (fscanf(fp, "%d", &brightness) != 1) {
81                 ret = -errno;
82                 fclose(fp);
83                 _E("fscanf failed: %s", strerror(errno));
84                 return ret;
85         }
86
87         if (fclose(fp) < 0) {
88                 ret = -errno;
89                 _E("close failed: %s", strerror(errno));
90                 return ret;
91         }
92
93         return brightness;
94 }
95
96 float backlight_curr_power_cons()
97 {
98         double a = config_get_double("backlight_a", 0, NULL);
99         double b = config_get_double("backlight_b", 0, NULL);
100         double c = config_get_double("backlight_c", 0, NULL);
101         double k = config_get_double("backlight_k", 0, NULL);
102
103         double x = curr_brightness;
104
105         if (!display_state)
106                 return 0;
107         return a * x * x * x + b * x * x + c * x + k;
108 }
109
110 static void recalc_total_power_cons()
111 {
112         float curr_power_cons = backlight_curr_power_cons();
113         time_t t = getSecTime();
114
115         total_power_cons +=
116                 (curr_power_cons / 3600 * 1000) * (t - last_change_time);
117         last_change_time = t;
118 }
119
120 int display_init()
121 {
122         display_state = 1; /* TODO: check it, may be neet to read it by vconf */
123         curr_brightness = read_curr_brightness();
124         if (curr_brightness < 0) {
125                 _E("read_curr_brightness failed: curr_brightness set as 0");
126                 curr_brightness = 0;
127         }
128         last_change_time = getSecTime();
129
130         return 0;
131 }
132
133 int brightness_change_event_handler(struct logd_grabber_event *event)
134 {
135         recalc_total_power_cons();
136
137         curr_brightness = atoi(event->message);
138
139         return 0;
140 }
141
142 int display_on_off_event_handler(struct logd_grabber_event *event)
143 {
144         recalc_total_power_cons();
145
146         if (event->action == LOGD_ON) {
147                 display_state = 1;
148         } else if (event->action == LOGD_OFF) {
149                 display_state = 0;
150         }
151
152         return 0;
153 }
154
155 float get_display_curr_power_cons()
156 {
157         return backlight_curr_power_cons();
158 }
159
160 float get_display_total_power_cons()
161 {
162         recalc_total_power_cons();
163
164         return total_power_cons;
165 }