Good day
Im trying to switch off an LED when my relay/hopper is not advertising. I switch the LED on successfully when transmission starts but I'm struggling to do the sd_ble_gap_adv_stop check to switch the led off. This is a simple relay/hopper and retransmits the MAC address of a received beacon + its own address. It works very well and I manage to stop the advertising successfully after a tiem out. Just need to switch the LED off.
The scanning part
static void advertising_init(void) // no more than 31 bytes { uint32_t err_code; ble_advdata_t advdata; // no more than 31 bytes 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; manuf_specific_data.data.p_data = (uint8_t *) m_beacon_info; if (g_setAdvData) // if a mac address is received from a beacon build a payload consisting of repeater mac + beacon mac { //mac address of the repeater (this device) added to payload manuf_specific_data.data.p_data [6]=repeater_mac_addr.addr[0]; // Local mac address manuf_specific_data.data.p_data [7]=repeater_mac_addr.addr[1]; // Local mac address manuf_specific_data.data.p_data [8]=repeater_mac_addr.addr[2]; // Local mac address manuf_specific_data.data.p_data [9]=repeater_mac_addr.addr[3]; // Local mac address manuf_specific_data.data.p_data [10]=repeater_mac_addr.addr[4]; // Local mac address manuf_specific_data.data.p_data [11]=repeater_mac_addr.addr[5]; // Local mac address //cant go higher than 22 //mac address of the beacon (received by this device) added to payload manuf_specific_data.data.p_data [12]= Beacon_mac_addr[0]; // Beacon MAC address manuf_specific_data.data.p_data [13]= Beacon_mac_addr[1]; // Beacon MAC address manuf_specific_data.data.p_data [14]= Beacon_mac_addr[2]; // Beacon MAC address manuf_specific_data.data.p_data [15]= Beacon_mac_addr[3]; // Beacon MAC address manuf_specific_data.data.p_data [16]= Beacon_mac_addr[4]; // Beacon MAC address manuf_specific_data.data.p_data [17]= Beacon_mac_addr[5]; // Beacon MAC address g_setAdvData = false; // turn off the set adv data and wait for next mac to come } //shows the manuf payload of ble /*NRF_LOG_RAW_INFO("%02x%02X%02X%02X%02X\n", manuf_specific_data.data.p_data [15], manuf_specific_data.data.p_data [16], manuf_specific_data.data.p_data [17], manuf_specific_data.data.p_data [18], manuf_specific_data.data.p_data [19], manuf_specific_data.data.p_data [20]);*/ NRF_LOG_RAW_INFO("Re-transmitting initial scanner MAC %02x:%02x:%02x:%02x:%02x:%02x ",initial_scanner_mac_addr[5], initial_scanner_mac_addr[4], initial_scanner_mac_addr[3], initial_scanner_mac_addr[2], initial_scanner_mac_addr[1], initial_scanner_mac_addr[0]) NRF_LOG_RAW_INFO("Re-transmitting Beacon found MAC %02x:%02x:%02x:%02x:%02x:%02x\r\n",Beacon_mac_addr[0], Beacon_mac_addr[1], Beacon_mac_addr[2], Beacon_mac_addr[3], Beacon_mac_addr[4], Beacon_mac_addr[5]) nrf_gpio_pin_clear(NRF_GPIO_PIN_MAP(1, 9)); // green led on to show advertising is on the go // nrf_delay_ms(10); // nrf_gpio_pin_set(NRF_GPIO_PIN_MAP(1, 9)); // green led off 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 = 300; // 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); }
end loop while waiting for new data to come in for retransmission. I think this is where I need to switch my " adv in progress LED off"
for (;;) { if ( ) {nrf_gpio_pin_set(NRF_GPIO_PIN_MAP(1, 9));} // green led off if(g_setAdvData) { sd_ble_gap_adv_stop(m_adv_handle); advertising_init(); // load the new data for payload // if put something here to double check its not retransmitting something thats just been relayed, avoid an endless loop // { advertising_start(); // start advertising // } g_setAdvData = false; // turn of get new adv } idle_state_handle(); }
From what I have seen on the forum here https://devzone.nordicsemi.com/f/nordic-q-a/14071/check-if-currently-advertising
in my "if ( ) " statement that is currently blank I need to check for a NRF_Success error code return but have not had any success.
any suggestions will be welcomed? :)