Changes to TSpeedPos array to prevent not clearing of.

This commit is contained in:
firleju
2015-12-25 09:19:44 +01:00
parent 7e1c172ce8
commit 0c48ee726a

View File

@@ -241,9 +241,12 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
fVelNext = 30.0; // uzależnić prędkość od promienia; albo niech będzie
// ograniczona w skrzyżowaniu (velocity z ujemną wartością)
if ((iFlags & spElapsed) == 0) // jeśli nie wjechał
if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd
fVelNext =
0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto)
if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd
{
WriteLog("Tor " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + trTrack->iNumDynamics + "Dist= " + fDist);
fVelNext =
0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto)
}
}
if (iFlags & spSwitch) // jeśli odcinek zmienny
{
@@ -258,12 +261,16 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
// na Mydelniczce potrafi skanować na wprost mimo pojechania na bok
}
// poniższe nie dotyczy trybu łączenia?
if ((iFlags & spElapsed) ? false :
trTrack->iNumDynamics >
0) // jeśli jeszcze nie wjechano na tor, a coś na nim jest
fDist -= 30.0, fVelNext = 0.0; // to niech stanie w zwiększonej odległości
// else if (fVelNext==0.0) //jeśli została wyzerowana
// fVelNext=trTrack->VelocityGet(); //odczyt prędkości
if ((iFlags & spElapsed) ? false :
trTrack->iNumDynamics >
0) // jeśli jeszcze nie wjechano na tor, a coś na nim jest
{
WriteLog("Rozjazd " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + trTrack->iNumDynamics + "Dist= "+fDist);
//fDist -= 30.0;
fVelNext = 0.0; // to niech stanie w zwiększonej odległości
// else if (fVelNext==0.0) //jeśli została wyzerowana
// fVelNext=trTrack->VelocityGet(); //odczyt prędkości
}
}
}
}
@@ -289,23 +296,23 @@ AnsiString TSpeedPos::TableText()
return "Empty";
}
bool TSpeedPos::Set(TEvent *e, double d)
bool TSpeedPos::Set(TEvent *event, double dist)
{ // zapamiętanie zdarzenia
fDist = d;
fDist = dist;
iFlags = spEnabled | spEvent; // event+istotny
evEvent = e;
vPos = e->PositionGet(); // współrzędne eventu albo komórki pamięci (zrzutować na tor?)
evEvent = event;
vPos = event->PositionGet(); // współrzędne eventu albo komórki pamięci (zrzutować na tor?)
CommandCheck(); // sprawdzenie typu komendy w evencie i określenie prędkości
return fVelNext == 0.0; // true gdy zatrzymanie, wtedy nie ma po co skanować dalej
};
void TSpeedPos::Set(TTrack *t, double d, int f)
void TSpeedPos::Set(TTrack *track, double dist, int flag)
{ // zapamiętanie zmiany prędkości w torze
fDist = d; // odległość do początku toru
trTrack = t; // TODO: (t) może być NULL i nie odczytamy końca poprzedniego :/
fDist = dist; // odległość do początku toru
trTrack = track; // TODO: (t) może być NULL i nie odczytamy końca poprzedniego :/
if (trTrack)
{
iFlags = f | (trTrack->eType == tt_Normal ? 2 : 10); // zapamiętanie kierunku wraz z typem
iFlags = flag | (trTrack->eType == tt_Normal ? 2 : 10); // zapamiętanie kierunku wraz z typem
if (iFlags & spSwitch)
if (trTrack->GetSwitchState() & 1)
iFlags |= spSwitchStatus;
@@ -406,16 +413,22 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
{ // kontynuacja skanowania od ostatnio sprawdzonego toru (w ostatniej pozycji zawsze jest tor)
if (sSpeedTable[iLast].iFlags & spEndOfTable) // zatkanie
{ // jeśli zapełniła się tabelka
if ((iLast + 1) % iSpeedTableSize == iFirst) // jeśli nadal jest zapełniona
return; // nic się nie da zrobić
if ((iLast + 2) % iSpeedTableSize == iFirst) // musi być jeszcze miejsce wolne na
// ewentualny event, bo tor jeszcze nie
// sprawdzony
return; // już lepiej, ale jeszcze nie tym razem
if ((iLast + 1) % iSpeedTableSize == iFirst) // jeśli nadal jest zapełniona
{
TablePurger(); // nic się nie da zrobić
return;
}
if ((iLast + 2) % iSpeedTableSize == iFirst) // musi być jeszcze miejsce wolne na
// ewentualny event, bo tor jeszcze nie
// sprawdzony
{
TablePurger();
return; // już lepiej, ale jeszcze nie tym razem
}
sSpeedTable[iLast].iFlags &= 0xBE; // kontynuować próby doskanowania
}
//else if (VelNext == 0)
// return; // znaleziono semafor lub tor z prędkością zero i nie ma co dalej sprawdzać
else if (VelNext == 0)
return; // znaleziono semafor lub tor z prędkością zero i nie ma co dalej sprawdzać
//trzeba dalej sprawdzać, gdyż przy stopinfo potrafił zgubić semafor
pTrack = sSpeedTable[iLast].trTrack; // ostatnio sprawdzony tor
if (!pTrack)
@@ -425,7 +438,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
1.0; // flaga ustawiona, gdy Point2 toru jest bliżej
fCurrentDistance = sSpeedTable[iLast].fDist; // aktualna odległość do jego Point1
fTrackLength =
sSpeedTable[iLast].iFlags & 0x60 ? 0.0 : pTrack->Length(); // nie doliczać długości gdy:
sSpeedTable[iLast].iFlags & (spElapsed | spEnd) ? 0.0 : pTrack->Length(); // nie doliczać długości gdy:
// 32-minięty początek,
// 64-jazda do końca toru
}
@@ -436,14 +449,17 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
{
if (pTrack != tLast) // ostatni zapisany w tabelce nie był jeszcze sprawdzony
{ // jeśli tor nie był jeszcze sprawdzany
if ((pEvent = CheckTrackEvent(fLastDir, pTrack)) !=
if (pTrack)
WriteLog("TableTraceRoute: checking track " + pTrack->NameGet());
if ((pEvent = CheckTrackEvent(fLastDir, pTrack)) !=
NULL) // jeśli jest semafor na tym torze
{ // trzeba sprawdzić tabelkę, bo dodawanie drugi raz tego samego przystanku nie
// jest korzystne
if (TableNotFound(pEvent)) // jeśli nie ma
if (TableAddNew())
{
if (sSpeedTable[iLast].Set(pEvent,
WriteLog("TableTraceRoute: new event found " + pEvent->asName);
if (sSpeedTable[iLast].Set(pEvent,
fCurrentDistance)) // dodanie odczytu sygnału
fDistance = fCurrentDistance; // jeśli sygnał stop, to nie ma
// potrzeby dalej skanować
@@ -471,10 +487,10 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
15)
<< 28; // ostatnie 4 bity pola flag
sSpeedTable[iLast].iFlags &=
~4; // usunięcie flagi kierunku, bo może być błędna
~spReverse; // usunięcie flagi kierunku, bo może być błędna
if (sSpeedTable[iLast].iFlags < 0)
sSpeedTable[iLast].iFlags |=
4; // ustawienie flagi kierunku na podstawie wybranego segmentu
spReverse; // ustawienie flagi kierunku na podstawie wybranego segmentu
if (int(fLastDir) * sSpeedTable[iLast].iFlags < 0)
fLastDir = -fLastDir;
if (AIControllFlag) // dla AI na razie losujemy kierunek na kolejnym
@@ -490,6 +506,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
sSpeedTable[iLast].Set(pTrack, fCurrentDistance,
fLastDir < 0 ? 0x85 :
0x81); // dodanie odcinka do tabelki
// 0x85 = spEnabled, spReverse, SpCurve
}
}
fCurrentDistance +=
@@ -593,6 +610,7 @@ void TController::TableCheck(double fDistance)
{
if (sSpeedTable[i].Update(&pos, &dir, len))
{
WriteLog("TableCheck: Przestawiona zwrotnica. Kasowanie tableki.");
int k = (iLast + 1) % iSpeedTableSize; // skanujemy razem z ostatnią pozycją
for (int j = (i+1) % iSpeedTableSize; j != k; j = (j + 1) % iSpeedTableSize)
{ // kasowanie wszystkich rekordów za zmienioną zwrotnicą
@@ -602,6 +620,7 @@ void TController::TableCheck(double fDistance)
// WriteLog("TableCheck: Switch change. Delete from table: " + sSpeedTable[j].evEvent->asName);
sSpeedTable[j].iFlags = 0;
}
WriteLog("TableCheck: Kasowanie tableki OK.");
TablePurger();
iLast = i; // pokazujemy gdzie jest ostatni kawałek
break; // nie kontynuujemy pętli, trzeba doskanować ciąg dalszy
@@ -610,7 +629,7 @@ void TController::TableCheck(double fDistance)
{
if (sSpeedTable[i].fDist < -fLength) // a skład wyjechał całą długością poza
{ // degradacja pozycji
// WriteLog( "TableCheck: Track is behind. Delete from table: " + sSpeedTable[i].trTrack->NameGet());
WriteLog( "TableCheck: Track is behind. Delete from table: " + sSpeedTable[i].trTrack->NameGet());
sSpeedTable[i].iFlags &= ~spEnabled; // nie liczy się
}
else if ((sSpeedTable[i].iFlags & 0xF0000028) ==
@@ -619,7 +638,7 @@ void TController::TableCheck(double fDistance)
{
sSpeedTable[i].iFlags =
0; // to nie ma go po co trzymać (odtykacz usunie ze środka)
// WriteLog("TableCheck: Track without speed limit is under train . Delete from table: " + sSpeedTable[i].trTrack->NameGet());
WriteLog("TableCheck: Track without speed. Delete from table: " + sSpeedTable[i].trTrack->NameGet());
}
}
else if (sSpeedTable[i].iFlags & spEvent) // jeśli event
@@ -1214,7 +1233,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
void TController::TablePurger()
{ // odtykacz: usuwa mniej istotne pozycje ze środka tabelki, aby uniknąć zatkania
//(np. brak ograniczenia pomiędzy zwrotnicami, usunięte sygnały, minięte odcinki łuku)
int i, j, k = iLast - iFirst; // może być 15 albo 16 pozycji, ostatniej nie ma co sprawdzać
WriteLog("TablePurger: Czyszczenie tableki.");
int i, j, k = iLast - iFirst; // może być 15 albo 16 pozycji, ostatniej nie ma co sprawdzać
if (k < 0)
k += iSpeedTableSize; // ilość pozycji do przeanalizowania
for (i = iFirst; k > 0; --k, i = (i + 1) % iSpeedTableSize)
@@ -1226,7 +1246,7 @@ void TController::TablePurger()
// (0x08)
for (; k > 0; --k, i = (i + 1) % iSpeedTableSize)
sSpeedTable[i] = sSpeedTable[(i + 1) % iSpeedTableSize]; // skopiowanie
//WriteLog("Odtykacz usuwa pozycję");
WriteLog("Odtykacz usuwa pozycję");
iLast = (iLast - 1 + iSpeedTableSize) % iSpeedTableSize; // cofnięcie z zawinięciem
return;
}