[PATCH] Check if the battery comes from bluetooth keyboard or mouse.

Shih-Yuan Lee (FourDollars) fourdollars at gmail.com
Tue Aug 27 19:48:13 PDT 2013


Hi Peter,

Thank you for your review.

For https://bugs.launchpad.net/ubuntu/+source/upower/+bug/1153488.
The code base is a little old, so I made two patches for it.
One is https://launchpadlibrarian.net/146285357/02-try-to-work-out-if-the-device-is-powering-the-system.patch
to fix the power-supply as you mentioned.
The other is https://bugs.launchpad.net/ubuntu/+source/upower/+bug/1153488/+attachment/3755785/+files/03-detect-bluetooth-keyboard-mouse.patch
to fix the type of battery.

For this patch, it is only to fix the type of battery.

Regards,
$4

On Tue, Aug 27, 2013 at 6:09 PM, Peter Wu <lekensteyn at gmail.com> wrote:
> Hi,
>
> On Friday 02 August 2013 18:07:53 Shih-Yuan Lee wrote:
>> From: "Shih-Yuan Lee (FourDollars)" <sylee at canonical.com>
>>
>> First, checking the device path. If it contains 'bluetooth', it is a
>> bluetooth devices. Second, checking if there is an input folder. If there
>> is mouse folder under the input folder, it is a mouse device. Otherwise, it
>> is a keyboard device.
>
> Looking at https://launchpadlibrarian.net/133697757/UdevDb.txt (via
> https://bugs.launchpad.net/ubuntu/+source/gnome-power-manager/+bug/1153488),
> the issue occurs because the battery is of type "Battery"
> (POWER_SUPPLY_TYPE_BATTERY in kernel). The problem is not limited to Bluetooth
> devices, but on any HID device that reports battery. Shouldn't up-device-hid
> catch these kind of devices?
>
> Anyway, if not, then one should check the battery name to determine if it is a
> battery or some other HID device (like mouse/keyboard/touchpad). All HID
> batteries are named hid-(something)-battery. (see function
> hidinput_setup_battery in drivers/hid/hid-input.c, using 3.11-rc7 as reference
> point).
>
> After your patch, power-supply is still "TRUE". It should be FALSE since this
> mouse is not powering the system. Looking a bit further, things get only more
> awkward. There is no "scope" attribute, more about this in a follow-up mail
> with the right persons CC'd.
>
> Regards,
> Peter
>
>> ---
>>  src/linux/up-device-supply.c | 52
>> +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51
>> insertions(+), 1 deletion(-)
>>
>> diff --git a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c
>> index bd54801..f310dad 100644
>> --- a/src/linux/up-device-supply.c
>> +++ b/src/linux/up-device-supply.c
>> @@ -851,9 +851,15 @@ up_device_supply_coldplug (UpDevice *device)
>>       UpDeviceSupply *supply = UP_DEVICE_SUPPLY (device);
>>       gboolean ret = FALSE;
>>       GUdevDevice *native;
>> +     const gchar *file;
>>       const gchar *native_path;
>>       const gchar *scope;
>>       gchar *device_type = NULL;
>> +     gchar *device_path = NULL;
>> +     gchar *dir_name = NULL;
>> +     gchar *input_path = NULL;
>> +     GDir *dir = NULL;
>> +     GError *error = NULL;
>>       UpDeviceKind type = UP_DEVICE_KIND_UNKNOWN;
>>
>>       up_device_supply_reset_values (supply);
>> @@ -883,7 +889,51 @@ up_device_supply_coldplug (UpDevice *device)
>>               if (g_ascii_strcasecmp (device_type, "mains") == 0) {
>>                       type = UP_DEVICE_KIND_LINE_POWER;
>>               } else if (g_ascii_strcasecmp (device_type, "battery") == 0) {
>> -                     type = UP_DEVICE_KIND_BATTERY;
>> +
>> +                     /* Detect if the battery comes from bluetooth keyboard or mouse.
> */
>> +                     if (g_strstr_len (native_path, -1, "bluetooth") != NULL) {
>> +                             device_path = sysfs_resolve_link (native_path, "device");
>> +                             dir_name = g_path_get_dirname (device_path);
>> +                             if (dir = g_dir_open (dir_name, 0, &error)) {
>> +                                     while (file = g_dir_read_name (dir)) {
>> +                                             /* Check if it is an input device. */
>> +                                             if (g_str_has_prefix (file, "input")) {
>> +                                                     input_path = g_build_filename (dir_name, file,
> NULL);
>> +                                                     break;
>> +                                             }
>> +                                     }
>> +                                     g_dir_close (dir);
>> +                             } else {
>> +                                     g_warning ("Can not open folder %s: %s", dir_name,
> error->message);
>> +                                     g_error_free (error);
>> +                             }
>> +                             g_free (dir_name);
>> +                             g_free (device_path);
>> +                     }
>> +
>> +                     if (input_path != NULL) {
>> +                             if (dir = g_dir_open (input_path, 0, &error)) {
>> +                                     while (file = g_dir_read_name (dir)) {
>> +                                             /* Check if it is a mouse device. */
>> +                                             if (g_str_has_prefix (file, "mouse")) {
>> +                                                     type = UP_DEVICE_KIND_MOUSE;
>> +                                                     break;
>> +                                             }
>> +                                     }
>> +                                     g_dir_close (dir);
>> +                             } else {
>> +                                     g_warning ("Can not open folder %s: %s", input_path,
> error->message);
>> +                                     g_error_free (error);
>> +                             }
>> +                             g_free (input_path);
>> +                             if (type == UP_DEVICE_KIND_UNKNOWN) {
>> +                                     type = UP_DEVICE_KIND_KEYBOARD;
>> +                             }
>> +                     }
>> +
>> +                     if (type == UP_DEVICE_KIND_UNKNOWN) {
>> +                             type = UP_DEVICE_KIND_BATTERY;
>> +                     }
>>               } else if (g_ascii_strcasecmp (device_type, "USB") == 0) {
>>
>>                       /* use a heuristic to find the device type */
>


More information about the devkit-devel mailing list