mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
Add new var sSemNextStop which looks at first semaphor which have Vel=0 and is proper for train mode.
sSemNext always look at first semaphor which is proper for train mode.
This commit is contained in:
48
Driver.cpp
48
Driver.cpp
@@ -473,21 +473,20 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
||||
}
|
||||
// znaleziono semafor lub tarczę lub tor z prędkością zero
|
||||
// trzeba sprawdzić czy to nadał semafor
|
||||
// WriteLog("TableTraceRoute: check semaphor");
|
||||
// WriteLog("TableTraceRoute: "+OwnerName()+" check semaphor... ");
|
||||
// if (sSemNext)
|
||||
// WriteLog(sSemNext->TableText());
|
||||
if (sSemNext &&
|
||||
sSemNext->fVelNext ==
|
||||
if (sSemNextStop &&
|
||||
sSemNextStop->fVelNext ==
|
||||
0.0) // jeśli jest następny semafor to sprawdzamy czy to on nadał zero
|
||||
{
|
||||
// WriteLog("TableTraceRoute: "+sSemNext->TableText());
|
||||
if ((OrderCurrentGet() & Obey_train) && (sSemNext->iFlags & spSemaphor))
|
||||
if ((OrderCurrentGet() & Obey_train) && (sSemNextStop->iFlags & spSemaphor))
|
||||
return;
|
||||
else if ((OrderCurrentGet() < 0x40) &&
|
||||
(sSemNext->iFlags & (spSemaphor | spShuntSemaphor | spOutsideStation)))
|
||||
(sSemNextStop->iFlags & (spSemaphor | spShuntSemaphor | spOutsideStation)))
|
||||
return;
|
||||
}
|
||||
|
||||
pTrack = sSpeedTable[iLast].trTrack; // ostatnio sprawdzony tor
|
||||
if (!pTrack)
|
||||
return; // koniec toru, to nie ma co sprawdzać (nie ma prawa tak być)
|
||||
@@ -526,10 +525,12 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
||||
{
|
||||
fDistance = fCurrentDistance; // jeśli sygnał stop, to nie ma
|
||||
// potrzeby dalej skanować
|
||||
sSemNext = &sSpeedTable[iLast];
|
||||
sSemNextStop = &sSpeedTable[iLast];
|
||||
if (!sSemNext)
|
||||
sSemNext = &sSpeedTable[iLast];
|
||||
WriteLog("Signal stop. Next Semaphor ", false);
|
||||
if (sSemNext)
|
||||
WriteLog(sSemNext->GetName());
|
||||
if (sSemNextStop)
|
||||
WriteLog(sSemNextStop->GetName());
|
||||
else
|
||||
WriteLog("none");
|
||||
}
|
||||
@@ -701,6 +702,8 @@ void TController::TableCheck(double fDistance)
|
||||
sSpeedTable[j].iFlags = 0;
|
||||
if (&sSpeedTable[j] == sSemNext)
|
||||
sSemNext = NULL; // przy kasowaniu tabelki zrzucamy także semafor
|
||||
if (&sSpeedTable[j] == sSemNextStop)
|
||||
sSemNextStop = NULL; // przy kasowaniu tabelki zrzucamy także semafor
|
||||
}
|
||||
WriteLog("TableCheck: Delete entries OK.");
|
||||
WriteLog("TableCheck: New last element: " + sSpeedTable[i].GetName());
|
||||
@@ -1049,21 +1052,31 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
// sprawdzanie eventów pasywnych miniętych
|
||||
if (sSpeedTable[i].fDist < 0.0 && sSemNext == &sSpeedTable[i])
|
||||
{
|
||||
WriteLog("TableUpdate: semaphor " + sSemNext->GetName() + " passed");
|
||||
WriteLog("TableUpdate: semaphor " + sSemNext->GetName() + " passed by " + OwnerName());
|
||||
sSemNext = NULL; // jeśli minęliśmy semafor od ograniczenia to go kasujemy ze
|
||||
// zmiennej sprawdzającej dla skanowania w przód
|
||||
}
|
||||
if (sSpeedTable[i].fDist < 0.0 && sSemNextStop == &sSpeedTable[i])
|
||||
{
|
||||
WriteLog("TableUpdate: semaphor " + sSemNextStop->GetName() + " passed by " + OwnerName());
|
||||
sSemNextStop = NULL; // jeśli minęliśmy semafor od ograniczenia to go kasujemy ze
|
||||
// zmiennej sprawdzającej dla skanowania w przód
|
||||
}
|
||||
if (sSpeedTable[i].fDist > 0.0 &&
|
||||
sSpeedTable[i].IsProperSemaphor(OrderCurrentGet()) &&
|
||||
(!sSemNext ||
|
||||
(sSemNext && sSemNext->fVelNext != 0 && sSpeedTable[i].fVelNext == 0)))
|
||||
sSpeedTable[i].IsProperSemaphor(OrderCurrentGet()))
|
||||
{
|
||||
if (!sSemNext)
|
||||
{
|
||||
sSemNext = &sSpeedTable[i]; // jeśli jest mienięty poprzedni
|
||||
// semafor a wcześniej
|
||||
// byl nowy to go dorzucamy do zmiennej, żeby cały
|
||||
// czas widział najbliższy
|
||||
WriteLog("TableUpdate: Next semaphor: " + sSemNext->GetName());
|
||||
WriteLog("TableUpdate: Next semaphor: " + sSemNext->GetName() + " by " + OwnerName());
|
||||
}
|
||||
if (!sSemNextStop || (sSemNextStop && sSemNextStop->fVelNext != 0 &&
|
||||
sSpeedTable[i].fVelNext == 0))
|
||||
sSemNextStop = &sSpeedTable[i];
|
||||
}
|
||||
if (sSpeedTable[i].iFlags & spOutsideStation)
|
||||
{ // jeśli W5, to reakcja zależna od trybu jazdy
|
||||
if (OrderCurrentGet() & Obey_train)
|
||||
@@ -1354,6 +1367,8 @@ void TController::TablePurger()
|
||||
sSpeedTable[i] = sSpeedTable[(i + 1) % iSpeedTableSize]; // skopiowanie
|
||||
if (&sSpeedTable[(i + 1) % iSpeedTableSize] == sSemNext)
|
||||
sSemNext = &sSpeedTable[i]; // przeniesienie znacznika o semaforze
|
||||
if (&sSpeedTable[(i + 1) % iSpeedTableSize] == sSemNextStop)
|
||||
sSemNextStop = &sSpeedTable[i]; // przeniesienie znacznika o semaforze
|
||||
}
|
||||
WriteLog("Odtykacz usuwa pozycję");
|
||||
iLast = (iLast - 1 + iSpeedTableSize) % iSpeedTableSize; // cofnięcie z zawinięciem
|
||||
@@ -1370,6 +1385,8 @@ void TController::TablePurger()
|
||||
t[++j] = sSpeedTable[i];
|
||||
if (&sSpeedTable[i] == sSemNext)
|
||||
sSemNext = &t[j]; // przeniesienie znacznika o semaforze
|
||||
if (&sSpeedTable[i] == sSemNextStop)
|
||||
sSemNextStop = &t[j]; // przeniesienie znacznika o semaforze
|
||||
i = (i + 1) % iSpeedTableSize; // kolejna pozycja mogą być zawinięta
|
||||
}
|
||||
iFirst = 0; // teraz będzie od zera
|
||||
@@ -1479,6 +1496,7 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
|
||||
fMass = 0.0; //[kg]
|
||||
eSignNext = NULL; // sygnał zmieniający prędkość, do pokazania na [F2]
|
||||
sSemNext = NULL; // pierwszy semafor w przebiegu
|
||||
sSemNextStop = NULL; // pierwszy semafor z sygnałem stój
|
||||
fShuntVelocity = 40; // domyślna prędkość manewrowa
|
||||
fStopTime = 0.0; // czas postoju przed dalszą jazdą (np. na przystanku)
|
||||
iDrivigFlags = moveStopPoint; // podjedź do W4 możliwie blisko
|
||||
@@ -4191,7 +4209,7 @@ bool TController::UpdateSituation(double dt)
|
||||
TrainParams
|
||||
->TTVmax); // jesli nie spozniony to nie przekraczać rozkladowej
|
||||
if (VelDesired > 0.0)
|
||||
if (VelNext > 0.0 || (iDrivigFlags & moveStopHere)==0)
|
||||
if ((sSemNext && sSemNext->fVelNext != 0.0) || (iDrivigFlags & moveStopHere)==0)
|
||||
{ // jeśli można jechać, to odpalić dźwięk kierownika oraz zamknąć drzwi w
|
||||
// składzie, jeśli nie mamy czekać na sygnał też trzeba odpalić
|
||||
if (iDrivigFlags & moveGuardSignal)
|
||||
|
||||
1
Driver.h
1
Driver.h
@@ -171,6 +171,7 @@ class TController
|
||||
TTrack *tLast; // ostatni analizowany tor
|
||||
TEvent *eSignSkip; // można pominąć ten SBL po zatrzymaniu
|
||||
TSpeedPos *sSemNext; // następny semafor na drodze zależny od trybu jazdy
|
||||
TSpeedPos *sSemNextStop; // następny semafor na drodze zależny od trybu jazdy i na stój
|
||||
private: // parametry aktualnego składu
|
||||
double fLength; // długość składu (do wyciągania z ograniczeń)
|
||||
double fMass; // całkowita masa do liczenia stycznej składowej grawitacji
|
||||
|
||||
Reference in New Issue
Block a user