mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
Changes to TSpeedPos array to prevent not clearing of.
This commit is contained in:
88
Driver.cpp
88
Driver.cpp
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user