From 7bc30212c13eff66bc217046f8bd69f4a78bec71 Mon Sep 17 00:00:00 2001 From: schodet Date: Sun, 29 Feb 2004 18:30:44 +0000 Subject: Add: FakeSerial. --- 2004/i/nono/src/fake_serial/Makefile.defs | 8 ++ 2004/i/nono/src/fake_serial/fake_serial.cc | 109 ++++++++++++++++++++++++ 2004/i/nono/src/fake_serial/fake_serial.h | 56 ++++++++++++ 2004/i/nono/src/fake_serial/test_fake_serial.cc | 37 ++++++++ 4 files changed, 210 insertions(+) create mode 100644 2004/i/nono/src/fake_serial/Makefile.defs create mode 100644 2004/i/nono/src/fake_serial/fake_serial.cc create mode 100644 2004/i/nono/src/fake_serial/fake_serial.h create mode 100644 2004/i/nono/src/fake_serial/test_fake_serial.cc (limited to '2004/i/nono/src') diff --git a/2004/i/nono/src/fake_serial/Makefile.defs b/2004/i/nono/src/fake_serial/Makefile.defs new file mode 100644 index 0000000..a335e0f --- /dev/null +++ b/2004/i/nono/src/fake_serial/Makefile.defs @@ -0,0 +1,8 @@ +LIBS += fake_serial.a +TARGETS += test_fake_serial +test_fake_serial_SOURCES = test_fake_serial.cc fake_serial.a utils.a +fake_serial_a_SOURCES = fake_serial.cc + +fake_serial.a: ${fake_serial_a_SOURCES:%.cc=fake_serial.a(%.o)} + +test_fake_serial: $(test_fake_serial_SOURCES:%.cc=%.o) diff --git a/2004/i/nono/src/fake_serial/fake_serial.cc b/2004/i/nono/src/fake_serial/fake_serial.cc new file mode 100644 index 0000000..0d89e25 --- /dev/null +++ b/2004/i/nono/src/fake_serial/fake_serial.cc @@ -0,0 +1,109 @@ +// fake_serial.cc +// nono - programme du robot 2004. {{{ +// +// Copyright (C) 2004 Nicolas Schodet +// +// Robot APB Team/Efrei 2004. +// Web: http://assos.efrei.fr/robot/ +// Email: robot AT efrei DOT fr +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} +#include "fake_serial.h" +#include "utils/rand.h" + +/// Constructeur. +FakeSerial::FakeSerial (bool blocking/*false*/) + : blocking_ (blocking), lostP_ (1000), errorP_ (1000) +{ +} + +/// Lit un bloc, retourne le nombre d'octets lus ou <= 0 en cas d'erreur +/// ou si aucun caractère n'est disponible. Pour le robot, préferer en +/// général getchar() pour du non-bloquant. +ssize_t +FakeSerial::read (void *buf, size_t size) +{ + char p[size]; + int ret; + do + { + ret = ::read (0, p, size); + if (ret > 0) + { + char *po = reinterpret_cast (buf); + int n = 0; + for (int i = 0; i < ret; ++i) + { + if (!(rand () % lostP_)) + { + // Saute le caractère. + } + else + { + po[n++] = doError (p[i]); + } + } + ret = n; + } + else + return ret; + } while (ret <= 0 && blocking_); + return ret; +} + +/// Lit un caractère, ou -1 en cas d'erreur ou si aucun caractère n'est +/// disponible. +int +FakeSerial::getchar (void) +{ + char c; + return read (&c, 1) > 0 ? c : -1; +} + +/// Ecrit un bloc. +void +FakeSerial::write (const void *buf, size_t size) +{ + const unsigned char *p = reinterpret_cast (buf); + size_t i; + char c; + for (i = 0; i < size; ++i) + { + if (!(rand () % lostP_)) + continue; + c = doError (p[i]); + ::write (1, &c, 1); + } +} + +/// Ecrit un caractère. +void +FakeSerial::putchar (int c) +{ + write (&c, 1); +} + +/// Inverse peut-être un bit aléatoirement. +char +FakeSerial::doError (char c) +{ + if (!(rand () % errorP_)) + return c ^ (1 << (rand () % 8)); + else + return c; +} + diff --git a/2004/i/nono/src/fake_serial/fake_serial.h b/2004/i/nono/src/fake_serial/fake_serial.h new file mode 100644 index 0000000..4b68873 --- /dev/null +++ b/2004/i/nono/src/fake_serial/fake_serial.h @@ -0,0 +1,56 @@ +#ifndef fake_serial_h +#define fake_serial_h +// fake_serial.h +// nono - programme du robot 2004. {{{ +// +// Copyright (C) 2004 Nicolas Schodet +// +// Robot APB Team/Efrei 2004. +// Web: http://assos.efrei.fr/robot/ +// Email: robot AT efrei DOT fr +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} + +#include + +/// Classe émullant un port série sur l'entrée/sortie standart. Perd et +/// modifie de temps en temps les octects comme un vrai port série. +class FakeSerial +{ + bool blocking_; + /// Probabilitées de perte et d'erreur. + int lostP_, errorP_; + public: + /// Constructeur. + FakeSerial (bool blocking = false); + /// Lit un bloc, retourne le nombre d'octets lus ou <= 0 en cas d'erreur + /// ou si aucun caractère n'est disponible. Pour le robot, préferer en + /// général getchar() pour du non-bloquant. + ssize_t read (void *buf, size_t size); + /// Lit un caractère, ou -1 en cas d'erreur ou si aucun caractère n'est + /// disponible. + int getchar (void); + /// Ecrit un bloc. + void write (const void *buf, size_t size); + /// Ecrit un caractère. + void putchar (int c); + protected: + /// Inverse peut-être un bit aléatoirement. + char doError (char c); +}; + +#endif // fake_serial_h diff --git a/2004/i/nono/src/fake_serial/test_fake_serial.cc b/2004/i/nono/src/fake_serial/test_fake_serial.cc new file mode 100644 index 0000000..863ebf8 --- /dev/null +++ b/2004/i/nono/src/fake_serial/test_fake_serial.cc @@ -0,0 +1,37 @@ +// test_fake_serial.cc +// nono - programme du robot 2004. {{{ +// +// Copyright (C) 2004 Nicolas Schodet +// +// Robot APB Team/Efrei 2004. +// Web: http://assos.efrei.fr/robot/ +// Email: robot AT efrei DOT fr +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} +#include "fake_serial.h" + +int +main (void) +{ + FakeSerial fs (true); + char c; + while ((c = fs.getchar ()) != -1) + { + fs.write (&c, 1); + } + return 0; +} -- cgit v1.2.3