From 9b29d1dc5045b74516e0ddd3ffcc200ef8ad9bff Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Wed, 26 May 2010 06:35:02 +0000 Subject: Create a new LightweightRingBuffer.h header file for the XPLAIN project to abstract out the new ring buffer without a performance penalty. --- LUFA.pnproj | 2 +- Projects/XPLAINBridge/Lib/LightweightRingBuff.h | 89 +++++++++++++++++++++++++ Projects/XPLAINBridge/XPLAINBridge.c | 37 +++------- Projects/XPLAINBridge/XPLAINBridge.h | 13 +--- 4 files changed, 102 insertions(+), 39 deletions(-) create mode 100644 Projects/XPLAINBridge/Lib/LightweightRingBuff.h diff --git a/LUFA.pnproj b/LUFA.pnproj index 1583c1a2b..370e40e2d 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Projects/XPLAINBridge/Lib/LightweightRingBuff.h b/Projects/XPLAINBridge/Lib/LightweightRingBuff.h new file mode 100644 index 000000000..16e890c07 --- /dev/null +++ b/Projects/XPLAINBridge/Lib/LightweightRingBuff.h @@ -0,0 +1,89 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Ultra lightweight ring buffer, for fast insertion/deletion. + */ + +#ifndef _ULW_RING_BUFF_H_ +#define _ULW_RING_BUFF_H_ + + /* Includes: */ + #include + #include + + /* Defines: */ + /** Size of each ring buffer, in bytes */ + #define BUFFER_SIZE 128 + + /** Type of data to store into the buffer */ + #define RingBuff_Data_t uint8_t + + /* Type Defines: */ + typedef struct + { + RingBuff_Data_t Buffer[BUFFER_SIZE]; + RingBuff_Data_t* In; + RingBuff_Data_t* Out; + } RingBuff_t; + + /* Inline Functions: */ + static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer) + { + Buffer->In = Buffer->Buffer; + Buffer->Out = Buffer->Buffer; + } + + static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data) + { + *Buffer->In = Data; + + if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->In = Buffer->Buffer; + } + + static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + { + RingBuff_Data_t Data = *Buffer->Out; + + if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->Out = Buffer->Buffer; + + return Data; + } + + static inline bool RingBuffer_Empty(RingBuff_t* const Buffer) + { + return (Buffer->In == Buffer->Out); + } + +#endif + \ No newline at end of file diff --git a/Projects/XPLAINBridge/XPLAINBridge.c b/Projects/XPLAINBridge/XPLAINBridge.c index ce23862dd..5798c21a5 100644 --- a/Projects/XPLAINBridge/XPLAINBridge.c +++ b/Projects/XPLAINBridge/XPLAINBridge.c @@ -77,10 +77,8 @@ int main(void) { SetupHardware(); - USBtoUART_Buffer.In = USBtoUART_Buffer.Buffer; - USBtoUART_Buffer.Out = USBtoUART_Buffer.Buffer; - UARTtoUSB_Buffer.In = UARTtoUSB_Buffer.Buffer; - UARTtoUSB_Buffer.Out = UARTtoUSB_Buffer.Buffer; + RingBuffer_InitBuffer(&USBtoUART_Buffer); + RingBuffer_InitBuffer(&UARTtoUSB_Buffer); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); sei(); @@ -124,36 +122,19 @@ void USARTBridge_Task(void) /* Read bytes from the USB OUT endpoint into the UART transmit buffer */ for (uint8_t DataBytesRem = CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface); DataBytesRem != 0; DataBytesRem--) - { - *USBtoUART_Buffer.In = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); - - if (++USBtoUART_Buffer.In == &USBtoUART_Buffer.Buffer[128]) - USBtoUART_Buffer.In = USBtoUART_Buffer.Buffer; - } + RingBuffer_Insert(&USBtoUART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface)); /* Read bytes from the UART receive buffer into the USB IN endpoint */ - if (UARTtoUSB_Buffer.In != UARTtoUSB_Buffer.Out) - { - CDC_Device_SendByte(&VirtualSerial_CDC_Interface, *UARTtoUSB_Buffer.Out); - if (++UARTtoUSB_Buffer.Out == &UARTtoUSB_Buffer.Buffer[128]) - UARTtoUSB_Buffer.Out = UARTtoUSB_Buffer.Buffer; - } + if (!(RingBuffer_Empty(&UARTtoUSB_Buffer))) + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&UARTtoUSB_Buffer)); /* Load bytes from the UART transmit buffer into the UART */ - if ((USBtoUART_Buffer.In != USBtoUART_Buffer.Out) && SoftUART_IsReady()) - { - SoftUART_TxByte(*USBtoUART_Buffer.Out); - if (++USBtoUART_Buffer.Out == &USBtoUART_Buffer.Buffer[128]) - USBtoUART_Buffer.Out = USBtoUART_Buffer.Buffer; - } + if (!(RingBuffer_Empty(&USBtoUART_Buffer)) && SoftUART_IsReady()) + SoftUART_TxByte(RingBuffer_Remove(&USBtoUART_Buffer)); /* Load bytes from the UART into the UART receive buffer */ if (SoftUART_IsReceived()) - { - *UARTtoUSB_Buffer.In = SoftUART_RxByte(); - if (++UARTtoUSB_Buffer.In == &UARTtoUSB_Buffer.Buffer[128]) - UARTtoUSB_Buffer.In = UARTtoUSB_Buffer.Buffer; - } + RingBuffer_Insert(&UARTtoUSB_Buffer, SoftUART_RxByte()); CDC_Device_USBTask(&VirtualSerial_CDC_Interface); } @@ -183,7 +164,7 @@ void SetupHardware(void) _delay_ms(10); /* Select the firmware mode based on the JTD pin's value */ - CurrentFirmwareMode = MODE_USART_BRIDGE; // TEMP (PINF & (1 << 7)) ? MODE_USART_BRIDGE : MODE_PDI_PROGRAMMER; + CurrentFirmwareMode = (PINF & (1 << 7)) ? MODE_USART_BRIDGE : MODE_PDI_PROGRAMMER; /* Re-enable JTAG debugging */ MCUCR &= ~(1 << JTD); diff --git a/Projects/XPLAINBridge/XPLAINBridge.h b/Projects/XPLAINBridge/XPLAINBridge.h index 2fa84d3f3..ddb5b0e0c 100644 --- a/Projects/XPLAINBridge/XPLAINBridge.h +++ b/Projects/XPLAINBridge/XPLAINBridge.h @@ -45,8 +45,9 @@ #include "AVRISPDescriptors.h" #include "USARTDescriptors.h" - #include "Lib/SoftUART.h" - #include + #include "Lib/LightweightRingBuff.h" + #include "Lib/SoftUART.h" + #include "Lib/V2Protocol.h" #include #include @@ -74,14 +75,6 @@ /** Firmware mode define for the AVRISP Programmer mode. */ #define MODE_PDI_PROGRAMMER true - - /* Type Defines: */ - typedef struct - { - uint8_t Buffer[128]; - uint8_t* In; - uint8_t* Out; - } RingBuff_t; /* External Variables: */ extern bool CurrentFirmwareMode; -- cgit v1.2.3