// $Source: /usr/local/SimSoft/Sfx3D/src/gsl/staufoer.h,v $
// $Revision: 1.2 $
// $Author: baum $
// $Date: 2001/11/29 15:18:10 $
//
// Login name of the user who locked the revision
// $Locker:  $
// Tag name used to checkout the file
// $Name:  $
// State assigned to revision
// $State: Exp $
//
//
// $Log: staufoer.h,v $
// Revision 1.2  2001/11/29 15:18:10  baum
// -Realzeitsteuerung eingebaut
// -Handsteuerung eingebaut
//

#ifndef _STAUFOER_H
#define _STAUFOER_H     1

#include "Token.h"
#include "List.h"

#include "baustein.h"

#ifdef _STAUFOER_CPP
#  undef _impexp
#  define _impexp __declspec(dllexport)
#elif defined BUILD_MAIN_DLL
#  undef _impexp
#  define _impexp
#else
#  undef _impexp
#  define _impexp __declspec(dllimport)
#endif

#if defined __GNUC__ || defined __hpux
#  undef _impexp
#  define _impexp
#endif

//---------------------------------------------------------
// Klasse typStaufoerderer
//---------------------------------------------------------

class _impexp typStaufoerderer : public typBaustein {
  public :
    virtual void     typTGSlesen     (InputFile& file);
    virtual void     typTTPlesen     (InputFile& file);
    virtual ostream& typTTPschreiben (ostream& ostrm) const = 0;

    virtual const double& setGeschwindigkeit (const double& wert);

    virtual typTransportEinheit* TransportEinheit () const;
    virtual typTransportEinheit* gibTransportEinheit (typMeldung* zM);

    virtual void a_aufnehmen ();
    virtual void e_aufnehmen ();
    virtual void a_foerdern  ();
    virtual void e_foerdern  ();
    virtual void a_abgeben   ();
    virtual void e_abgeben   ();

    virtual void aufn_takt   ();
    virtual void fahr_takt   ();

    virtual bool hasKapazitaet    (typTransportEinheit*) const;
    virtual typPlatz* waehlePlatz (typTransportEinheit*);
    virtual Vec3D UebernahmePos (const typBaustein& von)  const;
    virtual Vec3D UebergabePos  (const typBaustein& nach) const;

    virtual unsigned AnzahlArbeitsplanVorhanden  (unsigned arbNr, unsigned istv = 0) const;
    virtual unsigned AnzahlArtikelVorhanden     (unsigned artNr, unsigned istv = 0) const;
    virtual double   MengeArbeitsplanVorhanden   (unsigned arbNr, unsigned istv = 0) const;
    virtual double   MengeArtikelVorhanden      (unsigned artNr, unsigned istv = 0) const;

  protected:
    typStaufoerderer (unsigned n, unsigned b);
    virtual ~typStaufoerderer ();

    virtual void positioniereAufAnfang (struct StauDaten&) = 0;
    virtual void positioniereAufEnde   (struct StauDaten&) = 0;
    virtual void positioniereTE        (struct StauDaten&)  = 0;
    virtual void bewegeTE              (struct StauDaten&, double weg)  = 0;

    virtual bool passtDrauf (typTransportEinheit *zTE) const;

    virtual void individuellAktivieren (typBaustein* vonWem);
    typMeldung* findeAusfuehrbareMeldung ();
    virtual void wartenaufnehmen (typTransportEinheit* zTE, typBaustein* vonWem);

    double ObjLaenge, ObjFoerderGeschw, ObjEffGeschw, ObjStauGrenze;
    Vec3D ObjRichtung;
    struct StauDaten* ObjAufnahmeDaten;
    List<struct StauDaten> ObjTeile;
    SimTime ObjFTaktTime;
    double ObjFTaktDelta;
    double ObjAbgabeLaenge;

  private:
};

//---------------------------------------------------------
// Klasse typLinearStaufoerderer
//---------------------------------------------------------

class _impexp typLinearStaufoerderer : public typStaufoerderer {
  public :
    typLinearStaufoerderer (unsigned n, unsigned b);
    virtual ~typLinearStaufoerderer ();

    virtual void     typTTPlesen     (InputFile& file);
    virtual ostream& typTTPschreiben (ostream& ostrm) const;

  protected:
    virtual void positioniereAufAnfang (struct StauDaten&);
    virtual void positioniereAufEnde   (struct StauDaten&);
    virtual void positioniereTE        (struct StauDaten&);
    virtual void bewegeTE              (struct StauDaten&, double weg);

  private:
};

//---------------------------------------------------------
// Klasse typRechtsKurvenStaufoerderer
//---------------------------------------------------------

class _impexp typRechtsKurvenStaufoerderer : public typStaufoerderer {
  public :
    typRechtsKurvenStaufoerderer (unsigned n, unsigned b);
    virtual ~typRechtsKurvenStaufoerderer ();

    virtual void     typTTPlesen     (InputFile& file);
    virtual ostream& typTTPschreiben (ostream& ostrm) const;

  protected:
    virtual void positioniereAufAnfang (struct StauDaten&);
    virtual void positioniereAufEnde   (struct StauDaten&);
    virtual void positioniereTE        (struct StauDaten&);
    virtual void bewegeTE              (struct StauDaten&, double weg);

  private:
    Angle ObjAnfangsWinkel;
    Angle ObjEndWinkel;
    Vec3D ObjEndRichtung;
};

//---------------------------------------------------------
// Klasse typLinksKurvenStaufoerderer
//---------------------------------------------------------

class _impexp typLinksKurvenStaufoerderer : public typStaufoerderer {
  public :
    typLinksKurvenStaufoerderer (unsigned n, unsigned b);
    virtual ~typLinksKurvenStaufoerderer ();

    virtual void     typTTPlesen     (InputFile& file);
    virtual ostream& typTTPschreiben (ostream& ostrm) const;

  protected:
    virtual void positioniereAufAnfang (struct StauDaten&);
    virtual void positioniereAufEnde   (struct StauDaten&);
    virtual void positioniereTE        (struct StauDaten&);
    virtual void bewegeTE              (struct StauDaten&, double weg);

  private:
    Angle ObjAnfangsWinkel;
    Angle ObjEndWinkel;
    Vec3D ObjEndRichtung;
};

#endif /* _STAUFOER_H */
