ipc2: improved flush code in tty object.
we still occasionally see problems with partially flushed serial port especially when using /dev/ttyACM0.
This commit is contained in:
@@ -38,6 +38,7 @@ static int _cbFlush(AQH_OBJECT *o);
|
|||||||
static int _getAttn(int fd);
|
static int _getAttn(int fd);
|
||||||
static int _setAttn(int fd, int val);
|
static int _setAttn(int fd, int val);
|
||||||
static int _fdSetBlocking(int sk, int fl);
|
static int _fdSetBlocking(int sk, int fl);
|
||||||
|
static int _fdFlush(int fd);
|
||||||
//static int _msleep(long int msec);
|
//static int _msleep(long int msec);
|
||||||
|
|
||||||
|
|
||||||
@@ -50,19 +51,13 @@ static int _fdSetBlocking(int sk, int fl);
|
|||||||
AQH_OBJECT *AQH_TtyObject_new(AQH_EVENT_LOOP *eventLoop, int fd, int fdMode)
|
AQH_OBJECT *AQH_TtyObject_new(AQH_EVENT_LOOP *eventLoop, int fd, int fdMode)
|
||||||
{
|
{
|
||||||
AQH_OBJECT *o;
|
AQH_OBJECT *o;
|
||||||
int rv;
|
|
||||||
|
|
||||||
o=AQH_FdObject_new(eventLoop, fd, fdMode);
|
o=AQH_FdObject_new(eventLoop, fd, fdMode);
|
||||||
AQH_FdObject_SetStartMsgFn(o, _cbStartMsg);
|
AQH_FdObject_SetStartMsgFn(o, _cbStartMsg);
|
||||||
AQH_FdObject_SetEndMsgFn(o, _cbEndMsg);
|
AQH_FdObject_SetEndMsgFn(o, _cbEndMsg);
|
||||||
AQH_FdObject_SetFlushFn(o, _cbFlush);
|
AQH_FdObject_SetFlushFn(o, _cbFlush);
|
||||||
|
|
||||||
rv=tcflush(fd, TCIOFLUSH);
|
_fdFlush(fd);
|
||||||
if (rv<0) {
|
|
||||||
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
|
||||||
DBG_ERROR(AQH_LOGDOMAIN, "Error on tcflush: %s (%d)", strerror(errno), errno);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
@@ -123,23 +118,54 @@ int _cbFlush(AQH_OBJECT *o)
|
|||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
fd=AQH_FdObject_GetFd(o);
|
fd=AQH_FdObject_GetFd(o);
|
||||||
if (fd>=0) {
|
return (fd>=0)?_fdFlush(fd):0;
|
||||||
int rv;
|
}
|
||||||
|
|
||||||
DBG_ERROR(AQH_LOGDOMAIN, "Flushing");
|
|
||||||
rv=tcflush(fd, TCIFLUSH);
|
|
||||||
if (rv<0) {
|
int _fdFlush(int fd)
|
||||||
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
{
|
||||||
DBG_ERROR(AQH_LOGDOMAIN, "Error on tcflush: %s (%d)", strerror(errno), errno);
|
#if 0
|
||||||
return GWEN_ERROR_IO;
|
int rv;
|
||||||
}
|
|
||||||
|
usleep(1000);
|
||||||
|
rv=ioctl(fd, TCFLSH, 0); // flush receive
|
||||||
|
if (rv!=0) {
|
||||||
|
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Error on ioctl: %s (%d)", strerror(errno), errno);
|
||||||
|
return GWEN_ERROR_IO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
#else
|
||||||
DBG_ERROR(AQH_LOGDOMAIN, "Previous error");
|
int rv;
|
||||||
return GWEN_ERROR_IO;
|
|
||||||
|
usleep(1000);
|
||||||
|
rv=ioctl(fd, TCFLSH, 0); // flush receive
|
||||||
|
if (rv!=0) {
|
||||||
|
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Error on ioctl: %s (%d)", strerror(errno), errno);
|
||||||
|
return GWEN_ERROR_IO;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
uint8_t buffer[32];
|
||||||
|
|
||||||
|
rv=read(fd, buffer, sizeof(buffer));
|
||||||
|
if (rv==0) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "EOF met");
|
||||||
|
return GWEN_ERROR_EOF;
|
||||||
|
}
|
||||||
|
else if (rv<0) {
|
||||||
|
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Error on read: %s (%d)", strerror(errno), errno);
|
||||||
|
return GWEN_ERROR_IO;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user