summaryrefslogtreecommitdiff
path: root/2004/i/nono/src/serial
diff options
context:
space:
mode:
authorschodet2004-04-16 16:46:46 +0000
committerschodet2004-04-16 16:46:46 +0000
commita3a3a4d6d183b22036a606cda8553192c98321cd (patch)
tree37d158408eabfbb8524d1214a985a44e376ee333 /2004/i/nono/src/serial
parente68b824329a537eddddd5b59b9bdf498698ee604 (diff)
Logger fonctionne.
MovementRotation aussi. Ajout de Serial::wait. Ajout de commentaires.
Diffstat (limited to '2004/i/nono/src/serial')
-rw-r--r--2004/i/nono/src/serial/serial.h3
-rw-r--r--2004/i/nono/src/serial/serial_base.cc41
-rw-r--r--2004/i/nono/src/serial/serial_base.h3
3 files changed, 47 insertions, 0 deletions
diff --git a/2004/i/nono/src/serial/serial.h b/2004/i/nono/src/serial/serial.h
index 808c234..e3b03de 100644
--- a/2004/i/nono/src/serial/serial.h
+++ b/2004/i/nono/src/serial/serial.h
@@ -54,6 +54,9 @@ class Serial
void write (const void *buf, size_t size) { sb_->write (buf, size); }
/// Ecrit un caractère.
void putchar (int c) { sb_->putchar (c); }
+ /// Attend que des caractères soient disponibles pendant un delay en
+ /// millisecondes.
+ bool wait (int timeout = -1) { return sb_->wait (timeout); }
};
#endif // serial_h
diff --git a/2004/i/nono/src/serial/serial_base.cc b/2004/i/nono/src/serial/serial_base.cc
index 4815c67..c43bb59 100644
--- a/2004/i/nono/src/serial/serial_base.cc
+++ b/2004/i/nono/src/serial/serial_base.cc
@@ -23,6 +23,10 @@
//
// }}}
#include "serial_base.h"
+#include "utils/errno_exception.h"
+
+#include <sys/types.h>
+#include <sys/time.h>
/// Constructeur.
SerialBase::SerialBase (void)
@@ -70,3 +74,40 @@ SerialBase::putchar (int c)
write (&c, 1);
}
+/// Attend que des caractères soient disponibles pendant un delay en
+/// millisecondes.
+bool
+SerialBase::wait (int timeout/*-1*/)
+{
+ fd_set fds;
+ int r;
+ // Setup fd_set.
+ FD_ZERO (&fds);
+ FD_SET (fd_, &fds);
+ if (timeout == -1)
+ {
+ // Without timeout.
+ r = select (FD_SETSIZE, &fds, 0, 0, 0);
+ }
+ else
+ {
+ // With timeout.
+ struct timeval tv;
+ tv.tv_sec = timeout;
+ tv.tv_usec = 0;
+ r = select (FD_SETSIZE, &fds, 0, 0, &tv);
+ }
+ switch (r)
+ {
+ case -1:
+ // Error.
+ throw errno_exception (errno);
+ case 0:
+ // Timeout.
+ return false;
+ default:
+ // Data availlable.
+ return true;
+ }
+}
+
diff --git a/2004/i/nono/src/serial/serial_base.h b/2004/i/nono/src/serial/serial_base.h
index 8cf6bd3..2c092b3 100644
--- a/2004/i/nono/src/serial/serial_base.h
+++ b/2004/i/nono/src/serial/serial_base.h
@@ -55,6 +55,9 @@ class SerialBase
void write (const void *buf, size_t size);
/// Ecrit un caractère.
void putchar (int c);
+ /// Attend que des caractères soient disponibles pendant un delay en
+ /// millisecondes.
+ bool wait (int timeout = -1);
};
#endif // serial_base_h