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

#ifndef _BAUSTEIN_H
#define _BAUSTEIN_H     1

#include "Messung.h"

#include "Array.h"
#include "List.h"

#include "Angle.h"
#include "Vec2D.h"
#include "Token.h"
#include "Strings.h"

#include "sfx.h"
#include "transp.h"
#include "bestell.h"
#include "avis.h"

class typBaustein;
#include "platz.h"

#ifdef _BAUSTEIN_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 CDataBase;
class UserProg;

//LCE
//#include "LCE_Interface.h"
//LCE

//---------------------------------------------------------
// class typBaustein
//---------------------------------------------------------

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

    void bewegen        (const Vec3D& moveVec);
    void positionieren  (const Vec3D& newPos);
    void drehen         (const Angle& ang);
    void ausrichten     (const Angle& angToX);

    ostream&         Id_Schreiben    (ostream& ostrm) const;
    virtual void     typTGSlesen     (InputFile& file);
    virtual ostream& typTGSschreiben (ostream& ostrm) const;
    virtual void     typTBVlesen     (InputFile& file);
    virtual ostream& typTBVschreiben (ostream& ostrm) const;
    virtual void     typTTPlesen     (InputFile& file);
    virtual ostream& typTTPschreiben (ostream& ostrm) const;
    virtual void     typTSTlesen     (InputFile& file);
    virtual ostream& typTSTschreiben (ostream& ostrm) const;
    virtual void     typTPVlesen     (InputFile& file);
    virtual ostream& typTPVschreiben (ostream& ostrm) const;

    virtual ostream& schreibeZustand   (ostream& ostrm) const;
    virtual ostream& schreibeProtokoll (ostream& ostrm) const;

    unsigned Nummer   () const;
    unsigned Basistyp () const;
    Ustring  Name     () const;

    const Vec3D& Position () const;
    const Angle& Winkel   () const;

    virtual Vec3D UebernahmePos (const typBaustein& von)  const;
    virtual Vec3D UebergabePos  (const typBaustein& nach) const;

    unsigned AnzahlEingaenge () const;
    unsigned AnzahlAusgaenge () const;

    virtual unsigned Kapazitaet    () const;
    virtual unsigned setKapazitaet (unsigned wert);

    unsigned Strategie     () const;
    virtual unsigned setStrategie (unsigned stratNr);

//Transportbestellsystem
    virtual void bestelleBstHolenAnfangGliedern (const unsigned zielBstNr, const unsigned palPlatz);
    virtual void bestelleBstHolen (const unsigned zielBstNr, const unsigned palPlatz);
    virtual void bestelleBstBringenAnfangGliedern (const unsigned zielBstNr, const unsigned palPlatz);
    virtual void bestelleBstBringen (const unsigned zielBstNr, const unsigned palPlatz);
    virtual void BestellungVorGliedern (typTransportBestellung *neu, const typTransportBestellung *alt);
    virtual void loescheBestellungHolen (const unsigned zielBstNr, const unsigned palPlatz);
    virtual void loescheBestellungBringen (const unsigned zielBstNr, const unsigned palPlatz);
    virtual void loescheBestellung (const typTransportBestellung *welche);
    virtual void loescheAlleBestellungen ();
    virtual bool hasTransportBestellung () const;
    virtual typTransportBestellung* GibTranspBestZuBaustein (const unsigned Bst, const unsigned Typ) const;
    virtual typTransportBestellung* GibTransportBestellung (const unsigned welche) const;
    virtual void DruckeTransportBestellungen () const;
//Transportbestellsystem Ende

    int      Prioritaet    () const;
    int      setPrioritaet (int prionr);
    zustandstypen Zustand  () const;
    double   ZustandZeit   () const;
    Ustring  ZustandTxt    () const;
    Ustring  BstTypTxt     () const;

    typAvis* Avis   () const;

    bool     hasMeldungen    () const;
    unsigned AnzahlMeldungen () const;
    void     printMeldeliste ();

    virtual unsigned Belegung () const;
    unsigned         Buchung  () const;

    const SimTime& Aufnahmezeit    () const;
    const SimTime& setAufnahmezeit (const SimTime& time);

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

    virtual unsigned AnzahlArbeitsliste () const;

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

    virtual typBaustein* setZielBaustein (typTransportEinheit *zTE);

    UserData* getUserData () const;
    void      setUserData (UserData* data);
    unsigned  SyncPartner () const;
    void      setSyncPartner (unsigned spartner);

    virtual typBaustein*             setVerwalter (typBaustein* newVerwalter);
    virtual class typRegalverwalter* setBetreuer  (class typRegalverwalter* newBetreuer);

    Geschichte *BelGeschichte      () const;
    void        setBelGeschichte   (Geschichte *bGeschichte);

    Geschichte *AuslGeschichte     () const;
    void        setAuslGeschichte  (Geschichte *aGeschichte);

    Geschichte *StoerGeschichte    () const;
    void        setStoerGeschichte (Geschichte *sGeschichte);

    void        empfangeMeldung    (typMeldung *zM);

    virtual typPlatz* waehlePlatz  (typTransportEinheit*);

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

    virtual void a_aufnehmen   ();
    virtual void e_aufnehmen   ();
    virtual void a_arbeiten    ();
    virtual void e_arbeiten    ();
    virtual void a_meldewarten ();
    virtual void a_abgeben     ();
    virtual void e_abgeben     ();
    virtual void a_drehen      ();
    virtual void e_drehen      ();
    virtual void a_foerdern    ();
    virtual void e_foerdern    ();
    virtual void a_heben       ();
    virtual void e_heben       ();
    virtual void a_senken      ();
    virtual void e_senken      ();
    virtual void aSperren      ();
    virtual void eSperren      ();
    virtual void a_kommissionieren ();
    virtual void e_kommissionieren ();
    virtual void a_laden       ();
    virtual void e_laden       ();

    void aStoeren              ();
    virtual void eStoeren      ();

    virtual bool ausrichtenAufBaustein (typBaustein* zielBst);
    virtual bool immerausrichtenAufBaustein (typBaustein* zielBst, bool heben = true);

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

    void aktivieren (unsigned vonWem);

    virtual void ArbBestellung (unsigned was,      unsigned istvorg,
                                unsigned sollvorg, unsigned wieoft);
    virtual void TEBestellung(typTransportEinheit *te, unsigned sollvorg);
    virtual void ArtBestellung (unsigned was,      unsigned istvorg,
                                unsigned sollvorg, unsigned wieoft);
    virtual void ArbZuweisen   (unsigned was, unsigned wohin,
                                unsigned istVorg, unsigned sollVorg,
                                unsigned wieoft);
    virtual void ArtZuweisen   (unsigned was, unsigned wohin,
                                unsigned istVorg, unsigned sollVorg,
                                unsigned wieoft);
    virtual bool loescheArbBestellung (unsigned was, unsigned istvorg);
    virtual bool loescheTEBestellung(typTransportEinheit *te);
    virtual bool loescheArtBestellung (unsigned was, unsigned istvorg);

    virtual typTransportEinheit* GibProjektIDTE (unsigned idnr = 0, unsigned projektID = 0, unsigned suchID = 0);
    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;

    virtual unsigned AnzahlArbeitsplanBestellbar (unsigned arbNr, unsigned istv = 0) const;
    virtual unsigned AnzahlArtikelBestellbar    (unsigned artNr, unsigned istv = 0) const;
    virtual unsigned AnzahlProjektIDBestellbar (unsigned artNr, unsigned suchID) const;
    virtual double   MengeArbeitsplanBestellbar  (unsigned arbNr, unsigned istv = 0) const;
    virtual double   MengeArtikelBestellbar     (unsigned artNr, unsigned istv = 0) const;

    void stoerungEinleiten    (const SimTime& dauer);
    void sperrungEinleiten    ();
    bool isGesperrtOrGestoert () const;
    
    static void setClassNehmSchritt (double wert);
    static void setClassDrehSchritt (double wert);
    static void setClassFahrSchritt (double wert);


    GeoObject* ErzeugeGeoObject(Vec3D v);
    GeoObject* GibGeoObject();
    virtual typBaustein* ZielBst() const;
    virtual int aktPalPlatz (); 
    typPlatz* gibPlatz(int platz = 0);  // wird fuer Mehrfachlader benoetigt (Mark, 29.01.03)
    //**********************************************    
//lars
   bool ObjSperrung;
//miro+lars
	void incBuchung();
	void decBuchung();
  protected:
    unsigned ObjNummer;
    Ustring  ObjName;
    unsigned ObjBasistyp;
    unsigned ObjVariante;
    unsigned ObjZaehler;

    unsigned ObjBelegung;
    unsigned ObjBuchung;
    unsigned ObjKapazitaet;
    unsigned ObjPhysKapazitaet;
    int ObjPrioritaet;
    unsigned ObjStrategie;
	 //Bestellsystem
    List<typTransportBestellung> ObjTransportBestellungen;
	 //Ende Bestellsystem
    SimTime ObjZustandWZ;
    SimTime ObjAufnahmezeit;
    double  ObjWartezeitSchwelle;

    unsigned ObjTaktSchritte;
    SimTime  ObjTaktZeit;
    Vec3D    ObjTaktZiel;

    zustandstypen ObjZustand;
    zustandstypen ObjAlterZustand;

    Angle     ObjWinkel;
    Angle     ObjWinkelX;
    Angle     ObjWinkelY;
    Angle     ObjKorrekturWinkel;
    GeoObject ObjGeometry;
    GeoObject* ObjDrehGeometry;
    Array<typPlatz>       ObjPalPlaetze;
    DynArray<typBaustein> ObjEingaenge;
    DynArray<typBaustein> ObjAusgaenge;

    typTransportEinheit* ObjTransportEinheit;
    typBaustein*   ObjZielBaustein;
    UserProg*      ObjEvent;
    UserData*      ObjUData;
    typAvis*       ObjAvis;

    unsigned       ObjSyncPartner;
    
    List<typMeldung> ObjMeldungen;

    Geschichte* ObjBelGeschichte;
    Geschichte* ObjAuslGeschichte;
    Geschichte* ObjStoerGeschichte;

    SimTime ObjStoerDauer;
    notiz  *ObjStoerEnde;
    
    static double ClassNehmSchritt;
    static double ClassDrehSchritt;
    static double ClassFahrSchritt;
    static double ClassTaktFaktor;

    typMeldung*  holeMeldung           () /*const*/;
    void         aufnehmenEinleiten    (const Vec3D& posZiel, const SimTime& zeit);
    Angle        RZSNehmWinkel         (const Vec2D& posWerk, const Vec2D& posZiel) const;
    virtual void individuellAktivieren (typBaustein* vonWem) = 0;
    virtual void addEingang            (typBaustein* eingang);
    virtual void addAusgang            (typBaustein* ausgang);
    void         aktiviereEingaenge    () const;
    void         aktiviereAusgaenge    () const;
    zustandstypen setZustand           (zustandstypen z);
    void incBelegung ();
    void decBelegung ();
    virtual void wartenaufnehmen       (typTransportEinheit* zTE, typBaustein* vonWem);

  private:
    // declared, but not defined
    typBaustein ();
    typBaustein (const typBaustein&);
    typBaustein& operator = (const typBaustein&);

   //LCE
   //LCE_InterfaceBstDaten* zLCE_InterfaceBstDaten;
   //LCE
    
	
  friend class typPrgModul;
  friend Vec3D typPlatz::Position () const;

  friend void EPwecken ();
  friend void schlafen (SimTime);
  friend void syncBst  (unsigned);
  friend void warten   ();
}; // typBaustein

#endif /* _BAUSTEIN_H */
