| /** @file |
| * @brief HRS Service sample |
| */ |
| |
| /* |
| * Copyright (c) 2016 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/types.h> |
| #include <stddef.h> |
| #include <string.h> |
| #include <errno.h> |
| #include <zephyr.h> |
| #include <init.h> |
| |
| #include <bluetooth/bluetooth.h> |
| #include <bluetooth/hci.h> |
| #include <bluetooth/conn.h> |
| #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 u8_t hrs_blsc; |
| |
| static void hrmc_ccc_cfg_changed(const struct bt_gatt_attr *attr, u16_t value) |
| { |
| 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, |
| void *buf, u16_t len, u16_t offset) |
| { |
| return bt_gatt_attr_read(conn, attr, buf, len, offset, &hrs_blsc, |
| sizeof(hrs_blsc)); |
| } |
| |
| /* Heart Rate Service Declaration */ |
| BT_GATT_SERVICE_DEFINE(hrs_svc, |
| BT_GATT_PRIMARY_SERVICE(BT_UUID_HRS), |
| BT_GATT_CHARACTERISTIC(BT_UUID_HRS_MEASUREMENT, BT_GATT_CHRC_NOTIFY, |
| BT_GATT_PERM_NONE, NULL, NULL, NULL), |
| BT_GATT_CCC(hrmc_ccc_cfg_changed, |
| BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), |
| BT_GATT_CHARACTERISTIC(BT_UUID_HRS_BODY_SENSOR, BT_GATT_CHRC_READ, |
| BT_GATT_PERM_READ, read_blsc, NULL, NULL), |
| BT_GATT_CHARACTERISTIC(BT_UUID_HRS_CONTROL_POINT, BT_GATT_CHRC_WRITE, |
| BT_GATT_PERM_NONE, NULL, NULL, NULL), |
| ); |
| |
| static int hrs_init(struct device *dev) |
| { |
| ARG_UNUSED(dev); |
| |
| hrs_blsc = 0x01; |
| |
| return 0; |
| } |
| |
| int bt_gatt_hrs_notify(u16_t heartrate) |
| { |
| int rc; |
| static u8_t hrm[2]; |
| |
| hrm[0] = 0x06; /* uint8, sensor contact */ |
| hrm[1] = heartrate; |
| |
| 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); |