freertos_rust/
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 { event_group: handle }
31    }
32    #[inline]
33    pub fn raw_handle(&self) -> FreeRtosEventGroupHandle {
34        self.event_group
35    }
36
37    pub fn set_bits(&self, bits_to_set: FreeRtosEventBitsType) -> FreeRtosEventBitsType {
38        unsafe { freertos_rs_event_group_set_bits(self.event_group, bits_to_set) }
39    }
40
41    pub fn get_bits(&self) -> FreeRtosEventBitsType {
42        unsafe { freertos_rs_event_group_get_bits(self.event_group) }
43    }
44
45    pub fn clear_bits(&self, bits_to_clear: FreeRtosEventBitsType) -> FreeRtosEventBitsType {
46        unsafe { freertos_rs_event_group_clear_bits(self.event_group, bits_to_clear) }
47    }
48
49    pub fn wait_bits<D: DurationTicks>(&self, bits_to_wait_for: FreeRtosEventBitsType, clear_on_exit: FreeRtosBaseType, wait_for_all_bits: FreeRtosBaseType, duration: D) -> FreeRtosEventBitsType {
50        unsafe { freertos_rs_event_group_wait_bits(self.event_group, bits_to_wait_for, clear_on_exit, wait_for_all_bits, duration.to_ticks()) }
51    }
52
53    pub fn sync<D: DurationTicks>(&self, bits_to_set: FreeRtosEventBitsType, bits_to_wait_for: FreeRtosEventBitsType, duration: D) -> FreeRtosEventBitsType {
54        unsafe { freertos_rs_event_group_sync(self.event_group, bits_to_set, bits_to_wait_for, duration.to_ticks()) }
55    }
56}
57
58impl Drop for EventGroup {
59    fn drop(&mut self) {
60        unsafe {
61            freertos_rs_event_group_delete(self.event_group);
62        }
63    }
64}