Initialize Tizen 2.3
[framework/system/deviced.git] / src / powersaver / powersaver.c
1 /*
2  * deviced
3  *
4  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the License);
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19
20 #include <vconf.h>
21
22 #include "core/common.h"
23 #include "core/devices.h"
24 #include "core/device-notifier.h"
25 #include "core/log.h"
26 #include "display/core.h"
27 #include "display/device-interface.h"
28
29 static int set_powersaver_mode(int on)
30 {
31         int ret;
32         int brightness, timeout;
33
34         _I("powersaver mode %s", (on ? "on" : "off"));
35         device_notify(DEVICE_NOTIFIER_POWERSAVER, (void*)on);
36
37         /* powersaver mode off */
38         if (!on) {
39                 backlight_ops.set_force_brightness(0);
40                 set_force_lcdtimeout(0);
41                 goto update_state;
42         }
43
44         /* powersaver mode on (brightness) */
45         ret = vconf_get_int(VCONFKEY_SETAPPL_EMERGENCY_LCD_BRIGHTNESS_INT,
46             &brightness);
47         if (ret != 0) {
48                 _E("Failed to get powersaver brightness!");
49                 return ret;
50         }
51         ret = backlight_ops.set_force_brightness(brightness);
52         if (ret < 0) {
53                 _E("Failed to set force brightness!");
54                 return ret;
55         }
56         _I("force brightness %d", brightness);
57
58         /* powersaver mode on (lcd timeout) */
59         ret = vconf_get_int(VCONFKEY_SETAPPL_EMERGENCY_LCD_TIMEOUT_INT,
60             &timeout);
61         if (ret != 0) {
62                 _E("Failed to get powersaver lcd timeout!");
63                 return ret;
64         }
65         ret = set_force_lcdtimeout(timeout);
66         if (ret < 0) {
67                 _E("Failed to set force timeout!");
68                 return ret;
69         }
70         _I("force timeout %d", timeout);
71
72 update_state:
73         /* update internal state */
74         if (hbm_get_state())
75                 hbm_set_state_with_timeout(false, 0);
76         backlight_ops.update();
77         ret = get_run_timeout(&timeout);
78         if (ret >= 0)
79                 states[S_NORMAL].timeout = timeout;
80         states[pm_cur_state].trans(EVENT_INPUT);
81
82         return 0;
83 }
84
85 static void powersaver_status_changed(keynode_t *key_nodes, void *data)
86 {
87         int status, on, ret;
88
89         if (key_nodes == NULL) {
90                 _E("wrong parameter, key_nodes is null");
91                 return;
92         }
93
94         status = vconf_keynode_get_int(key_nodes);
95         if (status == SETTING_PSMODE_NORMAL)
96                 on = false;
97         else if (status == SETTING_PSMODE_WEARABLE)
98                 on = true;
99         else
100                 return;
101
102         ret = set_powersaver_mode(on);
103         if (ret < 0)
104                 _E("Failed to update powersaver state %d", ret);
105 }
106
107 static int booting_done(void *data)
108 {
109         int ret, status;
110
111         ret = vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &status);
112         if (ret != 0) {
113                 _E("Failed to vconf get bool!");
114                 return -EIO;
115         }
116
117         if (status != SETTING_PSMODE_WEARABLE)
118                 return 0;
119
120         _D("powersaver mode on!");
121         ret = set_powersaver_mode(true);
122         if (ret < 0)
123                 _E("Failed to update powersaver state %d", ret);
124
125         return ret;
126 }
127
128 static void powersaver_init(void *data)
129 {
130         int ret;
131
132         ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
133             powersaver_status_changed, NULL);
134         if (ret != 0)
135                 _E("Failed to vconf_notify_key_changed!");
136
137         register_notifier(DEVICE_NOTIFIER_BOOTING_DONE, booting_done);
138 }
139
140 static void powersaver_exit(void *data)
141 {
142         int ret;
143
144         ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE,
145             powersaver_status_changed);
146         if (ret != 0)
147                 _E("Failed to vconf_ignore_key_changed!");
148
149         unregister_notifier(DEVICE_NOTIFIER_BOOTING_DONE, booting_done);
150 }
151
152 static const struct device_ops powersaver_device_ops = {
153         .priority = DEVICE_PRIORITY_NORMAL,
154         .name     = "powersaver",
155         .init     = powersaver_init,
156         .exit     = powersaver_exit,
157 };
158
159 DEVICE_OPS_REGISTER(&powersaver_device_ops)