bool bt_scpp_attach(struct bt_scpp *scan, void *attrib) { bt_uuid_t iwin_uuid, refresh_uuid; if (!scan || scan->attrib || !scan->primary) return false; scan->attrib = g_attrib_ref(attrib); if (scan->iwhandle) write_scan_params(scan->attrib, scan->iwhandle, scan->interval, scan->window); else { bt_uuid16_create(&iwin_uuid, SCAN_INTERVAL_WIN_UUID); discover_char(scan, scan->attrib, scan->primary->range.start, scan->primary->range.end, &iwin_uuid, iwin_discovered_cb, scan); } if (scan->refresh_handle) scan->refresh_cb_id = g_attrib_register(scan->attrib, ATT_OP_HANDLE_NOTIFY, scan->refresh_handle, refresh_value_cb, scan, NULL); else { bt_uuid16_create(&refresh_uuid, SCAN_REFRESH_UUID); discover_char(scan, scan->attrib, scan->primary->range.start, scan->primary->range.end, &refresh_uuid, refresh_discovered_cb, scan); } return true; }
static void refresh_value_cb(const uint8_t *pdu, uint16_t len, gpointer user_data) { struct scan *scan = user_data; DBG("Server requires refresh: %d", pdu[3]); if (pdu[3] == SERVER_REQUIRES_REFRESH) write_scan_params(scan->attrib, scan->iwhandle); }
static void iwin_discovered_cb(uint8_t status, GSList *chars, void *user_data) { struct scan *scan = user_data; struct gatt_char *chr; if (status) { error("Discover Scan Interval Window: %s", att_ecode2str(status)); return; } chr = chars->data; scan->iwhandle = chr->value_handle; DBG("Scan Interval Window handle: 0x%04x", scan->iwhandle); write_scan_params(scan->attrib, scan->iwhandle); }
static void attio_connected_cb(GAttrib *attrib, gpointer user_data) { struct scan *scan = user_data; bt_uuid_t iwin_uuid, refresh_uuid; scan->attrib = g_attrib_ref(attrib); if (scan->iwhandle) { write_scan_params(scan->attrib, scan->iwhandle); return; } bt_uuid16_create(&iwin_uuid, SCAN_INTERVAL_WIN_UUID); bt_uuid16_create(&refresh_uuid, SCAN_REFRESH_UUID); gatt_discover_char(scan->attrib, scan->range.start, scan->range.end, &iwin_uuid, iwin_discovered_cb, scan); gatt_discover_char(scan->attrib, scan->range.start, scan->range.end, &refresh_uuid, refresh_discovered_cb, scan); }