mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
Dodane zapamiętywanie ograniczeń róznych typów i wybór z najmniejszego
This commit is contained in:
94
Driver.cpp
94
Driver.cpp
@@ -151,7 +151,7 @@ void TSpeedPos::CommandCheck()
|
||||
iFlags |= spSectionVel;
|
||||
break;
|
||||
case cm_RoadVelocity:
|
||||
// prędkość drogowa (od tej pory będzie jako domyślna najwyższa
|
||||
// prędkość drogowa (od tej pory będzie jako domyślna najwyższa)
|
||||
fVelNext = value1;
|
||||
iFlags |= spRoadVel;
|
||||
break;
|
||||
@@ -162,10 +162,12 @@ void TSpeedPos::CommandCheck()
|
||||
fVelNext = 0.0; // TrainParams->IsStop()?0.0:-1.0; //na razie tak
|
||||
iFlags |= spPassengerStopPoint; // niestety nie da się w tym miejscu współpracować z rozkładem
|
||||
break;
|
||||
case cm_SetProximityVelocity:
|
||||
// ignorować
|
||||
fVelNext = -1;
|
||||
break;
|
||||
//case cm_SetProximityVelocity:
|
||||
// // odcinek z ograniczeniem prędkości o podanej długości
|
||||
// fVelNext = value1;
|
||||
// iFlags |= spProximityVelocity;
|
||||
// fSectionVelocityDist = value2;
|
||||
// break;
|
||||
case cm_OutsideStation:
|
||||
// w trybie manewrowym: skanować od niej wstecz i stanąć po wyjechaniu za sygnalizator i
|
||||
// zmienić kierunek
|
||||
@@ -660,9 +662,9 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
~(moveTrackEnd | moveSwitchFound); // te flagi są ustawiane tutaj, w razie potrzeby
|
||||
for (i = iFirst; k > 0; --k, i = (i + 1) % iSpeedTableSize)
|
||||
{ // sprawdzenie rekordów od (iFirst) do (iLast), o ile są istotne
|
||||
if (sSpeedTable[i].iFlags & 1) // badanie istotności
|
||||
if (sSpeedTable[i].iFlags & spEnabled) // badanie istotności
|
||||
{ // o ile dana pozycja tabelki jest istotna
|
||||
if (sSpeedTable[i].iFlags & 0x400)
|
||||
if (sSpeedTable[i].iFlags & spPassengerStopPoint)
|
||||
{ // jeśli przystanek, trzeba obsłużyć wg rozkładu
|
||||
if (sSpeedTable[i].evEvent->CommandGet() != asNextStop)
|
||||
{ // jeśli nazwa nie jest zgodna
|
||||
@@ -917,26 +919,27 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
} // koniec obsługi W4
|
||||
v = sSpeedTable[i].fVelNext; // odczyt prędkości do zmiennej pomocniczej
|
||||
if (sSpeedTable[i].iFlags &
|
||||
8) // zwrotnice są usuwane z tabelki dopiero po zjechaniu z nich
|
||||
spSwitch) // zwrotnice są usuwane z tabelki dopiero po zjechaniu z nich
|
||||
iDrivigFlags |=
|
||||
moveSwitchFound; // rozjazd z przodu/pod ogranicza np. sens skanowania wstecz
|
||||
else if (sSpeedTable[i].iFlags & 0x100) // W4 może się deaktywować
|
||||
else if (sSpeedTable[i].iFlags & spEvent) // W4 może się deaktywować
|
||||
{ // jeżeli event, może być potrzeba wysłania komendy, aby ruszył
|
||||
if (sSpeedTable[i].iFlags & 0x2000)
|
||||
//sprawdzanie eventów pasywnych miniętych
|
||||
if (sSpeedTable[i].iFlags & spOutsideStation)
|
||||
{ // jeśli W5, to reakcja zależna od trybu jazdy
|
||||
if (OrderCurrentGet() & Obey_train)
|
||||
{ // w trybie pociągowym: można przyspieszyć do wskazanej prędkości (po
|
||||
// zjechaniu z rozjazdów)
|
||||
v = -1.0; // ignorować?
|
||||
if (sSpeedTable[i].fDist < 0.0) // jeśli wskaźnik został minięty
|
||||
//TODO trzeba zmienić przypisywanie VelSignal na VelSignalLast
|
||||
if (sSpeedTable[i].fDist < 0.0) // jeśli wskaźnik został minięty
|
||||
{
|
||||
VelSignal = v; //!!! ustawienie, gdy przejechany jest lepsze niż wcale,
|
||||
// ale to jeszcze nie to
|
||||
VelSignalLast = v; //ustawienie prędkości na -1
|
||||
// iStationStart=TrainParams->StationIndex; //zaktualizować
|
||||
// wyświetlanie rozkładu
|
||||
}
|
||||
else if (!(iDrivigFlags & moveSwitchFound)) // jeśli rozjazdy już minięte
|
||||
VelSignal = v; //!!! to też koniec ograniczenia
|
||||
VelSignalLast = v; //!!! to też koniec ograniczenia
|
||||
}
|
||||
else
|
||||
{ // w trybie manewrowym: skanować od niego wstecz, stanąć po wyjechaniu za
|
||||
@@ -948,7 +951,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
// koniec toru)
|
||||
}
|
||||
}
|
||||
else if (sSpeedTable[i].iFlags & 0x800)
|
||||
else if (sSpeedTable[i].iFlags & spStopOnSBL)
|
||||
{ // jeśli S1 na SBL
|
||||
if (mvOccupied->Vel < 2.0) // stanąć nie musi, ale zwolnić przynajmniej
|
||||
if (sSpeedTable[i].fDist < fMaxProximityDist) // jest w maksymalnym zasięgu
|
||||
@@ -963,25 +966,43 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
// pociągu z przodu!
|
||||
}
|
||||
if (eSignSkip != sSpeedTable[i].evEvent) // jeśli ten SBL nie jest do pominięcia
|
||||
v = sSpeedTable[i].evEvent->ValueGet(1); // to ma 0 odczytywać
|
||||
// TODO sprawdzić do której zmiennej jest przypisywane v i zmienić to tutaj
|
||||
v = sSpeedTable[i].evEvent->ValueGet(1); // to ma 0 odczytywać
|
||||
}
|
||||
else if (sSpeedTable[i].iFlags & spSemaphor)
|
||||
{ // to semaphor
|
||||
if (sSpeedTable[i].fDist < 0)
|
||||
VelSignalLast = sSpeedTable[i].fVelNext; //minięty daje prędkość obowiązującą
|
||||
}
|
||||
else if (sSpeedTable[i].iFlags & spRoadVel)
|
||||
{ // to W6
|
||||
if (sSpeedTable[i].fDist < 0)
|
||||
VelRoad = sSpeedTable[i].fVelNext;
|
||||
}
|
||||
else if (sSpeedTable[i].iFlags & spSectionVel)
|
||||
{ // to W27
|
||||
if (sSpeedTable[i].fDist < 0)
|
||||
VelLimitLast = sSpeedTable[i].fVelNext;
|
||||
}
|
||||
|
||||
//sprawdzenie eventów pasywnych przed nami
|
||||
if ((mvOccupied->CategoryFlag & 1) ?
|
||||
sSpeedTable[i].fDist > pVehicles[0]->fTrackBlock - 20.0 :
|
||||
false) // jak sygnał jest dalej niż zawalidroga
|
||||
v = 0.0; // to może być podany dla tamtego: jechać tak, jakby tam stop był
|
||||
else
|
||||
{ // zawalidrogi nie ma (albo pojazd jest samochodem), sprawdzić sygnał
|
||||
if (sSpeedTable[i].iFlags & 0x200) // jeśli Tm - w zasadzie to sprawdzić
|
||||
if (sSpeedTable[i].iFlags & spShuntSemaphor) // jeśli Tm - w zasadzie to sprawdzić
|
||||
// komendę!
|
||||
{ // jeśli podana prędkość manewrowa
|
||||
if ((OrderCurrentGet() & Obey_train) ? v == 0.0 : false)
|
||||
{ // jeśli tryb pociągowy a tarcze ma ShuntVelocity 0 0
|
||||
v = -1; // ignorować, chyba że prędkość stanie się niezerowa
|
||||
if (sSpeedTable[i].iFlags & 0x20) // a jak przejechana
|
||||
if (sSpeedTable[i].iFlags & spElapsed) // a jak przejechana
|
||||
sSpeedTable[i].iFlags = 0; // to można usunąć, bo podstawowy automat
|
||||
// usuwa tylko niezerowe
|
||||
}
|
||||
else if (go <= cm_Ready) // jeśli jeszcze nie ma komendy
|
||||
else if (go == cm_Unknown) // jeśli jeszcze nie ma komendy
|
||||
if (v != 0.0) // komenda jest tylko gdy ma jechać, bo stoi na podstawie
|
||||
// tabelki
|
||||
{ // jeśli nie było komendy wcześniej - pierwsza się liczy - ustawianie
|
||||
@@ -1002,9 +1023,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
}
|
||||
}
|
||||
}
|
||||
else // if (sSpeedTable[i].iFlags&0x100) //jeśli semafor !!! Komendę trzeba
|
||||
// sprawdzić !!!!
|
||||
if (go <= cm_Ready) // jeśli nie było komendy wcześniej - pierwsza się liczy
|
||||
else //jeśli jakiś event pasywny ale nie tarcza manewrowa
|
||||
if (go == cm_Unknown) // jeśli nie było komendy wcześniej - pierwsza się liczy
|
||||
// - ustawianie VelSignal
|
||||
if (v < 0.0 ? true : v >= 1.0) // bo wartość 0.1 służy do hamowania tylko
|
||||
{
|
||||
@@ -1049,13 +1069,16 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
} // jeśli event
|
||||
if (v >= 0.0)
|
||||
{ // pozycje z prędkością -1 można spokojnie pomijać
|
||||
d = sSpeedTable[i].fDist;
|
||||
if ((sSpeedTable[i].iFlags & 0x20) ?
|
||||
d = sSpeedTable[i].fDist;
|
||||
if ((sSpeedTable[i].iFlags & spElapsed) ?
|
||||
false :
|
||||
d > 0.0) // sygnał lub ograniczenie z przodu (+32=przejechane)
|
||||
{ // 2014-02: jeśli stoi, a ma do przejechania kawałek, to niech jedzie
|
||||
if ((mvOccupied->Vel == 0.0) ?
|
||||
((sSpeedTable[i].iFlags & 0x501) == 0x501) && (d > fMaxProximityDist) :
|
||||
((sSpeedTable[i].iFlags &
|
||||
(spEnabled | spEvent | spPassengerStopPoint)) ==
|
||||
(spEnabled | spEvent | spPassengerStopPoint)) &&
|
||||
(d > fMaxProximityDist) :
|
||||
false)
|
||||
a = (iDrivigFlags & moveStopCloser) ? fAcc : 0.0; // ma podjechać bliżej -
|
||||
// czy na pewno w tym
|
||||
@@ -1069,7 +1092,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
fVelDes = v; // ograniczenie aktualnej prędkości
|
||||
}
|
||||
}
|
||||
else if (sSpeedTable[i].iFlags & 2) // jeśli tor
|
||||
else if (sSpeedTable[i].iFlags & spTrack) // jeśli tor
|
||||
{ // tor ogranicza prędkość, dopóki cały skład nie przejedzie,
|
||||
// d=fLength+d; //zamiana na długość liczoną do przodu
|
||||
if (v >= 1.0) // EU06 się zawieszało po dojechaniu na koniec toru postojowego
|
||||
@@ -1102,7 +1125,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
} // if (v>=0.0)
|
||||
if (fNext >= 0.0)
|
||||
{ // jeśli ograniczenie
|
||||
if ((sSpeedTable[i].iFlags & 0x101) == 0x101) // tylko sygnał przypisujemy
|
||||
if ((sSpeedTable[i].iFlags & (spEnabled | spEvent)) ==
|
||||
(spEnabled | spEvent)) // tylko sygnał przypisujemy
|
||||
if (!eSignNext) // jeśli jeszcze nic nie zapisane tam
|
||||
eSignNext = sSpeedTable[i].evEvent; // dla informacji
|
||||
if (fNext == 0.0)
|
||||
@@ -1110,6 +1134,12 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
}
|
||||
} // if (sSpeedTable[i].iFlags&1)
|
||||
} // for
|
||||
if (fVelDes > VelSignalLast) //analiza spisanych z tabelki ograniczeń i nadpisanie aktualnego
|
||||
fVelDes = VelSignalLast;
|
||||
else if (fVelDes > VelLimitLast)
|
||||
fVelDes = VelLimitLast;
|
||||
else if (fVelDes > VelRoad)
|
||||
fVelDes = VelRoad;
|
||||
return go;
|
||||
};
|
||||
|
||||
@@ -1175,6 +1205,9 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
|
||||
VelSignal = 0.0; // normalnie na początku ma stać, no chyba że jedzie
|
||||
VelLimit = -1.0; // brak ograniczenia prędkości
|
||||
VelNext = 120.0;
|
||||
VelLimitLast = -1.0; // ostatnie ograniczenie bez ograniczenia
|
||||
VelSignalLast = -1.0; // ostatni semafor też bez ograniczenia
|
||||
VelRoad = -1.0; // prędkość drogowa bez ograniczenia
|
||||
AIControllFlag = AI;
|
||||
pVehicle = NewControll;
|
||||
ControllingSet(); // utworzenie połączenia do sterowanego pojazdu
|
||||
@@ -3210,11 +3243,8 @@ bool TController::UpdateSituation(double dt)
|
||||
if (fMass > 1000000.0)
|
||||
fBrakeDist *= 2.0; // korekta dla ciężkich, bo przeżynają - da to coś?
|
||||
if (mvOccupied->BrakeDelayFlag == bdelay_G)
|
||||
fBrakeDist =
|
||||
fBrakeDist +
|
||||
2 *
|
||||
mvOccupied
|
||||
->Vel; // dla nastawienia G koniecznie należy wydłużyć drogę na czas reakcji
|
||||
fBrakeDist = fBrakeDist + 2 * mvOccupied->Vel; // dla nastawienia G
|
||||
// koniecznie należy wydłużyć drogę na czas reakcji
|
||||
// double scanmax=(mvOccupied->Vel>0.0)?3*fDriverDist+fBrakeDist:10.0*fDriverDist;
|
||||
double scanmax = (mvOccupied->Vel > 5.0) ?
|
||||
400 + fBrakeDist :
|
||||
|
||||
Reference in New Issue
Block a user