power: add dbus method for controlling power state 37/275737/3 accepted/tizen/unified/20220601.141558 submit/tizen/20220531.085748
authorYoungjae Cho <y0.cho@samsung.com>
Tue, 31 May 2022 06:11:10 +0000 (15:11 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Tue, 31 May 2022 07:16:00 +0000 (16:16 +0900)
Change-Id: I6973dd1fdad1e5c3c9aebbf23aa00be372cd3a1e
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
src/power/power-dbus.c
src/power/power.c

index 42b4b06..e1f2b9c 100644 (file)
@@ -287,12 +287,39 @@ out:
        return g_variant_new("(i)", ret);
 }
 
+static GVariant *dbus_power_change_state(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
+{
+       int ret = 0;
+       int index;
+       guint64 next;
+
+       g_variant_get(param, "(t)", &next);
+
+       for (index = POWER_STATE_MIN_INDEX; index < POWER_STATE_MAX_INDEX; ++index)
+               if (next == (1UL << index))
+                       break;
+
+       if (index == POWER_STATE_MAX_INDEX) {
+               _E("Invalid next state=%#lx", (long) index);
+               ret = -EINVAL;
+               goto out;
+       }
+
+       power_request_change_state_strict(POWER_STATE_ALL, next, 9000, NULL);
+
+out:
+       return g_variant_new("(i)", ret);
+}
+
 static const dbus_method_s dbus_methods[] = {
        { "LockCpu",                "i",   "i",  dbus_power_lock_cpu },
        { "UnlockCpu",              NULL,  "i",  dbus_power_unlock_cpu },
        { "AddChangeStateWait",     "t",   "i",  dbus_power_add_change_state_wait },
        { "RemoveChangeStateWait",  "t",   NULL, dbus_power_remove_change_state_wait },
        { "ConfirmChangeStateWait", "t",   "i",  dbus_power_confirm_change_state_wait },
+       { "PowerChangeState",       "t",   "i",   dbus_power_change_state },
        /* Add methods here */
 };
 
index fca5ba3..79c8a08 100644 (file)
@@ -215,6 +215,9 @@ static void transition_state(const struct trans_info *ti)
                else if (is_poweroff_state(next))
                        power_transition_to_poweroff(ti);
        }
+
+       if (current != ti->next)
+               _W("Not defined transition. The current still stays at %s", state_name(current));
 }
 
 static void deferred_transition_state(gpointer data)