summaryrefslogtreecommitdiff
path: root/2004/i/nono/src
diff options
context:
space:
mode:
authorschodet2004-03-19 22:41:06 +0000
committerschodet2004-03-19 22:41:06 +0000
commit3689313a276f1de6b9027274ebd8872b3e319566 (patch)
tree04c56eec39baeb98640cda8033dab69abf770749 /2004/i/nono/src
parent1ba67cfe35a4d92b797b2e4841477b9291b7a89c (diff)
Add: hexa.
Mod: commentaires Doxygen.
Diffstat (limited to '2004/i/nono/src')
-rw-r--r--2004/i/nono/src/motor/Makefile.defs8
-rw-r--r--2004/i/nono/src/motor/asserv.cc74
-rw-r--r--2004/i/nono/src/motor/asserv.h48
-rw-r--r--2004/i/nono/src/motor/motor.cc23
-rw-r--r--2004/i/nono/src/motor/motor.h48
-rw-r--r--2004/i/nono/src/utils/Makefile.defs2
-rw-r--r--2004/i/nono/src/utils/hexa.cc64
-rw-r--r--2004/i/nono/src/utils/hexa.h34
8 files changed, 209 insertions, 92 deletions
diff --git a/2004/i/nono/src/motor/Makefile.defs b/2004/i/nono/src/motor/Makefile.defs
index 5fda0ed..7e9055a 100644
--- a/2004/i/nono/src/motor/Makefile.defs
+++ b/2004/i/nono/src/motor/Makefile.defs
@@ -1,9 +1,11 @@
TARGETS += test_motor test_asserv test_tracker
LIBS += motor.a
-test_motor_SOURCES = test_motor.cc motor.a serial.a erreur.a config.a date.a
-test_asserv_SOURCES = test_asserv.cc motor.a serial.a erreur.a config.a date.a
+test_motor_SOURCES = test_motor.cc motor.a serial.a erreur.a config.a date.a \
+ utils.a
+test_asserv_SOURCES = test_asserv.cc motor.a serial.a erreur.a config.a \
+ date.a utils.a
test_tracker_SOURCES = test_tracker.cc motor.a serial.a erreur.a config.a \
- date.a
+ date.a utils.a
motor_a_SOURCES = asserv.cc tracker.cc motor.cc movement_basic.cc \
movement_goto.cc
diff --git a/2004/i/nono/src/motor/asserv.cc b/2004/i/nono/src/motor/asserv.cc
index 40c5944..bb259c3 100644
--- a/2004/i/nono/src/motor/asserv.cc
+++ b/2004/i/nono/src/motor/asserv.cc
@@ -25,15 +25,13 @@
#include "asserv.h"
#include "config/config.h"
#include "date/date.h"
+#include "utils/hexa.h"
#include <iostream>
-// Table de conversion en hexa.
-const char *Asserv::hexaTbl_ = "0123456789abcdef";
-
-// Constructeur.
+/// Constructeur.
Asserv::Asserv (AsservTracker &asservTracker)
- : accel_ (-1), kp_ (-1), ki_ (-1), kd_ (-1),
+ : ttyspeed_ (0), accel_ (-1), kp_ (-1), ki_ (-1), kd_ (-1),
statMotor_ (false), counter_ (false),
inBufSize_ (64), inBufPos_ (0), inBuf_ (0),
firstCounter_ (true),
@@ -50,6 +48,7 @@ Asserv::Asserv (AsservTracker &asservTracker)
rc.get ("ki", ki_) ||
rc.get ("kd", kd_) ||
rc.get ("tty", ttyname_) ||
+ rc.get ("ttyspeed", ttyspeed_) ||
rc.get ("stats", statMotor_) ||
rc.get ("counter", counter_) ||
rc.get ("buffer", inBufSize_)
@@ -62,7 +61,7 @@ Asserv::Asserv (AsservTracker &asservTracker)
inBuf_ = new char[inBufSize_];
}
-// Destructeur.
+/// Destructeur.
Asserv::~Asserv (void)
{
// Envois le signal de reset.
@@ -71,7 +70,7 @@ Asserv::~Asserv (void)
delete inBuf_;
}
-// Reset la carte et envois les paramètres.
+/// Reset la carte et envois les paramètres.
void
Asserv::reset (void)
{
@@ -96,28 +95,28 @@ Asserv::reset (void)
setCounter (counter_);
}
-// Active l'asservissement.
+/// Active l'asservissement.
void
Asserv::go (bool fl)
{
send ('g', fl);
}
-// Stop !
+/// Stop !
void
Asserv::stop (void)
{
send ('s');
}
-// Réglage de la vitesse.
+/// Réglage de la vitesse.
void
Asserv::speed (int l, int r)
{
send ('v', l, r);
}
-// Teste si l'émission est terminée.
+/// Teste si l'émission est terminée.
bool
Asserv::ok (void)
{
@@ -125,14 +124,14 @@ Asserv::ok (void)
return sendQueue_.empty ();
}
-// Attend que toute les émissions soit terminées.
+/// Attend que toute les émissions soit terminées.
void
Asserv::waitOk (void)
{
while (!ok ()) Date::wait (1);
}
-// Lit et traite les messages de la cartes.
+/// Lit et traite les messages de la cartes.
void
Asserv::read (void)
{
@@ -154,7 +153,7 @@ Asserv::read (void)
}
}
-// Change les paramètres de la carte.
+/// Change les paramètres de la carte.
void
Asserv::setAccel (int accel)
{
@@ -198,7 +197,7 @@ Asserv::setCounter (bool fl = true)
counter_ = fl;
}
-// Envoie un message.
+/// Envoie un message.
void
Asserv::send (char com)
{
@@ -231,8 +230,8 @@ Asserv::send (char com, int a1)
std::string s;
s += '!';
s += com;
- s += hexaTbl_[(a1 >> 4) & 0x0f];
- s += hexaTbl_[a1 & 0x0f];
+ s += hex2digit ((a1 >> 4) & 0x0f);
+ s += hex2digit (a1 & 0x0f);
s += '\r';
sendQueue_.push (s);
if (wasEmpty) sendLast ();
@@ -245,16 +244,16 @@ Asserv::send (char com, int a1, int a2)
std::string s;
s += '!';
s += com;
- s += hexaTbl_[(a1 >> 4) & 0x0f];
- s += hexaTbl_[a1 & 0x0f];
- s += hexaTbl_[(a2 >> 4) & 0x0f];
- s += hexaTbl_[a2 & 0x0f];
+ s += hex2digit ((a1 >> 4) & 0x0f);
+ s += hex2digit (a1 & 0x0f);
+ s += hex2digit ((a2 >> 4) & 0x0f);
+ s += hex2digit (a2 & 0x0f);
s += '\r';
sendQueue_.push (s);
if (wasEmpty) sendLast ();
}
-// Renvois le dernier message.
+/// Renvois le dernier message.
void
Asserv::sendLast (void)
{
@@ -264,7 +263,7 @@ std::cout << "send " << s << std::endl;
serial_.write (s.data (), s.size ());
}
-// Traite un message.
+/// Traite un message.
void
Asserv::handleMessage (void)
{
@@ -287,7 +286,7 @@ inBuf_[inBufPos_] = 0;
break;
case 'm':
// Recois des nouvelles stats.
- // handleStatMotor ();
+ handleStatMotor ();
break;
case 'c':
// Recois une nouvelle valeur pour les compteurs.
@@ -299,7 +298,23 @@ inBuf_[inBufPos_] = 0;
inBufPos_ = 0;
}
-// Traite un message du compteur.
+/// Traite un message de stats.
+void
+Asserv::handleStatMotor (void)
+{
+ if (inBufPos_ != 2 + 1 + 2 + 1 + 4 + 1 + 4)
+ {
+std::cout << "stat motor error" << std::endl;
+ // Mauvaise transmission.
+ return;
+ }
+ char side = inBuf_[2];
+ //int vacc = getSignedChar (inBuf_ + 2 + 1);
+ int e = getSignedShort (inBuf_ + 2 + 1 + 2 + 1);
+ int pwm = getSignedShort (inBuf_ + 2 + 1 + 2 + 1 + 4 + 1);
+}
+
+/// Traite un message du compteur.
void
Asserv::handleCounter (void)
{
@@ -337,7 +352,7 @@ std::cout << "counter error" << std::endl;
countRight_ = r;
}
-// Décode un mot signé (2 octets).
+/// Décode un mot signé (2 octets).
int
Asserv::getSignedShort (const char *s) const
{
@@ -346,10 +361,3 @@ Asserv::getSignedShort (const char *s) const
| hex2digit (s[2]) << 4
| hex2digit (s[3]));
}
-
-// Décode un chiffre hexa.
-int
-Asserv::hex2digit (char c) const
-{
- return (c >= '0' && c <= '9') ? c - '0' : c - 'a' + 10;
-}
diff --git a/2004/i/nono/src/motor/asserv.h b/2004/i/nono/src/motor/asserv.h
index d6f1da1..2736c78 100644
--- a/2004/i/nono/src/motor/asserv.h
+++ b/2004/i/nono/src/motor/asserv.h
@@ -29,27 +29,27 @@
#include <string>
#include <queue>
-// Class dont on doit dériver pour pouvoir recevoir les informations de la
-// carte d'asservissement.
+/// Classe dont on doit hériter pour pouvoir recevoir les informations de la
+/// carte d'asservissement.
class AsservTracker
{
public:
- // Appelée lors d'une mise à jour des compteurs.
+ /// Appelée lors d'une mise à jour des compteurs.
virtual void updateCounter (int l, int r) { }
};
+/// Classe de dialogue avec la carte d'asservissement.
class Asserv
{
// Ligne série.
Serial serial_;
std::string ttyname_;
+ int ttyspeed_;
// Paramètres.
int accel_, kp_, ki_, kd_;
bool statMotor_, counter_;
// File d'emmission.
std::queue<std::string> sendQueue_;
- // Table de conversion en hexa.
- static const char *hexaTbl_;
// Buffer de reception.
int inBufSize_, inBufPos_;
char *inBuf_;
@@ -59,25 +59,26 @@ class Asserv
// Objet interessé par les stats.
AsservTracker &asservTracker_;
public:
- // Constructeur.
+ /// Constructeur.
Asserv (AsservTracker &asservTracker);
- // Destructeur.
+ /// Destructeur.
~Asserv (void);
- // Reset la carte et envois les paramètres.
+ /// Reset la carte et envois les paramètres.
void reset (void);
- // Active l'asservissement.
+ /// Active l'asservissement.
void go (bool fl = true);
- // Stop !
+ /// Stop !
void stop (void);
- // Réglage de la vitesse.
+ /// Réglage de la vitesse.
void speed (int l, int r);
- // Teste si l'émission est terminée.
+ /// Teste si l'émission est terminée.
bool ok (void);
- // Attend que toute les émissions soit terminées.
+ /// Attend que toute les émissions soit terminées.
void waitOk (void);
- // Lit et traite les messages de la cartes.
+ /// Lit et traite les messages de la cartes.
void read (void);
- // Change les paramètres de la carte.
+ /// @{
+ /// Change les paramètres de la carte.
void setAccel (int accel);
int getAccel (void) { return accel_; }
void setKp (int kp);
@@ -85,22 +86,25 @@ class Asserv
void setKd (int kd);
void setStatMotor (bool fl = true);
void setCounter (bool fl = true);
+ /// @}
protected:
- // Envoie un message.
+ /// @{
+ /// Envoie un message.
void send (char com);
void send (char com, bool fl);
void send (char com, int a1);
void send (char com, int a1, int a2);
- // Renvois le dernier message.
+ /// @}
+ /// Renvois le dernier message.
void sendLast (void);
- // Traite un message.
+ /// Traite un message.
void handleMessage (void);
- // Traite un message du compteur.
+ /// Traite un message de stats.
+ void handleStatMotor (void);
+ /// Traite un message du compteur.
void handleCounter (void);
- // Décode un mot signé (2 octets).
+ /// Décode un mot signé (2 octets).
int getSignedShort (const char *s) const;
- // Décode un chiffre hexa.
- int hex2digit (char c) const;
};
#endif // asserv_h
diff --git a/2004/i/nono/src/motor/motor.cc b/2004/i/nono/src/motor/motor.cc
index d150688..9fc7c6c 100644
--- a/2004/i/nono/src/motor/motor.cc
+++ b/2004/i/nono/src/motor/motor.cc
@@ -31,7 +31,7 @@
// Pointeur vers l'instance unique.
Motor *Motor::instance_ = 0;
-// Constructeur.
+/// Constructeur.
Motor::Motor (void)
: asserv_ (*this),
s_ (1.0), vs_ (1.0), as_ (1.0),
@@ -55,14 +55,14 @@ Motor::Motor (void)
asserv_.reset ();
}
-// Destructeur.
+/// Destructeur.
Motor::~Motor (void)
{
instance_ = 0;
delete movement_;
}
-// Appelée lors d'une mise à jour des compteurs.
+/// Appelée lors d'une mise à jour des compteurs.
void
Motor::updateCounter (int l, int r)
{
@@ -78,7 +78,7 @@ Motor::updateCounter (int l, int r)
}
}
-// Choisi le mouvement en cours.
+/// Choisi le mouvement en cours.
void
Motor::setMovement (Movement *m)
{
@@ -87,7 +87,7 @@ Motor::setMovement (Movement *m)
m->init (tracker_, asserv_, *this);
}
-// Teste si les mouvements sont terminés.
+/// Teste si les mouvements sont terminés.
bool
Motor::end (void)
{
@@ -95,7 +95,7 @@ Motor::end (void)
return !movement_;
}
-// Attend la fin de tout les mouvements.
+/// Attend la fin de tout les mouvements.
void
Motor::waitEnd (void)
{
@@ -104,7 +104,7 @@ Motor::waitEnd (void)
} while (!end ());
}
-// Teste si les moteurs sont arrétés.
+/// Teste si les moteurs sont arrétés.
bool
Motor::stopped (void)
{
@@ -112,7 +112,7 @@ Motor::stopped (void)
return tracker_.stopped ();
}
-// Attend que les moteurs soient arrétés.
+/// Attend que les moteurs soient arrétés.
void
Motor::waitStopped (void)
{
@@ -121,7 +121,7 @@ Motor::waitStopped (void)
} while (!stopped ());
}
-// Paramètre la vitesse des moteurs.
+/// Paramètre la vitesse des moteurs.
void
Motor::speed (double l, double r)
{
@@ -162,14 +162,15 @@ std::cout << "motor speed " << l << ' ' << r << ' ' << vL << ' ' << vR << std::e
asserv_.speed (vL, vR);
}
-// Va vers un point, renvois faux si atteind.
+/// Va vers un point, renvois faux si atteind.
bool
Motor::goTo (double x, double y, double eps/*5.0*/)
{
return false;
}
-// Va vers un point, en formant un arc de cercle, renvois faux si atteind.
+/// Va vers un point, en formant un arc de cercle, renvois faux si atteind.
+/// \deprecated Utiliser goTo().
bool
Motor::goToArc (double x, double y, double eps/*5.0*/)
{
diff --git a/2004/i/nono/src/motor/motor.h b/2004/i/nono/src/motor/motor.h
index ddc32ee..7673534 100644
--- a/2004/i/nono/src/motor/motor.h
+++ b/2004/i/nono/src/motor/motor.h
@@ -28,52 +28,56 @@
#include "tracker.h"
#include "movement.h"
+/// Gestion des moteurs principaux du robot. Cette classe gére les
+/// déplacements simples (enfin pas si simple que ça) comme aller vers un
+/// point, atteindre un angle...
class Motor : public AsservTracker
{
- // Object d'asservissement.
+ /// Object d'asservissement.
Asserv asserv_;
- // Suiveur de position.
+ /// Suiveur de position.
Tracker tracker_;
- // Pointeur vers l'instance unique.
+ /// Pointeur vers l'instance unique.
static Motor *instance_;
- // Echelles (mm/unit, mm/s.unit, mm/s^2.unit).
+ /// Echelles (mm/unit, mm/s.unit, mm/s^2.unit).
double s_, vs_, as_;
- // Mouvement en cours.
+ /// Mouvement en cours.
Movement *movement_;
- // Vitesses maximale et minimale (unit).
+ /// Vitesses maximale et minimale (unit).
int maxSpeed_, minSpeed_;
public:
- // Constructeur.
+ /// Constructeur.
Motor (void);
- // Destructeur.
+ /// Destructeur.
virtual ~Motor (void);
- // Récupère l'instance unique.
+ /// Récupère l'instance unique.
static Motor &getInstance (void) { return *instance_; }
- // Appelée lors d'une mise à jour des compteurs.
+ /// Appelée lors d'une mise à jour des compteurs.
void updateCounter (int l, int r);
- // Choisi le mouvement en cours.
+ /// Choisi le mouvement en cours.
void setMovement (Movement *m);
- // Active l'asservissement.
+ /// Active l'asservissement.
void go (bool fl = true) { asserv_.go (fl); }
- // Teste si l'émission est terminée.
+ /// Teste si l'émission est terminée.
bool ok (void) { return asserv_.ok (); }
- // Attend que toute les émissions soit terminées.
+ /// Attend que toute les émissions soit terminées.
void waitOk (void) { asserv_.waitOk (); }
- // Teste si les mouvements sont terminés.
+ /// Teste si les mouvements sont terminés.
bool end (void);
- // Attend la fin de tout les mouvements.
+ /// Attend la fin de tout les mouvements.
void waitEnd (void);
- // Teste si les moteurs sont arrétés.
+ /// Teste si les moteurs sont arrétés.
bool stopped (void);
- // Attend que les moteurs soient arrétés.
+ /// Attend que les moteurs soient arrétés.
void waitStopped (void);
- // Récupère l'object tracker.
+ /// Récupère l'object tracker.
const Tracker &getTracker (void) const { return tracker_; }
- // Paramètre la vitesse des moteurs.
+ /// Paramètre la vitesse des moteurs.
void speed (double l, double r);
- // Va vers un point, renvois faux si atteind.
+ /// Va vers un point, renvois faux si atteind.
bool goTo (double x, double y, double eps = 5.0);
- // Va vers un point, en formant un arc de cercle, renvois faux si atteind.
+ /// Va vers un point, en formant un arc de cercle, renvois faux si atteind.
+ /// \deprecated Utiliser goTo().
bool goToArc (double x, double y, double eps = 5.0);
};
diff --git a/2004/i/nono/src/utils/Makefile.defs b/2004/i/nono/src/utils/Makefile.defs
index 34ca3dc..8f6dbda 100644
--- a/2004/i/nono/src/utils/Makefile.defs
+++ b/2004/i/nono/src/utils/Makefile.defs
@@ -1,4 +1,4 @@
LIBS += utils.a
-utils_a_SOURCES = rand.cc
+utils_a_SOURCES = rand.cc hexa.cc
utils.a: ${utils_a_SOURCES:%.cc=utils.a(%.o)}
diff --git a/2004/i/nono/src/utils/hexa.cc b/2004/i/nono/src/utils/hexa.cc
new file mode 100644
index 0000000..8a68aab
--- /dev/null
+++ b/2004/i/nono/src/utils/hexa.cc
@@ -0,0 +1,64 @@
+// hexa.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 "hexa.h"
+
+// Table de conversion en hexa.
+static const char *digit2hexTbl_ = "0123456789abcdef";
+
+// Table de conversion depuis l'hexa.
+static const int hex2digitTbl_[] =
+{
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 0-15 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 16-31 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 32-47 */
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, /* 48-63 */
+ -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 64-79 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 80-95 */
+ -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 96-111 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 112-127 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 128-143 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 144-159 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 160-175 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 176-191 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 192-207 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 208-223 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 224-239 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 240-255 */
+};
+
+/// Converti un caractère hexa (0-9a-f) en chiffre (0-15).
+int
+hex2digit (char c)
+{
+ return hex2digitTbl_[c];
+}
+
+/// Converti un chiffre (0-15) en hexa (0-9a-f).
+char
+digit2hex (char d)
+{
+ return digit2hexTbl_[d];
+}
+
diff --git a/2004/i/nono/src/utils/hexa.h b/2004/i/nono/src/utils/hexa.h
new file mode 100644
index 0000000..38a4ae5
--- /dev/null
+++ b/2004/i/nono/src/utils/hexa.h
@@ -0,0 +1,34 @@
+#ifndef hexa_h
+#define hexa_h
+// hexa.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.
+//
+// }}}
+
+/// Converti un caractère hexa (0-9a-f) en chiffre (0-15).
+int hex2digit (char c);
+
+/// Converti un chiffre (0-15) en hexa (0-9a-f).
+char digit2hex (char d);
+
+#endif // hexa_h