From 6e87f20c5be4acf294ae811171317a92f9dc136c Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Mon, 22 May 2017 11:04:15 +0200 Subject: [PATCH] example/hfp_ag: use gap inquiry functionality --- example/hfp_ag_demo.c | 191 +++++------------------------------------- 1 file changed, 23 insertions(+), 168 deletions(-) diff --git a/example/hfp_ag_demo.c b/example/hfp_ag_demo.c index 9e3193f21..844c83fba 100644 --- a/example/hfp_ag_demo.c +++ b/example/hfp_ag_demo.c @@ -104,25 +104,7 @@ static hfp_generic_status_indicator_t hf_indicators[] = { {2, 1}, }; -char cmd; - -// GAP INQUIRY - -#define MAX_DEVICES 10 -enum DEVICE_STATE { REMOTE_NAME_REQUEST, REMOTE_NAME_INQUIRED, REMOTE_NAME_FETCHED }; -struct device { - bd_addr_t address; - uint16_t clockOffset; - uint32_t classOfDevice; - uint8_t pageScanRepetitionMode; - uint8_t rssi; - enum DEVICE_STATE state; -}; - #define INQUIRY_INTERVAL 5 -struct device devices[MAX_DEVICES]; -int deviceCount = 0; - enum STATE {INIT, W4_INQUIRY_MODE_COMPLETE, ACTIVE} ; enum STATE state = INIT; @@ -151,149 +133,7 @@ static void dump_supported_codecs(void){ } } -static int getDeviceIndexForAddress( bd_addr_t addr){ - int j; - for (j=0; j< deviceCount; j++){ - if (bd_addr_cmp(addr, devices[j].address) == 0){ - return j; - } - } - return -1; -} - #ifdef HAVE_POSIX_STDIN -static void start_scan(void){ - printf("Starting inquiry scan..\n"); - hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0); -} -#endif - -static int has_more_remote_name_requests(void){ - int i; - for (i=0;i= 0) continue; // already in our list - memcpy(devices[deviceCount].address, addr, 6); - - devices[deviceCount].pageScanRepetitionMode = packet[offset]; - offset += 1; - - if (event == HCI_EVENT_INQUIRY_RESULT){ - offset += 2; // Reserved + Reserved - devices[deviceCount].classOfDevice = little_endian_read_24(packet, offset); - offset += 3; - devices[deviceCount].clockOffset = little_endian_read_16(packet, offset) & 0x7fff; - offset += 2; - devices[deviceCount].rssi = 0; - } else { - offset += 1; // Reserved - devices[deviceCount].classOfDevice = little_endian_read_24(packet, offset); - offset += 3; - devices[deviceCount].clockOffset = little_endian_read_16(packet, offset) & 0x7fff; - offset += 2; - devices[deviceCount].rssi = packet[offset]; - offset += 1; - } - devices[deviceCount].state = REMOTE_NAME_REQUEST; - printf("Device #%u found: %s with COD: 0x%06x, pageScan %d, clock offset 0x%04x, rssi 0x%02x\n", - deviceCount, bd_addr_to_str(addr), - devices[deviceCount].classOfDevice, devices[deviceCount].pageScanRepetitionMode, - devices[deviceCount].clockOffset, devices[deviceCount].rssi); - deviceCount++; - } - - break; - } - case HCI_EVENT_INQUIRY_COMPLETE: - for (i=0;i= 0) { - if (packet[2] == 0) { - printf("Name: '%s'\n", &packet[9]); - devices[index].state = REMOTE_NAME_FETCHED; - } else { - printf("Failed to get name: page timeout\n"); - } - } - continue_remote_names(); - break; - - default: - break; - } -} -// GAP INQUIRY END -#ifdef HAVE_POSIX_STDIN - -// prototypes -static void show_usage(void); - // Testig User Interface static void show_usage(void){ bd_addr_t iut_address; @@ -340,7 +180,7 @@ static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callbac UNUSED(ds); UNUSED(callback_type); - cmd = btstack_stdin_read(); + char cmd = btstack_stdin_read(); switch (cmd){ case 'a': log_info("USER:\'%c\'", cmd); @@ -535,7 +375,8 @@ static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callbac hfp_ag_join_held_call(); break; case 'v': - start_scan(); + printf("Start scanning...\n"); + gap_inquiry_start(INQUIRY_INTERVAL); break; case 'w': log_info("USER:\'%c\'", cmd); @@ -561,15 +402,29 @@ static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callbac static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * event, uint16_t event_size){ UNUSED(channel); - + bd_addr_t addr; switch (packet_type){ case HCI_EVENT_PACKET: switch (event[0]){ - case HCI_EVENT_INQUIRY_RESULT: - case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI: - case HCI_EVENT_INQUIRY_COMPLETE: - case HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE: - inquiry_packet_handler(HCI_EVENT_PACKET, event, event_size); + case GAP_EVENT_INQUIRY_RESULT: + gap_event_inquiry_result_get_bd_addr(event, addr); + // print info + printf("Device found: %s ", bd_addr_to_str(addr)); + printf("with COD: 0x%06x, ", (unsigned int) gap_event_inquiry_result_get_class_of_device(event)); + if (gap_event_inquiry_result_get_rssi_availabe(event)){ + printf(", rssi %d dBm", (int8_t) gap_event_inquiry_result_get_rssi(event)); + } + if (gap_event_inquiry_result_get_name_available(event)){ + char name_buffer[240]; + int name_len = gap_event_inquiry_result_get_name_len(event); + memcpy(name_buffer, gap_event_inquiry_result_get_name(event), name_len); + name_buffer[name_len] = 0; + printf(", name '%s'", name_buffer); + } + printf("\n"); + break; + case GAP_EVENT_INQUIRY_COMPLETE: + printf("Inquiry scan complete.\n"); break; case HCI_EVENT_SCO_CAN_SEND_NOW: sco_demo_send(sco_handle);