This commit is contained in:
Gilles Boccon-Gibod
2025-01-07 14:54:59 -05:00
parent 69d62d3dd1
commit b375ed07b4
2 changed files with 40 additions and 1 deletions

View File

@@ -5167,7 +5167,7 @@ class HCI_Event(HCI_Packet):
# No factory, or the factory could not create an instance, # No factory, or the factory could not create an instance,
# return a generic vendor event # return a generic vendor event
return HCI_Event(event_code, parameters) return HCI_Vendor_Event(data=parameters)
else: else:
subclass = HCI_Event.event_classes.get(event_code) subclass = HCI_Event.event_classes.get(event_code)
if subclass is None: if subclass is None:

View File

@@ -15,6 +15,7 @@
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Imports # Imports
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
import struct
from bumble.hci import ( from bumble.hci import (
HCI_DISCONNECT_COMMAND, HCI_DISCONNECT_COMMAND,
@@ -22,6 +23,7 @@ from bumble.hci import (
HCI_LE_CODED_PHY_BIT, HCI_LE_CODED_PHY_BIT,
HCI_LE_READ_BUFFER_SIZE_COMMAND, HCI_LE_READ_BUFFER_SIZE_COMMAND,
HCI_RESET_COMMAND, HCI_RESET_COMMAND,
HCI_VENDOR_EVENT,
HCI_SUCCESS, HCI_SUCCESS,
HCI_LE_CONNECTION_COMPLETE_EVENT, HCI_LE_CONNECTION_COMPLETE_EVENT,
HCI_LE_ENHANCED_CONNECTION_COMPLETE_V2_EVENT, HCI_LE_ENHANCED_CONNECTION_COMPLETE_V2_EVENT,
@@ -67,6 +69,7 @@ from bumble.hci import (
HCI_Read_Local_Version_Information_Command, HCI_Read_Local_Version_Information_Command,
HCI_Reset_Command, HCI_Reset_Command,
HCI_Set_Event_Mask_Command, HCI_Set_Event_Mask_Command,
HCI_Vendor_Event,
) )
@@ -213,6 +216,41 @@ def test_HCI_Number_Of_Completed_Packets_Event():
basic_check(event) basic_check(event)
# -----------------------------------------------------------------------------
def test_HCI_Vendor_Event():
data = bytes.fromhex('01020304')
event = HCI_Vendor_Event(data=data)
event_bytes = bytes(event)
parsed = HCI_Packet.from_bytes(event_bytes)
assert isinstance(parsed, HCI_Vendor_Event)
assert parsed.data == data
class HCI_Custom_Event(HCI_Event):
def __init__(self, blabla):
super().__init__(HCI_VENDOR_EVENT, parameters=struct.pack("<I", blabla))
self.name = 'HCI_CUSTOM_EVENT'
self.blabla = blabla
def create_event(payload):
if payload[0] == 1:
return HCI_Custom_Event(blabla=struct.unpack('<I', payload)[0])
return None
HCI_Event.add_vendor_factory(create_event)
parsed = HCI_Packet.from_bytes(event_bytes)
assert isinstance(parsed, HCI_Custom_Event)
assert parsed.blabla == 0x04030201
event_bytes2 = event_bytes[:3] + bytes([7]) + event_bytes[4:]
parsed = HCI_Packet.from_bytes(event_bytes2)
assert not isinstance(parsed, HCI_Custom_Event)
assert isinstance(parsed, HCI_Vendor_Event)
HCI_Event.remove_vendor_factory(create_event)
parsed = HCI_Packet.from_bytes(event_bytes)
assert not isinstance(parsed, HCI_Custom_Event)
assert isinstance(parsed, HCI_Vendor_Event)
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
def test_HCI_Command(): def test_HCI_Command():
command = HCI_Command(0x5566) command = HCI_Command(0x5566)
@@ -576,6 +614,7 @@ def run_test_events():
test_HCI_Command_Complete_Event() test_HCI_Command_Complete_Event()
test_HCI_Command_Status_Event() test_HCI_Command_Status_Event()
test_HCI_Number_Of_Completed_Packets_Event() test_HCI_Number_Of_Completed_Packets_Event()
test_HCI_Vendor_Event()
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------