From b40d88f6278d91d545e4cd99c20780c52b912022 Mon Sep 17 00:00:00 2001
From: schneider <schneider@blinkenlichts.net>
Date: Fri, 2 Apr 2021 22:40:40 +0200
Subject: [PATCH] feat(epicardium): Add v1.17 splash

---
 epicardium/ble/ble_main.c                     |  15 +++++++---
 epicardium/ble/epic_att_api.c                 |  18 +++++++++++
 epicardium/main.c                             |   2 +-
 epicardium/version-splash.png                 | Bin 2364 -> 15332 bytes
 .../sources/apps/app/common/app_ui.c          |   2 +-
 pycardium/modules/modbluetooth_card10.c       |  28 ++++++++++++++++++
 6 files changed, 59 insertions(+), 6 deletions(-)

diff --git a/epicardium/ble/ble_main.c b/epicardium/ble/ble_main.c
index 795aaa41d..629e9b53c 100644
--- a/epicardium/ble/ble_main.c
+++ b/epicardium/ble/ble_main.c
@@ -62,7 +62,9 @@ static const appSlaveCfg_t bleSlaveCfg =
 /*! configurable parameters for security */
 static const appSecCfg_t bleSecCfg =
 {
-  .auth = DM_AUTH_MITM_FLAG | DM_AUTH_BOND_FLAG | DM_AUTH_SC_FLAG, /*! Authentication and bonding flags */
+  //.auth = DM_AUTH_MITM_FLAG | DM_AUTH_BOND_FLAG | DM_AUTH_SC_FLAG, /*! Authentication and bonding flags */
+  .auth = DM_AUTH_MITM_FLAG | DM_AUTH_BOND_FLAG, /*! Authentication and bonding flags */
+  //.auth = 0, /*! Authentication and bonding flags */
   .iKeyDist = 0,                               /*! Initiator key distribution flags */
   .rKeyDist = DM_KEY_DIST_LTK,                 /*! Responder key distribution flags */
   .oob=FALSE,                                  /*! TRUE if Out-of-band pairing data is present */
@@ -86,11 +88,15 @@ static const appUpdateCfg_t bleUpdateCfg =
 static const smpCfg_t bleSmpCfg =
 {
   .attemptTimeout = 3000,                          /*! 'Repeated attempts' timeout in msec */
-  .ioCap = SMP_IO_DISP_YES_NO,                     /*! I/O Capability */
+  //.ioCap = SMP_IO_DISP_YES_NO,                     /*! I/O Capability */
+  .ioCap = SMP_IO_DISP_ONLY,                     /*! I/O Capability */
+  //.ioCap = SMP_IO_NO_IN_NO_OUT,                     /*! I/O Capability */
   .minKeyLen = 16,                                 /*! Minimum encryption key length */
   .maxKeyLen = 16,                                 /*! Maximum encryption key length */
   .maxAttempts = 3,                                /*! Attempts to trigger 'repeated attempts' timeout */
-  .auth = DM_AUTH_MITM_FLAG | DM_AUTH_SC_FLAG,     /*! Device authentication requirements */
+  //.auth = DM_AUTH_MITM_FLAG | DM_AUTH_SC_FLAG,     /*! Device authentication requirements */
+  .auth = DM_AUTH_MITM_FLAG,     /*! Device authentication requirements */
+  //.auth = 0,     /*! Device authentication requirements */
   .maxAttemptTimeout = 64000,                      /*! Maximum 'Repeated attempts' timeout in msec */
   .attemptDecTimeout = 64000,                      /*! Time msec before attemptExp decreases */
   .attemptExp = 2,                                 /*! Exponent to raise attemptTimeout on maxAttempts */
@@ -99,7 +105,8 @@ static const smpCfg_t bleSmpCfg =
 /*! Configurable parameters for service and characteristic discovery */
 static const appDiscCfg_t bleDiscCfg =
 {
-  FALSE                                   /*! TRUE to wait for a secure connection before initiating discovery */
+  //FALSE                                   /*! TRUE to wait for a secure connection before initiating discovery */
+  TRUE                                   /*! TRUE to wait for a secure connection before initiating discovery */
 };
 
 /* Configuration structure */
diff --git a/epicardium/ble/epic_att_api.c b/epicardium/ble/epic_att_api.c
index 3cd3ebf2b..203bb231c 100644
--- a/epicardium/ble/epic_att_api.c
+++ b/epicardium/ble/epic_att_api.c
@@ -23,8 +23,26 @@ static void *dyn_groups[ATTS_DYN_GROUP_COUNT] = {};
 static int next_dyn_group                     = 0;
 static int next_handle                        = ATTS_DYN_START_HANDLE;
 
+static void hexdump(uint8_t *data, uint8_t len)
+{
+	for (int i = 0; i < len; i++) {
+		printf("%02x ", data[i]);
+	}
+	printf("\n");
+}
+
 void ble_epic_att_api_event(attEvt_t *att_event)
 {
+	printf("att event handle %d %d\n",
+	       att_event->handle,
+	       att_event->continuing);
+	printf("att event handle %p %d %p %d\n",
+	       att_event,
+	       sizeof(*att_event),
+	       att_event->pValue,
+	       att_event->valueLen);
+	hexdump(att_event->pValue, att_event->valueLen);
+
 	if (att_event->hdr.event != ATTS_HANDLE_VALUE_CNF ||
 	    (att_event->handle >= ATTS_DYN_START_HANDLE &&
 	     att_event->handle < next_handle)) {
diff --git a/epicardium/main.c b/epicardium/main.c
index f4c7d9d94..2641f2f55 100644
--- a/epicardium/main.c
+++ b/epicardium/main.c
@@ -51,7 +51,7 @@ int main(void)
 		&display_screen, 0, 0, 160, 80, GFX_RGB565, version_splash
 	);
 
-	if (strcmp(CARD10_VERSION, "v1.16") != 0) {
+	if (strcmp(CARD10_VERSION, "v1.17") != 0) {
 		const int off = (160 - (int)strlen(version_buf) * 14) / 2;
 		epic_disp_print(10, 20, "Epicardium", 0xfe20, 0xfe20);
 		epic_disp_print(
diff --git a/epicardium/version-splash.png b/epicardium/version-splash.png
index c9c8c648f1002a16bf35126b8b7a360a6f2abad5..d2dc8f7dc8222c53d487b78010f02a7186c4ee3d 100644
GIT binary patch
literal 15332
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

delta 2307
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
Ofx*+&&t;ucLK6UXic}i_

diff --git a/lib/sdk/Libraries/BTLE/stack/ble-profiles/sources/apps/app/common/app_ui.c b/lib/sdk/Libraries/BTLE/stack/ble-profiles/sources/apps/app/common/app_ui.c
index ae7ece902..964ee566f 100644
--- a/lib/sdk/Libraries/BTLE/stack/ble-profiles/sources/apps/app/common/app_ui.c
+++ b/lib/sdk/Libraries/BTLE/stack/ble-profiles/sources/apps/app/common/app_ui.c
@@ -167,7 +167,7 @@ void AppUiAction(uint8_t event)
 /*************************************************************************************************/
 void AppUiDisplayPasskey(uint32_t passkey)
 {
-  APP_TRACE_INFO1(">>> Passkey: %d <<<", passkey);
+  printf(">>> Passkey: %d <<<", passkey);
 }
 
 /*************************************************************************************************/
diff --git a/pycardium/modules/modbluetooth_card10.c b/pycardium/modules/modbluetooth_card10.c
index 932930d8b..1173eb322 100644
--- a/pycardium/modules/modbluetooth_card10.c
+++ b/pycardium/modules/modbluetooth_card10.c
@@ -88,8 +88,31 @@ static void clear_events(void)
 	} while (ret >= 0);
 }
 
+#if 0
+#if MICROPY_PY_BLUETOOTH_ENABLE_CENTRAL_MODE
+STATIC mp_obj_bluetooth_uuid_t create_mp_uuid(uint16_t uuid16, const uint8_t *uuid128) {
+    mp_obj_bluetooth_uuid_t result;
+    if (uuid16 != 0) {
+        result.data[0] = uuid16 & 0xff;
+        result.data[1] = (uuid16 >> 8) & 0xff;
+        result.type = MP_BLUETOOTH_UUID_TYPE_16;
+    } else {
+        reverse_128(uuid128, result.data);
+        result.type = MP_BLUETOOTH_UUID_TYPE_128;
+    }
+    return result;
+}
+#endif
+#endif
+
 static void handle_att_event(struct epic_att_event *att_event)
 {
+	printf("MP got att event %d,%d,%d,%d\n",
+	       att_event->hdr.event,
+	       att_event->hdr.status,
+	       att_event->handle,
+	       att_event->continuing);
+
 	if (att_event->hdr.event == ATTS_HANDLE_VALUE_CNF) {
 		gatts_status_entry_t *e =
 			gatts_status_lookup(GATTS_STATUS, att_event->handle);
@@ -353,6 +376,8 @@ static void handle_att_event(struct epic_att_event *att_event)
 static void handle_dm_event(struct epic_dm_event *dm_event)
 {
 	struct epic_wsf_header *hdr = (struct epic_wsf_header *)dm_event;
+
+	printf("MP got DM event %d,%d\n", hdr->event, hdr->status);
 	if (hdr->event == DM_CONN_OPEN_IND) {
 		struct epic_hciLeConnCmpl_event *e =
 			(struct epic_hciLeConnCmpl_event *)dm_event;
@@ -885,6 +910,7 @@ int mp_bluetooth_gattc_write(
 	    mode != MP_BLUETOOTH_WRITE_MODE_NO_RESPONSE) {
 		return MP_EINVAL;
 	}
+	// create operation
 	pending_gattc_operation_obj_t *op = m_new_obj_var(
 		pending_gattc_operation_obj_t, uint8_t, *value_len
 	);
@@ -894,12 +920,14 @@ int mp_bluetooth_gattc_write(
 	op->mode         = mode;
 	op->value_len    = *value_len;
 	memcpy(op->value, value, *value_len);
+	// add operation to list
 	mp_obj_list_append(ATTC_PENDING, MP_OBJ_FROM_PTR(op));
 
 	size_t len;
 	mp_obj_t *items;
 	mp_obj_list_get(ATTC_PENDING, &len, &items);
 
+	// is list size == 1: execute write
 	if (len == 1) {
 		if (mode == MP_BLUETOOTH_WRITE_MODE_NO_RESPONSE) {
 			err = epic_ble_attc_write_no_rsp(
-- 
GitLab