static void handle_hci_event(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ if (packet_type != HCI_EVENT_PACKET) return; advertising_report_t report; uint8_t event = packet[0]; switch (event) { case BTSTACK_EVENT_STATE: // BTstack activated, get started if (packet[2] != HCI_STATE_WORKING) break; if (cmdline_addr_found){ printf("Trying to connect to %s\n", bd_addr_to_str(cmdline_addr)); state = TC_W4_CONNECT; le_central_connect(cmdline_addr, 0); break; } printf("BTstack activated, start scanning!\n"); state = TC_W4_SCAN_RESULT; le_central_set_scan_parameters(0,0x0030, 0x0030); le_central_start_scan(); break; case GAP_LE_ADVERTISING_REPORT: if (state != TC_W4_SCAN_RESULT) return; fill_advertising_report_from_packet(&report, packet); // stop scanning, and connect to the device state = TC_W4_CONNECT; le_central_stop_scan(); le_central_connect(report.address,report.address_type); break; case HCI_EVENT_LE_META: // wait for connection complete if (packet[2] != HCI_SUBEVENT_LE_CONNECTION_COMPLETE) break; if (state != TC_W4_CONNECT) return; gc_handle = READ_BT_16(packet, 4); // query primary services state = TC_W4_SERVICE_RESULT; gatt_client_discover_primary_services(gc_id, gc_handle); break; case HCI_EVENT_DISCONNECTION_COMPLETE: printf("\ntest client - DISCONNECTED\n"); exit(0); break; default: break; } }
static void handle_hci_event(uint8_t packet_type, uint8_t *packet, uint16_t size){ le_command_status_t status; if (packet_type != HCI_EVENT_PACKET) return; switch (packet[0]) { case HCI_EVENT_DISCONNECTION_COMPLETE: printf("test client - DISCONNECTED\n"); break; case GAP_LE_ADVERTISING_REPORT: if (tc_state != TC_W4_SCAN_RESULT) return; printf("test client - SCAN ACTIVE\n"); ad_event_t ad_event; int pos = 2; ad_event.event_type = packet[pos++]; ad_event.address_type = packet[pos++]; memcpy(ad_event.address, &packet[pos], 6); pos += 6; ad_event.rssi = packet[pos++]; ad_event.length = packet[pos++]; ad_event.data = &packet[pos]; pos += ad_event.length; dump_ad_event(&ad_event); test_device_addr_type = ad_event.address_type; bd_addr_t found_device_addr; memcpy(found_device_addr, ad_event.address, 6); swapX(ad_event.address, found_device_addr, 6); if (memcmp(&found_device_addr, &sensor_tag1_addr, 6) == 0 || memcmp(&found_device_addr, &sensor_tag2_addr, 6) == 0) { tc_state = TC_W4_CONNECT; le_central_stop_scan(); le_central_connect(&found_device_addr, test_device_addr_type); } break; case BTSTACK_EVENT_STATE: // BTstack activated, get started if (packet[2] == HCI_STATE_WORKING) { printf("BTstack activated, get started!\n"); tc_state = TC_W4_SCAN_RESULT; le_central_start_scan(); } break; case HCI_EVENT_LE_META: switch (packet[2]) { case HCI_SUBEVENT_LE_CONNECTION_COMPLETE: { if (tc_state != TC_W4_CONNECT) return; tc_state = TC_W4_SERVICE_RESULT; printf("\n test client - CONNECTED, query ACC service\n"); test_gatt_client_handle = READ_BT_16(packet, 4); gatt_client_start(&test_gatt_client_context, test_gatt_client_handle); // let's start gatt_client_discover_primary_services_by_uuid128(&test_gatt_client_context, acc_service_uuid); break; } default: break; } break; case DAEMON_EVENT_HCI_PACKET_SENT: switch(tc_state){ case TC_W2_WRITE_WITHOUT_RESPONSE: status = gatt_client_write_value_of_characteristic_without_response(&test_gatt_client_context, characteristic.value_handle, 1, chr_short_value); if (status != BLE_PERIPHERAL_OK) break; tc_state = TC_W4_READ_LONG_RESULT; gatt_client_read_long_value_of_characteristic(&test_gatt_client_context, &characteristic); default: break; } default: break; } }