diff --git a/src/shared/ad.c b/src/shared/ad.c
index aca4e23..255794d 100644
--- a/src/shared/ad.c
+++ b/src/shared/ad.c
struct bt_ad {
int ref_count;
char *name;
+ uint16_t appearance;
struct queue *service_uuids;
struct queue *manufacturer_data;
struct queue *solicit_uuids;
ad->manufacturer_data = queue_new();
ad->solicit_uuids = queue_new();
ad->service_data = queue_new();
+ ad->appearance = UINT16_MAX;
return bt_ad_ref(ad);
}
length += name_length(ad->name, &length);
+ length += ad->appearance != UINT16_MAX ? 4 : 0;
+
return length;
}
*pos += len;
}
+static void serialize_appearance(uint16_t value, uint8_t *buf, uint8_t *pos)
+{
+ if (value == UINT16_MAX)
+ return;
+
+ buf[(*pos)++] = sizeof(value) + 1;
+ buf[(*pos)++] = EIR_GAP_APPEARANCE;
+
+ bt_put_le16(value, buf + (*pos));
+ *pos += 2;
+}
+
uint8_t *bt_ad_generate(struct bt_ad *ad, size_t *length)
{
uint8_t *adv_data;
serialize_name(ad->name, adv_data, &pos);
+ serialize_appearance(ad->appearance, adv_data, &pos);
+
return adv_data;
}
free(ad->name);
ad->name = NULL;
}
+
+bool bt_ad_add_appearance(struct bt_ad *ad, uint16_t appearance)
+{
+ if (!ad)
+ return false;
+
+ ad->appearance = appearance;
+
+ return true;
+}
+
+void bt_ad_clear_appearance(struct bt_ad *ad)
+{
+ if (!ad)
+ return;
+
+ ad->appearance = UINT16_MAX;
+}
diff --git a/src/shared/ad.h b/src/shared/ad.h
index 161602d..f0e3b81 100644
--- a/src/shared/ad.h
+++ b/src/shared/ad.h
bool bt_ad_add_name(struct bt_ad *ad, const char *name);
void bt_ad_clear_name(struct bt_ad *ad);
+
+bool bt_ad_add_appearance(struct bt_ad *ad, uint16_t appearance);
+
+void bt_ad_clear_appearance(struct bt_ad *ad);