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); //} } } }