Hello
I try to write functions to modify the publish and the subscribe addresses.
Unfortunately not all is working, attached you will find my code.
Problems:
1.pubish set function:
I can't set the address back to 0 (unassigned).
2.subscribe get function
give me sometimes wrong addresses back when the address is not set 0
3. subscribe set function
sometimes i can't set a subscribe address
kind regards
Michael
/**
* get the publish address back
*
* @return publish address
*/
uint16_t common_ble_mesh_init_pub_addr_get(access_model_handle_t model)
{
uint32_t status = NRF_SUCCESS;
dsm_handle_t publish_address;
if(model == NULL) return 0;
status = access_model_publish_address_get(model, &publish_address);
if (status || publish_address == DSM_HANDLE_INVALID)
{
return 0;
}
nrf_mesh_address_t dst_address = {.value = 0};
status = dsm_address_get(publish_address, &dst_address);
if (status)
{
//printf("get pub address error %lu", status);
return 0;
}
return dst_address.value;
}
/**
* get the first subscribe address back
*
* @return subscribe address
*/
uint16_t common_ble_mesh_init_sub_addr_get(access_model_handle_t model)
{
uint32_t status = NRF_SUCCESS;
dsm_handle_t subscribe_address;
uint16_t count = 1;
if(model == NULL) return 0;
status = access_model_subscriptions_get(model, &subscribe_address, &count);
if (status || subscribe_address == DSM_HANDLE_INVALID)
{
return 0;
}
nrf_mesh_address_t dst_address = {.value = 0};
status = dsm_address_get(subscribe_address, &dst_address);
if (status)
{
//printf("get sub address error %lu", status);
return 0;
}
return dst_address.value;
}
/**
* Set the publish address
*
* @param model
* @param publish address
*
*/
void common_ble_mesh_init_pub_addr_set(access_model_handle_t model, uint16_t pub_address)
{
uint32_t err_code = NRF_SUCCESS;
dsm_handle_t publish_address_handle;
if(model == NULL) return;
if(pub_address == 0)
{ // clear address
err_code = access_model_publish_address_get(model, &publish_address_handle);
err_code |= dsm_address_publish_remove(publish_address_handle);
}
else
{ // set address
err_code = dsm_address_publish_add(pub_address, &publish_address_handle);
err_code |= access_model_publish_address_set(model, publish_address_handle);
}
if (err_code)
{
printf("model publish address set error %lu\r\n", err_code);
}
}
/**
* Set the subscribe address
*
* @param model
* @param publish address
*
*/
void common_ble_mesh_init_sub_addr_set(access_model_handle_t model, uint16_t sub_address)
{
uint32_t err_code = NRF_SUCCESS;
uint16_t count = 1;
if(model == NULL) return;
dsm_handle_t subscription_address_handle;
if(sub_address == 0)
{
err_code = access_model_subscriptions_get(model, &subscription_address_handle, &count);
err_code |= access_model_subscription_remove(model, subscription_address_handle);
}
else
{ // remove old address
err_code = access_model_subscriptions_get(model, &subscription_address_handle, &count);
err_code |= access_model_subscription_remove(model, subscription_address_handle);
// Set address
err_code = dsm_address_subscription_add(sub_address, &subscription_address_handle);
err_code |= access_model_subscription_add(model, subscription_address_handle);
}
if (err_code)
{
printf("model publish address set error %lu\r\n", err_code);
}
}