From 181bea2d78bc9c0a08ea01bea491a601743eaf48 Mon Sep 17 00:00:00 2001 From: schneider <schneider@blinkenlichts.net> Date: Sun, 10 May 2020 15:32:17 +0200 Subject: [PATCH] feat(ess): add notification support for temperature --- epicardium/ble/ble_main.c | 2 ++ epicardium/ble/cccd.h | 1 + epicardium/ble/ess.c | 42 ++++++++++++++++++++++++--------------- epicardium/ble/ess.h | 17 ++++++++++++++++ 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/epicardium/ble/ble_main.c b/epicardium/ble/ble_main.c index a807a3573..4557a322a 100644 --- a/epicardium/ble/ble_main.c +++ b/epicardium/ble/ble_main.c @@ -40,6 +40,7 @@ #include "rscp/rscp_api.h" #include "profiles/gap_api.h" #include "cccd.h" +#include "ess.h" #include "ble_api.h" #include "epicardium.h" @@ -228,6 +229,7 @@ static const attsCccSet_t bleCccSet[BLE_NUM_CCC_IDX] = /* cccd handle value range security level */ {GATT_SC_CH_CCC_HDL, ATT_CLIENT_CFG_INDICATE, DM_SEC_LEVEL_NONE}, /* BLE_GATT_SC_CCC_IDX */ {BATT_LVL_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* BLE_BATT_LVL_CCC_IDX */ + {ESS_TEMP_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* BLE_ESS_TEMP_CCC_IDX */ }; /************************************************************************************************** diff --git a/epicardium/ble/cccd.h b/epicardium/ble/cccd.h index 02574bbdc..9e2907290 100644 --- a/epicardium/ble/cccd.h +++ b/epicardium/ble/cccd.h @@ -4,6 +4,7 @@ enum { BLE_GATT_SC_CCC_IDX, /*! GATT service, service changed characteristic */ BLE_BATT_LVL_CCC_IDX, /*! Battery service, battery level characteristic */ + BLE_ESS_TEMP_CCC_IDX, /*! Environmental sensing service, temperature characteristic */ BLE_NUM_CCC_IDX }; diff --git a/epicardium/ble/ess.c b/epicardium/ble/ess.c index f4f012a45..3ceef2af7 100644 --- a/epicardium/ble/ess.c +++ b/epicardium/ble/ess.c @@ -1,8 +1,11 @@ #include "ess.h" +#include "cccd.h" + #include "wsf_types.h" #include "util/bstream.h" #include "wsf_assert.h" #include "att_api.h" +#include "app_api.h" #include "epicardium.h" @@ -11,21 +14,6 @@ #include <stdbool.h> #include <machine/endian.h> -/*!< \brief Service start handle. */ -#define ESS_START_HDL 0x1000 -/*!< \brief Service end handle. */ -#define ESS_END_HDL (ESS_MAX_HDL - 1) - -enum { - /*!< \brief environmental sensing services service declaration */ - ESS_SVC_HDL = ESS_START_HDL, - /*!< \brief temperature characteristic */ - ESS_TEMPERATURE_CH_HDL, - ESS_TEMPERATURE_VAL_HDL, - /*!< \brief Maximum handle. */ - ESS_MAX_HDL -}; - /* clang-format off */ /* BLE UUID for ESS service*/ @@ -34,7 +22,7 @@ static const uint16_t UUID_svc_len = sizeof(UUID_svc); /* BLE UUID for temperature */ static const uint8_t UUID_char_temperature[] = { - ATT_PROP_READ, + ATT_PROP_READ | ATT_PROP_NOTIFY, UINT16_TO_BYTES(ESS_TEMPERATURE_VAL_HDL), UINT16_TO_BYTES(ATT_UUID_TEMPERATURE) }; @@ -43,6 +31,12 @@ static const uint16_t UUID_char_len = sizeof(UUID_char_temperature); static uint8_t initTemperatureValue[] = { UINT16_TO_BYTES(0) }; static uint16_t initTemperatureLen = sizeof(initTemperatureValue); + +/* Battery level client characteristic configuration */ +static uint8_t essValTempChCcc[] = {UINT16_TO_BYTES(0x0000)}; +static const uint16_t essLenTempChCcc = sizeof(essValTempChCcc); + + /* clang-format on */ /* @@ -75,6 +69,15 @@ static const attsAttr_t ESSSvcAttrList[] = { .permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_ENC | ATTS_PERMIT_READ_AUTH, }, + /* Characteristic CCC descriptor */ + { + .pUuid = attCliChCfgUuid, + .pValue = essValTempChCcc, + .pLen = (uint16_t *) &essLenTempChCcc, + .maxLen = sizeof(essValTempChCcc), + .settings = ATTS_SET_CCC, + .permissions = (ATTS_PERMIT_READ | ATTS_PERMIT_WRITE) // How about security? + }, }; // validating that the service really has all charateristics @@ -124,6 +127,13 @@ void bleESS_update(void) { uint16_t i16 = 0; AttsSetAttr(ESS_TEMPERATURE_VAL_HDL, sizeof(i16), (uint8_t *)&i16); + + dmConnId_t connId = AppConnIsOpen(); + if(connId != DM_CONN_ID_NONE) { + if(AttsCccEnabled(connId, BLE_ESS_TEMP_CCC_IDX)) { + AttsHandleValueNtf(connId, ESS_TEMPERATURE_VAL_HDL, sizeof(i16), (uint8_t *)&i16); + } + } } /* diff --git a/epicardium/ble/ess.h b/epicardium/ble/ess.h index 24b65c94f..d52439891 100644 --- a/epicardium/ble/ess.h +++ b/epicardium/ble/ess.h @@ -1,3 +1,20 @@ #pragma once +/*!< \brief Service start handle. */ +#define ESS_START_HDL 0x1000 +/*!< \brief Service end handle. */ +#define ESS_END_HDL (ESS_MAX_HDL - 1) + +enum { + /*!< \brief environmental sensing services service declaration */ + ESS_SVC_HDL = ESS_START_HDL, + /*!< \brief temperature characteristic */ + ESS_TEMPERATURE_CH_HDL, + ESS_TEMPERATURE_VAL_HDL, + ESS_TEMP_CH_CCC_HDL, /*!< Temperature CCCD */ + /*!< \brief Maximum handle. */ + ESS_MAX_HDL +}; + + void bleESS_update(); -- GitLab