Files

203 lines
6.7 KiB
Zig

const sys = @import("sys");
const errors = @import("error");
// ---------------------------------------------------------------------------
// Type aliases
// ---------------------------------------------------------------------------
pub const Base = sys.esp_event_base_t;
pub const LoopHandle = sys.esp_event_loop_handle_t;
pub const HandlerT = sys.esp_event_handler_t;
pub const HandlerInstance = sys.esp_event_handler_instance_t;
pub const LoopArgs = sys.esp_event_loop_args_t;
/// Match any event base when registering handlers.
pub const ANY_BASE: Base = sys.ESP_EVENT_ANY_BASE;
/// Match any event ID when registering handlers.
pub const ANY_ID: i32 = sys.ESP_EVENT_ANY_ID;
// ---------------------------------------------------------------------------
// Default event loop
// ---------------------------------------------------------------------------
/// Create the default event loop. Must be called once before posting events
/// or registering handlers on the default loop.
pub fn loopCreateDefault() !void {
try errors.espCheckError(sys.esp_event_loop_create_default());
}
/// Delete the default event loop.
pub fn loopDeleteDefault() !void {
try errors.espCheckError(sys.esp_event_loop_delete_default());
}
// ---------------------------------------------------------------------------
// Custom event loop
// ---------------------------------------------------------------------------
/// Create a custom event loop with the given configuration.
pub fn loopCreate(args: *const LoopArgs) !LoopHandle {
var loop: LoopHandle = null;
try errors.espCheckError(sys.esp_event_loop_create(args, &loop));
return loop;
}
/// Delete a custom event loop.
pub fn loopDelete(loop: LoopHandle) !void {
try errors.espCheckError(sys.esp_event_loop_delete(loop));
}
/// Run a custom event loop for up to `ticks_to_run` ticks.
pub fn loopRun(loop: LoopHandle, ticks_to_run: sys.TickType_t) !void {
try errors.espCheckError(sys.esp_event_loop_run(loop, ticks_to_run));
}
// ---------------------------------------------------------------------------
// Handler registration — default loop
// ---------------------------------------------------------------------------
/// Register an event handler on the default event loop.
///
/// Pass `ANY_BASE` / `ANY_ID` as wildcards.
pub fn handlerRegister(
event_base: Base,
event_id: i32,
handler: HandlerT,
arg: ?*anyopaque,
) !void {
try errors.espCheckError(sys.esp_event_handler_register(event_base, event_id, handler, arg));
}
/// Unregister a previously registered handler from the default loop.
pub fn handlerUnregister(
event_base: Base,
event_id: i32,
handler: HandlerT,
) !void {
try errors.espCheckError(sys.esp_event_handler_unregister(event_base, event_id, handler));
}
/// Register an instance-based handler on the default loop.
/// Returns an `HandlerInstance` token usable with `handlerInstanceUnregister`.
pub fn handlerInstanceRegister(
event_base: Base,
event_id: i32,
handler: HandlerT,
arg: ?*anyopaque,
) !HandlerInstance {
var instance: HandlerInstance = null;
try errors.espCheckError(sys.esp_event_handler_instance_register(event_base, event_id, handler, arg, &instance));
return instance;
}
/// Unregister an instance-based handler from the default loop.
pub fn handlerInstanceUnregister(
event_base: Base,
event_id: i32,
instance: HandlerInstance,
) !void {
try errors.espCheckError(sys.esp_event_handler_instance_unregister(event_base, event_id, instance));
}
// ---------------------------------------------------------------------------
// Handler registration — custom loop
// ---------------------------------------------------------------------------
/// Register a handler on a custom event loop.
pub fn handlerRegisterWith(
loop: LoopHandle,
event_base: Base,
event_id: i32,
handler: HandlerT,
arg: ?*anyopaque,
) !void {
try errors.espCheckError(sys.esp_event_handler_register_with(loop, event_base, event_id, handler, arg));
}
/// Unregister a handler from a custom event loop.
pub fn handlerUnregisterWith(
loop: LoopHandle,
event_base: Base,
event_id: i32,
handler: HandlerT,
) !void {
try errors.espCheckError(sys.esp_event_handler_unregister_with(loop, event_base, event_id, handler));
}
/// Register an instance-based handler on a custom event loop.
pub fn handlerInstanceRegisterWith(
loop: LoopHandle,
event_base: Base,
event_id: i32,
handler: HandlerT,
arg: ?*anyopaque,
) !HandlerInstance {
var instance: HandlerInstance = null;
try errors.espCheckError(sys.esp_event_handler_instance_register_with(loop, event_base, event_id, handler, arg, &instance));
return instance;
}
/// Unregister an instance-based handler from a custom event loop.
pub fn handlerInstanceUnregisterWith(
loop: LoopHandle,
event_base: Base,
event_id: i32,
instance: HandlerInstance,
) !void {
try errors.espCheckError(sys.esp_event_handler_instance_unregister_with(loop, event_base, event_id, instance));
}
// ---------------------------------------------------------------------------
// Event posting
// ---------------------------------------------------------------------------
/// Post an event to the default event loop.
///
/// `event_data` may be null when `event_data_size` is 0.
/// `ticks_to_wait` is how long to block if the queue is full.
pub fn post(
event_base: Base,
event_id: i32,
event_data: ?*const anyopaque,
event_data_size: usize,
ticks_to_wait: sys.TickType_t,
) !void {
try errors.espCheckError(sys.esp_event_post(event_base, event_id, event_data, event_data_size, ticks_to_wait));
}
/// Post an event to a custom event loop.
pub fn postTo(
loop: LoopHandle,
event_base: Base,
event_id: i32,
event_data: ?*const anyopaque,
event_data_size: usize,
ticks_to_wait: sys.TickType_t,
) !void {
try errors.espCheckError(sys.esp_event_post_to(loop, event_base, event_id, event_data, event_data_size, ticks_to_wait));
}
/// Post an event from an ISR to the default event loop.
/// Sets `*task_unblocked` to true if a higher-priority task was unblocked.
pub fn isrPost(
event_base: Base,
event_id: i32,
event_data: ?*const anyopaque,
event_data_size: usize,
task_unblocked: *sys.BaseType_t,
) !void {
try errors.espCheckError(sys.esp_event_isr_post(event_base, event_id, event_data, event_data_size, task_unblocked));
}
/// Post an event from an ISR to a custom event loop.
pub fn isrPostTo(
loop: LoopHandle,
event_base: Base,
event_id: i32,
event_data: ?*const anyopaque,
event_data_size: usize,
task_unblocked: *sys.BaseType_t,
) !void {
try errors.espCheckError(sys.esp_event_isr_post_to(loop, event_base, event_id, event_data, event_data_size, task_unblocked));
}