diff mbox series

[v2] client: Add battery percentage to info command

Message ID 20200701192202.9508-1-sonnysasaka@chromium.org (mailing list archive)
State Superseded
Headers show
Series [v2] client: Add battery percentage to info command | expand

Commit Message

Sonny Sasaka July 1, 2020, 7:22 p.m. UTC
This adds the Battery Percentage to the info command based on
org.bluez.Battery1 API. Example usage:

[bluetooth]# info XX:XX:XX:XX:XX:XX
Device XX:XX:XX:XX:XX:XX (random)
        Name: ...
        Alias: ...
        ...
        Modalias: ...
        Battery Percentage: 100%
---
 client/main.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

Comments

Luiz Augusto von Dentz July 2, 2020, 5:19 a.m. UTC | #1
Hi Sonny,

On Wed, Jul 1, 2020 at 12:24 PM Sonny Sasaka <sonnysasaka@chromium.org> wrote:
>
> This adds the Battery Percentage to the info command based on
> org.bluez.Battery1 API. Example usage:
>
> [bluetooth]# info XX:XX:XX:XX:XX:XX
> Device XX:XX:XX:XX:XX:XX (random)
>         Name: ...
>         Alias: ...
>         ...
>         Modalias: ...
>         Battery Percentage: 100%
> ---
>  client/main.c | 43 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 43 insertions(+)
>
> diff --git a/client/main.c b/client/main.c
> index 422da5593..4b787240e 100644
> --- a/client/main.c
> +++ b/client/main.c
> @@ -65,6 +65,7 @@ static struct adapter *default_ctrl;
>  static GDBusProxy *default_dev;
>  static GDBusProxy *default_attr;
>  static GList *ctrl_list;
> +static GList *battery_proxies;
>
>  static const char *agent_arguments[] = {
>         "on",
> @@ -107,7 +108,9 @@ static void disconnect_handler(DBusConnection *connection, void *user_data)
>         bt_shell_set_prompt(PROMPT_OFF);
>
>         g_list_free_full(ctrl_list, proxy_leak);
> +       g_list_free_full(battery_proxies, proxy_leak);
>         ctrl_list = NULL;
> +       battery_proxies = NULL;
>
>         default_ctrl = NULL;
>  }
> @@ -445,6 +448,16 @@ done:
>         g_free(desc);
>  }
>
> +static void battery_added(GDBusProxy *proxy)
> +{
> +       battery_proxies = g_list_append(battery_proxies, proxy);
> +}
> +
> +static void battery_removed(GDBusProxy *proxy)
> +{
> +       battery_proxies = g_list_remove(battery_proxies, proxy);
> +}
> +
>  static void device_added(GDBusProxy *proxy)
>  {
>         DBusMessageIter iter;
> @@ -539,6 +552,8 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
>                 gatt_add_manager(proxy);
>         } else if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
>                 ad_manager_added(proxy);
> +       } else if (!strcmp(interface, "org.bluez.Battery1")) {
> +               battery_added(proxy);
>         }
>  }
>
> @@ -630,6 +645,8 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
>                 gatt_remove_manager(proxy);
>         } else if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
>                 ad_unregister(dbus_conn, NULL);
> +       } else if (!strcmp(interface, "org.bluez.Battery1")) {
> +               battery_removed(proxy);
>         }
>  }
>
> @@ -763,6 +780,20 @@ static struct adapter *find_ctrl_by_address(GList *source, const char *address)
>         return NULL;
>  }
>
> +static GDBusProxy *find_battery_by_path(GList *source, const char *path)
> +{
> +       GList *list;
> +
> +       for (list = g_list_first(source); list; list = g_list_next(list)) {
> +               GDBusProxy *proxy = list->data;
> +
> +               if (strcmp(g_dbus_proxy_get_path(proxy), path) == 0)
> +                       return proxy;
> +       }
> +
> +       return NULL;
> +}
> +
>  static GDBusProxy *find_proxy_by_address(GList *source, const char *address)
>  {
>         GList *list;
> @@ -1606,8 +1637,10 @@ static struct GDBusProxy *find_device(int argc, char *argv[])
>  static void cmd_info(int argc, char *argv[])
>  {
>         GDBusProxy *proxy;
> +       GDBusProxy *battery_proxy;
>         DBusMessageIter iter;
>         const char *address;
> +       unsigned char percentage;
>
>         proxy = find_device(argc, argv);
>         if (!proxy)
> @@ -1647,6 +1680,16 @@ static void cmd_info(int argc, char *argv[])
>         print_property(proxy, "AdvertisingFlags");
>         print_property(proxy, "AdvertisingData");
>
> +       battery_proxy = find_battery_by_path(battery_proxies,
> +                                       g_dbus_proxy_get_path(proxy));

I'd replace the lines below with just print_property(battery_proxy,
"Percentage"); and just make print_property check for NULL proxy if it
doesn't already.

> +       if (battery_proxy && g_dbus_proxy_get_property(
> +                               battery_proxy, "Percentage", &iter)) {
> +               dbus_message_iter_get_basic(&iter, &percentage);
> +               bt_shell_printf("\tBattery Percentage: %d%%\n", percentage);
> +       } else {
> +               bt_shell_printf("\tNo battery information\n");
> +       }
> +
>         return bt_shell_noninteractive_quit(EXIT_SUCCESS);
>  }
>
> --
> 2.17.1
>
Sonny Sasaka July 2, 2020, 6:06 a.m. UTC | #2
Hi Luiz,

On Wed, Jul 1, 2020 at 10:20 PM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> Hi Sonny,
>
> On Wed, Jul 1, 2020 at 12:24 PM Sonny Sasaka <sonnysasaka@chromium.org> wrote:
> >
> > This adds the Battery Percentage to the info command based on
> > org.bluez.Battery1 API. Example usage:
> >
> > [bluetooth]# info XX:XX:XX:XX:XX:XX
> > Device XX:XX:XX:XX:XX:XX (random)
> >         Name: ...
> >         Alias: ...
> >         ...
> >         Modalias: ...
> >         Battery Percentage: 100%
> > ---
> >  client/main.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 43 insertions(+)
> >
> > diff --git a/client/main.c b/client/main.c
> > index 422da5593..4b787240e 100644
> > --- a/client/main.c
> > +++ b/client/main.c
> > @@ -65,6 +65,7 @@ static struct adapter *default_ctrl;
> >  static GDBusProxy *default_dev;
> >  static GDBusProxy *default_attr;
> >  static GList *ctrl_list;
> > +static GList *battery_proxies;
> >
> >  static const char *agent_arguments[] = {
> >         "on",
> > @@ -107,7 +108,9 @@ static void disconnect_handler(DBusConnection *connection, void *user_data)
> >         bt_shell_set_prompt(PROMPT_OFF);
> >
> >         g_list_free_full(ctrl_list, proxy_leak);
> > +       g_list_free_full(battery_proxies, proxy_leak);
> >         ctrl_list = NULL;
> > +       battery_proxies = NULL;
> >
> >         default_ctrl = NULL;
> >  }
> > @@ -445,6 +448,16 @@ done:
> >         g_free(desc);
> >  }
> >
> > +static void battery_added(GDBusProxy *proxy)
> > +{
> > +       battery_proxies = g_list_append(battery_proxies, proxy);
> > +}
> > +
> > +static void battery_removed(GDBusProxy *proxy)
> > +{
> > +       battery_proxies = g_list_remove(battery_proxies, proxy);
> > +}
> > +
> >  static void device_added(GDBusProxy *proxy)
> >  {
> >         DBusMessageIter iter;
> > @@ -539,6 +552,8 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
> >                 gatt_add_manager(proxy);
> >         } else if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
> >                 ad_manager_added(proxy);
> > +       } else if (!strcmp(interface, "org.bluez.Battery1")) {
> > +               battery_added(proxy);
> >         }
> >  }
> >
> > @@ -630,6 +645,8 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
> >                 gatt_remove_manager(proxy);
> >         } else if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
> >                 ad_unregister(dbus_conn, NULL);
> > +       } else if (!strcmp(interface, "org.bluez.Battery1")) {
> > +               battery_removed(proxy);
> >         }
> >  }
> >
> > @@ -763,6 +780,20 @@ static struct adapter *find_ctrl_by_address(GList *source, const char *address)
> >         return NULL;
> >  }
> >
> > +static GDBusProxy *find_battery_by_path(GList *source, const char *path)
> > +{
> > +       GList *list;
> > +
> > +       for (list = g_list_first(source); list; list = g_list_next(list)) {
> > +               GDBusProxy *proxy = list->data;
> > +
> > +               if (strcmp(g_dbus_proxy_get_path(proxy), path) == 0)
> > +                       return proxy;
> > +       }
> > +
> > +       return NULL;
> > +}
> > +
> >  static GDBusProxy *find_proxy_by_address(GList *source, const char *address)
> >  {
> >         GList *list;
> > @@ -1606,8 +1637,10 @@ static struct GDBusProxy *find_device(int argc, char *argv[])
> >  static void cmd_info(int argc, char *argv[])
> >  {
> >         GDBusProxy *proxy;
> > +       GDBusProxy *battery_proxy;
> >         DBusMessageIter iter;
> >         const char *address;
> > +       unsigned char percentage;
> >
> >         proxy = find_device(argc, argv);
> >         if (!proxy)
> > @@ -1647,6 +1680,16 @@ static void cmd_info(int argc, char *argv[])
> >         print_property(proxy, "AdvertisingFlags");
> >         print_property(proxy, "AdvertisingData");
> >
> > +       battery_proxy = find_battery_by_path(battery_proxies,
> > +                                       g_dbus_proxy_get_path(proxy));
>
> I'd replace the lines below with just print_property(battery_proxy,
> "Percentage"); and just make print_property check for NULL proxy if it
> doesn't already.
I tried this but the result doesn't look quite good:
Device XX:XX:XX:XX:XX:XX (random)
        Name: ...
        ...
        Modalias: ...
        Percentage: 0x64

The name "Percentage" is not clear (what kind of percentage does it
mean) when shown in the "info" command. And also the format for byte
data type is hex and there is no percent sign. I tried to modify the
print_property function to support custom format but the code gets
overly complex and I think it's more straightforward to use custom
logic like in this patch.

>
> > +       if (battery_proxy && g_dbus_proxy_get_property(
> > +                               battery_proxy, "Percentage", &iter)) {
> > +               dbus_message_iter_get_basic(&iter, &percentage);
> > +               bt_shell_printf("\tBattery Percentage: %d%%\n", percentage);
> > +       } else {
> > +               bt_shell_printf("\tNo battery information\n");
> > +       }
> > +
> >         return bt_shell_noninteractive_quit(EXIT_SUCCESS);
> >  }
> >
> > --
> > 2.17.1
> >
>
>
> --
> Luiz Augusto von Dentz
Luiz Augusto von Dentz July 2, 2020, 3:42 p.m. UTC | #3
Hi Sonny,

On Wed, Jul 1, 2020 at 11:06 PM Sonny Sasaka <sonnysasaka@chromium.org> wrote:
>
> Hi Luiz,
>
> On Wed, Jul 1, 2020 at 10:20 PM Luiz Augusto von Dentz
> <luiz.dentz@gmail.com> wrote:
> >
> > Hi Sonny,
> >
> > On Wed, Jul 1, 2020 at 12:24 PM Sonny Sasaka <sonnysasaka@chromium.org> wrote:
> > >
> > > This adds the Battery Percentage to the info command based on
> > > org.bluez.Battery1 API. Example usage:
> > >
> > > [bluetooth]# info XX:XX:XX:XX:XX:XX
> > > Device XX:XX:XX:XX:XX:XX (random)
> > >         Name: ...
> > >         Alias: ...
> > >         ...
> > >         Modalias: ...
> > >         Battery Percentage: 100%
> > > ---
> > >  client/main.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> > >  1 file changed, 43 insertions(+)
> > >
> > > diff --git a/client/main.c b/client/main.c
> > > index 422da5593..4b787240e 100644
> > > --- a/client/main.c
> > > +++ b/client/main.c
> > > @@ -65,6 +65,7 @@ static struct adapter *default_ctrl;
> > >  static GDBusProxy *default_dev;
> > >  static GDBusProxy *default_attr;
> > >  static GList *ctrl_list;
> > > +static GList *battery_proxies;
> > >
> > >  static const char *agent_arguments[] = {
> > >         "on",
> > > @@ -107,7 +108,9 @@ static void disconnect_handler(DBusConnection *connection, void *user_data)
> > >         bt_shell_set_prompt(PROMPT_OFF);
> > >
> > >         g_list_free_full(ctrl_list, proxy_leak);
> > > +       g_list_free_full(battery_proxies, proxy_leak);
> > >         ctrl_list = NULL;
> > > +       battery_proxies = NULL;
> > >
> > >         default_ctrl = NULL;
> > >  }
> > > @@ -445,6 +448,16 @@ done:
> > >         g_free(desc);
> > >  }
> > >
> > > +static void battery_added(GDBusProxy *proxy)
> > > +{
> > > +       battery_proxies = g_list_append(battery_proxies, proxy);
> > > +}
> > > +
> > > +static void battery_removed(GDBusProxy *proxy)
> > > +{
> > > +       battery_proxies = g_list_remove(battery_proxies, proxy);
> > > +}
> > > +
> > >  static void device_added(GDBusProxy *proxy)
> > >  {
> > >         DBusMessageIter iter;
> > > @@ -539,6 +552,8 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
> > >                 gatt_add_manager(proxy);
> > >         } else if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
> > >                 ad_manager_added(proxy);
> > > +       } else if (!strcmp(interface, "org.bluez.Battery1")) {
> > > +               battery_added(proxy);
> > >         }
> > >  }
> > >
> > > @@ -630,6 +645,8 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
> > >                 gatt_remove_manager(proxy);
> > >         } else if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
> > >                 ad_unregister(dbus_conn, NULL);
> > > +       } else if (!strcmp(interface, "org.bluez.Battery1")) {
> > > +               battery_removed(proxy);
> > >         }
> > >  }
> > >
> > > @@ -763,6 +780,20 @@ static struct adapter *find_ctrl_by_address(GList *source, const char *address)
> > >         return NULL;
> > >  }
> > >
> > > +static GDBusProxy *find_battery_by_path(GList *source, const char *path)
> > > +{
> > > +       GList *list;
> > > +
> > > +       for (list = g_list_first(source); list; list = g_list_next(list)) {
> > > +               GDBusProxy *proxy = list->data;
> > > +
> > > +               if (strcmp(g_dbus_proxy_get_path(proxy), path) == 0)
> > > +                       return proxy;
> > > +       }
> > > +
> > > +       return NULL;
> > > +}
> > > +
> > >  static GDBusProxy *find_proxy_by_address(GList *source, const char *address)
> > >  {
> > >         GList *list;
> > > @@ -1606,8 +1637,10 @@ static struct GDBusProxy *find_device(int argc, char *argv[])
> > >  static void cmd_info(int argc, char *argv[])
> > >  {
> > >         GDBusProxy *proxy;
> > > +       GDBusProxy *battery_proxy;
> > >         DBusMessageIter iter;
> > >         const char *address;
> > > +       unsigned char percentage;
> > >
> > >         proxy = find_device(argc, argv);
> > >         if (!proxy)
> > > @@ -1647,6 +1680,16 @@ static void cmd_info(int argc, char *argv[])
> > >         print_property(proxy, "AdvertisingFlags");
> > >         print_property(proxy, "AdvertisingData");
> > >
> > > +       battery_proxy = find_battery_by_path(battery_proxies,
> > > +                                       g_dbus_proxy_get_path(proxy));
> >
> > I'd replace the lines below with just print_property(battery_proxy,
> > "Percentage"); and just make print_property check for NULL proxy if it
> > doesn't already.
> I tried this but the result doesn't look quite good:
> Device XX:XX:XX:XX:XX:XX (random)
>         Name: ...
>         ...
>         Modalias: ...
>         Percentage: 0x64
>
> The name "Percentage" is not clear (what kind of percentage does it
> mean) when shown in the "info" command. And also the format for byte
> data type is hex and there is no percent sign. I tried to modify the
> print_property function to support custom format but the code gets
> overly complex and I think it's more straightforward to use custom
> logic like in this patch.

Just make it always print both the decimal and (hex).

> >
> > > +       if (battery_proxy && g_dbus_proxy_get_property(
> > > +                               battery_proxy, "Percentage", &iter)) {
> > > +               dbus_message_iter_get_basic(&iter, &percentage);
> > > +               bt_shell_printf("\tBattery Percentage: %d%%\n", percentage);
> > > +       } else {
> > > +               bt_shell_printf("\tNo battery information\n");
> > > +       }
> > > +
> > >         return bt_shell_noninteractive_quit(EXIT_SUCCESS);
> > >  }
> > >
> > > --
> > > 2.17.1
> > >
> >
> >
> > --
> > Luiz Augusto von Dentz
Sonny Sasaka July 2, 2020, 6:05 p.m. UTC | #4
Hi Luiz,

I just sent another patch following your feedback. Please take another
look. Thanks!

On Thu, Jul 2, 2020 at 8:43 AM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> Hi Sonny,
>
> On Wed, Jul 1, 2020 at 11:06 PM Sonny Sasaka <sonnysasaka@chromium.org> wrote:
> >
> > Hi Luiz,
> >
> > On Wed, Jul 1, 2020 at 10:20 PM Luiz Augusto von Dentz
> > <luiz.dentz@gmail.com> wrote:
> > >
> > > Hi Sonny,
> > >
> > > On Wed, Jul 1, 2020 at 12:24 PM Sonny Sasaka <sonnysasaka@chromium.org> wrote:
> > > >
> > > > This adds the Battery Percentage to the info command based on
> > > > org.bluez.Battery1 API. Example usage:
> > > >
> > > > [bluetooth]# info XX:XX:XX:XX:XX:XX
> > > > Device XX:XX:XX:XX:XX:XX (random)
> > > >         Name: ...
> > > >         Alias: ...
> > > >         ...
> > > >         Modalias: ...
> > > >         Battery Percentage: 100%
> > > > ---
> > > >  client/main.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> > > >  1 file changed, 43 insertions(+)
> > > >
> > > > diff --git a/client/main.c b/client/main.c
> > > > index 422da5593..4b787240e 100644
> > > > --- a/client/main.c
> > > > +++ b/client/main.c
> > > > @@ -65,6 +65,7 @@ static struct adapter *default_ctrl;
> > > >  static GDBusProxy *default_dev;
> > > >  static GDBusProxy *default_attr;
> > > >  static GList *ctrl_list;
> > > > +static GList *battery_proxies;
> > > >
> > > >  static const char *agent_arguments[] = {
> > > >         "on",
> > > > @@ -107,7 +108,9 @@ static void disconnect_handler(DBusConnection *connection, void *user_data)
> > > >         bt_shell_set_prompt(PROMPT_OFF);
> > > >
> > > >         g_list_free_full(ctrl_list, proxy_leak);
> > > > +       g_list_free_full(battery_proxies, proxy_leak);
> > > >         ctrl_list = NULL;
> > > > +       battery_proxies = NULL;
> > > >
> > > >         default_ctrl = NULL;
> > > >  }
> > > > @@ -445,6 +448,16 @@ done:
> > > >         g_free(desc);
> > > >  }
> > > >
> > > > +static void battery_added(GDBusProxy *proxy)
> > > > +{
> > > > +       battery_proxies = g_list_append(battery_proxies, proxy);
> > > > +}
> > > > +
> > > > +static void battery_removed(GDBusProxy *proxy)
> > > > +{
> > > > +       battery_proxies = g_list_remove(battery_proxies, proxy);
> > > > +}
> > > > +
> > > >  static void device_added(GDBusProxy *proxy)
> > > >  {
> > > >         DBusMessageIter iter;
> > > > @@ -539,6 +552,8 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
> > > >                 gatt_add_manager(proxy);
> > > >         } else if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
> > > >                 ad_manager_added(proxy);
> > > > +       } else if (!strcmp(interface, "org.bluez.Battery1")) {
> > > > +               battery_added(proxy);
> > > >         }
> > > >  }
> > > >
> > > > @@ -630,6 +645,8 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
> > > >                 gatt_remove_manager(proxy);
> > > >         } else if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
> > > >                 ad_unregister(dbus_conn, NULL);
> > > > +       } else if (!strcmp(interface, "org.bluez.Battery1")) {
> > > > +               battery_removed(proxy);
> > > >         }
> > > >  }
> > > >
> > > > @@ -763,6 +780,20 @@ static struct adapter *find_ctrl_by_address(GList *source, const char *address)
> > > >         return NULL;
> > > >  }
> > > >
> > > > +static GDBusProxy *find_battery_by_path(GList *source, const char *path)
> > > > +{
> > > > +       GList *list;
> > > > +
> > > > +       for (list = g_list_first(source); list; list = g_list_next(list)) {
> > > > +               GDBusProxy *proxy = list->data;
> > > > +
> > > > +               if (strcmp(g_dbus_proxy_get_path(proxy), path) == 0)
> > > > +                       return proxy;
> > > > +       }
> > > > +
> > > > +       return NULL;
> > > > +}
> > > > +
> > > >  static GDBusProxy *find_proxy_by_address(GList *source, const char *address)
> > > >  {
> > > >         GList *list;
> > > > @@ -1606,8 +1637,10 @@ static struct GDBusProxy *find_device(int argc, char *argv[])
> > > >  static void cmd_info(int argc, char *argv[])
> > > >  {
> > > >         GDBusProxy *proxy;
> > > > +       GDBusProxy *battery_proxy;
> > > >         DBusMessageIter iter;
> > > >         const char *address;
> > > > +       unsigned char percentage;
> > > >
> > > >         proxy = find_device(argc, argv);
> > > >         if (!proxy)
> > > > @@ -1647,6 +1680,16 @@ static void cmd_info(int argc, char *argv[])
> > > >         print_property(proxy, "AdvertisingFlags");
> > > >         print_property(proxy, "AdvertisingData");
> > > >
> > > > +       battery_proxy = find_battery_by_path(battery_proxies,
> > > > +                                       g_dbus_proxy_get_path(proxy));
> > >
> > > I'd replace the lines below with just print_property(battery_proxy,
> > > "Percentage"); and just make print_property check for NULL proxy if it
> > > doesn't already.
> > I tried this but the result doesn't look quite good:
> > Device XX:XX:XX:XX:XX:XX (random)
> >         Name: ...
> >         ...
> >         Modalias: ...
> >         Percentage: 0x64
> >
> > The name "Percentage" is not clear (what kind of percentage does it
> > mean) when shown in the "info" command. And also the format for byte
> > data type is hex and there is no percent sign. I tried to modify the
> > print_property function to support custom format but the code gets
> > overly complex and I think it's more straightforward to use custom
> > logic like in this patch.
>
> Just make it always print both the decimal and (hex).
>
> > >
> > > > +       if (battery_proxy && g_dbus_proxy_get_property(
> > > > +                               battery_proxy, "Percentage", &iter)) {
> > > > +               dbus_message_iter_get_basic(&iter, &percentage);
> > > > +               bt_shell_printf("\tBattery Percentage: %d%%\n", percentage);
> > > > +       } else {
> > > > +               bt_shell_printf("\tNo battery information\n");
> > > > +       }
> > > > +
> > > >         return bt_shell_noninteractive_quit(EXIT_SUCCESS);
> > > >  }
> > > >
> > > > --
> > > > 2.17.1
> > > >
> > >
> > >
> > > --
> > > Luiz Augusto von Dentz
>
>
>
> --
> Luiz Augusto von Dentz
diff mbox series

Patch

diff --git a/client/main.c b/client/main.c
index 422da5593..4b787240e 100644
--- a/client/main.c
+++ b/client/main.c
@@ -65,6 +65,7 @@  static struct adapter *default_ctrl;
 static GDBusProxy *default_dev;
 static GDBusProxy *default_attr;
 static GList *ctrl_list;
+static GList *battery_proxies;
 
 static const char *agent_arguments[] = {
 	"on",
@@ -107,7 +108,9 @@  static void disconnect_handler(DBusConnection *connection, void *user_data)
 	bt_shell_set_prompt(PROMPT_OFF);
 
 	g_list_free_full(ctrl_list, proxy_leak);
+	g_list_free_full(battery_proxies, proxy_leak);
 	ctrl_list = NULL;
+	battery_proxies = NULL;
 
 	default_ctrl = NULL;
 }
@@ -445,6 +448,16 @@  done:
 	g_free(desc);
 }
 
+static void battery_added(GDBusProxy *proxy)
+{
+	battery_proxies = g_list_append(battery_proxies, proxy);
+}
+
+static void battery_removed(GDBusProxy *proxy)
+{
+	battery_proxies = g_list_remove(battery_proxies, proxy);
+}
+
 static void device_added(GDBusProxy *proxy)
 {
 	DBusMessageIter iter;
@@ -539,6 +552,8 @@  static void proxy_added(GDBusProxy *proxy, void *user_data)
 		gatt_add_manager(proxy);
 	} else if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
 		ad_manager_added(proxy);
+	} else if (!strcmp(interface, "org.bluez.Battery1")) {
+		battery_added(proxy);
 	}
 }
 
@@ -630,6 +645,8 @@  static void proxy_removed(GDBusProxy *proxy, void *user_data)
 		gatt_remove_manager(proxy);
 	} else if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
 		ad_unregister(dbus_conn, NULL);
+	} else if (!strcmp(interface, "org.bluez.Battery1")) {
+		battery_removed(proxy);
 	}
 }
 
@@ -763,6 +780,20 @@  static struct adapter *find_ctrl_by_address(GList *source, const char *address)
 	return NULL;
 }
 
+static GDBusProxy *find_battery_by_path(GList *source, const char *path)
+{
+	GList *list;
+
+	for (list = g_list_first(source); list; list = g_list_next(list)) {
+		GDBusProxy *proxy = list->data;
+
+		if (strcmp(g_dbus_proxy_get_path(proxy), path) == 0)
+			return proxy;
+	}
+
+	return NULL;
+}
+
 static GDBusProxy *find_proxy_by_address(GList *source, const char *address)
 {
 	GList *list;
@@ -1606,8 +1637,10 @@  static struct GDBusProxy *find_device(int argc, char *argv[])
 static void cmd_info(int argc, char *argv[])
 {
 	GDBusProxy *proxy;
+	GDBusProxy *battery_proxy;
 	DBusMessageIter iter;
 	const char *address;
+	unsigned char percentage;
 
 	proxy = find_device(argc, argv);
 	if (!proxy)
@@ -1647,6 +1680,16 @@  static void cmd_info(int argc, char *argv[])
 	print_property(proxy, "AdvertisingFlags");
 	print_property(proxy, "AdvertisingData");
 
+	battery_proxy = find_battery_by_path(battery_proxies,
+					g_dbus_proxy_get_path(proxy));
+	if (battery_proxy && g_dbus_proxy_get_property(
+				battery_proxy, "Percentage", &iter)) {
+		dbus_message_iter_get_basic(&iter, &percentage);
+		bt_shell_printf("\tBattery Percentage: %d%%\n", percentage);
+	} else {
+		bt_shell_printf("\tNo battery information\n");
+	}
+
 	return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }