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