#dbus #system #control #pen #service #pinenote #pine64

app pinenotedbusservice

为Pine64 Pinenote提供的DBus服务

7个版本

0.2.2-dev4 2024年8月15日
0.2.2-dev32024年8月14日
0.2.2-dev12024年5月5日
0.2.1-dev32024年1月21日

#81硬件支持

Download history 145/week @ 2024-05-05 1/week @ 2024-05-12 9/week @ 2024-05-19 14/week @ 2024-07-07 300/week @ 2024-08-11

每月300 次下载

Apache-2.0/MIT

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