From d201c6b9e46b79b6dabb5a7cd753b95c108c0915 Mon Sep 17 00:00:00 2001 From: schodet Date: Thu, 22 May 2003 18:02:01 +0000 Subject: Ajoute des cli/sti. Lecture du fichier de conf pour les servos. Capteurs. --- 2003/i/buzz/src/busp/Makefile.defs | 3 +- 2003/i/buzz/src/busp/busp.h | 5 +++- 2003/i/buzz/src/busp/busp_capteurs.cc | 36 ++++++++++++++++++++++ 2003/i/buzz/src/busp/busp_capteurs.h | 25 ++++++++++++++++ 2003/i/buzz/src/busp/busp_ir.h | 2 +- 2003/i/buzz/src/busp/busp_servo.cc | 28 +++++++++++++++++- 2003/i/buzz/src/busp/busp_servo.h | 9 ++++-- 2003/i/buzz/src/busp/test_busp.cc | 56 ++++++++++++++++++++++++++++++----- 8 files changed, 151 insertions(+), 13 deletions(-) create mode 100644 2003/i/buzz/src/busp/busp_capteurs.cc create mode 100644 2003/i/buzz/src/busp/busp_capteurs.h (limited to '2003') diff --git a/2003/i/buzz/src/busp/Makefile.defs b/2003/i/buzz/src/busp/Makefile.defs index 4e2d12c..1477ac9 100644 --- a/2003/i/buzz/src/busp/Makefile.defs +++ b/2003/i/buzz/src/busp/Makefile.defs @@ -1,4 +1,5 @@ TARGETS += test_busp -test_busp_SOURCES = busp.cc busp_ir.cc busp_servo.cc test_busp.cc erreur.a +test_busp_SOURCES = busp.cc busp_ir.cc busp_servo.cc busp_capteurs.cc \ + test_busp.cc erreur.a test_busp: $(test_busp_SOURCES:%.cc=%.o) diff --git a/2003/i/buzz/src/busp/busp.h b/2003/i/buzz/src/busp/busp.h index 763665e..c56219b 100644 --- a/2003/i/buzz/src/busp/busp.h +++ b/2003/i/buzz/src/busp/busp.h @@ -5,6 +5,7 @@ // Copyright (C) 2003 Nicolas Schodet #include "busp_ir.h" #include "busp_servo.h" +#include "busp_capteurs.h" // Gère le busp coté hard. class Busp @@ -12,6 +13,7 @@ class Busp int m_fd; BuspIr m_ir; BuspServo m_servo; + BuspCapteurs m_capteurs; static Busp *m_instance; public: volatile int irqs; @@ -30,12 +32,13 @@ class Busp // Lire sur le bus. int read (int addr); // Reset les périphériques. - void reset (void) { write (0, 0); } + void reset (void) { cli (); write (0, 0); sti (); } // Retourne une référence sur l'instance unique. static Busp &getInstance (void) { return *m_instance; } // Retourne une référence sur un module. BuspIr &getIr (void) { return m_ir; } BuspServo &getServo (void) { return m_servo; } + BuspCapteurs &getCapteurs (void) { return m_capteurs; } }; diff --git a/2003/i/buzz/src/busp/busp_capteurs.cc b/2003/i/buzz/src/busp/busp_capteurs.cc new file mode 100644 index 0000000..ce135f8 --- /dev/null +++ b/2003/i/buzz/src/busp/busp_capteurs.cc @@ -0,0 +1,36 @@ +// busp_capteurs.cc +// buzz - Programme du robot Efrei Robotique I1-I2 2003 +// Copyright (C) 2003 Nicolas Schodet +// +#include "busp_capteurs.h" +#include "busp.h" + +#include + +// Constructeur. +BuspCapteurs::BuspCapteurs () +{ + m_capteurs = 0; +} + +// Destructeur. +BuspCapteurs::~BuspCapteurs () +{ +} + +// Traite une interruption. +void +BuspCapteurs::irq (void) +{ + m_capteurs = Busp::getInstance ().read (m_address); +} + +// Sort les informations. +void +BuspCapteurs::dump (void) +{ + for (int i = 1; i < 0x100; i <<= 1) + { + cout << (m_capteurs & i ? '#' : '_') << ' '; + } +} diff --git a/2003/i/buzz/src/busp/busp_capteurs.h b/2003/i/buzz/src/busp/busp_capteurs.h new file mode 100644 index 0000000..87f1aae --- /dev/null +++ b/2003/i/buzz/src/busp/busp_capteurs.h @@ -0,0 +1,25 @@ +#ifndef busp_capteurs_h +#define busp_capteurs_h +// busp_capteurs.h +// buzz - Programme du robot Efrei Robotique I1-I2 2003 +// Copyright (C) 2003 Nicolas Schodet + +class BuspCapteurs +{ + public: + static const unsigned char m_irqMask = 0x04; + private: + static const int m_address = 2; + unsigned char m_capteurs; + public: + // Constructeur. + BuspCapteurs (); + // Destructeur. + ~BuspCapteurs (); + // Traite une interruption. + void irq (void); + // Sort les informations. + void dump (void); +}; + +#endif // busp_capteurs_h diff --git a/2003/i/buzz/src/busp/busp_ir.h b/2003/i/buzz/src/busp/busp_ir.h index 1269215..2723ee6 100644 --- a/2003/i/buzz/src/busp/busp_ir.h +++ b/2003/i/buzz/src/busp/busp_ir.h @@ -7,7 +7,7 @@ class BuspIr { public: - static const unsigned char m_irqMask = 0x10; + static const unsigned char m_irqMask = 0x01; private: static const int m_address = 3; unsigned char m_irmap[256]; diff --git a/2003/i/buzz/src/busp/busp_servo.cc b/2003/i/buzz/src/busp/busp_servo.cc index 1cef0c4..ae1536f 100644 --- a/2003/i/buzz/src/busp/busp_servo.cc +++ b/2003/i/buzz/src/busp/busp_servo.cc @@ -4,12 +4,27 @@ // #include "busp_servo.h" #include "busp.h" +#include "erreur.h" + +#include // Constructeur. BuspServo::BuspServo () { - for (int i = 0; i < 8; ++i) + // Position de départ. + for (int i = 0; i < m_nbServo; ++i) m_pos[i] = 127; + // Lectures des positions préprogrammées. + ifstream rc ("rc/busp/servo"); + for (int i = 0; i < m_nbPositions; ++i) + for (int s = 0; s < m_nbServo; ++s) + { + m_ppos[i][s] = -1; + rc >> m_ppos[i][s]; + } + // Vérifie les erreurs. + if (rc.bad ()) + throw ErreurFatale ("Impossible d'ouvrir `rc/busp/servo'\n"); } // Bouge le servo N en POS. @@ -26,6 +41,15 @@ BuspServo::move (int n, int diff) set (n, m_pos[n & 0x07] + diff); } +// Déplace les servos pour atteindre une position. +void +BuspServo::position (int p) +{ + for (int s = 0; s < m_nbServo; ++s) + if (m_ppos[p][s] != -1) + set (s, m_ppos[p][s]); +} + // Fait le déplacement effectif. void BuspServo::set (int n, int pos) @@ -34,6 +58,8 @@ BuspServo::set (int n, int pos) else if (pos < 0) pos = 0; n &= 0x07; m_pos[n] = pos; + Busp::getInstance ().cli (); Busp::getInstance ().write (m_address, n); Busp::getInstance ().write (m_address, pos); + Busp::getInstance ().sti (); } diff --git a/2003/i/buzz/src/busp/busp_servo.h b/2003/i/buzz/src/busp/busp_servo.h index 764293b..1545034 100644 --- a/2003/i/buzz/src/busp/busp_servo.h +++ b/2003/i/buzz/src/busp/busp_servo.h @@ -6,8 +6,11 @@ class BuspServo { - static const int m_address = 2; - int m_pos[8]; + static const int m_address = 1; + static const int m_nbServo = 8; + static const int m_nbPositions = 10; + int m_pos[m_nbServo]; + int m_ppos[m_nbPositions][m_nbServo]; public: // Constructeur. BuspServo (); @@ -15,6 +18,8 @@ class BuspServo void moveTo (int n, int pos); // Bouge le servo N de DIFF. void move (int n, int diff); + // Déplace les servos pour atteindre une position. + void position (int p); private: // Fait le déplacement effectif. void set (int n, int pos); diff --git a/2003/i/buzz/src/busp/test_busp.cc b/2003/i/buzz/src/busp/test_busp.cc index a63417b..9feaeaa 100644 --- a/2003/i/buzz/src/busp/test_busp.cc +++ b/2003/i/buzz/src/busp/test_busp.cc @@ -13,6 +13,9 @@ // Mode de controle des servos. void testServos (void); +// Mode capteurs. +void testCapteurs (void); + int main (int argc, char **argv) { @@ -26,7 +29,9 @@ main (int argc, char **argv) // Ecriture. addr = strtol (argv[1], 0, 0); data = strtol (argv[2], 0, 0); + busp.cli (); busp.write (addr, data); + busp.sti (); break; case 2: if (strcmp (argv[1], "irq") == 0) @@ -41,6 +46,11 @@ main (int argc, char **argv) // Passe en mode contrôle servos. testServos (); } + else if (strcmp (argv[1], "capteurs") == 0) + { + // Passe en mode capteurs. + testCapteurs (); + } else if (strcmp (argv[1], "reset") == 0) { // Ne fait rien, juste reset. @@ -51,14 +61,28 @@ main (int argc, char **argv) { // Lecture. addr = strtol (argv[1], 0, 0); + busp.cli (); + busp.read (addr); + busp.sti (); } break; default: - cerr << argv[0] << ": teste le bus parallèle." << endl - << "\t" << argv[0] << " []" << endl - << "\t" << argv[0] << " reset" << endl - << "\t" << argv[0] << " irq" << endl - << "\t" << argv[0] << " servo" << endl; + if (argc >= 4 && strcmp (argv[1], "servo") == 0 && argc % 2 == 0) + { + for (int i = 2; i < argc; i += 2) + { + busp.getServo ().moveTo (atoi (argv[i]), + atoi (argv[i + 1])); + } + } + else + { + cerr << argv[0] << ": teste le bus parallèle." << endl + << "\t" << argv[0] << " []" << endl + << "\t" << argv[0] << " reset" << endl + << "\t" << argv[0] << " irq" << endl + << "\t" << argv[0] << " servo [servo pos...]" << endl; + } return 1; } } @@ -78,8 +102,9 @@ testServos (void) int diff, servo = 0; cout << "Mode servos\n" "0-9 : choix du servo.\n" - "y : -1, h : +1, u : -1, j : +1, i : -20, k : +20\n" - "r : reset, g : goto \n"; + "y : -1, h : +1, u : -5, j : +5, i : -20, k : +20\n" + "r : reset, g : goto \n" + "p : position préprogrammée\n"; while (!cin.eof ()) { cin >> c; @@ -125,9 +150,26 @@ testServos (void) cin >> pos; Busp::getInstance ().getServo ().moveTo (servo, pos); } + else if (c == 'p') + { + int pos; + cin >> pos; + Busp::getInstance ().getServo ().position (pos); + } else if (c == 'r') { Busp::getInstance ().reset (); } } } + +// Mode capteurs. +void +testCapteurs (void) +{ + while (1) + { + Busp::getInstance ().getCapteurs ().dump (); + sleep (1); + } +} -- cgit v1.2.3