blob: 299b9315673a92ed06f2c6a5c8aeed2931df26c3 [file] [log] [blame] [view] [edit]
# cecservice
## About
cecservice is a system service allowing its clients to put [CEC] enabled TVs in
and out of standby mode.
## D-Bus API
The service exposes a D-Bus API consisting of following functions:
* `SendWakeUpToAllDevices` - wakes up all TVs, putting them out of standby and
announces the device running this service as an active source.
* `SendStandByToAllDevices` - puts all TVs on standby.
* `GetTvsPowerStatus` - returns power status of TVs (devices with logical
address 0) on all connected CEC adapters.
## Implementation
cecservice uses the [Linux CEC API] to interact with CEC adapters present on
the device. It assumes exclusive ownership of `/dev/cecX` device nodes and
keeps all of them open at all times. The service uses libudev to keep track
of CEC devices as they come and go.
When the client invokes the `SendWakeUpToAllDevices` method on the service,
the service sends a `Image View On` request to devices with logical address 0
on all present `/dev/cecX` adapters. Following that, an `Active Source`
message is sent, announcing the device to be an active source.
Similarly, when `SendWakeUpToAllDevices` is called, the service sends
a `StandBy` request to devices with logical address 0 on all CEC adapters.
After the `SendWakeUpToAllDevices` is called the service will assume an active
source role. While being an active source it will respond to
`Request Active Source` requests and will continue doing so until either
another CEC device announces itself as an active source or
the `SendStandByToAllDevice` is called.
`GetTvsPowerStatus` sends `give device power status` request on all adapters.
This method returns array of integers, each integer describing power state of
a TV connected to an adapter. The meaning of the values is explained in
the service [system API] definition.
## Supported adapters / limitations
The service only works with CEC adapters which drivers handle physical address
configuration on their own and which allow userland to configure logical
addresses.
[CEC]: https://en.wikipedia.org/wiki/Consumer_Electronics_Control
[Linux CEC API]: https://www.kernel.org/doc/html/latest/media/uapi/cec/cec-api.html
[system API]: https://chromium.googlesource.com/chromiumos/platform/system_api/+/HEAD/dbus/cecservice/dbus-constants.h