static void packet_handler(uint8_t * event, uint16_t event_size){ if (event[0] == RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE){ handle = READ_BT_16(event, 9); printf("RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE received for handle 0x%04x\n", handle); return; } switch (event[0]){ case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE: handle = READ_BT_16(event, 9); printf("RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE received for handle 0x%04x\n", handle); return; 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); break; default: break; } if (event[0] != HCI_EVENT_HFP_META) return; if (event[3] && event[2] != HFP_SUBEVENT_PLACE_CALL_WITH_NUMBER && event[2] != HFP_SUBEVENT_ATTACH_NUMBER_TO_VOICE_TAG && event[2] != HFP_SUBEVENT_TRANSMIT_DTMF_CODES){ printf("ERROR, status: %u\n", event[3]); return; } switch (event[2]) { case HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_ESTABLISHED: printf("Service level connection established.\n"); break; case HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED: printf("Service level connection released.\n"); break; case HFP_SUBEVENT_AUDIO_CONNECTION_ESTABLISHED: printf("\n** Audio connection established **\n"); break; case HFP_SUBEVENT_AUDIO_CONNECTION_RELEASED: printf("\n** Audio connection released **\n"); break; case HFP_SUBEVENT_START_RINGINIG: printf("\n** Start Ringing **\n"); break; case HFP_SUBEVENT_STOP_RINGINIG: printf("\n** Stop Ringing **\n"); break; case HFP_SUBEVENT_PLACE_CALL_WITH_NUMBER: printf("\n** Outgoing call '%s' **\n", &event[3]); // validate number if ( strcmp("1234567", (char*) &event[3]) == 0 || strcmp("7654321", (char*) &event[3]) == 0 || (memory_1_enabled && strcmp(">1", (char*) &event[3]) == 0)){ printf("Dialstring valid: accept call\n"); hfp_ag_outgoing_call_accepted(); } else { printf("Dialstring invalid: reject call\n"); hfp_ag_outgoing_call_rejected(); } break; case HFP_SUBEVENT_ATTACH_NUMBER_TO_VOICE_TAG: printf("\n** Attach number to voice tag. Sending '1234567\n"); hfp_ag_send_phone_number_for_voice_tag(device_addr, "1234567"); break; case HFP_SUBEVENT_TRANSMIT_DTMF_CODES: printf("\n** Send DTMF Codes: '%s'\n", &event[3]); hfp_ag_send_dtmf_code_done(device_addr); break; case HFP_CMD_CALL_ANSWERED: printf("Call answered by HF\n"); break; default: printf("Event not handled %u\n", event[2]); break; } }
static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ uint16_t psm; uint32_t passkey; if (packet_type == UCD_DATA_PACKET){ printf("UCD Data for PSM %04x received, size %u\n", READ_BT_16(packet, 0), size - 2); } if (packet_type != HCI_EVENT_PACKET) return; switch (packet[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(packet_type, packet, size); break; case BTSTACK_EVENT_STATE: // bt stack activated, get started if (packet[2] == HCI_STATE_WORKING){ printf("BTstack Bluetooth Classic Test Ready\n"); hci_send_cmd(&hci_write_inquiry_mode, 0x01); // with RSSI show_usage(); } break; case GAP_DEDICATED_BONDING_COMPLETED: printf("GAP Dedicated Bonding Complete, status %u\n", packet[2]); break; case HCI_EVENT_CONNECTION_COMPLETE: if (!packet[2]){ handle = READ_BT_16(packet, 3); bt_flip_addr(remote, &packet[5]); printf("HCI_EVENT_CONNECTION_COMPLETE: handle 0x%04x\n", handle); } break; case HCI_EVENT_USER_PASSKEY_REQUEST: bt_flip_addr(remote, &packet[2]); printf("GAP User Passkey Request for %s\nPasskey:", bd_addr_to_str(remote)); fflush(stdout); ui_digits_for_passkey = 6; break; case HCI_EVENT_USER_CONFIRMATION_REQUEST: bt_flip_addr(remote, &packet[2]); passkey = READ_BT_32(packet, 8); printf("GAP User Confirmation Request for %s, number '%06u'\n", bd_addr_to_str(remote),passkey); break; case HCI_EVENT_PIN_CODE_REQUEST: bt_flip_addr(remote, &packet[2]); printf("GAP Legacy PIN Request for %s (press ENTER to send)\nPasskey:", bd_addr_to_str(remote)); fflush(stdout); ui_chars_for_pin = 1; break; case L2CAP_EVENT_CHANNEL_OPENED: // inform about new l2cap connection bt_flip_addr(remote, &packet[3]); psm = READ_BT_16(packet, 11); local_cid = READ_BT_16(packet, 13); handle = READ_BT_16(packet, 9); if (packet[2] == 0) { printf("L2CAP Channel successfully opened: %s, handle 0x%02x, psm 0x%02x, local cid 0x%02x, remote cid 0x%02x\n", bd_addr_to_str(remote), handle, psm, local_cid, READ_BT_16(packet, 15)); } else { printf("L2CAP connection to device %s failed. status code %u\n", bd_addr_to_str(remote), packet[2]); } break; case L2CAP_EVENT_INCOMING_CONNECTION: { // data: event (8), len(8), address(48), handle (16), psm (16), local_cid(16), remote_cid (16) psm = READ_BT_16(packet, 10); // uint16_t l2cap_cid = READ_BT_16(packet, 12); printf("L2CAP incoming connection request on PSM %u\n", psm); // l2cap_accept_connection_internal(l2cap_cid); break; } case RFCOMM_EVENT_INCOMING_CONNECTION: // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16) bt_flip_addr(remote, &packet[2]); rfcomm_channel_nr = packet[8]; rfcomm_channel_id = READ_BT_16(packet, 9); printf("RFCOMM channel %u requested for %s\n\r", rfcomm_channel_nr, bd_addr_to_str(remote)); rfcomm_accept_connection_internal(rfcomm_channel_id); break; case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE: // data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16) if (packet[2]) { printf("RFCOMM channel open failed, status %u\n\r", packet[2]); } else { rfcomm_channel_id = READ_BT_16(packet, 12); mtu = READ_BT_16(packet, 14); if (mtu > 60){ printf("BTstack libusb hack: using reduced MTU for sending instead of %u\n", mtu); mtu = 60; } printf("\n\rRFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n\r", rfcomm_channel_id, mtu); } break; case RFCOMM_EVENT_CHANNEL_CLOSED: rfcomm_channel_id = 0; break; default: break; } }