summaryrefslogtreecommitdiff
path: root/i/marvin/src/asserv/asserv.hh
diff options
context:
space:
mode:
Diffstat (limited to 'i/marvin/src/asserv/asserv.hh')
-rw-r--r--i/marvin/src/asserv/asserv.hh160
1 files changed, 160 insertions, 0 deletions
diff --git a/i/marvin/src/asserv/asserv.hh b/i/marvin/src/asserv/asserv.hh
new file mode 100644
index 0000000..4064537
--- /dev/null
+++ b/i/marvin/src/asserv/asserv.hh
@@ -0,0 +1,160 @@
+#ifndef asserv_hh
+#define asserv_hh
+// asserv.hh
+// robert - programme du robot 2005 {{{
+//
+// Copyright (C) 2005 Nicolas Haller
+//
+// Robot APB Team/Efrei 2005.
+// 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 "utils/non_copyable.hh"
+#include "config/config.hh"
+#include "proto/proto.hh"
+#include "log/log.hh"
+
+/// Classe de dialogue avec la carte d'asservissement.
+class Asserv : public NonCopyable, public Proto::Receiver
+{
+ public:
+ /// Les clients de Asserv doivent dériver de Receiver.
+ class Receiver
+ {
+ public:
+ virtual ~Receiver(void){};
+ /// Recoit un packet.
+ virtual void receiveCounter (double lMotor, double rMotor) = 0;
+ virtual void receivePosX (double xPos) = 0;
+ virtual void receivePosY (double yPos) = 0;
+ virtual void receivePosA (double aPos) = 0;
+ virtual void receiveSpeedStat (int leftError, int leftInt, int rightError, int rightInt) = 0;
+ virtual void receivePwm (double leftPwm, double rightPwm) = 0;
+ virtual void receiveTiming (int motorTimer4,
+ int motorTimer3, int motorTimer2,
+ int motorTimer1,
+ int motorTimer0 ) = 0;
+ virtual void receiveInPort (int port) = 0;
+ virtual void receiveSharp (int sharp1, int sharp2, int sharp3) = 0;
+ virtual void receiveTazState(int state, int subState){}; // XXX Vérifier les formats
+ virtual void done (void) = 0;
+ };
+
+ private:
+
+ // Communication avec l'AVR
+ Proto proto_;
+ std::string ttyName_;
+ Receiver & receiver_;
+ // Paramètre de l'avr
+ int footing_; //truc
+ double epsilon_; //mm
+ int accel_; //unité AVR
+ int kp_;
+ int ki_;
+ int kd_;
+ int eSat_;
+ int speedIntMax_;
+ int dSample_;
+ int maxSLin_;//unité AVR
+ int maxSRot_;
+ bool leftInvPwm_, rightInvPwm_;
+ bool useTazFSM_;
+ // Stat
+ int pCounter_;
+ int pPosition_;
+ int pMotor_;
+ int pPwm_;
+ int pTiming_;
+ int pStatInPort_;
+ int pSharp_;
+
+ // Unités
+ double mmPpas_;
+ double sPperiod_;
+ int pwmMax_;
+
+ // Système de log.
+ Log log_;
+ public:
+ /// Constructeur.
+ Asserv (const Config & config, Asserv::Receiver & receiver);
+ /// Reset la carte et envois les paramètres.
+ void reset (void);
+ /// Essaie de purger la liste d'émission et indique si elle est vide.
+ bool sync (void);
+ /// Attend que toute les émissions soit terminées.
+ bool wait (int timeout = -1);
+ /// Récupère le File Descriptor
+ int getFd(void);
+ /// Commandes asservissement
+ void linearMove(double distance);
+ void angularMove(double angle);
+ void goToPosition(double xPos, double yPos);
+ void fuckTheWall(double speed);
+ void fuckTheWall(int speed);
+ void setSpeed(double xSpeed, double ySpeed);
+ void setSpeed(int xSpeed = 0, int ySpeed = 0);
+ void setPwm(int leftPwm = 0, int rightPwm = 0);
+ void finishAck(void); //met le paramètre F à 0
+ /// Statistiques
+ void statCounter(int period = 0);
+ void statPosition(int period = 0);
+ void statMotor(int period = 0);
+ void statPwm(int period = 0);
+ void statTiming(int period = 0);
+ void statInPort(int period = 0);
+ void statSharp(int period = 0);
+ //@{
+ /// Change les paramètres de la carte.
+ void setXPos(double pos);
+ void setYPos(double pos);
+ void setAngle(double angle);
+ void setFooting(int16_t dist);
+ void setEpsilon(double e);
+ void setKp (int kp);
+ void setKi (int ki);
+ void setKd (int kd);
+ void setESat (int eSat);
+ void setSpeedIntMax (int maxInt);
+ void setDSample(int dSample);
+ void setAccel (int accel);
+ double getAccel (void);
+ void setMaxSpeed(int maxSLin, int maxSRot);
+ int getMaxLSpeed(void);
+ void setUseTazFSM(bool use);
+ void setInvPwm(bool leftInvPwm, bool rightInvPwm);
+ //@}
+
+ /// implémentation du proto::Receiver
+ void receive (char command, const Proto::Frame &frame);
+
+ private:
+ /// Charge les données de la classe config
+ void loadConfig(const Config & config);
+ /// Fonctions de conversion
+ int mm2pas(double dist, bool format24eme = false); //Format 24/8 ou 8
+ int radTo256(double angle, bool format24eme = false); //Format 8 ou 8/24
+ int mms2ppp(double vitesse); // Format 8
+ int rCycl2Pwm(double rCycl); // Format 16
+ int s2period(double period); // Format 8
+ //int mmps2ppperiod(double accel); //Format 8 (1 vitesse par x period)
+};
+
+#endif // asserv_hh