tizen 2.3 release
[framework/system/deviced.git] / src / powersaver / powersaver-micro.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 #include "powersaver.h"
29
30 static int set_powersaver_mode(int mode)
31 {
32         int ret;
33         int brightness, timeout;
34
35         _I("powersaver mode %d", mode);
36         device_notify(DEVICE_NOTIFIER_PMQOS_ULTRAPOWERSAVING, (void*)mode);
37
38         /* powersaver mode off */
39         if (mode == POWERSAVER_OFF ||
40             mode == POWERSAVER_BASIC ||
41             mode == POWERSAVER_ENHANCED) {
42                 backlight_ops.set_force_brightness(0);
43                 set_force_lcdtimeout(0);
44                 goto update_state;
45         }
46
47         /* powersaver mode on (brightness) */
48         ret = vconf_get_int(VCONFKEY_SETAPPL_EMERGENCY_LCD_BRIGHTNESS_INT,
49             &brightness);
50         if (ret != 0) {
51                 _E("Failed to get powersaver brightness!");
52                 return ret;
53         }
54         ret = backlight_ops.set_force_brightness(brightness);
55         if (ret < 0) {
56                 _E("Failed to set force brightness!");
57                 return ret;
58         }
59         _I("force brightness %d", brightness);
60
61         /* powersaver mode on (lcd timeout) */
62         ret = vconf_get_int(VCONFKEY_SETAPPL_EMERGENCY_LCD_TIMEOUT_INT,
63             &timeout);
64         if (ret != 0) {
65                 _E("Failed to get powersaver lcd timeout!");
66                 return ret;
67         }
68         ret = set_force_lcdtimeout(timeout);
69         if (ret < 0) {
70                 _E("Failed to set force timeout!");
71                 return ret;
72         }
73         _I("force timeout %d", timeout);
74
75 update_state:
76         /* update internal state */
77         if (hbm_get_state())
78                 hbm_set_state_with_timeout(false, 0);
79         backlight_ops.update();
80         ret = get_run_timeout(&timeout);
81         if (ret >= 0)
82                 states[S_NORMAL].timeout = timeout;
83         states[pm_cur_state].trans(EVENT_INPUT);
84
85         return 0;
86 }
87
88 static void powersaver_status_changed(keynode_t *key_nodes, void *data)
89 {
90         int status, mode, ret;
91
92         if (key_nodes == NULL) {
93                 _E("wrong parameter, key_nodes is null");
94                 return;
95         }
96
97         status = vconf_keynode_get_int(key_nodes);
98         if (status == SETTING_PSMODE_NORMAL)
99                 mode = POWERSAVER_OFF;
100         else if (status == SETTING_PSMODE_WEARABLE)
101                 mode = POWERSAVER_BASIC;
102         else if (status == SETTING_PSMODE_WEARABLE_ENHANCED)
103                 mode = POWERSAVER_ENHANCED;
104         else
105                 return;
106
107         ret = set_powersaver_mode(mode);
108         if (ret < 0)
109                 _E("Failed to update powersaver state %d", ret);
110 }
111
112 static void powersaver_init(void *data)
113 {
114         int ret, status;
115         int mode = POWERSAVER_OFF;
116
117         ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
118             powersaver_status_changed, NULL);
119         if (ret != 0)
120                 _E("Failed to vconf_notify_key_changed!");
121
122         ret = vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &status);
123         if (ret != 0) {
124                 _E("Failed to vconf get bool!");
125                 return;
126         }
127
128         switch (status) {
129         case SETTING_PSMODE_WEARABLE:
130                 mode = POWERSAVER_BASIC;
131                 break;
132         case SETTING_PSMODE_WEARABLE_ENHANCED:
133                 mode = POWERSAVER_ENHANCED;
134                 break;
135         default:
136                 return;
137         }
138
139         _D("powersaver mode on! %d", mode);
140         ret = set_powersaver_mode(mode);
141         if (ret < 0)
142                 _E("Failed to update powersaver state %d", ret);
143 }
144
145 static void powersaver_exit(void *data)
146 {
147         int ret;
148
149         ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE,
150             powersaver_status_changed);
151         if (ret != 0)
152                 _E("Failed to vconf_ignore_key_changed!");
153 }
154
155 static const struct device_ops powersaver_device_ops = {
156         .priority = DEVICE_PRIORITY_NORMAL,
157         .name     = "powersaver-micro",
158         .init     = powersaver_init,
159         .exit     = powersaver_exit,
160 };
161
162 DEVICE_OPS_REGISTER(&powersaver_device_ops)