Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Receive Periodic Advertising Sync Transfer #641

Merged
merged 1 commit into from
Feb 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 41 additions & 6 deletions bumble/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ def from_advertising_report(cls, report):
secondary_phy = report.secondary_phy,
tx_power = report.tx_power,
sid = report.advertising_sid,
data_bytes = report.data
data_bytes = report.data,
)
# fmt: on

Expand Down Expand Up @@ -912,11 +912,11 @@ async def transfer(self, connection: Connection, service_data: int = 0) -> None:

def on_establishment(
self,
status,
sync_handle,
advertiser_phy,
periodic_advertising_interval,
advertiser_clock_accuracy,
status: int,
sync_handle: int,
advertiser_phy: int,
periodic_advertising_interval: int,
advertiser_clock_accuracy: int,
) -> None:
self.status = status

Expand Down Expand Up @@ -3183,6 +3183,41 @@ def on_periodic_advertising_sync_establishment(
"periodic advertising sync establishment for unknown address/sid"
)

@host_event_handler
def on_periodic_advertising_sync_transfer(
self,
status: int,
connection_handle: int,
sync_handle: int,
advertising_sid: int,
advertiser_address: hci.Address,
advertiser_phy: int,
periodic_advertising_interval: int,
advertiser_clock_accuracy: int,
) -> None:
if not (connection := self.lookup_connection(connection_handle)):
logger.error(
"Receive PAST from unknown connection 0x%04X", connection_handle
)

pa_sync = PeriodicAdvertisingSync(
device=self,
advertiser_address=advertiser_address,
sid=advertising_sid,
skip=0,
sync_timeout=0.0,
filter_duplicates=False,
)
self.periodic_advertising_syncs.append(pa_sync)
pa_sync.on_establishment(
status=status,
sync_handle=sync_handle,
advertiser_phy=advertiser_phy,
periodic_advertising_interval=periodic_advertising_interval,
advertiser_clock_accuracy=advertiser_clock_accuracy,
)
self.emit('periodic_advertising_sync_transfer', pa_sync, connection)

@host_event_handler
@with_periodic_advertising_sync_from_handle
def on_periodic_advertising_sync_loss(
Expand Down
81 changes: 81 additions & 0 deletions bumble/hci.py
Original file line number Diff line number Diff line change
Expand Up @@ -4878,6 +4878,62 @@ class HCI_LE_Periodic_Advertising_Sync_Transfer_Command(HCI_Command):
'''


# -----------------------------------------------------------------------------
@HCI_Command.command(
fields=[
('connection_handle', 2),
('mode', 1),
('skip', 2),
('sync_timeout', 2),
(
'cte_type',
{
'size': 1,
'mapper': lambda x: HCI_LE_Periodic_Advertising_Report_Event.CteType(
x
).name,
},
),
],
return_parameters_fields=[
('status', STATUS_SPEC),
('connection_handle', 2),
],
)
class HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters_Command(HCI_Command):
'''
See Bluetooth spec @ 7.8.91 LE Set Periodic Advertising Sync Transfer Parameters command
'''


# -----------------------------------------------------------------------------
@HCI_Command.command(
fields=[
('mode', 1),
('skip', 2),
('sync_timeout', 2),
(
'cte_type',
{
'size': 1,
'mapper': lambda x: HCI_LE_Periodic_Advertising_Report_Event.CteType(
x
).name,
},
),
],
return_parameters_fields=[
('status', STATUS_SPEC),
],
)
class HCI_LE_Set_Default_Periodic_Advertising_Sync_Transfer_Parameters_Command(
HCI_Command
):
'''
See Bluetooth spec @ 7.8.92 LE Set Default Periodic Advertising Sync Transfer Parameters command
'''


# -----------------------------------------------------------------------------
@HCI_Command.command(
fields=[
Expand Down Expand Up @@ -6231,6 +6287,31 @@ class HCI_LE_Periodic_Advertising_Sync_Transfer_Received_Event(HCI_LE_Meta_Event
'''


# -----------------------------------------------------------------------------
@HCI_LE_Meta_Event.event(
[
('status', STATUS_SPEC),
('connection_handle', 2),
('service_data', 2),
('sync_handle', 2),
('advertising_sid', 1),
('advertiser_address_type', Address.ADDRESS_TYPE_SPEC),
('advertiser_address', Address.parse_address_preceded_by_type),
('advertiser_phy', 1),
('periodic_advertising_interval', 2),
('advertiser_clock_accuracy', 1),
('num_subevents', 1),
('subevent_interval', 1),
('response_slot_delay', 1),
('response_slot_spacing', 1),
]
)
class HCI_LE_Periodic_Advertising_Sync_Transfer_Received_V2_Event(HCI_LE_Meta_Event):
'''
See Bluetooth spec @ 7.7.65.24 LE Periodic Advertising Sync Transfer Received Event
'''


# -----------------------------------------------------------------------------
@HCI_LE_Meta_Event.event(
[
Expand Down
26 changes: 26 additions & 0 deletions bumble/host.py
Original file line number Diff line number Diff line change
Expand Up @@ -1204,6 +1204,32 @@ def on_hci_le_terminate_big_complete_event(self, event):
self.remove_big(event.big_handle)
self.emit('big_termination', event.reason, event.big_handle)

def on_hci_le_periodic_advertising_sync_transfer_received_event(self, event):
self.emit(
'periodic_advertising_sync_transfer',
event.status,
event.connection_handle,
event.sync_handle,
event.advertising_sid,
event.advertiser_address,
event.advertiser_phy,
event.periodic_advertising_interval,
event.advertiser_clock_accuracy,
)

def on_hci_le_periodic_advertising_sync_transfer_received_v2_event(self, event):
self.emit(
'periodic_advertising_sync_transfer',
event.status,
event.connection_handle,
event.sync_handle,
event.advertising_sid,
event.advertiser_address,
event.advertiser_phy,
event.periodic_advertising_interval,
event.advertiser_clock_accuracy,
)

def on_hci_le_cis_established_event(self, event):
# The remaining parameters are unused for now.
if event.status == hci.HCI_SUCCESS:
Expand Down
Loading