From 44951ee75e0ce9316b218a74a2149581616a2d53 Mon Sep 17 00:00:00 2001
From: schneider <schneider@blinkenlichts.net>
Date: Tue, 22 Dec 2020 02:57:20 +0100
Subject: [PATCH] change(hid): Keep trying to type if queue is full

---
 pycardium/modules/py/ble_hid.py | 8 +++++++-
 pycardium/modules/sys_ble_hid.c | 9 +++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/pycardium/modules/py/ble_hid.py b/pycardium/modules/py/ble_hid.py
index 9869f017b..3a1bcda03 100644
--- a/pycardium/modules/py/ble_hid.py
+++ b/pycardium/modules/py/ble_hid.py
@@ -1,4 +1,5 @@
 import sys_ble_hid
+import time
 
 
 class Report:
@@ -8,7 +9,12 @@ class Report:
         self.usage = usage
 
     def send_report(self, data):
-        sys_ble_hid.send_report(self.report_id, data)
+        while True:
+            try:
+                sys_ble_hid.send_report(self.report_id, data)
+                break
+            except MemoryError:
+                time.sleep(0.1)
 
 
 # Reports as defined in the HID report map in epicardium/ble/hid.c
diff --git a/pycardium/modules/sys_ble_hid.c b/pycardium/modules/sys_ble_hid.c
index 47e0228ab..f7cf77f48 100644
--- a/pycardium/modules/sys_ble_hid.c
+++ b/pycardium/modules/sys_ble_hid.c
@@ -12,6 +12,15 @@ static mp_obj_t mp_sys_ble_hid_send_report(mp_obj_t report_id, mp_obj_t data)
 	int ret = epic_ble_hid_send_report(
 		mp_obj_get_int(report_id), bufinfo.buf, bufinfo.len
 	);
+
+	if (ret == -EAGAIN) {
+		mp_raise_msg(&mp_type_MemoryError, NULL);
+	}
+
+	if (ret < 0) {
+		mp_raise_OSError(-ret);
+	}
+
 	return mp_obj_new_int(ret);
 }
 static MP_DEFINE_CONST_FUN_OBJ_2(
-- 
GitLab