Poll on serial port read instead of delay.

This commit is contained in:
HiFiPhile 2024-04-03 20:46:44 +02:00 committed by Martin Lund
parent eea46a2005
commit 901e00bba3

View file

@ -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);