// $Source: /usr/local/SimSoft/Sfx3D/src/gsl/mehrfachlader.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: Release-14 $
// State assigned to revision
// $State: Exp $
//
//
// $Log: mehrfachlader.h,v $
// Revision 1.2  2001/11/29 15:18:09  baum
// -Realzeitsteuerung eingebaut
// -Handsteuerung eingebaut
//

#ifndef _MEHRFACHLADER_H
#define _MEHRFACHLADER_H	1 

#include "Token.h"

#include "Vec3D.h"

#include "baustein.h"

#ifdef _MEHRFACHLADER_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 typMehrfachLader
//---------------------------------------------------------

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

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

    virtual unsigned setStrategie (unsigned stratNr);
    
    //mehrere TEs
    virtual typTransportEinheit *TransportEinheit  () const;
    virtual typTransportEinheit *gibTransportEinheit (typMeldung* zM);
    virtual void a_meldewarten ();
    virtual void aufn_takt     ();
    void         aufnehmenEinleiten    (const Vec3D& posZiel, const SimTime& zeit);
    //Ende mehrere TEs
    
    virtual int aktPalPlatz (); 
    
    //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;
    void BestellungAusfuehren ();
    //Transportbestellsystem Ende
	 
    void sperreQuerachse  ();
    void sperreHubAchse   ();
	 void MeldungAusfuehren (typMeldung* meldung);
	 
    virtual void a_aufnehmen ();
    virtual void e_aufnehmen ();
    virtual void a_heben     ();
    virtual void e_heben     ();
    virtual void a_fahren    ();
    virtual void e_fahren    ();
    virtual void a_senken    ();
    virtual void e_senken    ();
    virtual void e_abgeben   ();
    virtual void eStoeren    ();

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

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

    virtual void fahr_takt ();

    virtual const double& setGeschwindigkeit     (const double& wert);
    const double& setFahrBeschleunigung  (const double& wert);
    const double& setFahrVerzoegerung    (const double& wert);
    
    const double& setQuerGeschwindigkeit  (const double& wert);
    const double& setQuerBeschleunigung   (const double& wert);
    const double& setQuerVerzoegerung     (const double& wert);
    
    const double& setHubGeschwindigkeit  (const double& wert);
    const double& setHubBeschleunigung   (const double& wert);
    const double& setHubVerzoegerung     (const double& wert);
    const double& HubGeschwindigkeit  ();
    const double& HubBeschleunigung   ();
    const double& HubVerzoegerung     ();

    bool Ausgerichtet();

  private:
    virtual void individuellAktivieren (typBaustein* vonWem);
    typMeldung* findeAusfuehrbareMeldung ();

    double Zeit_ermitteln (const double& weg, const double& geschw,
                           const double& beschl, const double& verz) const;
    double ObjFahrGeschwindigkeit;
    double ObjFahrBeschleunigung;    
    double ObjFahrVerzoegerung;      
    double ObjFahrweg;
    double ObjQuerGeschwindigkeit;
    double ObjQuerBeschleunigung;    
    double ObjQuerVerzoegerung;
    double ObjQuerweg;
    double ObjHubGeschwindigkeit;    
    double ObjHubBeschleunigung;     
    double ObjHubVerzoegerung;       
    double ObjHubweg;
    
    double ObjTaktFahrGeschwindigkeit;                //fuer Takten
    double ObjTaktQuerGeschwindigkeit;
    double ObjTaktHubGeschwindigkeit;

    bool ObjQuerGesperrt;              //zur Sperrung der Querachse
    bool ObjHubGesperrt;               //zur Sperrung der Hubachse
    bool ObjAusgerichtet;               //damit beim Ausrichten mit Transporteinheit nicht abgegeben wird
  
	
    GeoObject* ObjLaufGeo;
    Array<GeoObject> ObjGreiferGeo;		//GeoObjects der Greifer

    Vec3D ObjFahrRichtung;
    Vec3D ObjQuerRichtung;
    Vec3D ObjHubRichtung;
    Vec3D ObjZielKoord;
        
    Array<typTransportEinheit> ObjTransportEinheit;
    
    typMeldung* (*ObjFindeMeldungFunktion) (typMehrfachLader*);
    
    unsigned ObjAnzahlHubArme;				   // zur Initialisierung der Palettenplätze
    unsigned ObjHubArm;								// Für die Wahl des Hubarmes
    unsigned ObjMerkArm;                     // für Auswahl des Arms beim Heben
    unsigned ObjArmMerker;                   // fuer FindeFifoMeldung 
    unsigned ObjPalPlatz;							// Für die Wahl des Palettenplatzes
    
    //Transportbestellsystem
    bool ObjMeldungzuBestellung;			      //sagt aus ob Bestellung abgearbeitet wird
    bool ObjWartenAufMeldung;
    typTransportBestellung *ObjAlteBestellung;
    //Transportbestellsystem Ende

    static typMeldung* findeFifoMeldung      (typMehrfachLader* who); // Strategie 0
    
    static typMeldung* typMehrfachLader::findeFifoAusfuehrbarBestellMeldung (typMehrfachLader* who); // Strategie 2
    static bool typMehrfachLader::hasKapazitaetOderWechselBestell (typMehrfachLader* who, List<typMeldung> versuch, typBaustein* zAltNext, typBaustein* AusgangsBaustein);
    
    static bool hasKapazitaetOderWechsel (typMehrfachLader* who, typBaustein* zAltNext, typBaustein* AusgangsBaustein);
    static typMeldung* findeFifoAusfuehrbarMeldung      (typMehrfachLader* who); // Strategie 1
    
    static typMeldung* typMehrfachLader::findeFifoAusfuehrbar2Meldung (typMehrfachLader* who); // Strategie 3
    static bool typMehrfachLader::hasKapazitaetOderWechsel2 (typMehrfachLader* who, List<typMeldung> versuch, typBaustein* zAltNext, typBaustein* AusgangsBaustein);
    
    static typMeldung* typMehrfachLader::findeFifoVWagenMeldung (typMehrfachLader* who);
    
    int RekursNummer;
    void printMeldeListe ();
};

#endif  // !_MEHRFACHLADER_H
