Merge branch 'milek-dev' into gfx-work

This commit is contained in:
milek7
2019-03-16 21:08:34 +01:00
6 changed files with 208 additions and 27 deletions

11
.gitignore vendored
View File

@@ -54,8 +54,8 @@ install_manifest.txt
*.~pas
*.opensdf
*.sdf
#*.sln
#*.vcxproj
*.sln
*.vcxproj
*.filters
format_all_files.py
*.suo
@@ -71,10 +71,5 @@ ipch/
*.aps
builds/
doc/
CMakeLists.txt.user
*.vcxproj
*.sln
CMakeLists.txt.user

View File

@@ -2687,7 +2687,10 @@ bool TDynamicObject::Update(double dt, double dt1)
auto osie { 0 };
// 0a. ustal aktualna nastawe zadania sily napedowej i hamowania
if (MoverParameters->Power < 1)
{
MoverParameters->MainCtrlPos = ctOwner->Controlling()->MainCtrlPos*MoverParameters->MainCtrlPosNo / std::max(1, ctOwner->Controlling()->MainCtrlPosNo);
MoverParameters->ScndCtrlActualPos = ctOwner->Controlling()->ScndCtrlActualPos;
}
MoverParameters->CheckEIMIC(dt1);
MoverParameters->CheckSpeedCtrl();

View File

@@ -369,7 +369,7 @@ enum class TBrakeSystem { Individual, Pneumatic, ElectroPneumatic };
/*podtypy hamulcow zespolonych*/
enum class TBrakeSubSystem { ss_None, ss_W, ss_K, ss_KK, ss_Hik, ss_ESt, ss_KE, ss_LSt, ss_MT, ss_Dako };
enum class TBrakeValve { NoValve, W, W_Lu_VI, W_Lu_L, W_Lu_XR, K, Kg, Kp, Kss, Kkg, Kkp, Kks, Hikg1, Hikss, Hikp1, KE, SW, EStED, NESt3, ESt3, LSt, ESt4, ESt3AL2, EP1, EP2, M483, CV1_L_TR, CV1, CV1_R, Other };
enum class TBrakeHandle { NoHandle, West, FV4a, M394, M254, FVE408, FVel6, D2, Knorr, FD1, BS2, testH, St113, MHZ_P, MHZ_T, MHZ_EN57, MHZ_K5P, MHZ_K8P };
enum class TBrakeHandle { NoHandle, West, FV4a, M394, M254, FVE408, FVel6, D2, Knorr, FD1, BS2, testH, St113, MHZ_P, MHZ_T, MHZ_EN57, MHZ_K5P, MHZ_K8P, MHZ_6P };
/*typy hamulcow indywidualnych*/
enum class TLocalBrake { NoBrake, ManualBrake, PneumaticBrake, HydraulicBrake };
/*dla osob/towar: opoznienie hamowania/odhamowania*/
@@ -895,6 +895,10 @@ public:
double P2FTrans = 0.0;
double TrackBrakeForce = 0.0; /*sila nacisku hamulca szynowego*/
int BrakeMethod = 0; /*flaga rodzaju hamulca*/
bool Handle_AutomaticOverload = false;
bool Handle_ManualOverload = false;
double Handle_GenericDoubleParameter1 = 0.0;
double Handle_GenericDoubleParameter2 = 0.0;
/*max. cisnienie w cyl. ham., stala proporcjonalnosci p-K*/
double HighPipePress = 0.0;
double LowPipePress = 0.0;

View File

@@ -8427,6 +8427,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
{ "MHZ_EN57", TBrakeHandle::MHZ_EN57 },
{ "MHZ_K5P", TBrakeHandle::MHZ_K5P },
{ "MHZ_K8P", TBrakeHandle::MHZ_K8P },
{ "MHZ_6P", TBrakeHandle::MHZ_6P },
{ "M394", TBrakeHandle::M394 },
{ "Knorr", TBrakeHandle::Knorr },
{ "Westinghouse", TBrakeHandle::West },
@@ -8440,6 +8441,10 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
lookup->second :
TBrakeHandle::NoHandle;
}
Handle_AutomaticOverload = (extract_value("HAO", line) == "Yes");
Handle_ManualOverload = (extract_value("HMO", line) == "Yes");
extract_value(Handle_GenericDoubleParameter1, "HGDP1", line, "");
extract_value(Handle_GenericDoubleParameter2, "HGDP2", line, "");
// brakelochandle
{
std::map<std::string, TBrakeHandle> locbrakehandles{
@@ -9269,9 +9274,13 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir)
case TBrakeHandle::MHZ_K5P:
Handle = std::make_shared<TMHZ_K5P>();
break;
case TBrakeHandle::MHZ_6P:
Handle = std::make_shared<TMHZ_6P>();
break;
default:
Handle = std::make_shared<TDriverHandle>();
}
Handle->SetParams(Handle_AutomaticOverload, Handle_ManualOverload, Handle_GenericDoubleParameter1, Handle_GenericDoubleParameter2);
switch( BrakeLocHandle ) {
case TBrakeHandle::FD1:

View File

@@ -24,6 +24,7 @@ static double const DPL = 0.25;
double const TFV4aM::pos_table[11] = {-2, 6, -1, 0, -2, 1, 4, 6, 0, 0, 0};
double const TMHZ_EN57::pos_table[11] = {-1, 10, -1, 0, 0, 2, 9, 10, 0, 0, 0};
double const TMHZ_K5P::pos_table[11] = { -1, 3, -1, 0, 1, 1, 2, 3, 0, 0, 0 };
double const TMHZ_6P::pos_table[11] = { -1, 4, -1, 0, 2, 2, 3, 4, 0, 0, 0 };
double const TM394::pos_table[11] = {-1, 5, -1, 0, 1, 2, 4, 5, 0, 0, 0};
double const TH14K1::BPT_K[6][2] = {{10, 0}, {4, 1}, {0, 1}, {4, 0}, {4, -1}, {15, -1}};
double const TH14K1::pos_table[11] = {-1, 4, -1, 0, 1, 2, 3, 4, 0, 0, 0};
@@ -2274,6 +2275,11 @@ double TDriverHandle::GetEP(double pos)
{
return 0;
}
void TDriverHandle::OvrldButton(bool Active)
{
ManualOvrldActive = Active;
}
//---FV4a---
double TFV4a::GetPF(double i_bcp, double PP, double HP, double dt, double ep)
@@ -2683,7 +2689,7 @@ bool TMHZ_EN57::EQ(double pos, double i_pos)
double TMHZ_K5P::GetPF(double i_bcp, double PP, double HP, double dt, double ep) {
static int const LBDelay = 100;
double LimPP;
double LimCP;
double dpPipe;
double dpMainValve;
double ActFlowSpeed;
@@ -2710,29 +2716,28 @@ double TMHZ_K5P::GetPF(double i_bcp, double PP, double HP, double dt, double ep)
}
if (EQ(i_bcp, 1)) //odcięcie - nie rób nic
LimPP = CP;
LimCP = CP;
else if (i_bcp > 1) //hamowanie
LimPP = 3.4;
LimCP = 3.4;
else //luzowanie
LimPP = 5.0;
LimCP = 5.0;
pom = CP;
LimPP = Min0R(LimPP + TP + RedAdj, HP); // pozycja + czasowy lub zasilanie
LimCP = Min0R(LimCP, HP); // pozycja + czasowy lub zasilanie
ActFlowSpeed = 4;
if ((LimPP > CP)) // podwyzszanie szybkie
CP = CP + 9 * Min0R(abs(LimPP - CP), 0.05) * PR(CP, LimPP) * dt; // zbiornik sterujacy;
if ((LimCP > CP)) // podwyzszanie szybkie
CP = CP + 9 * Min0R(abs(LimCP - CP), 0.05) * PR(CP, LimCP) * dt; // zbiornik sterujacy;
else
CP = CP + 9 * Min0R(abs(LimPP - CP), 0.05) * PR(CP, LimPP) * dt; // zbiornik sterujacy
CP = CP + 9 * Min0R(abs(LimCP - CP), 0.05) * PR(CP, LimCP) * dt; // zbiornik sterujacy
LimPP = pom; // cp
dpPipe = Min0R(HP, LimPP);
dpPipe = Min0R(HP, CP + TP + RedAdj);
if (dpPipe > PP)
dpMainValve = -PFVa(HP, PP, ActFlowSpeed / LBDelay, dpPipe, 0.4);
else
dpMainValve = PFVd(PP, 0, ActFlowSpeed / LBDelay, dpPipe, 0.4);
if (EQ(i_bcp, -1))
if ((EQ(i_bcp, -1)&&(AutoOvrld))||(ManualOvrld && ManualOvrldActive))
{
if ((TP < 1))
TP = TP + 0.03 * dt;
@@ -2786,11 +2791,144 @@ double TMHZ_K5P::GetCP()
return RP;
}
void TMHZ_K5P::SetParams(bool AO, bool MO, double, double)
{
AutoOvrld = AO;
ManualOvrld = MO;
}
bool TMHZ_K5P::EQ(double pos, double i_pos)
{
return (pos <= i_pos + 0.5) && (pos > i_pos - 0.5);
}
//---MHZ_6P--- manipulator hamulca zespolonego 6-ciopozycyjny
double TMHZ_6P::GetPF(double i_bcp, double PP, double HP, double dt, double ep) {
static int const LBDelay = 100;
double LimCP;
double dpPipe;
double dpMainValve;
double ActFlowSpeed;
double DP;
double pom;
for (int idx = 0; idx < 5; ++idx) {
Sounds[idx] = 0;
}
DP = 0;
i_bcp = Max0R(Min0R(i_bcp, 3.999), -0.999); // na wszelki wypadek, zeby nie wyszlo poza zakres
if ((TP > 0))
{
DP = 0.004;
TP = TP - DP * dt;
Sounds[s_fv4a_t] = DP;
}
else
{
TP = 0;
}
if (EQ(i_bcp, 2)) //odcięcie - nie rób nic
LimCP = CP;
else if (i_bcp > 2.5) //hamowanie
LimCP = 3.4;
else //luzowanie
LimCP = 5.0;
pom = CP;
LimCP = Min0R(LimCP, HP); // pozycja + czasowy lub zasilanie
ActFlowSpeed = 4;
if ((LimCP > CP)) // podwyzszanie szybkie
CP = CP + 9 * Min0R(abs(LimCP - CP), 0.05) * PR(CP, LimCP) * dt; // zbiornik sterujacy;
else
CP = CP + 9 * Min0R(abs(LimCP - CP), 0.05) * PR(CP, LimCP) * dt; // zbiornik sterujacy
dpPipe = Min0R(HP, CP + TP + RedAdj);
if (Fala && EQ(i_bcp, -1))
{
dpPipe = 5.0 + TP + RedAdj + UnbrakeOverPressure;
ActFlowSpeed = 12;
}
if (dpPipe > PP)
dpMainValve = -PFVa(HP, PP, ActFlowSpeed / LBDelay, dpPipe, 0.4);
else
dpMainValve = PFVd(PP, 0, ActFlowSpeed / LBDelay, dpPipe, 0.4);
if ((EQ(i_bcp, -1) && (AutoOvrld)) || (ManualOvrld && ManualOvrldActive))
{
if ((TP < 1))
TP = TP + 0.03 * dt;
}
if (EQ(i_bcp, 4))
{
DP = PF(0, PP, 2 * ActFlowSpeed / LBDelay);
dpMainValve = DP;
Sounds[s_fv4a_e] = DP;
Sounds[s_fv4a_u] = 0;
Sounds[s_fv4a_b] = 0;
Sounds[s_fv4a_x] = 0;
}
else
{
if (dpMainValve > 0)
Sounds[s_fv4a_b] = dpMainValve;
else
Sounds[s_fv4a_u] = -dpMainValve;
}
return dpMainValve * dt;
}
void TMHZ_6P::Init(double Press)
{
CP = Press;
}
void TMHZ_6P::SetReductor(double nAdj)
{
RedAdj = nAdj;
}
double TMHZ_6P::GetSound(int i)
{
if (i > 4)
return 0;
else
return Sounds[i];
}
double TMHZ_6P::GetPos(int i)
{
return pos_table[i];
}
double TMHZ_6P::GetCP()
{
return RP;
}
void TMHZ_6P::SetParams(bool AO, bool MO, double OverP, double)
{
AutoOvrld = AO;
ManualOvrld = MO;
UnbrakeOverPressure = std::max(0.0, OverP);
Fala = (OverP > 0.01);
}
bool TMHZ_6P::EQ(double pos, double i_pos)
{
return (pos <= i_pos + 0.5) && (pos > i_pos - 0.5);
}
//---M394--- Matrosow
double TM394::GetPF(double i_bcp, double PP, double HP, double dt, double ep)

View File

@@ -513,9 +513,11 @@ class TKE : public TBrake { //Knorr Einheitsbauart — jeden do wszystkiego
//klasa obejmujaca krany
class TDriverHandle {
private:
protected:
// BCP: integer;
bool AutoOvrld = false; //czy jest asymilacja automatyczna na pozycji -1
bool ManualOvrld = false; //czy jest asymilacja reczna przyciskiem
bool ManualOvrldActive = false; //czy jest wcisniety przycisk asymilacji
public:
bool Time = false;
bool TimeEP = false;
@@ -524,10 +526,12 @@ class TDriverHandle {
virtual double GetPF(double i_bcp, double PP, double HP, double dt, double ep);
virtual void Init(double Press);
virtual double GetCP();
virtual void SetReductor(double nAdj);
virtual double GetSound(int i);
virtual double GetPos(int i);
virtual double GetEP(double pos);
virtual void SetReductor(double nAdj); //korekcja pozycji reduktora cisnienia
virtual double GetSound(int i); //pobranie glosnosci wybranego dzwieku
virtual double GetPos(int i); //pobranie numeru pozycji o zadanym kodzie (funkcji)
virtual double GetEP(double pos); //pobranie sily hamulca ep
virtual void SetParams(bool AO, bool MO, double, double) {}; //ustawianie jakichs parametrów dla zaworu
virtual void OvrldButton(bool Active); //przycisk recznego przeladowania/asymilacji
inline TDriverHandle() { memset( Sounds, 0, sizeof( Sounds ) ); }
};
@@ -609,7 +613,7 @@ private:
double TP = 0.0; //zbiornik czasowy
double RP = 0.0; //zbiornik redukcyjny
double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
bool Fala = false;
bool Fala = false; //czy jest napelnianie uderzeniowe
static double const pos_table[11]; //= { -2, 10, -1, 0, 0, 2, 9, 10, 0, 0, 0 };
bool EQ(double pos, double i_pos);
@@ -621,12 +625,40 @@ public:
double GetSound(int i)/*override*/;
double GetPos(int i)/*override*/;
double GetCP()/*override*/;
void SetParams(bool AO, bool MO, double, double); /*ovveride*/
inline TMHZ_K5P(void) :
TDriverHandle()
{}
};
class TMHZ_6P : public TDriverHandle {
private:
double CP = 0.0; //zbiornik sterujący
double TP = 0.0; //zbiornik czasowy
double RP = 0.0; //zbiornik redukcyjny
double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
bool Fala = false; //czy jest napelnianie uderzeniowe
double UnbrakeOverPressure = 0.0; //wartosc napelniania uderzeniowego
static double const pos_table[11]; //= { -2, 10, -1, 0, 0, 2, 9, 10, 0, 0, 0 };
bool EQ(double pos, double i_pos);
public:
double GetPF(double i_bcp, double PP, double HP, double dt, double ep)/*override*/;
void Init(double Press)/*override*/;
void SetReductor(double nAdj)/*override*/;
double GetSound(int i)/*override*/;
double GetPos(int i)/*override*/;
double GetCP()/*override*/;
void SetParams(bool AO, bool MO, double, double); /*ovveride*/
inline TMHZ_6P(void) :
TDriverHandle()
{}
};
/* FBS2= class(TTDriverHandle)
private
CP, TP, RP: real; //zbiornik sterujący, czasowy, redukcyjny