ret_code_t pm_peer_new(pm_peer_id_t * p_new_peer_id, pm_peer_data_bonding_t * p_bonding_data, pm_store_token_t * p_token) { ret_code_t err_code; pm_peer_id_t peer_id; pm_peer_data_flash_t peer_data; VERIFY_MODULE_INITIALIZED(); VERIFY_PARAM_NOT_NULL(p_bonding_data); VERIFY_PARAM_NOT_NULL(p_new_peer_id); memset(&peer_data, 0, sizeof(pm_peer_data_flash_t)); // Search through existing bonds to look for a duplicate. pds_peer_data_iterate_prepare(); // @note emdi: should maybe use a critical section, since data is not copied while iterating. while (pds_peer_data_iterate(PM_PEER_DATA_ID_BONDING, &peer_id, &peer_data)) { if (im_is_duplicate_bonding_data(p_bonding_data, peer_data.p_bonding_data)) { *p_new_peer_id = peer_id; return NRF_SUCCESS; } } // If no duplicate data is found, prepare to write a new bond to flash. *p_new_peer_id = pdb_peer_allocate(); if (*p_new_peer_id == PM_PEER_ID_INVALID) { return NRF_ERROR_NO_MEM; } memset(&peer_data, 0, sizeof(pm_peer_data_flash_t)); peer_data.data_id = PM_PEER_DATA_ID_BONDING; peer_data.p_bonding_data = p_bonding_data; peer_data.length_words = BYTES_TO_WORDS(sizeof(pm_peer_data_bonding_t)); err_code = pdb_raw_store(*p_new_peer_id, &peer_data, p_token); if (err_code != NRF_SUCCESS) { if (im_peer_free(*p_new_peer_id) != NRF_SUCCESS) { return NRF_ERROR_INTERNAL; } // NRF_ERROR_STORAGE_FULL, if no space in flash. // NRF_ERROR_BUSY, if flash filesystem was busy. // NRF_ERROR_INTENRAL, on internal error. return err_code; } return NRF_SUCCESS; }
ret_code_t pm_peer_rank_highest(pm_peer_id_t peer_id) { VERIFY_MODULE_INITIALIZED(); ret_code_t err_code; //lint -save -e65 -e64 pm_peer_data_flash_t peer_data = {.length_words = BYTES_TO_WORDS(sizeof(m_current_highest_peer_rank)), .data_id = PM_PEER_DATA_ID_PEER_RANK, .p_peer_rank = &m_current_highest_peer_rank}; //lint -restore if (!m_peer_rank_initialized) { rank_init(); } if (!m_peer_rank_initialized || (m_peer_rank_token != PM_STORE_TOKEN_INVALID)) { err_code = NRF_ERROR_BUSY; } else { if ((peer_id == m_highest_ranked_peer) && (m_current_highest_peer_rank > 0)) { pm_evt_t pm_evt; // The reported peer is already regarded as highest (provided it has an index at all) err_code = NRF_SUCCESS; memset(&pm_evt, 0, sizeof(pm_evt)); pm_evt.evt_id = PM_EVT_PEER_DATA_UPDATE_SUCCEEDED; pm_evt.conn_handle = im_conn_handle_get(peer_id); pm_evt.peer_id = peer_id; pm_evt.params.peer_data_update_succeeded.data_id = PM_PEER_DATA_ID_PEER_RANK; 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 = false; evt_send(&pm_evt); } else { m_current_highest_peer_rank += 1; err_code = pdb_raw_store(peer_id, &peer_data, &m_peer_rank_token); if (err_code != NRF_SUCCESS) { m_peer_rank_token = PM_STORE_TOKEN_INVALID; m_current_highest_peer_rank -= 1; { if ((err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_STORAGE_FULL)) err_code = NRF_ERROR_INTERNAL; } } } } return err_code; }
ret_code_t pm_peer_data_store(pm_peer_id_t peer_id, pm_peer_data_id_t data_id, void const * p_data, uint16_t length, pm_store_token_t * p_token) { VERIFY_MODULE_INITIALIZED(); VERIFY_PARAM_NOT_NULL(p_data); if (ALIGN_NUM(4, length) != length) { return NRF_ERROR_INVALID_PARAM; } pm_peer_data_flash_t peer_data; memset(&peer_data, 0, sizeof(peer_data)); peer_data.length_words = BYTES_TO_WORDS(length); peer_data.data_id = data_id; peer_data.p_all_data = p_data; return pdb_raw_store(peer_id, &peer_data, p_token); }
ret_code_t pm_peer_data_store(pm_peer_id_t peer_id, pm_peer_data_const_t * p_peer_data, pm_store_token_t * p_token) { return pdb_raw_store(peer_id, p_peer_data, p_token); }