Ignore:
Timestamp:
Jul 31, 2019, 5:44:55 PM (5 years ago)
Author:
bouyer
Message:

Host software for the v2 firmware

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/software/tty/readtty_timer.c

    r1 r12  
    33#include <unistd.h>
    44#include <errno.h>
     5#include <err.h>
    56#include <fcntl.h>
    67#include <signal.h>
     8#include <string.h>
    79#include <termios.h>
    810#include <sys/ioctl.h>
     11#include <sys/select.h>
    912
    1013volatile int quit;
     
    1417{
    1518        quit = 1;
     19}
     20
     21static void
     22readline(int d, char *buf, int l)
     23{
     24        int i;
     25        int bytes;
     26        do {
     27                for (i = 0; i < l; i++) {
     28                        do {
     29                                bytes = read(d, &buf[i], 1);
     30                                if (quit)
     31                                        return;
     32                        } while ((bytes < 0 && errno == EAGAIN) || buf[i] == '\r');
     33                        if (bytes != 1) {
     34                                fprintf(stderr, "readline: read %d\n", bytes);
     35                                err(1, "read line");
     36                        }
     37                        if (buf[i] == '\n')
     38                                break;
     39                }
     40        } while (i == 0);
     41        if (buf[i] != '\n') {
     42                errx(1, "realine: end of line not found");
     43        }
     44        buf[i] = '\0';
    1645}
    1746
     
    2554        int i;
    2655        fd_set rfds;
    27         char gpio[2], current[4], tension[4];
     56        char gpio[3], current[4], tension[4];
    2857        char *endp;
    29         int currenti, tensioni;
    30         int val;
     58        int gpioi, currenti, tensioni;
     59        int gpioval, currentval, tensionval;
     60        int exitst = 0;
    3161
    3262        enum {
     
    4171
    4272        state = INIT;
    43         currenti = tensioni = 0;
     73        gpioi = currenti = tensioni = 0;
    4474
    4575        if (argc != 3) {
     
    87117        }
    88118        fprintf(stderr, "tty ready\n");
     119        write(d, "M0\n", 3);
     120        write(d, "M0\n", 3);
     121        do {
     122                readline(d, buf, sizeof(buf));
     123                if (quit)
     124                        goto quit;
     125        } while (memcmp(buf, "OK", 2) != 0);
     126        fprintf(stderr, "starting\n");
     127        write(d, "M1\n", 3);
     128
    89129        alarm(atoi(argv[2]));
    90130        FD_ZERO(&rfds);
     
    94134                if (nfds > 0 && FD_ISSET(d, &rfds)) {
    95135                        bytes = read(d, buf, sizeof(buf));
     136                        if (bytes > sizeof(buf)) {
     137                                errx(1, "read %d/0x%x bytes", bytes, bytes);
     138                        }
    96139                        if (bytes < 0 && errno != EAGAIN) {
    97140                                warn("read");
     141                                continue;
    98142                        }
    99143                        for (i = 0; i < bytes; i++) {
     144                                if (i > sizeof(buf))
     145                                        abort();
     146                                if (bytes > sizeof(buf))
     147                                        abort();
     148                                if (gpioi > sizeof(buf))
     149                                        abort();
     150                                if (tensioni > sizeof(buf))
     151                                        abort();
     152                                if (currenti > sizeof(buf))
     153                                        abort();
    100154                                switch(state) {
    101155                                case INIT:
    102156                                        /* look for an X mark */
    103                                         if (buf[i] == 'X')
     157                                        if (buf[i] == 'X') {
    104158                                                state = GPIO;
     159                                                gpioi = 0;
     160                                        }
    105161                                        break;
    106162                                case GPIO:
    107                                         gpio[0] = buf[i];
    108                                         gpio[1] = '\0';
    109                                         val = strtol(gpio, &endp, 16);
     163                                        gpio[gpioi] = buf[i];
     164                                        gpioi++;
     165                                        if (gpioi < 2)
     166                                                break;
     167                                        gpio[gpioi] = '\0';
     168                                        gpioval = strtol(gpio, &endp, 16);
    110169                                        if (*endp != '\0') {
    111170                                                fprintf(stderr,
    112171                                                    "gpio error: %c\n",
    113172                                                    *endp);
    114                                                 state = INIT;
    115                                         } else {
    116                                                 state = CURRENT;
    117                                                 currenti = 0;
    118                                                 printf("%2d ", val);
     173                                                exitst = 1;
     174                                                state = INIT;
     175                                        } else {
     176                                                state = TENSION;
     177                                                tensioni = 0;
    119178                                        }
    120179                                        break;
     
    125184                                                break;
    126185                                        current[currenti] = '\0';
    127                                         val = strtol(current, &endp, 16);
     186                                        currentval = strtol(current, &endp, 16);
    128187                                        if (*endp != '\0') {
    129188                                                fprintf(stderr,
    130189                                                    "current error: %c\n",
    131190                                                    *endp);
    132                                                 state = INIT;
    133                                         } else {
    134                                                 state = TENSION;
     191                                                exitst = 1;
     192                                                state = INIT;
     193                                        } else {
     194                                                state = MARK;
    135195                                                tensioni = 0;
    136                                                 printf("%4d ", val);
    137196                                        }
    138197                                        break;
     
    143202                                                break;
    144203                                        tension[tensioni] = '\0';
    145                                         val = strtol(tension, &endp, 16);
     204                                        tensionval = strtol(tension, &endp, 16);
    146205                                        if (*endp != '\0') {
    147206                                                fprintf(stderr,
    148207                                                    "tension error: %c\n",
    149208                                                    *endp);
    150                                                 state = INIT;
    151                                         } else {
    152                                                 state = MARK;
    153                                                 printf("%4d\n", val);
     209                                                exitst = 1;
     210                                                state = INIT;
     211                                        } else {
     212                                                state = CURRENT;
     213                                                currenti = 0;
    154214                                        }
    155215                                        break;
     
    159219                                                    "mark error: %c\n",
    160220                                                    buf[i]);
    161                                                 state = INIT;
    162                                         } else {
     221                                                exitst = 1;
     222                                                state = INIT;
     223                                        } else {
     224                                                printf("%3d ", gpioval);
     225                                                printf("%4d ", tensionval);
     226                                                printf("%4d\n", currentval);
    163227                                                state = GPIO;
     228                                                gpioi = 0;
    164229                                        }
    165230                                        break;
     
    170235                }
    171236        }
     237quit:
     238        /* stop measures */
     239        write(d, "M0\n", 3);
     240        if (fflush(stdout) == EOF) { 
     241                warn("fflush");       
     242        }
     243
    172244        if (tcsetattr(d, TCSANOW, &ot) < 0) {
    173245                err(1, "restore tcsetattr");
    174246        }
    175         exit(0);
     247        exit(exitst);
    176248}
    177249
Note: See TracChangeset for help on using the changeset viewer.