I need to change, on a time basis, the advertising packet :
Let's say for X seconds it has to work as a "iBeacon"
- BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED
- Advertising interval 100ms
, while for other X seconds as a scannable and connecteble advertising (standard) packet:
- Advertising interval 190 ms
i'm developing starting from the template example with BLE_ADVERTISING_DEF(m_advertising) structure and I'm trying to "integrate"
with the "nRF5_SDK_15.0.0_a53641a\examples\ble_peripheral\ble_app_beacon" example but I'm getting an :
"..<error> app: Fatal error
<warning> app: System reset"
when trying with this piece of code:
static void timer_timeout_handler(void * p_context) { UNUSED_PARAMETER(p_context); ret_code_t err_code; static int flag=1; timerCounter++; if( timerCounter % 3 == 0 ) { if (flag ){ //stop "standard" adv NRF_LOG_INFO(" stopping standard ADV"); err_code = sd_ble_gap_adv_stop(m_advertising.adv_handle); if (err_code != NRF_ERROR_INVALID_STATE) { APP_ERROR_CHECK(err_code); } // change advertising message NRF_LOG_INFO(" init iBeacon "); iBeacon_init(); NRF_LOG_INFO(" starting ibeacon"); iBeacon_start(); flag = 0; } else { NRF_LOG_INFO(" restart standard ADV"); err_code = sd_ble_gap_adv_stop(m_adv_handle); if (err_code != NRF_ERROR_INVALID_STATE) { APP_ERROR_CHECK(err_code); } err_code = ble_advertising_restart_without_whitelist(&m_advertising); if (err_code != NRF_ERROR_INVALID_STATE) { APP_ERROR_CHECK(err_code); } flag =1; } } } static void iBeacon_init(void) { uint32_t err_code; ble_advdata_t advdata; uint8_t flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED; ble_advdata_manuf_data_t manuf_specific_data; manuf_specific_data.company_identifier = APP_COMPANY_IDENTIFIER; #if defined(USE_UICR_FOR_MAJ_MIN_VALUES) // If USE_UICR_FOR_MAJ_MIN_VALUES is defined, the major and minor values will be read from the // UICR instead of using the default values. The major and minor values obtained from the UICR // are encoded into advertising data in big endian order (MSB First). // To set the UICR used by this example to a desired value, write to the address 0x10001080 // using the nrfjprog tool. The command to be used is as follows. // nrfjprog --snr <Segger-chip-Serial-Number> --memwr 0x10001080 --val <your major/minor value> // For example, for a major value and minor value of 0xabcd and 0x0102 respectively, the // the following command should be used. // nrfjprog --snr <Segger-chip-Serial-Number> --memwr 0x10001080 --val 0xabcd0102 uint16_t major_value = ((*(uint32_t *)UICR_ADDRESS) & 0xFFFF0000) >> 16; uint16_t minor_value = ((*(uint32_t *)UICR_ADDRESS) & 0x0000FFFF); uint8_t index = MAJ_VAL_OFFSET_IN_BEACON_INFO; m_beacon_info[index++] = MSB_16(major_value); m_beacon_info[index++] = LSB_16(major_value); m_beacon_info[index++] = MSB_16(minor_value); m_beacon_info[index++] = LSB_16(minor_value); #endif manuf_specific_data.data.p_data = (uint8_t *) m_beacon_info; manuf_specific_data.data.size = APP_BEACON_INFO_LENGTH; // Build and set advertising data. memset(&advdata, 0, sizeof(advdata)); advdata.name_type = BLE_ADVDATA_NO_NAME; advdata.flags = flags; advdata.p_manuf_specific_data = &manuf_specific_data; // Initialize advertising parameters (used when starting advertising). memset(&m_adv_params, 0, sizeof(m_adv_params)); m_adv_params.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED; m_adv_params.p_peer_addr = NULL; // Undirected advertisement. m_adv_params.filter_policy = BLE_GAP_ADV_FP_ANY; m_adv_params.interval = NON_CONNECTABLE_ADV_INTERVAL; m_adv_params.duration = APP_IBCN_DURATION; // Never time out. err_code = ble_advdata_encode(&advdata, m_adv_data.adv_data.p_data, &m_adv_data.adv_data.len); APP_ERROR_CHECK(err_code); err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, &m_adv_params); APP_ERROR_CHECK(err_code); } static void iBeacon_start(void) { ret_code_t err_code; err_code = sd_ble_gap_adv_start(m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK(err_code); err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING); APP_ERROR_CHECK(err_code); }
the application resets on iBeacon_init() in the timer handler.
is it a problem of configuring the right parametrs to the SD API , or something else?
Thx
bye