1# Copyright 2022 Google LLC 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# https://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15# File generated from uci_packets.json, with the command: 16# ./scripts/generate_python_backend.py --input uci_packets.json 17# /!\ Do not edit by hand. 18from dataclasses import dataclass, field, fields 19from typing import Optional, List, Tuple 20import enum 21import inspect 22import math 23 24 25@dataclass 26class Packet: 27 payload: Optional[bytes] = field(repr=False) 28 29 @classmethod 30 def parse_all(cls, span: bytes) -> 'Packet': 31 packet, remain = getattr(cls, 'parse')(span) 32 if len(remain) > 0: 33 raise Exception('Unexpected parsing remainder') 34 return packet 35 36 def show(self, prefix: str = ''): 37 print(f'{self.__class__.__name__}') 38 39 def print_val(p: str, pp: str, name: str, align: int, typ, val): 40 if name == 'payload': 41 pass 42 43 # Scalar fields. 44 elif typ is int: 45 print(f'{p}{name:{align}} = {val} (0x{val:x})') 46 47 # Byte fields. 48 elif typ is bytes: 49 print(f'{p}{name:{align}} = [', end='') 50 line = '' 51 n_pp = '' 52 for (idx, b) in enumerate(val): 53 if idx > 0 and idx % 8 == 0: 54 print(f'{n_pp}{line}') 55 line = '' 56 n_pp = pp + (' ' * (align + 4)) 57 line += f' {b:02x}' 58 print(f'{n_pp}{line} ]') 59 60 # Enum fields. 61 elif inspect.isclass(typ) and issubclass(typ, enum.IntEnum): 62 print(f'{p}{name:{align}} = {typ.__name__}::{val.name} (0x{val:x})') 63 64 # Struct fields. 65 elif inspect.isclass(typ) and issubclass(typ, globals().get('Packet')): 66 print(f'{p}{name:{align}} = ', end='') 67 val.show(prefix=pp) 68 69 # Array fields. 70 elif typ.__origin__ == list: 71 print(f'{p}{name:{align}}') 72 last = len(val) - 1 73 align = 5 74 for (idx, elt) in enumerate(val): 75 n_p = pp + ('├── ' if idx != last else '└── ') 76 n_pp = pp + ('│ ' if idx != last else ' ') 77 print_val(n_p, n_pp, f'[{idx}]', 78 align, typ.__args__[0], val[idx]) 79 80 else: 81 print(f'{p}{name:{align}} = ##{typ}##') 82 83 last = len(fields(self)) - 1 84 align = max(len(f.name) for f in fields(self) if f.name != 'payload') 85 86 for (idx, f) in enumerate(fields(self)): 87 p = prefix + ('├── ' if idx != last else '└── ') 88 pp = prefix + ('│ ' if idx != last else ' ') 89 val = getattr(self, f.name) 90 91 print_val(p, pp, f.name, align, f.type, val) 92 93 94class PacketBoundaryFlag(enum.IntEnum): 95 COMPLETE = 0x0 96 NOT_COMPLETE = 0x1 97 98 99class GroupId(enum.IntEnum): 100 CORE = 0x0 101 SESSION_CONFIG = 0x1 102 RANGING_SESSION_CONTROL = 0x2 103 DATA_CONTROL = 0x3 104 TEST = 0xd 105 VENDOR_PICA = 0x9 106 VENDOR_RESERVED_A = 0xa 107 VENDOR_RESERVED_B = 0xb 108 VENDOR_ANDROID = 0xe 109 VENDOR_RESERVED_E = 0xc 110 VENDOR_RESERVED_F = 0xf 111 112 113class CoreOpCode(enum.IntEnum): 114 CORE_DEVICE_RESET = 0x0 115 CORE_DEVICE_STATUS_NTF = 0x1 116 CORE_GET_DEVICE_INFO = 0x2 117 CORE_GET_CAPS_INFO = 0x3 118 CORE_SET_CONFIG = 0x4 119 CORE_GET_CONFIG = 0x5 120 CORE_DEVICE_SUSPEND = 0x6 121 CORE_GENERIC_ERROR_NTF = 0x7 122 123 124class SessionOpCode(enum.IntEnum): 125 SESSION_INIT = 0x0 126 SESSION_DEINIT = 0x1 127 SESSION_STATUS_NTF = 0x2 128 SESSION_SET_APP_CONFIG = 0x3 129 SESSION_GET_APP_CONFIG = 0x4 130 SESSION_GET_COUNT = 0x5 131 SESSION_GET_STATE = 0x6 132 SESSION_UPDATE_CONTROLLER_MULTICAST_LIST = 0x7 133 134 135class RangeOpCode(enum.IntEnum): 136 RANGE_START = 0x0 137 RANGE_STOP = 0x1 138 RANGE_INTERVAL_UPDATE_REQ = 0x2 139 RANGE_GET_RANGING_COUNT = 0x3 140 141 142class AppDataOpCode(enum.IntEnum): 143 APP_DATA_TX = 0x0 144 APP_DATA_RX = 0x1 145 146 147class PicaOpCode(enum.IntEnum): 148 PICA_INIT_DEVICE = 0x0 149 PICA_SET_DEVICE_POSITION = 0x1 150 PICA_CREATE_BEACON = 0x2 151 PICA_SET_BEACON_POSITION = 0x3 152 PICA_DESTROY_BEACON = 0x4 153 154 155class AndroidOpCode(enum.IntEnum): 156 ANDROID_GET_POWER_STATS = 0x0 157 ANDROID_SET_COUNTRY_CODE = 0x1 158 159 160class StatusCode(enum.IntEnum): 161 UCI_STATUS_OK = 0x0 162 UCI_STATUS_REJECTED = 0x1 163 UCI_STATUS_FAILED = 0x2 164 UCI_STATUS_SYNTAX_ERROR = 0x3 165 UCI_STATUS_INVALID_PARAM = 0x4 166 UCI_STATUS_INVALID_RANGE = 0x5 167 UCI_STATUS_INVALID_MSG_SIZE = 0x6 168 UCI_STATUS_UNKNOWN_GID = 0x7 169 UCI_STATUS_UNKNOWN_OID = 0x8 170 UCI_STATUS_READ_ONLY = 0x9 171 UCI_STATUS_COMMAND_RETRY = 0xa 172 UCI_STATUS_SESSION_NOT_EXIST = 0x11 173 UCI_STATUS_SESSION_DUPLICATE = 0x12 174 UCI_STATUS_SESSION_ACTIVE = 0x13 175 UCI_STATUS_MAX_SESSIONS_EXCEEDED = 0x14 176 UCI_STATUS_SESSION_NOT_CONFIGURED = 0x15 177 UCI_STATUS_ACTIVE_SESSION_ONGOING = 0x16 178 UCI_STATUS_MULTICAST_LIST_FULL = 0x17 179 UCI_STATUS_ADDRESS_NOT_FOUND = 0x18 180 UCI_STATUS_ADDRESS_ALREADY_PRESENT = 0x19 181 UCI_STATUS_RANGING_TX_FAILED = 0x20 182 UCI_STATUS_RANGING_RX_TIMEOUT = 0x21 183 UCI_STATUS_RANGING_RX_PHY_DEC_FAILED = 0x22 184 UCI_STATUS_RANGING_RX_PHY_TOA_FAILED = 0x23 185 UCI_STATUS_RANGING_RX_PHY_STS_FAILED = 0x24 186 UCI_STATUS_RANGING_RX_MAC_DEC_FAILED = 0x25 187 UCI_STATUS_RANGING_RX_MAC_IE_DEC_FAILED = 0x26 188 UCI_STATUS_RANGING_RX_MAC_IE_MISSING = 0x27 189 UCI_STATUS_DATA_MAX_TX_PSDU_SIZE_EXCEEDED = 0x30 190 UCI_STATUS_DATA_RX_CRC_ERROR = 0x31 191 UCI_STATUS_ERROR_CCC_SE_BUSY = 0x50 192 UCI_STATUS_ERROR_CCC_LIFECYCLE = 0x51 193 194 195class ResetConfig(enum.IntEnum): 196 UWBS_RESET = 0x0 197 198 199class DeviceConfigId(enum.IntEnum): 200 DEVICE_STATE = 0x0 201 LOW_POWER_MODE = 0x1 202 203 204class AppConfigTlvType(enum.IntEnum): 205 DEVICE_TYPE = 0x0 206 RANGING_ROUND_USAGE = 0x1 207 STS_CONFIG = 0x2 208 MULTI_NODE_MODE = 0x3 209 CHANNEL_NUMBER = 0x4 210 NO_OF_CONTROLEE = 0x5 211 DEVICE_MAC_ADDRESS = 0x6 212 DST_MAC_ADDRESS = 0x7 213 SLOT_DURATION = 0x8 214 RANGING_INTERVAL = 0x9 215 STS_INDEX = 0xa 216 MAC_FCS_TYPE = 0xb 217 RANGING_ROUND_CONTROL = 0xc 218 AOA_RESULT_REQ = 0xd 219 RNG_DATA_NTF = 0xe 220 RNG_DATA_NTF_PROXIMITY_NEAR = 0xf 221 RNG_DATA_NTF_PROXIMITY_FAR = 0x10 222 DEVICE_ROLE = 0x11 223 RFRAME_CONFIG = 0x12 224 PREAMBLE_CODE_INDEX = 0x14 225 SFD_ID = 0x15 226 PSDU_DATA_RATE = 0x16 227 PREAMBLE_DURATION = 0x17 228 RANGING_TIME_STRUCT = 0x1a 229 SLOTS_PER_RR = 0x1b 230 TX_ADAPTIVE_PAYLOAD_POWER = 0x1c 231 RESPONDER_SLOT_INDEX = 0x1e 232 PRF_MODE = 0x1f 233 SCHEDULED_MODE = 0x22 234 KEY_ROTATION = 0x23 235 KEY_ROTATION_RATE = 0x24 236 SESSION_PRIORITY = 0x25 237 MAC_ADDRESS_MODE = 0x26 238 VENDOR_ID = 0x27 239 STATIC_STS_IV = 0x28 240 NUMBER_OF_STS_SEGMENTS = 0x29 241 MAX_RR_RETRY = 0x2a 242 UWB_INITIATION_TIME = 0x2b 243 HOPPING_MODE = 0x2c 244 BLOCK_STRIDE_LENGTH = 0x2d 245 RESULT_REPORT_CONFIG = 0x2e 246 IN_BAND_TERMINATION_ATTEMPT_COUNT = 0x2f 247 SUB_SESSION_ID = 0x30 248 BPRF_PHR_DATA_RATE = 0x31 249 MAX_NUMBER_OF_MEASUREMENTS = 0x32 250 STS_LENGTH = 0x35 251 CCC_HOP_MODE_KEY = 0xa0 252 CCC_UWB_TIME0 = 0xa1 253 CCC_RANGING_PROTOCOL_VER = 0xa3 254 CCC_UWB_CONFIG_ID = 0xa4 255 CCC_PULSESHAPE_COMBO = 0xa5 256 CCC_URSK_TTL = 0xa6 257 NB_OF_RANGE_MEASUREMENTS = 0xe3 258 NB_OF_AZIMUTH_MEASUREMENTS = 0xe4 259 NB_OF_ELEVATION_MEASUREMENTS = 0xe5 260 261 262class CapTlvType(enum.IntEnum): 263 SUPPORTED_FIRA_PHY_VERSION_RANGE = 0x0 264 SUPPORTED_FIRA_MAC_VERSION_RANGE = 0x1 265 SUPPORTED_DEVICE_ROLES = 0x2 266 SUPPORTED_RANGING_METHOD = 0x3 267 SUPPORTED_STS_CONFIG = 0x4 268 SUPPORTED_MULTI_NODE_MODES = 0x5 269 SUPPORTED_RANGING_TIME_STRUCT = 0x6 270 SUPPORTED_SCHEDULED_MODE = 0x7 271 SUPPORTED_HOPPING_MODE = 0x8 272 SUPPORTED_BLOCK_STRIDING = 0x9 273 SUPPORTED_UWB_INITIATION_TIME = 0xa 274 SUPPORTED_CHANNELS = 0xb 275 SUPPORTED_RFRAME_CONFIG = 0xc 276 SUPPORTED_CC_CONSTRAINT_LENGTH = 0xd 277 SUPPORTED_BPRF_PARAMETER_SETS = 0xe 278 SUPPORTED_HPRF_PARAMETER_SETS = 0xf 279 SUPPORTED_AOA = 0x10 280 SUPPORTED_EXTENDED_MAC_ADDRESS = 0x11 281 SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING = 0xe3 282 SUPPORTED_POWER_STATS = 0xc0 283 CCC_SUPPORTED_CHAPS_PER_SLOT = 0xa0 284 CCC_SUPPORTED_SYNC_CODES = 0xa1 285 CCC_SUPPORTED_HOPPING_CONFIG_MODES_AND_SEQUENCES = 0xa2 286 CCC_SUPPORTED_CHANNELS = 0xa3 287 CCC_SUPPORTED_VERSIONS = 0xa4 288 CCC_SUPPORTED_UWB_CONFIGS = 0xa5 289 CCC_SUPPORTED_PULSE_SHAPE_COMBOS = 0xa6 290 CCC_SUPPORTED_RAN_MULTIPLIER = 0xa7 291 292 293class AoaResultReqType(enum.IntEnum): 294 AOA_DISABLE = 0x0 295 AOA_ENABLE = 0x1 296 AOA_ENABLE_AZIMUTH = 0x2 297 AOA_ENABLE_ELEVATION = 0x3 298 AOA_ENABLE_INTERLEAVED = 0xf0 299 300 301class DeviceState(enum.IntEnum): 302 DEVICE_STATE_READY = 0x1 303 DEVICE_STATE_ACTIVE = 0x2 304 DEVICE_STATE_ERROR = 0xff 305 306 307class SessionState(enum.IntEnum): 308 SESSION_STATE_INIT = 0x0 309 SESSION_STATE_DEINIT = 0x1 310 SESSION_STATE_ACTIVE = 0x2 311 SESSION_STATE_IDLE = 0x3 312 313 314class ReasonCode(enum.IntEnum): 315 STATE_CHANGE_WITH_SESSION_MANAGEMENT_COMMANDS = 0x0 316 MAX_RANGING_ROUND_RETRY_COUNT_REACHED = 0x1 317 MAX_NUMBER_OF_MEASUREMENTS_REACHED = 0x2 318 ERROR_SLOT_LENGTH_NOT_SUPPORTED = 0x20 319 ERROR_INSUFFICIENT_SLOTS_PER_RR = 0x21 320 ERROR_MAC_ADDRESS_MODE_NOT_SUPPORTED = 0x22 321 ERROR_INVALID_RANGING_INTERVAL = 0x23 322 ERROR_INVALID_STS_CONFIG = 0x24 323 ERROR_INVALID_RFRAME_CONFIG = 0x25 324 325 326class MulticastUpdateStatusCode(enum.IntEnum): 327 STATUS_OK_MULTICAST_LIST_UPDATE = 0x0 328 STATUS_ERROR_MULTICAST_LIST_FULL = 0x1 329 STATUS_ERROR_KEY_FETCH_FAIL = 0x2 330 STATUS_ERROR_SUB_SESSION_ID_NOT_FOUND = 0x3 331 332 333class MacAddressIndicator(enum.IntEnum): 334 SHORT_ADDRESS = 0x0 335 EXTENDED_ADDRESS = 0x1 336 337 338class SessionType(enum.IntEnum): 339 FIRA_RANGING_SESSION = 0x0 340 FIRA_DATA_TRANSFER = 0x1 341 CCC = 0xa0 342 343 344class MessageType(enum.IntEnum): 345 COMMAND = 0x1 346 RESPONSE = 0x2 347 NOTIFICATION = 0x3 348 349 350@dataclass 351class UciPacket(Packet): 352 group_id: GroupId 353 packet_boundary_flag: PacketBoundaryFlag 354 message_type: MessageType 355 opcode: int 356 357 @staticmethod 358 def parse(span: bytes) -> Tuple['UciPacket', bytes]: 359 fields = {'payload': None} 360 if len(span) < 4: 361 raise Exception('Invalid packet size') 362 fields['group_id'] = GroupId((span[0] >> 0) & 0xf) 363 fields['packet_boundary_flag'] = PacketBoundaryFlag( 364 (span[0] >> 4) & 0x1) 365 fields['message_type'] = MessageType((span[0] >> 5) & 0x7) 366 fields['opcode'] = (span[1] >> 0) & 0x3f 367 _payload__size = span[3] 368 span = span[4:] 369 if len(span) < _payload__size: 370 raise Exception('Invalid packet size') 371 payload = span[:_payload__size] 372 fields['payload'] = payload 373 if fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x0: 374 return DeviceResetCmd.parse(fields, payload) 375 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x2: 376 return GetDeviceInfoCmd.parse(fields, payload) 377 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x3: 378 return GetCapsInfoCmd.parse(fields, payload) 379 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x4: 380 return SetConfigCmd.parse(fields, payload) 381 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x5: 382 return GetConfigCmd.parse(fields, payload) 383 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x0: 384 return SessionInitCmd.parse(fields, payload) 385 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x1: 386 return SessionDeinitCmd.parse(fields, payload) 387 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x3: 388 return SessionSetAppConfigCmd.parse(fields, payload) 389 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x4: 390 return SessionGetAppConfigCmd.parse(fields, payload) 391 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x5: 392 return SessionGetCountCmd.parse(fields, payload) 393 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x6: 394 return SessionGetStateCmd.parse(fields, payload) 395 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x7: 396 return SessionUpdateControllerMulticastListCmd.parse(fields, payload) 397 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.RANGING_SESSION_CONTROL: 398 return RangingCommand.parse(fields, payload) 399 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x0: 400 return PicaInitDeviceCmd.parse(fields, payload) 401 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x1: 402 return PicaSetDevicePositionCmd.parse(fields, payload) 403 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x2: 404 return PicaCreateBeaconCmd.parse(fields, payload) 405 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x3: 406 return PicaSetBeaconPositionCmd.parse(fields, payload) 407 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x4: 408 return PicaDestroyBeaconCmd.parse(fields, payload) 409 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_ANDROID and fields['opcode'] == 0x0: 410 return AndroidGetPowerStatsCmd.parse(fields, payload) 411 elif fields['message_type'] == MessageType.COMMAND and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_ANDROID and fields['opcode'] == 0x1: 412 return AndroidSetCountryCodeCmd.parse(fields, payload) 413 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x0: 414 return DeviceResetRsp.parse(fields, payload) 415 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x2: 416 return GetDeviceInfoRsp.parse(fields, payload) 417 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x3: 418 return GetCapsInfoRsp.parse(fields, payload) 419 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x4: 420 return SetConfigRsp.parse(fields, payload) 421 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x5: 422 return GetConfigRsp.parse(fields, payload) 423 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x0: 424 return SessionInitRsp.parse(fields, payload) 425 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x1: 426 return SessionDeinitRsp.parse(fields, payload) 427 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x3: 428 return SessionSetAppConfigRsp.parse(fields, payload) 429 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x4: 430 return SessionGetAppConfigRsp.parse(fields, payload) 431 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x5: 432 return SessionGetCountRsp.parse(fields, payload) 433 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x6: 434 return SessionGetStateRsp.parse(fields, payload) 435 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x7: 436 return SessionUpdateControllerMulticastListRsp.parse(fields, payload) 437 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.RANGING_SESSION_CONTROL and fields['opcode'] == 0x0: 438 return RangeStartRsp.parse(fields, payload) 439 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.RANGING_SESSION_CONTROL and fields['opcode'] == 0x1: 440 return RangeStopRsp.parse(fields, payload) 441 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.RANGING_SESSION_CONTROL and fields['opcode'] == 0x3: 442 return RangeGetRangingCountRsp.parse(fields, payload) 443 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x0: 444 return PicaInitDeviceRsp.parse(fields, payload) 445 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x1: 446 return PicaSetDevicePositionRsp.parse(fields, payload) 447 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x2: 448 return PicaCreateBeaconRsp.parse(fields, payload) 449 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x3: 450 return PicaSetBeaconPositionRsp.parse(fields, payload) 451 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x4: 452 return PicaDestroyBeaconRsp.parse(fields, payload) 453 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_ANDROID and fields['opcode'] == 0x0: 454 return AndroidGetPowerStatsRsp.parse(fields, payload) 455 elif fields['message_type'] == MessageType.RESPONSE and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.VENDOR_ANDROID and fields['opcode'] == 0x1: 456 return AndroidSetCountryCodeRsp.parse(fields, payload) 457 elif fields['message_type'] == MessageType.NOTIFICATION and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x1: 458 return DeviceStatusNtf.parse(fields, payload) 459 elif fields['message_type'] == MessageType.NOTIFICATION and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x7: 460 return GenericError.parse(fields, payload) 461 elif fields['message_type'] == MessageType.NOTIFICATION and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x2: 462 return SessionStatusNtf.parse(fields, payload) 463 elif fields['message_type'] == MessageType.NOTIFICATION and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x7: 464 return SessionUpdateControllerMulticastListNtf.parse(fields, payload) 465 elif fields['message_type'] == MessageType.NOTIFICATION and fields['packet_boundary_flag'] == PacketBoundaryFlag.COMPLETE and fields['group_id'] == GroupId.RANGING_SESSION_CONTROL and fields['opcode'] == 0x0: 466 return RangeDataNtf.parse(fields, payload) 467 else: 468 return UciPacket(**fields), span 469 470 def serialize(self) -> bytes: 471 pass 472 473 474@dataclass 475class UciCommand(UciPacket): 476 477 @staticmethod 478 def parse(fields: dict, span: bytes) -> Tuple['UciCommand', bytes]: 479 payload = span 480 fields['payload'] = payload 481 if fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x0: 482 return DeviceResetCmd.parse(fields, payload) 483 elif fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x2: 484 return GetDeviceInfoCmd.parse(fields, payload) 485 elif fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x3: 486 return GetCapsInfoCmd.parse(fields, payload) 487 elif fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x4: 488 return SetConfigCmd.parse(fields, payload) 489 elif fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x5: 490 return GetConfigCmd.parse(fields, payload) 491 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x0: 492 return SessionInitCmd.parse(fields, payload) 493 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x1: 494 return SessionDeinitCmd.parse(fields, payload) 495 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x3: 496 return SessionSetAppConfigCmd.parse(fields, payload) 497 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x4: 498 return SessionGetAppConfigCmd.parse(fields, payload) 499 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x5: 500 return SessionGetCountCmd.parse(fields, payload) 501 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x6: 502 return SessionGetStateCmd.parse(fields, payload) 503 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x7: 504 return SessionUpdateControllerMulticastListCmd.parse(fields, payload) 505 elif fields['group_id'] == GroupId.RANGING_SESSION_CONTROL: 506 return RangingCommand.parse(fields, payload) 507 elif fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x0: 508 return PicaInitDeviceCmd.parse(fields, payload) 509 elif fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x1: 510 return PicaSetDevicePositionCmd.parse(fields, payload) 511 elif fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x2: 512 return PicaCreateBeaconCmd.parse(fields, payload) 513 elif fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x3: 514 return PicaSetBeaconPositionCmd.parse(fields, payload) 515 elif fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x4: 516 return PicaDestroyBeaconCmd.parse(fields, payload) 517 elif fields['group_id'] == GroupId.VENDOR_ANDROID and fields['opcode'] == 0x0: 518 return AndroidGetPowerStatsCmd.parse(fields, payload) 519 elif fields['group_id'] == GroupId.VENDOR_ANDROID and fields['opcode'] == 0x1: 520 return AndroidSetCountryCodeCmd.parse(fields, payload) 521 else: 522 return UciCommand(**fields), span 523 524 def serialize(self) -> bytes: 525 pass 526 527 528@dataclass 529class UciResponse(UciPacket): 530 531 @staticmethod 532 def parse(fields: dict, span: bytes) -> Tuple['UciResponse', bytes]: 533 payload = span 534 fields['payload'] = payload 535 if fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x0: 536 return DeviceResetRsp.parse(fields, payload) 537 elif fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x2: 538 return GetDeviceInfoRsp.parse(fields, payload) 539 elif fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x3: 540 return GetCapsInfoRsp.parse(fields, payload) 541 elif fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x4: 542 return SetConfigRsp.parse(fields, payload) 543 elif fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x5: 544 return GetConfigRsp.parse(fields, payload) 545 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x0: 546 return SessionInitRsp.parse(fields, payload) 547 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x1: 548 return SessionDeinitRsp.parse(fields, payload) 549 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x3: 550 return SessionSetAppConfigRsp.parse(fields, payload) 551 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x4: 552 return SessionGetAppConfigRsp.parse(fields, payload) 553 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x5: 554 return SessionGetCountRsp.parse(fields, payload) 555 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x6: 556 return SessionGetStateRsp.parse(fields, payload) 557 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x7: 558 return SessionUpdateControllerMulticastListRsp.parse(fields, payload) 559 elif fields['group_id'] == GroupId.RANGING_SESSION_CONTROL and fields['opcode'] == 0x0: 560 return RangeStartRsp.parse(fields, payload) 561 elif fields['group_id'] == GroupId.RANGING_SESSION_CONTROL and fields['opcode'] == 0x1: 562 return RangeStopRsp.parse(fields, payload) 563 elif fields['group_id'] == GroupId.RANGING_SESSION_CONTROL and fields['opcode'] == 0x3: 564 return RangeGetRangingCountRsp.parse(fields, payload) 565 elif fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x0: 566 return PicaInitDeviceRsp.parse(fields, payload) 567 elif fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x1: 568 return PicaSetDevicePositionRsp.parse(fields, payload) 569 elif fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x2: 570 return PicaCreateBeaconRsp.parse(fields, payload) 571 elif fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x3: 572 return PicaSetBeaconPositionRsp.parse(fields, payload) 573 elif fields['group_id'] == GroupId.VENDOR_PICA and fields['opcode'] == 0x4: 574 return PicaDestroyBeaconRsp.parse(fields, payload) 575 elif fields['group_id'] == GroupId.VENDOR_ANDROID and fields['opcode'] == 0x0: 576 return AndroidGetPowerStatsRsp.parse(fields, payload) 577 elif fields['group_id'] == GroupId.VENDOR_ANDROID and fields['opcode'] == 0x1: 578 return AndroidSetCountryCodeRsp.parse(fields, payload) 579 else: 580 return UciResponse(**fields), span 581 582 def serialize(self) -> bytes: 583 pass 584 585 586@dataclass 587class UciNotification(UciPacket): 588 589 @staticmethod 590 def parse(fields: dict, span: bytes) -> Tuple['UciNotification', bytes]: 591 payload = span 592 fields['payload'] = payload 593 if fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x1: 594 return DeviceStatusNtf.parse(fields, payload) 595 elif fields['group_id'] == GroupId.CORE and fields['opcode'] == 0x7: 596 return GenericError.parse(fields, payload) 597 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x2: 598 return SessionStatusNtf.parse(fields, payload) 599 elif fields['group_id'] == GroupId.SESSION_CONFIG and fields['opcode'] == 0x7: 600 return SessionUpdateControllerMulticastListNtf.parse(fields, payload) 601 elif fields['group_id'] == GroupId.RANGING_SESSION_CONTROL and fields['opcode'] == 0x0: 602 return RangeDataNtf.parse(fields, payload) 603 else: 604 return UciNotification(**fields), span 605 606 def serialize(self) -> bytes: 607 pass 608 609 610@dataclass 611class CoreCommand(UciCommand): 612 613 @staticmethod 614 def parse(fields: dict, span: bytes) -> Tuple['CoreCommand', bytes]: 615 payload = span 616 fields['payload'] = payload 617 if fields['opcode'] == 0x0: 618 return DeviceResetCmd.parse(fields, payload) 619 elif fields['opcode'] == 0x2: 620 return GetDeviceInfoCmd.parse(fields, payload) 621 elif fields['opcode'] == 0x3: 622 return GetCapsInfoCmd.parse(fields, payload) 623 elif fields['opcode'] == 0x4: 624 return SetConfigCmd.parse(fields, payload) 625 elif fields['opcode'] == 0x5: 626 return GetConfigCmd.parse(fields, payload) 627 else: 628 return CoreCommand(**fields), span 629 630 def serialize(self) -> bytes: 631 pass 632 633 634@dataclass 635class CoreResponse(UciResponse): 636 637 @staticmethod 638 def parse(fields: dict, span: bytes) -> Tuple['CoreResponse', bytes]: 639 payload = span 640 fields['payload'] = payload 641 if fields['opcode'] == 0x0: 642 return DeviceResetRsp.parse(fields, payload) 643 elif fields['opcode'] == 0x2: 644 return GetDeviceInfoRsp.parse(fields, payload) 645 elif fields['opcode'] == 0x3: 646 return GetCapsInfoRsp.parse(fields, payload) 647 elif fields['opcode'] == 0x4: 648 return SetConfigRsp.parse(fields, payload) 649 elif fields['opcode'] == 0x5: 650 return GetConfigRsp.parse(fields, payload) 651 else: 652 return CoreResponse(**fields), span 653 654 def serialize(self) -> bytes: 655 pass 656 657 658@dataclass 659class CoreNotification(UciNotification): 660 661 @staticmethod 662 def parse(fields: dict, span: bytes) -> Tuple['CoreNotification', bytes]: 663 payload = span 664 fields['payload'] = payload 665 if fields['opcode'] == 0x1: 666 return DeviceStatusNtf.parse(fields, payload) 667 elif fields['opcode'] == 0x7: 668 return GenericError.parse(fields, payload) 669 else: 670 return CoreNotification(**fields), span 671 672 def serialize(self) -> bytes: 673 pass 674 675 676@dataclass 677class SessionCommand(UciCommand): 678 679 @staticmethod 680 def parse(fields: dict, span: bytes) -> Tuple['SessionCommand', bytes]: 681 payload = span 682 fields['payload'] = payload 683 if fields['opcode'] == 0x0: 684 return SessionInitCmd.parse(fields, payload) 685 elif fields['opcode'] == 0x1: 686 return SessionDeinitCmd.parse(fields, payload) 687 elif fields['opcode'] == 0x3: 688 return SessionSetAppConfigCmd.parse(fields, payload) 689 elif fields['opcode'] == 0x4: 690 return SessionGetAppConfigCmd.parse(fields, payload) 691 elif fields['opcode'] == 0x5: 692 return SessionGetCountCmd.parse(fields, payload) 693 elif fields['opcode'] == 0x6: 694 return SessionGetStateCmd.parse(fields, payload) 695 elif fields['opcode'] == 0x7: 696 return SessionUpdateControllerMulticastListCmd.parse(fields, payload) 697 else: 698 return SessionCommand(**fields), span 699 700 def serialize(self) -> bytes: 701 pass 702 703 704@dataclass 705class SessionResponse(UciResponse): 706 707 @staticmethod 708 def parse(fields: dict, span: bytes) -> Tuple['SessionResponse', bytes]: 709 payload = span 710 fields['payload'] = payload 711 if fields['opcode'] == 0x0: 712 return SessionInitRsp.parse(fields, payload) 713 elif fields['opcode'] == 0x1: 714 return SessionDeinitRsp.parse(fields, payload) 715 elif fields['opcode'] == 0x3: 716 return SessionSetAppConfigRsp.parse(fields, payload) 717 elif fields['opcode'] == 0x4: 718 return SessionGetAppConfigRsp.parse(fields, payload) 719 elif fields['opcode'] == 0x5: 720 return SessionGetCountRsp.parse(fields, payload) 721 elif fields['opcode'] == 0x6: 722 return SessionGetStateRsp.parse(fields, payload) 723 elif fields['opcode'] == 0x7: 724 return SessionUpdateControllerMulticastListRsp.parse(fields, payload) 725 else: 726 return SessionResponse(**fields), span 727 728 def serialize(self) -> bytes: 729 pass 730 731 732@dataclass 733class SessionNotification(UciNotification): 734 735 @staticmethod 736 def parse(fields: dict, span: bytes) -> Tuple['SessionNotification', bytes]: 737 payload = span 738 fields['payload'] = payload 739 if fields['opcode'] == 0x2: 740 return SessionStatusNtf.parse(fields, payload) 741 elif fields['opcode'] == 0x7: 742 return SessionUpdateControllerMulticastListNtf.parse(fields, payload) 743 else: 744 return SessionNotification(**fields), span 745 746 def serialize(self) -> bytes: 747 pass 748 749 750@dataclass 751class RangingCommand(UciCommand): 752 session_id: int 753 754 @staticmethod 755 def parse(fields: dict, span: bytes) -> Tuple['RangingCommand', bytes]: 756 if len(span) < 4: 757 raise Exception('Invalid packet size') 758 value_ = int.from_bytes(span[0:4], byteorder='little') 759 fields['session_id'] = value_ 760 span = span[4:] 761 payload = span 762 fields['payload'] = payload 763 if fields['opcode'] == 0x0: 764 return RangeStartCmd.parse(fields, payload) 765 elif fields['opcode'] == 0x1: 766 return RangeStopCmd.parse(fields, payload) 767 elif fields['opcode'] == 0x3: 768 return RangeGetRangingCountCmd.parse(fields, payload) 769 else: 770 return RangingCommand(**fields), span 771 772 def serialize(self) -> bytes: 773 pass 774 775 776@dataclass 777class RangingResponse(UciResponse): 778 779 @staticmethod 780 def parse(fields: dict, span: bytes) -> Tuple['RangingResponse', bytes]: 781 payload = span 782 fields['payload'] = payload 783 if fields['opcode'] == 0x0: 784 return RangeStartRsp.parse(fields, payload) 785 elif fields['opcode'] == 0x1: 786 return RangeStopRsp.parse(fields, payload) 787 elif fields['opcode'] == 0x3: 788 return RangeGetRangingCountRsp.parse(fields, payload) 789 else: 790 return RangingResponse(**fields), span 791 792 def serialize(self) -> bytes: 793 pass 794 795 796@dataclass 797class RangingNotification(UciNotification): 798 799 @staticmethod 800 def parse(fields: dict, span: bytes) -> Tuple['RangingNotification', bytes]: 801 payload = span 802 fields['payload'] = payload 803 if fields['opcode'] == 0x0: 804 return RangeDataNtf.parse(fields, payload) 805 else: 806 return RangingNotification(**fields), span 807 808 def serialize(self) -> bytes: 809 pass 810 811 812@dataclass 813class PicaCommand(UciCommand): 814 815 @staticmethod 816 def parse(fields: dict, span: bytes) -> Tuple['PicaCommand', bytes]: 817 payload = span 818 fields['payload'] = payload 819 if fields['opcode'] == 0x0: 820 return PicaInitDeviceCmd.parse(fields, payload) 821 elif fields['opcode'] == 0x1: 822 return PicaSetDevicePositionCmd.parse(fields, payload) 823 elif fields['opcode'] == 0x2: 824 return PicaCreateBeaconCmd.parse(fields, payload) 825 elif fields['opcode'] == 0x3: 826 return PicaSetBeaconPositionCmd.parse(fields, payload) 827 elif fields['opcode'] == 0x4: 828 return PicaDestroyBeaconCmd.parse(fields, payload) 829 else: 830 return PicaCommand(**fields), span 831 832 def serialize(self) -> bytes: 833 pass 834 835 836@dataclass 837class PicaResponse(UciResponse): 838 839 @staticmethod 840 def parse(fields: dict, span: bytes) -> Tuple['PicaResponse', bytes]: 841 payload = span 842 fields['payload'] = payload 843 if fields['opcode'] == 0x0: 844 return PicaInitDeviceRsp.parse(fields, payload) 845 elif fields['opcode'] == 0x1: 846 return PicaSetDevicePositionRsp.parse(fields, payload) 847 elif fields['opcode'] == 0x2: 848 return PicaCreateBeaconRsp.parse(fields, payload) 849 elif fields['opcode'] == 0x3: 850 return PicaSetBeaconPositionRsp.parse(fields, payload) 851 elif fields['opcode'] == 0x4: 852 return PicaDestroyBeaconRsp.parse(fields, payload) 853 else: 854 return PicaResponse(**fields), span 855 856 def serialize(self) -> bytes: 857 pass 858 859 860@dataclass 861class AndroidCommand(UciCommand): 862 863 @staticmethod 864 def parse(fields: dict, span: bytes) -> Tuple['AndroidCommand', bytes]: 865 payload = span 866 fields['payload'] = payload 867 if fields['opcode'] == 0x0: 868 return AndroidGetPowerStatsCmd.parse(fields, payload) 869 elif fields['opcode'] == 0x1: 870 return AndroidSetCountryCodeCmd.parse(fields, payload) 871 else: 872 return AndroidCommand(**fields), span 873 874 def serialize(self) -> bytes: 875 pass 876 877 878@dataclass 879class AndroidResponse(UciResponse): 880 881 @staticmethod 882 def parse(fields: dict, span: bytes) -> Tuple['AndroidResponse', bytes]: 883 payload = span 884 fields['payload'] = payload 885 if fields['opcode'] == 0x0: 886 return AndroidGetPowerStatsRsp.parse(fields, payload) 887 elif fields['opcode'] == 0x1: 888 return AndroidSetCountryCodeRsp.parse(fields, payload) 889 else: 890 return AndroidResponse(**fields), span 891 892 def serialize(self) -> bytes: 893 pass 894 895 896@dataclass 897class AndroidNotification(UciNotification): 898 899 @staticmethod 900 def parse(fields: dict, span: bytes) -> Tuple['AndroidNotification', bytes]: 901 payload = span 902 fields['payload'] = payload 903 return AndroidNotification(**fields), span 904 905 def serialize(self) -> bytes: 906 pass 907 908 909@dataclass 910class DeviceResetCmd(CoreCommand): 911 reset_config: ResetConfig 912 913 @staticmethod 914 def parse(fields: dict, span: bytes) -> Tuple['DeviceResetCmd', bytes]: 915 if len(span) < 1: 916 raise Exception('Invalid packet size') 917 fields['reset_config'] = ResetConfig(span[0]) 918 span = span[1:] 919 return DeviceResetCmd(**fields), span 920 921 def serialize(self) -> bytes: 922 pass 923 924 925@dataclass 926class DeviceResetRsp(CoreResponse): 927 status: StatusCode 928 929 @staticmethod 930 def parse(fields: dict, span: bytes) -> Tuple['DeviceResetRsp', bytes]: 931 if len(span) < 1: 932 raise Exception('Invalid packet size') 933 fields['status'] = StatusCode(span[0]) 934 span = span[1:] 935 return DeviceResetRsp(**fields), span 936 937 def serialize(self) -> bytes: 938 pass 939 940 941@dataclass 942class DeviceStatusNtf(CoreNotification): 943 device_state: DeviceState 944 945 @staticmethod 946 def parse(fields: dict, span: bytes) -> Tuple['DeviceStatusNtf', bytes]: 947 if len(span) < 1: 948 raise Exception('Invalid packet size') 949 fields['device_state'] = DeviceState(span[0]) 950 span = span[1:] 951 return DeviceStatusNtf(**fields), span 952 953 def serialize(self) -> bytes: 954 pass 955 956 957@dataclass 958class GetDeviceInfoCmd(CoreCommand): 959 960 @staticmethod 961 def parse(fields: dict, span: bytes) -> Tuple['GetDeviceInfoCmd', bytes]: 962 return GetDeviceInfoCmd(**fields), span 963 964 def serialize(self) -> bytes: 965 pass 966 967 968@dataclass 969class GetDeviceInfoRsp(CoreResponse): 970 status: StatusCode 971 uci_version: int 972 mac_version: int 973 phy_version: int 974 uci_test_version: int 975 vendor_spec_info: bytes 976 977 @staticmethod 978 def parse(fields: dict, span: bytes) -> Tuple['GetDeviceInfoRsp', bytes]: 979 if len(span) < 10: 980 raise Exception('Invalid packet size') 981 fields['status'] = StatusCode(span[0]) 982 value_ = int.from_bytes(span[1:3], byteorder='little') 983 fields['uci_version'] = value_ 984 value_ = int.from_bytes(span[3:5], byteorder='little') 985 fields['mac_version'] = value_ 986 value_ = int.from_bytes(span[5:7], byteorder='little') 987 fields['phy_version'] = value_ 988 value_ = int.from_bytes(span[7:9], byteorder='little') 989 fields['uci_test_version'] = value_ 990 vendor_spec_info_count = span[9] 991 span = span[10:] 992 if len(span) < vendor_spec_info_count: 993 raise Exception('Invalid packet size') 994 vendor_spec_info = [] 995 for n in range(vendor_spec_info_count): 996 vendor_spec_info.append(int.from_bytes( 997 span[n:n + 1], byteorder='little')) 998 fields['vendor_spec_info'] = vendor_spec_info 999 span = span[vendor_spec_info_count:] 1000 return GetDeviceInfoRsp(**fields), span 1001 1002 def serialize(self) -> bytes: 1003 pass 1004 1005 1006@dataclass 1007class GetCapsInfoCmd(CoreCommand): 1008 1009 @staticmethod 1010 def parse(fields: dict, span: bytes) -> Tuple['GetCapsInfoCmd', bytes]: 1011 return GetCapsInfoCmd(**fields), span 1012 1013 def serialize(self) -> bytes: 1014 pass 1015 1016 1017@dataclass 1018class CapTlv(Packet): 1019 t: CapTlvType 1020 v: bytes 1021 1022 @staticmethod 1023 def parse(span: bytes) -> Tuple['CapTlv', bytes]: 1024 fields = {'payload': None} 1025 if len(span) < 2: 1026 raise Exception('Invalid packet size') 1027 fields['t'] = CapTlvType(span[0]) 1028 v_count = span[1] 1029 span = span[2:] 1030 if len(span) < v_count: 1031 raise Exception('Invalid packet size') 1032 v = [] 1033 for n in range(v_count): 1034 v.append(int.from_bytes(span[n:n + 1], byteorder='little')) 1035 fields['v'] = v 1036 span = span[v_count:] 1037 return CapTlv(**fields), span 1038 1039 def serialize(self) -> bytes: 1040 pass 1041 1042 1043@dataclass 1044class GetCapsInfoRsp(CoreResponse): 1045 status: StatusCode 1046 tlvs: List[CapTlv] 1047 1048 @staticmethod 1049 def parse(fields: dict, span: bytes) -> Tuple['GetCapsInfoRsp', bytes]: 1050 if len(span) < 2: 1051 raise Exception('Invalid packet size') 1052 fields['status'] = StatusCode(span[0]) 1053 tlvs_count = span[1] 1054 span = span[2:] 1055 tlvs = [] 1056 for n in range(tlvs_count): 1057 element, span = CapTlv.parse(span) 1058 tlvs.append(element) 1059 fields['tlvs'] = tlvs 1060 return GetCapsInfoRsp(**fields), span 1061 1062 def serialize(self) -> bytes: 1063 pass 1064 1065 1066@dataclass 1067class DeviceParameter(Packet): 1068 id: int 1069 value: bytes 1070 1071 @staticmethod 1072 def parse(span: bytes) -> Tuple['DeviceParameter', bytes]: 1073 fields = {'payload': None} 1074 if len(span) < 2: 1075 raise Exception('Invalid packet size') 1076 fields['id'] = span[0] 1077 value_count = span[1] 1078 span = span[2:] 1079 if len(span) < value_count: 1080 raise Exception('Invalid packet size') 1081 value = [] 1082 for n in range(value_count): 1083 value.append(int.from_bytes(span[n:n + 1], byteorder='little')) 1084 fields['value'] = value 1085 span = span[value_count:] 1086 return DeviceParameter(**fields), span 1087 1088 def serialize(self) -> bytes: 1089 pass 1090 1091 1092@dataclass 1093class SetConfigCmd(CoreCommand): 1094 parameters: List[DeviceParameter] 1095 1096 @staticmethod 1097 def parse(fields: dict, span: bytes) -> Tuple['SetConfigCmd', bytes]: 1098 if len(span) < 1: 1099 raise Exception('Invalid packet size') 1100 parameters_count = span[0] 1101 span = span[1:] 1102 parameters = [] 1103 for n in range(parameters_count): 1104 element, span = DeviceParameter.parse(span) 1105 parameters.append(element) 1106 fields['parameters'] = parameters 1107 return SetConfigCmd(**fields), span 1108 1109 def serialize(self) -> bytes: 1110 pass 1111 1112 1113@dataclass 1114class DeviceConfigStatus(Packet): 1115 parameter_id: int 1116 status: StatusCode 1117 1118 @staticmethod 1119 def parse(span: bytes) -> Tuple['DeviceConfigStatus', bytes]: 1120 fields = {'payload': None} 1121 if len(span) < 2: 1122 raise Exception('Invalid packet size') 1123 fields['parameter_id'] = span[0] 1124 fields['status'] = StatusCode(span[1]) 1125 span = span[2:] 1126 return DeviceConfigStatus(**fields), span 1127 1128 def serialize(self) -> bytes: 1129 pass 1130 1131 1132@dataclass 1133class SetConfigRsp(CoreResponse): 1134 status: StatusCode 1135 parameters: List[DeviceConfigStatus] 1136 1137 @staticmethod 1138 def parse(fields: dict, span: bytes) -> Tuple['SetConfigRsp', bytes]: 1139 if len(span) < 2: 1140 raise Exception('Invalid packet size') 1141 fields['status'] = StatusCode(span[0]) 1142 parameters_count = span[1] 1143 span = span[2:] 1144 if len(span) < parameters_count * 2: 1145 raise Exception('Invalid packet size') 1146 parameters = [] 1147 for n in range(parameters_count): 1148 parameters.append(DeviceConfigStatus.parse_all( 1149 span[n * 2:(n + 1) * 2])) 1150 fields['parameters'] = parameters 1151 span = span[parameters_count * 2:] 1152 return SetConfigRsp(**fields), span 1153 1154 def serialize(self) -> bytes: 1155 pass 1156 1157 1158@dataclass 1159class GetConfigCmd(CoreCommand): 1160 parameter_ids: bytes 1161 1162 @staticmethod 1163 def parse(fields: dict, span: bytes) -> Tuple['GetConfigCmd', bytes]: 1164 if len(span) < 1: 1165 raise Exception('Invalid packet size') 1166 parameter_ids_count = span[0] 1167 span = span[1:] 1168 if len(span) < parameter_ids_count: 1169 raise Exception('Invalid packet size') 1170 parameter_ids = [] 1171 for n in range(parameter_ids_count): 1172 parameter_ids.append(int.from_bytes( 1173 span[n:n + 1], byteorder='little')) 1174 fields['parameter_ids'] = parameter_ids 1175 span = span[parameter_ids_count:] 1176 return GetConfigCmd(**fields), span 1177 1178 def serialize(self) -> bytes: 1179 pass 1180 1181 1182@dataclass 1183class GetConfigRsp(CoreResponse): 1184 status: StatusCode 1185 parameters: List[DeviceParameter] 1186 1187 @staticmethod 1188 def parse(fields: dict, span: bytes) -> Tuple['GetConfigRsp', bytes]: 1189 if len(span) < 2: 1190 raise Exception('Invalid packet size') 1191 fields['status'] = StatusCode(span[0]) 1192 parameters_count = span[1] 1193 span = span[2:] 1194 parameters = [] 1195 for n in range(parameters_count): 1196 element, span = DeviceParameter.parse(span) 1197 parameters.append(element) 1198 fields['parameters'] = parameters 1199 return GetConfigRsp(**fields), span 1200 1201 def serialize(self) -> bytes: 1202 pass 1203 1204 1205@dataclass 1206class GenericError(CoreNotification): 1207 status: StatusCode 1208 1209 @staticmethod 1210 def parse(fields: dict, span: bytes) -> Tuple['GenericError', bytes]: 1211 if len(span) < 1: 1212 raise Exception('Invalid packet size') 1213 fields['status'] = StatusCode(span[0]) 1214 span = span[1:] 1215 return GenericError(**fields), span 1216 1217 def serialize(self) -> bytes: 1218 pass 1219 1220 1221@dataclass 1222class SessionInitCmd(SessionCommand): 1223 session_id: int 1224 session_type: SessionType 1225 1226 @staticmethod 1227 def parse(fields: dict, span: bytes) -> Tuple['SessionInitCmd', bytes]: 1228 if len(span) < 5: 1229 raise Exception('Invalid packet size') 1230 value_ = int.from_bytes(span[0:4], byteorder='little') 1231 fields['session_id'] = value_ 1232 fields['session_type'] = SessionType(span[4]) 1233 span = span[5:] 1234 return SessionInitCmd(**fields), span 1235 1236 def serialize(self) -> bytes: 1237 pass 1238 1239 1240@dataclass 1241class SessionInitRsp(SessionResponse): 1242 status: StatusCode 1243 1244 @staticmethod 1245 def parse(fields: dict, span: bytes) -> Tuple['SessionInitRsp', bytes]: 1246 if len(span) < 1: 1247 raise Exception('Invalid packet size') 1248 fields['status'] = StatusCode(span[0]) 1249 span = span[1:] 1250 return SessionInitRsp(**fields), span 1251 1252 def serialize(self) -> bytes: 1253 pass 1254 1255 1256@dataclass 1257class SessionDeinitCmd(SessionCommand): 1258 session_id: int 1259 1260 @staticmethod 1261 def parse(fields: dict, span: bytes) -> Tuple['SessionDeinitCmd', bytes]: 1262 if len(span) < 4: 1263 raise Exception('Invalid packet size') 1264 value_ = int.from_bytes(span[0:4], byteorder='little') 1265 fields['session_id'] = value_ 1266 span = span[4:] 1267 return SessionDeinitCmd(**fields), span 1268 1269 def serialize(self) -> bytes: 1270 pass 1271 1272 1273@dataclass 1274class SessionDeinitRsp(SessionResponse): 1275 status: StatusCode 1276 1277 @staticmethod 1278 def parse(fields: dict, span: bytes) -> Tuple['SessionDeinitRsp', bytes]: 1279 if len(span) < 1: 1280 raise Exception('Invalid packet size') 1281 fields['status'] = StatusCode(span[0]) 1282 span = span[1:] 1283 return SessionDeinitRsp(**fields), span 1284 1285 def serialize(self) -> bytes: 1286 pass 1287 1288 1289@dataclass 1290class SessionStatusNtf(SessionNotification): 1291 session_id: int 1292 session_state: SessionState 1293 reason_code: ReasonCode 1294 1295 @staticmethod 1296 def parse(fields: dict, span: bytes) -> Tuple['SessionStatusNtf', bytes]: 1297 if len(span) < 6: 1298 raise Exception('Invalid packet size') 1299 value_ = int.from_bytes(span[0:4], byteorder='little') 1300 fields['session_id'] = value_ 1301 fields['session_state'] = SessionState(span[4]) 1302 fields['reason_code'] = ReasonCode(span[5]) 1303 span = span[6:] 1304 return SessionStatusNtf(**fields), span 1305 1306 def serialize(self) -> bytes: 1307 pass 1308 1309 1310@dataclass 1311class AppConfigParameter(Packet): 1312 id: int 1313 value: bytes 1314 1315 @staticmethod 1316 def parse(span: bytes) -> Tuple['AppConfigParameter', bytes]: 1317 fields = {'payload': None} 1318 if len(span) < 2: 1319 raise Exception('Invalid packet size') 1320 fields['id'] = span[0] 1321 value_count = span[1] 1322 span = span[2:] 1323 if len(span) < value_count: 1324 raise Exception('Invalid packet size') 1325 value = [] 1326 for n in range(value_count): 1327 value.append(int.from_bytes(span[n:n + 1], byteorder='little')) 1328 fields['value'] = value 1329 span = span[value_count:] 1330 return AppConfigParameter(**fields), span 1331 1332 def serialize(self) -> bytes: 1333 pass 1334 1335 1336@dataclass 1337class SessionSetAppConfigCmd(SessionCommand): 1338 session_id: int 1339 parameters: List[AppConfigParameter] 1340 1341 @staticmethod 1342 def parse(fields: dict, span: bytes) -> Tuple['SessionSetAppConfigCmd', bytes]: 1343 if len(span) < 5: 1344 raise Exception('Invalid packet size') 1345 value_ = int.from_bytes(span[0:4], byteorder='little') 1346 fields['session_id'] = value_ 1347 parameters_count = span[4] 1348 span = span[5:] 1349 parameters = [] 1350 for n in range(parameters_count): 1351 element, span = AppConfigParameter.parse(span) 1352 parameters.append(element) 1353 fields['parameters'] = parameters 1354 return SessionSetAppConfigCmd(**fields), span 1355 1356 def serialize(self) -> bytes: 1357 pass 1358 1359 1360@dataclass 1361class AppConfigStatus(Packet): 1362 config_id: int 1363 status: StatusCode 1364 1365 @staticmethod 1366 def parse(span: bytes) -> Tuple['AppConfigStatus', bytes]: 1367 fields = {'payload': None} 1368 if len(span) < 2: 1369 raise Exception('Invalid packet size') 1370 fields['config_id'] = span[0] 1371 fields['status'] = StatusCode(span[1]) 1372 span = span[2:] 1373 return AppConfigStatus(**fields), span 1374 1375 def serialize(self) -> bytes: 1376 pass 1377 1378 1379@dataclass 1380class SessionSetAppConfigRsp(SessionResponse): 1381 status: StatusCode 1382 parameters: List[AppConfigStatus] 1383 1384 @staticmethod 1385 def parse(fields: dict, span: bytes) -> Tuple['SessionSetAppConfigRsp', bytes]: 1386 if len(span) < 2: 1387 raise Exception('Invalid packet size') 1388 fields['status'] = StatusCode(span[0]) 1389 parameters_count = span[1] 1390 span = span[2:] 1391 if len(span) < parameters_count * 2: 1392 raise Exception('Invalid packet size') 1393 parameters = [] 1394 for n in range(parameters_count): 1395 parameters.append(AppConfigStatus.parse_all( 1396 span[n * 2:(n + 1) * 2])) 1397 fields['parameters'] = parameters 1398 span = span[parameters_count * 2:] 1399 return SessionSetAppConfigRsp(**fields), span 1400 1401 def serialize(self) -> bytes: 1402 pass 1403 1404 1405@dataclass 1406class SessionGetAppConfigCmd(SessionCommand): 1407 session_id: int 1408 parameters: bytes 1409 1410 @staticmethod 1411 def parse(fields: dict, span: bytes) -> Tuple['SessionGetAppConfigCmd', bytes]: 1412 if len(span) < 5: 1413 raise Exception('Invalid packet size') 1414 value_ = int.from_bytes(span[0:4], byteorder='little') 1415 fields['session_id'] = value_ 1416 parameters_count = span[4] 1417 span = span[5:] 1418 if len(span) < parameters_count: 1419 raise Exception('Invalid packet size') 1420 parameters = [] 1421 for n in range(parameters_count): 1422 parameters.append(int.from_bytes( 1423 span[n:n + 1], byteorder='little')) 1424 fields['parameters'] = parameters 1425 span = span[parameters_count:] 1426 return SessionGetAppConfigCmd(**fields), span 1427 1428 def serialize(self) -> bytes: 1429 pass 1430 1431 1432@dataclass 1433class SessionGetAppConfigRsp(SessionResponse): 1434 status: StatusCode 1435 parameters: List[AppConfigParameter] 1436 1437 @staticmethod 1438 def parse(fields: dict, span: bytes) -> Tuple['SessionGetAppConfigRsp', bytes]: 1439 if len(span) < 2: 1440 raise Exception('Invalid packet size') 1441 fields['status'] = StatusCode(span[0]) 1442 parameters_count = span[1] 1443 span = span[2:] 1444 parameters = [] 1445 for n in range(parameters_count): 1446 element, span = AppConfigParameter.parse(span) 1447 parameters.append(element) 1448 fields['parameters'] = parameters 1449 return SessionGetAppConfigRsp(**fields), span 1450 1451 def serialize(self) -> bytes: 1452 pass 1453 1454 1455@dataclass 1456class SessionGetCountCmd(SessionCommand): 1457 1458 @staticmethod 1459 def parse(fields: dict, span: bytes) -> Tuple['SessionGetCountCmd', bytes]: 1460 return SessionGetCountCmd(**fields), span 1461 1462 def serialize(self) -> bytes: 1463 pass 1464 1465 1466@dataclass 1467class SessionGetCountRsp(SessionResponse): 1468 status: StatusCode 1469 session_count: int 1470 1471 @staticmethod 1472 def parse(fields: dict, span: bytes) -> Tuple['SessionGetCountRsp', bytes]: 1473 if len(span) < 2: 1474 raise Exception('Invalid packet size') 1475 fields['status'] = StatusCode(span[0]) 1476 fields['session_count'] = span[1] 1477 span = span[2:] 1478 return SessionGetCountRsp(**fields), span 1479 1480 def serialize(self) -> bytes: 1481 pass 1482 1483 1484@dataclass 1485class SessionGetStateCmd(SessionCommand): 1486 session_id: int 1487 1488 @staticmethod 1489 def parse(fields: dict, span: bytes) -> Tuple['SessionGetStateCmd', bytes]: 1490 if len(span) < 4: 1491 raise Exception('Invalid packet size') 1492 value_ = int.from_bytes(span[0:4], byteorder='little') 1493 fields['session_id'] = value_ 1494 span = span[4:] 1495 return SessionGetStateCmd(**fields), span 1496 1497 def serialize(self) -> bytes: 1498 pass 1499 1500 1501@dataclass 1502class SessionGetStateRsp(SessionResponse): 1503 status: StatusCode 1504 session_state: SessionState 1505 1506 @staticmethod 1507 def parse(fields: dict, span: bytes) -> Tuple['SessionGetStateRsp', bytes]: 1508 if len(span) < 2: 1509 raise Exception('Invalid packet size') 1510 fields['status'] = StatusCode(span[0]) 1511 fields['session_state'] = SessionState(span[1]) 1512 span = span[2:] 1513 return SessionGetStateRsp(**fields), span 1514 1515 def serialize(self) -> bytes: 1516 pass 1517 1518 1519@dataclass 1520class Controlee(Packet): 1521 short_address: int 1522 subsession_id: int 1523 1524 @staticmethod 1525 def parse(span: bytes) -> Tuple['Controlee', bytes]: 1526 fields = {'payload': None} 1527 if len(span) < 6: 1528 raise Exception('Invalid packet size') 1529 value_ = int.from_bytes(span[0:2], byteorder='little') 1530 fields['short_address'] = value_ 1531 value_ = int.from_bytes(span[2:6], byteorder='little') 1532 fields['subsession_id'] = value_ 1533 span = span[6:] 1534 return Controlee(**fields), span 1535 1536 def serialize(self) -> bytes: 1537 pass 1538 1539 1540@dataclass 1541class SessionUpdateControllerMulticastListCmd(SessionCommand): 1542 session_id: int 1543 action: int 1544 controlees: List[Controlee] 1545 1546 @staticmethod 1547 def parse(fields: dict, span: bytes) -> Tuple['SessionUpdateControllerMulticastListCmd', bytes]: 1548 if len(span) < 6: 1549 raise Exception('Invalid packet size') 1550 value_ = int.from_bytes(span[0:4], byteorder='little') 1551 fields['session_id'] = value_ 1552 fields['action'] = span[4] 1553 controlees_count = span[5] 1554 span = span[6:] 1555 if len(span) < controlees_count * 6: 1556 raise Exception('Invalid packet size') 1557 controlees = [] 1558 for n in range(controlees_count): 1559 controlees.append(Controlee.parse_all(span[n * 6:(n + 1) * 6])) 1560 fields['controlees'] = controlees 1561 span = span[controlees_count * 6:] 1562 return SessionUpdateControllerMulticastListCmd(**fields), span 1563 1564 def serialize(self) -> bytes: 1565 pass 1566 1567 1568@dataclass 1569class SessionUpdateControllerMulticastListRsp(SessionResponse): 1570 status: StatusCode 1571 1572 @staticmethod 1573 def parse(fields: dict, span: bytes) -> Tuple['SessionUpdateControllerMulticastListRsp', bytes]: 1574 if len(span) < 1: 1575 raise Exception('Invalid packet size') 1576 fields['status'] = StatusCode(span[0]) 1577 span = span[1:] 1578 return SessionUpdateControllerMulticastListRsp(**fields), span 1579 1580 def serialize(self) -> bytes: 1581 pass 1582 1583 1584@dataclass 1585class ControleeStatus(Packet): 1586 mac_address: int 1587 subsession_id: int 1588 status: int 1589 1590 @staticmethod 1591 def parse(span: bytes) -> Tuple['ControleeStatus', bytes]: 1592 fields = {'payload': None} 1593 if len(span) < 7: 1594 raise Exception('Invalid packet size') 1595 value_ = int.from_bytes(span[0:2], byteorder='little') 1596 fields['mac_address'] = value_ 1597 value_ = int.from_bytes(span[2:6], byteorder='little') 1598 fields['subsession_id'] = value_ 1599 fields['status'] = span[6] 1600 span = span[7:] 1601 return ControleeStatus(**fields), span 1602 1603 def serialize(self) -> bytes: 1604 pass 1605 1606 1607@dataclass 1608class SessionUpdateControllerMulticastListNtf(SessionNotification): 1609 session_id: int 1610 remaining_multicast_list_size: int 1611 controlee_status: List[ControleeStatus] 1612 1613 @staticmethod 1614 def parse(fields: dict, span: bytes) -> Tuple['SessionUpdateControllerMulticastListNtf', bytes]: 1615 if len(span) < 6: 1616 raise Exception('Invalid packet size') 1617 value_ = int.from_bytes(span[0:4], byteorder='little') 1618 fields['session_id'] = value_ 1619 fields['remaining_multicast_list_size'] = span[4] 1620 controlee_status_count = span[5] 1621 span = span[6:] 1622 if len(span) < controlee_status_count * 7: 1623 raise Exception('Invalid packet size') 1624 controlee_status = [] 1625 for n in range(controlee_status_count): 1626 controlee_status.append( 1627 ControleeStatus.parse_all(span[n * 7:(n + 1) * 7])) 1628 fields['controlee_status'] = controlee_status 1629 span = span[controlee_status_count * 7:] 1630 return SessionUpdateControllerMulticastListNtf(**fields), span 1631 1632 def serialize(self) -> bytes: 1633 pass 1634 1635 1636@dataclass 1637class RangeStartCmd(RangingCommand): 1638 1639 @staticmethod 1640 def parse(fields: dict, span: bytes) -> Tuple['RangeStartCmd', bytes]: 1641 return RangeStartCmd(**fields), span 1642 1643 def serialize(self) -> bytes: 1644 pass 1645 1646 1647@dataclass 1648class RangeStartRsp(RangingResponse): 1649 status: StatusCode 1650 1651 @staticmethod 1652 def parse(fields: dict, span: bytes) -> Tuple['RangeStartRsp', bytes]: 1653 if len(span) < 1: 1654 raise Exception('Invalid packet size') 1655 fields['status'] = StatusCode(span[0]) 1656 span = span[1:] 1657 return RangeStartRsp(**fields), span 1658 1659 def serialize(self) -> bytes: 1660 pass 1661 1662 1663@dataclass 1664class ShortAddressTwoWayRangingMeasurement(Packet): 1665 mac_address: int 1666 status: StatusCode 1667 nlos: int 1668 distance: int 1669 aoa_azimuth: int 1670 aoa_azimuth_fom: int 1671 aoa_elevation: int 1672 aoa_elevation_fom: int 1673 aoa_destination_azimuth: int 1674 aoa_destination_azimuth_fom: int 1675 aoa_destination_elevation: int 1676 aoa_destination_elevation_fom: int 1677 slot_index: int 1678 1679 @staticmethod 1680 def parse(span: bytes) -> Tuple['ShortAddressTwoWayRangingMeasurement', bytes]: 1681 fields = {'payload': None} 1682 if len(span) < 31: 1683 raise Exception('Invalid packet size') 1684 value_ = int.from_bytes(span[0:2], byteorder='little') 1685 fields['mac_address'] = value_ 1686 fields['status'] = StatusCode(span[2]) 1687 fields['nlos'] = span[3] 1688 value_ = int.from_bytes(span[4:6], byteorder='little') 1689 fields['distance'] = value_ 1690 value_ = int.from_bytes(span[6:8], byteorder='little') 1691 fields['aoa_azimuth'] = value_ 1692 fields['aoa_azimuth_fom'] = span[8] 1693 value_ = int.from_bytes(span[9:11], byteorder='little') 1694 fields['aoa_elevation'] = value_ 1695 fields['aoa_elevation_fom'] = span[11] 1696 value_ = int.from_bytes(span[12:14], byteorder='little') 1697 fields['aoa_destination_azimuth'] = value_ 1698 fields['aoa_destination_azimuth_fom'] = span[14] 1699 value_ = int.from_bytes(span[15:17], byteorder='little') 1700 fields['aoa_destination_elevation'] = value_ 1701 fields['aoa_destination_elevation_fom'] = span[17] 1702 fields['slot_index'] = span[18] 1703 value_ = int.from_bytes(span[19:31], byteorder='little') 1704 span = span[31:] 1705 return ShortAddressTwoWayRangingMeasurement(**fields), span 1706 1707 def serialize(self) -> bytes: 1708 pass 1709 1710 1711@dataclass 1712class ExtendedAddressTwoWayRangingMeasurement(Packet): 1713 mac_address: int 1714 status: StatusCode 1715 nlos: int 1716 distance: int 1717 aoa_azimuth: int 1718 aoa_azimuth_fom: int 1719 aoa_elevation: int 1720 aoa_elevation_fom: int 1721 aoa_destination_azimuth: int 1722 aoa_destination_azimuth_fom: int 1723 aoa_destination_elevation: int 1724 aoa_destination_elevation_fom: int 1725 slot_index: int 1726 1727 @staticmethod 1728 def parse(span: bytes) -> Tuple['ExtendedAddressTwoWayRangingMeasurement', bytes]: 1729 fields = {'payload': None} 1730 if len(span) < 31: 1731 raise Exception('Invalid packet size') 1732 value_ = int.from_bytes(span[0:8], byteorder='little') 1733 fields['mac_address'] = value_ 1734 fields['status'] = StatusCode(span[8]) 1735 fields['nlos'] = span[9] 1736 value_ = int.from_bytes(span[10:12], byteorder='little') 1737 fields['distance'] = value_ 1738 value_ = int.from_bytes(span[12:14], byteorder='little') 1739 fields['aoa_azimuth'] = value_ 1740 fields['aoa_azimuth_fom'] = span[14] 1741 value_ = int.from_bytes(span[15:17], byteorder='little') 1742 fields['aoa_elevation'] = value_ 1743 fields['aoa_elevation_fom'] = span[17] 1744 value_ = int.from_bytes(span[18:20], byteorder='little') 1745 fields['aoa_destination_azimuth'] = value_ 1746 fields['aoa_destination_azimuth_fom'] = span[20] 1747 value_ = int.from_bytes(span[21:23], byteorder='little') 1748 fields['aoa_destination_elevation'] = value_ 1749 fields['aoa_destination_elevation_fom'] = span[23] 1750 fields['slot_index'] = span[24] 1751 value_ = int.from_bytes(span[25:31], byteorder='little') 1752 span = span[31:] 1753 return ExtendedAddressTwoWayRangingMeasurement(**fields), span 1754 1755 def serialize(self) -> bytes: 1756 pass 1757 1758 1759class RangingMeasurementType(enum.IntEnum): 1760 ONE_WAY = 0x0 1761 TWO_WAY = 0x1 1762 1763 1764@dataclass 1765class RangeDataNtf(RangingNotification): 1766 sequence_number: int 1767 session_id: int 1768 rcr_indicator: int 1769 current_ranging_interval: int 1770 ranging_measurement_type: RangingMeasurementType 1771 mac_address_indicator: MacAddressIndicator 1772 1773 @staticmethod 1774 def parse(fields: dict, span: bytes) -> Tuple['RangeDataNtf', bytes]: 1775 if len(span) < 24: 1776 raise Exception('Invalid packet size') 1777 value_ = int.from_bytes(span[0:4], byteorder='little') 1778 fields['sequence_number'] = value_ 1779 value_ = int.from_bytes(span[4:8], byteorder='little') 1780 fields['session_id'] = value_ 1781 fields['rcr_indicator'] = span[8] 1782 value_ = int.from_bytes(span[9:13], byteorder='little') 1783 fields['current_ranging_interval'] = value_ 1784 fields['ranging_measurement_type'] = RangingMeasurementType(span[13]) 1785 fields['mac_address_indicator'] = MacAddressIndicator(span[15]) 1786 value_ = int.from_bytes(span[16:24], byteorder='little') 1787 span = span[24:] 1788 payload = span 1789 fields['payload'] = payload 1790 if fields['ranging_measurement_type'] == RangingMeasurementType.TWO_WAY and fields['mac_address_indicator'] == MacAddressIndicator.SHORT_ADDRESS: 1791 return ShortMacTwoWayRangeDataNtf.parse(fields, payload) 1792 elif fields['ranging_measurement_type'] == RangingMeasurementType.TWO_WAY and fields['mac_address_indicator'] == MacAddressIndicator.EXTENDED_ADDRESS: 1793 return ExtendedMacTwoWayRangeDataNtf.parse(fields, payload) 1794 else: 1795 return RangeDataNtf(**fields), span 1796 1797 def serialize(self) -> bytes: 1798 pass 1799 1800 1801@dataclass 1802class ShortMacTwoWayRangeDataNtf(RangeDataNtf): 1803 two_way_ranging_measurements: List[ShortAddressTwoWayRangingMeasurement] 1804 1805 @staticmethod 1806 def parse(fields: dict, span: bytes) -> Tuple['ShortMacTwoWayRangeDataNtf', bytes]: 1807 if len(span) < 1: 1808 raise Exception('Invalid packet size') 1809 two_way_ranging_measurements_count = span[0] 1810 span = span[1:] 1811 if len(span) < two_way_ranging_measurements_count * 31: 1812 raise Exception('Invalid packet size') 1813 two_way_ranging_measurements = [] 1814 for n in range(two_way_ranging_measurements_count): 1815 two_way_ranging_measurements.append( 1816 ShortAddressTwoWayRangingMeasurement.parse_all(span[n * 31:(n + 1) * 31])) 1817 fields['two_way_ranging_measurements'] = two_way_ranging_measurements 1818 span = span[two_way_ranging_measurements_count * 31:] 1819 return ShortMacTwoWayRangeDataNtf(**fields), span 1820 1821 def serialize(self) -> bytes: 1822 pass 1823 1824 1825@dataclass 1826class ExtendedMacTwoWayRangeDataNtf(RangeDataNtf): 1827 two_way_ranging_measurements: List[ExtendedAddressTwoWayRangingMeasurement] 1828 1829 @staticmethod 1830 def parse(fields: dict, span: bytes) -> Tuple['ExtendedMacTwoWayRangeDataNtf', bytes]: 1831 if len(span) < 1: 1832 raise Exception('Invalid packet size') 1833 two_way_ranging_measurements_count = span[0] 1834 span = span[1:] 1835 if len(span) < two_way_ranging_measurements_count * 31: 1836 raise Exception('Invalid packet size') 1837 two_way_ranging_measurements = [] 1838 for n in range(two_way_ranging_measurements_count): 1839 two_way_ranging_measurements.append( 1840 ExtendedAddressTwoWayRangingMeasurement.parse_all(span[n * 31:(n + 1) * 31])) 1841 fields['two_way_ranging_measurements'] = two_way_ranging_measurements 1842 span = span[two_way_ranging_measurements_count * 31:] 1843 return ExtendedMacTwoWayRangeDataNtf(**fields), span 1844 1845 def serialize(self) -> bytes: 1846 pass 1847 1848 1849@dataclass 1850class RangeStopCmd(RangingCommand): 1851 1852 @staticmethod 1853 def parse(fields: dict, span: bytes) -> Tuple['RangeStopCmd', bytes]: 1854 return RangeStopCmd(**fields), span 1855 1856 def serialize(self) -> bytes: 1857 pass 1858 1859 1860@dataclass 1861class RangeStopRsp(RangingResponse): 1862 status: StatusCode 1863 1864 @staticmethod 1865 def parse(fields: dict, span: bytes) -> Tuple['RangeStopRsp', bytes]: 1866 if len(span) < 1: 1867 raise Exception('Invalid packet size') 1868 fields['status'] = StatusCode(span[0]) 1869 span = span[1:] 1870 return RangeStopRsp(**fields), span 1871 1872 def serialize(self) -> bytes: 1873 pass 1874 1875 1876@dataclass 1877class RangeGetRangingCountCmd(RangingCommand): 1878 1879 @staticmethod 1880 def parse(fields: dict, span: bytes) -> Tuple['RangeGetRangingCountCmd', bytes]: 1881 return RangeGetRangingCountCmd(**fields), span 1882 1883 def serialize(self) -> bytes: 1884 pass 1885 1886 1887@dataclass 1888class RangeGetRangingCountRsp(RangingResponse): 1889 status: StatusCode 1890 count: int 1891 1892 @staticmethod 1893 def parse(fields: dict, span: bytes) -> Tuple['RangeGetRangingCountRsp', bytes]: 1894 if len(span) < 5: 1895 raise Exception('Invalid packet size') 1896 fields['status'] = StatusCode(span[0]) 1897 value_ = int.from_bytes(span[1:5], byteorder='little') 1898 fields['count'] = value_ 1899 span = span[5:] 1900 return RangeGetRangingCountRsp(**fields), span 1901 1902 def serialize(self) -> bytes: 1903 pass 1904 1905 1906@dataclass 1907class PicaPosition(Packet): 1908 x: int 1909 y: int 1910 z: int 1911 yaw: int 1912 pitch: int 1913 roll: int 1914 1915 @staticmethod 1916 def parse(span: bytes) -> Tuple['PicaPosition', bytes]: 1917 fields = {'payload': None} 1918 if len(span) < 11: 1919 raise Exception('Invalid packet size') 1920 value_ = int.from_bytes(span[0:2], byteorder='little') 1921 fields['x'] = value_ 1922 value_ = int.from_bytes(span[2:4], byteorder='little') 1923 fields['y'] = value_ 1924 value_ = int.from_bytes(span[4:6], byteorder='little') 1925 fields['z'] = value_ 1926 value_ = int.from_bytes(span[6:8], byteorder='little') 1927 fields['yaw'] = value_ 1928 fields['pitch'] = span[8] 1929 value_ = int.from_bytes(span[9:11], byteorder='little') 1930 fields['roll'] = value_ 1931 span = span[11:] 1932 return PicaPosition(**fields), span 1933 1934 def serialize(self) -> bytes: 1935 pass 1936 1937 1938@dataclass 1939class PicaInitDeviceCmd(PicaCommand): 1940 mac_address: int 1941 position: PicaPosition 1942 1943 @staticmethod 1944 def parse(fields: dict, span: bytes) -> Tuple['PicaInitDeviceCmd', bytes]: 1945 if len(span) < 19: 1946 raise Exception('Invalid packet size') 1947 value_ = int.from_bytes(span[0:8], byteorder='little') 1948 fields['mac_address'] = value_ 1949 fields['position'] = PicaPosition.parse_all(span[8:19]) 1950 span = span[19:] 1951 return PicaInitDeviceCmd(**fields), span 1952 1953 def serialize(self) -> bytes: 1954 pass 1955 1956 1957@dataclass 1958class PicaInitDeviceRsp(PicaResponse): 1959 status: StatusCode 1960 1961 @staticmethod 1962 def parse(fields: dict, span: bytes) -> Tuple['PicaInitDeviceRsp', bytes]: 1963 if len(span) < 1: 1964 raise Exception('Invalid packet size') 1965 fields['status'] = StatusCode(span[0]) 1966 span = span[1:] 1967 return PicaInitDeviceRsp(**fields), span 1968 1969 def serialize(self) -> bytes: 1970 pass 1971 1972 1973@dataclass 1974class PicaSetDevicePositionCmd(PicaCommand): 1975 position: PicaPosition 1976 1977 @staticmethod 1978 def parse(fields: dict, span: bytes) -> Tuple['PicaSetDevicePositionCmd', bytes]: 1979 if len(span) < 11: 1980 raise Exception('Invalid packet size') 1981 fields['position'] = PicaPosition.parse_all(span[0:11]) 1982 span = span[11:] 1983 return PicaSetDevicePositionCmd(**fields), span 1984 1985 def serialize(self) -> bytes: 1986 pass 1987 1988 1989@dataclass 1990class PicaSetDevicePositionRsp(PicaResponse): 1991 status: StatusCode 1992 1993 @staticmethod 1994 def parse(fields: dict, span: bytes) -> Tuple['PicaSetDevicePositionRsp', bytes]: 1995 if len(span) < 1: 1996 raise Exception('Invalid packet size') 1997 fields['status'] = StatusCode(span[0]) 1998 span = span[1:] 1999 return PicaSetDevicePositionRsp(**fields), span 2000 2001 def serialize(self) -> bytes: 2002 pass 2003 2004 2005@dataclass 2006class PicaCreateBeaconCmd(PicaCommand): 2007 mac_address: int 2008 position: PicaPosition 2009 2010 @staticmethod 2011 def parse(fields: dict, span: bytes) -> Tuple['PicaCreateBeaconCmd', bytes]: 2012 if len(span) < 19: 2013 raise Exception('Invalid packet size') 2014 value_ = int.from_bytes(span[0:8], byteorder='little') 2015 fields['mac_address'] = value_ 2016 fields['position'] = PicaPosition.parse_all(span[8:19]) 2017 span = span[19:] 2018 return PicaCreateBeaconCmd(**fields), span 2019 2020 def serialize(self) -> bytes: 2021 pass 2022 2023 2024@dataclass 2025class PicaCreateBeaconRsp(PicaResponse): 2026 status: StatusCode 2027 2028 @staticmethod 2029 def parse(fields: dict, span: bytes) -> Tuple['PicaCreateBeaconRsp', bytes]: 2030 if len(span) < 1: 2031 raise Exception('Invalid packet size') 2032 fields['status'] = StatusCode(span[0]) 2033 span = span[1:] 2034 return PicaCreateBeaconRsp(**fields), span 2035 2036 def serialize(self) -> bytes: 2037 pass 2038 2039 2040@dataclass 2041class PicaSetBeaconPositionCmd(PicaCommand): 2042 mac_address: int 2043 position: PicaPosition 2044 2045 @staticmethod 2046 def parse(fields: dict, span: bytes) -> Tuple['PicaSetBeaconPositionCmd', bytes]: 2047 if len(span) < 19: 2048 raise Exception('Invalid packet size') 2049 value_ = int.from_bytes(span[0:8], byteorder='little') 2050 fields['mac_address'] = value_ 2051 fields['position'] = PicaPosition.parse_all(span[8:19]) 2052 span = span[19:] 2053 return PicaSetBeaconPositionCmd(**fields), span 2054 2055 def serialize(self) -> bytes: 2056 pass 2057 2058 2059@dataclass 2060class PicaSetBeaconPositionRsp(PicaResponse): 2061 status: StatusCode 2062 2063 @staticmethod 2064 def parse(fields: dict, span: bytes) -> Tuple['PicaSetBeaconPositionRsp', bytes]: 2065 if len(span) < 1: 2066 raise Exception('Invalid packet size') 2067 fields['status'] = StatusCode(span[0]) 2068 span = span[1:] 2069 return PicaSetBeaconPositionRsp(**fields), span 2070 2071 def serialize(self) -> bytes: 2072 pass 2073 2074 2075@dataclass 2076class PicaDestroyBeaconCmd(PicaCommand): 2077 mac_address: int 2078 2079 @staticmethod 2080 def parse(fields: dict, span: bytes) -> Tuple['PicaDestroyBeaconCmd', bytes]: 2081 if len(span) < 8: 2082 raise Exception('Invalid packet size') 2083 value_ = int.from_bytes(span[0:8], byteorder='little') 2084 fields['mac_address'] = value_ 2085 span = span[8:] 2086 return PicaDestroyBeaconCmd(**fields), span 2087 2088 def serialize(self) -> bytes: 2089 pass 2090 2091 2092@dataclass 2093class PicaDestroyBeaconRsp(PicaResponse): 2094 status: StatusCode 2095 2096 @staticmethod 2097 def parse(fields: dict, span: bytes) -> Tuple['PicaDestroyBeaconRsp', bytes]: 2098 if len(span) < 1: 2099 raise Exception('Invalid packet size') 2100 fields['status'] = StatusCode(span[0]) 2101 span = span[1:] 2102 return PicaDestroyBeaconRsp(**fields), span 2103 2104 def serialize(self) -> bytes: 2105 pass 2106 2107 2108@dataclass 2109class AndroidGetPowerStatsCmd(AndroidCommand): 2110 2111 @staticmethod 2112 def parse(fields: dict, span: bytes) -> Tuple['AndroidGetPowerStatsCmd', bytes]: 2113 return AndroidGetPowerStatsCmd(**fields), span 2114 2115 def serialize(self) -> bytes: 2116 pass 2117 2118 2119@dataclass 2120class PowerStats(Packet): 2121 status: StatusCode 2122 idle_time_ms: int 2123 tx_time_ms: int 2124 rx_time_ms: int 2125 total_wake_count: int 2126 2127 @staticmethod 2128 def parse(span: bytes) -> Tuple['PowerStats', bytes]: 2129 fields = {'payload': None} 2130 if len(span) < 17: 2131 raise Exception('Invalid packet size') 2132 fields['status'] = StatusCode(span[0]) 2133 value_ = int.from_bytes(span[1:5], byteorder='little') 2134 fields['idle_time_ms'] = value_ 2135 value_ = int.from_bytes(span[5:9], byteorder='little') 2136 fields['tx_time_ms'] = value_ 2137 value_ = int.from_bytes(span[9:13], byteorder='little') 2138 fields['rx_time_ms'] = value_ 2139 value_ = int.from_bytes(span[13:17], byteorder='little') 2140 fields['total_wake_count'] = value_ 2141 span = span[17:] 2142 return PowerStats(**fields), span 2143 2144 def serialize(self) -> bytes: 2145 pass 2146 2147 2148@dataclass 2149class AndroidGetPowerStatsRsp(AndroidResponse): 2150 stats: PowerStats 2151 2152 @staticmethod 2153 def parse(fields: dict, span: bytes) -> Tuple['AndroidGetPowerStatsRsp', bytes]: 2154 if len(span) < 17: 2155 raise Exception('Invalid packet size') 2156 fields['stats'] = PowerStats.parse_all(span[0:17]) 2157 span = span[17:] 2158 return AndroidGetPowerStatsRsp(**fields), span 2159 2160 def serialize(self) -> bytes: 2161 pass 2162 2163 2164@dataclass 2165class AndroidSetCountryCodeCmd(AndroidCommand): 2166 country_code: bytes 2167 2168 @staticmethod 2169 def parse(fields: dict, span: bytes) -> Tuple['AndroidSetCountryCodeCmd', bytes]: 2170 if len(span) < 2: 2171 raise Exception('Invalid packet size') 2172 country_code = [] 2173 for n in range(2): 2174 country_code.append(int.from_bytes( 2175 span[n:n + 1], byteorder='little')) 2176 fields['country_code'] = country_code 2177 span = span[2:] 2178 return AndroidSetCountryCodeCmd(**fields), span 2179 2180 def serialize(self) -> bytes: 2181 pass 2182 2183 2184@dataclass 2185class AndroidSetCountryCodeRsp(AndroidResponse): 2186 status: StatusCode 2187 2188 @staticmethod 2189 def parse(fields: dict, span: bytes) -> Tuple['AndroidSetCountryCodeRsp', bytes]: 2190 if len(span) < 1: 2191 raise Exception('Invalid packet size') 2192 fields['status'] = StatusCode(span[0]) 2193 span = span[1:] 2194 return AndroidSetCountryCodeRsp(**fields), span 2195 2196 def serialize(self) -> bytes: 2197 pass 2198 2199 2200@dataclass 2201class UciVendor_A_Command(UciCommand): 2202 2203 @staticmethod 2204 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_A_Command', bytes]: 2205 payload = span 2206 fields['payload'] = payload 2207 return UciVendor_A_Command(**fields), span 2208 2209 def serialize(self) -> bytes: 2210 pass 2211 2212 2213@dataclass 2214class UciVendor_B_Command(UciCommand): 2215 2216 @staticmethod 2217 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_B_Command', bytes]: 2218 payload = span 2219 fields['payload'] = payload 2220 return UciVendor_B_Command(**fields), span 2221 2222 def serialize(self) -> bytes: 2223 pass 2224 2225 2226@dataclass 2227class UciVendor_E_Command(UciCommand): 2228 2229 @staticmethod 2230 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_E_Command', bytes]: 2231 payload = span 2232 fields['payload'] = payload 2233 return UciVendor_E_Command(**fields), span 2234 2235 def serialize(self) -> bytes: 2236 pass 2237 2238 2239@dataclass 2240class UciVendor_F_Command(UciCommand): 2241 2242 @staticmethod 2243 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_F_Command', bytes]: 2244 payload = span 2245 fields['payload'] = payload 2246 return UciVendor_F_Command(**fields), span 2247 2248 def serialize(self) -> bytes: 2249 pass 2250 2251 2252@dataclass 2253class UciVendor_A_Response(UciResponse): 2254 2255 @staticmethod 2256 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_A_Response', bytes]: 2257 payload = span 2258 fields['payload'] = payload 2259 return UciVendor_A_Response(**fields), span 2260 2261 def serialize(self) -> bytes: 2262 pass 2263 2264 2265@dataclass 2266class UciVendor_B_Response(UciResponse): 2267 2268 @staticmethod 2269 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_B_Response', bytes]: 2270 payload = span 2271 fields['payload'] = payload 2272 return UciVendor_B_Response(**fields), span 2273 2274 def serialize(self) -> bytes: 2275 pass 2276 2277 2278@dataclass 2279class UciVendor_E_Response(UciResponse): 2280 2281 @staticmethod 2282 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_E_Response', bytes]: 2283 payload = span 2284 fields['payload'] = payload 2285 return UciVendor_E_Response(**fields), span 2286 2287 def serialize(self) -> bytes: 2288 pass 2289 2290 2291@dataclass 2292class UciVendor_F_Response(UciResponse): 2293 2294 @staticmethod 2295 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_F_Response', bytes]: 2296 payload = span 2297 fields['payload'] = payload 2298 return UciVendor_F_Response(**fields), span 2299 2300 def serialize(self) -> bytes: 2301 pass 2302 2303 2304@dataclass 2305class UciVendor_A_Notification(UciNotification): 2306 2307 @staticmethod 2308 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_A_Notification', bytes]: 2309 payload = span 2310 fields['payload'] = payload 2311 return UciVendor_A_Notification(**fields), span 2312 2313 def serialize(self) -> bytes: 2314 pass 2315 2316 2317@dataclass 2318class UciVendor_B_Notification(UciNotification): 2319 2320 @staticmethod 2321 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_B_Notification', bytes]: 2322 payload = span 2323 fields['payload'] = payload 2324 return UciVendor_B_Notification(**fields), span 2325 2326 def serialize(self) -> bytes: 2327 pass 2328 2329 2330@dataclass 2331class UciVendor_E_Notification(UciNotification): 2332 2333 @staticmethod 2334 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_E_Notification', bytes]: 2335 payload = span 2336 fields['payload'] = payload 2337 return UciVendor_E_Notification(**fields), span 2338 2339 def serialize(self) -> bytes: 2340 pass 2341 2342 2343@dataclass 2344class UciVendor_F_Notification(UciNotification): 2345 2346 @staticmethod 2347 def parse(fields: dict, span: bytes) -> Tuple['UciVendor_F_Notification', bytes]: 2348 payload = span 2349 fields['payload'] = payload 2350 return UciVendor_F_Notification(**fields), span 2351 2352 def serialize(self) -> bytes: 2353 pass 2354