From dc3b7e0fd76846cd99fc68b3ba008c5efe2579e6 Mon Sep 17 00:00:00 2001 From: schodet Date: Thu, 3 Apr 2003 14:28:50 +0000 Subject: Initial revision --- 2003/i/buzz/src/busp/busp.cc | 89 ++++++++++++++++++++++++++++++++++++++++ 2003/i/buzz/src/busp/busp.h | 29 +++++++++++++ 2003/i/buzz/src/erreur/erreur.cc | 18 ++++++++ 2003/i/buzz/src/erreur/erreur.h | 25 +++++++++++ 4 files changed, 161 insertions(+) create mode 100644 2003/i/buzz/src/busp/busp.cc create mode 100644 2003/i/buzz/src/busp/busp.h create mode 100644 2003/i/buzz/src/erreur/erreur.cc create mode 100644 2003/i/buzz/src/erreur/erreur.h (limited to '2003/i/buzz/src') 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 +#include +#include + +#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 + +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 -- cgit v1.2.3