summaryrefslogtreecommitdiff
path: root/tests/multi_bluetooth/ble_characteristic.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/multi_bluetooth/ble_characteristic.py')
-rw-r--r--tests/multi_bluetooth/ble_characteristic.py72
1 files changed, 42 insertions, 30 deletions
diff --git a/tests/multi_bluetooth/ble_characteristic.py b/tests/multi_bluetooth/ble_characteristic.py
index b5dfefc84..33d92b823 100644
--- a/tests/multi_bluetooth/ble_characteristic.py
+++ b/tests/multi_bluetooth/ble_characteristic.py
@@ -5,15 +5,17 @@ import time, machine, bluetooth
TIMEOUT_MS = 5000
-_IRQ_CENTRAL_CONNECT = const(1 << 0)
-_IRQ_CENTRAL_DISCONNECT = const(1 << 1)
-_IRQ_GATTS_WRITE = const(1 << 2)
-_IRQ_PERIPHERAL_CONNECT = const(1 << 6)
-_IRQ_PERIPHERAL_DISCONNECT = const(1 << 7)
-_IRQ_GATTC_CHARACTERISTIC_RESULT = const(1 << 9)
-_IRQ_GATTC_READ_RESULT = const(1 << 11)
-_IRQ_GATTC_WRITE_STATUS = const(1 << 12)
-_IRQ_GATTC_NOTIFY = const(1 << 13)
+_IRQ_CENTRAL_CONNECT = const(1)
+_IRQ_CENTRAL_DISCONNECT = const(2)
+_IRQ_GATTS_WRITE = const(3)
+_IRQ_PERIPHERAL_CONNECT = const(7)
+_IRQ_PERIPHERAL_DISCONNECT = const(8)
+_IRQ_GATTC_CHARACTERISTIC_RESULT = const(11)
+_IRQ_GATTC_CHARACTERISTIC_DONE = const(12)
+_IRQ_GATTC_READ_RESULT = const(15)
+_IRQ_GATTC_READ_DONE = const(16)
+_IRQ_GATTC_WRITE_DONE = const(17)
+_IRQ_GATTC_NOTIFY = const(18)
SERVICE_UUID = bluetooth.UUID("A5A5A5A5-FFFF-9999-1111-5A5A5A5A5A5A")
CHAR_UUID = bluetooth.UUID("00000000-1111-2222-3333-444444444444")
@@ -27,15 +29,13 @@ SERVICE = (
)
SERVICES = (SERVICE,)
-last_event = None
-last_data = None
+waiting_event = None
+waiting_data = None
value_handle = 0
def irq(event, data):
- global last_event, last_data, value_handle
- last_event = event
- last_data = data
+ global waiting_event, waiting_data, value_handle
if event == _IRQ_CENTRAL_CONNECT:
print("_IRQ_CENTRAL_CONNECT")
elif event == _IRQ_CENTRAL_DISCONNECT:
@@ -53,21 +53,32 @@ def irq(event, data):
value_handle = data[2]
elif event == _IRQ_GATTC_READ_RESULT:
print("_IRQ_GATTC_READ_RESULT", data[-1])
- elif event == _IRQ_GATTC_WRITE_STATUS:
- print("_IRQ_GATTC_WRITE_STATUS", data[-1])
+ elif event == _IRQ_GATTC_READ_DONE:
+ print("_IRQ_GATTC_READ_DONE", data[-1])
+ elif event == _IRQ_GATTC_WRITE_DONE:
+ print("_IRQ_GATTC_WRITE_DONE", data[-1])
elif event == _IRQ_GATTC_NOTIFY:
print("_IRQ_GATTC_NOTIFY", data[-1])
+ if waiting_event is not None:
+ if (isinstance(waiting_event, int) and event == waiting_event) or (
+ not isinstance(waiting_event, int) and waiting_event(event, data)
+ ):
+ waiting_event = None
+ waiting_data = data
+
def wait_for_event(event, timeout_ms):
+ global waiting_event, waiting_data
+ waiting_event = event
+ waiting_data = None
+
t0 = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), t0) < timeout_ms:
- if isinstance(event, int):
- if last_event == event:
- break
- elif event():
- break
+ if waiting_data:
+ return True
machine.idle()
+ return False
# Acting in peripheral role.
@@ -82,17 +93,18 @@ def instance0():
ble.gatts_write(char_handle, "periph0")
# Wait for central to connect to us.
- wait_for_event(_IRQ_CENTRAL_CONNECT, TIMEOUT_MS)
- if last_event != _IRQ_CENTRAL_CONNECT:
+ if not wait_for_event(_IRQ_CENTRAL_CONNECT, TIMEOUT_MS):
return
- conn_handle, _, _ = last_data
+ conn_handle, _, _ = waiting_data
# Wait for a write to the characteristic from the central.
wait_for_event(_IRQ_GATTS_WRITE, TIMEOUT_MS)
# Wait a bit, then write the characteristic and notify it.
time.sleep_ms(1000)
+ print("gatts_write")
ble.gatts_write(char_handle, "periph1")
+ print("gatts_notify")
ble.gatts_notify(conn_handle, char_handle)
# Wait for a write to the characteristic from the central.
@@ -100,6 +112,7 @@ def instance0():
# Wait a bit, then notify a new value on the characteristic.
time.sleep_ms(1000)
+ print("gatts_notify")
ble.gatts_notify(conn_handle, char_handle, "periph2")
# Wait for the central to disconnect.
@@ -115,14 +128,13 @@ def instance1():
# Connect to peripheral and then disconnect.
print("gap_connect")
ble.gap_connect(0, BDADDR)
- wait_for_event(_IRQ_PERIPHERAL_CONNECT, TIMEOUT_MS)
- if last_event != _IRQ_PERIPHERAL_CONNECT:
+ if not wait_for_event(_IRQ_PERIPHERAL_CONNECT, TIMEOUT_MS):
return
- conn_handle, _, _ = last_data
+ conn_handle, _, _ = waiting_data
# Discover characteristics.
ble.gattc_discover_characteristics(conn_handle, 1, 65535)
- wait_for_event(lambda: value_handle, TIMEOUT_MS)
+ wait_for_event(lambda event, data: value_handle, TIMEOUT_MS)
# Issue read of characteristic, should get initial value.
print("gattc_read")
@@ -132,7 +144,7 @@ def instance1():
# Write to the characteristic, and ask for a response.
print("gattc_write")
ble.gattc_write(conn_handle, value_handle, "central0", 1)
- wait_for_event(_IRQ_GATTC_WRITE_STATUS, TIMEOUT_MS)
+ wait_for_event(_IRQ_GATTC_WRITE_DONE, TIMEOUT_MS)
# Wait for a notify, then read new value.
wait_for_event(_IRQ_GATTC_NOTIFY, TIMEOUT_MS)
@@ -143,7 +155,7 @@ def instance1():
# Write to the characteristic, and ask for a response.
print("gattc_write")
ble.gattc_write(conn_handle, value_handle, "central1", 1)
- wait_for_event(_IRQ_GATTC_WRITE_STATUS, TIMEOUT_MS)
+ wait_for_event(_IRQ_GATTC_WRITE_DONE, TIMEOUT_MS)
# Wait for a notify (should have new data), then read old value (should be unchanged).
wait_for_event(_IRQ_GATTC_NOTIFY, TIMEOUT_MS)