summaryrefslogtreecommitdiff
path: root/i/marvin/src/motor/motor.hh
diff options
context:
space:
mode:
Diffstat (limited to 'i/marvin/src/motor/motor.hh')
-rw-r--r--i/marvin/src/motor/motor.hh142
1 files changed, 43 insertions, 99 deletions
diff --git a/i/marvin/src/motor/motor.hh b/i/marvin/src/motor/motor.hh
index 1325c64..509ed8b 100644
--- a/i/marvin/src/motor/motor.hh
+++ b/i/marvin/src/motor/motor.hh
@@ -1,9 +1,9 @@
#ifndef motor_hh
#define motor_hh
// motor.hh
-// robert - programme du robot 2005 {{{
+// marvin - programme du robot 2006. {{{
//
-// Copyright (C) 2005 Nicolas Haller
+// Copyright (C) 2006 Nicolas Schodet
//
// Robot APB Team/Efrei 2005.
// Web: http://assos.efrei.fr/robot/
@@ -13,7 +13,7 @@
// 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
@@ -24,104 +24,48 @@
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// }}}
-
#include "asserv/asserv.hh"
-#include <queue>
-
-/// Gère les moteurs de déplacement du robot
+/// Handle movements.
class Motor : public Asserv::Receiver
{
- struct ordre
- {
- // Ordre (true pour linéaire, false pour rotation
- bool ordre_;
- double arg_;
- // Constructeur
- ordre(bool ordre, double arg) { ordre_ = ordre; arg_ = arg; }
- };
- private:
- /// Communication avec l'asservissement
- Asserv asserv_;
- /// Système de log
- Log log_;
- /// Pile de commande
- std::queue<ordre> fOrdre_;
- /// position
- double posX_;
- double posY_;
- double posA_;
- double speed_;
- /// Etat des commandes
- bool idle_;
- /// Drapeau pour quand on a reçu un F
- bool doneDone_;
- /// Drapeau levé quand on a envoyé un "Ta Gueule"
- bool f0Sended_;
- /// Paramètre de conf
- int pStatPosition_;
- int pStatMotor_;
- /// Etat du port d'entrée
- int pinState_;
- bool pinUpdated_;
-
- public:
- /// Constructeur
- Motor (void);
- /// Initialise les moteurs
- void init(void);
- ///Arrête les moteurs
- void stop(void);
- /// Renvoie la position X
- double getX(void);
- /// Renvoie la position Y
- double getY(void);
- /// Renvoie l'angle A
- double getA(void);
- /// On set les positions dans l'avr
- void setPosition(double x, double y, double a);
- /// Ammène le robot à la position x,y
- void goTo(double x, double y, double a);
- /// Recale le robot
- void recalage(void);
- /// Indique si les moteurs sont occupé ou non
- bool idle (void);
- /// Execute un déplacement linéaire
- void linearMove(double d);
- /// Execute une rotation(argument en radian)
- void rotation(double newA);
- /// set de la vitesse des moteurs
- void setMaxSpeed(int maxLspeed, int maxRspeed);
- /// set de l'acceleration des moteurs
- void setAccel(int accel);
- /// récupère la vitesse linéaire maximum
- int getMaxLSpeed(void);
- /// Syncronisation
- bool sync(void);
- /// On attend...
- bool wait(int timeout = -1);
- /// Récupère le File Descriptor
- int getFd(void);
- /// Retoure l'état du jack (false entrée et true sortie)
- bool jackState(void);
- /// Retourne la couleur selectionné
- bool colorState (void);
- /// déclaration des fonctions de receiver
- void receiveCounter (double lMotor, double rMotor);
- void receivePosX (double xPos);
- void receivePosY (double yPos);
- void receivePosA (double aPos);
- void receiveSpeedStat (int leftError, int leftInt, int rightError,
- int rightInt);
- void receivePwm (double leftPwm, double rightPwm);
- // Défini les valeurs de la PWM
- void setPwm(int leftPwm = 0, int rightPwm = 0);
- void receiveTiming (int motorTimer4,
- int motorTimer3, int motorTimer2,
- int motorTimer1, int motorTimer0);
- void receiveInPort (int port);
- void receiveSharp (int sharp1, int sharp2, int sharp3);
- void receiveTazState(int state, int subState); // XXX Vérifier les formats
- void done (void);
+ private:
+ Asserv asserv_;
+ int seq_;
+ bool finish_;
+ double x_, y_, a_;
+ public:
+ /// Constructor.
+ Motor (void);
+ /// Try to empty emission queue, return true if empty.
+ bool sync (void) { return asserv_.sync (); }
+ /// Wait until emission queue is empty or timed out.
+ bool wait (int timeout = -1) { return asserv_.wait (timeout); }
+ /// Get asserv reference to change parameters.
+ Asserv &getAsserv (void) { return asserv_; }
+ /// True if last long move is finished.
+ bool finish (void) const { return finish_; }
+ /// Linear and angular move. T(mm) is the linear distance. A(mm) is the
+ /// angular distance which means the arc length.
+ void move (double t, double a);
+ /// Rotate (rad).
+ void rotate (double a);
+ /// Find a hole.
+ void findHole (void);
+ /// Stop now.
+ void stop (void);
+ private:
+ /// Next seq number.
+ inline void nextSeq (void);
+ /// Implement Asserv::Receiver callbacks.
+ void receiveAck (int seq);
+ void receiveCounterStat (int l, int r);
+ void receivePos (double x, double y, double a);
+ void receiveSpeedStat (int t, int a);
+ void receivePosStat (int te, int ti, int ae, int ai);
+ void receivePwmStat (int l, int r);
+ void receiveTimerStat (const int *t, int tn);
+ void receiveInPort (unsigned int port);
};
-#endif // motor.hh
+
+#endif // motor_hh