void bletest_execute_initiator(void) { int rc; uint16_t handle; /* * Determine if there is an active connection for the current handle * we are trying to create. If so, start looking for the next one */ if (g_bletest_current_conns < BLETEST_CFG_CONCURRENT_CONNS) { handle = g_bletest_current_conns + 1; if (ble_ll_conn_find_active_conn(handle)) { /* Set LED to slower blink rate */ g_bletest_led_rate = OS_TICKS_PER_SEC; /* Set next os time to start the connection update */ g_next_os_time = 0; /* Ask for version information */ rc = host_hci_cmd_rd_rem_version(handle); assert(rc == 0); host_hci_outstanding_opcode = 0; /* Scanning better be stopped! */ assert(ble_ll_scan_enabled() == 0); /* Add to current connections */ ++g_bletest_current_conns; /* Move to next connection */ if (g_bletest_current_conns < BLETEST_CFG_CONCURRENT_CONNS) { /* restart initiating */ g_bletest_cur_peer_addr[5] += 1; g_dev_addr[5] += 1; bletest_init_initiator(); } } } else { /* Issue a connection parameter update to connection handle 1 */ if (g_next_os_time == 0) { g_next_os_time = os_time_get(); g_next_os_time += OS_TICKS_PER_SEC * 5; } else { if (g_next_os_time != 0xffffffff) { #if 0 if ((int32_t)(os_time_get() - g_next_os_time) >= 0) { bletest_send_conn_update(1); g_next_os_time = 0xffffffff; } #else g_next_os_time = 0xffffffff; #endif } } } }
void bletest_execute_initiator(void) { int i; int rc; int8_t rssi; uint16_t handle; uint8_t new_chan_map[5]; /* * Determine if there is an active connection for the current handle * we are trying to create. If so, start looking for the next one */ if (g_bletest_current_conns < BLETEST_CFG_CONCURRENT_CONNS) { handle = g_bletest_current_conns + 1; if (ble_ll_conn_find_active_conn(handle)) { /* Set LED to slower blink rate */ g_bletest_led_rate = OS_TICKS_PER_SEC; /* Ask for version information */ rc = bletest_hci_rd_rem_version(handle); /* Ask for remote used features */ rc = bletest_hci_le_read_rem_used_feat(handle); /* Scanning better be stopped! */ assert(ble_ll_scan_enabled() == 0); /* Add to current connections */ if (!rc) { ++g_bletest_current_conns; /* Move to next connection */ if (g_bletest_current_conns < BLETEST_CFG_CONCURRENT_CONNS) { /* restart initiating */ g_bletest_cur_peer_addr[5] += 1; g_dev_addr[5] += 1; bletest_init_initiator(); } } } else { if (ble_ll_scan_enabled() == 0) { bletest_hci_le_create_connection(&g_cc); } } } else { if ((int32_t)(os_time_get() - g_next_os_time) >= 0) { if ((g_bletest_state == 1) || (g_bletest_state == 3)) { for (i = 0; i < g_bletest_current_conns; ++i) { if (ble_ll_conn_find_active_conn(i + 1)) { bletest_hci_le_rd_chanmap(i+1); } } } else if (g_bletest_state == 2) { new_chan_map[0] = 0; new_chan_map[1] = 0x3; new_chan_map[2] = 0; new_chan_map[3] = 0x1F; new_chan_map[4] = 0; bletest_hci_le_set_host_chan_class(new_chan_map); } else if (g_bletest_state == 4) { #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) == 1) struct hci_start_encrypt hsle; for (i = 0; i < g_bletest_current_conns; ++i) { if (ble_ll_conn_find_active_conn(i + 1)) { hsle.connection_handle = i + 1; hsle.encrypted_diversifier = g_bletest_EDIV; hsle.random_number = g_bletest_RAND; swap_buf(hsle.long_term_key, (uint8_t *)g_bletest_LTK, 16); bletest_hci_le_start_encrypt(&hsle); } } #endif } else if (g_bletest_state == 8) { #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) == 1) struct hci_start_encrypt hsle; for (i = 0; i < g_bletest_current_conns; ++i) { if (ble_ll_conn_find_active_conn(i + 1)) { hsle.connection_handle = i + 1; hsle.encrypted_diversifier = g_bletest_EDIV; hsle.random_number = ~g_bletest_RAND; swap_buf(hsle.long_term_key, (uint8_t *)g_bletest_LTK, 16); bletest_hci_le_start_encrypt(&hsle); } } #endif } else { for (i = 0; i < g_bletest_current_conns; ++i) { if (ble_ll_conn_find_active_conn(i + 1)) { ble_hs_hci_util_read_rssi(i+1, &rssi); } } } ++g_bletest_state; if (g_bletest_state > 9) { g_bletest_state = 9; } g_next_os_time = os_time_get() + OS_TICKS_PER_SEC * 3; } } }