mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 06:59:18 +02:00
New function for speed comparisons based on Min0R.
Working LimitVelocity.
This commit is contained in:
64
Driver.cpp
64
Driver.cpp
@@ -112,6 +112,7 @@ void TSpeedPos::Clear()
|
|||||||
{
|
{
|
||||||
iFlags = 0; // brak flag to brak reakcji
|
iFlags = 0; // brak flag to brak reakcji
|
||||||
fVelNext = -1.0; // prędkość bez ograniczeń
|
fVelNext = -1.0; // prędkość bez ograniczeń
|
||||||
|
fSectionVelocityDist = 0.0; //brak długości
|
||||||
fDist = 0.0;
|
fDist = 0.0;
|
||||||
vPos = vector3(0, 0, 0);
|
vPos = vector3(0, 0, 0);
|
||||||
trTrack = NULL; // brak wskaźnika
|
trTrack = NULL; // brak wskaźnika
|
||||||
@@ -148,6 +149,7 @@ void TSpeedPos::CommandCheck()
|
|||||||
case cm_SectionVelocity:
|
case cm_SectionVelocity:
|
||||||
// odcinek z ograniczeniem prędkości
|
// odcinek z ograniczeniem prędkości
|
||||||
fVelNext = value1;
|
fVelNext = value1;
|
||||||
|
fSectionVelocityDist = value2;
|
||||||
iFlags |= spSectionVel;
|
iFlags |= spSectionVel;
|
||||||
break;
|
break;
|
||||||
case cm_RoadVelocity:
|
case cm_RoadVelocity:
|
||||||
@@ -204,7 +206,7 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
iFlags ^= spElapsed; // 32-minięty - będziemy liczyć odległość względem przeciwnego końca
|
iFlags ^= spElapsed; // 32-minięty - będziemy liczyć odległość względem przeciwnego końca
|
||||||
// toru (nadal może być z przodu i ogdaniczać)
|
// toru (nadal może być z przodu i ograniczać)
|
||||||
if ((iFlags & 0x43) == 3) // tylko jeśli (istotny) tor, bo eventy są punktowe
|
if ((iFlags & 0x43) == 3) // tylko jeśli (istotny) tor, bo eventy są punktowe
|
||||||
if (trTrack) // może być NULL, jeśli koniec toru (????)
|
if (trTrack) // może być NULL, jeśli koniec toru (????)
|
||||||
vPos =
|
vPos =
|
||||||
@@ -630,7 +632,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);
|
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
|
||||||
@@ -676,8 +678,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
int i, k = iLast - iFirst + 1;
|
int i, k = iLast - iFirst + 1;
|
||||||
if (k < 0)
|
if (k < 0)
|
||||||
k += iSpeedTableSize; // ilość pozycji do przeanalizowania
|
k += iSpeedTableSize; // ilość pozycji do przeanalizowania
|
||||||
iDrivigFlags &=
|
iDrivigFlags &= ~(moveTrackEnd | moveSwitchFound | moveSemaphorFound |
|
||||||
~(moveTrackEnd | moveSwitchFound | moveSemaphorFound); // te flagi są ustawiane tutaj, w razie potrzeby
|
moveSpeedLimitFound); // te flagi są ustawiane tutaj, w razie potrzeby
|
||||||
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 & spEnabled) // badanie istotności
|
if (sSpeedTable[i].iFlags & spEnabled) // badanie istotności
|
||||||
@@ -1001,11 +1003,46 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
}
|
}
|
||||||
else if (sSpeedTable[i].iFlags & spSectionVel)
|
else if (sSpeedTable[i].iFlags & spSectionVel)
|
||||||
{ // to W27
|
{ // to W27
|
||||||
if (sSpeedTable[i].fDist < 0)
|
if (sSpeedTable[i].fDist < 0) // teraz trzeba sprawdzić inne warunki
|
||||||
VelLimitLast = sSpeedTable[i].fVelNext;
|
{
|
||||||
if (sSpeedTable[i].evEvent->ValueGet(1) > 0.0 &&
|
if (sSpeedTable[i].fSectionVelocityDist == 0.0)
|
||||||
sSpeedTable[i].fDist + sSpeedTable[i].evEvent->ValueGet(1) > -fLength)
|
{
|
||||||
iDrivigFlags |= moveSpeedLimitFound; // jeśli jesteśmy w ograniczeniu
|
WriteLog("TableUpdate: Event is behind. SVD = 0: " + sSpeedTable[i].evEvent->asName);
|
||||||
|
sSpeedTable[i].iFlags = 0; // jeśli punktowy to kasujemy i nie dajemy ograniczenia na stałe
|
||||||
|
}
|
||||||
|
else if (sSpeedTable[i].fSectionVelocityDist < 0.0)
|
||||||
|
{ // ograniczenie obowiązujące do następnego
|
||||||
|
if (sSpeedTable[i].fVelNext == Global::Min0RSpeed(sSpeedTable[i].fVelNext, VelLimitLast) &&
|
||||||
|
sSpeedTable[i].fVelNext != VelLimitLast)
|
||||||
|
{ // jeśli ograniczenie jest mniejsze niż obecne to obowiązuje od zaraz
|
||||||
|
VelLimitLast = sSpeedTable[i].fVelNext;
|
||||||
|
}
|
||||||
|
else if (sSpeedTable[i].fDist < -fLength)
|
||||||
|
{ // jeśli większe to musi wyjechać za poprzednie
|
||||||
|
VelLimitLast = sSpeedTable[i].fVelNext;
|
||||||
|
WriteLog("TableUpdate: Event is behind. SVD < 0: " + sSpeedTable[i].evEvent->asName);
|
||||||
|
sSpeedTable[i].iFlags = 0; // wyjechaliśmy poza poprzednie, można skasować
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // jeśli większe to ograniczenie ma swoją długość
|
||||||
|
if (sSpeedTable[i].fVelNext == Global::Min0RSpeed(sSpeedTable[i].fVelNext, VelLimitLast) &&
|
||||||
|
sSpeedTable[i].fVelNext != VelLimitLast)
|
||||||
|
{ // jeśli ograniczenie jest mniejsze niż obecne to obowiązuje od zaraz
|
||||||
|
VelLimitLast = sSpeedTable[i].fVelNext;
|
||||||
|
}
|
||||||
|
else if (sSpeedTable[i].fDist < -fLength && sSpeedTable[i].fVelNext != VelLimitLast)
|
||||||
|
{ // jeśli większe to musi wyjechać za poprzednie
|
||||||
|
VelLimitLast = sSpeedTable[i].fVelNext;
|
||||||
|
}
|
||||||
|
else if (sSpeedTable[i].fDist < -fLength - sSpeedTable[i].fSectionVelocityDist)
|
||||||
|
{ //
|
||||||
|
VelLimitLast = -1.0;
|
||||||
|
WriteLog("TableUpdate: Event is behind. SVD > 0: " + sSpeedTable[i].evEvent->asName);
|
||||||
|
sSpeedTable[i].iFlags = 0; // wyjechaliśmy poza poprzednie, można skasować
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//sprawdzenie eventów pasywnych przed nami
|
//sprawdzenie eventów pasywnych przed nami
|
||||||
@@ -1046,7 +1083,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else //jeśli jakiś event pasywny ale nie tarcza manewrowa
|
else if (!(sSpeedTable[i].iFlags & spSectionVel)) //jeśli jakiś event pasywny ale nie ograniczenie
|
||||||
if (go == cm_Unknown) // jeśli nie było komendy wcześniej - pierwsza się liczy
|
if (go == cm_Unknown) // jeśli nie było komendy wcześniej - pierwsza się liczy
|
||||||
// - ustawianie VelSignal
|
// - ustawianie VelSignal
|
||||||
if (v < 0.0 ? true : v >= 1.0) // bo wartość 0.1 służy do hamowania tylko
|
if (v < 0.0 ? true : v >= 1.0) // bo wartość 0.1 służy do hamowania tylko
|
||||||
@@ -1060,9 +1097,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
VelSignal = -1.0; // aby stojący ruszył
|
VelSignal = -1.0; // aby stojący ruszył
|
||||||
if (sSpeedTable[i].fDist < 0.0) // jeśli przejechany
|
if (sSpeedTable[i].fDist < 0.0) // jeśli przejechany
|
||||||
{
|
{
|
||||||
if (v != 0 ? VelSignal = -1.0 : VelSignal = 0.0); //!!! ustawienie, gdy przejechany jest lepsze niż
|
if (v != 0 ? VelSignal = -1.0 : VelSignal = 0.0)
|
||||||
|
; // ustawienie, gdy przejechany jest lepsze niż
|
||||||
// wcale, ale to jeszcze nie to
|
// wcale, ale to jeszcze nie to
|
||||||
if (sSpeedTable[i].iFlags & 0x100) // jeśli semafor
|
if (sSpeedTable[i].iFlags & spEvent) // jeśli event
|
||||||
if ((sSpeedTable[i].evEvent != eSignSkip) ?
|
if ((sSpeedTable[i].evEvent != eSignSkip) ?
|
||||||
true :
|
true :
|
||||||
(sSpeedTable[i].fVelNext != 0.0)) // ale inny niż ten,
|
(sSpeedTable[i].fVelNext != 0.0)) // ale inny niż ten,
|
||||||
@@ -1072,6 +1110,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
iDrivigFlags &= ~moveVisibility; // sygnał zezwalający na
|
iDrivigFlags &= ~moveVisibility; // sygnał zezwalający na
|
||||||
// jazdę wyłącza jazdę na
|
// jazdę wyłącza jazdę na
|
||||||
// widoczność (S1 na SBL)
|
// widoczność (S1 na SBL)
|
||||||
|
|
||||||
|
// usunąć jeśli nie jest ograniczeniem prędkości
|
||||||
sSpeedTable[i].iFlags =
|
sSpeedTable[i].iFlags =
|
||||||
0; // to można usunąć (nie mogą być usuwane w skanowaniu)
|
0; // to można usunąć (nie mogą być usuwane w skanowaniu)
|
||||||
}
|
}
|
||||||
|
|||||||
8
EU07.bpr
8
EU07.bpr
@@ -57,9 +57,9 @@
|
|||||||
IncludeVerInfo=1
|
IncludeVerInfo=1
|
||||||
AutoIncBuild=0
|
AutoIncBuild=0
|
||||||
MajorVer=15
|
MajorVer=15
|
||||||
MinorVer=3
|
MinorVer=4
|
||||||
Release=1169
|
Release=1170
|
||||||
Build=472
|
Build=473
|
||||||
Debug=1
|
Debug=1
|
||||||
PreRelease=0
|
PreRelease=0
|
||||||
Special=0
|
Special=0
|
||||||
@@ -71,7 +71,7 @@ CodePage=1250
|
|||||||
[Version Info Keys]
|
[Version Info Keys]
|
||||||
CompanyName=EU07 Team
|
CompanyName=EU07 Team
|
||||||
FileDescription=MaSzyna EU07-424
|
FileDescription=MaSzyna EU07-424
|
||||||
FileVersion=15.3.1169.472
|
FileVersion=15.4.1170.473
|
||||||
InternalName=9th by firleju + Ra + SPKS + MP
|
InternalName=9th by firleju + Ra + SPKS + MP
|
||||||
LegalCopyright=
|
LegalCopyright=
|
||||||
LegalTrademarks=
|
LegalTrademarks=
|
||||||
|
|||||||
10
Globals.cpp
10
Globals.cpp
@@ -839,4 +839,14 @@ AnsiString Global::Bezogonkow(AnsiString str, bool _)
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Global::Min0RSpeed(double vel1, double vel2)
|
||||||
|
{ // rozszerzenie funkcji Min0R o wartoœci -1.0
|
||||||
|
if (vel1 == -1.0)
|
||||||
|
vel1 = std::numeric_limits<double>::max();
|
||||||
|
if (vel2 == -1.0)
|
||||||
|
vel2 = std::numeric_limits<double>::max();
|
||||||
|
return Min0R(vel1, vel2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma package(smart_init)
|
#pragma package(smart_init)
|
||||||
|
|||||||
@@ -313,6 +313,7 @@ class Global
|
|||||||
static bool AddToQuery(TEvent *event, TDynamicObject *who);
|
static bool AddToQuery(TEvent *event, TDynamicObject *who);
|
||||||
static bool DoEvents();
|
static bool DoEvents();
|
||||||
static AnsiString Bezogonkow(AnsiString str, bool _ = false);
|
static AnsiString Bezogonkow(AnsiString str, bool _ = false);
|
||||||
|
static double Min0RSpeed(double vel1, double vel2);
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user