// $Source: /usr/local/SimSoft/Sfx3D/src/gsl/kettfoer.h,v $
// $Revision: 1.2 $
// $Author: baum $
// $Date: 2001/11/29 15:18:09 $
//
// 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: kettfoer.h,v $
// Revision 1.2  2001/11/29 15:18:09  baum
// -Realzeitsteuerung eingebaut
// -Handsteuerung eingebaut
//

#ifndef _KETTFOER_H
#define _KETTFOER_H  1

#include "baustein.h"
#include "querfoer.h"

#ifdef _KETTFOER_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

class typKettenfoerderer;

//---------------------------------------------------------
// class typKettenglied
//---------------------------------------------------------

class typKettenglied {
  public:
    typKettenglied (typTransportEinheit *zWs, unsigned PlatzNr);
    ~typKettenglied ();

    typTransportEinheit* Transp     () const;
    unsigned             IstPlatz   () const;
    typBaustein*         getvonBaustein() const;

    void incAktPlatz ();


    unsigned ObjAktPlatz;          // Aktueller Platz des Kettengliedes
    typTransportEinheit *ObjTransportEinheit; // dem Kettenglied zugeordnetes Wst
    bool hatAbgemeldet ;
    bool hatAngemeldet;
    typBaustein* quellPlatz;
}; // Belegung der virtuellen Plaetze bei Transpueckaufnahme

//---------------------------------------------------------
// class typKettenfoerderer
//---------------------------------------------------------

class _impexp typKettenfoerderer : public typBaustein {
  public:
    bool ichBelege;
    bool ichFoerderebereits;

    typKettenfoerderer                   (unsigned n, unsigned b);
    virtual ~typKettenfoerderer          ();

    virtual void typTTPlesen             (InputFile& file);
    virtual bool hasKapazitaet           (typTransportEinheit* zW) const;
    virtual typPlatz* waehlePlatz        (typTransportEinheit*);
    virtual Vec3D UebernahmePos          (const typBaustein& von)  const;
    virtual Vec3D UebergabePos           (const typBaustein& nach) const;
    virtual typTransportEinheit* gibTransportEinheit (typMeldung* zM);
    virtual typTransportEinheit* TransportEinheit () const;
    virtual void a_aufnehmen             ();
    virtual void e_aufnehmen             ();
    virtual void a_abgeben               ();
    virtual void e_abgeben               ();
    virtual void a_foerdern              ();
    virtual void e_foerdern              ();
    //virtual bool hatTransportEinheit () const;
    bool DarfIchAufDenQuerfoerderer      ();

  protected:
    virtual void addEingang (typBaustein* eingang);
    virtual void addAusgang (typBaustein* ausgang);
    virtual bool passtDrauf (typTransportEinheit *zTE) const;

  private:
    double     ObjLaenge;            // Foerderlaenge
    double     ObjFoerderGeschw;     // Foerdergeschwindigkeit
    double     ObjNormalGeschw;         //
    double     ObjKettGlAbst;        // Abstand zwischen zwei Kettengliedern
    SimTime    ObjFoerderzeitGlAbst; // Foerderzeit fuer von einem zum naechsten Platz
    unsigned   ObjSicherheitsAbst;       // Sicherheitsabstand, Summand fuer Belegungsplaetze
    double     ObjSicherheitInMetern;
    double     ObjAnzKettenglieder;
    Vec3D      ObjRichtung;
    bool       querfoerdererVorhanden;
    unsigned   anfangsSicherheit;
    unsigned   merkerLetzterQuerfoerderer;
    Map<typQuerfoerderer, unsigned> ObjMeineQuerfoerderer;
    List<typKettenglied>            ObjKettengliederListe;   // Liste der belegten virtuellen Plaetze
    unsigned   platzDesLetztenQuerfoerderers;
    typQuerfoerderer* meinLetzterQuerfoerderer;

    virtual void individuellAktivieren (typBaustein* vonWem);
    typMeldung* findeAusfuehrbareMeldung ();
    //bool passtDrauf () const;
    virtual void wartenaufnehmen (typTransportEinheit* zW, typBaustein* vonWem);
    void addToMap(typQuerfoerderer* querfoerderer);
    unsigned getPosition(typQuerfoerderer* );
}; //Ende Objekt Kf

#endif /* _CFFSKETF_H */

