From beede908856cc9cb3da18d5502eab62717c0e0dd Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Sat, 21 Apr 2018 14:38:02 +0200 Subject: [PATCH] train timetable rewind fix --- Driver.cpp | 82 ++++++++++++++++++++++++---------------------- McZapkie/Mover.cpp | 27 ++++++++------- mtable.cpp | 55 ++++++++++++++----------------- mtable.h | 2 +- 4 files changed, 82 insertions(+), 84 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index 38d5c3a7..857202e3 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -815,8 +815,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN { // porównuje do następnej stacji, więc trzeba przewinąć do poprzedniej // nastepnie ustawić następną na aktualną tak żeby prawidłowo ją obsłużył w następnym kroku - TrainParams->RewindTimeTable(sSpeedTable[i].evEvent->CommandGet()); - asNextStop = TrainParams->NextStop(); + if( true == TrainParams->RewindTimeTable( sSpeedTable[ i ].evEvent->CommandGet() ) ) { + asNextStop = TrainParams->NextStop(); + iStationStart = TrainParams->StationIndex; + } } else if( sSpeedTable[ i ].fDist < -fLength ) { // jeśli został przejechany @@ -996,13 +998,13 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN #endif asNextStop = TrainParams->NextStop(); // informacja o końcu trasy TrainParams->NewName("none"); // czyszczenie nieaktualnego rozkładu - // TableClear(); //aby od nowa sprawdziło W4 z inną nazwą już - to - // nie jest dobry pomysł - iDrivigFlags &= - ~(moveStopCloser | - moveStopPoint); // ma nie podjeżdżać pod W4 i ma je pomijać - sSpeedTable[i].iFlags = - 0; // W4 nie liczy się już (nie wyśle SetVelocity) + // ma nie podjeżdżać pod W4 i ma je pomijać + iDrivigFlags &= ~( moveStopCloser ); + if( false == TestFlag( iDrivigFlags, movePushPull ) ) { + // if the consist can change direction through a simple cab change it doesn't need fiddling with recognition of passenger stops + iDrivigFlags &= ~( moveStopPoint ); + } + sSpeedTable[i].iFlags = 0; // W4 nie liczy się już (nie wyśle SetVelocity) sSpeedTable[i].fVelNext = -1; // można jechać za W4 fLastStopExpDist = -1.0f; // nie ma rozkładu, nie ma usuwania stacji WaitingSet(60); // tak ze 2 minuty, aż wszyscy wysiądą @@ -3271,8 +3273,7 @@ bool TController::PutCommand( std::string NewCommand, double NewValue1, double N // CheckVehicles(); //sprawdzenie składu, AI zapali światła TableClear(); // wyczyszczenie tabelki prędkości, bo na nowo trzeba określić kierunek i // sprawdzić przystanki - OrdersInit( - fabs(NewValue1)); // ustalenie tabelki komend wg rozkładu oraz prędkości początkowej + OrdersInit(fabs(NewValue1)); // ustalenie tabelki komend wg rozkładu oraz prędkości początkowej // if (NewValue1!=0.0) if (!AIControllFlag) DirectionForward(NewValue1>0.0); //ustawienie // nawrotnika użytkownikowi (propaguje się do członów) // if (NewValue1>0) @@ -5375,8 +5376,6 @@ inline TOrders TController::OrderNextGet() void TController::OrdersInit(double fVel) { // wypełnianie tabelki rozkazów na podstawie rozkładu // ustawienie kolejności komend, niezależnie kto prowadzi - // Mechanik->OrderPush(Wait_for_orders); //czekanie na lepsze czasy - // OrderPos=OrderTop=0; //wypełniamy od pozycji 0 OrdersClear(); // usunięcie poprzedniej tabeli OrderPush(Prepare_engine); // najpierw odpalenie silnika if (TrainParams->TrainName == "none") @@ -5390,16 +5389,14 @@ void TController::OrdersInit(double fVel) OrderPush(Shunt); // dla prędkości 0.01 włączamy jazdę manewrową else if (TrainParams ? (TrainParams->DirectionChange() ? // jeśli obrót na pierwszym przystanku - ((iDrivigFlags & - movePushPull) ? // SZT również! SN61 zależnie od wagonów... + ((iDrivigFlags & movePushPull) ? // SZT również! SN61 zależnie od wagonów... (TrainParams->TimeTable[1].StationName == TrainParams->Relation1) : false) : false) : true) OrderPush(Shunt); // a teraz start będzie w manewrowym, a tryb pociągowy włączy W4 else - // jeśli start z pierwszej stacji i jednocześnie jest na niej zmiana kierunku, to EZT ma - // mieć Shunt + // jeśli start z pierwszej stacji i jednocześnie jest na niej zmiana kierunku, to EZT ma mieć Shunt OrderPush(Obey_train); // dla starych scenerii start w trybie pociagowym if (DebugModeFlag) // normalnie nie ma po co tego wypisywać WriteLog("/* Timetable: " + TrainParams->ShowRelation()); @@ -5407,10 +5404,14 @@ void TController::OrdersInit(double fVel) for (int i = 0; i <= TrainParams->StationCount; ++i) { t = TrainParams->TimeTable + i; - if (DebugModeFlag) // normalnie nie ma po co tego wypisywa? - WriteLog(t->StationName + " " + std::to_string(t->Ah) + ":" + - std::to_string(t->Am) + ", " + std::to_string(t->Dh) + ":" + - std::to_string(t->Dm) + " " + t->StationWare); + if (DebugModeFlag) { + // normalnie nie ma po co tego wypisywa? + WriteLog( + t->StationName + + " " + std::to_string(t->Ah) + ":" + std::to_string(t->Am) + + ", " + std::to_string(t->Dh) + ":" + std::to_string(t->Dm) + + " " + t->StationWare); + } if (t->StationWare.find('@') != std::string::npos) { // zmiana kierunku i dalsza jazda wg rozk?adu if (iDrivigFlags & movePushPull) // SZT również! SN61 zależnie od wagonów... @@ -5421,33 +5422,34 @@ void TController::OrdersInit(double fVel) { // dla zwykłego składu wagonowego odczepiamy lokomotywę OrderPush(Disconnect); // odczepienie lokomotywy OrderPush(Shunt); // a dalej manewry - if (i <= TrainParams->StationCount) // 130827: to się jednak nie sprawdza - { //"@" na ostatniej robi tylko odpięcie - // OrderPush(Change_direction); //zmiana kierunku - // OrderPush(Shunt); //jazda na drugą stronę składu - // OrderPush(Change_direction); //zmiana kierunku - // OrderPush(Connect); //jazda pod wagony - } } if (i < TrainParams->StationCount) // jak nie ostatnia stacja OrderPush(Obey_train); // to dalej wg rozkładu } } - if (DebugModeFlag) // normalnie nie ma po co tego wypisywać - WriteLog("*/"); + if( DebugModeFlag ) { + // normalnie nie ma po co tego wypisywać + WriteLog( "*/" ); + } OrderPush(Shunt); // po wykonaniu rozkładu przełączy się na manewry } // McZapkie-100302 - to ma byc wyzwalane ze scenerii - if (fVel == 0.0) - SetVelocity(0, 0, stopSleep); // jeśli nie ma prędkości początkowej, to śpi - else - { // jeśli podana niezerowa prędkość - if ((fVel >= 1.0) || - (fVel < 0.02)) // jeśli ma jechać - dla 0.01 ma podjechać manewrowo po podaniu sygnału - iDrivigFlags = (iDrivigFlags & ~moveStopHere) | - moveStopCloser; // to do następnego W4 ma podjechać blisko - else - iDrivigFlags |= moveStopHere; // czekać na sygnał + if( fVel == 0.0 ) { + // jeśli nie ma prędkości początkowej, to śpi + SetVelocity( 0, 0, stopSleep ); + } + else { + // jeśli podana niezerowa prędkość + if( ( fVel >= 1.0 ) + || ( fVel < 0.02 ) ) { + // jeśli ma jechać - dla 0.01 ma podjechać manewrowo po podaniu sygnału + // to do następnego W4 ma podjechać blisko + iDrivigFlags = ( iDrivigFlags & ~( moveStopHere ) ) | moveStopCloser; + } + else { + // czekać na sygnał + iDrivigFlags |= moveStopHere; + } JumpToFirstOrder(); if (fVel >= 1.0) // jeśli ma jechać SetVelocity(fVel, -1); // ma ustawić żądaną prędkość diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 4caeffdc..a50487d4 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -1479,6 +1479,7 @@ void TMoverParameters::compute_movement_( double const Deltatime ) { } } // uklady hamulcowe: + ConverterCheck( Deltatime ); if (VeselVolume > 0) Compressor = CompressedVolume / VeselVolume; else @@ -1486,7 +1487,6 @@ void TMoverParameters::compute_movement_( double const Deltatime ) { Compressor = 0; CompressorFlag = false; }; - ConverterCheck(Deltatime); if( CompressorSpeed > 0.0 ) { // sprężarka musi mieć jakąś niezerową wydajność żeby rozważać jej załączenie i pracę CompressorCheck( Deltatime ); @@ -3791,17 +3791,12 @@ void TMoverParameters::UpdateScndPipePressure(double dt) } Pipe2->Flow(Hamulec->GetHPFlow(ScndPipePress, dt)); -/* // NOTE: condition disabled to allow the air flow from the main hose to the main tank as well - if (((Compressor > ScndPipePress) && (CompressorSpeed > 0.0001)) || (TrainType == dt_EZT)) - { -*/ + if( /* ( ( Compressor > ScndPipePress ) && ( */ VeselVolume > 0.0 /* ) ) || ( TrainType == dt_EZT ) || ( TrainType == dt_DMU ) */ ) { dV = PF(Compressor, ScndPipePress, Spz) * dt; CompressedVolume += dV / 1000.0; Pipe2->Flow(-dV); -/* } -*/ Pipe2->Flow(dv1 + dv2); Pipe2->Act(); ScndPipePress = Pipe2->P(); @@ -8864,9 +8859,10 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir) WriteLog( "Ready to depart" ); CompressedVolume = VeselVolume * MinCompressor * ( 9.8 ) / 10.0; ScndPipePress = ( - VeselVolume > 0.0 ? - CompressedVolume / VeselVolume : - 0.0 ); + VeselVolume > 0.0 ? CompressedVolume / VeselVolume : + ( Couplers[ side::front ].AllowedFlag & coupling::mainhose ) != 0 ? 5.0 : + ( Couplers[ side::rear ].AllowedFlag & coupling::mainhose ) != 0 ? 5.0 : + 0.0 ); PipePress = CntrlPipePress; BrakePress = 0.0; LocalBrakePos = 0; @@ -8889,7 +8885,14 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir) WriteLog( "Braked" ); Volume = BrakeVVolume * MaxBrakePress[ 3 ]; CompressedVolume = VeselVolume * MinCompressor * 0.55; +/* ScndPipePress = 5.1; +*/ + ScndPipePress = ( + VeselVolume > 0.0 ? CompressedVolume / VeselVolume : + ( Couplers[ side::front ].AllowedFlag & coupling::mainhose ) != 0 ? 5.1 : + ( Couplers[ side::rear ].AllowedFlag & coupling::mainhose ) != 0 ? 5.1 : + 0.0 ); PipePress = LowPipePress; PipeBrakePress = MaxBrakePress[ 3 ] * 0.5; BrakePress = MaxBrakePress[ 3 ] * 0.5; @@ -8957,9 +8960,9 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir) CompressorPower = 0; Hamulec->Init(PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); - +/* ScndPipePress = Compressor; - +*/ // WriteLogSS("OK=", BoolTo10(OK)); // WriteLog(""); diff --git a/mtable.cpp b/mtable.cpp index 0cc1870d..90e77d9d 100644 --- a/mtable.cpp +++ b/mtable.cpp @@ -83,8 +83,7 @@ bool TTrainParameters::UpdateMTable(double hh, double mm, std::string const &New { if (NewName == NextStationName) // jeśli dojechane do następnego { // Ra: wywołanie może być powtarzane, jak stoi na W4 - if (TimeTable[StationIndex + 1].km - TimeTable[StationIndex].km < - 0) // to jest bez sensu + if (TimeTable[StationIndex + 1].km - TimeTable[StationIndex].km < 0) // to jest bez sensu Direction = -1; else Direction = 1; // prowizorka bo moze byc zmiana kilometrazu @@ -92,46 +91,40 @@ bool TTrainParameters::UpdateMTable(double hh, double mm, std::string const &New LastStationLatency = CompareTime(hh, mm, TimeTable[StationIndex].Dh, TimeTable[StationIndex].Dm); // inc(StationIndex); //przejście do następnej pozycji StationIndex<=StationCount - if (StationIndex < - StationCount) // Ra: "<", bo dodaje 1 przy przejściu do następnej stacji - { // jeśli nie ostatnia stacja + // Ra: "<", bo dodaje 1 przy przejściu do następnej stacji + if (StationIndex < StationCount) { + // jeśli nie ostatnia stacja NextStationName = TimeTable[StationIndex + 1].StationName; // zapamiętanie nazwy - TTVmax = TimeTable[StationIndex + 1] - .vmax; // Ra: nowa prędkość rozkładowa na kolejnym odcinku + // Ra: nowa prędkość rozkładowa na kolejnym odcinku + TTVmax = TimeTable[StationIndex + 1].vmax; + } + else { + // gdy ostatnia stacja, nie ma następnej stacji + NextStationName = ""; } - else // gdy ostatnia stacja - NextStationName = ""; // nie ma następnej stacji OK = true; } } return OK; /*czy jest nastepna stacja*/ } -void Mtable::TTrainParameters::RewindTimeTable(std::string actualStationName) -{ - //actualStationName = ToLower(actualStationName); // na małe znaki - if (int s = actualStationName.find("PassengerStopPoint:") != std::string::npos) - { - actualStationName = ToLower(actualStationName.substr(s + 19)); +bool Mtable::TTrainParameters::RewindTimeTable(std::string actualStationName) { + + if( actualStationName.compare( 0, 19, "PassengerStopPoint:" ) == 0 ) { + actualStationName = ToLower( actualStationName.substr( 19 ) ); } - for (int i = 1; i <= StationCount; i++) - { // przechodzimy po całej tabelce i sprawdzamy nazwy stacji (bez pierwszej) - if (ToLower(TimeTable[i].StationName) == actualStationName) - { // nazwa stacji zgodna - // więc ustawiamy na poprzednią, żeby w następnym kroku poprawnie obsłużyć - StationIndex = i - 1; - if (StationIndex < - StationCount) // Ra: "<", bo dodaje 1 przy przejściu do następnej stacji - { // jeśli nie ostatnia stacja - NextStationName = TimeTable[StationIndex + 1].StationName; // zapamiętanie nazwy - TTVmax = TimeTable[StationIndex + 1] - .vmax; // Ra: nowa prędkość rozkładowa na kolejnym odcinku - } - else // gdy ostatnia stacja - NextStationName = ""; // nie ma następnej stacji - break; // znaleźliśmy więc kończymy + for( auto i = 1; i <= StationCount; ++i ) { + // przechodzimy po całej tabelce i sprawdzamy nazwy stacji (bez pierwszej) + if (ToLower(TimeTable[i].StationName) == actualStationName) { + // nazwa stacji zgodna więc ustawiamy na poprzednią, żeby w następnym kroku poprawnie obsłużyć + StationIndex = i; + NextStationName = TimeTable[ i ].StationName; + TTVmax = TimeTable[ i ].vmax; + return true; // znaleźliśmy więc kończymy } } + // failed to find a match + return false; } void TTrainParameters::StationIndexInc() diff --git a/mtable.h b/mtable.h index a456cffc..458162a2 100644 --- a/mtable.h +++ b/mtable.h @@ -77,7 +77,7 @@ class TTrainParameters bool IsTimeToGo(double hh, double mm); bool UpdateMTable(double hh, double mm, std::string const &NewName); bool UpdateMTable( simulation_time const &Time, std::string const &NewName ); - void RewindTimeTable( std::string actualStationName ); + bool RewindTimeTable( std::string actualStationName ); TTrainParameters( std::string const &NewTrainName ); void NewName(std::string const &NewTrainName); void UpdateVelocity(int StationCount, double vActual);