/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/

#ifndef MoverH
#define MoverH
//---------------------------------------------------------------------------
#include "Mover.hpp"
// Ra: Niestety "_mover.hpp" się nieprawidłowo generuje - przekłada sobie TCoupling na sam koniec.
// Przy wszelkich poprawkach w "_mover.pas" trzeba skopiować ręcznie "_mover.hpp" do "mover.hpp" i
// poprawić błędy! Tak aż do wydzielnia TCoupling z Pascala do C++...
// Docelowo obsługę sprzęgów (łączenie, rozłączanie, obliczanie odległości, przesył komend)
// trzeba przenieść na poziom DynObj.cpp.
// Obsługę silniników też trzeba wydzielić do osobnego modułu, bo każdy osobno może mieć poślizg.
#include "dumb3d.h"
using namespace Math3D;

enum TProblem // lista problemów taboru, które uniemożliwiają jazdę
{ // flagi bitowe
    pr_Hamuje = 1, // pojazd ma załączony hamulec lub zatarte osie
    pr_Pantografy = 2, // pojazd wymaga napompowania pantografów
    pr_Ostatni = 0x80000000 // ostatnia flaga bitowa
};

class TMoverParameters : public T_MoverParameters
{ // Ra: wrapper na kod pascalowy, przejmujący jego funkcje
  public:
    vector3 vCoulpler[2]; // powtórzenie współrzędnych sprzęgów z DynObj :/
    vector3 DimHalf; // połowy rozmiarów do obliczeń geometrycznych
    // int WarningSignal; //0: nie trabi, 1,2: trabi syreną o podanym numerze
    unsigned char WarningSignal; // tymczasowo 8bit, ze względu na funkcje w MTools
    double fBrakeCtrlPos; // płynna nastawa hamulca zespolonego
    bool bPantKurek3; // kurek trójdrogowy (pantografu): true=połączenie z ZG, false=połączenie z
    // małą sprężarką
    int iProblem; // flagi problemów z taborem, aby AI nie musiało porównywać; 0=może jechać
    int iLights[2]; // bity zapalonych świateł tutaj, żeby dało się liczyć pobór prądu
  private:
    double CouplerDist(Byte Coupler);

  public:
    TMoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit,
                     int LoadInitial, AnsiString LoadTypeInitial, int Cab);
    // obsługa sprzęgów
    double Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1,
                    const TDimension &Dim2);
    double Distance(const vector3 &Loc1, const vector3 &Loc2, const vector3 &Dim1,
                    const vector3 &Dim2);
    bool Attach(Byte ConnectNo, Byte ConnectToNr, TMoverParameters *ConnectTo, Byte CouplingType,
                bool Forced = false);
    bool Attach(Byte ConnectNo, Byte ConnectToNr, T_MoverParameters *ConnectTo, Byte CouplingType,
                bool Forced = false);
    int DettachStatus(Byte ConnectNo);
    bool Dettach(Byte ConnectNo);
    void SetCoupleDist();
    bool DirectionForward();
    void BrakeLevelSet(double b);
    bool BrakeLevelAdd(double b);
    bool IncBrakeLevel(); // wersja na użytek AI
    bool DecBrakeLevel();
    bool ChangeCab(int direction);
    bool CurrentSwitch(int direction);
    void UpdateBatteryVoltage(double dt);
    double ComputeMovement(double dt, double dt1, const TTrackShape &Shape, TTrackParam &Track,
                           TTractionParam &ElectricTraction, const TLocation &NewLoc,
                           TRotation &NewRot);
    double FastComputeMovement(double dt, const TTrackShape &Shape, TTrackParam &Track,
                               const TLocation &NewLoc, TRotation &NewRot);
    double ShowEngineRotation(int VehN);
    // double GetTrainsetVoltage(void);
    // bool Physic_ReActivation(void);
    // double LocalBrakeRatio(void);
    // double ManualBrakeRatio(void);
    // double PipeRatio(void);
    // double RealPipeRatio(void);
    // double BrakeVP(void);
    // bool DynamicBrakeSwitch(bool Switch);
    // bool SendCtrlBroadcast(AnsiString CtrlCommand, double ctrlvalue);
    // bool SendCtrlToNext(AnsiString CtrlCommand, double ctrlvalue, double dir);
    // bool CabActivisation(void);
    // bool CabDeactivisation(void);
    // bool IncMainCtrl(int CtrlSpeed);
    // bool DecMainCtrl(int CtrlSpeed);
    // bool IncScndCtrl(int CtrlSpeed);
    // bool DecScndCtrl(int CtrlSpeed);
    // bool AddPulseForce(int Multipler);
    // bool SandDoseOn(void);
    // bool SecuritySystemReset(void);
    // void SecuritySystemCheck(double dt);
    // bool BatterySwitch(bool State);
    // bool EpFuseSwitch(bool State);
    // bool IncBrakeLevelOld(void);
    // bool DecBrakeLevelOld(void);
    // bool IncLocalBrakeLevel(Byte CtrlSpeed);
    // bool DecLocalBrakeLevel(Byte CtrlSpeed);
    // bool IncLocalBrakeLevelFAST(void);
    // bool DecLocalBrakeLevelFAST(void);
    // bool IncManualBrakeLevel(Byte CtrlSpeed);
    // bool DecManualBrakeLevel(Byte CtrlSpeed);
    // bool EmergencyBrakeSwitch(bool Switch);
    // bool AntiSlippingBrake(void);
    // bool BrakeReleaser(Byte state);
    // bool SwitchEPBrake(Byte state);
    // bool AntiSlippingButton(void);
    // bool IncBrakePress(double &brake, double PressLimit, double dp);
    // bool DecBrakePress(double &brake, double PressLimit, double dp);
    // bool BrakeDelaySwitch(Byte BDS);
    // bool IncBrakeMult(void);
    // bool DecBrakeMult(void);
    // void UpdateBrakePressure(double dt);
    // void UpdatePipePressure(double dt);
    // void CompressorCheck(double dt);
    void UpdatePantVolume(double dt);
    // void UpdateScndPipePressure(double dt);
    // void UpdateBatteryVoltage(double dt);
    // double GetDVc(double dt);
    // void ComputeConstans(void);
    // double ComputeMass(void);
    // double Adhesive(double staticfriction);
    // double TractionForce(double dt);
    // double FrictionForce(double R, Byte TDamage);
    // double BrakeForce(const TTrackParam &Track);
    // double CouplerForce(Byte CouplerN, double dt);
    // void CollisionDetect(Byte CouplerN, double dt);
    // double ComputeRotatingWheel(double WForce, double dt, double n);
    // bool SetInternalCommand(AnsiString NewCommand, double NewValue1, double
    // NewValue2);
    // double GetExternalCommand(AnsiString &Command);
    // bool RunCommand(AnsiString command, double CValue1, double CValue2);
    // bool RunInternalCommand(void);
    // void PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2, const
    // TLocation
    //	&NewLocation);
    // bool DirectionBackward(void);
    // bool MainSwitch(bool State);
    // bool ConverterSwitch(bool State);
    // bool CompressorSwitch(bool State);
    void ConverterCheck();
    // bool FuseOn(void);
    // bool FuseFlagCheck(void);
    // void FuseOff(void);
    int ShowCurrent(Byte AmpN);
    // double v2n(void);
    // double current(double n, double U);
    // double Momentum(double I);
    // double MomentumF(double I, double Iw, Byte SCP);
    // bool CutOffEngine(void);
    // bool MaxCurrentSwitch(bool State);
    // bool ResistorsFlagCheck(void);
    // bool MinCurrentSwitch(bool State);
    // bool AutoRelaySwitch(bool State);
    // bool AutoRelayCheck(void);
    // bool dizel_EngageSwitch(double state);
    // bool dizel_EngageChange(double dt);
    // bool dizel_AutoGearCheck(void);
    // double dizel_fillcheck(Byte mcp);
    // double dizel_Momentum(double dizel_fill, double n, double dt);
    // bool dizel_Update(double dt);
    // bool LoadingDone(double LSpeed, AnsiString LoadInit);
    // void ComputeTotalForce(double dt, double dt1, bool FullVer);
    // double ComputeMovement(double dt, double dt1, const TTrackShape &Shape,
    // TTrackParam &Track
    //	, TTractionParam &ElectricTraction, const TLocation &NewLoc, TRotation &NewRot);
    // double FastComputeMovement(double dt, const TTrackShape &Shape, TTrackParam
    // &Track, const
    //	TLocation &NewLoc, TRotation &NewRot);
    // bool ChangeOffsetH(double DeltaOffset);
    // T_MoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit,
    // int LoadInitial
    //	, AnsiString LoadTypeInitial, int Cab);
    // bool LoadChkFile(AnsiString chkpath);
    // bool CheckLocomotiveParameters(bool ReadyFlag, int Dir);
    // AnsiString EngineDescription(int what);
    // bool DoorLeft(bool State);
    // bool DoorRight(bool State);
    // bool DoorBlockedFlag(void);
    // bool PantFront(bool State);
    // bool PantRear(bool State);
    //
};

#endif
