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

#ifndef _FTSWAGEN_H
#define _FTSWAGEN_H	1 

#include "Token.h"

#include "Vec3D.h"
#include "ftsver.h"
#include "Angle.h"
#include "baustein.h"
#include "ftsnetz.h"
#include "ftsladep.h"

#ifdef _FTSWAGEN_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 typFtsWagen
//---------------------------------------------------------

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

    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);
    
    virtual void a_aufnehmen ();
    virtual void e_aufnehmen ();
    virtual void a_fahren    ();
    virtual void e_fahren    ();
    virtual void e_abgeben   ();
/* lar 25.09.00 */
    virtual void a_laden     ();
    virtual void e_laden     ();

    virtual typBaustein* setVerwalter (typBaustein* newVerwalter);
    virtual void setLadePoolVerwalter (typFtsLadePool* newVerwalter);

    virtual typTransportEinheit *gibTransportEinheit (typMeldung* zM);

    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 FtsZustand ();
    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& setHubGeschwindigkeit  (const double& wert);
    const double& setHubBeschleunigung   (const double& wert);
    const double& setHubVerzoegerung     (const double& wert);

    double AbstandIstZielKn (typNetzKnoten *IstKn, typNetzKnoten *ZielKn); // berechnet Abstand

    void DrehInPosition ();
    void WagenAusrichten ();
    	
		/*** lar 14.09.00 ***/
		void initIstKnoten ();
		void initZielKnoten ();

		/*** lar ***/

    typBaustein* ObjZielBaustein;

    typNetzKnoten* ObjIstKnoten;
    typNetzKnoten* ObjZielKnoten;
    typNetzKnoten* ObjLetzterIstKnoten;
    typNetzKnoten* ObjNaechsterIstKnoten;

    unsigned NotRueckwaertszaehler;
		unsigned NotRueckgabezaehler;

    Vec3D ObjFahrRichtung;
    void set_Hubweg ();

  private:
    virtual void individuellAktivieren (typBaustein* vonWem);

    double Zeit_ermitteln (const double& weg, const double& geschw,
                           const double& beschl, const double& verz) const;
    
    typMeldung* findeAusfuehrbareMeldung ();

    double ObjFahrGeschwindigkeit;
    double ObjFahrBeschleunigung;    //************fuer_Regal
    double ObjFahrVerzoegerung;      //************fuer_Regal
    double ObjFahrweg;               //**********fuer_Regal
    double ObjHubGeschwindigkeit;    //************fuer_Regal
    double ObjHubBeschleunigung;     //************fuer_Regal
    double ObjHubVerzoegerung;       //************fuer_Regal
    double ObjHubweg;                //*********fuer_Regal

    double SicherAbstand;
    double Vorschau;
    double ObjKnotenFahrweg;
 		double ObjMotorleistung;
		double ObjAkkuIstKap;   			// Akkukapazität
		double ObjAkkuSollKap;
		double ObjAkkuMaxKap;
    GeoObject* ObjHubGeo;
    
	  class typFtsVerwalter* ObjVerwalter;
	  class typFtsLadePool* ObjLadePool;

    Vec3D ObjZielKoord;
    Vec3D ObjGabelKoord;
		typBaustein* ObjLadePlatz;

    typMeldung* (*ObjFindeMeldungFunktion) (typFtsWagen*);

		
		Angle  ObjZielWinkel;
		double ZielWinkel;
    //void fts_drehen ();
    void set_NotRueckwaertszaehler ();
		void set_NotRueckgabezaehler();
		void schickeLaden ();
		// lar 29.09
		unsigned int ObjLadeflag;

    Angle UebernahmeWinkel (const Vec3D& vonPos);
		double FahrDauerSchwelle;
		double FahrAnfang;
    double finde_naechstenKnoten(typNetzKnoten *IstKn, typNetzKnoten *letzterKn, double Weg);

    static typMeldung* findeFifoMeldung      (typFtsWagen* who); // Strategie 0
    static typMeldung* findeKurzwegMeldung   (typFtsWagen* who); // Strategie 1

		friend class typFtsLadePool;
}; // typFtsWagen

#endif  /* _FTS */
