mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2025-10-02 18:00:15 +02:00
OFW PR. 4251 CLI: Fix long delay with quick connect/disconnect
by WillyJL
This commit is contained in:
@@ -218,6 +218,11 @@ static void cli_vcp_internal_event_happened(FuriEventLoopObject* object, void* c
|
||||
pipe_detach_from_event_loop(cli_vcp->own_pipe);
|
||||
pipe_free(cli_vcp->own_pipe);
|
||||
cli_vcp->own_pipe = NULL;
|
||||
|
||||
// wait for shell to stop
|
||||
cli_shell_join(cli_vcp->shell);
|
||||
cli_shell_free(cli_vcp->shell);
|
||||
pipe_free(cli_vcp->shell_pipe);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -226,14 +231,6 @@ static void cli_vcp_internal_event_happened(FuriEventLoopObject* object, void* c
|
||||
FURI_LOG_D(TAG, "Connected");
|
||||
cli_vcp->is_connected = true;
|
||||
|
||||
// wait for previous shell to stop
|
||||
furi_check(!cli_vcp->own_pipe);
|
||||
if(cli_vcp->shell) {
|
||||
cli_shell_join(cli_vcp->shell);
|
||||
cli_shell_free(cli_vcp->shell);
|
||||
pipe_free(cli_vcp->shell_pipe);
|
||||
}
|
||||
|
||||
// start shell thread
|
||||
PipeSideBundle bundle = pipe_alloc(VCP_BUF_SIZE, 1);
|
||||
cli_vcp->own_pipe = bundle.alices_side;
|
||||
|
@@ -16,7 +16,8 @@
|
||||
|
||||
#define TAG "CliShell"
|
||||
|
||||
#define ANSI_TIMEOUT_MS 10
|
||||
#define ANSI_TIMEOUT_MS 10
|
||||
#define TRANSIENT_SESSION_WINDOW_MS 100
|
||||
|
||||
typedef enum {
|
||||
CliShellComponentCompletions,
|
||||
@@ -415,10 +416,15 @@ static void cli_shell_deinit(CliShell* shell) {
|
||||
static int32_t cli_shell_thread(void* context) {
|
||||
CliShell* shell = context;
|
||||
|
||||
// Sometimes, the other side closes the pipe even before our thread is started. Although the
|
||||
// rest of the code will eventually find this out if this check is removed, there's no point in
|
||||
// wasting time.
|
||||
if(pipe_state(shell->pipe) == PipeStateBroken) return 0;
|
||||
// Sometimes, the other side (e.g. qFlipper) closes the pipe even before our thread is started.
|
||||
// Although the rest of the code will eventually find this out if this check is removed,
|
||||
// there's no point in wasting time. This gives qFlipper a chance to quickly close and re-open
|
||||
// the session.
|
||||
const size_t delay_step = 10;
|
||||
for(size_t i = 0; i < TRANSIENT_SESSION_WINDOW_MS / delay_step; i++) {
|
||||
furi_delay_ms(delay_step);
|
||||
if(pipe_state(shell->pipe) == PipeStateBroken) return 0;
|
||||
}
|
||||
|
||||
cli_shell_init(shell);
|
||||
FURI_LOG_D(TAG, "Started");
|
||||
|
Reference in New Issue
Block a user