From 80e3b8f2cb5349b6c07f3952ec94d440c0e2d3ba Mon Sep 17 00:00:00 2001 From: schneider <schneider@blinkenlichts.net> Date: Sat, 5 Dec 2020 16:16:20 +0100 Subject: [PATCH] feat(ess): Send notifications when doing single read --- epicardium/ble/ess.c | 126 ++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 60 deletions(-) diff --git a/epicardium/ble/ess.c b/epicardium/ble/ess.c index 4f880a7a0..9a8c8153d 100644 --- a/epicardium/ble/ess.c +++ b/epicardium/ble/ess.c @@ -173,6 +173,45 @@ WSF_CT_ASSERT( ((sizeof(ESSSvcAttrList) / sizeof(ESSSvcAttrList[0])) == ESS_END_HDL - ESS_START_HDL + 1)); +static void +sendNotification(dmConnId_t connId, uint16_t handle, uint16_t cccidx) +{ + if (connId != DM_CONN_ID_NONE) { + uint16_t len; + uint8_t *value; + uint8_t ret = AttsGetAttr(handle, &len, &value); + if (ret == ATT_SUCCESS) { + if (AttsCccEnabled(connId, cccidx)) { + AttsHandleValueNtf(connId, handle, len, value); + } + } + } +} + +static void setAttrFromBME680(struct bme680_sensor_data *data) +{ + int16_t temperature; + uint16_t humidity; + uint32_t pressure; + + temperature = data->temperature * 100; + AttsSetAttr( + ESS_TEMPERATURE_VAL_HDL, + sizeof(temperature), + (uint8_t *)&temperature + ); + + humidity = data->humidity * 100; + AttsSetAttr( + ESS_HUMIDITY_VAL_HDL, sizeof(humidity), (uint8_t *)&humidity + ); + + pressure = data->pressure * 1000; + AttsSetAttr( + ESS_PRESSURE_VAL_HDL, sizeof(pressure), (uint8_t *)&pressure + ); +} + /* * BLE ESS read callback. * @@ -184,40 +223,39 @@ static uint8_t readESSCB( uint16_t offset, attsAttr_t *pAttr ) { - int16_t temperature; - uint16_t humidity; - uint32_t pressure; struct bme680_sensor_data data; int ret = epic_bme680_read_sensors(&data); if (ret != 0) { return ATT_ERR_UNDEFINED; } + setAttrFromBME680(&data); + /* Send notifications (if enabled) for the _other_ characteristics. */ switch (handle) { case ESS_TEMPERATURE_VAL_HDL: - temperature = data.temperature * 100; - AttsSetAttr( - ESS_TEMPERATURE_VAL_HDL, - sizeof(temperature), - (uint8_t *)&temperature + sendNotification( + connId, ESS_HUMIDITY_VAL_HDL, BLE_ESS_HUMI_CCC_IDX + ); + sendNotification( + connId, ESS_PRESSURE_VAL_HDL, BLE_ESS_PRES_CCC_IDX ); APP_TRACE_INFO1("ble-ess: read temperature: %d\n", temperature); return ATT_SUCCESS; case ESS_HUMIDITY_VAL_HDL: - humidity = data.humidity * 100; - AttsSetAttr( - ESS_HUMIDITY_VAL_HDL, - sizeof(humidity), - (uint8_t *)&humidity + sendNotification( + connId, ESS_TEMPERATURE_VAL_HDL, BLE_ESS_TEMP_CCC_IDX + ); + sendNotification( + connId, ESS_PRESSURE_VAL_HDL, BLE_ESS_PRES_CCC_IDX ); APP_TRACE_INFO1("ble-ess: read humidity: %u\n", humidity); return ATT_SUCCESS; case ESS_PRESSURE_VAL_HDL: - pressure = data.pressure * 1000; - AttsSetAttr( - ESS_PRESSURE_VAL_HDL, - sizeof(pressure), - (uint8_t *)&pressure + sendNotification( + connId, ESS_TEMPERATURE_VAL_HDL, BLE_ESS_TEMP_CCC_IDX + ); + sendNotification( + connId, ESS_HUMIDITY_VAL_HDL, BLE_ESS_HUMI_CCC_IDX ); APP_TRACE_INFO1("ble-ess: read pressure: %u\n", pressure); return ATT_SUCCESS; @@ -238,50 +276,18 @@ static attsGroup_t svcESSGroup = { void bleESS_update(void) { - int16_t temperature = 0; - AttsSetAttr( - ESS_TEMPERATURE_VAL_HDL, - sizeof(temperature), - (uint8_t *)&temperature - ); - - uint16_t humidity = 0; - AttsSetAttr( - ESS_HUMIDITY_VAL_HDL, sizeof(humidity), (uint8_t *)&humidity - ); - - uint32_t pressure = 0; - AttsSetAttr( - ESS_PRESSURE_VAL_HDL, sizeof(pressure), (uint8_t *)&pressure - ); + struct bme680_sensor_data data; + int ret = epic_bme680_read_sensors(&data); + if (ret != 0) { + return; + } + setAttrFromBME680(&data); + /* Send notifications (if enabled) for all characteristics. */ 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(temperature), - (uint8_t *)&temperature - ); - } - if (AttsCccEnabled(connId, BLE_ESS_HUMI_CCC_IDX)) { - AttsHandleValueNtf( - connId, - ESS_HUMIDITY_VAL_HDL, - sizeof(humidity), - (uint8_t *)&humidity - ); - } - if (AttsCccEnabled(connId, BLE_ESS_PRES_CCC_IDX)) { - AttsHandleValueNtf( - connId, - ESS_PRESSURE_VAL_HDL, - sizeof(pressure), - (uint8_t *)&pressure - ); - } - } + sendNotification(connId, ESS_TEMPERATURE_VAL_HDL, BLE_ESS_TEMP_CCC_IDX); + sendNotification(connId, ESS_HUMIDITY_VAL_HDL, BLE_ESS_HUMI_CCC_IDX); + sendNotification(connId, ESS_PRESSURE_VAL_HDL, BLE_ESS_PRES_CCC_IDX); } /* -- GitLab