Re: [PATCH 05/10] battery: Discover Characteristic Descriptors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Sep 11, 2012 at 4:38 AM,  <chen.ganir@xxxxxx> wrote:
> From: Chen Ganir <chen.ganir@xxxxxx>
>
> Discover all characteristic descriptors, and build a descriptor
> list. Presentation Format Descriptor and Client Characteristic
> Configuration descriptors are searched.
> ---
>  profiles/battery/battery.c |   73 +++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 72 insertions(+), 1 deletion(-)
>
> diff --git a/profiles/battery/battery.c b/profiles/battery/battery.c
> index 37cbce4..3a24a7b 100644
> --- a/profiles/battery/battery.c
> +++ b/profiles/battery/battery.c
> @@ -51,6 +51,13 @@ static GSList *servers;
>  struct characteristic {
>         struct gatt_char        attr;   /* Characteristic */
>         struct battery          *batt;  /* Parent Battery Service */
> +       GSList                          *desc;  /* Descriptors */

Wrong alignment here.

> +};
> +
> +struct descriptor {
> +       struct characteristic   *ch;            /* Parent Characteristic */
> +       uint16_t                handle;         /* Descriptor Handle */
> +       bt_uuid_t               uuid;           /* UUID */
>  };
>
>  static gint cmp_device(gconstpointer a, gconstpointer b)
> @@ -64,12 +71,21 @@ static gint cmp_device(gconstpointer a, gconstpointer b)
>         return -1;
>  }
>
> +static void char_free(gpointer user_data)
> +{
> +       struct characteristic *c = user_data;
> +
> +       g_slist_free_full(c->desc, g_free);
> +
> +       g_free(c);
> +}
> +
>  static void battery_free(gpointer user_data)
>  {
>         struct battery *batt = user_data;
>
>         if (batt->chars != NULL)
> -               g_slist_free_full(batt->chars, g_free);
> +               g_slist_free_full(batt->chars, char_free);
>
>         if (batt->attioid > 0)
>                 btd_device_remove_attio_callback(batt->dev, batt->attioid);
> @@ -82,7 +98,47 @@ static void battery_free(gpointer user_data)
>         g_free(batt);
>  }
>
> +static void discover_desc_cb(guint8 status, const guint8 *pdu, guint16 len,
> +                                                       gpointer user_data)
> +{
> +       struct characteristic *ch = user_data;
> +       struct att_data_list *list;
> +       uint8_t format;
> +       int i;
> +
> +       if (status != 0) {
> +               error("Discover all characteristic descriptors failed [%s]: %s",
> +                                       ch->attr.uuid, att_ecode2str(status));
> +               return;
> +       }
> +
> +       list = dec_find_info_resp(pdu, len, &format);
> +       if (list == NULL)
> +               return;
> +
> +       for (i = 0; i < list->num; i++) {
> +               struct descriptor *desc;
> +               uint8_t *value;
> +
> +               value = list->data[i];
> +               desc = g_new0(struct descriptor, 1);
> +               desc->handle = att_get_u16(value);
> +               desc->ch = ch;
> +
> +               if (format == 0x01)
> +                       desc->uuid = att_get_uuid16(&value[2]);
> +               else
> +                       desc->uuid = att_get_uuid128(&value[2]);
> +
> +               ch->desc = g_slist_append(ch->desc, desc);
> +       }
> +
> +       att_data_list_free(list);
> +}
> +
> +

Remove extra blank line here.

>  static void configure_battery_cb(GSList *characteristics, guint8 status,
> +

Remove extra blank line here.

>                                                         gpointer user_data)
>  {
>         struct battery *batt = user_data;
> @@ -97,6 +153,7 @@ static void configure_battery_cb(GSList *characteristics, guint8 status,
>         for (l = characteristics; l; l = l->next) {
>                 struct gatt_char *c = l->data;
>                 struct characteristic *ch;
> +               uint16_t start, end;
>
>                 ch = g_new0(struct characteristic, 1);
>                 ch->attr.handle = c->handle;
> @@ -106,6 +163,20 @@ static void configure_battery_cb(GSList *characteristics, guint8 status,
>                 ch->batt = batt;
>
>                 batt->chars = g_slist_append(batt->chars, ch);
> +
> +               start = c->value_handle + 1;
> +
> +               if (l->next != NULL) {
> +                       struct gatt_char *c = l->next->data;
> +                       if (start == c->handle)
> +                               continue;
> +                       end = c->handle - 1;
> +               } else if (c->value_handle != batt->svc_range->end)
> +                       end = batt->svc_range->end;
> +               else
> +                       continue;
> +
> +               gatt_find_info(batt->attrib, start, end, discover_desc_cb, ch);
>         }
>  }
>
> --
> 1.7.9.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
João Paulo Rechi Vita
Openbossa Labs - INdT
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux