4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
24 #include <device-node.h>
25 #include <sys/types.h>
26 #include <sys/socket.h>
29 #include <linux/limits.h>
33 #include "dd-display.h"
35 #define DISPLAY_MAX_BRIGHTNESS 100
36 #define DISPLAY_MIN_BRIGHTNESS 1
37 #define DISPLAY_DIM_BRIGHTNESS 0
39 #define SOCK_PATH "/tmp/pm_sock"
40 #define SHIFT_UNLOCK 4
41 #define SHIFT_UNLOCK_PARAMETER 12
42 #define SHIFT_CHANGE_STATE 8
43 #define SHIFT_LOCK_FLAG 16
44 #define SHIFT_CHANGE_TIMEOUT 20
45 #define TIMEOUT_RESET_BIT 0x80
46 #define HOLDKEY_BLOCK_BIT 0x1
47 #define STANDBY_MODE_BIT 0x2
48 #define CUSTOM_HOLDKEY_BIT 0x2
50 #define METHOD_SET_FRAME_RATE "setframerate"
51 #define METHOD_LOCK_STATE "lockstate"
52 #define METHOD_UNLOCK_STATE "unlockstate"
53 #define METHOD_CHANGE_STATE "changestate"
54 #define METHOD_GET_DISPLAY_COUNT "GetDisplayCount"
55 #define METHOD_GET_BRIGHTNESS "GetBrightness"
56 #define METHOD_SET_BRIGHTNESS "SetBrightness"
57 #define METHOD_HOLD_BRIGHTNESS "HoldBrightness"
58 #define METHOD_RELEASE_BRIGHTNESS "ReleaseBrightness"
59 #define METHOD_GET_ACL_STATUS "GetAclStatus"
60 #define METHOD_SET_ACL_STATUS "SetAclStatus"
62 #define STR_LCD_OFF "lcdoff"
63 #define STR_LCD_DIM "lcddim"
64 #define STR_LCD_ON "lcdon"
65 #define STR_SUSPEND "suspend"
67 #define STR_STAYCURSTATE "staycurstate"
68 #define STR_GOTOSTATENOW "gotostatenow"
70 #define STR_HOLDKEYBLOCK "holdkeyblock"
71 #define STR_STANDBYMODE "standbymode"
72 #define STR_NULL "NULL"
74 #define STR_SLEEP_MARGIN "sleepmargin"
75 #define STR_RESET_TIMER "resettimer"
76 #define STR_KEEP_TIMER "keeptimer"
78 struct disp_lock_msg {
82 unsigned int timeout2;
86 API int display_get_count(void)
92 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
93 METHOD_GET_DISPLAY_COUNT, NULL, NULL);
97 dbus_error_init(&err);
99 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &ret_val, DBUS_TYPE_INVALID);
101 _E("no message : [%s:%s]", err.name, err.message);
105 dbus_message_unref(msg);
106 dbus_error_free(&err);
110 API int display_get_max_brightness(void)
112 return DISPLAY_MAX_BRIGHTNESS;
115 API int display_get_min_brightness(void)
117 return DISPLAY_MIN_BRIGHTNESS;
120 API int display_get_brightness(void)
126 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
127 METHOD_GET_BRIGHTNESS, NULL, NULL);
131 dbus_error_init(&err);
133 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &ret_val, DBUS_TYPE_INVALID);
135 _E("no message : [%s:%s]", err.name, err.message);
139 dbus_message_unref(msg);
140 dbus_error_free(&err);
144 API int display_set_brightness_with_setting(int val)
152 snprintf(str_val, sizeof(str_val), "%d", val);
155 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
156 METHOD_SET_BRIGHTNESS, "i", arr);
160 dbus_error_init(&err);
162 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &ret_val, DBUS_TYPE_INVALID);
164 _E("no message : [%s:%s]", err.name, err.message);
168 dbus_message_unref(msg);
169 dbus_error_free(&err);
173 API int display_set_brightness(int val)
181 snprintf(str_val, sizeof(str_val), "%d", val);
184 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
185 METHOD_HOLD_BRIGHTNESS, "i", arr);
189 dbus_error_init(&err);
191 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &ret_val, DBUS_TYPE_INVALID);
193 _E("no message : [%s:%s]", err.name, err.message);
197 dbus_message_unref(msg);
198 dbus_error_free(&err);
202 API int display_release_brightness(void)
208 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
209 METHOD_RELEASE_BRIGHTNESS, NULL, NULL);
213 dbus_error_init(&err);
215 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &ret_val, DBUS_TYPE_INVALID);
217 _E("no message : [%s:%s]", err.name, err.message);
221 dbus_message_unref(msg);
222 dbus_error_free(&err);
226 API int display_get_acl_status(void)
232 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
233 METHOD_GET_ACL_STATUS, NULL, NULL);
237 dbus_error_init(&err);
239 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &ret_val, DBUS_TYPE_INVALID);
241 _E("no message : [%s:%s]", err.name, err.message);
245 dbus_message_unref(msg);
246 dbus_error_free(&err);
250 API int display_set_acl_status(int val)
258 snprintf(str_val, sizeof(str_val), "%d", val);
261 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
262 METHOD_SET_ACL_STATUS, "i", arr);
266 dbus_error_init(&err);
268 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &ret_val, DBUS_TYPE_INVALID);
270 _E("no message : [%s:%s]", err.name, err.message);
274 dbus_message_unref(msg);
275 dbus_error_free(&err);
279 API int display_set_frame_rate(int val)
287 snprintf(str_val, sizeof(str_val), "%d", val);
290 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
291 METHOD_SET_FRAME_RATE, "i", arr);
295 dbus_error_init(&err);
297 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &ret_val, DBUS_TYPE_INVALID);
299 _E("no message : [%s:%s]", err.name, err.message);
303 dbus_message_unref(msg);
304 dbus_error_free(&err);
308 static inline char *get_lcd_str(unsigned int val)
324 API int display_change_state(unsigned int s_bits)
331 p = get_lcd_str(s_bits);
336 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
337 METHOD_CHANGE_STATE, "s", pa);
341 dbus_error_init(&err);
343 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
345 _E("no message : [%s:%s]", err.name, err.message);
349 dbus_message_unref(msg);
350 dbus_error_free(&err);
352 _D("%s-%s : %d", DEVICED_INTERFACE_DISPLAY, METHOD_CHANGE_STATE, val);
356 API int display_lock_state(unsigned int s_bits, unsigned int flag,
357 unsigned int timeout)
362 char str_timeout[32];
365 p = get_lcd_str(s_bits);
370 if (flag & GOTO_STATE_NOW)
371 /* if the flag is true, go to the locking state directly */
372 p = STR_GOTOSTATENOW;
374 p = STR_STAYCURSTATE;
377 if (flag & HOLD_KEY_BLOCK)
378 p = STR_HOLDKEYBLOCK;
379 else if (flag & STANDBY_MODE)
385 snprintf(str_timeout, sizeof(str_timeout), "%d", timeout);
388 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
389 METHOD_LOCK_STATE, "sssi", pa);
393 dbus_error_init(&err);
395 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
397 _E("no message : [%s:%s]", err.name, err.message);
400 dbus_message_unref(msg);
401 dbus_error_free(&err);
403 _D("%s-%s : %d", DEVICED_INTERFACE_DISPLAY, METHOD_LOCK_STATE, val);
407 API int display_unlock_state(unsigned int s_bits, unsigned int flag)
414 p = get_lcd_str(s_bits);
420 case PM_SLEEP_MARGIN:
421 p = STR_SLEEP_MARGIN;
434 msg = deviced_dbus_method_sync(BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY,
435 METHOD_UNLOCK_STATE, "ss", pa);
439 dbus_error_init(&err);
441 ret = dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &val, DBUS_TYPE_INVALID);
443 _E("no message : [%s:%s]", err.name, err.message);
447 dbus_message_unref(msg);
448 dbus_error_free(&err);
450 _D("%s-%s : %d", DEVICED_INTERFACE_DISPLAY, METHOD_UNLOCK_STATE, val);
455 static int send_msg(unsigned int s_bits, unsigned int timeout, unsigned int timeout2)
459 struct disp_lock_msg p;
460 struct sockaddr_un remote;
465 p.timeout2 = timeout2;
467 sock = socket(AF_UNIX, SOCK_DGRAM, 0);
469 _E("pm socket() failed: %s", strerror(errno));
473 remote.sun_family = AF_UNIX;
474 if(strlen(SOCK_PATH) >= sizeof(remote.sun_path)) {
475 _E("socket path is vey long");
477 return -ENAMETOOLONG;
479 strncpy(remote.sun_path, SOCK_PATH, sizeof(remote.sun_path));
481 rc = sendto(sock, (void *)&p, sizeof(p), 0, (struct sockaddr *)&remote,
482 sizeof(struct sockaddr_un));
484 _E("pm socket sendto() failed: %s", strerror(errno));
487 return (rc > 0 ? 0 : rc);
490 API void display_set_timeout(unsigned int normal, unsigned int dim, unsigned int lock)
492 unsigned int s_bits = CUSTOM_TIMEOUT;
494 if (lock == HOLD_KEY_BLOCK)
495 s_bits += CUSTOM_HOLDKEY_BIT;
497 s_bits = (s_bits << SHIFT_CHANGE_TIMEOUT);
498 send_msg(s_bits, normal, dim);