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<deviceCount;i++) { - if (devices[i].state == REMOTE_NAME_REQUEST) return 1; - } - return 0; -} - -static void do_next_remote_name_request(void){ - int i; - for (i=0;i<deviceCount;i++) { - // remote name request - if (devices[i].state == REMOTE_NAME_REQUEST){ - devices[i].state = REMOTE_NAME_INQUIRED; - printf("Get remote name of %s...\n", bd_addr_to_str(devices[i].address)); - hci_send_cmd(&hci_remote_name_request, devices[i].address, - devices[i].pageScanRepetitionMode, 0, devices[i].clockOffset | 0x8000); - return; - } - } -} - -static void continue_remote_names(void){ - // don't get remote names for testing - if (has_more_remote_name_requests()){ - do_next_remote_name_request(); - return; - } - // try to find PTS - int i; - for (i=0;i<deviceCount;i++){ - if (memcmp(devices[i].address, device_addr, 6) == 0){ - printf("Inquiry scan over, successfully found PTS at index %u\nReady to connect to it.\n", i); - return; - } - } - printf("Inquiry scan over but PTS not found :(\n"); -} - -static void inquiry_packet_handler (uint8_t packet_type, uint8_t *packet, uint16_t size){ - UNUSED(size); - - bd_addr_t addr; - int i; - int numResponses; - int index; - - // printf("packet_handler: pt: 0x%02x, packet[0]: 0x%02x\n", packet_type, packet[0]); - if (packet_type != HCI_EVENT_PACKET) return; - - uint8_t event = packet[0]; - - switch(event){ - case HCI_EVENT_INQUIRY_RESULT: - case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI:{ - numResponses = hci_event_inquiry_result_get_num_responses(packet); - int offset = 3; - for (i=0; i<numResponses && deviceCount < MAX_DEVICES;i++){ - reverse_bd_addr(&packet[offset], addr); - offset += 6; - index = getDeviceIndexForAddress(addr); - if (index >= 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<deviceCount;i++) { - // retry remote name request - if (devices[i].state == REMOTE_NAME_INQUIRED) - devices[i].state = REMOTE_NAME_REQUEST; - } - continue_remote_names(); - break; - - case HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE: - reverse_bd_addr(&packet[3], addr); - index = getDeviceIndexForAddress(addr); - if (index >= 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);