use crate::kernel::event_groups::{
xEventGroupClearBits, xEventGroupCreateStatic, xEventGroupGetBits, xEventGroupSetBits,
xEventGroupSync, xEventGroupWaitBits, EventBits_t, StaticEventGroup_t,
};
#[cfg(any(feature = "alloc", feature = "heap-4", feature = "heap-5"))]
use crate::kernel::event_groups::xEventGroupCreate;
use crate::types::*;
pub struct EventGroup {
handle: EventGroupHandle_t,
}
unsafe impl Sync for EventGroup {}
unsafe impl Send for EventGroup {}
impl EventGroup {
#[cfg(any(feature = "alloc", feature = "heap-4", feature = "heap-5"))]
pub fn new() -> Option<Self> {
let handle = xEventGroupCreate();
if handle.is_null() {
None
} else {
Some(Self { handle })
}
}
pub fn new_static(event_group_buffer: &'static mut StaticEventGroup_t) -> Option<Self> {
let handle = xEventGroupCreateStatic(event_group_buffer as *mut StaticEventGroup_t);
if handle.is_null() {
None
} else {
Some(Self { handle })
}
}
pub fn set(&self, bits: EventBits_t) -> EventBits_t {
xEventGroupSetBits(self.handle, bits)
}
pub fn clear(&self, bits: EventBits_t) -> EventBits_t {
xEventGroupClearBits(self.handle, bits)
}
pub fn get(&self) -> EventBits_t {
xEventGroupGetBits(self.handle)
}
pub fn wait_any(&self, bits: EventBits_t) -> EventBits_t {
xEventGroupWaitBits(self.handle, bits, pdFALSE, pdFALSE, portMAX_DELAY)
}
pub fn wait_any_timeout(&self, bits: EventBits_t, ticks: TickType_t) -> Option<EventBits_t> {
let result = xEventGroupWaitBits(self.handle, bits, pdFALSE, pdFALSE, ticks);
if (result & bits) != 0 {
Some(result)
} else {
None
}
}
pub fn try_wait_any(&self, bits: EventBits_t) -> Option<EventBits_t> {
self.wait_any_timeout(bits, 0)
}
pub fn wait_any_clear(&self, bits: EventBits_t) -> EventBits_t {
xEventGroupWaitBits(self.handle, bits, pdTRUE, pdFALSE, portMAX_DELAY)
}
pub fn wait_any_clear_timeout(
&self,
bits: EventBits_t,
ticks: TickType_t,
) -> Option<EventBits_t> {
let result = xEventGroupWaitBits(self.handle, bits, pdTRUE, pdFALSE, ticks);
if (result & bits) != 0 {
Some(result)
} else {
None
}
}
pub fn wait_all(&self, bits: EventBits_t) -> EventBits_t {
xEventGroupWaitBits(self.handle, bits, pdFALSE, pdTRUE, portMAX_DELAY)
}
pub fn wait_all_timeout(&self, bits: EventBits_t, ticks: TickType_t) -> Option<EventBits_t> {
let result = xEventGroupWaitBits(self.handle, bits, pdFALSE, pdTRUE, ticks);
if (result & bits) == bits {
Some(result)
} else {
None
}
}
pub fn try_wait_all(&self, bits: EventBits_t) -> Option<EventBits_t> {
self.wait_all_timeout(bits, 0)
}
pub fn wait_all_clear(&self, bits: EventBits_t) -> EventBits_t {
xEventGroupWaitBits(self.handle, bits, pdTRUE, pdTRUE, portMAX_DELAY)
}
pub fn wait_all_clear_timeout(
&self,
bits: EventBits_t,
ticks: TickType_t,
) -> Option<EventBits_t> {
let result = xEventGroupWaitBits(self.handle, bits, pdTRUE, pdTRUE, ticks);
if (result & bits) == bits {
Some(result)
} else {
None
}
}
pub fn sync(&self, bits_to_set: EventBits_t, bits_to_wait: EventBits_t) -> EventBits_t {
xEventGroupSync(self.handle, bits_to_set, bits_to_wait, portMAX_DELAY)
}
pub fn sync_timeout(
&self,
bits_to_set: EventBits_t,
bits_to_wait: EventBits_t,
ticks: TickType_t,
) -> Option<EventBits_t> {
let result = xEventGroupSync(self.handle, bits_to_set, bits_to_wait, ticks);
if (result & bits_to_wait) == bits_to_wait {
Some(result)
} else {
None
}
}
pub unsafe fn raw_handle(&self) -> EventGroupHandle_t {
self.handle
}
}