diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 77ed3e3f..f02bd64d 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1306,6 +1306,7 @@ public: double eimic = 0; /*aktualna pozycja zintegrowanego sterowania jazda i hamowaniem*/ double eimic_real = 0; /*faktycznie uzywana pozycja zintegrowanego sterowania jazda i hamowaniem*/ int EIMCtrlType = 0; /*rodzaj wariantu zadajnika jazdy*/ + bool SpeedCtrlTypeTime = false; /*czy tempomat sterowany czasowo*/ 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 2dfc3537..c3f0c534 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -5011,7 +5011,44 @@ double TMoverParameters::TractionForce( double dt ) { { if( true == Mains ) { //tempomat - if (ScndCtrlPosNo > 1) + if (ScndCtrlPosNo == 4 && SpeedCtrlTypeTime) + { + switch (ScndCtrlPos) { + case 0: + NewSpeed = 0; + ScndCtrlActualPos = 0; + SpeedCtrlTimer = 10; + break; + case 1: + if (SpeedCtrlTimer > SpeedCtrlDelay) { + SpeedCtrlTimer = 0; + NewSpeed -= 10; + if (NewSpeed < 0) NewSpeed = 0; + } + else + SpeedCtrlTimer += dt; + break; + case 2: + SpeedCtrlTimer = 10; + ScndCtrlActualPos = NewSpeed; + break; + case 3: + if (SpeedCtrlTimer > SpeedCtrlDelay) { + SpeedCtrlTimer = 0; + NewSpeed += 10; + if (NewSpeed > Vmax) NewSpeed = Vmax; + } + else + SpeedCtrlTimer += dt; + break; + case 4: + NewSpeed = Vmax; + ScndCtrlActualPos = Vmax; + SpeedCtrlTimer = 10; + break; + } + } + else if (ScndCtrlPosNo > 1) { if (ScndCtrlPos != NewSpeed) { @@ -8604,6 +8641,10 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) { // speed control extract_value( SpeedCtrlDelay, "SpeedCtrlDelay", line, "" ); + SpeedCtrlTypeTime = + (extract_value("SpeedCtrlType", line) == "Time") ? + true : + false; // converter { diff --git a/Train.cpp b/Train.cpp index 41c0416a..6c2da0f5 100644 --- a/Train.cpp +++ b/Train.cpp @@ -453,6 +453,7 @@ dictionary_source *TTrain::GetTrainState() { dict->insert( "main_ctrl_actual_pos", mover->MainCtrlActualPos ); dict->insert( "scndctrl_pos", mover->ScndCtrlPos ); dict->insert( "scnd_ctrl_actual_pos", mover->ScndCtrlActualPos ); + dict->insert( "new_speed", mover->NewSpeed); // brakes dict->insert( "manual_brake", ( mvOccupied->ManualBrakePos > 0 ) ); bool const bEP = ( mvControlled->LocHandle->GetCP() > 0.2 ) || ( fEIMParams[ 0 ][ 2 ] > 0.01 );