Skip to content

Commit 9cbd942

Browse files
committed
Merge remote-tracking branch 'origin/dev' into release-candidate
2 parents 9e845cd + 34a3222 commit 9cbd942

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

applications/main/gpio/usb_uart_bridge.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ struct UsbUartBridge {
6060

6161
FuriApiLock cfg_lock;
6262

63+
CliVcp* cli_vcp;
64+
6365
uint8_t rx_buf[USB_CDC_PKT_LEN];
6466
};
6567

@@ -105,15 +107,11 @@ static void usb_uart_on_irq_rx_dma_cb(
105107
static void usb_uart_vcp_init(UsbUartBridge* usb_uart, uint8_t vcp_ch) {
106108
furi_hal_usb_unlock();
107109
if(vcp_ch == 0) {
108-
CliVcp* cli_vcp = furi_record_open(RECORD_CLI_VCP);
109-
cli_vcp_disable(cli_vcp);
110-
furi_record_close(RECORD_CLI_VCP);
110+
cli_vcp_disable(usb_uart->cli_vcp);
111111
furi_check(furi_hal_usb_set_config(&usb_cdc_single, NULL) == true);
112112
} else {
113113
furi_check(furi_hal_usb_set_config(&usb_cdc_dual, NULL) == true);
114-
CliVcp* cli_vcp = furi_record_open(RECORD_CLI_VCP);
115-
cli_vcp_enable(cli_vcp);
116-
furi_record_close(RECORD_CLI_VCP);
114+
cli_vcp_enable(usb_uart->cli_vcp);
117115
}
118116
furi_hal_cdc_set_callbacks(vcp_ch, (CdcCallbacks*)&cdc_cb, usb_uart);
119117
}
@@ -122,9 +120,7 @@ static void usb_uart_vcp_deinit(UsbUartBridge* usb_uart, uint8_t vcp_ch) {
122120
UNUSED(usb_uart);
123121
furi_hal_cdc_set_callbacks(vcp_ch, NULL, NULL);
124122
if(vcp_ch != 0) {
125-
CliVcp* cli_vcp = furi_record_open(RECORD_CLI_VCP);
126-
cli_vcp_disable(cli_vcp);
127-
furi_record_close(RECORD_CLI_VCP);
123+
cli_vcp_disable(usb_uart->cli_vcp);
128124
}
129125
}
130126

@@ -176,6 +172,8 @@ static int32_t usb_uart_worker(void* context) {
176172

177173
memcpy(&usb_uart->cfg, &usb_uart->cfg_new, sizeof(UsbUartConfig));
178174

175+
usb_uart->cli_vcp = furi_record_open(RECORD_CLI_VCP);
176+
179177
usb_uart->rx_stream = furi_stream_buffer_alloc(USB_UART_RX_BUF_SIZE, 1);
180178

181179
usb_uart->tx_sem = furi_semaphore_alloc(1, 1);
@@ -308,8 +306,8 @@ static int32_t usb_uart_worker(void* context) {
308306

309307
furi_hal_usb_unlock();
310308
furi_check(furi_hal_usb_set_config(&usb_cdc_single, NULL) == true);
311-
CliVcp* cli_vcp = furi_record_open(RECORD_CLI_VCP);
312-
cli_vcp_enable(cli_vcp);
309+
cli_vcp_enable(usb_uart->cli_vcp);
310+
313311
furi_record_close(RECORD_CLI_VCP);
314312

315313
return 0;

applications/services/cli/cli_vcp.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <stdint.h>
66
#include <toolbox/pipe.h>
77
#include <toolbox/cli/shell/cli_shell.h>
8+
#include <toolbox/api_lock.h>
89
#include "cli_main_shell.h"
910
#include "cli_main_commands.h"
1011

@@ -26,6 +27,7 @@ typedef struct {
2627
CliVcpMessageTypeEnable,
2728
CliVcpMessageTypeDisable,
2829
} type;
30+
FuriApiLock api_lock;
2931
union {};
3032
} CliVcpMessage;
3133

@@ -182,6 +184,8 @@ static void cli_vcp_message_received(FuriEventLoopObject* object, void* context)
182184
furi_hal_usb_set_config(cli_vcp->previous_interface, NULL);
183185
break;
184186
}
187+
188+
api_lock_unlock(message.api_lock);
185189
}
186190

187191
/**
@@ -300,16 +304,24 @@ int32_t cli_vcp_srv(void* p) {
300304
// Public API
301305
// ==========
302306

307+
static void cli_vcp_synchronous_request(CliVcp* cli_vcp, CliVcpMessage* message) {
308+
message->api_lock = api_lock_alloc_locked();
309+
furi_message_queue_put(cli_vcp->message_queue, message, FuriWaitForever);
310+
api_lock_wait_unlock_and_free(message->api_lock);
311+
}
312+
303313
void cli_vcp_enable(CliVcp* cli_vcp) {
314+
furi_check(cli_vcp);
304315
CliVcpMessage message = {
305316
.type = CliVcpMessageTypeEnable,
306317
};
307-
furi_message_queue_put(cli_vcp->message_queue, &message, FuriWaitForever);
318+
cli_vcp_synchronous_request(cli_vcp, &message);
308319
}
309320

310321
void cli_vcp_disable(CliVcp* cli_vcp) {
322+
furi_check(cli_vcp);
311323
CliVcpMessage message = {
312324
.type = CliVcpMessageTypeDisable,
313325
};
314-
furi_message_queue_put(cli_vcp->message_queue, &message, FuriWaitForever);
326+
cli_vcp_synchronous_request(cli_vcp, &message);
315327
}

0 commit comments

Comments
 (0)