1use core::fmt;
14use core::marker::PhantomData;
15use core::mem;
16
17use crate::bindings;
18use crate::error::{Error, Result};
19
20pub struct Queue<T: Copy, const N: usize> {
25 handle: bindings::ove_queue_t,
26 _marker: PhantomData<T>,
27}
28
29impl<T: Copy, const N: usize> Queue<T, N> {
30 #[cfg(not(zero_heap))]
32 pub fn new() -> Result<Self> {
33 let mut handle: bindings::ove_queue_t = core::ptr::null_mut();
34 let rc = unsafe {
35 bindings::ove_queue_create(&mut handle, mem::size_of::<T>(), N as u32)
36 };
37 Error::from_code(rc)?;
38 Ok(Self {
39 handle,
40 _marker: PhantomData,
41 })
42 }
43
44 #[cfg(zero_heap)]
51 pub unsafe fn from_static(
52 storage: *mut bindings::ove_queue_storage_t,
53 buffer: *mut core::ffi::c_void,
54 ) -> Result<Self> {
55 let mut handle: bindings::ove_queue_t = core::ptr::null_mut();
56 let rc = unsafe {
57 bindings::ove_queue_init(
58 &mut handle,
59 storage,
60 buffer,
61 mem::size_of::<T>(),
62 N as u32,
63 )
64 };
65 Error::from_code(rc)?;
66 Ok(Self {
67 handle,
68 _marker: PhantomData,
69 })
70 }
71
72 pub fn send(&self, item: &T, timeout_ms: u32) -> Result<()> {
78 let rc = unsafe {
79 bindings::ove_queue_send(
80 self.handle,
81 item as *const T as *const _,
82 timeout_ms,
83 )
84 };
85 Error::from_code(rc)
86 }
87
88 pub fn receive(&self, timeout_ms: u32) -> Result<T> {
93 let mut item: mem::MaybeUninit<T> = mem::MaybeUninit::uninit();
94 let rc = unsafe {
95 bindings::ove_queue_receive(
96 self.handle,
97 item.as_mut_ptr() as *mut _,
98 timeout_ms,
99 )
100 };
101 Error::from_code(rc)?;
102 Ok(unsafe { item.assume_init() })
103 }
104
105 pub fn send_from_isr(&self, item: &T) -> Result<()> {
110 let rc = unsafe {
111 bindings::ove_queue_send_from_isr(self.handle, item as *const T as *const _)
112 };
113 Error::from_code(rc)
114 }
115
116 pub fn receive_from_isr(&self) -> Result<T> {
121 let mut item: mem::MaybeUninit<T> = mem::MaybeUninit::uninit();
122 let rc = unsafe {
123 bindings::ove_queue_receive_from_isr(self.handle, item.as_mut_ptr() as *mut _)
124 };
125 Error::from_code(rc)?;
126 Ok(unsafe { item.assume_init() })
127 }
128}
129
130impl<T: Copy, const N: usize> fmt::Debug for Queue<T, N> {
131 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
132 f.debug_struct("Queue")
133 .field("handle", &format_args!("{:p}", self.handle))
134 .finish()
135 }
136}
137
138impl<T: Copy, const N: usize> Drop for Queue<T, N> {
139 fn drop(&mut self) {
140 if self.handle.is_null() { return; }
141 #[cfg(not(zero_heap))]
142 unsafe { bindings::ove_queue_destroy(self.handle) }
143 #[cfg(zero_heap)]
144 unsafe { bindings::ove_queue_deinit(self.handle) }
145 }
146}
147
148unsafe impl<T: Copy + Send, const N: usize> Send for Queue<T, N> {}
151unsafe impl<T: Copy + Send, const N: usize> Sync for Queue<T, N> {}