# -*- coding: utf-8 -*- # Copyright 2019 Oticon A/S # SPDX-License-Identifier: Apache-2.0 import struct; from enum import IntEnum; from itertools import chain; from components.address import *; from components.events import *; class Commands(IntEnum): CMD_ECHO_REQ = 1 CMD_ECHO_RSP = 2 CMD_INQUIRE_REQ = 3 CMD_INQUIRE_RSP = 4 CMD_DISCONNECT_REQ = 5 CMD_DISCONNECT_RSP = 6 CMD_READ_REMOTE_VERSION_INFORMATION_REQ = 7 CMD_READ_REMOTE_VERSION_INFORMATION_RSP = 8 CMD_SET_EVENT_MASK_REQ = 9 CMD_SET_EVENT_MASK_RSP = 10 CMD_RESET_REQ = 11 CMD_RESET_RSP = 12 CMD_READ_TRANSMIT_POWER_LEVEL_REQ = 13 CMD_READ_TRANSMIT_POWER_LEVEL_RSP = 14 CMD_SET_CONTROLLER_TO_HOST_FLOW_CONTROL_REQ = 15 CMD_SET_CONTROLLER_TO_HOST_FLOW_CONTROL_RSP = 16 CMD_HOST_BUFFER_SIZE_REQ = 17 CMD_HOST_BUFFER_SIZE_RSP = 18 CMD_HOST_NUMBER_OF_COMPLETED_PACKETS_REQ = 19 CMD_HOST_NUMBER_OF_COMPLETED_PACKETS_RSP = 20 CMD_SET_EVENT_MASK_PAGE_2_REQ = 21 CMD_SET_EVENT_MASK_PAGE_2_RSP = 22 CMD_WRITE_LE_HOST_SUPPORT_REQ = 23 CMD_WRITE_LE_HOST_SUPPORT_RSP = 24 CMD_READ_AUTHENTICATED_PAYLOAD_TIMEOUT_REQ = 25 CMD_READ_AUTHENTICATED_PAYLOAD_TIMEOUT_RSP = 26 CMD_WRITE_AUTHENTICATED_PAYLOAD_TIMEOUT_REQ = 27 CMD_WRITE_AUTHENTICATED_PAYLOAD_TIMEOUT_RSP = 28 CMD_READ_LOCAL_VERSION_INFORMATION_REQ = 29 CMD_READ_LOCAL_VERSION_INFORMATION_RSP = 30 CMD_READ_LOCAL_SUPPORTED_COMMANDS_REQ = 31 CMD_READ_LOCAL_SUPPORTED_COMMANDS_RSP = 32 CMD_READ_LOCAL_SUPPORTED_FEATURES_REQ = 33 CMD_READ_LOCAL_SUPPORTED_FEATURES_RSP = 34 CMD_READ_BUFFER_SIZE_REQ = 35 CMD_READ_BUFFER_SIZE_RSP = 36 CMD_READ_BD_ADDR_REQ = 37 CMD_READ_BD_ADDR_RSP = 38 CMD_READ_RSSI_REQ = 39 CMD_READ_RSSI_RSP = 40 CMD_LE_SET_EVENT_MASK_REQ = 41 CMD_LE_SET_EVENT_MASK_RSP = 42 CMD_LE_READ_BUFFER_SIZE_REQ = 43 CMD_LE_READ_BUFFER_SIZE_RSP = 44 CMD_LE_READ_LOCAL_SUPPORTED_FEATURES_REQ = 45 CMD_LE_READ_LOCAL_SUPPORTED_FEATURES_RSP = 46 CMD_LE_SET_RANDOM_ADDRESS_REQ = 47 CMD_LE_SET_RANDOM_ADDRESS_RSP = 48 CMD_LE_SET_ADVERTISING_PARAMETERS_REQ = 49 CMD_LE_SET_ADVERTISING_PARAMETERS_RSP = 50 CMD_LE_READ_ADVERTISING_CHANNEL_TX_POWER_REQ = 51 CMD_LE_READ_ADVERTISING_CHANNEL_TX_POWER_RSP = 52 CMD_LE_SET_ADVERTISING_DATA_REQ = 53 CMD_LE_SET_ADVERTISING_DATA_RSP = 54 CMD_LE_SET_SCAN_RESPONSE_DATA_REQ = 55 CMD_LE_SET_SCAN_RESPONSE_DATA_RSP = 56 CMD_LE_SET_ADVERTISING_ENABLE_REQ = 57 CMD_LE_SET_ADVERTISING_ENABLE_RSP = 58 CMD_LE_SET_SCAN_PARAMETERS_REQ = 59 CMD_LE_SET_SCAN_PARAMETERS_RSP = 60 CMD_LE_SET_SCAN_ENABLE_REQ = 61 CMD_LE_SET_SCAN_ENABLE_RSP = 62 CMD_LE_CREATE_CONNECTION_REQ = 63 CMD_LE_CREATE_CONNECTION_RSP = 64 CMD_LE_CREATE_CONNECTION_CANCEL_REQ = 65 CMD_LE_CREATE_CONNECTION_CANCEL_RSP = 66 CMD_LE_READ_FILTER_ACCEPT_LIST_SIZE_REQ = 67 CMD_LE_READ_FILTER_ACCEPT_LIST_SIZE_RSP = 68 CMD_LE_CLEAR_FILTER_ACCEPT_LIST_REQ = 69 CMD_LE_CLEAR_FILTER_ACCEPT_LIST_RSP = 70 CMD_LE_ADD_DEVICE_TO_FILTER_ACCEPT_LIST_REQ = 71 CMD_LE_ADD_DEVICE_TO_FILTER_ACCEPT_LIST_RSP = 72 CMD_LE_REMOVE_DEVICE_FROM_FILTER_ACCEPT_LIST_REQ = 73 CMD_LE_REMOVE_DEVICE_FROM_FILTER_ACCEPT_LIST_RSP = 74 CMD_LE_CONNECTION_UPDATE_REQ = 75 CMD_LE_CONNECTION_UPDATE_RSP = 76 CMD_LE_SET_HOST_CHANNEL_CLASSIFICATION_REQ = 77 CMD_LE_SET_HOST_CHANNEL_CLASSIFICATION_RSP = 78 CMD_LE_READ_CHANNEL_MAP_REQ = 79 CMD_LE_READ_CHANNEL_MAP_RSP = 80 CMD_LE_READ_REMOTE_FEATURES_REQ = 81 CMD_LE_READ_REMOTE_FEATURES_RSP = 82 CMD_LE_ENCRYPT_REQ = 83 CMD_LE_ENCRYPT_RSP = 84 CMD_LE_RAND_REQ = 85 CMD_LE_RAND_RSP = 86 CMD_LE_START_ENCRYPTION_REQ = 87 CMD_LE_START_ENCRYPTION_RSP = 88 CMD_LE_LONG_TERM_KEY_REQUEST_REPLY_REQ = 89 CMD_LE_LONG_TERM_KEY_REQUEST_REPLY_RSP = 90 CMD_LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY_REQ = 91 CMD_LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY_RSP = 92 CMD_LE_READ_SUPPORTED_STATES_REQ = 93 CMD_LE_READ_SUPPORTED_STATES_RSP = 94 CMD_LE_RECEIVER_TEST_REQ = 95 CMD_LE_RECEIVER_TEST_RSP = 96 CMD_LE_TRANSMITTER_TEST_REQ = 97 CMD_LE_TRANSMITTER_TEST_RSP = 98 CMD_LE_TEST_END_REQ = 99 CMD_LE_TEST_END_RSP = 100 CMD_LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY_REQ = 101 CMD_LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY_RSP = 102 CMD_LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY_REQ = 103 CMD_LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY_RSP = 104 CMD_LE_SET_DATA_LENGTH_REQ = 105 CMD_LE_SET_DATA_LENGTH_RSP = 106 CMD_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH_REQ = 107 CMD_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH_RSP = 108 CMD_LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH_REQ = 109 CMD_LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH_RSP = 110 CMD_LE_READ_LOCAL_P_256_PUBLIC_KEY_COMMAND_REQ = 111 CMD_LE_READ_LOCAL_P_256_PUBLIC_KEY_COMMAND_RSP = 112 CMD_LE_GENERATE_DHKEY_COMMAND_REQ = 113 CMD_LE_GENERATE_DHKEY_COMMAND_RSP = 114 CMD_LE_ADD_DEVICE_TO_RESOLVING_LIST_REQ = 115 CMD_LE_ADD_DEVICE_TO_RESOLVING_LIST_RSP = 116 CMD_LE_REMOVE_DEVICE_FROM_RESOLVING_LIST_REQ = 117 CMD_LE_REMOVE_DEVICE_FROM_RESOLVING_LIST_RSP = 118 CMD_LE_CLEAR_RESOLVING_LIST_REQ = 119 CMD_LE_CLEAR_RESOLVING_LIST_RSP = 120 CMD_LE_READ_RESOLVING_LIST_SIZE_REQ = 121 CMD_LE_READ_RESOLVING_LIST_SIZE_RSP = 122 CMD_LE_READ_PEER_RESOLVABLE_ADDRESS_REQ = 123 CMD_LE_READ_PEER_RESOLVABLE_ADDRESS_RSP = 124 CMD_LE_READ_LOCAL_RESOLVABLE_ADDRESS_REQ = 125 CMD_LE_READ_LOCAL_RESOLVABLE_ADDRESS_RSP = 126 CMD_LE_SET_ADDRESS_RESOLUTION_ENABLE_REQ = 127 CMD_LE_SET_ADDRESS_RESOLUTION_ENABLE_RSP = 128 CMD_LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT_REQ = 129 CMD_LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT_RSP = 130 CMD_LE_READ_MAXIMUM_DATA_LENGTH_REQ = 131 CMD_LE_READ_MAXIMUM_DATA_LENGTH_RSP = 132 CMD_LE_READ_PHY_REQ = 133 CMD_LE_READ_PHY_RSP = 134 CMD_LE_SET_DEFAULT_PHY_REQ = 135 CMD_LE_SET_DEFAULT_PHY_RSP = 136 CMD_LE_SET_PHY_REQ = 137 CMD_LE_SET_PHY_RSP = 138 CMD_LE_ENHANCED_RECEIVER_TEST_REQ = 139 CMD_LE_ENHANCED_RECEIVER_TEST_RSP = 140 CMD_LE_ENHANCED_TRANSMITTER_TEST_REQ = 141 CMD_LE_ENHANCED_TRANSMITTER_TEST_RSP = 142 CMD_LE_SET_EXTENDED_ADVERTISING_PARAMETERS_REQ = 143 CMD_LE_SET_EXTENDED_ADVERTISING_PARAMETERS_RSP = 144 CMD_LE_SET_EXTENDED_ADVERTISING_DATA_REQ = 145 CMD_LE_SET_EXTENDED_ADVERTISING_DATA_RSP = 146 CMD_LE_SET_EXTENDED_SCAN_RESPONSE_DATA_REQ = 147 CMD_LE_SET_EXTENDED_SCAN_RESPONSE_DATA_RSP = 148 CMD_LE_SET_EXTENDED_ADVERTISING_ENABLE_REQ = 149 CMD_LE_SET_EXTENDED_ADVERTISING_ENABLE_RSP = 150 CMD_LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH_REQ = 151 CMD_LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH_RSP = 152 CMD_LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS_REQ = 153 CMD_LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS_RSP = 154 CMD_LE_REMOVE_ADVERTISING_SET_REQ = 155 CMD_LE_REMOVE_ADVERTISING_SET_RSP = 156 CMD_LE_CLEAR_ADVERTISING_SETS_REQ = 157 CMD_LE_CLEAR_ADVERTISING_SETS_RSP = 158 CMD_LE_SET_PERIODIC_ADVERTISING_PARAMETERS_REQ = 159 CMD_LE_SET_PERIODIC_ADVERTISING_PARAMETERS_RSP = 160 CMD_LE_SET_PERIODIC_ADVERTISING_DATA_REQ = 161 CMD_LE_SET_PERIODIC_ADVERTISING_DATA_RSP = 162 CMD_LE_SET_PERIODIC_ADVERTISING_ENABLE_REQ = 163 CMD_LE_SET_PERIODIC_ADVERTISING_ENABLE_RSP = 164 CMD_LE_SET_EXTENDED_SCAN_PARAMETERS_REQ = 165 CMD_LE_SET_EXTENDED_SCAN_PARAMETERS_RSP = 166 CMD_LE_SET_EXTENDED_SCAN_ENABLE_REQ = 167 CMD_LE_SET_EXTENDED_SCAN_ENABLE_RSP = 168 CMD_LE_EXTENDED_CREATE_CONNECTION_REQ = 169 CMD_LE_EXTENDED_CREATE_CONNECTION_RSP = 170 CMD_LE_PERIODIC_ADVERTISING_CREATE_SYNC_REQ = 171 CMD_LE_PERIODIC_ADVERTISING_CREATE_SYNC_RSP = 172 CMD_LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL_REQ = 173 CMD_LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL_RSP = 174 CMD_LE_PERIODIC_ADVERTISING_TERMINATE_SYNC_REQ = 175 CMD_LE_PERIODIC_ADVERTISING_TERMINATE_SYNC_RSP = 176 CMD_LE_ADD_DEVICE_TO_PERIODIC_ADVERTISER_LIST_REQ = 177 CMD_LE_ADD_DEVICE_TO_PERIODIC_ADVERTISER_LIST_RSP = 178 CMD_LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISER_LIST_REQ = 179 CMD_LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISER_LIST_RSP = 180 CMD_LE_CLEAR_PERIODIC_ADVERTISER_LIST_REQ = 181 CMD_LE_CLEAR_PERIODIC_ADVERTISER_LIST_RSP = 182 CMD_LE_READ_PERIODIC_ADVERTISER_LIST_SIZE_REQ = 183 CMD_LE_READ_PERIODIC_ADVERTISER_LIST_SIZE_RSP = 184 CMD_LE_READ_TRANSMIT_POWER_REQ = 185 CMD_LE_READ_TRANSMIT_POWER_RSP = 186 CMD_LE_READ_RF_PATH_COMPENSATION_REQ = 187 CMD_LE_READ_RF_PATH_COMPENSATION_RSP = 188 CMD_LE_WRITE_RF_PATH_COMPENSATION_REQ = 189 CMD_LE_WRITE_RF_PATH_COMPENSATION_RSP = 190 CMD_LE_SET_PRIVACY_MODE_REQ = 191 CMD_LE_SET_PRIVACY_MODE_RSP = 192 CMD_WRITE_BD_ADDR_REQ = 193 CMD_WRITE_BD_ADDR_RSP = 194 CMD_FLUSH_EVENTS_REQ = 195 CMD_FLUSH_EVENTS_RSP = 196 CMD_HAS_EVENT_REQ = 197 CMD_HAS_EVENT_RSP = 198 CMD_GET_EVENT_REQ = 199 CMD_GET_EVENT_RSP = 200 CMD_LE_DATA_FLUSH_REQ = 201 CMD_LE_DATA_FLUSH_RSP = 202 CMD_LE_DATA_READY_REQ = 203 CMD_LE_DATA_READY_RSP = 204 CMD_LE_DATA_WRITE_REQ = 205 CMD_LE_DATA_WRITE_RSP = 206 CMD_LE_DATA_READ_REQ = 207 CMD_LE_DATA_READ_RSP = 208 CMD_GATT_SERVICE_SET_REQ = 209 CMD_GATT_SERVICE_SET_RSP = 210 CMD_GATT_SERVICE_NOTIFY_REQ = 211 CMD_GATT_SERVICE_NOTIFY_RSP = 212 CMD_GATT_SERVICE_INDICATE_REQ = 213 CMD_GATT_SERVICE_INDICATE_RSP = 214 CMD_GAP_ADVERTISING_MODE_REQ = 215 CMD_GAP_ADVERTISING_MODE_RSP = 216 CMD_GAP_ADVERTISING_DATA_REQ = 217 CMD_GAP_ADVERTISING_DATA_RSP = 218 CMD_GAP_SCANNING_MODE_REQ = 219 CMD_GAP_SCANNING_MODE_RSP = 220 CMD_READ_STATIC_ADDRESSES_REQ = 221 CMD_READ_STATIC_ADDRESSES_RSP = 222 CMD_READ_KEY_HIERARCHY_ROOTS_REQ = 223 CMD_READ_KEY_HIERARCHY_ROOTS_RSP = 224 CMD_GAP_READ_IRK_REQ = 225 CMD_GAP_READ_IRK_RSP = 226 CMD_GAP_ROLE_REQ = 227 CMD_GAP_ROLE_RSP = 228 CMD_LE_ISO_DATA_FLUSH_REQ = 229 CMD_LE_ISO_DATA_FLUSH_RSP = 230 CMD_LE_ISO_DATA_READY_REQ = 231 CMD_LE_ISO_DATA_READY_RSP = 232 CMD_LE_ISO_DATA_WRITE_REQ = 233 CMD_LE_ISO_DATA_WRITE_RSP = 234 CMD_LE_ISO_DATA_READ_REQ = 235 CMD_LE_ISO_DATA_READ_RSP = 236 CMD_LE_SET_CIG_PARAMETERS_REQ = 237 CMD_LE_SET_CIG_PARAMETERS_RSP = 238 CMD_LE_SET_CIG_PARAMETERS_TEST_REQ = 239 CMD_LE_SET_CIG_PARAMETERS_TEST_RSP = 240 CMD_LE_CREATE_CIS_REQ = 241 CMD_LE_CREATE_CIS_RSP = 242 CMD_LE_REMOVE_CIG_REQ = 243 CMD_LE_REMOVE_CIG_RSP = 244 CMD_LE_ACCEPT_CIS_REQUEST_REQ = 245 CMD_LE_ACCEPT_CIS_REQUEST_RSP = 246 CMD_LE_REJECT_CIS_REQUEST_REQ = 247 CMD_LE_REJECT_CIS_REQUEST_RSP = 248 CMD_LE_SETUP_ISO_DATA_PATH_REQ = 249 CMD_LE_SETUP_ISO_DATA_PATH_RSP = 250 CMD_LE_REMOVE_ISO_DATA_PATH_REQ = 251 CMD_LE_REMOVE_ISO_DATA_PATH_RSP = 252 CMD_LE_SET_HOST_FEATURE_REQ = 253 CMD_LE_SET_HOST_FEATURE_RSP = 254 CMD_GET_IXIT_VALUE_REQ = 255 CMD_GET_IXIT_VALUE_RSP = 256 CMD_HCI_LE_ISO_TRANSMIT_TEST_REQ = 257 CMD_HCI_LE_ISO_TRANSMIT_TEST_RSP = 258 CMD_HCI_LE_ISO_RECEIVE_TEST_REQ = 259 CMD_HCI_LE_ISO_RECEIVE_TEST_RSP = 260 CMD_HCI_LE_ISO_READ_TEST_COUNTERS_REQ = 261 CMD_HCI_LE_ISO_READ_TEST_COUNTERS_RSP = 262 CMD_HCI_LE_ISO_TEST_END_REQ = 263 CMD_HCI_LE_ISO_TEST_END_RSP = 264 CMD_HCI_LE_REQUEST_PEER_SCA_REQ = 265 CMD_HCI_LE_REQUEST_PEER_SCA_RSP = 266 CMD_LE_READ_BUFFER_SIZE_V2_REQ = 267 CMD_LE_READ_BUFFER_SIZE_V2_RSP = 268 class HCICommands(IntEnum): BT_HCI_OP_INQUIRY = 0x401 BT_HCI_OP_DISCONNECT = 0x406 BT_HCI_OP_READ_REMOTE_VERSION_INFO = 0x41D BT_HCI_OP_SET_EVENT_MASK = 0xC01 BT_HCI_OP_RESET = 0xC03 BT_HCI_OP_READ_TX_POWER_LEVEL = 0xC2D BT_HCI_OP_SET_CTL_TO_HOST_FLOW = 0xC31 BT_HCI_OP_HOST_BUFFER_SIZE = 0xC33 BT_HCI_OP_HOST_NUM_COMPLETED_PACKETS = 0xC35 BT_HCI_OP_SET_EVENT_MASK_PAGE_2 = 0xC63 BT_HCI_OP_LE_WRITE_LE_HOST_SUPP = 0xC6D BT_HCI_OP_READ_AUTH_PAYLOAD_TIMEOUT = 0xC7B BT_HCI_OP_WRITE_AUTH_PAYLOAD_TIMEOUT = 0xC7C BT_HCI_OP_READ_LOCAL_VERSION_INFO = 0x1001 BT_HCI_OP_READ_SUPPORTED_COMMANDS = 0x1002 BT_HCI_OP_READ_LOCAL_FEATURES = 0x1003 BT_HCI_OP_READ_BUFFER_SIZE = 0x1005 BT_HCI_OP_READ_BD_ADDR = 0x1009 BT_HCI_OP_READ_RSSI = 0x1405 BT_HCI_OP_LE_SET_EVENT_MASK = 0x2001 BT_HCI_OP_LE_READ_BUFFER_SIZE = 0x2002 BT_HCI_OP_LE_READ_LOCAL_FEATURES = 0x2003 BT_HCI_OP_LE_SET_RANDOM_ADDRESS = 0x2005 BT_HCI_OP_LE_SET_ADV_PARAM = 0x2006 BT_HCI_OP_LE_READ_ADV_CHAN_TX_POWER = 0x2007 BT_HCI_OP_LE_SET_ADV_DATA = 0x2008 BT_HCI_OP_LE_SET_SCAN_RSP_DATA = 0x2009 BT_HCI_OP_LE_SET_ADV_ENABLE = 0x200A BT_HCI_OP_LE_SET_SCAN_PARAM = 0x200B BT_HCI_OP_LE_SET_SCAN_ENABLE = 0x200C BT_HCI_OP_LE_CREATE_CONN = 0x200D BT_HCI_OP_LE_CREATE_CONN_CANCEL = 0x200E BT_HCI_OP_LE_READ_FAL_SIZE = 0x200F BT_HCI_OP_LE_CLEAR_FAL = 0x2010 BT_HCI_OP_LE_ADD_DEV_TO_FAL = 0x2011 BT_HCI_OP_LE_REM_DEV_FROM_FAL = 0x2012 BT_HCI_OP_LE_CONN_UPDATE = 0x2013 BT_HCI_OP_LE_SET_HOST_CHAN_CLASSIF = 0x2014 BT_HCI_OP_LE_READ_CHAN_MAP = 0x2015 BT_HCI_OP_LE_READ_REMOTE_FEATURES = 0x2016 BT_HCI_OP_LE_ENCRYPT = 0x2017 BT_HCI_OP_LE_RAND = 0x2018 BT_HCI_OP_LE_START_ENCRYPTION = 0x2019 BT_HCI_OP_LE_LTK_REQ_REPLY = 0x201A BT_HCI_OP_LE_LTK_REQ_NEG_REPLY = 0x201B BT_HCI_OP_LE_READ_SUPP_STATES = 0x201C BT_HCI_OP_LE_RX_TEST = 0x201D BT_HCI_OP_LE_TX_TEST = 0x201E BT_HCI_OP_LE_TEST_END = 0x201F BT_HCI_OP_LE_CONN_PARAM_REQ_REPLY = 0x2020 BT_HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY = 0x2021 BT_HCI_OP_LE_SET_DATA_LEN = 0x2022 BT_HCI_OP_LE_READ_DEFAULT_DATA_LEN = 0x2023 BT_HCI_OP_LE_WRITE_DEFAULT_DATA_LEN = 0x2024 BT_HCI_OP_LE_P256_PUBLIC_KEY = 0x2025 BT_HCI_OP_LE_GENERATE_DHKEY = 0x2026 BT_HCI_OP_LE_ADD_DEV_TO_RL = 0x2027 BT_HCI_OP_LE_REM_DEV_FROM_RL = 0x2028 BT_HCI_OP_LE_CLEAR_RL = 0x2029 BT_HCI_OP_LE_READ_RL_SIZE = 0x202A BT_HCI_OP_LE_READ_PEER_RPA = 0x202B BT_HCI_OP_LE_READ_LOCAL_RPA = 0x202C BT_HCI_OP_LE_SET_ADDR_RES_ENABLE = 0x202D BT_HCI_OP_LE_SET_RPA_TIMEOUT = 0x202E BT_HCI_OP_LE_READ_MAX_DATA_LEN = 0x202F BT_HCI_OP_LE_READ_PHY = 0x2030 BT_HCI_OP_LE_SET_DEFAULT_PHY = 0x2031 BT_HCI_OP_LE_SET_PHY = 0x2032 BT_HCI_OP_LE_ENH_RX_TEST = 0x2033 BT_HCI_OP_LE_ENH_TX_TEST = 0x2034 BT_HCI_OP_LE_SET_EXT_ADV_PARAM = 0x2036 BT_HCI_OP_LE_SET_EXT_ADV_DATA = 0x2037 BT_HCI_OP_LE_SET_EXT_SCAN_RSP_DATA = 0x2038 BT_HCI_OP_LE_SET_EXT_ADV_ENABLE = 0x2039 BT_HCI_OP_LE_READ_MAX_ADV_DATA_LEN = 0x203A BT_HCI_OP_LE_READ_NUM_ADV_SETS = 0x203B BT_HCI_OP_LE_REMOVE_ADV_SET = 0x203C BT_HCI_OP_CLEAR_ADV_SETS = 0x203D BT_HCI_OP_LE_SET_PER_ADV_PARAM = 0x203E BT_HCI_OP_LE_SET_PER_ADV_DATA = 0x203F BT_HCI_OP_LE_SET_PER_ADV_ENABLE = 0x2040 BT_HCI_OP_LE_SET_EXT_SCAN_PARAM = 0x2041 BT_HCI_OP_LE_SET_EXT_SCAN_ENABLE = 0x2042 BT_HCI_OP_LE_EXT_CREATE_CONN = 0x2043 BT_HCI_OP_LE_PER_ADV_CREATE_SYNC = 0x2044 BT_HCI_OP_LE_PER_ADV_CREATE_SYNC_CANCEL = 0x2045 BT_HCI_OP_LE_PER_ADV_TERMINATE_SYNC = 0x2046 BT_HCI_OP_LE_ADD_DEV_TO_PER_ADV_LIST = 0x2047 BT_HCI_OP_LE_REM_DEV_FROM_PER_ADV_LIST = 0x2048 BT_HCI_OP_LE_CLEAR_PER_ADV_LIST = 0x2049 BT_HCI_OP_LE_READ_PER_ADV_LIST_SIZE = 0x204A BT_HCI_OP_LE_READ_TX_POWER = 0x204B BT_HCI_OP_LE_READ_RF_PATH_COMP = 0x204C BT_HCI_OP_LE_WRITE_RF_PATH_COMP = 0x204D BT_HCI_OP_LE_SET_PRIVACY_MODE = 0x204E BT_HCI_OP_LE_READ_BUFFER_SIZE_V2 = 0x2060 BT_HCI_OP_LE_SET_CIG_PARAMETERS = 0x2062 BT_HCI_OP_LE_SET_CIG_PARAMETERS_TEST = 0x2063 BT_HCI_OP_LE_CREATE_CIS = 0x2064 BT_HCI_OP_LE_REMOVE_CIG = 0x2065 BT_HCI_OP_LE_ACCEPT_CIS_REQUEST = 0x2066 BT_HCI_OP_LE_REJECT_CIS_REQUEST = 0x2067 BT_HCI_OP_LE_REQUEST_PEER_SCA = 0x206D BT_HCI_OP_LE_SETUP_ISO_DATA_PATH = 0x206E BT_HCI_OP_LE_REMOVE_ISO_DATA_PATH = 0x206F BT_HCI_OP_LE_ISO_TRANSMIT_TEST = 0x2070 BT_HCI_OP_LE_ISO_RECEIVE_TEST = 0x2071 BT_HCI_OP_LE_ISO_READ_TEST_COUNTERS = 0x2072 BT_HCI_OP_LE_ISO_TEST_END = 0x2073 BT_HCI_OP_LE_SET_HOST_FEATURE = 0x2074 BT_HCI_OP_VS_WRITE_BD_ADDR = 0xFC06 class Events(IntEnum): BT_HCI_EVT_NONE = 0 BT_HCI_EVT_DISCONN_COMPLETE = 5 BT_HCI_EVT_ENCRYPT_CHANGE_V1 = 8 BT_HCI_EVT_REMOTE_VERSION_INFO = 12 BT_HCI_EVT_CMD_COMPLETE = 14 BT_HCI_EVT_CMD_STATUS = 15 BT_HCI_EVT_NUM_COMPLETED_PACKETS = 19 BT_HCI_EVT_DATA_BUF_OVERFLOW = 26 BT_HCI_EVT_ENCRYPT_KEY_REFRESH_COMPLETE = 48 BT_HCI_EVT_LE_META_EVENT = 62 BT_HCI_EVT_AUTH_PAYLOAD_TIMEOUT_EXP = 87 BT_HCI_EVT_ENCRYPT_CHANGE_V2 = 89 class MetaEvents(IntEnum): BT_HCI_EVT_LE_CONN_COMPLETE = 1 BT_HCI_EVT_LE_ADVERTISING_REPORT = 2 BT_HCI_EVT_LE_CONN_UPDATE_COMPLETE = 3 BT_HCI_EV_LE_REMOTE_FEAT_COMPLETE = 4 BT_HCI_EVT_LE_LTK_REQUEST = 5 BT_HCI_EVT_LE_CONN_PARAM_REQ = 6 BT_HCI_EVT_LE_DATA_LEN_CHANGE = 7 BT_HCI_EVT_LE_P256_PUBLIC_KEY_COMPLETE = 8 BT_HCI_EVT_LE_GENERATE_DHKEY_COMPLETE = 9 BT_HCI_EVT_LE_ENH_CONN_COMPLETE = 10 BT_HCI_EVT_LE_DIRECT_ADV_REPORT = 11 BT_HCI_EVT_LE_PHY_UPDATE_COMPLETE = 12 BT_HCI_EVT_LE_EXT_ADVERTISING_REPORT = 13 BT_HCI_EVT_LE_PER_ADV_SYNC_ESTABLISHED = 14 BT_HCI_EVT_LE_PER_ADVERTISING_REPORT = 15 BT_HCI_EVT_LE_PER_ADV_SYNC_LOST = 16 BT_HCI_EVT_LE_SCAN_TIMEOUT = 17 BT_HCI_EVT_LE_ADV_SET_TERMINATED = 18 BT_HCI_EVT_LE_SCAN_REQ_RECEIVED = 19 BT_HCI_EVT_LE_CHAN_SEL_ALGO = 20 BT_HCI_EVT_LE_CIS_ESTABLISHED = 25 BT_HCI_EVT_LE_CIS_REQUEST = 26 BT_HCI_EVT_LE_REQUEST_PEER_SCA_COMPLETE = 31 class ProfileId(IntEnum): PROFILE_ID_GAP = 0 PROFILE_ID_GATT = 1 PROFILE_ID_HCI = 2 PROFILE_ID_L2CAP = 3 PROFILE_ID_LL = 4 PROFILE_ID_SM = 5 class PhysicalChannel(IntEnum): LE_1M = 1 LE_2M = 2 LE_CODED = 3 class FragmentOperation(IntEnum): INTERMEDIATE_FRAGMENT = 0 # Intermediate fragment of fragmented extended advertising data FIRST_FRAGMENT = 1 # First fragment of fragmented extended advertising data LAST_FRAGMENT = 2 # Last fragment of fragmented extended advertising data COMPLETE_FRAGMENT = 3 # Complete extended advertising data UNCHANGED_FRAGMENT = 4 # Unchanged data (just update the Advertising DID) class Ixit: """ Definition of Implementation eXtra Information for Test (IXIT) """ def __init__(self, profile_id, ref_major, ref_minor, value_fmt): self.profile_id = profile_id self.ref_major = ref_major self.ref_minor = ref_minor self.value_fmt = value_fmt """ The IXIT (Proforma for Bluetooth Conformance Test Suites) comes from Core.IXIT document https://www.bluetooth.com/specifications/qualification-test-requirements/ """ IXITS = { "TSPX_max_sdu_length": Ixit(ProfileId.PROFILE_ID_LL, 7, 1, 'H'), "TSPX_max_cis_nse": Ixit(ProfileId.PROFILE_ID_LL, 7, 14, 'B'), "TSPX_max_cis_bn": Ixit(ProfileId.PROFILE_ID_LL, 7, 15, 'B'), } """ BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 6, Part B, 4.6 FEATURE SUPPORT """ class FeatureSupport(IntEnum): ISOCHRONOUS_BROADCASTER = 30 ISOCHRONOUS_CHANNELS = 32 def edtt_send_cmd(transport, idx, opcode, payload_fmt, payload_tuple): """Send EDTT command EDTT command PDU format 0--------16--------------32--------+ | Opcode | PayloadLength | Payload | +--------+---------------+---------+ :param transport: bearer to be used :param idx: device index :param opcode: command opcode :param payload_fmt: command payload format used to serialize the data :param payload_tuple: payload as tuple :return: """ req = struct.pack('= 0: start_t = transport.last_t cmd = struct.pack(' 0: break; to_tmp = 100 - int((transport.last_t - start_t) / 1000); to -= 100; if to >= 0 and to_tmp > 0: transport.wait(to_tmp); return count > 0, count; """ Get event(s) from the events queue """ def get_event(transport, idx, to, multiple=False): cmd = struct.pack(' 0: packet = transport.recv(idx, 8, to); RespLen, time, event, eventLen = struct.unpack('= 0: cmd = struct.pack('= 0: transport.wait(100); return empty != 1; """ Write Data packet """ def le_data_write(transport, idx, handle, PbFlags, BcFlags, data, to): handle &= 0x0fff; handle |= (PbFlags | (BcFlags << 2)) << 12; cmd = struct.pack(' 8: packet = transport.recv(idx, RespLen - 8, to); if dataLen > 0: data = struct.unpack('<' + str(dataLen) + 'B', packet); else: data = []; if ( RespCmd != Commands.CMD_LE_DATA_READ_RSP ): raise Exception("LE Data Read command failed: Inappropriate command response received"); if ( RespLen != 8 + dataLen ): raise Exception("LE Data Read command failed: Response length field corrupted (%i)" % RespLen); PbFlags = (handle >> 12) & 0x03; BcFlags = (handle >> 14) & 0x03; handle &= 0x0fff; transport.Trace.btsnoop.send_monitor_acl_rx(idx, handle, dataLen, packet) return time, handle, PbFlags, BcFlags, data; """ Switch GATT Service Set """ def switch_gatt_service_set(transport, idx, serviceSet, to): cmd = struct.pack('= 0: cmd = struct.pack('= 0: transport.wait(100) return empty != 1 def le_iso_data_write_rsp(transport, idx, to): packet = transport.recv(idx, 5, to) if ( 5 != len(packet) ): raise Exception("LE ISO Data Write command failed: Response too short (Expected %i bytes got %i bytes)" % (5, len(packet))) RespCmd, RespLen, status = struct.unpack(' 8: packet = transport.recv(idx, RespLen - 8, to) if dataLen > 0: data = struct.unpack('<' + str(dataLen) + 'B', packet) else: data = [] if ( RespCmd != Commands.CMD_LE_ISO_DATA_READ_RSP ): raise Exception("LE ISO Data Read command failed: Inappropriate command response received") if ( RespLen != 8 + dataLen ): raise Exception("LE ISO Data Read command failed: Response length field corrupted (%i)" % RespLen) transport.Trace.btsnoop.send_monitor_iso_rx(idx, handle, dataLen, packet) PbFlags = (handle >> 12) & 0x03 TsFlag = (handle >> 14) & 0x01 handle &= 0x0fff return time, handle, PbFlags, TsFlag, data """ The HCI_LE_Set_CIG_Parameters command is used by a central's Host to set the parameters of one or more CISes that are associated with a CIG in the Controller. """ def le_set_cig_parameters(transport, idx, CigId, SduIntervalMToS, SduIntervalSToM, PeripheralsClockAccuracy, Packing, Framing, MaxTransportLatencyMToS, MaxTransportLatencySToM, CisCount, CisId, MaxSduMToS, MaxSduSToM, PhyMToS, PhySToM, RtnMToS, RtnSToM, to): cmd_parameters = [HCICommands.BT_HCI_OP_LE_SET_CIG_PARAMETERS, CigId, *toArray(SduIntervalMToS, 3), *toArray(SduIntervalSToM, 3), PeripheralsClockAccuracy, Packing, Framing, MaxTransportLatencyMToS, MaxTransportLatencySToM, CisCount] for i in range(CisCount): cmd_parameters += [CisId[i], MaxSduMToS[i], MaxSduSToM[i], PhyMToS[i], PhySToM[i], RtnMToS[i], RtnSToM[i]] edtt_send_cmd(transport, idx, Commands.CMD_LE_SET_CIG_PARAMETERS_REQ, 'HB3B3BBBBHHB' + CisCount * 'BHHBBBB', cmd_parameters) status, cigId, cisCount, *cisConnectionHandle = \ edtt_wait_cmd_cmpl(transport, idx, Commands.CMD_LE_SET_CIG_PARAMETERS_RSP, f'BBB{CisCount}H', to) return status, cigId, cisCount, cisConnectionHandle """ The command is used by a central's Host to set the parameters of one or more CISes that are associated with a CIG in the Controller. Should only be used for testing purposes. """ def le_set_cig_parameters_test(transport, idx, CigId, SduIntervalMToS, SduIntervalSToM, FtMToS, FtSToM, IsoInterval, PeripheralsClockAccuracy, Packing, Framing, CisCount, CisId, Nse, MaxSduMToS, MaxSduSToM, MaxPduMToS, MaxPduSToM, PhyMToS, PhySToM, BnMToS, BnSToM, to): cmd_parameters = [HCICommands.BT_HCI_OP_LE_SET_CIG_PARAMETERS_TEST, CigId, *toArray(SduIntervalMToS, 3), *toArray(SduIntervalSToM, 3), FtMToS, FtSToM, IsoInterval, PeripheralsClockAccuracy, Packing, Framing, CisCount] for i in range(CisCount): cmd_parameters += [CisId[i], Nse[i], MaxSduMToS[i], MaxSduSToM[i], MaxPduMToS[i], MaxPduSToM[i], PhyMToS[i], PhySToM[i], BnMToS[i], BnSToM[i]] edtt_send_cmd(transport, idx, Commands.CMD_LE_SET_CIG_PARAMETERS_TEST_REQ, 'HB3B3BBBHBBBB' + CisCount * 'BBHHHHBBBB', cmd_parameters) status, cigId, cisCount, *cisConnectionHandle = \ edtt_wait_cmd_cmpl(transport, idx, Commands.CMD_LE_SET_CIG_PARAMETERS_TEST_RSP, f'BBB{CisCount}H', to) return status, cigId, cisCount, cisConnectionHandle """ The HCI_LE_Create_CIS command is used by the central's Host to create one or more CISes using the connections identified by the ACL_Connection_Handle[i] parameter array. """ def le_create_cis(transport, idx, CisCount, CisConnectionHandle, AclConnectionHandle, to): cmd_parameters = [HCICommands.BT_HCI_OP_LE_CREATE_CIS, CisCount] for i in range(CisCount): cmd_parameters += [CisConnectionHandle[i], AclConnectionHandle[i]] edtt_send_cmd(transport, idx, Commands.CMD_LE_CREATE_CIS_REQ, 'HB' + CisCount * 'HH', cmd_parameters) return edtt_wait_cmd_cmpl(transport, idx, Commands.CMD_LE_CREATE_CIS_RSP, 'B', to)[0] """ The HCI_LE_Remove_CIG command is used by the central's Host to remove all the CISes associated with the CIG identified by CIG_ID. """ def le_remove_cig(transport, idx, CigId, to): cmd = struct.pack('