freertos_next/
event_group.rs

1use crate::base::*;
2use crate::shim::*;
3use crate::units::*;
4
5/// An event group
6pub struct EventGroup {
7    event_group: FreeRtosEventGroupHandle,
8}
9
10unsafe impl Send for EventGroup {}
11unsafe impl Sync for EventGroup {}
12
13impl EventGroup {
14    /// Create a new event group
15    pub fn new() -> Result<EventGroup, FreeRtosError> {
16        unsafe {
17            let s = freertos_rs_event_group_create();
18            if s == 0 as *const _ {
19                return Err(FreeRtosError::OutOfMemory);
20            }
21            Ok(EventGroup { event_group: s })
22        }
23    }
24
25    /// # Safety
26    ///
27    /// `handle` must be a valid FreeRTOS event group handle.
28    #[inline]
29    pub unsafe fn from_raw_handle(handle: FreeRtosEventGroupHandle) -> Self {
30        Self {
31            event_group: handle,
32        }
33    }
34    #[inline]
35    pub fn raw_handle(&self) -> FreeRtosEventGroupHandle {
36        self.event_group
37    }
38
39    pub fn set_bits(&self, bits_to_set: FreeRtosEventBitsType) -> FreeRtosEventBitsType {
40        unsafe { freertos_rs_event_group_set_bits(self.event_group, bits_to_set) }
41    }
42
43    pub fn get_bits(&self) -> FreeRtosEventBitsType {
44        unsafe { freertos_rs_event_group_get_bits(self.event_group) }
45    }
46
47    pub fn clear_bits(&self, bits_to_clear: FreeRtosEventBitsType) -> FreeRtosEventBitsType {
48        unsafe { freertos_rs_event_group_clear_bits(self.event_group, bits_to_clear) }
49    }
50
51    pub fn wait_bits<D: DurationTicks>(
52        &self,
53        bits_to_wait_for: FreeRtosEventBitsType,
54        clear_on_exit: FreeRtosBaseType,
55        wait_for_all_bits: FreeRtosBaseType,
56        duration: D,
57    ) -> FreeRtosEventBitsType {
58        unsafe {
59            freertos_rs_event_group_wait_bits(
60                self.event_group,
61                bits_to_wait_for,
62                clear_on_exit,
63                wait_for_all_bits,
64                duration.to_ticks(),
65            )
66        }
67    }
68
69    pub fn sync<D: DurationTicks>(
70        &self,
71        bits_to_set: FreeRtosEventBitsType,
72        bits_to_wait_for: FreeRtosEventBitsType,
73        duration: D,
74    ) -> FreeRtosEventBitsType {
75        unsafe {
76            freertos_rs_event_group_sync(
77                self.event_group,
78                bits_to_set,
79                bits_to_wait_for,
80                duration.to_ticks(),
81            )
82        }
83    }
84}
85
86impl Drop for EventGroup {
87    fn drop(&mut self) {
88        unsafe {
89            freertos_rs_event_group_delete(self.event_group);
90        }
91    }
92}