From 2afae2787328f0282bb535774c4555503a263f73 Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Sun, 22 Apr 2018 16:17:25 +0200 Subject: [PATCH 1/4] minor tweaks and bug fixes --- Driver.cpp | 20 +++++++++++--------- McZapkie/Mover.cpp | 8 ++++---- keyboardinput.cpp | 4 ++-- uilayer.cpp | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index 09a065b9..c8f71f9f 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -854,17 +854,19 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN } // koniec obsługi przelotu na W4 else { // zatrzymanie na W4 - if (!eSignNext) //jeśli nie widzi następnego sygnału - eSignNext = sSpeedTable[i].evEvent; //ustawia dotychczasową - if (mvOccupied->Vel > 0.3) // jeśli jedzie (nie trzeba czekać, aż się - // drgania wytłumią - drzwi zamykane od 1.0) - sSpeedTable[i].fVelNext = 0; // to będzie zatrzymanie - // else if - // ((iDrivigFlags&moveStopCloser)?sSpeedTable[i].fDist<=fMaxProximityDist*(AIControllFlag?1.0:10.0):true) + if( !eSignNext ) { + //jeśli nie widzi następnego sygnału ustawia dotychczasową + eSignNext = sSpeedTable[ i ].evEvent; + } + if( mvOccupied->Vel > 0.3 ) { + // jeśli jedzie (nie trzeba czekać, aż się drgania wytłumią - drzwi zamykane od 1.0) to będzie zatrzymanie + sSpeedTable[ i ].fVelNext = 0; + } else if ((iDrivigFlags & moveStopCloser) ? sSpeedTable[i].fDist + fLength <= - Max0R(sSpeedTable[i].evEvent->ValueGet(2), - fMaxProximityDist + fLength) : + std::max( + sSpeedTable[i].evEvent->ValueGet(2), + 2.0 * fMaxProximityDist + fLength) : // fmaxproximitydist typically equals ~50 m sSpeedTable[i].fDist < d_to_next_sem) // Ra 2F1I: odległość plus długość pociągu musi być mniejsza od długości // peronu, chyba że pociąg jest dłuższy, to wtedy minimalna diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index a50487d4..e647a0e8 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -3331,7 +3331,7 @@ void TMoverParameters::CompressorCheck(double dt) { // zasilanie sprężarki w członie ra z członu silnikowego (sprzęg 1) if( Couplers[ side::rear ].Connected != NULL ) { CompressorFlag = ( - ( ( CompressorAllow ) || ( CompressorStart == start::automatic ) ) + ( ( Couplers[ side::rear ].Connected->CompressorAllow ) || ( CompressorStart == start::automatic ) ) && ( CompressorAllowLocal ) && ( Couplers[ side::rear ].Connected->ConverterFlag ) ); } @@ -3344,7 +3344,7 @@ void TMoverParameters::CompressorCheck(double dt) { // zasilanie sprężarki w członie ra z członu silnikowego (sprzęg 1) if( Couplers[ side::front ].Connected != NULL ) { CompressorFlag = ( - ( ( CompressorAllow ) || ( CompressorStart == start::automatic ) ) + ( ( Couplers[ side::front ].Connected->CompressorAllow ) || ( CompressorStart == start::automatic ) ) && ( CompressorAllowLocal ) && ( Couplers[ side::front ].Connected->ConverterFlag ) ); } @@ -3407,7 +3407,7 @@ void TMoverParameters::CompressorCheck(double dt) { // zasilanie sprężarki w członie ra z członu silnikowego (sprzęg 1) if( Couplers[ side::rear ].Connected != NULL ) { CompressorFlag = ( - ( ( CompressorAllow ) || ( CompressorStart == start::automatic ) ) + ( ( Couplers[ side::rear ].Connected->CompressorAllow ) || ( CompressorStart == start::automatic ) ) && ( CompressorAllowLocal ) && ( Couplers[ side::rear ].Connected->ConverterFlag ) ); } @@ -3420,7 +3420,7 @@ void TMoverParameters::CompressorCheck(double dt) { // zasilanie sprężarki w członie ra z członu silnikowego (sprzęg 1) if( Couplers[ side::front ].Connected != NULL ) { CompressorFlag = ( - ( ( CompressorAllow ) || ( CompressorStart == start::automatic ) ) + ( ( Couplers[ side::front ].Connected->CompressorAllow ) || ( CompressorStart == start::automatic ) ) && ( CompressorAllowLocal ) && ( Couplers[ side::front ].Connected->ConverterFlag ) ); } diff --git a/keyboardinput.cpp b/keyboardinput.cpp index 76d5da28..e092e5c9 100644 --- a/keyboardinput.cpp +++ b/keyboardinput.cpp @@ -334,9 +334,9 @@ keyboard_input::default_bindings() { // epbrakecontroltoggle { GLFW_KEY_Z | keymodifier::control }, // trainbrakeoperationmodeincrease - { GLFW_KEY_KP_3 | keymodifier::shift | keymodifier::control }, + { GLFW_KEY_KP_2 | keymodifier::control }, // trainbrakeoperationmodedecrease - { GLFW_KEY_KP_9 | keymodifier::shift | keymodifier::control }, + { GLFW_KEY_KP_8 | keymodifier::control }, // brakeactingspeedincrease { GLFW_KEY_B | keymodifier::shift }, // brakeactingspeeddecrease diff --git a/uilayer.cpp b/uilayer.cpp index 21b71d02..0898df17 100644 --- a/uilayer.cpp +++ b/uilayer.cpp @@ -429,7 +429,7 @@ ui_layer::update() { uitextline2 += ( vehicle->MoverParameters->OilPump.is_active ? "O" : ( vehicle->MoverParameters->OilPump.is_enabled ? "o" : "." ) ); uitextline2 += ( false == vehicle->MoverParameters->ConverterAllowLocal ? "-" : ( vehicle->MoverParameters->ConverterAllow ? ( vehicle->MoverParameters->ConverterFlag ? "X" : "x" ) : "." ) ); uitextline2 += ( vehicle->MoverParameters->ConvOvldFlag ? "!" : "." ); - uitextline2 += ( false == vehicle->MoverParameters->CompressorAllowLocal ? "-" : ( ( vehicle->MoverParameters->CompressorAllow || vehicle->MoverParameters->CompressorPower > 1 ) ? ( vehicle->MoverParameters->CompressorFlag ? "C" : "c" ) : "." ) ); + uitextline2 += ( vehicle->MoverParameters->CompressorFlag ? "C" : ( false == vehicle->MoverParameters->CompressorAllowLocal ? "-" : ( ( vehicle->MoverParameters->CompressorAllow || vehicle->MoverParameters->CompressorStart == start::automatic ) ? "c" : "." ) ) ); uitextline2 += ( vehicle->MoverParameters->CompressorGovernorLock ? "!" : "." ); auto const train { Global.pWorld->train() }; From c57f0097d34ca42f9697ba20708f6060c249e698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Sat, 21 Apr 2018 22:15:20 +0200 Subject: [PATCH 2/4] Fix in AI DecBrake() for MHZ_EN57 --- Driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Driver.cpp b/Driver.cpp index c8f71f9f..c1ac9334 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -2628,7 +2628,7 @@ bool TController::DecBrake() case ElectroPneumatic: if (mvOccupied->EngineType == ElectricInductionMotor) { if (mvOccupied->BrakeHandle == MHZ_EN57) { - if (mvOccupied->BrakeCtrlPos > mvOccupied->Handle->GetPos(bh_MB)) + if (mvOccupied->BrakeCtrlPos > mvOccupied->Handle->GetPos(bh_RP)) OK = mvOccupied->BrakeLevelAdd(-1.0); } else { From 64ffdbf690932d7fcee99d4150274320af964ec2 Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Mon, 23 Apr 2018 02:45:36 +0200 Subject: [PATCH 3/4] passenger stop ai logic tweaks, engine turbo sound volume change rate unification --- Driver.cpp | 114 +++++++++++++++++++++++++++-------------------------- DynObj.cpp | 37 +++++++---------- 2 files changed, 72 insertions(+), 79 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index c1ac9334..3c165ca6 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -797,6 +797,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN double v; // prędkość double d; // droga double d_to_next_sem = 10000.0; //ustaiwamy na pewno dalej niż widzi AI + bool isatpassengerstop { false }; // true if the consist is within acceptable range of w4 post TCommandType go = cm_Unknown; eSignNext = NULL; // te flagi są ustawiane tutaj, w razie potrzeby @@ -852,8 +853,20 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN continue; // nie analizować prędkości } } // koniec obsługi przelotu na W4 - else - { // zatrzymanie na W4 + else { + // zatrzymanie na W4 + isatpassengerstop = ( + // Ra 2F1I: odległość plus długość pociągu musi być mniejsza od długości + // peronu, chyba że pociąg jest dłuższy, to wtedy minimalna. + // jeśli długość peronu ((sSpeedTable[i].evEvent->ValueGet(2)) nie podana, + // przyjąć odległość fMinProximityDist + ( iDrivigFlags & moveStopCloser ) ? + ( sSpeedTable[ i ].fDist + fLength ) <= + std::max( + sSpeedTable[ i ].evEvent->ValueGet( 2 ), + 2.0 * fMaxProximityDist + fLength ) : // fmaxproximitydist typically equals ~50 m + sSpeedTable[ i ].fDist < d_to_next_sem ); + if( !eSignNext ) { //jeśli nie widzi następnego sygnału ustawia dotychczasową eSignNext = sSpeedTable[ i ].evEvent; @@ -862,17 +875,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN // jeśli jedzie (nie trzeba czekać, aż się drgania wytłumią - drzwi zamykane od 1.0) to będzie zatrzymanie sSpeedTable[ i ].fVelNext = 0; } - else if ((iDrivigFlags & moveStopCloser) ? - sSpeedTable[i].fDist + fLength <= - std::max( - sSpeedTable[i].evEvent->ValueGet(2), - 2.0 * fMaxProximityDist + fLength) : // fmaxproximitydist typically equals ~50 m - sSpeedTable[i].fDist < d_to_next_sem) - // Ra 2F1I: odległość plus długość pociągu musi być mniejsza od długości - // peronu, chyba że pociąg jest dłuższy, to wtedy minimalna - // jeśli długość peronu ((sSpeedTable[i].evEvent->ValueGet(2)) nie podana, - // przyjąć odległość fMinProximityDist - { // jeśli się zatrzymał przy W4, albo stał w momencie zobaczenia W4 + else if( true == isatpassengerstop ) { + // jeśli się zatrzymał przy W4, albo stał w momencie zobaczenia W4 if( !AIControllFlag ) { // w razie przełączenia na AI ma nie podciągać do W4, gdy użytkownik zatrzymał za daleko iDrivigFlags &= ~moveStopCloser; @@ -881,8 +885,9 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN if( ( iDrivigFlags & moveDoorOpened ) == 0 ) { // drzwi otwierać jednorazowo iDrivigFlags |= moveDoorOpened; // nie wykonywać drugi raz - Doors( true, static_cast( std::floor( sSpeedTable[ i ].evEvent->ValueGet( 2 ) ) ) % 10 ); + Doors( true, static_cast( std::floor( std::abs( sSpeedTable[ i ].evEvent->ValueGet( 2 ) ) ) ) % 10 ); } + if (TrainParams->UpdateMTable( simulation::Time, asNextStop) ) { // to się wykona tylko raz po zatrzymaniu na W4 if( TrainParams->StationIndex < TrainParams->StationCount ) { @@ -892,7 +897,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN } // perform loading/unloading - auto const platformside = static_cast( std::floor( sSpeedTable[ i ].evEvent->ValueGet( 2 ) ) ) % 10; + auto const platformside = static_cast( std::floor( std::abs( sSpeedTable[ i ].evEvent->ValueGet( 2 ) ) ) ) % 10; auto const exchangetime = simulation::Station.update_load( pVehicles[ 0 ], *TrainParams, platformside ); WaitingSet( std::max( -fStopTime, exchangetime ) ); // na końcu rozkładu się ustawia 60s i tu by było skrócenie @@ -936,29 +941,21 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN continue; } } - if (OrderCurrentGet() == Shunt) - { + + if (OrderCurrentGet() == Shunt) { OrderNext(Obey_train); // uruchomić jazdę pociągową CheckVehicles(); // zmienić światła } - if (TrainParams->StationIndex < TrainParams->StationCount) - { // jeśli są dalsze stacje, czekamy do godziny odjazdu - if (TrainParams->IsTimeToGo(simulation::Time.data().wHour, simulation::Time.data().wMinute)) - { // z dalszą akcją czekamy do godziny odjazdu - /* potencjalny problem z ruszaniem z w4 - if (TrainParams->CheckTrainLatency() < 0) - WaitingSet(20); //Jak spóźniony to czeka 20s - */ - // iDrivigFlags|=moveLate1; //oflagować, gdy odjazd ze - // spóźnieniem, będzie jechał forsowniej - fLastStopExpDist = - mvOccupied->DistCounter + 0.050 + - 0.001 * fLength; // przy jakim dystansie (stanie licznika) - // ma przesunąć na następny postój - // Controlled-> //zapisać odległość do przejechania + + if (TrainParams->StationIndex < TrainParams->StationCount) { + // jeśli są dalsze stacje, czekamy do godziny odjazdu + if (TrainParams->IsTimeToGo(simulation::Time.data().wHour, simulation::Time.data().wMinute)) { + // z dalszą akcją czekamy do godziny odjazdu + isatpassengerstop = false; + // przy jakim dystansie (stanie licznika) ma przesunąć na następny postój + fLastStopExpDist = mvOccupied->DistCounter + 0.050 + 0.001 * fLength; TrainParams->StationIndexInc(); // przejście do następnej asNextStop = TrainParams->NextStop(); // pobranie kolejnego miejsca zatrzymania -// TableClear(); //aby od nowa sprawdziło W4 z inną nazwą już - to nie jest dobry pomysł #if LOGSTOPS WriteLog( pVehicle->asName + " as " + TrainParams->TrainName @@ -990,8 +987,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN continue; // nie analizować prędkości } // koniec startu z zatrzymania } // koniec obsługi początkowych stacji - else - { // jeśli dojechaliśmy do końca rozkładu + else { + // jeśli dojechaliśmy do końca rozkładu #if LOGSTOPS WriteLog( pVehicle->asName + " as " + TrainParams->TrainName @@ -1026,7 +1023,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN continue; // nie analizować prędkości } } // koniec obsługi W4 - v = sSpeedTable[i].fVelNext; // odczyt prędkości do zmiennej pomocniczej + v = sSpeedTable[ i ].fVelNext; // odczyt prędkości do zmiennej pomocniczej if( sSpeedTable[ i ].iFlags & spSwitch ) { // zwrotnice są usuwane z tabelki dopiero po zjechaniu z nich iDrivigFlags |= moveSwitchFound; // rozjazd z przodu/pod ogranicza np. sens skanowania wstecz @@ -1190,12 +1187,13 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN { // zawalidrogi nie ma (albo pojazd jest samochodem), sprawdzić sygnał if (sSpeedTable[i].iFlags & spShuntSemaphor) // jeśli Tm - w zasadzie to sprawdzić komendę! { // jeśli podana prędkość manewrowa - if ((OrderCurrentGet() & Obey_train) ? v == 0.0 : false) - { // jeśli tryb pociągowy a tarcze ma ShuntVelocity 0 0 + if( ( v == 0.0 ) && ( true == TestFlag( OrderCurrentGet(), Obey_train ) ) ) { + // jeśli tryb pociągowy a tarcze ma ShuntVelocity 0 0 v = -1; // ignorować, chyba że prędkość stanie się niezerowa - if (sSpeedTable[i].iFlags & spElapsed) // a jak przejechana - sSpeedTable[i].iFlags = 0; // to można usunąć, bo podstawowy automat - // usuwa tylko niezerowe + if( true == TestFlag( sSpeedTable[ i ].iFlags, spElapsed ) ) { + // a jak przejechana to można usunąć, bo podstawowy automat usuwa tylko niezerowe + sSpeedTable[ i ].iFlags = 0; + } } else if (go == cm_Unknown) // jeśli jeszcze nie ma komendy if (v != 0.0) // komenda jest tylko gdy ma jechać, bo stoi na podstawie @@ -1269,19 +1267,19 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN } } // jeśli nie ma zawalidrogi } // jeśli event - if (v >= 0.0) - { // pozycje z prędkością -1 można spokojnie pomijać + + if (v >= 0.0) { + // pozycje z prędkością -1 można spokojnie pomijać d = sSpeedTable[i].fDist; if( ( d > 0.0 ) && ( false == TestFlag( sSpeedTable[ i ].iFlags, spElapsed ) ) ) { // sygnał lub ograniczenie z przodu (+32=przejechane) // 2014-02: jeśli stoi, a ma do przejechania kawałek, to niech jedzie - if( ( mvOccupied->Vel == 0.0 ) - && ( d > fMaxProximityDist ) - && ( true == TestFlag( sSpeedTable[ i ].iFlags, ( spEnabled | spEvent | spPassengerStopPoint ) ) ) ) { + if( ( mvOccupied->Vel < 0.01 ) + && ( true == TestFlag( sSpeedTable[ i ].iFlags, ( spEnabled | spEvent | spPassengerStopPoint ) ) ) + && ( false == isatpassengerstop ) ) { // ma podjechać bliżej - czy na pewno w tym miejscu taki warunek? - a = ( - iDrivigFlags & moveStopCloser ? + a = ( iDrivigFlags & moveStopCloser ? fAcc : 0.0 ); } @@ -1351,14 +1349,16 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN VelSignalLast = -1.0; // jeśli mieliśmy ograniczenie z semafora i nie ma przed nami //analiza spisanych z tabelki ograniczeń i nadpisanie aktualnego - if (VelSignalLast >= 0.0) - fVelDes = Min0R(fVelDes, VelSignalLast); - if (VelLimitLast >= 0.0) - fVelDes = Min0R(fVelDes, VelLimitLast); - if (VelRoad >= 0.0) - fVelDes = Min0R(fVelDes, VelRoad); - if( VelRestricted >= 0.0 ) - fVelDes = Min0R( fVelDes, VelRestricted ); + if( ( true == isatpassengerstop ) && ( mvOccupied->Vel < 0.01 ) ) { + // if stopped at a valid passenger stop, hold there + fVelDes = 0.0; + } + else { + fVelDes = min_speed( fVelDes, VelSignalLast ); + fVelDes = min_speed( fVelDes, VelLimitLast ); + fVelDes = min_speed( fVelDes, VelRoad ); + fVelDes = min_speed( fVelDes, VelRestricted ); + } // nastepnego semafora albo zwrotnicy to uznajemy, że mijamy W5 FirstSemaphorDist = d_to_next_sem; // przepisanie znalezionej wartosci do zmiennej return go; @@ -4443,6 +4443,8 @@ TController::UpdateSituation(double dt) { } } break; + default: + break; } if( VelNext == 0.0 ) { diff --git a/DynObj.cpp b/DynObj.cpp index df23e13b..888acc47 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -6117,40 +6117,31 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub if( Vehicle.TurboTest > 0 ) { // udawanie turbo: auto const goalpitch { std::max( 0.025, ( engine_volume + engine_turbo.m_frequencyoffset ) * engine_turbo.m_frequencyfactor ) }; - auto const goalvolume { std::max( 0.0, ( engine_turbo_pitch + engine_turbo.m_amplitudeoffset ) * engine_turbo.m_amplitudefactor ) }; + auto const goalvolume { ( + ( ( Vehicle.MainCtrlPos >= Vehicle.TurboTest ) && ( Vehicle.enrot > 0.1 ) ) ? + std::max( 0.0, ( engine_turbo_pitch + engine_turbo.m_amplitudeoffset ) * engine_turbo.m_amplitudefactor ) : + 0.0 ) }; auto const currentvolume { engine_turbo.gain() }; auto const changerate { 0.4 * Deltatime }; - if( ( Vehicle.MainCtrlPos >= Vehicle.TurboTest ) - && ( Vehicle.enrot > 0.1 ) ) { + engine_turbo_pitch = ( + engine_turbo_pitch > goalpitch ? + std::max( goalpitch, engine_turbo_pitch - changerate * 0.5 ) : + std::min( goalpitch, engine_turbo_pitch + changerate ) ); - engine_turbo_pitch = ( - engine_turbo_pitch > goalpitch ? - std::max( goalpitch, engine_turbo_pitch - changerate * 0.5 ) : - std::min( goalpitch, engine_turbo_pitch + changerate ) ); - - volume = ( - currentvolume > goalvolume ? - std::max( goalvolume, currentvolume - changerate ) : - std::min( goalvolume, currentvolume + changerate ) ); + volume = ( + currentvolume > goalvolume ? + std::max( goalvolume, currentvolume - changerate ) : + std::min( goalvolume, currentvolume + changerate ) ); + if( volume > 0.05 ) { engine_turbo .pitch( 0.4 + engine_turbo_pitch * 0.4 ) .gain( volume ) .play( sound_flags::exclusive | sound_flags::looping ); } else { - engine_turbo_pitch = std::max( goalpitch, engine_turbo_pitch - changerate * 0.5 ); - volume = std::max( 0.0, engine_turbo.gain() - 2.0 * Deltatime ); - if( volume > 0.05 ) { - engine_turbo - .pitch( 0.4 + engine_turbo_pitch * 0.4 ) - .gain( volume ); - } - else { - engine_turbo.stop(); - engine_turbo_pitch = goalpitch; - } + engine_turbo.stop(); } } From 139b49734ee543a8158707852828b33b9910207f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Sun, 22 Apr 2018 21:29:58 +0200 Subject: [PATCH 4/4] Adding more parameters for blendingE P and ED brakes --- DynObj.cpp | 10 +++++----- McZapkie/MOVER.h | 10 +++++++++- McZapkie/Mover.cpp | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index 888acc47..5cca786c 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -2955,7 +2955,7 @@ bool TDynamicObject::Update(double dt, double dt1) p->MoverParameters->BrakeCylNo * p->MoverParameters->BrakeRigEff; FmaxPN += Nmax * p->MoverParameters->Hamulec->GetFC( Nmax / (p->MoverParameters->NAxles * p->MoverParameters->NBpA), - p->MoverParameters->Vmax) * + p->MoverParameters->MED_Vref) * 1000; // sila hamowania pn FmaxED += ((p->MoverParameters->Mains) && (p->MoverParameters->ActiveDir != 0) && (p->MoverParameters->eimc[eimc_p_Fh] * p->MoverParameters->NPoweredAxles > @@ -2974,7 +2974,7 @@ bool TDynamicObject::Update(double dt, double dt1) osie += p->MoverParameters->NAxles; } - auto const amax = FmaxPN / masamax; + auto const amax = std::min(FmaxPN / masamax, MoverParameters->MED_amax); if ((MoverParameters->Vel < 0.5) && (MoverParameters->BrakePress > 0.2) || (dDoorMoveL > 0.001) || (dDoorMoveR > 0.001)) { @@ -3044,7 +3044,7 @@ bool TDynamicObject::Update(double dt, double dt1) FmaxEP[i] = Nmax * p->MoverParameters->Hamulec->GetFC( Nmax / (p->MoverParameters->NAxles * p->MoverParameters->NBpA), - p->MoverParameters->Vmax) * + p->MoverParameters->MED_Vref) * 1000; // sila hamowania pn PrzekrF[i] = false; @@ -3106,10 +3106,10 @@ bool TDynamicObject::Update(double dt, double dt1) p->MoverParameters->BrakeCylMult[0] - p->MoverParameters->BrakeSlckAdj) * p->MoverParameters->BrakeCylNo * p->MoverParameters->BrakeRigEff; + float VelC = ((FrED > 0.1) || p->MoverParameters->MED_EPVC ? clamp(p->MoverParameters->Vel, p->MoverParameters->MED_Vmin, p->MoverParameters->MED_Vmax) : p->MoverParameters->MED_Vref);//korekcja EP po prędkości float FmaxPoj = Nmax * p->MoverParameters->Hamulec->GetFC( - Nmax / (p->MoverParameters->NAxles * p->MoverParameters->NBpA), - p->MoverParameters->Vel) * + Nmax / (p->MoverParameters->NAxles * p->MoverParameters->NBpA), VelC) * 1000; // sila hamowania pn p->MoverParameters->LocalBrakePosA = (p->MoverParameters->SlippingWheels ? 0 : FzEP[i] / FmaxPoj); if (p->MoverParameters->LocalBrakePosA>0.009) diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 4a1cd438..17bef5a5 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -922,9 +922,16 @@ public: double Ftmax = 0.0; /*- dla lokomotyw z silnikami indukcyjnymi -*/ double eimc[26]; - bool EIMCLogForce; // + bool EIMCLogForce = false; // static std::vector const eimc_labels; double InverterFrequency { 0.0 }; // current frequency of power inverters + /* -dla pojazdów z blendingiem EP/ED (MED) */ + double MED_Vmax = 0; // predkosc maksymalna dla obliczen chwilowej sily hamowania EP w MED + double MED_Vmin = 0; // predkosc minimalna dla obliczen chwilowej sily hamowania EP w MED + double MED_Vref = 0; // predkosc referencyjna dla obliczen dostepnej sily hamowania EP w MED + double MED_amax = 9.81; // maksymalne opoznienie hamowania sluzbowego MED + bool MED_EPVC = 0; // czy korekcja sily hamowania EP, gdy nie ma dostepnego ED + bool MED_Ncor = 0; // czy korekcja sily hamowania z uwzglednieniem nacisku /*-dla wagonow*/ float MaxLoad = 0.f; /*masa w T lub ilosc w sztukach - ladownosc*/ std::string LoadAccepted; std::string LoadQuantity; /*co moze byc zaladowane, jednostki miary*/ @@ -1375,6 +1382,7 @@ private: void LoadFIZ_BuffCoupl( std::string const &line, int const Index ); void LoadFIZ_TurboPos( std::string const &line ); void LoadFIZ_Cntrl( std::string const &line ); + void LoadFIZ_Blending(std::string const &line); void LoadFIZ_Light( std::string const &line ); void LoadFIZ_Security( std::string const &line ); void LoadFIZ_Clima( std::string const &line ); diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index e647a0e8..4422b0c3 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -7432,6 +7432,14 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) continue; } + if (issection("Blending:", inputline)) { + + startBPT = true; LISTLINE = 0; + fizlines.emplace( "Blending", inputline); + LoadFIZ_Blending( inputline ); + continue; + } + if( issection( "Light:", inputline ) ) { startBPT = false; @@ -8195,6 +8203,16 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) { } } +void TMoverParameters::LoadFIZ_Blending(std::string const &line) { + + extract_value(MED_Vmax, "MED_Vmax", line, to_string(Vmax)); + extract_value(MED_Vmin, "MED_Vmin", line, "0"); + extract_value(MED_Vref, "MED_Vref", line, to_string(Vmax)); + extract_value(MED_amax, "MED_amax", line, "9.81"); + MED_EPVC = (extract_value("MED_EPVC", line).find("Yes") != std::string::npos); + MED_Ncor = (extract_value("MED_Ncor", line).find("Yes") != std::string::npos); + +} void TMoverParameters::LoadFIZ_Light( std::string const &line ) { LightPowerSource.SourceType = LoadFIZ_SourceDecode( extract_value( "Light", line ) );