summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschodet2003-04-03 14:28:50 +0000
committerschodet2003-04-03 14:28:50 +0000
commitdc3b7e0fd76846cd99fc68b3ba008c5efe2579e6 (patch)
tree53d980ff1014002568a2d6f552829f8569936722
parent55ef0ba343a4865cd927aee38a316f5e2a07aaf7 (diff)
Initial revision
-rw-r--r--2003/i/buzz/src/busp/busp.cc89
-rw-r--r--2003/i/buzz/src/busp/busp.h29
-rw-r--r--2003/i/buzz/src/erreur/erreur.cc18
-rw-r--r--2003/i/buzz/src/erreur/erreur.h25
4 files changed, 161 insertions, 0 deletions
diff --git a/2003/i/buzz/src/busp/busp.cc b/2003/i/buzz/src/busp/busp.cc
new file mode 100644
index 0000000..4c2b03e
--- /dev/null
+++ b/2003/i/buzz/src/busp/busp.cc
@@ -0,0 +1,89 @@
+// busp.cc
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+//
+#include "busp.h"
+#include "kernel/pbus.h"
+
+#include "erreur/erreur.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <signal.h>
+
+#define BUSP_FILE "/dev/robotbusp"
+
+// Initialise le busp, open (), signal ().
+Busp::Busp ()
+{
+ // Ouvre le périphérique.
+ m_fd = open (BUSP_FILE, O_RDONLY);
+ if (m_fd == -1)
+ throw ErreurFatale ("Impossible d'ouvrir le périphérique du bus"
+ " parallèle.\n");
+ // Paramètre le handler de signaux.
+ struct sigaction sa;
+ sa.sa_handler = irq;
+ sigemptyset (&sa.sa_mask);
+ sa.sa_flags = SA_RESTART;
+ sigaction (SIGUSR1, &sa, 0); // Il n'y aura pas d'erreur, cf doc.
+ // Active les interruptions.
+ sti ();
+}
+
+// Destructeur.
+Busp::~Busp ()
+{
+ // Désactive les interruptions.
+ cli ();
+ // Ignore les signaux, on sait jammais.
+ struct sigaction sa;
+ sa.sa_handler = SIG_IGN;
+ sigemptyset (&sa.sa_mask);
+ sa.sa_flags = SA_RESTART;
+ sigaction (SIGUSR1, &sa, 0);
+ // Ferme le périphérique.
+ close (m_fd);
+}
+
+// Active les interruptions.
+void
+Busp::sti (void)
+{
+ //ioctl (m_fd, PBUS_INTENABLE);
+}
+
+// Désactive les interruptions.
+void
+Busp::cli (void)
+{
+ //ioctl (m_fd, PBUS_INTENABLE);
+}
+
+// Traite le signal envoyé par le kernel lors d'une interruption.
+void
+Busp::irq (int sig)
+{
+ // Récupère le numéro d'intéruption.
+}
+
+// Ecrire sur le bus.
+void
+Busp::write (int addr, int data)
+{
+ struct pbus_io io;
+ io.addr = addr;
+ io.data = data;
+ ioctl (m_fd, PBUS_WRITE, &io);
+}
+
+// Lire sur le bus.
+int
+Busp::read (int addr)
+{
+ struct pbus_io io;
+ io.addr = addr;
+ ioctl (m_fd, PBUS_READ, &io);
+ return io.data;
+}
+
diff --git a/2003/i/buzz/src/busp/busp.h b/2003/i/buzz/src/busp/busp.h
new file mode 100644
index 0000000..767ac27
--- /dev/null
+++ b/2003/i/buzz/src/busp/busp.h
@@ -0,0 +1,29 @@
+#ifndef busp_h
+#define busp_h
+// busp.h
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+
+// Gère le busp coté hard.
+class Busp
+{
+ int m_fd;
+ public:
+ // Initialise le busp, open (), signal ().
+ Busp ();
+ // Destructeur.
+ ~Busp ();
+ // Active les interruptions.
+ void sti (void);
+ // Désactive les interruptions.
+ void cli (void);
+ // Traite le signal envoyé par le kernel lors d'une interruption.
+ static void irq (int sig);
+ // Ecrire sur le bus.
+ void write (int addr, int data);
+ // Lire sur le bus.
+ int read (int addr);
+};
+
+
+#endif // busp_h
diff --git a/2003/i/buzz/src/erreur/erreur.cc b/2003/i/buzz/src/erreur/erreur.cc
new file mode 100644
index 0000000..f5b8de3
--- /dev/null
+++ b/2003/i/buzz/src/erreur/erreur.cc
@@ -0,0 +1,18 @@
+// erreur.cc
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+//
+#include "erreur.h"
+
+// Retourne une description de l'erreur.
+const char *
+Erreur::what () const
+{
+ return "Erreur non spécifiée.\n";
+}
+
+const char *
+ErreurFatale::what () const
+{
+ return m_descr;
+}
diff --git a/2003/i/buzz/src/erreur/erreur.h b/2003/i/buzz/src/erreur/erreur.h
new file mode 100644
index 0000000..068d751
--- /dev/null
+++ b/2003/i/buzz/src/erreur/erreur.h
@@ -0,0 +1,25 @@
+#ifndef erreur_h
+#define erreur_h
+// erreur.h
+// buzz - Programme du robot Efrei Robotique I1-I2 2003
+// Copyright (C) 2003 Nicolas Schodet
+
+#include <exception>
+
+class Erreur : public std::exception
+{
+ public:
+ // Retourne une description de l'erreur.
+ virtual const char *what () const;
+};
+
+class ErreurFatale : public Erreur
+{
+ const char *m_descr;
+ public:
+ ErreurFatale (const char *descr) { m_descr = descr; }
+ virtual const char *what () const;
+};
+
+
+#endif // erreur_h