mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-18 03:09:18 +02:00
Merge with 474next6p1
This commit is contained in:
@@ -197,6 +197,7 @@ void Console::BitsSet(int mask, int entry)
|
|||||||
int old = iBits; // poprzednie stany
|
int old = iBits; // poprzednie stany
|
||||||
iBits |= mask;
|
iBits |= mask;
|
||||||
BitsUpdate(old ^ iBits); // 1 dla bitów zmienionych
|
BitsUpdate(old ^ iBits); // 1 dla bitów zmienionych
|
||||||
|
WriteLog("PoKeys::BitsSet: mask: " + AnsiString(mask) + " iBits: " + AnsiString(iBits));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -269,7 +270,9 @@ void Console::BitsUpdate(int mask)
|
|||||||
PoKeys55[0]->Write(0x40, 52 - 1, iBits & 0x1000 ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 52 - 1, iBits & 0x1000 ? 1 : 0);
|
||||||
if (mask & 0x2000) // b13 Prąd na silnikach do odbijania w haslerze
|
if (mask & 0x2000) // b13 Prąd na silnikach do odbijania w haslerze
|
||||||
PoKeys55[0]->Write(0x40, 53 - 1, iBits & 0x2000 ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 53 - 1, iBits & 0x2000 ? 1 : 0);
|
||||||
}
|
if (mask & 0x4000) // b14 Brzęczyk SHP lub CA
|
||||||
|
PoKeys55[0]->Write(0x40, 16 - 1, iBits & 0x4000 ? 1 : 0);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
264
Driver.cpp
264
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -275,37 +282,79 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
AnsiString TSpeedPos::GetName()
|
||||||
|
{
|
||||||
|
if (iFlags & spTrack) // jeśli tor
|
||||||
|
return trTrack->NameGet();
|
||||||
|
else if (iFlags & spEvent) // jeśli event
|
||||||
|
return evEvent->asName;
|
||||||
|
}
|
||||||
|
|
||||||
AnsiString TSpeedPos::TableText()
|
AnsiString TSpeedPos::TableText()
|
||||||
{ // pozycja tabelki prędkości
|
{ // pozycja tabelki prędkości
|
||||||
if (iFlags & spEnabled)
|
if (iFlags & spEnabled)
|
||||||
{ // o ile pozycja istotna
|
{ // o ile pozycja istotna
|
||||||
if (iFlags & spTrack) // jeśli tor
|
return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) +
|
||||||
return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) +
|
", Vel=" + AnsiString(fVelNext) + ", Name=" + GetName();
|
||||||
", Vel=" + AnsiString(fVelNext) + ", Track=" + trTrack->NameGet();
|
//if (iFlags & spTrack) // jeśli tor
|
||||||
else if (iFlags & spEvent) // jeśli event
|
// return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) +
|
||||||
return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) +
|
// ", Vel=" + AnsiString(fVelNext) + ", Track=" + trTrack->NameGet();
|
||||||
", Vel=" + AnsiString(fVelNext) + ", Event=" + evEvent->asName;
|
//else if (iFlags & spEvent) // jeśli event
|
||||||
|
// return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) +
|
||||||
|
// ", Vel=" + AnsiString(fVelNext) + ", Event=" + evEvent->asName;
|
||||||
}
|
}
|
||||||
return "Empty";
|
return "Empty";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TSpeedPos::Set(TEvent *e, double d)
|
bool TSpeedPos::IsProperSemaphor(TOrders order)
|
||||||
|
{ // sprawdzenie czy semafor jest zgodny z trybem jazdy
|
||||||
|
if (order < 0x40) // Wait_for_orders, Prepare_engine, Change_direction, Connect, Disconnect, Shunt
|
||||||
|
{
|
||||||
|
if (iFlags & (spSemaphor | spShuntSemaphor))
|
||||||
|
return true;
|
||||||
|
else if (iFlags & spOutsideStation)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (order & Obey_train)
|
||||||
|
{
|
||||||
|
if (iFlags & spSemaphor)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false; // true gdy zatrzymanie, wtedy nie ma po co skanować dalej
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TSpeedPos::Set(TEvent *event, double dist, TOrders order)
|
||||||
{ // 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
|
// zależnie od trybu sprawdzenie czy jest tutaj gdzieś semafor lub tarcza manewrowa
|
||||||
|
// jeśli wskazuje stop wtedy wystawiamy true jako koniec sprawdzania
|
||||||
|
// WriteLog("EventSet: Vel=" + AnsiString(fVelNext) + " iFlags=" + AnsiString(iFlags) + " order="+AnsiString(order));
|
||||||
|
if (order < 0x40) // Wait_for_orders, Prepare_engine, Change_direction, Connect, Disconnect, Shunt
|
||||||
|
{
|
||||||
|
if (iFlags & (spSemaphor | spShuntSemaphor) && fVelNext == 0.0)
|
||||||
|
return true;
|
||||||
|
else if (iFlags & spOutsideStation)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (order & Obey_train)
|
||||||
|
{
|
||||||
|
if (iFlags & spSemaphor && fVelNext == 0.0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false; // 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;
|
||||||
@@ -376,7 +425,8 @@ bool TController::TableNotFound(TEvent *e)
|
|||||||
void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
||||||
{ // skanowanie trajektorii na odległość (fDistance) od (pVehicle) w kierunku przodu składu i
|
{ // skanowanie trajektorii na odległość (fDistance) od (pVehicle) w kierunku przodu składu i
|
||||||
// uzupełnianie tabelki
|
// uzupełnianie tabelki
|
||||||
if (!iDirection) // kierunek pojazdu z napędem
|
// WriteLog("Starting TableTraceRoute");
|
||||||
|
if (!iDirection) // kierunek pojazdu z napędem
|
||||||
{ // jeśli kierunek jazdy nie jest okreslony
|
{ // jeśli kierunek jazdy nie jest okreslony
|
||||||
iTableDirection = 0; // czekamy na ustawienie kierunku
|
iTableDirection = 0; // czekamy na ustawienie kierunku
|
||||||
}
|
}
|
||||||
@@ -404,19 +454,40 @@ 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)
|
||||||
|
// WriteLog("TableTraceRoute: check last track");
|
||||||
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)
|
// znaleziono semafor lub tarczę lub tor z prędkością zero
|
||||||
// return; // znaleziono semafor lub tor z prędkością zero i nie ma co dalej sprawdzać
|
// trzeba sprawdzić czy to nadał semafor
|
||||||
//trzeba dalej sprawdzać, gdyż przy stopinfo potrafił zgubić semafor
|
// WriteLog("TableTraceRoute: check semaphor");
|
||||||
|
// if (sSemNext)
|
||||||
|
// WriteLog(sSemNext->TableText());
|
||||||
|
if (sSemNext &&
|
||||||
|
sSemNext->fVelNext ==
|
||||||
|
0.0) // jeśli jest następny semafor to sprawdzamy czy to on nadał zero
|
||||||
|
{
|
||||||
|
// WriteLog("TableTraceRoute: "+sSemNext->TableText());
|
||||||
|
if ((OrderCurrentGet() & Obey_train) && (sSemNext->iFlags & spSemaphor))
|
||||||
|
return;
|
||||||
|
else if ((OrderCurrentGet() < 0x40) &&
|
||||||
|
(sSemNext->iFlags & (spSemaphor | spShuntSemaphor | spOutsideStation)))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
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ć)
|
||||||
@@ -425,17 +496,21 @@ 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
|
||||||
}
|
}
|
||||||
if (fCurrentDistance < fDistance)
|
if (fCurrentDistance < fDistance)
|
||||||
{ // jeśli w ogóle jest po co analizować
|
{ // jeśli w ogóle jest po co analizować
|
||||||
|
// WriteLog("TableTraceRoute: checking next tracks");
|
||||||
--iLast; // jak coś się znajdzie, zostanie wpisane w tę pozycję, którą właśnie odczytano
|
--iLast; // jak coś się znajdzie, zostanie wpisane w tę pozycję, którą właśnie odczytano
|
||||||
while (fCurrentDistance < fDistance)
|
while (fCurrentDistance < fDistance)
|
||||||
{
|
{
|
||||||
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 (pTrack)
|
||||||
|
// WriteLog("TableTraceRoute: " + OwnerName() + " checking track " +
|
||||||
|
// pTrack->NameGet());
|
||||||
if ((pEvent = CheckTrackEvent(fLastDir, pTrack)) !=
|
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
|
||||||
@@ -443,10 +518,33 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
|||||||
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 + " by " +
|
||||||
fCurrentDistance)) // dodanie odczytu sygnału
|
OwnerName());
|
||||||
|
if (sSpeedTable[iLast].Set(
|
||||||
|
pEvent, fCurrentDistance,
|
||||||
|
OrderCurrentGet())) // 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ć
|
||||||
|
sSemNext = &sSpeedTable[iLast];
|
||||||
|
WriteLog("Signal stop. Next Semaphor ", false);
|
||||||
|
if (sSemNext)
|
||||||
|
WriteLog(sSemNext->GetName());
|
||||||
|
else
|
||||||
|
WriteLog("none");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (sSpeedTable[iLast].IsProperSemaphor(OrderCurrentGet()) &&
|
||||||
|
sSemNext == NULL)
|
||||||
|
sSemNext =
|
||||||
|
&sSpeedTable[iLast]; // sprawdzamy czy pierwszy na drodze
|
||||||
|
WriteLog("Signal forward. Next Semaphor ", false);
|
||||||
|
if (sSemNext)
|
||||||
|
WriteLog(sSemNext->GetName());
|
||||||
|
else
|
||||||
|
WriteLog("none");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} // event dodajemy najpierw, żeby móc sprawdzić, czy tor został dodany po
|
} // event dodajemy najpierw, żeby móc sprawdzić, czy tor został dodany po
|
||||||
// odczytaniu prędkości następnego
|
// odczytaniu prędkości następnego
|
||||||
@@ -471,10 +569,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 +588,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,16 +692,18 @@ void TController::TableCheck(double fDistance)
|
|||||||
{
|
{
|
||||||
if (sSpeedTable[i].Update(&pos, &dir, len))
|
if (sSpeedTable[i].Update(&pos, &dir, len))
|
||||||
{
|
{
|
||||||
int k = (iLast + 1) % iSpeedTableSize; // skanujemy razem z ostatnią pozycją
|
WriteLog("TableCheck: Switch change. Delete next entries. (" +
|
||||||
for (int j = (i+1) % iSpeedTableSize; j != k; j = (j + 1) % iSpeedTableSize)
|
sSpeedTable[i].trTrack->NameGet() + ")");
|
||||||
|
int k = (iLast + 1) % iSpeedTableSize; // skanujemy razem z ostatnią pozycją
|
||||||
|
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ą
|
||||||
//if (sSpeedTable[j].iFlags & spTrack)
|
WriteLog("TableCheck: Delete from table: " + sSpeedTable[j].GetName());
|
||||||
// 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;
|
sSpeedTable[j].iFlags = 0;
|
||||||
|
if (&sSpeedTable[j] == sSemNext)
|
||||||
|
sSemNext = NULL; // przy kasowaniu tabelki zrzucamy także semafor
|
||||||
}
|
}
|
||||||
TablePurger();
|
WriteLog("TableCheck: Delete entries OK.");
|
||||||
|
WriteLog("TableCheck: New last element: " + sSpeedTable[i].GetName());
|
||||||
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
|
||||||
}
|
}
|
||||||
@@ -619,7 +720,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
|
||||||
@@ -631,7 +732,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
|
||||||
@@ -658,6 +759,7 @@ void TController::TableCheck(double fDistance)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
sSpeedTable[iLast].Update(&pos, &dir, len); // aktualizacja ostatniego
|
sSpeedTable[iLast].Update(&pos, &dir, len); // aktualizacja ostatniego
|
||||||
|
// WriteLog("TableCheck: Upate last track. Dist=" + AnsiString(sSpeedTable[iLast].fDist));
|
||||||
if (sSpeedTable[iLast].fDist < fDistance)
|
if (sSpeedTable[iLast].fDist < fDistance)
|
||||||
TableTraceRoute(fDistance, pVehicles[1]); // doskanowanie dalszego odcinka
|
TableTraceRoute(fDistance, pVehicles[1]); // doskanowanie dalszego odcinka
|
||||||
}
|
}
|
||||||
@@ -672,6 +774,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
double a; // przyspieszenie
|
double a; // przyspieszenie
|
||||||
double v; // prędkość
|
double v; // prędkość
|
||||||
double d; // droga
|
double d; // droga
|
||||||
|
double d_to_next_sem = 10000.0; //ustaiwamy na pewno dalej niż widzi AI
|
||||||
TCommandType go = cm_Unknown;
|
TCommandType go = cm_Unknown;
|
||||||
eSignNext = NULL;
|
eSignNext = NULL;
|
||||||
int i, k = iLast - iFirst + 1;
|
int i, k = iLast - iFirst + 1;
|
||||||
@@ -943,7 +1046,24 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
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 & spEvent) // 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ł
|
||||||
//sprawdzanie eventów pasywnych miniętych
|
// sprawdzanie eventów pasywnych miniętych
|
||||||
|
if (sSpeedTable[i].fDist < 0.0 && sSemNext == &sSpeedTable[i])
|
||||||
|
{
|
||||||
|
WriteLog("TableUpdate: semaphor " + sSemNext->GetName() + " passed");
|
||||||
|
sSemNext = NULL; // jeśli minęliśmy semafor od ograniczenia to go kasujemy ze
|
||||||
|
// zmiennej sprawdzającej dla skanowania w przód
|
||||||
|
}
|
||||||
|
if (sSpeedTable[i].fDist > 0.0 &&
|
||||||
|
sSpeedTable[i].IsProperSemaphor(OrderCurrentGet()) &&
|
||||||
|
(!sSemNext ||
|
||||||
|
(sSemNext && sSemNext->fVelNext != 0 && sSpeedTable[i].fVelNext == 0)))
|
||||||
|
{
|
||||||
|
sSemNext = &sSpeedTable[i]; // jeśli jest mienięty poprzedni
|
||||||
|
// semafor a wcześniej
|
||||||
|
// byl nowy to go dorzucamy do zmiennej, żeby cały
|
||||||
|
// czas widział najbliższy
|
||||||
|
WriteLog("TableUpdate: Next semaphor: " + sSemNext->GetName());
|
||||||
|
}
|
||||||
if (sSpeedTable[i].iFlags & spOutsideStation)
|
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)
|
||||||
@@ -993,7 +1113,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
if (sSpeedTable[i].fDist < 0)
|
if (sSpeedTable[i].fDist < 0)
|
||||||
VelSignalLast = sSpeedTable[i].fVelNext; //minięty daje prędkość obowiązującą
|
VelSignalLast = sSpeedTable[i].fVelNext; //minięty daje prędkość obowiązującą
|
||||||
else
|
else
|
||||||
|
{
|
||||||
iDrivigFlags |= moveSemaphorFound; //jeśli z przodu to dajemy falgę, że jest
|
iDrivigFlags |= moveSemaphorFound; //jeśli z przodu to dajemy falgę, że jest
|
||||||
|
d_to_next_sem = Min0R(sSpeedTable[i].fDist, d_to_next_sem);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (sSpeedTable[i].iFlags & spRoadVel)
|
else if (sSpeedTable[i].iFlags & spRoadVel)
|
||||||
{ // to W6
|
{ // to W6
|
||||||
@@ -1208,13 +1331,15 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
if (VelRoad >= 0.0)
|
if (VelRoad >= 0.0)
|
||||||
fVelDes = Min0R(fVelDes, VelRoad);
|
fVelDes = Min0R(fVelDes, VelRoad);
|
||||||
// nastepnego semafora albo zwrotnicy to uznajemy, że mijamy W5
|
// nastepnego semafora albo zwrotnicy to uznajemy, że mijamy W5
|
||||||
|
FirstSemaphorDist = d_to_next_sem; // przepisanie znalezionej wartosci do zmiennej
|
||||||
return go;
|
return go;
|
||||||
};
|
};
|
||||||
|
|
||||||
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)
|
||||||
@@ -1225,8 +1350,12 @@ void TController::TablePurger()
|
|||||||
{ // 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
|
||||||
// (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ę");
|
if (&sSpeedTable[(i + 1) % iSpeedTableSize] == sSemNext)
|
||||||
|
sSemNext = &sSpeedTable[i]; // przeniesienie znacznika o semaforze
|
||||||
|
}
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
@@ -1239,6 +1368,8 @@ void TController::TablePurger()
|
|||||||
for (j = -1, i = iFirst; k > 0; --k)
|
for (j = -1, i = iFirst; k > 0; --k)
|
||||||
{ // przepisywanie rekordów iFirst..iLast na 0..k
|
{ // przepisywanie rekordów iFirst..iLast na 0..k
|
||||||
t[++j] = sSpeedTable[i];
|
t[++j] = sSpeedTable[i];
|
||||||
|
if (&sSpeedTable[i] == sSemNext)
|
||||||
|
sSemNext = &t[j]; // przeniesienie znacznika o semaforze
|
||||||
i = (i + 1) % iSpeedTableSize; // kolejna pozycja mogą być zawinięta
|
i = (i + 1) % iSpeedTableSize; // kolejna pozycja mogą być zawinięta
|
||||||
}
|
}
|
||||||
iFirst = 0; // teraz będzie od zera
|
iFirst = 0; // teraz będzie od zera
|
||||||
@@ -1246,7 +1377,7 @@ void TController::TablePurger()
|
|||||||
delete[] sSpeedTable; // to już nie potrzebne
|
delete[] sSpeedTable; // to już nie potrzebne
|
||||||
sSpeedTable = t; // bo jest nowe
|
sSpeedTable = t; // bo jest nowe
|
||||||
iSpeedTableSize += 16;
|
iSpeedTableSize += 16;
|
||||||
// WriteLog("Tabelka powiększona do "+AnsiString(iSpeedTableSize)+" pozycji");
|
WriteLog("Tabelka powiększona do "+AnsiString(iSpeedTableSize)+" pozycji");
|
||||||
};
|
};
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -1267,6 +1398,7 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
|
|||||||
HelpMeFlag = false;
|
HelpMeFlag = false;
|
||||||
// fProximityDist=1; //nie używane
|
// fProximityDist=1; //nie używane
|
||||||
ActualProximityDist = 1;
|
ActualProximityDist = 1;
|
||||||
|
FirstSemaphorDist = 10000.0;
|
||||||
vCommandLocation.x = 0;
|
vCommandLocation.x = 0;
|
||||||
vCommandLocation.y = 0;
|
vCommandLocation.y = 0;
|
||||||
vCommandLocation.z = 0;
|
vCommandLocation.z = 0;
|
||||||
@@ -1346,6 +1478,7 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
|
|||||||
fLength = 0.0;
|
fLength = 0.0;
|
||||||
fMass = 0.0; //[kg]
|
fMass = 0.0; //[kg]
|
||||||
eSignNext = NULL; // sygnał zmieniający prędkość, do pokazania na [F2]
|
eSignNext = NULL; // sygnał zmieniający prędkość, do pokazania na [F2]
|
||||||
|
sSemNext = NULL; // pierwszy semafor w przebiegu
|
||||||
fShuntVelocity = 40; // domyślna prędkość manewrowa
|
fShuntVelocity = 40; // domyślna prędkość manewrowa
|
||||||
fStopTime = 0.0; // czas postoju przed dalszą jazdą (np. na przystanku)
|
fStopTime = 0.0; // czas postoju przed dalszą jazdą (np. na przystanku)
|
||||||
iDrivigFlags = moveStopPoint; // podjedź do W4 możliwie blisko
|
iDrivigFlags = moveStopPoint; // podjedź do W4 możliwie blisko
|
||||||
@@ -3314,9 +3447,10 @@ bool TController::UpdateSituation(double dt)
|
|||||||
fBrakeDist = fBrakeDist + 2 * mvOccupied->Vel; // dla nastawienia G
|
fBrakeDist = fBrakeDist + 2 * mvOccupied->Vel; // dla nastawienia G
|
||||||
// koniecznie należy wydłużyć drogę na czas reakcji
|
// 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 :
|
||||||
30.0 * fDriverDist; // 1500m dla stojących pociągów; Ra 2015-01: przy
|
// 30.0 * fDriverDist; // 1500m dla stojących pociągów; Ra 2015-01: przy
|
||||||
|
double scanmax = Max0R(400 + fBrakeDist, 1500);
|
||||||
// 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ć,
|
||||||
@@ -3676,7 +3810,7 @@ bool TController::UpdateSituation(double dt)
|
|||||||
case Change_direction | Connect: // zmiana kierunku podczas podłączania
|
case Change_direction | Connect: // zmiana kierunku podczas podłączania
|
||||||
if (OrderList[OrderPos] != Obey_train) // spokojne manewry
|
if (OrderList[OrderPos] != Obey_train) // spokojne manewry
|
||||||
{
|
{
|
||||||
VelSignal = Min0R(VelSignal, 40); // jeśli manewry, to ograniczamy prędkość
|
VelSignal = Global::Min0RSpeed(VelSignal, 40); // jeśli manewry, to ograniczamy prędkość
|
||||||
if (AIControllFlag)
|
if (AIControllFlag)
|
||||||
{ // to poniżej tylko dla AI
|
{ // to poniżej tylko dla AI
|
||||||
if (iVehicleCount >= 0) // jeśli jest co odczepić
|
if (iVehicleCount >= 0) // jeśli jest co odczepić
|
||||||
@@ -3810,7 +3944,7 @@ bool TController::UpdateSituation(double dt)
|
|||||||
// następnie ograniczana
|
// następnie ograniczana
|
||||||
if (TrainParams) // jeśli ma rozkład
|
if (TrainParams) // jeśli ma rozkład
|
||||||
if (TrainParams->TTVmax > 0.0) // i ograniczenie w rozkładzie
|
if (TrainParams->TTVmax > 0.0) // i ograniczenie w rozkładzie
|
||||||
VelDesired = Min0R(VelDesired,
|
VelDesired = Global::Min0RSpeed(VelDesired,
|
||||||
TrainParams->TTVmax); // to nie przekraczać rozkladowej
|
TrainParams->TTVmax); // to nie przekraczać rozkladowej
|
||||||
SetDriverPsyche(); // ustawia AccPreferred (potrzebne tu?)
|
SetDriverPsyche(); // ustawia AccPreferred (potrzebne tu?)
|
||||||
// Ra: odczyt (ActualProximityDist), (VelNext) i (AccPreferred) z tabelki prędkosci
|
// Ra: odczyt (ActualProximityDist), (VelNext) i (AccPreferred) z tabelki prędkosci
|
||||||
@@ -3878,7 +4012,7 @@ bool TController::UpdateSituation(double dt)
|
|||||||
// ma taboru do podłączenia
|
// ma taboru do podłączenia
|
||||||
// Ra 2F1H: z tym (fTrackBlock) to nie jest najlepszy pomysł, bo lepiej by
|
// Ra 2F1H: z tym (fTrackBlock) to nie jest najlepszy pomysł, bo lepiej by
|
||||||
// było porównać z odległością od sygnalizatora z przodu
|
// było porównać z odległością od sygnalizatora z przodu
|
||||||
if ((OrderList[OrderPos] | Connect) ? pVehicles[0]->fTrackBlock > 2000 :
|
if ((OrderList[OrderPos] & Connect) ? (pVehicles[0]->fTrackBlock > 2000 || pVehicles[0]->fTrackBlock > FirstSemaphorDist) :
|
||||||
true)
|
true)
|
||||||
if ((comm = BackwardScan()) != cm_Unknown) // jeśli w drugą można jechać
|
if ((comm = BackwardScan()) != cm_Unknown) // jeśli w drugą można jechać
|
||||||
{ // należy sprawdzać odległość od znalezionego sygnalizatora,
|
{ // należy sprawdzać odległość od znalezionego sygnalizatora,
|
||||||
@@ -4019,22 +4153,22 @@ bool TController::UpdateSituation(double dt)
|
|||||||
// else if (VelSignal<0)
|
// else if (VelSignal<0)
|
||||||
// VelDesired=fVelMax; //ile fabryka dala (Ra: uwzględione wagony)
|
// VelDesired=fVelMax; //ile fabryka dala (Ra: uwzględione wagony)
|
||||||
else if (VelSignal >= 0) // jeśli skład był zatrzymany na początku i teraz już może jechać
|
else if (VelSignal >= 0) // jeśli skład był zatrzymany na początku i teraz już może jechać
|
||||||
VelDesired = Min0R(VelDesired, VelSignal);
|
VelDesired = Global::Min0RSpeed(VelDesired, VelSignal);
|
||||||
|
|
||||||
if (mvOccupied->RunningTrack.Velmax >=
|
if (mvOccupied->RunningTrack.Velmax >=
|
||||||
0) // ograniczenie prędkości z trajektorii ruchu
|
0) // ograniczenie prędkości z trajektorii ruchu
|
||||||
VelDesired =
|
VelDesired =
|
||||||
Min0R(VelDesired,
|
Global::Min0RSpeed(VelDesired,
|
||||||
mvOccupied->RunningTrack.Velmax); // uwaga na ograniczenia szlakowej!
|
mvOccupied->RunningTrack.Velmax); // uwaga na ograniczenia szlakowej!
|
||||||
if (VelforDriver >= 0) // tu jest zero przy zmianie kierunku jazdy
|
if (VelforDriver >= 0) // tu jest zero przy zmianie kierunku jazdy
|
||||||
VelDesired = Min0R(VelDesired, VelforDriver); // Ra: tu może być 40, jeśli
|
VelDesired = Global::Min0RSpeed(VelDesired, VelforDriver); // Ra: tu może być 40, jeśli
|
||||||
// mechanik nie ma znajomości
|
// mechanik nie ma znajomości
|
||||||
// szlaaku, albo kierowca jeździ
|
// szlaaku, albo kierowca jeździ
|
||||||
// 70
|
// 70
|
||||||
if (TrainParams)
|
if (TrainParams)
|
||||||
if (TrainParams->CheckTrainLatency() < 5.0)
|
if (TrainParams->CheckTrainLatency() < 5.0)
|
||||||
if (TrainParams->TTVmax > 0.0)
|
if (TrainParams->TTVmax > 0.0)
|
||||||
VelDesired = Min0R(
|
VelDesired = Global::Min0RSpeed(
|
||||||
VelDesired,
|
VelDesired,
|
||||||
TrainParams
|
TrainParams
|
||||||
->TTVmax); // jesli nie spozniony to nie przekraczać rozkladowej
|
->TTVmax); // jesli nie spozniony to nie przekraczać rozkladowej
|
||||||
@@ -4682,12 +4816,12 @@ void TController::OrdersDump()
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
TOrders TController::OrderCurrentGet()
|
inline TOrders TController::OrderCurrentGet()
|
||||||
{
|
{
|
||||||
return OrderList[OrderPos];
|
return OrderList[OrderPos];
|
||||||
}
|
}
|
||||||
|
|
||||||
TOrders TController::OrderNextGet()
|
inline TOrders TController::OrderNextGet()
|
||||||
{
|
{
|
||||||
return OrderList[OrderPos + 1];
|
return OrderList[OrderPos + 1];
|
||||||
}
|
}
|
||||||
|
|||||||
10
Driver.h
10
Driver.h
@@ -142,9 +142,11 @@ class TSpeedPos
|
|||||||
public:
|
public:
|
||||||
void Clear();
|
void Clear();
|
||||||
bool Update(vector3 *p, vector3 *dir, double &len);
|
bool Update(vector3 *p, vector3 *dir, double &len);
|
||||||
bool Set(TEvent *e, double d);
|
bool Set(TEvent *e, double d, TOrders order = Wait_for_orders);
|
||||||
void Set(TTrack *t, double d, int f);
|
void Set(TTrack *t, double d, int f);
|
||||||
AnsiString TableText();
|
AnsiString TableText();
|
||||||
|
AnsiString GetName();
|
||||||
|
bool IsProperSemaphor(TOrders order = Wait_for_orders);
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@@ -168,6 +170,7 @@ class TController
|
|||||||
double fLastVel; // prędkość na poprzednio sprawdzonym torze
|
double fLastVel; // prędkość na poprzednio sprawdzonym torze
|
||||||
TTrack *tLast; // ostatni analizowany tor
|
TTrack *tLast; // ostatni analizowany tor
|
||||||
TEvent *eSignSkip; // można pominąć ten SBL po zatrzymaniu
|
TEvent *eSignSkip; // można pominąć ten SBL po zatrzymaniu
|
||||||
|
TSpeedPos *sSemNext; // następny semafor na drodze zależny od trybu jazdy
|
||||||
private: // parametry aktualnego składu
|
private: // parametry aktualnego składu
|
||||||
double fLength; // długość składu (do wyciągania z ograniczeń)
|
double fLength; // długość składu (do wyciągania z ograniczeń)
|
||||||
double fMass; // całkowita masa do liczenia stycznej składowej grawitacji
|
double fMass; // całkowita masa do liczenia stycznej składowej grawitacji
|
||||||
@@ -242,6 +245,7 @@ class TController
|
|||||||
private:
|
private:
|
||||||
double fProximityDist; //odleglosc podawana w SetProximityVelocity(); >0:przeliczać do
|
double fProximityDist; //odleglosc podawana w SetProximityVelocity(); >0:przeliczać do
|
||||||
// punktu, <0:podana wartość
|
// punktu, <0:podana wartość
|
||||||
|
double FirstSemaphorDist; // odległość do pierwszego znalezionego semafora
|
||||||
public:
|
public:
|
||||||
double
|
double
|
||||||
ActualProximityDist; // odległość brana pod uwagę przy wyliczaniu prędkości i przyspieszenia
|
ActualProximityDist; // odległość brana pod uwagę przy wyliczaniu prędkości i przyspieszenia
|
||||||
@@ -320,8 +324,8 @@ class TController
|
|||||||
void JumpToFirstOrder();
|
void JumpToFirstOrder();
|
||||||
void OrderPush(TOrders NewOrder);
|
void OrderPush(TOrders NewOrder);
|
||||||
void OrderNext(TOrders NewOrder);
|
void OrderNext(TOrders NewOrder);
|
||||||
TOrders OrderCurrentGet();
|
inline TOrders OrderCurrentGet();
|
||||||
TOrders OrderNextGet();
|
inline TOrders OrderNextGet();
|
||||||
bool CheckVehicles(TOrders user = Wait_for_orders);
|
bool CheckVehicles(TOrders user = Wait_for_orders);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
9
EU07.bpr
9
EU07.bpr
@@ -107,11 +107,10 @@ Item6=GLEW_STATIC;_DEBUG;USE_VERTEX_ARRAYS
|
|||||||
Item7=_DEBUG
|
Item7=_DEBUG
|
||||||
|
|
||||||
[HistoryLists\hlFinalOutputDir]
|
[HistoryLists\hlFinalOutputDir]
|
||||||
Count=4
|
Count=3
|
||||||
Item0=E:\Gry\MaSzyna_15_04\
|
Item0=E:\Gry\MaSzyna_15_04
|
||||||
Item1=E:\Gry\MaSzyna_15_04
|
Item1=D:\EU07\
|
||||||
Item2=D:\EU07\
|
Item2=E:\EU07\
|
||||||
Item3=E:\EU07\
|
|
||||||
|
|
||||||
[Debugging]
|
[Debugging]
|
||||||
DebugSourceDirs=McZapkie\
|
DebugSourceDirs=McZapkie\
|
||||||
|
|||||||
17
Logs.cpp
17
Logs.cpp
@@ -33,14 +33,15 @@ void WriteConsoleOnly(const char *str, double value)
|
|||||||
// WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),endstring,strlen(endstring),&wr,NULL);
|
// WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),endstring,strlen(endstring),&wr,NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteConsoleOnly(const char *str)
|
void WriteConsoleOnly(const char *str, bool newline)
|
||||||
{
|
{
|
||||||
// printf("%n ffafaf /n",str);
|
// printf("%n ffafaf /n",str);
|
||||||
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
|
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
|
||||||
FOREGROUND_GREEN | FOREGROUND_INTENSITY);
|
FOREGROUND_GREEN | FOREGROUND_INTENSITY);
|
||||||
DWORD wr = 0;
|
DWORD wr = 0;
|
||||||
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), str, strlen(str), &wr, NULL);
|
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), str, strlen(str), &wr, NULL);
|
||||||
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), endstring, strlen(endstring), &wr, NULL);
|
if (newline)
|
||||||
|
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), endstring, strlen(endstring), &wr, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteLog(const char *str, double value)
|
void WriteLog(const char *str, double value)
|
||||||
@@ -55,7 +56,7 @@ void WriteLog(const char *str, double value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
void WriteLog(const char *str)
|
void WriteLog(const char *str, bool newline)
|
||||||
{
|
{
|
||||||
if (str)
|
if (str)
|
||||||
{
|
{
|
||||||
@@ -63,12 +64,14 @@ void WriteLog(const char *str)
|
|||||||
{
|
{
|
||||||
if (!output.is_open())
|
if (!output.is_open())
|
||||||
output.open("log.txt", std::ios::trunc);
|
output.open("log.txt", std::ios::trunc);
|
||||||
output << str << "\n";
|
output << str;
|
||||||
|
if (newline)
|
||||||
|
output << "\n";
|
||||||
output.flush();
|
output.flush();
|
||||||
}
|
}
|
||||||
// hunter-271211: pisanie do konsoli tylko, gdy nie jest ukrywana
|
// hunter-271211: pisanie do konsoli tylko, gdy nie jest ukrywana
|
||||||
if (Global::iWriteLogEnabled & 2)
|
if (Global::iWriteLogEnabled & 2)
|
||||||
WriteConsoleOnly(str);
|
WriteConsoleOnly(str, newline);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
void ErrorLog(const char *str)
|
void ErrorLog(const char *str)
|
||||||
@@ -96,9 +99,9 @@ void ErrorLog(const AnsiString &asMessage)
|
|||||||
WriteLog(asMessage.c_str()); // do "log.txt" ewentualnie te¿
|
WriteLog(asMessage.c_str()); // do "log.txt" ewentualnie te¿
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteLog(const AnsiString &str)
|
void WriteLog(const AnsiString &str, bool newline)
|
||||||
{ // Ra: wersja z AnsiString jest zamienna z Error()
|
{ // Ra: wersja z AnsiString jest zamienna z Error()
|
||||||
WriteLog(str.c_str());
|
WriteLog(str.c_str(), newline);
|
||||||
};
|
};
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
6
Logs.h
6
Logs.h
@@ -12,11 +12,11 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include <system.hpp>
|
#include <system.hpp>
|
||||||
|
|
||||||
void WriteConsoleOnly(const char *str, double value);
|
void WriteConsoleOnly(const char *str, double value);
|
||||||
void WriteConsoleOnly(const char *str);
|
void WriteConsoleOnly(const char *str, bool newline = true);
|
||||||
void WriteLog(const char *str, double value);
|
void WriteLog(const char *str, double value);
|
||||||
void WriteLog(const char *str);
|
void WriteLog(const char *str, bool newline = true);
|
||||||
void Error(const AnsiString &asMessage, bool box = true);
|
void Error(const AnsiString &asMessage, bool box = true);
|
||||||
void ErrorLog(const AnsiString &asMessage);
|
void ErrorLog(const AnsiString &asMessage);
|
||||||
void WriteLog(const AnsiString &str);
|
void WriteLog(const AnsiString &str, bool newline = true);
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
17
Train.cpp
17
Train.cpp
@@ -3958,14 +3958,20 @@ bool TTrain::Update()
|
|||||||
TestFlag(mvOccupied->SecuritySystem.Status, s_SHPalarm))
|
TestFlag(mvOccupied->SecuritySystem.Status, s_SHPalarm))
|
||||||
{
|
{
|
||||||
dsbBuzzer->GetStatus(&stat);
|
dsbBuzzer->GetStatus(&stat);
|
||||||
if (!(stat & DSBSTATUS_PLAYING))
|
if (!(stat & DSBSTATUS_PLAYING))
|
||||||
|
{
|
||||||
dsbBuzzer->Play(0, 0, DSBPLAY_LOOPING);
|
dsbBuzzer->Play(0, 0, DSBPLAY_LOOPING);
|
||||||
|
Console::BitsSet(1 << 14); // ustawienie bitu 16 na PoKeys
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dsbBuzzer->GetStatus(&stat);
|
dsbBuzzer->GetStatus(&stat);
|
||||||
if (stat & DSBSTATUS_PLAYING)
|
if (stat & DSBSTATUS_PLAYING)
|
||||||
|
{
|
||||||
dsbBuzzer->Stop();
|
dsbBuzzer->Stop();
|
||||||
|
Console::BitsClear(1 << 14); // ustawienie bitu 16 na PoKeys
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // wylaczone
|
else // wylaczone
|
||||||
@@ -3973,8 +3979,11 @@ bool TTrain::Update()
|
|||||||
btLampkaCzuwaka.TurnOff();
|
btLampkaCzuwaka.TurnOff();
|
||||||
btLampkaSHP.TurnOff();
|
btLampkaSHP.TurnOff();
|
||||||
dsbBuzzer->GetStatus(&stat);
|
dsbBuzzer->GetStatus(&stat);
|
||||||
if (stat & DSBSTATUS_PLAYING)
|
if (stat & DSBSTATUS_PLAYING)
|
||||||
|
{
|
||||||
dsbBuzzer->Stop();
|
dsbBuzzer->Stop();
|
||||||
|
Console::BitsClear(1 << 14); // ustawienie bitu 16 na PoKeys
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//******************************************
|
//******************************************
|
||||||
@@ -5280,6 +5289,8 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName)
|
|||||||
// ggEngageRatio.Clear();
|
// ggEngageRatio.Clear();
|
||||||
ggMainGearStatus.Clear();
|
ggMainGearStatus.Clear();
|
||||||
ggIgnitionKey.Clear();
|
ggIgnitionKey.Clear();
|
||||||
|
// Jeœli ustawiamy now¹ wartoœæ dla PoKeys wolna jest 15
|
||||||
|
// Numer 14 jest u¿ywany dla buczka SHP w innym miejscu
|
||||||
btLampkaPoslizg.Clear(6);
|
btLampkaPoslizg.Clear(6);
|
||||||
btLampkaStyczn.Clear(5);
|
btLampkaStyczn.Clear(5);
|
||||||
btLampkaNadmPrzetw.Clear(
|
btLampkaNadmPrzetw.Clear(
|
||||||
|
|||||||
Reference in New Issue
Block a user