跳转至

lib/input/input.c

Functions

Name
CFBD_Bool enqueue_event(CFBDInputEventContext * context_init, CFBDInputEvent * event)
CFBD_Bool sync_poll(CFBDInputEventContext * context_init)
CFBD_Bool input_register_handler(CFBDInputEventContext * context_init, CFBDEventInputHandler handler)
void input_unregister_handler(CFBDInputEventContext * context_init, CFBDEventInputHandler handler)
void CFBD_CreateInputContext(CFBDInputEventContext * context_init)
void CFBD_SetGlobalInputEventContext(CFBDInputEventContext * context)
const CFBDInputEventContext * CFBD_GetGlobalInputEventContext()

Attributes

Name
CFBDInputEventContextOperations ops
CFBDInputEventContext * global_context

Functions Documentation

function enqueue_event

static CFBD_Bool enqueue_event(
    CFBDInputEventContext * context_init,
    CFBDInputEvent * event
)

function sync_poll

static CFBD_Bool sync_poll(
    CFBDInputEventContext * context_init
)

function input_register_handler

CFBD_Bool input_register_handler(
    CFBDInputEventContext * context_init,
    CFBDEventInputHandler handler
)

function input_unregister_handler

void input_unregister_handler(
    CFBDInputEventContext * context_init,
    CFBDEventInputHandler handler
)

function CFBD_CreateInputContext

void CFBD_CreateInputContext(
    CFBDInputEventContext * context_init
)

function CFBD_SetGlobalInputEventContext

void CFBD_SetGlobalInputEventContext(
    CFBDInputEventContext * context
)

function CFBD_GetGlobalInputEventContext

const CFBDInputEventContext * CFBD_GetGlobalInputEventContext()

Attributes Documentation

variable ops

static CFBDInputEventContextOperations ops = {.enqueue_event = enqueue_event,
                                              .sync_poll = sync_poll,
                                              .register_handle = input_register_handler,
                                              .unregister_handler = input_unregister_handler};

variable global_context

static CFBDInputEventContext * global_context = NULL;

Source code

#include "input.h"

#include <stddef.h>

#include "cfbd_define.h"
#include "input_config.h"
#include "input_device_base.h"

static CFBD_Bool enqueue_event(CFBDInputEventContext* context_init, CFBDInputEvent* event)
{
    uint8_t next = (context_init->tail + 1) % INPUT_EVENT_QUEUE_SIZE;
    if (next != context_init->head) {
        context_init->queue[context_init->tail] = *event;
        context_init->tail = next;
        return CFBD_TRUE;
    }

    return CFBD_FALSE;
}

static CFBD_Bool sync_poll(CFBDInputEventContext* context_init)
{
    while (context_init->head != context_init->tail) {
        CFBDInputEvent* event = &context_init->queue[context_init->head];

        for (uint8_t i = 0; i < context_init->handler_count; i++) {
            CFBD_Bool result = context_init->handlers[i](event);
            if (!result && context_init->stop_propergate_if_failed) {
                // stop as event processed failed as when
                // stop_propergate_if_failed == true
                break;
            }

            if (event->stop_propergate) {
                break; // OK, event shutdown, stop propergate
            }
        }

        context_init->head = (context_init->head + 1) % INPUT_EVENT_QUEUE_SIZE;
    }

    return CFBD_TRUE;
}

CFBD_Bool input_register_handler(CFBDInputEventContext* context_init, CFBDEventInputHandler handler)
{
    if (context_init->handler_count >= INPUT_MAX_HANDLER_CNT || handler == NULL) {
        return CFBD_FALSE;
    }

    for (uint8_t i = 0; i < context_init->handler_count; i++) {
        if (context_init->handlers[i] == handler) {
            return CFBD_TRUE;
        }
    }

    context_init->handlers[context_init->handler_count++] = handler;
    return CFBD_TRUE;
}

void input_unregister_handler(CFBDInputEventContext* context_init, CFBDEventInputHandler handler)
{
    for (uint8_t i = 0; i < context_init->handler_count; i++) {
        if (context_init->handlers[i] == handler) {
            for (uint8_t j = i; j < context_init->handler_count - 1; j++) {
                context_init->handlers[j] = context_init->handlers[j + 1];
            }
            context_init->handler_count--;
            break;
        }
    }
}

static CFBDInputEventContextOperations ops = {.enqueue_event = enqueue_event,
                                              .sync_poll = sync_poll,
                                              .register_handle = input_register_handler,
                                              .unregister_handler = input_unregister_handler};

void CFBD_CreateInputContext(CFBDInputEventContext* context_init)
{
    context_init->ops = &ops;
    context_init->handler_count = 0;
    context_init->head = 0;
    context_init->tail = 0;
    context_init->stop_propergate_if_failed = CFBD_FALSE;
}

static CFBDInputEventContext* global_context = NULL;

void CFBD_SetGlobalInputEventContext(CFBDInputEventContext* context)
{
    global_context = context;
}

const CFBDInputEventContext* CFBD_GetGlobalInputEventContext()
{
    return global_context;
}

Updated on 2026-02-03 at 13:21:55 +0000