#ifndef IO686_HPP
#define IO686_HPP
//===============================================================
// Projekt   : Undervisningsmateriale
// Enhed     : header
// Fil       : io686.hpp
// Forfatter : BA
//
// Beskrivelse:
//   Headerfil for C++ driver til IO686
// Versionshistorie:
//   06.02.00 / BA - Oprindelig version.
//   12.02.00 / BA - Diverse tekstmæssige rettelser.
//   18.08.00 / BA
//     - status() og on() medtaget i LEDPort
//     - off() fjernet fra SwitchPort
//     - status() fjernet fra Timer
//     - de "halve" porte fjernet fra PPI
//   04.01.02 / BA - i alle klasser er private erklæringer af 
//     copy constructor og operator= fjernede. 
//===============================================================

// class LEDPort
// LEDPort() slukker alle LED
// LEDPort(mask) tænder LED i overensstemmelse med 
//   værdien i mask.
// ~LEDPort() slukker alle LED
// 0 <= LEDNr <= 7

class LEDPort {
public:
  LEDPort();
  LEDPort(unsigned char data);
  ~LEDPort();
  void set(unsigned char LEDNr);
  void reset(unsigned char LEDNr);
  void toggle(unsigned char LEDNr);
  bool on(unsigned char LEDNr) const;
  unsigned char status() const;
  void setall(unsigned char data);
private:
  unsigned char m_data;
};

//---------------------------------------------------------------

// class SwitchPort
// 0 <= switchNr <= 7

class SwitchPort {
public:
  SwitchPort(){}
  ~SwitchPort(){}
  bool on(unsigned char switchNr) const;
};

//---------------------------------------------------------------

// class Timer
// ~Timer() sætter aktuel timer til MODE_0
// Konfigureres til Read/Write: LSB/MSB og Binary Count.

class Timer {
public:
  enum TimerMode {
    MODE_0 = 0,
    MODE_1,
    MODE_2,
    MODE_3,
    MODE_4,
    MODE_5
    };
  enum TimerID {
    TIMER_0 = 0,
    TIMER_1,
    TIMER_2
    };
  Timer(TimerID id, TimerMode mode);
  ~Timer();
  void start(unsigned short timervalue);
  unsigned short read() const;
private:
  TimerID m_id;
};

//---------------------------------------------------------------

// class PPI
// Konfigureres til Mode 0 (basic Input/Output)

class PPI {
public:
  enum PortID {
    PORT_A = 0,
    PORT_B,
    PORT_C
    };
  enum PortDirection {
    OUTPUT = 0,
    INPUT
    };
  PPI(PortDirection portAdir,
      PortDirection portBdir,
      PortDirection portCdir);
  ~PPI(){}
  void write(PortID id, unsigned char data);
  unsigned char read(PortID id) const;
};

//===============================================================
#endif
