79 lines
1.5 KiB
Python
79 lines
1.5 KiB
Python
# MicroPython aioble module
|
|
# MIT license; Copyright (c) 2021 Jim Mussared
|
|
|
|
import bluetooth
|
|
|
|
|
|
log_level = 1
|
|
|
|
|
|
def log_error(*args):
|
|
if log_level > 0:
|
|
print("[aioble] E:", *args)
|
|
|
|
|
|
def log_warn(*args):
|
|
if log_level > 1:
|
|
print("[aioble] W:", *args)
|
|
|
|
|
|
def log_info(*args):
|
|
if log_level > 2:
|
|
print("[aioble] I:", *args)
|
|
|
|
|
|
class GattError(Exception):
|
|
def __init__(self, status):
|
|
self._status = status
|
|
|
|
|
|
def ensure_active():
|
|
if not ble.active():
|
|
try:
|
|
from .security import load_secrets
|
|
|
|
load_secrets()
|
|
except:
|
|
pass
|
|
ble.active(True)
|
|
|
|
|
|
def config(*args, **kwargs):
|
|
ensure_active()
|
|
return ble.config(*args, **kwargs)
|
|
|
|
|
|
# Because different functionality is enabled by which files are available the
|
|
# different modules can register their IRQ handlers and shutdown handlers
|
|
# dynamically.
|
|
_irq_handlers = []
|
|
_shutdown_handlers = []
|
|
|
|
|
|
def register_irq_handler(irq, shutdown):
|
|
if irq:
|
|
_irq_handlers.append(irq)
|
|
if shutdown:
|
|
_shutdown_handlers.append(shutdown)
|
|
|
|
|
|
def stop():
|
|
ble.active(False)
|
|
for handler in _shutdown_handlers:
|
|
handler()
|
|
|
|
|
|
# Dispatch IRQs to the registered sub-modules.
|
|
def ble_irq(event, data):
|
|
log_info(event, data)
|
|
|
|
for handler in _irq_handlers:
|
|
result = handler(event, data)
|
|
if result is not None:
|
|
return result
|
|
|
|
|
|
# TODO: Allow this to be injected.
|
|
ble = bluetooth.BLE()
|
|
ble.irq(ble_irq)
|