#ifndef asserv_h #define asserv_h // asserv.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. // // }}} #include "serial/serial.h" #include "logger/log.h" #include #include /// 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. /// l, r : mise à jour moteur gauche et droit (unit). /// zero : vrai si le mouvement est à considérer comme nul. virtual void updateCounter (int l, int r, bool zero) { } }; /// 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_; int statMotor_; int counter_; bool posAsserv_; int gpiDelay_; bool asserv_; int zeroEps_; bool noSetParam_; // File d'emission. std::queue sendQueue_; static const int recvTimeout_ = 500; int lastSent_; // Buffer de reception. int inBufSize_, inBufPos_; char *inBuf_; // Anciènne valeur des compteur. bool firstCounter_; int countLeft_, countRight_; int countLeftSum_, countRightSum_; // Valeurs GPIO. unsigned int gpi_; unsigned int gpo_; // Objet interessé par les stats. AsservTracker &asservTracker_; // Système de log. Log log_; public: /// Constructeur. Asserv (AsservTracker &asservTracker); /// Destructeur. ~Asserv (void); /// Reset la carte et envois les paramètres. void reset (void); /// Paramètre la carte d'asservissement. void setParam (void); /// Stop ! void stop (void); /// Réglage de la vitesse. void speed (int l, int r); /// Teste si l'émission est terminée. bool ok (void); /// Attend que toute les émissions soit terminées. void waitOk (void); /// Lit et traite les messages de la cartes. void read (void); //@{ /// Change les paramètres de la carte. void setAccel (int accel); void setKp (int kp); void setKi (int ki); void setKd (int kd); void setStatMotor (int delay); void setCounter (int delay); void setPosAsserv (bool fl = true); void setGpiDelay (int delay); void setAsserv (bool fl = true); //@} /// Get factor to deduce speed scale from scale. double getSpeedFactor (void) const; /// Get factor to deduce accel scale from scale. double getAccelFactor (void) const; /// Récupère l'entrée GPI. unsigned int getGpi (void) const { return gpi_; } /// Envois la sortie GPO. void sendGpo (unsigned int gpo); protected: /// @{ /// 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); /// @} /// Envois le message à la carte. void send (const std::string &m); /// Renvois le dernier message. void sendLast (void); /// Traite un message. void handleMessage (void); /// Traite un message de stats. void handleStatMotor (void); /// Traite un message du compteur. void handleCounter (void); /// Traite les GPI. void handleGpi (void); }; #endif // asserv_h