tBleStatus aci_att_find_by_type_value_req(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle, uint8_t* uuid, uint8_t attr_val_len, uint8_t* attr_val) { struct hci_request rq; uint8_t status; att_find_by_type_value_req_cp cp; if(attr_val_len > sizeof(cp.attr_val)) return BLE_STATUS_INVALID_PARAMS; cp.conn_handle = htobs(conn_handle); cp.start_handle = htobs(start_handle); cp.end_handle = htobs(end_handle); Osal_MemCpy(cp.uuid, uuid, 2); cp.attr_val_len = attr_val_len; Osal_MemCpy(cp.attr_val, attr_val, attr_val_len); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_ATT_FIND_BY_TYPE_VALUE_REQ; rq.cparam = &cp; rq.clen = ATT_FIND_BY_TYPE_VALUE_REQ_CP_SIZE + attr_val_len; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gap_resolve_private_address(const tBDAddr private_address, tBDAddr actual_address) { struct hci_request rq; gap_resolve_private_address_cp cp; gap_resolve_private_address_rp rp; Osal_MemCpy(cp.address, private_address, 6); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GAP_RESOLVE_PRIVATE_ADDRESS; rq.cparam = &cp; rq.clen = sizeof(cp); rq.rparam = &rp; rq.rlen = sizeof(rp); if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; if(rp.status) return rp.status; Osal_MemCpy(actual_address, rp.address, sizeof(actual_address)); return 0; }
int hci_le_encrypt(uint8_t key[16], uint8_t plaintextData[16], uint8_t encryptedData[16]) { struct hci_request rq; le_encrypt_cp params; le_encrypt_rp resp; Osal_MemSet(&resp, 0, sizeof(resp)); Osal_MemCpy(params.key, key, 16); Osal_MemCpy(params.plaintext, plaintextData, 16); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_LE_CTL; rq.ocf = OCF_LE_ENCRYPT; rq.cparam = ¶ms; rq.clen = LE_ENCRYPT_CP_SIZE; rq.rparam = &resp; rq.rlen = LE_ENCRYPT_RP_SIZE; if (hci_send_req(&rq, FALSE) < 0){ return BLE_STATUS_TIMEOUT; } if (resp.status) { return resp.status; } Osal_MemCpy(encryptedData, resp.encdata, 16); return 0; }
tBleStatus aci_gatt_include_service(uint16_t service_handle, uint16_t included_start_handle, uint16_t included_end_handle, uint8_t included_uuid_type, const uint8_t* included_uuid, uint16_t *included_handle) { struct hci_request rq; gatt_include_serv_rp resp; uint8_t buffer[23]; uint8_t uuid_len; uint8_t indx = 0; service_handle = htobs(service_handle); Osal_MemCpy(buffer, &service_handle, 2); indx += 2; included_start_handle = htobs(included_start_handle); Osal_MemCpy(buffer+indx, &included_start_handle, 2); indx += 2; included_end_handle = htobs(included_end_handle); Osal_MemCpy(buffer+indx, &included_end_handle, 2); indx += 2; if(included_uuid_type == UUID_TYPE_16){ uuid_len = 2; } else { uuid_len = 16; } buffer[indx] = included_uuid_type; indx++; Osal_MemCpy(buffer + indx, included_uuid, uuid_len); indx += uuid_len; Osal_MemSet(&resp, 0, sizeof(resp)); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_INCLUDE_SERV; rq.cparam = (void *)buffer; rq.clen = indx; rq.rparam = &resp; rq.rlen = GATT_INCLUDE_SERV_RP_SIZE; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; if (resp.status) { return resp.status; } *included_handle = btohs(resp.handle); return 0; }
void printDebugCharac(uint8_t numCharac, uint8_t *charac) { uint8_t i, index, sizeElement, properties; uint16_t value_handle, charac_handle, uuid_charac; APPL_MESG_INFO(profiledbgfile,"**** Number of Charac of a Service: %d\r\n", numCharac); index = 0; for (i=0; i<numCharac; i++) { if (charac[index] == 1) { sizeElement = 8; Osal_MemCpy(&uuid_charac, &charac[index+6], 2); } else { sizeElement = 22; } switch(uuid_charac) { case CURRENT_TIME_CHAR_UUID: APPL_MESG_INFO(profiledbgfile,"**** Current Time Characteristic found\r\n"); break; case LOCAL_TIME_INFORMATION_CHAR_UUID: APPL_MESG_INFO(profiledbgfile,"**** Local Time Information Characteristic found\r\n"); break; case REFERENCE_TIME_INFORMATION_CHAR_UUID: APPL_MESG_INFO(profiledbgfile,"**** Reference Time Information Characteristic found\r\n"); break; case TIME_WITH_DST_CHAR_UUID: APPL_MESG_INFO(profiledbgfile,"**** Time with DST Characteristic found\r\n"); break; case TIME_UPDATE_CONTROL_POINT_CHAR_UUID: APPL_MESG_INFO(profiledbgfile,"**** Time Update COntrol Point Characteristic found\r\n"); break; case TIME_UPDATE_STATE_CHAR_UUID: APPL_MESG_INFO(profiledbgfile,"**** Time Update State Characteristic found\r\n"); break; default: APPL_MESG_INFO(profiledbgfile,"**** Characteristic found\r\n"); break; } Osal_MemCpy(&charac_handle, &charac[index+1], 2); properties = charac[index+3]; Osal_MemCpy(&value_handle, &charac[index+4], 2); APPL_MESG_INFO(profiledbgfile,"**** Characteristic Handle = 0x%04x\r\n", charac_handle); APPL_MESG_INFO(profiledbgfile,"**** Properties = 0x%02x\r\n", properties); APPL_MESG_INFO(profiledbgfile,"**** ValueHandle = 0x%04x\r\n", value_handle); APPL_MESG_INFO(profiledbgfile,"**** UUID = 0x%04x\r\n", uuid_charac); index += sizeElement; } }
tBleStatus aci_gatt_write_response(uint16_t conn_handle, uint16_t attr_handle, uint8_t write_status, uint8_t err_code, uint8_t att_val_len, uint8_t *att_val) { struct hci_request rq; uint8_t status; uint8_t buffer[HCI_MAX_PAYLOAD_SIZE]; uint8_t indx = 0; if ((att_val_len+7) > HCI_MAX_PAYLOAD_SIZE) return BLE_STATUS_INVALID_PARAMS; conn_handle = htobs(conn_handle); Osal_MemCpy(buffer + indx, &conn_handle, 2); indx += 2; attr_handle = htobs(attr_handle); Osal_MemCpy(buffer + indx, &attr_handle, 2); indx += 2; buffer[indx] = write_status; indx += 1; buffer[indx] = err_code; indx += 1; buffer[indx] = att_val_len; indx += 1; Osal_MemCpy(buffer + indx, att_val, att_val_len); indx += att_val_len; Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_WRITE_RESPONSE; rq.cparam = (void *)buffer; rq.clen = indx; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; if (status) { return status; } return 0; }
tBleStatus aci_gatt_set_desc_value(uint16_t servHandle, uint16_t charHandle, uint16_t charDescHandle, uint16_t charDescValOffset, uint8_t charDescValueLen, const uint8_t *charDescValue) { struct hci_request rq; uint8_t status; uint8_t buffer[HCI_MAX_PAYLOAD_SIZE]; uint8_t indx = 0; if ((charDescValueLen+9) > HCI_MAX_PAYLOAD_SIZE) return BLE_STATUS_INVALID_PARAMS; servHandle = htobs(servHandle); Osal_MemCpy(buffer + indx, &servHandle, 2); indx += 2; charHandle = htobs(charHandle); Osal_MemCpy(buffer + indx, &charHandle, 2); indx += 2; charDescHandle = htobs(charDescHandle); Osal_MemCpy(buffer + indx, &charDescHandle, 2); indx += 2; Osal_MemCpy(buffer + indx, &charDescValOffset, 2); indx += 2; buffer[indx] = charDescValueLen; indx++; Osal_MemCpy(buffer + indx, charDescValue, charDescValueLen); indx += charDescValueLen; Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_SET_DESC_VAL; rq.cparam = (void *)buffer; rq.clen = indx; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gatt_disc_charac_by_uuid(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle, uint8_t charUuidType, const uint8_t* charUuid) { struct hci_request rq; uint8_t status; uint8_t buffer[23]; uint8_t uuid_len; uint8_t indx = 0; conn_handle = htobs(conn_handle); Osal_MemCpy(buffer + indx, &conn_handle, 2); indx += 2; start_handle = htobs(start_handle); Osal_MemCpy(buffer + indx, &start_handle, 2); indx += 2; end_handle = htobs(end_handle); Osal_MemCpy(buffer + indx, &end_handle, 2); indx += 2; buffer[indx] = charUuidType; indx++; if(charUuidType == 0x01){ uuid_len = 2; } else { uuid_len = 16; } Osal_MemCpy(buffer + indx, charUuid, uuid_len); indx += uuid_len; Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_DISC_CHARAC_BY_UUID; rq.cparam = (void *)buffer; rq.clen = indx; rq.event = EVT_CMD_STATUS; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gap_start_general_conn_establish_proc_IDB04A1(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, uint8_t own_address_type, uint8_t filter_duplicates, uint8_t use_reconn_addr, const tBDAddr reconn_addr) { struct hci_request rq; gap_start_general_conn_establish_proc_cp_IDB04A1 cp; uint8_t status; cp.scan_type = scan_type; cp.scan_interval = htobs(scan_interval); cp.scan_window = htobs(scan_window); cp.own_address_type = own_address_type; cp.filter_duplicates = filter_duplicates; cp.use_reconn_addr = use_reconn_addr; Osal_MemCpy(cp.reconn_addr, reconn_addr, 6); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GAP_START_GENERAL_CONN_ESTABLISH_PROC; rq.cparam = &cp; rq.clen = sizeof(cp); rq.event = EVT_CMD_STATUS; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gap_set_direct_connectable(uint8_t own_addr_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr) #endif { struct hci_request rq; gap_set_direct_conectable_cp cp; uint8_t status; cp.own_bdaddr_type = own_addr_type; #if BLUENRG_MS cp.directed_adv_type = directed_adv_type; #endif cp.direct_bdaddr_type = initiator_addr_type; Osal_MemCpy(cp.direct_bdaddr, initiator_addr, 6); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GAP_SET_DIRECT_CONNECTABLE; rq.cparam = &cp; rq.clen = sizeof(cp); rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gatt_write_long_charac_val(uint16_t conn_handle, uint16_t attr_handle, uint16_t val_offset, uint8_t val_len, const uint8_t* attr_val) { struct hci_request rq; uint8_t status; gatt_write_long_charac_val_cp cp; if(val_len > sizeof(cp.attr_val)) return BLE_STATUS_INVALID_PARAMS; cp.conn_handle = htobs(conn_handle); cp.attr_handle = htobs(attr_handle); cp.val_offset = htobs(val_offset); cp.val_len = val_len; Osal_MemCpy(cp.attr_val, attr_val, val_len); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_WRITE_LONG_CHARAC_VAL; rq.cparam = &cp; rq.clen = GATT_WRITE_LONG_CHARAC_VAL_CP_SIZE + val_len; rq.event = EVT_CMD_STATUS; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
int hci_read_bd_addr(tBDAddr bdaddr) { struct hci_request rq; read_bd_addr_rp resp; Osal_MemSet(&resp, 0, sizeof(resp)); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_INFO_PARAM; rq.ocf = OCF_READ_BD_ADDR; rq.cparam = NULL; rq.clen = 0; rq.rparam = &resp; rq.rlen = READ_BD_ADDR_RP_SIZE; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; if (resp.status) { return resp.status; } Osal_MemCpy(bdaddr, resp.bdaddr, sizeof(tBDAddr)); return 0; }
int hci_le_set_advertising_parameters(uint16_t min_interval, uint16_t max_interval, uint8_t advtype, uint8_t own_bdaddr_type, uint8_t direct_bdaddr_type, const tBDAddr direct_bdaddr, uint8_t chan_map, uint8_t filter) { struct hci_request rq; le_set_adv_parameters_cp adv_cp; uint8_t status; Osal_MemSet(&adv_cp, 0, sizeof(adv_cp)); adv_cp.min_interval = min_interval; adv_cp.max_interval = max_interval; adv_cp.advtype = advtype; adv_cp.own_bdaddr_type = own_bdaddr_type; adv_cp.direct_bdaddr_type = direct_bdaddr_type; Osal_MemCpy(adv_cp.direct_bdaddr,direct_bdaddr,sizeof(adv_cp.direct_bdaddr)); adv_cp.chan_map = chan_map; adv_cp.filter = filter; Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_LE_CTL; rq.ocf = OCF_LE_SET_ADV_PARAMETERS; rq.cparam = &adv_cp; rq.clen = LE_SET_ADV_PARAMETERS_CP_SIZE; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gatt_disc_prim_service_by_uuid(uint16_t conn_handle, uint8_t uuid_type, uint8_t* uuid) { struct hci_request rq; uint8_t status; gatt_disc_prim_service_by_uuid_cp cp; uint8_t uuid_len; if(uuid_type == UUID_TYPE_16){ uuid_len = 2; } else{ uuid_len = 16; } cp.conn_handle = htobs(conn_handle); cp.uuid_type = uuid_type; Osal_MemCpy(cp.uuid, uuid, uuid_len); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_DISC_PRIM_SERVICE_BY_UUID; rq.cparam = &cp; rq.clen = GATT_DISC_PRIM_SERVICE_BY_UUID_CP_SIZE + uuid_len; rq.event = EVT_CMD_STATUS; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_att_prepare_write_req(uint16_t conn_handle, uint16_t attr_handle, uint16_t value_offset, uint8_t attr_val_len, uint8_t* attr_val) { struct hci_request rq; uint8_t status; att_prepare_write_req_cp cp; if(attr_val_len > sizeof(cp.attr_val)) return BLE_STATUS_INVALID_PARAMS; cp.conn_handle = htobs(conn_handle); cp.attr_handle = htobs(attr_handle); cp.value_offset = htobs(value_offset); cp.attr_val_len = attr_val_len; Osal_MemCpy(cp.attr_val, attr_val, attr_val_len); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_ATT_PREPARE_WRITE_REQ; rq.cparam = &cp; rq.clen = ATT_PREPARE_WRITE_REQ_CP_SIZE + attr_val_len; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_att_read_by_group_type_req(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle, uint8_t uuid_type, uint8_t* uuid) { struct hci_request rq; uint8_t status; att_read_by_group_type_req_cp cp; uint8_t uuid_len; if(uuid_type == UUID_TYPE_16){ uuid_len = 2; } else{ uuid_len = 16; } cp.conn_handle = htobs(conn_handle); cp.start_handle = htobs(start_handle); cp.end_handle = htobs(end_handle); cp.uuid_type = uuid_type; Osal_MemCpy(cp.uuid, uuid, uuid_len); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_ATT_READ_BY_GROUP_TYPE_REQ; rq.cparam = &cp; rq.clen = ATT_READ_BY_GROUP_TYPE_REQ_CP_SIZE + uuid_len; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gatt_signed_write_without_resp(uint16_t conn_handle, uint16_t attr_handle, uint8_t val_len, uint8_t* attr_val) { struct hci_request rq; uint8_t status; gatt_signed_write_without_resp_cp cp; if(val_len > sizeof(cp.attr_val)) return BLE_STATUS_INVALID_PARAMS; cp.conn_handle = htobs(conn_handle); cp.attr_handle = htobs(attr_handle); cp.val_len = val_len; Osal_MemCpy(cp.attr_val, attr_val, val_len); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_SIGNED_WRITE_WITHOUT_RESPONSE; rq.cparam = &cp; rq.clen = GATT_SIGNED_WRITE_WITHOUT_RESPONSE_CP_SIZE + val_len; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gatt_read_handle_value_offset_IDB05A1(uint16_t attr_handle, uint8_t offset, uint16_t data_len, uint16_t *data_len_out_p, uint8_t *data) { struct hci_request rq; gatt_read_handle_val_offset_cp cp; gatt_read_handle_val_offset_rp rp; if(data_len > sizeof(rp.value)) return BLE_STATUS_INVALID_PARAMS; cp.attr_handle = htobs(attr_handle); cp.offset = offset; Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_READ_HANDLE_VALUE_OFFSET; rq.cparam = &cp; rq.clen = sizeof(cp); rq.rparam = &rp; rq.rlen = sizeof(rp); if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; if(rp.status) return rp.status; *data_len_out_p = rp.value_len; Osal_MemCpy(data, rp.value, MIN(data_len, *data_len_out_p)); return 0; }
int hci_le_read_channel_map(uint16_t conn_handle, uint8_t ch_map[5]) { struct hci_request rq; le_read_channel_map_cp params; le_read_channel_map_rp resp; Osal_MemSet(&resp, 0, sizeof(resp)); params.handle = conn_handle; Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_LE_CTL; rq.ocf = OCF_LE_READ_CHANNEL_MAP; rq.cparam = ¶ms; rq.clen = LE_READ_CHANNEL_MAP_CP_SIZE; rq.rparam = &resp; rq.rlen = LE_READ_CHANNEL_MAP_RP_SIZE; if (hci_send_req(&rq, FALSE) < 0){ return BLE_STATUS_TIMEOUT; } if (resp.status) { return resp.status; } Osal_MemCpy(ch_map, resp.map, 5); return 0; }
tBleStatus aci_gap_update_adv_data(uint8_t AdvLen, const uint8_t *AdvData) { struct hci_request rq; uint8_t status; uint8_t buffer[32]; uint8_t indx = 0; if (AdvLen > (sizeof(buffer)-1)) return BLE_STATUS_INVALID_PARAMS; buffer[indx] = AdvLen; indx++; Osal_MemCpy(buffer + indx, AdvData, AdvLen); indx += AdvLen; Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GAP_UPDATE_ADV_DATA; rq.cparam = (void *)buffer; rq.clen = indx; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
int hci_le_read_local_supported_features(uint8_t *features) { struct hci_request rq; le_read_local_supported_features_rp resp; Osal_MemSet(&resp, 0, sizeof(resp)); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_LE_CTL; rq.ocf = OCF_LE_READ_LOCAL_SUPPORTED_FEATURES; rq.rparam = &resp; rq.rlen = LE_READ_LOCAL_SUPPORTED_FEATURES_RP_SIZE; if (hci_send_req(&rq, FALSE) < 0){ return BLE_STATUS_TIMEOUT; } if (resp.status) { return resp.status; } Osal_MemCpy(features, resp.features, sizeof(resp.features)); return 0; }
int hci_le_rand(uint8_t random_number[8]) { struct hci_request rq; le_rand_rp resp; Osal_MemSet(&resp, 0, sizeof(resp)); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_LE_CTL; rq.ocf = OCF_LE_RAND; rq.cparam = NULL; rq.clen = 0; rq.rparam = &resp; rq.rlen = LE_RAND_RP_SIZE; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; if (resp.status) { return resp.status; } Osal_MemCpy(random_number, resp.random, 8); return 0; }
tBleStatus aci_gatt_read_multiple_charac_val(uint16_t conn_handle, uint8_t num_handles, uint8_t* set_of_handles) { struct hci_request rq; uint8_t status; gatt_read_multiple_charac_val_cp cp; if(num_handles*2 > sizeof(cp.set_of_handles)) return BLE_STATUS_INVALID_PARAMS; cp.conn_handle = htobs(conn_handle); cp.num_handles = htobs(num_handles); Osal_MemCpy(cp.set_of_handles, set_of_handles, 2*num_handles); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_READ_MULTIPLE_CHARAC_VAL; rq.cparam = &cp; rq.clen = GATT_READ_MULTIPLE_CHARAC_VAL_CP_SIZE + 2*num_handles; rq.event = EVT_CMD_STATUS; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gatt_read_using_charac_uuid(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle, uint8_t uuid_type, uint8_t* uuid) { struct hci_request rq; uint8_t status; gatt_read_using_charac_uuid_cp cp; uint8_t uuid_len; if(uuid_type == UUID_TYPE_16){ uuid_len = 2; } else{ uuid_len = 16; } cp.conn_handle = htobs(conn_handle); cp.start_handle = htobs(start_handle); cp.end_handle = htobs(end_handle); cp.uuid_type = uuid_type; Osal_MemCpy(cp.uuid, uuid, uuid_len); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_READ_USING_CHARAC_UUID; rq.cparam = &cp; rq.clen = GATT_READ_USING_CHARAC_UUID_CP_SIZE + uuid_len; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gap_start_selective_conn_establish_proc(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, uint8_t own_address_type, uint8_t filter_duplicates, uint8_t num_whitelist_entries, const uint8_t *addr_array) { struct hci_request rq; gap_start_selective_conn_establish_proc_cp cp; uint8_t status; if (((num_whitelist_entries*7)+GAP_START_SELECTIVE_CONN_ESTABLISH_PROC_CP_SIZE) > HCI_MAX_PAYLOAD_SIZE) return BLE_STATUS_INVALID_PARAMS; cp.scan_type = scan_type; cp.scan_interval = htobs(scan_interval); cp.scan_window = htobs(scan_window); cp.own_address_type = own_address_type; cp.filter_duplicates = filter_duplicates; cp.num_whitelist_entries = num_whitelist_entries; Osal_MemCpy(cp.addr_array, addr_array, (num_whitelist_entries*7)); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GAP_START_SELECTIVE_CONN_ESTABLISH_PROC; rq.cparam = &cp; rq.clen = GAP_START_SELECTIVE_CONN_ESTABLISH_PROC_CP_SIZE + (num_whitelist_entries*7); rq.event = EVT_CMD_STATUS; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
void printDebugServices(uint8_t numReporterServices, uint8_t *reporterServices) { uint8_t i , j; uint16_t handle, uuid; uint8_t uuid_array[2]; APPL_MESG_INFO(profiledbgfile,"**** Number of Primary Service: %d\r\n", numReporterServices); j = 0; for (i=0; i<numReporterServices; i++) { if (reporterServices[j] == UUID_TYPE_16) { Osal_MemCpy(&uuid, &reporterServices[j+5], 2); switch (uuid) { case CURRENT_TIME_SERVICE_UUID: PACK_2_BYTE_PARAM16(uuid_array, uuid); notify_uart(uuid_array, sizeof(uuid_array), SERVICE_UUID); APPL_MESG_INFO(profiledbgfile,"**** Current Time UUID found\r\n"); break; case NEXT_DST_CHANGE_SERVICE_UUID: APPL_MESG_INFO(profiledbgfile,"**** Next DST Change UUID found\r\n"); break; case REFERENCE_UPDATE_TIME_SERVICE_UUID: APPL_MESG_INFO(profiledbgfile,"**** Reference Time Update UUID found\r\n"); break; default: APPL_MESG_INFO(profiledbgfile,"**** UUID 0x%04x\r\n", uuid); break; } } j++; Osal_MemCpy(&handle, &reporterServices[j], 2); APPL_MESG_INFO(profiledbgfile,"**** Start Handle = 0x%04x\r\n", handle); j += 2; Osal_MemCpy(&handle, &reporterServices[j], 2); APPL_MESG_INFO(profiledbgfile,"**** End Handle = 0x%04x\r\n", handle); j += 2; if (reporterServices[j-5] == UUID_TYPE_16) { j += 2; } else { j += 16; } } }
tBleStatus aci_gap_set_broadcast_mode(uint16_t adv_interv_min, uint16_t adv_interv_max, uint8_t adv_type, uint8_t own_addr_type, uint8_t adv_data_length, const uint8_t *adv_data, uint8_t num_whitelist_entries, const uint8_t *addr_array) { struct hci_request rq; gap_set_broadcast_mode_cp cp; uint8_t status; uint8_t indx = 0; uint8_t variable_size = 1 + adv_data_length + 1 + num_whitelist_entries*7; if (variable_size > sizeof(cp.var_len_data) ) return BLE_STATUS_INVALID_PARAMS; cp.adv_interv_min = htobs(adv_interv_min); cp.adv_interv_max = htobs(adv_interv_max); cp.adv_type = adv_type; cp.own_addr_type = own_addr_type; cp.var_len_data[indx] = adv_data_length; indx++; Osal_MemCpy(cp.var_len_data + indx, adv_data, adv_data_length); indx += adv_data_length; cp.var_len_data[indx] = num_whitelist_entries; indx ++; Osal_MemCpy(cp.var_len_data + indx, addr_array, num_whitelist_entries*7); Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GAP_SET_BROADCAST_MODE; rq.cparam = &cp; rq.clen = GAP_SET_BROADCAST_MODE_CP_SIZE + variable_size; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
tBleStatus aci_gatt_write_charac_value(uint16_t conn_handle, uint16_t attr_handle, uint8_t value_len, uint8_t *attr_value) { struct hci_request rq; uint8_t status; uint8_t buffer[HCI_MAX_PAYLOAD_SIZE]; uint8_t indx = 0; if ((value_len+5) > HCI_MAX_PAYLOAD_SIZE) return BLE_STATUS_INVALID_PARAMS; conn_handle = htobs(conn_handle); Osal_MemCpy(buffer + indx, &conn_handle, 2); indx += 2; attr_handle = htobs(attr_handle); Osal_MemCpy(buffer + indx, &attr_handle, 2); indx += 2; buffer[indx] = value_len; indx++; Osal_MemCpy(buffer + indx, attr_value, value_len); indx += value_len; Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; rq.ocf = OCF_GATT_WRITE_CHAR_VALUE; rq.cparam = (void *)buffer; rq.clen = indx; rq.event = EVT_CMD_STATUS; rq.rparam = &status; rq.rlen = 1; if (hci_send_req(&rq, FALSE) < 0) return BLE_STATUS_TIMEOUT; return status; }
void hci_send_cmd(uint16_t ogf, uint16_t ocf, uint8_t plen, void *param) { hci_command_hdr hc; hc.opcode = htobs(cmd_opcode_pack(ogf, ocf)); hc.plen= plen; uint8_t header[HCI_HDR_SIZE + HCI_COMMAND_HDR_SIZE]; header[0] = HCI_COMMAND_PKT; Osal_MemCpy(header+1, &hc, sizeof(hc)); hci_write(header, param, sizeof(header), plen); }
void printDebugCharacDesc(uint8_t numCharac, uint8_t *charac) { uint8_t i, index, sizeElement; uint16_t handle_characDesc, uuid_characDesc; APPL_MESG_INFO(profiledbgfile,"**** Number of Charac Descriptor: %d\r\n", numCharac); index = 0; for (i=0; i<numCharac; i++) { if (charac[index] == 1) { sizeElement = 5; Osal_MemCpy(&uuid_characDesc, &charac[index+3], 2); } else { sizeElement = 19; } Osal_MemCpy(&handle_characDesc, &charac[index+1], 2); if (CHAR_PRESENTATION_FORMAT_DESCRIPTOR_UUID) { } switch(uuid_characDesc) { case CHAR_PRESENTATION_FORMAT_DESCRIPTOR_UUID: APPL_MESG_INFO(profiledbgfile,"**** Characteristic Presentation Format Descriptor found\r\n"); break; case CLIENT_CHAR_CONFIG_DESCRIPTOR_UUID: APPL_MESG_INFO(profiledbgfile,"**** Client Characteristic Configuration Descriptor found\r\n"); break; default: APPL_MESG_INFO(profiledbgfile,"**** Characteristic Descriptor found\r\n"); break; } APPL_MESG_INFO(profiledbgfile,"**** Characteristic Descriptor Handle = 0x%04x\r\n", handle_characDesc); APPL_MESG_INFO(profiledbgfile,"**** UUID = 0x%04x\r\n", uuid_characDesc); index += sizeElement; } }