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

#ifndef _MASCHINE_H
#define _MASCHINE_H  1

#include "baustein.h"
#include "regalver.h"
#include "poolver.h"

#ifdef _MASCHINE_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 typPrgBaustein
//---------------------------------------------------------

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

    virtual void typTGSlesen (InputFile& file);

    const SimTime& PRG_ArbZeit () const;
    void setPRG_ArbZeit (const SimTime& time);
    virtual void e_aufnehmen   ();
    virtual void a_arbeiten    ();
    virtual void e_arbeiten    ();

    bool hasProgramm () const;

  protected:

    UserProg* ObjProgramm;
    SimTime   ObjPrgArbZeit;

  friend class typPrgModul;
}; // typPrgBaustein

//---------------------------------------------------------
// Klasse typMaschine
//---------------------------------------------------------

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

    virtual void typTSTlesen (InputFile& file);
    virtual unsigned setStrategie (unsigned stratNr);

    virtual typTransportEinheit *gibTransportEinheit (typMeldung* zM);

    virtual void a_aufnehmen   ();
    virtual void a_meldewarten ();

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

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

  private:
    virtual void individuellAktivieren (typBaustein* vonWem);
    typMeldung* findeAusfuehrbareMeldung ();
    virtual void wartenaufnehmen (typTransportEinheit* zTE, typBaustein* vonWem);

    typRegalverwalter*  ObjBetreuer;
    typNcPoolverwalter* ObjVerwalter;

    typMeldung* (*ObjFindeMeldungFunktion) (typMaschine*);

    static typMeldung* findeFifoMeldung (typMaschine* who); // Strategie 0
    static typMeldung* findeKOZMeldung  (typMaschine* who); // Strategie 1
}; // typMaschine

#endif
