summaryrefslogtreecommitdiff
path: root/2003
diff options
context:
space:
mode:
authorschodet2003-09-10 20:18:46 +0000
committerschodet2003-09-10 20:18:46 +0000
commit78c6eb9bba686db209f9eb0886b5f3b2c0af3a33 (patch)
tree6a5d77e05cd6dcaa88eca8fa6921fc35abd31296 /2003
parente40722474578d38fb31f4aa97af49904eda75544 (diff)
Apres 2003
Diffstat (limited to '2003')
-rw-r--r--2003/i/buzz/src/ia/Makefile.defs8
-rw-r--r--2003/i/buzz/src/ia/ia.cc72
-rw-r--r--2003/i/buzz/src/ia/ia.h55
-rw-r--r--2003/i/buzz/src/logger/logger.cc24
-rw-r--r--2003/i/buzz/src/logger/logger.h45
-rw-r--r--2003/i/buzz/src/motor/Makefile.defs2
-rw-r--r--2003/i/buzz/src/motor/motor.cc300
-rw-r--r--2003/i/buzz/src/motor/motor.h60
-rw-r--r--2003/i/buzz/src/motor/test_motor.cc59
-rw-r--r--2003/i/buzz/src/qia/Makefile.defs4
-rw-r--r--2003/i/buzz/src/qia/qbuzz.cc16
-rw-r--r--2003/i/buzz/src/qia/qia.cc146
-rw-r--r--2003/i/buzz/src/qia/qia.h34
-rw-r--r--2003/i/buzz/src/serial/test_serial.cc2
14 files changed, 798 insertions, 29 deletions
diff --git a/2003/i/buzz/src/ia/Makefile.defs b/2003/i/buzz/src/ia/Makefile.defs
new file mode 100644
index 0000000..19ac605
--- /dev/null
+++ b/2003/i/buzz/src/ia/Makefile.defs
@@ -0,0 +1,8 @@
+LIBS += ia.a
+TARGETS += buzz
+ia_a_SOURCES = ia.cc
+buzz_SOURCES = buzz.cc ia.a motor.a automate.a busp.a erreur.a config.a
+
+buzz: $(buzz_SOURCES:%.cc=%.o)
+
+ia.a: ${ia_a_SOURCES:%.cc=ia.a(%.o)}
diff --git a/2003/i/buzz/src/ia/ia.cc b/2003/i/buzz/src/ia/ia.cc
new file mode 100644
index 0000000..14f47a2
--- /dev/null
+++ b/2003/i/buzz/src/ia/ia.cc
@@ -0,0 +1,72 @@
+// ia.cc
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+//
+#include "ia.h"
+
+// Instance unique.
+Ia *Ia::m_instance = 0;
+
+// Constructeur.
+Ia (const char *strat)
+{
+ // Instancie les objets du robot.
+ m_thresholds = new Thresholds ("rc/vision/palets.rgb");
+ m_camera = new Camera ();
+ m_image = new Image (c, t);
+ m_grafcet = new Grafcet (strat);
+ // Init.
+ m_instance = this;
+ m_paletFound = false;
+ for (int i = 0; i < 8; ++i)
+ {
+ m_var[i] = 0;
+ m_tempo[i] = 0;
+ }
+}
+
+// Destructeur.
+~Ia (void)
+{
+ m_instance = 0;
+ delete m_grafcet;
+ delete m_image;
+ delete m_camera;
+ delete m_thresholds;
+}
+
+// Cherche un palet.
+bool
+Ia::seekPalet (void)
+{
+ i->reread ();
+}
+
+// Va vers le palet précédement trouvé.
+void
+Ia::goPalet (void)
+{
+}
+
+// Variable de l'ia.
+int getVar (int var)
+{
+ return m_var[var];
+}
+
+void setVar (int var, int val)
+{
+ m_var[var] = val;
+}
+
+// Tempos de l'ia.
+void resetTempo (int tempo)
+{
+ m_tempo[tempo] = m_date.start ();
+}
+
+int getTempo (int tempo)
+{
+ return m_date.start () - m_tempo[tempo];
+}
+
diff --git a/2003/i/buzz/src/ia/ia.h b/2003/i/buzz/src/ia/ia.h
new file mode 100644
index 0000000..5ca9092
--- /dev/null
+++ b/2003/i/buzz/src/ia/ia.h
@@ -0,0 +1,55 @@
+#ifndef ia_h
+#define ia_h
+// ia.h
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+#include "date/date.h"
+#include "automate/grafcet.h"
+#include "busp/busp.h"
+#include "camera/camera.h"
+#include "date/date.h"
+#include "motor/motor.h"
+#include "vision/image.h"
+#include "vision/thresholds.h"
+
+class Ia
+{
+ // Objets du robot.
+ Date m_date;
+ Busp m_busp;
+ Motor m_motor;
+ Image *m_image;
+ Thresholds *m_thresholds;
+ Camera *m_camera;
+ Grafcet *m_grafcet;
+ // Logique de recherche de palet.
+ bool m_paletFound;
+ double m_paletAngle, m_paletDistance;
+ // Instance unique.
+ static Ia *m_instance;
+ // Variables de l'ia.
+ int m_var[8];
+ // Tempos de l'ia.
+ int m_tempo[8];
+ public:
+ // Constructeur.
+ Ia (const char *strat);
+ // Destructeur.
+ ~Ia (void);
+ // Renvoie une référence vers l'instance unique.
+ Ia &getInstance (void) { return *m_instance; }
+ // Cherche un palet.
+ bool seekPalet (void);
+ // A-t-on trouvé un palet.
+ bool paletFound (void) { return m_paletFound; }
+ // Va vers le palet précédement trouvé.
+ void goPalet (void);
+ // Variable de l'ia.
+ int getVar (int var);
+ void setVar (int var, int val);
+ // Tempos de l'ia.
+ void resetTempo (int tempo);
+ int getTempo (int tempo);
+};
+
+#endif // ia_h
diff --git a/2003/i/buzz/src/logger/logger.cc b/2003/i/buzz/src/logger/logger.cc
new file mode 100644
index 0000000..56bca37
--- /dev/null
+++ b/2003/i/buzz/src/logger/logger.cc
@@ -0,0 +1,24 @@
+// logger.cc
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+//
+#include "logger.h"
+
+// Pointeur vers l'instance unique.
+Logger *Logger::m_instance = 0;
+
+// Constructeur.
+Logger::Logger (const iostream *s)
+{
+ // Pointeur d'instance.
+ m_instance = this;
+ // Stream.
+ m_s = s;
+}
+
+// Destructeur.
+Logger::~Logger (void)
+{
+ m_instance = 0;
+}
+
diff --git a/2003/i/buzz/src/logger/logger.h b/2003/i/buzz/src/logger/logger.h
new file mode 100644
index 0000000..599ba61
--- /dev/null
+++ b/2003/i/buzz/src/logger/logger.h
@@ -0,0 +1,45 @@
+#ifndef logger_h
+#define logger_h
+// logger.h
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+
+class iostream;
+
+class Logger
+{
+ public:
+ enum LogType {
+ logAutomate,
+ logBusp,
+ logBuspActionneurs,
+ logBuspCapteurs,
+ logBuspGPS,
+ logBuspIr,
+ logBuspServo,
+ logMotor,
+ logVision,
+ logMax
+ };
+ private:
+ static Logger *m_instance;
+ bool m_enable[logMax];
+ iostream *m_s;
+ public:
+ // Constructeur.
+ Logger (iostream *s);
+ // Destructeur.
+ ~Logger (void);
+ // Retourne une référence vers l'instance unique.
+ static Logger &getInstance (void) { return m_instance; }
+};
+
+class LoggerB
+{
+ public:
+ // Constructeur.
+ LoggerB (iostream *s);
+ // Destructeur.
+};
+
+#endif // logger_h
diff --git a/2003/i/buzz/src/motor/Makefile.defs b/2003/i/buzz/src/motor/Makefile.defs
index 27a3470..fa3c82b 100644
--- a/2003/i/buzz/src/motor/Makefile.defs
+++ b/2003/i/buzz/src/motor/Makefile.defs
@@ -1,6 +1,6 @@
TARGETS += test_motor
LIBS += motor.a
-test_motor_SOURCES = test_motor.cc motor.a serial.a erreur.a config.a
+test_motor_SOURCES = test_motor.cc motor.a serial.a erreur.a config.a date.a
motor_a_SOURCES = motor.cc
test_motor: $(test_motor_SOURCES:%.cc=%.o)
diff --git a/2003/i/buzz/src/motor/motor.cc b/2003/i/buzz/src/motor/motor.cc
index 93d36b2..00880bb 100644
--- a/2003/i/buzz/src/motor/motor.cc
+++ b/2003/i/buzz/src/motor/motor.cc
@@ -4,71 +4,220 @@
//
#include "motor.h"
#include "config/config.h"
+#include "date/date.h"
#include <iostream>
#define MOTOR_DEV "/dev/tty00"
+#define MOTOR_DEBUG
+
+// Pointeur vers l'instance unique.
+Motor *Motor::m_instance = 0;
+
// Constructeur.
Motor::Motor (void) : m_serial (MOTOR_DEV)
{
m_recv_n = 0;
- running = false;
+ m_running = false;
+ m_capteursFetch = false;
+ m_capteurs = 1;
+ m_last_com = 'Z';
+ m_last_a1 = m_last_a2 = m_last_a3 = -1;
// Paramètres par defaut.
m_speed = m_accel = m_raccel = m_rspeed = 10;
+ m_ed2 = 190;
+ m_x = 0.0;
+ m_y = 0.0;
+ m_dir = 90.0;
+ m_factor = m_rfactor = 1.0;
// Lit la conf.
Config rc ("rc/motor");
while (!rc.eof ())
{
- if (rc.isId ("accel"))
+ if (rc.isId ("go"))
{
rc.getId ();
- rc >> m_accel;
+ rc >> m_inf_speed;
+ rc >> m_inf_accel;
+ }
+ else if (rc.isId ("turnangle"))
+ {
+ rc.getId ();
+ rc >> m_rspeed;
+ rc >> m_raccel;
}
- else if (rc.isId ("speed"))
+ else if (rc.isId ("godistance"))
{
rc.getId ();
rc >> m_speed;
+ rc >> m_accel;
}
- else if (rc.isId ("raccel"))
+ else if (rc.isId ("turn"))
{
rc.getId ();
- rc >> m_raccel;
+ rc >> m_inf_rspeed;
+ rc >> m_inf_raccel;
}
- else if (rc.isId ("rspeed"))
+ else if (rc.isId ("entraxe"))
{
rc.getId ();
- rc >> m_rspeed;
+ rc >> m_ed2;
+ m_ed2 /= 2;
+ }
+ else if (rc.isId ("xorig"))
+ {
+ rc.getId ();
+ rc >> m_x;
+ }
+ else if (rc.isId ("yorig"))
+ {
+ rc.getId ();
+ rc >> m_y;
+ }
+ else if (rc.isId ("dirorig"))
+ {
+ rc.getId ();
+ rc >> m_dir;
+ }
+ else if (rc.isId ("factors"))
+ {
+ rc.getId ();
+ rc >> m_factor >> m_rfactor;
}
else rc.noId ();
}
+ // Mémorise le pointeur d'instance.
+ m_instance = this;
}
// Destructeur.
Motor::~Motor (void)
{
+ stop ();
+ m_instance = 0;
+}
+
+// Change la position courante.
+void
+Motor::setPos (double x, double y)
+{
+ m_x = x; m_y = y;
+}
+
+// Change la position courante.
+void
+Motor::setPos (double x, double y, double dir)
+{
+ m_x = x; m_y = y; m_dir = dir;
+}
+
+// Récupère la position courante.
+void
+Motor::getPos (double &x, double &y, double &dir)
+{
+ x = m_x; y = m_y; dir = m_dir;
}
// Avance d'une distance d, à la vitesse s.
void
Motor::goDistance (int d, int s)
{
+ d = (int) ((double) d * m_factor);
if (d > 0)
- send ('F', d, s == -1 ? m_speed : s, m_accel);
+ send ('F', d, m_accel, s == -1 ? m_speed : s);
else
- send ('R', -d, s == -1 ? m_speed : s, m_accel);
- running = true;
+ send ('R', -d, m_accel, s == -1 ? m_speed : s);
+ m_running = true;
}
// Tourne d'un angle d, à la vitesse s.
void
Motor::turnAngle (int d, int s)
{
+ d = (int) ((double) d * m_rfactor);
if (d > 0)
- send ('G', d, s == -1 ? m_speed : s, m_accel);
+ send ('G', d, m_raccel, s == -1 ? m_rspeed : s);
else
- send ('D', -d, s == -1 ? m_speed : s, m_accel);
- running = true;
+ send ('D', -d, m_raccel, s == -1 ? m_rspeed : s);
+ m_running = true;
+}
+
+// Avance indéfiniment à la vitesse s.
+void
+Motor::go (int s)
+{
+ if (s == 0)
+ send ('f', m_inf_accel, m_inf_speed);
+ else if (s > 0)
+ send ('f', m_inf_accel, s);
+ else
+ send ('r', m_inf_accel, -s);
+ m_running = true;
+}
+
+// Avance indéfiniment à la vitesse sg et sd, respectivement pour le
+// moteur gauche et droit.
+void
+Motor::go (int sg, int sd)
+{
+ // TODO.
+}
+
+// Tourne indéfiniment à la vitesse s.
+void
+Motor::turn (int s)
+{
+ if (s == 0)
+ send ('g', m_inf_raccel, m_inf_rspeed);
+ else if (s > 0)
+ send ('g', m_inf_raccel, s);
+ else
+ send ('d', m_inf_raccel, -s);
+ m_running = true;
+}
+
+// Avance indéfiniment en tournant à la vitesse max s, de rayon r.
+void
+Motor::goTurn (int s, int r)
+{
+ int s2;
+ if (r == 0)
+ go (s);
+ else
+ {
+ s2 = s * (r - m_ed2) / (r + m_ed2);
+ if (r < 0)
+ go (s2, s);
+ else
+ go (s, s2);
+ }
+}
+
+// Stoppe.
+void
+Motor::stop (void)
+{
+ send ('s');
+ m_running = true;
+}
+
+// Stop progressif.
+void
+Motor::stopp (void)
+{
+ send ('S');
+ m_running = true;
+}
+
+// Reset.
+void
+Motor::reset (void)
+{
+ send ('Z');
+ m_running = true;
+ //for (int i = 0; i < 40; ++i)
+ // send ('+');
}
// Traite les message entrants.
@@ -83,7 +232,28 @@ Motor::readMsg (void)
switch (m_recv_buf[1])
{
case 'Y':
- running = false;
+ m_running = false;
+ break;
+ case '?':
+ if (m_running || m_capteursFetch || !m_servoFinnish)
+ send (m_last_com, m_last_a1, m_last_a2, m_last_a3);
+ break;
+ case 'h':
+ m_capteurs = m_recv_buf[2];
+ m_capteursFetch = false;
+ break;
+ case 'q':
+ m_doneG = m_recv_buf[2] << 24 |
+ m_recv_buf[3] << 16 |
+ m_recv_buf[4] << 8 |
+ m_recv_buf[5];
+ m_doneD = m_recv_buf[6] << 24 |
+ m_recv_buf[7] << 16 |
+ m_recv_buf[8] << 8 |
+ m_recv_buf[9];
+ break;
+ case 'H':
+ m_servoFinnish = true;
break;
}
}
@@ -91,6 +261,12 @@ Motor::readMsg (void)
}
}
+// Traite l'information de bouclage.
+void
+Motor::readTicks (int g, int d)
+{
+}
+
// Envoie une commande.
void
Motor::send (char com, int a1, int a2, int a3)
@@ -98,6 +274,10 @@ Motor::send (char com, int a1, int a2, int a3)
char data[32];
int n = 0;
int be, le;
+ m_last_com = com;
+ m_last_a1 = a1;
+ m_last_a2 = a2;
+ m_last_a3 = a3;
data[n++] = '<';
data[n++] = com;
if (a1 != -1)
@@ -146,10 +326,98 @@ Motor::recv (void)
if (c == '>')
{
m_recv_buf[m_recv_n] = '\0';
- cout << "motor " << m_recv_buf << endl;
+#ifdef MOTOR_DEBUG
+ if (m_recv_buf[1] != 'h')
+ cout << "motor " << m_recv_buf << endl;
+#endif // MOTOR_DEBUG
return true;
}
}
return false;
}
+// Demande les infos capteurs.
+void
+Motor::fetchCapteurs (void)
+{
+ send ('h');
+ m_capteursFetch = true;
+}
+
+// Attend le top départ.
+void
+Motor::waitRound (void)
+{
+ while (!(getCapteurs () & 8))
+ {
+ Date::wait (50);
+ }
+}
+
+// Récupère la distance parcouru.
+int
+Motor::getDone (void)
+{
+ m_doneG = 0;
+ while (m_doneG == 0)
+ {
+ send ('q');
+ for (int i = 0; i < 10 && m_doneG == 0; ++i)
+ {
+ readMsg ();
+ Date::wait (50);
+ }
+ }
+ return ((m_doneG - m_doneGs) + (m_doneD - m_doneDs) / 2);
+}
+
+// Mémorise la distance parcourue pour le moment.
+void
+Motor::setDone (void)
+{
+ m_doneG = 0;
+ while (m_doneG == 0)
+ {
+ send ('q');
+ for (int i = 0; i < 10 && m_doneG == 0; ++i)
+ {
+ readMsg ();
+ Date::wait (50);
+ }
+ }
+ m_doneDs = m_doneD;
+ m_doneGs = m_doneG;
+}
+
+// Gère les servos.
+void
+Motor::setServo (int s)
+{
+ m_servoFinnish = false;
+ while (!m_servoFinnish)
+ {
+ send ('H', s);
+ for (int i = 0; i < 10 && !m_servoFinnish; ++i)
+ {
+ readMsg ();
+ Date::wait (50);
+ }
+ }
+}
+
+// Retourne les infos capteurs.
+int
+Motor::getCapteurs (void)
+{
+ m_capteursFetch = true;
+ while (m_capteursFetch)
+ {
+ send ('h');
+ for (int i = 0; i < 10 && m_capteursFetch; ++i)
+ {
+ readMsg ();
+ Date::wait (50);
+ }
+ }
+ return m_capteurs;
+}
diff --git a/2003/i/buzz/src/motor/motor.h b/2003/i/buzz/src/motor/motor.h
index 330ce88..a51b140 100644
--- a/2003/i/buzz/src/motor/motor.h
+++ b/2003/i/buzz/src/motor/motor.h
@@ -15,21 +15,77 @@ class Motor
// Paramètre vitesse/acceleration.
int m_accel, m_speed;
int m_raccel, m_rspeed;
+ int m_inf_accel, m_inf_speed;
+ int m_inf_raccel, m_inf_rspeed;
+ // Paramètres géométriques.
+ int m_ed2;
+ double m_factor, m_rfactor;
// Operations en cours.
- bool running;
+ bool m_running;
+ char m_last_com;
+ int m_last_a1, m_last_a2, m_last_a3;
+ // Calcul de position.
+ double m_x, m_y, m_dir;
+ // Capteurs.
+ char m_capteurs;
+ bool m_capteursFetch;
+ // Servo.
+ bool m_servoFinnish;
+ // Distance effectuée.
+ int m_doneG, m_doneD;
+ int m_doneGs, m_doneDs;
+ // Instance unique.
+ static Motor *m_instance;
public:
// Constructeur.
Motor (void);
// Destructeur.
~Motor (void);
+ // Change la position courante.
+ void setPos (double x, double y);
+ // Change la position courante.
+ void setPos (double x, double y, double dir);
+ // Récupère la position courante. TODO: valider avec une date.
+ void getPos (double &x, double &y, double &dir);
+ // Retourne une référence vers l'instance unique.
+ static Motor &getInstance (void) { return *m_instance; }
// Avance d'une distance d, à la vitesse s.
void goDistance (int d, int s = -1);
// Tourne d'un angle d, à la vitesse s.
void turnAngle (int d, int s = -1);
+ // Avance indéfiniment à la vitesse s.
+ void go (int s = 0);
+ // Avance indéfiniment à la vitesse sg et sd, respectivement pour le
+ // moteur gauche et droit.
+ void go (int sg, int sd);
+ // Tourne indéfiniment à la vitesse s.
+ void turn (int s = 0);
+ // Avance indéfiniment en tournant à la vitesse max s, de rayon r.
+ void goTurn (int s, int r);
+ // Stoppe.
+ void stop (void);
+ // Stop progressif.
+ void stopp (void);
+ // Reset.
+ void reset (void);
// Retourne true si la commande est terminée.
- bool finnish (void) { readMsg (); return !running; }
+ bool finnish (void) { readMsg (); return !m_running; }
// Traite les message entrants.
void readMsg (void);
+ // Traite l'information de bouclage.
+ void readTicks (int g, int d);
+ // Demande les infos capteurs.
+ void fetchCapteurs (void);
+ // Retourne les infos capteurs.
+ int getCapteurs (void);
+ // Gère les servos.
+ void setServo (int s);
+ // Attend le top départ.
+ void waitRound (void);
+ // Récupère la distance parcouru.
+ int getDone (void);
+ // Mémorise la distance parcourue pour le moment.
+ void setDone (void);
private:
// Envoie une commande.
void send (char com, int a1 = -1, int a2 = -1, int a3 = -1);
diff --git a/2003/i/buzz/src/motor/test_motor.cc b/2003/i/buzz/src/motor/test_motor.cc
index 636d743..b9e5066 100644
--- a/2003/i/buzz/src/motor/test_motor.cc
+++ b/2003/i/buzz/src/motor/test_motor.cc
@@ -4,24 +4,65 @@
//
#include "motor.h"
#include "erreur/erreur.h"
+#include "date/date.h"
#include <iostream>
#include <unistd.h>
+#include <stdlib.h>
int
-main (void)
+main (int argc, char **argv)
{
+ cout << "hello" << endl;
try
{
Motor m;
- m.goDistance (2000);
- while (!m.finnish ()) sleep (1);
- m.turnAngle (180);
- while (!m.finnish ()) sleep (1);
- m.goDistance (2000);
- while (!m.finnish ()) sleep (1);
- m.turnAngle (-180);
- while (!m.finnish ()) sleep (1);
+ cout << "world" << endl;
+ int i = 1;
+ int c;
+ while (i < argc)
+ {
+ switch (argv[i][0])
+ {
+ case 'j':
+ cout << "jack" << endl;
+ i++;
+ m.waitRound ();
+ break;
+ case 'h':
+ i++;
+ cout << "capteurs ";
+ c = m.getCapteurs ();
+ for (int j = 1; j < 0x100; j <<= 1)
+ {
+ cout << (c & j ? '#' : '_') << ' ';
+ }
+ cout << endl;
+ break;
+ case 't':
+ cout << "turn" << endl;
+ i++;
+ if (i >= argc) return 1;
+ m.turnAngle (atoi (argv[i++]));
+ break;
+ case 'z':
+ cout << "rezet" << endl;
+ i++;
+ m.reset ();
+ break;
+ case 'H':
+ i++;
+ if (i >= argc) return 1;
+ cout << "servo " << atoi (argv[i]);
+ m.setServo (atoi (argv[i++]));
+ break;
+ default:
+ cout << "go" << endl;
+ m.goDistance (atoi (argv[i++]));
+ break;
+ }
+ while (!m.finnish ()) Date::wait (50);
+ }
return 0;
}
catch (Erreur &e)
diff --git a/2003/i/buzz/src/qia/Makefile.defs b/2003/i/buzz/src/qia/Makefile.defs
new file mode 100644
index 0000000..df06f6a
--- /dev/null
+++ b/2003/i/buzz/src/qia/Makefile.defs
@@ -0,0 +1,4 @@
+TARGETS += qbuzz
+qbuzz_SOURCES = qbuzz.cc qia.cc motor.a serial.a erreur.a config.a date.a
+
+qbuzz: $(qbuzz_SOURCES:%.cc=%.o)
diff --git a/2003/i/buzz/src/qia/qbuzz.cc b/2003/i/buzz/src/qia/qbuzz.cc
new file mode 100644
index 0000000..e0e4fe6
--- /dev/null
+++ b/2003/i/buzz/src/qia/qbuzz.cc
@@ -0,0 +1,16 @@
+// qbuzz.cc
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+#include "motor/motor.h"
+#include "busp/busp.h"
+#include "qia.h"
+
+
+int
+main (int argc, char **argv)
+{
+ bool vert = argc >= 2 && argv[1][0] == 'v';
+
+ QIa qia (vert);
+ qia.go ();
+}
diff --git a/2003/i/buzz/src/qia/qia.cc b/2003/i/buzz/src/qia/qia.cc
new file mode 100644
index 0000000..79eba39
--- /dev/null
+++ b/2003/i/buzz/src/qia/qia.cc
@@ -0,0 +1,146 @@
+// qia.cc
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+//
+#include "qia.h"
+#include "config/config.h"
+
+// Constructeur.
+QIa::QIa (bool vert)
+{
+ Config rc ("rc/qia");
+ m_pathSize = 0;
+ while (!rc.eof ())
+ {
+ if (rc.isId ("path"))
+ {
+ rc.getId ();
+ while (!rc.eof ())
+ {
+ m_path.push_back (rc.getNum ());
+ m_pathSize++;
+ }
+ }
+ else rc.noId ();
+ }
+ // Initialisation.
+ m_pathNext = 0;
+ m_vert = vert;
+}
+
+// Lance l'automate.
+void
+QIa::go (void)
+{
+ // Reset les cartes.
+ m_motor.reset ();
+ // Positionne les servos.
+ m_motor.setServo (1);
+ m_motor.setServo (8);
+ // Attend le jack.
+ m_motor.waitRound ();
+ // Démare le chrono.
+ m_date.startRound ();
+ // Lit le chemin.
+ int d;
+ while (m_pathNext < m_pathSize)
+ {
+ d = m_path[m_pathNext++];
+ if (!d)
+ // Virages.
+ turn ();
+ else
+ // Sections droites.
+ ahead (d);
+ }
+ // Stop, on bouge plus.
+ while (1) Date::wait (999);
+}
+
+// Tourne.
+void
+QIa::turn (void)
+{
+ int a = m_path[m_pathNext++];
+ m_motor.turnAngle (a);
+ while (!m_motor.finnish ()) Date::wait (50);
+}
+
+// Tout droit.
+void
+QIa::ahead (int d)
+{
+ while (!m_motor.finnish ())
+ {
+ // Fait avancer le moteur.
+ m_motor.goDistance (d);
+ // Mémorise la distance parcourue.
+ //m_motor.setDone ();
+ // Tant que ça roule.
+ while (!m_motor.finnish ())
+ {
+ Date::wait (50);
+ // Teste la barière
+ if (m_motor.getCapteurs () & 0x20)
+ {
+ while (!m_motor.getCapteurs () & 0x20)
+ {
+ Date::wait (10);
+ m_motor.readMsg ();
+ }
+// // Avance tout doucement.
+// m_motor.goDistance (150, 25);
+// // Jusqu'au capteur barrière ou rien trouvé.
+// while (!m_motor.finnish () &&
+// !(m_busp.getCapteurs ().get () & 0x02))
+// {
+// m_motor.readMsg ();
+// Date::wait (50);
+// }
+// // Arrète le moteur.
+// m_motor.stop ();
+// while (!m_motor.finnish ())
+// {
+// m_motor.readMsg ();
+// Date::wait (50);
+// }
+ // Regarde la couleur.
+ if ((m_motor.getCapteurs () & 0x80) && m_vert
+ || !(m_motor.getCapteurs () & 0x80) && !m_vert)
+ {
+// // Repart dans l'autre sens.
+// m_motor.go (-25);
+// while (m_busp.getCapteurs ().get () & 0x02)
+// {
+// m_motor.readMsg ();
+// Date::wait (50);
+// }
+// // Stop.
+// m_motor.stop ();
+// while (!m_motor.finnish ())
+// {
+// m_motor.readMsg ();
+// Date::wait (50);
+// }
+ // Retourne le palet.
+ m_motor.setServo (7);
+// // Recule.
+// m_motor.goDistance (-30);
+// // Réavance le robot.
+// m_motor.goDistance (140, 25);
+// while (!m_motor.finnish ())
+// {
+// m_motor.readMsg ();
+// Date::wait (50);
+// }
+ Date::wait (2000);
+ // Retourne les doigts.
+ m_motor.setServo (8);
+ }
+ }
+ // Lit la distance parcourue.
+ //d -= m_motor.getDone ();
+ continue;
+ }
+ }
+}
diff --git a/2003/i/buzz/src/qia/qia.h b/2003/i/buzz/src/qia/qia.h
new file mode 100644
index 0000000..069d057
--- /dev/null
+++ b/2003/i/buzz/src/qia/qia.h
@@ -0,0 +1,34 @@
+#ifndef qia_h
+#define qia_h
+// qia.h - Ia, vite fait...
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+#include "motor/motor.h"
+#include "date/date.h"
+#include "busp/busp.h"
+
+#include <vector>
+
+
+class QIa
+{
+ // Objets instanciés
+ Motor m_motor;
+ Date m_date;
+ // Chemin utilisé.
+ vector<int> m_path;
+ int m_pathNext, m_pathSize;
+ // Couleur des palets.
+ bool m_vert;
+ public:
+ // Constructeur.
+ QIa (bool vert);
+ // Lance l'automate.
+ void go (void);
+ // Tourne.
+ void turn (void);
+ // Tout droit.
+ void ahead (int d);
+};
+
+#endif // qia_h
diff --git a/2003/i/buzz/src/serial/test_serial.cc b/2003/i/buzz/src/serial/test_serial.cc
index 74001a1..029f359 100644
--- a/2003/i/buzz/src/serial/test_serial.cc
+++ b/2003/i/buzz/src/serial/test_serial.cc
@@ -16,7 +16,7 @@ main (void)
//char c;
//do
//{
- s.write ("Coucou !\n", 9);
+ s.write ("<Z><F#000#100>", 14);
//c = s.getchar ();
//sleep (1);
//}