diff --git a/Driver.cpp b/Driver.cpp index 15275845..f4561e68 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -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; diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 9092074c..a286f238 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -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 const eimv_labels; diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 67c43ee4..93f048f6 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -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 {