From 703a2c968a665aa2d859d15f23307951666c9d5d Mon Sep 17 00:00:00 2001 From: wh201906 Date: Mon, 16 Oct 2023 20:05:42 +0800 Subject: [PATCH 1/2] Faster uart_receive() in UDP mode Added some functions for writing data to the ring buffer directly Increased the size of ring buffer --- client/src/uart/ringbuffer.c | 16 ++++++++++++++++ client/src/uart/ringbuffer.h | 5 +++++ client/src/uart/uart_posix.c | 17 +++++++++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/client/src/uart/ringbuffer.c b/client/src/uart/ringbuffer.c index 4a3b01f74..13ff133e8 100644 --- a/client/src/uart/ringbuffer.c +++ b/client/src/uart/ringbuffer.c @@ -100,3 +100,19 @@ void RingBuf_destroy(RingBuffer* buffer) { free(buffer->data); free(buffer); } + +inline int RingBuf_getContinousAvailableSize(RingBuffer* buffer) { + const int availableSize = RingBuf_getAvailableSize(buffer); + const int continousSize = (buffer->capacity) - (buffer->rear); + return (availableSize < continousSize) ? availableSize : continousSize; +} + +inline void RingBuf_postEnqueueBatch(RingBuffer* buffer, int count) { + // no check there + buffer->rear = (buffer->rear + count) % buffer->capacity; + buffer->size += count; +} + +inline uint8_t* RingBuf_getRearPtr(RingBuffer* buffer) { + return buffer->data + buffer->rear; +} diff --git a/client/src/uart/ringbuffer.h b/client/src/uart/ringbuffer.h index e78e284b4..35321c8d6 100644 --- a/client/src/uart/ringbuffer.h +++ b/client/src/uart/ringbuffer.h @@ -23,4 +23,9 @@ int RingBuf_getUsedSize(RingBuffer* buffer); int RingBuf_getAvailableSize(RingBuffer* buffer); void RingBuf_destroy(RingBuffer* buffer); +// for direct write +int RingBuf_getContinousAvailableSize(RingBuffer* buffer); +void RingBuf_postEnqueueBatch(RingBuffer* buffer, int count); +uint8_t* RingBuf_getRearPtr(RingBuffer* buffer); + #endif diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index 05a728ada..b864da4b1 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -242,7 +242,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { } sp->fd = sfd; - sp->udpBuffer = RingBuf_create(MAX(sizeof(PacketResponseNGRaw), sizeof(PacketResponseOLD)) * 20); + sp->udpBuffer = RingBuf_create(MAX(sizeof(PacketResponseNGRaw), sizeof(PacketResponseOLD)) * 30); return sp; } @@ -497,9 +497,18 @@ int uart_receive(const serial_port sp, uint8_t *pbtRx, uint32_t pszMaxRxLen, uin // For UDP connection, put the incoming data into the buffer and handle them in the next round if (spu->udpBuffer != NULL) { - uint8_t recvBuf[MAX(sizeof(PacketResponseNGRaw), sizeof(PacketResponseOLD)) * 20]; - res = read(spu->fd, recvBuf, RingBuf_getAvailableSize(spu->udpBuffer)); - RingBuf_enqueueBatch(spu->udpBuffer, recvBuf, res); + if (RingBuf_getContinousAvailableSize(spu->udpBuffer) >= byteCount) { + // write to the buffer directly + res = read(spu->fd, RingBuf_getRearPtr(spu->udpBuffer), RingBuf_getAvailableSize(spu->udpBuffer)); + if (res >= 0) { + RingBuf_postEnqueueBatch(spu->udpBuffer, res); + } + } else { + // use transit buffer + uint8_t transitBuf[MAX(sizeof(PacketResponseNGRaw), sizeof(PacketResponseOLD)) * 30]; + res = read(spu->fd, transitBuf, RingBuf_getAvailableSize(spu->udpBuffer)); + RingBuf_enqueueBatch(spu->udpBuffer, transitBuf, res); + } continue; } From bd34794d263302e2c82290e53a3860093528ae32 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Mon, 16 Oct 2023 21:12:14 +0800 Subject: [PATCH 2/2] Add error handling --- client/src/uart/uart_posix.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index b864da4b1..ff2a6cde3 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -509,6 +509,10 @@ int uart_receive(const serial_port sp, uint8_t *pbtRx, uint32_t pszMaxRxLen, uin res = read(spu->fd, transitBuf, RingBuf_getAvailableSize(spu->udpBuffer)); RingBuf_enqueueBatch(spu->udpBuffer, transitBuf, res); } + // Stop if the OS has some troubles reading the data + if (res < 0) { + return PM3_EIO; + } continue; }