Thread (6 messages) flat view 6 messages, 4 authors, 2021-03-30

Re: [PATCH BlueZ] profiles/battery: Always update initial battery value

From: Bastien Nocera <hadess@hadess.net>
Date: 2021-03-30 17:17:32

On Tue, 2021-03-30 at 10:09 -0700, Sonny Sasaka wrote:
quoted hunk ↗ jump to hunk
Due to cache in gatt db, bluetoothd fails to update publish the battery
value after reconnection when the battery value does not change
compared
to before reconnection. For initial battery value, we should update the
value to D-Bus regardless of the cache value.

---
 profiles/battery/battery.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/profiles/battery/battery.c b/profiles/battery/battery.c
index 81f849d57..0f8d6ef18 100644
--- a/profiles/battery/battery.c
+++ b/profiles/battery/battery.c
@@ -88,12 +88,13 @@ static void batt_reset(struct batt *batt)
 }
 
 static void parse_battery_level(struct batt *batt,
-                               const uint8_t *value)
+                               const uint8_t *value,
+                               bool force_update)
 {
        uint8_t percentage;
 
        percentage = value[0];
-       if (batt->percentage != percentage) {
+       if (force_update || batt->percentage != percentage) {
                batt->percentage = percentage;
                DBG("Battery Level updated: %d%%", percentage);
                if (!batt->battery) {
@@ -110,7 +111,7 @@ static void batt_io_value_cb(uint16_t value_handle,
const uint8_t *value,
        struct batt *batt = user_data;
 
        if (value_handle == batt->batt_level_io_handle) {
-               parse_battery_level(batt, value);
+               parse_battery_level(batt, value, false /* force_update
*/);
        } else {
                g_assert_not_reached();
        }
@@ -134,7 +135,7 @@ static void batt_io_ccc_written_cb(uint16_t
att_ecode, void *user_data)
                return;
        }
 
-       parse_battery_level(batt, batt->initial_value);
+       parse_battery_level(batt, batt->initial_value, true /*
force_update */);
If you need to do this, that means that you should probably declare an
enum instead.

This is old, but still relevant:
https://blog.ometer.com/2011/01/20/boolean-parameters-are-wrong/
        g_free (batt->initial_value);
        batt->initial_value = NULL;
 
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help