Add signals

Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
Pol Henarejos
2026-05-31 18:54:22 +02:00
parent 1a289db1cd
commit d711f33721
2 changed files with 72 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -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