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

Advertise on one channel at a time - app_timer problem

Hi DevZone

I want to make a little beacon app, that advertises on channel 37 then waits 700 ms, advertises on channel 38, waits 700 and advertises on channel 39. The below is what i have implemented, yet it doesn't work. It seems like the timeout handler is never called and therefor it is never starting advertising.

static void timers_init(void)
{
	uint32_t err_code;
	APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
	
	err_code = app_timer_create(&channel_timer_id, APP_TIMER_MODE_REPEATED, channel_timeout_handler);
	APP_ERROR_CHECK(err_code);	
}

My timeout handler which switches the channel_mode

static void channel_timeout_handler(void *p_context)
{
	SEGGER_RTT_printf(0, "Channel timeout handler %d\n, channel_mode");
	
	if(m_channel_mode == 37)
	{
		m_channel_mode = 38;
	}
	else if(m_channel_mode == 38)
	{
		m_channel_mode = 39;
	}
	else if(m_channel_mode == 39)
	{
		m_channel_mode = 37;
	}
	
	advertising_stop();
	advertising_init(m_channel_mode);
	advertising_start();
}

And here is my advertising_init where i set what channel it advertises on

static void advertising_init(uint8_t channel_mode)
{
	
		SEGGER_RTT_printf(0, "Advertising init\n");
    uint32_t      err_code;
    ble_advdata_t advdata;		
		ble_gap_adv_ch_mask_t ch_mask; // channel mask
		
	
	  uint8_t flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED;
	
		ble_uuid_t adv_uuids[] = 	
		{
				{BLE_CUSTOM_16UUID, 		BLE_UUID_TYPE_BLE}
		};

    // Build and set advertising data.
    memset(&advdata, 0, sizeof(advdata));
    advdata.name_type             = BLE_ADVDATA_NO_NAME;
		advdata.include_appearance		= false;
		advdata.flags 								= flags;
		
    err_code = ble_advdata_set(&advdata, NULL);
    APP_ERROR_CHECK(err_code);
		

		// Prepare the Manufacturer specific data packet
		ble_gap_addr_t gap_addr;
		sd_ble_gap_address_get(&gap_addr);
		ble_advdata_manuf_data_t manuf_data;
		
		manuf_data.company_identifier           = 0x028C; // 0x028C; // NanoLink Aps company ID
		//www.bluetooth.org/.../company-identifiers
		
		manuf_data.data.p_data									= gap_addr.addr;
		manuf_data.data.size                    = sizeof(gap_addr.addr);
		
    advdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
    advdata.uuids_complete.p_uuids  = adv_uuids;
		
		advdata.p_manuf_specific_data   = &manuf_data;

    err_code = ble_advdata_set(&advdata, NULL);
    APP_ERROR_CHECK(err_code);
	
    // Initialize advertising parameters (used when starting advertising).
    memset(&m_adv_params, 0, sizeof(m_adv_params));	
		
		m_adv_params.type					= BLE_GAP_ADV_TYPE_ADV_NONCONN_IND;
		m_adv_params.p_peer_addr	= NULL;
		m_adv_params.fp					  = BLE_GAP_ADV_FP_ANY;
		m_adv_params.interval			= NON_CONNECTABLE_ADV_INTERVAL;
		m_adv_params.timeout			= 0;
		m_adv_params.p_whitelist	= NULL;
				
		SEGGER_RTT_printf(0, "channel mode %d\n", channel_mode);
		if(channel_mode == 37)
		{
			ch_mask.ch_37_off				 = 0;
			ch_mask.ch_38_off				 = 1;
			ch_mask.ch_39_off 			 = 1;
			m_adv_params.channel_mask = ch_mask;
		}
		else if(channel_mode == 38)
		{
			ch_mask.ch_37_off				 = 1;
			ch_mask.ch_38_off				 = 0;
			ch_mask.ch_39_off 			 = 1;
			m_adv_params.channel_mask = ch_mask;
		}
		else if(channel_mode == 39)
		{
			ch_mask.ch_37_off				 = 0;
			ch_mask.ch_38_off				 = 1;
			ch_mask.ch_39_off 			 = 1;
			m_adv_params.channel_mask = ch_mask;
		}
}

And my main looks like this:

int main(void)
{
	
    uint32_t err_code;
    // Initialize.
//  APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false); // Comment this when channel switching on
		timers_init(); // init timers
		//gap_params_init();
	
    err_code = bsp_init(BSP_INIT_LED, APP_TIMER_TICKS(100, APP_TIMER_PRESCALER), NULL);
    APP_ERROR_CHECK(err_code);
    ble_stack_init();
		//advertising_init(m_channel_mode); // 		

		err_code = app_timer_start(channel_timer_id, CHANNEL_TIMER_INTERVAL, NULL);
		APP_ERROR_CHECK(err_code);

	// Enter main loop.
    for (;; )
    {
        power_manage();
    }
}
Related