From 2718516b42b4b14fb16400d9f8357bc78c92a35f Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 7 May 2021 00:37:04 +0100 Subject: [PATCH] bluez5 - if bz says it's busy when trying to power on, keep trying again --- src/modules/bluez5/bz.h | 1 + src/modules/bluez5/bz_obj.c | 37 ++++++++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/modules/bluez5/bz.h b/src/modules/bluez5/bz.h index 805f28584..e101d8d6b 100644 --- a/src/modules/bluez5/bz.h +++ b/src/modules/bluez5/bz.h @@ -24,6 +24,7 @@ struct _Obj { Eina_Bool ping_busy : 1; Eina_Bool ping_block : 1; Ecore_Timer *ping_timer; + Ecore_Timer *power_retry_timer; //// public data to read const char *path; Obj_Type type; diff --git a/src/modules/bluez5/bz_obj.c b/src/modules/bluez5/bz_obj.c index d9e1c14a3..41d11c4ed 100644 --- a/src/modules/bluez5/bz_obj.c +++ b/src/modules/bluez5/bz_obj.c @@ -412,10 +412,31 @@ bz_obj_find(const char *path) return eina_hash_find(obj_table, path); } -static void -cb_power_on(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED) +static Eina_Bool +_cb_power_again(void *data) { - ERR_PRINT("Power On"); + Obj *o = data; + + o->power_retry_timer = NULL; + printf("Retry power on..."); + bz_obj_power_on(o); + return EINA_FALSE; +} + +static void +cb_power_on(void *data, const Eldbus_Message *msg EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED) +{ + Obj *o = data; + const char *name, *text; + + if (eldbus_message_error_get(msg, &name, &text)) + { + printf("Error: %s.\n %s:\n %s\n", "Power On", name, text); + if (!strcmp(name, "org.bluez.Error.Busy")) + { + o->power_retry_timer = ecore_timer_add(0.5, _cb_power_again, o); + } + } } void @@ -438,6 +459,11 @@ bz_obj_power_off(Obj *o) { Eina_Bool val = EINA_FALSE; if (!o->proxy) return; + if (o->power_retry_timer) + { + ecore_timer_del(o->power_retry_timer); + o->power_retry_timer = NULL; + } eldbus_proxy_property_set (o->proxy, "Powered", "b", (void *)(uintptr_t)val, cb_power_off, o); } @@ -810,6 +836,11 @@ bz_obj_unref(Obj *o) ecore_timer_del(o->ping_timer); o->ping_timer = NULL; } + if (o->power_retry_timer) + { + ecore_timer_del(o->power_retry_timer); + o->power_retry_timer = NULL; + } if (o->proxy) { eldbus_proxy_unref(o->proxy);