bumble 0.0.208__py3-none-any.whl → 0.0.210__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 (77) hide show
  1. bumble/_version.py +2 -2
  2. bumble/a2dp.py +7 -7
  3. bumble/apps/auracast.py +37 -29
  4. bumble/apps/bench.py +9 -7
  5. bumble/apps/console.py +1 -1
  6. bumble/apps/lea_unicast/app.py +6 -2
  7. bumble/apps/pair.py +4 -3
  8. bumble/apps/player/player.py +3 -3
  9. bumble/apps/rfcomm_bridge.py +1 -1
  10. bumble/apps/speaker/speaker.py +4 -2
  11. bumble/att.py +12 -5
  12. bumble/avc.py +5 -5
  13. bumble/avdtp.py +9 -10
  14. bumble/avrcp.py +18 -19
  15. bumble/bridge.py +2 -2
  16. bumble/controller.py +13 -15
  17. bumble/core.py +61 -60
  18. bumble/device.py +193 -162
  19. bumble/drivers/__init__.py +2 -2
  20. bumble/gap.py +1 -1
  21. bumble/gatt.py +16 -0
  22. bumble/gatt_adapters.py +3 -3
  23. bumble/gatt_client.py +27 -21
  24. bumble/gatt_server.py +9 -10
  25. bumble/hci.py +109 -90
  26. bumble/hfp.py +3 -3
  27. bumble/hid.py +4 -3
  28. bumble/host.py +30 -19
  29. bumble/keys.py +3 -3
  30. bumble/l2cap.py +21 -19
  31. bumble/link.py +5 -6
  32. bumble/pairing.py +3 -3
  33. bumble/pandora/__init__.py +5 -5
  34. bumble/pandora/host.py +30 -23
  35. bumble/pandora/l2cap.py +2 -2
  36. bumble/pandora/security.py +17 -19
  37. bumble/pandora/utils.py +2 -2
  38. bumble/profiles/aics.py +6 -6
  39. bumble/profiles/ancs.py +513 -0
  40. bumble/profiles/ascs.py +17 -10
  41. bumble/profiles/asha.py +5 -5
  42. bumble/profiles/bass.py +1 -1
  43. bumble/profiles/csip.py +10 -10
  44. bumble/profiles/gatt_service.py +12 -12
  45. bumble/profiles/hap.py +16 -16
  46. bumble/profiles/mcp.py +26 -24
  47. bumble/profiles/pacs.py +6 -6
  48. bumble/profiles/pbp.py +1 -1
  49. bumble/profiles/vcs.py +6 -4
  50. bumble/profiles/vocs.py +3 -3
  51. bumble/rfcomm.py +8 -8
  52. bumble/sdp.py +1 -1
  53. bumble/smp.py +39 -33
  54. bumble/transport/__init__.py +24 -19
  55. bumble/transport/android_emulator.py +8 -4
  56. bumble/transport/android_netsim.py +8 -5
  57. bumble/transport/common.py +5 -1
  58. bumble/transport/file.py +1 -1
  59. bumble/transport/hci_socket.py +1 -1
  60. bumble/transport/pty.py +1 -1
  61. bumble/transport/pyusb.py +3 -3
  62. bumble/transport/serial.py +1 -1
  63. bumble/transport/tcp_client.py +1 -1
  64. bumble/transport/tcp_server.py +1 -1
  65. bumble/transport/udp.py +1 -1
  66. bumble/transport/unix.py +1 -1
  67. bumble/transport/usb.py +1 -3
  68. bumble/transport/vhci.py +2 -2
  69. bumble/transport/ws_client.py +6 -1
  70. bumble/transport/ws_server.py +1 -1
  71. bumble/utils.py +89 -76
  72. {bumble-0.0.208.dist-info → bumble-0.0.210.dist-info}/METADATA +3 -2
  73. {bumble-0.0.208.dist-info → bumble-0.0.210.dist-info}/RECORD +77 -76
  74. {bumble-0.0.208.dist-info → bumble-0.0.210.dist-info}/WHEEL +1 -1
  75. {bumble-0.0.208.dist-info → bumble-0.0.210.dist-info}/entry_points.txt +0 -0
  76. {bumble-0.0.208.dist-info → bumble-0.0.210.dist-info/licenses}/LICENSE +0 -0
  77. {bumble-0.0.208.dist-info → bumble-0.0.210.dist-info}/top_level.txt +0 -0
bumble/bridge.py CHANGED
@@ -17,8 +17,8 @@
17
17
  # -----------------------------------------------------------------------------
18
18
  import logging
19
19
 
20
- from .hci import HCI_Packet
21
- from .helpers import PacketTracer
20
+ from bumble.hci import HCI_Packet
21
+ from bumble.helpers import PacketTracer
22
22
 
23
23
  # -----------------------------------------------------------------------------
24
24
  # Logging
bumble/controller.py CHANGED
@@ -25,10 +25,7 @@ import random
25
25
  import struct
26
26
  from bumble.colors import color
27
27
  from bumble.core import (
28
- BT_CENTRAL_ROLE,
29
- BT_PERIPHERAL_ROLE,
30
- BT_LE_TRANSPORT,
31
- BT_BR_EDR_TRANSPORT,
28
+ PhysicalTransport,
32
29
  )
33
30
 
34
31
  from bumble.hci import (
@@ -47,6 +44,7 @@ from bumble.hci import (
47
44
  HCI_REMOTE_USER_TERMINATED_CONNECTION_ERROR,
48
45
  HCI_VERSION_BLUETOOTH_CORE_5_0,
49
46
  Address,
47
+ Role,
50
48
  HCI_AclDataPacket,
51
49
  HCI_AclDataPacketAssembler,
52
50
  HCI_Command_Complete_Event,
@@ -98,7 +96,7 @@ class CisLink:
98
96
  class Connection:
99
97
  controller: Controller
100
98
  handle: int
101
- role: int
99
+ role: Role
102
100
  peer_address: Address
103
101
  link: Any
104
102
  transport: int
@@ -390,10 +388,10 @@ class Controller:
390
388
  connection = Connection(
391
389
  controller=self,
392
390
  handle=connection_handle,
393
- role=BT_PERIPHERAL_ROLE,
391
+ role=Role.PERIPHERAL,
394
392
  peer_address=peer_address,
395
393
  link=self.link,
396
- transport=BT_LE_TRANSPORT,
394
+ transport=PhysicalTransport.LE,
397
395
  link_type=HCI_Connection_Complete_Event.ACL_LINK_TYPE,
398
396
  )
399
397
  self.peripheral_connections[peer_address] = connection
@@ -450,10 +448,10 @@ class Controller:
450
448
  connection = Connection(
451
449
  controller=self,
452
450
  handle=connection_handle,
453
- role=BT_CENTRAL_ROLE,
451
+ role=Role.CENTRAL,
454
452
  peer_address=peer_address,
455
453
  link=self.link,
456
- transport=BT_LE_TRANSPORT,
454
+ transport=PhysicalTransport.LE,
457
455
  link_type=HCI_Connection_Complete_Event.ACL_LINK_TYPE,
458
456
  )
459
457
  self.central_connections[peer_address] = connection
@@ -469,7 +467,7 @@ class Controller:
469
467
  HCI_LE_Connection_Complete_Event(
470
468
  status=status,
471
469
  connection_handle=connection.handle if connection else 0,
472
- role=BT_CENTRAL_ROLE,
470
+ role=Role.CENTRAL,
473
471
  peer_address_type=le_create_connection_command.peer_address_type,
474
472
  peer_address=le_create_connection_command.peer_address,
475
473
  connection_interval=le_create_connection_command.connection_interval_min,
@@ -531,7 +529,7 @@ class Controller:
531
529
 
532
530
  def on_link_acl_data(self, sender_address, transport, data):
533
531
  # Look for the connection to which this data belongs
534
- if transport == BT_LE_TRANSPORT:
532
+ if transport == PhysicalTransport.LE:
535
533
  connection = self.find_le_connection_by_address(sender_address)
536
534
  else:
537
535
  connection = self.find_classic_connection_by_address(sender_address)
@@ -693,10 +691,10 @@ class Controller:
693
691
  controller=self,
694
692
  handle=connection_handle,
695
693
  # Role doesn't matter in Classic because they are managed by HCI_Role_Change and HCI_Role_Discovery
696
- role=BT_CENTRAL_ROLE,
694
+ role=Role.CENTRAL,
697
695
  peer_address=peer_address,
698
696
  link=self.link,
699
- transport=BT_BR_EDR_TRANSPORT,
697
+ transport=PhysicalTransport.BR_EDR,
700
698
  link_type=HCI_Connection_Complete_Event.ACL_LINK_TYPE,
701
699
  )
702
700
  self.classic_connections[peer_address] = connection
@@ -761,10 +759,10 @@ class Controller:
761
759
  controller=self,
762
760
  handle=connection_handle,
763
761
  # Role doesn't matter in SCO.
764
- role=BT_CENTRAL_ROLE,
762
+ role=Role.CENTRAL,
765
763
  peer_address=peer_address,
766
764
  link=self.link,
767
- transport=BT_BR_EDR_TRANSPORT,
765
+ transport=PhysicalTransport.BR_EDR,
768
766
  link_type=link_type,
769
767
  )
770
768
  self.classic_connections[peer_address] = connection
bumble/core.py CHANGED
@@ -23,7 +23,7 @@ from typing import cast, overload, Literal, Union, Optional
23
23
  from typing_extensions import Self
24
24
 
25
25
  from bumble.company_ids import COMPANY_IDENTIFIERS
26
- from bumble.utils import OpenIntEnum
26
+ from bumble import utils
27
27
 
28
28
 
29
29
  # -----------------------------------------------------------------------------
@@ -31,11 +31,12 @@ from bumble.utils import OpenIntEnum
31
31
  # -----------------------------------------------------------------------------
32
32
  # fmt: off
33
33
 
34
- BT_CENTRAL_ROLE = 0
35
- BT_PERIPHERAL_ROLE = 1
34
+ class PhysicalTransport(enum.IntEnum):
35
+ BR_EDR = 0
36
+ LE = 1
36
37
 
37
- BT_BR_EDR_TRANSPORT = 0
38
- BT_LE_TRANSPORT = 1
38
+ BT_BR_EDR_TRANSPORT = PhysicalTransport.BR_EDR
39
+ BT_LE_TRANSPORT = PhysicalTransport.LE
39
40
 
40
41
 
41
42
  # fmt: on
@@ -729,7 +730,7 @@ class DeviceClass:
729
730
  # Appearance
730
731
  # -----------------------------------------------------------------------------
731
732
  class Appearance:
732
- class Category(OpenIntEnum):
733
+ class Category(utils.OpenIntEnum):
733
734
  UNKNOWN = 0x0000
734
735
  PHONE = 0x0001
735
736
  COMPUTER = 0x0002
@@ -783,13 +784,13 @@ class Appearance:
783
784
  SPIROMETER = 0x0037
784
785
  OUTDOOR_SPORTS_ACTIVITY = 0x0051
785
786
 
786
- class UnknownSubcategory(OpenIntEnum):
787
+ class UnknownSubcategory(utils.OpenIntEnum):
787
788
  GENERIC_UNKNOWN = 0x00
788
789
 
789
- class PhoneSubcategory(OpenIntEnum):
790
+ class PhoneSubcategory(utils.OpenIntEnum):
790
791
  GENERIC_PHONE = 0x00
791
792
 
792
- class ComputerSubcategory(OpenIntEnum):
793
+ class ComputerSubcategory(utils.OpenIntEnum):
793
794
  GENERIC_COMPUTER = 0x00
794
795
  DESKTOP_WORKSTATION = 0x01
795
796
  SERVER_CLASS_COMPUTER = 0x02
@@ -807,49 +808,49 @@ class Appearance:
807
808
  MINI_PC = 0x0E
808
809
  STICK_PC = 0x0F
809
810
 
810
- class WatchSubcategory(OpenIntEnum):
811
+ class WatchSubcategory(utils.OpenIntEnum):
811
812
  GENENERIC_WATCH = 0x00
812
813
  SPORTS_WATCH = 0x01
813
814
  SMARTWATCH = 0x02
814
815
 
815
- class ClockSubcategory(OpenIntEnum):
816
+ class ClockSubcategory(utils.OpenIntEnum):
816
817
  GENERIC_CLOCK = 0x00
817
818
 
818
- class DisplaySubcategory(OpenIntEnum):
819
+ class DisplaySubcategory(utils.OpenIntEnum):
819
820
  GENERIC_DISPLAY = 0x00
820
821
 
821
- class RemoteControlSubcategory(OpenIntEnum):
822
+ class RemoteControlSubcategory(utils.OpenIntEnum):
822
823
  GENERIC_REMOTE_CONTROL = 0x00
823
824
 
824
- class EyeglassesSubcategory(OpenIntEnum):
825
+ class EyeglassesSubcategory(utils.OpenIntEnum):
825
826
  GENERIC_EYEGLASSES = 0x00
826
827
 
827
- class TagSubcategory(OpenIntEnum):
828
+ class TagSubcategory(utils.OpenIntEnum):
828
829
  GENERIC_TAG = 0x00
829
830
 
830
- class KeyringSubcategory(OpenIntEnum):
831
+ class KeyringSubcategory(utils.OpenIntEnum):
831
832
  GENERIC_KEYRING = 0x00
832
833
 
833
- class MediaPlayerSubcategory(OpenIntEnum):
834
+ class MediaPlayerSubcategory(utils.OpenIntEnum):
834
835
  GENERIC_MEDIA_PLAYER = 0x00
835
836
 
836
- class BarcodeScannerSubcategory(OpenIntEnum):
837
+ class BarcodeScannerSubcategory(utils.OpenIntEnum):
837
838
  GENERIC_BARCODE_SCANNER = 0x00
838
839
 
839
- class ThermometerSubcategory(OpenIntEnum):
840
+ class ThermometerSubcategory(utils.OpenIntEnum):
840
841
  GENERIC_THERMOMETER = 0x00
841
842
  EAR_THERMOMETER = 0x01
842
843
 
843
- class HeartRateSensorSubcategory(OpenIntEnum):
844
+ class HeartRateSensorSubcategory(utils.OpenIntEnum):
844
845
  GENERIC_HEART_RATE_SENSOR = 0x00
845
846
  HEART_RATE_BELT = 0x01
846
847
 
847
- class BloodPressureSubcategory(OpenIntEnum):
848
+ class BloodPressureSubcategory(utils.OpenIntEnum):
848
849
  GENERIC_BLOOD_PRESSURE = 0x00
849
850
  ARM_BLOOD_PRESSURE = 0x01
850
851
  WRIST_BLOOD_PRESSURE = 0x02
851
852
 
852
- class HumanInterfaceDeviceSubcategory(OpenIntEnum):
853
+ class HumanInterfaceDeviceSubcategory(utils.OpenIntEnum):
853
854
  GENERIC_HUMAN_INTERFACE_DEVICE = 0x00
854
855
  KEYBOARD = 0x01
855
856
  MOUSE = 0x02
@@ -862,16 +863,16 @@ class Appearance:
862
863
  TOUCHPAD = 0x09
863
864
  PRESENTATION_REMOTE = 0x0A
864
865
 
865
- class GlucoseMeterSubcategory(OpenIntEnum):
866
+ class GlucoseMeterSubcategory(utils.OpenIntEnum):
866
867
  GENERIC_GLUCOSE_METER = 0x00
867
868
 
868
- class RunningWalkingSensorSubcategory(OpenIntEnum):
869
+ class RunningWalkingSensorSubcategory(utils.OpenIntEnum):
869
870
  GENERIC_RUNNING_WALKING_SENSOR = 0x00
870
871
  IN_SHOE_RUNNING_WALKING_SENSOR = 0x01
871
872
  ON_SHOW_RUNNING_WALKING_SENSOR = 0x02
872
873
  ON_HIP_RUNNING_WALKING_SENSOR = 0x03
873
874
 
874
- class CyclingSubcategory(OpenIntEnum):
875
+ class CyclingSubcategory(utils.OpenIntEnum):
875
876
  GENERIC_CYCLING = 0x00
876
877
  CYCLING_COMPUTER = 0x01
877
878
  SPEED_SENSOR = 0x02
@@ -879,7 +880,7 @@ class Appearance:
879
880
  POWER_SENSOR = 0x04
880
881
  SPEED_AND_CADENCE_SENSOR = 0x05
881
882
 
882
- class ControlDeviceSubcategory(OpenIntEnum):
883
+ class ControlDeviceSubcategory(utils.OpenIntEnum):
883
884
  GENERIC_CONTROL_DEVICE = 0x00
884
885
  SWITCH = 0x01
885
886
  MULTI_SWITCH = 0x02
@@ -894,13 +895,13 @@ class Appearance:
894
895
  ENERGY_HARVESTING_SWITCH = 0x0B
895
896
  PUSH_BUTTON = 0x0C
896
897
 
897
- class NetworkDeviceSubcategory(OpenIntEnum):
898
+ class NetworkDeviceSubcategory(utils.OpenIntEnum):
898
899
  GENERIC_NETWORK_DEVICE = 0x00
899
900
  ACCESS_POINT = 0x01
900
901
  MESH_DEVICE = 0x02
901
902
  MESH_NETWORK_PROXY = 0x03
902
903
 
903
- class SensorSubcategory(OpenIntEnum):
904
+ class SensorSubcategory(utils.OpenIntEnum):
904
905
  GENERIC_SENSOR = 0x00
905
906
  MOTION_SENSOR = 0x01
906
907
  AIR_QUALITY_SENSOR = 0x02
@@ -928,7 +929,7 @@ class Appearance:
928
929
  FLAME_DETECTOR = 0x18
929
930
  VEHICLE_TIRE_PRESSURE_SENSOR = 0x19
930
931
 
931
- class LightFixturesSubcategory(OpenIntEnum):
932
+ class LightFixturesSubcategory(utils.OpenIntEnum):
932
933
  GENERIC_LIGHT_FIXTURES = 0x00
933
934
  WALL_LIGHT = 0x01
934
935
  CEILING_LIGHT = 0x02
@@ -956,7 +957,7 @@ class Appearance:
956
957
  LOW_BAY_LIGHT = 0x18
957
958
  HIGH_BAY_LIGHT = 0x19
958
959
 
959
- class FanSubcategory(OpenIntEnum):
960
+ class FanSubcategory(utils.OpenIntEnum):
960
961
  GENERIC_FAN = 0x00
961
962
  CEILING_FAN = 0x01
962
963
  AXIAL_FAN = 0x02
@@ -965,7 +966,7 @@ class Appearance:
965
966
  DESK_FAN = 0x05
966
967
  WALL_FAN = 0x06
967
968
 
968
- class HvacSubcategory(OpenIntEnum):
969
+ class HvacSubcategory(utils.OpenIntEnum):
969
970
  GENERIC_HVAC = 0x00
970
971
  THERMOSTAT = 0x01
971
972
  HUMIDIFIER = 0x02
@@ -979,13 +980,13 @@ class Appearance:
979
980
  FAN_HEATER = 0x0A
980
981
  AIR_CURTAIN = 0x0B
981
982
 
982
- class AirConditioningSubcategory(OpenIntEnum):
983
+ class AirConditioningSubcategory(utils.OpenIntEnum):
983
984
  GENERIC_AIR_CONDITIONING = 0x00
984
985
 
985
- class HumidifierSubcategory(OpenIntEnum):
986
+ class HumidifierSubcategory(utils.OpenIntEnum):
986
987
  GENERIC_HUMIDIFIER = 0x00
987
988
 
988
- class HeatingSubcategory(OpenIntEnum):
989
+ class HeatingSubcategory(utils.OpenIntEnum):
989
990
  GENERIC_HEATING = 0x00
990
991
  RADIATOR = 0x01
991
992
  BOILER = 0x02
@@ -995,7 +996,7 @@ class Appearance:
995
996
  FAN_HEATER = 0x06
996
997
  AIR_CURTAIN = 0x07
997
998
 
998
- class AccessControlSubcategory(OpenIntEnum):
999
+ class AccessControlSubcategory(utils.OpenIntEnum):
999
1000
  GENERIC_ACCESS_CONTROL = 0x00
1000
1001
  ACCESS_DOOR = 0x01
1001
1002
  GARAGE_DOOR = 0x02
@@ -1007,7 +1008,7 @@ class Appearance:
1007
1008
  DOOR_LOCK = 0x08
1008
1009
  LOCKER = 0x09
1009
1010
 
1010
- class MotorizedDeviceSubcategory(OpenIntEnum):
1011
+ class MotorizedDeviceSubcategory(utils.OpenIntEnum):
1011
1012
  GENERIC_MOTORIZED_DEVICE = 0x00
1012
1013
  MOTORIZED_GATE = 0x01
1013
1014
  AWNING = 0x02
@@ -1015,7 +1016,7 @@ class Appearance:
1015
1016
  CURTAINS = 0x04
1016
1017
  SCREEN = 0x05
1017
1018
 
1018
- class PowerDeviceSubcategory(OpenIntEnum):
1019
+ class PowerDeviceSubcategory(utils.OpenIntEnum):
1019
1020
  GENERIC_POWER_DEVICE = 0x00
1020
1021
  POWER_OUTLET = 0x01
1021
1022
  POWER_STRIP = 0x02
@@ -1027,7 +1028,7 @@ class Appearance:
1027
1028
  CHARGE_CASE = 0x08
1028
1029
  POWER_BANK = 0x09
1029
1030
 
1030
- class LightSourceSubcategory(OpenIntEnum):
1031
+ class LightSourceSubcategory(utils.OpenIntEnum):
1031
1032
  GENERIC_LIGHT_SOURCE = 0x00
1032
1033
  INCANDESCENT_LIGHT_BULB = 0x01
1033
1034
  LED_LAMP = 0x02
@@ -1038,7 +1039,7 @@ class Appearance:
1038
1039
  LOW_VOLTAGE_HALOGEN = 0x07
1039
1040
  ORGANIC_LIGHT_EMITTING_DIODE = 0x08
1040
1041
 
1041
- class WindowCoveringSubcategory(OpenIntEnum):
1042
+ class WindowCoveringSubcategory(utils.OpenIntEnum):
1042
1043
  GENERIC_WINDOW_COVERING = 0x00
1043
1044
  WINDOW_SHADES = 0x01
1044
1045
  WINDOW_BLINDS = 0x02
@@ -1047,7 +1048,7 @@ class Appearance:
1047
1048
  EXTERIOR_SHUTTER = 0x05
1048
1049
  EXTERIOR_SCREEN = 0x06
1049
1050
 
1050
- class AudioSinkSubcategory(OpenIntEnum):
1051
+ class AudioSinkSubcategory(utils.OpenIntEnum):
1051
1052
  GENERIC_AUDIO_SINK = 0x00
1052
1053
  STANDALONE_SPEAKER = 0x01
1053
1054
  SOUNDBAR = 0x02
@@ -1055,7 +1056,7 @@ class Appearance:
1055
1056
  STANDMOUNTED_SPEAKER = 0x04
1056
1057
  SPEAKERPHONE = 0x05
1057
1058
 
1058
- class AudioSourceSubcategory(OpenIntEnum):
1059
+ class AudioSourceSubcategory(utils.OpenIntEnum):
1059
1060
  GENERIC_AUDIO_SOURCE = 0x00
1060
1061
  MICROPHONE = 0x01
1061
1062
  ALARM = 0x02
@@ -1067,7 +1068,7 @@ class Appearance:
1067
1068
  BROADCASTING_ROOM = 0x08
1068
1069
  AUDITORIUM = 0x09
1069
1070
 
1070
- class MotorizedVehicleSubcategory(OpenIntEnum):
1071
+ class MotorizedVehicleSubcategory(utils.OpenIntEnum):
1071
1072
  GENERIC_MOTORIZED_VEHICLE = 0x00
1072
1073
  CAR = 0x01
1073
1074
  LARGE_GOODS_VEHICLE = 0x02
@@ -1085,7 +1086,7 @@ class Appearance:
1085
1086
  CAMPER_CARAVAN = 0x0E
1086
1087
  RECREATIONAL_VEHICLE_MOTOR_HOME = 0x0F
1087
1088
 
1088
- class DomesticApplianceSubcategory(OpenIntEnum):
1089
+ class DomesticApplianceSubcategory(utils.OpenIntEnum):
1089
1090
  GENERIC_DOMESTIC_APPLIANCE = 0x00
1090
1091
  REFRIGERATOR = 0x01
1091
1092
  FREEZER = 0x02
@@ -1103,21 +1104,21 @@ class Appearance:
1103
1104
  RICE_COOKER = 0x0E
1104
1105
  CLOTHES_STEAMER = 0x0F
1105
1106
 
1106
- class WearableAudioDeviceSubcategory(OpenIntEnum):
1107
+ class WearableAudioDeviceSubcategory(utils.OpenIntEnum):
1107
1108
  GENERIC_WEARABLE_AUDIO_DEVICE = 0x00
1108
1109
  EARBUD = 0x01
1109
1110
  HEADSET = 0x02
1110
1111
  HEADPHONES = 0x03
1111
1112
  NECK_BAND = 0x04
1112
1113
 
1113
- class AircraftSubcategory(OpenIntEnum):
1114
+ class AircraftSubcategory(utils.OpenIntEnum):
1114
1115
  GENERIC_AIRCRAFT = 0x00
1115
1116
  LIGHT_AIRCRAFT = 0x01
1116
1117
  MICROLIGHT = 0x02
1117
1118
  PARAGLIDER = 0x03
1118
1119
  LARGE_PASSENGER_AIRCRAFT = 0x04
1119
1120
 
1120
- class AvEquipmentSubcategory(OpenIntEnum):
1121
+ class AvEquipmentSubcategory(utils.OpenIntEnum):
1121
1122
  GENERIC_AV_EQUIPMENT = 0x00
1122
1123
  AMPLIFIER = 0x01
1123
1124
  RECEIVER = 0x02
@@ -1130,65 +1131,65 @@ class Appearance:
1130
1131
  OPTICAL_DISC_PLAYER = 0x09
1131
1132
  SET_TOP_BOX = 0x0A
1132
1133
 
1133
- class DisplayEquipmentSubcategory(OpenIntEnum):
1134
+ class DisplayEquipmentSubcategory(utils.OpenIntEnum):
1134
1135
  GENERIC_DISPLAY_EQUIPMENT = 0x00
1135
1136
  TELEVISION = 0x01
1136
1137
  MONITOR = 0x02
1137
1138
  PROJECTOR = 0x03
1138
1139
 
1139
- class HearingAidSubcategory(OpenIntEnum):
1140
+ class HearingAidSubcategory(utils.OpenIntEnum):
1140
1141
  GENERIC_HEARING_AID = 0x00
1141
1142
  IN_EAR_HEARING_AID = 0x01
1142
1143
  BEHIND_EAR_HEARING_AID = 0x02
1143
1144
  COCHLEAR_IMPLANT = 0x03
1144
1145
 
1145
- class GamingSubcategory(OpenIntEnum):
1146
+ class GamingSubcategory(utils.OpenIntEnum):
1146
1147
  GENERIC_GAMING = 0x00
1147
1148
  HOME_VIDEO_GAME_CONSOLE = 0x01
1148
1149
  PORTABLE_HANDHELD_CONSOLE = 0x02
1149
1150
 
1150
- class SignageSubcategory(OpenIntEnum):
1151
+ class SignageSubcategory(utils.OpenIntEnum):
1151
1152
  GENERIC_SIGNAGE = 0x00
1152
1153
  DIGITAL_SIGNAGE = 0x01
1153
1154
  ELECTRONIC_LABEL = 0x02
1154
1155
 
1155
- class PulseOximeterSubcategory(OpenIntEnum):
1156
+ class PulseOximeterSubcategory(utils.OpenIntEnum):
1156
1157
  GENERIC_PULSE_OXIMETER = 0x00
1157
1158
  FINGERTIP_PULSE_OXIMETER = 0x01
1158
1159
  WRIST_WORN_PULSE_OXIMETER = 0x02
1159
1160
 
1160
- class WeightScaleSubcategory(OpenIntEnum):
1161
+ class WeightScaleSubcategory(utils.OpenIntEnum):
1161
1162
  GENERIC_WEIGHT_SCALE = 0x00
1162
1163
 
1163
- class PersonalMobilityDeviceSubcategory(OpenIntEnum):
1164
+ class PersonalMobilityDeviceSubcategory(utils.OpenIntEnum):
1164
1165
  GENERIC_PERSONAL_MOBILITY_DEVICE = 0x00
1165
1166
  POWERED_WHEELCHAIR = 0x01
1166
1167
  MOBILITY_SCOOTER = 0x02
1167
1168
 
1168
- class ContinuousGlucoseMonitorSubcategory(OpenIntEnum):
1169
+ class ContinuousGlucoseMonitorSubcategory(utils.OpenIntEnum):
1169
1170
  GENERIC_CONTINUOUS_GLUCOSE_MONITOR = 0x00
1170
1171
 
1171
- class InsulinPumpSubcategory(OpenIntEnum):
1172
+ class InsulinPumpSubcategory(utils.OpenIntEnum):
1172
1173
  GENERIC_INSULIN_PUMP = 0x00
1173
1174
  INSULIN_PUMP_DURABLE_PUMP = 0x01
1174
1175
  INSULIN_PUMP_PATCH_PUMP = 0x02
1175
1176
  INSULIN_PEN = 0x03
1176
1177
 
1177
- class MedicationDeliverySubcategory(OpenIntEnum):
1178
+ class MedicationDeliverySubcategory(utils.OpenIntEnum):
1178
1179
  GENERIC_MEDICATION_DELIVERY = 0x00
1179
1180
 
1180
- class SpirometerSubcategory(OpenIntEnum):
1181
+ class SpirometerSubcategory(utils.OpenIntEnum):
1181
1182
  GENERIC_SPIROMETER = 0x00
1182
1183
  HANDHELD_SPIROMETER = 0x01
1183
1184
 
1184
- class OutdoorSportsActivitySubcategory(OpenIntEnum):
1185
+ class OutdoorSportsActivitySubcategory(utils.OpenIntEnum):
1185
1186
  GENERIC_OUTDOOR_SPORTS_ACTIVITY = 0x00
1186
1187
  LOCATION_DISPLAY = 0x01
1187
1188
  LOCATION_AND_NAVIGATION_DISPLAY = 0x02
1188
1189
  LOCATION_POD = 0x03
1189
1190
  LOCATION_AND_NAVIGATION_POD = 0x04
1190
1191
 
1191
- class _OpenSubcategory(OpenIntEnum):
1192
+ class _OpenSubcategory(utils.OpenIntEnum):
1192
1193
  GENERIC = 0x00
1193
1194
 
1194
1195
  SUBCATEGORY_CLASSES = {
@@ -1295,7 +1296,7 @@ class AdvertisingData:
1295
1296
  # fmt: off
1296
1297
  # pylint: disable=line-too-long
1297
1298
 
1298
- class Type(OpenIntEnum):
1299
+ class Type(utils.OpenIntEnum):
1299
1300
  FLAGS = 0x01
1300
1301
  INCOMPLETE_LIST_OF_16_BIT_SERVICE_CLASS_UUIDS = 0x02
1301
1302
  COMPLETE_LIST_OF_16_BIT_SERVICE_CLASS_UUIDS = 0x03