Beware that this post is related to an SDK in maintenance mode
More Info: Consider nRF Connect SDK for new designs
This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Changing advertising modes from IDLE to FAST SDK V15.0

I am migrating from SDK v14.2.0 to v15.0.0 and from S132 to S112 (v6) using the NRF52810. I have mostly everything migrated, but a functionality that worked before does not seem to behave correctly now and have not been able to find the root cause.

I am using a whitelist, but if there are no peers, the device is started with:

ble_advertising_start(&m_advertising, BLE_ADV_MODE_IDLE);

and then after a user button press, the device will then switch to advertising without a whitelist:

    ret_code_t err_code;
    
    m_advertising.adv_mode_current = BLE_ADV_MODE_FAST;
    m_advertising.adv_modes_config.ble_adv_fast_timeout = APP_ADV_NOWHITELEST_TIMEOUT_IN_SECONDS;
    
    err_code = ble_advertising_restart_without_whitelist(&m_advertising);
    if (err_code != NRF_ERROR_INVALID_STATE)
    {
        APP_ERROR_CHECK(err_code);
    }

but that results in an error code 7 (NRF_ERROR_INVALID_PARAM).

If the device starts out in BLE_ADV_MODE_FAST, instead of BLE_ADV_MODE_IDLE, calling ble_advertising_restart_without_whitelist(), returns correctly.

Any suggestions?

Thank you.

Parents Reply
  • FormerMember
    0 FormerMember in reply to amorgan

    In ble_advertising_restart_without_whitelist(),  sd_ble_gap_adv_set_configure() returns NRF_ERROR_INVALID_PARAM.

    According to the doumentation, sd_ble_gap_adv_set_configure() returns NRF_ERROR_INVALID_PARAM if:

     - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t.
     - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set.

    Did you remember to disable the whitelist setting in m_advertising.adv_modes_config.ble_adv_whitelist_enabled?

    Could you run the chip in debug mode and compare the settings of m_advertising for a non-working and a working case* ?

    *working case: advertising without whitelist

     

Children
  • thanks for the response.

    It doesn't seem to be related to the whitelist, since I am able to restart without a whitelist if I am in BLE_ADV_MODE_FAST and then call ble_advertising_restart_without_whitelist().

    It seems to be related to going from BLE_ADV_MODE_IDLE to BLE_ADV_MODE_FAST mode.

    If I comment out:

    ret = flags_set(p_advertising, BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
    VERIFY_SUCCESS(ret);

    in ble_advertising_restart_without_whitelist function, I no longer get the issue and it works correctly.

    Full modified function:

    uint32_t ble_advertising_restart_without_whitelist(ble_advertising_t * const p_advertising)
    {
        ret_code_t ret;
    
        (void) sd_ble_gap_adv_stop(p_advertising->adv_handle);
    
        p_advertising->whitelist_temporarily_disabled = true;
        p_advertising->whitelist_in_use               = false;
        p_advertising->adv_params.filter_policy       = BLE_GAP_ADV_FP_ANY;
        // Set correct flags.
        //ret = flags_set(p_advertising, BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
        //VERIFY_SUCCESS(ret);
    
        ret = ble_advertising_start(p_advertising, p_advertising->adv_mode_current);
        if ((ret != NRF_SUCCESS) && (p_advertising->error_handler != NULL))
        {
            p_advertising->error_handler(ret);
        }
    
        return NRF_SUCCESS;
    }

    It is unclear which config is causing the issue or how to resolve this error without modified the Nordic SDK source code, since ble_advertising_start() seems to set the rest of the parameters correctly.

    Have you evaluated the main.c file above using the example I referenced?

    Thank you.

  • FormerMember
    0 FormerMember in reply to amorgan

    It  should not be necessary to comment out flags_set.

    When the advertising mode is BLE_ADV_MODE_FAST, could you upload a snippet of the current advertising parameters, like then one I have added below?

    (I have tested a simple example going from BLE_ADV_MODE_IDLE to BLE_ADV_MODE_FAST and that works. I think it's hard to see just from the code what is wrong, when the problem is invalid parameters, it is better to see what the parameters are.)

  • The file main.c I linked duplicates the issue, which occurs when it is in idle then ble_advertising_restart_without_whitelist is called to switch to fast mode. Would you be able to evaluate this?

    I will send the results of your request when i get back in the office.

  • FormerMember
    0 FormerMember in reply to amorgan

    I cannot see directly from the main.c what is causing the issue. When you have the failing and working parameters avaiable, please upload them here.

  • Sorry for the delay, Attached are the before and after. Note I get the error when ble_advertising_restart_without_whitelist calls flags_set.

    Before update m_advertising coming from IDLE:

    Before updating

    Before ble_advertising_restart_without_whitelist calls flags_set:

    Before flags_set

    After flags_set returns Error (0x07):

    After flags_set

    LLet me know if this helps.

    TThank you.

Related