From 97716103195d25d0a390775147fb526c223b193b Mon Sep 17 00:00:00 2001
From: schneider <schneider@blinkenlichts.net>
Date: Mon, 7 Dec 2020 02:39:43 +0100
Subject: [PATCH] feat(ess): Use BSEC if it is enabled

---
 epicardium/ble/ess.c      | 26 +++++++++++++++++++++++---
 epicardium/ble/ess.h      |  1 +
 epicardium/modules/bsec.c |  4 ++++
 3 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/epicardium/ble/ess.c b/epicardium/ble/ess.c
index a4452e9d5..f2e31bf1f 100644
--- a/epicardium/ble/ess.c
+++ b/epicardium/ble/ess.c
@@ -180,13 +180,13 @@ WSF_CT_ASSERT(
 
 static TimerHandle_t poll_timer;
 static StaticTimer_t poll_timer_buffer;
-static void bleESS_update(struct bme680_sensor_data *data);
+static void update_from_bme680(struct bme680_sensor_data *data);
 
 static void workpoll(void *data)
 {
 	struct bme680_sensor_data sensor_data;
 	if (epic_bme680_read_sensors(&sensor_data) == 0) {
-		bleESS_update(&sensor_data);
+		update_from_bme680(&sensor_data);
 	}
 }
 
@@ -254,6 +254,11 @@ static void setAttrFromBME680(struct bme680_sensor_data *data)
 	);
 }
 
+static void setAttrFromBSEC(struct bsec_sensor_data *data)
+{
+	setAttrFromBME680((struct bme680_sensor_data *)data);
+}
+
 /*
  * BLE ESS read callback.
  *
@@ -316,7 +321,7 @@ static attsGroup_t svcESSGroup = {
 	.endHandle   = ESS_END_HDL,
 };
 
-static void bleESS_update(struct bme680_sensor_data *data)
+static void update_from_bme680(struct bme680_sensor_data *data)
 {
 	setAttrFromBME680(data);
 
@@ -327,6 +332,17 @@ static void bleESS_update(struct bme680_sensor_data *data)
 	sendNotification(connId, ESS_PRESSURE_VAL_HDL, BLE_ESS_PRES_CCC_IDX);
 }
 
+void bleESS_update_from_bsec_data(struct bsec_sensor_data *data)
+{
+	setAttrFromBSEC(data);
+
+	/* Send notifications (if enabled) for all characteristics. */
+	dmConnId_t connId = AppConnIsOpen();
+	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);
+}
+
 /*
  * This registers and starts the ESS service.
  */
@@ -341,6 +357,10 @@ void bleESS_init(void)
  */
 void bleESS_ccc_update(void)
 {
+	if (bsec_active()) {
+		return;
+	}
+
 	dmConnId_t connId = AppConnIsOpen();
 	if (connId != DM_CONN_ID_NONE &&
 	    (AttsCccEnabled(connId, BLE_ESS_TEMP_CCC_IDX) ||
diff --git a/epicardium/ble/ess.h b/epicardium/ble/ess.h
index 3f59edf88..f54d1328b 100644
--- a/epicardium/ble/ess.h
+++ b/epicardium/ble/ess.h
@@ -29,3 +29,4 @@ enum {
 };
 
 void bleESS_ccc_update(void);
+void bleESS_update_from_bsec_data(struct bsec_sensor_data *data);
diff --git a/epicardium/modules/bsec.c b/epicardium/modules/bsec.c
index 76319bb86..7d24d4a88 100644
--- a/epicardium/modules/bsec.c
+++ b/epicardium/modules/bsec.c
@@ -4,6 +4,8 @@
 #include "bosch.h"
 #include "bsec_integration.h"
 
+#include "ble/ess.h"
+
 #include "epicardium.h"
 #include "modules.h"
 #include "config.h"
@@ -119,6 +121,8 @@ void output_ready(
 
 	last_bme680_timestamp = timestamp;
 
+	bleESS_update_from_bsec_data(&last_bsec_data);
+
 	if (debug) {
 		LOG_INFO(
 			"bsec",
-- 
GitLab