Implement DisableIntermediateMeasurement D-Bus method

This commit is contained in:
Santiago Carot-Nemesio 2011-11-14 13:11:19 +01:00 committed by Johan Hedberg
parent 02308bf820
commit a6c34b2c3a

View File

@ -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[] = {