summaryrefslogtreecommitdiff
path: root/2005/i
diff options
context:
space:
mode:
Diffstat (limited to '2005/i')
-rw-r--r--2005/i/robert/src/es/es.cc58
-rw-r--r--2005/i/robert/src/es/es.hh16
-rw-r--r--2005/i/robert/src/motor/motor.cc153
-rw-r--r--2005/i/robert/src/motor/motor.hh32
4 files changed, 253 insertions, 6 deletions
diff --git a/2005/i/robert/src/es/es.cc b/2005/i/robert/src/es/es.cc
index b494d6d..b4aab7e 100644
--- a/2005/i/robert/src/es/es.cc
+++ b/2005/i/robert/src/es/es.cc
@@ -23,3 +23,61 @@
//
// }}}
+#include "es/es.hh"
+
+/// Constructeur
+Es::Es (const Config & config)
+ :proto_(*this), vitesseAsc(/*XXX*/), couleur(/*comment on la récup?*/), jackOut(/*idem*/)
+{
+ init();
+}
+
+void Es::init(void)
+{
+ // On reset l'AVR
+ proto_.send('z'); // XXX z = reset AVR
+ // on récup les données de couleur_ et de jackOut(mais comment??)
+ proto_.sync();
+}
+
+bool Es::stateJack(void)
+{
+ proto_.sync();
+ return jackOut_; // XXX Ou autre methode
+}
+
+bool Es::capteursContact(void)
+{
+ proto_.sync();
+ return stateCapteurs_;
+}
+
+levelAsc Es::stateAsc(void) // XXX Probleme dans le nom
+{
+ proto_sync();
+ return stateAsc_;
+}
+
+void Es::moveAsc(levelAsc niveau)
+{
+ proto.sync();
+ if(niveau == HAUT)
+ proto_.send('a',"b",2);
+ else if(niveau == MILIEU)
+ proto_.send('a',"b",1);
+ else
+ proto_.send('a',"b",0);
+ ascIdle_ == false;
+}
+
+void Es::ventouses(void)
+{
+ proto_.sync();
+ proto_.send('v');
+}
+
+void receive(char command, const Proto::Frame & frame)
+{
+ // XXX Voir comment on fait
+}
+
diff --git a/2005/i/robert/src/es/es.hh b/2005/i/robert/src/es/es.hh
index 5eebc46..4828c85 100644
--- a/2005/i/robert/src/es/es.hh
+++ b/2005/i/robert/src/es/es.hh
@@ -25,9 +25,15 @@
//
// }}}
+#include "proto/proto.hh"
+
+class Config;
+
/// Gère la carte es et ses capteurs et actionneurs
class Es : public Proto::Receiver
{
+ public:
+ typedef enum{HAUT, MILIEU, BAS} levelAsc;
private:
// Objet Proto de communication vers la carte es
Proto proto_;
@@ -35,6 +41,12 @@ class Es : public Proto::Receiver
int vitesseAsc_;
// couleur de notre camp (rouge/vert);
int couleur_;
+ // Etat du jack (false si entré, true si sortie)
+ bool jackOut_;
+ /// Etat des capteurs enculeurs de murs (true si enfoncés)
+ bool stateCapteurs_;
+ levelAsc stateAsc;
+ bool ascIdle_;
public:
/// Constructeur
@@ -46,13 +58,11 @@ class Es : public Proto::Receiver
/// Renvoie l'état des capteurs de contact(true si les 2 enfoncés)
bool capteursContact(void);
/// Renvoie la position de l'ascenceur(true en haut false en bas)
- bool stateAsc(void);
+ Es::levelAsc stateAsc(void); ///XXX au secours
/// Execute un déplacement de l'ascenceur
void moveAsc(bool monte);
/// Désactive les ventouses pour X secondes XXX vérifier la durées arg/config
void ventouses(void);
- /// Indique la position des ventouses(false quand désactivé)
- bool stateVentouses (void);
/// définition du receiver::receive
void receive(char command, const Proto::Frame & frame);
};
diff --git a/2005/i/robert/src/motor/motor.cc b/2005/i/robert/src/motor/motor.cc
index 6809acd..3b48104 100644
--- a/2005/i/robert/src/motor/motor.cc
+++ b/2005/i/robert/src/motor/motor.cc
@@ -23,3 +23,156 @@
//
// }}}
+#include "motor.hh"
+
+/// Constructeur
+Motor::Motor (const Config & config) // XXX Voir si besoin de config
+ :asserv_(config, *this), idle_(true)
+{
+}
+
+/// Initialise les moteurs
+void Motor::init (void)
+{
+ // on reset la carte
+ asserv_.reset();
+ // On stop le moteur
+ stop();
+ // on règle le rafraichissement des positions
+ asserv_.statPosition(1); /// XXX Le temps combien et réglé ou??
+ asserv_.statMotor(1);
+ // on remet les position à 0 XXX à 0?
+ posX_ = posY_ = posA_ = 0;
+ // on regarde si les moteurs sont idle
+ while (!idle()) {} // XXX humhum?
+}
+
+// Arrête les moteurs
+void Motor::stop(void)
+{
+ asserv_.setSpeed(0,0);
+ // XXX Peut-on lui dire d'oublier une commande?
+ while(!idle()){} ///XXX vaut mieux appeler la commande ou la var?
+}
+
+double Motor::getX(void)
+{
+ sync(); // XXX attendre true??
+ return posX_;
+}
+
+double Motor::getY(void)
+{
+ sync();
+ return posY_;
+}
+
+double Motor::getA(void)
+{
+ sync();
+ return posA_;
+}
+
+void Motor::goTo(double x, double y, double a)
+{
+ // XXX Méthode carré ou pas?
+}
+
+void Motor::recalage(void)
+{
+ // XXX je ne vois pas là
+}
+
+void Motor::setSpeed(double v)
+{
+ asserv_.setSpeed(v,v); /// XXX sur ca?
+ idle_ = false;
+ sync(); // XXX avant ou après?
+}
+
+bool Motor::idle(void)
+{
+ sync();
+ return idle_;
+}
+
+void Motor::linearMove(double d)
+{
+ sync();
+ asserv_.linearMove(d);
+ idle_ = false;
+}
+
+void Motor::rotation(double newA) //Est-ce un nouveau angle asb ou rel??
+{
+ sync();
+ asserv_.angularMove(newA);
+ idle_ = false;
+}
+
+bool Motor::sync(void)
+{
+ return asserv_.sync();
+}
+
+void Motor::receiveCounter (double lMotor, double rMotor)
+{
+ /// XXX que faire
+}
+
+void Motor::receivePosX (double xPos)
+{
+ posX_ = xPos;
+}
+
+void Motor::receivePosY (double yPos)
+{
+ posY_ = yPos;
+}
+
+void Motor::receivePosA (double aPos)
+{
+ posA_ = aPos;
+}
+
+void Motor::receiveSpeedStat (int leftError, int leftInt, int rightError,
+ int rightInt)
+{
+ if(leftInt == 0 && rightInt == 0) // XXX c'est bon ca?
+ idle_ = true;
+ else
+ idle_ = false;
+}
+
+void Motor::receivePwm (double leftPwm, double rightPwm)
+{
+ // XXX que faire??
+}
+
+void Motor::receiveTiming (int motorTimer4,
+ int motorTimer3, int motorTimer2,
+ int motorTimer1, int motorTimer0)
+{
+ // XXX Que faire???
+}
+
+void Motor::receiveInPort (int port)
+{
+ // XXX Que faire?
+}
+
+void Motor::receiveSharp (int sharp1, int sharp2, int sharp3)
+{
+ // XXX Que faire?
+}
+
+void Motor::receiveTazState(int state, int subState)
+{
+ // XXX Que faire?
+}
+
+void Motor::done (void)
+{
+ idle_ = true;
+ asserv_.finishAck();
+}
diff --git a/2005/i/robert/src/motor/motor.hh b/2005/i/robert/src/motor/motor.hh
index 22298e0..f81af49 100644
--- a/2005/i/robert/src/motor/motor.hh
+++ b/2005/i/robert/src/motor/motor.hh
@@ -26,14 +26,21 @@
// }}}
#include "config/config.hh"
+#include "asserv/asserv.hh"
/// Gère les moteurs de déplacement du robot
-class Motor
+class Motor : public Asserv::Receiver
{
private:
+ /// Communication avec l'asservissement
+ Asserv asserv_;
+ /// position
double posX_;
double posY_;
+ double posA_;
double speed_;
+ /// Etat des commandes
+ bool idle_;
public:
/// Constructeur
@@ -46,8 +53,10 @@ class Motor
double getX(void);
/// Renvoie la position Y
double getY(void);
+ /// Renvoie l'angle A
+ double getA(void);
/// Ammène le robot à la position x,y
- void goTo(double x, double y);
+ void goTo(double x, double y, double a);
/// Recale le robot
void recalage(void);
/// Règle la vitesse des moteurs
@@ -57,6 +66,23 @@ class Motor
/// Execute un déplacement linéaire
void linearMove(double d);
/// Execute une rotation(argument en radian)
- void rotation(double a);
+ void rotation(double newA);
+ /// Syncronisation
+ bool sync(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);
+ 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);
};
#endif // motor.hh