1 /// @generated rust packets from uci_packets.pdl. 2 use bytes::{Buf, BufMut, Bytes, BytesMut}; 3 use std::convert::{TryFrom, TryInto}; 4 use std::cell::Cell; 5 use std::fmt; 6 use std::result::Result; 7 use pdl_runtime::{DecodeError, EncodeError, Packet}; 8 /// Private prevents users from creating arbitrary scalar values 9 /// in situations where the value needs to be validated. 10 /// Users can freely deref the value, but only the backend 11 /// may create it. 12 #[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)] 13 pub struct Private<T>(T); 14 impl<T> std::ops::Deref for Private<T> { 15 type Target = T; deref(&self) -> &Self::Target16 fn deref(&self) -> &Self::Target { 17 &self.0 18 } 19 } 20 impl<T: std::fmt::Debug> std::fmt::Debug for Private<T> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result21 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 22 T::fmt(&self.0, f) 23 } 24 } 25 #[repr(u64)] 26 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 27 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 28 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 29 pub enum PacketBoundaryFlag { 30 Complete = 0x0, 31 NotComplete = 0x1, 32 } 33 impl TryFrom<u8> for PacketBoundaryFlag { 34 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>35 fn try_from(value: u8) -> Result<Self, Self::Error> { 36 match value { 37 0x0 => Ok(PacketBoundaryFlag::Complete), 38 0x1 => Ok(PacketBoundaryFlag::NotComplete), 39 _ => Err(value), 40 } 41 } 42 } 43 impl From<&PacketBoundaryFlag> for u8 { from(value: &PacketBoundaryFlag) -> Self44 fn from(value: &PacketBoundaryFlag) -> Self { 45 match value { 46 PacketBoundaryFlag::Complete => 0x0, 47 PacketBoundaryFlag::NotComplete => 0x1, 48 } 49 } 50 } 51 impl From<PacketBoundaryFlag> for u8 { from(value: PacketBoundaryFlag) -> Self52 fn from(value: PacketBoundaryFlag) -> Self { 53 (&value).into() 54 } 55 } 56 impl From<PacketBoundaryFlag> for i8 { from(value: PacketBoundaryFlag) -> Self57 fn from(value: PacketBoundaryFlag) -> Self { 58 u8::from(value) as Self 59 } 60 } 61 impl From<PacketBoundaryFlag> for i16 { from(value: PacketBoundaryFlag) -> Self62 fn from(value: PacketBoundaryFlag) -> Self { 63 u8::from(value) as Self 64 } 65 } 66 impl From<PacketBoundaryFlag> for i32 { from(value: PacketBoundaryFlag) -> Self67 fn from(value: PacketBoundaryFlag) -> Self { 68 u8::from(value) as Self 69 } 70 } 71 impl From<PacketBoundaryFlag> for i64 { from(value: PacketBoundaryFlag) -> Self72 fn from(value: PacketBoundaryFlag) -> Self { 73 u8::from(value) as Self 74 } 75 } 76 impl From<PacketBoundaryFlag> for u16 { from(value: PacketBoundaryFlag) -> Self77 fn from(value: PacketBoundaryFlag) -> Self { 78 u8::from(value) as Self 79 } 80 } 81 impl From<PacketBoundaryFlag> for u32 { from(value: PacketBoundaryFlag) -> Self82 fn from(value: PacketBoundaryFlag) -> Self { 83 u8::from(value) as Self 84 } 85 } 86 impl From<PacketBoundaryFlag> for u64 { from(value: PacketBoundaryFlag) -> Self87 fn from(value: PacketBoundaryFlag) -> Self { 88 u8::from(value) as Self 89 } 90 } 91 #[repr(u64)] 92 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 93 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 94 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 95 pub enum GroupId { 96 Core = 0x0, 97 SessionConfig = 0x1, 98 SessionControl = 0x2, 99 DataControl = 0x3, 100 Test = 0xd, 101 VendorReserved9 = 0x9, 102 VendorReservedA = 0xa, 103 VendorReservedB = 0xb, 104 VendorAndroid = 0xc, 105 VendorReservedE = 0xe, 106 VendorReservedF = 0xf, 107 } 108 impl TryFrom<u8> for GroupId { 109 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>110 fn try_from(value: u8) -> Result<Self, Self::Error> { 111 match value { 112 0x0 => Ok(GroupId::Core), 113 0x1 => Ok(GroupId::SessionConfig), 114 0x2 => Ok(GroupId::SessionControl), 115 0x3 => Ok(GroupId::DataControl), 116 0xd => Ok(GroupId::Test), 117 0x9 => Ok(GroupId::VendorReserved9), 118 0xa => Ok(GroupId::VendorReservedA), 119 0xb => Ok(GroupId::VendorReservedB), 120 0xc => Ok(GroupId::VendorAndroid), 121 0xe => Ok(GroupId::VendorReservedE), 122 0xf => Ok(GroupId::VendorReservedF), 123 _ => Err(value), 124 } 125 } 126 } 127 impl From<&GroupId> for u8 { from(value: &GroupId) -> Self128 fn from(value: &GroupId) -> Self { 129 match value { 130 GroupId::Core => 0x0, 131 GroupId::SessionConfig => 0x1, 132 GroupId::SessionControl => 0x2, 133 GroupId::DataControl => 0x3, 134 GroupId::Test => 0xd, 135 GroupId::VendorReserved9 => 0x9, 136 GroupId::VendorReservedA => 0xa, 137 GroupId::VendorReservedB => 0xb, 138 GroupId::VendorAndroid => 0xc, 139 GroupId::VendorReservedE => 0xe, 140 GroupId::VendorReservedF => 0xf, 141 } 142 } 143 } 144 impl From<GroupId> for u8 { from(value: GroupId) -> Self145 fn from(value: GroupId) -> Self { 146 (&value).into() 147 } 148 } 149 impl From<GroupId> for i8 { from(value: GroupId) -> Self150 fn from(value: GroupId) -> Self { 151 u8::from(value) as Self 152 } 153 } 154 impl From<GroupId> for i16 { from(value: GroupId) -> Self155 fn from(value: GroupId) -> Self { 156 u8::from(value) as Self 157 } 158 } 159 impl From<GroupId> for i32 { from(value: GroupId) -> Self160 fn from(value: GroupId) -> Self { 161 u8::from(value) as Self 162 } 163 } 164 impl From<GroupId> for i64 { from(value: GroupId) -> Self165 fn from(value: GroupId) -> Self { 166 u8::from(value) as Self 167 } 168 } 169 impl From<GroupId> for u16 { from(value: GroupId) -> Self170 fn from(value: GroupId) -> Self { 171 u8::from(value) as Self 172 } 173 } 174 impl From<GroupId> for u32 { from(value: GroupId) -> Self175 fn from(value: GroupId) -> Self { 176 u8::from(value) as Self 177 } 178 } 179 impl From<GroupId> for u64 { from(value: GroupId) -> Self180 fn from(value: GroupId) -> Self { 181 u8::from(value) as Self 182 } 183 } 184 #[repr(u64)] 185 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 186 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 187 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 188 pub enum DataPacketFormat { 189 DataSnd = 0x1, 190 DataRcv = 0x2, 191 RadarDataMessage = 0xf, 192 } 193 impl TryFrom<u8> for DataPacketFormat { 194 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>195 fn try_from(value: u8) -> Result<Self, Self::Error> { 196 match value { 197 0x1 => Ok(DataPacketFormat::DataSnd), 198 0x2 => Ok(DataPacketFormat::DataRcv), 199 0xf => Ok(DataPacketFormat::RadarDataMessage), 200 _ => Err(value), 201 } 202 } 203 } 204 impl From<&DataPacketFormat> for u8 { from(value: &DataPacketFormat) -> Self205 fn from(value: &DataPacketFormat) -> Self { 206 match value { 207 DataPacketFormat::DataSnd => 0x1, 208 DataPacketFormat::DataRcv => 0x2, 209 DataPacketFormat::RadarDataMessage => 0xf, 210 } 211 } 212 } 213 impl From<DataPacketFormat> for u8 { from(value: DataPacketFormat) -> Self214 fn from(value: DataPacketFormat) -> Self { 215 (&value).into() 216 } 217 } 218 impl From<DataPacketFormat> for i8 { from(value: DataPacketFormat) -> Self219 fn from(value: DataPacketFormat) -> Self { 220 u8::from(value) as Self 221 } 222 } 223 impl From<DataPacketFormat> for i16 { from(value: DataPacketFormat) -> Self224 fn from(value: DataPacketFormat) -> Self { 225 u8::from(value) as Self 226 } 227 } 228 impl From<DataPacketFormat> for i32 { from(value: DataPacketFormat) -> Self229 fn from(value: DataPacketFormat) -> Self { 230 u8::from(value) as Self 231 } 232 } 233 impl From<DataPacketFormat> for i64 { from(value: DataPacketFormat) -> Self234 fn from(value: DataPacketFormat) -> Self { 235 u8::from(value) as Self 236 } 237 } 238 impl From<DataPacketFormat> for u16 { from(value: DataPacketFormat) -> Self239 fn from(value: DataPacketFormat) -> Self { 240 u8::from(value) as Self 241 } 242 } 243 impl From<DataPacketFormat> for u32 { from(value: DataPacketFormat) -> Self244 fn from(value: DataPacketFormat) -> Self { 245 u8::from(value) as Self 246 } 247 } 248 impl From<DataPacketFormat> for u64 { from(value: DataPacketFormat) -> Self249 fn from(value: DataPacketFormat) -> Self { 250 u8::from(value) as Self 251 } 252 } 253 #[repr(u64)] 254 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 255 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 256 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 257 pub enum GroupIdOrDataPacketFormat { 258 Core = 0x0, 259 SessionConfigOrDataSnd = 0x1, 260 SessionControlOrDataRcv = 0x2, 261 DataControl = 0x3, 262 Test = 0xd, 263 VendorReserved9 = 0x9, 264 VendorReservedA = 0xa, 265 VendorReservedB = 0xb, 266 VendorAndroid = 0xc, 267 VendorReservedE = 0xe, 268 VendorReservedF = 0xf, 269 } 270 impl TryFrom<u8> for GroupIdOrDataPacketFormat { 271 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>272 fn try_from(value: u8) -> Result<Self, Self::Error> { 273 match value { 274 0x0 => Ok(GroupIdOrDataPacketFormat::Core), 275 0x1 => Ok(GroupIdOrDataPacketFormat::SessionConfigOrDataSnd), 276 0x2 => Ok(GroupIdOrDataPacketFormat::SessionControlOrDataRcv), 277 0x3 => Ok(GroupIdOrDataPacketFormat::DataControl), 278 0xd => Ok(GroupIdOrDataPacketFormat::Test), 279 0x9 => Ok(GroupIdOrDataPacketFormat::VendorReserved9), 280 0xa => Ok(GroupIdOrDataPacketFormat::VendorReservedA), 281 0xb => Ok(GroupIdOrDataPacketFormat::VendorReservedB), 282 0xc => Ok(GroupIdOrDataPacketFormat::VendorAndroid), 283 0xe => Ok(GroupIdOrDataPacketFormat::VendorReservedE), 284 0xf => Ok(GroupIdOrDataPacketFormat::VendorReservedF), 285 _ => Err(value), 286 } 287 } 288 } 289 impl From<&GroupIdOrDataPacketFormat> for u8 { from(value: &GroupIdOrDataPacketFormat) -> Self290 fn from(value: &GroupIdOrDataPacketFormat) -> Self { 291 match value { 292 GroupIdOrDataPacketFormat::Core => 0x0, 293 GroupIdOrDataPacketFormat::SessionConfigOrDataSnd => 0x1, 294 GroupIdOrDataPacketFormat::SessionControlOrDataRcv => 0x2, 295 GroupIdOrDataPacketFormat::DataControl => 0x3, 296 GroupIdOrDataPacketFormat::Test => 0xd, 297 GroupIdOrDataPacketFormat::VendorReserved9 => 0x9, 298 GroupIdOrDataPacketFormat::VendorReservedA => 0xa, 299 GroupIdOrDataPacketFormat::VendorReservedB => 0xb, 300 GroupIdOrDataPacketFormat::VendorAndroid => 0xc, 301 GroupIdOrDataPacketFormat::VendorReservedE => 0xe, 302 GroupIdOrDataPacketFormat::VendorReservedF => 0xf, 303 } 304 } 305 } 306 impl From<GroupIdOrDataPacketFormat> for u8 { from(value: GroupIdOrDataPacketFormat) -> Self307 fn from(value: GroupIdOrDataPacketFormat) -> Self { 308 (&value).into() 309 } 310 } 311 impl From<GroupIdOrDataPacketFormat> for i8 { from(value: GroupIdOrDataPacketFormat) -> Self312 fn from(value: GroupIdOrDataPacketFormat) -> Self { 313 u8::from(value) as Self 314 } 315 } 316 impl From<GroupIdOrDataPacketFormat> for i16 { from(value: GroupIdOrDataPacketFormat) -> Self317 fn from(value: GroupIdOrDataPacketFormat) -> Self { 318 u8::from(value) as Self 319 } 320 } 321 impl From<GroupIdOrDataPacketFormat> for i32 { from(value: GroupIdOrDataPacketFormat) -> Self322 fn from(value: GroupIdOrDataPacketFormat) -> Self { 323 u8::from(value) as Self 324 } 325 } 326 impl From<GroupIdOrDataPacketFormat> for i64 { from(value: GroupIdOrDataPacketFormat) -> Self327 fn from(value: GroupIdOrDataPacketFormat) -> Self { 328 u8::from(value) as Self 329 } 330 } 331 impl From<GroupIdOrDataPacketFormat> for u16 { from(value: GroupIdOrDataPacketFormat) -> Self332 fn from(value: GroupIdOrDataPacketFormat) -> Self { 333 u8::from(value) as Self 334 } 335 } 336 impl From<GroupIdOrDataPacketFormat> for u32 { from(value: GroupIdOrDataPacketFormat) -> Self337 fn from(value: GroupIdOrDataPacketFormat) -> Self { 338 u8::from(value) as Self 339 } 340 } 341 impl From<GroupIdOrDataPacketFormat> for u64 { from(value: GroupIdOrDataPacketFormat) -> Self342 fn from(value: GroupIdOrDataPacketFormat) -> Self { 343 u8::from(value) as Self 344 } 345 } 346 #[repr(u64)] 347 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 348 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 349 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 350 pub enum CoreOpCode { 351 CoreDeviceReset = 0x0, 352 CoreDeviceStatusNtf = 0x1, 353 CoreDeviceInfo = 0x2, 354 CoreGetCapsInfo = 0x3, 355 CoreSetConfig = 0x4, 356 CoreGetConfig = 0x5, 357 CoreDeviceSuspend = 0x6, 358 CoreGenericErrorNtf = 0x7, 359 CoreQueryUwbsTimestamp = 0x8, 360 } 361 impl TryFrom<u8> for CoreOpCode { 362 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>363 fn try_from(value: u8) -> Result<Self, Self::Error> { 364 match value { 365 0x0 => Ok(CoreOpCode::CoreDeviceReset), 366 0x1 => Ok(CoreOpCode::CoreDeviceStatusNtf), 367 0x2 => Ok(CoreOpCode::CoreDeviceInfo), 368 0x3 => Ok(CoreOpCode::CoreGetCapsInfo), 369 0x4 => Ok(CoreOpCode::CoreSetConfig), 370 0x5 => Ok(CoreOpCode::CoreGetConfig), 371 0x6 => Ok(CoreOpCode::CoreDeviceSuspend), 372 0x7 => Ok(CoreOpCode::CoreGenericErrorNtf), 373 0x8 => Ok(CoreOpCode::CoreQueryUwbsTimestamp), 374 _ => Err(value), 375 } 376 } 377 } 378 impl From<&CoreOpCode> for u8 { from(value: &CoreOpCode) -> Self379 fn from(value: &CoreOpCode) -> Self { 380 match value { 381 CoreOpCode::CoreDeviceReset => 0x0, 382 CoreOpCode::CoreDeviceStatusNtf => 0x1, 383 CoreOpCode::CoreDeviceInfo => 0x2, 384 CoreOpCode::CoreGetCapsInfo => 0x3, 385 CoreOpCode::CoreSetConfig => 0x4, 386 CoreOpCode::CoreGetConfig => 0x5, 387 CoreOpCode::CoreDeviceSuspend => 0x6, 388 CoreOpCode::CoreGenericErrorNtf => 0x7, 389 CoreOpCode::CoreQueryUwbsTimestamp => 0x8, 390 } 391 } 392 } 393 impl From<CoreOpCode> for u8 { from(value: CoreOpCode) -> Self394 fn from(value: CoreOpCode) -> Self { 395 (&value).into() 396 } 397 } 398 impl From<CoreOpCode> for i8 { from(value: CoreOpCode) -> Self399 fn from(value: CoreOpCode) -> Self { 400 u8::from(value) as Self 401 } 402 } 403 impl From<CoreOpCode> for i16 { from(value: CoreOpCode) -> Self404 fn from(value: CoreOpCode) -> Self { 405 u8::from(value) as Self 406 } 407 } 408 impl From<CoreOpCode> for i32 { from(value: CoreOpCode) -> Self409 fn from(value: CoreOpCode) -> Self { 410 u8::from(value) as Self 411 } 412 } 413 impl From<CoreOpCode> for i64 { from(value: CoreOpCode) -> Self414 fn from(value: CoreOpCode) -> Self { 415 u8::from(value) as Self 416 } 417 } 418 impl From<CoreOpCode> for u16 { from(value: CoreOpCode) -> Self419 fn from(value: CoreOpCode) -> Self { 420 u8::from(value) as Self 421 } 422 } 423 impl From<CoreOpCode> for u32 { from(value: CoreOpCode) -> Self424 fn from(value: CoreOpCode) -> Self { 425 u8::from(value) as Self 426 } 427 } 428 impl From<CoreOpCode> for u64 { from(value: CoreOpCode) -> Self429 fn from(value: CoreOpCode) -> Self { 430 u8::from(value) as Self 431 } 432 } 433 #[repr(u64)] 434 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 435 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 436 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 437 pub enum SessionConfigOpCode { 438 SessionInit = 0x0, 439 SessionDeinit = 0x1, 440 SessionStatusNtf = 0x2, 441 SessionSetAppConfig = 0x3, 442 SessionGetAppConfig = 0x4, 443 SessionGetCount = 0x5, 444 SessionGetState = 0x6, 445 SessionUpdateControllerMulticastList = 0x7, 446 SessionUpdateActiveRoundsAnchor = 0x8, 447 SessionUpdateActiveRoundsDtTag = 0x9, 448 SessionSetInitiatorDtAnchorRrRdmList = 0xa, 449 SessionQueryDataSizeInRanging = 0xb, 450 SessionSetHusControllerConfig = 0xc, 451 SessionSetHusControleeConfig = 0xd, 452 SessionDataTransferPhaseConfiguration = 0xe, 453 } 454 impl TryFrom<u8> for SessionConfigOpCode { 455 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>456 fn try_from(value: u8) -> Result<Self, Self::Error> { 457 match value { 458 0x0 => Ok(SessionConfigOpCode::SessionInit), 459 0x1 => Ok(SessionConfigOpCode::SessionDeinit), 460 0x2 => Ok(SessionConfigOpCode::SessionStatusNtf), 461 0x3 => Ok(SessionConfigOpCode::SessionSetAppConfig), 462 0x4 => Ok(SessionConfigOpCode::SessionGetAppConfig), 463 0x5 => Ok(SessionConfigOpCode::SessionGetCount), 464 0x6 => Ok(SessionConfigOpCode::SessionGetState), 465 0x7 => Ok(SessionConfigOpCode::SessionUpdateControllerMulticastList), 466 0x8 => Ok(SessionConfigOpCode::SessionUpdateActiveRoundsAnchor), 467 0x9 => Ok(SessionConfigOpCode::SessionUpdateActiveRoundsDtTag), 468 0xa => Ok(SessionConfigOpCode::SessionSetInitiatorDtAnchorRrRdmList), 469 0xb => Ok(SessionConfigOpCode::SessionQueryDataSizeInRanging), 470 0xc => Ok(SessionConfigOpCode::SessionSetHusControllerConfig), 471 0xd => Ok(SessionConfigOpCode::SessionSetHusControleeConfig), 472 0xe => Ok(SessionConfigOpCode::SessionDataTransferPhaseConfiguration), 473 _ => Err(value), 474 } 475 } 476 } 477 impl From<&SessionConfigOpCode> for u8 { from(value: &SessionConfigOpCode) -> Self478 fn from(value: &SessionConfigOpCode) -> Self { 479 match value { 480 SessionConfigOpCode::SessionInit => 0x0, 481 SessionConfigOpCode::SessionDeinit => 0x1, 482 SessionConfigOpCode::SessionStatusNtf => 0x2, 483 SessionConfigOpCode::SessionSetAppConfig => 0x3, 484 SessionConfigOpCode::SessionGetAppConfig => 0x4, 485 SessionConfigOpCode::SessionGetCount => 0x5, 486 SessionConfigOpCode::SessionGetState => 0x6, 487 SessionConfigOpCode::SessionUpdateControllerMulticastList => 0x7, 488 SessionConfigOpCode::SessionUpdateActiveRoundsAnchor => 0x8, 489 SessionConfigOpCode::SessionUpdateActiveRoundsDtTag => 0x9, 490 SessionConfigOpCode::SessionSetInitiatorDtAnchorRrRdmList => 0xa, 491 SessionConfigOpCode::SessionQueryDataSizeInRanging => 0xb, 492 SessionConfigOpCode::SessionSetHusControllerConfig => 0xc, 493 SessionConfigOpCode::SessionSetHusControleeConfig => 0xd, 494 SessionConfigOpCode::SessionDataTransferPhaseConfiguration => 0xe, 495 } 496 } 497 } 498 impl From<SessionConfigOpCode> for u8 { from(value: SessionConfigOpCode) -> Self499 fn from(value: SessionConfigOpCode) -> Self { 500 (&value).into() 501 } 502 } 503 impl From<SessionConfigOpCode> for i8 { from(value: SessionConfigOpCode) -> Self504 fn from(value: SessionConfigOpCode) -> Self { 505 u8::from(value) as Self 506 } 507 } 508 impl From<SessionConfigOpCode> for i16 { from(value: SessionConfigOpCode) -> Self509 fn from(value: SessionConfigOpCode) -> Self { 510 u8::from(value) as Self 511 } 512 } 513 impl From<SessionConfigOpCode> for i32 { from(value: SessionConfigOpCode) -> Self514 fn from(value: SessionConfigOpCode) -> Self { 515 u8::from(value) as Self 516 } 517 } 518 impl From<SessionConfigOpCode> for i64 { from(value: SessionConfigOpCode) -> Self519 fn from(value: SessionConfigOpCode) -> Self { 520 u8::from(value) as Self 521 } 522 } 523 impl From<SessionConfigOpCode> for u16 { from(value: SessionConfigOpCode) -> Self524 fn from(value: SessionConfigOpCode) -> Self { 525 u8::from(value) as Self 526 } 527 } 528 impl From<SessionConfigOpCode> for u32 { from(value: SessionConfigOpCode) -> Self529 fn from(value: SessionConfigOpCode) -> Self { 530 u8::from(value) as Self 531 } 532 } 533 impl From<SessionConfigOpCode> for u64 { from(value: SessionConfigOpCode) -> Self534 fn from(value: SessionConfigOpCode) -> Self { 535 u8::from(value) as Self 536 } 537 } 538 #[repr(u64)] 539 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 540 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 541 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 542 pub enum SessionControlOpCode { 543 SessionStart = 0x0, 544 SessionStop = 0x1, 545 SessionReserved = 0x2, 546 SessionGetRangingCount = 0x3, 547 SessionDataCreditNtf = 0x4, 548 SessionDataTransferStatusNtf = 0x5, 549 } 550 impl TryFrom<u8> for SessionControlOpCode { 551 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>552 fn try_from(value: u8) -> Result<Self, Self::Error> { 553 match value { 554 0x0 => Ok(SessionControlOpCode::SessionStart), 555 0x1 => Ok(SessionControlOpCode::SessionStop), 556 0x2 => Ok(SessionControlOpCode::SessionReserved), 557 0x3 => Ok(SessionControlOpCode::SessionGetRangingCount), 558 0x4 => Ok(SessionControlOpCode::SessionDataCreditNtf), 559 0x5 => Ok(SessionControlOpCode::SessionDataTransferStatusNtf), 560 _ => Err(value), 561 } 562 } 563 } 564 impl From<&SessionControlOpCode> for u8 { from(value: &SessionControlOpCode) -> Self565 fn from(value: &SessionControlOpCode) -> Self { 566 match value { 567 SessionControlOpCode::SessionStart => 0x0, 568 SessionControlOpCode::SessionStop => 0x1, 569 SessionControlOpCode::SessionReserved => 0x2, 570 SessionControlOpCode::SessionGetRangingCount => 0x3, 571 SessionControlOpCode::SessionDataCreditNtf => 0x4, 572 SessionControlOpCode::SessionDataTransferStatusNtf => 0x5, 573 } 574 } 575 } 576 impl From<SessionControlOpCode> for u8 { from(value: SessionControlOpCode) -> Self577 fn from(value: SessionControlOpCode) -> Self { 578 (&value).into() 579 } 580 } 581 impl From<SessionControlOpCode> for i8 { from(value: SessionControlOpCode) -> Self582 fn from(value: SessionControlOpCode) -> Self { 583 u8::from(value) as Self 584 } 585 } 586 impl From<SessionControlOpCode> for i16 { from(value: SessionControlOpCode) -> Self587 fn from(value: SessionControlOpCode) -> Self { 588 u8::from(value) as Self 589 } 590 } 591 impl From<SessionControlOpCode> for i32 { from(value: SessionControlOpCode) -> Self592 fn from(value: SessionControlOpCode) -> Self { 593 u8::from(value) as Self 594 } 595 } 596 impl From<SessionControlOpCode> for i64 { from(value: SessionControlOpCode) -> Self597 fn from(value: SessionControlOpCode) -> Self { 598 u8::from(value) as Self 599 } 600 } 601 impl From<SessionControlOpCode> for u16 { from(value: SessionControlOpCode) -> Self602 fn from(value: SessionControlOpCode) -> Self { 603 u8::from(value) as Self 604 } 605 } 606 impl From<SessionControlOpCode> for u32 { from(value: SessionControlOpCode) -> Self607 fn from(value: SessionControlOpCode) -> Self { 608 u8::from(value) as Self 609 } 610 } 611 impl From<SessionControlOpCode> for u64 { from(value: SessionControlOpCode) -> Self612 fn from(value: SessionControlOpCode) -> Self { 613 u8::from(value) as Self 614 } 615 } 616 #[repr(u64)] 617 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 618 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 619 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 620 pub enum AppDataOpCode { 621 AppDataTx = 0x0, 622 AppDataRx = 0x1, 623 } 624 impl TryFrom<u8> for AppDataOpCode { 625 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>626 fn try_from(value: u8) -> Result<Self, Self::Error> { 627 match value { 628 0x0 => Ok(AppDataOpCode::AppDataTx), 629 0x1 => Ok(AppDataOpCode::AppDataRx), 630 _ => Err(value), 631 } 632 } 633 } 634 impl From<&AppDataOpCode> for u8 { from(value: &AppDataOpCode) -> Self635 fn from(value: &AppDataOpCode) -> Self { 636 match value { 637 AppDataOpCode::AppDataTx => 0x0, 638 AppDataOpCode::AppDataRx => 0x1, 639 } 640 } 641 } 642 impl From<AppDataOpCode> for u8 { from(value: AppDataOpCode) -> Self643 fn from(value: AppDataOpCode) -> Self { 644 (&value).into() 645 } 646 } 647 impl From<AppDataOpCode> for i8 { from(value: AppDataOpCode) -> Self648 fn from(value: AppDataOpCode) -> Self { 649 u8::from(value) as Self 650 } 651 } 652 impl From<AppDataOpCode> for i16 { from(value: AppDataOpCode) -> Self653 fn from(value: AppDataOpCode) -> Self { 654 u8::from(value) as Self 655 } 656 } 657 impl From<AppDataOpCode> for i32 { from(value: AppDataOpCode) -> Self658 fn from(value: AppDataOpCode) -> Self { 659 u8::from(value) as Self 660 } 661 } 662 impl From<AppDataOpCode> for i64 { from(value: AppDataOpCode) -> Self663 fn from(value: AppDataOpCode) -> Self { 664 u8::from(value) as Self 665 } 666 } 667 impl From<AppDataOpCode> for u16 { from(value: AppDataOpCode) -> Self668 fn from(value: AppDataOpCode) -> Self { 669 u8::from(value) as Self 670 } 671 } 672 impl From<AppDataOpCode> for u32 { from(value: AppDataOpCode) -> Self673 fn from(value: AppDataOpCode) -> Self { 674 u8::from(value) as Self 675 } 676 } 677 impl From<AppDataOpCode> for u64 { from(value: AppDataOpCode) -> Self678 fn from(value: AppDataOpCode) -> Self { 679 u8::from(value) as Self 680 } 681 } 682 #[repr(u64)] 683 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 684 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 685 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 686 pub enum AndroidOpCode { 687 AndroidGetPowerStats = 0x0, 688 AndroidSetCountryCode = 0x1, 689 AndroidFiraRangeDiagnostics = 0x2, 690 AndroidRadarSetAppConfig = 0x11, 691 AndroidRadarGetAppConfig = 0x12, 692 } 693 impl TryFrom<u8> for AndroidOpCode { 694 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>695 fn try_from(value: u8) -> Result<Self, Self::Error> { 696 match value { 697 0x0 => Ok(AndroidOpCode::AndroidGetPowerStats), 698 0x1 => Ok(AndroidOpCode::AndroidSetCountryCode), 699 0x2 => Ok(AndroidOpCode::AndroidFiraRangeDiagnostics), 700 0x11 => Ok(AndroidOpCode::AndroidRadarSetAppConfig), 701 0x12 => Ok(AndroidOpCode::AndroidRadarGetAppConfig), 702 _ => Err(value), 703 } 704 } 705 } 706 impl From<&AndroidOpCode> for u8 { from(value: &AndroidOpCode) -> Self707 fn from(value: &AndroidOpCode) -> Self { 708 match value { 709 AndroidOpCode::AndroidGetPowerStats => 0x0, 710 AndroidOpCode::AndroidSetCountryCode => 0x1, 711 AndroidOpCode::AndroidFiraRangeDiagnostics => 0x2, 712 AndroidOpCode::AndroidRadarSetAppConfig => 0x11, 713 AndroidOpCode::AndroidRadarGetAppConfig => 0x12, 714 } 715 } 716 } 717 impl From<AndroidOpCode> for u8 { from(value: AndroidOpCode) -> Self718 fn from(value: AndroidOpCode) -> Self { 719 (&value).into() 720 } 721 } 722 impl From<AndroidOpCode> for i8 { from(value: AndroidOpCode) -> Self723 fn from(value: AndroidOpCode) -> Self { 724 u8::from(value) as Self 725 } 726 } 727 impl From<AndroidOpCode> for i16 { from(value: AndroidOpCode) -> Self728 fn from(value: AndroidOpCode) -> Self { 729 u8::from(value) as Self 730 } 731 } 732 impl From<AndroidOpCode> for i32 { from(value: AndroidOpCode) -> Self733 fn from(value: AndroidOpCode) -> Self { 734 u8::from(value) as Self 735 } 736 } 737 impl From<AndroidOpCode> for i64 { from(value: AndroidOpCode) -> Self738 fn from(value: AndroidOpCode) -> Self { 739 u8::from(value) as Self 740 } 741 } 742 impl From<AndroidOpCode> for u16 { from(value: AndroidOpCode) -> Self743 fn from(value: AndroidOpCode) -> Self { 744 u8::from(value) as Self 745 } 746 } 747 impl From<AndroidOpCode> for u32 { from(value: AndroidOpCode) -> Self748 fn from(value: AndroidOpCode) -> Self { 749 u8::from(value) as Self 750 } 751 } 752 impl From<AndroidOpCode> for u64 { from(value: AndroidOpCode) -> Self753 fn from(value: AndroidOpCode) -> Self { 754 u8::from(value) as Self 755 } 756 } 757 #[repr(u64)] 758 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 759 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 760 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 761 pub enum TestOpCode { 762 RfTestConfigSetCommand = 0x0, 763 RfTestConfigGetCommand = 0x1, 764 RfTestPeriodicTxCmd = 0x2, 765 } 766 impl TryFrom<u8> for TestOpCode { 767 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>768 fn try_from(value: u8) -> Result<Self, Self::Error> { 769 match value { 770 0x0 => Ok(TestOpCode::RfTestConfigSetCommand), 771 0x1 => Ok(TestOpCode::RfTestConfigGetCommand), 772 0x2 => Ok(TestOpCode::RfTestPeriodicTxCmd), 773 _ => Err(value), 774 } 775 } 776 } 777 impl From<&TestOpCode> for u8 { from(value: &TestOpCode) -> Self778 fn from(value: &TestOpCode) -> Self { 779 match value { 780 TestOpCode::RfTestConfigSetCommand => 0x0, 781 TestOpCode::RfTestConfigGetCommand => 0x1, 782 TestOpCode::RfTestPeriodicTxCmd => 0x2, 783 } 784 } 785 } 786 impl From<TestOpCode> for u8 { from(value: TestOpCode) -> Self787 fn from(value: TestOpCode) -> Self { 788 (&value).into() 789 } 790 } 791 impl From<TestOpCode> for i8 { from(value: TestOpCode) -> Self792 fn from(value: TestOpCode) -> Self { 793 u8::from(value) as Self 794 } 795 } 796 impl From<TestOpCode> for i16 { from(value: TestOpCode) -> Self797 fn from(value: TestOpCode) -> Self { 798 u8::from(value) as Self 799 } 800 } 801 impl From<TestOpCode> for i32 { from(value: TestOpCode) -> Self802 fn from(value: TestOpCode) -> Self { 803 u8::from(value) as Self 804 } 805 } 806 impl From<TestOpCode> for i64 { from(value: TestOpCode) -> Self807 fn from(value: TestOpCode) -> Self { 808 u8::from(value) as Self 809 } 810 } 811 impl From<TestOpCode> for u16 { from(value: TestOpCode) -> Self812 fn from(value: TestOpCode) -> Self { 813 u8::from(value) as Self 814 } 815 } 816 impl From<TestOpCode> for u32 { from(value: TestOpCode) -> Self817 fn from(value: TestOpCode) -> Self { 818 u8::from(value) as Self 819 } 820 } 821 impl From<TestOpCode> for u64 { from(value: TestOpCode) -> Self822 fn from(value: TestOpCode) -> Self { 823 u8::from(value) as Self 824 } 825 } 826 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 827 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 828 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 829 pub enum StatusCode { 830 UciStatusOk, 831 UciStatusRejected, 832 UciStatusFailed, 833 UciStatusSyntaxError, 834 UciStatusInvalidParam, 835 UciStatusInvalidRange, 836 UciStatusInvalidMsgSize, 837 UciStatusUnknownGid, 838 UciStatusUnknownOid, 839 UciStatusReadOnly, 840 UciStatusCommandRetry, 841 UciStatusUnknown, 842 UciStatusNotApplicable, 843 RfuStatusCodeRange1(Private<u8>), 844 UciStatusSessionNotExist, 845 UciStatusSessionDuplicate, 846 UciStatusSessionActive, 847 UciStatusMaxSessionsExceeded, 848 UciStatusSessionNotConfigured, 849 UciStatusActiveSessionsOngoing, 850 UciStatusMulticastListFull, 851 UciStatusAddressNotFound, 852 UciStatusAddressAlreadyPresent, 853 UciStatusErrorUwbInitiationTimeTooOld, 854 UciStatusOkNegativeDistanceReport, 855 RfuStatusCodeRange2(Private<u8>), 856 UciStatusRangingTxFailed, 857 UciStatusRangingRxTimeout, 858 UciStatusRangingRxPhyDecFailed, 859 UciStatusRangingRxPhyToaFailed, 860 UciStatusRangingRxPhyStsFailed, 861 UciStatusRangingRxMacDecFailed, 862 UciStatusRangingRxMacIeDecFailed, 863 UciStatusRangingRxMacIeMissing, 864 UciStatusErrorRoundIndexNotActivated, 865 UciStatusErrorNumberOfActiveRangingRoundsExceeded, 866 UciStatusErrorDlTdoaDeviceAddressNotMatchingInReplyTimeList, 867 RfuStatusCodeRange3(Private<u8>), 868 UciStatusDataMaxTxPsduSizeExceeded, 869 UciStatusDataRxCrcError, 870 RfuStatusCodeRange4(Private<u8>), 871 UciStatusErrorCccSeBusy, 872 UciStatusErrorCccLifecycle, 873 UciStatusErrorStoppedDueToOtherSessionConflict, 874 UciStatusRegulationUwbOff, 875 VendorSpecificStatusCodeRange1(Private<u8>), 876 VendorSpecificStatusCode2, 877 } 878 impl TryFrom<u8> for StatusCode { 879 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>880 fn try_from(value: u8) -> Result<Self, Self::Error> { 881 match value { 882 0x0 => Ok(StatusCode::UciStatusOk), 883 0x1 => Ok(StatusCode::UciStatusRejected), 884 0x2 => Ok(StatusCode::UciStatusFailed), 885 0x3 => Ok(StatusCode::UciStatusSyntaxError), 886 0x4 => Ok(StatusCode::UciStatusInvalidParam), 887 0x5 => Ok(StatusCode::UciStatusInvalidRange), 888 0x6 => Ok(StatusCode::UciStatusInvalidMsgSize), 889 0x7 => Ok(StatusCode::UciStatusUnknownGid), 890 0x8 => Ok(StatusCode::UciStatusUnknownOid), 891 0x9 => Ok(StatusCode::UciStatusReadOnly), 892 0xa => Ok(StatusCode::UciStatusCommandRetry), 893 0xb => Ok(StatusCode::UciStatusUnknown), 894 0xc => Ok(StatusCode::UciStatusNotApplicable), 895 0xd..=0x10 => Ok(StatusCode::RfuStatusCodeRange1(Private(value))), 896 0x11 => Ok(StatusCode::UciStatusSessionNotExist), 897 0x12 => Ok(StatusCode::UciStatusSessionDuplicate), 898 0x13 => Ok(StatusCode::UciStatusSessionActive), 899 0x14 => Ok(StatusCode::UciStatusMaxSessionsExceeded), 900 0x15 => Ok(StatusCode::UciStatusSessionNotConfigured), 901 0x16 => Ok(StatusCode::UciStatusActiveSessionsOngoing), 902 0x17 => Ok(StatusCode::UciStatusMulticastListFull), 903 0x18 => Ok(StatusCode::UciStatusAddressNotFound), 904 0x19 => Ok(StatusCode::UciStatusAddressAlreadyPresent), 905 0x1a => Ok(StatusCode::UciStatusErrorUwbInitiationTimeTooOld), 906 0x1b => Ok(StatusCode::UciStatusOkNegativeDistanceReport), 907 0x1c..=0x1f => Ok(StatusCode::RfuStatusCodeRange2(Private(value))), 908 0x20 => Ok(StatusCode::UciStatusRangingTxFailed), 909 0x21 => Ok(StatusCode::UciStatusRangingRxTimeout), 910 0x22 => Ok(StatusCode::UciStatusRangingRxPhyDecFailed), 911 0x23 => Ok(StatusCode::UciStatusRangingRxPhyToaFailed), 912 0x24 => Ok(StatusCode::UciStatusRangingRxPhyStsFailed), 913 0x25 => Ok(StatusCode::UciStatusRangingRxMacDecFailed), 914 0x26 => Ok(StatusCode::UciStatusRangingRxMacIeDecFailed), 915 0x27 => Ok(StatusCode::UciStatusRangingRxMacIeMissing), 916 0x28 => Ok(StatusCode::UciStatusErrorRoundIndexNotActivated), 917 0x29 => Ok(StatusCode::UciStatusErrorNumberOfActiveRangingRoundsExceeded), 918 0x2a => { 919 Ok( 920 StatusCode::UciStatusErrorDlTdoaDeviceAddressNotMatchingInReplyTimeList, 921 ) 922 } 923 0x2b..=0x2f => Ok(StatusCode::RfuStatusCodeRange3(Private(value))), 924 0x30 => Ok(StatusCode::UciStatusDataMaxTxPsduSizeExceeded), 925 0x31 => Ok(StatusCode::UciStatusDataRxCrcError), 926 0x32..=0x4f => Ok(StatusCode::RfuStatusCodeRange4(Private(value))), 927 0x50 => Ok(StatusCode::UciStatusErrorCccSeBusy), 928 0x51 => Ok(StatusCode::UciStatusErrorCccLifecycle), 929 0x52 => Ok(StatusCode::UciStatusErrorStoppedDueToOtherSessionConflict), 930 0x53 => Ok(StatusCode::UciStatusRegulationUwbOff), 931 0x50..=0xfe => Ok(StatusCode::VendorSpecificStatusCodeRange1(Private(value))), 932 0xff => Ok(StatusCode::VendorSpecificStatusCode2), 933 } 934 } 935 } 936 impl From<&StatusCode> for u8 { from(value: &StatusCode) -> Self937 fn from(value: &StatusCode) -> Self { 938 match value { 939 StatusCode::UciStatusOk => 0x0, 940 StatusCode::UciStatusRejected => 0x1, 941 StatusCode::UciStatusFailed => 0x2, 942 StatusCode::UciStatusSyntaxError => 0x3, 943 StatusCode::UciStatusInvalidParam => 0x4, 944 StatusCode::UciStatusInvalidRange => 0x5, 945 StatusCode::UciStatusInvalidMsgSize => 0x6, 946 StatusCode::UciStatusUnknownGid => 0x7, 947 StatusCode::UciStatusUnknownOid => 0x8, 948 StatusCode::UciStatusReadOnly => 0x9, 949 StatusCode::UciStatusCommandRetry => 0xa, 950 StatusCode::UciStatusUnknown => 0xb, 951 StatusCode::UciStatusNotApplicable => 0xc, 952 StatusCode::RfuStatusCodeRange1(Private(value)) => *value, 953 StatusCode::UciStatusSessionNotExist => 0x11, 954 StatusCode::UciStatusSessionDuplicate => 0x12, 955 StatusCode::UciStatusSessionActive => 0x13, 956 StatusCode::UciStatusMaxSessionsExceeded => 0x14, 957 StatusCode::UciStatusSessionNotConfigured => 0x15, 958 StatusCode::UciStatusActiveSessionsOngoing => 0x16, 959 StatusCode::UciStatusMulticastListFull => 0x17, 960 StatusCode::UciStatusAddressNotFound => 0x18, 961 StatusCode::UciStatusAddressAlreadyPresent => 0x19, 962 StatusCode::UciStatusErrorUwbInitiationTimeTooOld => 0x1a, 963 StatusCode::UciStatusOkNegativeDistanceReport => 0x1b, 964 StatusCode::RfuStatusCodeRange2(Private(value)) => *value, 965 StatusCode::UciStatusRangingTxFailed => 0x20, 966 StatusCode::UciStatusRangingRxTimeout => 0x21, 967 StatusCode::UciStatusRangingRxPhyDecFailed => 0x22, 968 StatusCode::UciStatusRangingRxPhyToaFailed => 0x23, 969 StatusCode::UciStatusRangingRxPhyStsFailed => 0x24, 970 StatusCode::UciStatusRangingRxMacDecFailed => 0x25, 971 StatusCode::UciStatusRangingRxMacIeDecFailed => 0x26, 972 StatusCode::UciStatusRangingRxMacIeMissing => 0x27, 973 StatusCode::UciStatusErrorRoundIndexNotActivated => 0x28, 974 StatusCode::UciStatusErrorNumberOfActiveRangingRoundsExceeded => 0x29, 975 StatusCode::UciStatusErrorDlTdoaDeviceAddressNotMatchingInReplyTimeList => { 976 0x2a 977 } 978 StatusCode::RfuStatusCodeRange3(Private(value)) => *value, 979 StatusCode::UciStatusDataMaxTxPsduSizeExceeded => 0x30, 980 StatusCode::UciStatusDataRxCrcError => 0x31, 981 StatusCode::RfuStatusCodeRange4(Private(value)) => *value, 982 StatusCode::UciStatusErrorCccSeBusy => 0x50, 983 StatusCode::UciStatusErrorCccLifecycle => 0x51, 984 StatusCode::UciStatusErrorStoppedDueToOtherSessionConflict => 0x52, 985 StatusCode::UciStatusRegulationUwbOff => 0x53, 986 StatusCode::VendorSpecificStatusCodeRange1(Private(value)) => *value, 987 StatusCode::VendorSpecificStatusCode2 => 0xff, 988 } 989 } 990 } 991 impl From<StatusCode> for u8 { from(value: StatusCode) -> Self992 fn from(value: StatusCode) -> Self { 993 (&value).into() 994 } 995 } 996 impl From<StatusCode> for i16 { from(value: StatusCode) -> Self997 fn from(value: StatusCode) -> Self { 998 u8::from(value) as Self 999 } 1000 } 1001 impl From<StatusCode> for i32 { from(value: StatusCode) -> Self1002 fn from(value: StatusCode) -> Self { 1003 u8::from(value) as Self 1004 } 1005 } 1006 impl From<StatusCode> for i64 { from(value: StatusCode) -> Self1007 fn from(value: StatusCode) -> Self { 1008 u8::from(value) as Self 1009 } 1010 } 1011 impl From<StatusCode> for u16 { from(value: StatusCode) -> Self1012 fn from(value: StatusCode) -> Self { 1013 u8::from(value) as Self 1014 } 1015 } 1016 impl From<StatusCode> for u32 { from(value: StatusCode) -> Self1017 fn from(value: StatusCode) -> Self { 1018 u8::from(value) as Self 1019 } 1020 } 1021 impl From<StatusCode> for u64 { from(value: StatusCode) -> Self1022 fn from(value: StatusCode) -> Self { 1023 u8::from(value) as Self 1024 } 1025 } 1026 #[repr(u64)] 1027 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 1028 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 1029 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 1030 pub enum DataRcvStatusCode { 1031 UciStatusSuccess = 0x0, 1032 UciStatusError = 0x1, 1033 UciStatusUnknown = 0x2, 1034 } 1035 impl TryFrom<u8> for DataRcvStatusCode { 1036 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>1037 fn try_from(value: u8) -> Result<Self, Self::Error> { 1038 match value { 1039 0x0 => Ok(DataRcvStatusCode::UciStatusSuccess), 1040 0x1 => Ok(DataRcvStatusCode::UciStatusError), 1041 0x2 => Ok(DataRcvStatusCode::UciStatusUnknown), 1042 _ => Err(value), 1043 } 1044 } 1045 } 1046 impl From<&DataRcvStatusCode> for u8 { from(value: &DataRcvStatusCode) -> Self1047 fn from(value: &DataRcvStatusCode) -> Self { 1048 match value { 1049 DataRcvStatusCode::UciStatusSuccess => 0x0, 1050 DataRcvStatusCode::UciStatusError => 0x1, 1051 DataRcvStatusCode::UciStatusUnknown => 0x2, 1052 } 1053 } 1054 } 1055 impl From<DataRcvStatusCode> for u8 { from(value: DataRcvStatusCode) -> Self1056 fn from(value: DataRcvStatusCode) -> Self { 1057 (&value).into() 1058 } 1059 } 1060 impl From<DataRcvStatusCode> for i16 { from(value: DataRcvStatusCode) -> Self1061 fn from(value: DataRcvStatusCode) -> Self { 1062 u8::from(value) as Self 1063 } 1064 } 1065 impl From<DataRcvStatusCode> for i32 { from(value: DataRcvStatusCode) -> Self1066 fn from(value: DataRcvStatusCode) -> Self { 1067 u8::from(value) as Self 1068 } 1069 } 1070 impl From<DataRcvStatusCode> for i64 { from(value: DataRcvStatusCode) -> Self1071 fn from(value: DataRcvStatusCode) -> Self { 1072 u8::from(value) as Self 1073 } 1074 } 1075 impl From<DataRcvStatusCode> for u16 { from(value: DataRcvStatusCode) -> Self1076 fn from(value: DataRcvStatusCode) -> Self { 1077 u8::from(value) as Self 1078 } 1079 } 1080 impl From<DataRcvStatusCode> for u32 { from(value: DataRcvStatusCode) -> Self1081 fn from(value: DataRcvStatusCode) -> Self { 1082 u8::from(value) as Self 1083 } 1084 } 1085 impl From<DataRcvStatusCode> for u64 { from(value: DataRcvStatusCode) -> Self1086 fn from(value: DataRcvStatusCode) -> Self { 1087 u8::from(value) as Self 1088 } 1089 } 1090 #[repr(u64)] 1091 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 1092 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 1093 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 1094 pub enum CreditAvailability { 1095 CreditNotAvailable = 0x0, 1096 CreditAvailable = 0x1, 1097 } 1098 impl TryFrom<u8> for CreditAvailability { 1099 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>1100 fn try_from(value: u8) -> Result<Self, Self::Error> { 1101 match value { 1102 0x0 => Ok(CreditAvailability::CreditNotAvailable), 1103 0x1 => Ok(CreditAvailability::CreditAvailable), 1104 _ => Err(value), 1105 } 1106 } 1107 } 1108 impl From<&CreditAvailability> for u8 { from(value: &CreditAvailability) -> Self1109 fn from(value: &CreditAvailability) -> Self { 1110 match value { 1111 CreditAvailability::CreditNotAvailable => 0x0, 1112 CreditAvailability::CreditAvailable => 0x1, 1113 } 1114 } 1115 } 1116 impl From<CreditAvailability> for u8 { from(value: CreditAvailability) -> Self1117 fn from(value: CreditAvailability) -> Self { 1118 (&value).into() 1119 } 1120 } 1121 impl From<CreditAvailability> for i16 { from(value: CreditAvailability) -> Self1122 fn from(value: CreditAvailability) -> Self { 1123 u8::from(value) as Self 1124 } 1125 } 1126 impl From<CreditAvailability> for i32 { from(value: CreditAvailability) -> Self1127 fn from(value: CreditAvailability) -> Self { 1128 u8::from(value) as Self 1129 } 1130 } 1131 impl From<CreditAvailability> for i64 { from(value: CreditAvailability) -> Self1132 fn from(value: CreditAvailability) -> Self { 1133 u8::from(value) as Self 1134 } 1135 } 1136 impl From<CreditAvailability> for u16 { from(value: CreditAvailability) -> Self1137 fn from(value: CreditAvailability) -> Self { 1138 u8::from(value) as Self 1139 } 1140 } 1141 impl From<CreditAvailability> for u32 { from(value: CreditAvailability) -> Self1142 fn from(value: CreditAvailability) -> Self { 1143 u8::from(value) as Self 1144 } 1145 } 1146 impl From<CreditAvailability> for u64 { from(value: CreditAvailability) -> Self1147 fn from(value: CreditAvailability) -> Self { 1148 u8::from(value) as Self 1149 } 1150 } 1151 #[repr(u64)] 1152 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 1153 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 1154 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 1155 pub enum DataTransferNtfStatusCode { 1156 UciDataTransferStatusRepetitionOk = 0x0, 1157 UciDataTransferStatusOk = 0x1, 1158 UciDataTransferStatusErrorDataTransfer = 0x2, 1159 UciDataTransferStatusErrorNoCreditAvailable = 0x3, 1160 UciDataTransferStatusErrorRejected = 0x4, 1161 UciDataTransferStatusSessionTypeNotSupported = 0x5, 1162 UciDataTransferStatusErrorDataTransferIsOngoing = 0x6, 1163 UciDataTransferStatusInvalidFormat = 0x7, 1164 } 1165 impl TryFrom<u8> for DataTransferNtfStatusCode { 1166 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>1167 fn try_from(value: u8) -> Result<Self, Self::Error> { 1168 match value { 1169 0x0 => Ok(DataTransferNtfStatusCode::UciDataTransferStatusRepetitionOk), 1170 0x1 => Ok(DataTransferNtfStatusCode::UciDataTransferStatusOk), 1171 0x2 => Ok(DataTransferNtfStatusCode::UciDataTransferStatusErrorDataTransfer), 1172 0x3 => { 1173 Ok( 1174 DataTransferNtfStatusCode::UciDataTransferStatusErrorNoCreditAvailable, 1175 ) 1176 } 1177 0x4 => Ok(DataTransferNtfStatusCode::UciDataTransferStatusErrorRejected), 1178 0x5 => { 1179 Ok( 1180 DataTransferNtfStatusCode::UciDataTransferStatusSessionTypeNotSupported, 1181 ) 1182 } 1183 0x6 => { 1184 Ok( 1185 DataTransferNtfStatusCode::UciDataTransferStatusErrorDataTransferIsOngoing, 1186 ) 1187 } 1188 0x7 => Ok(DataTransferNtfStatusCode::UciDataTransferStatusInvalidFormat), 1189 _ => Err(value), 1190 } 1191 } 1192 } 1193 impl From<&DataTransferNtfStatusCode> for u8 { from(value: &DataTransferNtfStatusCode) -> Self1194 fn from(value: &DataTransferNtfStatusCode) -> Self { 1195 match value { 1196 DataTransferNtfStatusCode::UciDataTransferStatusRepetitionOk => 0x0, 1197 DataTransferNtfStatusCode::UciDataTransferStatusOk => 0x1, 1198 DataTransferNtfStatusCode::UciDataTransferStatusErrorDataTransfer => 0x2, 1199 DataTransferNtfStatusCode::UciDataTransferStatusErrorNoCreditAvailable => 0x3, 1200 DataTransferNtfStatusCode::UciDataTransferStatusErrorRejected => 0x4, 1201 DataTransferNtfStatusCode::UciDataTransferStatusSessionTypeNotSupported => { 1202 0x5 1203 } 1204 DataTransferNtfStatusCode::UciDataTransferStatusErrorDataTransferIsOngoing => { 1205 0x6 1206 } 1207 DataTransferNtfStatusCode::UciDataTransferStatusInvalidFormat => 0x7, 1208 } 1209 } 1210 } 1211 impl From<DataTransferNtfStatusCode> for u8 { from(value: DataTransferNtfStatusCode) -> Self1212 fn from(value: DataTransferNtfStatusCode) -> Self { 1213 (&value).into() 1214 } 1215 } 1216 impl From<DataTransferNtfStatusCode> for i16 { from(value: DataTransferNtfStatusCode) -> Self1217 fn from(value: DataTransferNtfStatusCode) -> Self { 1218 u8::from(value) as Self 1219 } 1220 } 1221 impl From<DataTransferNtfStatusCode> for i32 { from(value: DataTransferNtfStatusCode) -> Self1222 fn from(value: DataTransferNtfStatusCode) -> Self { 1223 u8::from(value) as Self 1224 } 1225 } 1226 impl From<DataTransferNtfStatusCode> for i64 { from(value: DataTransferNtfStatusCode) -> Self1227 fn from(value: DataTransferNtfStatusCode) -> Self { 1228 u8::from(value) as Self 1229 } 1230 } 1231 impl From<DataTransferNtfStatusCode> for u16 { from(value: DataTransferNtfStatusCode) -> Self1232 fn from(value: DataTransferNtfStatusCode) -> Self { 1233 u8::from(value) as Self 1234 } 1235 } 1236 impl From<DataTransferNtfStatusCode> for u32 { from(value: DataTransferNtfStatusCode) -> Self1237 fn from(value: DataTransferNtfStatusCode) -> Self { 1238 u8::from(value) as Self 1239 } 1240 } 1241 impl From<DataTransferNtfStatusCode> for u64 { from(value: DataTransferNtfStatusCode) -> Self1242 fn from(value: DataTransferNtfStatusCode) -> Self { 1243 u8::from(value) as Self 1244 } 1245 } 1246 #[repr(u64)] 1247 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 1248 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 1249 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 1250 pub enum DataTransferPhaseConfigUpdateStatusCode { 1251 UciDtpcmConfigSuccessStatusOk = 0x0, 1252 UciDtpcmStatusErrorDuplicateSlotAssigment = 0x1, 1253 } 1254 impl TryFrom<u8> for DataTransferPhaseConfigUpdateStatusCode { 1255 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>1256 fn try_from(value: u8) -> Result<Self, Self::Error> { 1257 match value { 1258 0x0 => { 1259 Ok( 1260 DataTransferPhaseConfigUpdateStatusCode::UciDtpcmConfigSuccessStatusOk, 1261 ) 1262 } 1263 0x1 => { 1264 Ok( 1265 DataTransferPhaseConfigUpdateStatusCode::UciDtpcmStatusErrorDuplicateSlotAssigment, 1266 ) 1267 } 1268 _ => Err(value), 1269 } 1270 } 1271 } 1272 impl From<&DataTransferPhaseConfigUpdateStatusCode> for u8 { from(value: &DataTransferPhaseConfigUpdateStatusCode) -> Self1273 fn from(value: &DataTransferPhaseConfigUpdateStatusCode) -> Self { 1274 match value { 1275 DataTransferPhaseConfigUpdateStatusCode::UciDtpcmConfigSuccessStatusOk => 0x0, 1276 DataTransferPhaseConfigUpdateStatusCode::UciDtpcmStatusErrorDuplicateSlotAssigment => { 1277 0x1 1278 } 1279 } 1280 } 1281 } 1282 impl From<DataTransferPhaseConfigUpdateStatusCode> for u8 { from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self1283 fn from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self { 1284 (&value).into() 1285 } 1286 } 1287 impl From<DataTransferPhaseConfigUpdateStatusCode> for i16 { from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self1288 fn from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self { 1289 u8::from(value) as Self 1290 } 1291 } 1292 impl From<DataTransferPhaseConfigUpdateStatusCode> for i32 { from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self1293 fn from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self { 1294 u8::from(value) as Self 1295 } 1296 } 1297 impl From<DataTransferPhaseConfigUpdateStatusCode> for i64 { from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self1298 fn from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self { 1299 u8::from(value) as Self 1300 } 1301 } 1302 impl From<DataTransferPhaseConfigUpdateStatusCode> for u16 { from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self1303 fn from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self { 1304 u8::from(value) as Self 1305 } 1306 } 1307 impl From<DataTransferPhaseConfigUpdateStatusCode> for u32 { from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self1308 fn from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self { 1309 u8::from(value) as Self 1310 } 1311 } 1312 impl From<DataTransferPhaseConfigUpdateStatusCode> for u64 { from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self1313 fn from(value: DataTransferPhaseConfigUpdateStatusCode) -> Self { 1314 u8::from(value) as Self 1315 } 1316 } 1317 #[repr(u64)] 1318 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 1319 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 1320 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 1321 pub enum ResetConfig { 1322 UwbsReset = 0x0, 1323 } 1324 impl TryFrom<u8> for ResetConfig { 1325 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>1326 fn try_from(value: u8) -> Result<Self, Self::Error> { 1327 match value { 1328 0x0 => Ok(ResetConfig::UwbsReset), 1329 _ => Err(value), 1330 } 1331 } 1332 } 1333 impl From<&ResetConfig> for u8 { from(value: &ResetConfig) -> Self1334 fn from(value: &ResetConfig) -> Self { 1335 match value { 1336 ResetConfig::UwbsReset => 0x0, 1337 } 1338 } 1339 } 1340 impl From<ResetConfig> for u8 { from(value: ResetConfig) -> Self1341 fn from(value: ResetConfig) -> Self { 1342 (&value).into() 1343 } 1344 } 1345 impl From<ResetConfig> for i16 { from(value: ResetConfig) -> Self1346 fn from(value: ResetConfig) -> Self { 1347 u8::from(value) as Self 1348 } 1349 } 1350 impl From<ResetConfig> for i32 { from(value: ResetConfig) -> Self1351 fn from(value: ResetConfig) -> Self { 1352 u8::from(value) as Self 1353 } 1354 } 1355 impl From<ResetConfig> for i64 { from(value: ResetConfig) -> Self1356 fn from(value: ResetConfig) -> Self { 1357 u8::from(value) as Self 1358 } 1359 } 1360 impl From<ResetConfig> for u16 { from(value: ResetConfig) -> Self1361 fn from(value: ResetConfig) -> Self { 1362 u8::from(value) as Self 1363 } 1364 } 1365 impl From<ResetConfig> for u32 { from(value: ResetConfig) -> Self1366 fn from(value: ResetConfig) -> Self { 1367 u8::from(value) as Self 1368 } 1369 } 1370 impl From<ResetConfig> for u64 { from(value: ResetConfig) -> Self1371 fn from(value: ResetConfig) -> Self { 1372 u8::from(value) as Self 1373 } 1374 } 1375 #[repr(u64)] 1376 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 1377 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 1378 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 1379 pub enum DeviceConfigId { 1380 DeviceState = 0x0, 1381 LowPowerMode = 0x1, 1382 } 1383 impl TryFrom<u8> for DeviceConfigId { 1384 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>1385 fn try_from(value: u8) -> Result<Self, Self::Error> { 1386 match value { 1387 0x0 => Ok(DeviceConfigId::DeviceState), 1388 0x1 => Ok(DeviceConfigId::LowPowerMode), 1389 _ => Err(value), 1390 } 1391 } 1392 } 1393 impl From<&DeviceConfigId> for u8 { from(value: &DeviceConfigId) -> Self1394 fn from(value: &DeviceConfigId) -> Self { 1395 match value { 1396 DeviceConfigId::DeviceState => 0x0, 1397 DeviceConfigId::LowPowerMode => 0x1, 1398 } 1399 } 1400 } 1401 impl From<DeviceConfigId> for u8 { from(value: DeviceConfigId) -> Self1402 fn from(value: DeviceConfigId) -> Self { 1403 (&value).into() 1404 } 1405 } 1406 impl From<DeviceConfigId> for i16 { from(value: DeviceConfigId) -> Self1407 fn from(value: DeviceConfigId) -> Self { 1408 u8::from(value) as Self 1409 } 1410 } 1411 impl From<DeviceConfigId> for i32 { from(value: DeviceConfigId) -> Self1412 fn from(value: DeviceConfigId) -> Self { 1413 u8::from(value) as Self 1414 } 1415 } 1416 impl From<DeviceConfigId> for i64 { from(value: DeviceConfigId) -> Self1417 fn from(value: DeviceConfigId) -> Self { 1418 u8::from(value) as Self 1419 } 1420 } 1421 impl From<DeviceConfigId> for u16 { from(value: DeviceConfigId) -> Self1422 fn from(value: DeviceConfigId) -> Self { 1423 u8::from(value) as Self 1424 } 1425 } 1426 impl From<DeviceConfigId> for u32 { from(value: DeviceConfigId) -> Self1427 fn from(value: DeviceConfigId) -> Self { 1428 u8::from(value) as Self 1429 } 1430 } 1431 impl From<DeviceConfigId> for u64 { from(value: DeviceConfigId) -> Self1432 fn from(value: DeviceConfigId) -> Self { 1433 u8::from(value) as Self 1434 } 1435 } 1436 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 1437 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 1438 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 1439 pub enum AppConfigTlvType { 1440 DeviceType, 1441 RangingRoundUsage, 1442 StsConfig, 1443 MultiNodeMode, 1444 ChannelNumber, 1445 NoOfControlee, 1446 DeviceMacAddress, 1447 DstMacAddress, 1448 SlotDuration, 1449 RangingDuration, 1450 StsIndex, 1451 MacFcsType, 1452 RangingRoundControl, 1453 AoaResultReq, 1454 RngDataNtf, 1455 RngDataNtfProximityNear, 1456 RngDataNtfProximityFar, 1457 DeviceRole, 1458 RframeConfig, 1459 RssiReporting, 1460 PreambleCodeIndex, 1461 SfdId, 1462 PsduDataRate, 1463 PreambleDuration, 1464 LinkLayerMode, 1465 DataRepetitionCount, 1466 RangingTimeStruct, 1467 SlotsPerRr, 1468 TxAdaptivePayloadPower, 1469 RngDataNtfAoaBound, 1470 ResponderSlotIndex, 1471 PrfMode, 1472 CapSizeRange, 1473 TxJitterWindowSize, 1474 ScheduledMode, 1475 KeyRotation, 1476 KeyRotationRate, 1477 SessionPriority, 1478 MacAddressMode, 1479 VendorId, 1480 StaticStsIv, 1481 NumberOfStsSegments, 1482 MaxRrRetry, 1483 UwbInitiationTime, 1484 HoppingMode, 1485 BlockStrideLength, 1486 ResultReportConfig, 1487 InBandTerminationAttemptCount, 1488 SubSessionId, 1489 BprfPhrDataRate, 1490 MaxNumberOfMeasurements, 1491 UlTdoaTxInterval, 1492 UlTdoaRandomWindow, 1493 StsLength, 1494 SuspendRangingRounds, 1495 UlTdoaNtfReportConfig, 1496 UlTdoaDeviceId, 1497 UlTdoaTxTimestamp, 1498 MinFramesPerRr, 1499 MtuSize, 1500 InterFrameInterval, 1501 DlTdoaRangingMethod, 1502 DlTdoaTxTimestampConf, 1503 DlTdoaHopCount, 1504 DlTdoaAnchorCfo, 1505 DlTdoaAnchorLocation, 1506 DlTdoaTxActiveRangingRounds, 1507 DlTdoaBlockStriding, 1508 DlTdoaTimeReferenceAnchor, 1509 SessionKey, 1510 SubsessionKey, 1511 SessionDataTransferStatusNtfConfig, 1512 SessionTimeBase, 1513 DlTdoaResponderTof, 1514 SecureRangingNefaLevel, 1515 SecureRangingCswLength, 1516 ApplicationDataEndpoint, 1517 OwrAoaMeasurementNtfPeriod, 1518 RfuAppCfgTlvTypeRange(Private<u8>), 1519 CccHopModeKey, 1520 CccUwbTime0, 1521 CccRangingProtocolVer, 1522 CccUwbConfigId, 1523 CccPulseshapeCombo, 1524 CccUrskTtl, 1525 CccLastIndexUsed, 1526 AliroMacMode, 1527 VendorSpecificAppCfgTlvTypeRange1(Private<u8>), 1528 RfuAppCfgTlvTypeRange4(Private<u8>), 1529 NbOfRangeMeasurements, 1530 NbOfAzimuthMeasurements, 1531 NbOfElevationMeasurements, 1532 EnableDiagnostics, 1533 DiagramsFrameReportsFields, 1534 AntennaMode, 1535 VendorSpecificAppCfgTlvTypeRange2(Private<u8>), 1536 } 1537 impl TryFrom<u8> for AppConfigTlvType { 1538 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>1539 fn try_from(value: u8) -> Result<Self, Self::Error> { 1540 match value { 1541 0x0 => Ok(AppConfigTlvType::DeviceType), 1542 0x1 => Ok(AppConfigTlvType::RangingRoundUsage), 1543 0x2 => Ok(AppConfigTlvType::StsConfig), 1544 0x3 => Ok(AppConfigTlvType::MultiNodeMode), 1545 0x4 => Ok(AppConfigTlvType::ChannelNumber), 1546 0x5 => Ok(AppConfigTlvType::NoOfControlee), 1547 0x6 => Ok(AppConfigTlvType::DeviceMacAddress), 1548 0x7 => Ok(AppConfigTlvType::DstMacAddress), 1549 0x8 => Ok(AppConfigTlvType::SlotDuration), 1550 0x9 => Ok(AppConfigTlvType::RangingDuration), 1551 0xa => Ok(AppConfigTlvType::StsIndex), 1552 0xb => Ok(AppConfigTlvType::MacFcsType), 1553 0xc => Ok(AppConfigTlvType::RangingRoundControl), 1554 0xd => Ok(AppConfigTlvType::AoaResultReq), 1555 0xe => Ok(AppConfigTlvType::RngDataNtf), 1556 0xf => Ok(AppConfigTlvType::RngDataNtfProximityNear), 1557 0x10 => Ok(AppConfigTlvType::RngDataNtfProximityFar), 1558 0x11 => Ok(AppConfigTlvType::DeviceRole), 1559 0x12 => Ok(AppConfigTlvType::RframeConfig), 1560 0x13 => Ok(AppConfigTlvType::RssiReporting), 1561 0x14 => Ok(AppConfigTlvType::PreambleCodeIndex), 1562 0x15 => Ok(AppConfigTlvType::SfdId), 1563 0x16 => Ok(AppConfigTlvType::PsduDataRate), 1564 0x17 => Ok(AppConfigTlvType::PreambleDuration), 1565 0x18 => Ok(AppConfigTlvType::LinkLayerMode), 1566 0x19 => Ok(AppConfigTlvType::DataRepetitionCount), 1567 0x1a => Ok(AppConfigTlvType::RangingTimeStruct), 1568 0x1b => Ok(AppConfigTlvType::SlotsPerRr), 1569 0x1c => Ok(AppConfigTlvType::TxAdaptivePayloadPower), 1570 0x1d => Ok(AppConfigTlvType::RngDataNtfAoaBound), 1571 0x1e => Ok(AppConfigTlvType::ResponderSlotIndex), 1572 0x1f => Ok(AppConfigTlvType::PrfMode), 1573 0x20 => Ok(AppConfigTlvType::CapSizeRange), 1574 0x21 => Ok(AppConfigTlvType::TxJitterWindowSize), 1575 0x22 => Ok(AppConfigTlvType::ScheduledMode), 1576 0x23 => Ok(AppConfigTlvType::KeyRotation), 1577 0x24 => Ok(AppConfigTlvType::KeyRotationRate), 1578 0x25 => Ok(AppConfigTlvType::SessionPriority), 1579 0x26 => Ok(AppConfigTlvType::MacAddressMode), 1580 0x27 => Ok(AppConfigTlvType::VendorId), 1581 0x28 => Ok(AppConfigTlvType::StaticStsIv), 1582 0x29 => Ok(AppConfigTlvType::NumberOfStsSegments), 1583 0x2a => Ok(AppConfigTlvType::MaxRrRetry), 1584 0x2b => Ok(AppConfigTlvType::UwbInitiationTime), 1585 0x2c => Ok(AppConfigTlvType::HoppingMode), 1586 0x2d => Ok(AppConfigTlvType::BlockStrideLength), 1587 0x2e => Ok(AppConfigTlvType::ResultReportConfig), 1588 0x2f => Ok(AppConfigTlvType::InBandTerminationAttemptCount), 1589 0x30 => Ok(AppConfigTlvType::SubSessionId), 1590 0x31 => Ok(AppConfigTlvType::BprfPhrDataRate), 1591 0x32 => Ok(AppConfigTlvType::MaxNumberOfMeasurements), 1592 0x33 => Ok(AppConfigTlvType::UlTdoaTxInterval), 1593 0x34 => Ok(AppConfigTlvType::UlTdoaRandomWindow), 1594 0x35 => Ok(AppConfigTlvType::StsLength), 1595 0x36 => Ok(AppConfigTlvType::SuspendRangingRounds), 1596 0x37 => Ok(AppConfigTlvType::UlTdoaNtfReportConfig), 1597 0x38 => Ok(AppConfigTlvType::UlTdoaDeviceId), 1598 0x39 => Ok(AppConfigTlvType::UlTdoaTxTimestamp), 1599 0x3a => Ok(AppConfigTlvType::MinFramesPerRr), 1600 0x3b => Ok(AppConfigTlvType::MtuSize), 1601 0x3c => Ok(AppConfigTlvType::InterFrameInterval), 1602 0x3d => Ok(AppConfigTlvType::DlTdoaRangingMethod), 1603 0x3e => Ok(AppConfigTlvType::DlTdoaTxTimestampConf), 1604 0x3f => Ok(AppConfigTlvType::DlTdoaHopCount), 1605 0x40 => Ok(AppConfigTlvType::DlTdoaAnchorCfo), 1606 0x41 => Ok(AppConfigTlvType::DlTdoaAnchorLocation), 1607 0x42 => Ok(AppConfigTlvType::DlTdoaTxActiveRangingRounds), 1608 0x43 => Ok(AppConfigTlvType::DlTdoaBlockStriding), 1609 0x44 => Ok(AppConfigTlvType::DlTdoaTimeReferenceAnchor), 1610 0x45 => Ok(AppConfigTlvType::SessionKey), 1611 0x46 => Ok(AppConfigTlvType::SubsessionKey), 1612 0x47 => Ok(AppConfigTlvType::SessionDataTransferStatusNtfConfig), 1613 0x48 => Ok(AppConfigTlvType::SessionTimeBase), 1614 0x49 => Ok(AppConfigTlvType::DlTdoaResponderTof), 1615 0x4a => Ok(AppConfigTlvType::SecureRangingNefaLevel), 1616 0x4b => Ok(AppConfigTlvType::SecureRangingCswLength), 1617 0x4c => Ok(AppConfigTlvType::ApplicationDataEndpoint), 1618 0x4d => Ok(AppConfigTlvType::OwrAoaMeasurementNtfPeriod), 1619 0x4e..=0x9f => Ok(AppConfigTlvType::RfuAppCfgTlvTypeRange(Private(value))), 1620 0xa0 => Ok(AppConfigTlvType::CccHopModeKey), 1621 0xa1 => Ok(AppConfigTlvType::CccUwbTime0), 1622 0xa3 => Ok(AppConfigTlvType::CccRangingProtocolVer), 1623 0xa4 => Ok(AppConfigTlvType::CccUwbConfigId), 1624 0xa5 => Ok(AppConfigTlvType::CccPulseshapeCombo), 1625 0xa6 => Ok(AppConfigTlvType::CccUrskTtl), 1626 0xa8 => Ok(AppConfigTlvType::CccLastIndexUsed), 1627 0xa9 => Ok(AppConfigTlvType::AliroMacMode), 1628 0xa0..=0xdf => { 1629 Ok(AppConfigTlvType::VendorSpecificAppCfgTlvTypeRange1(Private(value))) 1630 } 1631 0xe0..=0xe2 => Ok(AppConfigTlvType::RfuAppCfgTlvTypeRange4(Private(value))), 1632 0xe3 => Ok(AppConfigTlvType::NbOfRangeMeasurements), 1633 0xe4 => Ok(AppConfigTlvType::NbOfAzimuthMeasurements), 1634 0xe5 => Ok(AppConfigTlvType::NbOfElevationMeasurements), 1635 0xe8 => Ok(AppConfigTlvType::EnableDiagnostics), 1636 0xe9 => Ok(AppConfigTlvType::DiagramsFrameReportsFields), 1637 0xea => Ok(AppConfigTlvType::AntennaMode), 1638 0xe3..=0xff => { 1639 Ok(AppConfigTlvType::VendorSpecificAppCfgTlvTypeRange2(Private(value))) 1640 } 1641 } 1642 } 1643 } 1644 impl From<&AppConfigTlvType> for u8 { from(value: &AppConfigTlvType) -> Self1645 fn from(value: &AppConfigTlvType) -> Self { 1646 match value { 1647 AppConfigTlvType::DeviceType => 0x0, 1648 AppConfigTlvType::RangingRoundUsage => 0x1, 1649 AppConfigTlvType::StsConfig => 0x2, 1650 AppConfigTlvType::MultiNodeMode => 0x3, 1651 AppConfigTlvType::ChannelNumber => 0x4, 1652 AppConfigTlvType::NoOfControlee => 0x5, 1653 AppConfigTlvType::DeviceMacAddress => 0x6, 1654 AppConfigTlvType::DstMacAddress => 0x7, 1655 AppConfigTlvType::SlotDuration => 0x8, 1656 AppConfigTlvType::RangingDuration => 0x9, 1657 AppConfigTlvType::StsIndex => 0xa, 1658 AppConfigTlvType::MacFcsType => 0xb, 1659 AppConfigTlvType::RangingRoundControl => 0xc, 1660 AppConfigTlvType::AoaResultReq => 0xd, 1661 AppConfigTlvType::RngDataNtf => 0xe, 1662 AppConfigTlvType::RngDataNtfProximityNear => 0xf, 1663 AppConfigTlvType::RngDataNtfProximityFar => 0x10, 1664 AppConfigTlvType::DeviceRole => 0x11, 1665 AppConfigTlvType::RframeConfig => 0x12, 1666 AppConfigTlvType::RssiReporting => 0x13, 1667 AppConfigTlvType::PreambleCodeIndex => 0x14, 1668 AppConfigTlvType::SfdId => 0x15, 1669 AppConfigTlvType::PsduDataRate => 0x16, 1670 AppConfigTlvType::PreambleDuration => 0x17, 1671 AppConfigTlvType::LinkLayerMode => 0x18, 1672 AppConfigTlvType::DataRepetitionCount => 0x19, 1673 AppConfigTlvType::RangingTimeStruct => 0x1a, 1674 AppConfigTlvType::SlotsPerRr => 0x1b, 1675 AppConfigTlvType::TxAdaptivePayloadPower => 0x1c, 1676 AppConfigTlvType::RngDataNtfAoaBound => 0x1d, 1677 AppConfigTlvType::ResponderSlotIndex => 0x1e, 1678 AppConfigTlvType::PrfMode => 0x1f, 1679 AppConfigTlvType::CapSizeRange => 0x20, 1680 AppConfigTlvType::TxJitterWindowSize => 0x21, 1681 AppConfigTlvType::ScheduledMode => 0x22, 1682 AppConfigTlvType::KeyRotation => 0x23, 1683 AppConfigTlvType::KeyRotationRate => 0x24, 1684 AppConfigTlvType::SessionPriority => 0x25, 1685 AppConfigTlvType::MacAddressMode => 0x26, 1686 AppConfigTlvType::VendorId => 0x27, 1687 AppConfigTlvType::StaticStsIv => 0x28, 1688 AppConfigTlvType::NumberOfStsSegments => 0x29, 1689 AppConfigTlvType::MaxRrRetry => 0x2a, 1690 AppConfigTlvType::UwbInitiationTime => 0x2b, 1691 AppConfigTlvType::HoppingMode => 0x2c, 1692 AppConfigTlvType::BlockStrideLength => 0x2d, 1693 AppConfigTlvType::ResultReportConfig => 0x2e, 1694 AppConfigTlvType::InBandTerminationAttemptCount => 0x2f, 1695 AppConfigTlvType::SubSessionId => 0x30, 1696 AppConfigTlvType::BprfPhrDataRate => 0x31, 1697 AppConfigTlvType::MaxNumberOfMeasurements => 0x32, 1698 AppConfigTlvType::UlTdoaTxInterval => 0x33, 1699 AppConfigTlvType::UlTdoaRandomWindow => 0x34, 1700 AppConfigTlvType::StsLength => 0x35, 1701 AppConfigTlvType::SuspendRangingRounds => 0x36, 1702 AppConfigTlvType::UlTdoaNtfReportConfig => 0x37, 1703 AppConfigTlvType::UlTdoaDeviceId => 0x38, 1704 AppConfigTlvType::UlTdoaTxTimestamp => 0x39, 1705 AppConfigTlvType::MinFramesPerRr => 0x3a, 1706 AppConfigTlvType::MtuSize => 0x3b, 1707 AppConfigTlvType::InterFrameInterval => 0x3c, 1708 AppConfigTlvType::DlTdoaRangingMethod => 0x3d, 1709 AppConfigTlvType::DlTdoaTxTimestampConf => 0x3e, 1710 AppConfigTlvType::DlTdoaHopCount => 0x3f, 1711 AppConfigTlvType::DlTdoaAnchorCfo => 0x40, 1712 AppConfigTlvType::DlTdoaAnchorLocation => 0x41, 1713 AppConfigTlvType::DlTdoaTxActiveRangingRounds => 0x42, 1714 AppConfigTlvType::DlTdoaBlockStriding => 0x43, 1715 AppConfigTlvType::DlTdoaTimeReferenceAnchor => 0x44, 1716 AppConfigTlvType::SessionKey => 0x45, 1717 AppConfigTlvType::SubsessionKey => 0x46, 1718 AppConfigTlvType::SessionDataTransferStatusNtfConfig => 0x47, 1719 AppConfigTlvType::SessionTimeBase => 0x48, 1720 AppConfigTlvType::DlTdoaResponderTof => 0x49, 1721 AppConfigTlvType::SecureRangingNefaLevel => 0x4a, 1722 AppConfigTlvType::SecureRangingCswLength => 0x4b, 1723 AppConfigTlvType::ApplicationDataEndpoint => 0x4c, 1724 AppConfigTlvType::OwrAoaMeasurementNtfPeriod => 0x4d, 1725 AppConfigTlvType::RfuAppCfgTlvTypeRange(Private(value)) => *value, 1726 AppConfigTlvType::CccHopModeKey => 0xa0, 1727 AppConfigTlvType::CccUwbTime0 => 0xa1, 1728 AppConfigTlvType::CccRangingProtocolVer => 0xa3, 1729 AppConfigTlvType::CccUwbConfigId => 0xa4, 1730 AppConfigTlvType::CccPulseshapeCombo => 0xa5, 1731 AppConfigTlvType::CccUrskTtl => 0xa6, 1732 AppConfigTlvType::CccLastIndexUsed => 0xa8, 1733 AppConfigTlvType::AliroMacMode => 0xa9, 1734 AppConfigTlvType::VendorSpecificAppCfgTlvTypeRange1(Private(value)) => *value, 1735 AppConfigTlvType::RfuAppCfgTlvTypeRange4(Private(value)) => *value, 1736 AppConfigTlvType::NbOfRangeMeasurements => 0xe3, 1737 AppConfigTlvType::NbOfAzimuthMeasurements => 0xe4, 1738 AppConfigTlvType::NbOfElevationMeasurements => 0xe5, 1739 AppConfigTlvType::EnableDiagnostics => 0xe8, 1740 AppConfigTlvType::DiagramsFrameReportsFields => 0xe9, 1741 AppConfigTlvType::AntennaMode => 0xea, 1742 AppConfigTlvType::VendorSpecificAppCfgTlvTypeRange2(Private(value)) => *value, 1743 } 1744 } 1745 } 1746 impl From<AppConfigTlvType> for u8 { from(value: AppConfigTlvType) -> Self1747 fn from(value: AppConfigTlvType) -> Self { 1748 (&value).into() 1749 } 1750 } 1751 impl From<AppConfigTlvType> for i16 { from(value: AppConfigTlvType) -> Self1752 fn from(value: AppConfigTlvType) -> Self { 1753 u8::from(value) as Self 1754 } 1755 } 1756 impl From<AppConfigTlvType> for i32 { from(value: AppConfigTlvType) -> Self1757 fn from(value: AppConfigTlvType) -> Self { 1758 u8::from(value) as Self 1759 } 1760 } 1761 impl From<AppConfigTlvType> for i64 { from(value: AppConfigTlvType) -> Self1762 fn from(value: AppConfigTlvType) -> Self { 1763 u8::from(value) as Self 1764 } 1765 } 1766 impl From<AppConfigTlvType> for u16 { from(value: AppConfigTlvType) -> Self1767 fn from(value: AppConfigTlvType) -> Self { 1768 u8::from(value) as Self 1769 } 1770 } 1771 impl From<AppConfigTlvType> for u32 { from(value: AppConfigTlvType) -> Self1772 fn from(value: AppConfigTlvType) -> Self { 1773 u8::from(value) as Self 1774 } 1775 } 1776 impl From<AppConfigTlvType> for u64 { from(value: AppConfigTlvType) -> Self1777 fn from(value: AppConfigTlvType) -> Self { 1778 u8::from(value) as Self 1779 } 1780 } 1781 #[repr(u64)] 1782 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 1783 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 1784 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 1785 pub enum FrameReportTlvType { 1786 Rssi = 0x0, 1787 Aoa = 0x1, 1788 Cir = 0x2, 1789 SegmentMetrics = 0x6, 1790 } 1791 impl TryFrom<u8> for FrameReportTlvType { 1792 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>1793 fn try_from(value: u8) -> Result<Self, Self::Error> { 1794 match value { 1795 0x0 => Ok(FrameReportTlvType::Rssi), 1796 0x1 => Ok(FrameReportTlvType::Aoa), 1797 0x2 => Ok(FrameReportTlvType::Cir), 1798 0x6 => Ok(FrameReportTlvType::SegmentMetrics), 1799 _ => Err(value), 1800 } 1801 } 1802 } 1803 impl From<&FrameReportTlvType> for u8 { from(value: &FrameReportTlvType) -> Self1804 fn from(value: &FrameReportTlvType) -> Self { 1805 match value { 1806 FrameReportTlvType::Rssi => 0x0, 1807 FrameReportTlvType::Aoa => 0x1, 1808 FrameReportTlvType::Cir => 0x2, 1809 FrameReportTlvType::SegmentMetrics => 0x6, 1810 } 1811 } 1812 } 1813 impl From<FrameReportTlvType> for u8 { from(value: FrameReportTlvType) -> Self1814 fn from(value: FrameReportTlvType) -> Self { 1815 (&value).into() 1816 } 1817 } 1818 impl From<FrameReportTlvType> for i16 { from(value: FrameReportTlvType) -> Self1819 fn from(value: FrameReportTlvType) -> Self { 1820 u8::from(value) as Self 1821 } 1822 } 1823 impl From<FrameReportTlvType> for i32 { from(value: FrameReportTlvType) -> Self1824 fn from(value: FrameReportTlvType) -> Self { 1825 u8::from(value) as Self 1826 } 1827 } 1828 impl From<FrameReportTlvType> for i64 { from(value: FrameReportTlvType) -> Self1829 fn from(value: FrameReportTlvType) -> Self { 1830 u8::from(value) as Self 1831 } 1832 } 1833 impl From<FrameReportTlvType> for u16 { from(value: FrameReportTlvType) -> Self1834 fn from(value: FrameReportTlvType) -> Self { 1835 u8::from(value) as Self 1836 } 1837 } 1838 impl From<FrameReportTlvType> for u32 { from(value: FrameReportTlvType) -> Self1839 fn from(value: FrameReportTlvType) -> Self { 1840 u8::from(value) as Self 1841 } 1842 } 1843 impl From<FrameReportTlvType> for u64 { from(value: FrameReportTlvType) -> Self1844 fn from(value: FrameReportTlvType) -> Self { 1845 u8::from(value) as Self 1846 } 1847 } 1848 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 1849 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 1850 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 1851 pub enum CapTlvType { 1852 SupportedV1FiraPhyVersionRangeV2MaxMessageSize, 1853 SupportedV1FiraMacVersionRangeV2MaxDataPayloadSize, 1854 SupportedV1DeviceRolesV2FiraPhyVersionRange, 1855 SupportedV1RangingMethodV2FiraMacVersionRange, 1856 SupportedV1StsConfigV2DeviceType, 1857 SupportedV1MultiNodeModesV2DeviceRoles, 1858 SupportedV1RangingTimeStructV2RangingMethod, 1859 SupportedV1ScheduledModeV2StsConfig, 1860 SupportedV1HoppingModeV2MultiNodeMode, 1861 SupportedV1BlockStridingV2RangingTimeStruct, 1862 SupportedV1UwbInitiationTimeV2ScheduleMode, 1863 SupportedV1ChannelsV2HoppingMode, 1864 SupportedV1RframeConfigV2BlockStriding, 1865 SupportedV1CcConstraintLengthV2UwbInitiationTime, 1866 SupportedV1BprfParameterSetsV2Channels, 1867 SupportedV1HprfParameterSetsV2RframeConfig, 1868 SupportedV1AoaV2CcConstraintLength, 1869 SupportedV1ExtendedMacAddressV2BprfParameterSets, 1870 SupportedV1MaxMessageSizeV2HprfParameterSets, 1871 SupportedV1MaxDataPacketPayloadSizeV2AoaSupport, 1872 SupportedV2ExtendedMacAddress, 1873 SupportedV2Assigned, 1874 SupportedV2SessionKeyLength, 1875 SupportedV2DtAnchorMaxActiveRr, 1876 SupportedV2DtTagMaxActiveRr, 1877 SupportedV2DtTagBlockShipping, 1878 SupportedV2PsduLengthSupport, 1879 RfuCapTlvTypeRange1(Private<u8>), 1880 CccSupportedChapsPerSlot, 1881 CccSupportedSyncCodes, 1882 CccSupportedHoppingConfigModesAndSequences, 1883 CccSupportedChannels, 1884 CccSupportedVersions, 1885 CccSupportedUwbConfigs, 1886 CccSupportedPulseShapeCombos, 1887 CccSupportedRanMultiplier, 1888 CccSupportedMaxRangingSessionNumber, 1889 CccSupportedMinUwbInitiationTimeMs, 1890 CccPrioritizedChannelList, 1891 CccSupportedUwbsMaxPpm, 1892 AliroSupportedMacModes, 1893 RadarSupport, 1894 VendorSpecificCapTlvTypeRange1(Private<u8>), 1895 SupportedPowerStats, 1896 VendorSpecificCapTlvTypeRange2(Private<u8>), 1897 RfuCapTlvTypeRange2(Private<u8>), 1898 SupportedAoaResultReqAntennaInterleaving, 1899 SupportedMinRangingIntervalMs, 1900 SupportedRangeDataNtfConfig, 1901 SupportedRssiReporting, 1902 SupportedDiagnostics, 1903 SupportedMinSlotDurationRstu, 1904 SupportedMaxRangingSessionNumber, 1905 VendorSpecificCapTlvTypeRange3(Private<u8>), 1906 } 1907 impl TryFrom<u8> for CapTlvType { 1908 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>1909 fn try_from(value: u8) -> Result<Self, Self::Error> { 1910 match value { 1911 0x0 => Ok(CapTlvType::SupportedV1FiraPhyVersionRangeV2MaxMessageSize), 1912 0x1 => Ok(CapTlvType::SupportedV1FiraMacVersionRangeV2MaxDataPayloadSize), 1913 0x2 => Ok(CapTlvType::SupportedV1DeviceRolesV2FiraPhyVersionRange), 1914 0x3 => Ok(CapTlvType::SupportedV1RangingMethodV2FiraMacVersionRange), 1915 0x4 => Ok(CapTlvType::SupportedV1StsConfigV2DeviceType), 1916 0x5 => Ok(CapTlvType::SupportedV1MultiNodeModesV2DeviceRoles), 1917 0x6 => Ok(CapTlvType::SupportedV1RangingTimeStructV2RangingMethod), 1918 0x7 => Ok(CapTlvType::SupportedV1ScheduledModeV2StsConfig), 1919 0x8 => Ok(CapTlvType::SupportedV1HoppingModeV2MultiNodeMode), 1920 0x9 => Ok(CapTlvType::SupportedV1BlockStridingV2RangingTimeStruct), 1921 0xa => Ok(CapTlvType::SupportedV1UwbInitiationTimeV2ScheduleMode), 1922 0xb => Ok(CapTlvType::SupportedV1ChannelsV2HoppingMode), 1923 0xc => Ok(CapTlvType::SupportedV1RframeConfigV2BlockStriding), 1924 0xd => Ok(CapTlvType::SupportedV1CcConstraintLengthV2UwbInitiationTime), 1925 0xe => Ok(CapTlvType::SupportedV1BprfParameterSetsV2Channels), 1926 0xf => Ok(CapTlvType::SupportedV1HprfParameterSetsV2RframeConfig), 1927 0x10 => Ok(CapTlvType::SupportedV1AoaV2CcConstraintLength), 1928 0x11 => Ok(CapTlvType::SupportedV1ExtendedMacAddressV2BprfParameterSets), 1929 0x12 => Ok(CapTlvType::SupportedV1MaxMessageSizeV2HprfParameterSets), 1930 0x13 => Ok(CapTlvType::SupportedV1MaxDataPacketPayloadSizeV2AoaSupport), 1931 0x14 => Ok(CapTlvType::SupportedV2ExtendedMacAddress), 1932 0x15 => Ok(CapTlvType::SupportedV2Assigned), 1933 0x16 => Ok(CapTlvType::SupportedV2SessionKeyLength), 1934 0x17 => Ok(CapTlvType::SupportedV2DtAnchorMaxActiveRr), 1935 0x18 => Ok(CapTlvType::SupportedV2DtTagMaxActiveRr), 1936 0x19 => Ok(CapTlvType::SupportedV2DtTagBlockShipping), 1937 0x1a => Ok(CapTlvType::SupportedV2PsduLengthSupport), 1938 0x1b..=0x9f => Ok(CapTlvType::RfuCapTlvTypeRange1(Private(value))), 1939 0xa0 => Ok(CapTlvType::CccSupportedChapsPerSlot), 1940 0xa1 => Ok(CapTlvType::CccSupportedSyncCodes), 1941 0xa2 => Ok(CapTlvType::CccSupportedHoppingConfigModesAndSequences), 1942 0xa3 => Ok(CapTlvType::CccSupportedChannels), 1943 0xa4 => Ok(CapTlvType::CccSupportedVersions), 1944 0xa5 => Ok(CapTlvType::CccSupportedUwbConfigs), 1945 0xa6 => Ok(CapTlvType::CccSupportedPulseShapeCombos), 1946 0xa7 => Ok(CapTlvType::CccSupportedRanMultiplier), 1947 0xa8 => Ok(CapTlvType::CccSupportedMaxRangingSessionNumber), 1948 0xa9 => Ok(CapTlvType::CccSupportedMinUwbInitiationTimeMs), 1949 0xaa => Ok(CapTlvType::CccPrioritizedChannelList), 1950 0xab => Ok(CapTlvType::CccSupportedUwbsMaxPpm), 1951 0xac => Ok(CapTlvType::AliroSupportedMacModes), 1952 0xb0 => Ok(CapTlvType::RadarSupport), 1953 0xa0..=0xbf => Ok(CapTlvType::VendorSpecificCapTlvTypeRange1(Private(value))), 1954 0xc0 => Ok(CapTlvType::SupportedPowerStats), 1955 0xc1..=0xdf => Ok(CapTlvType::VendorSpecificCapTlvTypeRange2(Private(value))), 1956 0xe0..=0xe2 => Ok(CapTlvType::RfuCapTlvTypeRange2(Private(value))), 1957 0xe3 => Ok(CapTlvType::SupportedAoaResultReqAntennaInterleaving), 1958 0xe4 => Ok(CapTlvType::SupportedMinRangingIntervalMs), 1959 0xe5 => Ok(CapTlvType::SupportedRangeDataNtfConfig), 1960 0xe6 => Ok(CapTlvType::SupportedRssiReporting), 1961 0xe7 => Ok(CapTlvType::SupportedDiagnostics), 1962 0xe8 => Ok(CapTlvType::SupportedMinSlotDurationRstu), 1963 0xe9 => Ok(CapTlvType::SupportedMaxRangingSessionNumber), 1964 0xe3..=0xff => Ok(CapTlvType::VendorSpecificCapTlvTypeRange3(Private(value))), 1965 } 1966 } 1967 } 1968 impl From<&CapTlvType> for u8 { from(value: &CapTlvType) -> Self1969 fn from(value: &CapTlvType) -> Self { 1970 match value { 1971 CapTlvType::SupportedV1FiraPhyVersionRangeV2MaxMessageSize => 0x0, 1972 CapTlvType::SupportedV1FiraMacVersionRangeV2MaxDataPayloadSize => 0x1, 1973 CapTlvType::SupportedV1DeviceRolesV2FiraPhyVersionRange => 0x2, 1974 CapTlvType::SupportedV1RangingMethodV2FiraMacVersionRange => 0x3, 1975 CapTlvType::SupportedV1StsConfigV2DeviceType => 0x4, 1976 CapTlvType::SupportedV1MultiNodeModesV2DeviceRoles => 0x5, 1977 CapTlvType::SupportedV1RangingTimeStructV2RangingMethod => 0x6, 1978 CapTlvType::SupportedV1ScheduledModeV2StsConfig => 0x7, 1979 CapTlvType::SupportedV1HoppingModeV2MultiNodeMode => 0x8, 1980 CapTlvType::SupportedV1BlockStridingV2RangingTimeStruct => 0x9, 1981 CapTlvType::SupportedV1UwbInitiationTimeV2ScheduleMode => 0xa, 1982 CapTlvType::SupportedV1ChannelsV2HoppingMode => 0xb, 1983 CapTlvType::SupportedV1RframeConfigV2BlockStriding => 0xc, 1984 CapTlvType::SupportedV1CcConstraintLengthV2UwbInitiationTime => 0xd, 1985 CapTlvType::SupportedV1BprfParameterSetsV2Channels => 0xe, 1986 CapTlvType::SupportedV1HprfParameterSetsV2RframeConfig => 0xf, 1987 CapTlvType::SupportedV1AoaV2CcConstraintLength => 0x10, 1988 CapTlvType::SupportedV1ExtendedMacAddressV2BprfParameterSets => 0x11, 1989 CapTlvType::SupportedV1MaxMessageSizeV2HprfParameterSets => 0x12, 1990 CapTlvType::SupportedV1MaxDataPacketPayloadSizeV2AoaSupport => 0x13, 1991 CapTlvType::SupportedV2ExtendedMacAddress => 0x14, 1992 CapTlvType::SupportedV2Assigned => 0x15, 1993 CapTlvType::SupportedV2SessionKeyLength => 0x16, 1994 CapTlvType::SupportedV2DtAnchorMaxActiveRr => 0x17, 1995 CapTlvType::SupportedV2DtTagMaxActiveRr => 0x18, 1996 CapTlvType::SupportedV2DtTagBlockShipping => 0x19, 1997 CapTlvType::SupportedV2PsduLengthSupport => 0x1a, 1998 CapTlvType::RfuCapTlvTypeRange1(Private(value)) => *value, 1999 CapTlvType::CccSupportedChapsPerSlot => 0xa0, 2000 CapTlvType::CccSupportedSyncCodes => 0xa1, 2001 CapTlvType::CccSupportedHoppingConfigModesAndSequences => 0xa2, 2002 CapTlvType::CccSupportedChannels => 0xa3, 2003 CapTlvType::CccSupportedVersions => 0xa4, 2004 CapTlvType::CccSupportedUwbConfigs => 0xa5, 2005 CapTlvType::CccSupportedPulseShapeCombos => 0xa6, 2006 CapTlvType::CccSupportedRanMultiplier => 0xa7, 2007 CapTlvType::CccSupportedMaxRangingSessionNumber => 0xa8, 2008 CapTlvType::CccSupportedMinUwbInitiationTimeMs => 0xa9, 2009 CapTlvType::CccPrioritizedChannelList => 0xaa, 2010 CapTlvType::CccSupportedUwbsMaxPpm => 0xab, 2011 CapTlvType::AliroSupportedMacModes => 0xac, 2012 CapTlvType::RadarSupport => 0xb0, 2013 CapTlvType::VendorSpecificCapTlvTypeRange1(Private(value)) => *value, 2014 CapTlvType::SupportedPowerStats => 0xc0, 2015 CapTlvType::VendorSpecificCapTlvTypeRange2(Private(value)) => *value, 2016 CapTlvType::RfuCapTlvTypeRange2(Private(value)) => *value, 2017 CapTlvType::SupportedAoaResultReqAntennaInterleaving => 0xe3, 2018 CapTlvType::SupportedMinRangingIntervalMs => 0xe4, 2019 CapTlvType::SupportedRangeDataNtfConfig => 0xe5, 2020 CapTlvType::SupportedRssiReporting => 0xe6, 2021 CapTlvType::SupportedDiagnostics => 0xe7, 2022 CapTlvType::SupportedMinSlotDurationRstu => 0xe8, 2023 CapTlvType::SupportedMaxRangingSessionNumber => 0xe9, 2024 CapTlvType::VendorSpecificCapTlvTypeRange3(Private(value)) => *value, 2025 } 2026 } 2027 } 2028 impl From<CapTlvType> for u8 { from(value: CapTlvType) -> Self2029 fn from(value: CapTlvType) -> Self { 2030 (&value).into() 2031 } 2032 } 2033 impl From<CapTlvType> for i16 { from(value: CapTlvType) -> Self2034 fn from(value: CapTlvType) -> Self { 2035 u8::from(value) as Self 2036 } 2037 } 2038 impl From<CapTlvType> for i32 { from(value: CapTlvType) -> Self2039 fn from(value: CapTlvType) -> Self { 2040 u8::from(value) as Self 2041 } 2042 } 2043 impl From<CapTlvType> for i64 { from(value: CapTlvType) -> Self2044 fn from(value: CapTlvType) -> Self { 2045 u8::from(value) as Self 2046 } 2047 } 2048 impl From<CapTlvType> for u16 { from(value: CapTlvType) -> Self2049 fn from(value: CapTlvType) -> Self { 2050 u8::from(value) as Self 2051 } 2052 } 2053 impl From<CapTlvType> for u32 { from(value: CapTlvType) -> Self2054 fn from(value: CapTlvType) -> Self { 2055 u8::from(value) as Self 2056 } 2057 } 2058 impl From<CapTlvType> for u64 { from(value: CapTlvType) -> Self2059 fn from(value: CapTlvType) -> Self { 2060 u8::from(value) as Self 2061 } 2062 } 2063 #[repr(u64)] 2064 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 2065 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2066 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 2067 pub enum AoaResultReqType { 2068 AoaDisable = 0x0, 2069 AoaEnable = 0x1, 2070 AoaEnableAzimuth = 0x2, 2071 AoaEnableElevation = 0x3, 2072 AoaEnableInterleaved = 0xf0, 2073 } 2074 impl TryFrom<u8> for AoaResultReqType { 2075 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>2076 fn try_from(value: u8) -> Result<Self, Self::Error> { 2077 match value { 2078 0x0 => Ok(AoaResultReqType::AoaDisable), 2079 0x1 => Ok(AoaResultReqType::AoaEnable), 2080 0x2 => Ok(AoaResultReqType::AoaEnableAzimuth), 2081 0x3 => Ok(AoaResultReqType::AoaEnableElevation), 2082 0xf0 => Ok(AoaResultReqType::AoaEnableInterleaved), 2083 _ => Err(value), 2084 } 2085 } 2086 } 2087 impl From<&AoaResultReqType> for u8 { from(value: &AoaResultReqType) -> Self2088 fn from(value: &AoaResultReqType) -> Self { 2089 match value { 2090 AoaResultReqType::AoaDisable => 0x0, 2091 AoaResultReqType::AoaEnable => 0x1, 2092 AoaResultReqType::AoaEnableAzimuth => 0x2, 2093 AoaResultReqType::AoaEnableElevation => 0x3, 2094 AoaResultReqType::AoaEnableInterleaved => 0xf0, 2095 } 2096 } 2097 } 2098 impl From<AoaResultReqType> for u8 { from(value: AoaResultReqType) -> Self2099 fn from(value: AoaResultReqType) -> Self { 2100 (&value).into() 2101 } 2102 } 2103 impl From<AoaResultReqType> for i16 { from(value: AoaResultReqType) -> Self2104 fn from(value: AoaResultReqType) -> Self { 2105 u8::from(value) as Self 2106 } 2107 } 2108 impl From<AoaResultReqType> for i32 { from(value: AoaResultReqType) -> Self2109 fn from(value: AoaResultReqType) -> Self { 2110 u8::from(value) as Self 2111 } 2112 } 2113 impl From<AoaResultReqType> for i64 { from(value: AoaResultReqType) -> Self2114 fn from(value: AoaResultReqType) -> Self { 2115 u8::from(value) as Self 2116 } 2117 } 2118 impl From<AoaResultReqType> for u16 { from(value: AoaResultReqType) -> Self2119 fn from(value: AoaResultReqType) -> Self { 2120 u8::from(value) as Self 2121 } 2122 } 2123 impl From<AoaResultReqType> for u32 { from(value: AoaResultReqType) -> Self2124 fn from(value: AoaResultReqType) -> Self { 2125 u8::from(value) as Self 2126 } 2127 } 2128 impl From<AoaResultReqType> for u64 { from(value: AoaResultReqType) -> Self2129 fn from(value: AoaResultReqType) -> Self { 2130 u8::from(value) as Self 2131 } 2132 } 2133 #[repr(u64)] 2134 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 2135 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2136 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 2137 pub enum DeviceState { 2138 DeviceStateReady = 0x1, 2139 DeviceStateActive = 0x2, 2140 DeviceStateError = 0xff, 2141 } 2142 impl TryFrom<u8> for DeviceState { 2143 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>2144 fn try_from(value: u8) -> Result<Self, Self::Error> { 2145 match value { 2146 0x1 => Ok(DeviceState::DeviceStateReady), 2147 0x2 => Ok(DeviceState::DeviceStateActive), 2148 0xff => Ok(DeviceState::DeviceStateError), 2149 _ => Err(value), 2150 } 2151 } 2152 } 2153 impl From<&DeviceState> for u8 { from(value: &DeviceState) -> Self2154 fn from(value: &DeviceState) -> Self { 2155 match value { 2156 DeviceState::DeviceStateReady => 0x1, 2157 DeviceState::DeviceStateActive => 0x2, 2158 DeviceState::DeviceStateError => 0xff, 2159 } 2160 } 2161 } 2162 impl From<DeviceState> for u8 { from(value: DeviceState) -> Self2163 fn from(value: DeviceState) -> Self { 2164 (&value).into() 2165 } 2166 } 2167 impl From<DeviceState> for i16 { from(value: DeviceState) -> Self2168 fn from(value: DeviceState) -> Self { 2169 u8::from(value) as Self 2170 } 2171 } 2172 impl From<DeviceState> for i32 { from(value: DeviceState) -> Self2173 fn from(value: DeviceState) -> Self { 2174 u8::from(value) as Self 2175 } 2176 } 2177 impl From<DeviceState> for i64 { from(value: DeviceState) -> Self2178 fn from(value: DeviceState) -> Self { 2179 u8::from(value) as Self 2180 } 2181 } 2182 impl From<DeviceState> for u16 { from(value: DeviceState) -> Self2183 fn from(value: DeviceState) -> Self { 2184 u8::from(value) as Self 2185 } 2186 } 2187 impl From<DeviceState> for u32 { from(value: DeviceState) -> Self2188 fn from(value: DeviceState) -> Self { 2189 u8::from(value) as Self 2190 } 2191 } 2192 impl From<DeviceState> for u64 { from(value: DeviceState) -> Self2193 fn from(value: DeviceState) -> Self { 2194 u8::from(value) as Self 2195 } 2196 } 2197 #[repr(u64)] 2198 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 2199 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2200 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 2201 pub enum SessionState { 2202 SessionStateInit = 0x0, 2203 SessionStateDeinit = 0x1, 2204 SessionStateActive = 0x2, 2205 SessionStateIdle = 0x3, 2206 } 2207 impl TryFrom<u8> for SessionState { 2208 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>2209 fn try_from(value: u8) -> Result<Self, Self::Error> { 2210 match value { 2211 0x0 => Ok(SessionState::SessionStateInit), 2212 0x1 => Ok(SessionState::SessionStateDeinit), 2213 0x2 => Ok(SessionState::SessionStateActive), 2214 0x3 => Ok(SessionState::SessionStateIdle), 2215 _ => Err(value), 2216 } 2217 } 2218 } 2219 impl From<&SessionState> for u8 { from(value: &SessionState) -> Self2220 fn from(value: &SessionState) -> Self { 2221 match value { 2222 SessionState::SessionStateInit => 0x0, 2223 SessionState::SessionStateDeinit => 0x1, 2224 SessionState::SessionStateActive => 0x2, 2225 SessionState::SessionStateIdle => 0x3, 2226 } 2227 } 2228 } 2229 impl From<SessionState> for u8 { from(value: SessionState) -> Self2230 fn from(value: SessionState) -> Self { 2231 (&value).into() 2232 } 2233 } 2234 impl From<SessionState> for i16 { from(value: SessionState) -> Self2235 fn from(value: SessionState) -> Self { 2236 u8::from(value) as Self 2237 } 2238 } 2239 impl From<SessionState> for i32 { from(value: SessionState) -> Self2240 fn from(value: SessionState) -> Self { 2241 u8::from(value) as Self 2242 } 2243 } 2244 impl From<SessionState> for i64 { from(value: SessionState) -> Self2245 fn from(value: SessionState) -> Self { 2246 u8::from(value) as Self 2247 } 2248 } 2249 impl From<SessionState> for u16 { from(value: SessionState) -> Self2250 fn from(value: SessionState) -> Self { 2251 u8::from(value) as Self 2252 } 2253 } 2254 impl From<SessionState> for u32 { from(value: SessionState) -> Self2255 fn from(value: SessionState) -> Self { 2256 u8::from(value) as Self 2257 } 2258 } 2259 impl From<SessionState> for u64 { from(value: SessionState) -> Self2260 fn from(value: SessionState) -> Self { 2261 u8::from(value) as Self 2262 } 2263 } 2264 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 2265 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2266 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 2267 pub enum ReasonCode { 2268 StateChangeWithSessionManagementCommands, 2269 MaxRangingRoundRetryCountReached, 2270 MaxNumberOfMeasurementsReached, 2271 SessionSuspendedDueToInbandSignal, 2272 SessionResumedDueToInbandSignal, 2273 SessionStoppedDueToInbandSignal, 2274 RfuReasonCodeRange1(Private<u8>), 2275 ErrorInvalidUlTdoaRandomWindow, 2276 ErrorMinRframesPerRrNotSupported, 2277 ErrorInterFrameIntervalNotSupported, 2278 ErrorSlotLengthNotSupported, 2279 ErrorInsufficientSlotsPerRr, 2280 ErrorMacAddressModeNotSupported, 2281 ErrorInvalidRangingDuration, 2282 ErrorInvalidStsConfig, 2283 ErrorInvalidRframeConfig, 2284 ErrorHusNotEnoughSlots, 2285 ErrorHusCfpPhaseTooShort, 2286 ErrorHusCapPhaseTooShort, 2287 ErrorHusOthers, 2288 ErrorStatusSessionKeyNotFound, 2289 ErrorStatusSubSessionKeyNotFound, 2290 ErrorInvalidPreambleCodeIndex, 2291 ErrorInvalidSfdId, 2292 ErrorInvalidPsduDataRate, 2293 ErrorInvalidPhrDataRate, 2294 ErrorInvalidPreambleDuration, 2295 ErrorInvalidStsLength, 2296 ErrorInvalidNumOfStsSegments, 2297 ErrorInvalidNumOfControlees, 2298 ErrorMaxRangingReplyTimeExceeded, 2299 ErrorInvalidDstAddressList, 2300 ErrorInvalidOrNotFoundSubSessionId, 2301 ErrorInvalidResultReportConfig, 2302 ErrorInvalidRangingRoundControlConfig, 2303 ErrorInvalidRangingRoundUsage, 2304 ErrorInvalidMultiNodeMode, 2305 ErrorRdsFetchFailure, 2306 ErrorRefUwbSessionDoesNotExist, 2307 ErrorRefUwbSessionRangingDurationMismatch, 2308 ErrorRefUwbSessionInvalidOffsetTime, 2309 ErrorRefUwbSessionLost, 2310 ErrorDtAnchorRangingRoundsNotConfigured, 2311 ErrorDtTagRangingRoundsNotConfigured, 2312 RfuReasonCodeRange2(Private<u8>), 2313 ErrorInvalidChannelWithAoa, 2314 ErrorStoppedDueToOtherSessionConflict, 2315 VendorSpecificReasonCodeRange1(Private<u8>), 2316 SessionStoppedDueToMaxStsIndexValue, 2317 VendorSpecificReasonCodeRange2(Private<u8>), 2318 VendorSpecificReasonCode2, 2319 } 2320 impl TryFrom<u8> for ReasonCode { 2321 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>2322 fn try_from(value: u8) -> Result<Self, Self::Error> { 2323 match value { 2324 0x0 => Ok(ReasonCode::StateChangeWithSessionManagementCommands), 2325 0x1 => Ok(ReasonCode::MaxRangingRoundRetryCountReached), 2326 0x2 => Ok(ReasonCode::MaxNumberOfMeasurementsReached), 2327 0x3 => Ok(ReasonCode::SessionSuspendedDueToInbandSignal), 2328 0x4 => Ok(ReasonCode::SessionResumedDueToInbandSignal), 2329 0x5 => Ok(ReasonCode::SessionStoppedDueToInbandSignal), 2330 0x6..=0x1c => Ok(ReasonCode::RfuReasonCodeRange1(Private(value))), 2331 0x1d => Ok(ReasonCode::ErrorInvalidUlTdoaRandomWindow), 2332 0x1e => Ok(ReasonCode::ErrorMinRframesPerRrNotSupported), 2333 0x1f => Ok(ReasonCode::ErrorInterFrameIntervalNotSupported), 2334 0x20 => Ok(ReasonCode::ErrorSlotLengthNotSupported), 2335 0x21 => Ok(ReasonCode::ErrorInsufficientSlotsPerRr), 2336 0x22 => Ok(ReasonCode::ErrorMacAddressModeNotSupported), 2337 0x23 => Ok(ReasonCode::ErrorInvalidRangingDuration), 2338 0x24 => Ok(ReasonCode::ErrorInvalidStsConfig), 2339 0x25 => Ok(ReasonCode::ErrorInvalidRframeConfig), 2340 0x26 => Ok(ReasonCode::ErrorHusNotEnoughSlots), 2341 0x27 => Ok(ReasonCode::ErrorHusCfpPhaseTooShort), 2342 0x28 => Ok(ReasonCode::ErrorHusCapPhaseTooShort), 2343 0x29 => Ok(ReasonCode::ErrorHusOthers), 2344 0x2a => Ok(ReasonCode::ErrorStatusSessionKeyNotFound), 2345 0x2b => Ok(ReasonCode::ErrorStatusSubSessionKeyNotFound), 2346 0x2c => Ok(ReasonCode::ErrorInvalidPreambleCodeIndex), 2347 0x2d => Ok(ReasonCode::ErrorInvalidSfdId), 2348 0x2e => Ok(ReasonCode::ErrorInvalidPsduDataRate), 2349 0x2f => Ok(ReasonCode::ErrorInvalidPhrDataRate), 2350 0x30 => Ok(ReasonCode::ErrorInvalidPreambleDuration), 2351 0x31 => Ok(ReasonCode::ErrorInvalidStsLength), 2352 0x32 => Ok(ReasonCode::ErrorInvalidNumOfStsSegments), 2353 0x33 => Ok(ReasonCode::ErrorInvalidNumOfControlees), 2354 0x34 => Ok(ReasonCode::ErrorMaxRangingReplyTimeExceeded), 2355 0x35 => Ok(ReasonCode::ErrorInvalidDstAddressList), 2356 0x36 => Ok(ReasonCode::ErrorInvalidOrNotFoundSubSessionId), 2357 0x37 => Ok(ReasonCode::ErrorInvalidResultReportConfig), 2358 0x38 => Ok(ReasonCode::ErrorInvalidRangingRoundControlConfig), 2359 0x39 => Ok(ReasonCode::ErrorInvalidRangingRoundUsage), 2360 0x3a => Ok(ReasonCode::ErrorInvalidMultiNodeMode), 2361 0x3b => Ok(ReasonCode::ErrorRdsFetchFailure), 2362 0x3c => Ok(ReasonCode::ErrorRefUwbSessionDoesNotExist), 2363 0x3d => Ok(ReasonCode::ErrorRefUwbSessionRangingDurationMismatch), 2364 0x3e => Ok(ReasonCode::ErrorRefUwbSessionInvalidOffsetTime), 2365 0x3f => Ok(ReasonCode::ErrorRefUwbSessionLost), 2366 0x40 => Ok(ReasonCode::ErrorDtAnchorRangingRoundsNotConfigured), 2367 0x41 => Ok(ReasonCode::ErrorDtTagRangingRoundsNotConfigured), 2368 0x40..=0x7f => Ok(ReasonCode::RfuReasonCodeRange2(Private(value))), 2369 0x80 => Ok(ReasonCode::ErrorInvalidChannelWithAoa), 2370 0x81 => Ok(ReasonCode::ErrorStoppedDueToOtherSessionConflict), 2371 0x80..=0xa1 => Ok(ReasonCode::VendorSpecificReasonCodeRange1(Private(value))), 2372 0xa2 => Ok(ReasonCode::SessionStoppedDueToMaxStsIndexValue), 2373 0xa3..=0xfe => Ok(ReasonCode::VendorSpecificReasonCodeRange2(Private(value))), 2374 0xff => Ok(ReasonCode::VendorSpecificReasonCode2), 2375 } 2376 } 2377 } 2378 impl From<&ReasonCode> for u8 { from(value: &ReasonCode) -> Self2379 fn from(value: &ReasonCode) -> Self { 2380 match value { 2381 ReasonCode::StateChangeWithSessionManagementCommands => 0x0, 2382 ReasonCode::MaxRangingRoundRetryCountReached => 0x1, 2383 ReasonCode::MaxNumberOfMeasurementsReached => 0x2, 2384 ReasonCode::SessionSuspendedDueToInbandSignal => 0x3, 2385 ReasonCode::SessionResumedDueToInbandSignal => 0x4, 2386 ReasonCode::SessionStoppedDueToInbandSignal => 0x5, 2387 ReasonCode::RfuReasonCodeRange1(Private(value)) => *value, 2388 ReasonCode::ErrorInvalidUlTdoaRandomWindow => 0x1d, 2389 ReasonCode::ErrorMinRframesPerRrNotSupported => 0x1e, 2390 ReasonCode::ErrorInterFrameIntervalNotSupported => 0x1f, 2391 ReasonCode::ErrorSlotLengthNotSupported => 0x20, 2392 ReasonCode::ErrorInsufficientSlotsPerRr => 0x21, 2393 ReasonCode::ErrorMacAddressModeNotSupported => 0x22, 2394 ReasonCode::ErrorInvalidRangingDuration => 0x23, 2395 ReasonCode::ErrorInvalidStsConfig => 0x24, 2396 ReasonCode::ErrorInvalidRframeConfig => 0x25, 2397 ReasonCode::ErrorHusNotEnoughSlots => 0x26, 2398 ReasonCode::ErrorHusCfpPhaseTooShort => 0x27, 2399 ReasonCode::ErrorHusCapPhaseTooShort => 0x28, 2400 ReasonCode::ErrorHusOthers => 0x29, 2401 ReasonCode::ErrorStatusSessionKeyNotFound => 0x2a, 2402 ReasonCode::ErrorStatusSubSessionKeyNotFound => 0x2b, 2403 ReasonCode::ErrorInvalidPreambleCodeIndex => 0x2c, 2404 ReasonCode::ErrorInvalidSfdId => 0x2d, 2405 ReasonCode::ErrorInvalidPsduDataRate => 0x2e, 2406 ReasonCode::ErrorInvalidPhrDataRate => 0x2f, 2407 ReasonCode::ErrorInvalidPreambleDuration => 0x30, 2408 ReasonCode::ErrorInvalidStsLength => 0x31, 2409 ReasonCode::ErrorInvalidNumOfStsSegments => 0x32, 2410 ReasonCode::ErrorInvalidNumOfControlees => 0x33, 2411 ReasonCode::ErrorMaxRangingReplyTimeExceeded => 0x34, 2412 ReasonCode::ErrorInvalidDstAddressList => 0x35, 2413 ReasonCode::ErrorInvalidOrNotFoundSubSessionId => 0x36, 2414 ReasonCode::ErrorInvalidResultReportConfig => 0x37, 2415 ReasonCode::ErrorInvalidRangingRoundControlConfig => 0x38, 2416 ReasonCode::ErrorInvalidRangingRoundUsage => 0x39, 2417 ReasonCode::ErrorInvalidMultiNodeMode => 0x3a, 2418 ReasonCode::ErrorRdsFetchFailure => 0x3b, 2419 ReasonCode::ErrorRefUwbSessionDoesNotExist => 0x3c, 2420 ReasonCode::ErrorRefUwbSessionRangingDurationMismatch => 0x3d, 2421 ReasonCode::ErrorRefUwbSessionInvalidOffsetTime => 0x3e, 2422 ReasonCode::ErrorRefUwbSessionLost => 0x3f, 2423 ReasonCode::ErrorDtAnchorRangingRoundsNotConfigured => 0x40, 2424 ReasonCode::ErrorDtTagRangingRoundsNotConfigured => 0x41, 2425 ReasonCode::RfuReasonCodeRange2(Private(value)) => *value, 2426 ReasonCode::ErrorInvalidChannelWithAoa => 0x80, 2427 ReasonCode::ErrorStoppedDueToOtherSessionConflict => 0x81, 2428 ReasonCode::VendorSpecificReasonCodeRange1(Private(value)) => *value, 2429 ReasonCode::SessionStoppedDueToMaxStsIndexValue => 0xa2, 2430 ReasonCode::VendorSpecificReasonCodeRange2(Private(value)) => *value, 2431 ReasonCode::VendorSpecificReasonCode2 => 0xff, 2432 } 2433 } 2434 } 2435 impl From<ReasonCode> for u8 { from(value: ReasonCode) -> Self2436 fn from(value: ReasonCode) -> Self { 2437 (&value).into() 2438 } 2439 } 2440 impl From<ReasonCode> for i16 { from(value: ReasonCode) -> Self2441 fn from(value: ReasonCode) -> Self { 2442 u8::from(value) as Self 2443 } 2444 } 2445 impl From<ReasonCode> for i32 { from(value: ReasonCode) -> Self2446 fn from(value: ReasonCode) -> Self { 2447 u8::from(value) as Self 2448 } 2449 } 2450 impl From<ReasonCode> for i64 { from(value: ReasonCode) -> Self2451 fn from(value: ReasonCode) -> Self { 2452 u8::from(value) as Self 2453 } 2454 } 2455 impl From<ReasonCode> for u16 { from(value: ReasonCode) -> Self2456 fn from(value: ReasonCode) -> Self { 2457 u8::from(value) as Self 2458 } 2459 } 2460 impl From<ReasonCode> for u32 { from(value: ReasonCode) -> Self2461 fn from(value: ReasonCode) -> Self { 2462 u8::from(value) as Self 2463 } 2464 } 2465 impl From<ReasonCode> for u64 { from(value: ReasonCode) -> Self2466 fn from(value: ReasonCode) -> Self { 2467 u8::from(value) as Self 2468 } 2469 } 2470 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 2471 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2472 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 2473 pub enum MulticastUpdateStatusCode { 2474 StatusOkMulticastListUpdate, 2475 StatusErrorMulticastListFull, 2476 StatusErrorKeyFetchFail, 2477 StatusErrorSubSessionIdNotFound, 2478 StatusErrorSubSessionKeyNotFound, 2479 StatusErrorSubSessionKeyNotApplicable, 2480 StatusErrorSessionKeyNotFound, 2481 StatusErrorAddressNotFound, 2482 StatusErrorAddressAlreadyPresent, 2483 RfuStatusCodeRange1(Private<u8>), 2484 } 2485 impl TryFrom<u8> for MulticastUpdateStatusCode { 2486 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>2487 fn try_from(value: u8) -> Result<Self, Self::Error> { 2488 match value { 2489 0x0 => Ok(MulticastUpdateStatusCode::StatusOkMulticastListUpdate), 2490 0x1 => Ok(MulticastUpdateStatusCode::StatusErrorMulticastListFull), 2491 0x2 => Ok(MulticastUpdateStatusCode::StatusErrorKeyFetchFail), 2492 0x3 => Ok(MulticastUpdateStatusCode::StatusErrorSubSessionIdNotFound), 2493 0x4 => Ok(MulticastUpdateStatusCode::StatusErrorSubSessionKeyNotFound), 2494 0x5 => Ok(MulticastUpdateStatusCode::StatusErrorSubSessionKeyNotApplicable), 2495 0x6 => Ok(MulticastUpdateStatusCode::StatusErrorSessionKeyNotFound), 2496 0x7 => Ok(MulticastUpdateStatusCode::StatusErrorAddressNotFound), 2497 0x8 => Ok(MulticastUpdateStatusCode::StatusErrorAddressAlreadyPresent), 2498 0x9..=0xff => { 2499 Ok(MulticastUpdateStatusCode::RfuStatusCodeRange1(Private(value))) 2500 } 2501 } 2502 } 2503 } 2504 impl From<&MulticastUpdateStatusCode> for u8 { from(value: &MulticastUpdateStatusCode) -> Self2505 fn from(value: &MulticastUpdateStatusCode) -> Self { 2506 match value { 2507 MulticastUpdateStatusCode::StatusOkMulticastListUpdate => 0x0, 2508 MulticastUpdateStatusCode::StatusErrorMulticastListFull => 0x1, 2509 MulticastUpdateStatusCode::StatusErrorKeyFetchFail => 0x2, 2510 MulticastUpdateStatusCode::StatusErrorSubSessionIdNotFound => 0x3, 2511 MulticastUpdateStatusCode::StatusErrorSubSessionKeyNotFound => 0x4, 2512 MulticastUpdateStatusCode::StatusErrorSubSessionKeyNotApplicable => 0x5, 2513 MulticastUpdateStatusCode::StatusErrorSessionKeyNotFound => 0x6, 2514 MulticastUpdateStatusCode::StatusErrorAddressNotFound => 0x7, 2515 MulticastUpdateStatusCode::StatusErrorAddressAlreadyPresent => 0x8, 2516 MulticastUpdateStatusCode::RfuStatusCodeRange1(Private(value)) => *value, 2517 } 2518 } 2519 } 2520 impl From<MulticastUpdateStatusCode> for u8 { from(value: MulticastUpdateStatusCode) -> Self2521 fn from(value: MulticastUpdateStatusCode) -> Self { 2522 (&value).into() 2523 } 2524 } 2525 impl From<MulticastUpdateStatusCode> for i16 { from(value: MulticastUpdateStatusCode) -> Self2526 fn from(value: MulticastUpdateStatusCode) -> Self { 2527 u8::from(value) as Self 2528 } 2529 } 2530 impl From<MulticastUpdateStatusCode> for i32 { from(value: MulticastUpdateStatusCode) -> Self2531 fn from(value: MulticastUpdateStatusCode) -> Self { 2532 u8::from(value) as Self 2533 } 2534 } 2535 impl From<MulticastUpdateStatusCode> for i64 { from(value: MulticastUpdateStatusCode) -> Self2536 fn from(value: MulticastUpdateStatusCode) -> Self { 2537 u8::from(value) as Self 2538 } 2539 } 2540 impl From<MulticastUpdateStatusCode> for u16 { from(value: MulticastUpdateStatusCode) -> Self2541 fn from(value: MulticastUpdateStatusCode) -> Self { 2542 u8::from(value) as Self 2543 } 2544 } 2545 impl From<MulticastUpdateStatusCode> for u32 { from(value: MulticastUpdateStatusCode) -> Self2546 fn from(value: MulticastUpdateStatusCode) -> Self { 2547 u8::from(value) as Self 2548 } 2549 } 2550 impl From<MulticastUpdateStatusCode> for u64 { from(value: MulticastUpdateStatusCode) -> Self2551 fn from(value: MulticastUpdateStatusCode) -> Self { 2552 u8::from(value) as Self 2553 } 2554 } 2555 #[repr(u64)] 2556 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 2557 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2558 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 2559 pub enum MacAddressIndicator { 2560 ShortAddress = 0x0, 2561 ExtendedAddress = 0x1, 2562 } 2563 impl TryFrom<u8> for MacAddressIndicator { 2564 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>2565 fn try_from(value: u8) -> Result<Self, Self::Error> { 2566 match value { 2567 0x0 => Ok(MacAddressIndicator::ShortAddress), 2568 0x1 => Ok(MacAddressIndicator::ExtendedAddress), 2569 _ => Err(value), 2570 } 2571 } 2572 } 2573 impl From<&MacAddressIndicator> for u8 { from(value: &MacAddressIndicator) -> Self2574 fn from(value: &MacAddressIndicator) -> Self { 2575 match value { 2576 MacAddressIndicator::ShortAddress => 0x0, 2577 MacAddressIndicator::ExtendedAddress => 0x1, 2578 } 2579 } 2580 } 2581 impl From<MacAddressIndicator> for u8 { from(value: MacAddressIndicator) -> Self2582 fn from(value: MacAddressIndicator) -> Self { 2583 (&value).into() 2584 } 2585 } 2586 impl From<MacAddressIndicator> for i16 { from(value: MacAddressIndicator) -> Self2587 fn from(value: MacAddressIndicator) -> Self { 2588 u8::from(value) as Self 2589 } 2590 } 2591 impl From<MacAddressIndicator> for i32 { from(value: MacAddressIndicator) -> Self2592 fn from(value: MacAddressIndicator) -> Self { 2593 u8::from(value) as Self 2594 } 2595 } 2596 impl From<MacAddressIndicator> for i64 { from(value: MacAddressIndicator) -> Self2597 fn from(value: MacAddressIndicator) -> Self { 2598 u8::from(value) as Self 2599 } 2600 } 2601 impl From<MacAddressIndicator> for u16 { from(value: MacAddressIndicator) -> Self2602 fn from(value: MacAddressIndicator) -> Self { 2603 u8::from(value) as Self 2604 } 2605 } 2606 impl From<MacAddressIndicator> for u32 { from(value: MacAddressIndicator) -> Self2607 fn from(value: MacAddressIndicator) -> Self { 2608 u8::from(value) as Self 2609 } 2610 } 2611 impl From<MacAddressIndicator> for u64 { from(value: MacAddressIndicator) -> Self2612 fn from(value: MacAddressIndicator) -> Self { 2613 u8::from(value) as Self 2614 } 2615 } 2616 #[repr(u64)] 2617 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 2618 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2619 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 2620 pub enum SessionType { 2621 FiraRangingSession = 0x0, 2622 FiraRangingAndInBandDataSession = 0x1, 2623 FiraDataTransferSession = 0x2, 2624 FiraRangingOnlyPhase = 0x3, 2625 FiraInBandDataPhase = 0x4, 2626 FiraRangingWithDataPhase = 0x5, 2627 Ccc = 0xa0, 2628 RadarSession = 0xa1, 2629 Aliro = 0xa2, 2630 DeviceTestMode = 0xd0, 2631 } 2632 impl TryFrom<u8> for SessionType { 2633 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>2634 fn try_from(value: u8) -> Result<Self, Self::Error> { 2635 match value { 2636 0x0 => Ok(SessionType::FiraRangingSession), 2637 0x1 => Ok(SessionType::FiraRangingAndInBandDataSession), 2638 0x2 => Ok(SessionType::FiraDataTransferSession), 2639 0x3 => Ok(SessionType::FiraRangingOnlyPhase), 2640 0x4 => Ok(SessionType::FiraInBandDataPhase), 2641 0x5 => Ok(SessionType::FiraRangingWithDataPhase), 2642 0xa0 => Ok(SessionType::Ccc), 2643 0xa1 => Ok(SessionType::RadarSession), 2644 0xa2 => Ok(SessionType::Aliro), 2645 0xd0 => Ok(SessionType::DeviceTestMode), 2646 _ => Err(value), 2647 } 2648 } 2649 } 2650 impl From<&SessionType> for u8 { from(value: &SessionType) -> Self2651 fn from(value: &SessionType) -> Self { 2652 match value { 2653 SessionType::FiraRangingSession => 0x0, 2654 SessionType::FiraRangingAndInBandDataSession => 0x1, 2655 SessionType::FiraDataTransferSession => 0x2, 2656 SessionType::FiraRangingOnlyPhase => 0x3, 2657 SessionType::FiraInBandDataPhase => 0x4, 2658 SessionType::FiraRangingWithDataPhase => 0x5, 2659 SessionType::Ccc => 0xa0, 2660 SessionType::RadarSession => 0xa1, 2661 SessionType::Aliro => 0xa2, 2662 SessionType::DeviceTestMode => 0xd0, 2663 } 2664 } 2665 } 2666 impl From<SessionType> for u8 { from(value: SessionType) -> Self2667 fn from(value: SessionType) -> Self { 2668 (&value).into() 2669 } 2670 } 2671 impl From<SessionType> for i16 { from(value: SessionType) -> Self2672 fn from(value: SessionType) -> Self { 2673 u8::from(value) as Self 2674 } 2675 } 2676 impl From<SessionType> for i32 { from(value: SessionType) -> Self2677 fn from(value: SessionType) -> Self { 2678 u8::from(value) as Self 2679 } 2680 } 2681 impl From<SessionType> for i64 { from(value: SessionType) -> Self2682 fn from(value: SessionType) -> Self { 2683 u8::from(value) as Self 2684 } 2685 } 2686 impl From<SessionType> for u16 { from(value: SessionType) -> Self2687 fn from(value: SessionType) -> Self { 2688 u8::from(value) as Self 2689 } 2690 } 2691 impl From<SessionType> for u32 { from(value: SessionType) -> Self2692 fn from(value: SessionType) -> Self { 2693 u8::from(value) as Self 2694 } 2695 } 2696 impl From<SessionType> for u64 { from(value: SessionType) -> Self2697 fn from(value: SessionType) -> Self { 2698 u8::from(value) as Self 2699 } 2700 } 2701 #[repr(u64)] 2702 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 2703 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2704 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 2705 pub enum MessageType { 2706 Data = 0x0, 2707 Command = 0x1, 2708 Response = 0x2, 2709 Notification = 0x3, 2710 ReservedForTesting1 = 0x4, 2711 ReservedForTesting2 = 0x5, 2712 } 2713 impl TryFrom<u8> for MessageType { 2714 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>2715 fn try_from(value: u8) -> Result<Self, Self::Error> { 2716 match value { 2717 0x0 => Ok(MessageType::Data), 2718 0x1 => Ok(MessageType::Command), 2719 0x2 => Ok(MessageType::Response), 2720 0x3 => Ok(MessageType::Notification), 2721 0x4 => Ok(MessageType::ReservedForTesting1), 2722 0x5 => Ok(MessageType::ReservedForTesting2), 2723 _ => Err(value), 2724 } 2725 } 2726 } 2727 impl From<&MessageType> for u8 { from(value: &MessageType) -> Self2728 fn from(value: &MessageType) -> Self { 2729 match value { 2730 MessageType::Data => 0x0, 2731 MessageType::Command => 0x1, 2732 MessageType::Response => 0x2, 2733 MessageType::Notification => 0x3, 2734 MessageType::ReservedForTesting1 => 0x4, 2735 MessageType::ReservedForTesting2 => 0x5, 2736 } 2737 } 2738 } 2739 impl From<MessageType> for u8 { from(value: MessageType) -> Self2740 fn from(value: MessageType) -> Self { 2741 (&value).into() 2742 } 2743 } 2744 impl From<MessageType> for i8 { from(value: MessageType) -> Self2745 fn from(value: MessageType) -> Self { 2746 u8::from(value) as Self 2747 } 2748 } 2749 impl From<MessageType> for i16 { from(value: MessageType) -> Self2750 fn from(value: MessageType) -> Self { 2751 u8::from(value) as Self 2752 } 2753 } 2754 impl From<MessageType> for i32 { from(value: MessageType) -> Self2755 fn from(value: MessageType) -> Self { 2756 u8::from(value) as Self 2757 } 2758 } 2759 impl From<MessageType> for i64 { from(value: MessageType) -> Self2760 fn from(value: MessageType) -> Self { 2761 u8::from(value) as Self 2762 } 2763 } 2764 impl From<MessageType> for u16 { from(value: MessageType) -> Self2765 fn from(value: MessageType) -> Self { 2766 u8::from(value) as Self 2767 } 2768 } 2769 impl From<MessageType> for u32 { from(value: MessageType) -> Self2770 fn from(value: MessageType) -> Self { 2771 u8::from(value) as Self 2772 } 2773 } 2774 impl From<MessageType> for u64 { from(value: MessageType) -> Self2775 fn from(value: MessageType) -> Self { 2776 u8::from(value) as Self 2777 } 2778 } 2779 #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] 2780 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2781 #[cfg_attr(feature = "serde", serde(try_from = "u8", into = "u8"))] 2782 pub enum RfTestConfigTlvType { 2783 NumPackets, 2784 TGap, 2785 TStart, 2786 TWin, 2787 RandomizePsdu, 2788 PhrRangingBit, 2789 RmarkerTxStart, 2790 RmarkerRxStart, 2791 StsIndexAutoIncr, 2792 StsDetectBitmap, 2793 RfuTestAppCfgTlvTypeRange(Private<u8>), 2794 } 2795 impl TryFrom<u8> for RfTestConfigTlvType { 2796 type Error = u8; try_from(value: u8) -> Result<Self, Self::Error>2797 fn try_from(value: u8) -> Result<Self, Self::Error> { 2798 match value { 2799 0x0 => Ok(RfTestConfigTlvType::NumPackets), 2800 0x1 => Ok(RfTestConfigTlvType::TGap), 2801 0x2 => Ok(RfTestConfigTlvType::TStart), 2802 0x3 => Ok(RfTestConfigTlvType::TWin), 2803 0x4 => Ok(RfTestConfigTlvType::RandomizePsdu), 2804 0x5 => Ok(RfTestConfigTlvType::PhrRangingBit), 2805 0x6 => Ok(RfTestConfigTlvType::RmarkerTxStart), 2806 0x7 => Ok(RfTestConfigTlvType::RmarkerRxStart), 2807 0x8 => Ok(RfTestConfigTlvType::StsIndexAutoIncr), 2808 0x9 => Ok(RfTestConfigTlvType::StsDetectBitmap), 2809 0xa..=0xff => { 2810 Ok(RfTestConfigTlvType::RfuTestAppCfgTlvTypeRange(Private(value))) 2811 } 2812 } 2813 } 2814 } 2815 impl From<&RfTestConfigTlvType> for u8 { from(value: &RfTestConfigTlvType) -> Self2816 fn from(value: &RfTestConfigTlvType) -> Self { 2817 match value { 2818 RfTestConfigTlvType::NumPackets => 0x0, 2819 RfTestConfigTlvType::TGap => 0x1, 2820 RfTestConfigTlvType::TStart => 0x2, 2821 RfTestConfigTlvType::TWin => 0x3, 2822 RfTestConfigTlvType::RandomizePsdu => 0x4, 2823 RfTestConfigTlvType::PhrRangingBit => 0x5, 2824 RfTestConfigTlvType::RmarkerTxStart => 0x6, 2825 RfTestConfigTlvType::RmarkerRxStart => 0x7, 2826 RfTestConfigTlvType::StsIndexAutoIncr => 0x8, 2827 RfTestConfigTlvType::StsDetectBitmap => 0x9, 2828 RfTestConfigTlvType::RfuTestAppCfgTlvTypeRange(Private(value)) => *value, 2829 } 2830 } 2831 } 2832 impl From<RfTestConfigTlvType> for u8 { from(value: RfTestConfigTlvType) -> Self2833 fn from(value: RfTestConfigTlvType) -> Self { 2834 (&value).into() 2835 } 2836 } 2837 impl From<RfTestConfigTlvType> for i16 { from(value: RfTestConfigTlvType) -> Self2838 fn from(value: RfTestConfigTlvType) -> Self { 2839 u8::from(value) as Self 2840 } 2841 } 2842 impl From<RfTestConfigTlvType> for i32 { from(value: RfTestConfigTlvType) -> Self2843 fn from(value: RfTestConfigTlvType) -> Self { 2844 u8::from(value) as Self 2845 } 2846 } 2847 impl From<RfTestConfigTlvType> for i64 { from(value: RfTestConfigTlvType) -> Self2848 fn from(value: RfTestConfigTlvType) -> Self { 2849 u8::from(value) as Self 2850 } 2851 } 2852 impl From<RfTestConfigTlvType> for u16 { from(value: RfTestConfigTlvType) -> Self2853 fn from(value: RfTestConfigTlvType) -> Self { 2854 u8::from(value) as Self 2855 } 2856 } 2857 impl From<RfTestConfigTlvType> for u32 { from(value: RfTestConfigTlvType) -> Self2858 fn from(value: RfTestConfigTlvType) -> Self { 2859 u8::from(value) as Self 2860 } 2861 } 2862 impl From<RfTestConfigTlvType> for u64 { from(value: RfTestConfigTlvType) -> Self2863 fn from(value: RfTestConfigTlvType) -> Self { 2864 u8::from(value) as Self 2865 } 2866 } 2867 #[derive(Debug, Clone, PartialEq, Eq)] 2868 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2869 pub enum UciPacketHalDataChild { 2870 UciDataPacketHal(UciDataPacketHalData), 2871 UciControlPacketHal(UciControlPacketHalData), 2872 Payload(Bytes), 2873 None, 2874 } 2875 impl UciPacketHalDataChild { get_total_size(&self) -> usize2876 fn get_total_size(&self) -> usize { 2877 match self { 2878 UciPacketHalDataChild::UciDataPacketHal(value) => value.get_total_size(), 2879 UciPacketHalDataChild::UciControlPacketHal(value) => value.get_total_size(), 2880 UciPacketHalDataChild::Payload(bytes) => bytes.len(), 2881 UciPacketHalDataChild::None => 0, 2882 } 2883 } 2884 } 2885 #[derive(Debug, Clone, PartialEq, Eq)] 2886 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2887 pub enum UciPacketHalChild { 2888 UciDataPacketHal(UciDataPacketHal), 2889 UciControlPacketHal(UciControlPacketHal), 2890 Payload(Bytes), 2891 None, 2892 } 2893 #[derive(Debug, Clone, PartialEq, Eq)] 2894 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2895 pub struct UciPacketHalData { 2896 group_id_or_data_packet_format: GroupIdOrDataPacketFormat, 2897 packet_boundary_flag: PacketBoundaryFlag, 2898 message_type: MessageType, 2899 child: UciPacketHalDataChild, 2900 } 2901 #[derive(Debug, Clone, PartialEq, Eq)] 2902 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2903 pub struct UciPacketHal { 2904 #[cfg_attr(feature = "serde", serde(flatten))] 2905 ucipackethal: UciPacketHalData, 2906 } 2907 #[derive(Debug)] 2908 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 2909 pub struct UciPacketHalBuilder { 2910 pub group_id_or_data_packet_format: GroupIdOrDataPacketFormat, 2911 pub message_type: MessageType, 2912 pub packet_boundary_flag: PacketBoundaryFlag, 2913 pub payload: Option<Bytes>, 2914 } 2915 impl UciPacketHalData { conforms(bytes: &[u8]) -> bool2916 fn conforms(bytes: &[u8]) -> bool { 2917 bytes.len() >= 1 2918 } parse(bytes: &[u8]) -> Result<Self, DecodeError>2919 fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 2920 let mut cell = Cell::new(bytes); 2921 let packet = Self::parse_inner(&mut cell)?; 2922 Ok(packet) 2923 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>2924 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 2925 if bytes.get().remaining() < 1 { 2926 return Err(DecodeError::InvalidLengthError { 2927 obj: "UciPacketHal", 2928 wanted: 1, 2929 got: bytes.get().remaining(), 2930 }); 2931 } 2932 let chunk = bytes.get_mut().get_u8(); 2933 let group_id_or_data_packet_format = GroupIdOrDataPacketFormat::try_from( 2934 (chunk & 0xf), 2935 ) 2936 .map_err(|unknown_val| DecodeError::InvalidEnumValueError { 2937 obj: "UciPacketHal", 2938 field: "group_id_or_data_packet_format", 2939 value: unknown_val as u64, 2940 type_: "GroupIdOrDataPacketFormat", 2941 })?; 2942 let packet_boundary_flag = PacketBoundaryFlag::try_from(((chunk >> 4) & 0x1)) 2943 .map_err(|unknown_val| DecodeError::InvalidEnumValueError { 2944 obj: "UciPacketHal", 2945 field: "packet_boundary_flag", 2946 value: unknown_val as u64, 2947 type_: "PacketBoundaryFlag", 2948 })?; 2949 let message_type = MessageType::try_from(((chunk >> 5) & 0x7)) 2950 .map_err(|unknown_val| DecodeError::InvalidEnumValueError { 2951 obj: "UciPacketHal", 2952 field: "message_type", 2953 value: unknown_val as u64, 2954 type_: "MessageType", 2955 })?; 2956 let payload = bytes.get(); 2957 bytes.get_mut().advance(payload.len()); 2958 let child = match (message_type) { 2959 (MessageType::Data) if UciDataPacketHalData::conforms(&payload) => { 2960 let mut cell = Cell::new(payload); 2961 let child_data = UciDataPacketHalData::parse_inner(&mut cell)?; 2962 UciPacketHalDataChild::UciDataPacketHal(child_data) 2963 } 2964 _ if !payload.is_empty() => { 2965 UciPacketHalDataChild::Payload(Bytes::copy_from_slice(payload)) 2966 } 2967 _ => UciPacketHalDataChild::None, 2968 }; 2969 Ok(Self { 2970 group_id_or_data_packet_format, 2971 packet_boundary_flag, 2972 message_type, 2973 child, 2974 }) 2975 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>2976 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 2977 let value = u8::from(self.group_id_or_data_packet_format) 2978 | (u8::from(self.packet_boundary_flag) << 4) 2979 | (u8::from(self.message_type) << 5); 2980 buffer.put_u8(value); 2981 match &self.child { 2982 UciPacketHalDataChild::UciDataPacketHal(child) => child.write_to(buffer)?, 2983 UciPacketHalDataChild::UciControlPacketHal(child) => child.write_to(buffer)?, 2984 UciPacketHalDataChild::Payload(payload) => buffer.put_slice(payload), 2985 UciPacketHalDataChild::None => {} 2986 } 2987 Ok(()) 2988 } get_total_size(&self) -> usize2989 fn get_total_size(&self) -> usize { 2990 self.get_size() 2991 } get_size(&self) -> usize2992 fn get_size(&self) -> usize { 2993 1 + self.child.get_total_size() 2994 } 2995 } 2996 impl Packet for UciPacketHal { encoded_len(&self) -> usize2997 fn encoded_len(&self) -> usize { 2998 self.get_size() 2999 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>3000 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 3001 self.ucipackethal.write_to(buf) 3002 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>3003 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 3004 unimplemented!("Rust legacy does not implement full packet trait") 3005 } 3006 } 3007 impl TryFrom<UciPacketHal> for Bytes { 3008 type Error = EncodeError; try_from(packet: UciPacketHal) -> Result<Self, Self::Error>3009 fn try_from(packet: UciPacketHal) -> Result<Self, Self::Error> { 3010 packet.encode_to_bytes() 3011 } 3012 } 3013 impl TryFrom<UciPacketHal> for Vec<u8> { 3014 type Error = EncodeError; try_from(packet: UciPacketHal) -> Result<Self, Self::Error>3015 fn try_from(packet: UciPacketHal) -> Result<Self, Self::Error> { 3016 packet.encode_to_vec() 3017 } 3018 } 3019 impl UciPacketHal { parse(bytes: &[u8]) -> Result<Self, DecodeError>3020 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 3021 let mut cell = Cell::new(bytes); 3022 let packet = Self::parse_inner(&mut cell)?; 3023 Ok(packet) 3024 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>3025 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 3026 let data = UciPacketHalData::parse_inner(&mut bytes)?; 3027 Self::new(data) 3028 } specialize(&self) -> UciPacketHalChild3029 pub fn specialize(&self) -> UciPacketHalChild { 3030 match &self.ucipackethal.child { 3031 UciPacketHalDataChild::UciDataPacketHal(_) => { 3032 UciPacketHalChild::UciDataPacketHal( 3033 UciDataPacketHal::new(self.ucipackethal.clone()).unwrap(), 3034 ) 3035 } 3036 UciPacketHalDataChild::UciControlPacketHal(_) => { 3037 UciPacketHalChild::UciControlPacketHal( 3038 UciControlPacketHal::new(self.ucipackethal.clone()).unwrap(), 3039 ) 3040 } 3041 UciPacketHalDataChild::Payload(payload) => { 3042 UciPacketHalChild::Payload(payload.clone()) 3043 } 3044 UciPacketHalDataChild::None => UciPacketHalChild::None, 3045 } 3046 } new(ucipackethal: UciPacketHalData) -> Result<Self, DecodeError>3047 fn new(ucipackethal: UciPacketHalData) -> Result<Self, DecodeError> { 3048 Ok(Self { ucipackethal }) 3049 } get_group_id_or_data_packet_format(&self) -> GroupIdOrDataPacketFormat3050 pub fn get_group_id_or_data_packet_format(&self) -> GroupIdOrDataPacketFormat { 3051 self.ucipackethal.group_id_or_data_packet_format 3052 } get_message_type(&self) -> MessageType3053 pub fn get_message_type(&self) -> MessageType { 3054 self.ucipackethal.message_type 3055 } get_packet_boundary_flag(&self) -> PacketBoundaryFlag3056 pub fn get_packet_boundary_flag(&self) -> PacketBoundaryFlag { 3057 self.ucipackethal.packet_boundary_flag 3058 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>3059 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 3060 self.ucipackethal.write_to(buffer) 3061 } get_size(&self) -> usize3062 pub fn get_size(&self) -> usize { 3063 self.ucipackethal.get_size() 3064 } 3065 } 3066 impl UciPacketHalBuilder { build(self) -> UciPacketHal3067 pub fn build(self) -> UciPacketHal { 3068 let ucipackethal = UciPacketHalData { 3069 group_id_or_data_packet_format: self.group_id_or_data_packet_format, 3070 message_type: self.message_type, 3071 packet_boundary_flag: self.packet_boundary_flag, 3072 child: match self.payload { 3073 None => UciPacketHalDataChild::None, 3074 Some(bytes) => UciPacketHalDataChild::Payload(bytes), 3075 }, 3076 }; 3077 UciPacketHal::new(ucipackethal).unwrap() 3078 } 3079 } 3080 impl From<UciPacketHalBuilder> for UciPacketHal { from(builder: UciPacketHalBuilder) -> UciPacketHal3081 fn from(builder: UciPacketHalBuilder) -> UciPacketHal { 3082 builder.build().into() 3083 } 3084 } 3085 #[derive(Debug, Clone, PartialEq, Eq)] 3086 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3087 pub enum UciDataPacketHalDataChild { 3088 Payload(Bytes), 3089 None, 3090 } 3091 impl UciDataPacketHalDataChild { get_total_size(&self) -> usize3092 fn get_total_size(&self) -> usize { 3093 match self { 3094 UciDataPacketHalDataChild::Payload(bytes) => bytes.len(), 3095 UciDataPacketHalDataChild::None => 0, 3096 } 3097 } 3098 } 3099 #[derive(Debug, Clone, PartialEq, Eq)] 3100 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3101 pub enum UciDataPacketHalChild { 3102 Payload(Bytes), 3103 None, 3104 } 3105 #[derive(Debug, Clone, PartialEq, Eq)] 3106 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3107 pub struct UciDataPacketHalData { 3108 child: UciDataPacketHalDataChild, 3109 } 3110 #[derive(Debug, Clone, PartialEq, Eq)] 3111 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3112 pub struct UciDataPacketHal { 3113 #[cfg_attr(feature = "serde", serde(flatten))] 3114 ucipackethal: UciPacketHalData, 3115 #[cfg_attr(feature = "serde", serde(flatten))] 3116 ucidatapackethal: UciDataPacketHalData, 3117 } 3118 #[derive(Debug)] 3119 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3120 pub struct UciDataPacketHalBuilder { 3121 pub group_id_or_data_packet_format: GroupIdOrDataPacketFormat, 3122 pub packet_boundary_flag: PacketBoundaryFlag, 3123 pub payload: Option<Bytes>, 3124 } 3125 impl UciDataPacketHalData { conforms(bytes: &[u8]) -> bool3126 fn conforms(bytes: &[u8]) -> bool { 3127 bytes.len() >= 3 3128 } parse(bytes: &[u8]) -> Result<Self, DecodeError>3129 fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 3130 let mut cell = Cell::new(bytes); 3131 let packet = Self::parse_inner(&mut cell)?; 3132 Ok(packet) 3133 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>3134 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 3135 if bytes.get().remaining() < 1 { 3136 return Err(DecodeError::InvalidLengthError { 3137 obj: "UciDataPacketHal", 3138 wanted: 1, 3139 got: bytes.get().remaining(), 3140 }); 3141 } 3142 bytes.get_mut().advance(1); 3143 if bytes.get().remaining() < 2 { 3144 return Err(DecodeError::InvalidLengthError { 3145 obj: "UciDataPacketHal", 3146 wanted: 2, 3147 got: bytes.get().remaining(), 3148 }); 3149 } 3150 let payload_size = bytes.get_mut().get_u16_le() as usize; 3151 if bytes.get().remaining() < payload_size { 3152 return Err(DecodeError::InvalidLengthError { 3153 obj: "UciDataPacketHal", 3154 wanted: payload_size, 3155 got: bytes.get().remaining(), 3156 }); 3157 } 3158 let payload = &bytes.get()[..payload_size]; 3159 bytes.get_mut().advance(payload_size); 3160 let child = match () { 3161 _ if !payload.is_empty() => { 3162 UciDataPacketHalDataChild::Payload(Bytes::copy_from_slice(payload)) 3163 } 3164 _ => UciDataPacketHalDataChild::None, 3165 }; 3166 Ok(Self { child }) 3167 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>3168 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 3169 buffer.put_bytes(0, 1); 3170 if self.child.get_total_size() > 0xffff { 3171 return Err(EncodeError::SizeOverflow { 3172 packet: "UciDataPacketHal", 3173 field: "_payload_", 3174 size: self.child.get_total_size(), 3175 maximum_size: 0xffff, 3176 }); 3177 } 3178 buffer.put_u16_le(self.child.get_total_size() as u16); 3179 match &self.child { 3180 UciDataPacketHalDataChild::Payload(payload) => buffer.put_slice(payload), 3181 UciDataPacketHalDataChild::None => {} 3182 } 3183 Ok(()) 3184 } get_total_size(&self) -> usize3185 fn get_total_size(&self) -> usize { 3186 self.get_size() 3187 } get_size(&self) -> usize3188 fn get_size(&self) -> usize { 3189 3 + self.child.get_total_size() 3190 } 3191 } 3192 impl Packet for UciDataPacketHal { encoded_len(&self) -> usize3193 fn encoded_len(&self) -> usize { 3194 self.get_size() 3195 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>3196 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 3197 self.ucipackethal.write_to(buf) 3198 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>3199 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 3200 unimplemented!("Rust legacy does not implement full packet trait") 3201 } 3202 } 3203 impl TryFrom<UciDataPacketHal> for Bytes { 3204 type Error = EncodeError; try_from(packet: UciDataPacketHal) -> Result<Self, Self::Error>3205 fn try_from(packet: UciDataPacketHal) -> Result<Self, Self::Error> { 3206 packet.encode_to_bytes() 3207 } 3208 } 3209 impl TryFrom<UciDataPacketHal> for Vec<u8> { 3210 type Error = EncodeError; try_from(packet: UciDataPacketHal) -> Result<Self, Self::Error>3211 fn try_from(packet: UciDataPacketHal) -> Result<Self, Self::Error> { 3212 packet.encode_to_vec() 3213 } 3214 } 3215 impl From<UciDataPacketHal> for UciPacketHal { from(packet: UciDataPacketHal) -> UciPacketHal3216 fn from(packet: UciDataPacketHal) -> UciPacketHal { 3217 UciPacketHal::new(packet.ucipackethal).unwrap() 3218 } 3219 } 3220 impl TryFrom<UciPacketHal> for UciDataPacketHal { 3221 type Error = DecodeError; try_from(packet: UciPacketHal) -> Result<UciDataPacketHal, Self::Error>3222 fn try_from(packet: UciPacketHal) -> Result<UciDataPacketHal, Self::Error> { 3223 UciDataPacketHal::new(packet.ucipackethal) 3224 } 3225 } 3226 impl UciDataPacketHal { parse(bytes: &[u8]) -> Result<Self, DecodeError>3227 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 3228 let mut cell = Cell::new(bytes); 3229 let packet = Self::parse_inner(&mut cell)?; 3230 Ok(packet) 3231 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>3232 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 3233 let data = UciPacketHalData::parse_inner(&mut bytes)?; 3234 Self::new(data) 3235 } specialize(&self) -> UciDataPacketHalChild3236 pub fn specialize(&self) -> UciDataPacketHalChild { 3237 match &self.ucidatapackethal.child { 3238 UciDataPacketHalDataChild::Payload(payload) => { 3239 UciDataPacketHalChild::Payload(payload.clone()) 3240 } 3241 UciDataPacketHalDataChild::None => UciDataPacketHalChild::None, 3242 } 3243 } new(ucipackethal: UciPacketHalData) -> Result<Self, DecodeError>3244 fn new(ucipackethal: UciPacketHalData) -> Result<Self, DecodeError> { 3245 let ucidatapackethal = match &ucipackethal.child { 3246 UciPacketHalDataChild::UciDataPacketHal(value) => value.clone(), 3247 _ => { 3248 return Err(DecodeError::InvalidChildError { 3249 expected: stringify!(UciPacketHalDataChild::UciDataPacketHal), 3250 actual: format!("{:?}", & ucipackethal.child), 3251 }); 3252 } 3253 }; 3254 Ok(Self { 3255 ucipackethal, 3256 ucidatapackethal, 3257 }) 3258 } get_group_id_or_data_packet_format(&self) -> GroupIdOrDataPacketFormat3259 pub fn get_group_id_or_data_packet_format(&self) -> GroupIdOrDataPacketFormat { 3260 self.ucipackethal.group_id_or_data_packet_format 3261 } get_message_type(&self) -> MessageType3262 pub fn get_message_type(&self) -> MessageType { 3263 self.ucipackethal.message_type 3264 } get_packet_boundary_flag(&self) -> PacketBoundaryFlag3265 pub fn get_packet_boundary_flag(&self) -> PacketBoundaryFlag { 3266 self.ucipackethal.packet_boundary_flag 3267 } get_payload(&self) -> &[u8]3268 pub fn get_payload(&self) -> &[u8] { 3269 match &self.ucidatapackethal.child { 3270 UciDataPacketHalDataChild::Payload(bytes) => &bytes, 3271 UciDataPacketHalDataChild::None => &[], 3272 } 3273 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>3274 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 3275 self.ucidatapackethal.write_to(buffer) 3276 } get_size(&self) -> usize3277 pub fn get_size(&self) -> usize { 3278 self.ucipackethal.get_size() 3279 } 3280 } 3281 impl UciDataPacketHalBuilder { build(self) -> UciDataPacketHal3282 pub fn build(self) -> UciDataPacketHal { 3283 let ucidatapackethal = UciDataPacketHalData { 3284 child: match self.payload { 3285 None => UciDataPacketHalDataChild::None, 3286 Some(bytes) => UciDataPacketHalDataChild::Payload(bytes), 3287 }, 3288 }; 3289 let ucipackethal = UciPacketHalData { 3290 group_id_or_data_packet_format: self.group_id_or_data_packet_format, 3291 message_type: MessageType::Data, 3292 packet_boundary_flag: self.packet_boundary_flag, 3293 child: UciPacketHalDataChild::UciDataPacketHal(ucidatapackethal), 3294 }; 3295 UciDataPacketHal::new(ucipackethal).unwrap() 3296 } 3297 } 3298 impl From<UciDataPacketHalBuilder> for UciPacketHal { from(builder: UciDataPacketHalBuilder) -> UciPacketHal3299 fn from(builder: UciDataPacketHalBuilder) -> UciPacketHal { 3300 builder.build().into() 3301 } 3302 } 3303 impl From<UciDataPacketHalBuilder> for UciDataPacketHal { from(builder: UciDataPacketHalBuilder) -> UciDataPacketHal3304 fn from(builder: UciDataPacketHalBuilder) -> UciDataPacketHal { 3305 builder.build().into() 3306 } 3307 } 3308 #[derive(Debug, Clone, PartialEq, Eq)] 3309 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3310 pub enum UciControlPacketHalDataChild { 3311 Payload(Bytes), 3312 None, 3313 } 3314 impl UciControlPacketHalDataChild { get_total_size(&self) -> usize3315 fn get_total_size(&self) -> usize { 3316 match self { 3317 UciControlPacketHalDataChild::Payload(bytes) => bytes.len(), 3318 UciControlPacketHalDataChild::None => 0, 3319 } 3320 } 3321 } 3322 #[derive(Debug, Clone, PartialEq, Eq)] 3323 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3324 pub enum UciControlPacketHalChild { 3325 Payload(Bytes), 3326 None, 3327 } 3328 #[derive(Debug, Clone, PartialEq, Eq)] 3329 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3330 pub struct UciControlPacketHalData { 3331 opcode: u8, 3332 child: UciControlPacketHalDataChild, 3333 } 3334 #[derive(Debug, Clone, PartialEq, Eq)] 3335 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3336 pub struct UciControlPacketHal { 3337 #[cfg_attr(feature = "serde", serde(flatten))] 3338 ucipackethal: UciPacketHalData, 3339 #[cfg_attr(feature = "serde", serde(flatten))] 3340 ucicontrolpackethal: UciControlPacketHalData, 3341 } 3342 #[derive(Debug)] 3343 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3344 pub struct UciControlPacketHalBuilder { 3345 pub group_id_or_data_packet_format: GroupIdOrDataPacketFormat, 3346 pub message_type: MessageType, 3347 pub opcode: u8, 3348 pub packet_boundary_flag: PacketBoundaryFlag, 3349 pub payload: Option<Bytes>, 3350 } 3351 impl UciControlPacketHalData { conforms(bytes: &[u8]) -> bool3352 fn conforms(bytes: &[u8]) -> bool { 3353 bytes.len() >= 3 3354 } parse(bytes: &[u8]) -> Result<Self, DecodeError>3355 fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 3356 let mut cell = Cell::new(bytes); 3357 let packet = Self::parse_inner(&mut cell)?; 3358 Ok(packet) 3359 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>3360 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 3361 if bytes.get().remaining() < 1 { 3362 return Err(DecodeError::InvalidLengthError { 3363 obj: "UciControlPacketHal", 3364 wanted: 1, 3365 got: bytes.get().remaining(), 3366 }); 3367 } 3368 let chunk = bytes.get_mut().get_u8(); 3369 let opcode = (chunk & 0x3f); 3370 if bytes.get().remaining() < 1 { 3371 return Err(DecodeError::InvalidLengthError { 3372 obj: "UciControlPacketHal", 3373 wanted: 1, 3374 got: bytes.get().remaining(), 3375 }); 3376 } 3377 bytes.get_mut().advance(1); 3378 if bytes.get().remaining() < 1 { 3379 return Err(DecodeError::InvalidLengthError { 3380 obj: "UciControlPacketHal", 3381 wanted: 1, 3382 got: bytes.get().remaining(), 3383 }); 3384 } 3385 let payload_size = bytes.get_mut().get_u8() as usize; 3386 if bytes.get().remaining() < payload_size { 3387 return Err(DecodeError::InvalidLengthError { 3388 obj: "UciControlPacketHal", 3389 wanted: payload_size, 3390 got: bytes.get().remaining(), 3391 }); 3392 } 3393 let payload = &bytes.get()[..payload_size]; 3394 bytes.get_mut().advance(payload_size); 3395 let child = match () { 3396 _ if !payload.is_empty() => { 3397 UciControlPacketHalDataChild::Payload(Bytes::copy_from_slice(payload)) 3398 } 3399 _ => UciControlPacketHalDataChild::None, 3400 }; 3401 Ok(Self { opcode, child }) 3402 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>3403 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 3404 if self.opcode > 0x3f { 3405 return Err(EncodeError::InvalidScalarValue { 3406 packet: "UciControlPacketHal", 3407 field: "opcode", 3408 value: self.opcode as u64, 3409 maximum_value: 0x3f, 3410 }); 3411 } 3412 buffer.put_u8(self.opcode); 3413 buffer.put_bytes(0, 1); 3414 if self.child.get_total_size() > 0xff { 3415 return Err(EncodeError::SizeOverflow { 3416 packet: "UciControlPacketHal", 3417 field: "_payload_", 3418 size: self.child.get_total_size(), 3419 maximum_size: 0xff, 3420 }); 3421 } 3422 buffer.put_u8(self.child.get_total_size() as u8); 3423 match &self.child { 3424 UciControlPacketHalDataChild::Payload(payload) => buffer.put_slice(payload), 3425 UciControlPacketHalDataChild::None => {} 3426 } 3427 Ok(()) 3428 } get_total_size(&self) -> usize3429 fn get_total_size(&self) -> usize { 3430 self.get_size() 3431 } get_size(&self) -> usize3432 fn get_size(&self) -> usize { 3433 3 + self.child.get_total_size() 3434 } 3435 } 3436 impl Packet for UciControlPacketHal { encoded_len(&self) -> usize3437 fn encoded_len(&self) -> usize { 3438 self.get_size() 3439 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>3440 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 3441 self.ucipackethal.write_to(buf) 3442 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>3443 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 3444 unimplemented!("Rust legacy does not implement full packet trait") 3445 } 3446 } 3447 impl TryFrom<UciControlPacketHal> for Bytes { 3448 type Error = EncodeError; try_from(packet: UciControlPacketHal) -> Result<Self, Self::Error>3449 fn try_from(packet: UciControlPacketHal) -> Result<Self, Self::Error> { 3450 packet.encode_to_bytes() 3451 } 3452 } 3453 impl TryFrom<UciControlPacketHal> for Vec<u8> { 3454 type Error = EncodeError; try_from(packet: UciControlPacketHal) -> Result<Self, Self::Error>3455 fn try_from(packet: UciControlPacketHal) -> Result<Self, Self::Error> { 3456 packet.encode_to_vec() 3457 } 3458 } 3459 impl From<UciControlPacketHal> for UciPacketHal { from(packet: UciControlPacketHal) -> UciPacketHal3460 fn from(packet: UciControlPacketHal) -> UciPacketHal { 3461 UciPacketHal::new(packet.ucipackethal).unwrap() 3462 } 3463 } 3464 impl TryFrom<UciPacketHal> for UciControlPacketHal { 3465 type Error = DecodeError; try_from(packet: UciPacketHal) -> Result<UciControlPacketHal, Self::Error>3466 fn try_from(packet: UciPacketHal) -> Result<UciControlPacketHal, Self::Error> { 3467 UciControlPacketHal::new(packet.ucipackethal) 3468 } 3469 } 3470 impl UciControlPacketHal { parse(bytes: &[u8]) -> Result<Self, DecodeError>3471 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 3472 let mut cell = Cell::new(bytes); 3473 let packet = Self::parse_inner(&mut cell)?; 3474 Ok(packet) 3475 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>3476 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 3477 let data = UciPacketHalData::parse_inner(&mut bytes)?; 3478 Self::new(data) 3479 } specialize(&self) -> UciControlPacketHalChild3480 pub fn specialize(&self) -> UciControlPacketHalChild { 3481 match &self.ucicontrolpackethal.child { 3482 UciControlPacketHalDataChild::Payload(payload) => { 3483 UciControlPacketHalChild::Payload(payload.clone()) 3484 } 3485 UciControlPacketHalDataChild::None => UciControlPacketHalChild::None, 3486 } 3487 } new(ucipackethal: UciPacketHalData) -> Result<Self, DecodeError>3488 fn new(ucipackethal: UciPacketHalData) -> Result<Self, DecodeError> { 3489 let ucicontrolpackethal = match &ucipackethal.child { 3490 UciPacketHalDataChild::UciControlPacketHal(value) => value.clone(), 3491 _ => { 3492 return Err(DecodeError::InvalidChildError { 3493 expected: stringify!(UciPacketHalDataChild::UciControlPacketHal), 3494 actual: format!("{:?}", & ucipackethal.child), 3495 }); 3496 } 3497 }; 3498 Ok(Self { 3499 ucipackethal, 3500 ucicontrolpackethal, 3501 }) 3502 } get_group_id_or_data_packet_format(&self) -> GroupIdOrDataPacketFormat3503 pub fn get_group_id_or_data_packet_format(&self) -> GroupIdOrDataPacketFormat { 3504 self.ucipackethal.group_id_or_data_packet_format 3505 } get_message_type(&self) -> MessageType3506 pub fn get_message_type(&self) -> MessageType { 3507 self.ucipackethal.message_type 3508 } get_opcode(&self) -> u83509 pub fn get_opcode(&self) -> u8 { 3510 self.ucicontrolpackethal.opcode 3511 } get_packet_boundary_flag(&self) -> PacketBoundaryFlag3512 pub fn get_packet_boundary_flag(&self) -> PacketBoundaryFlag { 3513 self.ucipackethal.packet_boundary_flag 3514 } get_payload(&self) -> &[u8]3515 pub fn get_payload(&self) -> &[u8] { 3516 match &self.ucicontrolpackethal.child { 3517 UciControlPacketHalDataChild::Payload(bytes) => &bytes, 3518 UciControlPacketHalDataChild::None => &[], 3519 } 3520 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>3521 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 3522 self.ucicontrolpackethal.write_to(buffer) 3523 } get_size(&self) -> usize3524 pub fn get_size(&self) -> usize { 3525 self.ucipackethal.get_size() 3526 } 3527 } 3528 impl UciControlPacketHalBuilder { build(self) -> UciControlPacketHal3529 pub fn build(self) -> UciControlPacketHal { 3530 let ucicontrolpackethal = UciControlPacketHalData { 3531 opcode: self.opcode, 3532 child: match self.payload { 3533 None => UciControlPacketHalDataChild::None, 3534 Some(bytes) => UciControlPacketHalDataChild::Payload(bytes), 3535 }, 3536 }; 3537 let ucipackethal = UciPacketHalData { 3538 group_id_or_data_packet_format: self.group_id_or_data_packet_format, 3539 message_type: self.message_type, 3540 packet_boundary_flag: self.packet_boundary_flag, 3541 child: UciPacketHalDataChild::UciControlPacketHal(ucicontrolpackethal), 3542 }; 3543 UciControlPacketHal::new(ucipackethal).unwrap() 3544 } 3545 } 3546 impl From<UciControlPacketHalBuilder> for UciPacketHal { from(builder: UciControlPacketHalBuilder) -> UciPacketHal3547 fn from(builder: UciControlPacketHalBuilder) -> UciPacketHal { 3548 builder.build().into() 3549 } 3550 } 3551 impl From<UciControlPacketHalBuilder> for UciControlPacketHal { from(builder: UciControlPacketHalBuilder) -> UciControlPacketHal3552 fn from(builder: UciControlPacketHalBuilder) -> UciControlPacketHal { 3553 builder.build().into() 3554 } 3555 } 3556 #[derive(Debug, Clone, PartialEq, Eq)] 3557 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3558 pub enum UciControlPacketDataChild { 3559 UciCommand(UciCommandData), 3560 UciResponse(UciResponseData), 3561 UciNotification(UciNotificationData), 3562 Payload(Bytes), 3563 None, 3564 } 3565 impl UciControlPacketDataChild { get_total_size(&self) -> usize3566 fn get_total_size(&self) -> usize { 3567 match self { 3568 UciControlPacketDataChild::UciCommand(value) => value.get_total_size(), 3569 UciControlPacketDataChild::UciResponse(value) => value.get_total_size(), 3570 UciControlPacketDataChild::UciNotification(value) => value.get_total_size(), 3571 UciControlPacketDataChild::Payload(bytes) => bytes.len(), 3572 UciControlPacketDataChild::None => 0, 3573 } 3574 } 3575 } 3576 #[derive(Debug, Clone, PartialEq, Eq)] 3577 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3578 pub enum UciControlPacketChild { 3579 UciCommand(UciCommand), 3580 UciResponse(UciResponse), 3581 UciNotification(UciNotification), 3582 Payload(Bytes), 3583 None, 3584 } 3585 #[derive(Debug, Clone, PartialEq, Eq)] 3586 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3587 pub struct UciControlPacketData { 3588 group_id: GroupId, 3589 message_type: MessageType, 3590 opcode: u8, 3591 child: UciControlPacketDataChild, 3592 } 3593 #[derive(Debug, Clone, PartialEq, Eq)] 3594 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3595 pub struct UciControlPacket { 3596 #[cfg_attr(feature = "serde", serde(flatten))] 3597 ucicontrolpacket: UciControlPacketData, 3598 } 3599 #[derive(Debug)] 3600 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3601 pub struct UciControlPacketBuilder { 3602 pub group_id: GroupId, 3603 pub message_type: MessageType, 3604 pub opcode: u8, 3605 pub payload: Option<Bytes>, 3606 } 3607 impl UciControlPacketData { conforms(bytes: &[u8]) -> bool3608 fn conforms(bytes: &[u8]) -> bool { 3609 bytes.len() >= 7 3610 } parse(bytes: &[u8]) -> Result<Self, DecodeError>3611 fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 3612 let mut cell = Cell::new(bytes); 3613 let packet = Self::parse_inner(&mut cell)?; 3614 Ok(packet) 3615 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>3616 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 3617 if bytes.get().remaining() < 1 { 3618 return Err(DecodeError::InvalidLengthError { 3619 obj: "UciControlPacket", 3620 wanted: 1, 3621 got: bytes.get().remaining(), 3622 }); 3623 } 3624 let chunk = bytes.get_mut().get_u8(); 3625 let group_id = GroupId::try_from((chunk & 0xf)) 3626 .map_err(|unknown_val| DecodeError::InvalidEnumValueError { 3627 obj: "UciControlPacket", 3628 field: "group_id", 3629 value: unknown_val as u64, 3630 type_: "GroupId", 3631 })?; 3632 let message_type = MessageType::try_from(((chunk >> 5) & 0x7)) 3633 .map_err(|unknown_val| DecodeError::InvalidEnumValueError { 3634 obj: "UciControlPacket", 3635 field: "message_type", 3636 value: unknown_val as u64, 3637 type_: "MessageType", 3638 })?; 3639 if bytes.get().remaining() < 1 { 3640 return Err(DecodeError::InvalidLengthError { 3641 obj: "UciControlPacket", 3642 wanted: 1, 3643 got: bytes.get().remaining(), 3644 }); 3645 } 3646 let chunk = bytes.get_mut().get_u8(); 3647 let opcode = (chunk & 0x3f); 3648 if bytes.get().remaining() < 1 { 3649 return Err(DecodeError::InvalidLengthError { 3650 obj: "UciControlPacket", 3651 wanted: 1, 3652 got: bytes.get().remaining(), 3653 }); 3654 } 3655 bytes.get_mut().advance(1); 3656 if bytes.get().remaining() < 4 { 3657 return Err(DecodeError::InvalidLengthError { 3658 obj: "UciControlPacket", 3659 wanted: 4, 3660 got: bytes.get().remaining(), 3661 }); 3662 } 3663 let payload_size = bytes.get_mut().get_u32_le() as usize; 3664 if bytes.get().remaining() < payload_size { 3665 return Err(DecodeError::InvalidLengthError { 3666 obj: "UciControlPacket", 3667 wanted: payload_size, 3668 got: bytes.get().remaining(), 3669 }); 3670 } 3671 let payload = &bytes.get()[..payload_size]; 3672 bytes.get_mut().advance(payload_size); 3673 let child = match (message_type) { 3674 (MessageType::Command) if UciCommandData::conforms(&payload) => { 3675 let mut cell = Cell::new(payload); 3676 let child_data = UciCommandData::parse_inner( 3677 &mut cell, 3678 group_id, 3679 opcode, 3680 )?; 3681 UciControlPacketDataChild::UciCommand(child_data) 3682 } 3683 (MessageType::Response) if UciResponseData::conforms(&payload) => { 3684 let mut cell = Cell::new(payload); 3685 let child_data = UciResponseData::parse_inner( 3686 &mut cell, 3687 group_id, 3688 opcode, 3689 )?; 3690 UciControlPacketDataChild::UciResponse(child_data) 3691 } 3692 (MessageType::Notification) if UciNotificationData::conforms(&payload) => { 3693 let mut cell = Cell::new(payload); 3694 let child_data = UciNotificationData::parse_inner( 3695 &mut cell, 3696 group_id, 3697 opcode, 3698 )?; 3699 UciControlPacketDataChild::UciNotification(child_data) 3700 } 3701 _ if !payload.is_empty() => { 3702 UciControlPacketDataChild::Payload(Bytes::copy_from_slice(payload)) 3703 } 3704 _ => UciControlPacketDataChild::None, 3705 }; 3706 Ok(Self { 3707 group_id, 3708 message_type, 3709 opcode, 3710 child, 3711 }) 3712 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>3713 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 3714 let value = u8::from(self.group_id) | (u8::from(self.message_type) << 5); 3715 buffer.put_u8(value); 3716 if self.opcode > 0x3f { 3717 return Err(EncodeError::InvalidScalarValue { 3718 packet: "UciControlPacket", 3719 field: "opcode", 3720 value: self.opcode as u64, 3721 maximum_value: 0x3f, 3722 }); 3723 } 3724 buffer.put_u8(self.opcode); 3725 buffer.put_bytes(0, 1); 3726 if self.child.get_total_size() > 0xffff_ffff_usize { 3727 return Err(EncodeError::SizeOverflow { 3728 packet: "UciControlPacket", 3729 field: "_payload_", 3730 size: self.child.get_total_size(), 3731 maximum_size: 0xffff_ffff_usize, 3732 }); 3733 } 3734 buffer.put_u32_le(self.child.get_total_size() as u32); 3735 match &self.child { 3736 UciControlPacketDataChild::UciCommand(child) => child.write_to(buffer)?, 3737 UciControlPacketDataChild::UciResponse(child) => child.write_to(buffer)?, 3738 UciControlPacketDataChild::UciNotification(child) => child.write_to(buffer)?, 3739 UciControlPacketDataChild::Payload(payload) => buffer.put_slice(payload), 3740 UciControlPacketDataChild::None => {} 3741 } 3742 Ok(()) 3743 } get_total_size(&self) -> usize3744 fn get_total_size(&self) -> usize { 3745 self.get_size() 3746 } get_size(&self) -> usize3747 fn get_size(&self) -> usize { 3748 7 + self.child.get_total_size() 3749 } 3750 } 3751 impl Packet for UciControlPacket { encoded_len(&self) -> usize3752 fn encoded_len(&self) -> usize { 3753 self.get_size() 3754 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>3755 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 3756 self.ucicontrolpacket.write_to(buf) 3757 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>3758 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 3759 unimplemented!("Rust legacy does not implement full packet trait") 3760 } 3761 } 3762 impl TryFrom<UciControlPacket> for Bytes { 3763 type Error = EncodeError; try_from(packet: UciControlPacket) -> Result<Self, Self::Error>3764 fn try_from(packet: UciControlPacket) -> Result<Self, Self::Error> { 3765 packet.encode_to_bytes() 3766 } 3767 } 3768 impl TryFrom<UciControlPacket> for Vec<u8> { 3769 type Error = EncodeError; try_from(packet: UciControlPacket) -> Result<Self, Self::Error>3770 fn try_from(packet: UciControlPacket) -> Result<Self, Self::Error> { 3771 packet.encode_to_vec() 3772 } 3773 } 3774 impl UciControlPacket { parse(bytes: &[u8]) -> Result<Self, DecodeError>3775 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 3776 let mut cell = Cell::new(bytes); 3777 let packet = Self::parse_inner(&mut cell)?; 3778 Ok(packet) 3779 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>3780 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 3781 let data = UciControlPacketData::parse_inner(&mut bytes)?; 3782 Self::new(data) 3783 } specialize(&self) -> UciControlPacketChild3784 pub fn specialize(&self) -> UciControlPacketChild { 3785 match &self.ucicontrolpacket.child { 3786 UciControlPacketDataChild::UciCommand(_) => { 3787 UciControlPacketChild::UciCommand( 3788 UciCommand::new(self.ucicontrolpacket.clone()).unwrap(), 3789 ) 3790 } 3791 UciControlPacketDataChild::UciResponse(_) => { 3792 UciControlPacketChild::UciResponse( 3793 UciResponse::new(self.ucicontrolpacket.clone()).unwrap(), 3794 ) 3795 } 3796 UciControlPacketDataChild::UciNotification(_) => { 3797 UciControlPacketChild::UciNotification( 3798 UciNotification::new(self.ucicontrolpacket.clone()).unwrap(), 3799 ) 3800 } 3801 UciControlPacketDataChild::Payload(payload) => { 3802 UciControlPacketChild::Payload(payload.clone()) 3803 } 3804 UciControlPacketDataChild::None => UciControlPacketChild::None, 3805 } 3806 } new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError>3807 fn new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError> { 3808 Ok(Self { ucicontrolpacket }) 3809 } get_group_id(&self) -> GroupId3810 pub fn get_group_id(&self) -> GroupId { 3811 self.ucicontrolpacket.group_id 3812 } get_message_type(&self) -> MessageType3813 pub fn get_message_type(&self) -> MessageType { 3814 self.ucicontrolpacket.message_type 3815 } get_opcode(&self) -> u83816 pub fn get_opcode(&self) -> u8 { 3817 self.ucicontrolpacket.opcode 3818 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>3819 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 3820 self.ucicontrolpacket.write_to(buffer) 3821 } get_size(&self) -> usize3822 pub fn get_size(&self) -> usize { 3823 self.ucicontrolpacket.get_size() 3824 } 3825 } 3826 impl UciControlPacketBuilder { build(self) -> UciControlPacket3827 pub fn build(self) -> UciControlPacket { 3828 let ucicontrolpacket = UciControlPacketData { 3829 group_id: self.group_id, 3830 message_type: self.message_type, 3831 opcode: self.opcode, 3832 child: match self.payload { 3833 None => UciControlPacketDataChild::None, 3834 Some(bytes) => UciControlPacketDataChild::Payload(bytes), 3835 }, 3836 }; 3837 UciControlPacket::new(ucicontrolpacket).unwrap() 3838 } 3839 } 3840 impl From<UciControlPacketBuilder> for UciControlPacket { from(builder: UciControlPacketBuilder) -> UciControlPacket3841 fn from(builder: UciControlPacketBuilder) -> UciControlPacket { 3842 builder.build().into() 3843 } 3844 } 3845 #[derive(Debug, Clone, PartialEq, Eq)] 3846 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3847 pub enum UciDataPacketDataChild { 3848 UciDataSnd(UciDataSndData), 3849 UciDataRcv(UciDataRcvData), 3850 RadarDataRcv(RadarDataRcvData), 3851 Payload(Bytes), 3852 None, 3853 } 3854 impl UciDataPacketDataChild { get_total_size(&self) -> usize3855 fn get_total_size(&self) -> usize { 3856 match self { 3857 UciDataPacketDataChild::UciDataSnd(value) => value.get_total_size(), 3858 UciDataPacketDataChild::UciDataRcv(value) => value.get_total_size(), 3859 UciDataPacketDataChild::RadarDataRcv(value) => value.get_total_size(), 3860 UciDataPacketDataChild::Payload(bytes) => bytes.len(), 3861 UciDataPacketDataChild::None => 0, 3862 } 3863 } 3864 } 3865 #[derive(Debug, Clone, PartialEq, Eq)] 3866 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3867 pub enum UciDataPacketChild { 3868 UciDataSnd(UciDataSnd), 3869 UciDataRcv(UciDataRcv), 3870 RadarDataRcv(RadarDataRcv), 3871 Payload(Bytes), 3872 None, 3873 } 3874 #[derive(Debug, Clone, PartialEq, Eq)] 3875 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3876 pub struct UciDataPacketData { 3877 data_packet_format: DataPacketFormat, 3878 message_type: MessageType, 3879 child: UciDataPacketDataChild, 3880 } 3881 #[derive(Debug, Clone, PartialEq, Eq)] 3882 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3883 pub struct UciDataPacket { 3884 #[cfg_attr(feature = "serde", serde(flatten))] 3885 ucidatapacket: UciDataPacketData, 3886 } 3887 #[derive(Debug)] 3888 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 3889 pub struct UciDataPacketBuilder { 3890 pub data_packet_format: DataPacketFormat, 3891 pub message_type: MessageType, 3892 pub payload: Option<Bytes>, 3893 } 3894 impl UciDataPacketData { conforms(bytes: &[u8]) -> bool3895 fn conforms(bytes: &[u8]) -> bool { 3896 bytes.len() >= 6 3897 } parse(bytes: &[u8]) -> Result<Self, DecodeError>3898 fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 3899 let mut cell = Cell::new(bytes); 3900 let packet = Self::parse_inner(&mut cell)?; 3901 Ok(packet) 3902 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>3903 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 3904 if bytes.get().remaining() < 1 { 3905 return Err(DecodeError::InvalidLengthError { 3906 obj: "UciDataPacket", 3907 wanted: 1, 3908 got: bytes.get().remaining(), 3909 }); 3910 } 3911 let chunk = bytes.get_mut().get_u8(); 3912 let data_packet_format = DataPacketFormat::try_from((chunk & 0xf)) 3913 .map_err(|unknown_val| DecodeError::InvalidEnumValueError { 3914 obj: "UciDataPacket", 3915 field: "data_packet_format", 3916 value: unknown_val as u64, 3917 type_: "DataPacketFormat", 3918 })?; 3919 let message_type = MessageType::try_from(((chunk >> 5) & 0x7)) 3920 .map_err(|unknown_val| DecodeError::InvalidEnumValueError { 3921 obj: "UciDataPacket", 3922 field: "message_type", 3923 value: unknown_val as u64, 3924 type_: "MessageType", 3925 })?; 3926 if bytes.get().remaining() < 1 { 3927 return Err(DecodeError::InvalidLengthError { 3928 obj: "UciDataPacket", 3929 wanted: 1, 3930 got: bytes.get().remaining(), 3931 }); 3932 } 3933 bytes.get_mut().advance(1); 3934 if bytes.get().remaining() < 4 { 3935 return Err(DecodeError::InvalidLengthError { 3936 obj: "UciDataPacket", 3937 wanted: 4, 3938 got: bytes.get().remaining(), 3939 }); 3940 } 3941 let payload_size = bytes.get_mut().get_u32_le() as usize; 3942 if bytes.get().remaining() < payload_size { 3943 return Err(DecodeError::InvalidLengthError { 3944 obj: "UciDataPacket", 3945 wanted: payload_size, 3946 got: bytes.get().remaining(), 3947 }); 3948 } 3949 let payload = &bytes.get()[..payload_size]; 3950 bytes.get_mut().advance(payload_size); 3951 let child = match (data_packet_format, message_type) { 3952 ( 3953 DataPacketFormat::DataSnd, 3954 MessageType::Data, 3955 ) if UciDataSndData::conforms(&payload) => { 3956 let mut cell = Cell::new(payload); 3957 let child_data = UciDataSndData::parse_inner(&mut cell)?; 3958 UciDataPacketDataChild::UciDataSnd(child_data) 3959 } 3960 ( 3961 DataPacketFormat::DataRcv, 3962 MessageType::Data, 3963 ) if UciDataRcvData::conforms(&payload) => { 3964 let mut cell = Cell::new(payload); 3965 let child_data = UciDataRcvData::parse_inner(&mut cell)?; 3966 UciDataPacketDataChild::UciDataRcv(child_data) 3967 } 3968 ( 3969 DataPacketFormat::RadarDataMessage, 3970 MessageType::Data, 3971 ) if RadarDataRcvData::conforms(&payload) => { 3972 let mut cell = Cell::new(payload); 3973 let child_data = RadarDataRcvData::parse_inner(&mut cell)?; 3974 UciDataPacketDataChild::RadarDataRcv(child_data) 3975 } 3976 _ if !payload.is_empty() => { 3977 UciDataPacketDataChild::Payload(Bytes::copy_from_slice(payload)) 3978 } 3979 _ => UciDataPacketDataChild::None, 3980 }; 3981 Ok(Self { 3982 data_packet_format, 3983 message_type, 3984 child, 3985 }) 3986 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>3987 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 3988 let value = u8::from(self.data_packet_format) 3989 | (u8::from(self.message_type) << 5); 3990 buffer.put_u8(value); 3991 buffer.put_bytes(0, 1); 3992 if self.child.get_total_size() > 0xffff_ffff_usize { 3993 return Err(EncodeError::SizeOverflow { 3994 packet: "UciDataPacket", 3995 field: "_payload_", 3996 size: self.child.get_total_size(), 3997 maximum_size: 0xffff_ffff_usize, 3998 }); 3999 } 4000 buffer.put_u32_le(self.child.get_total_size() as u32); 4001 match &self.child { 4002 UciDataPacketDataChild::UciDataSnd(child) => child.write_to(buffer)?, 4003 UciDataPacketDataChild::UciDataRcv(child) => child.write_to(buffer)?, 4004 UciDataPacketDataChild::RadarDataRcv(child) => child.write_to(buffer)?, 4005 UciDataPacketDataChild::Payload(payload) => buffer.put_slice(payload), 4006 UciDataPacketDataChild::None => {} 4007 } 4008 Ok(()) 4009 } get_total_size(&self) -> usize4010 fn get_total_size(&self) -> usize { 4011 self.get_size() 4012 } get_size(&self) -> usize4013 fn get_size(&self) -> usize { 4014 6 + self.child.get_total_size() 4015 } 4016 } 4017 impl Packet for UciDataPacket { encoded_len(&self) -> usize4018 fn encoded_len(&self) -> usize { 4019 self.get_size() 4020 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>4021 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 4022 self.ucidatapacket.write_to(buf) 4023 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>4024 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 4025 unimplemented!("Rust legacy does not implement full packet trait") 4026 } 4027 } 4028 impl TryFrom<UciDataPacket> for Bytes { 4029 type Error = EncodeError; try_from(packet: UciDataPacket) -> Result<Self, Self::Error>4030 fn try_from(packet: UciDataPacket) -> Result<Self, Self::Error> { 4031 packet.encode_to_bytes() 4032 } 4033 } 4034 impl TryFrom<UciDataPacket> for Vec<u8> { 4035 type Error = EncodeError; try_from(packet: UciDataPacket) -> Result<Self, Self::Error>4036 fn try_from(packet: UciDataPacket) -> Result<Self, Self::Error> { 4037 packet.encode_to_vec() 4038 } 4039 } 4040 impl UciDataPacket { parse(bytes: &[u8]) -> Result<Self, DecodeError>4041 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 4042 let mut cell = Cell::new(bytes); 4043 let packet = Self::parse_inner(&mut cell)?; 4044 Ok(packet) 4045 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>4046 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 4047 let data = UciDataPacketData::parse_inner(&mut bytes)?; 4048 Self::new(data) 4049 } specialize(&self) -> UciDataPacketChild4050 pub fn specialize(&self) -> UciDataPacketChild { 4051 match &self.ucidatapacket.child { 4052 UciDataPacketDataChild::UciDataSnd(_) => { 4053 UciDataPacketChild::UciDataSnd( 4054 UciDataSnd::new(self.ucidatapacket.clone()).unwrap(), 4055 ) 4056 } 4057 UciDataPacketDataChild::UciDataRcv(_) => { 4058 UciDataPacketChild::UciDataRcv( 4059 UciDataRcv::new(self.ucidatapacket.clone()).unwrap(), 4060 ) 4061 } 4062 UciDataPacketDataChild::RadarDataRcv(_) => { 4063 UciDataPacketChild::RadarDataRcv( 4064 RadarDataRcv::new(self.ucidatapacket.clone()).unwrap(), 4065 ) 4066 } 4067 UciDataPacketDataChild::Payload(payload) => { 4068 UciDataPacketChild::Payload(payload.clone()) 4069 } 4070 UciDataPacketDataChild::None => UciDataPacketChild::None, 4071 } 4072 } new(ucidatapacket: UciDataPacketData) -> Result<Self, DecodeError>4073 fn new(ucidatapacket: UciDataPacketData) -> Result<Self, DecodeError> { 4074 Ok(Self { ucidatapacket }) 4075 } get_data_packet_format(&self) -> DataPacketFormat4076 pub fn get_data_packet_format(&self) -> DataPacketFormat { 4077 self.ucidatapacket.data_packet_format 4078 } get_message_type(&self) -> MessageType4079 pub fn get_message_type(&self) -> MessageType { 4080 self.ucidatapacket.message_type 4081 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>4082 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 4083 self.ucidatapacket.write_to(buffer) 4084 } get_size(&self) -> usize4085 pub fn get_size(&self) -> usize { 4086 self.ucidatapacket.get_size() 4087 } 4088 } 4089 impl UciDataPacketBuilder { build(self) -> UciDataPacket4090 pub fn build(self) -> UciDataPacket { 4091 let ucidatapacket = UciDataPacketData { 4092 data_packet_format: self.data_packet_format, 4093 message_type: self.message_type, 4094 child: match self.payload { 4095 None => UciDataPacketDataChild::None, 4096 Some(bytes) => UciDataPacketDataChild::Payload(bytes), 4097 }, 4098 }; 4099 UciDataPacket::new(ucidatapacket).unwrap() 4100 } 4101 } 4102 impl From<UciDataPacketBuilder> for UciDataPacket { from(builder: UciDataPacketBuilder) -> UciDataPacket4103 fn from(builder: UciDataPacketBuilder) -> UciDataPacket { 4104 builder.build().into() 4105 } 4106 } 4107 #[derive(Debug, Clone, PartialEq, Eq)] 4108 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4109 pub struct UciDataSndData { 4110 session_token: u32, 4111 dest_mac_address: u64, 4112 uci_sequence_number: u16, 4113 data: Vec<u8>, 4114 } 4115 #[derive(Debug, Clone, PartialEq, Eq)] 4116 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4117 pub struct UciDataSnd { 4118 #[cfg_attr(feature = "serde", serde(flatten))] 4119 ucidatapacket: UciDataPacketData, 4120 #[cfg_attr(feature = "serde", serde(flatten))] 4121 ucidatasnd: UciDataSndData, 4122 } 4123 #[derive(Debug)] 4124 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4125 pub struct UciDataSndBuilder { 4126 pub data: Vec<u8>, 4127 pub dest_mac_address: u64, 4128 pub session_token: u32, 4129 pub uci_sequence_number: u16, 4130 } 4131 impl UciDataSndData { conforms(bytes: &[u8]) -> bool4132 fn conforms(bytes: &[u8]) -> bool { 4133 bytes.len() >= 16 4134 } parse(bytes: &[u8]) -> Result<Self, DecodeError>4135 fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 4136 let mut cell = Cell::new(bytes); 4137 let packet = Self::parse_inner(&mut cell)?; 4138 Ok(packet) 4139 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>4140 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 4141 if bytes.get().remaining() < 4 { 4142 return Err(DecodeError::InvalidLengthError { 4143 obj: "UciDataSnd", 4144 wanted: 4, 4145 got: bytes.get().remaining(), 4146 }); 4147 } 4148 let session_token = bytes.get_mut().get_u32_le(); 4149 if bytes.get().remaining() < 8 { 4150 return Err(DecodeError::InvalidLengthError { 4151 obj: "UciDataSnd", 4152 wanted: 8, 4153 got: bytes.get().remaining(), 4154 }); 4155 } 4156 let dest_mac_address = bytes.get_mut().get_u64_le(); 4157 if bytes.get().remaining() < 2 { 4158 return Err(DecodeError::InvalidLengthError { 4159 obj: "UciDataSnd", 4160 wanted: 2, 4161 got: bytes.get().remaining(), 4162 }); 4163 } 4164 let uci_sequence_number = bytes.get_mut().get_u16_le(); 4165 if bytes.get().remaining() < 2 { 4166 return Err(DecodeError::InvalidLengthError { 4167 obj: "UciDataSnd", 4168 wanted: 2, 4169 got: bytes.get().remaining(), 4170 }); 4171 } 4172 let data_size = bytes.get_mut().get_u16_le() as usize; 4173 if bytes.get().remaining() < data_size { 4174 return Err(DecodeError::InvalidLengthError { 4175 obj: "UciDataSnd", 4176 wanted: data_size, 4177 got: bytes.get().remaining(), 4178 }); 4179 } 4180 let mut data = Vec::with_capacity(data_size); 4181 for _ in 0..data_size { 4182 data.push(Ok::<_, DecodeError>(bytes.get_mut().get_u8())?); 4183 } 4184 Ok(Self { 4185 session_token, 4186 dest_mac_address, 4187 uci_sequence_number, 4188 data, 4189 }) 4190 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>4191 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 4192 buffer.put_u32_le(self.session_token); 4193 buffer.put_u64_le(self.dest_mac_address); 4194 buffer.put_u16_le(self.uci_sequence_number); 4195 if self.data.len() > 0xffff { 4196 return Err(EncodeError::SizeOverflow { 4197 packet: "UciDataSnd", 4198 field: "data", 4199 size: self.data.len(), 4200 maximum_size: 0xffff, 4201 }); 4202 } 4203 buffer.put_u16_le(self.data.len() as u16); 4204 for elem in &self.data { 4205 buffer.put_u8(*elem); 4206 } 4207 Ok(()) 4208 } get_total_size(&self) -> usize4209 fn get_total_size(&self) -> usize { 4210 self.get_size() 4211 } get_size(&self) -> usize4212 fn get_size(&self) -> usize { 4213 16 + self.data.len() 4214 } 4215 } 4216 impl Packet for UciDataSnd { encoded_len(&self) -> usize4217 fn encoded_len(&self) -> usize { 4218 self.get_size() 4219 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>4220 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 4221 self.ucidatapacket.write_to(buf) 4222 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>4223 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 4224 unimplemented!("Rust legacy does not implement full packet trait") 4225 } 4226 } 4227 impl TryFrom<UciDataSnd> for Bytes { 4228 type Error = EncodeError; try_from(packet: UciDataSnd) -> Result<Self, Self::Error>4229 fn try_from(packet: UciDataSnd) -> Result<Self, Self::Error> { 4230 packet.encode_to_bytes() 4231 } 4232 } 4233 impl TryFrom<UciDataSnd> for Vec<u8> { 4234 type Error = EncodeError; try_from(packet: UciDataSnd) -> Result<Self, Self::Error>4235 fn try_from(packet: UciDataSnd) -> Result<Self, Self::Error> { 4236 packet.encode_to_vec() 4237 } 4238 } 4239 impl From<UciDataSnd> for UciDataPacket { from(packet: UciDataSnd) -> UciDataPacket4240 fn from(packet: UciDataSnd) -> UciDataPacket { 4241 UciDataPacket::new(packet.ucidatapacket).unwrap() 4242 } 4243 } 4244 impl TryFrom<UciDataPacket> for UciDataSnd { 4245 type Error = DecodeError; try_from(packet: UciDataPacket) -> Result<UciDataSnd, Self::Error>4246 fn try_from(packet: UciDataPacket) -> Result<UciDataSnd, Self::Error> { 4247 UciDataSnd::new(packet.ucidatapacket) 4248 } 4249 } 4250 impl UciDataSnd { parse(bytes: &[u8]) -> Result<Self, DecodeError>4251 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 4252 let mut cell = Cell::new(bytes); 4253 let packet = Self::parse_inner(&mut cell)?; 4254 Ok(packet) 4255 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>4256 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 4257 let data = UciDataPacketData::parse_inner(&mut bytes)?; 4258 Self::new(data) 4259 } new(ucidatapacket: UciDataPacketData) -> Result<Self, DecodeError>4260 fn new(ucidatapacket: UciDataPacketData) -> Result<Self, DecodeError> { 4261 let ucidatasnd = match &ucidatapacket.child { 4262 UciDataPacketDataChild::UciDataSnd(value) => value.clone(), 4263 _ => { 4264 return Err(DecodeError::InvalidChildError { 4265 expected: stringify!(UciDataPacketDataChild::UciDataSnd), 4266 actual: format!("{:?}", & ucidatapacket.child), 4267 }); 4268 } 4269 }; 4270 Ok(Self { ucidatapacket, ucidatasnd }) 4271 } get_data(&self) -> &Vec<u8>4272 pub fn get_data(&self) -> &Vec<u8> { 4273 &self.ucidatasnd.data 4274 } get_data_packet_format(&self) -> DataPacketFormat4275 pub fn get_data_packet_format(&self) -> DataPacketFormat { 4276 self.ucidatapacket.data_packet_format 4277 } get_dest_mac_address(&self) -> u644278 pub fn get_dest_mac_address(&self) -> u64 { 4279 self.ucidatasnd.dest_mac_address 4280 } get_message_type(&self) -> MessageType4281 pub fn get_message_type(&self) -> MessageType { 4282 self.ucidatapacket.message_type 4283 } get_session_token(&self) -> u324284 pub fn get_session_token(&self) -> u32 { 4285 self.ucidatasnd.session_token 4286 } get_uci_sequence_number(&self) -> u164287 pub fn get_uci_sequence_number(&self) -> u16 { 4288 self.ucidatasnd.uci_sequence_number 4289 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>4290 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 4291 self.ucidatasnd.write_to(buffer) 4292 } get_size(&self) -> usize4293 pub fn get_size(&self) -> usize { 4294 self.ucidatapacket.get_size() 4295 } 4296 } 4297 impl UciDataSndBuilder { build(self) -> UciDataSnd4298 pub fn build(self) -> UciDataSnd { 4299 let ucidatasnd = UciDataSndData { 4300 data: self.data, 4301 dest_mac_address: self.dest_mac_address, 4302 session_token: self.session_token, 4303 uci_sequence_number: self.uci_sequence_number, 4304 }; 4305 let ucidatapacket = UciDataPacketData { 4306 data_packet_format: DataPacketFormat::DataSnd, 4307 message_type: MessageType::Data, 4308 child: UciDataPacketDataChild::UciDataSnd(ucidatasnd), 4309 }; 4310 UciDataSnd::new(ucidatapacket).unwrap() 4311 } 4312 } 4313 impl From<UciDataSndBuilder> for UciDataPacket { from(builder: UciDataSndBuilder) -> UciDataPacket4314 fn from(builder: UciDataSndBuilder) -> UciDataPacket { 4315 builder.build().into() 4316 } 4317 } 4318 impl From<UciDataSndBuilder> for UciDataSnd { from(builder: UciDataSndBuilder) -> UciDataSnd4319 fn from(builder: UciDataSndBuilder) -> UciDataSnd { 4320 builder.build().into() 4321 } 4322 } 4323 #[derive(Debug, Clone, PartialEq, Eq)] 4324 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4325 pub struct UciDataRcvData { 4326 session_token: u32, 4327 status: StatusCode, 4328 source_mac_address: u64, 4329 uci_sequence_number: u16, 4330 data: Vec<u8>, 4331 } 4332 #[derive(Debug, Clone, PartialEq, Eq)] 4333 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4334 pub struct UciDataRcv { 4335 #[cfg_attr(feature = "serde", serde(flatten))] 4336 ucidatapacket: UciDataPacketData, 4337 #[cfg_attr(feature = "serde", serde(flatten))] 4338 ucidatarcv: UciDataRcvData, 4339 } 4340 #[derive(Debug)] 4341 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4342 pub struct UciDataRcvBuilder { 4343 pub data: Vec<u8>, 4344 pub session_token: u32, 4345 pub source_mac_address: u64, 4346 pub status: StatusCode, 4347 pub uci_sequence_number: u16, 4348 } 4349 impl UciDataRcvData { conforms(bytes: &[u8]) -> bool4350 fn conforms(bytes: &[u8]) -> bool { 4351 bytes.len() >= 17 4352 } parse(bytes: &[u8]) -> Result<Self, DecodeError>4353 fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 4354 let mut cell = Cell::new(bytes); 4355 let packet = Self::parse_inner(&mut cell)?; 4356 Ok(packet) 4357 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>4358 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 4359 if bytes.get().remaining() < 4 { 4360 return Err(DecodeError::InvalidLengthError { 4361 obj: "UciDataRcv", 4362 wanted: 4, 4363 got: bytes.get().remaining(), 4364 }); 4365 } 4366 let session_token = bytes.get_mut().get_u32_le(); 4367 if bytes.get().remaining() < 1 { 4368 return Err(DecodeError::InvalidLengthError { 4369 obj: "UciDataRcv", 4370 wanted: 1, 4371 got: bytes.get().remaining(), 4372 }); 4373 } 4374 let status = StatusCode::try_from(bytes.get_mut().get_u8()) 4375 .map_err(|unknown_val| DecodeError::InvalidEnumValueError { 4376 obj: "UciDataRcv", 4377 field: "status", 4378 value: unknown_val as u64, 4379 type_: "StatusCode", 4380 })?; 4381 if bytes.get().remaining() < 8 { 4382 return Err(DecodeError::InvalidLengthError { 4383 obj: "UciDataRcv", 4384 wanted: 8, 4385 got: bytes.get().remaining(), 4386 }); 4387 } 4388 let source_mac_address = bytes.get_mut().get_u64_le(); 4389 if bytes.get().remaining() < 2 { 4390 return Err(DecodeError::InvalidLengthError { 4391 obj: "UciDataRcv", 4392 wanted: 2, 4393 got: bytes.get().remaining(), 4394 }); 4395 } 4396 let uci_sequence_number = bytes.get_mut().get_u16_le(); 4397 if bytes.get().remaining() < 2 { 4398 return Err(DecodeError::InvalidLengthError { 4399 obj: "UciDataRcv", 4400 wanted: 2, 4401 got: bytes.get().remaining(), 4402 }); 4403 } 4404 let data_size = bytes.get_mut().get_u16_le() as usize; 4405 if bytes.get().remaining() < data_size { 4406 return Err(DecodeError::InvalidLengthError { 4407 obj: "UciDataRcv", 4408 wanted: data_size, 4409 got: bytes.get().remaining(), 4410 }); 4411 } 4412 let mut data = Vec::with_capacity(data_size); 4413 for _ in 0..data_size { 4414 data.push(Ok::<_, DecodeError>(bytes.get_mut().get_u8())?); 4415 } 4416 Ok(Self { 4417 session_token, 4418 status, 4419 source_mac_address, 4420 uci_sequence_number, 4421 data, 4422 }) 4423 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>4424 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 4425 buffer.put_u32_le(self.session_token); 4426 buffer.put_u8(u8::from(self.status)); 4427 buffer.put_u64_le(self.source_mac_address); 4428 buffer.put_u16_le(self.uci_sequence_number); 4429 if self.data.len() > 0xffff { 4430 return Err(EncodeError::SizeOverflow { 4431 packet: "UciDataRcv", 4432 field: "data", 4433 size: self.data.len(), 4434 maximum_size: 0xffff, 4435 }); 4436 } 4437 buffer.put_u16_le(self.data.len() as u16); 4438 for elem in &self.data { 4439 buffer.put_u8(*elem); 4440 } 4441 Ok(()) 4442 } get_total_size(&self) -> usize4443 fn get_total_size(&self) -> usize { 4444 self.get_size() 4445 } get_size(&self) -> usize4446 fn get_size(&self) -> usize { 4447 17 + self.data.len() 4448 } 4449 } 4450 impl Packet for UciDataRcv { encoded_len(&self) -> usize4451 fn encoded_len(&self) -> usize { 4452 self.get_size() 4453 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>4454 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 4455 self.ucidatapacket.write_to(buf) 4456 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>4457 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 4458 unimplemented!("Rust legacy does not implement full packet trait") 4459 } 4460 } 4461 impl TryFrom<UciDataRcv> for Bytes { 4462 type Error = EncodeError; try_from(packet: UciDataRcv) -> Result<Self, Self::Error>4463 fn try_from(packet: UciDataRcv) -> Result<Self, Self::Error> { 4464 packet.encode_to_bytes() 4465 } 4466 } 4467 impl TryFrom<UciDataRcv> for Vec<u8> { 4468 type Error = EncodeError; try_from(packet: UciDataRcv) -> Result<Self, Self::Error>4469 fn try_from(packet: UciDataRcv) -> Result<Self, Self::Error> { 4470 packet.encode_to_vec() 4471 } 4472 } 4473 impl From<UciDataRcv> for UciDataPacket { from(packet: UciDataRcv) -> UciDataPacket4474 fn from(packet: UciDataRcv) -> UciDataPacket { 4475 UciDataPacket::new(packet.ucidatapacket).unwrap() 4476 } 4477 } 4478 impl TryFrom<UciDataPacket> for UciDataRcv { 4479 type Error = DecodeError; try_from(packet: UciDataPacket) -> Result<UciDataRcv, Self::Error>4480 fn try_from(packet: UciDataPacket) -> Result<UciDataRcv, Self::Error> { 4481 UciDataRcv::new(packet.ucidatapacket) 4482 } 4483 } 4484 impl UciDataRcv { parse(bytes: &[u8]) -> Result<Self, DecodeError>4485 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 4486 let mut cell = Cell::new(bytes); 4487 let packet = Self::parse_inner(&mut cell)?; 4488 Ok(packet) 4489 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>4490 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 4491 let data = UciDataPacketData::parse_inner(&mut bytes)?; 4492 Self::new(data) 4493 } new(ucidatapacket: UciDataPacketData) -> Result<Self, DecodeError>4494 fn new(ucidatapacket: UciDataPacketData) -> Result<Self, DecodeError> { 4495 let ucidatarcv = match &ucidatapacket.child { 4496 UciDataPacketDataChild::UciDataRcv(value) => value.clone(), 4497 _ => { 4498 return Err(DecodeError::InvalidChildError { 4499 expected: stringify!(UciDataPacketDataChild::UciDataRcv), 4500 actual: format!("{:?}", & ucidatapacket.child), 4501 }); 4502 } 4503 }; 4504 Ok(Self { ucidatapacket, ucidatarcv }) 4505 } get_data(&self) -> &Vec<u8>4506 pub fn get_data(&self) -> &Vec<u8> { 4507 &self.ucidatarcv.data 4508 } get_data_packet_format(&self) -> DataPacketFormat4509 pub fn get_data_packet_format(&self) -> DataPacketFormat { 4510 self.ucidatapacket.data_packet_format 4511 } get_message_type(&self) -> MessageType4512 pub fn get_message_type(&self) -> MessageType { 4513 self.ucidatapacket.message_type 4514 } get_session_token(&self) -> u324515 pub fn get_session_token(&self) -> u32 { 4516 self.ucidatarcv.session_token 4517 } get_source_mac_address(&self) -> u644518 pub fn get_source_mac_address(&self) -> u64 { 4519 self.ucidatarcv.source_mac_address 4520 } get_status(&self) -> StatusCode4521 pub fn get_status(&self) -> StatusCode { 4522 self.ucidatarcv.status 4523 } get_uci_sequence_number(&self) -> u164524 pub fn get_uci_sequence_number(&self) -> u16 { 4525 self.ucidatarcv.uci_sequence_number 4526 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>4527 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 4528 self.ucidatarcv.write_to(buffer) 4529 } get_size(&self) -> usize4530 pub fn get_size(&self) -> usize { 4531 self.ucidatapacket.get_size() 4532 } 4533 } 4534 impl UciDataRcvBuilder { build(self) -> UciDataRcv4535 pub fn build(self) -> UciDataRcv { 4536 let ucidatarcv = UciDataRcvData { 4537 data: self.data, 4538 session_token: self.session_token, 4539 source_mac_address: self.source_mac_address, 4540 status: self.status, 4541 uci_sequence_number: self.uci_sequence_number, 4542 }; 4543 let ucidatapacket = UciDataPacketData { 4544 data_packet_format: DataPacketFormat::DataRcv, 4545 message_type: MessageType::Data, 4546 child: UciDataPacketDataChild::UciDataRcv(ucidatarcv), 4547 }; 4548 UciDataRcv::new(ucidatapacket).unwrap() 4549 } 4550 } 4551 impl From<UciDataRcvBuilder> for UciDataPacket { from(builder: UciDataRcvBuilder) -> UciDataPacket4552 fn from(builder: UciDataRcvBuilder) -> UciDataPacket { 4553 builder.build().into() 4554 } 4555 } 4556 impl From<UciDataRcvBuilder> for UciDataRcv { from(builder: UciDataRcvBuilder) -> UciDataRcv4557 fn from(builder: UciDataRcvBuilder) -> UciDataRcv { 4558 builder.build().into() 4559 } 4560 } 4561 #[derive(Debug, Clone, PartialEq, Eq)] 4562 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4563 pub enum UciCommandDataChild { 4564 CoreCommand(CoreCommandData), 4565 SessionConfigCommand(SessionConfigCommandData), 4566 SessionControlCommand(SessionControlCommandData), 4567 AndroidCommand(AndroidCommandData), 4568 TestCommand(TestCommandData), 4569 Payload(Bytes), 4570 None, 4571 } 4572 impl UciCommandDataChild { get_total_size(&self) -> usize4573 fn get_total_size(&self) -> usize { 4574 match self { 4575 UciCommandDataChild::CoreCommand(value) => value.get_total_size(), 4576 UciCommandDataChild::SessionConfigCommand(value) => value.get_total_size(), 4577 UciCommandDataChild::SessionControlCommand(value) => value.get_total_size(), 4578 UciCommandDataChild::AndroidCommand(value) => value.get_total_size(), 4579 UciCommandDataChild::TestCommand(value) => value.get_total_size(), 4580 UciCommandDataChild::Payload(bytes) => bytes.len(), 4581 UciCommandDataChild::None => 0, 4582 } 4583 } 4584 } 4585 #[derive(Debug, Clone, PartialEq, Eq)] 4586 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4587 pub enum UciCommandChild { 4588 CoreCommand(CoreCommand), 4589 SessionConfigCommand(SessionConfigCommand), 4590 SessionControlCommand(SessionControlCommand), 4591 AndroidCommand(AndroidCommand), 4592 TestCommand(TestCommand), 4593 Payload(Bytes), 4594 None, 4595 } 4596 #[derive(Debug, Clone, PartialEq, Eq)] 4597 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4598 pub struct UciCommandData { 4599 child: UciCommandDataChild, 4600 } 4601 #[derive(Debug, Clone, PartialEq, Eq)] 4602 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4603 pub struct UciCommand { 4604 #[cfg_attr(feature = "serde", serde(flatten))] 4605 ucicontrolpacket: UciControlPacketData, 4606 #[cfg_attr(feature = "serde", serde(flatten))] 4607 ucicommand: UciCommandData, 4608 } 4609 #[derive(Debug)] 4610 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4611 pub struct UciCommandBuilder { 4612 pub group_id: GroupId, 4613 pub opcode: u8, 4614 pub payload: Option<Bytes>, 4615 } 4616 impl UciCommandData { conforms(bytes: &[u8]) -> bool4617 fn conforms(bytes: &[u8]) -> bool { 4618 true 4619 } parse(bytes: &[u8], group_id: GroupId, opcode: u8) -> Result<Self, DecodeError>4620 fn parse(bytes: &[u8], group_id: GroupId, opcode: u8) -> Result<Self, DecodeError> { 4621 let mut cell = Cell::new(bytes); 4622 let packet = Self::parse_inner(&mut cell, group_id, opcode)?; 4623 Ok(packet) 4624 } parse_inner( mut bytes: &mut Cell<&[u8]>, group_id: GroupId, opcode: u8, ) -> Result<Self, DecodeError>4625 fn parse_inner( 4626 mut bytes: &mut Cell<&[u8]>, 4627 group_id: GroupId, 4628 opcode: u8, 4629 ) -> Result<Self, DecodeError> { 4630 let payload = bytes.get(); 4631 bytes.get_mut().advance(payload.len()); 4632 let child = match (group_id) { 4633 (GroupId::Core) if CoreCommandData::conforms(&payload) => { 4634 let mut cell = Cell::new(payload); 4635 let child_data = CoreCommandData::parse_inner(&mut cell, opcode)?; 4636 UciCommandDataChild::CoreCommand(child_data) 4637 } 4638 (GroupId::SessionConfig) if SessionConfigCommandData::conforms(&payload) => { 4639 let mut cell = Cell::new(payload); 4640 let child_data = SessionConfigCommandData::parse_inner( 4641 &mut cell, 4642 opcode, 4643 )?; 4644 UciCommandDataChild::SessionConfigCommand(child_data) 4645 } 4646 (GroupId::SessionControl) if SessionControlCommandData::conforms( 4647 &payload, 4648 ) => { 4649 let mut cell = Cell::new(payload); 4650 let child_data = SessionControlCommandData::parse_inner( 4651 &mut cell, 4652 opcode, 4653 )?; 4654 UciCommandDataChild::SessionControlCommand(child_data) 4655 } 4656 (GroupId::VendorAndroid) if AndroidCommandData::conforms(&payload) => { 4657 let mut cell = Cell::new(payload); 4658 let child_data = AndroidCommandData::parse_inner(&mut cell, opcode)?; 4659 UciCommandDataChild::AndroidCommand(child_data) 4660 } 4661 (GroupId::Test) if TestCommandData::conforms(&payload) => { 4662 let mut cell = Cell::new(payload); 4663 let child_data = TestCommandData::parse_inner(&mut cell, opcode)?; 4664 UciCommandDataChild::TestCommand(child_data) 4665 } 4666 _ if !payload.is_empty() => { 4667 UciCommandDataChild::Payload(Bytes::copy_from_slice(payload)) 4668 } 4669 _ => UciCommandDataChild::None, 4670 }; 4671 Ok(Self { child }) 4672 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>4673 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 4674 match &self.child { 4675 UciCommandDataChild::CoreCommand(child) => child.write_to(buffer)?, 4676 UciCommandDataChild::SessionConfigCommand(child) => child.write_to(buffer)?, 4677 UciCommandDataChild::SessionControlCommand(child) => child.write_to(buffer)?, 4678 UciCommandDataChild::AndroidCommand(child) => child.write_to(buffer)?, 4679 UciCommandDataChild::TestCommand(child) => child.write_to(buffer)?, 4680 UciCommandDataChild::Payload(payload) => buffer.put_slice(payload), 4681 UciCommandDataChild::None => {} 4682 } 4683 Ok(()) 4684 } get_total_size(&self) -> usize4685 fn get_total_size(&self) -> usize { 4686 self.get_size() 4687 } get_size(&self) -> usize4688 fn get_size(&self) -> usize { 4689 self.child.get_total_size() 4690 } 4691 } 4692 impl Packet for UciCommand { encoded_len(&self) -> usize4693 fn encoded_len(&self) -> usize { 4694 self.get_size() 4695 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>4696 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 4697 self.ucicontrolpacket.write_to(buf) 4698 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>4699 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 4700 unimplemented!("Rust legacy does not implement full packet trait") 4701 } 4702 } 4703 impl TryFrom<UciCommand> for Bytes { 4704 type Error = EncodeError; try_from(packet: UciCommand) -> Result<Self, Self::Error>4705 fn try_from(packet: UciCommand) -> Result<Self, Self::Error> { 4706 packet.encode_to_bytes() 4707 } 4708 } 4709 impl TryFrom<UciCommand> for Vec<u8> { 4710 type Error = EncodeError; try_from(packet: UciCommand) -> Result<Self, Self::Error>4711 fn try_from(packet: UciCommand) -> Result<Self, Self::Error> { 4712 packet.encode_to_vec() 4713 } 4714 } 4715 impl From<UciCommand> for UciControlPacket { from(packet: UciCommand) -> UciControlPacket4716 fn from(packet: UciCommand) -> UciControlPacket { 4717 UciControlPacket::new(packet.ucicontrolpacket).unwrap() 4718 } 4719 } 4720 impl TryFrom<UciControlPacket> for UciCommand { 4721 type Error = DecodeError; try_from(packet: UciControlPacket) -> Result<UciCommand, Self::Error>4722 fn try_from(packet: UciControlPacket) -> Result<UciCommand, Self::Error> { 4723 UciCommand::new(packet.ucicontrolpacket) 4724 } 4725 } 4726 impl UciCommand { parse(bytes: &[u8]) -> Result<Self, DecodeError>4727 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 4728 let mut cell = Cell::new(bytes); 4729 let packet = Self::parse_inner(&mut cell)?; 4730 Ok(packet) 4731 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>4732 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 4733 let data = UciControlPacketData::parse_inner(&mut bytes)?; 4734 Self::new(data) 4735 } specialize(&self) -> UciCommandChild4736 pub fn specialize(&self) -> UciCommandChild { 4737 match &self.ucicommand.child { 4738 UciCommandDataChild::CoreCommand(_) => { 4739 UciCommandChild::CoreCommand( 4740 CoreCommand::new(self.ucicontrolpacket.clone()).unwrap(), 4741 ) 4742 } 4743 UciCommandDataChild::SessionConfigCommand(_) => { 4744 UciCommandChild::SessionConfigCommand( 4745 SessionConfigCommand::new(self.ucicontrolpacket.clone()).unwrap(), 4746 ) 4747 } 4748 UciCommandDataChild::SessionControlCommand(_) => { 4749 UciCommandChild::SessionControlCommand( 4750 SessionControlCommand::new(self.ucicontrolpacket.clone()).unwrap(), 4751 ) 4752 } 4753 UciCommandDataChild::AndroidCommand(_) => { 4754 UciCommandChild::AndroidCommand( 4755 AndroidCommand::new(self.ucicontrolpacket.clone()).unwrap(), 4756 ) 4757 } 4758 UciCommandDataChild::TestCommand(_) => { 4759 UciCommandChild::TestCommand( 4760 TestCommand::new(self.ucicontrolpacket.clone()).unwrap(), 4761 ) 4762 } 4763 UciCommandDataChild::Payload(payload) => { 4764 UciCommandChild::Payload(payload.clone()) 4765 } 4766 UciCommandDataChild::None => UciCommandChild::None, 4767 } 4768 } new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError>4769 fn new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError> { 4770 let ucicommand = match &ucicontrolpacket.child { 4771 UciControlPacketDataChild::UciCommand(value) => value.clone(), 4772 _ => { 4773 return Err(DecodeError::InvalidChildError { 4774 expected: stringify!(UciControlPacketDataChild::UciCommand), 4775 actual: format!("{:?}", & ucicontrolpacket.child), 4776 }); 4777 } 4778 }; 4779 Ok(Self { 4780 ucicontrolpacket, 4781 ucicommand, 4782 }) 4783 } get_group_id(&self) -> GroupId4784 pub fn get_group_id(&self) -> GroupId { 4785 self.ucicontrolpacket.group_id 4786 } get_message_type(&self) -> MessageType4787 pub fn get_message_type(&self) -> MessageType { 4788 self.ucicontrolpacket.message_type 4789 } get_opcode(&self) -> u84790 pub fn get_opcode(&self) -> u8 { 4791 self.ucicontrolpacket.opcode 4792 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>4793 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 4794 self.ucicommand.write_to(buffer) 4795 } get_size(&self) -> usize4796 pub fn get_size(&self) -> usize { 4797 self.ucicontrolpacket.get_size() 4798 } 4799 } 4800 impl UciCommandBuilder { build(self) -> UciCommand4801 pub fn build(self) -> UciCommand { 4802 let ucicommand = UciCommandData { 4803 child: match self.payload { 4804 None => UciCommandDataChild::None, 4805 Some(bytes) => UciCommandDataChild::Payload(bytes), 4806 }, 4807 }; 4808 let ucicontrolpacket = UciControlPacketData { 4809 group_id: self.group_id, 4810 message_type: MessageType::Command, 4811 opcode: self.opcode, 4812 child: UciControlPacketDataChild::UciCommand(ucicommand), 4813 }; 4814 UciCommand::new(ucicontrolpacket).unwrap() 4815 } 4816 } 4817 impl From<UciCommandBuilder> for UciControlPacket { from(builder: UciCommandBuilder) -> UciControlPacket4818 fn from(builder: UciCommandBuilder) -> UciControlPacket { 4819 builder.build().into() 4820 } 4821 } 4822 impl From<UciCommandBuilder> for UciCommand { from(builder: UciCommandBuilder) -> UciCommand4823 fn from(builder: UciCommandBuilder) -> UciCommand { 4824 builder.build().into() 4825 } 4826 } 4827 #[derive(Debug, Clone, PartialEq, Eq)] 4828 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4829 pub enum UciResponseDataChild { 4830 CoreResponse(CoreResponseData), 4831 SessionConfigResponse(SessionConfigResponseData), 4832 SessionControlResponse(SessionControlResponseData), 4833 AndroidResponse(AndroidResponseData), 4834 TestResponse(TestResponseData), 4835 UciVendor_9_Response(UciVendor_9_ResponseData), 4836 UciVendor_A_Response(UciVendor_A_ResponseData), 4837 UciVendor_B_Response(UciVendor_B_ResponseData), 4838 UciVendor_E_Response(UciVendor_E_ResponseData), 4839 UciVendor_F_Response(UciVendor_F_ResponseData), 4840 Payload(Bytes), 4841 None, 4842 } 4843 impl UciResponseDataChild { get_total_size(&self) -> usize4844 fn get_total_size(&self) -> usize { 4845 match self { 4846 UciResponseDataChild::CoreResponse(value) => value.get_total_size(), 4847 UciResponseDataChild::SessionConfigResponse(value) => value.get_total_size(), 4848 UciResponseDataChild::SessionControlResponse(value) => value.get_total_size(), 4849 UciResponseDataChild::AndroidResponse(value) => value.get_total_size(), 4850 UciResponseDataChild::TestResponse(value) => value.get_total_size(), 4851 UciResponseDataChild::UciVendor_9_Response(value) => value.get_total_size(), 4852 UciResponseDataChild::UciVendor_A_Response(value) => value.get_total_size(), 4853 UciResponseDataChild::UciVendor_B_Response(value) => value.get_total_size(), 4854 UciResponseDataChild::UciVendor_E_Response(value) => value.get_total_size(), 4855 UciResponseDataChild::UciVendor_F_Response(value) => value.get_total_size(), 4856 UciResponseDataChild::Payload(bytes) => bytes.len(), 4857 UciResponseDataChild::None => 0, 4858 } 4859 } 4860 } 4861 #[derive(Debug, Clone, PartialEq, Eq)] 4862 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4863 pub enum UciResponseChild { 4864 CoreResponse(CoreResponse), 4865 SessionConfigResponse(SessionConfigResponse), 4866 SessionControlResponse(SessionControlResponse), 4867 AndroidResponse(AndroidResponse), 4868 TestResponse(TestResponse), 4869 UciVendor_9_Response(UciVendor_9_Response), 4870 UciVendor_A_Response(UciVendor_A_Response), 4871 UciVendor_B_Response(UciVendor_B_Response), 4872 UciVendor_E_Response(UciVendor_E_Response), 4873 UciVendor_F_Response(UciVendor_F_Response), 4874 Payload(Bytes), 4875 None, 4876 } 4877 #[derive(Debug, Clone, PartialEq, Eq)] 4878 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4879 pub struct UciResponseData { 4880 child: UciResponseDataChild, 4881 } 4882 #[derive(Debug, Clone, PartialEq, Eq)] 4883 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4884 pub struct UciResponse { 4885 #[cfg_attr(feature = "serde", serde(flatten))] 4886 ucicontrolpacket: UciControlPacketData, 4887 #[cfg_attr(feature = "serde", serde(flatten))] 4888 uciresponse: UciResponseData, 4889 } 4890 #[derive(Debug)] 4891 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 4892 pub struct UciResponseBuilder { 4893 pub group_id: GroupId, 4894 pub opcode: u8, 4895 pub payload: Option<Bytes>, 4896 } 4897 impl UciResponseData { conforms(bytes: &[u8]) -> bool4898 fn conforms(bytes: &[u8]) -> bool { 4899 true 4900 } parse(bytes: &[u8], group_id: GroupId, opcode: u8) -> Result<Self, DecodeError>4901 fn parse(bytes: &[u8], group_id: GroupId, opcode: u8) -> Result<Self, DecodeError> { 4902 let mut cell = Cell::new(bytes); 4903 let packet = Self::parse_inner(&mut cell, group_id, opcode)?; 4904 Ok(packet) 4905 } parse_inner( mut bytes: &mut Cell<&[u8]>, group_id: GroupId, opcode: u8, ) -> Result<Self, DecodeError>4906 fn parse_inner( 4907 mut bytes: &mut Cell<&[u8]>, 4908 group_id: GroupId, 4909 opcode: u8, 4910 ) -> Result<Self, DecodeError> { 4911 let payload = bytes.get(); 4912 bytes.get_mut().advance(payload.len()); 4913 let child = match (group_id) { 4914 (GroupId::Core) if CoreResponseData::conforms(&payload) => { 4915 let mut cell = Cell::new(payload); 4916 let child_data = CoreResponseData::parse_inner(&mut cell, opcode)?; 4917 UciResponseDataChild::CoreResponse(child_data) 4918 } 4919 (GroupId::SessionConfig) if SessionConfigResponseData::conforms( 4920 &payload, 4921 ) => { 4922 let mut cell = Cell::new(payload); 4923 let child_data = SessionConfigResponseData::parse_inner( 4924 &mut cell, 4925 opcode, 4926 )?; 4927 UciResponseDataChild::SessionConfigResponse(child_data) 4928 } 4929 (GroupId::SessionControl) if SessionControlResponseData::conforms( 4930 &payload, 4931 ) => { 4932 let mut cell = Cell::new(payload); 4933 let child_data = SessionControlResponseData::parse_inner( 4934 &mut cell, 4935 opcode, 4936 )?; 4937 UciResponseDataChild::SessionControlResponse(child_data) 4938 } 4939 (GroupId::VendorAndroid) if AndroidResponseData::conforms(&payload) => { 4940 let mut cell = Cell::new(payload); 4941 let child_data = AndroidResponseData::parse_inner(&mut cell, opcode)?; 4942 UciResponseDataChild::AndroidResponse(child_data) 4943 } 4944 (GroupId::Test) if TestResponseData::conforms(&payload) => { 4945 let mut cell = Cell::new(payload); 4946 let child_data = TestResponseData::parse_inner(&mut cell, opcode)?; 4947 UciResponseDataChild::TestResponse(child_data) 4948 } 4949 (GroupId::VendorReserved9) if UciVendor_9_ResponseData::conforms( 4950 &payload, 4951 ) => { 4952 let mut cell = Cell::new(payload); 4953 let child_data = UciVendor_9_ResponseData::parse_inner(&mut cell)?; 4954 UciResponseDataChild::UciVendor_9_Response(child_data) 4955 } 4956 (GroupId::VendorReservedA) if UciVendor_A_ResponseData::conforms( 4957 &payload, 4958 ) => { 4959 let mut cell = Cell::new(payload); 4960 let child_data = UciVendor_A_ResponseData::parse_inner(&mut cell)?; 4961 UciResponseDataChild::UciVendor_A_Response(child_data) 4962 } 4963 (GroupId::VendorReservedB) if UciVendor_B_ResponseData::conforms( 4964 &payload, 4965 ) => { 4966 let mut cell = Cell::new(payload); 4967 let child_data = UciVendor_B_ResponseData::parse_inner(&mut cell)?; 4968 UciResponseDataChild::UciVendor_B_Response(child_data) 4969 } 4970 (GroupId::VendorReservedE) if UciVendor_E_ResponseData::conforms( 4971 &payload, 4972 ) => { 4973 let mut cell = Cell::new(payload); 4974 let child_data = UciVendor_E_ResponseData::parse_inner(&mut cell)?; 4975 UciResponseDataChild::UciVendor_E_Response(child_data) 4976 } 4977 (GroupId::VendorReservedF) if UciVendor_F_ResponseData::conforms( 4978 &payload, 4979 ) => { 4980 let mut cell = Cell::new(payload); 4981 let child_data = UciVendor_F_ResponseData::parse_inner(&mut cell)?; 4982 UciResponseDataChild::UciVendor_F_Response(child_data) 4983 } 4984 _ if !payload.is_empty() => { 4985 UciResponseDataChild::Payload(Bytes::copy_from_slice(payload)) 4986 } 4987 _ => UciResponseDataChild::None, 4988 }; 4989 Ok(Self { child }) 4990 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>4991 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 4992 match &self.child { 4993 UciResponseDataChild::CoreResponse(child) => child.write_to(buffer)?, 4994 UciResponseDataChild::SessionConfigResponse(child) => child.write_to(buffer)?, 4995 UciResponseDataChild::SessionControlResponse(child) => { 4996 child.write_to(buffer)? 4997 } 4998 UciResponseDataChild::AndroidResponse(child) => child.write_to(buffer)?, 4999 UciResponseDataChild::TestResponse(child) => child.write_to(buffer)?, 5000 UciResponseDataChild::UciVendor_9_Response(child) => child.write_to(buffer)?, 5001 UciResponseDataChild::UciVendor_A_Response(child) => child.write_to(buffer)?, 5002 UciResponseDataChild::UciVendor_B_Response(child) => child.write_to(buffer)?, 5003 UciResponseDataChild::UciVendor_E_Response(child) => child.write_to(buffer)?, 5004 UciResponseDataChild::UciVendor_F_Response(child) => child.write_to(buffer)?, 5005 UciResponseDataChild::Payload(payload) => buffer.put_slice(payload), 5006 UciResponseDataChild::None => {} 5007 } 5008 Ok(()) 5009 } get_total_size(&self) -> usize5010 fn get_total_size(&self) -> usize { 5011 self.get_size() 5012 } get_size(&self) -> usize5013 fn get_size(&self) -> usize { 5014 self.child.get_total_size() 5015 } 5016 } 5017 impl Packet for UciResponse { encoded_len(&self) -> usize5018 fn encoded_len(&self) -> usize { 5019 self.get_size() 5020 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>5021 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 5022 self.ucicontrolpacket.write_to(buf) 5023 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>5024 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 5025 unimplemented!("Rust legacy does not implement full packet trait") 5026 } 5027 } 5028 impl TryFrom<UciResponse> for Bytes { 5029 type Error = EncodeError; try_from(packet: UciResponse) -> Result<Self, Self::Error>5030 fn try_from(packet: UciResponse) -> Result<Self, Self::Error> { 5031 packet.encode_to_bytes() 5032 } 5033 } 5034 impl TryFrom<UciResponse> for Vec<u8> { 5035 type Error = EncodeError; try_from(packet: UciResponse) -> Result<Self, Self::Error>5036 fn try_from(packet: UciResponse) -> Result<Self, Self::Error> { 5037 packet.encode_to_vec() 5038 } 5039 } 5040 impl From<UciResponse> for UciControlPacket { from(packet: UciResponse) -> UciControlPacket5041 fn from(packet: UciResponse) -> UciControlPacket { 5042 UciControlPacket::new(packet.ucicontrolpacket).unwrap() 5043 } 5044 } 5045 impl TryFrom<UciControlPacket> for UciResponse { 5046 type Error = DecodeError; try_from(packet: UciControlPacket) -> Result<UciResponse, Self::Error>5047 fn try_from(packet: UciControlPacket) -> Result<UciResponse, Self::Error> { 5048 UciResponse::new(packet.ucicontrolpacket) 5049 } 5050 } 5051 impl UciResponse { parse(bytes: &[u8]) -> Result<Self, DecodeError>5052 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 5053 let mut cell = Cell::new(bytes); 5054 let packet = Self::parse_inner(&mut cell)?; 5055 Ok(packet) 5056 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>5057 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 5058 let data = UciControlPacketData::parse_inner(&mut bytes)?; 5059 Self::new(data) 5060 } specialize(&self) -> UciResponseChild5061 pub fn specialize(&self) -> UciResponseChild { 5062 match &self.uciresponse.child { 5063 UciResponseDataChild::CoreResponse(_) => { 5064 UciResponseChild::CoreResponse( 5065 CoreResponse::new(self.ucicontrolpacket.clone()).unwrap(), 5066 ) 5067 } 5068 UciResponseDataChild::SessionConfigResponse(_) => { 5069 UciResponseChild::SessionConfigResponse( 5070 SessionConfigResponse::new(self.ucicontrolpacket.clone()).unwrap(), 5071 ) 5072 } 5073 UciResponseDataChild::SessionControlResponse(_) => { 5074 UciResponseChild::SessionControlResponse( 5075 SessionControlResponse::new(self.ucicontrolpacket.clone()).unwrap(), 5076 ) 5077 } 5078 UciResponseDataChild::AndroidResponse(_) => { 5079 UciResponseChild::AndroidResponse( 5080 AndroidResponse::new(self.ucicontrolpacket.clone()).unwrap(), 5081 ) 5082 } 5083 UciResponseDataChild::TestResponse(_) => { 5084 UciResponseChild::TestResponse( 5085 TestResponse::new(self.ucicontrolpacket.clone()).unwrap(), 5086 ) 5087 } 5088 UciResponseDataChild::UciVendor_9_Response(_) => { 5089 UciResponseChild::UciVendor_9_Response( 5090 UciVendor_9_Response::new(self.ucicontrolpacket.clone()).unwrap(), 5091 ) 5092 } 5093 UciResponseDataChild::UciVendor_A_Response(_) => { 5094 UciResponseChild::UciVendor_A_Response( 5095 UciVendor_A_Response::new(self.ucicontrolpacket.clone()).unwrap(), 5096 ) 5097 } 5098 UciResponseDataChild::UciVendor_B_Response(_) => { 5099 UciResponseChild::UciVendor_B_Response( 5100 UciVendor_B_Response::new(self.ucicontrolpacket.clone()).unwrap(), 5101 ) 5102 } 5103 UciResponseDataChild::UciVendor_E_Response(_) => { 5104 UciResponseChild::UciVendor_E_Response( 5105 UciVendor_E_Response::new(self.ucicontrolpacket.clone()).unwrap(), 5106 ) 5107 } 5108 UciResponseDataChild::UciVendor_F_Response(_) => { 5109 UciResponseChild::UciVendor_F_Response( 5110 UciVendor_F_Response::new(self.ucicontrolpacket.clone()).unwrap(), 5111 ) 5112 } 5113 UciResponseDataChild::Payload(payload) => { 5114 UciResponseChild::Payload(payload.clone()) 5115 } 5116 UciResponseDataChild::None => UciResponseChild::None, 5117 } 5118 } new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError>5119 fn new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError> { 5120 let uciresponse = match &ucicontrolpacket.child { 5121 UciControlPacketDataChild::UciResponse(value) => value.clone(), 5122 _ => { 5123 return Err(DecodeError::InvalidChildError { 5124 expected: stringify!(UciControlPacketDataChild::UciResponse), 5125 actual: format!("{:?}", & ucicontrolpacket.child), 5126 }); 5127 } 5128 }; 5129 Ok(Self { 5130 ucicontrolpacket, 5131 uciresponse, 5132 }) 5133 } get_group_id(&self) -> GroupId5134 pub fn get_group_id(&self) -> GroupId { 5135 self.ucicontrolpacket.group_id 5136 } get_message_type(&self) -> MessageType5137 pub fn get_message_type(&self) -> MessageType { 5138 self.ucicontrolpacket.message_type 5139 } get_opcode(&self) -> u85140 pub fn get_opcode(&self) -> u8 { 5141 self.ucicontrolpacket.opcode 5142 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>5143 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 5144 self.uciresponse.write_to(buffer) 5145 } get_size(&self) -> usize5146 pub fn get_size(&self) -> usize { 5147 self.ucicontrolpacket.get_size() 5148 } 5149 } 5150 impl UciResponseBuilder { build(self) -> UciResponse5151 pub fn build(self) -> UciResponse { 5152 let uciresponse = UciResponseData { 5153 child: match self.payload { 5154 None => UciResponseDataChild::None, 5155 Some(bytes) => UciResponseDataChild::Payload(bytes), 5156 }, 5157 }; 5158 let ucicontrolpacket = UciControlPacketData { 5159 group_id: self.group_id, 5160 message_type: MessageType::Response, 5161 opcode: self.opcode, 5162 child: UciControlPacketDataChild::UciResponse(uciresponse), 5163 }; 5164 UciResponse::new(ucicontrolpacket).unwrap() 5165 } 5166 } 5167 impl From<UciResponseBuilder> for UciControlPacket { from(builder: UciResponseBuilder) -> UciControlPacket5168 fn from(builder: UciResponseBuilder) -> UciControlPacket { 5169 builder.build().into() 5170 } 5171 } 5172 impl From<UciResponseBuilder> for UciResponse { from(builder: UciResponseBuilder) -> UciResponse5173 fn from(builder: UciResponseBuilder) -> UciResponse { 5174 builder.build().into() 5175 } 5176 } 5177 #[derive(Debug, Clone, PartialEq, Eq)] 5178 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5179 pub enum UciNotificationDataChild { 5180 CoreNotification(CoreNotificationData), 5181 SessionConfigNotification(SessionConfigNotificationData), 5182 SessionControlNotification(SessionControlNotificationData), 5183 AndroidNotification(AndroidNotificationData), 5184 TestNotification(TestNotificationData), 5185 UciVendor_9_Notification(UciVendor_9_NotificationData), 5186 UciVendor_A_Notification(UciVendor_A_NotificationData), 5187 UciVendor_B_Notification(UciVendor_B_NotificationData), 5188 UciVendor_E_Notification(UciVendor_E_NotificationData), 5189 UciVendor_F_Notification(UciVendor_F_NotificationData), 5190 Payload(Bytes), 5191 None, 5192 } 5193 impl UciNotificationDataChild { get_total_size(&self) -> usize5194 fn get_total_size(&self) -> usize { 5195 match self { 5196 UciNotificationDataChild::CoreNotification(value) => value.get_total_size(), 5197 UciNotificationDataChild::SessionConfigNotification(value) => { 5198 value.get_total_size() 5199 } 5200 UciNotificationDataChild::SessionControlNotification(value) => { 5201 value.get_total_size() 5202 } 5203 UciNotificationDataChild::AndroidNotification(value) => { 5204 value.get_total_size() 5205 } 5206 UciNotificationDataChild::TestNotification(value) => value.get_total_size(), 5207 UciNotificationDataChild::UciVendor_9_Notification(value) => { 5208 value.get_total_size() 5209 } 5210 UciNotificationDataChild::UciVendor_A_Notification(value) => { 5211 value.get_total_size() 5212 } 5213 UciNotificationDataChild::UciVendor_B_Notification(value) => { 5214 value.get_total_size() 5215 } 5216 UciNotificationDataChild::UciVendor_E_Notification(value) => { 5217 value.get_total_size() 5218 } 5219 UciNotificationDataChild::UciVendor_F_Notification(value) => { 5220 value.get_total_size() 5221 } 5222 UciNotificationDataChild::Payload(bytes) => bytes.len(), 5223 UciNotificationDataChild::None => 0, 5224 } 5225 } 5226 } 5227 #[derive(Debug, Clone, PartialEq, Eq)] 5228 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5229 pub enum UciNotificationChild { 5230 CoreNotification(CoreNotification), 5231 SessionConfigNotification(SessionConfigNotification), 5232 SessionControlNotification(SessionControlNotification), 5233 AndroidNotification(AndroidNotification), 5234 TestNotification(TestNotification), 5235 UciVendor_9_Notification(UciVendor_9_Notification), 5236 UciVendor_A_Notification(UciVendor_A_Notification), 5237 UciVendor_B_Notification(UciVendor_B_Notification), 5238 UciVendor_E_Notification(UciVendor_E_Notification), 5239 UciVendor_F_Notification(UciVendor_F_Notification), 5240 Payload(Bytes), 5241 None, 5242 } 5243 #[derive(Debug, Clone, PartialEq, Eq)] 5244 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5245 pub struct UciNotificationData { 5246 child: UciNotificationDataChild, 5247 } 5248 #[derive(Debug, Clone, PartialEq, Eq)] 5249 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5250 pub struct UciNotification { 5251 #[cfg_attr(feature = "serde", serde(flatten))] 5252 ucicontrolpacket: UciControlPacketData, 5253 #[cfg_attr(feature = "serde", serde(flatten))] 5254 ucinotification: UciNotificationData, 5255 } 5256 #[derive(Debug)] 5257 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5258 pub struct UciNotificationBuilder { 5259 pub group_id: GroupId, 5260 pub opcode: u8, 5261 pub payload: Option<Bytes>, 5262 } 5263 impl UciNotificationData { conforms(bytes: &[u8]) -> bool5264 fn conforms(bytes: &[u8]) -> bool { 5265 true 5266 } parse(bytes: &[u8], group_id: GroupId, opcode: u8) -> Result<Self, DecodeError>5267 fn parse(bytes: &[u8], group_id: GroupId, opcode: u8) -> Result<Self, DecodeError> { 5268 let mut cell = Cell::new(bytes); 5269 let packet = Self::parse_inner(&mut cell, group_id, opcode)?; 5270 Ok(packet) 5271 } parse_inner( mut bytes: &mut Cell<&[u8]>, group_id: GroupId, opcode: u8, ) -> Result<Self, DecodeError>5272 fn parse_inner( 5273 mut bytes: &mut Cell<&[u8]>, 5274 group_id: GroupId, 5275 opcode: u8, 5276 ) -> Result<Self, DecodeError> { 5277 let payload = bytes.get(); 5278 bytes.get_mut().advance(payload.len()); 5279 let child = match (group_id) { 5280 (GroupId::Core) if CoreNotificationData::conforms(&payload) => { 5281 let mut cell = Cell::new(payload); 5282 let child_data = CoreNotificationData::parse_inner(&mut cell, opcode)?; 5283 UciNotificationDataChild::CoreNotification(child_data) 5284 } 5285 (GroupId::SessionConfig) if SessionConfigNotificationData::conforms( 5286 &payload, 5287 ) => { 5288 let mut cell = Cell::new(payload); 5289 let child_data = SessionConfigNotificationData::parse_inner( 5290 &mut cell, 5291 opcode, 5292 )?; 5293 UciNotificationDataChild::SessionConfigNotification(child_data) 5294 } 5295 (GroupId::SessionControl) if SessionControlNotificationData::conforms( 5296 &payload, 5297 ) => { 5298 let mut cell = Cell::new(payload); 5299 let child_data = SessionControlNotificationData::parse_inner( 5300 &mut cell, 5301 opcode, 5302 )?; 5303 UciNotificationDataChild::SessionControlNotification(child_data) 5304 } 5305 (GroupId::VendorAndroid) if AndroidNotificationData::conforms(&payload) => { 5306 let mut cell = Cell::new(payload); 5307 let child_data = AndroidNotificationData::parse_inner( 5308 &mut cell, 5309 opcode, 5310 )?; 5311 UciNotificationDataChild::AndroidNotification(child_data) 5312 } 5313 (GroupId::Test) if TestNotificationData::conforms(&payload) => { 5314 let mut cell = Cell::new(payload); 5315 let child_data = TestNotificationData::parse_inner(&mut cell, opcode)?; 5316 UciNotificationDataChild::TestNotification(child_data) 5317 } 5318 (GroupId::VendorReserved9) if UciVendor_9_NotificationData::conforms( 5319 &payload, 5320 ) => { 5321 let mut cell = Cell::new(payload); 5322 let child_data = UciVendor_9_NotificationData::parse_inner(&mut cell)?; 5323 UciNotificationDataChild::UciVendor_9_Notification(child_data) 5324 } 5325 (GroupId::VendorReservedA) if UciVendor_A_NotificationData::conforms( 5326 &payload, 5327 ) => { 5328 let mut cell = Cell::new(payload); 5329 let child_data = UciVendor_A_NotificationData::parse_inner(&mut cell)?; 5330 UciNotificationDataChild::UciVendor_A_Notification(child_data) 5331 } 5332 (GroupId::VendorReservedB) if UciVendor_B_NotificationData::conforms( 5333 &payload, 5334 ) => { 5335 let mut cell = Cell::new(payload); 5336 let child_data = UciVendor_B_NotificationData::parse_inner(&mut cell)?; 5337 UciNotificationDataChild::UciVendor_B_Notification(child_data) 5338 } 5339 (GroupId::VendorReservedE) if UciVendor_E_NotificationData::conforms( 5340 &payload, 5341 ) => { 5342 let mut cell = Cell::new(payload); 5343 let child_data = UciVendor_E_NotificationData::parse_inner(&mut cell)?; 5344 UciNotificationDataChild::UciVendor_E_Notification(child_data) 5345 } 5346 (GroupId::VendorReservedF) if UciVendor_F_NotificationData::conforms( 5347 &payload, 5348 ) => { 5349 let mut cell = Cell::new(payload); 5350 let child_data = UciVendor_F_NotificationData::parse_inner(&mut cell)?; 5351 UciNotificationDataChild::UciVendor_F_Notification(child_data) 5352 } 5353 _ if !payload.is_empty() => { 5354 UciNotificationDataChild::Payload(Bytes::copy_from_slice(payload)) 5355 } 5356 _ => UciNotificationDataChild::None, 5357 }; 5358 Ok(Self { child }) 5359 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>5360 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 5361 match &self.child { 5362 UciNotificationDataChild::CoreNotification(child) => child.write_to(buffer)?, 5363 UciNotificationDataChild::SessionConfigNotification(child) => { 5364 child.write_to(buffer)? 5365 } 5366 UciNotificationDataChild::SessionControlNotification(child) => { 5367 child.write_to(buffer)? 5368 } 5369 UciNotificationDataChild::AndroidNotification(child) => { 5370 child.write_to(buffer)? 5371 } 5372 UciNotificationDataChild::TestNotification(child) => child.write_to(buffer)?, 5373 UciNotificationDataChild::UciVendor_9_Notification(child) => { 5374 child.write_to(buffer)? 5375 } 5376 UciNotificationDataChild::UciVendor_A_Notification(child) => { 5377 child.write_to(buffer)? 5378 } 5379 UciNotificationDataChild::UciVendor_B_Notification(child) => { 5380 child.write_to(buffer)? 5381 } 5382 UciNotificationDataChild::UciVendor_E_Notification(child) => { 5383 child.write_to(buffer)? 5384 } 5385 UciNotificationDataChild::UciVendor_F_Notification(child) => { 5386 child.write_to(buffer)? 5387 } 5388 UciNotificationDataChild::Payload(payload) => buffer.put_slice(payload), 5389 UciNotificationDataChild::None => {} 5390 } 5391 Ok(()) 5392 } get_total_size(&self) -> usize5393 fn get_total_size(&self) -> usize { 5394 self.get_size() 5395 } get_size(&self) -> usize5396 fn get_size(&self) -> usize { 5397 self.child.get_total_size() 5398 } 5399 } 5400 impl Packet for UciNotification { encoded_len(&self) -> usize5401 fn encoded_len(&self) -> usize { 5402 self.get_size() 5403 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>5404 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 5405 self.ucicontrolpacket.write_to(buf) 5406 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>5407 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 5408 unimplemented!("Rust legacy does not implement full packet trait") 5409 } 5410 } 5411 impl TryFrom<UciNotification> for Bytes { 5412 type Error = EncodeError; try_from(packet: UciNotification) -> Result<Self, Self::Error>5413 fn try_from(packet: UciNotification) -> Result<Self, Self::Error> { 5414 packet.encode_to_bytes() 5415 } 5416 } 5417 impl TryFrom<UciNotification> for Vec<u8> { 5418 type Error = EncodeError; try_from(packet: UciNotification) -> Result<Self, Self::Error>5419 fn try_from(packet: UciNotification) -> Result<Self, Self::Error> { 5420 packet.encode_to_vec() 5421 } 5422 } 5423 impl From<UciNotification> for UciControlPacket { from(packet: UciNotification) -> UciControlPacket5424 fn from(packet: UciNotification) -> UciControlPacket { 5425 UciControlPacket::new(packet.ucicontrolpacket).unwrap() 5426 } 5427 } 5428 impl TryFrom<UciControlPacket> for UciNotification { 5429 type Error = DecodeError; try_from(packet: UciControlPacket) -> Result<UciNotification, Self::Error>5430 fn try_from(packet: UciControlPacket) -> Result<UciNotification, Self::Error> { 5431 UciNotification::new(packet.ucicontrolpacket) 5432 } 5433 } 5434 impl UciNotification { parse(bytes: &[u8]) -> Result<Self, DecodeError>5435 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 5436 let mut cell = Cell::new(bytes); 5437 let packet = Self::parse_inner(&mut cell)?; 5438 Ok(packet) 5439 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>5440 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 5441 let data = UciControlPacketData::parse_inner(&mut bytes)?; 5442 Self::new(data) 5443 } specialize(&self) -> UciNotificationChild5444 pub fn specialize(&self) -> UciNotificationChild { 5445 match &self.ucinotification.child { 5446 UciNotificationDataChild::CoreNotification(_) => { 5447 UciNotificationChild::CoreNotification( 5448 CoreNotification::new(self.ucicontrolpacket.clone()).unwrap(), 5449 ) 5450 } 5451 UciNotificationDataChild::SessionConfigNotification(_) => { 5452 UciNotificationChild::SessionConfigNotification( 5453 SessionConfigNotification::new(self.ucicontrolpacket.clone()) 5454 .unwrap(), 5455 ) 5456 } 5457 UciNotificationDataChild::SessionControlNotification(_) => { 5458 UciNotificationChild::SessionControlNotification( 5459 SessionControlNotification::new(self.ucicontrolpacket.clone()) 5460 .unwrap(), 5461 ) 5462 } 5463 UciNotificationDataChild::AndroidNotification(_) => { 5464 UciNotificationChild::AndroidNotification( 5465 AndroidNotification::new(self.ucicontrolpacket.clone()).unwrap(), 5466 ) 5467 } 5468 UciNotificationDataChild::TestNotification(_) => { 5469 UciNotificationChild::TestNotification( 5470 TestNotification::new(self.ucicontrolpacket.clone()).unwrap(), 5471 ) 5472 } 5473 UciNotificationDataChild::UciVendor_9_Notification(_) => { 5474 UciNotificationChild::UciVendor_9_Notification( 5475 UciVendor_9_Notification::new(self.ucicontrolpacket.clone()).unwrap(), 5476 ) 5477 } 5478 UciNotificationDataChild::UciVendor_A_Notification(_) => { 5479 UciNotificationChild::UciVendor_A_Notification( 5480 UciVendor_A_Notification::new(self.ucicontrolpacket.clone()).unwrap(), 5481 ) 5482 } 5483 UciNotificationDataChild::UciVendor_B_Notification(_) => { 5484 UciNotificationChild::UciVendor_B_Notification( 5485 UciVendor_B_Notification::new(self.ucicontrolpacket.clone()).unwrap(), 5486 ) 5487 } 5488 UciNotificationDataChild::UciVendor_E_Notification(_) => { 5489 UciNotificationChild::UciVendor_E_Notification( 5490 UciVendor_E_Notification::new(self.ucicontrolpacket.clone()).unwrap(), 5491 ) 5492 } 5493 UciNotificationDataChild::UciVendor_F_Notification(_) => { 5494 UciNotificationChild::UciVendor_F_Notification( 5495 UciVendor_F_Notification::new(self.ucicontrolpacket.clone()).unwrap(), 5496 ) 5497 } 5498 UciNotificationDataChild::Payload(payload) => { 5499 UciNotificationChild::Payload(payload.clone()) 5500 } 5501 UciNotificationDataChild::None => UciNotificationChild::None, 5502 } 5503 } new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError>5504 fn new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError> { 5505 let ucinotification = match &ucicontrolpacket.child { 5506 UciControlPacketDataChild::UciNotification(value) => value.clone(), 5507 _ => { 5508 return Err(DecodeError::InvalidChildError { 5509 expected: stringify!(UciControlPacketDataChild::UciNotification), 5510 actual: format!("{:?}", & ucicontrolpacket.child), 5511 }); 5512 } 5513 }; 5514 Ok(Self { 5515 ucicontrolpacket, 5516 ucinotification, 5517 }) 5518 } get_group_id(&self) -> GroupId5519 pub fn get_group_id(&self) -> GroupId { 5520 self.ucicontrolpacket.group_id 5521 } get_message_type(&self) -> MessageType5522 pub fn get_message_type(&self) -> MessageType { 5523 self.ucicontrolpacket.message_type 5524 } get_opcode(&self) -> u85525 pub fn get_opcode(&self) -> u8 { 5526 self.ucicontrolpacket.opcode 5527 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>5528 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 5529 self.ucinotification.write_to(buffer) 5530 } get_size(&self) -> usize5531 pub fn get_size(&self) -> usize { 5532 self.ucicontrolpacket.get_size() 5533 } 5534 } 5535 impl UciNotificationBuilder { build(self) -> UciNotification5536 pub fn build(self) -> UciNotification { 5537 let ucinotification = UciNotificationData { 5538 child: match self.payload { 5539 None => UciNotificationDataChild::None, 5540 Some(bytes) => UciNotificationDataChild::Payload(bytes), 5541 }, 5542 }; 5543 let ucicontrolpacket = UciControlPacketData { 5544 group_id: self.group_id, 5545 message_type: MessageType::Notification, 5546 opcode: self.opcode, 5547 child: UciControlPacketDataChild::UciNotification(ucinotification), 5548 }; 5549 UciNotification::new(ucicontrolpacket).unwrap() 5550 } 5551 } 5552 impl From<UciNotificationBuilder> for UciControlPacket { from(builder: UciNotificationBuilder) -> UciControlPacket5553 fn from(builder: UciNotificationBuilder) -> UciControlPacket { 5554 builder.build().into() 5555 } 5556 } 5557 impl From<UciNotificationBuilder> for UciNotification { from(builder: UciNotificationBuilder) -> UciNotification5558 fn from(builder: UciNotificationBuilder) -> UciNotification { 5559 builder.build().into() 5560 } 5561 } 5562 #[derive(Debug, Clone, PartialEq, Eq)] 5563 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5564 pub enum CoreCommandDataChild { 5565 DeviceResetCmd(DeviceResetCmdData), 5566 GetDeviceInfoCmd(GetDeviceInfoCmdData), 5567 GetCapsInfoCmd(GetCapsInfoCmdData), 5568 SetConfigCmd(SetConfigCmdData), 5569 GetConfigCmd(GetConfigCmdData), 5570 CoreQueryTimeStampCmd(CoreQueryTimeStampCmdData), 5571 Payload(Bytes), 5572 None, 5573 } 5574 impl CoreCommandDataChild { get_total_size(&self) -> usize5575 fn get_total_size(&self) -> usize { 5576 match self { 5577 CoreCommandDataChild::DeviceResetCmd(value) => value.get_total_size(), 5578 CoreCommandDataChild::GetDeviceInfoCmd(value) => value.get_total_size(), 5579 CoreCommandDataChild::GetCapsInfoCmd(value) => value.get_total_size(), 5580 CoreCommandDataChild::SetConfigCmd(value) => value.get_total_size(), 5581 CoreCommandDataChild::GetConfigCmd(value) => value.get_total_size(), 5582 CoreCommandDataChild::CoreQueryTimeStampCmd(value) => value.get_total_size(), 5583 CoreCommandDataChild::Payload(bytes) => bytes.len(), 5584 CoreCommandDataChild::None => 0, 5585 } 5586 } 5587 } 5588 #[derive(Debug, Clone, PartialEq, Eq)] 5589 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5590 pub enum CoreCommandChild { 5591 DeviceResetCmd(DeviceResetCmd), 5592 GetDeviceInfoCmd(GetDeviceInfoCmd), 5593 GetCapsInfoCmd(GetCapsInfoCmd), 5594 SetConfigCmd(SetConfigCmd), 5595 GetConfigCmd(GetConfigCmd), 5596 CoreQueryTimeStampCmd(CoreQueryTimeStampCmd), 5597 Payload(Bytes), 5598 None, 5599 } 5600 #[derive(Debug, Clone, PartialEq, Eq)] 5601 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5602 pub struct CoreCommandData { 5603 child: CoreCommandDataChild, 5604 } 5605 #[derive(Debug, Clone, PartialEq, Eq)] 5606 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5607 pub struct CoreCommand { 5608 #[cfg_attr(feature = "serde", serde(flatten))] 5609 ucicontrolpacket: UciControlPacketData, 5610 #[cfg_attr(feature = "serde", serde(flatten))] 5611 ucicommand: UciCommandData, 5612 #[cfg_attr(feature = "serde", serde(flatten))] 5613 corecommand: CoreCommandData, 5614 } 5615 #[derive(Debug)] 5616 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5617 pub struct CoreCommandBuilder { 5618 pub opcode: u8, 5619 pub payload: Option<Bytes>, 5620 } 5621 impl CoreCommandData { conforms(bytes: &[u8]) -> bool5622 fn conforms(bytes: &[u8]) -> bool { 5623 true 5624 } parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError>5625 fn parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError> { 5626 let mut cell = Cell::new(bytes); 5627 let packet = Self::parse_inner(&mut cell, opcode)?; 5628 Ok(packet) 5629 } parse_inner( mut bytes: &mut Cell<&[u8]>, opcode: u8, ) -> Result<Self, DecodeError>5630 fn parse_inner( 5631 mut bytes: &mut Cell<&[u8]>, 5632 opcode: u8, 5633 ) -> Result<Self, DecodeError> { 5634 let payload = bytes.get(); 5635 bytes.get_mut().advance(payload.len()); 5636 let child = match (opcode) { 5637 (0) if DeviceResetCmdData::conforms(&payload) => { 5638 let mut cell = Cell::new(payload); 5639 let child_data = DeviceResetCmdData::parse_inner(&mut cell)?; 5640 CoreCommandDataChild::DeviceResetCmd(child_data) 5641 } 5642 (2) if GetDeviceInfoCmdData::conforms(&payload) => { 5643 let mut cell = Cell::new(payload); 5644 let child_data = GetDeviceInfoCmdData::parse_inner(&mut cell)?; 5645 CoreCommandDataChild::GetDeviceInfoCmd(child_data) 5646 } 5647 (3) if GetCapsInfoCmdData::conforms(&payload) => { 5648 let mut cell = Cell::new(payload); 5649 let child_data = GetCapsInfoCmdData::parse_inner(&mut cell)?; 5650 CoreCommandDataChild::GetCapsInfoCmd(child_data) 5651 } 5652 (4) if SetConfigCmdData::conforms(&payload) => { 5653 let mut cell = Cell::new(payload); 5654 let child_data = SetConfigCmdData::parse_inner(&mut cell)?; 5655 CoreCommandDataChild::SetConfigCmd(child_data) 5656 } 5657 (5) if GetConfigCmdData::conforms(&payload) => { 5658 let mut cell = Cell::new(payload); 5659 let child_data = GetConfigCmdData::parse_inner(&mut cell)?; 5660 CoreCommandDataChild::GetConfigCmd(child_data) 5661 } 5662 (8) if CoreQueryTimeStampCmdData::conforms(&payload) => { 5663 let mut cell = Cell::new(payload); 5664 let child_data = CoreQueryTimeStampCmdData::parse_inner(&mut cell)?; 5665 CoreCommandDataChild::CoreQueryTimeStampCmd(child_data) 5666 } 5667 _ if !payload.is_empty() => { 5668 CoreCommandDataChild::Payload(Bytes::copy_from_slice(payload)) 5669 } 5670 _ => CoreCommandDataChild::None, 5671 }; 5672 Ok(Self { child }) 5673 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>5674 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 5675 match &self.child { 5676 CoreCommandDataChild::DeviceResetCmd(child) => child.write_to(buffer)?, 5677 CoreCommandDataChild::GetDeviceInfoCmd(child) => child.write_to(buffer)?, 5678 CoreCommandDataChild::GetCapsInfoCmd(child) => child.write_to(buffer)?, 5679 CoreCommandDataChild::SetConfigCmd(child) => child.write_to(buffer)?, 5680 CoreCommandDataChild::GetConfigCmd(child) => child.write_to(buffer)?, 5681 CoreCommandDataChild::CoreQueryTimeStampCmd(child) => child.write_to(buffer)?, 5682 CoreCommandDataChild::Payload(payload) => buffer.put_slice(payload), 5683 CoreCommandDataChild::None => {} 5684 } 5685 Ok(()) 5686 } get_total_size(&self) -> usize5687 fn get_total_size(&self) -> usize { 5688 self.get_size() 5689 } get_size(&self) -> usize5690 fn get_size(&self) -> usize { 5691 self.child.get_total_size() 5692 } 5693 } 5694 impl Packet for CoreCommand { encoded_len(&self) -> usize5695 fn encoded_len(&self) -> usize { 5696 self.get_size() 5697 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>5698 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 5699 self.ucicontrolpacket.write_to(buf) 5700 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>5701 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 5702 unimplemented!("Rust legacy does not implement full packet trait") 5703 } 5704 } 5705 impl TryFrom<CoreCommand> for Bytes { 5706 type Error = EncodeError; try_from(packet: CoreCommand) -> Result<Self, Self::Error>5707 fn try_from(packet: CoreCommand) -> Result<Self, Self::Error> { 5708 packet.encode_to_bytes() 5709 } 5710 } 5711 impl TryFrom<CoreCommand> for Vec<u8> { 5712 type Error = EncodeError; try_from(packet: CoreCommand) -> Result<Self, Self::Error>5713 fn try_from(packet: CoreCommand) -> Result<Self, Self::Error> { 5714 packet.encode_to_vec() 5715 } 5716 } 5717 impl From<CoreCommand> for UciControlPacket { from(packet: CoreCommand) -> UciControlPacket5718 fn from(packet: CoreCommand) -> UciControlPacket { 5719 UciControlPacket::new(packet.ucicontrolpacket).unwrap() 5720 } 5721 } 5722 impl From<CoreCommand> for UciCommand { from(packet: CoreCommand) -> UciCommand5723 fn from(packet: CoreCommand) -> UciCommand { 5724 UciCommand::new(packet.ucicontrolpacket).unwrap() 5725 } 5726 } 5727 impl TryFrom<UciControlPacket> for CoreCommand { 5728 type Error = DecodeError; try_from(packet: UciControlPacket) -> Result<CoreCommand, Self::Error>5729 fn try_from(packet: UciControlPacket) -> Result<CoreCommand, Self::Error> { 5730 CoreCommand::new(packet.ucicontrolpacket) 5731 } 5732 } 5733 impl CoreCommand { parse(bytes: &[u8]) -> Result<Self, DecodeError>5734 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 5735 let mut cell = Cell::new(bytes); 5736 let packet = Self::parse_inner(&mut cell)?; 5737 Ok(packet) 5738 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>5739 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 5740 let data = UciControlPacketData::parse_inner(&mut bytes)?; 5741 Self::new(data) 5742 } specialize(&self) -> CoreCommandChild5743 pub fn specialize(&self) -> CoreCommandChild { 5744 match &self.corecommand.child { 5745 CoreCommandDataChild::DeviceResetCmd(_) => { 5746 CoreCommandChild::DeviceResetCmd( 5747 DeviceResetCmd::new(self.ucicontrolpacket.clone()).unwrap(), 5748 ) 5749 } 5750 CoreCommandDataChild::GetDeviceInfoCmd(_) => { 5751 CoreCommandChild::GetDeviceInfoCmd( 5752 GetDeviceInfoCmd::new(self.ucicontrolpacket.clone()).unwrap(), 5753 ) 5754 } 5755 CoreCommandDataChild::GetCapsInfoCmd(_) => { 5756 CoreCommandChild::GetCapsInfoCmd( 5757 GetCapsInfoCmd::new(self.ucicontrolpacket.clone()).unwrap(), 5758 ) 5759 } 5760 CoreCommandDataChild::SetConfigCmd(_) => { 5761 CoreCommandChild::SetConfigCmd( 5762 SetConfigCmd::new(self.ucicontrolpacket.clone()).unwrap(), 5763 ) 5764 } 5765 CoreCommandDataChild::GetConfigCmd(_) => { 5766 CoreCommandChild::GetConfigCmd( 5767 GetConfigCmd::new(self.ucicontrolpacket.clone()).unwrap(), 5768 ) 5769 } 5770 CoreCommandDataChild::CoreQueryTimeStampCmd(_) => { 5771 CoreCommandChild::CoreQueryTimeStampCmd( 5772 CoreQueryTimeStampCmd::new(self.ucicontrolpacket.clone()).unwrap(), 5773 ) 5774 } 5775 CoreCommandDataChild::Payload(payload) => { 5776 CoreCommandChild::Payload(payload.clone()) 5777 } 5778 CoreCommandDataChild::None => CoreCommandChild::None, 5779 } 5780 } new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError>5781 fn new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError> { 5782 let ucicommand = match &ucicontrolpacket.child { 5783 UciControlPacketDataChild::UciCommand(value) => value.clone(), 5784 _ => { 5785 return Err(DecodeError::InvalidChildError { 5786 expected: stringify!(UciControlPacketDataChild::UciCommand), 5787 actual: format!("{:?}", & ucicontrolpacket.child), 5788 }); 5789 } 5790 }; 5791 let corecommand = match &ucicommand.child { 5792 UciCommandDataChild::CoreCommand(value) => value.clone(), 5793 _ => { 5794 return Err(DecodeError::InvalidChildError { 5795 expected: stringify!(UciCommandDataChild::CoreCommand), 5796 actual: format!("{:?}", & ucicommand.child), 5797 }); 5798 } 5799 }; 5800 Ok(Self { 5801 ucicontrolpacket, 5802 ucicommand, 5803 corecommand, 5804 }) 5805 } get_group_id(&self) -> GroupId5806 pub fn get_group_id(&self) -> GroupId { 5807 self.ucicontrolpacket.group_id 5808 } get_message_type(&self) -> MessageType5809 pub fn get_message_type(&self) -> MessageType { 5810 self.ucicontrolpacket.message_type 5811 } get_opcode(&self) -> u85812 pub fn get_opcode(&self) -> u8 { 5813 self.ucicontrolpacket.opcode 5814 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>5815 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 5816 self.corecommand.write_to(buffer) 5817 } get_size(&self) -> usize5818 pub fn get_size(&self) -> usize { 5819 self.ucicontrolpacket.get_size() 5820 } 5821 } 5822 impl CoreCommandBuilder { build(self) -> CoreCommand5823 pub fn build(self) -> CoreCommand { 5824 let corecommand = CoreCommandData { 5825 child: match self.payload { 5826 None => CoreCommandDataChild::None, 5827 Some(bytes) => CoreCommandDataChild::Payload(bytes), 5828 }, 5829 }; 5830 let ucicommand = UciCommandData { 5831 child: UciCommandDataChild::CoreCommand(corecommand), 5832 }; 5833 let ucicontrolpacket = UciControlPacketData { 5834 group_id: GroupId::Core, 5835 message_type: MessageType::Command, 5836 opcode: self.opcode, 5837 child: UciControlPacketDataChild::UciCommand(ucicommand), 5838 }; 5839 CoreCommand::new(ucicontrolpacket).unwrap() 5840 } 5841 } 5842 impl From<CoreCommandBuilder> for UciControlPacket { from(builder: CoreCommandBuilder) -> UciControlPacket5843 fn from(builder: CoreCommandBuilder) -> UciControlPacket { 5844 builder.build().into() 5845 } 5846 } 5847 impl From<CoreCommandBuilder> for UciCommand { from(builder: CoreCommandBuilder) -> UciCommand5848 fn from(builder: CoreCommandBuilder) -> UciCommand { 5849 builder.build().into() 5850 } 5851 } 5852 impl From<CoreCommandBuilder> for CoreCommand { from(builder: CoreCommandBuilder) -> CoreCommand5853 fn from(builder: CoreCommandBuilder) -> CoreCommand { 5854 builder.build().into() 5855 } 5856 } 5857 #[derive(Debug, Clone, PartialEq, Eq)] 5858 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5859 pub enum CoreResponseDataChild { 5860 DeviceResetRsp(DeviceResetRspData), 5861 GetDeviceInfoRsp(GetDeviceInfoRspData), 5862 GetCapsInfoRsp(GetCapsInfoRspData), 5863 SetConfigRsp(SetConfigRspData), 5864 GetConfigRsp(GetConfigRspData), 5865 CoreQueryTimeStampRsp(CoreQueryTimeStampRspData), 5866 Payload(Bytes), 5867 None, 5868 } 5869 impl CoreResponseDataChild { get_total_size(&self) -> usize5870 fn get_total_size(&self) -> usize { 5871 match self { 5872 CoreResponseDataChild::DeviceResetRsp(value) => value.get_total_size(), 5873 CoreResponseDataChild::GetDeviceInfoRsp(value) => value.get_total_size(), 5874 CoreResponseDataChild::GetCapsInfoRsp(value) => value.get_total_size(), 5875 CoreResponseDataChild::SetConfigRsp(value) => value.get_total_size(), 5876 CoreResponseDataChild::GetConfigRsp(value) => value.get_total_size(), 5877 CoreResponseDataChild::CoreQueryTimeStampRsp(value) => value.get_total_size(), 5878 CoreResponseDataChild::Payload(bytes) => bytes.len(), 5879 CoreResponseDataChild::None => 0, 5880 } 5881 } 5882 } 5883 #[derive(Debug, Clone, PartialEq, Eq)] 5884 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5885 pub enum CoreResponseChild { 5886 DeviceResetRsp(DeviceResetRsp), 5887 GetDeviceInfoRsp(GetDeviceInfoRsp), 5888 GetCapsInfoRsp(GetCapsInfoRsp), 5889 SetConfigRsp(SetConfigRsp), 5890 GetConfigRsp(GetConfigRsp), 5891 CoreQueryTimeStampRsp(CoreQueryTimeStampRsp), 5892 Payload(Bytes), 5893 None, 5894 } 5895 #[derive(Debug, Clone, PartialEq, Eq)] 5896 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5897 pub struct CoreResponseData { 5898 child: CoreResponseDataChild, 5899 } 5900 #[derive(Debug, Clone, PartialEq, Eq)] 5901 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5902 pub struct CoreResponse { 5903 #[cfg_attr(feature = "serde", serde(flatten))] 5904 ucicontrolpacket: UciControlPacketData, 5905 #[cfg_attr(feature = "serde", serde(flatten))] 5906 uciresponse: UciResponseData, 5907 #[cfg_attr(feature = "serde", serde(flatten))] 5908 coreresponse: CoreResponseData, 5909 } 5910 #[derive(Debug)] 5911 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 5912 pub struct CoreResponseBuilder { 5913 pub opcode: u8, 5914 pub payload: Option<Bytes>, 5915 } 5916 impl CoreResponseData { conforms(bytes: &[u8]) -> bool5917 fn conforms(bytes: &[u8]) -> bool { 5918 true 5919 } parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError>5920 fn parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError> { 5921 let mut cell = Cell::new(bytes); 5922 let packet = Self::parse_inner(&mut cell, opcode)?; 5923 Ok(packet) 5924 } parse_inner( mut bytes: &mut Cell<&[u8]>, opcode: u8, ) -> Result<Self, DecodeError>5925 fn parse_inner( 5926 mut bytes: &mut Cell<&[u8]>, 5927 opcode: u8, 5928 ) -> Result<Self, DecodeError> { 5929 let payload = bytes.get(); 5930 bytes.get_mut().advance(payload.len()); 5931 let child = match (opcode) { 5932 (0) if DeviceResetRspData::conforms(&payload) => { 5933 let mut cell = Cell::new(payload); 5934 let child_data = DeviceResetRspData::parse_inner(&mut cell)?; 5935 CoreResponseDataChild::DeviceResetRsp(child_data) 5936 } 5937 (2) if GetDeviceInfoRspData::conforms(&payload) => { 5938 let mut cell = Cell::new(payload); 5939 let child_data = GetDeviceInfoRspData::parse_inner(&mut cell)?; 5940 CoreResponseDataChild::GetDeviceInfoRsp(child_data) 5941 } 5942 (3) if GetCapsInfoRspData::conforms(&payload) => { 5943 let mut cell = Cell::new(payload); 5944 let child_data = GetCapsInfoRspData::parse_inner(&mut cell)?; 5945 CoreResponseDataChild::GetCapsInfoRsp(child_data) 5946 } 5947 (4) if SetConfigRspData::conforms(&payload) => { 5948 let mut cell = Cell::new(payload); 5949 let child_data = SetConfigRspData::parse_inner(&mut cell)?; 5950 CoreResponseDataChild::SetConfigRsp(child_data) 5951 } 5952 (5) if GetConfigRspData::conforms(&payload) => { 5953 let mut cell = Cell::new(payload); 5954 let child_data = GetConfigRspData::parse_inner(&mut cell)?; 5955 CoreResponseDataChild::GetConfigRsp(child_data) 5956 } 5957 (8) if CoreQueryTimeStampRspData::conforms(&payload) => { 5958 let mut cell = Cell::new(payload); 5959 let child_data = CoreQueryTimeStampRspData::parse_inner(&mut cell)?; 5960 CoreResponseDataChild::CoreQueryTimeStampRsp(child_data) 5961 } 5962 _ if !payload.is_empty() => { 5963 CoreResponseDataChild::Payload(Bytes::copy_from_slice(payload)) 5964 } 5965 _ => CoreResponseDataChild::None, 5966 }; 5967 Ok(Self { child }) 5968 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>5969 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 5970 match &self.child { 5971 CoreResponseDataChild::DeviceResetRsp(child) => child.write_to(buffer)?, 5972 CoreResponseDataChild::GetDeviceInfoRsp(child) => child.write_to(buffer)?, 5973 CoreResponseDataChild::GetCapsInfoRsp(child) => child.write_to(buffer)?, 5974 CoreResponseDataChild::SetConfigRsp(child) => child.write_to(buffer)?, 5975 CoreResponseDataChild::GetConfigRsp(child) => child.write_to(buffer)?, 5976 CoreResponseDataChild::CoreQueryTimeStampRsp(child) => { 5977 child.write_to(buffer)? 5978 } 5979 CoreResponseDataChild::Payload(payload) => buffer.put_slice(payload), 5980 CoreResponseDataChild::None => {} 5981 } 5982 Ok(()) 5983 } get_total_size(&self) -> usize5984 fn get_total_size(&self) -> usize { 5985 self.get_size() 5986 } get_size(&self) -> usize5987 fn get_size(&self) -> usize { 5988 self.child.get_total_size() 5989 } 5990 } 5991 impl Packet for CoreResponse { encoded_len(&self) -> usize5992 fn encoded_len(&self) -> usize { 5993 self.get_size() 5994 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>5995 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 5996 self.ucicontrolpacket.write_to(buf) 5997 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>5998 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 5999 unimplemented!("Rust legacy does not implement full packet trait") 6000 } 6001 } 6002 impl TryFrom<CoreResponse> for Bytes { 6003 type Error = EncodeError; try_from(packet: CoreResponse) -> Result<Self, Self::Error>6004 fn try_from(packet: CoreResponse) -> Result<Self, Self::Error> { 6005 packet.encode_to_bytes() 6006 } 6007 } 6008 impl TryFrom<CoreResponse> for Vec<u8> { 6009 type Error = EncodeError; try_from(packet: CoreResponse) -> Result<Self, Self::Error>6010 fn try_from(packet: CoreResponse) -> Result<Self, Self::Error> { 6011 packet.encode_to_vec() 6012 } 6013 } 6014 impl From<CoreResponse> for UciControlPacket { from(packet: CoreResponse) -> UciControlPacket6015 fn from(packet: CoreResponse) -> UciControlPacket { 6016 UciControlPacket::new(packet.ucicontrolpacket).unwrap() 6017 } 6018 } 6019 impl From<CoreResponse> for UciResponse { from(packet: CoreResponse) -> UciResponse6020 fn from(packet: CoreResponse) -> UciResponse { 6021 UciResponse::new(packet.ucicontrolpacket).unwrap() 6022 } 6023 } 6024 impl TryFrom<UciControlPacket> for CoreResponse { 6025 type Error = DecodeError; try_from(packet: UciControlPacket) -> Result<CoreResponse, Self::Error>6026 fn try_from(packet: UciControlPacket) -> Result<CoreResponse, Self::Error> { 6027 CoreResponse::new(packet.ucicontrolpacket) 6028 } 6029 } 6030 impl CoreResponse { parse(bytes: &[u8]) -> Result<Self, DecodeError>6031 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 6032 let mut cell = Cell::new(bytes); 6033 let packet = Self::parse_inner(&mut cell)?; 6034 Ok(packet) 6035 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>6036 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 6037 let data = UciControlPacketData::parse_inner(&mut bytes)?; 6038 Self::new(data) 6039 } specialize(&self) -> CoreResponseChild6040 pub fn specialize(&self) -> CoreResponseChild { 6041 match &self.coreresponse.child { 6042 CoreResponseDataChild::DeviceResetRsp(_) => { 6043 CoreResponseChild::DeviceResetRsp( 6044 DeviceResetRsp::new(self.ucicontrolpacket.clone()).unwrap(), 6045 ) 6046 } 6047 CoreResponseDataChild::GetDeviceInfoRsp(_) => { 6048 CoreResponseChild::GetDeviceInfoRsp( 6049 GetDeviceInfoRsp::new(self.ucicontrolpacket.clone()).unwrap(), 6050 ) 6051 } 6052 CoreResponseDataChild::GetCapsInfoRsp(_) => { 6053 CoreResponseChild::GetCapsInfoRsp( 6054 GetCapsInfoRsp::new(self.ucicontrolpacket.clone()).unwrap(), 6055 ) 6056 } 6057 CoreResponseDataChild::SetConfigRsp(_) => { 6058 CoreResponseChild::SetConfigRsp( 6059 SetConfigRsp::new(self.ucicontrolpacket.clone()).unwrap(), 6060 ) 6061 } 6062 CoreResponseDataChild::GetConfigRsp(_) => { 6063 CoreResponseChild::GetConfigRsp( 6064 GetConfigRsp::new(self.ucicontrolpacket.clone()).unwrap(), 6065 ) 6066 } 6067 CoreResponseDataChild::CoreQueryTimeStampRsp(_) => { 6068 CoreResponseChild::CoreQueryTimeStampRsp( 6069 CoreQueryTimeStampRsp::new(self.ucicontrolpacket.clone()).unwrap(), 6070 ) 6071 } 6072 CoreResponseDataChild::Payload(payload) => { 6073 CoreResponseChild::Payload(payload.clone()) 6074 } 6075 CoreResponseDataChild::None => CoreResponseChild::None, 6076 } 6077 } new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError>6078 fn new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError> { 6079 let uciresponse = match &ucicontrolpacket.child { 6080 UciControlPacketDataChild::UciResponse(value) => value.clone(), 6081 _ => { 6082 return Err(DecodeError::InvalidChildError { 6083 expected: stringify!(UciControlPacketDataChild::UciResponse), 6084 actual: format!("{:?}", & ucicontrolpacket.child), 6085 }); 6086 } 6087 }; 6088 let coreresponse = match &uciresponse.child { 6089 UciResponseDataChild::CoreResponse(value) => value.clone(), 6090 _ => { 6091 return Err(DecodeError::InvalidChildError { 6092 expected: stringify!(UciResponseDataChild::CoreResponse), 6093 actual: format!("{:?}", & uciresponse.child), 6094 }); 6095 } 6096 }; 6097 Ok(Self { 6098 ucicontrolpacket, 6099 uciresponse, 6100 coreresponse, 6101 }) 6102 } get_group_id(&self) -> GroupId6103 pub fn get_group_id(&self) -> GroupId { 6104 self.ucicontrolpacket.group_id 6105 } get_message_type(&self) -> MessageType6106 pub fn get_message_type(&self) -> MessageType { 6107 self.ucicontrolpacket.message_type 6108 } get_opcode(&self) -> u86109 pub fn get_opcode(&self) -> u8 { 6110 self.ucicontrolpacket.opcode 6111 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>6112 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 6113 self.coreresponse.write_to(buffer) 6114 } get_size(&self) -> usize6115 pub fn get_size(&self) -> usize { 6116 self.ucicontrolpacket.get_size() 6117 } 6118 } 6119 impl CoreResponseBuilder { build(self) -> CoreResponse6120 pub fn build(self) -> CoreResponse { 6121 let coreresponse = CoreResponseData { 6122 child: match self.payload { 6123 None => CoreResponseDataChild::None, 6124 Some(bytes) => CoreResponseDataChild::Payload(bytes), 6125 }, 6126 }; 6127 let uciresponse = UciResponseData { 6128 child: UciResponseDataChild::CoreResponse(coreresponse), 6129 }; 6130 let ucicontrolpacket = UciControlPacketData { 6131 group_id: GroupId::Core, 6132 message_type: MessageType::Response, 6133 opcode: self.opcode, 6134 child: UciControlPacketDataChild::UciResponse(uciresponse), 6135 }; 6136 CoreResponse::new(ucicontrolpacket).unwrap() 6137 } 6138 } 6139 impl From<CoreResponseBuilder> for UciControlPacket { from(builder: CoreResponseBuilder) -> UciControlPacket6140 fn from(builder: CoreResponseBuilder) -> UciControlPacket { 6141 builder.build().into() 6142 } 6143 } 6144 impl From<CoreResponseBuilder> for UciResponse { from(builder: CoreResponseBuilder) -> UciResponse6145 fn from(builder: CoreResponseBuilder) -> UciResponse { 6146 builder.build().into() 6147 } 6148 } 6149 impl From<CoreResponseBuilder> for CoreResponse { from(builder: CoreResponseBuilder) -> CoreResponse6150 fn from(builder: CoreResponseBuilder) -> CoreResponse { 6151 builder.build().into() 6152 } 6153 } 6154 #[derive(Debug, Clone, PartialEq, Eq)] 6155 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6156 pub enum CoreNotificationDataChild { 6157 DeviceStatusNtf(DeviceStatusNtfData), 6158 GenericError(GenericErrorData), 6159 Payload(Bytes), 6160 None, 6161 } 6162 impl CoreNotificationDataChild { get_total_size(&self) -> usize6163 fn get_total_size(&self) -> usize { 6164 match self { 6165 CoreNotificationDataChild::DeviceStatusNtf(value) => value.get_total_size(), 6166 CoreNotificationDataChild::GenericError(value) => value.get_total_size(), 6167 CoreNotificationDataChild::Payload(bytes) => bytes.len(), 6168 CoreNotificationDataChild::None => 0, 6169 } 6170 } 6171 } 6172 #[derive(Debug, Clone, PartialEq, Eq)] 6173 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6174 pub enum CoreNotificationChild { 6175 DeviceStatusNtf(DeviceStatusNtf), 6176 GenericError(GenericError), 6177 Payload(Bytes), 6178 None, 6179 } 6180 #[derive(Debug, Clone, PartialEq, Eq)] 6181 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6182 pub struct CoreNotificationData { 6183 child: CoreNotificationDataChild, 6184 } 6185 #[derive(Debug, Clone, PartialEq, Eq)] 6186 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6187 pub struct CoreNotification { 6188 #[cfg_attr(feature = "serde", serde(flatten))] 6189 ucicontrolpacket: UciControlPacketData, 6190 #[cfg_attr(feature = "serde", serde(flatten))] 6191 ucinotification: UciNotificationData, 6192 #[cfg_attr(feature = "serde", serde(flatten))] 6193 corenotification: CoreNotificationData, 6194 } 6195 #[derive(Debug)] 6196 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6197 pub struct CoreNotificationBuilder { 6198 pub opcode: u8, 6199 pub payload: Option<Bytes>, 6200 } 6201 impl CoreNotificationData { conforms(bytes: &[u8]) -> bool6202 fn conforms(bytes: &[u8]) -> bool { 6203 true 6204 } parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError>6205 fn parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError> { 6206 let mut cell = Cell::new(bytes); 6207 let packet = Self::parse_inner(&mut cell, opcode)?; 6208 Ok(packet) 6209 } parse_inner( mut bytes: &mut Cell<&[u8]>, opcode: u8, ) -> Result<Self, DecodeError>6210 fn parse_inner( 6211 mut bytes: &mut Cell<&[u8]>, 6212 opcode: u8, 6213 ) -> Result<Self, DecodeError> { 6214 let payload = bytes.get(); 6215 bytes.get_mut().advance(payload.len()); 6216 let child = match (opcode) { 6217 (1) if DeviceStatusNtfData::conforms(&payload) => { 6218 let mut cell = Cell::new(payload); 6219 let child_data = DeviceStatusNtfData::parse_inner(&mut cell)?; 6220 CoreNotificationDataChild::DeviceStatusNtf(child_data) 6221 } 6222 (7) if GenericErrorData::conforms(&payload) => { 6223 let mut cell = Cell::new(payload); 6224 let child_data = GenericErrorData::parse_inner(&mut cell)?; 6225 CoreNotificationDataChild::GenericError(child_data) 6226 } 6227 _ if !payload.is_empty() => { 6228 CoreNotificationDataChild::Payload(Bytes::copy_from_slice(payload)) 6229 } 6230 _ => CoreNotificationDataChild::None, 6231 }; 6232 Ok(Self { child }) 6233 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>6234 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 6235 match &self.child { 6236 CoreNotificationDataChild::DeviceStatusNtf(child) => child.write_to(buffer)?, 6237 CoreNotificationDataChild::GenericError(child) => child.write_to(buffer)?, 6238 CoreNotificationDataChild::Payload(payload) => buffer.put_slice(payload), 6239 CoreNotificationDataChild::None => {} 6240 } 6241 Ok(()) 6242 } get_total_size(&self) -> usize6243 fn get_total_size(&self) -> usize { 6244 self.get_size() 6245 } get_size(&self) -> usize6246 fn get_size(&self) -> usize { 6247 self.child.get_total_size() 6248 } 6249 } 6250 impl Packet for CoreNotification { encoded_len(&self) -> usize6251 fn encoded_len(&self) -> usize { 6252 self.get_size() 6253 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>6254 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 6255 self.ucicontrolpacket.write_to(buf) 6256 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>6257 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 6258 unimplemented!("Rust legacy does not implement full packet trait") 6259 } 6260 } 6261 impl TryFrom<CoreNotification> for Bytes { 6262 type Error = EncodeError; try_from(packet: CoreNotification) -> Result<Self, Self::Error>6263 fn try_from(packet: CoreNotification) -> Result<Self, Self::Error> { 6264 packet.encode_to_bytes() 6265 } 6266 } 6267 impl TryFrom<CoreNotification> for Vec<u8> { 6268 type Error = EncodeError; try_from(packet: CoreNotification) -> Result<Self, Self::Error>6269 fn try_from(packet: CoreNotification) -> Result<Self, Self::Error> { 6270 packet.encode_to_vec() 6271 } 6272 } 6273 impl From<CoreNotification> for UciControlPacket { from(packet: CoreNotification) -> UciControlPacket6274 fn from(packet: CoreNotification) -> UciControlPacket { 6275 UciControlPacket::new(packet.ucicontrolpacket).unwrap() 6276 } 6277 } 6278 impl From<CoreNotification> for UciNotification { from(packet: CoreNotification) -> UciNotification6279 fn from(packet: CoreNotification) -> UciNotification { 6280 UciNotification::new(packet.ucicontrolpacket).unwrap() 6281 } 6282 } 6283 impl TryFrom<UciControlPacket> for CoreNotification { 6284 type Error = DecodeError; try_from(packet: UciControlPacket) -> Result<CoreNotification, Self::Error>6285 fn try_from(packet: UciControlPacket) -> Result<CoreNotification, Self::Error> { 6286 CoreNotification::new(packet.ucicontrolpacket) 6287 } 6288 } 6289 impl CoreNotification { parse(bytes: &[u8]) -> Result<Self, DecodeError>6290 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 6291 let mut cell = Cell::new(bytes); 6292 let packet = Self::parse_inner(&mut cell)?; 6293 Ok(packet) 6294 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>6295 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 6296 let data = UciControlPacketData::parse_inner(&mut bytes)?; 6297 Self::new(data) 6298 } specialize(&self) -> CoreNotificationChild6299 pub fn specialize(&self) -> CoreNotificationChild { 6300 match &self.corenotification.child { 6301 CoreNotificationDataChild::DeviceStatusNtf(_) => { 6302 CoreNotificationChild::DeviceStatusNtf( 6303 DeviceStatusNtf::new(self.ucicontrolpacket.clone()).unwrap(), 6304 ) 6305 } 6306 CoreNotificationDataChild::GenericError(_) => { 6307 CoreNotificationChild::GenericError( 6308 GenericError::new(self.ucicontrolpacket.clone()).unwrap(), 6309 ) 6310 } 6311 CoreNotificationDataChild::Payload(payload) => { 6312 CoreNotificationChild::Payload(payload.clone()) 6313 } 6314 CoreNotificationDataChild::None => CoreNotificationChild::None, 6315 } 6316 } new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError>6317 fn new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError> { 6318 let ucinotification = match &ucicontrolpacket.child { 6319 UciControlPacketDataChild::UciNotification(value) => value.clone(), 6320 _ => { 6321 return Err(DecodeError::InvalidChildError { 6322 expected: stringify!(UciControlPacketDataChild::UciNotification), 6323 actual: format!("{:?}", & ucicontrolpacket.child), 6324 }); 6325 } 6326 }; 6327 let corenotification = match &ucinotification.child { 6328 UciNotificationDataChild::CoreNotification(value) => value.clone(), 6329 _ => { 6330 return Err(DecodeError::InvalidChildError { 6331 expected: stringify!(UciNotificationDataChild::CoreNotification), 6332 actual: format!("{:?}", & ucinotification.child), 6333 }); 6334 } 6335 }; 6336 Ok(Self { 6337 ucicontrolpacket, 6338 ucinotification, 6339 corenotification, 6340 }) 6341 } get_group_id(&self) -> GroupId6342 pub fn get_group_id(&self) -> GroupId { 6343 self.ucicontrolpacket.group_id 6344 } get_message_type(&self) -> MessageType6345 pub fn get_message_type(&self) -> MessageType { 6346 self.ucicontrolpacket.message_type 6347 } get_opcode(&self) -> u86348 pub fn get_opcode(&self) -> u8 { 6349 self.ucicontrolpacket.opcode 6350 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>6351 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 6352 self.corenotification.write_to(buffer) 6353 } get_size(&self) -> usize6354 pub fn get_size(&self) -> usize { 6355 self.ucicontrolpacket.get_size() 6356 } 6357 } 6358 impl CoreNotificationBuilder { build(self) -> CoreNotification6359 pub fn build(self) -> CoreNotification { 6360 let corenotification = CoreNotificationData { 6361 child: match self.payload { 6362 None => CoreNotificationDataChild::None, 6363 Some(bytes) => CoreNotificationDataChild::Payload(bytes), 6364 }, 6365 }; 6366 let ucinotification = UciNotificationData { 6367 child: UciNotificationDataChild::CoreNotification(corenotification), 6368 }; 6369 let ucicontrolpacket = UciControlPacketData { 6370 group_id: GroupId::Core, 6371 message_type: MessageType::Notification, 6372 opcode: self.opcode, 6373 child: UciControlPacketDataChild::UciNotification(ucinotification), 6374 }; 6375 CoreNotification::new(ucicontrolpacket).unwrap() 6376 } 6377 } 6378 impl From<CoreNotificationBuilder> for UciControlPacket { from(builder: CoreNotificationBuilder) -> UciControlPacket6379 fn from(builder: CoreNotificationBuilder) -> UciControlPacket { 6380 builder.build().into() 6381 } 6382 } 6383 impl From<CoreNotificationBuilder> for UciNotification { from(builder: CoreNotificationBuilder) -> UciNotification6384 fn from(builder: CoreNotificationBuilder) -> UciNotification { 6385 builder.build().into() 6386 } 6387 } 6388 impl From<CoreNotificationBuilder> for CoreNotification { from(builder: CoreNotificationBuilder) -> CoreNotification6389 fn from(builder: CoreNotificationBuilder) -> CoreNotification { 6390 builder.build().into() 6391 } 6392 } 6393 #[derive(Debug, Clone, PartialEq, Eq)] 6394 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6395 pub enum SessionConfigCommandDataChild { 6396 SessionInitCmd(SessionInitCmdData), 6397 SessionDeinitCmd(SessionDeinitCmdData), 6398 SessionSetAppConfigCmd(SessionSetAppConfigCmdData), 6399 SessionGetAppConfigCmd(SessionGetAppConfigCmdData), 6400 SessionGetCountCmd(SessionGetCountCmdData), 6401 SessionGetStateCmd(SessionGetStateCmdData), 6402 SessionUpdateDtTagRangingRoundsCmd(SessionUpdateDtTagRangingRoundsCmdData), 6403 SessionUpdateControllerMulticastListCmd(SessionUpdateControllerMulticastListCmdData), 6404 SessionQueryMaxDataSizeCmd(SessionQueryMaxDataSizeCmdData), 6405 SessionDataTransferPhaseConfigCmd(SessionDataTransferPhaseConfigCmdData), 6406 SessionSetHybridControllerConfigCmd(SessionSetHybridControllerConfigCmdData), 6407 SessionSetHybridControleeConfigCmd(SessionSetHybridControleeConfigCmdData), 6408 Payload(Bytes), 6409 None, 6410 } 6411 impl SessionConfigCommandDataChild { get_total_size(&self) -> usize6412 fn get_total_size(&self) -> usize { 6413 match self { 6414 SessionConfigCommandDataChild::SessionInitCmd(value) => { 6415 value.get_total_size() 6416 } 6417 SessionConfigCommandDataChild::SessionDeinitCmd(value) => { 6418 value.get_total_size() 6419 } 6420 SessionConfigCommandDataChild::SessionSetAppConfigCmd(value) => { 6421 value.get_total_size() 6422 } 6423 SessionConfigCommandDataChild::SessionGetAppConfigCmd(value) => { 6424 value.get_total_size() 6425 } 6426 SessionConfigCommandDataChild::SessionGetCountCmd(value) => { 6427 value.get_total_size() 6428 } 6429 SessionConfigCommandDataChild::SessionGetStateCmd(value) => { 6430 value.get_total_size() 6431 } 6432 SessionConfigCommandDataChild::SessionUpdateDtTagRangingRoundsCmd(value) => { 6433 value.get_total_size() 6434 } 6435 SessionConfigCommandDataChild::SessionUpdateControllerMulticastListCmd( 6436 value, 6437 ) => value.get_total_size(), 6438 SessionConfigCommandDataChild::SessionQueryMaxDataSizeCmd(value) => { 6439 value.get_total_size() 6440 } 6441 SessionConfigCommandDataChild::SessionDataTransferPhaseConfigCmd(value) => { 6442 value.get_total_size() 6443 } 6444 SessionConfigCommandDataChild::SessionSetHybridControllerConfigCmd(value) => { 6445 value.get_total_size() 6446 } 6447 SessionConfigCommandDataChild::SessionSetHybridControleeConfigCmd(value) => { 6448 value.get_total_size() 6449 } 6450 SessionConfigCommandDataChild::Payload(bytes) => bytes.len(), 6451 SessionConfigCommandDataChild::None => 0, 6452 } 6453 } 6454 } 6455 #[derive(Debug, Clone, PartialEq, Eq)] 6456 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6457 pub enum SessionConfigCommandChild { 6458 SessionInitCmd(SessionInitCmd), 6459 SessionDeinitCmd(SessionDeinitCmd), 6460 SessionSetAppConfigCmd(SessionSetAppConfigCmd), 6461 SessionGetAppConfigCmd(SessionGetAppConfigCmd), 6462 SessionGetCountCmd(SessionGetCountCmd), 6463 SessionGetStateCmd(SessionGetStateCmd), 6464 SessionUpdateDtTagRangingRoundsCmd(SessionUpdateDtTagRangingRoundsCmd), 6465 SessionUpdateControllerMulticastListCmd(SessionUpdateControllerMulticastListCmd), 6466 SessionQueryMaxDataSizeCmd(SessionQueryMaxDataSizeCmd), 6467 SessionDataTransferPhaseConfigCmd(SessionDataTransferPhaseConfigCmd), 6468 SessionSetHybridControllerConfigCmd(SessionSetHybridControllerConfigCmd), 6469 SessionSetHybridControleeConfigCmd(SessionSetHybridControleeConfigCmd), 6470 Payload(Bytes), 6471 None, 6472 } 6473 #[derive(Debug, Clone, PartialEq, Eq)] 6474 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6475 pub struct SessionConfigCommandData { 6476 child: SessionConfigCommandDataChild, 6477 } 6478 #[derive(Debug, Clone, PartialEq, Eq)] 6479 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6480 pub struct SessionConfigCommand { 6481 #[cfg_attr(feature = "serde", serde(flatten))] 6482 ucicontrolpacket: UciControlPacketData, 6483 #[cfg_attr(feature = "serde", serde(flatten))] 6484 ucicommand: UciCommandData, 6485 #[cfg_attr(feature = "serde", serde(flatten))] 6486 sessionconfigcommand: SessionConfigCommandData, 6487 } 6488 #[derive(Debug)] 6489 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6490 pub struct SessionConfigCommandBuilder { 6491 pub opcode: u8, 6492 pub payload: Option<Bytes>, 6493 } 6494 impl SessionConfigCommandData { conforms(bytes: &[u8]) -> bool6495 fn conforms(bytes: &[u8]) -> bool { 6496 true 6497 } parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError>6498 fn parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError> { 6499 let mut cell = Cell::new(bytes); 6500 let packet = Self::parse_inner(&mut cell, opcode)?; 6501 Ok(packet) 6502 } parse_inner( mut bytes: &mut Cell<&[u8]>, opcode: u8, ) -> Result<Self, DecodeError>6503 fn parse_inner( 6504 mut bytes: &mut Cell<&[u8]>, 6505 opcode: u8, 6506 ) -> Result<Self, DecodeError> { 6507 let payload = bytes.get(); 6508 bytes.get_mut().advance(payload.len()); 6509 let child = match (opcode) { 6510 (0) if SessionInitCmdData::conforms(&payload) => { 6511 let mut cell = Cell::new(payload); 6512 let child_data = SessionInitCmdData::parse_inner(&mut cell)?; 6513 SessionConfigCommandDataChild::SessionInitCmd(child_data) 6514 } 6515 (1) if SessionDeinitCmdData::conforms(&payload) => { 6516 let mut cell = Cell::new(payload); 6517 let child_data = SessionDeinitCmdData::parse_inner(&mut cell)?; 6518 SessionConfigCommandDataChild::SessionDeinitCmd(child_data) 6519 } 6520 (3) if SessionSetAppConfigCmdData::conforms(&payload) => { 6521 let mut cell = Cell::new(payload); 6522 let child_data = SessionSetAppConfigCmdData::parse_inner(&mut cell)?; 6523 SessionConfigCommandDataChild::SessionSetAppConfigCmd(child_data) 6524 } 6525 (4) if SessionGetAppConfigCmdData::conforms(&payload) => { 6526 let mut cell = Cell::new(payload); 6527 let child_data = SessionGetAppConfigCmdData::parse_inner(&mut cell)?; 6528 SessionConfigCommandDataChild::SessionGetAppConfigCmd(child_data) 6529 } 6530 (5) if SessionGetCountCmdData::conforms(&payload) => { 6531 let mut cell = Cell::new(payload); 6532 let child_data = SessionGetCountCmdData::parse_inner(&mut cell)?; 6533 SessionConfigCommandDataChild::SessionGetCountCmd(child_data) 6534 } 6535 (6) if SessionGetStateCmdData::conforms(&payload) => { 6536 let mut cell = Cell::new(payload); 6537 let child_data = SessionGetStateCmdData::parse_inner(&mut cell)?; 6538 SessionConfigCommandDataChild::SessionGetStateCmd(child_data) 6539 } 6540 (9) if SessionUpdateDtTagRangingRoundsCmdData::conforms(&payload) => { 6541 let mut cell = Cell::new(payload); 6542 let child_data = SessionUpdateDtTagRangingRoundsCmdData::parse_inner( 6543 &mut cell, 6544 )?; 6545 SessionConfigCommandDataChild::SessionUpdateDtTagRangingRoundsCmd( 6546 child_data, 6547 ) 6548 } 6549 (7) if SessionUpdateControllerMulticastListCmdData::conforms(&payload) => { 6550 let mut cell = Cell::new(payload); 6551 let child_data = SessionUpdateControllerMulticastListCmdData::parse_inner( 6552 &mut cell, 6553 )?; 6554 SessionConfigCommandDataChild::SessionUpdateControllerMulticastListCmd( 6555 child_data, 6556 ) 6557 } 6558 (11) if SessionQueryMaxDataSizeCmdData::conforms(&payload) => { 6559 let mut cell = Cell::new(payload); 6560 let child_data = SessionQueryMaxDataSizeCmdData::parse_inner(&mut cell)?; 6561 SessionConfigCommandDataChild::SessionQueryMaxDataSizeCmd(child_data) 6562 } 6563 (14) if SessionDataTransferPhaseConfigCmdData::conforms(&payload) => { 6564 let mut cell = Cell::new(payload); 6565 let child_data = SessionDataTransferPhaseConfigCmdData::parse_inner( 6566 &mut cell, 6567 )?; 6568 SessionConfigCommandDataChild::SessionDataTransferPhaseConfigCmd( 6569 child_data, 6570 ) 6571 } 6572 (12) if SessionSetHybridControllerConfigCmdData::conforms(&payload) => { 6573 let mut cell = Cell::new(payload); 6574 let child_data = SessionSetHybridControllerConfigCmdData::parse_inner( 6575 &mut cell, 6576 )?; 6577 SessionConfigCommandDataChild::SessionSetHybridControllerConfigCmd( 6578 child_data, 6579 ) 6580 } 6581 (13) if SessionSetHybridControleeConfigCmdData::conforms(&payload) => { 6582 let mut cell = Cell::new(payload); 6583 let child_data = SessionSetHybridControleeConfigCmdData::parse_inner( 6584 &mut cell, 6585 )?; 6586 SessionConfigCommandDataChild::SessionSetHybridControleeConfigCmd( 6587 child_data, 6588 ) 6589 } 6590 _ if !payload.is_empty() => { 6591 SessionConfigCommandDataChild::Payload(Bytes::copy_from_slice(payload)) 6592 } 6593 _ => SessionConfigCommandDataChild::None, 6594 }; 6595 Ok(Self { child }) 6596 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>6597 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 6598 match &self.child { 6599 SessionConfigCommandDataChild::SessionInitCmd(child) => { 6600 child.write_to(buffer)? 6601 } 6602 SessionConfigCommandDataChild::SessionDeinitCmd(child) => { 6603 child.write_to(buffer)? 6604 } 6605 SessionConfigCommandDataChild::SessionSetAppConfigCmd(child) => { 6606 child.write_to(buffer)? 6607 } 6608 SessionConfigCommandDataChild::SessionGetAppConfigCmd(child) => { 6609 child.write_to(buffer)? 6610 } 6611 SessionConfigCommandDataChild::SessionGetCountCmd(child) => { 6612 child.write_to(buffer)? 6613 } 6614 SessionConfigCommandDataChild::SessionGetStateCmd(child) => { 6615 child.write_to(buffer)? 6616 } 6617 SessionConfigCommandDataChild::SessionUpdateDtTagRangingRoundsCmd(child) => { 6618 child.write_to(buffer)? 6619 } 6620 SessionConfigCommandDataChild::SessionUpdateControllerMulticastListCmd( 6621 child, 6622 ) => child.write_to(buffer)?, 6623 SessionConfigCommandDataChild::SessionQueryMaxDataSizeCmd(child) => { 6624 child.write_to(buffer)? 6625 } 6626 SessionConfigCommandDataChild::SessionDataTransferPhaseConfigCmd(child) => { 6627 child.write_to(buffer)? 6628 } 6629 SessionConfigCommandDataChild::SessionSetHybridControllerConfigCmd(child) => { 6630 child.write_to(buffer)? 6631 } 6632 SessionConfigCommandDataChild::SessionSetHybridControleeConfigCmd(child) => { 6633 child.write_to(buffer)? 6634 } 6635 SessionConfigCommandDataChild::Payload(payload) => buffer.put_slice(payload), 6636 SessionConfigCommandDataChild::None => {} 6637 } 6638 Ok(()) 6639 } get_total_size(&self) -> usize6640 fn get_total_size(&self) -> usize { 6641 self.get_size() 6642 } get_size(&self) -> usize6643 fn get_size(&self) -> usize { 6644 self.child.get_total_size() 6645 } 6646 } 6647 impl Packet for SessionConfigCommand { encoded_len(&self) -> usize6648 fn encoded_len(&self) -> usize { 6649 self.get_size() 6650 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>6651 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 6652 self.ucicontrolpacket.write_to(buf) 6653 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>6654 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 6655 unimplemented!("Rust legacy does not implement full packet trait") 6656 } 6657 } 6658 impl TryFrom<SessionConfigCommand> for Bytes { 6659 type Error = EncodeError; try_from(packet: SessionConfigCommand) -> Result<Self, Self::Error>6660 fn try_from(packet: SessionConfigCommand) -> Result<Self, Self::Error> { 6661 packet.encode_to_bytes() 6662 } 6663 } 6664 impl TryFrom<SessionConfigCommand> for Vec<u8> { 6665 type Error = EncodeError; try_from(packet: SessionConfigCommand) -> Result<Self, Self::Error>6666 fn try_from(packet: SessionConfigCommand) -> Result<Self, Self::Error> { 6667 packet.encode_to_vec() 6668 } 6669 } 6670 impl From<SessionConfigCommand> for UciControlPacket { from(packet: SessionConfigCommand) -> UciControlPacket6671 fn from(packet: SessionConfigCommand) -> UciControlPacket { 6672 UciControlPacket::new(packet.ucicontrolpacket).unwrap() 6673 } 6674 } 6675 impl From<SessionConfigCommand> for UciCommand { from(packet: SessionConfigCommand) -> UciCommand6676 fn from(packet: SessionConfigCommand) -> UciCommand { 6677 UciCommand::new(packet.ucicontrolpacket).unwrap() 6678 } 6679 } 6680 impl TryFrom<UciControlPacket> for SessionConfigCommand { 6681 type Error = DecodeError; try_from(packet: UciControlPacket) -> Result<SessionConfigCommand, Self::Error>6682 fn try_from(packet: UciControlPacket) -> Result<SessionConfigCommand, Self::Error> { 6683 SessionConfigCommand::new(packet.ucicontrolpacket) 6684 } 6685 } 6686 impl SessionConfigCommand { parse(bytes: &[u8]) -> Result<Self, DecodeError>6687 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 6688 let mut cell = Cell::new(bytes); 6689 let packet = Self::parse_inner(&mut cell)?; 6690 Ok(packet) 6691 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>6692 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 6693 let data = UciControlPacketData::parse_inner(&mut bytes)?; 6694 Self::new(data) 6695 } specialize(&self) -> SessionConfigCommandChild6696 pub fn specialize(&self) -> SessionConfigCommandChild { 6697 match &self.sessionconfigcommand.child { 6698 SessionConfigCommandDataChild::SessionInitCmd(_) => { 6699 SessionConfigCommandChild::SessionInitCmd( 6700 SessionInitCmd::new(self.ucicontrolpacket.clone()).unwrap(), 6701 ) 6702 } 6703 SessionConfigCommandDataChild::SessionDeinitCmd(_) => { 6704 SessionConfigCommandChild::SessionDeinitCmd( 6705 SessionDeinitCmd::new(self.ucicontrolpacket.clone()).unwrap(), 6706 ) 6707 } 6708 SessionConfigCommandDataChild::SessionSetAppConfigCmd(_) => { 6709 SessionConfigCommandChild::SessionSetAppConfigCmd( 6710 SessionSetAppConfigCmd::new(self.ucicontrolpacket.clone()).unwrap(), 6711 ) 6712 } 6713 SessionConfigCommandDataChild::SessionGetAppConfigCmd(_) => { 6714 SessionConfigCommandChild::SessionGetAppConfigCmd( 6715 SessionGetAppConfigCmd::new(self.ucicontrolpacket.clone()).unwrap(), 6716 ) 6717 } 6718 SessionConfigCommandDataChild::SessionGetCountCmd(_) => { 6719 SessionConfigCommandChild::SessionGetCountCmd( 6720 SessionGetCountCmd::new(self.ucicontrolpacket.clone()).unwrap(), 6721 ) 6722 } 6723 SessionConfigCommandDataChild::SessionGetStateCmd(_) => { 6724 SessionConfigCommandChild::SessionGetStateCmd( 6725 SessionGetStateCmd::new(self.ucicontrolpacket.clone()).unwrap(), 6726 ) 6727 } 6728 SessionConfigCommandDataChild::SessionUpdateDtTagRangingRoundsCmd(_) => { 6729 SessionConfigCommandChild::SessionUpdateDtTagRangingRoundsCmd( 6730 SessionUpdateDtTagRangingRoundsCmd::new( 6731 self.ucicontrolpacket.clone(), 6732 ) 6733 .unwrap(), 6734 ) 6735 } 6736 SessionConfigCommandDataChild::SessionUpdateControllerMulticastListCmd(_) => { 6737 SessionConfigCommandChild::SessionUpdateControllerMulticastListCmd( 6738 SessionUpdateControllerMulticastListCmd::new( 6739 self.ucicontrolpacket.clone(), 6740 ) 6741 .unwrap(), 6742 ) 6743 } 6744 SessionConfigCommandDataChild::SessionQueryMaxDataSizeCmd(_) => { 6745 SessionConfigCommandChild::SessionQueryMaxDataSizeCmd( 6746 SessionQueryMaxDataSizeCmd::new(self.ucicontrolpacket.clone()) 6747 .unwrap(), 6748 ) 6749 } 6750 SessionConfigCommandDataChild::SessionDataTransferPhaseConfigCmd(_) => { 6751 SessionConfigCommandChild::SessionDataTransferPhaseConfigCmd( 6752 SessionDataTransferPhaseConfigCmd::new(self.ucicontrolpacket.clone()) 6753 .unwrap(), 6754 ) 6755 } 6756 SessionConfigCommandDataChild::SessionSetHybridControllerConfigCmd(_) => { 6757 SessionConfigCommandChild::SessionSetHybridControllerConfigCmd( 6758 SessionSetHybridControllerConfigCmd::new( 6759 self.ucicontrolpacket.clone(), 6760 ) 6761 .unwrap(), 6762 ) 6763 } 6764 SessionConfigCommandDataChild::SessionSetHybridControleeConfigCmd(_) => { 6765 SessionConfigCommandChild::SessionSetHybridControleeConfigCmd( 6766 SessionSetHybridControleeConfigCmd::new( 6767 self.ucicontrolpacket.clone(), 6768 ) 6769 .unwrap(), 6770 ) 6771 } 6772 SessionConfigCommandDataChild::Payload(payload) => { 6773 SessionConfigCommandChild::Payload(payload.clone()) 6774 } 6775 SessionConfigCommandDataChild::None => SessionConfigCommandChild::None, 6776 } 6777 } new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError>6778 fn new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError> { 6779 let ucicommand = match &ucicontrolpacket.child { 6780 UciControlPacketDataChild::UciCommand(value) => value.clone(), 6781 _ => { 6782 return Err(DecodeError::InvalidChildError { 6783 expected: stringify!(UciControlPacketDataChild::UciCommand), 6784 actual: format!("{:?}", & ucicontrolpacket.child), 6785 }); 6786 } 6787 }; 6788 let sessionconfigcommand = match &ucicommand.child { 6789 UciCommandDataChild::SessionConfigCommand(value) => value.clone(), 6790 _ => { 6791 return Err(DecodeError::InvalidChildError { 6792 expected: stringify!(UciCommandDataChild::SessionConfigCommand), 6793 actual: format!("{:?}", & ucicommand.child), 6794 }); 6795 } 6796 }; 6797 Ok(Self { 6798 ucicontrolpacket, 6799 ucicommand, 6800 sessionconfigcommand, 6801 }) 6802 } get_group_id(&self) -> GroupId6803 pub fn get_group_id(&self) -> GroupId { 6804 self.ucicontrolpacket.group_id 6805 } get_message_type(&self) -> MessageType6806 pub fn get_message_type(&self) -> MessageType { 6807 self.ucicontrolpacket.message_type 6808 } get_opcode(&self) -> u86809 pub fn get_opcode(&self) -> u8 { 6810 self.ucicontrolpacket.opcode 6811 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>6812 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 6813 self.sessionconfigcommand.write_to(buffer) 6814 } get_size(&self) -> usize6815 pub fn get_size(&self) -> usize { 6816 self.ucicontrolpacket.get_size() 6817 } 6818 } 6819 impl SessionConfigCommandBuilder { build(self) -> SessionConfigCommand6820 pub fn build(self) -> SessionConfigCommand { 6821 let sessionconfigcommand = SessionConfigCommandData { 6822 child: match self.payload { 6823 None => SessionConfigCommandDataChild::None, 6824 Some(bytes) => SessionConfigCommandDataChild::Payload(bytes), 6825 }, 6826 }; 6827 let ucicommand = UciCommandData { 6828 child: UciCommandDataChild::SessionConfigCommand(sessionconfigcommand), 6829 }; 6830 let ucicontrolpacket = UciControlPacketData { 6831 group_id: GroupId::SessionConfig, 6832 message_type: MessageType::Command, 6833 opcode: self.opcode, 6834 child: UciControlPacketDataChild::UciCommand(ucicommand), 6835 }; 6836 SessionConfigCommand::new(ucicontrolpacket).unwrap() 6837 } 6838 } 6839 impl From<SessionConfigCommandBuilder> for UciControlPacket { from(builder: SessionConfigCommandBuilder) -> UciControlPacket6840 fn from(builder: SessionConfigCommandBuilder) -> UciControlPacket { 6841 builder.build().into() 6842 } 6843 } 6844 impl From<SessionConfigCommandBuilder> for UciCommand { from(builder: SessionConfigCommandBuilder) -> UciCommand6845 fn from(builder: SessionConfigCommandBuilder) -> UciCommand { 6846 builder.build().into() 6847 } 6848 } 6849 impl From<SessionConfigCommandBuilder> for SessionConfigCommand { from(builder: SessionConfigCommandBuilder) -> SessionConfigCommand6850 fn from(builder: SessionConfigCommandBuilder) -> SessionConfigCommand { 6851 builder.build().into() 6852 } 6853 } 6854 #[derive(Debug, Clone, PartialEq, Eq)] 6855 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6856 pub enum SessionConfigResponseDataChild { 6857 SessionInitRsp_V2(SessionInitRsp_V2Data), 6858 SessionInitRsp(SessionInitRspData), 6859 SessionDeinitRsp(SessionDeinitRspData), 6860 SessionSetAppConfigRsp(SessionSetAppConfigRspData), 6861 SessionGetAppConfigRsp(SessionGetAppConfigRspData), 6862 SessionGetCountRsp(SessionGetCountRspData), 6863 SessionGetStateRsp(SessionGetStateRspData), 6864 SessionUpdateDtTagRangingRoundsRsp(SessionUpdateDtTagRangingRoundsRspData), 6865 SessionUpdateControllerMulticastListRsp(SessionUpdateControllerMulticastListRspData), 6866 SessionQueryMaxDataSizeRsp(SessionQueryMaxDataSizeRspData), 6867 SessionDataTransferPhaseConfigRsp(SessionDataTransferPhaseConfigRspData), 6868 SessionSetHybridControllerConfigRsp(SessionSetHybridControllerConfigRspData), 6869 SessionSetHybridControleeConfigRsp(SessionSetHybridControleeConfigRspData), 6870 Payload(Bytes), 6871 None, 6872 } 6873 impl SessionConfigResponseDataChild { get_total_size(&self) -> usize6874 fn get_total_size(&self) -> usize { 6875 match self { 6876 SessionConfigResponseDataChild::SessionInitRsp_V2(value) => { 6877 value.get_total_size() 6878 } 6879 SessionConfigResponseDataChild::SessionInitRsp(value) => { 6880 value.get_total_size() 6881 } 6882 SessionConfigResponseDataChild::SessionDeinitRsp(value) => { 6883 value.get_total_size() 6884 } 6885 SessionConfigResponseDataChild::SessionSetAppConfigRsp(value) => { 6886 value.get_total_size() 6887 } 6888 SessionConfigResponseDataChild::SessionGetAppConfigRsp(value) => { 6889 value.get_total_size() 6890 } 6891 SessionConfigResponseDataChild::SessionGetCountRsp(value) => { 6892 value.get_total_size() 6893 } 6894 SessionConfigResponseDataChild::SessionGetStateRsp(value) => { 6895 value.get_total_size() 6896 } 6897 SessionConfigResponseDataChild::SessionUpdateDtTagRangingRoundsRsp(value) => { 6898 value.get_total_size() 6899 } 6900 SessionConfigResponseDataChild::SessionUpdateControllerMulticastListRsp( 6901 value, 6902 ) => value.get_total_size(), 6903 SessionConfigResponseDataChild::SessionQueryMaxDataSizeRsp(value) => { 6904 value.get_total_size() 6905 } 6906 SessionConfigResponseDataChild::SessionDataTransferPhaseConfigRsp(value) => { 6907 value.get_total_size() 6908 } 6909 SessionConfigResponseDataChild::SessionSetHybridControllerConfigRsp( 6910 value, 6911 ) => value.get_total_size(), 6912 SessionConfigResponseDataChild::SessionSetHybridControleeConfigRsp(value) => { 6913 value.get_total_size() 6914 } 6915 SessionConfigResponseDataChild::Payload(bytes) => bytes.len(), 6916 SessionConfigResponseDataChild::None => 0, 6917 } 6918 } 6919 } 6920 #[derive(Debug, Clone, PartialEq, Eq)] 6921 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6922 pub enum SessionConfigResponseChild { 6923 SessionInitRsp_V2(SessionInitRsp_V2), 6924 SessionInitRsp(SessionInitRsp), 6925 SessionDeinitRsp(SessionDeinitRsp), 6926 SessionSetAppConfigRsp(SessionSetAppConfigRsp), 6927 SessionGetAppConfigRsp(SessionGetAppConfigRsp), 6928 SessionGetCountRsp(SessionGetCountRsp), 6929 SessionGetStateRsp(SessionGetStateRsp), 6930 SessionUpdateDtTagRangingRoundsRsp(SessionUpdateDtTagRangingRoundsRsp), 6931 SessionUpdateControllerMulticastListRsp(SessionUpdateControllerMulticastListRsp), 6932 SessionQueryMaxDataSizeRsp(SessionQueryMaxDataSizeRsp), 6933 SessionDataTransferPhaseConfigRsp(SessionDataTransferPhaseConfigRsp), 6934 SessionSetHybridControllerConfigRsp(SessionSetHybridControllerConfigRsp), 6935 SessionSetHybridControleeConfigRsp(SessionSetHybridControleeConfigRsp), 6936 Payload(Bytes), 6937 None, 6938 } 6939 #[derive(Debug, Clone, PartialEq, Eq)] 6940 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6941 pub struct SessionConfigResponseData { 6942 child: SessionConfigResponseDataChild, 6943 } 6944 #[derive(Debug, Clone, PartialEq, Eq)] 6945 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6946 pub struct SessionConfigResponse { 6947 #[cfg_attr(feature = "serde", serde(flatten))] 6948 ucicontrolpacket: UciControlPacketData, 6949 #[cfg_attr(feature = "serde", serde(flatten))] 6950 uciresponse: UciResponseData, 6951 #[cfg_attr(feature = "serde", serde(flatten))] 6952 sessionconfigresponse: SessionConfigResponseData, 6953 } 6954 #[derive(Debug)] 6955 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 6956 pub struct SessionConfigResponseBuilder { 6957 pub opcode: u8, 6958 pub payload: Option<Bytes>, 6959 } 6960 impl SessionConfigResponseData { conforms(bytes: &[u8]) -> bool6961 fn conforms(bytes: &[u8]) -> bool { 6962 true 6963 } parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError>6964 fn parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError> { 6965 let mut cell = Cell::new(bytes); 6966 let packet = Self::parse_inner(&mut cell, opcode)?; 6967 Ok(packet) 6968 } parse_inner( mut bytes: &mut Cell<&[u8]>, opcode: u8, ) -> Result<Self, DecodeError>6969 fn parse_inner( 6970 mut bytes: &mut Cell<&[u8]>, 6971 opcode: u8, 6972 ) -> Result<Self, DecodeError> { 6973 let payload = bytes.get(); 6974 bytes.get_mut().advance(payload.len()); 6975 let child = match (opcode) { 6976 (0) if SessionInitRsp_V2Data::conforms(&payload) => { 6977 let mut cell = Cell::new(payload); 6978 let child_data = SessionInitRsp_V2Data::parse_inner(&mut cell)?; 6979 SessionConfigResponseDataChild::SessionInitRsp_V2(child_data) 6980 } 6981 (0) if SessionInitRspData::conforms(&payload) => { 6982 let mut cell = Cell::new(payload); 6983 let child_data = SessionInitRspData::parse_inner(&mut cell)?; 6984 SessionConfigResponseDataChild::SessionInitRsp(child_data) 6985 } 6986 (1) if SessionDeinitRspData::conforms(&payload) => { 6987 let mut cell = Cell::new(payload); 6988 let child_data = SessionDeinitRspData::parse_inner(&mut cell)?; 6989 SessionConfigResponseDataChild::SessionDeinitRsp(child_data) 6990 } 6991 (3) if SessionSetAppConfigRspData::conforms(&payload) => { 6992 let mut cell = Cell::new(payload); 6993 let child_data = SessionSetAppConfigRspData::parse_inner(&mut cell)?; 6994 SessionConfigResponseDataChild::SessionSetAppConfigRsp(child_data) 6995 } 6996 (4) if SessionGetAppConfigRspData::conforms(&payload) => { 6997 let mut cell = Cell::new(payload); 6998 let child_data = SessionGetAppConfigRspData::parse_inner(&mut cell)?; 6999 SessionConfigResponseDataChild::SessionGetAppConfigRsp(child_data) 7000 } 7001 (5) if SessionGetCountRspData::conforms(&payload) => { 7002 let mut cell = Cell::new(payload); 7003 let child_data = SessionGetCountRspData::parse_inner(&mut cell)?; 7004 SessionConfigResponseDataChild::SessionGetCountRsp(child_data) 7005 } 7006 (6) if SessionGetStateRspData::conforms(&payload) => { 7007 let mut cell = Cell::new(payload); 7008 let child_data = SessionGetStateRspData::parse_inner(&mut cell)?; 7009 SessionConfigResponseDataChild::SessionGetStateRsp(child_data) 7010 } 7011 (9) if SessionUpdateDtTagRangingRoundsRspData::conforms(&payload) => { 7012 let mut cell = Cell::new(payload); 7013 let child_data = SessionUpdateDtTagRangingRoundsRspData::parse_inner( 7014 &mut cell, 7015 )?; 7016 SessionConfigResponseDataChild::SessionUpdateDtTagRangingRoundsRsp( 7017 child_data, 7018 ) 7019 } 7020 (7) if SessionUpdateControllerMulticastListRspData::conforms(&payload) => { 7021 let mut cell = Cell::new(payload); 7022 let child_data = SessionUpdateControllerMulticastListRspData::parse_inner( 7023 &mut cell, 7024 )?; 7025 SessionConfigResponseDataChild::SessionUpdateControllerMulticastListRsp( 7026 child_data, 7027 ) 7028 } 7029 (11) if SessionQueryMaxDataSizeRspData::conforms(&payload) => { 7030 let mut cell = Cell::new(payload); 7031 let child_data = SessionQueryMaxDataSizeRspData::parse_inner(&mut cell)?; 7032 SessionConfigResponseDataChild::SessionQueryMaxDataSizeRsp(child_data) 7033 } 7034 (14) if SessionDataTransferPhaseConfigRspData::conforms(&payload) => { 7035 let mut cell = Cell::new(payload); 7036 let child_data = SessionDataTransferPhaseConfigRspData::parse_inner( 7037 &mut cell, 7038 )?; 7039 SessionConfigResponseDataChild::SessionDataTransferPhaseConfigRsp( 7040 child_data, 7041 ) 7042 } 7043 (12) if SessionSetHybridControllerConfigRspData::conforms(&payload) => { 7044 let mut cell = Cell::new(payload); 7045 let child_data = SessionSetHybridControllerConfigRspData::parse_inner( 7046 &mut cell, 7047 )?; 7048 SessionConfigResponseDataChild::SessionSetHybridControllerConfigRsp( 7049 child_data, 7050 ) 7051 } 7052 (13) if SessionSetHybridControleeConfigRspData::conforms(&payload) => { 7053 let mut cell = Cell::new(payload); 7054 let child_data = SessionSetHybridControleeConfigRspData::parse_inner( 7055 &mut cell, 7056 )?; 7057 SessionConfigResponseDataChild::SessionSetHybridControleeConfigRsp( 7058 child_data, 7059 ) 7060 } 7061 _ if !payload.is_empty() => { 7062 SessionConfigResponseDataChild::Payload(Bytes::copy_from_slice(payload)) 7063 } 7064 _ => SessionConfigResponseDataChild::None, 7065 }; 7066 Ok(Self { child }) 7067 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>7068 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 7069 match &self.child { 7070 SessionConfigResponseDataChild::SessionInitRsp_V2(child) => { 7071 child.write_to(buffer)? 7072 } 7073 SessionConfigResponseDataChild::SessionInitRsp(child) => { 7074 child.write_to(buffer)? 7075 } 7076 SessionConfigResponseDataChild::SessionDeinitRsp(child) => { 7077 child.write_to(buffer)? 7078 } 7079 SessionConfigResponseDataChild::SessionSetAppConfigRsp(child) => { 7080 child.write_to(buffer)? 7081 } 7082 SessionConfigResponseDataChild::SessionGetAppConfigRsp(child) => { 7083 child.write_to(buffer)? 7084 } 7085 SessionConfigResponseDataChild::SessionGetCountRsp(child) => { 7086 child.write_to(buffer)? 7087 } 7088 SessionConfigResponseDataChild::SessionGetStateRsp(child) => { 7089 child.write_to(buffer)? 7090 } 7091 SessionConfigResponseDataChild::SessionUpdateDtTagRangingRoundsRsp(child) => { 7092 child.write_to(buffer)? 7093 } 7094 SessionConfigResponseDataChild::SessionUpdateControllerMulticastListRsp( 7095 child, 7096 ) => child.write_to(buffer)?, 7097 SessionConfigResponseDataChild::SessionQueryMaxDataSizeRsp(child) => { 7098 child.write_to(buffer)? 7099 } 7100 SessionConfigResponseDataChild::SessionDataTransferPhaseConfigRsp(child) => { 7101 child.write_to(buffer)? 7102 } 7103 SessionConfigResponseDataChild::SessionSetHybridControllerConfigRsp( 7104 child, 7105 ) => child.write_to(buffer)?, 7106 SessionConfigResponseDataChild::SessionSetHybridControleeConfigRsp(child) => { 7107 child.write_to(buffer)? 7108 } 7109 SessionConfigResponseDataChild::Payload(payload) => buffer.put_slice(payload), 7110 SessionConfigResponseDataChild::None => {} 7111 } 7112 Ok(()) 7113 } get_total_size(&self) -> usize7114 fn get_total_size(&self) -> usize { 7115 self.get_size() 7116 } get_size(&self) -> usize7117 fn get_size(&self) -> usize { 7118 self.child.get_total_size() 7119 } 7120 } 7121 impl Packet for SessionConfigResponse { encoded_len(&self) -> usize7122 fn encoded_len(&self) -> usize { 7123 self.get_size() 7124 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>7125 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 7126 self.ucicontrolpacket.write_to(buf) 7127 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>7128 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 7129 unimplemented!("Rust legacy does not implement full packet trait") 7130 } 7131 } 7132 impl TryFrom<SessionConfigResponse> for Bytes { 7133 type Error = EncodeError; try_from(packet: SessionConfigResponse) -> Result<Self, Self::Error>7134 fn try_from(packet: SessionConfigResponse) -> Result<Self, Self::Error> { 7135 packet.encode_to_bytes() 7136 } 7137 } 7138 impl TryFrom<SessionConfigResponse> for Vec<u8> { 7139 type Error = EncodeError; try_from(packet: SessionConfigResponse) -> Result<Self, Self::Error>7140 fn try_from(packet: SessionConfigResponse) -> Result<Self, Self::Error> { 7141 packet.encode_to_vec() 7142 } 7143 } 7144 impl From<SessionConfigResponse> for UciControlPacket { from(packet: SessionConfigResponse) -> UciControlPacket7145 fn from(packet: SessionConfigResponse) -> UciControlPacket { 7146 UciControlPacket::new(packet.ucicontrolpacket).unwrap() 7147 } 7148 } 7149 impl From<SessionConfigResponse> for UciResponse { from(packet: SessionConfigResponse) -> UciResponse7150 fn from(packet: SessionConfigResponse) -> UciResponse { 7151 UciResponse::new(packet.ucicontrolpacket).unwrap() 7152 } 7153 } 7154 impl TryFrom<UciControlPacket> for SessionConfigResponse { 7155 type Error = DecodeError; try_from(packet: UciControlPacket) -> Result<SessionConfigResponse, Self::Error>7156 fn try_from(packet: UciControlPacket) -> Result<SessionConfigResponse, Self::Error> { 7157 SessionConfigResponse::new(packet.ucicontrolpacket) 7158 } 7159 } 7160 impl SessionConfigResponse { parse(bytes: &[u8]) -> Result<Self, DecodeError>7161 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 7162 let mut cell = Cell::new(bytes); 7163 let packet = Self::parse_inner(&mut cell)?; 7164 Ok(packet) 7165 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>7166 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 7167 let data = UciControlPacketData::parse_inner(&mut bytes)?; 7168 Self::new(data) 7169 } specialize(&self) -> SessionConfigResponseChild7170 pub fn specialize(&self) -> SessionConfigResponseChild { 7171 match &self.sessionconfigresponse.child { 7172 SessionConfigResponseDataChild::SessionInitRsp_V2(_) => { 7173 SessionConfigResponseChild::SessionInitRsp_V2( 7174 SessionInitRsp_V2::new(self.ucicontrolpacket.clone()).unwrap(), 7175 ) 7176 } 7177 SessionConfigResponseDataChild::SessionInitRsp(_) => { 7178 SessionConfigResponseChild::SessionInitRsp( 7179 SessionInitRsp::new(self.ucicontrolpacket.clone()).unwrap(), 7180 ) 7181 } 7182 SessionConfigResponseDataChild::SessionDeinitRsp(_) => { 7183 SessionConfigResponseChild::SessionDeinitRsp( 7184 SessionDeinitRsp::new(self.ucicontrolpacket.clone()).unwrap(), 7185 ) 7186 } 7187 SessionConfigResponseDataChild::SessionSetAppConfigRsp(_) => { 7188 SessionConfigResponseChild::SessionSetAppConfigRsp( 7189 SessionSetAppConfigRsp::new(self.ucicontrolpacket.clone()).unwrap(), 7190 ) 7191 } 7192 SessionConfigResponseDataChild::SessionGetAppConfigRsp(_) => { 7193 SessionConfigResponseChild::SessionGetAppConfigRsp( 7194 SessionGetAppConfigRsp::new(self.ucicontrolpacket.clone()).unwrap(), 7195 ) 7196 } 7197 SessionConfigResponseDataChild::SessionGetCountRsp(_) => { 7198 SessionConfigResponseChild::SessionGetCountRsp( 7199 SessionGetCountRsp::new(self.ucicontrolpacket.clone()).unwrap(), 7200 ) 7201 } 7202 SessionConfigResponseDataChild::SessionGetStateRsp(_) => { 7203 SessionConfigResponseChild::SessionGetStateRsp( 7204 SessionGetStateRsp::new(self.ucicontrolpacket.clone()).unwrap(), 7205 ) 7206 } 7207 SessionConfigResponseDataChild::SessionUpdateDtTagRangingRoundsRsp(_) => { 7208 SessionConfigResponseChild::SessionUpdateDtTagRangingRoundsRsp( 7209 SessionUpdateDtTagRangingRoundsRsp::new( 7210 self.ucicontrolpacket.clone(), 7211 ) 7212 .unwrap(), 7213 ) 7214 } 7215 SessionConfigResponseDataChild::SessionUpdateControllerMulticastListRsp( 7216 _, 7217 ) => { 7218 SessionConfigResponseChild::SessionUpdateControllerMulticastListRsp( 7219 SessionUpdateControllerMulticastListRsp::new( 7220 self.ucicontrolpacket.clone(), 7221 ) 7222 .unwrap(), 7223 ) 7224 } 7225 SessionConfigResponseDataChild::SessionQueryMaxDataSizeRsp(_) => { 7226 SessionConfigResponseChild::SessionQueryMaxDataSizeRsp( 7227 SessionQueryMaxDataSizeRsp::new(self.ucicontrolpacket.clone()) 7228 .unwrap(), 7229 ) 7230 } 7231 SessionConfigResponseDataChild::SessionDataTransferPhaseConfigRsp(_) => { 7232 SessionConfigResponseChild::SessionDataTransferPhaseConfigRsp( 7233 SessionDataTransferPhaseConfigRsp::new(self.ucicontrolpacket.clone()) 7234 .unwrap(), 7235 ) 7236 } 7237 SessionConfigResponseDataChild::SessionSetHybridControllerConfigRsp(_) => { 7238 SessionConfigResponseChild::SessionSetHybridControllerConfigRsp( 7239 SessionSetHybridControllerConfigRsp::new( 7240 self.ucicontrolpacket.clone(), 7241 ) 7242 .unwrap(), 7243 ) 7244 } 7245 SessionConfigResponseDataChild::SessionSetHybridControleeConfigRsp(_) => { 7246 SessionConfigResponseChild::SessionSetHybridControleeConfigRsp( 7247 SessionSetHybridControleeConfigRsp::new( 7248 self.ucicontrolpacket.clone(), 7249 ) 7250 .unwrap(), 7251 ) 7252 } 7253 SessionConfigResponseDataChild::Payload(payload) => { 7254 SessionConfigResponseChild::Payload(payload.clone()) 7255 } 7256 SessionConfigResponseDataChild::None => SessionConfigResponseChild::None, 7257 } 7258 } new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError>7259 fn new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError> { 7260 let uciresponse = match &ucicontrolpacket.child { 7261 UciControlPacketDataChild::UciResponse(value) => value.clone(), 7262 _ => { 7263 return Err(DecodeError::InvalidChildError { 7264 expected: stringify!(UciControlPacketDataChild::UciResponse), 7265 actual: format!("{:?}", & ucicontrolpacket.child), 7266 }); 7267 } 7268 }; 7269 let sessionconfigresponse = match &uciresponse.child { 7270 UciResponseDataChild::SessionConfigResponse(value) => value.clone(), 7271 _ => { 7272 return Err(DecodeError::InvalidChildError { 7273 expected: stringify!(UciResponseDataChild::SessionConfigResponse), 7274 actual: format!("{:?}", & uciresponse.child), 7275 }); 7276 } 7277 }; 7278 Ok(Self { 7279 ucicontrolpacket, 7280 uciresponse, 7281 sessionconfigresponse, 7282 }) 7283 } get_group_id(&self) -> GroupId7284 pub fn get_group_id(&self) -> GroupId { 7285 self.ucicontrolpacket.group_id 7286 } get_message_type(&self) -> MessageType7287 pub fn get_message_type(&self) -> MessageType { 7288 self.ucicontrolpacket.message_type 7289 } get_opcode(&self) -> u87290 pub fn get_opcode(&self) -> u8 { 7291 self.ucicontrolpacket.opcode 7292 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>7293 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 7294 self.sessionconfigresponse.write_to(buffer) 7295 } get_size(&self) -> usize7296 pub fn get_size(&self) -> usize { 7297 self.ucicontrolpacket.get_size() 7298 } 7299 } 7300 impl SessionConfigResponseBuilder { build(self) -> SessionConfigResponse7301 pub fn build(self) -> SessionConfigResponse { 7302 let sessionconfigresponse = SessionConfigResponseData { 7303 child: match self.payload { 7304 None => SessionConfigResponseDataChild::None, 7305 Some(bytes) => SessionConfigResponseDataChild::Payload(bytes), 7306 }, 7307 }; 7308 let uciresponse = UciResponseData { 7309 child: UciResponseDataChild::SessionConfigResponse(sessionconfigresponse), 7310 }; 7311 let ucicontrolpacket = UciControlPacketData { 7312 group_id: GroupId::SessionConfig, 7313 message_type: MessageType::Response, 7314 opcode: self.opcode, 7315 child: UciControlPacketDataChild::UciResponse(uciresponse), 7316 }; 7317 SessionConfigResponse::new(ucicontrolpacket).unwrap() 7318 } 7319 } 7320 impl From<SessionConfigResponseBuilder> for UciControlPacket { from(builder: SessionConfigResponseBuilder) -> UciControlPacket7321 fn from(builder: SessionConfigResponseBuilder) -> UciControlPacket { 7322 builder.build().into() 7323 } 7324 } 7325 impl From<SessionConfigResponseBuilder> for UciResponse { from(builder: SessionConfigResponseBuilder) -> UciResponse7326 fn from(builder: SessionConfigResponseBuilder) -> UciResponse { 7327 builder.build().into() 7328 } 7329 } 7330 impl From<SessionConfigResponseBuilder> for SessionConfigResponse { from(builder: SessionConfigResponseBuilder) -> SessionConfigResponse7331 fn from(builder: SessionConfigResponseBuilder) -> SessionConfigResponse { 7332 builder.build().into() 7333 } 7334 } 7335 #[derive(Debug, Clone, PartialEq, Eq)] 7336 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7337 pub enum SessionConfigNotificationDataChild { 7338 SessionStatusNtf(SessionStatusNtfData), 7339 SessionUpdateControllerMulticastListNtf(SessionUpdateControllerMulticastListNtfData), 7340 SessionDataTransferPhaseConfigNtf(SessionDataTransferPhaseConfigNtfData), 7341 Payload(Bytes), 7342 None, 7343 } 7344 impl SessionConfigNotificationDataChild { get_total_size(&self) -> usize7345 fn get_total_size(&self) -> usize { 7346 match self { 7347 SessionConfigNotificationDataChild::SessionStatusNtf(value) => { 7348 value.get_total_size() 7349 } 7350 SessionConfigNotificationDataChild::SessionUpdateControllerMulticastListNtf( 7351 value, 7352 ) => value.get_total_size(), 7353 SessionConfigNotificationDataChild::SessionDataTransferPhaseConfigNtf( 7354 value, 7355 ) => value.get_total_size(), 7356 SessionConfigNotificationDataChild::Payload(bytes) => bytes.len(), 7357 SessionConfigNotificationDataChild::None => 0, 7358 } 7359 } 7360 } 7361 #[derive(Debug, Clone, PartialEq, Eq)] 7362 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7363 pub enum SessionConfigNotificationChild { 7364 SessionStatusNtf(SessionStatusNtf), 7365 SessionUpdateControllerMulticastListNtf(SessionUpdateControllerMulticastListNtf), 7366 SessionDataTransferPhaseConfigNtf(SessionDataTransferPhaseConfigNtf), 7367 Payload(Bytes), 7368 None, 7369 } 7370 #[derive(Debug, Clone, PartialEq, Eq)] 7371 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7372 pub struct SessionConfigNotificationData { 7373 child: SessionConfigNotificationDataChild, 7374 } 7375 #[derive(Debug, Clone, PartialEq, Eq)] 7376 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7377 pub struct SessionConfigNotification { 7378 #[cfg_attr(feature = "serde", serde(flatten))] 7379 ucicontrolpacket: UciControlPacketData, 7380 #[cfg_attr(feature = "serde", serde(flatten))] 7381 ucinotification: UciNotificationData, 7382 #[cfg_attr(feature = "serde", serde(flatten))] 7383 sessionconfignotification: SessionConfigNotificationData, 7384 } 7385 #[derive(Debug)] 7386 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7387 pub struct SessionConfigNotificationBuilder { 7388 pub opcode: u8, 7389 pub payload: Option<Bytes>, 7390 } 7391 impl SessionConfigNotificationData { conforms(bytes: &[u8]) -> bool7392 fn conforms(bytes: &[u8]) -> bool { 7393 true 7394 } parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError>7395 fn parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError> { 7396 let mut cell = Cell::new(bytes); 7397 let packet = Self::parse_inner(&mut cell, opcode)?; 7398 Ok(packet) 7399 } parse_inner( mut bytes: &mut Cell<&[u8]>, opcode: u8, ) -> Result<Self, DecodeError>7400 fn parse_inner( 7401 mut bytes: &mut Cell<&[u8]>, 7402 opcode: u8, 7403 ) -> Result<Self, DecodeError> { 7404 let payload = bytes.get(); 7405 bytes.get_mut().advance(payload.len()); 7406 let child = match (opcode) { 7407 (2) if SessionStatusNtfData::conforms(&payload) => { 7408 let mut cell = Cell::new(payload); 7409 let child_data = SessionStatusNtfData::parse_inner(&mut cell)?; 7410 SessionConfigNotificationDataChild::SessionStatusNtf(child_data) 7411 } 7412 (7) if SessionUpdateControllerMulticastListNtfData::conforms(&payload) => { 7413 let mut cell = Cell::new(payload); 7414 let child_data = SessionUpdateControllerMulticastListNtfData::parse_inner( 7415 &mut cell, 7416 )?; 7417 SessionConfigNotificationDataChild::SessionUpdateControllerMulticastListNtf( 7418 child_data, 7419 ) 7420 } 7421 (14) if SessionDataTransferPhaseConfigNtfData::conforms(&payload) => { 7422 let mut cell = Cell::new(payload); 7423 let child_data = SessionDataTransferPhaseConfigNtfData::parse_inner( 7424 &mut cell, 7425 )?; 7426 SessionConfigNotificationDataChild::SessionDataTransferPhaseConfigNtf( 7427 child_data, 7428 ) 7429 } 7430 _ if !payload.is_empty() => { 7431 SessionConfigNotificationDataChild::Payload( 7432 Bytes::copy_from_slice(payload), 7433 ) 7434 } 7435 _ => SessionConfigNotificationDataChild::None, 7436 }; 7437 Ok(Self { child }) 7438 } write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError>7439 fn write_to<T: BufMut>(&self, buffer: &mut T) -> Result<(), EncodeError> { 7440 match &self.child { 7441 SessionConfigNotificationDataChild::SessionStatusNtf(child) => { 7442 child.write_to(buffer)? 7443 } 7444 SessionConfigNotificationDataChild::SessionUpdateControllerMulticastListNtf( 7445 child, 7446 ) => child.write_to(buffer)?, 7447 SessionConfigNotificationDataChild::SessionDataTransferPhaseConfigNtf( 7448 child, 7449 ) => child.write_to(buffer)?, 7450 SessionConfigNotificationDataChild::Payload(payload) => { 7451 buffer.put_slice(payload) 7452 } 7453 SessionConfigNotificationDataChild::None => {} 7454 } 7455 Ok(()) 7456 } get_total_size(&self) -> usize7457 fn get_total_size(&self) -> usize { 7458 self.get_size() 7459 } get_size(&self) -> usize7460 fn get_size(&self) -> usize { 7461 self.child.get_total_size() 7462 } 7463 } 7464 impl Packet for SessionConfigNotification { encoded_len(&self) -> usize7465 fn encoded_len(&self) -> usize { 7466 self.get_size() 7467 } encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>7468 fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError> { 7469 self.ucicontrolpacket.write_to(buf) 7470 } decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError>7471 fn decode(_: &[u8]) -> Result<(Self, &[u8]), DecodeError> { 7472 unimplemented!("Rust legacy does not implement full packet trait") 7473 } 7474 } 7475 impl TryFrom<SessionConfigNotification> for Bytes { 7476 type Error = EncodeError; try_from(packet: SessionConfigNotification) -> Result<Self, Self::Error>7477 fn try_from(packet: SessionConfigNotification) -> Result<Self, Self::Error> { 7478 packet.encode_to_bytes() 7479 } 7480 } 7481 impl TryFrom<SessionConfigNotification> for Vec<u8> { 7482 type Error = EncodeError; try_from(packet: SessionConfigNotification) -> Result<Self, Self::Error>7483 fn try_from(packet: SessionConfigNotification) -> Result<Self, Self::Error> { 7484 packet.encode_to_vec() 7485 } 7486 } 7487 impl From<SessionConfigNotification> for UciControlPacket { from(packet: SessionConfigNotification) -> UciControlPacket7488 fn from(packet: SessionConfigNotification) -> UciControlPacket { 7489 UciControlPacket::new(packet.ucicontrolpacket).unwrap() 7490 } 7491 } 7492 impl From<SessionConfigNotification> for UciNotification { from(packet: SessionConfigNotification) -> UciNotification7493 fn from(packet: SessionConfigNotification) -> UciNotification { 7494 UciNotification::new(packet.ucicontrolpacket).unwrap() 7495 } 7496 } 7497 impl TryFrom<UciControlPacket> for SessionConfigNotification { 7498 type Error = DecodeError; try_from( packet: UciControlPacket, ) -> Result<SessionConfigNotification, Self::Error>7499 fn try_from( 7500 packet: UciControlPacket, 7501 ) -> Result<SessionConfigNotification, Self::Error> { 7502 SessionConfigNotification::new(packet.ucicontrolpacket) 7503 } 7504 } 7505 impl SessionConfigNotification { parse(bytes: &[u8]) -> Result<Self, DecodeError>7506 pub fn parse(bytes: &[u8]) -> Result<Self, DecodeError> { 7507 let mut cell = Cell::new(bytes); 7508 let packet = Self::parse_inner(&mut cell)?; 7509 Ok(packet) 7510 } parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError>7511 fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self, DecodeError> { 7512 let data = UciControlPacketData::parse_inner(&mut bytes)?; 7513 Self::new(data) 7514 } specialize(&self) -> SessionConfigNotificationChild7515 pub fn specialize(&self) -> SessionConfigNotificationChild { 7516 match &self.sessionconfignotification.child { 7517 SessionConfigNotificationDataChild::SessionStatusNtf(_) => { 7518 SessionConfigNotificationChild::SessionStatusNtf( 7519 SessionStatusNtf::new(self.ucicontrolpacket.clone()).unwrap(), 7520 ) 7521 } 7522 SessionConfigNotificationDataChild::SessionUpdateControllerMulticastListNtf( 7523 _, 7524 ) => { 7525 SessionConfigNotificationChild::SessionUpdateControllerMulticastListNtf( 7526 SessionUpdateControllerMulticastListNtf::new( 7527 self.ucicontrolpacket.clone(), 7528 ) 7529 .unwrap(), 7530 ) 7531 } 7532 SessionConfigNotificationDataChild::SessionDataTransferPhaseConfigNtf(_) => { 7533 SessionConfigNotificationChild::SessionDataTransferPhaseConfigNtf( 7534 SessionDataTransferPhaseConfigNtf::new(self.ucicontrolpacket.clone()) 7535 .unwrap(), 7536 ) 7537 } 7538 SessionConfigNotificationDataChild::Payload(payload) => { 7539 SessionConfigNotificationChild::Payload(payload.clone()) 7540 } 7541 SessionConfigNotificationDataChild::None => { 7542 SessionConfigNotificationChild::None 7543 } 7544 } 7545 } new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError>7546 fn new(ucicontrolpacket: UciControlPacketData) -> Result<Self, DecodeError> { 7547 let ucinotification = match &ucicontrolpacket.child { 7548 UciControlPacketDataChild::UciNotification(value) => value.clone(), 7549 _ => { 7550 return Err(DecodeError::InvalidChildError { 7551 expected: stringify!(UciControlPacketDataChild::UciNotification), 7552 actual: format!("{:?}", & ucicontrolpacket.child), 7553 }); 7554 } 7555 }; 7556 let sessionconfignotification = match &ucinotification.child { 7557 UciNotificationDataChild::SessionConfigNotification(value) => value.clone(), 7558 _ => { 7559 return Err(DecodeError::InvalidChildError { 7560 expected: stringify!( 7561 UciNotificationDataChild::SessionConfigNotification 7562 ), 7563 actual: format!("{:?}", & ucinotification.child), 7564 }); 7565 } 7566 }; 7567 Ok(Self { 7568 ucicontrolpacket, 7569 ucinotification, 7570 sessionconfignotification, 7571 }) 7572 } get_group_id(&self) -> GroupId7573 pub fn get_group_id(&self) -> GroupId { 7574 self.ucicontrolpacket.group_id 7575 } get_message_type(&self) -> MessageType7576 pub fn get_message_type(&self) -> MessageType { 7577 self.ucicontrolpacket.message_type 7578 } get_opcode(&self) -> u87579 pub fn get_opcode(&self) -> u8 { 7580 self.ucicontrolpacket.opcode 7581 } write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError>7582 fn write_to(&self, buffer: &mut impl BufMut) -> Result<(), EncodeError> { 7583 self.sessionconfignotification.write_to(buffer) 7584 } get_size(&self) -> usize7585 pub fn get_size(&self) -> usize { 7586 self.ucicontrolpacket.get_size() 7587 } 7588 } 7589 impl SessionConfigNotificationBuilder { build(self) -> SessionConfigNotification7590 pub fn build(self) -> SessionConfigNotification { 7591 let sessionconfignotification = SessionConfigNotificationData { 7592 child: match self.payload { 7593 None => SessionConfigNotificationDataChild::None, 7594 Some(bytes) => SessionConfigNotificationDataChild::Payload(bytes), 7595 }, 7596 }; 7597 let ucinotification = UciNotificationData { 7598 child: UciNotificationDataChild::SessionConfigNotification( 7599 sessionconfignotification, 7600 ), 7601 }; 7602 let ucicontrolpacket = UciControlPacketData { 7603 group_id: GroupId::SessionConfig, 7604 message_type: MessageType::Notification, 7605 opcode: self.opcode, 7606 child: UciControlPacketDataChild::UciNotification(ucinotification), 7607 }; 7608 SessionConfigNotification::new(ucicontrolpacket).unwrap() 7609 } 7610 } 7611 impl From<SessionConfigNotificationBuilder> for UciControlPacket { from(builder: SessionConfigNotificationBuilder) -> UciControlPacket7612 fn from(builder: SessionConfigNotificationBuilder) -> UciControlPacket { 7613 builder.build().into() 7614 } 7615 } 7616 impl From<SessionConfigNotificationBuilder> for UciNotification { from(builder: SessionConfigNotificationBuilder) -> UciNotification7617 fn from(builder: SessionConfigNotificationBuilder) -> UciNotification { 7618 builder.build().into() 7619 } 7620 } 7621 impl From<SessionConfigNotificationBuilder> for SessionConfigNotification { from(builder: SessionConfigNotificationBuilder) -> SessionConfigNotification7622 fn from(builder: SessionConfigNotificationBuilder) -> SessionConfigNotification { 7623 builder.build().into() 7624 } 7625 } 7626 #[derive(Debug, Clone, PartialEq, Eq)] 7627 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7628 pub enum SessionControlCommandDataChild { 7629 SessionStartCmd(SessionStartCmdData), 7630 SessionStopCmd(SessionStopCmdData), 7631 SessionGetRangingCountCmd(SessionGetRangingCountCmdData), 7632 Payload(Bytes), 7633 None, 7634 } 7635 impl SessionControlCommandDataChild { get_total_size(&self) -> usize7636 fn get_total_size(&self) -> usize { 7637 match self { 7638 SessionControlCommandDataChild::SessionStartCmd(value) => { 7639 value.get_total_size() 7640 } 7641 SessionControlCommandDataChild::SessionStopCmd(value) => { 7642 value.get_total_size() 7643 } 7644 SessionControlCommandDataChild::SessionGetRangingCountCmd(value) => { 7645 value.get_total_size() 7646 } 7647 SessionControlCommandDataChild::Payload(bytes) => bytes.len(), 7648 SessionControlCommandDataChild::None => 0, 7649 } 7650 } 7651 } 7652 #[derive(Debug, Clone, PartialEq, Eq)] 7653 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7654 pub enum SessionControlCommandChild { 7655 SessionStartCmd(SessionStartCmd), 7656 SessionStopCmd(SessionStopCmd), 7657 SessionGetRangingCountCmd(SessionGetRangingCountCmd), 7658 Payload(Bytes), 7659 None, 7660 } 7661 #[derive(Debug, Clone, PartialEq, Eq)] 7662 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7663 pub struct SessionControlCommandData { 7664 child: SessionControlCommandDataChild, 7665 } 7666 #[derive(Debug, Clone, PartialEq, Eq)] 7667 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7668 pub struct SessionControlCommand { 7669 #[cfg_attr(feature = "serde", serde(flatten))] 7670 ucicontrolpacket: UciControlPacketData, 7671 #[cfg_attr(feature = "serde", serde(flatten))] 7672 ucicommand: UciCommandData, 7673 #[cfg_attr(feature = "serde", serde(flatten))] 7674 sessioncontrolcommand: SessionControlCommandData, 7675 } 7676 #[derive(Debug)] 7677 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7678 pub struct SessionControlCommandBuilder { 7679 pub opcode: u8, 7680 pub payload: Option<Bytes>, 7681 } 7682 impl SessionControlCommandData { conforms(bytes: &[u8]) -> bool7683 fn conforms(bytes: &[u8]) -> bool { 7684 true 7685 } parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError>7686 fn parse(bytes: &[u8], opcode: u8) -> Result<Self, DecodeError> { 7687 let mut cell = Cell::new(bytes); 7688 let packet = Self::parse_inner(&mut cell, opcode)?; 7689 Ok(packet) 7690 } parse_inner( mut bytes: &mut Cell<&[u8]>, opcode: u8, ) -> Result<Self, DecodeError>7691