Hi there,
I am having a hard time with some C pointers to add a new BLE Characteristic.
I would like to have a function that returns a simple characteristic metadata and attribute value, given some parameters:
static void getUnsecureCharacteristic(ble_gatts_char_md_t *char_md, ble_gatts_attr_t *char_value, uint8_t read, uint8_t write, uint8_t notify, uint32_t uuid) { uint32_t err_code; ble_gatts_attr_md_t cccd_md; ble_uuid_t ble_uuid; ble_gatts_attr_md_t attr_md; //Memset needs pointer, no need to dereference it here memset(char_md, 0, sizeof(*char_md)); char_md->char_props.read = read; char_md->char_props.write = write; char_md->char_props.notify = notify; char_md->p_char_user_desc = NULL; char_md->p_char_pf = NULL; char_md->p_user_desc_md = NULL; char_md->p_cccd_md = NULL; char_md->p_sccd_md = NULL; memset(&attr_md, 0, sizeof(attr_md)); ble_srv_cccd_security_mode_t secMode; attr_md.read_perm = secMode.read_perm; attr_md.write_perm = secMode.write_perm; attr_md.vloc = BLE_GATTS_VLOC_STACK; attr_md.rd_auth = 0; attr_md.wr_auth = 0; attr_md.vlen = 0; ble_uuid.type = 0x02; ble_uuid.uuid = uuid; memset(char_value, 0, sizeof(*char_value)); char_value->p_uuid = &ble_uuid; char_value->p_attr_md = &attr_md; char_value->init_len = sizeof(uint8_t); char_value->init_offs = 0; char_value->max_len = sizeof(uint8_t); }
Then I can call my function from outside:
static uint32_t custom_value_char_add(ble_cus_t * p_cus, const ble_cus_init_t * p_cus_init) { uint32_t err_code; ble_gatts_char_md_t char_md; ble_gatts_attr_md_t cccd_md; ble_gatts_attr_t attr_char_value; ble_uuid_t ble_uuid; ble_gatts_attr_md_t attr_md; getUnsecureCharacteristic(&char_md, &attr_char_value, 1, 1, 1, CUSTOM_VALUE_CHAR_UUID); err_code = sd_ble_gatts_characteristic_add(p_cus->service_handle, &char_md, &attr_char_value, &p_cus->custom_value_handles); if (err_code != NRF_SUCCESS) { return err_code; } return NRF_SUCCESS; }
Unfortunately the sd_ble_gatts_characteristic_add functions returns a NRF_ERROR_NOT_SUPPORTED.
If I don't use the external function, the code works properly. This probably means I am doing something wrong with the memory allocation or setting the memory for those structures.
Does something looks suspicious? Thank you!