summaryrefslogtreecommitdiff
path: root/2003
diff options
context:
space:
mode:
authorschodet2003-05-22 18:02:01 +0000
committerschodet2003-05-22 18:02:01 +0000
commitd201c6b9e46b79b6dabb5a7cd753b95c108c0915 (patch)
treeb39117bb658ba4c072d97c92196f79c10ea11de0 /2003
parent524be5fa549d7c598740b53aeda1c4432d546b01 (diff)
Ajoute des cli/sti.
Lecture du fichier de conf pour les servos. Capteurs.
Diffstat (limited to '2003')
-rw-r--r--2003/i/buzz/src/busp/Makefile.defs3
-rw-r--r--2003/i/buzz/src/busp/busp.h5
-rw-r--r--2003/i/buzz/src/busp/busp_capteurs.cc36
-rw-r--r--2003/i/buzz/src/busp/busp_capteurs.h25
-rw-r--r--2003/i/buzz/src/busp/busp_ir.h2
-rw-r--r--2003/i/buzz/src/busp/busp_servo.cc28
-rw-r--r--2003/i/buzz/src/busp/busp_servo.h9
-rw-r--r--2003/i/buzz/src/busp/test_busp.cc56
8 files changed, 151 insertions, 13 deletions
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 <iostream>
+
+// 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 <fstream>
// 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] << " <adresse> [<donnée>]" << 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] << " <adresse> [<donnée>]" << 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<pos> : goto <pos>\n";
+ "y : -1, h : +1, u : -5, j : +5, i : -20, k : +20\n"
+ "r : reset, g<pos> : goto <pos>\n"
+ "p<pos> : 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);
+ }
+}