From 9e84306a949cde6476f23c0a0f6b172f120b082d Mon Sep 17 00:00:00 2001 From: "Edward V. Emelianov" Date: Mon, 9 Feb 2026 22:00:51 +0300 Subject: [PATCH] poll test works @high speed --- LibSidServo/polltest/main.c | 102 +++++++++++------------------------- 1 file changed, 31 insertions(+), 71 deletions(-) diff --git a/LibSidServo/polltest/main.c b/LibSidServo/polltest/main.c index b67ad0e..6ac84db 100644 --- a/LibSidServo/polltest/main.c +++ b/LibSidServo/polltest/main.c @@ -24,7 +24,8 @@ #include #include -#define XYBUFSZ (2048) +// suppose that we ONLY poll data +#define XYBUFSZ (128) struct{ int help; @@ -79,66 +80,29 @@ static int op(const char *nm){ return fd; } -static int eolcnt(buf_t *buf){ - if(!buf) return -1; - int cnt = 0; - for(int i = 0; i < buf->len; ++i) - if(buf->buf[i] == '\n') ++cnt; - return cnt; -} -// move last record (if any) into head of buffer -static void movelast(buf_t *buf){ - FNAME(); - if(!buf) return; - DBG("buf was: %s", buf->buf); - int cnt = eolcnt(buf); - char *E = strrchr(buf->buf, '\n'); - int idx = -1; - if(E){ - idx = ++E - buf->buf; // position of symbol after '\n' - }else{ - buf->len = strlen(buf->buf); - DBG("leave as is (%s)", buf->buf); - return; - } - DBG("cnt=%d, idx=%d", cnt, idx); - switch(cnt){ - case 0: // EOL not found - clear buf - buf->len = 0; - break; - case 1: // only one record - move all after '\n' - if(idx > 0 && idx < XYBUFSZ){ - buf->len = XYBUFSZ - idx; - memmove(buf->buf, E, buf->len); - }else buf->len = 0; - break; - default: // more than one record - move - { - int i = idx - 2; - for(; i > -1; --i) - if(buf->buf[i] == '\n') break; - ++i; - buf->len = XYBUFSZ - i; - memmove(buf->buf, &buf->buf[i], buf->len); - } - } - buf->buf[buf->len] = 0; - DBG("MOVED; now buf[%d]=%s", buf->len, buf->buf); -} // write to buffer next data portion; return FALSE in case of error static int readstrings(buf_t *buf, int fd){ + FNAME(); if(!buf){WARNX("Empty buffer"); return FALSE;} int L = XYBUFSZ - buf->len; if(L == 0){ - DBG("len: %d", buf->len); - movelast(buf); + DBG("buffer overfull!", buf->len); + char *lastn = strrchr(buf->buf, '\n'); + if(lastn){ + fprintf(stderr, "BUFOVR: _%s_", buf->buf); + ++lastn; + buf->len = XYBUFSZ - (lastn - buf->buf); + DBG("Memmove %d", buf->len); + memmove(lastn, buf->buf, buf->len); + buf->buf[buf->len] = 0; + }else buf->len = 0; L = XYBUFSZ - buf->len; } int got = read(fd, &buf->buf[buf->len], L); if(got < 0){ WARN("read()"); return FALSE; - }else if(got == 0) return TRUE; + }else if(got == 0){ DBG("NO data"); return TRUE; } buf->len += got; buf->buf[buf->len] = 0; DBG("buf[%d]: %s", buf->len, buf->buf); @@ -146,28 +110,22 @@ static int readstrings(buf_t *buf, int fd){ } // return TRUE if got, FALSE if no data found static int getdata(buf_t *buf, long *out){ - if(!buf) return -1; + if(!buf || buf->len < 1) return FALSE; // read record between last '\n' and previous (or start of string) - int cnt = eolcnt(buf); - if(cnt < 1) return FALSE; - char *last = strrchr(buf->buf, '\n'); - if(!last) return FALSE; // WTF? + char *last = &buf->buf[buf->len - 1]; + //DBG("buf: _%s_", buf->buf); + if(*last != '\n') return FALSE; *last = 0; - char *prev = buf->buf; - if(cnt > 1) prev = strrchr(buf->buf, '\n') + 1; - if(!prev) prev = buf->buf; // ?? - if(out) *out = atol(prev); - int l = strlen(++last); - if(l < XYBUFSZ){ - buf->len = l; - if(l){ - memmove(buf->buf, last, l); - DBG("moved: %s", buf->buf); - }else DBG("empty line"); - }else{ - buf->len = 0; - DBG("buffer clear"); + //DBG("buf: _%s_", buf->buf); + char *prev = strrchr(buf->buf, '\n'); + if(!prev) prev = buf->buf; + else{ + fprintf(stderr, "MORETHANONE: _%s_", buf->buf); + ++prev; // after last '\n' } + if(out) *out = atol(prev); + // clear buffer + buf->len = 0; return TRUE; } // try to write '\n' asking new data portion; return FALSE if failed @@ -177,7 +135,7 @@ static int asknext(int fd){ int i = 0; for(; i < 5; ++i){ int l = write(fd, "\n", 1); - DBG("l=%d", l); + //DBG("l=%d", l); if(1 == l) return TRUE; usleep(100); } @@ -204,14 +162,16 @@ int main(int argc, char **argv){ t0x = t0y = tstart = sl_dtime(); DBG("Start"); do{ // main cycle - if(poll(pfds, 2, 1) < 0){ + if(poll(pfds, 2, 0) < 0){ WARN("poll()"); break; } if(pfds[0].revents && POLLIN){ + DBG("got X"); if(!readstrings(&xbuf, Xfd)) break; } if(pfds[1].revents && POLLIN){ + DBG("got Y"); if(!readstrings(&ybuf, Yfd)) break; } double curt = sl_dtime();