diff --git a/epicardium/ble/ble.c b/epicardium/ble/ble.c index b3e175f1dd1c6f5dea54b5d9bf2ae430c53386de..bfb33db010e1b66505a8fdabbfc78f1df269e9fe 100644 --- a/epicardium/ble/ble.c +++ b/epicardium/ble/ble.c @@ -69,6 +69,7 @@ extern void StackInit(void); extern void bleuart_init(void); extern void bleFileTransfer_init(void); extern void bleCard10_init(void); +extern void bleESS_init(void); extern void BbBleDrvSetTxPower(int8_t power); /*************************************************************************************************/ @@ -432,6 +433,7 @@ void vBleTask(void *pvParameters) bleuart_init(); bleFileTransfer_init(); bleCard10_init(); + bleESS_init(); lasttick = xTaskGetTickCount(); diff --git a/epicardium/ble/ess.c b/epicardium/ble/ess.c new file mode 100644 index 0000000000000000000000000000000000000000..e45766412d19725781546f6aec4ca2947006350e --- /dev/null +++ b/epicardium/ble/ess.c @@ -0,0 +1,124 @@ +#include "wsf_types.h" +#include "util/bstream.h" +#include "wsf_assert.h" +#include "att_api.h" + +#include "epicardium.h" + +#include <stdio.h> +#include <string.h> +#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*/ +static const uint8_t UUID_svc[] = { UINT16_TO_BYTES(ATT_UUID_ENVIRONMENTAL_SENSING_SERVICE) }; +static const uint16_t UUID_svc_len = sizeof(UUID_svc); + +/* BLE UUID for temperature */ +static const uint8_t UUID_char_temperature[] = { + ATT_PROP_READ, + UINT16_TO_BYTES(ESS_TEMPERATURE_VAL_HDL), + UINT16_TO_BYTES(ATT_UUID_TEMPERATURE) +}; + +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); +/* clang-format on */ + +/* + * BLE service description + */ + +static const attsAttr_t ESSSvcAttrList[] = { + { + .pUuid = attPrimSvcUuid, + .pValue = (uint8_t *)UUID_svc, + .pLen = (uint16_t *)&UUID_svc_len, + .maxLen = sizeof(UUID_svc), + .permissions = ATTS_PERMIT_READ, + }, + + // Temperature + { + .pUuid = attChUuid, + .pValue = (uint8_t *)UUID_char_temperature, + .pLen = (uint16_t *)&UUID_char_len, + .maxLen = sizeof(UUID_char_temperature), + .permissions = ATTS_PERMIT_READ, + }, + { + .pUuid = attTemperatureChUuid, + .pValue = initTemperatureValue, + .pLen = &initTemperatureLen, + .maxLen = sizeof(initTemperatureValue), + .settings = ATTS_SET_READ_CBACK, + .permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_ENC | + ATTS_PERMIT_READ_AUTH, + }, +}; + +// validating that the service really has all charateristics +WSF_CT_ASSERT( + ((sizeof(ESSSvcAttrList) / sizeof(ESSSvcAttrList[0])) == + ESS_END_HDL - ESS_START_HDL + 1)); +/* + * BLE ESS read callback. + */ + +static uint8_t readESSCB( + dmConnId_t connId, + uint16_t handle, + uint8_t operation, + uint16_t offset, + attsAttr_t *pAttr +) { + uint16_t i16 = 0; + switch (handle) { + // Temperature + case ESS_TEMPERATURE_VAL_HDL: + //pAttr->pValue[0] = i16 & 0xFF; //pAttr->pValue[1] = i16 >> 8; + *((int16_t *)pAttr->pValue) = i16; + APP_TRACE_INFO1("ble-ess: read temperature: %d\n", i16); + return ATT_SUCCESS; + default: + APP_TRACE_INFO0("ble-card10: read no handler found\n"); + return ATT_ERR_HANDLE; + } +} + +static attsGroup_t svcESSGroup = { + .pNext = NULL, + .pAttr = (attsAttr_t *)ESSSvcAttrList, + .readCback = readESSCB, + .writeCback = NULL, + .startHandle = ESS_START_HDL, + .endHandle = ESS_END_HDL, +}; + +/* + * This registers and starts the BLE card10 service. + */ + +void bleESS_init(void) +{ + AttsAddGroup(&svcESSGroup); +} diff --git a/epicardium/ble/meson.build b/epicardium/ble/meson.build index 7da7925fc1a6c9a59d360881838f71a187bbea21..c2f10a12a8976cec3f049d9d8ca4617ef0cb70f9 100644 --- a/epicardium/ble/meson.build +++ b/epicardium/ble/meson.build @@ -10,5 +10,6 @@ ble_sources = files( 'bondings.c', 'uart.c', 'card10.c', + 'ess.c', 'filetransfer.c', )