mirror of
https://github.com/tio/tio.git
synced 2026-05-01 14:57:59 +02:00
Poll on serial port read instead of delay.
This commit is contained in:
parent
eea46a2005
commit
901e00bba3
1 changed files with 54 additions and 32 deletions
|
|
@ -17,6 +17,7 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
#include <sys/poll.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
|
|
@ -63,6 +64,27 @@ static uint16_t crc16(const uint8_t *data, uint16_t size)
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int serial_poll(int sio, void *data, size_t len, int timeout)
|
||||||
|
{
|
||||||
|
struct pollfd fds[1];
|
||||||
|
fds[0].fd = sio;
|
||||||
|
fds[0].events = POLLIN ;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
/* Wait data available */
|
||||||
|
ret = poll(fds, 1, timeout);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
else if (ret > 0) {
|
||||||
|
if(fds[0].revents & POLLIN) {
|
||||||
|
return read(sio, data, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Timeout */
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int xmodem_1k(int sio, const void *data, size_t len, int seq)
|
static int xmodem_1k(int sio, const void *data, size_t len, int seq)
|
||||||
{
|
{
|
||||||
struct xpacket_1k packet;
|
struct xpacket_1k packet;
|
||||||
|
|
@ -76,13 +98,13 @@ static int xmodem_1k(int sio, const void *data, size_t len, int seq)
|
||||||
while(1) {
|
while(1) {
|
||||||
if (key_hit)
|
if (key_hit)
|
||||||
return -1;
|
return -1;
|
||||||
if (read(sio, &resp, 1) < 0) {
|
rc = serial_poll(sio, &resp, 1, 50);
|
||||||
if (errno == EWOULDBLOCK) {
|
if (rc == 0) {
|
||||||
if (resp == 'C') break;
|
if (resp == 'C') break;
|
||||||
if (resp == CAN) return ERR;
|
if (resp == CAN) return ERR;
|
||||||
usleep(50000);
|
continue;
|
||||||
continue;
|
}
|
||||||
}
|
else if (rc < 0) {
|
||||||
perror("Read sync from serial failed");
|
perror("Read sync from serial failed");
|
||||||
return ERR;
|
return ERR;
|
||||||
}
|
}
|
||||||
|
|
@ -133,15 +155,13 @@ static int xmodem_1k(int sio, const void *data, size_t len, int seq)
|
||||||
for(int n=0; n < 20; n++) {
|
for(int n=0; n < 20; n++) {
|
||||||
if (key_hit)
|
if (key_hit)
|
||||||
return ERR;
|
return ERR;
|
||||||
if (read(sio, &resp, 1) < 0) {
|
rc = serial_poll(sio, &resp, 1, 50);
|
||||||
if (errno == EWOULDBLOCK) {
|
if (rc < 0) {
|
||||||
usleep(50000);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
perror("Read ack/nak from serial failed");
|
perror("Read ack/nak from serial failed");
|
||||||
return ERR;
|
return ERR;
|
||||||
|
} else if(rc > 0) {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update "progress bar" */
|
/* Update "progress bar" */
|
||||||
|
|
@ -171,11 +191,13 @@ static int xmodem_1k(int sio, const void *data, size_t len, int seq)
|
||||||
return ERR;
|
return ERR;
|
||||||
}
|
}
|
||||||
write(STDOUT_FILENO, "|", 1);
|
write(STDOUT_FILENO, "|", 1);
|
||||||
usleep(1000000); /* 1 s timeout*/
|
/* 1s timeout */
|
||||||
if (read(sio, &resp, 1) < 0) {
|
rc = serial_poll(sio, &resp, 1, 1000);
|
||||||
if (errno == EWOULDBLOCK) continue;
|
if (rc < 0) {
|
||||||
perror("Read from serial failed");
|
perror("Read from serial failed");
|
||||||
return ERR;
|
return ERR;
|
||||||
|
} else if(rc == 0) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (resp == ACK || resp == CAN) {
|
if (resp == ACK || resp == CAN) {
|
||||||
write(STDOUT_FILENO, "\r\n", 2);
|
write(STDOUT_FILENO, "\r\n", 2);
|
||||||
|
|
@ -198,13 +220,13 @@ static int xmodem(int sio, const void *data, size_t len)
|
||||||
while(1) {
|
while(1) {
|
||||||
if (key_hit)
|
if (key_hit)
|
||||||
return -1;
|
return -1;
|
||||||
if (read(sio, &resp, 1) < 0) {
|
rc = serial_poll(sio, &resp, 1, 50);
|
||||||
if (errno == EWOULDBLOCK) {
|
if (rc == 0) {
|
||||||
if (resp == 'C') break;
|
if (resp == 'C') break;
|
||||||
if (resp == CAN) return ERR;
|
if (resp == CAN) return ERR;
|
||||||
usleep(50000);
|
continue;
|
||||||
continue;
|
}
|
||||||
}
|
else if (rc < 0) {
|
||||||
perror("Read sync from serial failed");
|
perror("Read sync from serial failed");
|
||||||
return ERR;
|
return ERR;
|
||||||
}
|
}
|
||||||
|
|
@ -252,15 +274,13 @@ static int xmodem(int sio, const void *data, size_t len)
|
||||||
for(int n=0; n < 20; n++) {
|
for(int n=0; n < 20; n++) {
|
||||||
if (key_hit)
|
if (key_hit)
|
||||||
return ERR;
|
return ERR;
|
||||||
if (read(sio, &resp, 1) < 0) {
|
rc = serial_poll(sio, &resp, 1, 50);
|
||||||
if (errno == EWOULDBLOCK) {
|
if (rc < 0) {
|
||||||
usleep(50000);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
perror("Read ack/nak from serial failed");
|
perror("Read ack/nak from serial failed");
|
||||||
return ERR;
|
return ERR;
|
||||||
|
} else if(rc > 0) {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update "progress bar" */
|
/* Update "progress bar" */
|
||||||
|
|
@ -290,11 +310,13 @@ static int xmodem(int sio, const void *data, size_t len)
|
||||||
return ERR;
|
return ERR;
|
||||||
}
|
}
|
||||||
write(STDOUT_FILENO, "|", 1);
|
write(STDOUT_FILENO, "|", 1);
|
||||||
usleep(1000000); /* 1 s timeout*/
|
/* 1s timeout */
|
||||||
if (read(sio, &resp, 1) < 0) {
|
rc = serial_poll(sio, &resp, 1, 1000);
|
||||||
if (errno == EWOULDBLOCK) continue;
|
if (rc < 0) {
|
||||||
perror("Read from serial failed");
|
perror("Read from serial failed");
|
||||||
return ERR;
|
return ERR;
|
||||||
|
} else if(rc == 0) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (resp == ACK || resp == CAN) {
|
if (resp == ACK || resp == CAN) {
|
||||||
write(STDOUT_FILENO, "\r\n", 2);
|
write(STDOUT_FILENO, "\r\n", 2);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue