eps8266: Fix FIFO implementation; it was a stack not a FIFO.

This commit is contained in:
Gregory Nutt 2016-05-21 15:42:35 -06:00
parent 8217864a10
commit d5b00bafbd

View File

@ -106,9 +106,10 @@
typedef struct typedef struct
{ {
int flags;
int nfifo;
sem_t *sem; sem_t *sem;
uint8_t flags;
uint16_t in;
uint16_t out;
uint8_t rxbuf[SOCKET_FIFO_SIZE]; uint8_t rxbuf[SOCKET_FIFO_SIZE];
} lesp_socket_t; } lesp_socket_t;
@ -117,7 +118,7 @@ typedef struct
bool running; bool running;
pthread_t thread; pthread_t thread;
uint8_t buf[BUF_WORKER_LEN]; uint8_t buf[BUF_WORKER_LEN];
int buf_size; int bufsize;
} lesp_worker_t; } lesp_worker_t;
typedef struct typedef struct
@ -129,8 +130,8 @@ typedef struct
lesp_socket_t sockets[SOCKET_NBR]; lesp_socket_t sockets[SOCKET_NBR];
sem_t sem; sem_t sem;
char buf[BUF_ANS_LEN]; char buf[BUF_ANS_LEN];
char buf_ans[BUF_ANS_LEN]; char bufans[BUF_ANS_LEN];
char buf_cmd[BUF_CMD_LEN]; char bufcmd[BUF_CMD_LEN];
} lesp_state_t; } lesp_state_t;
/**************************************************************************** /****************************************************************************
@ -273,7 +274,7 @@ static inline int lesp_read_ipd(void)
/* Put a null at end */ /* Put a null at end */
*(ptr + g_lesp_state.worker.buf_size) = '\0'; *(ptr + g_lesp_state.worker.bufsize) = '\0';
if (memcmp(ptr,"+IPD,",5) != 0) if (memcmp(ptr,"+IPD,",5) != 0)
{ {
@ -327,11 +328,11 @@ static inline int lesp_read_ipd(void)
while(size --) while(size --)
{ {
uint8_t b = *buf++; uint8_t b = *buf++;
if (sock->nfifo < SOCKET_FIFO_SIZE) if (sock->in < SOCKET_FIFO_SIZE)
{ {
int ndx = sock->nfifo; int ndx = sock->in;
sock->rxbuf[ndx] = b; sock->rxbuf[ndx] = b;
sock->nfifo = ndx + 1; sock->in = ndx + 1;
} }
else else
{ {
@ -369,17 +370,17 @@ int lesp_vsend_cmd(FAR const IPTR char *format, va_list ap)
{ {
int ret = 0; int ret = 0;
ret = vsnprintf(g_lesp_state.buf_cmd,BUF_CMD_LEN,format,ap); ret = vsnprintf(g_lesp_state.bufcmd,BUF_CMD_LEN,format,ap);
if (ret >= BUF_CMD_LEN) if (ret >= BUF_CMD_LEN)
{ {
g_lesp_state.buf_cmd[BUF_CMD_LEN-1]='\0'; g_lesp_state.bufcmd[BUF_CMD_LEN-1]='\0';
syslog(LOG_DEBUG, "Buffer too small for '%s'...\n", g_lesp_state.buf_cmd); syslog(LOG_DEBUG, "Buffer too small for '%s'...\n", g_lesp_state.bufcmd);
ret = -1; ret = -1;
} }
syslog(LOG_DEBUG, "Write:%s\n", g_lesp_state.buf_cmd); syslog(LOG_DEBUG, "Write:%s\n", g_lesp_state.bufcmd);
ret = write(g_lesp_state.fd,g_lesp_state.buf_cmd,ret); ret = write(g_lesp_state.fd,g_lesp_state.bufcmd,ret);
if (ret < 0) if (ret < 0)
{ {
ret = -1; ret = -1;
@ -462,7 +463,7 @@ static int lesp_read(int timeout_ms)
ret = strlen(g_lesp_state.buf); ret = strlen(g_lesp_state.buf);
if (ret > 0) if (ret > 0)
{ {
memcpy(g_lesp_state.buf_ans,g_lesp_state.buf,ret+1); /* +1 to copy null */ memcpy(g_lesp_state.bufans,g_lesp_state.buf,ret+1); /* +1 to copy null */
} }
g_lesp_state.buf[0] = '\0'; g_lesp_state.buf[0] = '\0';
@ -472,7 +473,7 @@ static int lesp_read(int timeout_ms)
} }
while (ret == 0); while (ret == 0);
syslog(LOG_DEBUG, "read %d=>%s\n", ret, g_lesp_state.buf_ans); syslog(LOG_DEBUG, "read %d=>%s\n", ret, g_lesp_state.bufans);
return ret; return ret;
} }
@ -523,22 +524,22 @@ int lesp_read_ans_ok(int timeout_ms)
/* Answers sorted in probability case */ /* Answers sorted in probability case */
if (strcmp(g_lesp_state.buf_ans,"OK") == 0) if (strcmp(g_lesp_state.bufans,"OK") == 0)
{ {
return 0; return 0;
} }
if (strcmp(g_lesp_state.buf_ans,"FAIL") == 0) if (strcmp(g_lesp_state.bufans,"FAIL") == 0)
{ {
return -1; return -1;
} }
if (strcmp(g_lesp_state.buf_ans,"ERROR") == 0) if (strcmp(g_lesp_state.bufans,"ERROR") == 0)
{ {
return -1; return -1;
} }
syslog(LOG_INFO,"Got:%s\n",g_lesp_state.buf_ans); syslog(LOG_INFO,"Got:%s\n",g_lesp_state.bufans);
/* Ro quit in case of message flooding */ /* Ro quit in case of message flooding */
} }
@ -710,7 +711,7 @@ static void *lesp_worker(void *args)
pthread_mutex_lock(&g_lesp_state.mutex); pthread_mutex_lock(&g_lesp_state.mutex);
syslog(LOG_INFO,"worker Started \n"); syslog(LOG_INFO,"worker Started \n");
p->buf_size = 0; p->bufsize = 0;
pthread_mutex_unlock(&g_lesp_state.mutex); pthread_mutex_unlock(&g_lesp_state.mutex);
while(p->running) while(p->running)
@ -730,23 +731,23 @@ static void *lesp_worker(void *args)
pthread_mutex_lock(&g_lesp_state.mutex); pthread_mutex_lock(&g_lesp_state.mutex);
if (c == '\n') if (c == '\n')
{ {
if (p->buf[p->buf_size-1] == '\r') if (p->buf[p->bufsize-1] == '\r')
{ {
p->buf_size--; p->bufsize--;
} }
if (p->buf_size != 0) if (p->bufsize != 0)
{ {
p->buf[p->buf_size] = '\0'; p->buf[p->bufsize] = '\0';
memcpy(g_lesp_state.buf,p->buf,p->buf_size+1); memcpy(g_lesp_state.buf,p->buf,p->bufsize+1);
syslog(LOG_DEBUG, "Read data:%s\n", g_lesp_state.buf); syslog(LOG_DEBUG, "Read data:%s\n", g_lesp_state.buf);
sem_post(&g_lesp_state.sem); sem_post(&g_lesp_state.sem);
p->buf_size = 0; p->bufsize = 0;
} }
} }
else if (p->buf_size < BUF_ANS_LEN-1) else if (p->bufsize < BUF_ANS_LEN - 1)
{ {
p->buf[p->buf_size++] = c; p->buf[p->bufsize++] = c;
} }
else else
{ {
@ -757,7 +758,7 @@ static void *lesp_worker(void *args)
if ((c == ':') && (lesp_read_ipd() != 0)) if ((c == ':') && (lesp_read_ipd() != 0))
{ {
p->buf_size = 0; p->bufsize = 0;
} }
} }
} }
@ -1082,14 +1083,14 @@ int lesp_list_access_points(lesp_cb_t cb)
continue; continue;
} }
syslog(LOG_DEBUG, "Read:%s.\n", g_lesp_state.buf_ans); syslog(LOG_DEBUG, "Read:%s.\n", g_lesp_state.bufans);
if (strcmp(g_lesp_state.buf_ans,"OK") == 0) if (strcmp(g_lesp_state.bufans,"OK") == 0)
{ {
break; break;
} }
ret = lesp_parse_cwlap_ans_line(g_lesp_state.buf_ans,&ap); ret = lesp_parse_cwlap_ans_line(g_lesp_state.bufans,&ap);
if (ret < 0) if (ret < 0)
{ {
syslog(LOG_ERR, "Line badly formed."); syslog(LOG_ERR, "Line badly formed.");
@ -1183,7 +1184,8 @@ int lesp_closesocket(int sockfd)
memset(sock, 0, sizeof(lesp_socket_t)); memset(sock, 0, sizeof(lesp_socket_t));
sock->flags = 0; sock->flags = 0;
sock->nfifo = 0; sock->in = 0;
sock->out = 0;
} }
if (ret < 0) if (ret < 0)
@ -1282,7 +1284,7 @@ ssize_t lesp_send(int sockfd, FAR const uint8_t *buf, size_t len, int flags)
while (ret >= 0) while (ret >= 0)
{ {
char * ptr = g_lesp_state.buf_ans; char * ptr = g_lesp_state.bufans;
ret = lesp_read(lespTIMEOUT_MS); ret = lesp_read(lespTIMEOUT_MS);
if (ret < 0) if (ret < 0)
@ -1338,7 +1340,7 @@ ssize_t lesp_recv(int sockfd, FAR uint8_t *buf, size_t len, int flags)
ret = -1; ret = -1;
} }
if (ret >= 0 && sock->nfifo == 0) if (ret >= 0 && sock->in == 0)
{ {
struct timespec ts; struct timespec ts;
@ -1350,7 +1352,7 @@ ssize_t lesp_recv(int sockfd, FAR uint8_t *buf, size_t len, int flags)
{ {
ts.tv_sec += lespTIMEOUT_MS_RECV_S; ts.tv_sec += lespTIMEOUT_MS_RECV_S;
sock->sem = &sem; sock->sem = &sem;
while (ret >= 0 && sock->nfifo == 0) while (ret >= 0 && sock->in == 0)
{ {
pthread_mutex_unlock(&g_lesp_state.mutex); pthread_mutex_unlock(&g_lesp_state.mutex);
ret = sem_timedwait(&sem,&ts); ret = sem_timedwait(&sem,&ts);
@ -1364,11 +1366,11 @@ ssize_t lesp_recv(int sockfd, FAR uint8_t *buf, size_t len, int flags)
if (ret >= 0) if (ret >= 0)
{ {
ret = 0; ret = 0;
while (ret < len && sock->nfifo > 0) while (ret < len && sock->out < sock->in)
{ {
int ndx = sock->nfifo - 1; int ndx = sock->out;
*buf++ = sock->rxbuf[ndx]; *buf++ = sock->rxbuf[ndx];
sock->nfifo = ndx; sock->out = ndx + 1;
ret++; ret++;
} }
} }