16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 04:39:18 +02:00

Dodane zapamiętywanie ograniczeń róznych typów i wybór z najmniejszego

This commit is contained in:
firleju
2015-10-29 21:57:16 +01:00
parent d3ab168499
commit 553380b8b0
3 changed files with 78 additions and 39 deletions

View File

@@ -151,7 +151,7 @@ void TSpeedPos::CommandCheck()
iFlags |= spSectionVel; iFlags |= spSectionVel;
break; break;
case cm_RoadVelocity: 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; fVelNext = value1;
iFlags |= spRoadVel; iFlags |= spRoadVel;
break; break;
@@ -162,10 +162,12 @@ void TSpeedPos::CommandCheck()
fVelNext = 0.0; // TrainParams->IsStop()?0.0:-1.0; //na razie tak 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 iFlags |= spPassengerStopPoint; // niestety nie da się w tym miejscu współpracować z rozkładem
break; break;
case cm_SetProximityVelocity: //case cm_SetProximityVelocity:
// ignorować // // odcinek z ograniczeniem prędkości o podanej długości
fVelNext = -1; // fVelNext = value1;
break; // iFlags |= spProximityVelocity;
// fSectionVelocityDist = value2;
// break;
case cm_OutsideStation: case cm_OutsideStation:
// w trybie manewrowym: skanować od niej wstecz i stanąć po wyjechaniu za sygnalizator i // w trybie manewrowym: skanować od niej wstecz i stanąć po wyjechaniu za sygnalizator i
// zmienić kierunek // 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 ~(moveTrackEnd | moveSwitchFound); // 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 & 1) // badanie istotności if (sSpeedTable[i].iFlags & spEnabled) // badanie istotności
{ // o ile dana pozycja tabelki jest istotna { // 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 { // jeśli przystanek, trzeba obsłużyć wg rozkładu
if (sSpeedTable[i].evEvent->CommandGet() != asNextStop) if (sSpeedTable[i].evEvent->CommandGet() != asNextStop)
{ // jeśli nazwa nie jest zgodna { // jeśli nazwa nie jest zgodna
@@ -917,26 +919,27 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
} // koniec obsługi W4 } // koniec obsługi W4
v = sSpeedTable[i].fVelNext; // odczyt prędkości do zmiennej pomocniczej v = sSpeedTable[i].fVelNext; // odczyt prędkości do zmiennej pomocniczej
if (sSpeedTable[i].iFlags & 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 |= iDrivigFlags |=
moveSwitchFound; // rozjazd z przodu/pod ogranicza np. sens skanowania wstecz 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ł { // 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 { // jeśli W5, to reakcja zależna od trybu jazdy
if (OrderCurrentGet() & Obey_train) if (OrderCurrentGet() & Obey_train)
{ // w trybie pociągowym: można przyspieszyć do wskazanej prędkości (po { // w trybie pociągowym: można przyspieszyć do wskazanej prędkości (po
// zjechaniu z rozjazdów) // zjechaniu z rozjazdów)
v = -1.0; // ignorować? 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, VelSignalLast = v; //ustawienie prędkości na -1
// ale to jeszcze nie to
// iStationStart=TrainParams->StationIndex; //zaktualizować // iStationStart=TrainParams->StationIndex; //zaktualizować
// wyświetlanie rozkładu // wyświetlanie rozkładu
} }
else if (!(iDrivigFlags & moveSwitchFound)) // jeśli rozjazdy już minięte else if (!(iDrivigFlags & moveSwitchFound)) // jeśli rozjazdy już minięte
VelSignal = v; //!!! to też koniec ograniczenia VelSignalLast = v; //!!! to też koniec ograniczenia
} }
else else
{ // w trybie manewrowym: skanować od niego wstecz, stanąć po wyjechaniu za { // 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) // koniec toru)
} }
} }
else if (sSpeedTable[i].iFlags & 0x800) else if (sSpeedTable[i].iFlags & spStopOnSBL)
{ // jeśli S1 na SBL { // jeśli S1 na SBL
if (mvOccupied->Vel < 2.0) // stanąć nie musi, ale zwolnić przynajmniej if (mvOccupied->Vel < 2.0) // stanąć nie musi, ale zwolnić przynajmniej
if (sSpeedTable[i].fDist < fMaxProximityDist) // jest w maksymalnym zasięgu 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! // pociągu z przodu!
} }
if (eSignSkip != sSpeedTable[i].evEvent) // jeśli ten SBL nie jest do pominięcia 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) ? if ((mvOccupied->CategoryFlag & 1) ?
sSpeedTable[i].fDist > pVehicles[0]->fTrackBlock - 20.0 : sSpeedTable[i].fDist > pVehicles[0]->fTrackBlock - 20.0 :
false) // jak sygnał jest dalej niż zawalidroga false) // jak sygnał jest dalej niż zawalidroga
v = 0.0; // to może być podany dla tamtego: jechać tak, jakby tam stop był v = 0.0; // to może być podany dla tamtego: jechać tak, jakby tam stop był
else else
{ // zawalidrogi nie ma (albo pojazd jest samochodem), sprawdzić sygnał { // 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ę! // komendę!
{ // jeśli podana prędkość manewrowa { // jeśli podana prędkość manewrowa
if ((OrderCurrentGet() & Obey_train) ? v == 0.0 : false) if ((OrderCurrentGet() & Obey_train) ? v == 0.0 : false)
{ // jeśli tryb pociągowy a tarcze ma ShuntVelocity 0 0 { // jeśli tryb pociągowy a tarcze ma ShuntVelocity 0 0
v = -1; // ignorować, chyba że prędkość stanie się niezerowa 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 sSpeedTable[i].iFlags = 0; // to można usunąć, bo podstawowy automat
// usuwa tylko niezerowe // 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 if (v != 0.0) // komenda jest tylko gdy ma jechać, bo stoi na podstawie
// tabelki // tabelki
{ // jeśli nie było komendy wcześniej - pierwsza się liczy - ustawianie { // 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 else //jeśli jakiś event pasywny ale nie tarcza manewrowa
// sprawdzić !!!! if (go == cm_Unknown) // jeśli nie było komendy wcześniej - pierwsza się liczy
if (go <= cm_Ready) // 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
{ {
@@ -1049,13 +1069,16 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
} // jeśli event } // jeśli event
if (v >= 0.0) if (v >= 0.0)
{ // pozycje z prędkością -1 można spokojnie pomijać { // pozycje z prędkością -1 można spokojnie pomijać
d = sSpeedTable[i].fDist; d = sSpeedTable[i].fDist;
if ((sSpeedTable[i].iFlags & 0x20) ? if ((sSpeedTable[i].iFlags & spElapsed) ?
false : false :
d > 0.0) // sygnał lub ograniczenie z przodu (+32=przejechane) d > 0.0) // sygnał lub ograniczenie z przodu (+32=przejechane)
{ // 2014-02: jeśli stoi, a ma do przejechania kawałek, to niech jedzie { // 2014-02: jeśli stoi, a ma do przejechania kawałek, to niech jedzie
if ((mvOccupied->Vel == 0.0) ? if ((mvOccupied->Vel == 0.0) ?
((sSpeedTable[i].iFlags & 0x501) == 0x501) && (d > fMaxProximityDist) : ((sSpeedTable[i].iFlags &
(spEnabled | spEvent | spPassengerStopPoint)) ==
(spEnabled | spEvent | spPassengerStopPoint)) &&
(d > fMaxProximityDist) :
false) false)
a = (iDrivigFlags & moveStopCloser) ? fAcc : 0.0; // ma podjechać bliżej - a = (iDrivigFlags & moveStopCloser) ? fAcc : 0.0; // ma podjechać bliżej -
// czy na pewno w tym // 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 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, { // tor ogranicza prędkość, dopóki cały skład nie przejedzie,
// d=fLength+d; //zamiana na długość liczoną do przodu // d=fLength+d; //zamiana na długość liczoną do przodu
if (v >= 1.0) // EU06 się zawieszało po dojechaniu na koniec toru postojowego 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 (v>=0.0)
if (fNext >= 0.0) if (fNext >= 0.0)
{ // jeśli ograniczenie { // 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 if (!eSignNext) // jeśli jeszcze nic nie zapisane tam
eSignNext = sSpeedTable[i].evEvent; // dla informacji eSignNext = sSpeedTable[i].evEvent; // dla informacji
if (fNext == 0.0) if (fNext == 0.0)
@@ -1110,6 +1134,12 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
} }
} // if (sSpeedTable[i].iFlags&1) } // if (sSpeedTable[i].iFlags&1)
} // for } // 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; 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 VelSignal = 0.0; // normalnie na początku ma stać, no chyba że jedzie
VelLimit = -1.0; // brak ograniczenia prędkości VelLimit = -1.0; // brak ograniczenia prędkości
VelNext = 120.0; 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; AIControllFlag = AI;
pVehicle = NewControll; pVehicle = NewControll;
ControllingSet(); // utworzenie połączenia do sterowanego pojazdu ControllingSet(); // utworzenie połączenia do sterowanego pojazdu
@@ -3210,11 +3243,8 @@ bool TController::UpdateSituation(double dt)
if (fMass > 1000000.0) if (fMass > 1000000.0)
fBrakeDist *= 2.0; // korekta dla ciężkich, bo przeżynają - da to coś? fBrakeDist *= 2.0; // korekta dla ciężkich, bo przeżynają - da to coś?
if (mvOccupied->BrakeDelayFlag == bdelay_G) if (mvOccupied->BrakeDelayFlag == bdelay_G)
fBrakeDist = fBrakeDist = fBrakeDist + 2 * mvOccupied->Vel; // dla nastawienia G
fBrakeDist + // koniecznie należy wydłużyć drogę na czas reakcji
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>0.0)?3*fDriverDist+fBrakeDist:10.0*fDriverDist;
double scanmax = (mvOccupied->Vel > 5.0) ? double scanmax = (mvOccupied->Vel > 5.0) ?
400 + fBrakeDist : 400 + fBrakeDist :

View File

@@ -50,7 +50,11 @@ enum TMovementStatus
moveGuardSignal = 0x8000, // sygnał od kierownika (minął czas postoju) moveGuardSignal = 0x8000, // sygnał od kierownika (minął czas postoju)
moveVisibility = 0x10000, // jazda na widoczność po przejechaniu S1 na SBL moveVisibility = 0x10000, // jazda na widoczność po przejechaniu S1 na SBL
moveDoorOpened = 0x20000, // drzwi zostały otwarte - doliczyć czas na zamknięcie moveDoorOpened = 0x20000, // drzwi zostały otwarte - doliczyć czas na zamknięcie
movePushPull = 0x40000 // zmiana czoła przez zmianę kabiny - nie odczepiać przy zmianie kierunku movePushPull = 0x40000, // zmiana czoła przez zmianę kabiny - nie odczepiać przy zmianie kierunku
moveSemaphorFound = 0x80000, // na drodze skanowania został znaleziony semafor
moveSemaphorWasElapsed = 0x100000, // minięty został semafor
moveTrainInsideStation = 0x200000, // pociąg między semaforem a rozjazdami lub następnym semaforem
moveSpeedLimitFound = 0x400000 // pociąg w ograniczeniu z podaną jego długością
}; };
enum TStopReason enum TStopReason
@@ -111,6 +115,7 @@ enum TSpeedPosFlag
spSemaphor = 0x4000, // semafor pociągowy spSemaphor = 0x4000, // semafor pociągowy
spRoadVel = 0x8000, // zadanie prędkości drogowej spRoadVel = 0x8000, // zadanie prędkości drogowej
spSectionVel = 0x20000, // odcinek z ograniczeniem spSectionVel = 0x20000, // odcinek z ograniczeniem
// spProximityVelocity = 0x40000, // odcinek z ograniczeniem i podaną jego długościa
spEndOfTable = 0x10000 // zatkanie tabelki spEndOfTable = 0x10000 // zatkanie tabelki
}; };
@@ -119,6 +124,7 @@ class TSpeedPos
public: public:
double fDist; // aktualna odległość (ujemna gdy minięte) double fDist; // aktualna odległość (ujemna gdy minięte)
double fVelNext; // prędkość obowiązująca od tego miejsca double fVelNext; // prędkość obowiązująca od tego miejsca
double fSectionVelocityDist; //długość ograniczenia prędkości
// double fAcc; // double fAcc;
int iFlags; //flagi typu wpisu do tabelki int iFlags; //flagi typu wpisu do tabelki
// 1=istotny,2=tor,4=odwrotnie,8-zwrotnica (może się zmienić),16-stan // 1=istotny,2=tor,4=odwrotnie,8-zwrotnica (może się zmienić),16-stan
@@ -224,8 +230,11 @@ class TController
private: private:
double VelforDriver; // prędkość, używana przy zmianie kierunku (ograniczenie przy nieznajmości double VelforDriver; // prędkość, używana przy zmianie kierunku (ograniczenie przy nieznajmości
// szlaku?) // szlaku?)
double VelSignal; // predkość zadawana przez semafor (funkcją SetVelocity()) double VelSignal; // ograniczenie prędkości z kompilacji znaków i sygnałów
double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości
double VelSignalLast; // prędkość zadana na ostatnim semaforze
double VelLimitLast; // prędkość zadana przez ograniczenie
double VelRoad; // aktualna prędkość drogowa (ze znaku W27)
// (PutValues albo komendą) // (PutValues albo komendą)
public: public:
double VelNext; // prędkość, jaka ma być po przejechaniu długości ProximityDist double VelNext; // prędkość, jaka ma być po przejechaniu długości ProximityDist

View File

@@ -353,11 +353,11 @@ void TEvent::Load(cParser *parser, vector3 *org)
bEnabled = false; bEnabled = false;
Params[6].asCommand = cm_ShuntVelocity; Params[6].asCommand = cm_ShuntVelocity;
} }
else if (str == "SetProximityVelocity") //else if (str == "SetProximityVelocity")
{ //{
bEnabled = false; // bEnabled = false;
Params[6].asCommand = cm_SetProximityVelocity; // Params[6].asCommand = cm_SetProximityVelocity;
} //}
else if (str == "OutsideStation") else if (str == "OutsideStation")
{ {
bEnabled = false; // ma byæ skanowny, aby AI nie przekracza³o W5 bEnabled = false; // ma byæ skanowny, aby AI nie przekracza³o W5