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

#ifndef _DREHPUFF_H
#define _DREHPUFF_H   1

#include "Angle.h"

#include "transp.h"
#include "baustein.h"
#include "platz.h"

#ifdef _DREHPUFF_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 typDrehpuffer
//---------------------------------------------------------

class _impexp typDrehpuffer : public typBaustein {
  public :
    typDrehpuffer (unsigned n, unsigned b);
    virtual ~typDrehpuffer ();

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

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

    virtual typTransportEinheit* gibTransportEinheit (typMeldung* zM);

    virtual void a_meldewarten ();
    virtual void a_aufnehmen   ();
    virtual void e_aufnehmen   ();
    virtual void dreh_takt     ();
    virtual void a_drehen      ();
    virtual void e_drehen      ();
    virtual void a_abgeben     ();
    virtual void e_abgeben     ();
    virtual void eStoeren      ();

    virtual bool ausrichtenAufBaustein (typBaustein* zielBst);

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

    virtual bool isUebergabeBereit (typTransportEinheit* zTE, typBaustein* fuerWen) const;
    virtual void UebergabeVorbereiten (typTransportEinheit* zTE);

    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;

  private:
    // declared, but never defined
    typDrehpuffer ();
    typDrehpuffer (const typDrehpuffer&);

    virtual void individuellAktivieren (typBaustein* vonWem);
    typMeldung* findeAusfuehrbareMeldung ();
    typPlatz*   platzsuchen (typTransportEinheit* zTE);
    void        drehEinStueck (const Angle& deltaw);
    void        drehAufWinkel (const Angle& absAngl);
    Angle       DrehWinkel (const typPlatz& p, const Vec3D& nachPos) const;

    double ObjDrehGeschwindigkeit;
    int    ObjDrehSinn;
    Angle  ObjZielWinkel;
    double ObjTaktDrehGeschwindigkeit;                //fuer Takten

    List<typTransportEinheit> ObjAngeforderteTE;
}; // typDrehpuffer

#endif /* _DREHPUFF_H */
