//-----------------------------------------------------------------------------
// Thema:   Social Manufacturing Network / Development Environment
// Datei:   IntrfGpio.h
// Editor:  Robert Patzke
// URI/URL: www.mfp-portal.de
//-----------------------------------------------------------------------------
// Lizenz:  CC-BY-SA  (wikipedia: Creative Commons)
// Datum:   04. April 2022
//
// Eine Schnittstelle zu den unterschiedlichen Ports in Mikrocontrollern
//

#ifndef IntrfGpio_h
#define IntrfGpio_h
// ----------------------------------------------------------------------------

#include "arduinoDefs.h"

typedef enum _ifPortNumber
{
  ifPort0,
  ifPort1,
  ifPort2,
  ifPort3,
  ifPort4,
  ifPort5,
  ifPort6,
  ifPort7,
  ifPort8,
  ifPort9
} ifPortNumber;

// Fehler bei der Parameterübergabe (Konfiguration)
//
typedef enum
{
  GEnoError,      // Kein Fehler
  GEcdictPar      // Widersprüchliche Parameter
} GpioError;

typedef struct _GpioMask
{
  dword       port;
  dword       pins;
} GpioMask, *GpioMaskPtr;

typedef struct _GpioExtMask
{
  dword         port;
  dword         pins;
  _GpioExtMask  *next;
} GpioExtMask, *GpioExtMaskPtr;

typedef struct _GpioRef
{
  dword     *ioPtr;
  dword     pins;
} GpioRef, *GpioRefPtr;

typedef struct _GpioExtRef
{
  dword       *ioPtr;
  dword       pins;
  _GpioExtRef *next;
} GpioExtRef, *GpioExtRefPtr;

typedef struct _GpioExtVal
{
  dword       value;
  _GpioExtVal *next;
} GpioExtVal, *GpioExtValPtr;

// Spezifikation der Schnittstellentreiber (Konfiguration)
//
#define IfDrvInput          0x0000        // Pin ist ein Eingang (Default)
#define IfDrvOutput         0x0001        // Pin ist ein Ausgnag
#define IfDrvStrongHigh     0x0002        // Großer Strom bei High (VCC)
#define IfDrvStrongLow      0x0004        // Großer Strom bei Low (0)
#define IfDrvOpenDrain      0x0008        // Open-Drain-Anschluss
#define IfDrvOpenSource     0x0010        // Open-Source-Anschluss
#define IfDrvPullUp         0x0020        // Pull-Up-Widerstand aktiv
#define IfDrvPullDown       0x0040        // Pull-Down-Widerstand aktiv
#define IfDrvPullStrong     0x0080        // Niederohmige Pull-Widerstände

typedef enum
{
  ArdD2D5,
  ArdA0A3,
  ArdA4A5,
  ArdA0A5,
  ArdA4A7,
  ArdA0A7
} ArdMask;

class IntrfGpio
{
public:

  //virtual ~IntrfGpio();

  // --------------------------------------------------------------------------
  // Konfigurationen
  // --------------------------------------------------------------------------
  //
  virtual GpioError config(int nr, unsigned int cnfBits, GpioExtRefPtr refPtr);
  virtual GpioError config(int nrFrom, int nrTo, unsigned int cnfBits, GpioExtRefPtr refPtr);
  virtual GpioError config(GpioExtMaskPtr maskPtr, unsigned int cnfBits, GpioExtRefPtr refPtr);
  virtual GpioError configArd(ArdMask ardMask, unsigned int cnfBits);

  // --------------------------------------------------------------------------
  // Anwendungsfunktionen
  // --------------------------------------------------------------------------
  //
  virtual bool      isSet(GpioExtRefPtr refPtr);
  virtual bool      allSet(GpioExtRefPtr refPtr);
  virtual bool      anySet(GpioExtRefPtr refPtr);
  virtual void      read(GpioExtRefPtr refPtr, GpioExtValPtr valPtr);
  virtual dword     readArd(ArdMask ardMask);

  virtual void      write(GpioExtRefPtr refPtr, GpioExtValPtr valPtr);
  virtual void      writeArd(ArdMask ardMask, dword value);
  virtual void      set(GpioExtRefPtr refPtr);
  virtual void      clr(GpioExtRefPtr refPtr);
};

// ----------------------------------------------------------------------------
#endif //IntrfGpio_h