return 0;
}
-int pm_lock_internal(int s_bits, int flag, int timeout)
+int pm_lock_internal(pid_t pid, int s_bits, int flag, int timeout)
{
if (!g_pm_callback)
return -1;
/* if the flag is true, go to the locking state directly */
s_bits = s_bits | (s_bits << SHIFT_CHANGE_STATE);
- recv_data.pid = getpid();
+ recv_data.pid = pid;
recv_data.cond = s_bits;
recv_data.timeout = timeout;
return 0;
}
-int pm_unlock_internal(int s_bits, int flag)
+int pm_unlock_internal(pid_t pid, int s_bits, int flag)
{
if (!g_pm_callback)
return -1;
s_bits = (s_bits << SHIFT_UNLOCK);
s_bits = (s_bits | (flag << SHIFT_UNLOCK_PARAMETER));
- recv_data.pid = getpid();
+ recv_data.pid = pid;
recv_data.cond = s_bits;
(*g_pm_callback)(PM_CONTROL_EVENT, &recv_data);
return 0;
}
-int pm_change_internal(int s_bits)
+int pm_change_internal(pid_t pid, int s_bits)
{
if (!g_pm_callback)
return -1;
return -1;
}
- recv_data.pid = getpid();
+ recv_data.pid = pid;
recv_data.cond = s_bits << SHIFT_CHANGE_STATE;
(*g_pm_callback)(PM_CONTROL_EVENT, &recv_data);
return 0;
}
+
+void lcd_control_edbus_signal_handler(void *data, DBusMessage *msg)
+{
+ DBusError err;
+ int pid = -1;
+ char *lock_str = NULL;
+ char *state_str = NULL;
+ int state = -1;
+ int timeout = -1;
+
+ if (dbus_message_is_signal(msg, INTERFACE_NAME, SIGNAL_NAME_LCD_CONTROL) == 0) {
+ LOGERR("there is lcd control signal");
+ return;
+ }
+
+ dbus_error_init(&err);
+
+ if (dbus_message_get_args(msg, &err,
+ DBUS_TYPE_INT32, &pid,
+ DBUS_TYPE_STRING, &lock_str,
+ DBUS_TYPE_STRING, &state_str,
+ DBUS_TYPE_INT32, &timeout, DBUS_TYPE_INVALID) == 0) {
+ LOGERR("there is no message");
+ return;
+ }
+
+ if (pid == -1 || !lock_str || !state_str) {
+ LOGERR("message is invalid!!");
+ return;
+ }
+
+ if (kill(pid, 0) == -1) {
+ LOGERR("%d process does not exist, dbus ignored!", pid);
+ return;
+ }
+
+ if (!strcmp(state_str, PM_LCDON_STR))
+ state = LCD_NORMAL;
+ else if (!strcmp(state_str, PM_LCDDIM_STR))
+ state = LCD_DIM;
+ else if (!strcmp(state_str, PM_LCDOFF_STR))
+ state = LCD_OFF;
+ else {
+ LOGERR("%d process does not exist, dbus ignored!", pid);
+ return;
+ }
+
+ if (!strcmp(lock_str, PM_LOCK_STR)) {
+ if (timeout < 0) {
+ LOGERR("pm_lock timeout is invalid! %d", timeout);
+ return;
+ }
+ pm_lock_internal(pid, state, STAY_CUR_STATE, timeout);
+ } else if (!strcmp(lock_str, PM_UNLOCK_STR)) {
+ pm_unlock_internal(pid, state, PM_SLEEP_MARGIN);
+ } else if (!strcmp(lock_str, PM_CHANGE_STR)) {
+ pm_change_internal(pid, state);
+ } else {
+ LOGERR("%s process does not exist, dbus ignored!", pid);
+ return;
+ }
+ LOGINFO("dbus call success from %d\n", pid);
+}
#define __PM_POLL_H__
#include <Ecore.h>
+#include "core/edbus-handler.h"
/**
* @addtogroup POWER_MANAGER
* @{
};
#define SOCK_PATH "/tmp/pm_sock"
+#define SIGNAL_NAME_LCD_CONTROL "lcdcontol"
#define LCD_NORMAL 0x1 /**< NORMAL state */
#define LCD_DIM 0x2 /**< LCD dimming state */
#define PM_RESET_TIMER 0x1 /**< reset timer for unlock */
#define PM_KEEP_TIMER 0x2 /**< keep timer for unlock */
+#define PM_LOCK_STR "lock"
+#define PM_UNLOCK_STR "unlock"
+#define PM_CHANGE_STR "change"
+
+#define PM_LCDOFF_STR "lcdoff"
+#define PM_LCDDIM_STR "lcddim"
+#define PM_LCDON_STR "lcdon"
+
typedef struct {
pid_t pid;
unsigned int cond;
extern int exit_pm_poll();
extern int init_pm_poll_input(int (*pm_callback)(int , PMMsg * ), const char *path);
-extern int pm_lock_internal(int s_bits, int flag, int timeout);
-extern int pm_unlock_internal(int s_bits, int flag);
-extern int pm_change_internal(int s_bits);
+extern int pm_lock_internal(pid_t pid, int s_bits, int flag, int timeout);
+extern int pm_unlock_internal(pid_t pid, int s_bits, int flag);
+extern int pm_change_internal(pid_t pid, int s_bits);
+
+extern void lcd_control_edbus_signal_handler(void *data, DBusMessage *msg);
/**
* @}
check_lowbat_charge_device(val);
vconf_set_int(VCONFKEY_SYSMAN_CHARGER_STATUS, val);
if (val == 0) {
- pm_unlock_internal(LCD_OFF, STAY_CUR_STATE);
+ pm_unlock_internal(getpid(), LCD_OFF, STAY_CUR_STATE);
} else {
- pm_lock_internal(LCD_OFF, STAY_CUR_STATE, 0);
+ pm_lock_internal(getpid(), LCD_OFF, STAY_CUR_STATE, 0);
snprintf(params, sizeof(params), "%d", CB_NOTI_BATT_CHARGE);
ss_launch_if_noexist("/usr/bin/sys_device_noti", params);
_D("ta device notification");
static void tvout_chgdet_cb(struct ss_main_data *ad)
{
_D("jack - tvout changed\n");
- pm_change_internal(LCD_NORMAL);
+ pm_change_internal(getpid(), LCD_NORMAL);
}
static void hdmi_chgdet_cb(struct ss_main_data *ad)
int val;
int ret = -1;
- pm_change_internal(LCD_NORMAL);
+ pm_change_internal(getpid(), LCD_NORMAL);
if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_HDMI_SUPPORT, &val) == 0) {
if (val!=1) {
_E("target is not support HDMI");
_D("jack - hdmi changed %d",val);
vconf_set_int(VCONFKEY_SYSMAN_HDMI,val);
if(val == 1)
- pm_lock_internal(LCD_NORMAL, GOTO_STATE_NOW, 0);
+ pm_lock_internal(getpid(), LCD_NORMAL, GOTO_STATE_NOW, 0);
else
- pm_unlock_internal(LCD_NORMAL, PM_SLEEP_MARGIN);
+ pm_unlock_internal(getpid(), LCD_NORMAL, PM_SLEEP_MARGIN);
} else {
_E("failed to get hdmi_online status");
}
{
char params[BUFF_MAX];
_D("pci- keyboard inserted\n");
- pm_change_internal(LCD_NORMAL);
+ pm_change_internal(getpid(), LCD_NORMAL);
snprintf(params, sizeof(params), "%d", CB_NOTI_PCI_INSERTED);
ss_launch_if_noexist("/usr/bin/sys_pci_noti", params);
{
char params[BUFF_MAX];
_D("pci- keyboard removed\n");
- pm_change_internal(LCD_NORMAL);
+ pm_change_internal(getpid(), LCD_NORMAL);
snprintf(params, sizeof(params), "%d", CB_NOTI_PCI_REMOVED);
ss_launch_if_noexist("/usr/bin/sys_pci_noti", params);
if (val == 0) {
vconf_set_int(VCONFKEY_SYSMAN_USB_STATUS,
VCONFKEY_SYSMAN_USB_DISCONNECTED);
- pm_unlock_internal(LCD_OFF, STAY_CUR_STATE);
+ pm_unlock_internal(getpid(), LCD_OFF, STAY_CUR_STATE);
return 0;
}
vconf_set_int(VCONFKEY_SYSMAN_USB_STATUS,
VCONFKEY_SYSMAN_USB_AVAILABLE);
- pm_lock_internal(LCD_OFF, STAY_CUR_STATE, 0);
+ pm_lock_internal(getpid(), LCD_OFF, STAY_CUR_STATE, 0);
pid = ss_launch_if_noexist(USBCON_EXEC_PATH, NULL);
if (pid < 0) {
_E("usb predefine action failed\n");
void predefine_pm_change_state(unsigned int s_bits)
{
- pm_change_internal(s_bits);
+ pm_change_internal(getpid(), s_bits);
}
int lowbat_def_predefine_action(int argc, char **argv)
{
int ret;
- pm_change_internal(LCD_NORMAL);
+ pm_change_internal(getpid(), LCD_NORMAL);
sync();
ret = tel_set_flight_mode(tapi_handle, TAPI_POWER_FLIGHT_MODE_ENTER, enter_flight_mode_cb, NULL);
_E("request for changing into flight mode : %d\n", ret);
system("/etc/rc.d/rc.entersleep");
- pm_change_internal(POWER_OFF);
+ pm_change_internal(getpid(), POWER_OFF);
return 0;
}
{
int ret;
- pm_change_internal(LCD_NORMAL);
+ pm_change_internal(getpid(), LCD_NORMAL);
sync();
ret = tel_set_flight_mode(tapi_handle, TAPI_POWER_FLIGHT_MODE_LEAVE, leave_flight_mode_cb, NULL);
int ret;
heynoti_publish(POWEROFF_NOTI_NAME);
- pm_change_internal(LCD_NORMAL);
+ pm_change_internal(getpid(), LCD_NORMAL);
system(LIBPATH"/system-server/shutdown.sh &");
sync();
#include <sys/wait.h>
#include <vconf.h>
#include "core.h"
-#include "edbus-handler.h"
+#include "core/edbus-handler.h"
+#include "display/poll.h"
#define _E(format, args...) do { \
char buf[255];\
sig_act.sa_flags = SA_SIGINFO;
sigemptyset(&sig_act.sa_mask);
sigaction(SIGPIPE, &sig_act, &sig_pipe_old_act);
- register_edbus_signal_handler(SIGNAL_NAME_POWEROFF_POPUP, (void *)poweroff_popup_edbus_signal_handler);
+ register_edbus_signal_handler(SIGNAL_NAME_POWEROFF_POPUP,
+ (void *)poweroff_popup_edbus_signal_handler);
+ register_edbus_signal_handler(SIGNAL_NAME_LCD_CONTROL,
+ (void *)lcd_control_edbus_signal_handler);
+
}
vconf_set_int(VCONFKEY_SYSMAN_CHARGER_STATUS,
VCONFKEY_SYSMAN_CHARGER_CONNECTED);
while (i < RETRY
- && pm_lock_internal(LCD_OFF, STAY_CUR_STATE,
+ && pm_lock_internal(getpid(), LCD_OFF, STAY_CUR_STATE,
0) == -1) {
i++;
sleep(1);
else
pm_state = 0x4;
- pm_lock_internal(pm_state, STAY_CUR_STATE, 0);
+ pm_lock_internal(getpid(), pm_state, STAY_CUR_STATE, 0);
ret = handle_date(argv[0]);
- pm_unlock_internal(pm_state, STAY_CUR_STATE);
+ pm_unlock_internal(getpid(), pm_state, STAY_CUR_STATE);
return ret;
}
else
pm_state = 0x4;
- pm_lock_internal(pm_state, STAY_CUR_STATE, 0);
+ pm_lock_internal(getpid(), pm_state, STAY_CUR_STATE, 0);
ret = handle_timezone(argv[0]);
- pm_unlock_internal(pm_state, STAY_CUR_STATE);
+ pm_unlock_internal(getpid(), pm_state, STAY_CUR_STATE);
return ret;
}
vconf_set_int(VCONFKEY_SYSMAN_USB_STATUS,
VCONFKEY_SYSMAN_USB_AVAILABLE);
while (i < RETRY
- && pm_lock_internal(LCD_OFF, STAY_CUR_STATE, 0) == -1) {
+ && pm_lock_internal(getpid(), LCD_OFF, STAY_CUR_STATE, 0) == -1) {
i++;
sleep(1);
}