Bluetooth: services: Move Heart rate service
This commit moves the BLE GATT heart rate service from samples/bluetooth/gatt to subsys/bluetooth/services and adds a Kconfig entry to enable and configure the service. Signed-off-by: Joakim Andersson <joakim.andersson@nordicsemi.no>
This commit is contained in:
parent
30d65809fc
commit
029a66a195
23 changed files with 171 additions and 65 deletions
42
include/bluetooth/services/hrs.h
Normal file
42
include/bluetooth/services/hrs.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright (c) 2016 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_HRS_H_
|
||||
#define ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_HRS_H_
|
||||
|
||||
/**
|
||||
* @brief Heart Rate Service (HRS)
|
||||
* @defgroup bt_gatt_hrs Heart Rate Service (HRS)
|
||||
* @ingroup bluetooth
|
||||
* @{
|
||||
*
|
||||
* [Experimental] Users should note that the APIs can change
|
||||
* as a part of ongoing development.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** @brief Notify heart rate measurement.
|
||||
*
|
||||
* This will send a GATT notification to all current subscribers.
|
||||
*
|
||||
* @param heartrate The heartrate measuremennt in beats per minute.
|
||||
*
|
||||
* @return Zero in case of success and error code in case of error.
|
||||
*/
|
||||
int bt_gatt_hrs_notify(u16_t heartrate);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_HRS_H_ */
|
|
@ -1,20 +0,0 @@
|
|||
/** @file
|
||||
* @brief HRS Service sample
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void hrs_init(u8_t blsc);
|
||||
void hrs_notify(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
|
@ -6,7 +6,6 @@ project(peripheral)
|
|||
|
||||
target_sources(app PRIVATE
|
||||
src/main.c
|
||||
../gatt/hrs.c
|
||||
../gatt/cts.c
|
||||
)
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ CONFIG_BT_PERIPHERAL=y
|
|||
CONFIG_BT_GATT_DIS=y
|
||||
CONFIG_BT_ATT_PREPARE_COUNT=5
|
||||
CONFIG_BT_GATT_BAS=y
|
||||
CONFIG_BT_GATT_HRS=y
|
||||
CONFIG_BT_PRIVACY=y
|
||||
CONFIG_BT_DEVICE_NAME="Zephyr Peripheral Sample Long Name"
|
||||
CONFIG_BT_DEVICE_APPEARANCE=833
|
||||
|
|
|
@ -22,8 +22,8 @@
|
|||
#include <bluetooth/uuid.h>
|
||||
#include <bluetooth/gatt.h>
|
||||
#include <bluetooth/services/bas.h>
|
||||
#include <bluetooth/services/hrs.h>
|
||||
|
||||
#include <gatt/hrs.h>
|
||||
#include <gatt/cts.h>
|
||||
|
||||
/* Custom Service Variables */
|
||||
|
@ -254,7 +254,6 @@ static void bt_ready(int err)
|
|||
|
||||
printk("Bluetooth initialized\n");
|
||||
|
||||
hrs_init(0x01);
|
||||
cts_init();
|
||||
|
||||
if (IS_ENABLED(CONFIG_SETTINGS)) {
|
||||
|
@ -307,6 +306,19 @@ static void bas_notify(void)
|
|||
bt_gatt_bas_set_battery_level(battery_level);
|
||||
}
|
||||
|
||||
static void hrs_notify(void)
|
||||
{
|
||||
static u8_t heartrate = 90U;
|
||||
|
||||
/* Heartrate measurements simulation */
|
||||
heartrate++;
|
||||
if (heartrate == 160U) {
|
||||
heartrate = 90U;
|
||||
}
|
||||
|
||||
bt_gatt_hrs_notify(heartrate);
|
||||
}
|
||||
|
||||
void main(void)
|
||||
{
|
||||
int err;
|
||||
|
|
|
@ -8,7 +8,6 @@ project(peripheral_hr)
|
|||
FILE(GLOB app_sources src/*.c)
|
||||
target_sources(app PRIVATE
|
||||
${app_sources}
|
||||
../gatt/hrs.c
|
||||
)
|
||||
|
||||
zephyr_library_include_directories($ENV{ZEPHYR_BASE}/samples/bluetooth)
|
||||
|
|
|
@ -5,5 +5,6 @@ CONFIG_BT_PERIPHERAL=y
|
|||
CONFIG_BT_GATT_DIS=y
|
||||
CONFIG_BT_GATT_DIS_PNP=n
|
||||
CONFIG_BT_GATT_BAS=y
|
||||
CONFIG_BT_GATT_HRS=y
|
||||
CONFIG_BT_DEVICE_NAME="Zephyr Heartrate Sensor"
|
||||
CONFIG_BT_DEVICE_APPEARANCE=833
|
||||
|
|
|
@ -20,8 +20,7 @@
|
|||
#include <bluetooth/uuid.h>
|
||||
#include <bluetooth/gatt.h>
|
||||
#include <bluetooth/services/bas.h>
|
||||
|
||||
#include <gatt/hrs.h>
|
||||
#include <bluetooth/services/hrs.h>
|
||||
|
||||
struct bt_conn *default_conn;
|
||||
|
||||
|
@ -64,8 +63,6 @@ static void bt_ready(int err)
|
|||
|
||||
printk("Bluetooth initialized\n");
|
||||
|
||||
hrs_init(0x01);
|
||||
|
||||
err = bt_le_adv_start(BT_LE_ADV_CONN_NAME, ad, ARRAY_SIZE(ad), NULL, 0);
|
||||
if (err) {
|
||||
printk("Advertising failed to start (err %d)\n", err);
|
||||
|
@ -101,6 +98,19 @@ static void bas_notify(void)
|
|||
bt_gatt_bas_set_battery_level(battery_level);
|
||||
}
|
||||
|
||||
static void hrs_notify(void)
|
||||
{
|
||||
static u8_t heartrate = 90U;
|
||||
|
||||
/* Heartrate measurements simulation */
|
||||
heartrate++;
|
||||
if (heartrate == 160U) {
|
||||
heartrate = 90U;
|
||||
}
|
||||
|
||||
bt_gatt_hrs_notify(heartrate);
|
||||
}
|
||||
|
||||
void main(void)
|
||||
{
|
||||
int err;
|
||||
|
|
|
@ -4,3 +4,5 @@
|
|||
zephyr_sources_ifdef(CONFIG_BT_GATT_DIS dis.c)
|
||||
|
||||
zephyr_sources_ifdef(CONFIG_BT_GATT_BAS bas.c)
|
||||
|
||||
zephyr_sources_ifdef(CONFIG_BT_GATT_HRS hrs.c)
|
||||
|
|
|
@ -13,6 +13,8 @@ source "subsys/bluetooth/services/Kconfig.dis"
|
|||
|
||||
source "subsys/bluetooth/services/Kconfig.bas"
|
||||
|
||||
source "subsys/bluetooth/services/Kconfig.hrs"
|
||||
|
||||
endmenu
|
||||
|
||||
endif #BT_CONN
|
||||
|
|
28
subsys/bluetooth/services/Kconfig.hrs
Normal file
28
subsys/bluetooth/services/Kconfig.hrs
Normal file
|
@ -0,0 +1,28 @@
|
|||
# Kconfig - Bluetooth GATT Heart Rate service
|
||||
#
|
||||
# Copyright (c) 2018 Nordic Semiconductor ASA
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
menuconfig BT_GATT_HRS
|
||||
bool "Enable GATT Heart Rate service"
|
||||
default n
|
||||
|
||||
if BT_GATT_HRS
|
||||
|
||||
config BT_GATT_HRS_LOG_LEVEL
|
||||
int "Heart Rate service log level"
|
||||
depends on LOG
|
||||
range 0 4
|
||||
default 0
|
||||
help
|
||||
Sets log level for the Heart Rate service.
|
||||
Levels are:
|
||||
0 OFF, do not write
|
||||
1 ERROR, only write LOG_ERR
|
||||
2 WARNING, write LOG_WRN in addition to previous level
|
||||
3 INFO, write LOG_INF in addition to previous levels
|
||||
4 DEBUG, write LOG_DBG in addition to previous levels
|
||||
|
||||
endif #BT_GATT_BAS
|
|
@ -12,9 +12,8 @@
|
|||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/printk.h>
|
||||
#include <sys/byteorder.h>
|
||||
#include <zephyr.h>
|
||||
#include <init.h>
|
||||
|
||||
#include <bluetooth/bluetooth.h>
|
||||
#include <bluetooth/hci.h>
|
||||
|
@ -22,15 +21,20 @@
|
|||
#include <bluetooth/uuid.h>
|
||||
#include <bluetooth/gatt.h>
|
||||
|
||||
#define LOG_LEVEL CONFIG_BT_GATT_HRS_LOG_LEVEL
|
||||
#include <logging/log.h>
|
||||
LOG_MODULE_REGISTER(hrs);
|
||||
|
||||
static struct bt_gatt_ccc_cfg hrmc_ccc_cfg[BT_GATT_CCC_MAX] = {};
|
||||
static u8_t simulate_hrm;
|
||||
static u8_t heartrate = 90U;
|
||||
static u8_t hrs_blsc;
|
||||
|
||||
static void hrmc_ccc_cfg_changed(const struct bt_gatt_attr *attr,
|
||||
u16_t value)
|
||||
static void hrmc_ccc_cfg_changed(const struct bt_gatt_attr *attr, u16_t value)
|
||||
{
|
||||
simulate_hrm = (value == BT_GATT_CCC_NOTIFY) ? 1 : 0;
|
||||
ARG_UNUSED(attr);
|
||||
|
||||
bool notif_enabled = (value == BT_GATT_CCC_NOTIFY);
|
||||
|
||||
LOG_INF("HRS notifications %s", notif_enabled ? "enabled" : "disabled");
|
||||
}
|
||||
|
||||
static ssize_t read_blsc(struct bt_conn *conn, const struct bt_gatt_attr *attr,
|
||||
|
@ -52,27 +56,26 @@ BT_GATT_SERVICE_DEFINE(hrs_svc,
|
|||
BT_GATT_PERM_NONE, NULL, NULL, NULL),
|
||||
);
|
||||
|
||||
void hrs_init(u8_t blsc)
|
||||
static int hrs_init(struct device *dev)
|
||||
{
|
||||
hrs_blsc = blsc;
|
||||
ARG_UNUSED(dev);
|
||||
|
||||
hrs_blsc = 0x01;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hrs_notify(void)
|
||||
int bt_gatt_hrs_notify(u16_t heartrate)
|
||||
{
|
||||
int rc;
|
||||
static u8_t hrm[2];
|
||||
|
||||
/* Heartrate measurements simulation */
|
||||
if (!simulate_hrm) {
|
||||
return;
|
||||
}
|
||||
|
||||
heartrate++;
|
||||
if (heartrate == 160U) {
|
||||
heartrate = 90U;
|
||||
}
|
||||
|
||||
hrm[0] = 0x06; /* uint8, sensor contact */
|
||||
hrm[1] = heartrate;
|
||||
|
||||
bt_gatt_notify(NULL, &hrs_svc.attrs[1], &hrm, sizeof(hrm));
|
||||
rc = bt_gatt_notify(NULL, &hrs_svc.attrs[1], &hrm, sizeof(hrm));
|
||||
|
||||
return rc == -ENOTCONN ? 0 : rc;
|
||||
}
|
||||
|
||||
SYS_INIT(hrs_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);
|
|
@ -17,7 +17,6 @@ target_sources(app PRIVATE
|
|||
src/test_empty.c
|
||||
src/test_connect1.c
|
||||
src/test_connect2.c
|
||||
../../../../samples/bluetooth/gatt/hrs.c
|
||||
)
|
||||
|
||||
zephyr_include_directories(
|
||||
|
|
|
@ -6,6 +6,7 @@ CONFIG_BT_PRIVACY=y
|
|||
CONFIG_BT_SMP=y
|
||||
CONFIG_BT_SIGNING=y
|
||||
CONFIG_BT_GATT_BAS=y
|
||||
CONFIG_BT_GATT_HRS=y
|
||||
CONFIG_BT_ATT_PREPARE_COUNT=2
|
||||
CONFIG_BT_GATT_CLIENT=y
|
||||
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
|
||||
|
|
|
@ -6,6 +6,7 @@ CONFIG_BT_PRIVACY=y
|
|||
CONFIG_BT_SMP=y
|
||||
CONFIG_BT_SIGNING=y
|
||||
CONFIG_BT_GATT_BAS=y
|
||||
CONFIG_BT_GATT_HRS=y
|
||||
CONFIG_BT_ATT_PREPARE_COUNT=2
|
||||
CONFIG_BT_GATT_CLIENT=y
|
||||
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
|
||||
|
|
|
@ -23,9 +23,9 @@
|
|||
#include <bluetooth/uuid.h>
|
||||
#include <bluetooth/gatt.h>
|
||||
#include <bluetooth/services/bas.h>
|
||||
#include <sys/byteorder.h>
|
||||
#include <bluetooth/services/hrs.h>
|
||||
|
||||
#include <gatt/hrs.h>
|
||||
#include <sys/byteorder.h>
|
||||
|
||||
static struct bt_conn *default_conn;
|
||||
|
||||
|
@ -108,8 +108,6 @@ static void bt_ready(int err)
|
|||
|
||||
printk("Bluetooth initialized\n");
|
||||
|
||||
hrs_init(0x01);
|
||||
|
||||
err = bt_le_adv_start(BT_LE_ADV_CONN_NAME, ad, ARRAY_SIZE(ad), NULL, 0);
|
||||
if (err) {
|
||||
FAIL("Advertising failed to start (err %d)\n", err);
|
||||
|
@ -132,6 +130,19 @@ static void bas_notify(void)
|
|||
bt_gatt_bas_set_battery_level(battery_level);
|
||||
}
|
||||
|
||||
static void hrs_notify(void)
|
||||
{
|
||||
static u8_t heartrate = 90U;
|
||||
|
||||
/* Heartrate measurements simulation */
|
||||
heartrate++;
|
||||
if (heartrate == 160U) {
|
||||
heartrate = 90U;
|
||||
}
|
||||
|
||||
bt_gatt_hrs_notify(heartrate);
|
||||
}
|
||||
|
||||
static void test_con2_main(void)
|
||||
{
|
||||
static int notify_count;
|
||||
|
|
|
@ -7,4 +7,3 @@ project(bluetooth_shell)
|
|||
zephyr_library_include_directories($ENV{ZEPHYR_BASE}/samples/bluetooth)
|
||||
|
||||
target_sources(app PRIVATE src/main.c)
|
||||
target_sources_ifdef(CONFIG_BT_CONN app PRIVATE src/hrs.c)
|
||||
|
|
|
@ -17,6 +17,7 @@ CONFIG_SHELL=y
|
|||
CONFIG_BT_SHELL=y
|
||||
CONFIG_BT_DEVICE_NAME="test shell"
|
||||
CONFIG_BT_L2CAP_TX_BUF_COUNT=6
|
||||
CONFIG_BT_GATT_HRS=y
|
||||
|
||||
CONFIG_BT_L2CAP_RX_MTU=69
|
||||
CONFIG_BT_L2CAP_TX_MTU=69
|
||||
|
|
|
@ -21,6 +21,7 @@ CONFIG_BT_DEVICE_NAME_DYNAMIC=y
|
|||
CONFIG_BT_L2CAP_TX_BUF_COUNT=4
|
||||
CONFIG_BT_ID_MAX=2
|
||||
CONFIG_BT_GATT_DYNAMIC_DB=y
|
||||
CONFIG_BT_GATT_HRS=y
|
||||
|
||||
CONFIG_BT_SETTINGS=y
|
||||
CONFIG_FLASH=y
|
||||
|
|
|
@ -8,6 +8,7 @@ CONFIG_BT_SMP=y
|
|||
CONFIG_BT_SIGNING=y
|
||||
CONFIG_BT_ATT_PREPARE_COUNT=2
|
||||
CONFIG_BT_GATT_CLIENT=y
|
||||
CONFIG_BT_GATT_HRS=y
|
||||
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
|
||||
CONFIG_BT_TINYCRYPT_ECC=y
|
||||
CONFIG_SHELL=y
|
||||
|
|
|
@ -12,6 +12,7 @@ CONFIG_BT_SMP=y
|
|||
CONFIG_BT_SIGNING=y
|
||||
CONFIG_BT_ATT_PREPARE_COUNT=2
|
||||
CONFIG_BT_GATT_CLIENT=y
|
||||
CONFIG_BT_GATT_HRS=y
|
||||
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
|
||||
CONFIG_BT_TINYCRYPT_ECC=y
|
||||
CONFIG_BT_DEVICE_NAME="test shell"
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
/* Workaround build system bug that will put objects in source dir */
|
||||
#include "../../../../samples/bluetooth/gatt/hrs.c"
|
|
@ -23,11 +23,11 @@
|
|||
|
||||
#include <shell/shell.h>
|
||||
|
||||
#include <gatt/hrs.h>
|
||||
#include <bluetooth/services/hrs.h>
|
||||
|
||||
#define DEVICE_NAME CONFIG_BT_DEVICE_NAME
|
||||
|
||||
#if defined(CONFIG_BT_CONN)
|
||||
#if defined(CONFIG_BT_GATT_HRS)
|
||||
static bool hrs_simulate;
|
||||
|
||||
static int cmd_hrs_simulate(const struct shell *shell,
|
||||
|
@ -38,7 +38,6 @@ static int cmd_hrs_simulate(const struct shell *shell,
|
|||
|
||||
if (!hrs_registered) {
|
||||
shell_print(shell, "Registering HRS Service");
|
||||
hrs_init(0x01);
|
||||
hrs_registered = true;
|
||||
}
|
||||
|
||||
|
@ -55,17 +54,17 @@ static int cmd_hrs_simulate(const struct shell *shell,
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_BT_CONN */
|
||||
#endif /* CONFIG_BT_GATT_HRS */
|
||||
|
||||
#define HELP_NONE "[none]"
|
||||
#define HELP_ADDR_LE "<address: XX:XX:XX:XX:XX:XX> <type: (public|random)>"
|
||||
|
||||
SHELL_STATIC_SUBCMD_SET_CREATE(hrs_cmds,
|
||||
#if defined(CONFIG_BT_CONN)
|
||||
#if defined(CONFIG_BT_GATT_HRS)
|
||||
SHELL_CMD_ARG(hrs-simulate, NULL,
|
||||
"register and simulate Heart Rate Service <value: on, off>",
|
||||
cmd_hrs_simulate, 2, 0),
|
||||
#endif /* CONFIG_BT_CONN */
|
||||
#endif /* CONFIG_BT_GATT_HRS*/
|
||||
SHELL_SUBCMD_SET_END
|
||||
);
|
||||
|
||||
|
@ -79,6 +78,21 @@ static int cmd_hrs(const struct shell *shell, size_t argc, char **argv)
|
|||
SHELL_CMD_ARG_REGISTER(hrs, &hrs_cmds, "Heart Rate Service shell commands",
|
||||
cmd_hrs, 2, 0);
|
||||
|
||||
#if defined(CONFIG_BT_GATT_HRS)
|
||||
static void hrs_notify(void)
|
||||
{
|
||||
static u8_t heartrate = 90U;
|
||||
|
||||
/* Heartrate measurements simulation */
|
||||
heartrate++;
|
||||
if (heartrate == 160U) {
|
||||
heartrate = 90U;
|
||||
}
|
||||
|
||||
bt_gatt_hrs_notify(heartrate);
|
||||
}
|
||||
#endif /* CONFIG_BT_GATT_HRS */
|
||||
|
||||
void main(void)
|
||||
{
|
||||
printk("Type \"help\" for supported commands.");
|
||||
|
@ -88,11 +102,11 @@ void main(void)
|
|||
while (1) {
|
||||
k_sleep(MSEC_PER_SEC);
|
||||
|
||||
#if defined(CONFIG_BT_CONN)
|
||||
#if defined(CONFIG_BT_GATT_HRS)
|
||||
/* Heartrate measurements simulation */
|
||||
if (hrs_simulate) {
|
||||
hrs_notify();
|
||||
}
|
||||
#endif /* CONFIG_BT_CONN */
|
||||
#endif /* CONFIG_BT_GATT_HRS */
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue