/*----------------------------------------------------------------------------* * NAME * gattSetAdvertParams * * DESCRIPTION * This function is used to set advertisement parameters. * * PARAMETERS * p_addr [in] Bonded host address * fast_connection [in] TRUE: Fast advertisements * FALSE: Slow advertisements * * RETURNS * Nothing *----------------------------------------------------------------------------*/ static void gattSetAdvertParams(TYPED_BD_ADDR_T *p_addr, bool fast_connection) { uint8 advert_data[MAX_ADV_DATA_LEN];/* Advertisement packet */ uint16 length; /* Length of advertisement packet */ /* Advertisement interval, microseconds */ uint32 adv_interval_min; uint32 adv_interval_max; /* Tx power level value prefixed with 'Tx Power' AD Type */ /* Refer to BT4.0 specification, Vol3-part-C-Section-11.1.5 */ uint8 device_tx_power[TX_POWER_VALUE_LENGTH] = { AD_TYPE_TX_POWER }; /* Device appearance */ uint8 device_appearance[ATTR_LEN_DEVICE_APPEARANCE + 1] = { AD_TYPE_APPEARANCE, WORD_LSB(APPEARANCE_APPLICATION_VALUE), WORD_MSB(APPEARANCE_APPLICATION_VALUE) }; /* A variable to keep track of the data added to advert_data. The limit is * MAX_ADV_DATA_LEN. GAP layer will add AD Flags to advert_data which is 3 * bytes. Refer BT Spec 4.0, Vol 3, Part C, Sec 11.1.3: * * First byte is length * second byte is AD TYPE = 0x1 * Third byte is Flags description */ uint16 length_added_to_adv = 3; if(fast_connection) { adv_interval_min = FC_ADVERTISING_INTERVAL_MIN; adv_interval_max = FC_ADVERTISING_INTERVAL_MAX; } if((GapSetMode(gap_role_peripheral, gap_mode_discover_general, gap_mode_connect_undirected, gap_mode_bond_yes, gap_mode_security_unauthenticate) != ls_err_none) || (GapSetAdvInterval(adv_interval_min, adv_interval_max) != ls_err_none)) { ReportPanic(app_panic_set_advert_params); } /* Add bonded device to white list.*/ if(IsWhiteListEnabled()) { /* Initial case when advertisements are started for Bonded host for * 10 seconds. White list is configured with the Bonded host address */ if(LsAddWhiteListDevice(p_addr)!= ls_err_none) { ReportPanic(app_panic_add_whitelist); } } /* Reset existing advertising data */ if(LsStoreAdvScanData(0, NULL, ad_src_advertise) != ls_err_none) { ReportPanic(app_panic_set_advert_data); } /* Reset existing scan response data */ if(LsStoreAdvScanData(0, NULL, ad_src_scan_rsp) != ls_err_none) { ReportPanic(app_panic_set_scan_rsp_data); } /* Setup ADVERTISEMENT DATA */ /* Add UUID list of the services supported by the device */ length = GetSupportedUUIDServiceList(advert_data); /* One added for Length field, which will be added to Adv Data by GAP * layer */ length_added_to_adv += (length + 1); if (LsStoreAdvScanData(length, advert_data, ad_src_advertise) != ls_err_none) { ReportPanic(app_panic_set_advert_data); } /* One added for Length field, which will be added to Adv Data by GAP * layer */ length_added_to_adv += (sizeof(device_appearance) + 1); /* Add device appearance to the advertisements */ if (LsStoreAdvScanData(ATTR_LEN_DEVICE_APPEARANCE + 1, device_appearance, ad_src_advertise) != ls_err_none) { ReportPanic(app_panic_set_advert_data); } /* Change the Radio and Adv tx params for CONFIG mode */ /* Update the radio tx power level here */ LsSetTransmitPowerLevel(RADIO_TX_POWER_CONFIG); /* Update the adv tx power level here */ device_tx_power[TX_POWER_VALUE_LENGTH - 1] = ADV_TX_POWER_CONFIG; /* NOTE: The 2 tx params above are reset to the tx_power_mode on disconnection */ /* One added for Length field, it will be added to Adv Data by GAP layer */ length_added_to_adv += (TX_POWER_VALUE_LENGTH + 1); /* Add tx power value of device to the advertising data */ if (LsStoreAdvScanData(TX_POWER_VALUE_LENGTH, device_tx_power, ad_src_advertise) != ls_err_none) { ReportPanic(app_panic_set_advert_data); } addDeviceNameToAdvData(length_added_to_adv, 0); }
static void gattSetAdvertParams(bool fast_connection) { uint8 advert_data[MAX_ADV_DATA_LEN]; uint16 length; uint32 adv_interval_min = RP_ADVERTISING_INTERVAL_MIN; uint32 adv_interval_max = RP_ADVERTISING_INTERVAL_MAX; int8 tx_power_level = 0xff; /* Signed value */ /* Tx power level value prefixed with 'Tx Power' AD Type */ uint8 device_tx_power[TX_POWER_VALUE_LENGTH] = { AD_TYPE_TX_POWER }; uint8 device_appearance[ATTR_LEN_DEVICE_APPEARANCE + 1] = { AD_TYPE_APPEARANCE, LE8_L(APPEARANCE_HR_SENSOR_VALUE), LE8_H(APPEARANCE_HR_SENSOR_VALUE) }; /* A variable to keep track of the data added to AdvData. The limit is * MAX_ADV_DATA_LEN. GAP layer will add AD Flags to AdvData which * is 3 bytes. Refer BT Spec 4.0, Vol 3, Part C, Sec 11.1.3. */ uint16 length_added_to_adv = 3; if(fast_connection) { adv_interval_min = FC_ADVERTISING_INTERVAL_MIN; adv_interval_max = FC_ADVERTISING_INTERVAL_MAX; } /* In a Public Environment like Gym, there is a requirement for HR Sensor * to communicate with fitness machines even without having a bond. So, * for HR Sensor application we will not enforce bonding by calling SM * Slave Security Request. Though, we will set HR Sensor's security * capabilities to 'gap_mode_bond_yes' so that we accept bonding if the * collector (like Watch or Cell Phone) would like to bond. */ if((GapSetMode(gap_role_peripheral, gap_mode_discover_general, gap_mode_connect_undirected, gap_mode_bond_yes, gap_mode_security_unauthenticate) != ls_err_none) || (GapSetAdvInterval(adv_interval_min, adv_interval_max) != ls_err_none)) { ReportPanic(app_panic_set_advert_params); } /* Add bonded device to white list.*/ if((g_hr_data.enable_white_list == TRUE)) { /* Initial case when advertisements are started for Bonded host for * 10 seconds. White list is configured with the Bonded host address */ if(LsAddWhiteListDevice(&g_hr_data.bonded_bd_addr)!= ls_err_none) { ReportPanic(app_panic_add_whitelist); } } /* Reset existing advertising data */ if(LsStoreAdvScanData(0, NULL, ad_src_advertise) != ls_err_none) { ReportPanic(app_panic_set_advert_data); } /* Reset existing scan response data */ if(LsStoreAdvScanData(0, NULL, ad_src_scan_rsp) != ls_err_none) { ReportPanic(app_panic_set_scan_rsp_data); } /* Setup ADVERTISEMENT DATA */ /* Add UUID list of the services supported by the device */ length = GetSupported16BitUUIDServiceList(advert_data); /* One added for Length field, which will be added to Adv Data by GAP * layer */ length_added_to_adv += (length + 1); if (LsStoreAdvScanData(length, advert_data, ad_src_advertise) != ls_err_none) { ReportPanic(app_panic_set_advert_data); } /* One added for Length field, which will be added to Adv Data by GAP * layer */ length_added_to_adv += (sizeof(device_appearance) + 1); /* Add device appearance to the advertisements */ if (LsStoreAdvScanData(ATTR_LEN_DEVICE_APPEARANCE + 1, device_appearance, ad_src_advertise) != ls_err_none) { ReportPanic(app_panic_set_advert_data); } /* Read tx power of the chip */ if(LsReadTransmitPowerLevel(&tx_power_level) != ls_err_none) { /* Reading tx power failed */ ReportPanic(app_panic_read_tx_pwr_level); } /* Add the read tx power level to device_tx_power * Tx power level value is of 1 byte */ device_tx_power[TX_POWER_VALUE_LENGTH - 1] = (uint8 )tx_power_level; /* One added for Length field, which will be added to Adv Data by GAP * layer */ length_added_to_adv += (TX_POWER_VALUE_LENGTH + 1); /* Add tx power value of device to the advertising data */ if (LsStoreAdvScanData(TX_POWER_VALUE_LENGTH, device_tx_power, ad_src_advertise) != ls_err_none) { ReportPanic(app_panic_set_advert_data); } addDeviceNameToAdvData(length_added_to_adv, 0); }