From 045d3a2c82c83f55e834d3202161bb34ac5cda52 Mon Sep 17 00:00:00 2001
From: schneider <schneider@blinkenlichts.net>
Date: Fri, 2 Apr 2021 16:22:21 +0200
Subject: [PATCH] feat(ble): Delay epic con open ind until epicardium is done

---
 epicardium/ble/ble_api.h      |  1 +
 epicardium/ble/ble_attc.c     |  2 ++
 epicardium/ble/epic_ble_api.c | 21 ++++++++++++++++++++-
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/epicardium/ble/ble_api.h b/epicardium/ble/ble_api.h
index dd4ae3c6d..7e2fbbf86 100644
--- a/epicardium/ble/ble_api.h
+++ b/epicardium/ble/ble_api.h
@@ -48,6 +48,7 @@ void ble_epic_att_api_free_att_write_data(struct epic_att_write *w);
 void ble_epic_ble_api_trigger_event(enum epic_ble_event_type type, void *data);
 void ble_epic_ble_api_init(void);
 void ble_epic_dm_api_event(dmEvt_t *dm_event);
+void ble_epic_disc_cfg_complete(void);
 
 void ble_adv_init(void);
 void ble_adv_setup(void);
diff --git a/epicardium/ble/ble_attc.c b/epicardium/ble/ble_attc.c
index e9e290531..2cbf51a5b 100644
--- a/epicardium/ble/ble_attc.c
+++ b/epicardium/ble/ble_attc.c
@@ -1,6 +1,7 @@
 #include <stdint.h>
 #include <stdbool.h>
 
+#include "ble_api.h"
 #include "wsf_types.h"
 #include "util/bstream.h"
 #include "app_api.h"
@@ -258,6 +259,7 @@ void bleDiscCback(dmConnId_t connId, uint8_t status)
 
     case APP_DISC_CFG_CMPL:
       AppDiscComplete(connId, APP_DISC_CFG_CMPL);
+      ble_epic_disc_cfg_complete();
       break;
 
     case APP_DISC_CFG_CONN_START:
diff --git a/epicardium/ble/epic_ble_api.c b/epicardium/ble/epic_ble_api.c
index eb3d54e95..13f6a3e1b 100644
--- a/epicardium/ble/epic_ble_api.c
+++ b/epicardium/ble/epic_ble_api.c
@@ -24,6 +24,7 @@ static StaticQueue_t ble_event_queue_data;
 
 static uint8_t adv_data_buf[HCI_ADV_DATA_LEN];
 static uint8_t sr_data_buf[HCI_ADV_DATA_LEN];
+static dmEvt_t connection_open_event;
 
 int epic_ble_free_event(struct epic_ble_event *e)
 {
@@ -85,7 +86,7 @@ void ble_epic_ble_api_init(void)
 	ble_epic_att_api_init();
 }
 
-void ble_epic_dm_api_event(dmEvt_t *dm_event)
+static void send_dm_event(dmEvt_t *dm_event)
 {
 	dmEvt_t *e = WsfBufAlloc(sizeof(*e));
 
@@ -97,6 +98,24 @@ void ble_epic_dm_api_event(dmEvt_t *dm_event)
 	}
 }
 
+void ble_epic_dm_api_event(dmEvt_t *dm_event)
+{
+	if (dm_event->hdr.event == DM_CONN_OPEN_IND) {
+		/* Cache the connection open indication until
+		 * epicardium is done dicovering services. */
+		memcpy(&connection_open_event,
+		       dm_event,
+		       sizeof(connection_open_event));
+	} else {
+		send_dm_event(dm_event);
+	}
+}
+
+void ble_epic_disc_cfg_complete(void)
+{
+	send_dm_event(&connection_open_event);
+}
+
 void epic_ble_close_connection(uint8_t connId)
 {
 	AppConnClose(connId);
-- 
GitLab