mirror of
https://github.com/polhenarejos/pico-keys-sdk
synced 2026-06-03 03:43:00 +02:00
43
src/main.c
43
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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user