mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-25 13:14:14 +08:00
Implement DisableIntermediateMeasurement D-Bus method
This commit is contained in:
parent
02308bf820
commit
a6c34b2c3a
@ -651,6 +651,44 @@ static void disable_final_measurement(struct thermometer *t)
|
||||
gatt_write_char(t->attrib, desc->handle, atval, 2, measurement_cb, msg);
|
||||
}
|
||||
|
||||
static void disable_intermediate_measurement(struct thermometer *t)
|
||||
{
|
||||
struct characteristic *ch;
|
||||
struct descriptor *desc;
|
||||
bt_uuid_t btuuid;
|
||||
uint8_t atval[2];
|
||||
gchar *msg;
|
||||
|
||||
ch = get_characteristic(t, INTERMEDIATE_TEMPERATURE_UUID);
|
||||
if (ch == NULL) {
|
||||
DBG("Intermediate measurement characteristic not found");
|
||||
return;
|
||||
}
|
||||
|
||||
bt_uuid16_create(&btuuid, GATT_CLIENT_CHARAC_CFG_UUID);
|
||||
desc = get_descriptor(ch, &btuuid);
|
||||
if (desc == NULL) {
|
||||
DBG("Client characteristic configuration descriptor not found");
|
||||
return;
|
||||
}
|
||||
|
||||
atval[0] = 0x00;
|
||||
atval[1] = 0x00;
|
||||
msg = g_strdup("Disable intermediate measurement");
|
||||
gatt_write_char(t->attrib, desc->handle, atval, 2, measurement_cb, msg);
|
||||
}
|
||||
|
||||
static void remove_int_watcher(struct thermometer *t, struct watcher *w)
|
||||
{
|
||||
if (!g_slist_find(t->iwatchers, w))
|
||||
return;
|
||||
|
||||
t->iwatchers = g_slist_remove(t->iwatchers, w);
|
||||
|
||||
if (g_slist_length(t->iwatchers) == 0)
|
||||
disable_intermediate_measurement(t);
|
||||
}
|
||||
|
||||
static void watcher_exit(DBusConnection *conn, void *user_data)
|
||||
{
|
||||
struct watcher *watcher = user_data;
|
||||
@ -658,6 +696,8 @@ static void watcher_exit(DBusConnection *conn, void *user_data)
|
||||
|
||||
DBG("Thermometer watcher %s disconnected", watcher->path);
|
||||
|
||||
remove_int_watcher(t, watcher);
|
||||
|
||||
t->fwatchers = g_slist_remove(t->fwatchers, watcher);
|
||||
watcher->id = 0;
|
||||
|
||||
@ -735,6 +775,8 @@ static DBusMessage *unregister_watcher(DBusConnection *conn, DBusMessage *msg,
|
||||
|
||||
DBG("Thermometer watcher %s unregistered", path);
|
||||
|
||||
remove_int_watcher(t, watcher);
|
||||
|
||||
t->fwatchers = g_slist_remove(t->fwatchers, watcher);
|
||||
destroy_watcher(watcher);
|
||||
|
||||
@ -779,9 +821,24 @@ static DBusMessage *enable_intermediate(DBusConnection *conn, DBusMessage *msg,
|
||||
static DBusMessage *disable_intermediate(DBusConnection *conn, DBusMessage *msg,
|
||||
void *data)
|
||||
{
|
||||
/* TODO: */
|
||||
return g_dbus_create_error(msg, ERROR_INTERFACE ".ThermometerError",
|
||||
"Function not implemented.");
|
||||
const gchar *sender = dbus_message_get_sender(msg);
|
||||
struct thermometer *t = data;
|
||||
struct watcher *watcher;
|
||||
gchar *path;
|
||||
|
||||
if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
|
||||
DBUS_TYPE_INVALID))
|
||||
return btd_error_invalid_args(msg);
|
||||
|
||||
watcher = find_watcher(t->iwatchers, sender, path);
|
||||
if (watcher == NULL)
|
||||
return btd_error_does_not_exist(msg);
|
||||
|
||||
DBG("Intermediate measurement %s unregistered", path);
|
||||
|
||||
remove_int_watcher(t, watcher);
|
||||
|
||||
return dbus_message_new_method_return(msg);
|
||||
}
|
||||
|
||||
static GDBusMethodTable thermometer_methods[] = {
|
||||
|
Loading…
Reference in New Issue
Block a user