diff --git a/picokeys_sdk_import.cmake b/picokeys_sdk_import.cmake
index 38e7da0..3c87e21 100644
--- a/picokeys_sdk_import.cmake
+++ b/picokeys_sdk_import.cmake
@@ -330,6 +330,7 @@ list(APPEND PICOKEYS_SOURCES
${CMAKE_CURRENT_LIST_DIR}/src/pico_time.c
${CMAKE_CURRENT_LIST_DIR}/src/button.c
${CMAKE_CURRENT_LIST_DIR}/src/led/led.c
+ ${CMAKE_CURRENT_LIST_DIR}/src/signal.c
)
if(ESP_PLATFORM)
diff --git a/src/button.c b/src/button.c
index 5ed0199..96ff136 100644
--- a/src/button.c
+++ b/src/button.c
@@ -27,6 +27,7 @@
#include "driver/gpio.h"
#endif
#include "usb.h"
+#include "signal.h"
extern void execute_tasks(void);
@@ -104,6 +105,10 @@ bool button_wait(void) {
if (button_timeout == 0) {
return false;
}
+ signal_user_presence_request_data_t data = {
+ .timeout = button_timeout / 1000,
+ };
+ signal_emit_param(SIGNAL_USER_PRESENCE_REQUEST, &data);
uint32_t start_button = board_millis();
bool timeout = false;
cancel_button = false;
@@ -130,6 +135,15 @@ bool button_wait(void) {
}
led_set_mode(led_mode);
req_button_pending = false;
+ if (timeout) {
+ signal_emit(SIGNAL_USER_PRESENCE_TIMEOUT);
+ }
+ else if (cancel_button) {
+ signal_emit(SIGNAL_USER_PRESENCE_CANCELLED);
+ }
+ else {
+ signal_emit(SIGNAL_USER_PRESENCE_COMPLETED);
+ }
return timeout || cancel_button;
}
#endif
diff --git a/src/main.c b/src/main.c
index 477f662..d94e869 100644
--- a/src/main.c
+++ b/src/main.c
@@ -50,9 +50,6 @@ 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])) {
@@ -118,6 +115,9 @@ void execute_tasks(void) {
#endif
usb_task();
led_blinking_task();
+#ifdef ENABLE_LVGL_UI
+ platform_ui_task();
+#endif
}
static void core0_loop(void *arg) {
@@ -218,43 +218,3 @@ 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 782ae1e..e160c61 100644
--- a/src/picokeys.h
+++ b/src/picokeys.h
@@ -172,33 +172,4 @@ 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
diff --git a/src/signal.c b/src/signal.c
new file mode 100644
index 0000000..ccf0a25
--- /dev/null
+++ b/src/signal.c
@@ -0,0 +1,65 @@
+/*
+ * This file is part of the Pico Keys SDK distribution (https://github.com/polhenarejos/pico-keys-sdk).
+ * Copyright (c) 2022 Pol Henarejos.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+#include "picokeys.h"
+#include "signal.h"
+
+static signal_t signals[MAX_SIGNALS] = {0};
+static uint8_t num_signals = 0;
+
+int signal_add(signal_code_t code, signal_flag_t flags, signal_handler_t handler) {
+ if (num_signals >= MAX_SIGNALS) {
+ return PICOKEYS_ERR_NO_MEMORY;
+ }
+ if (handler == NULL) {
+ return PICOKEYS_ERR_NULL_PARAM;
+ }
+ signals[num_signals].code = code;
+ signals[num_signals].flags = flags;
+ signals[num_signals].handler = handler;
+ num_signals++;
+ return PICOKEYS_OK;
+}
+
+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 PICOKEYS_OK;
+ }
+ }
+ return PICOKEYS_ERR_FILE_NOT_FOUND;
+}
+
+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 PICOKEYS_ERR_FILE_NOT_FOUND;
+}
+
+int signal_emit(signal_code_t code) {
+ return signal_emit_param(code, NULL);
+}
diff --git a/src/signal.h b/src/signal.h
new file mode 100644
index 0000000..c52b017
--- /dev/null
+++ b/src/signal.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the Pico Keys SDK distribution (https://github.com/polhenarejos/pico-keys-sdk).
+ * Copyright (c) 2022 Pol Henarejos.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef _SIGNAL_H_
+#define _SIGNAL_H_
+
+#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_USER_PRESENCE_COMPLETED = 6,
+ SIGNAL_USER_PRESENCE_CANCELLED = 7,
+ SIGNAL_USER_PRESENCE_TIMEOUT = 8,
+} 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 {
+ uint32_t timeout;
+} signal_user_presence_request_data_t;
+
+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 // _SIGNAL_H_