优麒麟电源管理浅析(二)

发布时间:2019-11-21 09:55:39 点击次数:204

优麒麟电源管理程序的组成和介绍电源管理模块从程序上来说,主要分为三个部分:ukui-power-backlight-helper 、ukui-power-manager 、ukui-power-statistics 。

1、优麒麟电源管理程序的组成和介绍

电源管理模块从程序上来说,主要分为下面三个部分:

  • ukui-power-backlight-helper ----- 设置和获取亮度程序。

  • ukui-power-manager ------------- 守护程序。(主要源文件:gpm-main.c)

  • ukui-power-statistics --------- 显示程序。(主要源文件:gpm-statistics.c)

下面这个图标和菜单选择就是 ukui-power-manager 这个程序提供的,注意到托盘图标,菜单项图标和文字是根据设备的当前状况进行动态更新。

优麒麟(Ubuntu Kylin)

图1

点击“可用电源”可以方便的调用显示程序 ukui-power-statistics,显示程序分为了左右两侧,左侧列出了当前的设备,在本例中是交流电适配器和某型号的电池。右侧是选中设备的信息。每种设备的信息种类和信息量多少是不一样的。比如交流电适配器只有一个标签页来表示就够了,但是电池就包含了三个标签页,分别是详细,历史,统计。详细标签页列出了电池的类型,功率,型号,充放电状态,充放电时间等;历史标签页绘制了四种图表,分别反映了电量,功率,充电时间,放电时间四种类型的数据,每种数据又可以根据不同的时间来选择范围。统计标签包含了四种类型数据,分别是充电,充电精度,放电,放电精度。此外,每种图表都可以选择是否显示数据点,是否绘制平滑曲线。

优麒麟(Ubuntu Kylin)

图2

点击“电源选项”可以方便调用控制面板的电源选项 ukui-control-center。控制中心实现了三组功能的设置。最上面一组是设置空闲多久显示器和计算机进入睡眠和笔记本盖子合上的动作,分为使用电源和使用电池两种情况。中间一组是按下电源物理键的动作,可以选择询问或者挂起等。最下面一组设置了托盘图标的显示策略,选择总是显示会在托盘一直存在一个程序图标,选择仅使用电池则只有电池存在才会显示托盘程序图标。

优麒麟(Ubuntu Kylin)

图3

通过下面控制面板的滑动条就会调用 ukui-power-backlight-helper 程序,滑动条向右滑动可以增大屏幕亮度。背后其实是调用了 ukui-power-backlight-helper 程序。

2、优麒麟电源管理程序和其他程序的dbus交互

a、以笔记本盖子合上的过程作为例子来说明:

当笔记本盖子合上,org.freedesktop.UPower 这个后台程序发送回来lid_is_closed 属性改变的信号,ukui.power.manager 对这个信息做出反应。先判断是否允许盖子合上的功能。再获取gsettings的设置和是否使用电池,据此调用服务 org.freedesktop.login1 的功能函数,比如:suspend,hibernate,shutdown 等。

流程图如下:

优麒麟(Ubuntu Kylin)

图4

b、还有其他的一些 dbus 进程交互。例如 upower 服务端,screensaver,login1 和 SessionManager。

和其他dbus服务的交互

org.freedesktop.UPower

服务名称

org.freedesktop.UPower 

对象

/org/freedesktop/UPower

接口名称

org.freedesktop.UPower

连接的信号

device-added

参数string object_path

device-removed

参数string object_path

notify

device-monitor

参数:GParamSpec

连接dbus服务org.ukui.ScreenSaver

对象

/

接口

org.ukui.ScreenSaver

接口调用函数

Lock

in参数(none)

out参数(none)

Throttle

in参数(s,s)

out参数(uint)

UnThrottle

in参数(unit) 

接口调用函数

GetActive

in参数(none)

out参数(bool)

SimulateUserActivity 

UnThrottle

in参数(unit) 

关机休眠等功能函数调用的服务org.freedesktop.login1

对象

/org/freedesktop/login1

 

接口

org.freedesktop.login1.Manager

 

接口调用函数

Suspend

参数(b)

PowerOff

参数(b)

Hibernate

参数(b)

接口调用函数

Inhibit

参数"(ssss)"

dbus服务org.ukui.ScreenSaver 

对象

/

接口

org.ukui.ScreenSaver

接口调用函数

Lock

in参数(none)

out参数(none)

Throttle

in参数(s,s)

out参数(uint)

UnThrottle

in参数(unit) 

接口调用函数

GetActive

in参数(none)

out参数(bool)

SimulateUserActivity

UnThrottle

in参数(unit) 

org.gnome.SessionManager

dbus服务

对象名称

/org/gnome/SessionManager

接口名称

org.gnome.SessionManager

连接的信号

IsInhibited

shutdown 

inhibitorAdded

inhibitorRemoved

功能作用

获取空闲和挂起的禁止策略

对象名称

/org/gnome/SessionManager

接口名称

org.freedesktop.DBus.Properties

方法调用

Get

功能作用

获取空闲的状态

对象名称

/org/gnome/SessionManager/Presence 

接口名称

org.gnome.SessionManager.Presence

连接的信号

StatusChanged 

以上就是对电源管理模块组成和交互的一些分析和理解,还有很多知识没有介绍到,有兴趣研究源码的可以到这个代码链接看看:https://github.com/ukui/ukui-power-manager