bumble 0.0.204__py3-none-any.whl → 0.0.208__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. bumble/_version.py +9 -4
  2. bumble/apps/auracast.py +631 -98
  3. bumble/apps/bench.py +238 -157
  4. bumble/apps/console.py +19 -12
  5. bumble/apps/controller_info.py +23 -7
  6. bumble/apps/device_info.py +50 -4
  7. bumble/apps/gg_bridge.py +1 -1
  8. bumble/apps/lea_unicast/app.py +61 -201
  9. bumble/att.py +51 -37
  10. bumble/audio/__init__.py +17 -0
  11. bumble/audio/io.py +553 -0
  12. bumble/controller.py +24 -9
  13. bumble/core.py +305 -156
  14. bumble/device.py +1090 -99
  15. bumble/gatt.py +36 -226
  16. bumble/gatt_adapters.py +374 -0
  17. bumble/gatt_client.py +52 -33
  18. bumble/gatt_server.py +5 -5
  19. bumble/hci.py +812 -14
  20. bumble/host.py +367 -65
  21. bumble/l2cap.py +3 -16
  22. bumble/pairing.py +5 -5
  23. bumble/pandora/host.py +7 -12
  24. bumble/profiles/aics.py +48 -57
  25. bumble/profiles/ascs.py +8 -19
  26. bumble/profiles/asha.py +16 -14
  27. bumble/profiles/bass.py +16 -22
  28. bumble/profiles/battery_service.py +13 -3
  29. bumble/profiles/device_information_service.py +16 -14
  30. bumble/profiles/gap.py +12 -8
  31. bumble/profiles/gatt_service.py +167 -0
  32. bumble/profiles/gmap.py +198 -0
  33. bumble/profiles/hap.py +8 -6
  34. bumble/profiles/heart_rate_service.py +20 -4
  35. bumble/profiles/le_audio.py +87 -4
  36. bumble/profiles/mcp.py +11 -9
  37. bumble/profiles/pacs.py +61 -16
  38. bumble/profiles/tmap.py +8 -12
  39. bumble/profiles/{vcp.py → vcs.py} +35 -29
  40. bumble/profiles/vocs.py +62 -85
  41. bumble/sdp.py +223 -93
  42. bumble/smp.py +1 -1
  43. bumble/utils.py +12 -2
  44. bumble/vendor/android/hci.py +1 -1
  45. {bumble-0.0.204.dist-info → bumble-0.0.208.dist-info}/METADATA +13 -11
  46. {bumble-0.0.204.dist-info → bumble-0.0.208.dist-info}/RECORD +50 -46
  47. {bumble-0.0.204.dist-info → bumble-0.0.208.dist-info}/WHEEL +1 -1
  48. {bumble-0.0.204.dist-info → bumble-0.0.208.dist-info}/entry_points.txt +1 -0
  49. bumble/apps/lea_unicast/liblc3.wasm +0 -0
  50. {bumble-0.0.204.dist-info → bumble-0.0.208.dist-info}/LICENSE +0 -0
  51. {bumble-0.0.204.dist-info → bumble-0.0.208.dist-info}/top_level.txt +0 -0
bumble/hci.py CHANGED
@@ -129,6 +129,7 @@ HCI_VERSION_BLUETOOTH_CORE_5_1 = 10
129
129
  HCI_VERSION_BLUETOOTH_CORE_5_2 = 11
130
130
  HCI_VERSION_BLUETOOTH_CORE_5_3 = 12
131
131
  HCI_VERSION_BLUETOOTH_CORE_5_4 = 13
132
+ HCI_VERSION_BLUETOOTH_CORE_6_0 = 14
132
133
 
133
134
  HCI_VERSION_NAMES = {
134
135
  HCI_VERSION_BLUETOOTH_CORE_1_0B: 'HCI_VERSION_BLUETOOTH_CORE_1_0B',
@@ -145,6 +146,7 @@ HCI_VERSION_NAMES = {
145
146
  HCI_VERSION_BLUETOOTH_CORE_5_2: 'HCI_VERSION_BLUETOOTH_CORE_5_2',
146
147
  HCI_VERSION_BLUETOOTH_CORE_5_3: 'HCI_VERSION_BLUETOOTH_CORE_5_3',
147
148
  HCI_VERSION_BLUETOOTH_CORE_5_4: 'HCI_VERSION_BLUETOOTH_CORE_5_4',
149
+ HCI_VERSION_BLUETOOTH_CORE_6_0: 'HCI_VERSION_BLUETOOTH_CORE_6_0',
148
150
  }
149
151
 
150
152
  # LMP Version
@@ -273,7 +275,7 @@ HCI_LE_CS_READ_REMOTE_SUPPORTED_CAPABILITIES_COMPLETE_EVENT = 0x2C
273
275
  HCI_LE_CS_READ_REMOTE_FAE_TABLE_COMPLETE_EVENT = 0x2D
274
276
  HCI_LE_CS_SECURITY_ENABLE_COMPLETE_EVENT = 0x2E
275
277
  HCI_LE_CS_CONFIG_COMPLETE_EVENT = 0x2F
276
- HCI_LE_CS_PROCEDURE_ENABLE_EVENT = 0x30
278
+ HCI_LE_CS_PROCEDURE_ENABLE_COMPLETE_EVENT = 0x30
277
279
  HCI_LE_CS_SUBEVENT_RESULT_EVENT = 0x31
278
280
  HCI_LE_CS_SUBEVENT_RESULT_CONTINUE_EVENT = 0x32
279
281
  HCI_LE_CS_TEST_END_COMPLETE_EVENT = 0x33
@@ -597,7 +599,7 @@ HCI_LE_READ_ALL_LOCAL_SUPPORTED_FEATURES_COMMAND = hci_c
597
599
  HCI_LE_READ_ALL_REMOTE_FEATURES_COMMAND = hci_command_op_code(0x08, 0x0088)
598
600
  HCI_LE_CS_READ_LOCAL_SUPPORTED_CAPABILITIES_COMMAND = hci_command_op_code(0x08, 0x0089)
599
601
  HCI_LE_CS_READ_REMOTE_SUPPORTED_CAPABILITIES_COMMAND = hci_command_op_code(0x08, 0x008A)
600
- HCI_LE_CS_WRITE_CACHED_REMOTE_SUPPORTED_CAPABILITIES = hci_command_op_code(0x08, 0x008B)
602
+ HCI_LE_CS_WRITE_CACHED_REMOTE_SUPPORTED_CAPABILITIES_COMMAND = hci_command_op_code(0x08, 0x008B)
601
603
  HCI_LE_CS_SECURITY_ENABLE_COMMAND = hci_command_op_code(0x08, 0x008C)
602
604
  HCI_LE_CS_SET_DEFAULT_SETTINGS_COMMAND = hci_command_op_code(0x08, 0x008D)
603
605
  HCI_LE_CS_READ_REMOTE_FAE_TABLE_COMMAND = hci_command_op_code(0x08, 0x008E)
@@ -749,6 +751,67 @@ class PhyBit(enum.IntFlag):
749
751
  LE_CODED = 1 << HCI_LE_CODED_PHY_BIT
750
752
 
751
753
 
754
+ class CsRole(OpenIntEnum):
755
+ INITIATOR = 0x00
756
+ REFLECTOR = 0x01
757
+
758
+
759
+ class CsRoleMask(enum.IntFlag):
760
+ INITIATOR = 0x01
761
+ REFLECTOR = 0x02
762
+
763
+
764
+ class CsSyncPhy(OpenIntEnum):
765
+ LE_1M = 1
766
+ LE_2M = 2
767
+ LE_2M_2BT = 3
768
+
769
+
770
+ class CsSyncPhySupported(enum.IntFlag):
771
+ LE_2M = 0x01
772
+ LE_2M_2BT = 0x02
773
+
774
+
775
+ class RttType(OpenIntEnum):
776
+ AA_ONLY = 0x00
777
+ SOUNDING_SEQUENCE_32_BIT = 0x01
778
+ SOUNDING_SEQUENCE_96_BIT = 0x02
779
+ RANDOM_SEQUENCE_32_BIT = 0x03
780
+ RANDOM_SEQUENCE_64_BIT = 0x04
781
+ RANDOM_SEQUENCE_96_BIT = 0x05
782
+ RANDOM_SEQUENCE_128_BIT = 0x06
783
+
784
+
785
+ class CsSnr(OpenIntEnum):
786
+ SNR_18_DB = 0x00
787
+ SNR_21_DB = 0x01
788
+ SNR_24_DB = 0x02
789
+ SNR_27_DB = 0x03
790
+ SNR_30_DB = 0x04
791
+ NOT_APPLIED = 0xFF
792
+
793
+
794
+ class CsDoneStatus(OpenIntEnum):
795
+ ALL_RESULTS_COMPLETED = 0x00
796
+ PARTIAL = 0x01
797
+ ABORTED = 0x0F
798
+
799
+
800
+ class CsProcedureAbortReason(OpenIntEnum):
801
+ NO_ABORT = 0x00
802
+ LOCAL_HOST_OR_REMOTE_REQUEST = 0x01
803
+ CHANNEL_MAP_UPDATE_INSTANT_PASSED = 0x02
804
+ UNSPECIFIED = 0x0F
805
+
806
+
807
+ class CsSubeventAbortReason(OpenIntEnum):
808
+ NO_ABORT = 0x00
809
+ LOCAL_HOST_OR_REMOTE_REQUEST = 0x01
810
+ NO_CS_SYNC_RECEIVED = 0x02
811
+ SCHEDULING_CONFLICT_OR_LIMITED_RESOURCES = 0x03
812
+ UNSPECIFIED = 0x0F
813
+
814
+
752
815
  # Connection Parameters
753
816
  HCI_CONNECTION_INTERVAL_MS_PER_UNIT = 1.25
754
817
  HCI_CONNECTION_LATENCY_MS_PER_UNIT = 1.25
@@ -969,7 +1032,7 @@ HCI_SUPPORTED_COMMANDS_MASKS = {
969
1032
  HCI_READ_ENCRYPTION_KEY_SIZE_COMMAND : 1 << (20*8+4),
970
1033
  HCI_LE_CS_READ_LOCAL_SUPPORTED_CAPABILITIES_COMMAND : 1 << (20*8+5),
971
1034
  HCI_LE_CS_READ_REMOTE_SUPPORTED_CAPABILITIES_COMMAND : 1 << (20*8+6),
972
- HCI_LE_CS_WRITE_CACHED_REMOTE_SUPPORTED_CAPABILITIES : 1 << (20*8+7),
1035
+ HCI_LE_CS_WRITE_CACHED_REMOTE_SUPPORTED_CAPABILITIES_COMMAND : 1 << (20*8+7),
973
1036
  HCI_SET_EVENT_MASK_PAGE_2_COMMAND : 1 << (22*8+2),
974
1037
  HCI_READ_FLOW_CONTROL_MODE_COMMAND : 1 << (23*8+0),
975
1038
  HCI_WRITE_FLOW_CONTROL_MODE_COMMAND : 1 << (23*8+1),
@@ -1460,6 +1523,12 @@ class LmpFeatureMask(enum.IntFlag):
1460
1523
  # -----------------------------------------------------------------------------
1461
1524
  # pylint: disable-next=unnecessary-lambda
1462
1525
  STATUS_SPEC = {'size': 1, 'mapper': lambda x: HCI_Constant.status_name(x)}
1526
+ CS_ROLE_SPEC = {'size': 1, 'mapper': lambda x: CsRole(x).name}
1527
+ CS_ROLE_MASK_SPEC = {'size': 1, 'mapper': lambda x: CsRoleMask(x).name}
1528
+ CS_SYNC_PHY_SPEC = {'size': 1, 'mapper': lambda x: CsSyncPhy(x).name}
1529
+ CS_SYNC_PHY_SUPPORTED_SPEC = {'size': 1, 'mapper': lambda x: CsSyncPhySupported(x).name}
1530
+ RTT_TYPE_SPEC = {'size': 1, 'mapper': lambda x: RttType(x).name}
1531
+ CS_SNR_SPEC = {'size': 1, 'mapper': lambda x: CsSnr(x).name}
1463
1532
 
1464
1533
 
1465
1534
  class CodecID(OpenIntEnum):
@@ -3537,8 +3606,8 @@ class HCI_LE_Set_Event_Mask_Command(HCI_Command):
3537
3606
  @HCI_Command.command(
3538
3607
  return_parameters_fields=[
3539
3608
  ('status', STATUS_SPEC),
3540
- ('hc_le_acl_data_packet_length', 2),
3541
- ('hc_total_num_le_acl_data_packets', 1),
3609
+ ('le_acl_data_packet_length', 2),
3610
+ ('total_num_le_acl_data_packets', 1),
3542
3611
  ]
3543
3612
  )
3544
3613
  class HCI_LE_Read_Buffer_Size_Command(HCI_Command):
@@ -3547,6 +3616,22 @@ class HCI_LE_Read_Buffer_Size_Command(HCI_Command):
3547
3616
  '''
3548
3617
 
3549
3618
 
3619
+ # -----------------------------------------------------------------------------
3620
+ @HCI_Command.command(
3621
+ return_parameters_fields=[
3622
+ ('status', STATUS_SPEC),
3623
+ ('le_acl_data_packet_length', 2),
3624
+ ('total_num_le_acl_data_packets', 1),
3625
+ ('iso_data_packet_length', 2),
3626
+ ('total_num_iso_data_packets', 1),
3627
+ ]
3628
+ )
3629
+ class HCI_LE_Read_Buffer_Size_V2_Command(HCI_Command):
3630
+ '''
3631
+ See Bluetooth spec @ 7.8.2 LE Read Buffer Size V2 Command
3632
+ '''
3633
+
3634
+
3550
3635
  # -----------------------------------------------------------------------------
3551
3636
  @HCI_Command.command(
3552
3637
  return_parameters_fields=[('status', STATUS_SPEC), ('le_features', 8)]
@@ -4793,6 +4878,62 @@ class HCI_LE_Periodic_Advertising_Sync_Transfer_Command(HCI_Command):
4793
4878
  '''
4794
4879
 
4795
4880
 
4881
+ # -----------------------------------------------------------------------------
4882
+ @HCI_Command.command(
4883
+ fields=[
4884
+ ('connection_handle', 2),
4885
+ ('mode', 1),
4886
+ ('skip', 2),
4887
+ ('sync_timeout', 2),
4888
+ (
4889
+ 'cte_type',
4890
+ {
4891
+ 'size': 1,
4892
+ 'mapper': lambda x: HCI_LE_Periodic_Advertising_Report_Event.CteType(
4893
+ x
4894
+ ).name,
4895
+ },
4896
+ ),
4897
+ ],
4898
+ return_parameters_fields=[
4899
+ ('status', STATUS_SPEC),
4900
+ ('connection_handle', 2),
4901
+ ],
4902
+ )
4903
+ class HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters_Command(HCI_Command):
4904
+ '''
4905
+ See Bluetooth spec @ 7.8.91 LE Set Periodic Advertising Sync Transfer Parameters command
4906
+ '''
4907
+
4908
+
4909
+ # -----------------------------------------------------------------------------
4910
+ @HCI_Command.command(
4911
+ fields=[
4912
+ ('mode', 1),
4913
+ ('skip', 2),
4914
+ ('sync_timeout', 2),
4915
+ (
4916
+ 'cte_type',
4917
+ {
4918
+ 'size': 1,
4919
+ 'mapper': lambda x: HCI_LE_Periodic_Advertising_Report_Event.CteType(
4920
+ x
4921
+ ).name,
4922
+ },
4923
+ ),
4924
+ ],
4925
+ return_parameters_fields=[
4926
+ ('status', STATUS_SPEC),
4927
+ ],
4928
+ )
4929
+ class HCI_LE_Set_Default_Periodic_Advertising_Sync_Transfer_Parameters_Command(
4930
+ HCI_Command
4931
+ ):
4932
+ '''
4933
+ See Bluetooth spec @ 7.8.92 LE Set Default Periodic Advertising Sync Transfer Parameters command
4934
+ '''
4935
+
4936
+
4796
4937
  # -----------------------------------------------------------------------------
4797
4938
  @HCI_Command.command(
4798
4939
  fields=[
@@ -4934,7 +5075,7 @@ class HCI_LE_Create_BIG_Command(HCI_Command):
4934
5075
  packing: int
4935
5076
  framing: int
4936
5077
  encryption: int
4937
- broadcast_code: int
5078
+ broadcast_code: bytes
4938
5079
 
4939
5080
 
4940
5081
  # -----------------------------------------------------------------------------
@@ -5057,6 +5198,275 @@ class HCI_LE_Set_Host_Feature_Command(HCI_Command):
5057
5198
  '''
5058
5199
 
5059
5200
 
5201
+ # -----------------------------------------------------------------------------
5202
+ @HCI_Command.command(
5203
+ return_parameters_fields=[
5204
+ ('status', STATUS_SPEC),
5205
+ ('num_config_supported', 1),
5206
+ ('max_consecutive_procedures_supported', 2),
5207
+ ('num_antennas_supported', 1),
5208
+ ('max_antenna_paths_supported', 1),
5209
+ ('roles_supported', 1),
5210
+ ('modes_supported', 1),
5211
+ ('rtt_capability', 1),
5212
+ ('rtt_aa_only_n', 1),
5213
+ ('rtt_sounding_n', 1),
5214
+ ('rtt_random_payload_n', 1),
5215
+ ('nadm_sounding_capability', 2),
5216
+ ('nadm_random_capability', 2),
5217
+ ('cs_sync_phys_supported', CS_SYNC_PHY_SUPPORTED_SPEC),
5218
+ ('subfeatures_supported', 2),
5219
+ ('t_ip1_times_supported', 2),
5220
+ ('t_ip2_times_supported', 2),
5221
+ ('t_fcs_times_supported', 2),
5222
+ ('t_pm_times_supported', 2),
5223
+ ('t_sw_time_supported', 1),
5224
+ ('tx_snr_capability', CS_SNR_SPEC),
5225
+ ]
5226
+ )
5227
+ class HCI_LE_CS_Read_Local_Supported_Capabilities_Command(HCI_Command):
5228
+ '''
5229
+ See Bluetooth spec @ 7.8.130 LE CS Read Local Supported Capabilities command
5230
+ '''
5231
+
5232
+
5233
+ # -----------------------------------------------------------------------------
5234
+ @HCI_Command.command([('connection_handle', 2)])
5235
+ class HCI_LE_CS_Read_Remote_Supported_Capabilities_Command(HCI_Command):
5236
+ '''
5237
+ See Bluetooth spec @ 7.8.131 LE CS Read Remote Supported Capabilities command
5238
+ '''
5239
+
5240
+
5241
+ # -----------------------------------------------------------------------------
5242
+ @HCI_Command.command(
5243
+ [
5244
+ ('connection_handle', 2),
5245
+ ('num_config_supported', 1),
5246
+ ('max_consecutive_procedures_supported', 2),
5247
+ ('num_antennas_supported', 1),
5248
+ ('max_antenna_paths_supported', 1),
5249
+ ('roles_supported', 1),
5250
+ ('modes_supported', 1),
5251
+ ('rtt_capability', 1),
5252
+ ('rtt_aa_only_n', 1),
5253
+ ('rtt_sounding_n', 1),
5254
+ ('rtt_random_payload_n', 1),
5255
+ ('nadm_sounding_capability', 2),
5256
+ ('nadm_random_capability', 2),
5257
+ ('cs_sync_phys_supported', CS_SYNC_PHY_SUPPORTED_SPEC),
5258
+ ('subfeatures_supported', 2),
5259
+ ('t_ip1_times_supported', 2),
5260
+ ('t_ip2_times_supported', 2),
5261
+ ('t_fcs_times_supported', 2),
5262
+ ('t_pm_times_supported', 2),
5263
+ ('t_sw_time_supported', 1),
5264
+ ('tx_snr_capability', CS_SNR_SPEC),
5265
+ ],
5266
+ return_parameters_fields=[
5267
+ ('status', STATUS_SPEC),
5268
+ ('connection_handle', 2),
5269
+ ],
5270
+ )
5271
+ class HCI_LE_CS_Write_Cached_Remote_Supported_Capabilities_Command(HCI_Command):
5272
+ '''
5273
+ See Bluetooth spec @ 7.8.132 LE CS Write Cached Remote Supported Capabilities command
5274
+ '''
5275
+
5276
+
5277
+ # -----------------------------------------------------------------------------
5278
+ @HCI_Command.command([('connection_handle', 2)])
5279
+ class HCI_LE_CS_Security_Enable_Command(HCI_Command):
5280
+ '''
5281
+ See Bluetooth spec @ 7.8.133 LE CS Security Enable command
5282
+ '''
5283
+
5284
+
5285
+ # -----------------------------------------------------------------------------
5286
+ @HCI_Command.command(
5287
+ [
5288
+ ('connection_handle', 2),
5289
+ (
5290
+ 'role_enable',
5291
+ CS_ROLE_MASK_SPEC,
5292
+ ),
5293
+ ('cs_sync_antenna_selection', 1),
5294
+ ('max_tx_power', 1),
5295
+ ],
5296
+ return_parameters_fields=[('status', STATUS_SPEC), ('connection_handle', 2)],
5297
+ )
5298
+ class HCI_LE_CS_Set_Default_Settings_Command(HCI_Command):
5299
+ '''
5300
+ See Bluetooth spec @ 7.8.134 LE CS Security Enable command
5301
+ '''
5302
+
5303
+
5304
+ # -----------------------------------------------------------------------------
5305
+ @HCI_Command.command([('connection_handle', 2)])
5306
+ class HCI_LE_CS_Read_Remote_FAE_Table_Command(HCI_Command):
5307
+ '''
5308
+ See Bluetooth spec @ 7.8.135 LE CS Read Remote FAE Table command
5309
+ '''
5310
+
5311
+
5312
+ # -----------------------------------------------------------------------------
5313
+ @HCI_Command.command(
5314
+ [
5315
+ ('connection_handle', 2),
5316
+ ('remote_fae_table', 72),
5317
+ ],
5318
+ return_parameters_fields=[('status', STATUS_SPEC), ('connection_handle', 2)],
5319
+ )
5320
+ class HCI_LE_CS_Write_Cached_Remote_FAE_Table_Command(HCI_Command):
5321
+ '''
5322
+ See Bluetooth spec @ 7.8.136 LE CS Write Cached Remote FAE Table command
5323
+ '''
5324
+
5325
+
5326
+ # -----------------------------------------------------------------------------
5327
+ @HCI_Command.command(
5328
+ [
5329
+ ('connection_handle', 2),
5330
+ ('config_id', 1),
5331
+ ('create_context', 1),
5332
+ ('main_mode_type', 1),
5333
+ ('sub_mode_type', 1),
5334
+ ('min_main_mode_steps', 1),
5335
+ ('max_main_mode_steps', 1),
5336
+ ('main_mode_repetition', 1),
5337
+ ('mode_0_steps', 1),
5338
+ ('role', CS_ROLE_SPEC),
5339
+ ('rtt_type', RTT_TYPE_SPEC),
5340
+ ('cs_sync_phy', CS_SYNC_PHY_SPEC),
5341
+ ('channel_map', 10),
5342
+ ('channel_map_repetition', 1),
5343
+ ('channel_selection_type', 1),
5344
+ ('ch3c_shape', 1),
5345
+ ('ch3c_jump', 1),
5346
+ ('reserved', 1),
5347
+ ],
5348
+ )
5349
+ class HCI_LE_CS_Create_Config_Command(HCI_Command):
5350
+ '''
5351
+ See Bluetooth spec @ 7.8.137 LE CS Create Config command
5352
+ '''
5353
+
5354
+ class ChannelSelectionType(OpenIntEnum):
5355
+ ALGO_3B = 0
5356
+ ALGO_3C = 1
5357
+
5358
+ class Ch3cShape(OpenIntEnum):
5359
+ HAT = 0x00
5360
+ X = 0x01
5361
+
5362
+
5363
+ # -----------------------------------------------------------------------------
5364
+ @HCI_Command.command(
5365
+ [
5366
+ ('connection_handle', 2),
5367
+ ('config_id', 1),
5368
+ ],
5369
+ )
5370
+ class HCI_LE_CS_Remove_Config_Command(HCI_Command):
5371
+ '''
5372
+ See Bluetooth spec @ 7.8.138 LE CS Remove Config command
5373
+ '''
5374
+
5375
+
5376
+ # -----------------------------------------------------------------------------
5377
+ @HCI_Command.command(
5378
+ [('channel_classification', 10)], return_parameters_fields=[('status', STATUS_SPEC)]
5379
+ )
5380
+ class HCI_LE_CS_Set_Channel_Classification_Command(HCI_Command):
5381
+ '''
5382
+ See Bluetooth spec @ 7.8.139 LE CS Set Channel Classification command
5383
+ '''
5384
+
5385
+
5386
+ # -----------------------------------------------------------------------------
5387
+ @HCI_Command.command(
5388
+ [
5389
+ ('connection_handle', 2),
5390
+ ('config_id', 1),
5391
+ ('max_procedure_len', 2),
5392
+ ('min_procedure_interval', 2),
5393
+ ('max_procedure_interval', 2),
5394
+ ('max_procedure_count', 2),
5395
+ ('min_subevent_len', 3),
5396
+ ('max_subevent_len', 3),
5397
+ ('tone_antenna_config_selection', 1),
5398
+ ('phy', 1),
5399
+ ('tx_power_delta', 1),
5400
+ ('preferred_peer_antenna', 1),
5401
+ ('snr_control_initiator', CS_SNR_SPEC),
5402
+ ('snr_control_reflector', CS_SNR_SPEC),
5403
+ ],
5404
+ return_parameters_fields=[('status', STATUS_SPEC), ('connection_handle', 2)],
5405
+ )
5406
+ class HCI_LE_CS_Set_Procedure_Parameters_Command(HCI_Command):
5407
+ '''
5408
+ See Bluetooth spec @ 7.8.140 LE CS Set Procedure Parameters command
5409
+ '''
5410
+
5411
+
5412
+ # -----------------------------------------------------------------------------
5413
+ @HCI_Command.command(
5414
+ [
5415
+ ('connection_handle', 2),
5416
+ ('config_id', 1),
5417
+ ('enable', 1),
5418
+ ],
5419
+ )
5420
+ class HCI_LE_CS_Procedure_Enable_Command(HCI_Command):
5421
+ '''
5422
+ See Bluetooth spec @ 7.8.141 LE CS Procedure Enable command
5423
+ '''
5424
+
5425
+
5426
+ # -----------------------------------------------------------------------------
5427
+ @HCI_Command.command(
5428
+ [
5429
+ ('main_mode_type', 1),
5430
+ ('sub_mode_type', 1),
5431
+ ('main_mode_repetition', 1),
5432
+ ('mode_0_steps', 1),
5433
+ ('role', CS_ROLE_SPEC),
5434
+ ('rtt_type', RTT_TYPE_SPEC),
5435
+ ('cs_sync_phy', CS_SYNC_PHY_SPEC),
5436
+ ('cs_sync_antenna_selection', 1),
5437
+ ('subevent_len', 3),
5438
+ ('subevent_interval', 2),
5439
+ ('max_num_subevents', 1),
5440
+ ('transmit_power_level', 1),
5441
+ ('t_ip1_time', 1),
5442
+ ('t_ip2_time', 1),
5443
+ ('t_fcs_time', 1),
5444
+ ('t_pm_time', 1),
5445
+ ('t_sw_time', 1),
5446
+ ('tone_antenna_config_selection', 1),
5447
+ ('reserved', 1),
5448
+ ('snr_control_initiator', CS_SNR_SPEC),
5449
+ ('snr_control_reflector', CS_SNR_SPEC),
5450
+ ('drbg_nonce', 2),
5451
+ ('channel_map_repetition', 1),
5452
+ ('override_config', 2),
5453
+ ('override_parameters_data', 'v'),
5454
+ ],
5455
+ )
5456
+ class HCI_LE_CS_Test_Command(HCI_Command):
5457
+ '''
5458
+ See Bluetooth spec @ 7.8.142 LE CS Test command
5459
+ '''
5460
+
5461
+
5462
+ # -----------------------------------------------------------------------------
5463
+ @HCI_Command.command()
5464
+ class HCI_LE_CS_Test_End_Command(HCI_Command):
5465
+ '''
5466
+ See Bluetooth spec @ 7.8.143 LE CS Test End command
5467
+ '''
5468
+
5469
+
5060
5470
  # -----------------------------------------------------------------------------
5061
5471
  # HCI Events
5062
5472
  # -----------------------------------------------------------------------------
@@ -5068,7 +5478,7 @@ class HCI_Event(HCI_Packet):
5068
5478
  hci_packet_type = HCI_EVENT_PACKET
5069
5479
  event_names: Dict[int, str] = {}
5070
5480
  event_classes: Dict[int, Type[HCI_Event]] = {}
5071
- vendor_factory: Optional[Callable[[bytes], Optional[HCI_Event]]] = None
5481
+ vendor_factories: list[Callable[[bytes], Optional[HCI_Event]]] = []
5072
5482
 
5073
5483
  @staticmethod
5074
5484
  def event(fields=()):
@@ -5126,6 +5536,19 @@ class HCI_Event(HCI_Packet):
5126
5536
 
5127
5537
  return event_class
5128
5538
 
5539
+ @classmethod
5540
+ def add_vendor_factory(
5541
+ cls, factory: Callable[[bytes], Optional[HCI_Event]]
5542
+ ) -> None:
5543
+ cls.vendor_factories.append(factory)
5544
+
5545
+ @classmethod
5546
+ def remove_vendor_factory(
5547
+ cls, factory: Callable[[bytes], Optional[HCI_Event]]
5548
+ ) -> None:
5549
+ if factory in cls.vendor_factories:
5550
+ cls.vendor_factories.remove(factory)
5551
+
5129
5552
  @classmethod
5130
5553
  def from_bytes(cls, packet: bytes) -> HCI_Event:
5131
5554
  event_code = packet[1]
@@ -5146,13 +5569,13 @@ class HCI_Event(HCI_Packet):
5146
5569
  elif event_code == HCI_VENDOR_EVENT:
5147
5570
  # Invoke all the registered factories to see if any of them can handle
5148
5571
  # the event
5149
- if cls.vendor_factory:
5150
- if event := cls.vendor_factory(parameters):
5572
+ for vendor_factory in cls.vendor_factories:
5573
+ if event := vendor_factory(parameters):
5151
5574
  return event
5152
5575
 
5153
5576
  # No factory, or the factory could not create an instance,
5154
5577
  # return a generic vendor event
5155
- return HCI_Event(event_code, parameters)
5578
+ return HCI_Vendor_Event(data=parameters)
5156
5579
  else:
5157
5580
  subclass = HCI_Event.event_classes.get(event_code)
5158
5581
  if subclass is None:
@@ -5823,7 +6246,7 @@ class HCI_LE_Periodic_Advertising_Sync_Lost_Event(HCI_LE_Meta_Event):
5823
6246
  # -----------------------------------------------------------------------------
5824
6247
  @HCI_LE_Meta_Event.event(
5825
6248
  [
5826
- ('status', 1),
6249
+ ('status', STATUS_SPEC),
5827
6250
  ('advertising_handle', 1),
5828
6251
  ('connection_handle', 2),
5829
6252
  ('num_completed_extended_advertising_events', 1),
@@ -5864,6 +6287,31 @@ class HCI_LE_Periodic_Advertising_Sync_Transfer_Received_Event(HCI_LE_Meta_Event
5864
6287
  '''
5865
6288
 
5866
6289
 
6290
+ # -----------------------------------------------------------------------------
6291
+ @HCI_LE_Meta_Event.event(
6292
+ [
6293
+ ('status', STATUS_SPEC),
6294
+ ('connection_handle', 2),
6295
+ ('service_data', 2),
6296
+ ('sync_handle', 2),
6297
+ ('advertising_sid', 1),
6298
+ ('advertiser_address_type', Address.ADDRESS_TYPE_SPEC),
6299
+ ('advertiser_address', Address.parse_address_preceded_by_type),
6300
+ ('advertiser_phy', 1),
6301
+ ('periodic_advertising_interval', 2),
6302
+ ('advertiser_clock_accuracy', 1),
6303
+ ('num_subevents', 1),
6304
+ ('subevent_interval', 1),
6305
+ ('response_slot_delay', 1),
6306
+ ('response_slot_spacing', 1),
6307
+ ]
6308
+ )
6309
+ class HCI_LE_Periodic_Advertising_Sync_Transfer_Received_V2_Event(HCI_LE_Meta_Event):
6310
+ '''
6311
+ See Bluetooth spec @ 7.7.65.24 LE Periodic Advertising Sync Transfer Received Event
6312
+ '''
6313
+
6314
+
5867
6315
  # -----------------------------------------------------------------------------
5868
6316
  @HCI_LE_Meta_Event.event(
5869
6317
  [
@@ -5906,6 +6354,70 @@ class HCI_LE_CIS_Request_Event(HCI_LE_Meta_Event):
5906
6354
  '''
5907
6355
 
5908
6356
 
6357
+ # -----------------------------------------------------------------------------
6358
+ @HCI_LE_Meta_Event.event(
6359
+ [
6360
+ ('status', STATUS_SPEC),
6361
+ ('big_handle', 1),
6362
+ ('big_sync_delay', 3),
6363
+ ('transport_latency_big', 3),
6364
+ ('phy', 1),
6365
+ ('nse', 1),
6366
+ ('bn', 1),
6367
+ ('pto', 1),
6368
+ ('irc', 1),
6369
+ ('max_pdu', 2),
6370
+ ('iso_interval', 2),
6371
+ [('connection_handle', 2)],
6372
+ ]
6373
+ )
6374
+ class HCI_LE_Create_BIG_Complete_Event(HCI_LE_Meta_Event):
6375
+ '''
6376
+ See Bluetooth spec @ 7.7.65.27 LE Create BIG Complete Event
6377
+ '''
6378
+
6379
+
6380
+ # -----------------------------------------------------------------------------
6381
+ @HCI_LE_Meta_Event.event([('big_handle', 1), ('reason', 1)])
6382
+ class HCI_LE_Terminate_BIG_Complete_Event(HCI_LE_Meta_Event):
6383
+ '''
6384
+ See Bluetooth spec @ 7.7.65.28 LE Terminate BIG Complete Event
6385
+ '''
6386
+
6387
+
6388
+ # -----------------------------------------------------------------------------
6389
+
6390
+
6391
+ @HCI_LE_Meta_Event.event(
6392
+ [
6393
+ ('status', STATUS_SPEC),
6394
+ ('big_handle', 1),
6395
+ ('transport_latency_big', 3),
6396
+ ('nse', 1),
6397
+ ('bn', 1),
6398
+ ('pto', 1),
6399
+ ('irc', 1),
6400
+ ('max_pdu', 2),
6401
+ ('iso_interval', 2),
6402
+ [('connection_handle', 2)],
6403
+ ]
6404
+ )
6405
+ class HCI_LE_BIG_Sync_Established_Event(HCI_LE_Meta_Event):
6406
+ '''
6407
+ See Bluetooth spec @ 7.7.65.29 LE BIG Sync Established event
6408
+ '''
6409
+
6410
+
6411
+ # -----------------------------------------------------------------------------
6412
+
6413
+
6414
+ @HCI_LE_Meta_Event.event([('big_handle', 1), ('reason', 1)])
6415
+ class HCI_LE_BIG_Sync_Lost_Event(HCI_LE_Meta_Event):
6416
+ '''
6417
+ See Bluetooth spec @ 7.7.65.30 LE BIG Sync Lost event
6418
+ '''
6419
+
6420
+
5909
6421
  # -----------------------------------------------------------------------------
5910
6422
  @HCI_LE_Meta_Event.event(
5911
6423
  [
@@ -5930,6 +6442,291 @@ class HCI_LE_BIGInfo_Advertising_Report_Event(HCI_LE_Meta_Event):
5930
6442
  '''
5931
6443
 
5932
6444
 
6445
+ # -----------------------------------------------------------------------------
6446
+ @HCI_LE_Meta_Event.event(
6447
+ [
6448
+ ('status', STATUS_SPEC),
6449
+ ('connection_handle', 2),
6450
+ ('num_config_supported', 1),
6451
+ ('max_consecutive_procedures_supported', 2),
6452
+ ('num_antennas_supported', 1),
6453
+ ('max_antenna_paths_supported', 1),
6454
+ ('roles_supported', 1),
6455
+ ('modes_supported', 1),
6456
+ ('rtt_capability', 1),
6457
+ ('rtt_aa_only_n', 1),
6458
+ ('rtt_sounding_n', 1),
6459
+ ('rtt_random_payload_n', 1),
6460
+ ('nadm_sounding_capability', 2),
6461
+ ('nadm_random_capability', 2),
6462
+ ('cs_sync_phys_supported', CS_SYNC_PHY_SUPPORTED_SPEC),
6463
+ ('subfeatures_supported', 2),
6464
+ ('t_ip1_times_supported', 2),
6465
+ ('t_ip2_times_supported', 2),
6466
+ ('t_fcs_times_supported', 2),
6467
+ ('t_pm_times_supported', 2),
6468
+ ('t_sw_time_supported', 1),
6469
+ ('tx_snr_capability', CS_SNR_SPEC),
6470
+ ]
6471
+ )
6472
+ class HCI_LE_CS_Read_Remote_Supported_Capabilities_Complete_Event(HCI_LE_Meta_Event):
6473
+ '''
6474
+ See Bluetooth spec @ 7.7.65.39 LE CS Read Remote Supported Capabilities Complete event
6475
+ '''
6476
+
6477
+ status: int
6478
+ connection_handle: int
6479
+ num_config_supported: int
6480
+ max_consecutive_procedures_supported: int
6481
+ num_antennas_supported: int
6482
+ max_antenna_paths_supported: int
6483
+ roles_supported: int
6484
+ modes_supported: int
6485
+ rtt_capability: int
6486
+ rtt_aa_only_n: int
6487
+ rtt_sounding_n: int
6488
+ rtt_random_payload_n: int
6489
+ nadm_sounding_capability: int
6490
+ nadm_random_capability: int
6491
+ cs_sync_phys_supported: int
6492
+ subfeatures_supported: int
6493
+ t_ip1_times_supported: int
6494
+ t_ip2_times_supported: int
6495
+ t_fcs_times_supported: int
6496
+ t_pm_times_supported: int
6497
+ t_sw_time_supported: int
6498
+ tx_snr_capability: int
6499
+
6500
+
6501
+ # -----------------------------------------------------------------------------
6502
+ @HCI_LE_Meta_Event.event(
6503
+ [
6504
+ ('status', STATUS_SPEC),
6505
+ ('connection_handle', 2),
6506
+ ('remote_fae_table', 72),
6507
+ ]
6508
+ )
6509
+ class HCI_LE_CS_Read_Remote_FAE_Table_Complete_Event(HCI_LE_Meta_Event):
6510
+ '''
6511
+ See Bluetooth spec @ 7.7.65.40 LE CS Read Remote FAE Table Complete event
6512
+ '''
6513
+
6514
+ status: int
6515
+ connection_handle: int
6516
+ remote_fae_table: bytes
6517
+
6518
+
6519
+ # -----------------------------------------------------------------------------
6520
+ @HCI_LE_Meta_Event.event(
6521
+ [
6522
+ ('status', STATUS_SPEC),
6523
+ ('connection_handle', 2),
6524
+ ]
6525
+ )
6526
+ class HCI_LE_CS_Security_Enable_Complete_Event(HCI_LE_Meta_Event):
6527
+ '''
6528
+ See Bluetooth spec @ 7.7.65.41 LE CS Security Enable Complete event
6529
+ '''
6530
+
6531
+ status: int
6532
+ connection_handle: int
6533
+
6534
+
6535
+ # -----------------------------------------------------------------------------
6536
+ @HCI_LE_Meta_Event.event(
6537
+ [
6538
+ ('status', STATUS_SPEC),
6539
+ ('connection_handle', 2),
6540
+ ('config_id', 1),
6541
+ (
6542
+ 'action',
6543
+ {
6544
+ 'size': 1,
6545
+ 'mapper': lambda x: HCI_LE_CS_Config_Complete_Event.Action(x).name,
6546
+ },
6547
+ ),
6548
+ ('main_mode_type', 1),
6549
+ ('sub_mode_type', 1),
6550
+ ('min_main_mode_steps', 1),
6551
+ ('max_main_mode_steps', 1),
6552
+ ('main_mode_repetition', 1),
6553
+ ('mode_0_steps', 1),
6554
+ ('role', CS_ROLE_SPEC),
6555
+ ('rtt_type', RTT_TYPE_SPEC),
6556
+ ('cs_sync_phy', CS_SYNC_PHY_SPEC),
6557
+ ('channel_map', 10),
6558
+ ('channel_map_repetition', 1),
6559
+ ('channel_selection_type', 1),
6560
+ ('ch3c_shape', 1),
6561
+ ('ch3c_jump', 1),
6562
+ ('reserved', 1),
6563
+ ('t_ip1_time', 1),
6564
+ ('t_ip2_time', 1),
6565
+ ('t_fcs_time', 1),
6566
+ ('t_pm_time', 1),
6567
+ ]
6568
+ )
6569
+ class HCI_LE_CS_Config_Complete_Event(HCI_LE_Meta_Event):
6570
+ '''
6571
+ See Bluetooth spec @ 7.7.65.42 LE CS Config Complete event
6572
+ '''
6573
+
6574
+ class Action(OpenIntEnum):
6575
+ REMOVED = 0
6576
+ CREATED = 1
6577
+
6578
+ status: int
6579
+ connection_handle: int
6580
+ config_id: int
6581
+ action: int
6582
+ main_mode_type: int
6583
+ sub_mode_type: int
6584
+ min_main_mode_steps: int
6585
+ max_main_mode_steps: int
6586
+ main_mode_repetition: int
6587
+ mode_0_steps: int
6588
+ role: int
6589
+ rtt_type: int
6590
+ cs_sync_phy: int
6591
+ channel_map: bytes
6592
+ channel_map_repetition: int
6593
+ channel_selection_type: int
6594
+ ch3c_shape: int
6595
+ ch3c_jump: int
6596
+ reserved: int
6597
+ t_ip1_time: int
6598
+ t_ip2_time: int
6599
+ t_fcs_time: int
6600
+ t_pm_time: int
6601
+
6602
+
6603
+ # -----------------------------------------------------------------------------
6604
+ @HCI_LE_Meta_Event.event(
6605
+ [
6606
+ ('status', STATUS_SPEC),
6607
+ ('connection_handle', 2),
6608
+ ('config_id', 1),
6609
+ ('state', 1),
6610
+ ('tone_antenna_config_selection', 1),
6611
+ ('selected_tx_power', -1),
6612
+ ('subevent_len', 3),
6613
+ ('subevents_per_event', 1),
6614
+ ('subevent_interval', 2),
6615
+ ('event_interval', 2),
6616
+ ('procedure_interval', 2),
6617
+ ('procedure_count', 2),
6618
+ ('max_procedure_len', 2),
6619
+ ]
6620
+ )
6621
+ class HCI_LE_CS_Procedure_Enable_Complete_Event(HCI_LE_Meta_Event):
6622
+ '''
6623
+ See Bluetooth spec @ 7.7.65.43 LE CS Procedure Enable Complete event
6624
+ '''
6625
+
6626
+ class State(OpenIntEnum):
6627
+ DISABLED = 0
6628
+ ENABLED = 1
6629
+
6630
+ status: int
6631
+ connection_handle: int
6632
+ config_id: int
6633
+ state: int
6634
+ tone_antenna_config_selection: int
6635
+ selected_tx_power: int
6636
+ subevent_len: int
6637
+ subevents_per_event: int
6638
+ subevent_interval: int
6639
+ event_interval: int
6640
+ procedure_interval: int
6641
+ procedure_count: int
6642
+ max_procedure_len: int
6643
+
6644
+
6645
+ # -----------------------------------------------------------------------------
6646
+ @HCI_LE_Meta_Event.event(
6647
+ [
6648
+ ('connection_handle', 2),
6649
+ ('config_id', 1),
6650
+ ('start_acl_conn_event_counter', 2),
6651
+ ('procedure_counter', 2),
6652
+ ('frequency_compensation', 2),
6653
+ ('reference_power_level', -1),
6654
+ ('procedure_done_status', 1),
6655
+ ('subevent_done_status', 1),
6656
+ ('abort_reason', 1),
6657
+ ('num_antenna_paths', 1),
6658
+ [
6659
+ ('step_mode', 1),
6660
+ ('step_channel', 1),
6661
+ ('step_data', 'v'),
6662
+ ],
6663
+ ]
6664
+ )
6665
+ class HCI_LE_CS_Subevent_Result_Event(HCI_LE_Meta_Event):
6666
+ '''
6667
+ See Bluetooth spec @ 7.7.65.44 LE CS Subevent Result event
6668
+ '''
6669
+
6670
+ connection_handle: int
6671
+ config_id: int
6672
+ start_acl_conn_event_counter: int
6673
+ procedure_counter: int
6674
+ frequency_compensation: int
6675
+ reference_power_level: int
6676
+ procedure_done_status: int
6677
+ subevent_done_status: int
6678
+ abort_reason: int
6679
+ num_antenna_paths: int
6680
+ step_mode: list[int]
6681
+ step_channel: list[int]
6682
+ step_data: list[bytes]
6683
+
6684
+
6685
+ # -----------------------------------------------------------------------------
6686
+ @HCI_LE_Meta_Event.event(
6687
+ [
6688
+ ('connection_handle', 2),
6689
+ ('config_id', 1),
6690
+ ('procedure_done_status', 1),
6691
+ ('subevent_done_status', 1),
6692
+ ('abort_reason', 1),
6693
+ ('num_antenna_paths', 1),
6694
+ [
6695
+ ('step_mode', 1),
6696
+ ('step_channel', 1),
6697
+ ('step_data', 'v'),
6698
+ ],
6699
+ ]
6700
+ )
6701
+ class HCI_LE_CS_Subevent_Result_Continue_Event(HCI_LE_Meta_Event):
6702
+ '''
6703
+ See Bluetooth spec @ 7.7.65.45 LE CS Subevent Result Continue event
6704
+ '''
6705
+
6706
+ connection_handle: int
6707
+ config_id: int
6708
+ procedure_done_status: int
6709
+ subevent_done_status: int
6710
+ abort_reason: int
6711
+ num_antenna_paths: int
6712
+ step_mode: list[int]
6713
+ step_channel: list[int]
6714
+ step_data: list[bytes]
6715
+
6716
+
6717
+ # -----------------------------------------------------------------------------
6718
+ @HCI_LE_Meta_Event.event(
6719
+ [
6720
+ ('connection_handle', 2),
6721
+ ('status', STATUS_SPEC),
6722
+ ]
6723
+ )
6724
+ class HCI_LE_CS_Test_End_Complete_Event(HCI_LE_Meta_Event):
6725
+ '''
6726
+ See Bluetooth spec @ 7.7.65.46 LE CS Test End Complete event
6727
+ '''
6728
+
6729
+
5933
6730
  # -----------------------------------------------------------------------------
5934
6731
  @HCI_Event.event([('status', STATUS_SPEC)])
5935
6732
  class HCI_Inquiry_Complete_Event(HCI_Event):
@@ -6876,7 +7673,7 @@ class HCI_IsoDataPacket(HCI_Packet):
6876
7673
  if should_include_sdu_info:
6877
7674
  packet_sequence_number, sdu_info = struct.unpack_from('<HH', packet, pos)
6878
7675
  iso_sdu_length = sdu_info & 0xFFF
6879
- packet_status_flag = sdu_info >> 14
7676
+ packet_status_flag = (sdu_info >> 15) & 1
6880
7677
  pos += 4
6881
7678
 
6882
7679
  iso_sdu_fragment = packet[pos:]
@@ -6910,7 +7707,7 @@ class HCI_IsoDataPacket(HCI_Packet):
6910
7707
  fmt += 'HH'
6911
7708
  args += [
6912
7709
  self.packet_sequence_number,
6913
- self.iso_sdu_length | self.packet_status_flag << 14,
7710
+ self.iso_sdu_length | self.packet_status_flag << 15,
6914
7711
  ]
6915
7712
  return struct.pack(fmt, *args) + self.iso_sdu_fragment
6916
7713
 
@@ -6918,9 +7715,10 @@ class HCI_IsoDataPacket(HCI_Packet):
6918
7715
  return (
6919
7716
  f'{color("ISO", "blue")}: '
6920
7717
  f'handle=0x{self.connection_handle:04x}, '
7718
+ f'pb={self.pb_flag}, '
6921
7719
  f'ps={self.packet_status_flag}, '
6922
7720
  f'data_total_length={self.data_total_length}, '
6923
- f'sdu={self.iso_sdu_fragment.hex()}'
7721
+ f'sdu_fragment={self.iso_sdu_fragment.hex()}'
6924
7722
  )
6925
7723
 
6926
7724