Changed RS-485 in linux port to use FIFO instead of Ringbuffer. Added FIFO to library build.

This commit is contained in:
skarg
2011-05-10 16:29:49 +00:00
parent 1d4e487b29
commit e85ab0b49f
2 changed files with 14 additions and 16 deletions
+4
View File
@@ -125,6 +125,8 @@ PORT_ARCNET_SRC = \
PORT_MSTP_SRC = \ PORT_MSTP_SRC = \
$(BACNET_PORT_DIR)/rs485.c \ $(BACNET_PORT_DIR)/rs485.c \
$(BACNET_PORT_DIR)/dlmstp.c \ $(BACNET_PORT_DIR)/dlmstp.c \
$(BACNET_CORE)/ringbuf.c \
$(BACNET_CORE)/fifo.c \
$(BACNET_CORE)/mstp.c \ $(BACNET_CORE)/mstp.c \
$(BACNET_CORE)/mstptext.c \ $(BACNET_CORE)/mstptext.c \
$(BACNET_CORE)/crc.c \ $(BACNET_CORE)/crc.c \
@@ -141,6 +143,8 @@ PORT_ALL_SRC = \
$(BACNET_PORT_DIR)/arcnet.c \ $(BACNET_PORT_DIR)/arcnet.c \
$(BACNET_PORT_DIR)/dlmstp.c \ $(BACNET_PORT_DIR)/dlmstp.c \
$(BACNET_PORT_DIR)/rs485.c \ $(BACNET_PORT_DIR)/rs485.c \
$(BACNET_CORE)/ringbuf.c \
$(BACNET_CORE)/fifo.c \
$(BACNET_CORE)/mstp.c \ $(BACNET_CORE)/mstp.c \
$(BACNET_CORE)/crc.c \ $(BACNET_CORE)/crc.c \
$(BACNET_PORT_DIR)/ethernet.c \ $(BACNET_PORT_DIR)/ethernet.c \
+10 -16
View File
@@ -58,7 +58,7 @@
/* Local includes */ /* Local includes */
#include "mstp.h" #include "mstp.h"
#include "rs485.h" #include "rs485.h"
#include "ringbuf.h" #include "fifo.h"
#include <pthread.h> #include <pthread.h>
#include <sys/select.h> #include <sys/select.h>
@@ -87,9 +87,9 @@ static char *RS485_Port_Name = "/dev/ttyUSB0";
static struct termios RS485_oldtio; static struct termios RS485_oldtio;
/* Ring buffer for incoming bytes, in order to speed up the receiving. */ /* Ring buffer for incoming bytes, in order to speed up the receiving. */
static RING_BUFFER rbuf; static FIFO_BUFFER Rx_FIFO;
/* buffer size needs to be a power of 2 */
static uint8_t rs485_data[1 << 12]; static uint8_t Rx_Buffer[1 << 12];
static pthread_mutex_t Reader_Mutex, IOMutex; static pthread_mutex_t Reader_Mutex, IOMutex;
@@ -98,7 +98,7 @@ static pthread_mutex_t Reader_Mutex, IOMutex;
static void *rs485_read_task(void *arg) static void *rs485_read_task(void *arg)
{ {
uint8_t buf[1 << 11]; uint8_t buf[1 << 11];
int count, i, n; int count, n;
fd_set input; fd_set input;
struct timeval cekalica; struct timeval cekalica;
FD_ZERO(&input); FD_ZERO(&input);
@@ -116,9 +116,7 @@ static void *rs485_read_task(void *arg)
pthread_mutex_unlock(&IOMutex); pthread_mutex_unlock(&IOMutex);
if (count > 0) { if (count > 0) {
pthread_mutex_lock(&Reader_Mutex); pthread_mutex_lock(&Reader_Mutex);
for (i = 0; i < count; i++) { FIFO_Add(&Rx_FIFO, &buf[0], count);
Ringbuf_Put(&rbuf, &buf[i]);
}
pthread_mutex_unlock(&Reader_Mutex); pthread_mutex_unlock(&Reader_Mutex);
} }
usleep(5000); usleep(5000);
@@ -250,8 +248,6 @@ void RS485_Send_Frame(volatile struct mstp_port_struct_t *mstp_port, /* port
/* called by timer, interrupt(?) or other thread */ /* called by timer, interrupt(?) or other thread */
void RS485_Check_UART_Data(volatile struct mstp_port_struct_t *mstp_port) void RS485_Check_UART_Data(volatile struct mstp_port_struct_t *mstp_port)
{ {
uint8_t *new_data;
if (mstp_port->ReceiveError == true) { if (mstp_port->ReceiveError == true) {
/* wait for state machine to clear this */ /* wait for state machine to clear this */
/*mstp_port->ReceiveError=false; */ /*mstp_port->ReceiveError=false; */
@@ -262,13 +258,11 @@ void RS485_Check_UART_Data(volatile struct mstp_port_struct_t *mstp_port)
if (mstp_port->DataAvailable == false) { if (mstp_port->DataAvailable == false) {
/* check for data */ /* check for data */
pthread_mutex_lock(&Reader_Mutex); pthread_mutex_lock(&Reader_Mutex);
new_data = Ringbuf_Pop_Front(&rbuf); if (FIFO_Count(&Rx_FIFO) > 0) {
pthread_mutex_unlock(&Reader_Mutex); mstp_port->DataRegister = FIFO_Get(&Rx_FIFO);
if (new_data != NULL) {
mstp_port->DataRegister = *new_data;
mstp_port->DataAvailable = true; mstp_port->DataAvailable = true;
return;
} }
pthread_mutex_unlock(&Reader_Mutex);
} }
} }
@@ -330,7 +324,7 @@ void RS485_Initialize(void)
usleep(200000); usleep(200000);
tcflush(RS485_Handle, TCIOFLUSH); tcflush(RS485_Handle, TCIOFLUSH);
/* ringbuffer */ /* ringbuffer */
Ringbuf_Init(&rbuf, rs485_data, 1 << 12); FIFO_Init(&Rx_FIFO, Rx_Buffer, sizeof(Rx_Buffer));
pthread_mutex_init(&Reader_Mutex, NULL); pthread_mutex_init(&Reader_Mutex, NULL);
pthread_mutex_init(&IOMutex, NULL); pthread_mutex_init(&IOMutex, NULL);
pthread_create(&hThread, NULL, rs485_read_task, NULL); pthread_create(&hThread, NULL, rs485_read_task, NULL);