58 lines
1.5 KiB
C
58 lines
1.5 KiB
C
#ifndef __GE_INPUT_H__
|
|
#define __GE_INPUT_H__
|
|
|
|
#include <stdint.h>
|
|
|
|
struct ge_input;
|
|
typedef struct ge_input ge_input_t;
|
|
typedef union ge_input_event {
|
|
void* ctx;
|
|
uintptr_t num;
|
|
} ge_input_event_t;
|
|
|
|
typedef int(*ge_input_send_func_t)(ge_input_t* ctx, ge_input_event_t event);
|
|
typedef int(*ge_input_peek_func_t)(ge_input_t* ctx, ge_input_event_t* event);
|
|
typedef int(*ge_input_recv_func_t)(ge_input_t* ctx, ge_input_event_t* event);
|
|
|
|
struct ge_input {
|
|
void* context;
|
|
ge_input_send_func_t func_send;
|
|
ge_input_peek_func_t func_peek;
|
|
ge_input_recv_func_t func_recv;
|
|
};
|
|
|
|
#ifdef __GE_INPUT_EASY_IMPLIMENT_H__
|
|
|
|
DECLARE_GE_KFIFO(ge_input_fifo, ge_input_event_t, 16, ge_input_fifo_t);
|
|
|
|
static int ge_input_send (ge_input_t* ctx, ge_input_event_t event) {
|
|
struct ge_input_fifo_t* fifo = (struct ge_input_fifo_t*)ctx->context;
|
|
if (ge_kfifo_is_full(fifo)) {
|
|
return -1;
|
|
}
|
|
ge_kfifo_put(fifo, event);
|
|
return 0;
|
|
}
|
|
|
|
static int ge_input_peek (ge_input_t* ctx, ge_input_event_t* event) {
|
|
struct ge_input_fifo_t* fifo = (struct ge_input_fifo_t*)ctx->context;
|
|
if (ge_kfifo_is_empty(fifo)) {
|
|
return -1;
|
|
}
|
|
ge_kfifo_peek(fifo, event);
|
|
return 0;
|
|
}
|
|
|
|
static int ge_input_recv (ge_input_t* ctx, ge_input_event_t* event) {
|
|
struct ge_input_fifo_t* fifo = (struct ge_input_fifo_t*)ctx->context;
|
|
if (ge_kfifo_is_empty(fifo)) {
|
|
return -1;
|
|
}
|
|
ge_kfifo_get(fifo, event);
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif // __GE_INPUT_H__
|