EventGroup

Struct EventGroup 

Source
pub struct EventGroup(/* private fields */);
Expand description

A set of event flags for thread synchronization.

Event groups contain multiple event bits (typically 24 bits) that can be manipulated independently. Threads can wait for specific combinations of bits to be set, making them ideal for complex synchronization scenarios.

§Examples

§Basic event signaling

use osal_rs::os::{EventGroup, EventGroupFn};
use core::time::Duration;
 
const EVENT_A: u32 = 0b0001;
const EVENT_B: u32 = 0b0010;
const EVENT_C: u32 = 0b0100;
 
let events = EventGroup::new().unwrap();
 
// Set event A
events.set(EVENT_A);
 
// Check if event A is set
let current = events.get();
if current & EVENT_A != 0 {
    println!("Event A is set");
}
 
// Clear event A
events.clear(EVENT_A);

§Waiting for multiple events

use osal_rs::os::{EventGroup, EventGroupFn, Thread};
use alloc::sync::Arc;
use core::time::Duration;
 
const READY: u32 = 0b0001;
const DATA_AVAILABLE: u32 = 0b0010;
const STOP: u32 = 0b0100;
 
let events = Arc::new(EventGroup::new().unwrap());
let events_clone = events.clone();
 
// Worker thread waits for events
let worker = Thread::new("worker", 2048, 5, move || {
    loop {
        // Wait for either READY or STOP
        let bits = events_clone.wait_with_to_tick(
            READY | STOP,
            Duration::from_secs(1)
        );
         
        if bits & STOP != 0 {
            println!("Stopping...");
            break;
        }
         
        if bits & READY != 0 {
            println!("Ready to work!");
        }
    }
}).unwrap();
 
worker.start().unwrap();
 
// Signal events
events.set(READY);
Duration::from_secs(2).sleep();
events.set(STOP);

§State machine synchronization

use osal_rs::os::{EventGroup, EventGroupFn};
use core::time::Duration;
 
const INIT_COMPLETE: u32 = 1 << 0;
const CONFIG_LOADED: u32 = 1 << 1;
const NETWORK_UP: u32 = 1 << 2;
const READY_TO_RUN: u32 = INIT_COMPLETE | CONFIG_LOADED | NETWORK_UP;
 
let state = EventGroup::new().unwrap();
 
// Different subsystems set their bits
state.set(INIT_COMPLETE);
state.set(CONFIG_LOADED);
state.set(NETWORK_UP);
 
// Wait for all systems to be ready
let current = state.wait_with_to_tick(READY_TO_RUN, Duration::from_secs(5));
 
if (current & READY_TO_RUN) == READY_TO_RUN {
    println!("All systems ready!");
}

§ISR to thread signaling

use osal_rs::os::{EventGroup, EventGroupFn, Thread};
use alloc::sync::Arc;
 
const IRQ_EVENT: u32 = 1 << 0;
 
let events = Arc::new(EventGroup::new().unwrap());
let events_isr = events.clone();
 
// In interrupt handler:
// events_isr.set_from_isr(IRQ_EVENT).ok();
 
// Handler thread
let handler = Thread::new("handler", 2048, 5, move || {
    loop {
        let bits = events.wait(IRQ_EVENT, 1000);
        if bits & IRQ_EVENT != 0 {
            println!("Handling interrupt event");
            events.clear(IRQ_EVENT);
        }
    }
}).unwrap();

Implementations§

Source§

impl EventGroup

Source

pub fn wait_with_to_tick( &self, mask: EventBits, timeout_ticks: impl ToTick, ) -> EventBits

Trait Implementations§

Source§

impl Debug for EventGroup

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Deref for EventGroup

Source§

type Target = *const c_void

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl Display for EventGroup

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for EventGroup

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl EventGroup for EventGroup

Source§

fn new() -> Result<Self>

Creates a new event group. Read more
Source§

fn set(&self, bits: EventBits) -> EventBits

Sets the specified event bits. Read more
Source§

fn set_from_isr(&self, bits: EventBits) -> Result<()>

Sets event bits from an interrupt service routine. Read more
Source§

fn get(&self) -> EventBits

Gets the current value of the event bits. Read more
Source§

fn get_from_isr(&self) -> EventBits

Gets event bits from an interrupt service routine. Read more
Source§

fn clear(&self, bits: EventBits) -> EventBits

Clears the specified event bits. Read more
Source§

fn clear_from_isr(&self, bits: EventBits) -> Result<()>

Clears event bits from an interrupt service routine. Read more
Source§

fn wait(&self, mask: EventBits, timeout_ticks: TickType) -> EventBits

Waits for specific event bits to be set. Read more
Source§

fn delete(&mut self)

Deletes the event group and frees its resources. Read more
Source§

impl Send for EventGroup

Source§

impl Sync for EventGroup

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.