summaryrefslogtreecommitdiff
path: root/2003/i/buzz/src/motor/motor.h
blob: a51b140d667b32bc4b49b3d2323b9bdfd3bc197e (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
#ifndef motor_h
#define motor_h
// motor.h
// buzz - Programme du robot Efrei Robotique I1-I2 2003
// Copyright (C) 2003 Nicolas Schodet

#include "serial/serial.h"

class Motor
{
    Serial m_serial;
    // Buffer d'entr�e.
    char m_recv_buf[64];
    int m_recv_n;
    // Param�tre vitesse/acceleration.
    int m_accel, m_speed;
    int m_raccel, m_rspeed;
    int m_inf_accel, m_inf_speed;
    int m_inf_raccel, m_inf_rspeed;
    // Param�tres g�om�triques.
    int m_ed2;
    double m_factor, m_rfactor;
    // Operations en cours.
    bool m_running;
    char m_last_com;
    int m_last_a1, m_last_a2, m_last_a3;
    // Calcul de position.
    double m_x, m_y, m_dir;
    // Capteurs.
    char m_capteurs;
    bool m_capteursFetch;
    // Servo.
    bool m_servoFinnish;
    // Distance effectu�e.
    int m_doneG, m_doneD;
    int m_doneGs, m_doneDs;
    // Instance unique.
    static Motor *m_instance;
  public:
    // Constructeur.
    Motor (void);
    // Destructeur.
    ~Motor (void);
    // Change la position courante.
    void setPos (double x, double y);
    // Change la position courante.
    void setPos (double x, double y, double dir);
    // R�cup�re la position courante. TODO: valider avec une date.
    void getPos (double &x, double &y, double &dir);
    // Retourne une r�f�rence vers l'instance unique.
    static Motor &getInstance (void) { return *m_instance; }
    // Avance d'une distance d, � la vitesse s.
    void goDistance (int d, int s = -1);
    // Tourne d'un angle d, � la vitesse s.
    void turnAngle (int d, int s = -1);
    // Avance ind�finiment � la vitesse s.
    void go (int s = 0);
    // Avance ind�finiment � la vitesse sg et sd, respectivement pour le
    // moteur gauche et droit.
    void go (int sg, int sd);
    // Tourne ind�finiment � la vitesse s.
    void turn (int s = 0);
    // Avance ind�finiment en tournant � la vitesse max s, de rayon r.
    void goTurn (int s, int r);
    // Stoppe.
    void stop (void);
    // Stop progressif.
    void stopp (void);
    // Reset.
    void reset (void);
    // Retourne true si la commande est termin�e.
    bool finnish (void) { readMsg (); return !m_running; }
    // Traite les message entrants.
    void readMsg (void);
    // Traite l'information de bouclage.
    void readTicks (int g, int d);
    // Demande les infos capteurs.
    void fetchCapteurs (void);
    // Retourne les infos capteurs.
    int getCapteurs (void);
    // G�re les servos.
    void setServo (int s);
    // Attend le top d�part.
    void waitRound (void);
    // R�cup�re la distance parcouru.
    int getDone (void);
    // M�morise la distance parcourue pour le moment.
    void setDone (void);
  private:
    // Envoie une commande.
    void send (char com, int a1 = -1, int a2 = -1, int a3 = -1);
    // Traite des �ventuels retours, retourne true si commande finie.
    bool recv (void);
};

#endif // motor_h