Commit graph

167 commits

Author SHA1 Message Date
Peter Wu
a7766cfde9 hidpp: fix K750 battery and luminosity properties
Since commit b1f12feb1f ("Factor out the
Logitech Unifying support to support other devices"), the battery status
would always be reported as 1% for the K750 keyboard. Besides that, the
luminosity level was removed. This patch fixes the battery level and
re-adds the luminosity level.

To avoid negativity issues when reading light level into a double type,
make the HidppMessage params unsigned.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:28 +02:00
Peter Wu
789dbb037c hidpp: move timeout checking before reading
When no report matches the report type or device, the previous code
did not terminate the loop early enough because the check was missed.
Now the timeout is always checked before attempting to poll.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:28 +02:00
Peter Wu
5058ede399 hidpp: split request read/write functions
In preparation for reading notifications; the device index is now
also validated before using a message, this avoid matching the wrong
report.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:28 +02:00
Peter Wu
e1ed283930 hidpp: retry when read or g_poll is interrupted
Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:28 +02:00
Peter Wu
84a9b525be hidpp: more useful error messages
If read, wait or g_poll failed, it would return -1. This information is
not really useful, so print the error string instead where applicable.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:28 +02:00
Peter Wu
cdeaf16629 hidpp: fix memleak while coldplugging
The device returned by g_udev_device_get_parent must be freed by the
caller.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:27 +02:00
Peter Wu
dda9bc21e5 hidpp: fix fd leak
Upon unplugging the USB receiver, the file descriptor of /dev/hidrawX is
not closed.

With commit "HID: hidraw: correctly deallocate memory on device
disconnect"[1] (queued for 3.12), this missing close() causes a
/dev/hidrawX devuce to persist until UPower is restarted.

On earlier kernels, never remove your USB receiver or you will
experience random errors resulting from data structures corruption[2]
(which occurs because UPower tries to poll() or read() an hidraw device
while the kernel has already released the memory for it). Not UPowers
fault, but UPower makes this bug more likely since it runs as daemon.

 [1]: http://lkml.org/lkml/2013/7/22/248
 [2]: http://lkml.org/lkml/2013/8/6/457

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:27 +02:00
Peter Wu
984d88f943 hidpp: retrieve serial number for devices (v2)
Before this, history files were saved as history-rate-M525.dat. Since
multiple devices of the same model might be connected, this name is not
unique enough.

The serial number gives a more reliable path for the history files and
allows clients to distinguish their devices (an object path like
/org/freedesktop/UPower/devices/mouse_0003o046DoC52Bx0018 does not stay
the same).

Note: if a serial number cannot be read, instead of reverting this
patch, consider splitting the serial refresh from the version, kind and
model refresh.

 - v2: Fix invalid return value when an invalid parameter is passed to
   hidpp_device_get_serial.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:27 +02:00
Peter Wu
81ea62d8e1 hidpp: remove unnecessary HID++ 2.0 code
The device name and type can be queried from the receiver which does
not mind if a paired device is using HID++ 2.0 or 1.0. Therefore remove
the hidpp20-specific code which also removes indirection of an
uninitialised "map" variable.

The following code was buggy:

    msg.feature_idx = map->idx;
    ...
    map = ...;
    if (map != NULL) {
        ...
    }
    ...
    priv->model = ...;

It should have become:

    map = ...;
    if (map != NULL) {
        ...
        priv->model = ...;
    }

... but since the HID++ 2.0 code is not necessary, just remove it.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:27 +02:00
Peter Wu
a802862821 hidpp: fix properties for unreachable devices (v2)
This includes "is-present" and "state" (which will be marked "unknown").
"percentage" is not touched since it is still an indication of the
battery level, changing it to zero is not helpful.

Previously, properties were never updated because the refresh would
fail when the battery refresh request failed.

 - v2: fix invalid return value when an invalid parameter is passed to
   hidpp_device_is_reachable.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:27 +02:00
Peter Wu
88398cf75b hidpp: improve HID++ version detection, fix uninit var
Do not assume HID++ 1.0 when device is unreachable. This allows
up_device_unifying_refresh() to be optimized to stop sending a ping
message at every refresh for HID++ 1.0 devices.

priv->version will now always contain 0 when the real HID++ version of
a device is not (yet) known, comments are updated to reflect this.

Also fix an uninitialised msg variable that might confuse the error
handler in hidpp_device_refresh.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:27 +02:00
Peter Wu
d4d66c205f hidpp: pick up devices that just got paired
When sending a ping request right after a device got paired, the ping
message gets lost (there is no response). Work around that by delaying
the initial packet exchange. 10 milliseconds seems to work, but let's
choose 30 ms to be fully safe.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:27 +02:00
Peter Wu
1745b8e760 hidpp: assume HID++ 1.0 for unreachable devices
When the USB receiver is just plugged in, devices may not be active
("unreachable") and therefore return RESOURCE_ERROR on requests. This
causes upower to fail on picking up new devices. As a workaround, assume
that all discovered devices will eventually become reachable (even if
they don't, for example if the device was paired to another computer
while the computer carrying the receiver was powered off).

Actual removal of unpaired devices is done by the Logitech HID driver,
that should remove sysfs entries which can be detected by upower.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:27 +02:00
Peter Wu
fd6e214bb7 hidpp: test only once for d7 register
The d7 battery register does not magically re-appear, therefore skip
this register once it is detected that the register is unusable.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:26 +02:00
Peter Wu
d58a79cceb hidpp: support battery register 0x07
The HID++ 1.0 Illuminated Keyboard K800 does not support the d7
register, instead is uses 07. Its observed behaviour is documented in
the ltunify repository[1].

 [1]: https://git.lekensteyn.nl/ltunify/tree/registers.txt

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:26 +02:00
Peter Wu
9fefbcb087 hidpp: do not print warnings if device is offline
This reduces spam in stderr (which is logged to the systemd journal).

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:26 +02:00
Peter Wu
dd71ca04b8 hidpp: recognise HID++ 1.0 ping response again
Removed while refactoring hidpp_device_cmd, now that the message
validation is in place, introduce the 1.0 check again.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:26 +02:00
Peter Wu
132f9373a5 hidpp: clear message queue before initiating new requests (v2)
This prevents the use of responses from other HID++ applications (such
as Solaar and ltunify).

 - v2: do not hang in a loop when read() fails, e.g. when it returns EIO
   because the device was unplugged.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:26 +02:00
Peter Wu
4a211e07c3 hidpp: validate messages, retry if invalid
This prevents matching the wrong response packet, for example when
a mouse is moved while a packet is read. As a result, the reads are
more reliable and log spam is reduced.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:26 +02:00
Peter Wu
c830102ca7 hidpp: refactor to introduce structure in protocol
Before this patch, there was no structure at all in the messages that
were passed around. Some issues:

 - (debug) Every message of length 7 was considered a request (and
   length 20 were seen as responses). This is not the case for HID++
   1.0.
 - The length of the message payload (ignoring the header) is fixed to 7
   or 20, this was not considered in the previous code.
 - The hidpp_device_cmd function contained special-case code for a HID++
   1.0 response on a HID++ 2.0 ping request.

After this patch, the protocol message structure should be more
explicit. To be done:

 - Test for HID++ 1.0 ping response (removed/broken by this patch).
 - Validate responses, retry read if needed.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
2013-09-03 08:31:26 +02:00
Timothée Ravier
12f6f40145 linux: Only one warning if no valid voltage found
Avoid filling the logs with repeated warning saying that no correct
voltage value was found for a power device. Improves the situation with
bugs https://bugzilla.redhat.com/show_bug.cgi?id=847874 and
https://bugzilla.redhat.com/show_bug.cgi?id=863524

Signed-off-by: Timothée Ravier <tim@siosm.fr>
Signed-off-by: Martin Pitt <martinpitt@gnome.org>
2013-09-02 05:46:08 +02:00
Martin Pitt
7933b0e552 trivial: Stop calling deprecated g_type_init()
When building with a recent enough glib (>= 2.36), don't call g_type_init() any
more. This is deprecated and causes ugly compile warnings.
2013-08-29 11:10:15 +02:00
Timothée Ravier
470bc1150b Linux: More explicit warning when no voltage found
Add device full path in warning if retrieving design voltage fails in
up_device_supply_get_design_voltage(). Also helps diagnose bugs
https://bugzilla.redhat.com/show_bug.cgi?id=847874 and
https://bugzilla.redhat.com/show_bug.cgi?id=863524

Signed-off-by: Martin Pitt <martinpitt@gnome.org>
2013-08-26 15:03:58 +02:00
Timothée Ravier
6d3a68d7d4 Linux: Fix warning in up_device_supply_get_design_voltage
This avoids filling the logs with the unnecessary warning line:
GLib-CRITICAL **: g_ascii_strcasecmp: assertion `s1 != NULL' failed
as seen in https://bugzilla.redhat.com/show_bug.cgi?id=847874 and
https://bugzilla.redhat.com/show_bug.cgi?id=863524

Signed-off-by: Martin Pitt <martinpitt@gnome.org>
2013-08-26 15:02:52 +02:00
Martin Pitt
9b142071d3 Linux integration tests: add test for temperature
Add test case for exporting the temperature, as added in commit 03f67aa.

https://bugs.freedesktop.org/show_bug.cgi?id=68338
2013-08-23 08:52:45 +02:00
Seth Forshee
eaf86482a9 Add temperature property for batteries
Linux's power_supply class supports a temperature attribute, which is
supported by many battery drivers. Add a new property to export this
information and support this property in Linux.

https://bugs.freedesktop.org/show_bug.cgi?id=68338

Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
Signed-off-by: Martin Pitt <martinpitt@gnome.org>
2013-08-23 08:45:57 +02:00
Martin Pitt
03f67aabfe trivial: In test case of previous commit, check OnLowBattery property 2013-08-23 08:45:57 +02:00
Martin Pitt
07b95b8e27 linux: Fix batteries which report capacity, but not energy/charge
Many Android devices only export charge_full and capacity, but not charge_now
or energy_now. In that case, directly read the percentage (from the capacity
attribute) and calculate current energy from that.

Thanks to Seth Forshee for the original patch!

https://bugs.freedesktop.org/show_bug.cgi?id=68337
2013-08-23 08:31:20 +02:00
Arkadiusz Miśkiewicz
09fa9d5463 Locate non-unifying receiver by looking for hidraw with hiddev exposed.
For non unifying receiver we were trying to locate receiver hiddraw
device by looking into INTERFACES property. This doesn't work well
for non-unifying devices from keyboard+mouse sets (which use single
dongle for 2 devices but are still non-unifying).

The only thing that's different between hiddraw receiver and other
devices (mouse, keyboard etc) is that receiver also exposes hiddev
interface.

Use that fact to reliably locate receiver.

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
Signed-off-by: Richard Hughes <richard@hughsie.com>
2013-03-28 12:14:11 +00:00
Arkadiusz Miśkiewicz
d4bec29c82 hid++v1 detection for unreachable devices and features upgrade
We are back to using HIDPP_FEATURE_ROOT_FN_PING for detecting protocol
since it's the official way described in [1].

Unfortunately unreachable devices ("disconnected" in logitech
terminology) don't respond to this v1 ping query as described in docs.
Seems that docs cover only reachable state reply for version checking.
Thus we have to consider HIDPP_ERROR_CODE_UNSUPPORTED to also be v1
(since we actually got some v1 valid answer - error reply).

Introduce HIDPP_REFRESH_FLAGS_FEATURES for checking features provided
by v2 device. This recheck is triggered when we upgrade from any
protocol to v2 in HIDPP_REFRESH_FLAGS_VERSION. This allows us to
properly upgrade from v0/v1 to v2 and also we don't send v2 queries
when we know that the device is v1.

[1] logitech_hidpp10_specification_for_Unifying_Receivers.doc

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
Signed-off-by: Richard Hughes <richard@hughsie.com>
2013-03-28 12:13:31 +00:00
Arkadiusz Miśkiewicz
fadca8ad77 Better method of figuring out v1 vs v2 protocol version.
Protocol version detection isn't very reliable (especially for
hid++ v1).

Version 1 checking was potentially happening in every hidpp_device_cmd()
call and not only when requested. Improve that to do version checking
and priv->version manipulation only when requested by using
HIDPP_REFRESH_FLAGS_VERSION.

When doing version checking first try v2 protocol command and if it
succeeds assume version 2 device. Otherwise try v1 protocol query
and if that successds assume version 1 device.

v2 devices in unreachable/sleep mode seem to do not respond to v2
queries but they respond to v1 queries! Still we want best protocol
possible. To do that we are rechecking version when current protocol
version is below 2 and we are doing up_device_unifying_refresh() and if
recheck succeeds we upgrade protocol to v2.

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
Signed-off-by: Richard Hughes <richard@hughsie.com>
2013-03-22 19:46:23 +00:00
Arkadiusz Miśkiewicz
32daed2dfa Add support for Logitech Wireless (NonUnifying) devices
There are Logitech Wireless devices similar to Unifying ones with the
difference that device is paired with single dongle and dongle doesn't
support pairing multiple devices.

Add support for these. Tested with Wireless Mouse M187 and M185/M225.

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
Signed-off-by: Richard Hughes <richard@hughsie.com>
2013-03-22 19:44:58 +00:00
Arkadiusz Miśkiewicz
fd0286e871 Repair vendor handling for Logitech Unifying devices
Set proper vendor via udev rules for unifying devices and handle
that in code.

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
Signed-off-by: Richard Hughes <richard@hughsie.com>
2013-03-22 19:43:50 +00:00
Arkadiusz Miśkiewicz
e571f840e9 Add support for HIDPP_REFRESH_FLAGS_MODEL in hid++ v1
Add support for checking device model name for hid++ v1 protocol
version.

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
Signed-off-by: Richard Hughes <richard@hughsie.com>
2013-03-22 19:43:15 +00:00
Arkadiusz Miśkiewicz
af24f55c79 Invalid request/response for HIDPP_REFRESH_FLAGS_BATTERY in hid++1
Version 1 hid++ HIDPP_REFRESH_FLAGS_BATTERY packets were incorrect.

Response packets were incorrectly thrown away as invalid. These
packets have HIDPP_HEADER_REQUEST (and not HIDPP_HEADER_RESPONSE as code
expexted). Fix that by allowing both types.

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
Signed-off-by: Richard Hughes <richard@hughsie.com>
2013-03-21 16:23:46 +00:00
Arkadiusz Miśkiewicz
972acff145 Buffer for HIDPP_REFRESH_FLAGS_KIND not big enough
HIDPP_REFRESH_FLAGS_KIND action puts result into 7 bytes buffer and
later tries to access 8th element (with index 7). Make buffer bigger,
so 8th element will fit.

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
Signed-off-by: Richard Hughes <richard@hughsie.com>
2013-03-21 16:23:46 +00:00
Arkadiusz Miśkiewicz
28f396496a Detection of version 1 hid++ is not returned to the caller
HID++ version 1 was properly detected but that information wasn't
reaching caller.

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
Signed-off-by: Richard Hughes <richard@hughsie.com>
2013-03-21 16:23:46 +00:00
Arkadiusz Miśkiewicz
232d70155c Find hidraw devices correctly with systemd udev >= v196.
udev v196 libraries changed behaviour of g_udev_device_get_sysfs_attr()
by stopping following symlinks for "device" attribute [1]. That change
broke hiddev finding for unifying devices. Fix that by getting sysfs
path from parent hiddev device.

1. http://cgit.freedesktop.org/systemd/systemd/commit/?id=5ae18ddc0d86673520c0dd6b59ccac8afc8aa605

Signed-off-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
Signed-off-by: Richard Hughes <richard@hughsie.com>
2013-03-21 16:23:45 +00:00
Martin Pitt
1540b08f9c Drop --enable-systemd and linking to libsystemd-daemon
logind is now being detected at runtime (see previous commit ff39d23), so we do
not need to link against libsystemd-daemon any more. Drop --enable-systemd
configure option as well.
2013-03-21 07:16:56 +01:00
Martin Pitt
ff39d23ff4 Fix test for logind availability
sd_booted() is not an appropriate check for whether we should talk to logind,
test for /run/systemd/seats/ instead.

For details, see:
<https://mail.gnome.org/archives/desktop-devel-list/2013-March/msg00092.html>
2013-03-21 07:10:18 +01:00
Martin Pitt
da066045e4 integration-test: Always run on a fake system bus
Drop the two modes depending on whether or not the test gets run as root or
not. Set up a fake system bus and always use that. This also eliminates the
need for upowerd's --test option.

Drop usage of dbus-launch, as this leaves dbus-daemon running after the tests.
Use GioTestDBus instead, which cleans up properly.
2013-02-20 14:59:56 +01:00
Martin Pitt
7105ed8a04 integration-test: Move to using umockdev
Setting $SYSFS_PATH does not work any more with recent libudev versions, our
homwbrew sysfs sandbox building limits us to coldplug tests only. umockdev
works with both old and new libudevs and can also emulate uevents for future
hotplugging tests.

Skip the test if umockdev is not available, so that check and distcheck don't
bail out.
2013-02-20 14:38:25 +01:00
Richard Hughes
8bbf566dc8 Also deprecate running the powersave scripts
Over the years we've moved all the quirks to the kernel (and fixed most of the
issues properly) so on Fedora we've not actually been shipping any rules in
pm-utils for a couple of releaes now.

Dropping this functionality allows us to finally drop the pm-utils dep for upower.
2013-02-12 11:18:31 +00:00
Richard Hughes
372c2f8d29 Add a --enable-deprecated configure argument
This is turned off by default. If this is not set, then any calls to Suspend(),
SuspendAllowed(), Hibernate() or HibernateAllowed() will fail with an error.
The error mesage tells the user what new method to port to in logind.

I'm expecting to set --enable-deprecated for Fedora 17 and 18, but turn it off
for Fedora 19, so other distributions probably want to follow suit to find out
what other stuff needs to be ported to the new APIs early. GNOME should already
be fine, but KDE will need some solid porting as I understand it.

See http://lists.freedesktop.org/archives/devkit-devel/2013-January/001339.html
for more information on future plans and for rationale.
2013-02-12 11:08:35 +00:00
Martin Pitt
275644a1b8 linux: Bump maximum accepted "time to empty" to 10 days
In the days of low-power ARM devices and large laptop batteries, imposing a 20
hour plausibility limit on "time to full" is not appropriate any more. Bump it
to 240 hours to still keep a plausibility check against "factor 1000" errors.

https://bugs.freedesktop.org/show_bug.cgi?id=60110
2013-01-31 12:24:14 +01:00
Martin Pitt
66f8f80023 Add test case for previous commit
Add test case for a battery which reports the current energy, but only the full
charge (no energy_full). This reproduces
https://bugs.freedesktop.org/show_bug.cgi?id=60104
2013-01-31 10:24:35 +01:00
Alex Hornung
cff4f578e5 linux: Fix batteries which report current energy but full charge
The condition should be for energy_full, not energy, since we aim to find some
way of finding energy_full and energy_full_design irrespective of the way we
find energy.

https://bugs.freedesktop.org/show_bug.cgi?id=60104

Signed-off-by: Alex Hornung <alex@alexhornung.com>
2013-01-31 10:24:13 +01:00
Colin Watson
b59d9848d4 Fix two memory leaks
up_device_supply_get_design_voltage(): up_device_supply_get_string() returns a
newly allocated copy.

up_history_finalize(): Forgot to free history->priv->dir

https://bugs.freedesktop.org/show_bug.cgi?id=60019
2013-01-29 15:08:18 +01:00
Richard Hughes
5be743c910 Don't use the deprecated INCLUDES in Makefile.am 2013-01-14 09:21:30 +00:00
Richard Hughes
b1f12feb1f Factor out the Logitech Unifying support to support other devices 2013-01-10 12:08:46 +00:00