/** **************************************************************************************** * @addtogroup PRF_UTILS * @{ **************************************************************************************** */ /* * INCLUDE FILES **************************************************************************************** */ #include "rwip_config.h" #if (BLE_CLIENT_PRF) #include "attm.h" #include "co_error.h" #include "gap.h" #include "gapc.h" #include "gattc_task.h" #include "ke_mem.h" #include "ke_task.h" #include "prf_utils_128.h" #include #include #endif //(BLE_CLIENT_PRF) #if (BLE_CLIENT_PRF) void prf_disc_svc_send_128(prf_env_t *prf_env, uint8_t conidx, uint8_t *uuid_128) { // send GATT discover primary services by UUID request: find by type request struct gattc_disc_cmd *svc_req = KE_MSG_ALLOC_DYN( GATTC_SDP_SVC_DISC_CMD, KE_BUILD_ID(TASK_GATTC, conidx), prf_src_task_get(prf_env, conidx), gattc_disc_cmd, ATT_UUID_128_LEN); // gatt request type: by UUID svc_req->operation = GATTC_SDP_DISC_SVC; // start handle; svc_req->start_hdl = ATT_1ST_REQ_START_HDL; // end handle svc_req->end_hdl = ATT_1ST_REQ_END_HDL; // UUID search svc_req->uuid_len = ATT_UUID_128_LEN; // set 128 bit UUID for searching memcpy(&svc_req->uuid[0], uuid_128, (sizeof(uint8_t) * ATT_UUID_128_LEN)); // send the message to GATT, which will send back the response when it gets it ke_msg_send(svc_req); } uint8_t prf_check_svc_char_validity_128(uint8_t nb_chars, const struct prf_char_inf *chars, const struct prf_char_def_128 *chars_req) { uint8_t status = GAP_ERR_NO_ERROR; uint8_t i; for (i = 0; ((i < nb_chars) && (status == GAP_ERR_NO_ERROR)); i++) { if (chars[i].char_hdl == ATT_INVALID_HANDLE) { // If Characteristic is not present, check requirements if (chars_req[i].req_flag == ATT_MANDATORY) { status = PRF_ERR_STOP_DISC_CHAR_MISSING; } } else { // If Characteristic is present, check properties if ((chars[i].prop & chars_req[i].prop_mand) != chars_req[i].prop_mand) { status = PRF_ERR_STOP_DISC_WRONG_CHAR_PROP; } } } return status; } void prf_extract_svc_info_128(const struct gattc_sdp_svc_ind *param, uint8_t nb_chars, const struct prf_char_def_128 *chars_req, struct prf_char_inf *chars, uint8_t nb_descs, const struct prf_char_desc_def *descs_req, struct prf_char_desc_inf *descs) { // Counters uint8_t svc_char; uint8_t svc_desc; uint8_t fnd_att; for (fnd_att = 0; fnd_att < (param->end_hdl - param->start_hdl); fnd_att++) { if (param->info[fnd_att].att_type == GATTC_SDP_ATT_CHAR) { uint16_t char_hdl = param->start_hdl + 1 + fnd_att; uint16_t val_hdl = param->info[fnd_att].att_char.handle; uint8_t val_prop = param->info[fnd_att].att_char.prop; uint8_t char_idx = fnd_att; // check that value handle is in a valid range if ((val_hdl <= param->end_hdl) && (val_hdl > (param->start_hdl + fnd_att))) { // retrieve value index uint8_t val_idx = (val_hdl - param->start_hdl - 1); // Look over requested characteristics for (svc_char = 0; svc_char < nb_chars; svc_char++) { // check if attribute is valid if ((chars[svc_char].char_hdl == ATT_INVALID_HDL) && attm_uuid_comp( (uint8_t *)param->info[val_idx].att.uuid, ATT_UUID_128_LEN, (uint8_t *)chars_req[svc_char].uuid, ATT_UUID_128_LEN)) { // Save properties and handles chars[svc_char].char_hdl = char_hdl; chars[svc_char].val_hdl = val_hdl; chars[svc_char].prop = val_prop; // find end of characteristic handle and discover descriptors do { fnd_att++; // found a descriptor if (param->info[fnd_att].att_type == GATTC_SDP_ATT_DESC) { // Retrieve characteristic descriptor handle using UUID for (svc_desc = 0; svc_desc < nb_descs; svc_desc++) { // check if it's expected descriptor if ((descs[svc_desc].desc_hdl == ATT_INVALID_HANDLE) && (descs_req[svc_desc].char_code == svc_char) && (attm_uuid16_comp( (uint8_t *)param->info[fnd_att].att.uuid, param->info[fnd_att].att.uuid_len, descs_req[svc_desc].uuid))) { descs[svc_desc].desc_hdl = param->start_hdl + 1 + fnd_att; // search for next descriptor break; } } } } while (((param->start_hdl + 1 + fnd_att) <= param->end_hdl) && (param->info[fnd_att].att_type != GATTC_SDP_ATT_CHAR) && (param->info[fnd_att].att_type != GATTC_SDP_INC_SVC)); // return to previous valid value fnd_att--; // previous handle was end of the characteristic chars[svc_char].char_ehdl_off = fnd_att - char_idx; // search next characteristic break; } } } } } } #endif /*(BLE_SAMPLE128_CLIENT) */ /// @} PRF_UTILS