Skip to content

Commit

Permalink
iBeacon support
Browse files Browse the repository at this point in the history
  • Loading branch information
eely22 committed Dec 24, 2016
1 parent 4fa4f3f commit 7a9f23e
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 67 deletions.
2 changes: 2 additions & 0 deletions hal/inc/bluetooth_le_hal.h
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions hal/inc/hal_dynalib_ble.h
Expand Up @@ -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 */
Expand Down
7 changes: 7 additions & 0 deletions hal/src/nrf51/bluetooth_le_hal.c
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions platform/MCU/NRF51/SPARK_Firmware_Driver/inc/hw_config.h
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
143 changes: 77 additions & 66 deletions platform/MCU/NRF51/SPARK_Firmware_Driver/src/hw_config.c
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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()
//{
Expand Down Expand Up @@ -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;
}
Expand Down
3 changes: 3 additions & 0 deletions wiring/inc/spark_wiring_bluetooth_le.h
Expand Up @@ -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);

};

Expand Down
6 changes: 5 additions & 1 deletion wiring/src/spark_wiring_bluetooth_le.cpp
Expand Up @@ -71,4 +71,8 @@ void BLEClass::setConnectionParameters(int minimum, int maximum)
void BLEClass::setGatewayTargetName(char* name)
{
HAL_BLE_Set_Gateway_Target(name);
}
}

void BLEClass::ibeacon(uint32_t major, uint32_t minor, uint8_t *UUID) {
HAL_BLE_Start_iBeacon(major, minor, UUID);
};

0 comments on commit 7a9f23e

Please sign in to comment.