From a5339ade29c15e29fefd22f3217112e3f80a8b50 Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 12 Mar 2026 13:18:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SerialPort_USB.c | 30 +++++++++++++++++++++++++++++- SerialPort_USB.h | 5 ++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/SerialPort_USB.c b/SerialPort_USB.c index b6da300..2fd4595 100644 --- a/SerialPort_USB.c +++ b/SerialPort_USB.c @@ -205,6 +205,12 @@ static uint16_t vSerialPortUsbReceive(tSerialPortUsbArtery *env, uint8_t *data, return vSerialPortReceiveQueue(env, data, size, timeout, env->rxDataQueue); } +static uint16_t vSerialPortUsbSnifferReceive(tSerialPortUsbArtery *env, uint8_t *data, uint16_t size, uint32_t timeout) { + return env->rxDataSnifferQueue + ? vSerialPortReceiveQueue(env, data, size, timeout, env->rxDataSnifferQueue) + : 0; +} + static _Noreturn void UsbDriver_Thread(tSerialPortUsbArtery *env) { for (;;) { uint16_t data_len = usb_vcp_get_rxdata(&otg_core_struct.dev, env->usb_buffer); @@ -212,6 +218,11 @@ static _Noreturn void UsbDriver_Thread(tSerialPortUsbArtery *env) { if (data_len > 0) { for (uint16_t i = 0; i < data_len; ++i) { osMessageQueuePut(env->rxDataQueue, &env->usb_buffer[i], 0x0, 0U); + + if (env->rxDataSnifferQueue) { + osMessageQueuePut(env->rxDataSnifferQueue, &env->usb_buffer[i], 0x0, 0U); + } + } } @@ -229,10 +240,18 @@ void UsbDriver_StartThread(tSerialPortUsbArtery *env) { void SerialPortUsb_Init( tSerialPortUsbArtery *env, - uint32_t rxBufferLength + uint32_t rxBufferLength, + uint32_t rxSnifferLength ) { env->rxDataQueue = osMessageQueueNew(rxBufferLength, 1, NULL); + + if (rxSnifferLength) { + env->rxDataSnifferQueue = osMessageQueueNew(rxBufferLength, 1, NULL); + } else { + env->rxDataSnifferQueue = 0; + } + // usb gpio config usb_gpio_config(); @@ -271,4 +290,13 @@ tSerialPortIO SerialPortUsb_GetIo(tSerialPortUsbArtery *env) { .transmit = (SerialPortIOTransaction) vSerialPortUsbTransmit }; return io; +} + +tSerialPortIO SerialPortUsb_GetSnifferIo(tSerialPortUsbArtery *env) { + tSerialPortIO io = { + .env = env, + .receive = (SerialPortIOTransaction) vSerialPortUsbSnifferReceive, + .transmit = (SerialPortIOTransaction) vSerialPortUsbTransmit + }; + return io; } \ No newline at end of file diff --git a/SerialPort_USB.h b/SerialPort_USB.h index 865a12f..690dbc1 100644 --- a/SerialPort_USB.h +++ b/SerialPort_USB.h @@ -15,6 +15,7 @@ typedef struct { osMessageQueueId_t rxDataQueue; + osMessageQueueId_t rxDataSnifferQueue; struct { osThreadId_t id; uint32_t stack[1024]; @@ -28,9 +29,11 @@ typedef struct { void SerialPortUsb_Init( tSerialPortUsbArtery *env, - uint32_t rxBufferLength + uint32_t rxBufferLength, + uint32_t rxSnifferLength ); tSerialPortIO SerialPortUsb_GetIo(tSerialPortUsbArtery *env); +tSerialPortIO SerialPortUsb_GetSnifferIo(tSerialPortUsbArtery *env); #endif //SERIALPORT_USB_H