mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-23 00:29:19 +02:00
Repaired choose of speed limits.
Scan distance for staying changed from 2500 to 1500m. Not known event are ignored, previous train stop on them.
This commit is contained in:
67
Driver.cpp
67
Driver.cpp
@@ -179,7 +179,8 @@ void TSpeedPos::CommandCheck()
|
|||||||
// inna komenda w evencie skanowanym powoduje zatrzymanie i wysłanie tej komendy
|
// inna komenda w evencie skanowanym powoduje zatrzymanie i wysłanie tej komendy
|
||||||
iFlags &= ~(spShuntSemaphor | spPassengerStopPoint |
|
iFlags &= ~(spShuntSemaphor | spPassengerStopPoint |
|
||||||
spStopOnSBL); // nie manewrowa, nie przystanek, nie zatrzymać na SBL
|
spStopOnSBL); // nie manewrowa, nie przystanek, nie zatrzymać na SBL
|
||||||
fVelNext = 0; // jak nieznana komenda w komórce sygnałowej, to ma stać
|
fVelNext = -1.0; // jak nieznana komenda w komórce sygnałowej, to pokazujemy w tabelce ale
|
||||||
|
// ignorujemy
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -359,12 +360,15 @@ bool TController::TableAddNew()
|
|||||||
|
|
||||||
bool TController::TableNotFound(TEvent *e)
|
bool TController::TableNotFound(TEvent *e)
|
||||||
{ // sprawdzenie, czy nie został już dodany do tabelki (np. podwójne W4 robi problemy)
|
{ // sprawdzenie, czy nie został już dodany do tabelki (np. podwójne W4 robi problemy)
|
||||||
int i, j = (iLast + 1) % iSpeedTableSize; // j, aby sprawdzić też ostatnią pozycję
|
int j = (iLast + 1) % iSpeedTableSize; // j, aby sprawdzić też ostatnią pozycję
|
||||||
for (i = iFirst; i != j; i = (i + 1) % iSpeedTableSize)
|
for (int i = iFirst; i != j; i = (i + 1) % iSpeedTableSize)
|
||||||
if ((sSpeedTable[i].iFlags & (spEnabled | spEvent)) == spEnabled |
|
if ((sSpeedTable[i].iFlags & (spEnabled | spEvent)) == (spEnabled |
|
||||||
spEvent) // o ile używana pozycja
|
spEvent)) // o ile używana pozycja
|
||||||
if (sSpeedTable[i].evEvent == e)
|
if (sSpeedTable[i].evEvent == e)
|
||||||
|
{
|
||||||
|
WriteLog("TableNotFound: Event already in SpeedTable: " + sSpeedTable[i].evEvent->asName);
|
||||||
return false; // już jest, drugi raz dodawać nie ma po co
|
return false; // już jest, drugi raz dodawać nie ma po co
|
||||||
|
}
|
||||||
return true; // nie ma, czyli można dodać
|
return true; // nie ma, czyli można dodać
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -399,7 +403,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // 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 & 0x10000) // 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ć
|
return; // nic się nie da zrobić
|
||||||
@@ -415,7 +419,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
|||||||
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ć)
|
||||||
fLastDir = sSpeedTable[iLast].iFlags & 4 ?
|
fLastDir = sSpeedTable[iLast].iFlags & spReverse ?
|
||||||
-1.0 :
|
-1.0 :
|
||||||
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
|
||||||
@@ -584,27 +588,40 @@ void TController::TableCheck(double fDistance)
|
|||||||
double len = 0.0; // odległość będziemy zliczać narastająco
|
double len = 0.0; // odległość będziemy zliczać narastająco
|
||||||
for (int i = iFirst; i != iLast; i = (i + 1) % iSpeedTableSize)
|
for (int i = iFirst; i != iLast; i = (i + 1) % iSpeedTableSize)
|
||||||
{ // aktualizacja rekordów z wyjątkiem ostatniego
|
{ // aktualizacja rekordów z wyjątkiem ostatniego
|
||||||
if (sSpeedTable[i].iFlags & 1) // jeśli pozycja istotna
|
if (sSpeedTable[i].iFlags & spEnabled) // jeśli pozycja istotna
|
||||||
{
|
{
|
||||||
if (sSpeedTable[i].Update(&pos, &dir, len))
|
if (sSpeedTable[i].Update(&pos, &dir, len))
|
||||||
{
|
{
|
||||||
iLast = i; // wykryta zmiana zwrotnicy - konieczne ponowne przeskanowanie
|
int k = (iLast + 1) % iSpeedTableSize; // skanujemy razem z ostatnią pozycją
|
||||||
// dalszej części
|
for (int j = (i+1) % iSpeedTableSize; j != k; j = (j + 1) % iSpeedTableSize)
|
||||||
|
{ // kasowanie wszystkich rekordów za zmienioną zwrotnicą
|
||||||
|
//if (sSpeedTable[j].iFlags & spTrack)
|
||||||
|
// WriteLog("TableCheck: Switch change. Delete from table: " + sSpeedTable[j].trTrack->NameGet());
|
||||||
|
//else if (sSpeedTable[j].iFlags & spEvent)
|
||||||
|
// WriteLog("TableCheck: Switch change. Delete from table: " + sSpeedTable[j].evEvent->asName);
|
||||||
|
sSpeedTable[j].iFlags = 0;
|
||||||
|
}
|
||||||
|
TablePurger();
|
||||||
|
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
|
||||||
}
|
}
|
||||||
if (sSpeedTable[i].iFlags & 2) // jeśli odcinek
|
if (sSpeedTable[i].iFlags & spTrack) // jeśli odcinek
|
||||||
{
|
{
|
||||||
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
|
||||||
sSpeedTable[i].iFlags &= ~1; // nie liczy się
|
// 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) ==
|
else if ((sSpeedTable[i].iFlags & 0xF0000028) ==
|
||||||
0x20) // jest z tyłu (najechany) i nie jest zwrotnicą ani skrzyżowaniem
|
spElapsed) // jest z tyłu (najechany) i nie jest zwrotnicą ani skrzyżowaniem
|
||||||
if (sSpeedTable[i].fVelNext < 0) // a nie ma ograniczenia prędkości
|
if (sSpeedTable[i].fVelNext < 0) // a nie ma ograniczenia prędkości
|
||||||
|
{
|
||||||
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());
|
||||||
}
|
}
|
||||||
else if (sSpeedTable[i].iFlags & 0x100) // jeśli event
|
}
|
||||||
|
else if (sSpeedTable[i].iFlags & spEvent) // jeśli event
|
||||||
{
|
{
|
||||||
if (sSpeedTable[i].fDist < (sSpeedTable[i].evEvent->Type == tp_PutValues ?
|
if (sSpeedTable[i].fDist < (sSpeedTable[i].evEvent->Type == tp_PutValues ?
|
||||||
-fLength :
|
-fLength :
|
||||||
@@ -613,6 +630,7 @@ void TController::TableCheck(double fDistance)
|
|||||||
sSpeedTable[i].fDist < -fLength)
|
sSpeedTable[i].fDist < -fLength)
|
||||||
{ // pociąg staje zawsze, a samochód tylko jeśli nie przejedzie całą
|
{ // pociąg staje zawsze, a samochód tylko jeśli nie przejedzie całą
|
||||||
// długością (może być zaskoczony zmianą)
|
// długością (może być zaskoczony zmianą)
|
||||||
|
// WriteLog("TableCheck: Event is behind. Delete from table: " + sSpeedTable[i].evEvent->asName);
|
||||||
sSpeedTable[i].iFlags &= ~1; // degradacja pozycji dla samochodu;
|
sSpeedTable[i].iFlags &= ~1; // degradacja pozycji dla samochodu;
|
||||||
// semafory usuwane tylko przy sprawdzaniu,
|
// semafory usuwane tylko przy sprawdzaniu,
|
||||||
// bo wysyłają komendy
|
// bo wysyłają komendy
|
||||||
@@ -1112,7 +1130,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
else // event trzyma tylko jeśli VelNext=0, nawet po przejechaniu (nie powinno
|
else // event trzyma tylko jeśli VelNext=0, nawet po przejechaniu (nie powinno
|
||||||
// dotyczyć samochodów?)
|
// dotyczyć samochodów?)
|
||||||
a = (v == 0.0 ? -1.0 : fAcc); // ruszanie albo hamowanie
|
a = (v == 0.0 ? -1.0 : fAcc); // ruszanie albo hamowanie
|
||||||
if (a < fAcc)
|
if (a < fAcc && v == Min0R(v, fNext))
|
||||||
{ // mniejsze przyspieszenie to mniejsza możliwość rozpędzenia się albo konieczność
|
{ // mniejsze przyspieszenie to mniejsza możliwość rozpędzenia się albo konieczność
|
||||||
// hamowania
|
// hamowania
|
||||||
// jeśli droga wolna, to może być a>1.0 i się tu nie załapuje
|
// jeśli droga wolna, to może być a>1.0 i się tu nie załapuje
|
||||||
@@ -1143,12 +1161,13 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
if (VelSignalLast >= 0.0 && !(iDrivigFlags & (moveSemaphorFound | moveSwitchFound)) &&
|
if (VelSignalLast >= 0.0 && !(iDrivigFlags & (moveSemaphorFound | moveSwitchFound)) &&
|
||||||
(OrderCurrentGet() & Obey_train))
|
(OrderCurrentGet() & Obey_train))
|
||||||
VelSignalLast = -1.0; // jeśli mieliśmy ograniczenie z semafora i nie ma przed nami
|
VelSignalLast = -1.0; // jeśli mieliśmy ograniczenie z semafora i nie ma przed nami
|
||||||
if (fVelDes > VelSignalLast) //analiza spisanych z tabelki ograniczeń i nadpisanie aktualnego
|
|
||||||
fVelDes = VelSignalLast;
|
if (VelSignalLast >= 0.0) //analiza spisanych z tabelki ograniczeń i nadpisanie aktualnego
|
||||||
if (fVelDes > VelLimitLast)
|
fVelDes = Min0R(fVelDes, VelSignalLast);
|
||||||
fVelDes = VelLimitLast;
|
if (VelLimitLast >= 0.0)
|
||||||
if (fVelDes > VelRoad)
|
fVelDes = Min0R(fVelDes, VelLimitLast);
|
||||||
fVelDes = VelRoad;
|
if (VelRoad >= 0.0)
|
||||||
|
fVelDes = Min0R(fVelDes, VelRoad);
|
||||||
// nastepnego semafora albo zwrotnicy to uznajemy, że mijamy W5
|
// nastepnego semafora albo zwrotnicy to uznajemy, że mijamy W5
|
||||||
return go;
|
return go;
|
||||||
};
|
};
|
||||||
@@ -1161,7 +1180,7 @@ void TController::TablePurger()
|
|||||||
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)
|
||||||
{ // sprawdzenie rekordów od (iFirst) do (iLast), o ile są istotne
|
{ // sprawdzenie rekordów od (iFirst) do (iLast), o ile są istotne
|
||||||
if ((sSpeedTable[i].iFlags & 1) ?
|
if ((sSpeedTable[i].iFlags & spEnabled) ?
|
||||||
(sSpeedTable[i].fVelNext < 0) && ((sSpeedTable[i].iFlags & 0xAB) == 0xA3) :
|
(sSpeedTable[i].fVelNext < 0) && ((sSpeedTable[i].iFlags & 0xAB) == 0xA3) :
|
||||||
true)
|
true)
|
||||||
{ // jeśli jest to minięty (0x20) tor (0x03) do liczenia cięciw (0x80), a nie zwrotnica
|
{ // jeśli jest to minięty (0x20) tor (0x03) do liczenia cięciw (0x80), a nie zwrotnica
|
||||||
@@ -3258,7 +3277,7 @@ bool TController::UpdateSituation(double dt)
|
|||||||
// double scanmax=(mvOccupied->Vel>0.0)?3*fDriverDist+fBrakeDist:10.0*fDriverDist;
|
// double scanmax=(mvOccupied->Vel>0.0)?3*fDriverDist+fBrakeDist:10.0*fDriverDist;
|
||||||
double scanmax = (mvOccupied->Vel > 5.0) ?
|
double scanmax = (mvOccupied->Vel > 5.0) ?
|
||||||
400 + fBrakeDist :
|
400 + fBrakeDist :
|
||||||
50.0 * fDriverDist; // 1000m dla stojących pociągów; Ra 2015-01: przy
|
30.0 * fDriverDist; // 1500m dla stojących pociągów; Ra 2015-01: przy
|
||||||
// dłuższej drodze skanowania AI jeździ spokojniej
|
// dłuższej drodze skanowania AI jeździ spokojniej
|
||||||
// 2. Sprawdzić, czy tabelka pokrywa założony odcinek (nie musi, jeśli jest STOP).
|
// 2. Sprawdzić, czy tabelka pokrywa założony odcinek (nie musi, jeśli jest STOP).
|
||||||
// 3. Sprawdzić, czy trajektoria ruchu przechodzi przez zwrotnice - jeśli tak, to sprawdzić,
|
// 3. Sprawdzić, czy trajektoria ruchu przechodzi przez zwrotnice - jeśli tak, to sprawdzić,
|
||||||
@@ -3779,7 +3798,7 @@ bool TController::UpdateSituation(double dt)
|
|||||||
if (VelNext == 0.0)
|
if (VelNext == 0.0)
|
||||||
break; // ale jak coś z przodu zamyka, to ma stać
|
break; // ale jak coś z przodu zamyka, to ma stać
|
||||||
if (iDrivigFlags & moveStopCloser)
|
if (iDrivigFlags & moveStopCloser)
|
||||||
VelSignal = VelDesired; // niech jedzie, jak W4 puściło - nie, ma czekać na
|
VelSignal = -1.0; // niech jedzie, jak W4 puściło - nie, ma czekać na
|
||||||
// sygnał z sygnalizatora!
|
// sygnał z sygnalizatora!
|
||||||
case cm_SetVelocity: // od wersji 357 semafor nie budzi wyłączonej lokomotywy
|
case cm_SetVelocity: // od wersji 357 semafor nie budzi wyłączonej lokomotywy
|
||||||
if (!(OrderList[OrderPos] &
|
if (!(OrderList[OrderPos] &
|
||||||
|
|||||||
@@ -49,9 +49,9 @@ double Global::fLuminance = 1.0; // jasno
|
|||||||
int Global::iReCompile = 0; // zwiêkszany, gdy trzeba odœwie¿yæ siatki
|
int Global::iReCompile = 0; // zwiêkszany, gdy trzeba odœwie¿yæ siatki
|
||||||
HWND Global::hWnd = NULL; // uchwyt okna
|
HWND Global::hWnd = NULL; // uchwyt okna
|
||||||
int Global::iCameraLast = -1;
|
int Global::iCameraLast = -1;
|
||||||
AnsiString Global::asRelease = "15.3.1169.472";
|
AnsiString Global::asRelease = "15.4.1170.473";
|
||||||
AnsiString Global::asVersion =
|
AnsiString Global::asVersion =
|
||||||
"Compilation 2015-04-14, release " + Global::asRelease + "."; // tutaj, bo wysy³any
|
"Compilation 2015-11-06, release " + Global::asRelease + "."; // tutaj, bo wysy³any
|
||||||
int Global::iViewMode = 0; // co aktualnie widaæ: 0-kabina, 1-latanie, 2-sprzêgi, 3-dokumenty
|
int Global::iViewMode = 0; // co aktualnie widaæ: 0-kabina, 1-latanie, 2-sprzêgi, 3-dokumenty
|
||||||
int Global::iTextMode = 0; // tryb pracy wyœwietlacza tekstowego
|
int Global::iTextMode = 0; // tryb pracy wyœwietlacza tekstowego
|
||||||
int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0,
|
int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0,
|
||||||
|
|||||||
Reference in New Issue
Block a user