diff --git a/hal/inc/bluetooth_le_hal.h b/hal/inc/bluetooth_le_hal.h index 5574a113..8ba00971 100644 --- a/hal/inc/bluetooth_le_hal.h +++ b/hal/inc/bluetooth_le_hal.h @@ -51,6 +51,8 @@ extern "C" { void HAL_BLE_Set_Adv_Name(char* name); + void HAL_BLE_Start_iBeacon(uint32_t major, uint32_t minor, uint8_t *UUID); + void HAL_BLE_Set_Gateway_Target(char* name); #ifdef __cplusplus diff --git a/hal/inc/hal_dynalib_ble.h b/hal/inc/hal_dynalib_ble.h index ff14398b..84db1a91 100644 --- a/hal/inc/hal_dynalib_ble.h +++ b/hal/inc/hal_dynalib_ble.h @@ -45,6 +45,7 @@ DYNALIB_FN(8, hal_ble,HAL_BLE_Set_TX_Power, void(int power)) DYNALIB_FN(9, hal_ble,HAL_BLE_Set_CONN_PARAMS, void(int minimum, int maximum)) DYNALIB_FN(10, hal_ble,HAL_BLE_Set_Adv_Name, void(char* name)) DYNALIB_FN(11, hal_ble,HAL_BLE_Set_Gateway_Target, void(char* name)) +DYNALIB_FN(12, hal_ble,HAL_BLE_Start_iBeacon, void(uint32_t major, uint32_t minor, uint8_t *UUID)) DYNALIB_END(hal_ble) #endif /* HAL_DYNALIB_BLE_H */ diff --git a/hal/src/nrf51/bluetooth_le_hal.c b/hal/src/nrf51/bluetooth_le_hal.c index 1f40e7f0..b1861985 100644 --- a/hal/src/nrf51/bluetooth_le_hal.c +++ b/hal/src/nrf51/bluetooth_le_hal.c @@ -81,6 +81,13 @@ void HAL_BLE_Set_Adv_Name(char* name) set_advertised_name(name); } +void HAL_BLE_Start_iBeacon(uint32_t major, uint32_t minor, uint8_t *UUID) +{ +#if PLATFORM_ID==103 + start_ibeacon_advertising(major, minor, UUID); +#endif +} + void HAL_BLE_Set_Gateway_Target(char* name) { #if PLATFORM_ID==269 diff --git a/platform/MCU/NRF51/SPARK_Firmware_Driver/inc/hw_config.h b/platform/MCU/NRF51/SPARK_Firmware_Driver/inc/hw_config.h index ea100686..ab7db5b7 100644 --- a/platform/MCU/NRF51/SPARK_Firmware_Driver/inc/hw_config.h +++ b/platform/MCU/NRF51/SPARK_Firmware_Driver/inc/hw_config.h @@ -65,6 +65,7 @@ void scheduler_init(void); void gap_params_init(void); void services_init(void); void advertising_init(void); +void advertising_init_beacon(uint32_t major, uint32_t minor, uint8_t *UUID); void conn_params_init(void); void sec_params_init(void); void advertising_start(void); @@ -98,6 +99,7 @@ uint32_t system_micros(void); void set_cloud_connection_state(bool connected); void wtd_feed(void); void set_advertised_name(char* name); +void start_ibeacon_advertising(uint32_t major, uint32_t minor, uint8_t *UUID); //Flash functions uint16_t FLASH_GetDeviceInt(void); diff --git a/platform/MCU/NRF51/SPARK_Firmware_Driver/src/hw_config.c b/platform/MCU/NRF51/SPARK_Firmware_Driver/src/hw_config.c index e9ef8138..27beb951 100644 --- a/platform/MCU/NRF51/SPARK_Firmware_Driver/src/hw_config.c +++ b/platform/MCU/NRF51/SPARK_Firmware_Driver/src/hw_config.c @@ -414,6 +414,16 @@ void set_advertised_name(char* name) } } +void start_ibeacon_advertising(uint32_t major, uint32_t minor, uint8_t *UUID) +{ + //if we are already advertising, reset to the new name + if (state == BLE_ADVERTISING) { + advertising_stop(); + } + advertising_init_beacon(major, minor, UUID); + advertising_start(); +} + /**@brief Function for the GAP initialization. * * @details This function sets up all the necessary GAP (Generic Access Profile) parameters of the @@ -495,9 +505,11 @@ void send_data(uint8_t *data, uint16_t length) customDataServiceSendData(data, length); } -void setTxPower(int power) +int transmit_power = 0; +void setTxPower(int p) { - sd_ble_gap_tx_power_set(power); + transmit_power = p; + sd_ble_gap_tx_power_set(transmit_power); } void setConnParameters(int minimum, int maximum) @@ -558,6 +570,7 @@ void services_init(void) APP_ERROR_CHECK(err_code); } +ble_gap_adv_params_t m_adv_params; void advertising_init(void) { uint32_t err_code; @@ -579,60 +592,69 @@ void advertising_init(void) err_code = ble_advdata_set(&advdata, &scanrsp); APP_ERROR_CHECK(err_code); + + //set the advertising parameters + memset(&m_adv_params, 0, sizeof(m_adv_params)); + + m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND; + m_adv_params.p_peer_addr = NULL; // Undirected advertisement. + m_adv_params.fp = BLE_GAP_ADV_FP_ANY; + m_adv_params.interval = APP_ADV_INTERVAL; + m_adv_params.timeout = APP_ADV_NO_TIMEOUT; } -//uint8_t APP_BEACON_UUID[16] = {0}; -//void advertising_init_beacon(uint32_t major, uint32_t minor, uint8_t *UUID) -//{ -// uint8_t m_beacon_info[APP_BEACON_INFO_LENGTH]; -// -// m_beacon_info[0] = (uint8_t)APP_DEVICE_TYPE; // Manufacturer specific information. Specifies the device type in this implementation. -// m_beacon_info[1] = (uint8_t)APP_ADV_DATA_LENGTH; // Manufacturer specific information. Specifies the length of the manufacturer specific data in this implementation. -// memcpy(m_beacon_info + 2, UUID, 16); -// m_beacon_info[18] = (uint8_t)(major >> 8); -// m_beacon_info[19] = (uint8_t)(major); -// m_beacon_info[20] = (uint8_t)(minor >> 8); -// m_beacon_info[21] = (uint8_t)(minor); -// m_beacon_info[22] = APP_MEASURED_RSSI; -// -// uint32_t err_code; -// ble_advdata_t advdata; -// ble_advdata_t scanrsp; -// uint8_t flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; -// -// 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; -// 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.size = sizeof(flags); -// advdata.flags.p_data = &flags; -// advdata.p_manuf_specific_data = &manuf_specific_data; -// -// ble_uuid_t adv_uuids[] = {{BLE_SCS_UUID_SERVICE, m_scs.uuid_type}}; -// -// memset(&scanrsp, 0, sizeof(scanrsp)); -// scanrsp.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]); -// scanrsp.uuids_complete.p_uuids = adv_uuids; -// scanrsp.name_type = BLE_ADVDATA_FULL_NAME; -// -// err_code = ble_advdata_set(&advdata, &scanrsp); -// 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_IND; -// m_adv_params.p_peer_addr = NULL; // Undirected advertisement. -// m_adv_params.fp = BLE_GAP_ADV_FP_ANY; -// m_adv_params.interval = BEACON_ADV_INTERVAL; -//} +uint8_t APP_BEACON_UUID[16] = {0}; +void advertising_init_beacon(uint32_t major, uint32_t minor, uint8_t *UUID) +{ + uint8_t m_beacon_info[APP_BEACON_INFO_LENGTH]; + + m_beacon_info[0] = (uint8_t)APP_DEVICE_TYPE; // Manufacturer specific information. Specifies the device type in this implementation. + m_beacon_info[1] = (uint8_t)APP_ADV_DATA_LENGTH; // Manufacturer specific information. Specifies the length of the manufacturer specific data in this implementation. + memcpy(m_beacon_info + 2, UUID, 16); + m_beacon_info[18] = (uint8_t)(major >> 8); + m_beacon_info[19] = (uint8_t)(major); + m_beacon_info[20] = (uint8_t)(minor >> 8); + m_beacon_info[21] = (uint8_t)(minor); + m_beacon_info[22] = APP_MEASURED_RSSI+transmit_power; + + uint32_t err_code; + ble_advdata_t advdata; + ble_advdata_t scanrsp; + uint8_t flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; + + 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; + 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; + + ble_uuid_t adv_uuids[] = {{BLE_SCS_UUID_SERVICE, m_scs.uuid_type}}; + + memset(&scanrsp, 0, sizeof(scanrsp)); + scanrsp.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]); + scanrsp.uuids_complete.p_uuids = adv_uuids; + scanrsp.name_type = BLE_ADVDATA_FULL_NAME; + + err_code = ble_advdata_set(&advdata, &scanrsp); + APP_ERROR_CHECK(err_code); + + //set the advertising parameters + memset(&m_adv_params, 0, sizeof(m_adv_params)); + + m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND; + m_adv_params.p_peer_addr = NULL; // Undirected advertisement. + m_adv_params.fp = BLE_GAP_ADV_FP_ANY; + m_adv_params.interval = BEACON_ADV_INTERVAL; + m_adv_params.timeout = APP_ADV_NO_TIMEOUT; +} // //static void advertising_init_eddystone() //{ @@ -665,18 +687,7 @@ void advertising_start(void) uint32_t err_code; if (state != BLE_ADVERTISING) { - ble_gap_adv_params_t adv_params; - - // Start advertising - memset(&adv_params, 0, sizeof(adv_params)); - - adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND; - adv_params.p_peer_addr = NULL; - adv_params.fp = BLE_GAP_ADV_FP_ANY; - adv_params.interval = APP_ADV_INTERVAL; - adv_params.timeout = APP_ADV_NO_TIMEOUT; - - err_code = sd_ble_gap_adv_start(&adv_params); + err_code = sd_ble_gap_adv_start(&m_adv_params); APP_ERROR_CHECK(err_code); state = BLE_ADVERTISING; } diff --git a/wiring/inc/spark_wiring_bluetooth_le.h b/wiring/inc/spark_wiring_bluetooth_le.h index 5540a3fd..ee6c99f6 100644 --- a/wiring/inc/spark_wiring_bluetooth_le.h +++ b/wiring/inc/spark_wiring_bluetooth_le.h @@ -68,6 +68,9 @@ class BLEClass { //function to set the target name for the gateway to connect to static void setGatewayTargetName(char* name); + + //start iBeacon advertising + static void ibeacon(uint32_t major, uint32_t minor, uint8_t *UUID); }; diff --git a/wiring/src/spark_wiring_bluetooth_le.cpp b/wiring/src/spark_wiring_bluetooth_le.cpp index a53ca632..52bf450d 100644 --- a/wiring/src/spark_wiring_bluetooth_le.cpp +++ b/wiring/src/spark_wiring_bluetooth_le.cpp @@ -71,4 +71,8 @@ void BLEClass::setConnectionParameters(int minimum, int maximum) void BLEClass::setGatewayTargetName(char* name) { HAL_BLE_Set_Gateway_Target(name); -} \ No newline at end of file +} + +void BLEClass::ibeacon(uint32_t major, uint32_t minor, uint8_t *UUID) { + HAL_BLE_Start_iBeacon(major, minor, UUID); +}; \ No newline at end of file