7个版本
新 0.2.2-dev4 | 2024年8月15日 |
---|---|
0.2.2-dev3 | 2024年8月14日 |
0.2.2-dev1 | 2024年5月5日 |
0.2.1-dev3 | 2024年1月21日 |
#81 在 硬件支持
每月300 次下载
34KB
583 行
Pinenote DBus Service
一个简单的DBus服务,通过系统DBus接口公开与Pine64 Pinenote相关的各种控制和设置。该服务使用rust编写,并使用dbus-rs crate (https://github.com/diwic/dbus-rs)。
警告 这是我编写的第一个rust程序,也是我第一次使用DBus。请期待bug以及与rust和DBus相关的所有初学者的错误 ;-). 我会非常感激任何bug报告和风格/编程建议!
需求和目标平台
此程序仅适用于在Pine64 Pinenote (arm64)上运行,并需要从以下链接提供的ebc驱动程序修改
https://github.com/m-weigand/linux/tree/mw/rk35/ebc-drm-v5-modifications-t1
这些修改也已合并到此处可用的用户可用内核分支中
https://github.com/m-weigand/linux/tree/mw/rk35/pinenote-next-t1
编译
使用以下命令编译
cargo build
使用cargo-deb创建Debian包
cargo deb
安装
只需调用生成的二进制文件即可在系统总线上使用系统总线注册DBus服务,服务名为org.pinenote.*
- org.pinenote.ebc /ebc用于ebc驱动程序控制
- org.pinenote.pen /pen用于笔按钮驱动程序控制
在systemd_units/子目录中也提供了一个systemd单元,应该是启动服务的首选方式。
在生成和使用Debian包时,systemd单元会自动安装、启用和启动。
系统总线上的DBus服务受安全限制,需要显式设置权限。这尝试使用配置文件dbus_security_configuration/pinenote.conf,应放置在此处/etc/dbus-1/system.d/pinenote.conf(由Debian包自动完成)。
用法
请参阅examples/子目录中的各种语言(shell/dbus-send、python、gjs、rust)的使用示例。
对于迫不及待的人,这里有一些dbus-send命令
# trigger full refresh
dbus-send --system --print-reply --dest=org.pinenote.ebc /ebc org.pinenote.ebc.TriggerGlobalRefresh
# set and get waveform used
dbus-send --system --print-reply --dest=org.pinenote.ebc /ebc org.pinenote.ebc.SetDefaultWaveform byte:2
dbus-send --print-reply --system --dest=org.pinenote.ebc /ebc org.pinenote.ebc.GetDefaultWaveform
# initiate a scan for the stylus (buttons). Repeatedly push the buttons
# during the 12-20 seconds scan interval
dbus-send --print-reply --system --dest=org.pinenote.pen /pen org.pinenote.pen.DoScan
dbus-send --print-reply --system --dest=org.pinenote.pen /pen org.pinenote.pen.AutoConnect
# connect to the mac address retrieved by the PenDoScan command
dbus-send --print-reply --system --dest=org.pinenote.pen /pen org.pinenote.pen.SetAddress string:"12:23:45:56:90:4b"
dbus-send --print-reply --system --dest=org.pinenote.pen /pen org.pinenote.pen.ForgetAddress
dbus-send --print-reply --system --dest=org.pinenote.pen /pen org.pinenote.pen.GetAddress
dbus-send --print-reply --system --dest=org.pinenote.pen /pen org.pinenote.pen.GetVersion
dbus-send --print-reply --system --dest=org.pinenote.pen /pen org.pinenote.pen.GetBattery
# travel mode
dbus-send --print-reply --system --dest=org.pinenote.misc /misc org.pinenote.pen.EnableTravelMode
反射
dbus-send --print-reply --system --dest=org.pinenote.ebc /ebc org.freedesktop.DBus.Introspectable.Introspect
dbus-send --print-reply --system --dest=org.pinenote.pen /pen org.freedesktop.DBus.Introspectable.Introspect
dbus-send --print-reply --system --dest=org.pinenote.usb /usb org.freedesktop.DBus.Introspectable.Introspect
dbus-send --print-reply --system --dest=org.pinenote.misc /misc org.freedesktop.DBus.Introspectable.Introspect
一些可能需要修改的设计选择
- 到目前为止,getter/setter函数大多使用dbus方法而不是使用dbus属性(一些两种方式都实现)。虽然我看到了属性的好处,但我发现使用它们有点尴尬,特别是反射它们似乎很复杂。需要再次研究...
- 目前改变波形和改变bw_mode参数都会发出“WaveformChanged”信号。这并不合适。然而,我想以某种方式防止重复发出信号。例如,目前我在改变波形和改变bw_mode时都触发一次全局刷新,导致在从灰度切换到黑白+A2波形模式时出现两次刷新。可能某种组合的getter/setter方法+相关信号是这里的解决方案。
许可证/复制
main.rs文件是从这个dbus-rs示例开始的:基于https://github.com/diwic/dbus-rs/blob/master/dbus-crossroads/examples/server_cr.rs除非在特定文件的头部另有说明,代码遵循dbus-rs项目的Apache 2.0 / MIT双许可方案。
dbus-rs项目的版权:(c) 2014-2018 David Henningsson [email protected]和其他贡献者
其他内容的版权:2022-2024 Maximilian Weigand [email protected]
依赖项
约7MB
约151K SLoC