diff --git a/epicardium/ble/ble_api.h b/epicardium/ble/ble_api.h index dd4ae3c6d590abf2029f7a8dbdc45c3af4e14505..7e2fbbf865e7bf07deea39d4403e4acb812a7f8e 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 e9e29053174975be6d41f069b4ecc0a1e53ea126..2cbf51a5bb45cb636c72ac7819fae38de56cbb16 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 eb3d54e95a2a7c24c90d88552ae7fab5f05f2a02..13f6a3e1baf524017321348aa2027ef5cbba80e0 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);