summaryrefslogtreecommitdiff
path: root/2003/i/buzz/src/busp/busp.cc
diff options
context:
space:
mode:
Diffstat (limited to '2003/i/buzz/src/busp/busp.cc')
-rw-r--r--2003/i/buzz/src/busp/busp.cc89
1 files changed, 89 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;
+}
+