From a1e4e8d95b4d383e744a2bb1ad224027528d2e6b Mon Sep 17 00:00:00 2001 From: maj00r Date: Tue, 8 Sep 2026 19:53:06 +0200 Subject: [PATCH] Prevent overcharge by AI - count how long each vehicle is being under higher pressure --- McZapkie/MOVER.h | 1 + McZapkie/Mover.cpp | 2 ++ vehicle/Driver.cpp | 37 ++++++++++++++++++++----------------- vehicle/Driver.h | 2 ++ 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 14d173c1..54b10409 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1648,6 +1648,7 @@ class TMoverParameters double Handle_OverloadPressureDecrease = 0.002; // predkosc spadku cisnienia przy asymilacji /*max. cisnienie w cyl. ham., stala proporcjonalnosci p-K*/ double HighPipePress = 0.0; + double PipeOverchargeTime = 0.0; // [s] double LowPipePress = 0.0; double DeltaPipePress = 0.0; /*max. i min. robocze cisnienie w przewodzie glownym oraz roznica miedzy nimi*/ diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index ea63ff0f..cdb74894 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -4790,6 +4790,8 @@ void TMoverParameters::UpdatePipePressure(double dt) if (CompressedVolume < 0.0) CompressedVolume = 0.0; + + PipeOverchargeTime = ( PipePress > HighPipePress + 0.2 ? PipeOverchargeTime + dt : 0.0 ); } // ************************************************************************************************* diff --git a/vehicle/Driver.cpp b/vehicle/Driver.cpp index 6424e1ff..5cbe0385 100644 --- a/vehicle/Driver.cpp +++ b/vehicle/Driver.cpp @@ -6250,6 +6250,7 @@ TController::determine_consist_state() { mvOccupied->PipePress < std::max(3.9, mvOccupied->BrakePressureActual.PipePressureVal) + 0.1; fAccGravity = 0.0; // przyspieszenie wynikające z pochylenia IsAnyCouplerStretched = false; + IsAnyPipeOvercharged = false; IsAnyDoorOnlyOpen[ side::right ] = IsAnyDoorOnlyOpen[ side::left ] = false; IsAnyDoorOpen[ side::right ] = IsAnyDoorOpen[ side::left ] = false; IsAnyDoorPermitActive[ side::right ] = IsAnyDoorPermitActive[ side::left ] = false; @@ -6267,29 +6268,30 @@ TController::determine_consist_state() { vehicle->Fb * 0.001 > 10.0 ) ) { // once in motion we can make a more lenient check Ready = false; } - // Ra: odluźnianie przeładowanych lokomotyw, ciągniętych na zimno - prowizorka... - if( bp >= 0.4 ) { // wg UIC określone sztywno na 0.04 - if( AIControllFlag || (Global.AITrainman && mvOccupied->Vel < EU07_AI_NOMOVEMENT && !is_emu() && !is_dmu())) { - if( BrakeCtrlPosition == gbh_RP // jest pozycja jazdy - && false == TestFlag(vehicle->Hamulec->GetBrakeStatus(), b_dmg) // brake isn't broken - && vehicle->PipePress - mvOccupied->Handle->GetRP() > -0.1 // jeśli ciśnienie jak dla jazdy - && vehicle->Hamulec->GetCRP() > vehicle->PipePress + 0.12 ) { // za dużo w zbiorniku - // indywidualne luzowanko - vehicle->BrakeReleaser( 1 ); - } + // Ra: odluźnianie przeładowanych lokomotyw, ciągniętych na zimno - prowizorka... + if( bp >= 0.4 ) { // wg UIC określone sztywno na 0.04 + if( AIControllFlag || (Global.AITrainman && mvOccupied->Vel < EU07_AI_NOMOVEMENT && !is_emu() && !is_dmu())) { + if( BrakeCtrlPosition == gbh_RP // jest pozycja jazdy + && false == TestFlag(vehicle->Hamulec->GetBrakeStatus(), b_dmg) // brake isn't broken + && vehicle->PipePress - mvOccupied->Handle->GetRP() > -0.1 // jeśli ciśnienie jak dla jazdy + && vehicle->Hamulec->GetCRP() > vehicle->PipePress + 0.12 ) { // za dużo w zbiorniku + // indywidualne luzowanko + vehicle->BrakeReleaser( 1 ); } } - if (bp < 0.1) { - if ( AIControllFlag || Global.AITrainman ) { - if (false == TestFlag(vehicle->Hamulec->GetBrakeStatus(), b_dmg) // brake isn't broken - && vehicle->Hamulec->GetCRP() < vehicle->PipePress - 0.1 ) { // już nie jest za dużo w zbiorniku - // koniec indywidualnego luzowanka - vehicle->BrakeReleaser( 0 ); + } + if (bp < 0.1) { + if ( AIControllFlag || Global.AITrainman ) { + if (false == TestFlag(vehicle->Hamulec->GetBrakeStatus(), b_dmg) // brake isn't broken + && vehicle->Hamulec->GetCRP() < vehicle->PipePress - 0.1 ) { // już nie jest za dużo w zbiorniku + // koniec indywidualnego luzowanka + vehicle->BrakeReleaser( 0 ); } } } } fReady = std::max( bp, fReady ); // szukanie najbardziej zahamowanego + IsAnyPipeOvercharged |= vehicle->PipeOverchargeTime > EU07_AI_OVERCHARGETIME; if( ( dy = p->VectorFront().y ) != 0.0 ) { // istotne tylko dla pojazdów na pochyleniu // ciężar razy składowa styczna grawitacji @@ -8507,7 +8509,8 @@ void TController::control_main_pipe() { if( mvOccupied->Compressor < 5.0 || ( BrakeCtrlPosition < gbh_RP - && mvOccupied->EqvtPipePress > (fReady < 0.25 ? 5.1 : 5.2) ) ) { + && ( mvOccupied->EqvtPipePress > (fReady < 0.25 ? 5.1 : 5.2) + || IsAnyPipeOvercharged ) ) ) { cue_action( driver_hint::trainbrakerelease ); } } diff --git a/vehicle/Driver.h b/vehicle/Driver.h index 6222db62..27b19bea 100644 --- a/vehicle/Driver.h +++ b/vehicle/Driver.h @@ -23,6 +23,7 @@ auto const EU07_AI_ACCELERATION = 0.05; auto const EU07_AI_NOACCELERATION = -0.05; auto const EU07_AI_BRAKINGTESTACCELERATION = -0.06; auto const EU07_AI_NOMOVEMENT = 0.05; // standstill velocity threshold +auto const EU07_AI_OVERCHARGETIME = 3.0; // [s] auto const EU07_AI_MOVEMENT = 1.0; // deliberate movement velocity threshold auto const EU07_AI_SECONDARYSCANINTERVAL = 5.0; // s - a secondary scans for a wake-up less often than the primary auto const EU07_AI_SPEEDLIMITEXTENDSBEYONDSCANRANGE = 10000.0; @@ -652,6 +653,7 @@ private: bool IsCargoTrain{ false }; bool IsHeavyCargoTrain{ false }; double fReady = 0.0; // poziom odhamowania wagonów + bool IsAnyPipeOvercharged { false }; bool Ready = false; // ABu: stan gotowosci do odjazdu - sprawdzenie odhamowania wagonow bool IsConsistBraked { false }; double ConsistShade{ 1.0 }; // averaged amount of sunlight received by the consist