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

#define _ABSREGAL_CPP
#include "modell.h"

#include "sfx.h"
#include "arbplan.h"
#include "realzeit.h"
#include "absregal.h"

//---------------------------------------------------------
// class typAbstrakteRegaleinheit
//---------------------------------------------------------

typAbstrakteRegaleinheit::typAbstrakteRegaleinheit (unsigned n, unsigned b)
  : typRegaleinheit  (n, b) { }

typAbstrakteRegaleinheit::~typAbstrakteRegaleinheit () { }

/*virtual*/ void typAbstrakteRegaleinheit::typTTPlesen (InputFile& file) {
  SFXToken tok;

  tok.nextToken (file);
  ObjAufnahmezeit = SimTime (atof (tok ()) * SimTime::SecondsPerMinute ());

  tok.nextToken (file);
  ObjPhysKapazitaet = ObjKapazitaet = atoi (tok ());

  for (unsigned n = 1; n < ObjKapazitaet; n++) {
    typPlatz *pl = new typPlatz (n, ObjPalPlaetze [0]->Position () -
                                         ObjGeometry.Pos (), this);
    ObjPalPlaetze [n] = pl;
  }
}

void typAbstrakteRegaleinheit::e_aufnehmen () {
  typPlatz *p (ObjTransportEinheit->AktPlatz ());
  if (p->Buchung () != ObjTransportEinheit)
    sim_error ("REGAL", "typAbstrakteRegaleinheit::e_aufnehmen",
               "TransportEinheit ist nicht auf Platz gebucht", ObjNummer, FATAL);
  p->setBuchung (NULL);
  ObjBuchung--;
  ObjTransportEinheit->positionieren (p->Position ());
  ObjTransportEinheit->ausblenden ();

  ObjTransportEinheiten.append (*ObjTransportEinheit);
  typBaustein* ziel = ObjTransportEinheit->Vorgang ()->ZielBaustein ();
  if ((ziel->Nummer () == ObjNummer) || (ziel->Nummer () == ObjVerwalter->Nummer ()))
    planeein (Modellzeit (), ETalagern, ObjNummer,
              ObjTransportEinheit->AktPlatz ()->Nummer ());
  else
    if (ziel->Avis ()->isDirAvisOk ())
      ObjTransportEinheit->Anmelden ();
    else  ObjVerwalter->meldeBetreuTeil (*ObjTransportEinheit);

  ObjTransportEinheit = NULL;
  setZustand (RUHE);
  if (!ObjMeldungen.isEmpty ())
    planesofort (ETaktivieren ,ObjNummer, ObjNummer);
  planesofort (ETeabgeben, ObjZielBaustein->Nummer (), ObjNummer);
}

/*virtual*/ typTransportEinheit *typAbstrakteRegaleinheit::gibTransportEinheit
                                (typMeldung* zM) {
  typTransportEinheit *zTE = zM->TransportEinheit ();
  if (!ObjTransportEinheiten.remove (*zTE))
    sim_error ("AbstrakteRegaleinheit", "gibTransportEinheit",
               "falsche TransportEinheit angefordert", ObjNummer, FATAL);
  decBelegung ();
  if (ObjVerwalter) //miro 20.04.2003 16:09 auch absRegaleinheiten ohne Verwalter gibt es???
  {
  	ObjVerwalter->decBelegung ();
  }

  zTE->AktPlatz ()->setTransportEinheit (NULL);
  if (ObjVerwalter) //miro 20.04.2003 16:09 auch absRegaleinheiten ohne Verwalter gibt es???
  {
  	ObjVerwalter->Avis ()->decDirIstAnzahl ();
  }

  if (ObjBetreuer)
    ObjBetreuer->Anforderung_naechste_TE (this);

  planesofort (ETaabgeben, ObjNummer, zM->NachBaustein ()->Nummer ());
  zTE->einblenden ();
  return zTE;
}

/*virtual*/ unsigned typAbstrakteRegaleinheit::setKapazitaet (unsigned wert) {
  if (wert > 0) {
    for (unsigned n = 1; n < ObjKapazitaet; n++) {
      delete ObjPalPlaetze [n];
      ObjPalPlaetze [n] = NULL;
    }
    ObjPhysKapazitaet = ObjKapazitaet = wert;
    for (unsigned n = 1; n < ObjKapazitaet; n++) {
      typPlatz *pl = new typPlatz (n, ObjPalPlaetze [0]->Position () -
                                           ObjGeometry.Pos (), this);
      ObjPalPlaetze [n] = pl;
    }
    return ObjKapazitaet;
  }
  else
    sim_error ("typAbstrakteRegaleinheit", "setKapazitaet",
               "Kap muss > 0 sein", ObjNummer, FATAL);
  return 0;
}


