diff --git a/epicardium/ble/ble_main.c b/epicardium/ble/ble_main.c index a807a35731e7f16b1603b99bd43dd3fc3b71b468..4557a322a74afc493329cd6dd67388d8371ccc16 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 02574bbdc9d0316eeff03ce3a1c19b1b0f09c94c..9e2907290f0aa0256d969ee7fbb7bdefcadf1ad6 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 f4f012a45f4ef416f41cec26e1dfd426c8f37f5e..3ceef2af7b530b6cf68577a76f5626b3e3d9f13a 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 24b65c94f94356727e77a2699099df9d06c803be..d52439891ebbd5f9d7790e63e3c38ac678b68032 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();