mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 16:19:19 +02: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
|
fVelNext = 30.0; // uzależnić prędkość od promienia; albo niech będzie
|
||||||
// ograniczona w skrzyżowaniu (velocity z ujemną wartością)
|
// ograniczona w skrzyżowaniu (velocity z ujemną wartością)
|
||||||
if ((iFlags & spElapsed) == 0) // jeśli nie wjechał
|
if ((iFlags & spElapsed) == 0) // jeśli nie wjechał
|
||||||
if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd
|
if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd
|
||||||
fVelNext =
|
{
|
||||||
0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto)
|
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
|
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
|
// na Mydelniczce potrafi skanować na wprost mimo pojechania na bok
|
||||||
}
|
}
|
||||||
// poniższe nie dotyczy trybu łączenia?
|
// poniższe nie dotyczy trybu łączenia?
|
||||||
if ((iFlags & spElapsed) ? false :
|
if ((iFlags & spElapsed) ? false :
|
||||||
trTrack->iNumDynamics >
|
trTrack->iNumDynamics >
|
||||||
0) // jeśli jeszcze nie wjechano na tor, a coś na nim jest
|
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
|
WriteLog("Rozjazd " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + trTrack->iNumDynamics + "Dist= "+fDist);
|
||||||
// fVelNext=trTrack->VelocityGet(); //odczyt prędkości
|
//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";
|
return "Empty";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TSpeedPos::Set(TEvent *e, double d)
|
bool TSpeedPos::Set(TEvent *event, double dist)
|
||||||
{ // zapamiętanie zdarzenia
|
{ // zapamiętanie zdarzenia
|
||||||
fDist = d;
|
fDist = dist;
|
||||||
iFlags = spEnabled | spEvent; // event+istotny
|
iFlags = spEnabled | spEvent; // event+istotny
|
||||||
evEvent = e;
|
evEvent = event;
|
||||||
vPos = e->PositionGet(); // współrzędne eventu albo komórki pamięci (zrzutować na tor?)
|
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
|
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
|
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
|
{ // zapamiętanie zmiany prędkości w torze
|
||||||
fDist = d; // odległość do początku toru
|
fDist = dist; // odległość do początku toru
|
||||||
trTrack = t; // TODO: (t) może być NULL i nie odczytamy końca poprzedniego :/
|
trTrack = track; // TODO: (t) może być NULL i nie odczytamy końca poprzedniego :/
|
||||||
if (trTrack)
|
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 (iFlags & spSwitch)
|
||||||
if (trTrack->GetSwitchState() & 1)
|
if (trTrack->GetSwitchState() & 1)
|
||||||
iFlags |= spSwitchStatus;
|
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)
|
{ // kontynuacja skanowania od ostatnio sprawdzonego toru (w ostatniej pozycji zawsze jest tor)
|
||||||
if (sSpeedTable[iLast].iFlags & spEndOfTable) // zatkanie
|
if (sSpeedTable[iLast].iFlags & spEndOfTable) // zatkanie
|
||||||
{ // jeśli zapełniła się tabelka
|
{ // jeśli zapełniła się tabelka
|
||||||
if ((iLast + 1) % iSpeedTableSize == iFirst) // jeśli nadal jest zapełniona
|
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
|
TablePurger(); // nic się nie da zrobić
|
||||||
// ewentualny event, bo tor jeszcze nie
|
return;
|
||||||
// sprawdzony
|
}
|
||||||
return; // już lepiej, ale jeszcze nie tym razem
|
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
|
sSpeedTable[iLast].iFlags &= 0xBE; // kontynuować próby doskanowania
|
||||||
}
|
}
|
||||||
//else if (VelNext == 0)
|
else if (VelNext == 0)
|
||||||
// return; // znaleziono semafor lub tor z prędkością zero i nie ma co dalej sprawdzać
|
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
|
//trzeba dalej sprawdzać, gdyż przy stopinfo potrafił zgubić semafor
|
||||||
pTrack = sSpeedTable[iLast].trTrack; // ostatnio sprawdzony tor
|
pTrack = sSpeedTable[iLast].trTrack; // ostatnio sprawdzony tor
|
||||||
if (!pTrack)
|
if (!pTrack)
|
||||||
@@ -425,7 +438,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
|||||||
1.0; // flaga ustawiona, gdy Point2 toru jest bliżej
|
1.0; // flaga ustawiona, gdy Point2 toru jest bliżej
|
||||||
fCurrentDistance = sSpeedTable[iLast].fDist; // aktualna odległość do jego Point1
|
fCurrentDistance = sSpeedTable[iLast].fDist; // aktualna odległość do jego Point1
|
||||||
fTrackLength =
|
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,
|
// 32-minięty początek,
|
||||||
// 64-jazda do końca toru
|
// 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
|
if (pTrack != tLast) // ostatni zapisany w tabelce nie był jeszcze sprawdzony
|
||||||
{ // jeśli tor nie był jeszcze sprawdzany
|
{ // 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
|
NULL) // jeśli jest semafor na tym torze
|
||||||
{ // trzeba sprawdzić tabelkę, bo dodawanie drugi raz tego samego przystanku nie
|
{ // trzeba sprawdzić tabelkę, bo dodawanie drugi raz tego samego przystanku nie
|
||||||
// jest korzystne
|
// jest korzystne
|
||||||
if (TableNotFound(pEvent)) // jeśli nie ma
|
if (TableNotFound(pEvent)) // jeśli nie ma
|
||||||
if (TableAddNew())
|
if (TableAddNew())
|
||||||
{
|
{
|
||||||
if (sSpeedTable[iLast].Set(pEvent,
|
WriteLog("TableTraceRoute: new event found " + pEvent->asName);
|
||||||
|
if (sSpeedTable[iLast].Set(pEvent,
|
||||||
fCurrentDistance)) // dodanie odczytu sygnału
|
fCurrentDistance)) // dodanie odczytu sygnału
|
||||||
fDistance = fCurrentDistance; // jeśli sygnał stop, to nie ma
|
fDistance = fCurrentDistance; // jeśli sygnał stop, to nie ma
|
||||||
// potrzeby dalej skanować
|
// potrzeby dalej skanować
|
||||||
@@ -471,10 +487,10 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
|||||||
15)
|
15)
|
||||||
<< 28; // ostatnie 4 bity pola flag
|
<< 28; // ostatnie 4 bity pola flag
|
||||||
sSpeedTable[iLast].iFlags &=
|
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)
|
if (sSpeedTable[iLast].iFlags < 0)
|
||||||
sSpeedTable[iLast].iFlags |=
|
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)
|
if (int(fLastDir) * sSpeedTable[iLast].iFlags < 0)
|
||||||
fLastDir = -fLastDir;
|
fLastDir = -fLastDir;
|
||||||
if (AIControllFlag) // dla AI na razie losujemy kierunek na kolejnym
|
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,
|
sSpeedTable[iLast].Set(pTrack, fCurrentDistance,
|
||||||
fLastDir < 0 ? 0x85 :
|
fLastDir < 0 ? 0x85 :
|
||||||
0x81); // dodanie odcinka do tabelki
|
0x81); // dodanie odcinka do tabelki
|
||||||
|
// 0x85 = spEnabled, spReverse, SpCurve
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fCurrentDistance +=
|
fCurrentDistance +=
|
||||||
@@ -593,6 +610,7 @@ void TController::TableCheck(double fDistance)
|
|||||||
{
|
{
|
||||||
if (sSpeedTable[i].Update(&pos, &dir, len))
|
if (sSpeedTable[i].Update(&pos, &dir, len))
|
||||||
{
|
{
|
||||||
|
WriteLog("TableCheck: Przestawiona zwrotnica. Kasowanie tableki.");
|
||||||
int k = (iLast + 1) % iSpeedTableSize; // skanujemy razem z ostatnią pozycją
|
int k = (iLast + 1) % iSpeedTableSize; // skanujemy razem z ostatnią pozycją
|
||||||
for (int j = (i+1) % iSpeedTableSize; j != k; j = (j + 1) % iSpeedTableSize)
|
for (int j = (i+1) % iSpeedTableSize; j != k; j = (j + 1) % iSpeedTableSize)
|
||||||
{ // kasowanie wszystkich rekordów za zmienioną zwrotnicą
|
{ // 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);
|
// WriteLog("TableCheck: Switch change. Delete from table: " + sSpeedTable[j].evEvent->asName);
|
||||||
sSpeedTable[j].iFlags = 0;
|
sSpeedTable[j].iFlags = 0;
|
||||||
}
|
}
|
||||||
|
WriteLog("TableCheck: Kasowanie tableki OK.");
|
||||||
TablePurger();
|
TablePurger();
|
||||||
iLast = i; // pokazujemy gdzie jest ostatni kawałek
|
iLast = i; // pokazujemy gdzie jest ostatni kawałek
|
||||||
break; // nie kontynuujemy pętli, trzeba doskanować ciąg dalszy
|
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
|
if (sSpeedTable[i].fDist < -fLength) // a skład wyjechał całą długością poza
|
||||||
{ // degradacja pozycji
|
{ // 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ę
|
sSpeedTable[i].iFlags &= ~spEnabled; // nie liczy się
|
||||||
}
|
}
|
||||||
else if ((sSpeedTable[i].iFlags & 0xF0000028) ==
|
else if ((sSpeedTable[i].iFlags & 0xF0000028) ==
|
||||||
@@ -619,7 +638,7 @@ void TController::TableCheck(double fDistance)
|
|||||||
{
|
{
|
||||||
sSpeedTable[i].iFlags =
|
sSpeedTable[i].iFlags =
|
||||||
0; // to nie ma go po co trzymać (odtykacz usunie ze środka)
|
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
|
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()
|
void TController::TablePurger()
|
||||||
{ // odtykacz: usuwa mniej istotne pozycje ze środka tabelki, aby uniknąć zatkania
|
{ // 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)
|
//(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)
|
if (k < 0)
|
||||||
k += iSpeedTableSize; // ilość pozycji do przeanalizowania
|
k += iSpeedTableSize; // ilość pozycji do przeanalizowania
|
||||||
for (i = iFirst; k > 0; --k, i = (i + 1) % iSpeedTableSize)
|
for (i = iFirst; k > 0; --k, i = (i + 1) % iSpeedTableSize)
|
||||||
@@ -1226,7 +1246,7 @@ void TController::TablePurger()
|
|||||||
// (0x08)
|
// (0x08)
|
||||||
for (; k > 0; --k, i = (i + 1) % iSpeedTableSize)
|
for (; k > 0; --k, i = (i + 1) % iSpeedTableSize)
|
||||||
sSpeedTable[i] = sSpeedTable[(i + 1) % iSpeedTableSize]; // skopiowanie
|
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
|
iLast = (iLast - 1 + iSpeedTableSize) % iSpeedTableSize; // cofnięcie z zawinięciem
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user