From d711f33721255e02222899748b126ae100bd0ef8 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Sun, 31 May 2026 18:54:22 +0200 Subject: [PATCH] Add signals Signed-off-by: Pol Henarejos --- src/main.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/picokeys.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/src/main.c b/src/main.c index fe7b339..477f662 100644 --- a/src/main.c +++ b/src/main.c @@ -50,6 +50,9 @@ app_t *current_app = NULL; const uint8_t *ccid_atr = NULL; +signal_t signals[MAX_SIGNALS] = {0}; +uint8_t num_signals = 0; + bool app_exists(const uint8_t *aid, size_t aid_len) { for (int a = 0; a < num_apps; a++) { if (aid_len >= apps[a].aid[0] && !memcmp(apps[a].aid + 1, aid, apps[a].aid[0])) { @@ -215,3 +218,43 @@ int main(void) { return 0; } + +int signal_add(signal_code_t code, signal_flag_t flags, signal_handler_t handler) { + if (num_signals >= MAX_SIGNALS) { + return -1; + } + signals[num_signals].code = code; + signals[num_signals].flags = flags; + signals[num_signals].handler = handler; + num_signals++; + return 0; +} + +int signal_remove(signal_code_t code, signal_handler_t handler) { + for (int i = 0; i < num_signals; i++) { + if (signals[i].code == code && signals[i].handler == handler) { + for (int j = i; j < num_signals - 1; j++) { + signals[j] = signals[j + 1]; + } + num_signals--; + return 0; + } + } + return -1; +} + +int signal_emit_param(signal_code_t code, void *data) { + for (int i = 0; i < num_signals; i++) { + if (signals[i].code == code) { + int ret = signals[i].handler(code, data); + if (ret != 0 && (signals[i].flags & SIGNAL_FLAG_ERROR_CONTINUE) == 0) { + return ret; + } + } + } + return 0; +} + +int signal_emit(signal_code_t code) { + return signal_emit_param(code, NULL); +} diff --git a/src/picokeys.h b/src/picokeys.h index e160c61..782ae1e 100644 --- a/src/picokeys.h +++ b/src/picokeys.h @@ -172,4 +172,33 @@ extern bool is_req_button_pending(void); extern int set_atr(void); + +#define MAX_SIGNALS 32 +typedef enum { + SIGNAL_NONE = 0, + SIGNAL_BOOT = 1, + SIGNAL_USB_MOUNTED = 2, + SIGNAL_BUTTON_PRESS = 3, + SIGNAL_BUTTON_RELEASE = 4, + SIGNAL_USER_PRESENCE_REQUEST = 5, +} signal_code_t; + +typedef enum { + SIGNAL_FLAG_NONE = 0x0, + SIGNAL_FLAG_ERROR_CONTINUE = 0x1, +} signal_flag_t; + +typedef int (*signal_handler_t)(signal_code_t, void *); + +typedef struct { + signal_code_t code; + signal_flag_t flags; + signal_handler_t handler; +} signal_t; + +extern int signal_add(signal_code_t code, signal_flag_t flags, signal_handler_t handler); +extern int signal_remove(signal_code_t code, signal_handler_t handler); +extern int signal_emit_param(signal_code_t code, void *data); +extern int signal_emit(signal_code_t code); + #endif