16
0
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:
firleju
2016-01-27 14:15:49 +01:00
7 changed files with 241 additions and 87 deletions

View File

@@ -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;
} }
}; };

View File

@@ -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];
} }

View File

@@ -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:

View File

@@ -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\

View File

@@ -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
View File

@@ -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

View File

@@ -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(