/** **************************************************************************************** * @addtogroup PRF_UTILS * @{ **************************************************************************************** */ /* * INCLUDE FILES **************************************************************************************** */ #include "rwip_config.h" #if (BLE_CLIENT_PRF) #include #include #include "ke_task.h" #include "co_error.h" #include "attm.h" #include "gattc_task.h" #include "prf_utils_128.h" #include "ke_mem.h" #include "gap.h" #include "gapc.h" #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_charinfo[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_descinfo[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