ret_code_t im_peer_free(pm_peer_id_t peer_id) { uint16_t conn_handle; ret_code_t ret; NRF_PM_DEBUG_CHECK(m_module_initialized); conn_handle = im_conn_handle_get(peer_id); ret = pdb_peer_free(peer_id); if ((conn_handle != BLE_CONN_HANDLE_INVALID) && (ret == NRF_SUCCESS)) { peer_id_set(conn_handle, PM_PEER_ID_INVALID); } return ret; }
/**@brief Event handler for events from the peer_database module. * * @param[in] p_event The event that has happend with peer id and flags. */ static void pdb_evt_handler(pdb_evt_t const * p_event) { ret_code_t err_code; if ((p_event != NULL) && (p_event->evt_id == PDB_EVT_WRITE_BUF_STORED)) { // If new data about peer id has been stored it is compared to other peers peer ids in // search of duplicates. if (p_event->data_id == PM_PEER_DATA_ID_BONDING) { pm_peer_data_flash_t written_data; err_code = pdb_read_buf_get(p_event->peer_id, PM_PEER_DATA_ID_BONDING, &written_data, NULL); if (err_code == NRF_SUCCESS) { pm_peer_id_t compared_peer_id = pdb_next_peer_id_get(PM_PEER_ID_INVALID); while (compared_peer_id != PM_PEER_ID_INVALID) { pm_peer_data_flash_t compared_data; err_code = pdb_read_buf_get(compared_peer_id, PM_PEER_DATA_ID_BONDING, &compared_data, NULL); if ( err_code == NRF_SUCCESS && p_event->peer_id != compared_peer_id && is_duplicate_bonding_data(written_data.p_bonding_data, compared_data.p_bonding_data) ) { im_evt_t im_evt; im_evt.conn_handle = im_conn_handle_get(p_event->peer_id); im_evt.evt_id = IM_EVT_DUPLICATE_ID; im_evt.params.duplicate_id.peer_id_1 = p_event->peer_id; im_evt.params.duplicate_id.peer_id_2 = compared_peer_id; evt_send(&im_evt); } compared_peer_id = pdb_next_peer_id_get(compared_peer_id); } } } } }
/**@brief Event handler for events from the Peer Database module. * This handler is extern in the Peer Database module. * * @param[in] p_pdb_evt The incoming Peer Database event. */ void pm_pdb_evt_handler(pdb_evt_t const * p_pdb_evt) { bool send_evt = true; pm_evt_t pm_evt; memset(&pm_evt, 0, sizeof(pm_evt_t)); pm_evt.peer_id = p_pdb_evt->peer_id; pm_evt.conn_handle = im_conn_handle_get(pm_evt.peer_id); switch (p_pdb_evt->evt_id) { case PDB_EVT_WRITE_BUF_STORED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_SUCCEEDED; pm_evt.params.peer_data_update_succeeded.data_id = p_pdb_evt->data_id; pm_evt.params.peer_data_update_succeeded.action = PM_PEER_DATA_OP_UPDATE; pm_evt.params.peer_data_update_succeeded.token = PM_STORE_TOKEN_INVALID; pm_evt.params.peer_data_update_succeeded.flash_changed = true; break; case PDB_EVT_RAW_STORED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_SUCCEEDED; pm_evt.params.peer_data_update_succeeded.data_id = p_pdb_evt->data_id; pm_evt.params.peer_data_update_succeeded.action = PM_PEER_DATA_OP_UPDATE; pm_evt.params.peer_data_update_succeeded.token = p_pdb_evt->params.raw_stored_evt.store_token; pm_evt.params.peer_data_update_succeeded.flash_changed = true; if ( (m_peer_rank_token != PM_STORE_TOKEN_INVALID) && (m_peer_rank_token == p_pdb_evt->params.raw_stored_evt.store_token)) { m_peer_rank_token = PM_STORE_TOKEN_INVALID; m_highest_ranked_peer = pm_evt.peer_id; pm_evt.params.peer_data_update_succeeded.token = PM_STORE_TOKEN_INVALID; } break; case PDB_EVT_RAW_STORE_FAILED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_FAILED; pm_evt.params.peer_data_update_failed.data_id = p_pdb_evt->data_id; pm_evt.params.peer_data_update_failed.action = PM_PEER_DATA_OP_UPDATE; pm_evt.params.peer_data_update_failed.token = p_pdb_evt->params.error_raw_store_evt.store_token; pm_evt.params.peer_data_update_failed.error = p_pdb_evt->params.error_raw_store_evt.err_code; if ( (m_peer_rank_token != PM_STORE_TOKEN_INVALID) && (m_peer_rank_token == p_pdb_evt->params.raw_stored_evt.store_token)) { m_peer_rank_token = PM_STORE_TOKEN_INVALID; m_current_highest_peer_rank -= 1; pm_evt.params.peer_data_update_succeeded.token = PM_STORE_TOKEN_INVALID; } break; case PDB_EVT_CLEARED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_SUCCEEDED; pm_evt.params.peer_data_update_succeeded.data_id = p_pdb_evt->data_id; pm_evt.params.peer_data_update_succeeded.action = PM_PEER_DATA_OP_DELETE; pm_evt.params.peer_data_update_succeeded.token = PM_STORE_TOKEN_INVALID; break; case PDB_EVT_CLEAR_FAILED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_FAILED; pm_evt.params.peer_data_update_failed.data_id = p_pdb_evt->data_id; pm_evt.params.peer_data_update_failed.action = PM_PEER_DATA_OP_DELETE; pm_evt.params.peer_data_update_failed.error = p_pdb_evt->params.clear_failed_evt.err_code; break; case PDB_EVT_PEER_FREED: pm_evt.evt_id = PM_EVT_PEER_DELETE_SUCCEEDED; // Check that no peers marked for deletion are left. if (m_deleting_all && (pdb_next_peer_id_get(PM_PEER_ID_INVALID) == PM_PEER_ID_INVALID) && (pdb_next_deleted_peer_id_get(PM_PEER_ID_INVALID) == PM_PEER_ID_INVALID)) { // pm_peers_delete() has been called and this is the last peer to be deleted. m_deleting_all = false; pm_evt_t pm_delete_all_evt; memset(&pm_delete_all_evt, 0, sizeof(pm_evt_t)); pm_delete_all_evt.evt_id = PM_EVT_PEERS_DELETE_SUCCEEDED; pm_delete_all_evt.peer_id = PM_PEER_ID_INVALID; pm_delete_all_evt.conn_handle = BLE_CONN_HANDLE_INVALID; evt_send(&pm_delete_all_evt); } break; case PDB_EVT_PEER_FREE_FAILED: pm_evt.evt_id = PM_EVT_PEER_DELETE_FAILED; pm_evt.params.peer_delete_failed.error = p_pdb_evt->params.peer_free_failed_evt.err_code; if (m_deleting_all) { // pm_peers_delete() has been called and has thus failed. m_deleting_all = false; pm_evt_t pm_delete_all_evt; memset(&pm_delete_all_evt, 0, sizeof(pm_evt_t)); pm_delete_all_evt.evt_id = PM_EVT_PEERS_DELETE_FAILED; pm_delete_all_evt.peer_id = PM_PEER_ID_INVALID; pm_delete_all_evt.conn_handle = BLE_CONN_HANDLE_INVALID; pm_delete_all_evt.params.peers_delete_failed_evt.error = p_pdb_evt->params.peer_free_failed_evt.err_code; evt_send(&pm_delete_all_evt); } break; case PDB_EVT_COMPRESSED: send_evt = false; // Do nothing break; case PDB_EVT_ERROR_NO_MEM: pm_evt.evt_id = PM_EVT_STORAGE_FULL; break; case PDB_EVT_ERROR_UNEXPECTED: pm_evt.evt_id = PM_EVT_ERROR_UNEXPECTED; break; default: send_evt = false; break; } if (send_evt) { evt_send(&pm_evt); } }
/**@brief Event handler for events from the GATT Cache Manager module. * This handler is extern in GATT Cache Manager. * * @param[in] p_gcm_evt The incoming GATT Cache Manager event. */ void pm_gcm_evt_handler(gcm_evt_t const * p_gcm_evt) { bool send_evt = true; pm_evt_t pm_evt; memset(&pm_evt, 0, sizeof(pm_evt_t)); pm_evt.peer_id = p_gcm_evt->peer_id; pm_evt.conn_handle = im_conn_handle_get(pm_evt.peer_id); switch (p_gcm_evt->evt_id) { case GCM_EVT_LOCAL_DB_CACHE_STORED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_SUCCEEDED; pm_evt.params.peer_data_update_succeeded.action = PM_PEER_DATA_OP_UPDATE; pm_evt.params.peer_data_update_succeeded.data_id = PM_PEER_DATA_ID_GATT_LOCAL; break; case GCM_EVT_LOCAL_DB_CACHE_UPDATED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_SUCCEEDED; pm_evt.params.peer_data_update_succeeded.action = PM_PEER_DATA_OP_UPDATE; pm_evt.params.peer_data_update_succeeded.data_id = PM_PEER_DATA_ID_GATT_LOCAL; break; case GCM_EVT_LOCAL_DB_CACHE_APPLIED: pm_evt.evt_id = PM_EVT_LOCAL_DB_CACHE_APPLIED; break; case GCM_EVT_ERROR_LOCAL_DB_CACHE_APPLY: pm_evt.evt_id = PM_EVT_LOCAL_DB_CACHE_APPLY_FAILED; break; case GCM_EVT_REMOTE_DB_CACHE_UPDATED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_SUCCEEDED; pm_evt.params.peer_data_update_succeeded.action = PM_PEER_DATA_OP_UPDATE; pm_evt.params.peer_data_update_succeeded.data_id = PM_PEER_DATA_ID_GATT_REMOTE; break; case GCM_EVT_SERVICE_CHANGED_IND_SENT: pm_evt.evt_id = PM_EVT_SERVICE_CHANGED_IND_SENT; break; case GCM_EVT_SERVICE_CHANGED_IND_CONFIRMED: pm_evt.evt_id = PM_EVT_SERVICE_CHANGED_IND_CONFIRMED; break; case GCM_EVT_ERROR_DATA_SIZE: send_evt = false; break; case GCM_EVT_ERROR_STORAGE_FULL: pm_evt.evt_id = PM_EVT_STORAGE_FULL; break; case GCM_EVT_ERROR_UNEXPECTED: pm_evt.evt_id = PM_EVT_ERROR_UNEXPECTED; pm_evt.params.error_unexpected.error = p_gcm_evt->params.error_unexpected.error; pm_evt.conn_handle = p_gcm_evt->params.error_unexpected.conn_handle; break; } if (send_evt) { evt_send(&pm_evt); } }
void pdb_evt_handler(pdb_evt_t const * p_evt) { bool send_evt = true; pm_evt_t pm_evt; memset(&pm_evt, 0, sizeof(pm_evt_t)); pm_evt.peer_id = p_evt->peer_id; pm_evt.conn_handle = im_conn_handle_get(pm_evt.peer_id); switch (p_evt->evt_id) { case PDB_EVT_WRITE_BUF_STORED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATED; pm_evt.params.peer_data_updated_evt.data_id = p_evt->data_id; pm_evt.params.peer_data_updated_evt.action = PM_PEER_DATA_ACTION_UPDATE; break; case PDB_EVT_RAW_STORED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATED; pm_evt.params.peer_data_updated_evt.data_id = p_evt->data_id; pm_evt.params.peer_data_updated_evt.action = PM_PEER_DATA_ACTION_UPDATE; break; case PDB_EVT_RAW_STORE_FAILED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_FAILED; pm_evt.params.peer_data_update_failed_evt.data_id = p_evt->data_id; pm_evt.params.peer_data_update_failed_evt.action = PM_PEER_DATA_ACTION_UPDATE; pm_evt.params.peer_data_update_failed_evt.error = NRF_ERROR_INTERNAL; break; case PDB_EVT_CLEARED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATED; pm_evt.params.peer_data_updated_evt.data_id = p_evt->data_id; pm_evt.params.peer_data_updated_evt.action = PM_PEER_DATA_ACTION_CLEAR; break; case PDB_EVT_CLEAR_FAILED: pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_FAILED; pm_evt.params.peer_data_update_failed_evt.data_id = p_evt->data_id; pm_evt.params.peer_data_update_failed_evt.action = PM_PEER_DATA_ACTION_CLEAR; pm_evt.params.peer_data_update_failed_evt.error = NRF_ERROR_INTERNAL; break; case PDB_EVT_COMPRESSED: send_evt = false; // Do nothing break; case PDB_EVT_ERROR_NO_MEM: pm_evt.evt_id = PM_EVT_STORAGE_FULL; break; case PDB_EVT_ERROR_UNEXPECTED: pm_evt.evt_id = PM_EVT_ERROR_UNEXPECTED; break; default: /* No implementation necessary. */ break; } if (send_evt) { evt_send(&pm_evt); } }
ret_code_t pm_conn_handle_get(pm_peer_id_t peer_id, uint16_t * p_conn_handle) { VERIFY_PARAM_NOT_NULL(p_conn_handle); * p_conn_handle = im_conn_handle_get(peer_id); return NRF_SUCCESS; }