Skip to content

Commit 45a6a4c

Browse files
committed
Zephyr: add new ISO hosts in GAP
The following tests added in PTS with ICS Audio - GAP/SEC/SEM/BI-13-C - GAP/BIS/BBM/BV-01-C - GAP/BIS/BSE/BV-01-C Signed-off-by: Dobrynin, Artur <artur.dobrynin@nordicsemi.no>
1 parent 27c87a7 commit 45a6a4c

5 files changed

Lines changed: 142 additions & 3 deletions

File tree

autopts/ptsprojects/stack/layers/gap.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ def __init__(self, name, manufacturer_data, appearance, svc_data, flags,
108108
self.periodic_sync_established_rxed = False
109109
self.periodic_transfer_received = False
110110

111+
self.iso_channel_status = []
112+
111113
# Used for MMI handling
112114
self.delay_mmi = False
113115
self.mmi_round = {}
@@ -282,3 +284,13 @@ def gap_wait_for_sec_lvl_change(self, level, timeout=5, addr=None):
282284

283285
def gap_set_pair_user_interaction(self, user_interaction):
284286
self.pair_user_interaction = user_interaction
287+
288+
def gap_wait_for_iso_channel_status(self, status, timeout=5):
289+
def _check_status():
290+
if status in self.iso_channel_status:
291+
self.iso_channel_status.remove(status)
292+
return True
293+
else:
294+
return False
295+
296+
return wait_for_event(timeout, _check_status)

autopts/pybtp/btp/gap.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,16 @@
3838
set_pts_addr,
3939
)
4040
from autopts.pybtp.btp.btp import get_iut_method as get_iut
41-
from autopts.pybtp.types import Addr, AdDuration, AdType, BTPError, OwnAddrType, addr2btp_ba, gap_settings_btp2txt
41+
from autopts.pybtp.types import (
42+
Addr,
43+
AdDuration,
44+
AdType,
45+
BTPError,
46+
OwnAddrType,
47+
addr2btp_ba,
48+
gap_settings_btp2txt,
49+
IsoChannelStatus,
50+
)
4251

4352
GAP = {
4453
"start_adv": (defs.BTP_SERVICE_ID_GAP, defs.BTP_GAP_CMD_START_ADVERTISING,
@@ -145,6 +154,12 @@
145154
"padv_sync_transfer_recv": (defs.BTP_SERVICE_ID_GAP,
146155
defs.BTP_GAP_CMD_PADV_SYNC_TRANSFER_RECV,
147156
CONTROLLER_INDEX),
157+
"iso_sync_big": (defs.BTP_SERVICE_ID_GAP,
158+
defs.BTP_GAP_CMD_ISO_SYNC_BIG, CONTROLLER_INDEX, ""),
159+
"iso_create_big": (defs.BTP_SERVICE_ID_GAP,
160+
defs.BTP_GAP_CMD_ISO_CREATE_BIG, CONTROLLER_INDEX, ""),
161+
"iso_send_pckt": (defs.BTP_SERVICE_ID_GAP,
162+
defs.BTP_GAP_CMD_ISO_SEND_PCKT, CONTROLLER_INDEX),
148163
}
149164

150165

@@ -406,6 +421,16 @@ def gap_encryption_change_ev_(gap, data, data_len):
406421
stack.gap.encryption_change_rcvd.data = (_addr_t, _addr, _encrypted, _key_size)
407422

408423

424+
def gap_iso_channel_changed_ev_(gap, data, data_len):
425+
logging.debug("%s", gap_iso_channel_changed_ev_.__name__)
426+
427+
fmt = '<B'
428+
status = struct.unpack(fmt, data)
429+
430+
stack = get_stack()
431+
stack.gap.iso_channel_status.append(IsoChannelStatus(status[0]))
432+
433+
409434
GAP_EV = {
410435
defs.BTP_GAP_EV_NEW_SETTINGS: gap_new_settings_ev_,
411436
defs.BTP_GAP_EV_DEVICE_FOUND: gap_device_found_ev_,
@@ -425,6 +450,7 @@ def gap_encryption_change_ev_(gap, data, data_len):
425450
defs.BTP_GAP_EV_PERIODIC_REPORT: gap_padv_report_ev_,
426451
defs.BTP_GAP_EV_PERIODIC_TRANSFER_RECEIVED: gap_padv_transfer_received_ev_,
427452
defs.BTP_GAP_EV_ENCRYPTION_CHANGE: gap_encryption_change_ev_,
453+
defs.BTP_GAP_EV_ISO_CHANNEL_CHANGED: gap_iso_channel_changed_ev_,
428454
}
429455

430456

@@ -1475,3 +1501,32 @@ def gap_padv_sync_transfer_recv(skip, sync_timeout, flags, addr_type=None, addr=
14751501
iutctl.btp_socket.send(*GAP['padv_sync_transfer_recv'], data=data_ba)
14761502

14771503
gap_command_rsp_succ()
1504+
1505+
1506+
def gap_iso_sync_big():
1507+
logging.debug("%s", gap_iso_sync_big.__name__)
1508+
1509+
iutctl = get_iut()
1510+
iutctl.btp_socket.send(*GAP['iso_sync_big'])
1511+
1512+
gap_command_rsp_succ()
1513+
1514+
1515+
def gap_iso_create_big():
1516+
logging.debug("%s", gap_iso_create_big.__name__)
1517+
1518+
iutctl = get_iut()
1519+
iutctl.btp_socket.send(*GAP['iso_create_big'])
1520+
1521+
gap_command_rsp_succ()
1522+
1523+
1524+
def gap_iso_send_pckt(pkt_cnt):
1525+
logging.debug("%s", gap_iso_send_pckt.__name__)
1526+
1527+
iutctl = get_iut()
1528+
1529+
data_ba = bytearray(struct.pack('<B', pkt_cnt))
1530+
iutctl.btp_socket.send(*GAP['iso_send_pckt'], data=data_ba)
1531+
1532+
gap_command_rsp_succ()

autopts/pybtp/defs.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ def BIT(bit):
145145
BTP_GAP_CMD_PADV_SYNC_TRANSFER_SET_INFO = 0x27
146146
BTP_GAP_CMD_PADV_SYNC_TRANSFER_START = 0x28
147147
BTP_GAP_CMD_PADV_SYNC_TRANSFER_RECV = 0x29
148+
BTP_GAP_CMD_ISO_SYNC_BIG = 0x31
149+
BTP_GAP_CMD_ISO_CREATE_BIG = 0x32
150+
BTP_GAP_CMD_ISO_SEND_PCKT = 0x33
148151
BTP_GAP_CMD_PAIR_V2_MODE_1 = 0x01
149152
BTP_GAP_CMD_PAIR_V2_MODE_2 = 0x02
150153
BTP_GAP_CMD_PAIR_V2_MODE_3 = 0x03
@@ -180,6 +183,7 @@ def BIT(bit):
180183
BTP_GAP_EV_PERIODIC_REPORT = 0x8f
181184
BTP_GAP_EV_PERIODIC_TRANSFER_RECEIVED = 0x90
182185
BTP_GAP_EV_ENCRYPTION_CHANGE = 0x91
186+
BTP_GAP_EV_ISO_CHANNEL_CHANGED = 0x92
183187
BTP_GATT_CMD_READ_SUPPORTED_COMMANDS = 0x01
184188
GATT_SERVICE_PRIMARY = 0x00
185189
GATT_SERVICE_SECONDARY = 0x01

autopts/pybtp/types.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,3 +497,10 @@ class BIGEncryption:
497497
BROADCAST_CODE_REQUIRED = 0x01
498498
DECRYPTING = 0x02
499499
BAD_CODE = 0x03
500+
501+
502+
class IsoChannelStatus(IntEnum):
503+
CONNECTED = 0x01
504+
TRANSMITTING = 0x02
505+
RECEIVING = 0x03
506+
DISCONNECTED = 0x04

autopts/wid/gap.py

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,10 +1473,17 @@ def hdl_wid_300(_: WIDParams):
14731473
return True
14741474

14751475

1476-
def hdl_wid_301(_: WIDParams):
1476+
def hdl_wid_301(params: WIDParams):
14771477
# Please click OK if IUT did not receive periodic advertising report.
1478+
# or
1479+
# Please click OK when IUT received periodic advertisement report.
14781480
stack = get_stack()
1479-
return stack.gap.wait_periodic_report(10)
1481+
1482+
if params.test_case_name in ['GAP/BIS/BSE/BV-01-C', 'GAP/SEC/SEM/BI-13-C']:
1483+
btp.gap_padv_create_sync(0, 0, 10, 0)
1484+
return stack.gap.wait_periodic_established(10)
1485+
else:
1486+
return stack.gap.wait_periodic_report(10)
14801487

14811488

14821489
def hdl_wid_302(_: WIDParams):
@@ -1544,6 +1551,60 @@ def hdl_wid_309(_: WIDParams):
15441551
return stack.gap.wait_periodic_transfer_received(10)
15451552

15461553

1554+
def hdl_wid_350(_: WIDParams):
1555+
# Please synchronize with Broadcast ISO request.
1556+
return True
1557+
1558+
1559+
def hdl_wid_351(_: WIDParams):
1560+
# Wait for Broadcast ISO request.
1561+
stack = get_stack()
1562+
return stack.gap.gap_wait_for_iso_channel_status(types.IsoChannelStatus.CONNECTED)
1563+
1564+
1565+
def hdl_wid_352(_: WIDParams):
1566+
# Please click OK when IUT establishes BIG sync, and ready to receive ISO data.
1567+
stack = get_stack()
1568+
btp.gap_iso_sync_big()
1569+
is_con = stack.gap.gap_wait_for_iso_channel_status(types.IsoChannelStatus.CONNECTED)
1570+
return is_con
1571+
1572+
1573+
def hdl_wid_353(_: WIDParams):
1574+
# Please configure IUT security to Mode 3 Level 2 or Level 3.
1575+
return True
1576+
1577+
1578+
def hdl_wid_354(_: WIDParams):
1579+
# Please synchronize to lower tester in Security Mode 3 Level 2 or 3.
1580+
# If IUT failed to synchnorize to the lower tester, please click ok.
1581+
btp.gap_iso_sync_big()
1582+
1583+
stack = get_stack()
1584+
is_discon = stack.gap.gap_wait_for_iso_channel_status(types.IsoChannelStatus.DISCONNECTED)
1585+
return is_discon
1586+
1587+
1588+
def hdl_wid_356(_: WIDParams):
1589+
# Please broadcast valid ISO data packets (more than 3 packets).
1590+
stack = get_stack()
1591+
btp.gap_iso_send_pckt(4)
1592+
1593+
iso_pkt_count = 0
1594+
for _ in range(4):
1595+
if stack.gap.gap_wait_for_iso_channel_status(types.IsoChannelStatus.TRANSMITTING, 1):
1596+
iso_pkt_count += 1
1597+
1598+
return (iso_pkt_count == 4)
1599+
1600+
1601+
def hdl_wid_357(_: WIDParams):
1602+
# Please send LE BIGInfo Advertising Report.
1603+
stack = get_stack()
1604+
btp.gap_iso_create_big()
1605+
return True
1606+
1607+
15471608
def hdl_wid_400(_: WIDParams):
15481609
btp.set_filter_accept_list()
15491610
bd_addr = '000000000000'

0 commit comments

Comments
 (0)