cli_vcp: make enable/disable requests synchronous

This commit is contained in:
Anna Antonenko
2025-04-15 03:45:16 +04:00
parent 1eb57ba462
commit 63cfa2d684

View File

@@ -5,6 +5,7 @@
#include <stdint.h> #include <stdint.h>
#include <toolbox/pipe.h> #include <toolbox/pipe.h>
#include <toolbox/cli/shell/cli_shell.h> #include <toolbox/cli/shell/cli_shell.h>
#include <toolbox/api_lock.h>
#include "cli_main_shell.h" #include "cli_main_shell.h"
#include "cli_main_commands.h" #include "cli_main_commands.h"
@@ -26,6 +27,7 @@ typedef struct {
CliVcpMessageTypeEnable, CliVcpMessageTypeEnable,
CliVcpMessageTypeDisable, CliVcpMessageTypeDisable,
} type; } type;
FuriApiLock api_lock;
union {}; union {};
} CliVcpMessage; } CliVcpMessage;
@@ -182,6 +184,8 @@ static void cli_vcp_message_received(FuriEventLoopObject* object, void* context)
furi_hal_usb_set_config(cli_vcp->previous_interface, NULL); furi_hal_usb_set_config(cli_vcp->previous_interface, NULL);
break; break;
} }
api_lock_unlock(message.api_lock);
} }
/** /**
@@ -300,16 +304,24 @@ int32_t cli_vcp_srv(void* p) {
// Public API // Public API
// ========== // ==========
static void cli_vcp_synchronous_request(CliVcp* cli_vcp, CliVcpMessage* message) {
message->api_lock = api_lock_alloc_locked();
furi_message_queue_put(cli_vcp->message_queue, message, FuriWaitForever);
api_lock_wait_unlock_and_free(message->api_lock);
}
void cli_vcp_enable(CliVcp* cli_vcp) { void cli_vcp_enable(CliVcp* cli_vcp) {
furi_check(cli_vcp);
CliVcpMessage message = { CliVcpMessage message = {
.type = CliVcpMessageTypeEnable, .type = CliVcpMessageTypeEnable,
}; };
furi_message_queue_put(cli_vcp->message_queue, &message, FuriWaitForever); cli_vcp_synchronous_request(cli_vcp, &message);
} }
void cli_vcp_disable(CliVcp* cli_vcp) { void cli_vcp_disable(CliVcp* cli_vcp) {
furi_check(cli_vcp);
CliVcpMessage message = { CliVcpMessage message = {
.type = CliVcpMessageTypeDisable, .type = CliVcpMessageTypeDisable,
}; };
furi_message_queue_put(cli_vcp->message_queue, &message, FuriWaitForever); cli_vcp_synchronous_request(cli_vcp, &message);
} }