16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-18 00:49:19 +02:00

Additionl 0 position for EIM EMUs, configurable Elf controller, first try of speedcontrol for EN57A

This commit is contained in:
Królik Uszasty
2019-05-08 21:44:19 +02:00
committed by tmj-fstate
parent 9185030b4b
commit 2db964ea40
3 changed files with 63 additions and 28 deletions

View File

@@ -2844,20 +2844,20 @@ bool TController::IncBrake()
bool TController::IncBrakeEIM()
{ // zwiększenie hamowania
bool OK = false;
switch (mvControlling->EIMCtrlType)
switch (mvOccupied->EIMCtrlType)
{
case 0:
OK = mvControlling->IncLocalBrakeLevel(1);
OK = mvOccupied->IncLocalBrakeLevel(1);
break;
case 1:
OK = mvControlling->MainCtrlPos > 0;
OK = mvOccupied->MainCtrlPos > 0;
if (OK)
mvControlling->MainCtrlPos = 0;
mvOccupied->MainCtrlPos = 0;
break;
case 2:
OK = mvControlling->MainCtrlPos > 1;
OK = mvOccupied->MainCtrlPos > 1;
if (OK)
mvControlling->MainCtrlPos = 1;
mvOccupied->MainCtrlPos = 1;
break;
}
return OK;
@@ -2936,20 +2936,20 @@ bool TController::DecBrake()
bool TController::DecBrakeEIM()
{ // zmniejszenie siły hamowania
bool OK = false;
switch (mvControlling->EIMCtrlType)
switch (mvOccupied->EIMCtrlType)
{
case 0:
OK = mvControlling->DecLocalBrakeLevel(1);
OK = mvOccupied->DecLocalBrakeLevel(1);
break;
case 1:
OK = mvControlling->MainCtrlPos < 2;
OK = mvOccupied->MainCtrlPos < 2;
if (OK)
mvControlling->MainCtrlPos = 2;
mvOccupied->MainCtrlPos = 2;
break;
case 2:
OK = mvControlling->MainCtrlPos < 3;
OK = mvOccupied->MainCtrlPos < 3;
if (OK)
mvControlling->MainCtrlPos = 3;
mvOccupied->MainCtrlPos = 3;
break;
}
return OK;

View File

@@ -1312,6 +1312,8 @@ public:
double eim_localbrake = 0; /*nastawa hamowania dodatkowego pneumatycznego lokomotywy*/
int EIMCtrlType = 0; /*rodzaj wariantu zadajnika jazdy*/
bool SpeedCtrlTypeTime = false; /*czy tempomat sterowany czasowo*/
int SpeedCtrlAutoTurnOffFlag = 0; /*czy tempomat sam się wyłącza*/
bool EIMCtrlAdditionalZeros = false; /*czy ma dodatkowe zero jazdy i zero hamowania */
double eimv_pr = 0; /*realizowany procent dostepnej sily rozruchu/hamowania*/
double eimv[21];
static std::vector<std::string> const eimv_labels;

View File

@@ -2001,6 +2001,10 @@ bool TMoverParameters::IncScndCtrl(int CtrlSpeed)
ScndCtrlActualPos = Round(Vel);
else
ScndCtrlActualPos = Round(Vel * 0.5);
if ((EIMCtrlType == 0)&&(SpeedCtrlAutoTurnOffFlag == 1))
{
MainCtrlActualPos = MainCtrlPos;
}
SendCtrlToNext("SpeedCntrl", ScndCtrlActualPos, CabNo);
}
@@ -6018,6 +6022,13 @@ void TMoverParameters::CheckEIMIC(double dt)
{
case 0:
eimic = (LocalBrakeRatio() > 0.01 ? -LocalBrakeRatio() : (double)MainCtrlPos / (double)MainCtrlPosNo);
if (EIMCtrlAdditionalZeros)
{
if (eimic > 0.001)
eimic = std::max(0.002, eimic * (double)MainCtrlPosNo / ((double)MainCtrlPosNo - 1.0) - 1.0 / ((double)MainCtrlPosNo - 1.0));
if (eimic < -0.001)
eimic = std::min(-0.002, eimic * (double)LocalBrakePosNo / ((double)LocalBrakePosNo - 1.0) + 1.0 / ((double)LocalBrakePosNo - 1.0));
}
break;
case 1:
switch (MainCtrlPos)
@@ -6068,23 +6079,34 @@ void TMoverParameters::CheckEIMIC(double dt)
}
break;
case 2:
switch (MainCtrlPos)
if ((MainCtrlActualPos != MainCtrlPos) || (LastRelayTime>InitialCtrlDelay))
{
case 0:
case 1:
eimic -= clamp(1.0 + eimic, 0.0, dt*0.15); //odejmuj do -1
if (eimic > 0) eimic = 0;
break;
case 2:
eimic -= clamp(0.0 + eimic, 0.0, dt*0.15); //odejmuj do 0
break;
case 3:
eimic += clamp(0.0 - eimic, 0.0, dt*0.15); //dodawaj do 0
break;
case 4:
eimic += clamp(1.0 - eimic, 0.0, dt*0.15); //dodawaj do 1
if (eimic < 0) eimic = 0;
break;
double delta = (MainCtrlActualPos == MainCtrlPos ? dt*CtrlDelay : 0.01);
switch (MainCtrlPos)
{
case 0:
case 1:
eimic -= clamp(1.0 + eimic, 0.0, delta); //odejmuj do -1
if (eimic > 0) eimic = 0;
break;
case 2:
eimic -= clamp(0.0 + eimic, 0.0, delta); //odejmuj do 0
break;
case 3:
eimic += clamp(0.0 - eimic, 0.0, delta); //dodawaj do 0
break;
case 4:
eimic += clamp(1.0 - eimic, 0.0, delta); //dodawaj do 1
if (eimic < 0) eimic = 0;
break;
}
}
if (MainCtrlActualPos == MainCtrlPos)
LastRelayTime += dt;
else
{
LastRelayTime = 0;
MainCtrlActualPos = MainCtrlPos;
}
break;
case 3:
@@ -6108,6 +6130,15 @@ void TMoverParameters::CheckSpeedCtrl()
eimicSpeedCtrl = clamp(0.5 * (ScndCtrlActualPos * 2 - Vel), -1.0, 1.0);
else
eimicSpeedCtrl = 1;
if ((EIMCtrlType == 0) && (SpeedCtrlAutoTurnOffFlag == 1) && (MainCtrlActualPos != MainCtrlPos))
{
DecScndCtrl(1);
if (CabNo == 0)
{
SendCtrlToNext("ScndCtrl", ScndCtrlPos, 1);
SendCtrlToNext("ScndCtrl", ScndCtrlPos, -1);
}
}
}
// *************************************************************************************************
@@ -8708,6 +8739,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
extract_value( EIMCtrlType, "EIMCtrlType", line, "" );
clamp( EIMCtrlType, 0, 3 );
LocHandleTimeTraxx = (extract_value("LocalBrakeTraxx", line) == "Yes");
EIMCtrlAdditionalZeros = (extract_value("EIMCtrlAddZeros", line) == "Yes");
extract_value( ScndS, "ScndS", line, "" ); // brak pozycji rownoleglej przy niskiej nastawie PSR
@@ -8730,6 +8762,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
(extract_value("SpeedCtrlType", line) == "Time") ?
true :
false;
extract_value(SpeedCtrlAutoTurnOffFlag, "SpeedCtrlATOF", line, "");
// converter
{