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 <lekenst...@gmail.com>
---
 src/linux/hidpp-device.c | 31 ++++++++++++++++++-------------
 1 file changed, 18 insertions(+), 13 deletions(-)

diff --git a/src/linux/hidpp-device.c b/src/linux/hidpp-device.c
index 77a2583..1eff154 100644
--- a/src/linux/hidpp-device.c
+++ b/src/linux/hidpp-device.c
@@ -148,6 +148,7 @@ struct HidppDevicePrivate
        guint                    device_idx;
        guint                    version;
        HidppDeviceBattStatus    batt_status;
+       gboolean                 batt_is_approx;
        HidppDeviceKind          kind;
        int                      fd;
 };
@@ -778,21 +779,24 @@ hidpp_device_refresh (HidppDevice *device,
        /* get battery status */
        if ((refresh_flags & HIDPP_REFRESH_FLAGS_BATTERY) > 0) {
                if (priv->version == 1) {
-                       msg.type = HIDPP_MSG_TYPE_SHORT;
-                       msg.device_idx = priv->device_idx;
-                       msg.feature_idx = HIDPP_READ_SHORT_REGISTER;
-                       msg.function_idx = HIDPP_READ_SHORT_REGISTER_BATTERY;
-                       msg.s.params[0] = 0x00;
-                       msg.s.params[1] = 0x00;
-                       msg.s.params[2] = 0x00;
-                       ret = hidpp_device_cmd (device,
-                                               &msg, &msg,
-                                               error);
-                       if (!ret && hidpp_is_error(&msg, &error_code) &&
+                       if (!priv->batt_is_approx) {
+                               msg.type = HIDPP_MSG_TYPE_SHORT;
+                               msg.device_idx = priv->device_idx;
+                               msg.feature_idx = HIDPP_READ_SHORT_REGISTER;
+                               msg.function_idx = 
HIDPP_READ_SHORT_REGISTER_BATTERY;
+                               memset(msg.s.params, 0, sizeof(msg.s.params));
+                               ret = hidpp_device_cmd (device,
+                                                       &msg, &msg,
+                                                       error);
+                               if (!ret && hidpp_is_error(&msg, &error_code) &&
                                        error_code == 
HIDPP10_ERROR_CODE_INVALID_ADDRESS) {
-                               g_error_free(*error);
-                               *error = NULL;
+                                       g_error_free(*error);
+                                       *error = NULL;
+                                       priv->batt_is_approx = TRUE;
+                               }
+                       }
 
+                       if (priv->batt_is_approx) {
                                msg.type = HIDPP_MSG_TYPE_SHORT;
                                msg.device_idx = priv->device_idx;
                                msg.feature_idx = HIDPP_READ_SHORT_REGISTER;
@@ -927,6 +931,7 @@ hidpp_device_init (HidppDevice *device)
        device->priv->fd = -1;
        device->priv->feature_index = g_ptr_array_new_with_free_func (g_free);
        device->priv->batt_status = HIDPP_DEVICE_BATT_STATUS_UNKNOWN;
+       device->priv->batt_is_approx = FALSE;
        device->priv->kind = HIDPP_DEVICE_KIND_UNKNOWN;
 
        /* add known root */
-- 
1.8.3.4

_______________________________________________
devkit-devel mailing list
devkit-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/devkit-devel

Reply via email to