From 7bc84f6f5c5b546c4fd22870d12a7b4152318753 Mon Sep 17 00:00:00 2001
From: Rahix <rahix@rahix.de>
Date: Thu, 4 Jul 2019 13:22:50 +0200
Subject: [PATCH] fix(pycardium): Properly handle ^C

Signed-off-by: Rahix <rahix@rahix.de>
---
 pycardium/mphalport.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/pycardium/mphalport.c b/pycardium/mphalport.c
index 37505674..dd0ccf4a 100644
--- a/pycardium/mphalport.c
+++ b/pycardium/mphalport.c
@@ -37,16 +37,24 @@ void TMR5_IRQHandler(void)
 	TMR_IntClear(MXC_TMR5);
 
 	if (do_interrupt) {
-		/* Taken from lib/micropython/micropython/ports/unix/unix_mphal.c */
-		mp_obj_exception_clear_traceback(
-			MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception))
-		);
-		nlr_raise(MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)));
+		/* Taken from lib/micropython/micropython/lib/utils/interrupt_char.c */
+		MP_STATE_VM(mp_pending_exception) =
+			MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception));
+#if MICROPY_ENABLE_SCHEDULER
+		if (MP_STATE_VM(sched_state) == MP_SCHED_IDLE) {
+			MP_STATE_VM(sched_state) = MP_SCHED_PENDING;
+		}
+#endif
 	}
 }
 
 void mp_hal_set_interrupt_char(char c)
 {
+	if (c != -1) {
+		mp_obj_exception_clear_traceback(
+			MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception))
+		);
+	}
 	do_interrupt = (c == 0x03);
 }
 
-- 
GitLab