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

#include <limits.h>
#include <float.h>

#include "Token.h"

#define _FTSVER_CPP
#include "modell.h"
#include "ftsladep.h"


#include "sfx.h"
#include "transp.h"
#include "baustein.h"
#include "fts.h"
#include "realzeit.h"


typFtsLadePool::typFtsLadePool (unsigned n, unsigned b) : typBaustein (n,b),
	ObjLadeListe (2),
	ObjParkListe (2),
	MaxLadeZeit (100),   //Max LadeZeit in Sekunden
   ObjLadeKapazitaet (0.0) {
}

typFtsLadePool::~typFtsLadePool () {
}

void typFtsLadePool::typTPVlesen (InputFile& file) {
  SFXToken tok;
  int anzahl;
  int nr;

  tok.nextToken (file);
  anzahl = atoi (tok ());
  for (int z = 1; z <= anzahl; z++) {
  	tok.nextToken (file);
    nr = atoi (tok ());
		ObjLadeListe.append (*(baustein [nr]));
	}
  file.jump (200); //EOL

  tok.nextToken (file);
  anzahl = atoi (tok ());

  for (int z = 1; z <= anzahl; z++) {
    tok.nextToken (file);
    nr = atoi (tok ());
    ((typFtsWagen*)baustein [nr])->setLadePoolVerwalter (this);
  }
}

void typFtsLadePool::typTTPlesen (InputFile& file) {
	SFXToken tok;

  tok.nextToken (file);
  ObjLadeKapazitaet = atof (tok ());
  file.jump (200); //EOL
}





bool typFtsLadePool::hasKapazitaet (typTransportEinheit*) const  {
	
return true; //soll das ein witz sein oder was???
}

void typFtsLadePool::individuellAktivieren (typBaustein*) {
// Diese Funktion ist absichtlich leer!!!!
}


typBaustein* typFtsLadePool::gibLadeplatz(typFtsWagen* Kunde) {
	typBaustein* ladeplatz = NULL;
	double abstand = DBL_MAX;
 /** Wenn ein Ladeplatz noch Kapazität hat wird der Baustein zurückgeliefert **/
	for (ObjLadeListe.First (); ObjLadeListe ();ObjLadeListe++) {
		typNetzKnoten* LadeKnoten = Kunde->ObjVerwalter->suchKnoten (ObjLadeListe ());
		if (((typFtsLadePlatz*)ObjLadeListe())->hasKapazitaet(NULL) && (!LadeKnoten->Belegt()) ){
			if ( (Kunde->Position () - Position ()).len () < abstand ) {
	    	abstand = (Kunde->Position () - this->Position ()).len ();
				ladeplatz = ObjLadeListe ();
			}
		}
	}
	/** Ansonsten wird NULL zurückgegeben **/
	return ladeplatz;
}

typBaustein* typFtsLadePool::gibParkplatz(typFtsWagen*) {
	return ObjParkListe.First (); // Testweise
}


double typFtsLadePool::Laden (typFtsWagen* Kunde) {
	double zeit;
	double akkuStand;
  akkuStand = (Kunde->ObjAkkuMaxKap-(Kunde->ObjAkkuIstKap<0.0 ? 0.0:Kunde->ObjAkkuIstKap) ) / Kunde->ObjAkkuMaxKap;
	switch (ObjStrategie) {
		case 2 : zeit = akkuStand * MaxLadeZeit; 		// Immer voll aufladen
			Kunde->ObjAkkuIstKap = Kunde->ObjAkkuMaxKap;
		break;
		case 3 : zeit = 5;                                    // Akku austauschen
			 Kunde->ObjAkkuIstKap = Kunde->ObjAkkuMaxKap;							
		break;
		default : zeit = 0;
	}

	return zeit;
}


/////////////////////////////////////////////////////////
/// LadeBaustein
/////////////////////////////////////////////////////////


typFtsLadePlatz::typFtsLadePlatz (unsigned n, unsigned b) : typBaustein (n,b)
{
}

bool typFtsLadePlatz::hasKapazitaet(typTransportEinheit*) const {
		bool zustand;
		if (ObjBuchung == 1 || ObjZustand == GESTOERT) zustand = false;
		else zustand = true;
		return zustand;
}
void typFtsLadePlatz::individuellAktivieren (typBaustein*) {
}


void typFtsLadePlatz::setBuchung () {
	ObjBuchung++;
}

void typFtsLadePlatz::loescheBuchung () {
	ObjBuchung =0;;
}

