fidl_fuchsia_hardware_google_nanohub__common/
fidl_fuchsia_hardware_google_nanohub__common.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
8use futures::future::{self, MaybeDone, TryFutureExt};
9use zx_status;
10
11pub type FirmwareName = String;
12
13#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
14#[repr(u8)]
15pub enum McuWakeLockValue {
16    Release = 0,
17    Acquire = 1,
18}
19
20impl McuWakeLockValue {
21    #[inline]
22    pub fn from_primitive(prim: u8) -> Option<Self> {
23        match prim {
24            0 => Some(Self::Release),
25            1 => Some(Self::Acquire),
26            _ => None,
27        }
28    }
29
30    #[inline]
31    pub const fn into_primitive(self) -> u8 {
32        self as u8
33    }
34}
35
36#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
37#[repr(u32)]
38pub enum PinState {
39    Low = 0,
40    High = 1,
41}
42
43impl PinState {
44    #[inline]
45    pub fn from_primitive(prim: u32) -> Option<Self> {
46        match prim {
47            0 => Some(Self::Low),
48            1 => Some(Self::High),
49            _ => None,
50        }
51    }
52
53    #[inline]
54    pub const fn into_primitive(self) -> u32 {
55        self as u32
56    }
57}
58
59#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
60pub struct DeviceGetFirmwareNameResponse {
61    pub firmware_name: String,
62}
63
64impl fidl::Persistable for DeviceGetFirmwareNameResponse {}
65
66#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
67#[repr(C)]
68pub struct DeviceGetFirmwareVersionResponse {
69    pub version_info: McuVersionInfo,
70}
71
72impl fidl::Persistable for DeviceGetFirmwareVersionResponse {}
73
74#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
75pub struct DeviceSetWakeLockRequest {
76    pub value: McuWakeLockValue,
77}
78
79impl fidl::Persistable for DeviceSetWakeLockRequest {}
80
81#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
82#[repr(C)]
83pub struct DeviceSetWakeUpEventDurationRequest {
84    pub duration: i64,
85}
86
87impl fidl::Persistable for DeviceSetWakeUpEventDurationRequest {}
88
89#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
90#[repr(C)]
91pub struct DeviceGetWakeUpEventDurationResponse {
92    pub duration: i64,
93}
94
95impl fidl::Persistable for DeviceGetWakeUpEventDurationResponse {}
96
97#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
98pub struct HardwareResetPinStates {
99    pub isp_pin_0: PinState,
100    pub isp_pin_1: PinState,
101    pub isp_pin_2: PinState,
102}
103
104impl fidl::Persistable for HardwareResetPinStates {}
105
106#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
107#[repr(C)]
108pub struct McuVersionInfo {
109    pub hardware_type: u16,
110    pub hardware_version: u16,
111    pub bootloader_version: u16,
112    pub os_version: u16,
113    pub variant_version: u32,
114}
115
116impl fidl::Persistable for McuVersionInfo {}
117
118#[derive(Clone, Debug, Default, PartialEq)]
119pub struct McuTimeSyncInfo {
120    pub ap_boot_time: Option<i64>,
121    pub mcu_boot_time: Option<i64>,
122    #[doc(hidden)]
123    pub __source_breaking: fidl::marker::SourceBreaking,
124}
125
126impl fidl::Persistable for McuTimeSyncInfo {}
127
128pub mod device_ordinals {
129    pub const DOWNLOAD_FIRMWARE: u64 = 0x7bba8137e24661e5;
130    pub const GET_FIRMWARE_NAME: u64 = 0x1649434b5e5bcb8d;
131    pub const GET_FIRMWARE_VERSION: u64 = 0x4f0599abcc95736b;
132    pub const GET_TIME_SYNC: u64 = 0x4406991222e3975d;
133    pub const SET_WAKE_LOCK: u64 = 0x9f83f614affa1dc;
134    pub const GET_WAKE_UP_EVENT_DURATION: u64 = 0x45c79749f65e7176;
135    pub const SET_WAKE_UP_EVENT_DURATION: u64 = 0x1fa1771ffa5f570;
136    pub const HARDWARE_RESET: u64 = 0x78e3d2ded2f929f;
137}
138
139mod internal {
140    use super::*;
141    unsafe impl fidl::encoding::TypeMarker for McuWakeLockValue {
142        type Owned = Self;
143
144        #[inline(always)]
145        fn inline_align(_context: fidl::encoding::Context) -> usize {
146            std::mem::align_of::<u8>()
147        }
148
149        #[inline(always)]
150        fn inline_size(_context: fidl::encoding::Context) -> usize {
151            std::mem::size_of::<u8>()
152        }
153
154        #[inline(always)]
155        fn encode_is_copy() -> bool {
156            true
157        }
158
159        #[inline(always)]
160        fn decode_is_copy() -> bool {
161            false
162        }
163    }
164
165    impl fidl::encoding::ValueTypeMarker for McuWakeLockValue {
166        type Borrowed<'a> = Self;
167        #[inline(always)]
168        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
169            *value
170        }
171    }
172
173    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D>
174        for McuWakeLockValue
175    {
176        #[inline]
177        unsafe fn encode(
178            self,
179            encoder: &mut fidl::encoding::Encoder<'_, D>,
180            offset: usize,
181            _depth: fidl::encoding::Depth,
182        ) -> fidl::Result<()> {
183            encoder.debug_check_bounds::<Self>(offset);
184            encoder.write_num(self.into_primitive(), offset);
185            Ok(())
186        }
187    }
188
189    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for McuWakeLockValue {
190        #[inline(always)]
191        fn new_empty() -> Self {
192            Self::Release
193        }
194
195        #[inline]
196        unsafe fn decode(
197            &mut self,
198            decoder: &mut fidl::encoding::Decoder<'_, D>,
199            offset: usize,
200            _depth: fidl::encoding::Depth,
201        ) -> fidl::Result<()> {
202            decoder.debug_check_bounds::<Self>(offset);
203            let prim = decoder.read_num::<u8>(offset);
204
205            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
206            Ok(())
207        }
208    }
209    unsafe impl fidl::encoding::TypeMarker for PinState {
210        type Owned = Self;
211
212        #[inline(always)]
213        fn inline_align(_context: fidl::encoding::Context) -> usize {
214            std::mem::align_of::<u32>()
215        }
216
217        #[inline(always)]
218        fn inline_size(_context: fidl::encoding::Context) -> usize {
219            std::mem::size_of::<u32>()
220        }
221
222        #[inline(always)]
223        fn encode_is_copy() -> bool {
224            true
225        }
226
227        #[inline(always)]
228        fn decode_is_copy() -> bool {
229            false
230        }
231    }
232
233    impl fidl::encoding::ValueTypeMarker for PinState {
234        type Borrowed<'a> = Self;
235        #[inline(always)]
236        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
237            *value
238        }
239    }
240
241    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for PinState {
242        #[inline]
243        unsafe fn encode(
244            self,
245            encoder: &mut fidl::encoding::Encoder<'_, D>,
246            offset: usize,
247            _depth: fidl::encoding::Depth,
248        ) -> fidl::Result<()> {
249            encoder.debug_check_bounds::<Self>(offset);
250            encoder.write_num(self.into_primitive(), offset);
251            Ok(())
252        }
253    }
254
255    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PinState {
256        #[inline(always)]
257        fn new_empty() -> Self {
258            Self::Low
259        }
260
261        #[inline]
262        unsafe fn decode(
263            &mut self,
264            decoder: &mut fidl::encoding::Decoder<'_, D>,
265            offset: usize,
266            _depth: fidl::encoding::Depth,
267        ) -> fidl::Result<()> {
268            decoder.debug_check_bounds::<Self>(offset);
269            let prim = decoder.read_num::<u32>(offset);
270
271            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
272            Ok(())
273        }
274    }
275
276    impl fidl::encoding::ValueTypeMarker for DeviceGetFirmwareNameResponse {
277        type Borrowed<'a> = &'a Self;
278        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
279            value
280        }
281    }
282
283    unsafe impl fidl::encoding::TypeMarker for DeviceGetFirmwareNameResponse {
284        type Owned = Self;
285
286        #[inline(always)]
287        fn inline_align(_context: fidl::encoding::Context) -> usize {
288            8
289        }
290
291        #[inline(always)]
292        fn inline_size(_context: fidl::encoding::Context) -> usize {
293            16
294        }
295    }
296
297    unsafe impl<D: fidl::encoding::ResourceDialect>
298        fidl::encoding::Encode<DeviceGetFirmwareNameResponse, D>
299        for &DeviceGetFirmwareNameResponse
300    {
301        #[inline]
302        unsafe fn encode(
303            self,
304            encoder: &mut fidl::encoding::Encoder<'_, D>,
305            offset: usize,
306            _depth: fidl::encoding::Depth,
307        ) -> fidl::Result<()> {
308            encoder.debug_check_bounds::<DeviceGetFirmwareNameResponse>(offset);
309            // Delegate to tuple encoding.
310            fidl::encoding::Encode::<DeviceGetFirmwareNameResponse, D>::encode(
311                (<fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow(
312                    &self.firmware_name,
313                ),),
314                encoder,
315                offset,
316                _depth,
317            )
318        }
319    }
320    unsafe impl<
321            D: fidl::encoding::ResourceDialect,
322            T0: fidl::encoding::Encode<fidl::encoding::BoundedString<64>, D>,
323        > fidl::encoding::Encode<DeviceGetFirmwareNameResponse, D> for (T0,)
324    {
325        #[inline]
326        unsafe fn encode(
327            self,
328            encoder: &mut fidl::encoding::Encoder<'_, D>,
329            offset: usize,
330            depth: fidl::encoding::Depth,
331        ) -> fidl::Result<()> {
332            encoder.debug_check_bounds::<DeviceGetFirmwareNameResponse>(offset);
333            // Zero out padding regions. There's no need to apply masks
334            // because the unmasked parts will be overwritten by fields.
335            // Write the fields.
336            self.0.encode(encoder, offset + 0, depth)?;
337            Ok(())
338        }
339    }
340
341    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
342        for DeviceGetFirmwareNameResponse
343    {
344        #[inline(always)]
345        fn new_empty() -> Self {
346            Self { firmware_name: fidl::new_empty!(fidl::encoding::BoundedString<64>, D) }
347        }
348
349        #[inline]
350        unsafe fn decode(
351            &mut self,
352            decoder: &mut fidl::encoding::Decoder<'_, D>,
353            offset: usize,
354            _depth: fidl::encoding::Depth,
355        ) -> fidl::Result<()> {
356            decoder.debug_check_bounds::<Self>(offset);
357            // Verify that padding bytes are zero.
358            fidl::decode!(
359                fidl::encoding::BoundedString<64>,
360                D,
361                &mut self.firmware_name,
362                decoder,
363                offset + 0,
364                _depth
365            )?;
366            Ok(())
367        }
368    }
369
370    impl fidl::encoding::ValueTypeMarker for DeviceGetFirmwareVersionResponse {
371        type Borrowed<'a> = &'a Self;
372        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
373            value
374        }
375    }
376
377    unsafe impl fidl::encoding::TypeMarker for DeviceGetFirmwareVersionResponse {
378        type Owned = Self;
379
380        #[inline(always)]
381        fn inline_align(_context: fidl::encoding::Context) -> usize {
382            4
383        }
384
385        #[inline(always)]
386        fn inline_size(_context: fidl::encoding::Context) -> usize {
387            12
388        }
389        #[inline(always)]
390        fn encode_is_copy() -> bool {
391            true
392        }
393
394        #[inline(always)]
395        fn decode_is_copy() -> bool {
396            true
397        }
398    }
399
400    unsafe impl<D: fidl::encoding::ResourceDialect>
401        fidl::encoding::Encode<DeviceGetFirmwareVersionResponse, D>
402        for &DeviceGetFirmwareVersionResponse
403    {
404        #[inline]
405        unsafe fn encode(
406            self,
407            encoder: &mut fidl::encoding::Encoder<'_, D>,
408            offset: usize,
409            _depth: fidl::encoding::Depth,
410        ) -> fidl::Result<()> {
411            encoder.debug_check_bounds::<DeviceGetFirmwareVersionResponse>(offset);
412            unsafe {
413                // Copy the object into the buffer.
414                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
415                (buf_ptr as *mut DeviceGetFirmwareVersionResponse)
416                    .write_unaligned((self as *const DeviceGetFirmwareVersionResponse).read());
417                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
418                // done second because the memcpy will write garbage to these bytes.
419            }
420            Ok(())
421        }
422    }
423    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<McuVersionInfo, D>>
424        fidl::encoding::Encode<DeviceGetFirmwareVersionResponse, D> for (T0,)
425    {
426        #[inline]
427        unsafe fn encode(
428            self,
429            encoder: &mut fidl::encoding::Encoder<'_, D>,
430            offset: usize,
431            depth: fidl::encoding::Depth,
432        ) -> fidl::Result<()> {
433            encoder.debug_check_bounds::<DeviceGetFirmwareVersionResponse>(offset);
434            // Zero out padding regions. There's no need to apply masks
435            // because the unmasked parts will be overwritten by fields.
436            // Write the fields.
437            self.0.encode(encoder, offset + 0, depth)?;
438            Ok(())
439        }
440    }
441
442    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
443        for DeviceGetFirmwareVersionResponse
444    {
445        #[inline(always)]
446        fn new_empty() -> Self {
447            Self { version_info: fidl::new_empty!(McuVersionInfo, D) }
448        }
449
450        #[inline]
451        unsafe fn decode(
452            &mut self,
453            decoder: &mut fidl::encoding::Decoder<'_, D>,
454            offset: usize,
455            _depth: fidl::encoding::Depth,
456        ) -> fidl::Result<()> {
457            decoder.debug_check_bounds::<Self>(offset);
458            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
459            // Verify that padding bytes are zero.
460            // Copy from the buffer into the object.
461            unsafe {
462                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 12);
463            }
464            Ok(())
465        }
466    }
467
468    impl fidl::encoding::ValueTypeMarker for DeviceSetWakeLockRequest {
469        type Borrowed<'a> = &'a Self;
470        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
471            value
472        }
473    }
474
475    unsafe impl fidl::encoding::TypeMarker for DeviceSetWakeLockRequest {
476        type Owned = Self;
477
478        #[inline(always)]
479        fn inline_align(_context: fidl::encoding::Context) -> usize {
480            1
481        }
482
483        #[inline(always)]
484        fn inline_size(_context: fidl::encoding::Context) -> usize {
485            1
486        }
487    }
488
489    unsafe impl<D: fidl::encoding::ResourceDialect>
490        fidl::encoding::Encode<DeviceSetWakeLockRequest, D> for &DeviceSetWakeLockRequest
491    {
492        #[inline]
493        unsafe fn encode(
494            self,
495            encoder: &mut fidl::encoding::Encoder<'_, D>,
496            offset: usize,
497            _depth: fidl::encoding::Depth,
498        ) -> fidl::Result<()> {
499            encoder.debug_check_bounds::<DeviceSetWakeLockRequest>(offset);
500            // Delegate to tuple encoding.
501            fidl::encoding::Encode::<DeviceSetWakeLockRequest, D>::encode(
502                (<McuWakeLockValue as fidl::encoding::ValueTypeMarker>::borrow(&self.value),),
503                encoder,
504                offset,
505                _depth,
506            )
507        }
508    }
509    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<McuWakeLockValue, D>>
510        fidl::encoding::Encode<DeviceSetWakeLockRequest, D> for (T0,)
511    {
512        #[inline]
513        unsafe fn encode(
514            self,
515            encoder: &mut fidl::encoding::Encoder<'_, D>,
516            offset: usize,
517            depth: fidl::encoding::Depth,
518        ) -> fidl::Result<()> {
519            encoder.debug_check_bounds::<DeviceSetWakeLockRequest>(offset);
520            // Zero out padding regions. There's no need to apply masks
521            // because the unmasked parts will be overwritten by fields.
522            // Write the fields.
523            self.0.encode(encoder, offset + 0, depth)?;
524            Ok(())
525        }
526    }
527
528    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
529        for DeviceSetWakeLockRequest
530    {
531        #[inline(always)]
532        fn new_empty() -> Self {
533            Self { value: fidl::new_empty!(McuWakeLockValue, D) }
534        }
535
536        #[inline]
537        unsafe fn decode(
538            &mut self,
539            decoder: &mut fidl::encoding::Decoder<'_, D>,
540            offset: usize,
541            _depth: fidl::encoding::Depth,
542        ) -> fidl::Result<()> {
543            decoder.debug_check_bounds::<Self>(offset);
544            // Verify that padding bytes are zero.
545            fidl::decode!(McuWakeLockValue, D, &mut self.value, decoder, offset + 0, _depth)?;
546            Ok(())
547        }
548    }
549
550    impl fidl::encoding::ValueTypeMarker for DeviceSetWakeUpEventDurationRequest {
551        type Borrowed<'a> = &'a Self;
552        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
553            value
554        }
555    }
556
557    unsafe impl fidl::encoding::TypeMarker for DeviceSetWakeUpEventDurationRequest {
558        type Owned = Self;
559
560        #[inline(always)]
561        fn inline_align(_context: fidl::encoding::Context) -> usize {
562            8
563        }
564
565        #[inline(always)]
566        fn inline_size(_context: fidl::encoding::Context) -> usize {
567            8
568        }
569        #[inline(always)]
570        fn encode_is_copy() -> bool {
571            true
572        }
573
574        #[inline(always)]
575        fn decode_is_copy() -> bool {
576            true
577        }
578    }
579
580    unsafe impl<D: fidl::encoding::ResourceDialect>
581        fidl::encoding::Encode<DeviceSetWakeUpEventDurationRequest, D>
582        for &DeviceSetWakeUpEventDurationRequest
583    {
584        #[inline]
585        unsafe fn encode(
586            self,
587            encoder: &mut fidl::encoding::Encoder<'_, D>,
588            offset: usize,
589            _depth: fidl::encoding::Depth,
590        ) -> fidl::Result<()> {
591            encoder.debug_check_bounds::<DeviceSetWakeUpEventDurationRequest>(offset);
592            unsafe {
593                // Copy the object into the buffer.
594                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
595                (buf_ptr as *mut DeviceSetWakeUpEventDurationRequest)
596                    .write_unaligned((self as *const DeviceSetWakeUpEventDurationRequest).read());
597                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
598                // done second because the memcpy will write garbage to these bytes.
599            }
600            Ok(())
601        }
602    }
603    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i64, D>>
604        fidl::encoding::Encode<DeviceSetWakeUpEventDurationRequest, D> for (T0,)
605    {
606        #[inline]
607        unsafe fn encode(
608            self,
609            encoder: &mut fidl::encoding::Encoder<'_, D>,
610            offset: usize,
611            depth: fidl::encoding::Depth,
612        ) -> fidl::Result<()> {
613            encoder.debug_check_bounds::<DeviceSetWakeUpEventDurationRequest>(offset);
614            // Zero out padding regions. There's no need to apply masks
615            // because the unmasked parts will be overwritten by fields.
616            // Write the fields.
617            self.0.encode(encoder, offset + 0, depth)?;
618            Ok(())
619        }
620    }
621
622    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
623        for DeviceSetWakeUpEventDurationRequest
624    {
625        #[inline(always)]
626        fn new_empty() -> Self {
627            Self { duration: fidl::new_empty!(i64, D) }
628        }
629
630        #[inline]
631        unsafe fn decode(
632            &mut self,
633            decoder: &mut fidl::encoding::Decoder<'_, D>,
634            offset: usize,
635            _depth: fidl::encoding::Depth,
636        ) -> fidl::Result<()> {
637            decoder.debug_check_bounds::<Self>(offset);
638            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
639            // Verify that padding bytes are zero.
640            // Copy from the buffer into the object.
641            unsafe {
642                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
643            }
644            Ok(())
645        }
646    }
647
648    impl fidl::encoding::ValueTypeMarker for DeviceGetWakeUpEventDurationResponse {
649        type Borrowed<'a> = &'a Self;
650        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
651            value
652        }
653    }
654
655    unsafe impl fidl::encoding::TypeMarker for DeviceGetWakeUpEventDurationResponse {
656        type Owned = Self;
657
658        #[inline(always)]
659        fn inline_align(_context: fidl::encoding::Context) -> usize {
660            8
661        }
662
663        #[inline(always)]
664        fn inline_size(_context: fidl::encoding::Context) -> usize {
665            8
666        }
667        #[inline(always)]
668        fn encode_is_copy() -> bool {
669            true
670        }
671
672        #[inline(always)]
673        fn decode_is_copy() -> bool {
674            true
675        }
676    }
677
678    unsafe impl<D: fidl::encoding::ResourceDialect>
679        fidl::encoding::Encode<DeviceGetWakeUpEventDurationResponse, D>
680        for &DeviceGetWakeUpEventDurationResponse
681    {
682        #[inline]
683        unsafe fn encode(
684            self,
685            encoder: &mut fidl::encoding::Encoder<'_, D>,
686            offset: usize,
687            _depth: fidl::encoding::Depth,
688        ) -> fidl::Result<()> {
689            encoder.debug_check_bounds::<DeviceGetWakeUpEventDurationResponse>(offset);
690            unsafe {
691                // Copy the object into the buffer.
692                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
693                (buf_ptr as *mut DeviceGetWakeUpEventDurationResponse)
694                    .write_unaligned((self as *const DeviceGetWakeUpEventDurationResponse).read());
695                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
696                // done second because the memcpy will write garbage to these bytes.
697            }
698            Ok(())
699        }
700    }
701    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i64, D>>
702        fidl::encoding::Encode<DeviceGetWakeUpEventDurationResponse, D> for (T0,)
703    {
704        #[inline]
705        unsafe fn encode(
706            self,
707            encoder: &mut fidl::encoding::Encoder<'_, D>,
708            offset: usize,
709            depth: fidl::encoding::Depth,
710        ) -> fidl::Result<()> {
711            encoder.debug_check_bounds::<DeviceGetWakeUpEventDurationResponse>(offset);
712            // Zero out padding regions. There's no need to apply masks
713            // because the unmasked parts will be overwritten by fields.
714            // Write the fields.
715            self.0.encode(encoder, offset + 0, depth)?;
716            Ok(())
717        }
718    }
719
720    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
721        for DeviceGetWakeUpEventDurationResponse
722    {
723        #[inline(always)]
724        fn new_empty() -> Self {
725            Self { duration: fidl::new_empty!(i64, D) }
726        }
727
728        #[inline]
729        unsafe fn decode(
730            &mut self,
731            decoder: &mut fidl::encoding::Decoder<'_, D>,
732            offset: usize,
733            _depth: fidl::encoding::Depth,
734        ) -> fidl::Result<()> {
735            decoder.debug_check_bounds::<Self>(offset);
736            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
737            // Verify that padding bytes are zero.
738            // Copy from the buffer into the object.
739            unsafe {
740                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
741            }
742            Ok(())
743        }
744    }
745
746    impl fidl::encoding::ValueTypeMarker for HardwareResetPinStates {
747        type Borrowed<'a> = &'a Self;
748        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
749            value
750        }
751    }
752
753    unsafe impl fidl::encoding::TypeMarker for HardwareResetPinStates {
754        type Owned = Self;
755
756        #[inline(always)]
757        fn inline_align(_context: fidl::encoding::Context) -> usize {
758            4
759        }
760
761        #[inline(always)]
762        fn inline_size(_context: fidl::encoding::Context) -> usize {
763            12
764        }
765    }
766
767    unsafe impl<D: fidl::encoding::ResourceDialect>
768        fidl::encoding::Encode<HardwareResetPinStates, D> for &HardwareResetPinStates
769    {
770        #[inline]
771        unsafe fn encode(
772            self,
773            encoder: &mut fidl::encoding::Encoder<'_, D>,
774            offset: usize,
775            _depth: fidl::encoding::Depth,
776        ) -> fidl::Result<()> {
777            encoder.debug_check_bounds::<HardwareResetPinStates>(offset);
778            // Delegate to tuple encoding.
779            fidl::encoding::Encode::<HardwareResetPinStates, D>::encode(
780                (
781                    <PinState as fidl::encoding::ValueTypeMarker>::borrow(&self.isp_pin_0),
782                    <PinState as fidl::encoding::ValueTypeMarker>::borrow(&self.isp_pin_1),
783                    <PinState as fidl::encoding::ValueTypeMarker>::borrow(&self.isp_pin_2),
784                ),
785                encoder,
786                offset,
787                _depth,
788            )
789        }
790    }
791    unsafe impl<
792            D: fidl::encoding::ResourceDialect,
793            T0: fidl::encoding::Encode<PinState, D>,
794            T1: fidl::encoding::Encode<PinState, D>,
795            T2: fidl::encoding::Encode<PinState, D>,
796        > fidl::encoding::Encode<HardwareResetPinStates, D> for (T0, T1, T2)
797    {
798        #[inline]
799        unsafe fn encode(
800            self,
801            encoder: &mut fidl::encoding::Encoder<'_, D>,
802            offset: usize,
803            depth: fidl::encoding::Depth,
804        ) -> fidl::Result<()> {
805            encoder.debug_check_bounds::<HardwareResetPinStates>(offset);
806            // Zero out padding regions. There's no need to apply masks
807            // because the unmasked parts will be overwritten by fields.
808            // Write the fields.
809            self.0.encode(encoder, offset + 0, depth)?;
810            self.1.encode(encoder, offset + 4, depth)?;
811            self.2.encode(encoder, offset + 8, depth)?;
812            Ok(())
813        }
814    }
815
816    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
817        for HardwareResetPinStates
818    {
819        #[inline(always)]
820        fn new_empty() -> Self {
821            Self {
822                isp_pin_0: fidl::new_empty!(PinState, D),
823                isp_pin_1: fidl::new_empty!(PinState, D),
824                isp_pin_2: fidl::new_empty!(PinState, D),
825            }
826        }
827
828        #[inline]
829        unsafe fn decode(
830            &mut self,
831            decoder: &mut fidl::encoding::Decoder<'_, D>,
832            offset: usize,
833            _depth: fidl::encoding::Depth,
834        ) -> fidl::Result<()> {
835            decoder.debug_check_bounds::<Self>(offset);
836            // Verify that padding bytes are zero.
837            fidl::decode!(PinState, D, &mut self.isp_pin_0, decoder, offset + 0, _depth)?;
838            fidl::decode!(PinState, D, &mut self.isp_pin_1, decoder, offset + 4, _depth)?;
839            fidl::decode!(PinState, D, &mut self.isp_pin_2, decoder, offset + 8, _depth)?;
840            Ok(())
841        }
842    }
843
844    impl fidl::encoding::ValueTypeMarker for McuVersionInfo {
845        type Borrowed<'a> = &'a Self;
846        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
847            value
848        }
849    }
850
851    unsafe impl fidl::encoding::TypeMarker for McuVersionInfo {
852        type Owned = Self;
853
854        #[inline(always)]
855        fn inline_align(_context: fidl::encoding::Context) -> usize {
856            4
857        }
858
859        #[inline(always)]
860        fn inline_size(_context: fidl::encoding::Context) -> usize {
861            12
862        }
863        #[inline(always)]
864        fn encode_is_copy() -> bool {
865            true
866        }
867
868        #[inline(always)]
869        fn decode_is_copy() -> bool {
870            true
871        }
872    }
873
874    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<McuVersionInfo, D>
875        for &McuVersionInfo
876    {
877        #[inline]
878        unsafe fn encode(
879            self,
880            encoder: &mut fidl::encoding::Encoder<'_, D>,
881            offset: usize,
882            _depth: fidl::encoding::Depth,
883        ) -> fidl::Result<()> {
884            encoder.debug_check_bounds::<McuVersionInfo>(offset);
885            unsafe {
886                // Copy the object into the buffer.
887                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
888                (buf_ptr as *mut McuVersionInfo)
889                    .write_unaligned((self as *const McuVersionInfo).read());
890                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
891                // done second because the memcpy will write garbage to these bytes.
892            }
893            Ok(())
894        }
895    }
896    unsafe impl<
897            D: fidl::encoding::ResourceDialect,
898            T0: fidl::encoding::Encode<u16, D>,
899            T1: fidl::encoding::Encode<u16, D>,
900            T2: fidl::encoding::Encode<u16, D>,
901            T3: fidl::encoding::Encode<u16, D>,
902            T4: fidl::encoding::Encode<u32, D>,
903        > fidl::encoding::Encode<McuVersionInfo, D> for (T0, T1, T2, T3, T4)
904    {
905        #[inline]
906        unsafe fn encode(
907            self,
908            encoder: &mut fidl::encoding::Encoder<'_, D>,
909            offset: usize,
910            depth: fidl::encoding::Depth,
911        ) -> fidl::Result<()> {
912            encoder.debug_check_bounds::<McuVersionInfo>(offset);
913            // Zero out padding regions. There's no need to apply masks
914            // because the unmasked parts will be overwritten by fields.
915            // Write the fields.
916            self.0.encode(encoder, offset + 0, depth)?;
917            self.1.encode(encoder, offset + 2, depth)?;
918            self.2.encode(encoder, offset + 4, depth)?;
919            self.3.encode(encoder, offset + 6, depth)?;
920            self.4.encode(encoder, offset + 8, depth)?;
921            Ok(())
922        }
923    }
924
925    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for McuVersionInfo {
926        #[inline(always)]
927        fn new_empty() -> Self {
928            Self {
929                hardware_type: fidl::new_empty!(u16, D),
930                hardware_version: fidl::new_empty!(u16, D),
931                bootloader_version: fidl::new_empty!(u16, D),
932                os_version: fidl::new_empty!(u16, D),
933                variant_version: fidl::new_empty!(u32, D),
934            }
935        }
936
937        #[inline]
938        unsafe fn decode(
939            &mut self,
940            decoder: &mut fidl::encoding::Decoder<'_, D>,
941            offset: usize,
942            _depth: fidl::encoding::Depth,
943        ) -> fidl::Result<()> {
944            decoder.debug_check_bounds::<Self>(offset);
945            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
946            // Verify that padding bytes are zero.
947            // Copy from the buffer into the object.
948            unsafe {
949                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 12);
950            }
951            Ok(())
952        }
953    }
954
955    impl McuTimeSyncInfo {
956        #[inline(always)]
957        fn max_ordinal_present(&self) -> u64 {
958            if let Some(_) = self.mcu_boot_time {
959                return 2;
960            }
961            if let Some(_) = self.ap_boot_time {
962                return 1;
963            }
964            0
965        }
966    }
967
968    impl fidl::encoding::ValueTypeMarker for McuTimeSyncInfo {
969        type Borrowed<'a> = &'a Self;
970        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
971            value
972        }
973    }
974
975    unsafe impl fidl::encoding::TypeMarker for McuTimeSyncInfo {
976        type Owned = Self;
977
978        #[inline(always)]
979        fn inline_align(_context: fidl::encoding::Context) -> usize {
980            8
981        }
982
983        #[inline(always)]
984        fn inline_size(_context: fidl::encoding::Context) -> usize {
985            16
986        }
987    }
988
989    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<McuTimeSyncInfo, D>
990        for &McuTimeSyncInfo
991    {
992        unsafe fn encode(
993            self,
994            encoder: &mut fidl::encoding::Encoder<'_, D>,
995            offset: usize,
996            mut depth: fidl::encoding::Depth,
997        ) -> fidl::Result<()> {
998            encoder.debug_check_bounds::<McuTimeSyncInfo>(offset);
999            // Vector header
1000            let max_ordinal: u64 = self.max_ordinal_present();
1001            encoder.write_num(max_ordinal, offset);
1002            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1003            // Calling encoder.out_of_line_offset(0) is not allowed.
1004            if max_ordinal == 0 {
1005                return Ok(());
1006            }
1007            depth.increment()?;
1008            let envelope_size = 8;
1009            let bytes_len = max_ordinal as usize * envelope_size;
1010            #[allow(unused_variables)]
1011            let offset = encoder.out_of_line_offset(bytes_len);
1012            let mut _prev_end_offset: usize = 0;
1013            if 1 > max_ordinal {
1014                return Ok(());
1015            }
1016
1017            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1018            // are envelope_size bytes.
1019            let cur_offset: usize = (1 - 1) * envelope_size;
1020
1021            // Zero reserved fields.
1022            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1023
1024            // Safety:
1025            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1026            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1027            //   envelope_size bytes, there is always sufficient room.
1028            fidl::encoding::encode_in_envelope_optional::<i64, D>(
1029                self.ap_boot_time.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
1030                encoder,
1031                offset + cur_offset,
1032                depth,
1033            )?;
1034
1035            _prev_end_offset = cur_offset + envelope_size;
1036            if 2 > max_ordinal {
1037                return Ok(());
1038            }
1039
1040            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1041            // are envelope_size bytes.
1042            let cur_offset: usize = (2 - 1) * envelope_size;
1043
1044            // Zero reserved fields.
1045            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1046
1047            // Safety:
1048            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1049            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1050            //   envelope_size bytes, there is always sufficient room.
1051            fidl::encoding::encode_in_envelope_optional::<i64, D>(
1052                self.mcu_boot_time.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
1053                encoder,
1054                offset + cur_offset,
1055                depth,
1056            )?;
1057
1058            _prev_end_offset = cur_offset + envelope_size;
1059
1060            Ok(())
1061        }
1062    }
1063
1064    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for McuTimeSyncInfo {
1065        #[inline(always)]
1066        fn new_empty() -> Self {
1067            Self::default()
1068        }
1069
1070        unsafe fn decode(
1071            &mut self,
1072            decoder: &mut fidl::encoding::Decoder<'_, D>,
1073            offset: usize,
1074            mut depth: fidl::encoding::Depth,
1075        ) -> fidl::Result<()> {
1076            decoder.debug_check_bounds::<Self>(offset);
1077            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1078                None => return Err(fidl::Error::NotNullable),
1079                Some(len) => len,
1080            };
1081            // Calling decoder.out_of_line_offset(0) is not allowed.
1082            if len == 0 {
1083                return Ok(());
1084            };
1085            depth.increment()?;
1086            let envelope_size = 8;
1087            let bytes_len = len * envelope_size;
1088            let offset = decoder.out_of_line_offset(bytes_len)?;
1089            // Decode the envelope for each type.
1090            let mut _next_ordinal_to_read = 0;
1091            let mut next_offset = offset;
1092            let end_offset = offset + bytes_len;
1093            _next_ordinal_to_read += 1;
1094            if next_offset >= end_offset {
1095                return Ok(());
1096            }
1097
1098            // Decode unknown envelopes for gaps in ordinals.
1099            while _next_ordinal_to_read < 1 {
1100                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1101                _next_ordinal_to_read += 1;
1102                next_offset += envelope_size;
1103            }
1104
1105            let next_out_of_line = decoder.next_out_of_line();
1106            let handles_before = decoder.remaining_handles();
1107            if let Some((inlined, num_bytes, num_handles)) =
1108                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1109            {
1110                let member_inline_size =
1111                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1112                if inlined != (member_inline_size <= 4) {
1113                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1114                }
1115                let inner_offset;
1116                let mut inner_depth = depth.clone();
1117                if inlined {
1118                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1119                    inner_offset = next_offset;
1120                } else {
1121                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1122                    inner_depth.increment()?;
1123                }
1124                let val_ref = self.ap_boot_time.get_or_insert_with(|| fidl::new_empty!(i64, D));
1125                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
1126                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1127                {
1128                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1129                }
1130                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1131                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1132                }
1133            }
1134
1135            next_offset += envelope_size;
1136            _next_ordinal_to_read += 1;
1137            if next_offset >= end_offset {
1138                return Ok(());
1139            }
1140
1141            // Decode unknown envelopes for gaps in ordinals.
1142            while _next_ordinal_to_read < 2 {
1143                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1144                _next_ordinal_to_read += 1;
1145                next_offset += envelope_size;
1146            }
1147
1148            let next_out_of_line = decoder.next_out_of_line();
1149            let handles_before = decoder.remaining_handles();
1150            if let Some((inlined, num_bytes, num_handles)) =
1151                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1152            {
1153                let member_inline_size =
1154                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1155                if inlined != (member_inline_size <= 4) {
1156                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1157                }
1158                let inner_offset;
1159                let mut inner_depth = depth.clone();
1160                if inlined {
1161                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1162                    inner_offset = next_offset;
1163                } else {
1164                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1165                    inner_depth.increment()?;
1166                }
1167                let val_ref = self.mcu_boot_time.get_or_insert_with(|| fidl::new_empty!(i64, D));
1168                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
1169                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1170                {
1171                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1172                }
1173                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1174                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1175                }
1176            }
1177
1178            next_offset += envelope_size;
1179
1180            // Decode the remaining unknown envelopes.
1181            while next_offset < end_offset {
1182                _next_ordinal_to_read += 1;
1183                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1184                next_offset += envelope_size;
1185            }
1186
1187            Ok(())
1188        }
1189    }
1190}