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