power: add signal handler for wakeup signal 43/266843/1
authorYoungjae Cho <y0.cho@samsung.com>
Fri, 19 Nov 2021 08:54:01 +0000 (17:54 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Fri, 19 Nov 2021 08:55:34 +0000 (17:55 +0900)
Change-Id: If8c314fe656edced7042c827b81455a41af2cbf3
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
include/power-internal.h
src/power-internal.c

index dde31b7..787c38d 100644 (file)
@@ -24,6 +24,8 @@ extern "C" {
 #include <glib.h>
 #include <gio/gio.h>
 
+#include "device-error.h"
+
 /**
  * @platform
  * @brief Power off the device.
@@ -42,13 +44,21 @@ int device_power_poweroff(void);
 
 enum sleep_ready {
        DEVICE_SLEEP_READY,
+       DEVICE_WAKEUP_READY = DEVICE_SLEEP_READY,
        DEVICE_SLEEP_NOT_READY,
 };
 
+enum device_siginfo {
+       DEVICE_SIG_SLEEP_SHORTKEY,
+       DEVICE_SIG_WAKEUP_SHORTKEY,
+       DEVICE_SIG_UNKNOWN,
+};
+
 /* This callback is invoked when system is going to sleep.
- * Return DEVICE_SLEEP_READY to notify system that I am ready to sleep.
- *   sleep_time_ms: realtime in milisecond when the sleep signal emitted */
-typedef int (*sleep_callback) (guint64 sleep_time_ms, void *user_data);
+ * There can be only one callbacks per process.
+ * Return DEVICE_SLEEP_READY to notify system that I am ready to sleep
+ * when siginfo == DEVICE_SIG_SLEEP_SHORTKEY. */
+typedef int (*sleep_callback) (guint64 sig_time_ms, enum device_siginfo siginfo, void *user_data);
 
 /* return DEVICE_ERROR_NONE on success */
 int device_power_add_sleep_callback(sleep_callback cb, void *user_data);
index 2a01a33..5f57e9d 100644 (file)
@@ -1,4 +1,5 @@
 #include <stdlib.h>
+#include <string.h>
 #include <gio/gio.h>
 #include <libsyscommon/libgdbus.h>
 
@@ -6,6 +7,7 @@
 #include "common.h"
 
 #define SLEEP_DBUS_SIGNAME                  "sleep"
+#define WAKEUP_DBUS_SIGNAME                 "wakeup"
 #define DBUS_METHOD_SYNC_CALL_TIMEOUT_MS    10000 /* 10 second */
 
 struct userdata {
@@ -13,7 +15,8 @@ struct userdata {
        sleep_callback callback;
 };
 
-static int signal_subscribe_id = -1;
+static int sleep_signal_subscribe_id = -1;
+static int wakeup_signal_subscribe_id = -1;
 
 static void signal_unsubscribed_callback(void *data)
 {
@@ -22,25 +25,19 @@ static void signal_unsubscribed_callback(void *data)
        free(ud);
 }
 
-static void signal_callback(GDBusConnection *connection,
-       const gchar *sender_name,
-       const gchar *object_path,
-       const gchar *interface_name,
-       const gchar *signal_name,
-       GVariant *parameters,
-       gpointer user_data)
+static void handle_sleep_signal(GDBusConnection *connection, GVariant *parameters, void *user_data)
 {
-       guint64 sleep_time_ms;
-       guint64 sleep_id;
        struct userdata *ud = (struct userdata *) user_data;
+       guint64 sig_time_ms;
+       guint64 sleep_id;
        int retval;
 
-       g_variant_get(parameters, "(tt)", &sleep_time_ms, &sleep_id);
-
        if (!ud || !ud->callback)
                return;
 
-       retval = ud->callback(sleep_time_ms, ud->data);
+       g_variant_get(parameters, "(tt)", &sig_time_ms, &sleep_id);
+
+       retval = ud->callback(sig_time_ms, DEVICE_SIG_SLEEP_SHORTKEY, ud->data);
        if (retval == DEVICE_SLEEP_READY) {
                g_dbus_connection_call_sync(connection,
                        DEVICED_BUS_NAME,
@@ -56,6 +53,34 @@ static void signal_callback(GDBusConnection *connection,
        }
 }
 
+static void handle_wakeup_signal(GVariant *parameters, void *user_data)
+{
+       struct userdata *ud = (struct userdata *) user_data;
+       guint64 sig_time_ms;
+       enum device_siginfo siginfo;
+
+       if (!ud || !ud->callback)
+               return;
+
+       g_variant_get(parameters, "(tt)", &sig_time_ms, &siginfo);
+       ud->callback(sig_time_ms, siginfo, ud->data);
+}
+
+static void signal_callback(GDBusConnection *connection,
+       const gchar *sender_name,
+       const gchar *object_path,
+       const gchar *interface_name,
+       const gchar *signal_name,
+       GVariant *parameters,
+       gpointer user_data)
+{
+
+       if (!strncmp(signal_name, SLEEP_DBUS_SIGNAME, sizeof(SLEEP_DBUS_SIGNAME)))
+               handle_sleep_signal(connection, parameters, user_data);
+       else if (!strncmp(signal_name, WAKEUP_DBUS_SIGNAME, sizeof(WAKEUP_DBUS_SIGNAME)))
+               handle_wakeup_signal(parameters, user_data);
+}
+
 int device_power_add_sleep_callback(sleep_callback cb, void *data)
 {
        GDBusConnection *connection;
@@ -63,7 +88,7 @@ int device_power_add_sleep_callback(sleep_callback cb, void *data)
        GError *err = NULL;
        struct userdata *ud;
 
-       if (signal_subscribe_id != -1)
+       if (sleep_signal_subscribe_id != -1)
                return DEVICE_ERROR_ALREADY_IN_PROGRESS;
 
        connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
@@ -99,7 +124,7 @@ int device_power_add_sleep_callback(sleep_callback cb, void *data)
        ud->data = data;
        ud->callback = cb;
 
-       signal_subscribe_id = g_dbus_connection_signal_subscribe(connection,
+       sleep_signal_subscribe_id = g_dbus_connection_signal_subscribe(connection,
                DEVICED_BUS_NAME,
                DEVICED_INTERFACE_POWER,
                SLEEP_DBUS_SIGNAME,
@@ -110,6 +135,17 @@ int device_power_add_sleep_callback(sleep_callback cb, void *data)
                ud,
                signal_unsubscribed_callback);
 
+       wakeup_signal_subscribe_id = g_dbus_connection_signal_subscribe(connection,
+               DEVICED_BUS_NAME,
+               DEVICED_INTERFACE_POWER,
+               WAKEUP_DBUS_SIGNAME,
+               DEVICED_PATH_POWER,
+               NULL,
+               G_DBUS_SIGNAL_FLAGS_NONE,
+               signal_callback,
+               ud,
+               NULL);
+
        return DEVICE_ERROR_NONE;
 }
 
@@ -118,7 +154,7 @@ void device_power_remove_sleep_callback(void)
        GError *err = NULL;
        GDBusConnection *connection;
 
-       if (signal_subscribe_id == -1)
+       if (sleep_signal_subscribe_id == -1)
                return;
 
        connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
@@ -128,8 +164,10 @@ void device_power_remove_sleep_callback(void)
                return;
        }
 
-       g_dbus_connection_signal_unsubscribe(connection, signal_subscribe_id);
-       signal_subscribe_id = -1;
+       g_dbus_connection_signal_unsubscribe(connection, sleep_signal_subscribe_id);
+       sleep_signal_subscribe_id = -1;
+       g_dbus_connection_signal_unsubscribe(connection, wakeup_signal_subscribe_id);
+       wakeup_signal_subscribe_id = -1;
 
        g_dbus_connection_call_sync(connection,
                DEVICED_BUS_NAME,