fix: exceptions in callback should not terminate caller
All checks were successful
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m46s
Check code formatting / Check-C-Format (push) Successful in 9s
Check code formatting / Check-Python-Flake8 (push) Successful in 11s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 6s
Run unit tests on host / Run-Unit-Tests (push) Successful in 10s
Run pytests / Check-Pytest (push) Successful in 13s
All checks were successful
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m46s
Check code formatting / Check-C-Format (push) Successful in 9s
Check code formatting / Check-Python-Flake8 (push) Successful in 11s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 6s
Run unit tests on host / Run-Unit-Tests (push) Successful in 10s
Run pytests / Check-Pytest (push) Successful in 13s
Signed-off-by: Matthias Blankertz <matthias@blankertz.org>
This commit is contained in:
@@ -6,6 +6,7 @@ Copyright (c) 2025 Matthias Blankertz <matthias@blankertz.org>
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import time
|
import time
|
||||||
|
from utils import safe_callback
|
||||||
|
|
||||||
from mfrc522 import MFRC522
|
from mfrc522 import MFRC522
|
||||||
try:
|
try:
|
||||||
@@ -74,7 +75,7 @@ class Nfc:
|
|||||||
self.last_uid = uid
|
self.last_uid = uid
|
||||||
self.last_uid_timestamp = time.ticks_us()
|
self.last_uid_timestamp = time.ticks_us()
|
||||||
if self.cb is not None and last_callback_uid != uid:
|
if self.cb is not None and last_callback_uid != uid:
|
||||||
self.cb.onTagChange(uid)
|
safe_callback(lambda: self.cb.onTagChange(uid), "nfc tag change")
|
||||||
last_callback_uid = uid
|
last_callback_uid = uid
|
||||||
|
|
||||||
await asyncio.sleep_ms(poll_interval_ms)
|
await asyncio.sleep_ms(poll_interval_ms)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# SPDX-License-Identifier: MIT
|
# SPDX-License-Identifier: MIT
|
||||||
# Copyright (c) 2025 Matthias Blankertz <matthias@blankertz.org>
|
# Copyright (c) 2025 Matthias Blankertz <matthias@blankertz.org>
|
||||||
|
|
||||||
|
from utils.helpers import safe_callback
|
||||||
from utils.buttons import Buttons
|
from utils.buttons import Buttons
|
||||||
from utils.config import Configuration
|
from utils.config import Configuration
|
||||||
from utils.leds import LedManager
|
from utils.leds import LedManager
|
||||||
@@ -11,4 +12,4 @@ from utils.sdcontext import SDContext
|
|||||||
from utils.timer import TimerManager
|
from utils.timer import TimerManager
|
||||||
|
|
||||||
__all__ = ["BTreeDB", "BTreeFileManager", "Buttons", "Configuration", "get_pin_index", "LedManager", "MBRPartition",
|
__all__ = ["BTreeDB", "BTreeFileManager", "Buttons", "Configuration", "get_pin_index", "LedManager", "MBRPartition",
|
||||||
"SDContext", "TimerManager"]
|
"safe_callback", "SDContext", "TimerManager"]
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import asyncio
|
|||||||
import machine
|
import machine
|
||||||
import micropython
|
import micropython
|
||||||
import time
|
import time
|
||||||
|
from utils import safe_callback
|
||||||
try:
|
try:
|
||||||
from typing import TYPE_CHECKING # type: ignore
|
from typing import TYPE_CHECKING # type: ignore
|
||||||
except ImportError:
|
except ImportError:
|
||||||
@@ -74,4 +75,4 @@ class Buttons:
|
|||||||
await self.int_flag.wait()
|
await self.int_flag.wait()
|
||||||
while len(self.pressed) > 0:
|
while len(self.pressed) > 0:
|
||||||
what = self.pressed.pop()
|
what = self.pressed.pop()
|
||||||
self.cb.onButtonPressed(what)
|
safe_callback(lambda: self.cb.onButtonPressed(what), "button callback")
|
||||||
|
|||||||
12
software/src/utils/helpers.py
Normal file
12
software/src/utils/helpers.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
# Copyright (c) 2025 Matthias Blankertz <matthias@blankertz.org>
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def safe_callback(func, name="callback"):
|
||||||
|
try:
|
||||||
|
func()
|
||||||
|
except Exception as ex:
|
||||||
|
print(f"Uncaught exception in {name}")
|
||||||
|
sys.print_exception(ex)
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import heapq
|
import heapq
|
||||||
import time
|
import time
|
||||||
|
from utils import safe_callback
|
||||||
|
|
||||||
TIMER_DEBUG = True
|
TIMER_DEBUG = True
|
||||||
|
|
||||||
@@ -72,5 +73,7 @@ class TimerManager(object):
|
|||||||
continue
|
continue
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
pass
|
pass
|
||||||
|
if len(self.timers) == 0:
|
||||||
|
continue
|
||||||
_, callback = heapq.heappop(self.timers)
|
_, callback = heapq.heappop(self.timers)
|
||||||
callback()
|
safe_callback(callback, "timer callback")
|
||||||
|
|||||||
Reference in New Issue
Block a user