1045 lines
38 KiB
Diff
1045 lines
38 KiB
Diff
|
|
From 1121e867aea9f283b8e596c06a6889d252d8d31f Mon Sep 17 00:00:00 2001
|
|||
|
|
From: tangjie02 <tangjie02@kylinsec.com.cn>
|
|||
|
|
Date: Fri, 7 Jul 2023 18:04:51 +0800
|
|||
|
|
Subject: [PATCH] feature(power): Compatiable two power profile daemon which
|
|||
|
|
contains hadess and tuned.
|
|||
|
|
MIME-Version: 1.0
|
|||
|
|
Content-Type: text/plain; charset=UTF-8
|
|||
|
|
Content-Transfer-Encoding: 8bit
|
|||
|
|
|
|||
|
|
- 电源节能模式兼容hadess和tuned两个后端。
|
|||
|
|
|
|||
|
|
Signed-off-by: tangjie02 <tangjie02@kylinsec.com.cn>
|
|||
|
|
---
|
|||
|
|
.../com.kylinsec.kiran.power.gschema.xml.in | 10 +
|
|||
|
|
include/power-i.h | 23 ++
|
|||
|
|
...com.kylinsec.Kiran.SessionDaemon.Power.xml | 16 ++
|
|||
|
|
plugins/power/power-manager.cpp | 24 ++
|
|||
|
|
plugins/power/power-manager.h | 6 +
|
|||
|
|
plugins/power/save/power-save.cpp | 4 +-
|
|||
|
|
plugins/power/save/power-save.h | 2 +-
|
|||
|
|
.../power/wrapper/power-profiles-hadess.cpp | 217 ++++++++++++++++++
|
|||
|
|
plugins/power/wrapper/power-profiles-hadess.h | 42 ++++
|
|||
|
|
.../power/wrapper/power-profiles-tuned.cpp | 194 ++++++++++++++++
|
|||
|
|
plugins/power/wrapper/power-profiles-tuned.h | 45 ++++
|
|||
|
|
plugins/power/wrapper/power-profiles.cpp | 137 ++---------
|
|||
|
|
plugins/power/wrapper/power-profiles.h | 41 ++--
|
|||
|
|
.../power/wrapper/power-wrapper-manager.cpp | 2 +-
|
|||
|
|
14 files changed, 611 insertions(+), 152 deletions(-)
|
|||
|
|
create mode 100644 plugins/power/wrapper/power-profiles-hadess.cpp
|
|||
|
|
create mode 100644 plugins/power/wrapper/power-profiles-hadess.h
|
|||
|
|
create mode 100644 plugins/power/wrapper/power-profiles-tuned.cpp
|
|||
|
|
create mode 100644 plugins/power/wrapper/power-profiles-tuned.h
|
|||
|
|
|
|||
|
|
diff --git a/data/schemas/com.kylinsec.kiran.power.gschema.xml.in b/data/schemas/com.kylinsec.kiran.power.gschema.xml.in
|
|||
|
|
index 094ea2f..2c4eef9 100644
|
|||
|
|
--- a/data/schemas/com.kylinsec.kiran.power.gschema.xml.in
|
|||
|
|
+++ b/data/schemas/com.kylinsec.kiran.power.gschema.xml.in
|
|||
|
|
@@ -34,6 +34,11 @@
|
|||
|
|
<value nick="x11" value="2"/>
|
|||
|
|
</enum>
|
|||
|
|
|
|||
|
|
+ <enum id="com.kylinsec.kiran.power.profile-policy">
|
|||
|
|
+ <value nick="hadess" value="1"/>
|
|||
|
|
+ <value nick="tuned" value="2"/>
|
|||
|
|
+ </enum>
|
|||
|
|
+
|
|||
|
|
<schema id="com.kylinsec.kiran.power" path="/com/kylinsec/kiran/power/">
|
|||
|
|
|
|||
|
|
<key name="computer-battery-idle-time" type="i">
|
|||
|
|
@@ -136,5 +141,10 @@
|
|||
|
|
<default>'auto'</default>
|
|||
|
|
<description>Set the policy for obtaining brightness values.</description>
|
|||
|
|
</key>
|
|||
|
|
+
|
|||
|
|
+ <key name="profile-policy" enum="com.kylinsec.kiran.power.profile-policy">
|
|||
|
|
+ <default>'hadess'</default>
|
|||
|
|
+ <description>The profiles daemon used by current power plugin.</description>
|
|||
|
|
+ </key>
|
|||
|
|
</schema>
|
|||
|
|
</schemalist>
|
|||
|
|
diff --git a/include/power-i.h b/include/power-i.h
|
|||
|
|
index 8d33a91..895c93e 100644
|
|||
|
|
--- a/include/power-i.h
|
|||
|
|
+++ b/include/power-i.h
|
|||
|
|
@@ -116,6 +116,27 @@ extern "C"
|
|||
|
|
POWER_MONITOR_BACKLIGHT_POLICY_X11 = 2,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
+ /* 这里兼容两个后端的原因是power-profiles-daemon更好用,支持holdprofile接口,但支持的架构比较少。
|
|||
|
|
+ 如果要支持D2000等系统,要使用tuned作为后端。由于tuned不支持holdprofile,如果电源电量过低时自动切换到saver
|
|||
|
|
+ 模式后,如果电量充足了,就没法再切回原来的模式了,因此两者各有优缺点。*/
|
|||
|
|
+ enum PowerProfilePolicy
|
|||
|
|
+ {
|
|||
|
|
+ // 使用power-profiles-daemon作为后端
|
|||
|
|
+ POWER_PROFILE_POLICY_HADESS = 1,
|
|||
|
|
+ // 使用tuned作为后端
|
|||
|
|
+ POWER_PROFILE_POLICY_TUNED = 2,
|
|||
|
|
+ };
|
|||
|
|
+
|
|||
|
|
+ enum PowerProfileMode
|
|||
|
|
+ {
|
|||
|
|
+ // 节能
|
|||
|
|
+ POWER_PROFILE_MODE_SAVER = 0,
|
|||
|
|
+ // 平衡
|
|||
|
|
+ POWER_PROFILE_MODE_BALANCED = 1,
|
|||
|
|
+ // 高性能
|
|||
|
|
+ POWER_PROFILE_MODE_PERFORMANCE = 2,
|
|||
|
|
+ };
|
|||
|
|
+
|
|||
|
|
#define POWER_DBUS_NAME "com.kylinsec.Kiran.SessionDaemon.Power"
|
|||
|
|
#define POWER_OBJECT_PATH "/com/kylinsec/Kiran/SessionDaemon/Power"
|
|||
|
|
|
|||
|
|
@@ -157,6 +178,8 @@ extern "C"
|
|||
|
|
#define POWER_SCHEMA_TRAY_ICON_POLICY "tray-icon-policy"
|
|||
|
|
// 设置获取显示器亮度值的策略,'tool'是直接操作背光设备文件,'x11'是通过xrandr接口调节亮度
|
|||
|
|
#define POWER_SCHEMA_MONITOR_BACKLIGHT_POLICY "monitor-backlight-policy"
|
|||
|
|
+// 选用的profiles后端
|
|||
|
|
+#define POWER_SCHEMA_PROFILE_POLICY "profile-policy"
|
|||
|
|
|
|||
|
|
#ifdef __cplusplus
|
|||
|
|
}
|
|||
|
|
diff --git a/plugins/power/com.kylinsec.Kiran.SessionDaemon.Power.xml b/plugins/power/com.kylinsec.Kiran.SessionDaemon.Power.xml
|
|||
|
|
index fe2f35e..afa5ebc 100644
|
|||
|
|
--- a/plugins/power/com.kylinsec.Kiran.SessionDaemon.Power.xml
|
|||
|
|
+++ b/plugins/power/com.kylinsec.Kiran.SessionDaemon.Power.xml
|
|||
|
|
@@ -81,6 +81,13 @@
|
|||
|
|
<description>Enable cpu save energy when the ups or battery power is low.</description>
|
|||
|
|
</method>
|
|||
|
|
|
|||
|
|
+ <method name="SwitchProfile">
|
|||
|
|
+ <arg type="i" name="mode" direction="in">
|
|||
|
|
+ <description>The profile mode. Refer to PowerProfileMode in power-i.h</description>
|
|||
|
|
+ </arg>
|
|||
|
|
+ <description>Switch profile mode.</description>
|
|||
|
|
+ </method>
|
|||
|
|
+
|
|||
|
|
<property name="OnBattery" type="b" access="read">
|
|||
|
|
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="true"/>
|
|||
|
|
<description>Indicates whether the system is running on battery power.</description>
|
|||
|
|
@@ -106,6 +113,11 @@
|
|||
|
|
<description>Whether does the cpu save energy when the ups or battery power is low.</description>
|
|||
|
|
</property>
|
|||
|
|
|
|||
|
|
+ <property name="ActiveProfile" type="i" access="read">
|
|||
|
|
+ <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="true"/>
|
|||
|
|
+ <description>The active profile mode.</description>
|
|||
|
|
+ </property>
|
|||
|
|
+
|
|||
|
|
<signal name="IdleActionChanged">
|
|||
|
|
<arg name="device" type="i" />
|
|||
|
|
<arg name="supply" type="i" />
|
|||
|
|
@@ -119,5 +131,9 @@
|
|||
|
|
<arg name="device" type="i" />
|
|||
|
|
</signal>
|
|||
|
|
|
|||
|
|
+ <signal name="ActiveProfileChanged">
|
|||
|
|
+ <arg name="active_profile" type="i" />
|
|||
|
|
+ </signal>
|
|||
|
|
+
|
|||
|
|
</interface>
|
|||
|
|
</node>
|
|||
|
|
diff --git a/plugins/power/power-manager.cpp b/plugins/power/power-manager.cpp
|
|||
|
|
index 9282b85..cf5d8d5 100644
|
|||
|
|
--- a/plugins/power/power-manager.cpp
|
|||
|
|
+++ b/plugins/power/power-manager.cpp
|
|||
|
|
@@ -27,6 +27,7 @@ PowerManager::PowerManager(PowerWrapperManager* wrapper_manager, PowerBacklight*
|
|||
|
|
{
|
|||
|
|
this->power_settings_ = Gio::Settings::create(POWER_SCHEMA_ID);
|
|||
|
|
this->upower_client_ = this->wrapper_manager_->get_default_upower();
|
|||
|
|
+ this->profiles_ = this->wrapper_manager_->get_default_profiles();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
PowerManager::~PowerManager()
|
|||
|
|
@@ -56,6 +57,8 @@ void PowerManager::init()
|
|||
|
|
sigc::mem_fun(this, &PowerManager::on_bus_acquired),
|
|||
|
|
sigc::mem_fun(this, &PowerManager::on_name_acquired),
|
|||
|
|
sigc::mem_fun(this, &PowerManager::on_name_lost));
|
|||
|
|
+
|
|||
|
|
+ this->profiles_->signal_active_profile_changed().connect(sigc::mem_fun(this, &PowerManager::on_active_profile_changed));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void PowerManager::SetIdleAction(gint32 device,
|
|||
|
|
@@ -329,6 +332,12 @@ void PowerManager::EnableChargeLowSaver(bool enabled, MethodInvocation& invocati
|
|||
|
|
invocation.ret();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
+void PowerManager::SwitchProfile(gint32 mode, MethodInvocation& invocation)
|
|||
|
|
+{
|
|||
|
|
+ this->ActiveProfile_set(mode);
|
|||
|
|
+ invocation.ret();
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
bool PowerManager::DisplayIdleDimmedEnabled_setHandler(bool value)
|
|||
|
|
{
|
|||
|
|
this->power_settings_->set_boolean(POWER_SCHEMA_ENABLE_DISPLAY_IDLE_DIMMED, value);
|
|||
|
|
@@ -347,6 +356,11 @@ bool PowerManager::ChargeLowSaverEnabled_setHandler(bool value)
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
+bool PowerManager::ActiveProfile_setHandler(gint32 value)
|
|||
|
|
+{
|
|||
|
|
+ return this->profiles_->switch_profile(value);
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
bool PowerManager::OnBattery_get()
|
|||
|
|
{
|
|||
|
|
return this->upower_client_->get_on_battery();
|
|||
|
|
@@ -372,6 +386,11 @@ bool PowerManager::ChargeLowSaverEnabled_get()
|
|||
|
|
return this->power_settings_->get_boolean(POWER_SCHEMA_ENABLE_CHARGE_LOW_SAVER);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
+gint32 PowerManager::ActiveProfile_get()
|
|||
|
|
+{
|
|||
|
|
+ return this->profiles_->get_active_profile();
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
void PowerManager::on_battery_changed(bool on_battery)
|
|||
|
|
{
|
|||
|
|
this->OnBattery_set(on_battery);
|
|||
|
|
@@ -426,6 +445,11 @@ void PowerManager::on_brightness_changed(std::shared_ptr<PowerBacklightPercentag
|
|||
|
|
this->BrightnessChanged_signal.emit(backlight_device->get_type());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
+void PowerManager::on_active_profile_changed(int32_t profile_mode)
|
|||
|
|
+{
|
|||
|
|
+ this->ActiveProfileChanged_signal.emit(profile_mode);
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
void PowerManager::on_bus_acquired(const Glib::RefPtr<Gio::DBus::Connection>& connect, Glib::ustring name)
|
|||
|
|
{
|
|||
|
|
KLOG_PROFILE("name: %s", name.c_str());
|
|||
|
|
diff --git a/plugins/power/power-manager.h b/plugins/power/power-manager.h
|
|||
|
|
index 674de4d..97c8c7d 100644
|
|||
|
|
--- a/plugins/power/power-manager.h
|
|||
|
|
+++ b/plugins/power/power-manager.h
|
|||
|
|
@@ -88,12 +88,15 @@ protected:
|
|||
|
|
virtual void EnableChargeLowDimmed(bool enabled, MethodInvocation &invocation);
|
|||
|
|
// 电量过低时是否进入节能模式
|
|||
|
|
virtual void EnableChargeLowSaver(bool enabled, MethodInvocation &invocation);
|
|||
|
|
+ // 切换电源模式
|
|||
|
|
+ virtual void SwitchProfile(gint32 mode, MethodInvocation &invocation);
|
|||
|
|
|
|||
|
|
virtual bool OnBattery_setHandler(bool value) { return true; }
|
|||
|
|
virtual bool LidIsPresent_setHandler(bool value) { return true; }
|
|||
|
|
virtual bool DisplayIdleDimmedEnabled_setHandler(bool value);
|
|||
|
|
virtual bool ChargeLowDimmedEnabled_setHandler(bool value);
|
|||
|
|
virtual bool ChargeLowSaverEnabled_setHandler(bool value);
|
|||
|
|
+ virtual bool ActiveProfile_setHandler(gint32 value);
|
|||
|
|
|
|||
|
|
// 系统是否在使用电池供电
|
|||
|
|
virtual bool OnBattery_get();
|
|||
|
|
@@ -102,6 +105,7 @@ protected:
|
|||
|
|
virtual bool DisplayIdleDimmedEnabled_get();
|
|||
|
|
virtual bool ChargeLowDimmedEnabled_get();
|
|||
|
|
virtual bool ChargeLowSaverEnabled_get();
|
|||
|
|
+ virtual gint32 ActiveProfile_get();
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
void init();
|
|||
|
|
@@ -111,6 +115,7 @@ private:
|
|||
|
|
|
|||
|
|
void on_settings_changed(const Glib::ustring &key);
|
|||
|
|
void on_brightness_changed(std::shared_ptr<PowerBacklightPercentage> backlight_device, int32_t brightness_value);
|
|||
|
|
+ void on_active_profile_changed(int32_t profile_mode);
|
|||
|
|
|
|||
|
|
void on_bus_acquired(const Glib::RefPtr<Gio::DBus::Connection> &connect, Glib::ustring name);
|
|||
|
|
void on_name_acquired(const Glib::RefPtr<Gio::DBus::Connection> &connect, Glib::ustring name);
|
|||
|
|
@@ -122,6 +127,7 @@ private:
|
|||
|
|
PowerWrapperManager *wrapper_manager_;
|
|||
|
|
PowerBacklight *backlight_;
|
|||
|
|
std::shared_ptr<PowerUPower> upower_client_;
|
|||
|
|
+ std::shared_ptr<PowerProfiles> profiles_;
|
|||
|
|
|
|||
|
|
Glib::RefPtr<Gio::Settings> power_settings_;
|
|||
|
|
|
|||
|
|
diff --git a/plugins/power/save/power-save.cpp b/plugins/power/save/power-save.cpp
|
|||
|
|
index 3dfcfce..c5b6bf8 100644
|
|||
|
|
--- a/plugins/power/save/power-save.cpp
|
|||
|
|
+++ b/plugins/power/save/power-save.cpp
|
|||
|
|
@@ -162,7 +162,7 @@ void PowerSave::do_cpu_saver()
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
- this->cpu_saver_cookie_ = this->profiles_->hold_profile(POWER_PROFILE_SAVER, "battery or ups power low.", "kiran-session-daemon");
|
|||
|
|
+ this->cpu_saver_cookie_ = this->profiles_->hold_profile(PowerProfileMode::POWER_PROFILE_MODE_SAVER, "battery or ups power low.");
|
|||
|
|
this->cpu_saver_timestamp_ = time(NULL);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@@ -207,7 +207,7 @@ void PowerSave::on_monitor_brightness_changed(int32_t brightness_percentage)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
-void PowerSave::on_active_profile_changed(const Glib::ustring& active_profile)
|
|||
|
|
+void PowerSave::on_active_profile_changed(int32_t profile_mode)
|
|||
|
|
{
|
|||
|
|
if (this->cpu_saver_timestamp_ > 0 &&
|
|||
|
|
this->cpu_saver_timestamp_ + CPU_SAVER_INTERVAL < time(NULL))
|
|||
|
|
diff --git a/plugins/power/save/power-save.h b/plugins/power/save/power-save.h
|
|||
|
|
index ca0f6fd..6f994f5 100644
|
|||
|
|
--- a/plugins/power/save/power-save.h
|
|||
|
|
+++ b/plugins/power/save/power-save.h
|
|||
|
|
@@ -54,7 +54,7 @@ private:
|
|||
|
|
|
|||
|
|
void on_kbd_brightness_changed(int32_t brightness_percentage);
|
|||
|
|
void on_monitor_brightness_changed(int32_t brightness_percentage);
|
|||
|
|
- void on_active_profile_changed(const Glib::ustring& active_profile);
|
|||
|
|
+ void on_active_profile_changed(int32_t profile_mode);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
static PowerSave* instance_;
|
|||
|
|
diff --git a/plugins/power/wrapper/power-profiles-hadess.cpp b/plugins/power/wrapper/power-profiles-hadess.cpp
|
|||
|
|
new file mode 100644
|
|||
|
|
index 0000000..d6e4247
|
|||
|
|
--- /dev/null
|
|||
|
|
+++ b/plugins/power/wrapper/power-profiles-hadess.cpp
|
|||
|
|
@@ -0,0 +1,217 @@
|
|||
|
|
+/**
|
|||
|
|
+ * Copyright (c) 2023 ~ 2024 KylinSec Co., Ltd.
|
|||
|
|
+ * kiran-cc-daemon is licensed under Mulan PSL v2.
|
|||
|
|
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|||
|
|
+ * You may obtain a copy of Mulan PSL v2 at:
|
|||
|
|
+ * http://license.coscl.org.cn/MulanPSL2
|
|||
|
|
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|||
|
|
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|||
|
|
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|||
|
|
+ * See the Mulan PSL v2 for more details.
|
|||
|
|
+ *
|
|||
|
|
+ * Author: tangjie02 <tangjie02@kylinos.com.cn>
|
|||
|
|
+ */
|
|||
|
|
+
|
|||
|
|
+#include "plugins/power/wrapper/power-profiles-hadess.h"
|
|||
|
|
+#include "power-i.h"
|
|||
|
|
+
|
|||
|
|
+namespace Kiran
|
|||
|
|
+{
|
|||
|
|
+#define PROFILES_HADESS_MODE_SAVER "power-saver"
|
|||
|
|
+#define PROFILES_HADESS_MODE_BALANCED "balanced"
|
|||
|
|
+#define PROFILES_HADESS_MODE_PERFORMANCE "performance"
|
|||
|
|
+
|
|||
|
|
+#define PROFILES_HADESS_DBUS_NAME "net.hadess.PowerProfiles"
|
|||
|
|
+#define PROFILES_HADESS_DBUS_OBJECT_PATH "/net/hadess/PowerProfiles"
|
|||
|
|
+#define PROFILES_HADESS_DBUS_INTERFACE "net.hadess.PowerProfiles"
|
|||
|
|
+#define PROFILES_HADESS_DBUS_PROP_ACTIVE_PROFILE "ActiveProfile"
|
|||
|
|
+
|
|||
|
|
+PowerProfilesHadess::PowerProfilesHadess()
|
|||
|
|
+{
|
|||
|
|
+ try
|
|||
|
|
+ {
|
|||
|
|
+ this->profiles_proxy_ = Gio::DBus::Proxy::create_for_bus_sync(Gio::DBus::BUS_TYPE_SYSTEM,
|
|||
|
|
+ PROFILES_HADESS_DBUS_NAME,
|
|||
|
|
+ PROFILES_HADESS_DBUS_OBJECT_PATH,
|
|||
|
|
+ PROFILES_HADESS_DBUS_INTERFACE);
|
|||
|
|
+ }
|
|||
|
|
+ catch (const Glib::Error &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to create bus sync: %s", e.what().c_str());
|
|||
|
|
+ return;
|
|||
|
|
+ }
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+void PowerProfilesHadess::init()
|
|||
|
|
+{
|
|||
|
|
+ this->profiles_proxy_->signal_properties_changed().connect(sigc::mem_fun(this, &PowerProfilesHadess::on_properties_changed));
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+bool PowerProfilesHadess::switch_profile(int32_t profile_mode)
|
|||
|
|
+{
|
|||
|
|
+ RETURN_VAL_IF_FALSE(this->profiles_proxy_, false);
|
|||
|
|
+
|
|||
|
|
+ auto profile_mode_str = this->porfile_mode_enum2str(profile_mode);
|
|||
|
|
+ KLOG_DEBUG("Switch power active profile to %s.", profile_mode_str.c_str());
|
|||
|
|
+
|
|||
|
|
+ try
|
|||
|
|
+ {
|
|||
|
|
+ std::vector<Glib::VariantBase> params_base;
|
|||
|
|
+ params_base.push_back(Glib::Variant<Glib::ustring>::create(PROFILES_HADESS_DBUS_INTERFACE));
|
|||
|
|
+ params_base.push_back(Glib::Variant<Glib::ustring>::create(PROFILES_HADESS_DBUS_PROP_ACTIVE_PROFILE));
|
|||
|
|
+ params_base.push_back(Glib::Variant<Glib::VariantBase>::create(Glib::Variant<Glib::ustring>::create((profile_mode_str))));
|
|||
|
|
+ Glib::VariantContainerBase params = Glib::VariantContainerBase::create_tuple(params_base);
|
|||
|
|
+ this->profiles_proxy_->call_sync("org.freedesktop.DBus.Properties.Set", params);
|
|||
|
|
+ }
|
|||
|
|
+ catch (const Glib::Error &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to set property %s to %s: %s",
|
|||
|
|
+ PROFILES_HADESS_DBUS_PROP_ACTIVE_PROFILE,
|
|||
|
|
+ profile_mode_str.c_str(),
|
|||
|
|
+ e.what().c_str());
|
|||
|
|
+ return false;
|
|||
|
|
+ }
|
|||
|
|
+ catch (const std::exception &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to set property %s to %s: %s",
|
|||
|
|
+ PROFILES_HADESS_DBUS_PROP_ACTIVE_PROFILE,
|
|||
|
|
+ profile_mode_str.c_str(),
|
|||
|
|
+ e.what());
|
|||
|
|
+ return false;
|
|||
|
|
+ }
|
|||
|
|
+ return true;
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+uint32_t PowerProfilesHadess::hold_profile(int32_t profile_mode, const std::string &reason)
|
|||
|
|
+{
|
|||
|
|
+ RETURN_VAL_IF_FALSE(this->profiles_proxy_, -1);
|
|||
|
|
+
|
|||
|
|
+ auto profile_mode_str = this->porfile_mode_enum2str(profile_mode);
|
|||
|
|
+ KLOG_DEBUG("Hold power active profile to %s.", profile_mode_str.c_str());
|
|||
|
|
+
|
|||
|
|
+ try
|
|||
|
|
+ {
|
|||
|
|
+ auto parameters = g_variant_new("(sss)", profile_mode_str.c_str(), reason.c_str(), "kiran-session-daemon");
|
|||
|
|
+ Glib::VariantContainerBase base(parameters, false);
|
|||
|
|
+ auto retval = this->profiles_proxy_->call_sync("HoldProfile", base);
|
|||
|
|
+ auto v1 = retval.get_child(0);
|
|||
|
|
+ return Glib::VariantBase::cast_dynamic<Glib::Variant<uint32_t>>(v1).get();
|
|||
|
|
+ }
|
|||
|
|
+ catch (const Glib::Error &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to call HoldProfile: %s", e.what().c_str());
|
|||
|
|
+ return -1;
|
|||
|
|
+ }
|
|||
|
|
+ catch (const std::exception &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to call HoldProfile: %s", e.what());
|
|||
|
|
+ return -1;
|
|||
|
|
+ }
|
|||
|
|
+ return 0;
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+void PowerProfilesHadess::release_profile(uint32_t cookie)
|
|||
|
|
+{
|
|||
|
|
+ Glib::VariantContainerBase retval;
|
|||
|
|
+
|
|||
|
|
+ RETURN_IF_FALSE(this->profiles_proxy_);
|
|||
|
|
+
|
|||
|
|
+ auto parameters = g_variant_new("(u)", cookie);
|
|||
|
|
+ Glib::VariantContainerBase base(parameters, false);
|
|||
|
|
+
|
|||
|
|
+ try
|
|||
|
|
+ {
|
|||
|
|
+ this->profiles_proxy_->call_sync("ReleaseProfile", base);
|
|||
|
|
+ }
|
|||
|
|
+ catch (const Glib::Error &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to call ReleaseProfile: %s", e.what().c_str());
|
|||
|
|
+ }
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+int32_t PowerProfilesHadess::get_active_profile()
|
|||
|
|
+{
|
|||
|
|
+ RETURN_VAL_IF_FALSE(this->profiles_proxy_, POWER_PROFILE_MODE_PERFORMANCE);
|
|||
|
|
+
|
|||
|
|
+ try
|
|||
|
|
+ {
|
|||
|
|
+ Glib::VariantBase value;
|
|||
|
|
+ this->profiles_proxy_->get_cached_property(value, PROFILES_HADESS_DBUS_PROP_ACTIVE_PROFILE);
|
|||
|
|
+ auto profile_mode_str = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(value).get();
|
|||
|
|
+ return this->porfile_mode_str2enum(profile_mode_str);
|
|||
|
|
+ }
|
|||
|
|
+ catch (const std::exception &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to get property %s: %s", PROFILES_HADESS_DBUS_PROP_ACTIVE_PROFILE, e.what());
|
|||
|
|
+ }
|
|||
|
|
+ // 默认返回高性能模式
|
|||
|
|
+ return POWER_PROFILE_MODE_PERFORMANCE;
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+std::string PowerProfilesHadess::porfile_mode_enum2str(int32_t profile_mode)
|
|||
|
|
+{
|
|||
|
|
+ switch (profile_mode)
|
|||
|
|
+ {
|
|||
|
|
+ case PowerProfileMode::POWER_PROFILE_MODE_SAVER:
|
|||
|
|
+ return PROFILES_HADESS_MODE_SAVER;
|
|||
|
|
+ case PowerProfileMode::POWER_PROFILE_MODE_BALANCED:
|
|||
|
|
+ return PROFILES_HADESS_MODE_BALANCED;
|
|||
|
|
+ case PowerProfileMode::POWER_PROFILE_MODE_PERFORMANCE:
|
|||
|
|
+ return PROFILES_HADESS_MODE_PERFORMANCE;
|
|||
|
|
+ default:
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Unknown profile mode %d, so return performance as current profile mode.", profile_mode);
|
|||
|
|
+ return PROFILES_HADESS_MODE_PERFORMANCE;
|
|||
|
|
+ }
|
|||
|
|
+ }
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+int32_t PowerProfilesHadess::porfile_mode_str2enum(const std::string &profile_mode_str)
|
|||
|
|
+{
|
|||
|
|
+ switch (shash(profile_mode_str.c_str()))
|
|||
|
|
+ {
|
|||
|
|
+ case CONNECT(PROFILES_HADESS_MODE_SAVER, _hash):
|
|||
|
|
+ return PowerProfileMode::POWER_PROFILE_MODE_SAVER;
|
|||
|
|
+ case CONNECT(PROFILES_HADESS_MODE_BALANCED, _hash):
|
|||
|
|
+ return PowerProfileMode::POWER_PROFILE_MODE_BALANCED;
|
|||
|
|
+ case CONNECT(PROFILES_HADESS_MODE_PERFORMANCE, _hash):
|
|||
|
|
+ return PowerProfileMode::POWER_PROFILE_MODE_PERFORMANCE;
|
|||
|
|
+
|
|||
|
|
+ default:
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Unknown profile mode %s, so return performance as current profile mode.", profile_mode_str.c_str());
|
|||
|
|
+ return PowerProfileMode::POWER_PROFILE_MODE_PERFORMANCE;
|
|||
|
|
+ }
|
|||
|
|
+ }
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+void PowerProfilesHadess::on_properties_changed(const Gio::DBus::Proxy::MapChangedProperties &changed_properties,
|
|||
|
|
+ const std::vector<Glib::ustring> &invalidated_properties)
|
|||
|
|
+{
|
|||
|
|
+ try
|
|||
|
|
+ {
|
|||
|
|
+ for (auto &iter : changed_properties)
|
|||
|
|
+ {
|
|||
|
|
+ switch (shash(iter.first.c_str()))
|
|||
|
|
+ {
|
|||
|
|
+ case CONNECT(PROFILES_HADESS_DBUS_PROP_ACTIVE_PROFILE, _hash):
|
|||
|
|
+ {
|
|||
|
|
+ auto profile_mode_str = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(iter.second).get();
|
|||
|
|
+ auto profile_mode = this->porfile_mode_str2enum(profile_mode_str);
|
|||
|
|
+ this->active_profile_changed_.emit(profile_mode);
|
|||
|
|
+ break;
|
|||
|
|
+ }
|
|||
|
|
+ default:
|
|||
|
|
+ break;
|
|||
|
|
+ }
|
|||
|
|
+ }
|
|||
|
|
+ }
|
|||
|
|
+ catch (const std::exception &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("%s", e.what());
|
|||
|
|
+ }
|
|||
|
|
+
|
|||
|
|
+ return;
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+} // namespace Kiran
|
|||
|
|
diff --git a/plugins/power/wrapper/power-profiles-hadess.h b/plugins/power/wrapper/power-profiles-hadess.h
|
|||
|
|
new file mode 100644
|
|||
|
|
index 0000000..40bb4f5
|
|||
|
|
--- /dev/null
|
|||
|
|
+++ b/plugins/power/wrapper/power-profiles-hadess.h
|
|||
|
|
@@ -0,0 +1,42 @@
|
|||
|
|
+/**
|
|||
|
|
+ * Copyright (c) 2023 ~ 2024 KylinSec Co., Ltd.
|
|||
|
|
+ * kiran-cc-daemon is licensed under Mulan PSL v2.
|
|||
|
|
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|||
|
|
+ * You may obtain a copy of Mulan PSL v2 at:
|
|||
|
|
+ * http://license.coscl.org.cn/MulanPSL2
|
|||
|
|
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|||
|
|
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|||
|
|
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|||
|
|
+ * See the Mulan PSL v2 for more details.
|
|||
|
|
+ *
|
|||
|
|
+ * Author: tangjie02 <tangjie02@kylinos.com.cn>
|
|||
|
|
+ */
|
|||
|
|
+
|
|||
|
|
+#pragma once
|
|||
|
|
+
|
|||
|
|
+#include "plugins/power/wrapper/power-profiles.h"
|
|||
|
|
+
|
|||
|
|
+namespace Kiran
|
|||
|
|
+{
|
|||
|
|
+class PowerProfilesHadess : public PowerProfiles
|
|||
|
|
+{
|
|||
|
|
+public:
|
|||
|
|
+ PowerProfilesHadess();
|
|||
|
|
+ virtual ~PowerProfilesHadess(){};
|
|||
|
|
+
|
|||
|
|
+ virtual void init();
|
|||
|
|
+ virtual bool switch_profile(int32_t profile_mode);
|
|||
|
|
+ virtual uint32_t hold_profile(int32_t profile_mode, const std::string &reason);
|
|||
|
|
+ virtual void release_profile(uint32_t cookie);
|
|||
|
|
+ virtual int32_t get_active_profile();
|
|||
|
|
+
|
|||
|
|
+private:
|
|||
|
|
+ std::string porfile_mode_enum2str(int32_t profile_mode);
|
|||
|
|
+ int32_t porfile_mode_str2enum(const std::string &profile_mode_str);
|
|||
|
|
+ void on_properties_changed(const Gio::DBus::Proxy::MapChangedProperties &changed_properties,
|
|||
|
|
+ const std::vector<Glib::ustring> &invalidated_properties);
|
|||
|
|
+
|
|||
|
|
+private:
|
|||
|
|
+ Glib::RefPtr<Gio::DBus::Proxy> profiles_proxy_;
|
|||
|
|
+};
|
|||
|
|
+} // namespace Kiran
|
|||
|
|
diff --git a/plugins/power/wrapper/power-profiles-tuned.cpp b/plugins/power/wrapper/power-profiles-tuned.cpp
|
|||
|
|
new file mode 100644
|
|||
|
|
index 0000000..ee1fa7b
|
|||
|
|
--- /dev/null
|
|||
|
|
+++ b/plugins/power/wrapper/power-profiles-tuned.cpp
|
|||
|
|
@@ -0,0 +1,194 @@
|
|||
|
|
+/**
|
|||
|
|
+ * Copyright (c) 2023 ~ 2024 KylinSec Co., Ltd.
|
|||
|
|
+ * kiran-cc-daemon is licensed under Mulan PSL v2.
|
|||
|
|
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|||
|
|
+ * You may obtain a copy of Mulan PSL v2 at:
|
|||
|
|
+ * http://license.coscl.org.cn/MulanPSL2
|
|||
|
|
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|||
|
|
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|||
|
|
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|||
|
|
+ * See the Mulan PSL v2 for more details.
|
|||
|
|
+ *
|
|||
|
|
+ * Author: tangjie02 <tangjie02@kylinos.com.cn>
|
|||
|
|
+ */
|
|||
|
|
+
|
|||
|
|
+#include "plugins/power/wrapper/power-profiles-tuned.h"
|
|||
|
|
+#include "power-i.h"
|
|||
|
|
+
|
|||
|
|
+namespace Kiran
|
|||
|
|
+{
|
|||
|
|
+#define PROFILES_TUNED_MODE_SAVER "powersave"
|
|||
|
|
+#define PROFILES_TUNED_MODE_BALANCED "balanced"
|
|||
|
|
+#define PROFILES_TUNED_MODE_PERFORMANCE "throughput-performance"
|
|||
|
|
+
|
|||
|
|
+#define PROFILES_TUNED_DBUS_NAME "com.redhat.tuned"
|
|||
|
|
+#define PROFILES_TUNED_DBUS_OBJECT_PATH "/Tuned"
|
|||
|
|
+#define PROFILES_TUNED_DBUS_INTERFACE "com.redhat.tuned.control"
|
|||
|
|
+
|
|||
|
|
+PowerProfilesTuned::PowerProfilesTuned()
|
|||
|
|
+{
|
|||
|
|
+ try
|
|||
|
|
+ {
|
|||
|
|
+ this->profiles_proxy_ = Gio::DBus::Proxy::create_for_bus_sync(Gio::DBus::BUS_TYPE_SYSTEM,
|
|||
|
|
+ PROFILES_TUNED_DBUS_NAME,
|
|||
|
|
+ PROFILES_TUNED_DBUS_OBJECT_PATH,
|
|||
|
|
+ PROFILES_TUNED_DBUS_INTERFACE);
|
|||
|
|
+ }
|
|||
|
|
+ catch (const Glib::Error &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to create bus sync: %s", e.what().c_str());
|
|||
|
|
+ return;
|
|||
|
|
+ }
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+void PowerProfilesTuned::init()
|
|||
|
|
+{
|
|||
|
|
+ this->profiles_proxy_->signal_signal().connect(sigc::mem_fun(this, &PowerProfilesTuned::on_profile_signal));
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+bool PowerProfilesTuned::switch_profile(int32_t profile_mode)
|
|||
|
|
+{
|
|||
|
|
+ auto retval = this->hold_profile(profile_mode, std::string());
|
|||
|
|
+ return (retval >= 0);
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+uint32_t PowerProfilesTuned::hold_profile(int32_t profile_mode, const std::string &)
|
|||
|
|
+{
|
|||
|
|
+ RETURN_VAL_IF_FALSE(this->profiles_proxy_, 0);
|
|||
|
|
+
|
|||
|
|
+ auto profile_mode_str = this->porfile_mode_enum2str(profile_mode);
|
|||
|
|
+ KLOG_DEBUG("Hold power active profile to %s.", profile_mode_str.c_str());
|
|||
|
|
+
|
|||
|
|
+ try
|
|||
|
|
+ {
|
|||
|
|
+ auto parameters = g_variant_new("(s)", profile_mode_str.c_str());
|
|||
|
|
+ Glib::VariantContainerBase base(parameters, false);
|
|||
|
|
+ auto retval = this->profiles_proxy_->call_sync("switch_profile", base);
|
|||
|
|
+
|
|||
|
|
+ auto ret_parameters = retval.get_child(0);
|
|||
|
|
+ auto ret_parameters_tuple = Glib::VariantBase::cast_dynamic<Glib::Variant<std::tuple<bool, Glib::ustring>>>(ret_parameters);
|
|||
|
|
+ auto successed = ret_parameters_tuple.get_child<bool>(0);
|
|||
|
|
+ auto reason = ret_parameters_tuple.get_child<Glib::ustring>(1);
|
|||
|
|
+
|
|||
|
|
+ if (!successed)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to call switch_profile: %s.", reason.c_str());
|
|||
|
|
+ return -1;
|
|||
|
|
+ }
|
|||
|
|
+ }
|
|||
|
|
+ catch (const Glib::Error &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to call switch_profile: %s", e.what().c_str());
|
|||
|
|
+ return -1;
|
|||
|
|
+ }
|
|||
|
|
+ catch (const std::exception &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to call switch_profile: %s", e.what());
|
|||
|
|
+ return -1;
|
|||
|
|
+ }
|
|||
|
|
+
|
|||
|
|
+ return 0;
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+int32_t PowerProfilesTuned::get_active_profile()
|
|||
|
|
+{
|
|||
|
|
+ RETURN_VAL_IF_FALSE(this->profiles_proxy_, POWER_PROFILE_MODE_PERFORMANCE);
|
|||
|
|
+
|
|||
|
|
+ std::string profile_mode_str;
|
|||
|
|
+ try
|
|||
|
|
+ {
|
|||
|
|
+ auto retval = this->profiles_proxy_->call_sync("active_profile", Glib::VariantContainerBase());
|
|||
|
|
+ auto v1 = retval.get_child(0);
|
|||
|
|
+ profile_mode_str = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(v1).get();
|
|||
|
|
+ }
|
|||
|
|
+ catch (const Glib::Error &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to call active_profile: %s", e.what().c_str());
|
|||
|
|
+ }
|
|||
|
|
+ catch (const std::exception &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to call active_profile: %s", e.what());
|
|||
|
|
+ }
|
|||
|
|
+
|
|||
|
|
+ return this->porfile_mode_str2enum(profile_mode_str);
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+std::string PowerProfilesTuned::porfile_mode_enum2str(int32_t profile_mode)
|
|||
|
|
+{
|
|||
|
|
+ switch (profile_mode)
|
|||
|
|
+ {
|
|||
|
|
+ case PowerProfileMode::POWER_PROFILE_MODE_SAVER:
|
|||
|
|
+ return PROFILES_TUNED_MODE_SAVER;
|
|||
|
|
+ case PowerProfileMode::POWER_PROFILE_MODE_BALANCED:
|
|||
|
|
+ return PROFILES_TUNED_MODE_BALANCED;
|
|||
|
|
+ case PowerProfileMode::POWER_PROFILE_MODE_PERFORMANCE:
|
|||
|
|
+ return PROFILES_TUNED_MODE_PERFORMANCE;
|
|||
|
|
+ default:
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Unknown profile mode %d, so return performance as current profile mode.", profile_mode);
|
|||
|
|
+ return PROFILES_TUNED_MODE_PERFORMANCE;
|
|||
|
|
+ }
|
|||
|
|
+ }
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+int32_t PowerProfilesTuned::porfile_mode_str2enum(const std::string &profile_mode_str)
|
|||
|
|
+{
|
|||
|
|
+ switch (shash(profile_mode_str.c_str()))
|
|||
|
|
+ {
|
|||
|
|
+ case CONNECT(PROFILES_TUNED_MODE_SAVER, _hash):
|
|||
|
|
+ return PowerProfileMode::POWER_PROFILE_MODE_SAVER;
|
|||
|
|
+ case CONNECT(PROFILES_TUNED_MODE_BALANCED, _hash):
|
|||
|
|
+ return PowerProfileMode::POWER_PROFILE_MODE_BALANCED;
|
|||
|
|
+ case CONNECT(PROFILES_TUNED_MODE_PERFORMANCE, _hash):
|
|||
|
|
+ return PowerProfileMode::POWER_PROFILE_MODE_PERFORMANCE;
|
|||
|
|
+
|
|||
|
|
+ default:
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Unknown profile mode %s, so return performance as current profile mode.", profile_mode_str.c_str());
|
|||
|
|
+ return PowerProfileMode::POWER_PROFILE_MODE_PERFORMANCE;
|
|||
|
|
+ }
|
|||
|
|
+ }
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+void PowerProfilesTuned::on_profile_signal(const Glib::ustring &sender_name,
|
|||
|
|
+ const Glib::ustring &signal_name,
|
|||
|
|
+ const Glib::VariantContainerBase ¶meters)
|
|||
|
|
+{
|
|||
|
|
+ switch (shash(signal_name.c_str()))
|
|||
|
|
+ {
|
|||
|
|
+ case "profile_changed"_hash:
|
|||
|
|
+ {
|
|||
|
|
+ try
|
|||
|
|
+ {
|
|||
|
|
+ Glib::VariantContainerBase v1;
|
|||
|
|
+ Glib::VariantContainerBase v2;
|
|||
|
|
+ Glib::VariantContainerBase v3;
|
|||
|
|
+ parameters.get_child(v1, 0);
|
|||
|
|
+ parameters.get_child(v2, 1);
|
|||
|
|
+ parameters.get_child(v3, 2);
|
|||
|
|
+
|
|||
|
|
+ auto profiled_mode_str = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(v1).get();
|
|||
|
|
+ auto successed = Glib::VariantBase::cast_dynamic<Glib::Variant<bool>>(v2).get();
|
|||
|
|
+ auto reason = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(v3).get();
|
|||
|
|
+
|
|||
|
|
+ if (!successed)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("Failed to call switch_profile: %s.", reason.c_str());
|
|||
|
|
+ }
|
|||
|
|
+ else
|
|||
|
|
+ {
|
|||
|
|
+ this->active_profile_changed_.emit(this->porfile_mode_str2enum(profiled_mode_str));
|
|||
|
|
+ }
|
|||
|
|
+ }
|
|||
|
|
+ catch (const std::exception &e)
|
|||
|
|
+ {
|
|||
|
|
+ KLOG_WARNING("%s.", e.what());
|
|||
|
|
+ }
|
|||
|
|
+ break;
|
|||
|
|
+ }
|
|||
|
|
+ default:
|
|||
|
|
+ break;
|
|||
|
|
+ }
|
|||
|
|
+}
|
|||
|
|
+
|
|||
|
|
+} // namespace Kiran
|
|||
|
|
diff --git a/plugins/power/wrapper/power-profiles-tuned.h b/plugins/power/wrapper/power-profiles-tuned.h
|
|||
|
|
new file mode 100644
|
|||
|
|
index 0000000..af1fcf5
|
|||
|
|
--- /dev/null
|
|||
|
|
+++ b/plugins/power/wrapper/power-profiles-tuned.h
|
|||
|
|
@@ -0,0 +1,45 @@
|
|||
|
|
+/**
|
|||
|
|
+ * Copyright (c) 2023 ~ 2024 KylinSec Co., Ltd.
|
|||
|
|
+ * kiran-cc-daemon is licensed under Mulan PSL v2.
|
|||
|
|
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|||
|
|
+ * You may obtain a copy of Mulan PSL v2 at:
|
|||
|
|
+ * http://license.coscl.org.cn/MulanPSL2
|
|||
|
|
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|||
|
|
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|||
|
|
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|||
|
|
+ * See the Mulan PSL v2 for more details.
|
|||
|
|
+ *
|
|||
|
|
+ * Author: tangjie02 <tangjie02@kylinos.com.cn>
|
|||
|
|
+ */
|
|||
|
|
+
|
|||
|
|
+#pragma once
|
|||
|
|
+
|
|||
|
|
+#include "plugins/power/wrapper/power-profiles.h"
|
|||
|
|
+
|
|||
|
|
+namespace Kiran
|
|||
|
|
+{
|
|||
|
|
+class PowerProfilesTuned : public PowerProfiles
|
|||
|
|
+{
|
|||
|
|
+public:
|
|||
|
|
+ PowerProfilesTuned();
|
|||
|
|
+ virtual ~PowerProfilesTuned(){};
|
|||
|
|
+
|
|||
|
|
+ virtual void init();
|
|||
|
|
+ virtual bool switch_profile(int32_t profile_mode);
|
|||
|
|
+ // 这里永远返回0,因为不支持hold操作
|
|||
|
|
+ virtual uint32_t hold_profile(int32_t profile_mode, const std::string& reason);
|
|||
|
|
+ // 不支持该操作,什么都不执行
|
|||
|
|
+ virtual void release_profile(uint32_t cookie){};
|
|||
|
|
+ virtual int32_t get_active_profile();
|
|||
|
|
+
|
|||
|
|
+private:
|
|||
|
|
+ std::string porfile_mode_enum2str(int32_t profile_mode);
|
|||
|
|
+ int32_t porfile_mode_str2enum(const std::string& profile_mode_str);
|
|||
|
|
+ void on_profile_signal(const Glib::ustring& sender_name,
|
|||
|
|
+ const Glib::ustring& signal_name,
|
|||
|
|
+ const Glib::VariantContainerBase& parameters);
|
|||
|
|
+
|
|||
|
|
+private:
|
|||
|
|
+ Glib::RefPtr<Gio::DBus::Proxy> profiles_proxy_;
|
|||
|
|
+};
|
|||
|
|
+} // namespace Kiran
|
|||
|
|
diff --git a/plugins/power/wrapper/power-profiles.cpp b/plugins/power/wrapper/power-profiles.cpp
|
|||
|
|
index d7ba1b3..ac5f15c 100644
|
|||
|
|
--- a/plugins/power/wrapper/power-profiles.cpp
|
|||
|
|
+++ b/plugins/power/wrapper/power-profiles.cpp
|
|||
|
|
@@ -13,135 +13,24 @@
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "plugins/power/wrapper/power-profiles.h"
|
|||
|
|
+#include "plugins/power/wrapper/power-profiles-hadess.h"
|
|||
|
|
+#include "plugins/power/wrapper/power-profiles-tuned.h"
|
|||
|
|
+#include "power-i.h"
|
|||
|
|
|
|||
|
|
namespace Kiran
|
|||
|
|
{
|
|||
|
|
-#define PROFILES_DBUS_NAME "net.hadess.PowerProfiles"
|
|||
|
|
-#define PROFILES_DBUS_OBJECT_PATH "/net/hadess/PowerProfiles"
|
|||
|
|
-#define PROFILES_DBUS_INTERFACE "net.hadess.PowerProfiles"
|
|||
|
|
-#define PROFILES_DBUS_PROP_ACTIVE_PROFILE "ActiveProfile"
|
|||
|
|
-
|
|||
|
|
-PowerProfiles::PowerProfiles()
|
|||
|
|
-{
|
|||
|
|
- try
|
|||
|
|
- {
|
|||
|
|
- this->profiles_proxy_ = Gio::DBus::Proxy::create_for_bus_sync(Gio::DBus::BUS_TYPE_SYSTEM,
|
|||
|
|
- PROFILES_DBUS_NAME,
|
|||
|
|
- PROFILES_DBUS_OBJECT_PATH,
|
|||
|
|
- PROFILES_DBUS_INTERFACE);
|
|||
|
|
- }
|
|||
|
|
- catch (const Glib::Error &e)
|
|||
|
|
- {
|
|||
|
|
- KLOG_WARNING("Failed to create bus sync: %s", e.what().c_str());
|
|||
|
|
- return;
|
|||
|
|
- }
|
|||
|
|
-}
|
|||
|
|
-
|
|||
|
|
-void PowerProfiles::init()
|
|||
|
|
-{
|
|||
|
|
- this->profiles_proxy_->signal_properties_changed().connect(sigc::mem_fun(this, &PowerProfiles::on_properties_changed));
|
|||
|
|
-}
|
|||
|
|
-
|
|||
|
|
-uint32_t PowerProfiles::hold_profile(const std::string &profile,
|
|||
|
|
- const std::string &reason,
|
|||
|
|
- const std::string &application_id)
|
|||
|
|
-{
|
|||
|
|
- Glib::VariantContainerBase retval;
|
|||
|
|
-
|
|||
|
|
- RETURN_VAL_IF_FALSE(this->profiles_proxy_, false);
|
|||
|
|
-
|
|||
|
|
- auto parameters = g_variant_new("(sss)", profile.c_str(), reason.c_str(), application_id.c_str());
|
|||
|
|
- Glib::VariantContainerBase base(parameters, false);
|
|||
|
|
-
|
|||
|
|
- KLOG_DEBUG("Set power active profile to %s.", profile.c_str());
|
|||
|
|
-
|
|||
|
|
- try
|
|||
|
|
- {
|
|||
|
|
- retval = this->profiles_proxy_->call_sync("HoldProfile", base);
|
|||
|
|
- }
|
|||
|
|
- catch (const Glib::Error &e)
|
|||
|
|
- {
|
|||
|
|
- KLOG_WARNING("%s", e.what().c_str());
|
|||
|
|
- return 0;
|
|||
|
|
- }
|
|||
|
|
-
|
|||
|
|
- try
|
|||
|
|
- {
|
|||
|
|
- auto v1 = retval.get_child(0);
|
|||
|
|
- auto cookie = Glib::VariantBase::cast_dynamic<Glib::Variant<uint32_t>>(v1).get();
|
|||
|
|
- return cookie;
|
|||
|
|
- }
|
|||
|
|
- catch (const std::exception &e)
|
|||
|
|
- {
|
|||
|
|
- KLOG_WARNING("%s", e.what());
|
|||
|
|
- }
|
|||
|
|
-
|
|||
|
|
- return 0;
|
|||
|
|
-}
|
|||
|
|
-
|
|||
|
|
-void PowerProfiles::release_profile(uint32_t cookie)
|
|||
|
|
+std::shared_ptr<PowerProfiles> PowerProfiles::create()
|
|||
|
|
{
|
|||
|
|
- Glib::VariantContainerBase retval;
|
|||
|
|
-
|
|||
|
|
- RETURN_IF_FALSE(this->profiles_proxy_);
|
|||
|
|
-
|
|||
|
|
- auto parameters = g_variant_new("(u)", cookie);
|
|||
|
|
- Glib::VariantContainerBase base(parameters, false);
|
|||
|
|
-
|
|||
|
|
- try
|
|||
|
|
+ auto power_settings = Gio::Settings::create(POWER_SCHEMA_ID);
|
|||
|
|
+ auto profiles_policy = power_settings->get_enum(POWER_SCHEMA_PROFILE_POLICY);
|
|||
|
|
+ switch (profiles_policy)
|
|||
|
|
{
|
|||
|
|
- this->profiles_proxy_->call_sync("ReleaseProfile", base);
|
|||
|
|
- }
|
|||
|
|
- catch (const Glib::Error &e)
|
|||
|
|
- {
|
|||
|
|
- KLOG_WARNING("%s", e.what().c_str());
|
|||
|
|
+ case PowerProfilePolicy::POWER_PROFILE_POLICY_HADESS:
|
|||
|
|
+ return std::make_shared<PowerProfilesHadess>();
|
|||
|
|
+ case PowerProfilePolicy::POWER_PROFILE_POLICY_TUNED:
|
|||
|
|
+ return std::make_shared<PowerProfilesTuned>();
|
|||
|
|
+ default:
|
|||
|
|
+ return std::make_shared<PowerProfilesTuned>();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
-
|
|||
|
|
-std::string PowerProfiles::get_active_profile()
|
|||
|
|
-{
|
|||
|
|
- RETURN_VAL_IF_FALSE(this->profiles_proxy_, POWER_PROFILE_BALANCED);
|
|||
|
|
-
|
|||
|
|
- try
|
|||
|
|
- {
|
|||
|
|
- Glib::VariantBase value;
|
|||
|
|
- this->profiles_proxy_->get_cached_property(value, PROFILES_DBUS_PROP_ACTIVE_PROFILE);
|
|||
|
|
- return Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(value).get();
|
|||
|
|
- }
|
|||
|
|
- catch (const std::exception &e)
|
|||
|
|
- {
|
|||
|
|
- KLOG_WARNING("%s", e.what());
|
|||
|
|
- }
|
|||
|
|
- // 默认返回平衡模式
|
|||
|
|
- return POWER_PROFILE_BALANCED;
|
|||
|
|
-}
|
|||
|
|
-
|
|||
|
|
-void PowerProfiles::on_properties_changed(const Gio::DBus::Proxy::MapChangedProperties &changed_properties,
|
|||
|
|
- const std::vector<Glib::ustring> &invalidated_properties)
|
|||
|
|
-{
|
|||
|
|
- try
|
|||
|
|
- {
|
|||
|
|
- for (auto &iter : changed_properties)
|
|||
|
|
- {
|
|||
|
|
- switch (shash(iter.first.c_str()))
|
|||
|
|
- {
|
|||
|
|
- case CONNECT(PROFILES_DBUS_PROP_ACTIVE_PROFILE, _hash):
|
|||
|
|
- {
|
|||
|
|
- auto active_profile = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(iter.second).get();
|
|||
|
|
- this->active_profile_changed_.emit(active_profile);
|
|||
|
|
- break;
|
|||
|
|
- }
|
|||
|
|
- default:
|
|||
|
|
- break;
|
|||
|
|
- }
|
|||
|
|
- }
|
|||
|
|
- }
|
|||
|
|
- catch (const std::exception &e)
|
|||
|
|
- {
|
|||
|
|
- KLOG_WARNING("%s", e.what());
|
|||
|
|
- }
|
|||
|
|
-
|
|||
|
|
- return;
|
|||
|
|
-}
|
|||
|
|
-
|
|||
|
|
} // namespace Kiran
|
|||
|
|
diff --git a/plugins/power/wrapper/power-profiles.h b/plugins/power/wrapper/power-profiles.h
|
|||
|
|
index cf5b943..8f9f6f7 100644
|
|||
|
|
--- a/plugins/power/wrapper/power-profiles.h
|
|||
|
|
+++ b/plugins/power/wrapper/power-profiles.h
|
|||
|
|
@@ -12,41 +12,34 @@
|
|||
|
|
* Author: tangjie02 <tangjie02@kylinos.com.cn>
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
+#pragma once
|
|||
|
|
+
|
|||
|
|
#include "lib/base/base.h"
|
|||
|
|
|
|||
|
|
namespace Kiran
|
|||
|
|
{
|
|||
|
|
-#define POWER_PROFILE_SAVER "power-saver"
|
|||
|
|
-#define POWER_PROFILE_BALANCED "balanced"
|
|||
|
|
-#define POWER_PROFILE_PERFORMANCE "performance"
|
|||
|
|
-
|
|||
|
|
class PowerProfiles
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
- PowerProfiles();
|
|||
|
|
- virtual ~PowerProfiles(){};
|
|||
|
|
-
|
|||
|
|
- void init();
|
|||
|
|
+ // 根据gsettings的设置创建不同的子类
|
|||
|
|
+ static std::shared_ptr<PowerProfiles> create();
|
|||
|
|
|
|||
|
|
- // 设置模式,如果调用了ReleaseProfile,则进行恢复。如果有其他用户进行了手动设置(直接修改ActiveProfile属性),则不再hold当前模式
|
|||
|
|
- uint32_t hold_profile(const std::string &profile,
|
|||
|
|
- const std::string &reason,
|
|||
|
|
- const std::string &application_id);
|
|||
|
|
+ virtual void init() = 0;
|
|||
|
|
|
|||
|
|
+ // 设置模式
|
|||
|
|
+ virtual bool switch_profile(int32_t profile_mode) = 0;
|
|||
|
|
+ /* 临时设置模式,如果调用了ReleaseProfile,则进行恢复。如果调用了switch_profile,则不再hold当前模式
|
|||
|
|
+ 如果返回值大于0,则表示一个cookie;如果返回值等于0;则表示无法hold,只能永久生效,功能同switch_profile;
|
|||
|
|
+ 如果小于0则表示调用失败。*/
|
|||
|
|
+ virtual uint32_t hold_profile(int32_t profile_mode, const std::string &reason) = 0;
|
|||
|
|
// 释放hold_profile操作。恢复到之前的模式
|
|||
|
|
- void release_profile(uint32_t cookie);
|
|||
|
|
-
|
|||
|
|
- std::string get_active_profile();
|
|||
|
|
-
|
|||
|
|
- sigc::signal<void, const Glib::ustring &> &signal_active_profile_changed() { return this->active_profile_changed_; };
|
|||
|
|
-
|
|||
|
|
-private:
|
|||
|
|
- void on_properties_changed(const Gio::DBus::Proxy::MapChangedProperties &changed_properties,
|
|||
|
|
- const std::vector<Glib::ustring> &invalidated_properties);
|
|||
|
|
+ virtual void release_profile(uint32_t cookie) = 0;
|
|||
|
|
+ // 获取当前模式
|
|||
|
|
+ virtual int32_t get_active_profile() = 0;
|
|||
|
|
|
|||
|
|
-private:
|
|||
|
|
- Glib::RefPtr<Gio::DBus::Proxy> profiles_proxy_;
|
|||
|
|
+ sigc::signal<void, int32_t> &signal_active_profile_changed() { return this->active_profile_changed_; };
|
|||
|
|
|
|||
|
|
- sigc::signal<void, const Glib::ustring &> active_profile_changed_;
|
|||
|
|
+protected:
|
|||
|
|
+ sigc::signal<void, int32_t> active_profile_changed_;
|
|||
|
|
};
|
|||
|
|
} // namespace Kiran
|
|||
|
|
diff --git a/plugins/power/wrapper/power-wrapper-manager.cpp b/plugins/power/wrapper/power-wrapper-manager.cpp
|
|||
|
|
index 685000d..c60f46b 100644
|
|||
|
|
--- a/plugins/power/wrapper/power-wrapper-manager.cpp
|
|||
|
|
+++ b/plugins/power/wrapper/power-wrapper-manager.cpp
|
|||
|
|
@@ -22,7 +22,7 @@ PowerWrapperManager::PowerWrapperManager()
|
|||
|
|
this->screensaver_ = std::make_shared<PowerScreenSaver>();
|
|||
|
|
this->session_ = std::make_shared<PowerSession>();
|
|||
|
|
this->upower_ = std::make_shared<PowerUPower>();
|
|||
|
|
- this->profiles_ = std::make_shared<PowerProfiles>();
|
|||
|
|
+ this->profiles_ = PowerProfiles::create();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
PowerWrapperManager::~PowerWrapperManager()
|
|||
|
|
--
|
|||
|
|
2.36.1
|
|||
|
|
|