summaryrefslogtreecommitdiff
path: root/2004/i/nono/src/motor/asserv.h
blob: aa3932410a4bf2f8bfe577b0666f2e9c7a0a03a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#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 <string>
#include <queue>

/// 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_;
    bool counter_;
    bool posAsserv_;
    int gpiDelay_;
    bool asserv_;
    int zeroEps_;
    bool noSetParam_;
    // File d'emmission.
    std::queue<std::string> sendQueue_;
    // Buffer de reception.
    int inBufSize_, inBufPos_;
    char *inBuf_;
    // Anci�nne valeur des compteur.
    bool firstCounter_;
    int countLeft_, countRight_;
    // Valeur de l'entr�e GPI.
    unsigned int gpi_;
    // 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 (bool fl = true);
    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