• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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