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
  • Hi!

    That sounds strange.

    Is is possible for you to upload your code? So that I can get a better overview of what is going on.

    If your code contains any sensitive information and you don't want to upload your code to the public forum, it is possible to turn the case private first.

    Best regards,
    Joakim.

  • 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

     

  • 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.

Reply
  • 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.

Children
  • 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.

  • static void sleep_mode_enter(void)
    {
        ret_code_t err_code;
        
        m_advertising.adv_mode_current = BLE_ADV_MODE_FAST;
        m_advertising.adv_params.duration = 10000;
        m_advertising.adv_params.interval = APP_ADV_INTERVAL;
    
        err_code = ble_advertising_restart_without_whitelist(&m_advertising);
        if (err_code != NRF_ERROR_INVALID_STATE)
        {
            APP_ERROR_CHECK(err_code);
        }
    }

    Hi amorgan, try the code above instead. You were setting configs that are only being read during ble_advertising_init().

    On a related note, if you are not using whitelist, you should never have to call ble_advertising_restart...

    instead you can just call ble_advertising_start(&m_advertising,APP_ADV_MODE_FAST) when you get the idle event.

    Good luck!

Related