[En-Nut-Discussion] How to write character filter with timeout?

Nathan Moore nategoose at gmail.com
Thu Aug 20 23:58:17 CEST 2009


I'm not sure I understand what you want, but I think you might want:
int wait_for_my_favorite_char(FILE * f, uint32_t max_time_to_wait, char
favorite_char) {
         int fn = _fileno(f);
         uint32_t start = NutGetMillis();
         uint32_t end = start + max_time_to_wait;
         uint32_t restore_to;
         _ioctl(fn, UART_GETREADTIMEOUT, &restore_to);
         _ioctl(fn,  UART_SETREADTIMEOUT, &max_time_to_wait);
         for (;;) {
               char c;
               int rc;
               uint32_t delta_time, now;
               rc = _read(fn, &c, 1); // you could use a getc type function
here and do error handling differently
               if (rc <0) {
                     _ioctl(fn, UART_SETREADTIMEOUT, &restore_to);
                     return -1;  // there was an error so read no further
               }
               if (rc == 1) {
                      if (c == favorite_char) {
                              _ioctl(fn, UART_SETREADTIMEOUT, &restore_to);
                              return 1;  // I decided that 1 means we found
what we were looking for within the amount of time specified
                      }
               }
               now = NutGetMillis();
               if (now >= end) {
                    _ioctl(fn, UART_SETREADTIMEOUT, &restore_to);
                    return 0; // I decided that 0 means that we ran out of
time before we found what we were looking for
               }
               delta_time = end - now;
               _ioctl(fn, UART_SETREADTIMEOUT, &delta_time);
         }
}

You should note that it discards all characters that it may read while
waiting.



More information about the En-Nut-Discussion mailing list