diff --git a/DynObj.cpp b/DynObj.cpp index 9283d57c..cdc43145 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -3198,9 +3198,30 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->EpFuse ) ) { FzadED = std::min( Fzad, FmaxED ); } + /*/ELF - wdrazanie ED po powrocie na utrzymanie hamowania - do usuniecia if (MoverParameters->EIMCtrlType == 2 && MoverParameters->MainCtrlPos < 2 && MoverParameters->eimic > -0.999) { FzadED = std::min(FzadED, MED_oldFED); + } //*/ + //opoznienie wdrazania ED + if (FzadED > MED_oldFED) + { + if (MoverParameters->MED_ED_DelayTimer <= 0) { + MoverParameters->MED_ED_DelayTimer += dt1; + if (MoverParameters->MED_ED_DelayTimer > 0) { + + } + else { + FzadED = std::min(FzadED, MED_oldFED); + } + } + else + { + FzadED = std::min(FzadED, MED_oldFED); + MoverParameters->MED_ED_DelayTimer = (FrED > 0 ? + -MoverParameters->MED_ED_Delay2 : + -MoverParameters->MED_ED_Delay1); + } } if ((MoverParameters->BrakeCtrlPos == MoverParameters->Handle->GetPos(bh_EB)) && (MoverParameters->eimc[eimc_p_abed] < 0.001)) @@ -4191,7 +4212,10 @@ void TDynamicObject::RenderSounds() { // epbrake - epcompact if (( MoverParameters->BrakeSystem == TBrakeSystem::ElectroPneumatic ) && ( MoverParameters->LocHandle )) { - auto const epbrakepressureratio{ std::max( 0.0, MoverParameters->LocHandle->GetCP() ) / std::max(1.0, MoverParameters->MaxBrakePress[0] ) }; + auto const epbrakepressureratio{ std::min( std::max( 0.0, MoverParameters->LocHandle->GetCP() ) / std::max( 1.0, MoverParameters->MaxBrakePress[0] ), + m_epbrakepressurechangedectimer > -1.0f ? + std::max( MoverParameters->LocalBrakePosAEIM, MoverParameters->Hamulec->GetEDBCP() / MoverParameters->MaxBrakePress[3]) : + 1.0 ) }; if ( m_lastepbrakepressure != -1.f ) { // HACK: potentially reset playback of opening bookend sounds if ( false == m_epbrakepressureincrease.is_playing() ) { @@ -4200,27 +4224,33 @@ void TDynamicObject::RenderSounds() { if ( false == m_epbrakepressuredecrease.is_playing() ) { m_epbrakepressuredecrease.stop(); } + m_epbrakepressurechangeinctimer += dt; + m_epbrakepressurechangedectimer += dt; // actual sound playback auto const epquantizedratio{ static_cast( 50 * epbrakepressureratio) }; auto const lastepbrakepressureratio { std::max( 0.f, m_lastepbrakepressure ) / std::max( 1.0, MoverParameters->MaxBrakePress[0] ) }; auto const epquantizedratiochange { epquantizedratio - static_cast( 50 * lastepbrakepressureratio ) }; - if ( epquantizedratiochange > 0 ) { + if ( epquantizedratiochange > 0 && m_epbrakepressurechangeinctimer > 0.05f) { m_epbrakepressureincrease .pitch( true == m_epbrakepressureincrease.is_combined() ? epquantizedratio * 0.01f : m_epbrakepressureincrease.m_frequencyoffset + m_epbrakepressureincrease.m_frequencyfactor * 1.f ) .play(); + m_epbrakepressurechangeinctimer = 0; } - else if ( epquantizedratiochange < 0 ) { + else if ( epquantizedratiochange < 0 && m_epbrakepressurechangedectimer > 0.3f) { m_epbrakepressuredecrease .pitch(true == m_epbrakepressuredecrease.is_combined() ? - epquantizedratio * 0.01f : + -epquantizedratiochange * 0.01f : m_epbrakepressuredecrease.m_frequencyoffset + m_epbrakepressuredecrease.m_frequencyfactor * 1.f ) .play(); + m_epbrakepressurechangedectimer = 0; } } - m_lastepbrakepressure = MoverParameters->LocHandle->GetCP(); + if ( ( m_epbrakepressurechangeinctimer == 0 ) || ( m_epbrakepressurechangedectimer == 0 ) ) + m_lastepbrakepressure = std::min( MoverParameters->LocHandle->GetCP(), + MoverParameters->LocalBrakePosAEIM * std::max( 1.0, MoverParameters->MaxBrakePress[0] ) ); } // emergency brake diff --git a/DynObj.h b/DynObj.h index df44a7ff..49cd960c 100644 --- a/DynObj.h +++ b/DynObj.h @@ -503,6 +503,8 @@ private: sound_source m_epbrakepressuredecrease{ sound_placement::external }; float m_lastepbrakepressure{ -1.f }; // helper, cached level of pressure in the brake cylinder float m_epbrakepressurechange{ 0.f }; // recent change of pressure in the brake cylinder + float m_epbrakepressurechangeinctimer{ 0.f }; // last time of change of pressure in the brake cylinder - increase + float m_epbrakepressurechangedectimer{ 0.f }; // last time of change of pressure in the brake cylinder - decrease sound_source m_emergencybrake { sound_placement::engine }; double m_emergencybrakeflow{ 0.f }; sound_source sReleaser { sound_placement::external }; diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index badb39de..1daac212 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1314,6 +1314,8 @@ public: bool MED_Ncor = 0; // czy korekcja sily hamowania z uwzglednieniem nacisku double MED_MinBrakeReqED = 0; // minimalne zadanie sily hamowania uruchamiajace ED - ponizej tylko EP double MED_FrED_factor = 1; // mnoznik sily hamowania ED do korekty blendingu + double MED_ED_Delay1 = 0; // opoznienie wdrazania hamowania ED (pierwszy raz) + double MED_ED_Delay2 = 0; // opoznienie zwiekszania sily hamowania ED (kolejne razy) int DCEMUED_CC { 0 }; //na którym sprzęgu sprawdzać działanie ED double DCEMUED_EP_max_Vel{ 0.0 }; //maksymalna prędkość, przy której działa EP przy włączonym ED w jednostce (dla tocznych) @@ -1602,6 +1604,7 @@ public: double eimicSpeedCtrlIntegral = 0; /*calkowany blad ustawienia predkosci*/ double NewSpeed = 0; /*nowa predkosc do zadania*/ double MED_EPVC_CurrentTime = 0; /*aktualny czas licznika czasu korekcji siły EP*/ + double MED_ED_DelayTimer = 0; /*aktualny czas licznika opoznienia hamowania ED*/ /*-zmienne dla drezyny*/ double PulseForce = 0.0; /*przylozona sila*/ diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 8839c4f3..6313505d 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -10534,6 +10534,8 @@ void TMoverParameters::LoadFIZ_Blending(std::string const &line) { extract_value(MED_Ncor, "MED_Ncor", line, ""); extract_value(MED_MinBrakeReqED, "MED_MinBrakeReqED", line, ""); extract_value(MED_FrED_factor, "MED_FrEDFactor", line, ""); + extract_value(MED_ED_Delay1, "MED_FirstDelayED", line, ""); + extract_value(MED_ED_Delay2, "MED_ScndDelayED", line, ""); } void TMoverParameters::LoadFIZ_DCEMUED(std::string const &line) {