This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Scan in a Single Channel

Hi,

As mentioned in this post: devzone.nordicsemi.com/.../

the struct ble_gap_adv_params_t --> ble_gap_adv_ch_mask_t give the option to turn any advertising channel OFF. I tested this approach and could advertise on only one channel.

The problem that I found was in scanning for this packet. When I'm using 3 channels for advertising, the scanning program is ALWAYS able to pick the advertising packet. But when I'm using 1 channel for advertising it misses some. Is there any way to program the scanning so that it only looks on a single channel? Can this problem be due to values of scan interval and scan window (I'm setting them equal to continuously scan)?

In the description of ble_gap_adv_ch_mask_t (infocenter.nordicsemi.com/index.jsp it says "Channel mask for RF channels used in advertising and scanning". But I could only found a place in the ble_gap_adv_params_t to pass it, and ble_gap_scan_params_t doesn't have this field.

So how can we set this feature for scan mode?

Parents
  • Hi FA,

    Scanning with selective channel(s) is not supported yet. I will report internally to fix it in the documentation.

    Thanks for reporting.

    If you want to do scanning on single channel, you may want to have a look at this observer example. We do scanning manually on S110 softdevice using timeslot feature.

    ble_app_proximity - Observer.zip

  • Hi FA,

    Removing softdevice_handler.c maybe not the best idea here. What you should do is to remove the SD_EVT_IRQHandler function. Then create a new function like this:

    void timeslot_sys_event_handler(uint32_t evt)
    {
    
     switch (evt)
        {
          case NRF_EVT_RADIO_SESSION_IDLE:
          case NRF_EVT_RADIO_BLOCKED:
            /* Request a new timeslot */
            ASSERT (btle_scan_enable_set (scan_enable) == BTLE_STATUS_CODE_SUCCESS);
            break;
    
          case NRF_EVT_RADIO_SESSION_CLOSED:
            break;
          
          case NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN:
            ASSERT(false);
            break;
    
          case NRF_EVT_RADIO_CANCELED:
            ASSERT (btle_scan_enable_set (scan_enable) == BTLE_STATUS_CODE_SUCCESS);
            break;
    
          default:
            /* This should not happen */
            __LOG ("%s: Program failure, undefined event = %d", __FUNCTION__, evt);
            ASSERT(false);
        }
    }
    

    Then you can add a call timeslot_sys_event_handler(sys_evt); in sys_evt_dispatch() function so that it will be executed when there is a system event. This way you can merge 2 interrupt handler into one with no problem.

    I'm a little bit sort on time to be able to port ( modifying the code so that it would work on SDK 9.0) the github example code to SDK9.0. I could be able to do it some time next week, but I'm not sure.

Reply
  • Hi FA,

    Removing softdevice_handler.c maybe not the best idea here. What you should do is to remove the SD_EVT_IRQHandler function. Then create a new function like this:

    void timeslot_sys_event_handler(uint32_t evt)
    {
    
     switch (evt)
        {
          case NRF_EVT_RADIO_SESSION_IDLE:
          case NRF_EVT_RADIO_BLOCKED:
            /* Request a new timeslot */
            ASSERT (btle_scan_enable_set (scan_enable) == BTLE_STATUS_CODE_SUCCESS);
            break;
    
          case NRF_EVT_RADIO_SESSION_CLOSED:
            break;
          
          case NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN:
            ASSERT(false);
            break;
    
          case NRF_EVT_RADIO_CANCELED:
            ASSERT (btle_scan_enable_set (scan_enable) == BTLE_STATUS_CODE_SUCCESS);
            break;
    
          default:
            /* This should not happen */
            __LOG ("%s: Program failure, undefined event = %d", __FUNCTION__, evt);
            ASSERT(false);
        }
    }
    

    Then you can add a call timeslot_sys_event_handler(sys_evt); in sys_evt_dispatch() function so that it will be executed when there is a system event. This way you can merge 2 interrupt handler into one with no problem.

    I'm a little bit sort on time to be able to port ( modifying the code so that it would work on SDK 9.0) the github example code to SDK9.0. I could be able to do it some time next week, but I'm not sure.

Children
No Data
Related