From 672deb4c4d33809458864c04ea88045eef264752 Mon Sep 17 00:00:00 2001 From: Youngjae Cho Date: Thu, 28 Dec 2023 13:11:49 +0900 Subject: [PATCH] display: Add getter for lock count and signal on count changed The dbus method "PmlockGetLockCount" has been added to get lock count. And the dbus signal "PowerLockCountChanged" has also been added for broadcasting on every display lock/unlock. The existing method "PmlockGetLockState" and signal "PowerLockCountChanged" only say in 'locked' or 'unlocked', however, the "PmLockGetLockCount" and "PowerLockCountChanged" respond in number. Change-Id: I63a0eb7a12c76569d4c2de7bfe9089d5f98eac0e Signed-off-by: Youngjae Cho --- src/display/display-dbus.c | 25 +++++++++++++++++++++++++ src/display/display-lock.c | 13 +++++++++++++ src/display/display-lock.h | 1 + 3 files changed, 39 insertions(+) diff --git a/src/display/display-dbus.c b/src/display/display-dbus.c index 19c30f2..397fc9c 100644 --- a/src/display/display-dbus.c +++ b/src/display/display-dbus.c @@ -1280,6 +1280,30 @@ static GVariant *dbus_setrotationangle(GDBusConnection *conn, return g_variant_new("(i)", ret); } +static GVariant *dbus_pmlockgetlockcount(GDBusConnection *conn, + const gchar *sender, const gchar *path, const gchar *iface, const gchar *name, + GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data) +{ + power_lock_e power_lock_type; + int pmlock_count = 0; + enum state_t pmlock_type; + pid_t pid; + + g_variant_get(param, "(i)", &power_lock_type); + + if (power_lock_type < POWER_LOCK_CPU || power_lock_type > POWER_LOCK_DISPLAY_DIM) + _W("Invalid parameter power lock type=(%d)", power_lock_type); + + pmlock_type = power_lock_type_to_pmlock(power_lock_type); + + pmlock_count = pmlock_get_lock_count(pmlock_type); + + pid = gdbus_connection_get_sender_pid(conn, sender); + _D("Pmlock get lock count pid=%d power lock count=%d", pid, pmlock_count); + + return g_variant_new("(i)", pmlock_count); +} + static GVariant *dbus_pmlockgetlockstate(GDBusConnection *conn, const gchar *sender, const gchar *path, const gchar *iface, const gchar *name, GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data) @@ -1345,6 +1369,7 @@ static const dbus_method_s dbus_methods[] = { { "GetWhiteBalance", "i", "i", dbus_getwhitebalance}, { "GetRotationAngle", "i", "iii", dbus_getrotationangle}, { "SetRotationAngle", "iii", "i", dbus_setrotationangle}, + { "PmlockGetLockCount", "i", "i", dbus_pmlockgetlockcount}, { "PmlockGetLockState", "i", "i", dbus_pmlockgetlockstate}, /* Add methods here */ }; diff --git a/src/display/display-lock.c b/src/display/display-lock.c index bfdd7e9..21585ae 100644 --- a/src/display/display-lock.c +++ b/src/display/display-lock.c @@ -57,6 +57,11 @@ bool check_lock_state(int state) return false; } +int pmlock_get_lock_count(enum state_t state) +{ + return SYS_G_LIST_LENGTH(cond_head[state]); +} + bool pmlock_get_lock_state(enum state_t state) { return (bool)SYS_G_LIST_LENGTH(cond_head[state]); @@ -102,6 +107,14 @@ static void broadcast_pmlock_state_changed(enum state_t state) } num_of_pmlock = g_list_length(cond_head[state]); + + /* broadcast on every change of lock count */ + gdbus_signal_emit(NULL, + DEVICED_PATH_DISPLAY, + DEVICED_INTERFACE_DISPLAY, + DEVICED_SIGNAL_POWER_LOCK_COUNT_CHANGED, + g_variant_new("(ii)", state, num_of_pmlock)); + if (num_of_pmlock > 1) return; diff --git a/src/display/display-lock.h b/src/display/display-lock.h index 98e3376..d504d7a 100644 --- a/src/display/display-lock.h +++ b/src/display/display-lock.h @@ -53,6 +53,7 @@ typedef struct _pm_lock_node { } PmLockNode; bool check_lock_state(int state); +int pmlock_get_lock_count(enum state_t state); bool pmlock_get_lock_state(enum state_t state); enum state_t power_lock_type_to_pmlock(power_lock_e power_lock_type); PmLockNode *find_node(enum state_t s_index, pid_t pid); -- 2.7.4