void ble_evt_attclient_procedure_completed(const struct ble_msg_attclient_procedure_completed_evt_t *msg) { if (state == state_finding_services) { // Thermometer service not found if (thermometer_handle_start == 0) { printf("No Health Thermometer service found\n"); change_state(state_finish); } // Find thermometer service attributes else { change_state(state_finding_attributes); ble_cmd_attclient_find_information(msg->connection, thermometer_handle_start, thermometer_handle_end); } } else if (state == state_finding_attributes) { // Client characteristic configuration not found if (thermometer_handle_configuration == 0) { printf("No Client Characteristic Configuration found for Health Thermometer service\n"); change_state(state_finish); } // Enable temperature notifications else { change_state(state_listening_measurements); enable_indications(msg->connection, thermometer_handle_configuration); } } }
/** * "attclient_procedure_completed" event handler * Occurs whenever a service or attribute search has finished, or a few other * kinds of GATT client operations. Tracking state is important here since you * can end up in this event handler for many reasons. * * @param msg Event packet data payload */ void ble_evt_attclient_procedure_completed(const struct ble_msg_attclient_procedure_completed_evt_t *msg) { if (state == state_finding_services) { // Data service not found if (drone_handle_start == 0) { fprintf(stderr, "No Drone service found\n"); change_state(state_finish); } // Find drone service attributes else { change_state(state_finding_attributes); ble_cmd_attclient_find_information(msg->connection, drone_handle_start, drone_handle_end); } } else if (state == state_finding_attributes) { // Client characteristic configuration not found if (drone_handle_configuration == 0) { fprintf(stderr, "No Client Characteristic Configuration found for Drone Data service\n"); change_state(state_finish); } // Enable drone notifications else { change_state(state_listening_measurements); enable_indications(msg->connection, drone_handle_configuration); } } // preivous message parsed on device, device now ready for next message //else if (state == state_listening_measurements) { // extract_idx[msg->connection] = (extract_idx[msg->connection] + bt_msg_len[msg->connection]) % BUF_SIZE; // send_msg(msg->connection, 1); //} }
void ble_evt_connection_status(const struct ble_msg_connection_status_evt_t *msg) { // New connection if (msg->flags & connection_connected) { change_state(state_connected); printf("Connected\n"); // Handle for Temperature Measurement configuration already known if (thermometer_handle_configuration) { change_state(state_listening_measurements); enable_indications(msg->connection, thermometer_handle_configuration); } // Find primary services else { change_state(state_finding_services); ble_cmd_attclient_read_by_group_type(msg->connection, FIRST_HANDLE, LAST_HANDLE, 2, primary_service_uuid); } } }
/** * "connection_status" event handler * Occurs whenever a new connection is established, or an existing one is updated * * @param msg Event packet data payload */ void ble_evt_connection_status(const struct ble_msg_connection_status_evt_t *msg) { // updated connection if (msg->flags & connection_parameters_change) { fprintf(stderr, "Connection %d parameters updated, interval %fms\n", msg->connection, msg->conn_interval * 1.25); } // Encrypted previous connection else if (msg->flags & connection_encrypted) { fprintf(stderr, "Connection with %d is encrypted\n", msg->connection); } // Connection request completed else if (msg->flags & connection_completed) { if (msg->connection + 1 > connected_devices) { connected_devices++; } cpy_bdaddr(connected_addr[msg->connection].addr, msg->address.addr); //change_state(state_connected); connection_interval = msg->conn_interval * 1.25; fprintf(stderr, "Connected, nr: %d, connection interval: %d = %fms\n", msg->connection, msg->conn_interval, msg->conn_interval * 1.25); connected[msg->connection] = 1; if (rec_addr[msg->connection].sin_family != AF_INET && send_port && recv_port) { if ((sock[msg->connection] = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } send_addr[msg->connection].sin_family = AF_INET; send_addr[msg->connection].sin_port = htons(send_port + msg->connection); send_addr[msg->connection].sin_addr = *((struct in_addr *)host->h_addr); bzero(&(send_addr[msg->connection].sin_zero), 8); sin_size = sizeof(struct sockaddr); rec_addr[msg->connection].sin_family = AF_INET; rec_addr[msg->connection].sin_port = htons(recv_port + msg->connection); rec_addr[msg->connection].sin_addr = *((struct in_addr *)host->h_addr); bzero(&(rec_addr[msg->connection].sin_zero), 8); sin_size = sizeof(struct sockaddr); if (bind(sock[msg->connection], (struct sockaddr *)&rec_addr[msg->connection], sizeof(struct sockaddr)) == -1) { perror("Bind failed"); exit(1); } fprintf(stderr, "Comms port opened on port: %d %d\n", send_port + msg->connection, recv_port + msg->connection); } // Handle for Drone Data configuration already known if (drone_handle_configuration) { change_state(state_listening_measurements); enable_indications(msg->connection, drone_handle_configuration); //if (connect_all) { ble_cmd_gap_discover(gap_discover_generic); //} } // Find primary services else { change_state(state_finding_services); ble_cmd_attclient_read_by_group_type(msg->connection, FIRST_HANDLE, LAST_HANDLE, 2, primary_service_uuid); //if (connect_all) { ble_cmd_gap_discover(gap_discover_generic); //} } } }