16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 03:29:19 +02:00

Dodanie kontrolek w Python i MWD z mastera

This commit is contained in:
firleju
2017-01-17 06:13:42 +01:00
13 changed files with 2821 additions and 1805 deletions

View File

@@ -14,47 +14,48 @@ http://mozilla.org/MPL/2.0/.
#include "PoKeys55.h" #include "PoKeys55.h"
#include "LPT.h" #include "LPT.h"
#include "mczapkie/mctools.h" #include "mczapkie/mctools.h"
#include "MWD.h" // maciek001: obsluga portu COM
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Ra: klasa statyczna gromadząca sygnały sterujące oraz informacje zwrotne // Ra: klasa statyczna gromadz<EFBFBD>ca sygna<EFBFBD>y steruj<EFBFBD>ce oraz informacje zwrotne
// Ra: stan wejścia zmieniany klawiaturą albo dedykowanym urządzeniem // Ra: stan wej<EFBFBD>cia zmieniany klawiatur<EFBFBD> albo dedykowanym urz<EFBFBD>dzeniem
// Ra: stan wyjścia zmieniany przez symulację (mierniki, kontrolki) // Ra: stan wyj<EFBFBD>cia zmieniany przez symulacj<EFBFBD> (mierniki, kontrolki)
/******************************* /*******************************
Do klawisza klawiatury przypisana jest maska bitowa oraz numer wejścia. Do klawisza klawiatury przypisana jest maska bitowa oraz numer wej<EFBFBD>cia.
Naciśnięcie klawisza powoduje wywołanie procedury ustawienia bitu o podanej Naci<EFBFBD>ni<EFBFBD>cie klawisza powoduje wywo<EFBFBD>anie procedury ustawienia bitu o podanej
masce na podanym wejściu. Zwonienie klawisza analogicznie wywołuje zerowanie masce na podanym wej<EFBFBD>ciu. Zwonienie klawisza analogicznie wywo<EFBFBD>uje zerowanie
bitu wg maski. Zasadniczo w masce ustawiony jest jeden bit, ale w razie bitu wg maski. Zasadniczo w masce ustawiony jest jeden bit, ale w razie
potrzeby może być ich więcej. potrzeby mo<EFBFBD>e by<EFBFBD> ich wi<EFBFBD>cej.
Oddzielne wejścia są wprowadzone po to, by można było używać więcej niż 32 Oddzielne wej<EFBFBD>cia s<EFBFBD> wprowadzone po to, by mo<EFBFBD>na by<EFBFBD>o u<EFBFBD>ywa<EFBFBD> wi<EFBFBD>cej ni<EFBFBD> 32
bity do sterowania. Podział na wejścia jest również ze względów organizacyjnych, bity do sterowania. Podzia<EFBFBD> na wej<EFBFBD>cia jest r<EFBFBD>wnie<EFBFBD> ze wzgl<EFBFBD>d<EFBFBD>w organizacyjnych,
np. sterowanie światłami może mieć oddzielny numer wejścia niż przełączanie np. sterowanie <EFBFBD>wiat<EFBFBD>ami mo<EFBFBD>e mie<EFBFBD> oddzielny numer wej<EFBFBD>cia ni<EFBFBD> prze<EFBFBD><EFBFBD>czanie
radia, ponieważ nie ma potrzeby ich uzależniać (tzn. badać wspólną maskę bitową). radia, poniewa<EFBFBD> nie ma potrzeby ich uzale<EFBFBD>nia<EFBFBD> (tzn. bada<EFBFBD> wsp<EFBFBD>ln<EFBFBD> mask<EFBFBD> bitow<EFBFBD>).
Do każdego wejścia podpięty jest skrypt binarny, charakterystyczny dla danej Do ka<EFBFBD>dego wej<EFBFBD>cia podpi<EFBFBD>ty jest skrypt binarny, charakterystyczny dla danej
konstrukcji pojazdu. Sprawdza on zależności (w tym uszkodzenia) za pomocą konstrukcji pojazdu. Sprawdza on zale<EFBFBD>no<EFBFBD>ci (w tym uszkodzenia) za pomoc<EFBFBD>
operacji logicznych na maskach bitowych. Do każdego wejścia jest przypisana operacji logicznych na maskach bitowych. Do ka<EFBFBD>dego wej<EFBFBD>cia jest przypisana
jedna, oddzielna maska 32 bit, ale w razie potrzeby istnieje też możliwość jedna, oddzielna maska 32 bit, ale w razie potrzeby istnieje te<EFBFBD> mo<EFBFBD>liwo<EFBFBD><EFBFBD>
korzystania z masek innych wejść. Skrypt może też wysyłać maski na inne wejścia, korzystania z masek innych wej<EFBFBD><EFBFBD>. Skrypt mo<EFBFBD>e te<EFBFBD> wysy<EFBFBD>a<EFBFBD> maski na inne wej<EFBFBD>cia,
ale należy unikać rekurencji. ale nale<EFBFBD>y unika<EFBFBD> rekurencji.
Definiowanie wejść oraz przeznaczenia ich masek jest w gestii konstruktora Definiowanie wej<EFBFBD><EFBFBD> oraz przeznaczenia ich masek jest w gestii konstruktora
skryptu. Każdy pojazd może mieć inny schemat wejść i masek, ale w miarę możliwości skryptu. Ka<EFBFBD>dy pojazd mo<EFBFBD>e mie<EFBFBD> inny schemat wej<EFBFBD><EFBFBD> i masek, ale w miar<EFBFBD> mo<EFBFBD>liwo<EFBFBD>ci
należy dążyć do unifikacji. Skrypty mogą również używać dodatkowych masek bitowych. nale<EFBFBD>y d<EFBFBD><EFBFBD>y<EFBFBD> do unifikacji. Skrypty mog<EFBFBD> r<EFBFBD>wnie<EFBFBD> u<EFBFBD>ywa<EFBFBD> dodatkowych masek bitowych.
Maski bitowe odpowiadają stanom przełączników, czujników, styczników itd. Maski bitowe odpowiadaj<EFBFBD> stanom prze<EFBFBD><EFBFBD>cznik<EFBFBD>w, czujnik<EFBFBD>w, stycznik<EFBFBD>w itd.
Działanie jest następujące: Dzia<EFBFBD>anie jest nast<EFBFBD>puj<EFBFBD>ce:
- na klawiaturze konsoli naciskany jest przycisk - na klawiaturze konsoli naciskany jest przycisk
- naciśnięcie przycisku zamieniane jest na maskę bitową oraz numer wejścia - naci<EFBFBD>ni<EFBFBD>cie przycisku zamieniane jest na mask<EFBFBD> bitow<EFBFBD> oraz numer wej<EFBFBD>cia
- wywoływany jest skrypt danego wejścia z ową maską - wywo<EFBFBD>ywany jest skrypt danego wej<EFBFBD>cia z ow<EFBFBD> mask<EFBFBD>
- skrypt sprawdza zależności i np. modyfikuje własności fizyki albo inne maski - skrypt sprawdza zale<EFBFBD>no<EFBFBD>ci i np. modyfikuje w<EFBFBD>asno<EFBFBD>ci fizyki albo inne maski
- ewentualnie do wyzwalacza czasowego dodana jest maska i numer wejścia - ewentualnie do wyzwalacza czasowego dodana jest maska i numer wej<EFBFBD>cia
/*******************************/ /*******************************/
/* //kod do przetrawienia: /* //kod do przetrawienia:
//aby się nie włączacz wygaszacz ekranu, co jakiś czas naciska się wirtualnie ScrollLock //aby si<EFBFBD> nie w<EFBFBD><EFBFBD>czacz wygaszacz ekranu, co jaki<EFBFBD> czas naciska si<EFBFBD> wirtualnie ScrollLock
[DllImport("user32.dll")] [DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
@@ -107,19 +108,20 @@ void SetLedState(char Code, bool bOn)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
int Console::iBits = 0; // zmienna statyczna - obiekt Console jest jednen wspólny int Console::iBits = 0; // zmienna statyczna - obiekt Console jest jednen wsp<EFBFBD>lny
int Console::iMode = 0; int Console::iMode = 0;
int Console::iConfig = 0; int Console::iConfig = 0;
TPoKeys55 *Console::PoKeys55[2] = {NULL, NULL}; TPoKeys55 *Console::PoKeys55[2] = {NULL, NULL};
TLPT *Console::LPT = NULL; TLPT *Console::LPT = NULL;
int Console::iSwitch[8]; // bistabilne w kabinie, załączane z [Shift], wyłączane bez MWDComm * Console::MWD = NULL; // maciek001: obiekt dla MWD
int Console::iButton[8]; // monostabilne w kabinie, załączane podczas trzymania klawisza int Console::iSwitch[8]; // bistabilne w kabinie, za<EFBFBD><EFBFBD>czane z [Shift], wy<77><79>czane bez
int Console::iButton[8]; // monostabilne w kabinie, za<7A><61>czane podczas trzymania klawisza
Console::Console() Console::Console()
{ {
PoKeys55[0] = PoKeys55[1] = NULL; PoKeys55[0] = PoKeys55[1] = NULL;
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
{ // zerowanie przełączników { // zerowanie prze<EFBFBD><EFBFBD>cznik<EFBFBD>w
iSwitch[i] = 0; // bity 0..127 - bez [Ctrl], 128..255 - z [Ctrl] iSwitch[i] = 0; // bity 0..127 - bez [Ctrl], 128..255 - z [Ctrl]
iButton[i] = 0; // bity 0..127 - bez [Shift], 128..255 - z [Shift] iButton[i] = 0; // bity 0..127 - bez [Shift], 128..255 - z [Shift]
} }
@@ -129,6 +131,7 @@ Console::~Console()
{ {
delete PoKeys55[0]; delete PoKeys55[0];
delete PoKeys55[1]; delete PoKeys55[1];
delete MWD;
}; };
void Console::ModeSet(int m, int h) void Console::ModeSet(int m, int h)
@@ -138,24 +141,24 @@ void Console::ModeSet(int m, int h)
}; };
int Console::On() int Console::On()
{ // załączenie konsoli (np. nawiązanie komunikacji) { // za<EFBFBD><EFBFBD>czenie konsoli (np. nawi<EFBFBD>zanie komunikacji)
iSwitch[0] = iSwitch[1] = iSwitch[2] = iSwitch[3] = 0; // bity 0..127 - bez [Ctrl] iSwitch[0] = iSwitch[1] = iSwitch[2] = iSwitch[3] = 0; // bity 0..127 - bez [Ctrl]
iSwitch[4] = iSwitch[5] = iSwitch[6] = iSwitch[7] = 0; // bity 128..255 - z [Ctrl] iSwitch[4] = iSwitch[5] = iSwitch[6] = iSwitch[7] = 0; // bity 128..255 - z [Ctrl]
switch (iMode) switch (iMode)
{ {
case 1: // kontrolki klawiatury case 1: // kontrolki klawiatury
case 2: // kontrolki klawiatury case 2: // kontrolki klawiatury
iConfig = 0; // licznik użycia Scroll Lock iConfig = 0; // licznik u<EFBFBD>ycia Scroll Lock
break; break;
case 3: // LPT case 3: // LPT
LPT = new TLPT(); // otwarcie inpout32.dll LPT = new TLPT(); // otwarcie inpout32.dll
if (LPT ? LPT->Connect(iConfig) : false) if (LPT ? LPT->Connect(iConfig) : false)
{ // wysłać 0? { // wys<EFBFBD>a<EFBFBD> 0?
BitsUpdate(-1); // aktualizacjia stanów, bo przy wczytywaniu mogło być nieaktywne BitsUpdate(-1); // aktualizacjia stan<EFBFBD>w, bo przy wczytywaniu mog<EFBFBD>o by<EFBFBD> nieaktywne
WriteLog("Feedback Mode 3: InpOut32.dll OK"); WriteLog("Feedback Mode 3: InpOut32.dll OK");
} }
else else
{ // połączenie nie wyszło, ma być NULL { // po<EFBFBD><EFBFBD>czenie nie wysz<EFBFBD>o, ma by<EFBFBD> NULL
delete LPT; delete LPT;
LPT = NULL; LPT = NULL;
} }
@@ -165,25 +168,34 @@ int Console::On()
if (PoKeys55[0] ? PoKeys55[0]->Connect() : false) if (PoKeys55[0] ? PoKeys55[0]->Connect() : false)
{ {
WriteLog("Found " + PoKeys55[0]->Version()); WriteLog("Found " + PoKeys55[0]->Version());
BitsUpdate(-1); // aktualizacjia stanów, bo przy wczytywaniu mogło być nieaktywne BitsUpdate(-1); // aktualizacjia stan<EFBFBD>w, bo przy wczytywaniu mog<EFBFBD>o by<EFBFBD> nieaktywne
} }
else else
{ // połączenie nie wyszło, ma być NULL { // po<EFBFBD><EFBFBD>czenie nie wysz<EFBFBD>o, ma by<EFBFBD> NULL
delete PoKeys55[0]; delete PoKeys55[0];
PoKeys55[0] = NULL; PoKeys55[0] = NULL;
} }
break; break;
case 5: // maciek001: MWD OK
MWD = new MWDComm();
if(!(MWD->Open())){
delete MWD;
iMode = 0;
Global::iFeedbackMode = 0;
WriteLog("COM Port not open!");
}
break;
} }
return 0; return 0;
}; };
void Console::Off() void Console::Off()
{ // wyłączenie informacji zwrotnych (reset pulpitu) { // wy<EFBFBD><EFBFBD>czenie informacji zwrotnych (reset pulpitu)
BitsClear(-1); BitsClear(-1);
if ((iMode == 1) || (iMode == 2)) if ((iMode == 1) || (iMode == 2))
if (iConfig & 1) // licznik użycia Scroll Lock if (iConfig & 1) // licznik u<EFBFBD>ycia Scroll Lock
{ // bez sensu to jest, ale mi się samo włącza { // bez sensu to jest, ale mi si<EFBFBD> samo w<EFBFBD><EFBFBD>cza
SetLedState(VK_SCROLL, true); // przyciśnięty SetLedState(VK_SCROLL, true); // przyci<EFBFBD>ni<EFBFBD>ty
SetLedState(VK_SCROLL, false); // zwolniony SetLedState(VK_SCROLL, false); // zwolniony
} }
delete PoKeys55[0]; delete PoKeys55[0];
@@ -192,103 +204,154 @@ void Console::Off()
PoKeys55[1] = NULL; PoKeys55[1] = NULL;
delete LPT; delete LPT;
LPT = NULL; LPT = NULL;
if(iMode == 5 || MWD->GetMWDState()){
delete MWD; // maciek001: zamykanie portu COM i takie tam inne ;)
MWD = NULL;
}
}; };
void Console::BitsSet(int mask, int entry) void Console::BitsSet(int mask, int entry)
{ // ustawienie bitów o podanej masce (mask) na wejściu (entry) { // ustawienie bit<EFBFBD>w o podanej masce (mask) na wej<EFBFBD>ciu (entry)
if ((iBits & mask) != mask) // jeżeli zmiana if ((iBits & mask) != mask) // je<EFBFBD>eli zmiana
{ {
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<EFBFBD>w zmienionych
if (iMode == 4) if (iMode == 4)
WriteLog("PoKeys::BitsSet: mask: " + std::to_string(mask) + " iBits: " + std::to_string(iBits)); WriteLog("PoKeys::BitsSet: mask: " + std::to_string(mask) + " iBits: " + std::to_string(iBits));
} }
}; };
void Console::BitsClear(int mask, int entry) void Console::BitsClear(int mask, int entry)
{ // zerowanie bitów o podanej masce (mask) na wejściu (entry) { // zerowanie bit<EFBFBD>w o podanej masce (mask) na wej<EFBFBD>ciu (entry)
if (iBits & mask) // jeżeli zmiana if (iBits & mask) // je<EFBFBD>eli zmiana
{ {
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<EFBFBD>w zmienionych
} }
}; };
void Console::BitsUpdate(int mask) void Console::BitsUpdate(int mask)
{ // aktualizacja stanu interfejsu informacji zwrotnej; (mask) - zakres zmienianych bitów { // aktualizacja stanu interfejsu informacji zwrotnej; (mask) - zakres zmienianych bit<EFBFBD>w
switch (iMode) switch (iMode)
{ {
case 1: // sterowanie światełkami klawiatury: CA/SHP+opory case 1: // sterowanie <EFBFBD>wiate<EFBFBD>kami klawiatury: CA/SHP+opory
if (mask & 3) // gdy SHP albo CA if (mask & 3) // gdy SHP albo CA
SetLedState(VK_CAPITAL, iBits & 3); SetLedState(VK_CAPITAL, iBits & 3);
if (mask & 4) // gdy jazda na oporach if (mask & 4) // gdy jazda na oporach
{ // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny { // Scroll Lock ma jako<EFBFBD> dziwnie... zmiana stanu na przeciwny
SetLedState(VK_SCROLL, true); // przyciśnięty SetLedState(VK_SCROLL, true); // przyci<EFBFBD>ni<EFBFBD>ty
SetLedState(VK_SCROLL, false); // zwolniony SetLedState(VK_SCROLL, false); // zwolniony
++iConfig; // licznik użycia Scroll Lock ++iConfig; // licznik u<EFBFBD>ycia Scroll Lock
} }
break; break;
case 2: // sterowanie światełkami klawiatury: CA+SHP case 2: // sterowanie <EFBFBD>wiate<EFBFBD>kami klawiatury: CA+SHP
if (mask & 2) // gdy CA if (mask & 2) // gdy CA
SetLedState(VK_CAPITAL, iBits & 2); SetLedState(VK_CAPITAL, iBits & 2);
if (mask & 1) // gdy SHP if (mask & 1) // gdy SHP
{ // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny { // Scroll Lock ma jako<EFBFBD> dziwnie... zmiana stanu na przeciwny
SetLedState(VK_SCROLL, true); // przyciśnięty SetLedState(VK_SCROLL, true); // przyci<EFBFBD>ni<EFBFBD>ty
SetLedState(VK_SCROLL, false); // zwolniony SetLedState(VK_SCROLL, false); // zwolniony
++iConfig; // licznik użycia Scroll Lock ++iConfig; // licznik u<EFBFBD>ycia Scroll Lock
} }
break; break;
case 3: // LPT Marcela z modyfikacją (jazda na oporach zamiast brzęczyka) case 3: // LPT Marcela z modyfikacj<EFBFBD> (jazda na oporach zamiast brz<EFBFBD>czyka)
if (LPT) if (LPT)
LPT->Out(iBits); LPT->Out(iBits);
break; break;
case 4: // PoKeys55 wg Marcela - wersja druga z końca 2012 case 4: // PoKeys55 wg Marcela - wersja druga z ko<EFBFBD>ca 2012
if (PoKeys55[0]) if (PoKeys55[0])
{ // pewnie trzeba będzie to dodatkowo buforować i oczekiwać na potwierdzenie { // pewnie trzeba b<EFBFBD>dzie to dodatkowo buforowa<EFBFBD> i oczekiwa<EFBFBD> na potwierdzenie
if (mask & 0x0001) // b0 gdy SHP if (mask & 0x0001) // b0 gdy SHP
PoKeys55[0]->Write(0x40, 23 - 1, (iBits & 0x0001) ? 1 : 0); PoKeys55[0]->Write(0x40, 23 - 1, (iBits & 0x0001) ? 1 : 0);
if (mask & 0x0002) // b1 gdy zmieniony CA if (mask & 0x0002) // b1 gdy zmieniony CA
PoKeys55[0]->Write(0x40, 24 - 1, (iBits & 0x0002) ? 1 : 0); PoKeys55[0]->Write(0x40, 24 - 1, (iBits & 0x0002) ? 1 : 0);
if (mask & 0x0004) // b2 gdy jazda na oporach if (mask & 0x0004) // b2 gdy jazda na oporach
PoKeys55[0]->Write(0x40, 32 - 1, (iBits & 0x0004) ? 1 : 0); PoKeys55[0]->Write(0x40, 32 - 1, (iBits & 0x0004) ? 1 : 0);
if (mask & 0x0008) // b3 Lampka WS (wyłącznika szybkiego) if (mask & 0x0008) // b3 Lampka WS (wy<EFBFBD><EFBFBD>cznika szybkiego)
PoKeys55[0]->Write(0x40, 25 - 1, (iBits & 0x0008) ? 1 : 0); PoKeys55[0]->Write(0x40, 25 - 1, (iBits & 0x0008) ? 1 : 0);
if (mask & 0x0010) // b4 Lampka przekaźnika nadmiarowego silników trakcyjnych if (mask & 0x0010) // b4 Lampka przeka<EFBFBD>nika nadmiarowego silnik<EFBFBD>w trakcyjnych
PoKeys55[0]->Write(0x40, 27 - 1, (iBits & 0x0010) ? 1 : 0); PoKeys55[0]->Write(0x40, 27 - 1, (iBits & 0x0010) ? 1 : 0);
if (mask & 0x0020) // b5 Lampka styczników liniowych if (mask & 0x0020) // b5 Lampka stycznik<EFBFBD>w liniowych
PoKeys55[0]->Write(0x40, 29 - 1, (iBits & 0x0020) ? 1 : 0); PoKeys55[0]->Write(0x40, 29 - 1, (iBits & 0x0020) ? 1 : 0);
if (mask & 0x0040) // b6 Lampka poślizgu if (mask & 0x0040) // b6 Lampka po<EFBFBD>lizgu
PoKeys55[0]->Write(0x40, 30 - 1, (iBits & 0x0040) ? 1 : 0); PoKeys55[0]->Write(0x40, 30 - 1, (iBits & 0x0040) ? 1 : 0);
if (mask & 0x0080) // b7 Lampka "przetwornicy" if (mask & 0x0080) // b7 Lampka "przetwornicy"
PoKeys55[0]->Write(0x40, 28 - 1, (iBits & 0x0080) ? 1 : 0); PoKeys55[0]->Write(0x40, 28 - 1, (iBits & 0x0080) ? 1 : 0);
if (mask & 0x0100) // b8 Kontrolka przekaźnika nadmiarowego sprężarki if (mask & 0x0100) // b8 Kontrolka przeka<EFBFBD>nika nadmiarowego spr<EFBFBD><EFBFBD>arki
PoKeys55[0]->Write(0x40, 33 - 1, (iBits & 0x0100) ? 1 : 0); PoKeys55[0]->Write(0x40, 33 - 1, (iBits & 0x0100) ? 1 : 0);
if (mask & 0x0200) // b9 Kontrolka sygnalizacji wentylatorów i oporów if (mask & 0x0200) // b9 Kontrolka sygnalizacji wentylator<EFBFBD>w i opor<EFBFBD>w
PoKeys55[0]->Write(0x40, 26 - 1, (iBits & 0x0200) ? 1 : 0); PoKeys55[0]->Write(0x40, 26 - 1, (iBits & 0x0200) ? 1 : 0);
if (mask & 0x0400) // b10 Kontrolka wysokiego rozruchu if (mask & 0x0400) // b10 Kontrolka wysokiego rozruchu
PoKeys55[0]->Write(0x40, 31 - 1, (iBits & 0x0400) ? 1 : 0); PoKeys55[0]->Write(0x40, 31 - 1, (iBits & 0x0400) ? 1 : 0);
if (mask & 0x0800) // b11 Kontrolka ogrzewania pociągu if (mask & 0x0800) // b11 Kontrolka ogrzewania poci<EFBFBD>gu
PoKeys55[0]->Write(0x40, 34 - 1, (iBits & 0x0800) ? 1 : 0); PoKeys55[0]->Write(0x40, 34 - 1, (iBits & 0x0800) ? 1 : 0);
if (mask & 0x1000) // b12 Ciśnienie w cylindrach do odbijania w haslerze if (mask & 0x1000) // b12 Ci<EFBFBD>nienie w cylindrach do odbijania w haslerze
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<EFBFBD>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 if (mask & 0x4000) // b14 Brz<EFBFBD>czyk SHP lub CA
PoKeys55[0]->Write(0x40, 16 - 1, (iBits & 0x4000) ? 1 : 0); PoKeys55[0]->Write(0x40, 16 - 1, (iBits & 0x4000) ? 1 : 0);
} }
break; break;
case 5: // maciek001: MWD lampki i kontrolki
/* out3: ogrzewanie sk?adu, opory rozruchowe, poslizg, zaluzjewent, -, -, czuwak, shp
out4: stycz.liniowe, pezekaznikr??nicobwpomoc, nadmiarprzetw, roznicowy obw. g?, nadmiarsilniki, wylszybki, zanikpr?duprzyje?dzienaoporach, nadmiarsprezarki
out5: HASLER */
if(mask & 0x0001) if(iBits & 1){
MWD->WriteDataBuff[4] |= 1<<7; // SHP HASLER te<74>
if(!MWD->bSHPstate){
MWD->bSHPstate = true;
MWD->bPrzejazdSHP = true;
}else MWD->bPrzejazdSHP = false;
}
else{
MWD->WriteDataBuff[4] &= ~(1<<7);
MWD->bPrzejazdSHP = false;
MWD->bSHPstate = false;
}
if(mask & 0x0002) if(iBits & 2) MWD->WriteDataBuff[4] |= 1<<6; // CA
else MWD->WriteDataBuff[4] &= ~(1<<6);
if(mask & 0x0004) if(iBits & 4) MWD->WriteDataBuff[4] |= 1<<1; // jazda na oporach rozruchowych
else MWD->WriteDataBuff[4] &= ~(1<<1);
if(mask & 0x0008) if(iBits & 8) MWD->WriteDataBuff[5] |= 1<<5; // wy??cznik szybki
else MWD->WriteDataBuff[5] &= ~(1<<5);
if(mask & 0x0010) if(iBits & 0x10) MWD->WriteDataBuff[5] |= 1<<4; // nadmiarowy silnik?w trakcyjnych
else MWD->WriteDataBuff[5] &= ~(1<<4);
if(mask & 0x0020) if(iBits & 0x20) MWD->WriteDataBuff[4] |= 1<<0; // styczniki liniowe
else MWD->WriteDataBuff[5] &= ~(1<<0);
if(mask & 0x0040) if(iBits & 0x40) MWD->WriteDataBuff[4] |= 1<<2; // po?lizg
else MWD->WriteDataBuff[4] &= ~(1<<2);
if(mask & 0x0080) if(iBits & 0x80) MWD->WriteDataBuff[5] |= 1<<2; // (nadmiarowy) przetwornicy? ++
else MWD->WriteDataBuff[5] &= ~(1<<2);
if(mask & 0x0100) if(iBits & 0x100) MWD->WriteDataBuff[5] |= 1<<7; // nadmiarowy spr??arki
else MWD->WriteDataBuff[5] &= ~(1<<7);
if(mask & 0x0200) if(iBits & 0x200) MWD->WriteDataBuff[2] |= 1<<1; // wentylatory i opory
else MWD->WriteDataBuff[2] &= ~(1<<1);
if(mask & 0x0400) if(iBits & 0x400) MWD->WriteDataBuff[2] |= 1<<2; // wysoki rozruch
else MWD->WriteDataBuff[2] &= ~(1<<2);
if(mask & 0x0800) if(iBits & 0x800) MWD->WriteDataBuff[4] |= 1<<0; // ogrzewanie poci?gu
else MWD->WriteDataBuff[4] &= ~(1<<0);
if(mask & 0x1000) if(iBits & 0x1000) MWD->bHamowanie = true; // hasler: ci?nienie w hamulcach HASLER rysik 2
else MWD->bHamowanie = false;
if(mask & 0x2000) if(iBits & 0x2000) MWD->WriteDataBuff[6] |= 1<<4; // hasler: pr?d "na" silnikach HASLER rysik 3
else MWD->WriteDataBuff[6] &= ~(1<<4);
if(mask & 0x4000) if(iBits & 0x4000) MWD->WriteDataBuff[6] |= 1<<7; // brz?czyk SHP/CA
else MWD->WriteDataBuff[6] &= ~(1<<7);
//if(mask & 0x8000) if(iBits & 0x8000) MWD->WriteDataBuff[1] |= 1<<7; (puste)
//else MWD->WriteDataBuff[0] &= ~(1<<7);
break;
} }
}; };
bool Console::Pressed(int x) bool Console::Pressed(int x)
{ // na razie tak - czyta się tylko klawiatura { // na razie tak - czyta si<EFBFBD> tylko klawiatura
return Global::bActive && (GetKeyState(x) < 0); return Global::bActive && (GetKeyState(x) < 0);
}; };
void Console::ValueSet(int x, double y) void Console::ValueSet(int x, double y)
{ // ustawienie wartości (y) na kanale analogowym (x) { // ustawienie warto<EFBFBD>ci (y) na kanale analogowym (x)
if (iMode == 4) if (iMode == 4)
if (PoKeys55[0]) if (PoKeys55[0])
{ {
@@ -300,7 +363,7 @@ void Console::ValueSet(int x, double y)
y = Global::CutValueToRange(0, y, Global::fCalibrateOutMax[x]); y = Global::CutValueToRange(0, y, Global::fCalibrateOutMax[x]);
if (Global::iCalibrateOutDebugInfo == x) if (Global::iCalibrateOutDebugInfo == x)
WriteLog(" cutted=" + std::to_string(y),false); WriteLog(" cutted=" + std::to_string(y),false);
y = y / Global::fCalibrateOutMax[x]; // sprowadzenie do <0,1> jeśli podana maksymalna wartość y = y / Global::fCalibrateOutMax[x]; // sprowadzenie do <0,1> je<EFBFBD>li podana maksymalna warto<EFBFBD><EFBFBD>
if (Global::iCalibrateOutDebugInfo == x) if (Global::iCalibrateOutDebugInfo == x)
WriteLog(" fraction=" + std::to_string(y),false); WriteLog(" fraction=" + std::to_string(y),false);
} }
@@ -312,27 +375,64 @@ void Console::ValueSet(int x, double y)
WriteLog(" calibrated=" + std::to_string(temp)); WriteLog(" calibrated=" + std::to_string(temp));
PoKeys55[0]->PWM(x, temp); PoKeys55[0]->PWM(x, temp);
} }
if(iMode == 5 && MWD) //pwm-y i pr<70>dko<6B><6F>
{
unsigned int iliczba ;
if(x==0){
iliczba = (unsigned int) floor((y / (Global::fMWDzg[0] * 10) * Global::fMWDzg[1]) + 0.5); // zbiornik g??wny
MWD->WriteDataBuff[12] = (unsigned char)(iliczba>>8);
MWD->WriteDataBuff[11] = (unsigned char)iliczba;
}else if(x==1){
iliczba = (unsigned int) floor((y / (Global::fMWDpg[0] * 10) * Global::fMWDpg[1]) + 0.5); // przew?d g??wny
MWD->WriteDataBuff[10] = (unsigned char)(iliczba>>8);
MWD->WriteDataBuff[9] = (unsigned char)iliczba;
}else if(x==2){
iliczba = (unsigned int) floor((y / (Global::fMWDph[0] * 10) * Global::fMWDph[1]) + 0.5); // cylinder hamulcowy
MWD->WriteDataBuff[8] = (unsigned char)(iliczba>>8);
MWD->WriteDataBuff[7] = (unsigned char)iliczba;
}else if(x==3){
iliczba = (unsigned int) floor((y / Global::fMWDvolt[0] * Global::fMWDvolt[1]) + 0.5); // woltomierz WN
MWD->WriteDataBuff[14] = (unsigned char)(iliczba>>8);
MWD->WriteDataBuff[13] = (unsigned char)iliczba;
}else if(x==4){
iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 1
MWD->WriteDataBuff[16] = (unsigned char)(iliczba>>8);
MWD->WriteDataBuff[15] = (unsigned char)iliczba;
}else if(x==5){
iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 2
MWD->WriteDataBuff[18] = (unsigned char)(iliczba>>8);
MWD->WriteDataBuff[17] = (unsigned char)iliczba;
}else if(x==6){
iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 3
MWD->WriteDataBuff[20] = (unsigned int)(iliczba>>8);
MWD->WriteDataBuff[19] = (unsigned char)iliczba;
}else if(x==7) MWD->WriteDataBuff[0] = (unsigned char)floor(y); // pr<70>dko<6B><6F>
}
}; };
void Console::Update() void Console::Update()
{ // funkcja powinna być wywoływana regularnie, np. raz w każdej ramce ekranowej { // funkcja powinna by<EFBFBD> wywo<EFBFBD>ywana regularnie, np. raz w ka<EFBFBD>dej ramce ekranowej
if (iMode == 4) if (iMode == 4)
if (PoKeys55[0]) if (PoKeys55[0])
if (PoKeys55[0]->Update((Global::iPause & 8) > 0)) if (PoKeys55[0]->Update((Global::iPause & 8) > 0))
{ // wykrycie przestawionych przełączników? { // wykrycie przestawionych prze<EFBFBD><EFBFBD>cznik<EFBFBD>w?
Global::iPause &= ~8; Global::iPause &= ~8;
} }
else else
{ // błąd komunikacji - zapauzować symulację? { // b<EFBFBD><EFBFBD>d komunikacji - zapauzowa<EFBFBD> symulacj<EFBFBD>?
if (!(Global::iPause & 8)) // jeśli jeszcze nie oflagowana if (!(Global::iPause & 8)) // je<EFBFBD>li jeszcze nie oflagowana
Global::iTextMode = VK_F1; // pokazanie czasu/pauzy Global::iTextMode = VK_F1; // pokazanie czasu/pauzy
Global::iPause |= 8; // tak??? Global::iPause |= 8; // tak???
PoKeys55[0]->Connect(); // próba ponownego podłączenia PoKeys55[0]->Connect(); // pr<EFBFBD>ba ponownego pod<EFBFBD><EFBFBD>czenia
} }
if (iMode == 5)// Obs?uga MWD OK
{
MWD->Run();
}
}; };
float Console::AnalogGet(int x) float Console::AnalogGet(int x)
{ // pobranie wartości analogowej { // pobranie warto<EFBFBD>ci analogowej
if (iMode == 4) if (iMode == 4)
if (PoKeys55[0]) if (PoKeys55[0])
return PoKeys55[0]->fAnalog[x]; return PoKeys55[0]->fAnalog[x];
@@ -340,19 +440,33 @@ float Console::AnalogGet(int x)
}; };
float Console::AnalogCalibrateGet(int x) float Console::AnalogCalibrateGet(int x)
{ // pobranie i kalibracja wartości analogowej, jeśli nie ma PoKeys zwraca NULL { // pobranie i kalibracja warto<EFBFBD>ci analogowej, je<EFBFBD>li nie ma PoKeys zwraca NULL
if (iMode == 4 && PoKeys55[0]) if (iMode == 4 && PoKeys55[0])
{ {
float b = PoKeys55[0]->fAnalog[x]; float b = PoKeys55[0]->fAnalog[x];
return (((((Global::fCalibrateIn[x][5] * b) + Global::fCalibrateIn[x][4]) * b + return (((((Global::fCalibrateIn[x][5] * b) + Global::fCalibrateIn[x][4]) * b +
Global::fCalibrateIn[x][3]) * b + Global::fCalibrateIn[x][2]) * b + Global::fCalibrateIn[x][3]) * b + Global::fCalibrateIn[x][2]) * b +
Global::fCalibrateIn[x][1]) *b + Global::fCalibrateIn[x][0]; Global::fCalibrateIn[x][1]) *b + Global::fCalibrateIn[x][0];
} }
return -1.0; //odcięcie if(iMode == 5 && MWD) // maciek001: obs?uga hamulc?w (wej?? analogowych) OK
{
float b = MWD->fAnalog[x];
//b = b*(Global::fMWDAnalogCalib[x][0]-Global::fMWDAnalogCalib[x][1])/Global::fMWDAnalogCalib[x][3]+Global::fMWDAnalogCalib[x][1]/Global::fMWDAnalogCalib[x][3];
b = (b-Global::fMWDAnalogCalib[x][1])/(Global::fMWDAnalogCalib[x][1]-Global::fMWDAnalogCalib[x][0]);
switch(x)
{
case 0: return (b*8-2);
break;
case 1: return (b*10);
break;
default: return 0;
}
}
return -1.0; //odci<63>cie
}; };
unsigned char Console::DigitalGet(int x) unsigned char Console::DigitalGet(int x)
{ // pobranie wartości cyfrowej { // pobranie warto<EFBFBD>ci cyfrowej
if (iMode == 4) if (iMode == 4)
if (PoKeys55[0]) if (PoKeys55[0])
return PoKeys55[0]->iInputs[x]; return PoKeys55[0]->iInputs[x];
@@ -360,35 +474,35 @@ unsigned char Console::DigitalGet(int x)
}; };
void Console::OnKeyDown(int k) void Console::OnKeyDown(int k)
{ // naciśnięcie klawisza z powoduje wyłączenie, a { // naci<EFBFBD>ni<EFBFBD>cie klawisza z powoduje wy<EFBFBD><EFBFBD>czenie, a
if (k & 0x10000) // jeśli [Shift] if (k & 0x10000) // je<EFBFBD>li [Shift]
{ // ustawienie bitu w tabeli przełączników bistabilnych { // ustawienie bitu w tabeli prze<EFBFBD><EFBFBD>cznik<EFBFBD>w bistabilnych
if (k & 0x20000) // jeśli [Ctrl], to zestaw dodatkowy if (k & 0x20000) // je<EFBFBD>li [Ctrl], to zestaw dodatkowy
iSwitch[4 + (char(k) >> 5)] |= 1 << (k & 31); // załącz bistabliny dodatkowy iSwitch[4 + (char(k) >> 5)] |= 1 << (k & 31); // za<EFBFBD><EFBFBD>cz bistabliny dodatkowy
else else
{ // z [Shift] włączenie bitu bistabilnego i dodatkowego monostabilnego { // z [Shift] w<EFBFBD><EFBFBD>czenie bitu bistabilnego i dodatkowego monostabilnego
iSwitch[char(k) >> 5] |= 1 << (k & 31); // załącz bistabliny podstawowy iSwitch[char(k) >> 5] |= 1 << (k & 31); // za<EFBFBD><EFBFBD>cz bistabliny podstawowy
iButton[4 + (char(k) >> 5)] |= (1 << (k & 31)); // załącz monostabilny dodatkowy iButton[4 + (char(k) >> 5)] |= (1 << (k & 31)); // za<EFBFBD><EFBFBD>cz monostabilny dodatkowy
} }
} }
else else
{ // zerowanie bitu w tabeli przełączników bistabilnych { // zerowanie bitu w tabeli prze<EFBFBD><EFBFBD>cznik<EFBFBD>w bistabilnych
if (k & 0x20000) // jeśli [Ctrl], to zestaw dodatkowy if (k & 0x20000) // je<EFBFBD>li [Ctrl], to zestaw dodatkowy
iSwitch[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wyłącz bistabilny dodatkowy iSwitch[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz bistabilny dodatkowy
else else
{ {
iSwitch[char(k) >> 5] &= ~(1 << (k & 31)); // wyłącz bistabilny podstawowy iSwitch[char(k) >> 5] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz bistabilny podstawowy
iButton[char(k) >> 5] |= 1 << (k & 31); // załącz monostabilny podstawowy iButton[char(k) >> 5] |= 1 << (k & 31); // za<EFBFBD><EFBFBD>cz monostabilny podstawowy
} }
} }
}; };
void Console::OnKeyUp(int k) void Console::OnKeyUp(int k)
{ // puszczenie klawisza w zasadzie nie ma znaczenia dla iSwitch, ale zeruje iButton { // puszczenie klawisza w zasadzie nie ma znaczenia dla iSwitch, ale zeruje iButton
if ((k & 0x20000) == 0) // monostabilne tylko bez [Ctrl] if ((k & 0x20000) == 0) // monostabilne tylko bez [Ctrl]
if (k & 0x10000) // jeśli [Shift] if (k & 0x10000) // je<EFBFBD>li [Shift]
iButton[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wyłącz monostabilny dodatkowy iButton[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz monostabilny dodatkowy
else else
iButton[char(k) >> 5] &= ~(1 << (k & 31)); // wyłącz monostabilny podstawowy iButton[char(k) >> 5] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz monostabilny podstawowy
}; };
int Console::KeyDownConvert(int k) int Console::KeyDownConvert(int k)
{ {

View File

@@ -13,6 +13,7 @@ http://mozilla.org/MPL/2.0/.
class TConsoleDevice; // urz¹dzenie pod³¹czalne za pomoc¹ DLL class TConsoleDevice; // urz¹dzenie pod³¹czalne za pomoc¹ DLL
class TPoKeys55; class TPoKeys55;
class TLPT; class TLPT;
class MWDComm; // maciek001: dodana obsluga portu COM
// klasy konwersji znaków wprowadzanych z klawiatury // klasy konwersji znaków wprowadzanych z klawiatury
class TKeyTrans class TKeyTrans
@@ -31,6 +32,7 @@ class Console
static int iBits; // podstawowy zestaw lampek static int iBits; // podstawowy zestaw lampek
static TPoKeys55 *PoKeys55[2]; // mo¿e ich byæ kilka static TPoKeys55 *PoKeys55[2]; // mo¿e ich byæ kilka
static TLPT *LPT; static TLPT *LPT;
static MWDComm *MWD; // maciek001: na potrzeby MWD
static void BitsUpdate(int mask); static void BitsUpdate(int mask);
// zmienne dla trybu "jednokabinowego", potrzebne do wspó³pracy z pulpitem (PoKeys) // zmienne dla trybu "jednokabinowego", potrzebne do wspó³pracy z pulpitem (PoKeys)
// u¿ywaj¹c klawiatury, ka¿dy pojazd powinien mieæ w³asny stan prze³¹czników // u¿ywaj¹c klawiatury, ka¿dy pojazd powinien mieæ w³asny stan prze³¹czników

687
Console/MWD.cpp Normal file
View File

@@ -0,0 +1,687 @@
/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/
/*
Program obsługi portu COM i innych na potrzeby sterownika MWDevice
(oraz innych wykorzystujących komunikację przez port COM)
dla Symulatora Pojazdów Szynowych MaSzyna
author: Maciej Witek 2016
Autor nie ponosi odpowiedzialności za niewłaciwe używanie lub działanie programu!
*/
#include "MWD.h"
#include "Logs.h"
#include "Globals.h"
#include "World.h"
#include <windows.h>
#define BYTETOWRITE 31 /* ilość bajtów przesyłanych z MaSzyny*/
#define BYTETOREAD 16 /* ilość bajtów przesyłanych do MaSzyny*/
HANDLE hComm;
MWDComm::MWDComm() // konstruktor
{
MWDTime = 0;
bSHPstate = false;
bPrzejazdSHP = false;
bKabina1 = true; // pasuje wyciągnąć dane na temat kabiny i ustawiać te dwa parametry!
bKabina2 = false;
bHamowanie = false;
bCzuwak = false;
bRysik1H = false;
bRysik1L = false;
bRysik2H = false;
bRysik2L = false;
bocznik = 0;
nastawnik = 0;
kierunek = 0;
bnkMask = 0;
int i=0;
while(i<BYTETOWRITE)
{
if(i<BYTETOREAD)ReadDataBuff[i] = 0;
WriteDataBuff[i] = 0;
i++;
}
i=0;
while(i<6)
{
lastStateData[i] = 0;
maskSwitch[i] = 0;
bitSwitch[i] = 0;
i++;
}
}
MWDComm::~MWDComm() // destruktor
{
Close();
}
bool MWDComm::Open() // otwieranie portu COM
{
LPCSTR portId = Global::sMWDPortId.c_str();
hComm = CreateFile(portId, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hComm == INVALID_HANDLE_VALUE){
if(GetLastError()==ERROR_FILE_NOT_FOUND){
WriteLog("PortCOM ERROR: serial port does not exist"); //serial port does not exist. Inform user.
}
WriteLog("PortCOM ERROR! not open!");
//some other error occurred. Inform user.
return FALSE;
}
DCB CommDCB;
CommDCB.DCBlength = sizeof(DCB);
GetCommState(hComm, &CommDCB);
CommDCB.BaudRate = Global::iMWDBaudrate;
CommDCB.fBinary = TRUE;
CommDCB.fParity = FALSE;
CommDCB.fOutxCtsFlow = FALSE; // No CTS output flow control
CommDCB.fOutxDsrFlow = FALSE; // No DSR output flow control
CommDCB.fDtrControl = FALSE; // DTR flow control type
CommDCB.fDsrSensitivity = FALSE; // DSR sensitivity
CommDCB.fTXContinueOnXoff = FALSE; // XOFF continues Tx
CommDCB.fOutX = FALSE; // No XON/XOFF out flow control
CommDCB.fInX = FALSE; // No XON/XOFF in flow control
CommDCB.fErrorChar = FALSE; // Disable error replacement
CommDCB.fNull = FALSE; // Disable null stripping
CommDCB.fRtsControl = RTS_CONTROL_DISABLE;
CommDCB.fAbortOnError = FALSE;
CommDCB.ByteSize = 8;
CommDCB.Parity = NOPARITY;
CommDCB.StopBits = ONESTOPBIT;
//konfiguracja portu
if (!SetCommState (hComm, &CommDCB))
{
//dwError = GetLastError ();
WriteLog("Unable to configure the serial port!");
return FALSE;
}
WriteLog("PortCOM OPEN and CONFIG!");
return TRUE;
}
bool MWDComm::Close() // zamykanie portu COM
{
WriteLog("COM Port is closing...");
int i = 0;
while(i<BYTETOWRITE) // zerowanie danych...
{
WriteDataBuff[i] = 0;
i++;
}
Sleep(100);
SendData(); // wysyłanie do pulpitu: zatrzymanie haslera i zgaszenie lampek
Sleep(700);
CloseHandle(hComm);
WriteLog("COM is close!");
return TRUE;
}
inline bool MWDComm::GetMWDState() // sprawdzanie otwarcia portu COM
{
if(hComm > 0) return 1;
else return 0;
}
bool MWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i zapis do zmiennych
{
DWORD bytes_read;
ReadFile(hComm, &ReadDataBuff[0], BYTETOREAD, &bytes_read, NULL);
fAnalog[0] = (float)((ReadDataBuff[9]<<8)+ReadDataBuff[8]) / Global::fMWDAnalogCalib[0][3]; //4095.0f; //max wartosc wynikająca z rozdzielczości
fAnalog[1] = (float)((ReadDataBuff[11]<<8)+ReadDataBuff[10]) / Global::fMWDAnalogCalib[1][3];
fAnalog[2] = (float)((ReadDataBuff[13]<<8)+ReadDataBuff[12]) / Global::fMWDAnalogCalib[2][3];
fAnalog[3] = (float)((ReadDataBuff[15]<<8)+ReadDataBuff[14]) / Global::fMWDAnalogCalib[3][3];
CheckData();
return TRUE;
}
bool MWDComm::SendData() // wysyłanie danych
{
DWORD bytes_write;
DWORD fdwEvtMask;
WriteFile(hComm, &WriteDataBuff[0], BYTETOWRITE, &bytes_write, NULL);
return TRUE;
}
bool MWDComm::Run() // wywoływanie obsługi MWD + generacja większego opóźnienia
{
MWDTime++;
if(!(MWDTime%5))
{
if(GetMWDState())
{
SendData();
if (Global::bMWDInputDataEnable) ReadData();
return 1;
}else
{
WriteLog("Port COM: connection ERROR!");
// może spróbować się połączyć znowu?
return 0;
}
MWDTime = 0;
}
}
bool MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowanie maszyną
{
int i=0;
while(i<6)
{
maskData[i] = ReadDataBuff[i]^lastStateData[i];
lastStateData[i] = ReadDataBuff[i];
i++;
}
/*
Rozpiska portów!
Port0: 0 NC odblok. przek. sprężarki i wentyl. oporów
1 M wyłącznik wył. szybkiego
2 Shift+M impuls załączający wył. szybki
3 N odblok. przekaźników nadmiarowych i różnicowego obwodu głównego
4 NC rezerwa
5 Ctrl+N odblok. przek. nadmiarowych przetwornicy, ogrzewania pociągu i różnicowych obw. pomocniczych
6 L wył. styczników liniowych
7 SPACE kasowanie czuwaka
Port1: 0 NC
1 (Shift) X przetwornica
2 (Shift) C sprężarka
3 S piasecznice
4 (Shift) H ogrzewanie składu
5 przel. hamowania Shift+B pspbpwy Ctrl+B pospieszny B towarowy
6 przel. hamowania
7 (Shift) F rozruch w/n
Port2: 0 (Shift) P pantograf przedni
1 (Shift) O pantograf tylni
2 ENTER przyhamowanie przy poślizgu
3 () przyciemnienie świateł
4 () przyciemnienie świateł
5 NUM6 odluźniacz
6 a syrena lok W
7 A syrena lok N
Port3: 0 Shift+J bateria
1
2
3
4
5
6
7
*/
/* po przełączeniu bistabilnego najpierw wciskamy klawisz i przy następnym
wejściu w pętlę MWD puszczamy bo inaczej nie działa */
// wciskanie przycisków klawiatury
/*PORT0*/
if(maskData[0] & 0x02 && lastStateData[0] & 0x02) KeyBoard('M',1); // wyłączenie wyłącznika szybkiego
else KeyBoard('M',0); // monostabilny
if(maskData[0] & 0x04 && lastStateData[0] & 0x04) { // impuls załączający wyłącznik szybki
KeyBoard(0x10,1); // monostabilny
KeyBoard('M',1);
}else{
KeyBoard('M',0);
KeyBoard(0x10,0);
}
if(maskData[0] & 0x08 && lastStateData[0] & 0x08) KeyBoard('N',1); // odblok nadmiarowego silników trakcyjnych
else KeyBoard('N',0); // monostabilny
if(maskData[0] & 0x20 && lastStateData[0] & 0x20) { // odblok nadmiarowego przetwornicy, ogrzewania poc.
KeyBoard(0x11,1); // różnicowego obwodów pomocniczych
KeyBoard('N',1); // monostabilny
}else{
KeyBoard('N',0);
KeyBoard(0x11,0);
}
if(maskData[0] & 0x40 && lastStateData[0] & 0x40) KeyBoard('L',1); // wył. styczników liniowych
else KeyBoard('L',0); // monostabilny
if(maskData[0] & 0x80 && lastStateData[0] & 0x80) KeyBoard(0x20,1); // kasowanie czuwaka/SHP
else KeyBoard(0x20,0); // kasowanie czuwaka/SHP
/*PORT1*/
// puszczanie przycisku bistabilnego klawiatury
if(maskSwitch[1]&0x02){
if(bitSwitch[1] &0x02){
KeyBoard('X',0);
KeyBoard(0x10,0);
}else KeyBoard('X',0);
maskSwitch[1] &= ~0x02;
}
if(maskSwitch[1]&0x04){
if(bitSwitch[1] &0x04){
KeyBoard('C',0);
KeyBoard(0x10,0);
}else KeyBoard('C',0);
maskSwitch[1] &= ~0x04;
}
if(maskSwitch[1]&0x10){
if(bitSwitch[1] &0x10){
KeyBoard('H',0);
KeyBoard(0x10,0);
}else KeyBoard('H',0);
maskSwitch[1] &= ~0x10;
}
if(maskSwitch[1] & 0x20 || maskSwitch[1] & 0x40){
if(maskSwitch[1] & 0x20) KeyBoard(0x10,0);
if(maskSwitch[1] & 0x40) KeyBoard(0x11,0);
KeyBoard('B',0);
maskSwitch[1] &= ~0x60;
}
if(maskSwitch[1]&0x80){
if(bitSwitch[1] &0x80){
KeyBoard('F',0);
KeyBoard(0x10,0);
}else KeyBoard('F',0);
maskSwitch[1] &= ~0x80;
}
if(maskData[1] & 0x02 && lastStateData[1] & 0x02) { // przetwornica
KeyBoard(0x10,1); // bistabilny
KeyBoard('X',1);
maskSwitch[1] |= 0x02;
bitSwitch[1] |= 0x02;
}else{
maskSwitch[1] |= 0x02;
bitSwitch[1] &= ~0x02;
KeyBoard('X',1);
}
if(maskData[1] & 0x04 && lastStateData[1] & 0x04) { // sprężarka
KeyBoard(0x10,1); // bistabilny
KeyBoard('C',1);
maskSwitch[1] |= 0x04;
bitSwitch[1] |= 0x04;
}else{
maskSwitch[1] |= 0x04;
bitSwitch[1] &= ~0x04;
KeyBoard('C',1);
}
if(maskData[1] & 0x08 && lastStateData[1] & 0x08) KeyBoard('S',1); // piasecznica
else KeyBoard('S',0); // monostabilny
if(maskData[1] & 0x10 && lastStateData[1] & 0x10) { // ogrzewanie składu
KeyBoard(0x11,1); // bistabilny
KeyBoard('H',1);
maskSwitch[1] |= 0x10;
bitSwitch[1] |= 0x10;
}else{
maskSwitch[1] |= 0x10;
bitSwitch[1] &= ~0x10;
KeyBoard('H',1);
}
if(maskData[1] & 0x20 || maskData[1] & 0x40){ // przełącznik hamowania
if(lastStateData[1] & 0x20){ // Shift+B
KeyBoard(0x10,1);
maskSwitch[1] |= 0x20;
}else if(lastStateData[1] & 0x40){ // Ctrl+B
KeyBoard(0x11,1);
maskSwitch[1] |= 0x40;
}
KeyBoard('B',1);
}
if(maskData[1] & 0x80 && lastStateData[1] & 0x80) { // rozruch wysoki/niski
KeyBoard(0x10,1); // bistabilny
KeyBoard('F',1);
maskSwitch[1] |= 0x80;
bitSwitch[1] |= 0x80;
}else{
maskSwitch[1] |= 0x80;
bitSwitch[1] &= ~0x80;
KeyBoard('F',1);
}
/*PORT2*/
if(maskSwitch[2]&0x01){
if(bitSwitch[2] &0x01){
KeyBoard('P',0);
KeyBoard(0x10,0);
}else KeyBoard('P',0);
maskSwitch[2] &= ~0x01;
}
if(maskSwitch[2]&0x02){
if(bitSwitch[2] &0x02){
KeyBoard('O',0);
KeyBoard(0x10,0);
}else KeyBoard('O',0);
maskSwitch[2] &= ~0x02;
}
if(maskData[2] & 0x01 && lastStateData[2] & 0x01) { // pantograf przedni
KeyBoard(0x10,1); // bistabilny
KeyBoard('P',1);
maskSwitch[2] |= 0x01;
bitSwitch[2] |= 0x01;
}else{
maskSwitch[2] |= 0x01;
bitSwitch[2] &= ~0x01;
KeyBoard('P',1);
}
if(maskData[2] & 0x02 && lastStateData[2] & 0x02) { // pantograf tylni
KeyBoard(0x10,1); // bistabilny
KeyBoard('O',1);
maskSwitch[2] |= 0x02;
bitSwitch[2] |= 0x02;
}else{
maskSwitch[2] |= 0x02;
bitSwitch[2] &= ~0x02;
KeyBoard('O',1);
}
if(maskData[2] & 0x04 && lastStateData[2] & 0x04) { // przyhamowanie przy poślizgu
KeyBoard(0x10,1); // monostabilny
KeyBoard(0x0D,1);
}else{
KeyBoard(0x0D,0);
KeyBoard(0x10,0);
}
/*if(maskData[2] & 0x08 && lastStateData[2] & 0x08){ // przyciemnienie świateł
KeyBoard(' ',0); // bistabilny
KeyBoard(0x10,1);
KeyBoard(' ',1);
}else{
KeyBoard(' ',0);
KeyBoard(0x10,0);
KeyBoard(' ',1);
}
if(maskData[2] & 0x10 && lastStateData[2] & 0x10) { // przyciemnienie świateł
KeyBoard(' ',0); // bistabilny
KeyBoard(0x11,1);
KeyBoard(' ',1);
}else{
KeyBoard(' ',0);
KeyBoard(0x11,0);
KeyBoard(' ',1);
}*/
if(maskData[2] & 0x20 && lastStateData[2] & 0x20) KeyBoard(0x66,1); // odluźniacz
else KeyBoard(0x66,0); // monostabilny
if(maskData[2] & 0x40 && lastStateData[2] & 0x40) { // syrena wysoka
KeyBoard(0x10,1); // monostabilny
KeyBoard('A',1);
}else{
KeyBoard('A',0);
KeyBoard(0x10,0);
}
if(maskData[2] & 0x80 && lastStateData[2] & 0x80) KeyBoard('A',1); // syrena niska
else KeyBoard('A',0); // monostabilny
/*PORT3*/
if(maskSwitch[3]&0x01){
if(bitSwitch[3] &0x01){
KeyBoard('J',0);
KeyBoard(0x10,0);
}else KeyBoard('J',0);
maskSwitch[3] &= ~0x01;
}
if(maskData[3] & 0x01 && lastStateData[3] & 0x01) { // bateria
KeyBoard(0x10,1); // bistabilny
KeyBoard('J',1);
maskSwitch[3] |= 0x01;
bitSwitch[3] |= 0x01;
}else{
maskSwitch[3] |= 0x01;
bitSwitch[3] &= ~0x01;
KeyBoard('J',1);
}
/*
if(maskData[3] & 0x04 && lastStateData[1] & 0x04) { KeyBoard(0x10,1);
KeyBoard('C',1); //
KeyBoard('C',0);
KeyBoard(0x10,0);
}else{ KeyBoard('C',1); //
KeyBoard('C',0);
}
if(maskData[3] & 0x08 && lastStateData[1] & 0x08) KeyBoard('S',1); //
else KeyBoard('S',0);
if(maskData[3] & 0x10 && lastStateData[1] & 0x10) {
KeyBoard(0x11,1);
KeyBoard('H',1);
}else{ KeyBoard('H',0);
KeyBoard(0x11,0);
}
if(maskData[3] & 0x20 && lastStateData[1] & 0x20) {
KeyBoard(0x11,1);
KeyBoard(' ',1);
}else{ KeyBoard(' ',0);
KeyBoard(0x11,0);
}
if(maskData[3] & 0x40 && lastStateData[1] & 0x40) {
KeyBoard(0x10,1);
KeyBoard(' ',1);
}else{ KeyBoard(' ',0);
KeyBoard(0x10,0);
}
if(maskData[3] & 0x80 && lastStateData[1] & 0x80) {
KeyBoard(0x10,1);
KeyBoard('F',1);
}else{ KeyBoard('F',0);
KeyBoard(0x10,0);
}
/*PORT4*//*
if(maskData[4] & 0x02 && lastStateData[1] & 0x02) {
KeyBoard(0x10,1);
KeyBoard('X',1); //
KeyBoard('X',0);
KeyBoard(0x10,0);
}else{ KeyBoard('X',1); //
KeyBoard('X',0);
}
if(maskData[4] & 0x04 && lastStateData[1] & 0x04) {
KeyBoard(0x10,1);
KeyBoard('C',1); //
KeyBoard('C',0);
KeyBoard(0x10,0);
}else{ KeyBoard('C',1); //
KeyBoard('C',0);
}
if(maskData[4] & 0x08 && lastStateData[1] & 0x08) KeyBoard('S',1); //
else KeyBoard('S',0);
if(maskData[4] & 0x10 && lastStateData[1] & 0x10) {
KeyBoard(0x11,1);
KeyBoard('H',1);
}else{ KeyBoard('H',0);
KeyBoard(0x11,0);
}
if(maskData[4] & 0x20 && lastStateData[1] & 0x20) {
KeyBoard(0x11,1);
KeyBoard(' ',1);
}else{ KeyBoard(' ',0);
KeyBoard(0x11,0);
}
if(maskData[4] & 0x40 && lastStateData[1] & 0x40) {
KeyBoard(0x10,1);
KeyBoard(' ',1);
}else{ KeyBoard(' ',0);
KeyBoard(0x10,0);
}
if(maskData[4] & 0x80 && lastStateData[1] & 0x80) {
KeyBoard(0x10,1);
KeyBoard('F',1);
}else{ KeyBoard('F',0);
KeyBoard(0x10,0);
}
/*PORT5*//*
if(maskData[5] & 0x02 && lastStateData[1] & 0x02) {
KeyBoard(0x10,1);
KeyBoard('X',1); //
KeyBoard('X',0);
KeyBoard(0x10,0);
}else{ KeyBoard('X',1); //
KeyBoard('X',0);
}
if(maskData[5] & 0x04 && lastStateData[1] & 0x04) {
KeyBoard(0x10,1);
KeyBoard('C',1); //
KeyBoard('C',0);
KeyBoard(0x10,0);
}else{ KeyBoard('C',1); //
KeyBoard('C',0);
}
if(maskData[5] & 0x08 && lastStateData[1] & 0x08) KeyBoard('S',1); //
else KeyBoard('S',0);
if(maskData[5] & 0x10 && lastStateData[1] & 0x10) {
KeyBoard(0x11,1);
KeyBoard('H',1);
}else{ KeyBoard('H',0);
KeyBoard(0x11,0);
}
if(maskData[5] & 0x20 && lastStateData[1] & 0x20) {
KeyBoard(0x11,1);
KeyBoard(' ',1);
}else{ KeyBoard(' ',0);
KeyBoard(0x11,0);
}
if(maskData[5] & 0x40 && lastStateData[1] & 0x40) {
KeyBoard(0x10,1);
KeyBoard(' ',1);
}else{ KeyBoard(' ',0);
KeyBoard(0x10,0);
}
if(maskData[5] & 0x80 && lastStateData[1] & 0x80) {
KeyBoard(0x10,1);
KeyBoard('F',1);
}else{ KeyBoard('F',0);
KeyBoard(0x10,0);
}//*/
/* NASTAWNIK, BOCZNIK i KIERUNEK */
if(bnkMask & 1){ //puszczanie klawiszy
KeyBoard(0x6B,0);
bnkMask &= ~1;
}
if(bnkMask & 2){
KeyBoard(0x6D,0);
bnkMask &= ~2;
}
if(bnkMask & 4){
KeyBoard(0x6F,0);
bnkMask &= ~4;
}
if(bnkMask & 8){
KeyBoard(0x6A,0);
bnkMask &= ~8;
}
if(nastawnik < ReadDataBuff[6])
{
bnkMask |= 1;
nastawnik++;
KeyBoard(0x6B,1); //wciśnij + i dodaj 1 do nastawnika
}
if(nastawnik > ReadDataBuff[6])
{
bnkMask |= 2;
nastawnik--;
KeyBoard(0x6D,1); //wciśnij - i odejmij 1 do nastawnika
}
if(bocznik < ReadDataBuff[7])
{
bnkMask |= 4;
bocznik++;
KeyBoard(0x6F,1); //wciśnij / i dodaj 1 do bocznika
}
if(bocznik > ReadDataBuff[7])
{
bnkMask |= 8;
bocznik--;
KeyBoard(0x6A,1); //wciśnij * i odejmij 1 do bocznika
}
/* Obsługa HASLERA */
if(ReadDataBuff[0] & 0x80) bCzuwak = true;
if(bKabina1){ // logika rysika 1
bRysik1H = true;
bRysik1L = false;
if(bPrzejazdSHP) bRysik1H = false;
}else if(bKabina2){
bRysik1L = true;
bRysik1H = false;
if(bPrzejazdSHP) bRysik1L = false;
}else{
bRysik1H = false;
bRysik1L = false;
}
if(bHamowanie){ // logika rysika 2
bRysik2H = false;
bRysik2L = true;
}else{
if(bCzuwak) bRysik2H = true;
else bRysik2H = false;
bRysik2L = false;
}
bCzuwak = false;
if(bRysik1H)WriteDataBuff[6] |= 1<<0;
else WriteDataBuff[6] &= ~(1<<0);
if(bRysik1L)WriteDataBuff[6] |= 1<<1;
else WriteDataBuff[6] &= ~(1<<1);
if(bRysik2H)WriteDataBuff[6] |= 1<<2;
else WriteDataBuff[6] &= ~(1<<2);
if(bRysik2L)WriteDataBuff[6] |= 1<<3;
else WriteDataBuff[6] &= ~(1<<3);
}
void MWDComm::KeyBoard(int key, bool s) // emulacja klawiatury
{
INPUT ip;
// Set up a generic keyboard event.
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0; // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
ip.ki.wVk = key; // virtual-key code for the "a" key
if(s){// Press the "A" key
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
}else{
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));
}
//return 1;
}

111
Console/MWD.h Normal file
View File

@@ -0,0 +1,111 @@
/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/
/*
Program obsługi portu COM i innych na potrzeby sterownika MWDevice
(oraz innych wykorzystujących komunikację przez port COM)
dla Symulatora Pojazdów Szynowych MaSzyna
author: Maciej Witek 2016
Autor nie ponosi odpowiedzialności za niewłaciwe używanie lub działanie programu!
*/
#ifndef MWDH
#define MWDH
//---------------------------------------------------------------------------
typedef unsigned char BYTE;
typedef unsigned long DWORD;
class MWDComm
{
private:
int MWDTime; //
char lastStateData[6], maskData[6],maskSwitch[6], bitSwitch[6];
int bocznik, nastawnik, kierunek;
char bnkMask;
bool ReadData(); //BYTE *pReadDataBuff);
bool SendData(); //BYTE *pWriteDataBuff);
bool CheckData(); //sprawdzanie zmian wejść i kontrola mazaków HASLERA
void KeyBoard(int key, bool s);
bool bRysik1H;
bool bRysik1L;
bool bRysik2H;
bool bRysik2L;
public:
bool Open(); // Otwarcie portu
bool Close(); // Zamknięcie portu
bool Run(); // Obsługa portu
bool GetMWDState(); // sprawdź czy port jest otwarty, 0 zamknięty, 1 otwarty
// zmienne do rysików HASLERA
bool bSHPstate;
bool bPrzejazdSHP;
bool bKabina1;
bool bKabina2;
bool bHamowanie;
bool bCzuwak;
float fAnalog[4]; // trzymanie danych z wejść analogowych
BYTE ReadDataBuff[17]; // bufory danych
BYTE WriteDataBuff[31];
MWDComm(); //konstruktor
~MWDComm(); //destruktor
};
#endif
/*
INFO - zmiany dokonane w innych plikach niezbędne do prawidłowego działania:
Console.cpp:
Console::AnalogCalibrateGet - obsługa kranów hamulców
Console::Update - wywoływanie obsługi MWD
Console::ValueSet - obsługa manometrów, mierników WN (PWM-y)
Console::BitsUpdate - ustawiania lampek
Console::Off - zamykanie portu COM
Console::On - otwieranie portu COM
Console::~Console - usuwanie MWD (jest też w Console OFF)
MWDComm * Console::MWD = NULL; - luzem, obiekt i wskaźnik(?)
dodatkowo zmieniłem int na long int dla BitSet i BitClear oraz iBits
Train.cpp:
if (Global::iFeedbackMode == 5) - pobieranie prędkości, manometrów i mierników WN
if (ggBrakeCtrl.SubModel) - możliwość sterowania hamulcem zespolonym
if (ggLocalBrake.SubModel) - możliwość sterowania hamulcem lokomotywy
Globals.h:
dodano zmienne dla MWD
Globals.cpp:
dodano inicjalizaję zmiennych i odczyt z ini ustawień
Wpisy do pliku eu07.ini
//maciek001 MWD
comportname COM3 // wybór portu COM
mwdbaudrate 500000
mwdbreakenable yes // czy załączyć sterowanie hamulcami? blokuje klawiature
mwdbreak 1 255 0 255 // hamulec zespolony
mwdbreak 2 255 0 255 // hamulec lokomotywy
mwdzbiornikglowny 0.82 255
mwdprzewodglowny 0.7 255
mwdcylinderhamulcowy 0.43 255
mwdwoltomierzwn 4000 255
mwdamperomierzwn 800 255
*/

View File

@@ -988,8 +988,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
if (TrainParams->IsTimeToGo(GlobalTime->hh, GlobalTime->mm)) if (TrainParams->IsTimeToGo(GlobalTime->hh, GlobalTime->mm))
{ // z dalsz<73> akcj<63> czekamy do godziny odjazdu { // z dalsz<73> akcj<63> czekamy do godziny odjazdu
/* potencjalny problem z ruszaniem z w4
if (TrainParams->CheckTrainLatency() < 0) if (TrainParams->CheckTrainLatency() < 0)
WaitingSet(20); //Jak sp<73><70>niony to czeka 20s WaitingSet(20); //Jak sp<73><70>niony to czeka 20s
*/
// iDrivigFlags|=moveLate1; //oflagowa<77>, gdy odjazd ze // iDrivigFlags|=moveLate1; //oflagowa<77>, gdy odjazd ze
// sp<73><70>nieniem, b<>dzie jecha<68> forsowniej // sp<73><70>nieniem, b<>dzie jecha<68> forsowniej
fLastStopExpDist = fLastStopExpDist =
@@ -1153,6 +1155,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
iDrivigFlags |= moveSemaphorFound; //je<6A>li z przodu to dajemy falg<6C>, <20>e jest iDrivigFlags |= moveSemaphorFound; //je<6A>li z przodu to dajemy falg<6C>, <20>e jest
d_to_next_sem = Min0R(sSpeedTable[i].fDist, d_to_next_sem); d_to_next_sem = Min0R(sSpeedTable[i].fDist, d_to_next_sem);
} }
if (sSpeedTable[i].fDist <= d_to_next_sem)
{
VelSignalNext = sSpeedTable[i].fVelNext;
}
} }
else if (sSpeedTable[i].iFlags & spRoadVel) else if (sSpeedTable[i].iFlags & spRoadVel)
{ // to W6 { // to W6
@@ -1378,7 +1384,7 @@ void TController::TablePurger()
{ // odtykacz: usuwa mniej istotne pozycje ze <20>rodka tabelki, aby unikn<6B><6E> zatkania { // odtykacz: usuwa mniej istotne pozycje ze <20>rodka tabelki, aby unikn<6B><6E> zatkania
//(np. brak ograniczenia pomi<6D>dzy zwrotnicami, usuni<6E>te sygna<6E>y, mini<6E>te odcinki <20>uku) //(np. brak ograniczenia pomi<6D>dzy zwrotnicami, usuni<6E>te sygna<6E>y, mini<6E>te odcinki <20>uku)
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TablePurger: Czyszczenie tableki."); WriteLog("TablePurger: Czyszczenie tabelki.");
int i, j, k = iLast - iFirst; // mo<6D>e by<62> 15 albo 16 pozycji, ostatniej nie ma co sprawdza<7A> int i, j, k = iLast - iFirst; // mo<6D>e by<62> 15 albo 16 pozycji, ostatniej nie ma co sprawdza<7A>
if (k < 0) if (k < 0)
k += iSpeedTableSize; // ilo<6C><6F> pozycji do przeanalizowania k += iSpeedTableSize; // ilo<6C><6F> pozycji do przeanalizowania

View File

@@ -244,6 +244,7 @@ class TController
double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości
public: public:
double VelSignalLast; // prędkość zadana na ostatnim semaforze double VelSignalLast; // prędkość zadana na ostatnim semaforze
double VelSignalNext; // prędkość zadana na następnym semaforze
double VelLimitLast; // prędkość zadana przez ograniczenie double VelLimitLast; // prędkość zadana przez ograniczenie
double VelRoad; // aktualna prędkość drogowa (ze znaku W27) double VelRoad; // aktualna prędkość drogowa (ze znaku W27)
// (PutValues albo komendą) // (PutValues albo komendą)

2228
DynObj.cpp

File diff suppressed because it is too large Load Diff

View File

@@ -69,8 +69,8 @@ int InitGL(GLvoid) // All Setup For OpenGL Goes Here
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
Global::pWorld = &World; // Ra: wskaŸnik potrzebny do usuwania pojazdów Global::pWorld = &World; // Ra: wska<EFBFBD>nik potrzebny do usuwania pojazd<EFBFBD>w
return World.Init(hWnd, hDC); // true jeœli wszystko pójdzie dobrze return World.Init(hWnd, hDC); // true je<EFBFBD>li wszystko p<EFBFBD>jdzie dobrze
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -403,22 +403,22 @@ LRESULT CALLBACK WndProc(HWND hWnd, // handle for this window
RECT rect; RECT rect;
switch (uMsg) // check for windows messages switch (uMsg) // check for windows messages
{ {
case WM_PASTE: //[Ctrl]+[V] potrzebujemy do innych celów case WM_PASTE: //[Ctrl]+[V] potrzebujemy do innych cel<EFBFBD>w
return 0; return 0;
case WM_COPYDATA: // obs³uga danych przes³anych przez program steruj¹cy case WM_COPYDATA: // obs<EFBFBD>uga danych przes<EFBFBD>anych przez program steruj<EFBFBD>cy
pDane = (PCOPYDATASTRUCT)lParam; pDane = (PCOPYDATASTRUCT)lParam;
if (pDane->dwData == 'EU07') // sygnatura danych if (pDane->dwData == 'EU07') // sygnatura danych
World.OnCommandGet((DaneRozkaz *)(pDane->lpData)); World.OnCommandGet((DaneRozkaz *)(pDane->lpData));
break; break;
case WM_ACTIVATE: // watch for window activate message case WM_ACTIVATE: // watch for window activate message
// case WM_ACTIVATEAPP: // case WM_ACTIVATEAPP:
{ // Ra: uzale¿nienie aktywnoœci od bycia na wierzchu { // Ra: uzale<EFBFBD>nienie aktywno<EFBFBD>ci od bycia na wierzchu
Global::bActive = (LOWORD(wParam) != WA_INACTIVE); Global::bActive = (LOWORD(wParam) != WA_INACTIVE);
if (Global::bInactivePause) // jeœli ma byæ pauzowanie okna w tle if (Global::bInactivePause) // je<EFBFBD>li ma by<EFBFBD> pauzowanie okna w tle
if (Global::bActive) if (Global::bActive)
Global::iPause &= ~4; // odpauzowanie, gdy jest na pierwszym planie Global::iPause &= ~4; // odpauzowanie, gdy jest na pierwszym planie
else else
Global::iPause |= 4; // w³¹czenie pauzy, gdy nieaktywy Global::iPause |= 4; // w<EFBFBD><EFBFBD>czenie pauzy, gdy nieaktywy
if (Global::bActive) if (Global::bActive)
SetCursorPos(mx, my); SetCursorPos(mx, my);
ShowCursor(!Global::bActive); ShowCursor(!Global::bActive);
@@ -472,8 +472,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, // handle for this window
case WM_KEYDOWN: case WM_KEYDOWN:
if (Global::bActive) if (Global::bActive)
{ {
if (wParam != 17) // bo naciœniêcia [Ctrl] nie ma po co przekazywaæ if (wParam != 17) // bo naci<EFBFBD>ni<EFBFBD>cia [Ctrl] nie ma po co przekazywa<EFBFBD>
if (wParam != 145) //[Scroll Lock] te¿ nie if (wParam != 145) //[Scroll Lock] te<EFBFBD> nie
World.OnKeyDown(wParam); World.OnKeyDown(wParam);
switch (wParam) switch (wParam)
{ {
@@ -481,27 +481,27 @@ LRESULT CALLBACK WndProc(HWND hWnd, // handle for this window
if (DebugModeFlag) if (DebugModeFlag)
break; break;
case 19: //[Pause] case 19: //[Pause]
if (Global::iPause & 1) // jeœli pauza startowa if (Global::iPause & 1) // je<EFBFBD>li pauza startowa
Global::iPause &= ~1; // odpauzowanie, gdy po wczytaniu mia³o nie startowaæ Global::iPause &= ~1; // odpauzowanie, gdy po wczytaniu mia<EFBFBD>o nie startowa<EFBFBD>
else if (!(Global::iMultiplayer & 2)) // w multiplayerze pauza nie ma sensu else if (!(Global::iMultiplayer & 2)) // w multiplayerze pauza nie ma sensu
if (!Console::Pressed(VK_CONTROL)) // z [Ctrl] to radiostop jest if (!Console::Pressed(VK_CONTROL)) // z [Ctrl] to radiostop jest
// Ra: poni¿sze nie ma sensu, bo brak komunikacji natychmiast zapauzuje // Ra: poni<EFBFBD>sze nie ma sensu, bo brak komunikacji natychmiast zapauzuje
// ponownie // ponownie
// if (Global::iPause&8) //jeœli pauza zwi¹zana z brakiem komunikacji z // if (Global::iPause&8) //je<EFBFBD>li pauza zwi<EFBFBD>zana z brakiem komunikacji z
// PoKeys // PoKeys
// Global::iPause&=~10; //odpauzowanie pauzy PoKeys (chyba nic nie da) i // Global::iPause&=~10; //odpauzowanie pauzy PoKeys (chyba nic nie da) i
// ewentualnie klawiszowej równie¿ // ewentualnie klawiszowej r<EFBFBD>wnie<EFBFBD>
// else // else
Global::iPause ^= 2; // zmiana stanu zapauzowania Global::iPause ^= 2; // zmiana stanu zapauzowania
if (Global::iPause) // jak pauza if (Global::iPause) // jak pauza
Global::iTextMode = VK_F1; // to wyœwietliæ zegar i informacjê Global::iTextMode = VK_F1; // to wy<EFBFBD>wietli<EFBFBD> zegar i informacj<EFBFBD>
break; break;
case VK_F7: case VK_F7:
if (DebugModeFlag) if (DebugModeFlag)
{ // siatki wyœwietlane tyko w trybie testowym { // siatki wy<EFBFBD>wietlane tyko w trybie testowym
Global::bWireFrame = !Global::bWireFrame; Global::bWireFrame = !Global::bWireFrame;
++Global::iReCompile; // odœwie¿yæ siatki ++Global::iReCompile; // od<EFBFBD>wie<EFBFBD>y<EFBFBD> siatki
// Ra: jeszcze usun¹æ siatki ze skompilowanych obiektów! // Ra: jeszcze usun<EFBFBD><EFBFBD> siatki ze skompilowanych obiekt<EFBFBD>w!
} }
break; break;
} }
@@ -578,9 +578,9 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
MSG msg; // windows message structure MSG msg; // windows message structure
BOOL done = FALSE; // bool variable to exit loop BOOL done = FALSE; // bool variable to exit loop
fullscreen = true; fullscreen = true;
DeleteFile("errors.txt"); // usuniêcie starego DeleteFile("errors.txt"); // usuni<EFBFBD>cie starego
Global::LoadIniFile("eu07.ini"); // teraz dopiero mo¿na przejrzeæ plik z ustawieniami Global::LoadIniFile("eu07.ini"); // teraz dopiero mo<EFBFBD>na przejrze<EFBFBD> plik z ustawieniami
Global::InitKeys("keys.ini"); // wczytanie mapowania klawiszy - jest na sta³e Global::InitKeys("keys.ini"); // wczytanie mapowania klawiszy - jest na sta<EFBFBD>e
// hunter-271211: ukrywanie konsoli // hunter-271211: ukrywanie konsoli
if (Global::iWriteLogEnabled & 2) if (Global::iWriteLogEnabled & 2)
@@ -590,7 +590,7 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
} }
std::string commandline( lpCmdLine ); // parametry uruchomienia std::string commandline( lpCmdLine ); // parametry uruchomienia
if( false == commandline.empty() ) if( false == commandline.empty() )
{ // analizowanie parametrów { // analizowanie parametr<EFBFBD>w
cParser parser( commandline ); cParser parser( commandline );
std::string token; std::string token;
do { do {
@@ -609,15 +609,15 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
parser >> Global::asHumanCtrlVehicle; parser >> Global::asHumanCtrlVehicle;
} }
else if( token == "-modifytga" ) else if( token == "-modifytga" )
{ // wykonanie modyfikacji wszystkich plików TGA { // wykonanie modyfikacji wszystkich plik<EFBFBD>w TGA
Global::iModifyTGA = -1; // specjalny tryb wykonania totalnej modyfikacji Global::iModifyTGA = -1; // specjalny tryb wykonania totalnej modyfikacji
} }
else if( token == "-e3d" ) else if( token == "-e3d" )
{ // wygenerowanie wszystkich plików E3D { // wygenerowanie wszystkich plik<EFBFBD>w E3D
if (Global::iConvertModels > 0) if (Global::iConvertModels > 0)
Global::iConvertModels = -Global::iConvertModels; // specjalny tryb Global::iConvertModels = -Global::iConvertModels; // specjalny tryb
else else
Global::iConvertModels = -7; // z optymalizacj¹, bananami i prawid³owym Opacity Global::iConvertModels = -7; // z optymalizacj<EFBFBD>, bananami i prawid<EFBFBD>owym Opacity
} }
else else
Error( Error(
@@ -644,9 +644,9 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
return 0; // quit if window was not created return 0; // quit if window was not created
SetForegroundWindow(hWnd); SetForegroundWindow(hWnd);
// McZapkie: proba przeplukania klawiatury // McZapkie: proba przeplukania klawiatury
Console *pConsole = new Console(); // Ra: nie wiem, czy ma to sens, ale jakoœ zainicjowac trzeba Console *pConsole = new Console(); // Ra: nie wiem, czy ma to sens, ale jako<EFBFBD> zainicjowac trzeba
while (Console::Pressed(VK_F10)) while (Console::Pressed(VK_F10))
Error("Keyboard buffer problem - press F10"); // na Windows 98 lubi siê to pojawiaæ Error("Keyboard buffer problem - press F10"); // na Windows 98 lubi si<EFBFBD> to pojawia<EFBFBD>
int iOldSpeed, iOldDelay; int iOldSpeed, iOldDelay;
SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &iOldSpeed, 0); SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &iOldSpeed, 0);
SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &iOldDelay, 0); SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &iOldDelay, 0);
@@ -656,20 +656,20 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
WriteLog("No joystick"); WriteLog("No joystick");
if (Global::iModifyTGA < 0) if (Global::iModifyTGA < 0)
{ // tylko modyfikacja TGA, bez uruchamiania symulacji { // tylko modyfikacja TGA, bez uruchamiania symulacji
Global::iMaxTextureSize = 64; //¿eby nie zamulaæ pamiêci Global::iMaxTextureSize = 64; //<EFBFBD>eby nie zamula<EFBFBD> pami<EFBFBD>ci
World.ModifyTGA(); // rekurencyjne przegl¹danie katalogów World.ModifyTGA(); // rekurencyjne przegl<EFBFBD>danie katalog<EFBFBD>w
} }
else else
{ {
if (Global::iConvertModels < 0) if (Global::iConvertModels < 0)
{ {
Global::iConvertModels = -Global::iConvertModels; Global::iConvertModels = -Global::iConvertModels;
World.CreateE3D("models\\"); // rekurencyjne przegl¹danie katalogów World.CreateE3D("models\\"); // rekurencyjne przegl<EFBFBD>danie katalog<EFBFBD>w
World.CreateE3D("dynamic\\", true); World.CreateE3D("dynamic\\", true);
} // po zrobieniu E3D odpalamy normalnie sceneriê, by j¹ zobaczyæ } // po zrobieniu E3D odpalamy normalnie sceneri<EFBFBD>, by j<EFBFBD> zobaczy<EFBFBD>
// else // else
//{//g³ówna pêtla programu //{//g<EFBFBD><EFBFBD>wna p<EFBFBD>tla programu
Console::On(); // w³¹czenie konsoli Console::On(); // w<EFBFBD><EFBFBD>czenie konsoli
while (!done) // loop that runs while done=FALSE while (!done) // loop that runs while done=FALSE
{ {
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) // is there a message waiting? if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) // is there a message waiting?
@@ -689,14 +689,14 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
// draw the scene, watch for quit messages // draw the scene, watch for quit messages
// DrawGLScene() // DrawGLScene()
// if (!pause) // if (!pause)
// if (Global::bInactivePause?Global::bActive:true) //tak nie, bo spada z góry // if (Global::bInactivePause?Global::bActive:true) //tak nie, bo spada z g<EFBFBD>ry
if (World.Update()) // Was There A Quit Received? if (World.Update()) // Was There A Quit Received?
SwapBuffers(hDC); // Swap Buffers (Double Buffering) SwapBuffers(hDC); // Swap Buffers (Double Buffering)
else else
done = true; //[F10] or DrawGLScene signalled a quit done = true; //[F10] or DrawGLScene signalled a quit
} }
} }
Console::Off(); // wy³¹czenie konsoli (komunikacji zwrotnej) Console::Off(); // wy<EFBFBD><EFBFBD>czenie konsoli (komunikacji zwrotnej)
} }
SystemParametersInfo(SPI_SETKEYBOARDSPEED, iOldSpeed, NULL, 0); SystemParametersInfo(SPI_SETKEYBOARDSPEED, iOldSpeed, NULL, 0);
SystemParametersInfo(SPI_SETKEYBOARDDELAY, iOldDelay, NULL, 0); SystemParametersInfo(SPI_SETKEYBOARDDELAY, iOldDelay, NULL, 0);

View File

@@ -25,55 +25,55 @@ http://mozilla.org/MPL/2.0/.
// namespace Global { // namespace Global {
// parametry do u¿ytku wewnêtrznego // parametry do u<EFBFBD>ytku wewn<EFBFBD>trznego
// double Global::tSinceStart=0; // double Global::tSinceStart=0;
TGround *Global::pGround = NULL; TGround *Global::pGround = NULL;
// char Global::CreatorName1[30]="2001-2004 Maciej Czapkiewicz <McZapkie>"; // char Global::CreatorName1[30]="2001-2004 Maciej Czapkiewicz <McZapkie>";
// char Global::CreatorName2[30]="2001-2003 Marcin WoŸniak <Marcin_EU>"; // char Global::CreatorName2[30]="2001-2003 Marcin Wo<EFBFBD>niak <Marcin_EU>";
// char Global::CreatorName3[20]="2004-2005 Adam Bugiel <ABu>"; // char Global::CreatorName3[20]="2004-2005 Adam Bugiel <ABu>";
// char Global::CreatorName4[30]="2004 Arkadiusz Œlusarczyk <Winger>"; // char Global::CreatorName4[30]="2004 Arkadiusz <EFBFBD>lusarczyk <Winger>";
// char Global::CreatorName5[30]="2003-2009 £ukasz Kirchner <Nbmx>"; // char Global::CreatorName5[30]="2003-2009 <EFBFBD>ukasz Kirchner <Nbmx>";
std::string Global::asCurrentSceneryPath = "scenery/"; std::string Global::asCurrentSceneryPath = "scenery/";
std::string Global::asCurrentTexturePath = std::string(szTexturePath); std::string Global::asCurrentTexturePath = std::string(szTexturePath);
std::string Global::asCurrentDynamicPath = ""; std::string Global::asCurrentDynamicPath = "";
int Global::iSlowMotion = int Global::iSlowMotion =
0; // info o malym FPS: 0-OK, 1-wy³¹czyæ multisampling, 3-promieñ 1.5km, 7-1km 0; // info o malym FPS: 0-OK, 1-wy<EFBFBD><EFBFBD>czy<EFBFBD> multisampling, 3-promie<EFBFBD> 1.5km, 7-1km
TDynamicObject *Global::changeDynObj = NULL; // info o zmianie pojazdu TDynamicObject *Global::changeDynObj = NULL; // info o zmianie pojazdu
bool Global::detonatoryOK; // info o nowych detonatorach bool Global::detonatoryOK; // info o nowych detonatorach
double Global::ABuDebug = 0; double Global::ABuDebug = 0;
std::string Global::asSky = "1"; std::string Global::asSky = "1";
double Global::fOpenGL = 0.0; // wersja OpenGL - do sprawdzania obecnoœci rozszerzeñ double Global::fOpenGL = 0.0; // wersja OpenGL - do sprawdzania obecno<EFBFBD>ci rozszerze<EFBFBD>
bool Global::bOpenGL_1_5 = false; // czy s¹ dostêpne funkcje OpenGL 1.5 bool Global::bOpenGL_1_5 = false; // czy s<EFBFBD> dost<EFBFBD>pne funkcje OpenGL 1.5
double Global::fLuminance = 1.0; // jasnoœæ œwiat³a do automatycznego zapalania double Global::fLuminance = 1.0; // jasno<EFBFBD><EFBFBD> <20>wiat<EFBFBD>a do automatycznego zapalania
int Global::iReCompile = 0; // zwiêkszany, gdy trzeba odœwie¿yæ siatki int Global::iReCompile = 0; // zwi<EFBFBD>kszany, gdy trzeba od<EFBFBD>wie<EFBFBD>y<EFBFBD> siatki
HWND Global::hWnd = NULL; // uchwyt okna HWND Global::hWnd = NULL; // uchwyt okna
int Global::iCameraLast = -1; int Global::iCameraLast = -1;
std::string Global::asRelease = "16.1.1174.483"; std::string Global::asRelease = "16.1.1174.483";
std::string Global::asVersion = std::string Global::asVersion =
"Compilation 2017-01-13, release " + Global::asRelease + "."; // tutaj, bo wysy³any "Compilation 2017-01-13, release " + Global::asRelease + "."; // tutaj, bo wysy<EFBFBD>any
int Global::iViewMode = 0; // co aktualnie widaæ: 0-kabina, 1-latanie, 2-sprzêgi, 3-dokumenty int Global::iViewMode = 0; // co aktualnie wida<EFBFBD>: 0-kabina, 1-latanie, 2-sprz<EFBFBD>gi, 3-dokumenty
int Global::iTextMode = 0; // tryb pracy wyœwietlacza tekstowego int Global::iTextMode = 0; // tryb pracy wy<EFBFBD>wietlacza tekstowego
int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0, int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0}; // numer ekranu wyœwietlacza tekstowego 0, 0, 0, 0, 0, 0}; // numer ekranu wy<EFBFBD>wietlacza tekstowego
double Global::fSunDeclination = 0.0; // deklinacja S³oñca double Global::fSunDeclination = 0.0; // deklinacja S<EFBFBD>o<EFBFBD>ca
double Global::fTimeAngleDeg = 0.0; // godzina w postaci k¹ta double Global::fTimeAngleDeg = 0.0; // godzina w postaci k<EFBFBD>ta
float Global::fClockAngleDeg[6]; // k¹ty obrotu cylindrów dla zegara cyfrowego float Global::fClockAngleDeg[6]; // k<EFBFBD>ty obrotu cylindr<EFBFBD>w dla zegara cyfrowego
char *Global::szTexturesTGA[4] = {"tga", "dds", "tex", "bmp"}; // lista tekstur od TGA char *Global::szTexturesTGA[4] = {"tga", "dds", "tex", "bmp"}; // lista tekstur od TGA
char *Global::szTexturesDDS[4] = {"dds", "tga", "tex", "bmp"}; // lista tekstur od DDS char *Global::szTexturesDDS[4] = {"dds", "tga", "tex", "bmp"}; // lista tekstur od DDS
int Global::iKeyLast = 0; // ostatnio naciœniêty klawisz w celu logowania int Global::iKeyLast = 0; // ostatnio naci<EFBFBD>ni<EFBFBD>ty klawisz w celu logowania
GLuint Global::iTextureId = 0; // ostatnio u¿yta tekstura 2D GLuint Global::iTextureId = 0; // ostatnio u<EFBFBD>yta tekstura 2D
int Global::iPause = 0x10; // globalna pauza ruchu int Global::iPause = 0x10; // globalna pauza ruchu
bool Global::bActive = true; // czy jest aktywnym oknem bool Global::bActive = true; // czy jest aktywnym oknem
int Global::iErorrCounter = 0; // licznik sprawdzañ do œledzenia b³êdów OpenGL int Global::iErorrCounter = 0; // licznik sprawdza<EFBFBD> do <EFBFBD>ledzenia b<EFBFBD><EFBFBD>d<EFBFBD>w OpenGL
int Global::iTextures = 0; // licznik u¿ytych tekstur int Global::iTextures = 0; // licznik u<EFBFBD>ytych tekstur
TWorld *Global::pWorld = NULL; TWorld *Global::pWorld = NULL;
cParser *Global::pParser = NULL; cParser *Global::pParser = NULL;
int Global::iSegmentsRendered = 90; // iloœæ segmentów do regulacji wydajnoœci int Global::iSegmentsRendered = 90; // ilo<EFBFBD><EFBFBD> segment<EFBFBD>w do regulacji wydajno<EFBFBD>ci
TCamera *Global::pCamera = NULL; // parametry kamery TCamera *Global::pCamera = NULL; // parametry kamery
TDynamicObject *Global::pUserDynamic = NULL; // pojazd u¿ytkownika, renderowany bez trzêsienia TDynamicObject *Global::pUserDynamic = NULL; // pojazd u<EFBFBD>ytkownika, renderowany bez trz<EFBFBD>sienia
bool Global::bSmudge = false; // czy wyœwietlaæ smugê, a pojazd u¿ytkownika na koñcu bool Global::bSmudge = false; // czy wy<EFBFBD>wietla<EFBFBD> smug<EFBFBD>, a pojazd u<EFBFBD>ytkownika na ko<EFBFBD>cu
std::string Global::asTranscript[5]; // napisy na ekranie (widoczne) std::string Global::asTranscript[5]; // napisy na ekranie (widoczne)
TTranscripts Global::tranTexts; // obiekt obs³uguj¹cy stenogramy dŸwiêków na ekranie TTranscripts Global::tranTexts; // obiekt obs<EFBFBD>uguj<EFBFBD>cy stenogramy d<EFBFBD>wi<EFBFBD>k<EFBFBD>w na ekranie
// parametry scenerii // parametry scenerii
vector3 Global::pCameraPosition; vector3 Global::pCameraPosition;
@@ -89,22 +89,22 @@ GLfloat Global::FogColor[] = {0.6f, 0.7f, 0.8f};
GLfloat Global::ambientDayLight[] = {0.40f, 0.40f, 0.45f, 1.0f}; // robocze GLfloat Global::ambientDayLight[] = {0.40f, 0.40f, 0.45f, 1.0f}; // robocze
GLfloat Global::diffuseDayLight[] = {0.55f, 0.54f, 0.50f, 1.0f}; GLfloat Global::diffuseDayLight[] = {0.55f, 0.54f, 0.50f, 1.0f};
GLfloat Global::specularDayLight[] = {0.95f, 0.94f, 0.90f, 1.0f}; GLfloat Global::specularDayLight[] = {0.95f, 0.94f, 0.90f, 1.0f};
GLfloat Global::ambientLight[] = {0.80f, 0.80f, 0.85f, 1.0f}; // sta³e GLfloat Global::ambientLight[] = {0.80f, 0.80f, 0.85f, 1.0f}; // sta<EFBFBD>e
GLfloat Global::diffuseLight[] = {0.85f, 0.85f, 0.80f, 1.0f}; GLfloat Global::diffuseLight[] = {0.85f, 0.85f, 0.80f, 1.0f};
GLfloat Global::specularLight[] = {0.95f, 0.94f, 0.90f, 1.0f}; GLfloat Global::specularLight[] = {0.95f, 0.94f, 0.90f, 1.0f};
GLfloat Global::whiteLight[] = {1.00f, 1.00f, 1.00f, 1.0f}; GLfloat Global::whiteLight[] = {1.00f, 1.00f, 1.00f, 1.0f};
GLfloat Global::noLight[] = {0.00f, 0.00f, 0.00f, 1.0f}; GLfloat Global::noLight[] = {0.00f, 0.00f, 0.00f, 1.0f};
GLfloat Global::darkLight[] = {0.03f, 0.03f, 0.03f, 1.0f}; //œladowe GLfloat Global::darkLight[] = {0.03f, 0.03f, 0.03f, 1.0f}; //<EFBFBD>ladowe
GLfloat Global::lightPos[4]; GLfloat Global::lightPos[4];
bool Global::bRollFix = true; // czy wykonaæ przeliczanie przechy³ki bool Global::bRollFix = true; // czy wykona<EFBFBD> przeliczanie przechy<EFBFBD>ki
bool Global::bJoinEvents = false; // czy grupowaæ eventy o tych samych nazwach bool Global::bJoinEvents = false; // czy grupowa<EFBFBD> eventy o tych samych nazwach
int Global::iHiddenEvents = 1; // czy ³¹czyæ eventy z torami poprzez nazwê toru int Global::iHiddenEvents = 1; // czy <EFBFBD><EFBFBD>czy<EFBFBD> eventy z torami poprzez nazw<EFBFBD> toru
// parametry u¿ytkowe (jak komu pasuje) // parametry u<EFBFBD>ytkowe (jak komu pasuje)
int Global::Keys[MaxKeys]; int Global::Keys[MaxKeys];
int Global::iWindowWidth = 800; int Global::iWindowWidth = 800;
int Global::iWindowHeight = 600; int Global::iWindowHeight = 600;
float Global::fDistanceFactor = 768.0; // baza do przeliczania odleg³oœci dla LoD float Global::fDistanceFactor = 768.0; // baza do przeliczania odleg<EFBFBD>o<EFBFBD>ci dla LoD
int Global::iFeedbackMode = 1; // tryb pracy informacji zwrotnej int Global::iFeedbackMode = 1; // tryb pracy informacji zwrotnej
int Global::iFeedbackPort = 0; // dodatkowy adres dla informacji zwrotnych int Global::iFeedbackPort = 0; // dodatkowy adres dla informacji zwrotnych
bool Global::bFreeFly = false; bool Global::bFreeFly = false;
@@ -114,52 +114,52 @@ float Global::fMouseXScale = 1.5;
float Global::fMouseYScale = 0.2; float Global::fMouseYScale = 0.2;
std::string Global::SceneryFile = "td.scn"; std::string Global::SceneryFile = "td.scn";
std::string Global::asHumanCtrlVehicle = "EU07-424"; std::string Global::asHumanCtrlVehicle = "EU07-424";
int Global::iMultiplayer = 0; // blokada dzia³ania niektórych funkcji na rzecz komunikacji int Global::iMultiplayer = 0; // blokada dzia<EFBFBD>ania niekt<EFBFBD>rych funkcji na rzecz komunikacji
double Global::fMoveLight = -1; // ruchome œwiat³o double Global::fMoveLight = -1; // ruchome <EFBFBD>wiat<EFBFBD>o
double Global::fLatitudeDeg = 52.0; // szerokoϾ geograficzna double Global::fLatitudeDeg = 52.0; // szeroko<EFBFBD><EFBFBD> geograficzna
float Global::fFriction = 1.0; // mno¿nik tarcia - KURS90 float Global::fFriction = 1.0; // mno<EFBFBD>nik tarcia - KURS90
double Global::fBrakeStep = 1.0; // krok zmiany hamulca dla klawiszy [Num3] i [Num9] double Global::fBrakeStep = 1.0; // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
std::string Global::asLang = "pl"; // domyœlny jêzyk - http://tools.ietf.org/html/bcp47 std::string Global::asLang = "pl"; // domy<EFBFBD>lny j<EFBFBD>zyk - http://tools.ietf.org/html/bcp47
// parametry wydajnoœciowe (np. regulacja FPS, szybkoœæ wczytywania) // parametry wydajno<EFBFBD>ciowe (np. regulacja FPS, szybko<EFBFBD><EFBFBD> wczytywania)
bool Global::bAdjustScreenFreq = true; bool Global::bAdjustScreenFreq = true;
bool Global::bEnableTraction = true; bool Global::bEnableTraction = true;
bool Global::bLoadTraction = true; bool Global::bLoadTraction = true;
bool Global::bLiveTraction = true; bool Global::bLiveTraction = true;
int Global::iDefaultFiltering = 9; // domyœlne rozmywanie tekstur TGA bez alfa int Global::iDefaultFiltering = 9; // domy<EFBFBD>lne rozmywanie tekstur TGA bez alfa
int Global::iBallastFiltering = 9; // domyœlne rozmywanie tekstur podsypki int Global::iBallastFiltering = 9; // domy<EFBFBD>lne rozmywanie tekstur podsypki
int Global::iRailProFiltering = 5; // domyœlne rozmywanie tekstur szyn int Global::iRailProFiltering = 5; // domy<EFBFBD>lne rozmywanie tekstur szyn
int Global::iDynamicFiltering = 5; // domyœlne rozmywanie tekstur pojazdów int Global::iDynamicFiltering = 5; // domy<EFBFBD>lne rozmywanie tekstur pojazd<EFBFBD>w
bool Global::bUseVBO = false; // czy jest VBO w karcie graficznej (czy u¿yæ) bool Global::bUseVBO = false; // czy jest VBO w karcie graficznej (czy u<EFBFBD>y<EFBFBD>)
GLint Global::iMaxTextureSize = 16384; // maksymalny rozmiar tekstury GLint Global::iMaxTextureSize = 16384; // maksymalny rozmiar tekstury
bool Global::bSmoothTraction = false; // wyg³adzanie drutów starym sposobem bool Global::bSmoothTraction = false; // wyg<EFBFBD>adzanie drut<EFBFBD>w starym sposobem
char **Global::szDefaultExt = Global::szTexturesDDS; // domyœlnie od DDS char **Global::szDefaultExt = Global::szTexturesDDS; // domy<EFBFBD>lnie od DDS
int Global::iMultisampling = 2; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px int Global::iMultisampling = 2; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px
bool Global::bGlutFont = false; // czy tekst generowany przez GLUT32.DLL bool Global::bGlutFont = false; // czy tekst generowany przez GLUT32.DLL
int Global::iConvertModels = 7; // tworzenie plików binarnych, +2-optymalizacja transformów int Global::iConvertModels = 7; // tworzenie plik<EFBFBD>w binarnych, +2-optymalizacja transform<EFBFBD>w
int Global::iSlowMotionMask = -1; // maska wy³¹czanych w³aœciwoœci dla zwiêkszenia FPS int Global::iSlowMotionMask = -1; // maska wy<EFBFBD><EFBFBD>czanych w<EFBFBD>a<EFBFBD>ciwo<EFBFBD>ci dla zwi<EFBFBD>kszenia FPS
int Global::iModifyTGA = 7; // czy korygowaæ pliki TGA dla szybszego wczytywania int Global::iModifyTGA = 7; // czy korygowa<EFBFBD> pliki TGA dla szybszego wczytywania
// bool Global::bTerrainCompact=true; //czy zapisaæ teren w pliku // bool Global::bTerrainCompact=true; //czy zapisa<EFBFBD> teren w pliku
TAnimModel *Global::pTerrainCompact = NULL; // do zapisania terenu w pliku TAnimModel *Global::pTerrainCompact = NULL; // do zapisania terenu w pliku
std::string Global::asTerrainModel = ""; // nazwa obiektu terenu do zapisania w pliku std::string Global::asTerrainModel = ""; // nazwa obiektu terenu do zapisania w pliku
double Global::fFpsAverage = 20.0; // oczekiwana wartosæ FPS double Global::fFpsAverage = 20.0; // oczekiwana wartos<EFBFBD> FPS
double Global::fFpsDeviation = 5.0; // odchylenie standardowe FPS double Global::fFpsDeviation = 5.0; // odchylenie standardowe FPS
double Global::fFpsMin = 0.0; // dolna granica FPS, przy której promieñ scenerii bêdzie zmniejszany double Global::fFpsMin = 0.0; // dolna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zmniejszany
double Global::fFpsMax = 0.0; // górna granica FPS, przy której promieñ scenerii bêdzie zwiêkszany double Global::fFpsMax = 0.0; // g<EFBFBD>rna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zwi<EFBFBD>kszany
double Global::fFpsRadiusMax = 3000.0; // maksymalny promieñ renderowania double Global::fFpsRadiusMax = 3000.0; // maksymalny promie<EFBFBD> renderowania
int Global::iFpsRadiusMax = 225; // maksymalny promieñ renderowania int Global::iFpsRadiusMax = 225; // maksymalny promie<EFBFBD> renderowania
double Global::fRadiusFactor = 1.1; // wspó³czynnik jednorazowej zmiany promienia scenerii double Global::fRadiusFactor = 1.1; // wsp<EFBFBD><EFBFBD>czynnik jednorazowej zmiany promienia scenerii
bool Global::bOldSmudge = false; // U¿ywanie starej smugi bool Global::bOldSmudge = false; // U<EFBFBD>ywanie starej smugi
// parametry testowe (do testowania scenerii i obiektów) // parametry testowe (do testowania scenerii i obiekt<EFBFBD>w)
bool Global::bWireFrame = false; bool Global::bWireFrame = false;
bool Global::bSoundEnabled = true; bool Global::bSoundEnabled = true;
int Global::iWriteLogEnabled = 3; // maska bitowa: 1-zapis do pliku, 2-okienko, 4-nazwy torów int Global::iWriteLogEnabled = 3; // maska bitowa: 1-zapis do pliku, 2-okienko, 4-nazwy tor<EFBFBD>w
bool Global::bManageNodes = true; bool Global::bManageNodes = true;
bool Global::bDecompressDDS = false; // czy programowa dekompresja DDS bool Global::bDecompressDDS = false; // czy programowa dekompresja DDS
// parametry do kalibracji // parametry do kalibracji
// kolejno wspó³czynniki dla potêg 0, 1, 2, 3 wartoœci odczytanej z urz¹dzenia // kolejno wsp<EFBFBD><EFBFBD>czynniki dla pot<EFBFBD>g 0, 1, 2, 3 warto<EFBFBD>ci odczytanej z urz<EFBFBD>dzenia
double Global::fCalibrateIn[6][6] = {{0, 1, 0, 0, 0, 0}, double Global::fCalibrateIn[6][6] = {{0, 1, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0},
@@ -176,14 +176,25 @@ double Global::fCalibrateOut[7][6] = {{0, 1, 0, 0, 0, 0},
double Global::fCalibrateOutMax[7] = {0, 0, 0, 0, 0, 0, 0}; double Global::fCalibrateOutMax[7] = {0, 0, 0, 0, 0, 0, 0};
int Global::iCalibrateOutDebugInfo = -1; int Global::iCalibrateOutDebugInfo = -1;
int Global::iPoKeysPWM[7] = {0, 1, 2, 3, 4, 5, 6}; int Global::iPoKeysPWM[7] = {0, 1, 2, 3, 4, 5, 6};
// parametry przejœciowe (do usuniêcia) // parametry przej<EFBFBD>ciowe (do usuni<EFBFBD>cia)
// bool Global::bTimeChange=false; //Ra: ZiomalCl wy³¹czy³ star¹ wersjê nocy // bool Global::bTimeChange=false; //Ra: ZiomalCl wy<EFBFBD><EFBFBD>czy<EFBFBD> star<EFBFBD> wersj<EFBFBD> nocy
// bool Global::bRenderAlpha=true; //Ra: wywali³am tê flagê // bool Global::bRenderAlpha=true; //Ra: wywali<EFBFBD>am t<EFBFBD> flag<EFBFBD>
bool Global::bnewAirCouplers = true; bool Global::bnewAirCouplers = true;
bool Global::bDoubleAmbient = false; // podwójna jasnoœæ ambient bool Global::bDoubleAmbient = false; // podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
double Global::fTimeSpeed = 1.0; // przyspieszenie czasu, zmienna do testów double Global::fTimeSpeed = 1.0; // przyspieszenie czasu, zmienna do test<EFBFBD>w
bool Global::bHideConsole = false; // hunter-271211: ukrywanie konsoli bool Global::bHideConsole = false; // hunter-271211: ukrywanie konsoli
int Global::iBpp = 32; // chyba ju¿ nie u¿ywa siê kart, na których 16bpp coœ poprawi int Global::iBpp = 32; // chyba ju<EFBFBD> nie u<EFBFBD>ywa si<EFBFBD> kart, na kt<EFBFBD>rych 16bpp co<EFBFBD> poprawi
// maciek001: konfiguracja wst<73>pna portu COM
bool Global::bMWDdebugEnable = false;
unsigned long int Global::iMWDBaudrate = 500000;
AnsiString Global::sMWDPortId = "COM1"; // nazwa portu z kt<6B>rego korzystamy - na razie nie dzia<69>a
bool Global::bMWDBreakEnable = false; // zmieni<6E> na FALSE!!! jak ju<6A> b<>dzie dzia<69>a<EFBFBD> wczytywanie z *.ini
double Global::fMWDAnalogCalib[4][3] = {{1023, 0, 1023},{1023, 0, 1023},{1023, 0, 1023},{1023, 0, 1023}}; // warto<74><6F> max potencjometru, warto<74><6F> min potencjometru, rozdzielczo<7A><6F> (max. warto<74><6F> jaka mo<6D>e by<62> -1)
double Global::fMWDzg[2] = {0.9, 1023};
double Global::fMWDpg[2] = {0.8, 1023};
double Global::fMWDph[2] = {0.6, 1023};
double Global::fMWDvolt[2] = {4000, 1023};
double Global::fMWDamp[2] = {800, 1023};
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -205,8 +216,8 @@ void Global::LoadIniFile(std::string asFileName)
{ {
for ( int i = 0; i < 10; ++i) for ( int i = 0; i < 10; ++i)
{ // zerowanie pozycji kamer { // zerowanie pozycji kamer
pFreeCameraInit[i] = vector3(0, 0, 0); // wspó³rzêdne w scenerii pFreeCameraInit[i] = vector3(0, 0, 0); // wsp<EFBFBD><EFBFBD>rz<EFBFBD>dne w scenerii
pFreeCameraInitAngle[i] = vector3(0, 0, 0); // k¹ty obrotu w radianach pFreeCameraInitAngle[i] = vector3(0, 0, 0); // k<EFBFBD>ty obrotu w radianach
} }
cParser parser( asFileName, cParser::buffer_FILE ); cParser parser( asFileName, cParser::buffer_FILE );
ConfigParse( parser ); ConfigParse( parser );
@@ -308,7 +319,7 @@ void Global::ConfigParse(cParser &Parser) {
>> Global::fMouseYScale; >> Global::fMouseYScale;
} }
else if( token == "enabletraction" ) { else if( token == "enabletraction" ) {
// Winger 040204 - 'zywe' patyki dostosowujace sie do trakcji; Ra 2014-03: teraz ³amanie // Winger 040204 - 'zywe' patyki dostosowujace sie do trakcji; Ra 2014-03: teraz <EFBFBD>amanie
Parser.getTokens(); Parser >> token; Parser.getTokens(); Parser >> token;
Global::bEnableTraction = ( token == "yes" ); Global::bEnableTraction = ( token == "yes" );
} }
@@ -317,14 +328,14 @@ void Global::ConfigParse(cParser &Parser) {
Parser.getTokens(); Parser >> token; Parser.getTokens(); Parser >> token;
Global::bLoadTraction = ( token == "yes" ); Global::bLoadTraction = ( token == "yes" );
} }
else if( token == "friction" ) { // mno¿nik tarcia - KURS90 else if( token == "friction" ) { // mno<EFBFBD>nik tarcia - KURS90
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::fFriction; Parser >> Global::fFriction;
} }
else if( token == "livetraction" ) { else if( token == "livetraction" ) {
// Winger 160404 - zaleznosc napiecia loka od trakcji; // Winger 160404 - zaleznosc napiecia loka od trakcji;
// Ra 2014-03: teraz pr¹d przy braku sieci // Ra 2014-03: teraz pr<EFBFBD>d przy braku sieci
Parser.getTokens(); Parser >> token; Parser.getTokens(); Parser >> token;
Global::bLiveTraction = ( token == "yes" ); Global::bLiveTraction = ( token == "yes" );
} }
@@ -347,7 +358,7 @@ void Global::ConfigParse(cParser &Parser) {
// ShaXbee - domyslne rozszerzenie tekstur // ShaXbee - domyslne rozszerzenie tekstur
Parser.getTokens(); Parser >> token; Parser.getTokens(); Parser >> token;
if( token == "tga" ) { if( token == "tga" ) {
// domyœlnie od TGA // domy<EFBFBD>lnie od TGA
Global::szDefaultExt = Global::szTexturesTGA; Global::szDefaultExt = Global::szTexturesTGA;
} }
} }
@@ -411,7 +422,7 @@ void Global::ConfigParse(cParser &Parser) {
else { Global::iMaxTextureSize = 16384; } else { Global::iMaxTextureSize = 16384; }
} }
else if( token == "doubleambient" ) { else if( token == "doubleambient" ) {
// podwójna jasnoœæ ambient // podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
Parser.getTokens(); Parser >> token; Parser.getTokens(); Parser >> token;
Global::bDoubleAmbient = ( token == "yes" ); Global::bDoubleAmbient = ( token == "yes" );
} }
@@ -422,14 +433,14 @@ void Global::ConfigParse(cParser &Parser) {
if( Global::fMoveLight == 0.f ) { // pobranie daty z systemu if( Global::fMoveLight == 0.f ) { // pobranie daty z systemu
std::time_t timenow = std::time( 0 ); std::time_t timenow = std::time( 0 );
std::tm *localtime = std::localtime( &timenow ); std::tm *localtime = std::localtime( &timenow );
Global::fMoveLight = localtime->tm_yday + 1; // numer bie¿¹cego dnia w roku Global::fMoveLight = localtime->tm_yday + 1; // numer bie<EFBFBD><EFBFBD>cego dnia w roku
} }
if( Global::fMoveLight > 0.f ) // tu jest nadal zwiêkszone o 1 if( Global::fMoveLight > 0.f ) // tu jest nadal zwi<EFBFBD>kszone o 1
{ // obliczenie deklinacji wg: { // obliczenie deklinacji wg:
// http://naturalfrequency.com/Tregenza_Sharples/Daylight_Algorithms/algorithm_1_11.htm // http://naturalfrequency.com/Tregenza_Sharples/Daylight_Algorithms/algorithm_1_11.htm
// Spencer J W Fourier series representation of the position of the sun Search 2 (5) // Spencer J W Fourier series representation of the position of the sun Search 2 (5)
// 172 (1971) // 172 (1971)
Global::fMoveLight = M_PI / 182.5 * ( Global::fMoveLight - 1.0 ); // numer dnia w postaci k¹ta Global::fMoveLight = M_PI / 182.5 * ( Global::fMoveLight - 1.0 ); // numer dnia w postaci k<EFBFBD>ta
fSunDeclination = 0.006918 - 0.3999120 * std::cos( fMoveLight ) + fSunDeclination = 0.006918 - 0.3999120 * std::cos( fMoveLight ) +
0.0702570 * std::sin( fMoveLight ) - 0.0067580 * std::cos( 2 * fMoveLight ) + 0.0702570 * std::sin( fMoveLight ) - 0.0067580 * std::cos( 2 * fMoveLight ) +
0.0009070 * std::sin( 2 * fMoveLight ) - 0.0009070 * std::sin( 2 * fMoveLight ) -
@@ -437,12 +448,12 @@ void Global::ConfigParse(cParser &Parser) {
} }
} }
else if( token == "smoothtraction" ) { else if( token == "smoothtraction" ) {
// podwójna jasnoœæ ambient // podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
Parser.getTokens(); Parser >> token; Parser.getTokens(); Parser >> token;
Global::bSmoothTraction = ( token == "yes" ); Global::bSmoothTraction = ( token == "yes" );
} }
else if( token == "timespeed" ) { else if( token == "timespeed" ) {
// przyspieszenie czasu, zmienna do testów // przyspieszenie czasu, zmienna do test<EFBFBD>w
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::fTimeSpeed; Parser >> Global::fTimeSpeed;
} }
@@ -457,12 +468,12 @@ void Global::ConfigParse(cParser &Parser) {
Global::bGlutFont = ( token == "yes" ); Global::bGlutFont = ( token == "yes" );
} }
else if( token == "latitude" ) { else if( token == "latitude" ) {
// szerokoϾ geograficzna // szeroko<EFBFBD><EFBFBD> geograficzna
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::fLatitudeDeg; Parser >> Global::fLatitudeDeg;
} }
else if( token == "convertmodels" ) { else if( token == "convertmodels" ) {
// tworzenie plików binarnych // tworzenie plik<EFBFBD>w binarnych
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::iConvertModels; Parser >> Global::iConvertModels;
} }
@@ -472,12 +483,12 @@ void Global::ConfigParse(cParser &Parser) {
Global::bInactivePause = ( token == "yes" ); Global::bInactivePause = ( token == "yes" );
} }
else if( token == "slowmotion" ) { else if( token == "slowmotion" ) {
// tworzenie plików binarnych // tworzenie plik<EFBFBD>w binarnych
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::iSlowMotionMask; Parser >> Global::iSlowMotionMask;
} }
else if( token == "modifytga" ) { else if( token == "modifytga" ) {
// czy korygowaæ pliki TGA dla szybszego wczytywania // czy korygowa<EFBFBD> pliki TGA dla szybszego wczytywania
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::iModifyTGA; Parser >> Global::iModifyTGA;
} }
@@ -492,12 +503,12 @@ void Global::ConfigParse(cParser &Parser) {
Global::bOldSmudge = ( token == "yes" ); Global::bOldSmudge = ( token == "yes" );
} }
else if( token == "rollfix" ) { else if( token == "rollfix" ) {
// Ra: poprawianie przechy³ki, aby wewnêtrzna szyna by³a "pozioma" // Ra: poprawianie przechy<EFBFBD>ki, aby wewn<EFBFBD>trzna szyna by<EFBFBD>a "pozioma"
Parser.getTokens(); Parser >> token; Parser.getTokens(); Parser >> token;
Global::bRollFix = ( token == "yes" ); Global::bRollFix = ( token == "yes" );
} }
else if( token == "fpsaverage" ) { else if( token == "fpsaverage" ) {
// oczekiwana wartosæ FPS // oczekiwana wartos<EFBFBD> FPS
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::fFpsAverage; Parser >> Global::fFpsAverage;
} }
@@ -507,76 +518,76 @@ void Global::ConfigParse(cParser &Parser) {
Parser >> Global::fFpsDeviation; Parser >> Global::fFpsDeviation;
} }
else if( token == "fpsradiusmax" ) { else if( token == "fpsradiusmax" ) {
// maksymalny promieñ renderowania // maksymalny promie<EFBFBD> renderowania
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::fFpsRadiusMax; Parser >> Global::fFpsRadiusMax;
} }
else if(token == "calibratein"){ else if(token == "calibratein"){
// parametry kalibracji wejϾ // parametry kalibracji wej<EFBFBD><EFBFBD>
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
int in; Parser >> in; int in; Parser >> in;
if( ( in < 0 ) || ( in > 5 ) ) { if( ( in < 0 ) || ( in > 5 ) ) {
in = 5; // na ostatni, bo i tak trzeba pomin¹æ wartoœci in = 5; // na ostatni, bo i tak trzeba pomin<EFBFBD><EFBFBD> warto<EFBFBD>ci
} }
Parser.getTokens( 4, false ); Parser.getTokens( 4, false );
Parser Parser
>> Global::fCalibrateIn[ in ][ 0 ] // wyraz wolny >> Global::fCalibrateIn[ in ][ 0 ] // wyraz wolny
>> Global::fCalibrateIn[ in ][ 1 ] // mno¿nik >> Global::fCalibrateIn[ in ][ 1 ] // mno<EFBFBD>nik
>> Global::fCalibrateIn[ in ][ 2 ] // mno¿nik dla kwadratu >> Global::fCalibrateIn[ in ][ 2 ] // mno<EFBFBD>nik dla kwadratu
>> Global::fCalibrateIn[ in ][ 3 ]; // mno¿nik dla szeœcianu >> Global::fCalibrateIn[ in ][ 3 ]; // mno<EFBFBD>nik dla sze<EFBFBD>cianu
Global::fCalibrateIn[ in ][ 4 ] = 0.0; // mno¿nik 4 potêgi Global::fCalibrateIn[ in ][ 4 ] = 0.0; // mno<EFBFBD>nik 4 pot<EFBFBD>gi
Global::fCalibrateIn[ in ][ 5 ] = 0.0; // mno¿nik 5 potêgi Global::fCalibrateIn[ in ][ 5 ] = 0.0; // mno<EFBFBD>nik 5 pot<EFBFBD>gi
} }
else if(token == "calibrate5din"){ else if(token == "calibrate5din"){
// parametry kalibracji wejϾ // parametry kalibracji wej<EFBFBD><EFBFBD>
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
int in; Parser >> in; int in; Parser >> in;
if( ( in < 0 ) || ( in > 5 ) ) { if( ( in < 0 ) || ( in > 5 ) ) {
in = 5; // na ostatni, bo i tak trzeba pomin¹æ wartoœci in = 5; // na ostatni, bo i tak trzeba pomin<EFBFBD><EFBFBD> warto<EFBFBD>ci
} }
Parser.getTokens( 6, false ); Parser.getTokens( 6, false );
Parser Parser
>> Global::fCalibrateIn[ in ][ 0 ] // wyraz wolny >> Global::fCalibrateIn[ in ][ 0 ] // wyraz wolny
>> Global::fCalibrateIn[ in ][ 1 ] // mno¿nik >> Global::fCalibrateIn[ in ][ 1 ] // mno<EFBFBD>nik
>> Global::fCalibrateIn[ in ][ 2 ] // mno¿nik dla kwadratu >> Global::fCalibrateIn[ in ][ 2 ] // mno<EFBFBD>nik dla kwadratu
>> Global::fCalibrateIn[ in ][ 3 ] // mno¿nik dla szeœcianu >> Global::fCalibrateIn[ in ][ 3 ] // mno<EFBFBD>nik dla sze<EFBFBD>cianu
>> Global::fCalibrateIn[ in ][ 4 ] // mno¿nik 4 potêgi >> Global::fCalibrateIn[ in ][ 4 ] // mno<EFBFBD>nik 4 pot<EFBFBD>gi
>> Global::fCalibrateIn[ in ][ 5 ]; // mno¿nik 5 potêgi >> Global::fCalibrateIn[ in ][ 5 ]; // mno<EFBFBD>nik 5 pot<EFBFBD>gi
} }
else if(token == "calibrateout"){ else if(token == "calibrateout"){
// parametry kalibracji wyjϾ // parametry kalibracji wyj<EFBFBD><EFBFBD>
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
int out; Parser >> out; int out; Parser >> out;
if( ( out < 0 ) || ( out > 6 ) ) { if( ( out < 0 ) || ( out > 6 ) ) {
out = 6; // na ostatni, bo i tak trzeba pomin¹æ wartoœci out = 6; // na ostatni, bo i tak trzeba pomin<EFBFBD><EFBFBD> warto<EFBFBD>ci
} }
Parser.getTokens( 4, false ); Parser.getTokens( 4, false );
Parser Parser
>> Global::fCalibrateOut[ out ][ 0 ] // wyraz wolny >> Global::fCalibrateOut[ out ][ 0 ] // wyraz wolny
>> Global::fCalibrateOut[ out ][ 1 ] // mno¿nik liniowy >> Global::fCalibrateOut[ out ][ 1 ] // mno<EFBFBD>nik liniowy
>> Global::fCalibrateOut[ out ][ 2 ] // mno¿nik dla kwadratu >> Global::fCalibrateOut[ out ][ 2 ] // mno<EFBFBD>nik dla kwadratu
>> Global::fCalibrateOut[ out ][ 3 ]; // mno¿nik dla szeœcianu >> Global::fCalibrateOut[ out ][ 3 ]; // mno<EFBFBD>nik dla sze<EFBFBD>cianu
Global::fCalibrateOut[ out ][ 4 ] = 0.0; // mno¿nik dla 4 potêgi Global::fCalibrateOut[ out ][ 4 ] = 0.0; // mno<EFBFBD>nik dla 4 pot<EFBFBD>gi
Global::fCalibrateOut[ out ][ 5 ] = 0.0; // mno¿nik dla 5 potêgi Global::fCalibrateOut[ out ][ 5 ] = 0.0; // mno<EFBFBD>nik dla 5 pot<EFBFBD>gi
} }
else if(token == "calibrate5dout"){ else if(token == "calibrate5dout"){
// parametry kalibracji wyjϾ // parametry kalibracji wyj<EFBFBD><EFBFBD>
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
int out; Parser >> out; int out; Parser >> out;
if( ( out < 0 ) || ( out > 6 ) ) { if( ( out < 0 ) || ( out > 6 ) ) {
out = 6; // na ostatni, bo i tak trzeba pomin¹æ wartoœci out = 6; // na ostatni, bo i tak trzeba pomin<EFBFBD><EFBFBD> warto<EFBFBD>ci
} }
Parser.getTokens( 6, false ); Parser.getTokens( 6, false );
Parser Parser
>> Global::fCalibrateOut[ out ][ 0 ] // wyraz wolny >> Global::fCalibrateOut[ out ][ 0 ] // wyraz wolny
>> Global::fCalibrateOut[ out ][ 1 ] // mno¿nik liniowy >> Global::fCalibrateOut[ out ][ 1 ] // mno<EFBFBD>nik liniowy
>> Global::fCalibrateOut[ out ][ 2 ] // mno¿nik dla kwadratu >> Global::fCalibrateOut[ out ][ 2 ] // mno<EFBFBD>nik dla kwadratu
>> Global::fCalibrateOut[ out ][ 3 ] // mno¿nik dla szeœcianu >> Global::fCalibrateOut[ out ][ 3 ] // mno<EFBFBD>nik dla sze<EFBFBD>cianu
>> Global::fCalibrateOut[ out ][ 4 ] // mno¿nik dla 4 potêgi >> Global::fCalibrateOut[ out ][ 4 ] // mno<EFBFBD>nik dla 4 pot<EFBFBD>gi
>> Global::fCalibrateOut[ out ][ 5 ]; // mno¿nik dla 5 potêgi >> Global::fCalibrateOut[ out ][ 5 ]; // mno<EFBFBD>nik dla 5 pot<EFBFBD>gi
} }
else if(token == "calibrateoutmaxvalues"){ else if(token == "calibrateoutmaxvalues"){
// maksymalne wartoœci jakie mo¿na wyœwietliæ na mierniku // maksymalne warto<EFBFBD>ci jakie mo<EFBFBD>na wy<EFBFBD>wietli<EFBFBD> na mierniku
Parser.getTokens( 7, false ); Parser.getTokens( 7, false );
Parser Parser
>> Global::fCalibrateOutMax[ 0 ] >> Global::fCalibrateOutMax[ 0 ]
@@ -588,12 +599,12 @@ void Global::ConfigParse(cParser &Parser) {
>> Global::fCalibrateOutMax[ 6 ]; >> Global::fCalibrateOutMax[ 6 ];
} }
else if( token == "calibrateoutdebuginfo" ) { else if( token == "calibrateoutdebuginfo" ) {
// wyjœcie z info o przebiegu kalibracji // wyj<EFBFBD>cie z info o przebiegu kalibracji
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::iCalibrateOutDebugInfo; Parser >> Global::iCalibrateOutDebugInfo;
} }
else if( token == "pwm" ) { else if( token == "pwm" ) {
// zmiana numerów wyjœæ PWM // zmiana numer<EFBFBD>w wyj<EFBFBD><EFBFBD> PWM
Parser.getTokens( 2, false ); Parser.getTokens( 2, false );
int pwm_out, pwm_no; int pwm_out, pwm_no;
Parser Parser
@@ -607,27 +618,27 @@ void Global::ConfigParse(cParser &Parser) {
Parser >> Global::fBrakeStep; Parser >> Global::fBrakeStep;
} }
else if( token == "joinduplicatedevents" ) { else if( token == "joinduplicatedevents" ) {
// czy grupowaæ eventy o tych samych nazwach // czy grupowa<EFBFBD> eventy o tych samych nazwach
Parser.getTokens(); Parser >> token; Parser.getTokens(); Parser >> token;
Global::bJoinEvents = ( token == "yes" ); Global::bJoinEvents = ( token == "yes" );
} }
else if( token == "hiddenevents" ) { else if( token == "hiddenevents" ) {
// czy ³¹czyæ eventy z torami poprzez nazwê toru // czy <EFBFBD><EFBFBD>czy<EFBFBD> eventy z torami poprzez nazw<EFBFBD> toru
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::iHiddenEvents; Parser >> Global::iHiddenEvents;
} }
else if( token == "pause" ) { else if( token == "pause" ) {
// czy po wczytaniu ma byæ pauza? // czy po wczytaniu ma by<EFBFBD> pauza?
Parser.getTokens(); Parser >> token; Parser.getTokens(); Parser >> token;
iPause |= ( token == "yes" ? 1 : 0 ); iPause |= ( token == "yes" ? 1 : 0 );
} }
else if( token == "lang" ) { else if( token == "lang" ) {
// domyœlny jêzyk - http://tools.ietf.org/html/bcp47 // domy<EFBFBD>lny j<EFBFBD>zyk - http://tools.ietf.org/html/bcp47
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::asLang; Parser >> Global::asLang;
} }
else if( token == "opengl" ) { else if( token == "opengl" ) {
// deklarowana wersja OpenGL, ¿eby powstrzymaæ b³êdy // deklarowana wersja OpenGL, <EFBFBD>eby powstrzyma<EFBFBD> b<EFBFBD><EFBFBD>dy
Parser.getTokens( 1, false ); Parser.getTokens( 1, false );
Parser >> Global::fOpenGL; Parser >> Global::fOpenGL;
} }
@@ -644,50 +655,99 @@ void Global::ConfigParse(cParser &Parser) {
>> Global::Background[ 1 ] // g >> Global::Background[ 1 ] // g
>> Global::Background[ 2 ];// b >> Global::Background[ 2 ];// b
} }
// maciek001: ustawienia MWD
else if (str == AnsiString("mwddebug")){ // czy w<><77>czy<7A> obs<62>ug<75> hamulc<6C>w
bMWDdebugEnable = (GetNextSymbol().LowerCase() == AnsiString("yes"));
}else if (str == AnsiString("comportname"))
{
sMWDPortId = GetNextSymbol().LowerCase();
if (bMWDdebugEnable) WriteLog("PortName " + AnsiString(sMWDPortId));
}else if (str == AnsiString("mwdbaudrate")){ // pobierz pr<70>dko<6B><6F> transmisji danych
iMWDBaudrate = GetNextSymbol().ToInt();
if (bMWDdebugEnable) WriteLog("PortName " + AnsiString(iMWDBaudrate));
}else if (str == AnsiString("mwdbreakenable")){ // czy w<><77>czy<7A> obs<62>ug<75> hamulc<6C>w
bMWDBreakEnable = (GetNextSymbol().LowerCase() == AnsiString("yes"));
}else if (str == AnsiString("mwdinputenable")){
bMWDInputDataEnable = (GetNextSymbol().LowerCase() == AnsiString("yes"));
}else if(str == AnsiString("mwdbreak")) // warto<74><6F> max dla potencjometru hamulca zasadniczego
{
i = GetNextSymbol().ToIntDef(-1); // numer wej<65>cia
if ((i >= 0) || (i <= 1)){
fMWDAnalogCalib[i][0] = GetNextSymbol().ToDouble(); // max -> 2^16 -1
fMWDAnalogCalib[i][1] = GetNextSymbol().ToDouble(); // min -> 0
fMWDAnalogCalib[i][2] = GetNextSymbol().ToDouble(); // rozdzielczo<7A><6F> -> 255 maksymalna mo<6D>liwa warto<74><6F> z ADC
if (bMWDdebugEnable) WriteLog("Break settings " + AnsiString(i) + AnsiString(": ") + AnsiString(fMWDAnalogCalib[i][0]) + AnsiString(" ") + AnsiString(fMWDAnalogCalib[i][1]) + AnsiString(" ") + AnsiString(fMWDAnalogCalib[i][2]));
}
}
else if(str == AnsiString("mwdzbiornikglowny")){
fMWDzg[0] = GetNextSymbol().ToDouble();
fMWDzg[1] = GetNextSymbol().ToDouble();
if (bMWDdebugEnable) WriteLog("AirTank settings: " + AnsiString(fMWDzg[0]) + AnsiString(" ") + AnsiString(fMWDzg[1]));
}
else if(str == AnsiString("mwdprzewodglowny")){
fMWDpg[0] = GetNextSymbol().ToDouble();
fMWDpg[1] = GetNextSymbol().ToDouble();
if (bMWDdebugEnable) WriteLog("MainAirPipe settings: " + AnsiString(fMWDpg[0]) + AnsiString(" ") + AnsiString(fMWDpg[1]));
}
else if(str == AnsiString("mwdcylinderhamulcowy")){
fMWDph[0] = GetNextSymbol().ToDouble();
fMWDph[1] = GetNextSymbol().ToDouble();
if (bMWDdebugEnable) WriteLog("AirPipe settings: " + AnsiString(fMWDph[0]) + AnsiString(" ") + AnsiString(fMWDph[1]));
}
else if(str == AnsiString("mwdwoltomierzwn")){
fMWDvolt[0] = GetNextSymbol().ToDouble();
fMWDvolt[1] = GetNextSymbol().ToDouble();
if (bMWDdebugEnable) WriteLog("Volt settings: " + AnsiString(fMWDvolt[0]) + AnsiString(" ") + AnsiString(fMWDvolt[1]));
}
else if(str == AnsiString("mwdamperomierzwn")){
fMWDamp[0] = GetNextSymbol().ToDouble();
fMWDamp[1] = GetNextSymbol().ToDouble();
if (bMWDdebugEnable) WriteLog("Amp settings: " + AnsiString(fMWDamp[0]) + AnsiString(" ") + AnsiString(fMWDamp[1]));
}
} }
while( ( token != "" ) while( ( token != "" )
&& ( token != "endconfig" ) ); //(!Parser->EndOfFile) && ( token != "endconfig" ) ); //(!Parser->EndOfFile)
// na koniec trochê zale¿noœci // na koniec troch<EFBFBD> zale<EFBFBD>no<EFBFBD>ci
if (!bLoadTraction) // wczytywanie drutów i s³upów if (!bLoadTraction) // wczytywanie drut<EFBFBD>w i s<EFBFBD>up<EFBFBD>w
{ // tutaj wy³¹czenie, bo mog¹ nie byæ zdefiniowane w INI { // tutaj wy<EFBFBD><EFBFBD>czenie, bo mog<EFBFBD> nie by<EFBFBD> zdefiniowane w INI
bEnableTraction = false; // false = pantograf siê nie po³amie bEnableTraction = false; // false = pantograf si<EFBFBD> nie po<EFBFBD>amie
bLiveTraction = false; // false = pantografy zawsze zbieraj¹ 95% MaxVoltage bLiveTraction = false; // false = pantografy zawsze zbieraj<EFBFBD> 95% MaxVoltage
} }
// if (fMoveLight>0) bDoubleAmbient=false; //wtedy tylko jedno œwiat³o ruchome // if (fMoveLight>0) bDoubleAmbient=false; //wtedy tylko jedno <EFBFBD>wiat<EFBFBD>o ruchome
// if (fOpenGL<1.3) iMultisampling=0; //mo¿na by z góry wy³¹czyæ, ale nie mamy jeszcze fOpenGL // if (fOpenGL<1.3) iMultisampling=0; //mo<EFBFBD>na by z g<EFBFBD>ry wy<EFBFBD><EFBFBD>czy<EFBFBD>, ale nie mamy jeszcze fOpenGL
if (iMultisampling) if (iMultisampling)
{ // antyaliasing ca³oekranowy wy³¹cza rozmywanie drutów { // antyaliasing ca<EFBFBD>oekranowy wy<EFBFBD><EFBFBD>cza rozmywanie drut<EFBFBD>w
bSmoothTraction = false; bSmoothTraction = false;
} }
if (iMultiplayer > 0) if (iMultiplayer > 0)
{ {
bInactivePause = false; // okno "w tle" nie mo¿e pauzowaæ, jeœli w³¹czona komunikacja bInactivePause = false; // okno "w tle" nie mo<EFBFBD>e pauzowa<EFBFBD>, je<EFBFBD>li w<EFBFBD><EFBFBD>czona komunikacja
// pauzowanie jest zablokowane dla (iMultiplayer&2)>0, wiêc iMultiplayer=1 da siê zapauzowaæ // pauzowanie jest zablokowane dla (iMultiplayer&2)>0, wi<EFBFBD>c iMultiplayer=1 da si<EFBFBD> zapauzowa<EFBFBD>
// (tryb instruktora) // (tryb instruktora)
} }
fFpsMin = fFpsAverage - fFpsMin = fFpsAverage -
fFpsDeviation; // dolna granica FPS, przy której promieñ scenerii bêdzie zmniejszany fFpsDeviation; // dolna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zmniejszany
fFpsMax = fFpsAverage + fFpsMax = fFpsAverage +
fFpsDeviation; // górna granica FPS, przy której promieñ scenerii bêdzie zwiêkszany fFpsDeviation; // g<EFBFBD>rna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zwi<EFBFBD>kszany
if (iPause) if (iPause)
iTextMode = VK_F1; // jak pauza, to pokazaæ zegar iTextMode = VK_F1; // jak pauza, to pokaza<EFBFBD> zegar
/* this won't execute anymore with the old parser removed /* this won't execute anymore with the old parser removed
// TBD: remove, or launch depending on passed flag? // TBD: remove, or launch depending on passed flag?
if (qp) if (qp)
{ // to poni¿ej wykonywane tylko raz, jedynie po wczytaniu eu07.ini { // to poni<EFBFBD>ej wykonywane tylko raz, jedynie po wczytaniu eu07.ini
Console::ModeSet(iFeedbackMode, iFeedbackPort); // tryb pracy konsoli sterowniczej Console::ModeSet(iFeedbackMode, iFeedbackPort); // tryb pracy konsoli sterowniczej
iFpsRadiusMax = 0.000025 * fFpsRadiusMax * iFpsRadiusMax = 0.000025 * fFpsRadiusMax *
fFpsRadiusMax; // maksymalny promieñ renderowania 3000.0 -> 225 fFpsRadiusMax; // maksymalny promie<EFBFBD> renderowania 3000.0 -> 225
if (iFpsRadiusMax > 400) if (iFpsRadiusMax > 400)
iFpsRadiusMax = 400; iFpsRadiusMax = 400;
if (fDistanceFactor > 1.0) if (fDistanceFactor > 1.0)
{ // dla 1.0 specjalny tryb bez przeliczania { // dla 1.0 specjalny tryb bez przeliczania
fDistanceFactor = fDistanceFactor =
iWindowHeight / iWindowHeight /
fDistanceFactor; // fDistanceFactor>1.0 dla rozdzielczoœci wiêkszych ni¿ bazowa fDistanceFactor; // fDistanceFactor>1.0 dla rozdzielczo<EFBFBD>ci wi<EFBFBD>kszych ni<EFBFBD> bazowa
fDistanceFactor *= fDistanceFactor *=
(iMultisampling + 1.0) * (iMultisampling + 1.0) *
fDistanceFactor; // do kwadratu, bo wiêkszoœæ odleg³oœci to ich kwadraty fDistanceFactor; // do kwadratu, bo wi<EFBFBD>kszo<EFBFBD><EFBFBD> odleg<EFBFBD>o<EFBFBD>ci to ich kwadraty
} }
} }
*/ */
@@ -697,7 +757,7 @@ void Global::InitKeys(std::string asFileName)
{ {
// if (FileExists(asFileName)) // if (FileExists(asFileName))
// { // {
// Error("Chwilowo plik keys.ini nie jest obs³ugiwany. £adujê standardowe // Error("Chwilowo plik keys.ini nie jest obs<EFBFBD>ugiwany. <EFBFBD>aduj<EFBFBD> standardowe
// ustawienia.\nKeys.ini file is temporarily not functional, loading default keymap..."); // ustawienia.\nKeys.ini file is temporarily not functional, loading default keymap...");
/* TQueryParserComp *Parser; /* TQueryParserComp *Parser;
Parser=new TQueryParserComp(NULL); Parser=new TQueryParserComp(NULL);
@@ -830,7 +890,7 @@ void Global::SetCameraPosition(vector3 pNewCameraPosition)
} }
void Global::SetCameraRotation(double Yaw) void Global::SetCameraRotation(double Yaw)
{ // ustawienie bezwzglêdnego kierunku kamery z korekcj¹ do przedzia³u <-M_PI,M_PI> { // ustawienie bezwzgl<EFBFBD>dnego kierunku kamery z korekcj<EFBFBD> do przedzia<EFBFBD>u <-M_PI,M_PI>
pCameraRotation = Yaw; pCameraRotation = Yaw;
while (pCameraRotation < -M_PI) while (pCameraRotation < -M_PI)
pCameraRotation += 2 * M_PI; pCameraRotation += 2 * M_PI;
@@ -840,7 +900,7 @@ void Global::SetCameraRotation(double Yaw)
} }
void Global::BindTexture(GLuint t) void Global::BindTexture(GLuint t)
{ // ustawienie aktualnej tekstury, tylko gdy siê zmienia { // ustawienie aktualnej tekstury, tylko gdy si<EFBFBD> zmienia
if (t != iTextureId) if (t != iTextureId)
{ {
iTextureId = t; iTextureId = t;
@@ -848,18 +908,18 @@ void Global::BindTexture(GLuint t)
}; };
void Global::TrainDelete(TDynamicObject *d) void Global::TrainDelete(TDynamicObject *d)
{ // usuniêcie pojazdu prowadzonego przez u¿ytkownika { // usuni<EFBFBD>cie pojazdu prowadzonego przez u<EFBFBD>ytkownika
if (pWorld) if (pWorld)
pWorld->TrainDelete(d); pWorld->TrainDelete(d);
}; };
TDynamicObject * Global::DynamicNearest() TDynamicObject * Global::DynamicNearest()
{ // ustalenie pojazdu najbli¿szego kamerze { // ustalenie pojazdu najbli<EFBFBD>szego kamerze
return pGround->DynamicNearest(pCamera->Pos); return pGround->DynamicNearest(pCamera->Pos);
}; };
TDynamicObject * Global::CouplerNearest() TDynamicObject * Global::CouplerNearest()
{ // ustalenie pojazdu najbli¿szego kamerze { // ustalenie pojazdu najbli<EFBFBD>szego kamerze
return pGround->CouplerNearest(pCamera->Pos); return pGround->CouplerNearest(pCamera->Pos);
}; };
@@ -870,7 +930,7 @@ bool Global::AddToQuery(TEvent *event, TDynamicObject *who)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool Global::DoEvents() bool Global::DoEvents()
{ // wywo³ywaæ czasem, ¿eby nie robi³ wra¿enia zawieszonego { // wywo<EFBFBD>ywa<EFBFBD> czasem, <EFBFBD>eby nie robi<EFBFBD> wra<EFBFBD>enia zawieszonego
MSG msg; MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{ {
@@ -885,146 +945,146 @@ bool Global::DoEvents()
TTranscripts::TTranscripts() TTranscripts::TTranscripts()
{ {
iCount = 0; // brak linijek do wyœwietlenia iCount = 0; // brak linijek do wy<EFBFBD>wietlenia
iStart = 0; // wype³niaæ od linijki 0 iStart = 0; // wype<EFBFBD>nia<EFBFBD> od linijki 0
for (int i = 0; i < MAX_TRANSCRIPTS; ++i) for (int i = 0; i < MAX_TRANSCRIPTS; ++i)
{ // to do konstruktora mo¿na by daæ { // to do konstruktora mo<EFBFBD>na by da<EFBFBD>
aLines[i].fHide = -1.0; // wolna pozycja (czas symulacji, 360.0 to doba) aLines[i].fHide = -1.0; // wolna pozycja (czas symulacji, 360.0 to doba)
aLines[i].iNext = -1; // nie ma kolejnej aLines[i].iNext = -1; // nie ma kolejnej
} }
fRefreshTime = 360.0; // wartoœc zaporowa fRefreshTime = 360.0; // warto<EFBFBD>c zaporowa
}; };
TTranscripts::~TTranscripts(){}; TTranscripts::~TTranscripts(){};
void TTranscripts::AddLine(char const *txt, float show, float hide, bool it) void TTranscripts::AddLine(char const *txt, float show, float hide, bool it)
{ // dodanie linii do tabeli, (show) i (hide) w [s] od aktualnego czasu { // dodanie linii do tabeli, (show) i (hide) w [s] od aktualnego czasu
if (show == hide) if (show == hide)
return; // komentarz jest ignorowany return; // komentarz jest ignorowany
show = Global::fTimeAngleDeg + show / 240.0; // jeœli doba to 360, to 1s bêdzie równe 1/240 show = Global::fTimeAngleDeg + show / 240.0; // je<EFBFBD>li doba to 360, to 1s b<EFBFBD>dzie r<EFBFBD>wne 1/240
hide = Global::fTimeAngleDeg + hide / 240.0; hide = Global::fTimeAngleDeg + hide / 240.0;
int i = iStart, j, k; // od czegoœ trzeba zacz¹æ int i = iStart, j, k; // od czego<EFBFBD> trzeba zacz<EFBFBD><EFBFBD>
while ((aLines[i].iNext >= 0) ? (aLines[aLines[i].iNext].fShow <= show) : while ((aLines[i].iNext >= 0) ? (aLines[aLines[i].iNext].fShow <= show) :
false) // póki nie koniec i wczeœniej puszczane false) // p<EFBFBD>ki nie koniec i wcze<EFBFBD>niej puszczane
i = aLines[i].iNext; // przejœcie do kolejnej linijki i = aLines[i].iNext; // przej<EFBFBD>cie do kolejnej linijki
//(i) wskazuje na liniê, po której nale¿y wstawiæ dany tekst, chyba ¿e //(i) wskazuje na lini<EFBFBD>, po kt<EFBFBD>rej nale<EFBFBD>y wstawi<EFBFBD> dany tekst, chyba <EFBFBD>e
while (txt ? *txt : false) while (txt ? *txt : false)
for (j = 0; j < MAX_TRANSCRIPTS; ++j) for (j = 0; j < MAX_TRANSCRIPTS; ++j)
if (aLines[j].fHide < 0.0) if (aLines[j].fHide < 0.0)
{ // znaleziony pierwszy wolny { // znaleziony pierwszy wolny
aLines[j].iNext = aLines[i].iNext; // dotychczasowy nastêpny bêdzie za nowym aLines[j].iNext = aLines[i].iNext; // dotychczasowy nast<EFBFBD>pny b<EFBFBD>dzie za nowym
if (aLines[iStart].fHide < 0.0) // jeœli tablica jest pusta if (aLines[iStart].fHide < 0.0) // je<EFBFBD>li tablica jest pusta
iStart = j; // fHide trzeba sprawdziæ przed ewentualnym nadpisaniem, gdy i=j=0 iStart = j; // fHide trzeba sprawdzi<EFBFBD> przed ewentualnym nadpisaniem, gdy i=j=0
else else
aLines[i].iNext = j; // a nowy bêdzie za tamtym wczeœniejszym aLines[i].iNext = j; // a nowy b<EFBFBD>dzie za tamtym wcze<EFBFBD>niejszym
aLines[j].fShow = show; // wyœwietlaæ od aLines[j].fShow = show; // wy<EFBFBD>wietla<EFBFBD> od
aLines[j].fHide = hide; // wyœwietlaæ do aLines[j].fHide = hide; // wy<EFBFBD>wietla<EFBFBD> do
aLines[j].bItalic = it; aLines[j].bItalic = it;
aLines[j].asText = std::string(txt); // bez sensu, wystarczy³by wskaŸnik aLines[j].asText = std::string(txt); // bez sensu, wystarczy<EFBFBD>by wska<EFBFBD>nik
if ((k = aLines[j].asText.find("|")) != std::string::npos) if ((k = aLines[j].asText.find("|")) != std::string::npos)
{ // jak jest podzia³ linijki na wiersze { // jak jest podzia<EFBFBD> linijki na wiersze
aLines[j].asText = aLines[j].asText.substr(0, k - 1); aLines[j].asText = aLines[j].asText.substr(0, k - 1);
txt += k; txt += k;
i = j; // kolejna linijka dopisywana bêdzie na koniec w³aœnie dodanej i = j; // kolejna linijka dopisywana b<EFBFBD>dzie na koniec w<EFBFBD>a<EFBFBD>nie dodanej
} }
else else
txt = NULL; // koniec dodawania txt = NULL; // koniec dodawania
if (fRefreshTime > show) // jeœli odœwie¿acz ustawiony jest na póŸniej if (fRefreshTime > show) // je<EFBFBD>li od<EFBFBD>wie<EFBFBD>acz ustawiony jest na p<EFBFBD><EFBFBD>niej
fRefreshTime = show; // to odœwie¿yæ wczeœniej fRefreshTime = show; // to od<EFBFBD>wie<EFBFBD>y<EFBFBD> wcze<EFBFBD>niej
break; // wiêcej ju¿ nic break; // wi<EFBFBD>cej ju<EFBFBD> nic
} }
}; };
void TTranscripts::Add(char const *txt, float len, bool backgorund) void TTranscripts::Add(char const *txt, float len, bool backgorund)
{ // dodanie tekstów, d³ugoœæ dŸwiêku, czy istotne { // dodanie tekst<EFBFBD>w, d<EFBFBD>ugo<EFBFBD><EFBFBD> d<EFBFBD>wi<EFBFBD>ku, czy istotne
if (!txt) if (!txt)
return; // pusty tekst return; // pusty tekst
int i = 0, j = int(0.5 + 10.0 * len); //[0.1s] int i = 0, j = int(0.5 + 10.0 * len); //[0.1s]
if (*txt == '[') if (*txt == '[')
{ // powinny byæ dwa nawiasy { // powinny by<EFBFBD> dwa nawiasy
while (*++txt ? *txt != ']' : false) while (*++txt ? *txt != ']' : false)
if ((*txt >= '0') && (*txt <= '9')) if ((*txt >= '0') && (*txt <= '9'))
i = 10 * i + int(*txt - '0'); // pierwsza liczba a¿ do ] i = 10 * i + int(*txt - '0'); // pierwsza liczba a<EFBFBD> do ]
if (*txt ? *++txt == '[' : false) if (*txt ? *++txt == '[' : false)
{ {
j = 0; // drugi nawias okreœla czas zakoñczenia wyœwietlania j = 0; // drugi nawias okre<EFBFBD>la czas zako<EFBFBD>czenia wy<EFBFBD>wietlania
while (*++txt ? *txt != ']' : false) while (*++txt ? *txt != ']' : false)
if ((*txt >= '0') && (*txt <= '9')) if ((*txt >= '0') && (*txt <= '9'))
j = 10 * j + int(*txt - '0'); // druga liczba a¿ do ] j = 10 * j + int(*txt - '0'); // druga liczba a<EFBFBD> do ]
if (*txt) if (*txt)
++txt; // pominiêcie drugiego ] ++txt; // pomini<EFBFBD>cie drugiego ]
} }
} }
AddLine(txt, 0.1 * i, 0.1 * j, false); AddLine(txt, 0.1 * i, 0.1 * j, false);
}; };
void TTranscripts::Update() void TTranscripts::Update()
{ // usuwanie niepotrzebnych (nie czêœciej ni¿ 10 razy na sekundê) { // usuwanie niepotrzebnych (nie cz<EFBFBD><EFBFBD>ciej ni<EFBFBD> 10 razy na sekund<EFBFBD>)
if (fRefreshTime > Global::fTimeAngleDeg) if (fRefreshTime > Global::fTimeAngleDeg)
return; // nie czas jeszcze na zmiany return; // nie czas jeszcze na zmiany
// czas odœwie¿enia mo¿na ustaliæ wg tabelki, kiedy coœ siê w niej zmienia // czas od<EFBFBD>wie<EFBFBD>enia mo<EFBFBD>na ustali<EFBFBD> wg tabelki, kiedy co<EFBFBD> si<EFBFBD> w niej zmienia
fRefreshTime = Global::fTimeAngleDeg + 360.0; // wartoϾ zaporowa fRefreshTime = Global::fTimeAngleDeg + 360.0; // warto<EFBFBD><EFBFBD> zaporowa
int i = iStart, j = -1; // od czegoœ trzeba zacz¹æ int i = iStart, j = -1; // od czego<EFBFBD> trzeba zacz<EFBFBD><EFBFBD>
bool change = false; // czy zmieniaæ napisy? bool change = false; // czy zmienia<EFBFBD> napisy?
do do
{ {
if (aLines[i].fHide >= 0.0) // o ile aktywne if (aLines[i].fHide >= 0.0) // o ile aktywne
if (aLines[i].fHide < Global::fTimeAngleDeg) if (aLines[i].fHide < Global::fTimeAngleDeg)
{ // gdy czas wyœwietlania up³yn¹³ { // gdy czas wy<EFBFBD>wietlania up<EFBFBD>yn<EFBFBD><EFBFBD>
aLines[i].fHide = -1.0; // teraz bêdzie woln¹ pozycj¹ aLines[i].fHide = -1.0; // teraz b<EFBFBD>dzie woln<EFBFBD> pozycj<EFBFBD>
if (i == iStart) if (i == iStart)
iStart = aLines[i].iNext >= 0 ? aLines[i].iNext : 0; // przestawienie pierwszego iStart = aLines[i].iNext >= 0 ? aLines[i].iNext : 0; // przestawienie pierwszego
else if (j >= 0) else if (j >= 0)
aLines[j].iNext = aLines[i].iNext; // usuniêcie ze œrodka aLines[j].iNext = aLines[i].iNext; // usuni<EFBFBD>cie ze <EFBFBD>rodka
change = true; change = true;
} }
else else
{ // gdy ma byæ pokazane { // gdy ma by<EFBFBD> pokazane
if (aLines[i].fShow > Global::fTimeAngleDeg) // bêdzie pokazane w przysz³oœci if (aLines[i].fShow > Global::fTimeAngleDeg) // b<EFBFBD>dzie pokazane w przysz<EFBFBD>o<EFBFBD>ci
if (fRefreshTime > aLines[i].fShow) // a nie ma nic wczeœniej if (fRefreshTime > aLines[i].fShow) // a nie ma nic wcze<EFBFBD>niej
fRefreshTime = aLines[i].fShow; fRefreshTime = aLines[i].fShow;
if (fRefreshTime > aLines[i].fHide) if (fRefreshTime > aLines[i].fHide)
fRefreshTime = aLines[i].fHide; fRefreshTime = aLines[i].fHide;
} }
// mo¿na by jeszcze wykrywaæ, które nowe maj¹ byæ pokazane // mo<EFBFBD>na by jeszcze wykrywa<EFBFBD>, kt<EFBFBD>re nowe maj<EFBFBD> by<EFBFBD> pokazane
j = i; j = i;
i = aLines[i].iNext; // kolejna linijka i = aLines[i].iNext; // kolejna linijka
} while (i >= 0); // póki po tablicy } while (i >= 0); // p<EFBFBD>ki po tablicy
change = true; // bo na razie nie ma warunku, ¿e coœ siê doda³o change = true; // bo na razie nie ma warunku, <EFBFBD>e co<EFBFBD> si<EFBFBD> doda<EFBFBD>o
if (change) if (change)
{ // aktualizacja linijek ekranowych { // aktualizacja linijek ekranowych
i = iStart; i = iStart;
j = -1; j = -1;
do do
{ {
if (aLines[i].fHide > 0.0) // jeœli nie ukryte if (aLines[i].fHide > 0.0) // je<EFBFBD>li nie ukryte
if (aLines[i].fShow < Global::fTimeAngleDeg) // to dodanie linijki do wyœwietlania if (aLines[i].fShow < Global::fTimeAngleDeg) // to dodanie linijki do wy<EFBFBD>wietlania
if (j < 5 - 1) // ograniczona liczba linijek if (j < 5 - 1) // ograniczona liczba linijek
Global::asTranscript[++j] = aLines[i].asText; // skopiowanie tekstu Global::asTranscript[++j] = aLines[i].asText; // skopiowanie tekstu
i = aLines[i].iNext; // kolejna linijka i = aLines[i].iNext; // kolejna linijka
} while (i >= 0); // póki po tablicy } while (i >= 0); // p<EFBFBD>ki po tablicy
for (++j; j < 5; ++j) for (++j; j < 5; ++j)
Global::asTranscript[j] = ""; // i czyszczenie nieu¿ywanych linijek Global::asTranscript[j] = ""; // i czyszczenie nieu<EFBFBD>ywanych linijek
} }
}; };
// Ra: tymczasowe rozwi¹zanie kwestii zagranicznych (czeskich) napisów // Ra: tymczasowe rozwi<EFBFBD>zanie kwestii zagranicznych (czeskich) napis<EFBFBD>w
char bezogonkowo[] = "E?,?\"_++?%S<STZZ?`'\"\".--??s>stzz" char bezogonkowo[] = "E?,?\"_++?%S<STZZ?`'\"\".--??s>stzz"
" ^^L$A|S^CS<--RZo±,l'uP.,as>L\"lz" "<EFBFBD>^^L$A|S^CS<--RZo<EFBFBD>,l'uP.,as>L\"lz"
"RAAAALCCCEEEEIIDDNNOOOOxRUUUUYTB" "RAAAALCCCEEEEIIDDNNOOOOxRUUUUYTB"
"raaaalccceeeeiiddnnoooo-ruuuuyt?"; "raaaalccceeeeiiddnnoooo-ruuuuyt?";
std::string Global::Bezogonkow(std::string str, bool _) std::string Global::Bezogonkow(std::string str, bool _)
{ // wyciêcie liter z ogonkami, bo OpenGL nie umie wyœwietliæ { // wyci<EFBFBD>cie liter z ogonkami, bo OpenGL nie umie wy<EFBFBD>wietli<EFBFBD>
for (unsigned int i = 1; i < str.length(); ++i) for (unsigned int i = 1; i < str.length(); ++i)
if (str[i] & 0x80) if (str[i] & 0x80)
str[i] = bezogonkowo[str[i] & 0x7F]; str[i] = bezogonkowo[str[i] & 0x7F];
else if (str[i] < ' ') // znaki steruj¹ce nie s¹ obs³ugiwane else if (str[i] < ' ') // znaki steruj<EFBFBD>ce nie s<EFBFBD> obs<EFBFBD>ugiwane
str[i] = ' '; str[i] = ' ';
else if (_) else if (_)
if (str[i] == '_') // nazwy stacji nie mog¹ zawieraæ spacji if (str[i] == '_') // nazwy stacji nie mog<EFBFBD> zawiera<EFBFBD> spacji
str[i] = ' '; // wiêc trzeba wyœwietlaæ inaczej str[i] = ' '; // wi<EFBFBD>c trzeba wy<EFBFBD>wietla<EFBFBD> inaczej
return str; return str;
}; };
double Global::Min0RSpeed(double vel1, double vel2) double Global::Min0RSpeed(double vel1, double vel2)
{ // rozszerzenie funkcji Min0R o wartoœci -1.0 { // rozszerzenie funkcji Min0R o warto<EFBFBD>ci -1.0
if( vel1 == -1.0 ) { vel1 = std::numeric_limits<double>::max(); } if( vel1 == -1.0 ) { vel1 = std::numeric_limits<double>::max(); }
if( vel2 == -1.0 ) { vel2 = std::numeric_limits<double>::max(); } if( vel2 == -1.0 ) { vel2 = std::numeric_limits<double>::max(); }
return Min0R(vel1, vel2); return Min0R(vel1, vel2);

139
Globals.h
View File

@@ -110,7 +110,7 @@ const int k_Battery = 72;
const int k_WalkMode = 73; const int k_WalkMode = 73;
const int MaxKeys = 74; const int MaxKeys = 74;
// klasy dla wskaŸników globalnych // klasy dla wska<EFBFBD>nik<EFBFBD>w globalnych
class TGround; class TGround;
class TWorld; class TWorld;
class TCamera; class TCamera;
@@ -121,21 +121,21 @@ class TEvent;
class TTextSound; class TTextSound;
class TTranscript class TTranscript
{ // klasa obs³uguj¹ca linijkê napisu do dŸwiêku { // klasa obs<EFBFBD>uguj<EFBFBD>ca linijk<EFBFBD> napisu do d<EFBFBD>wi<EFBFBD>ku
public: public:
float fShow; // czas pokazania float fShow; // czas pokazania
float fHide; // czas ukrycia/usuniêcia float fHide; // czas ukrycia/usuni<EFBFBD>cia
std::string asText; // tekst gotowy do wyœwietlenia (usuniête znaczniki czasu) std::string asText; // tekst gotowy do wy<EFBFBD>wietlenia (usuni<EFBFBD>te znaczniki czasu)
bool bItalic; // czy kursywa (dŸwiêk nieistotny dla prowadz¹cego) bool bItalic; // czy kursywa (d<EFBFBD>wi<EFBFBD>k nieistotny dla prowadz<EFBFBD>cego)
int iNext; // nastêpna u¿ywana linijka, ¿eby nie przestawiaæ fizycznie tabeli int iNext; // nast<EFBFBD>pna u<EFBFBD>ywana linijka, <EFBFBD>eby nie przestawia<EFBFBD> fizycznie tabeli
}; };
#define MAX_TRANSCRIPTS 30 #define MAX_TRANSCRIPTS 30
class TTranscripts class TTranscripts
{ // klasa obs³uguj¹ca napisy do dŸwiêków { // klasa obs<EFBFBD>uguj<EFBFBD>ca napisy do d<EFBFBD>wi<EFBFBD>k<EFBFBD>w
TTranscript aLines[MAX_TRANSCRIPTS]; // pozycje na napisy do wyœwietlenia TTranscript aLines[MAX_TRANSCRIPTS]; // pozycje na napisy do wy<EFBFBD>wietlenia
int iCount; // liczba zajêtych pozycji int iCount; // liczba zaj<EFBFBD>tych pozycji
int iStart; // pierwsza istotna pozycja w tabeli, ¿eby sortowaæ przestawiaj¹c numerki int iStart; // pierwsza istotna pozycja w tabeli, <EFBFBD>eby sortowa<EFBFBD> przestawiaj<EFBFBD>c numerki
float fRefreshTime; float fRefreshTime;
public: public:
@@ -143,20 +143,20 @@ class TTranscripts
~TTranscripts(); ~TTranscripts();
void AddLine(char const *txt, float show, float hide, bool it); void AddLine(char const *txt, float show, float hide, bool it);
void Add(char const *txt, float len, void Add(char const *txt, float len,
bool backgorund = false); // dodanie tekstów, d³ugoœæ dŸwiêku, czy istotne bool backgorund = false); // dodanie tekst<EFBFBD>w, d<EFBFBD>ugo<EFBFBD><EFBFBD> d<EFBFBD>wi<EFBFBD>ku, czy istotne
void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekundê) void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekund<EFBFBD>)
}; };
class Global class Global
{ {
private: private:
static GLuint iTextureId; // ostatnio u¿yta tekstura 2D static GLuint iTextureId; // ostatnio u<EFBFBD>yta tekstura 2D
public: public:
// double Global::tSinceStart; // double Global::tSinceStart;
static int Keys[MaxKeys]; static int Keys[MaxKeys];
static Math3D::vector3 pCameraPosition; // pozycja kamery w œwiecie static Math3D::vector3 pCameraPosition; // pozycja kamery w <EFBFBD>wiecie
static double static double
pCameraRotation; // kierunek bezwzglêdny kamery w œwiecie: 0=pó³noc, 90°=zachód (-azymut) pCameraRotation; // kierunek bezwzgl<EFBFBD>dny kamery w <EFBFBD>wiecie: 0=p<EFBFBD><EFBFBD>noc, 90<EFBFBD>=zach<EFBFBD>d (-azymut)
static double pCameraRotationDeg; // w stopniach, dla animacji billboard static double pCameraRotationDeg; // w stopniach, dla animacji billboard
static Math3D::vector3 pFreeCameraInit[ 10 ]; // pozycje kamery static Math3D::vector3 pFreeCameraInit[ 10 ]; // pozycje kamery
static Math3D::vector3 pFreeCameraInitAngle[ 10 ]; static Math3D::vector3 pFreeCameraInitAngle[ 10 ];
@@ -227,81 +227,81 @@ class Global
static std::string asSky; static std::string asSky;
static bool bnewAirCouplers; static bool bnewAirCouplers;
// Ra: nowe zmienne globalne // Ra: nowe zmienne globalne
static int iDefaultFiltering; // domyœlne rozmywanie tekstur TGA static int iDefaultFiltering; // domy<EFBFBD>lne rozmywanie tekstur TGA
static int iBallastFiltering; // domyœlne rozmywanie tekstury podsypki static int iBallastFiltering; // domy<EFBFBD>lne rozmywanie tekstury podsypki
static int iRailProFiltering; // domyœlne rozmywanie tekstury szyn static int iRailProFiltering; // domy<EFBFBD>lne rozmywanie tekstury szyn
static int iDynamicFiltering; // domyœlne rozmywanie tekstur pojazdów static int iDynamicFiltering; // domy<EFBFBD>lne rozmywanie tekstur pojazd<EFBFBD>w
static int iReCompile; // zwiêkszany, gdy trzeba odœwie¿yæ siatki static int iReCompile; // zwi<EFBFBD>kszany, gdy trzeba od<EFBFBD>wie<EFBFBD>y<EFBFBD> siatki
static bool bUseVBO; // czy jest VBO w karcie graficznej static bool bUseVBO; // czy jest VBO w karcie graficznej
static int iFeedbackMode; // tryb pracy informacji zwrotnej static int iFeedbackMode; // tryb pracy informacji zwrotnej
static int iFeedbackPort; // dodatkowy adres dla informacji zwrotnych static int iFeedbackPort; // dodatkowy adres dla informacji zwrotnych
static double fOpenGL; // wersja OpenGL - przyda siê static double fOpenGL; // wersja OpenGL - przyda si<EFBFBD>
static bool bOpenGL_1_5; // czy s¹ dostêpne funkcje OpenGL 1.5 static bool bOpenGL_1_5; // czy s<EFBFBD> dost<EFBFBD>pne funkcje OpenGL 1.5
static double fLuminance; // jasnoœæ œwiat³a do automatycznego zapalania static double fLuminance; // jasno<EFBFBD><EFBFBD> <20>wiat<EFBFBD>a do automatycznego zapalania
static int iMultiplayer; // blokada dzia³ania niektórych eventów na rzecz kominikacji static int iMultiplayer; // blokada dzia<EFBFBD>ania niekt<EFBFBD>rych event<EFBFBD>w na rzecz kominikacji
static HWND hWnd; // uchwyt okna static HWND hWnd; // uchwyt okna
static int iCameraLast; static int iCameraLast;
static std::string asRelease; // numer static std::string asRelease; // numer
static std::string asVersion; // z opisem static std::string asVersion; // z opisem
static int static int
iViewMode; // co aktualnie widaæ: 0-kabina, 1-latanie, 2-sprzêgi, 3-dokumenty, 4-obwody iViewMode; // co aktualnie wida<EFBFBD>: 0-kabina, 1-latanie, 2-sprz<EFBFBD>gi, 3-dokumenty, 4-obwody
static GLint iMaxTextureSize; // maksymalny rozmiar tekstury static GLint iMaxTextureSize; // maksymalny rozmiar tekstury
static int iTextMode; // tryb pracy wyœwietlacza tekstowego static int iTextMode; // tryb pracy wy<EFBFBD>wietlacza tekstowego
static int iScreenMode[12]; // numer ekranu wyœwietlacza tekstowego static int iScreenMode[12]; // numer ekranu wy<EFBFBD>wietlacza tekstowego
static bool bDoubleAmbient; // podwójna jasnoœæ ambient static bool bDoubleAmbient; // podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
static double fMoveLight; // numer dnia w roku albo -1 static double fMoveLight; // numer dnia w roku albo -1
static bool bSmoothTraction; // wyg³adzanie drutów static bool bSmoothTraction; // wyg<EFBFBD>adzanie drut<EFBFBD>w
static double fSunDeclination; // deklinacja S³oñca static double fSunDeclination; // deklinacja S<EFBFBD>o<EFBFBD>ca
static double fTimeSpeed; // przyspieszenie czasu, zmienna do testów static double fTimeSpeed; // przyspieszenie czasu, zmienna do test<EFBFBD>w
static double fTimeAngleDeg; // godzina w postaci k¹ta static double fTimeAngleDeg; // godzina w postaci k<EFBFBD>ta
static float fClockAngleDeg[6]; // k¹ty obrotu cylindrów dla zegara cyfrowego static float fClockAngleDeg[6]; // k<EFBFBD>ty obrotu cylindr<EFBFBD>w dla zegara cyfrowego
static double fLatitudeDeg; // szerokoϾ geograficzna static double fLatitudeDeg; // szeroko<EFBFBD><EFBFBD> geograficzna
static char *szTexturesTGA[4]; // lista tekstur od TGA static char *szTexturesTGA[4]; // lista tekstur od TGA
static char *szTexturesDDS[4]; // lista tekstur od DDS static char *szTexturesDDS[4]; // lista tekstur od DDS
static int iMultisampling; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px static int iMultisampling; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px
static bool bGlutFont; // tekst generowany przez GLUT static bool bGlutFont; // tekst generowany przez GLUT
static int iKeyLast; // ostatnio naciœniêty klawisz w celu logowania static int iKeyLast; // ostatnio naci<EFBFBD>ni<EFBFBD>ty klawisz w celu logowania
static int iPause; // globalna pauza ruchu: b0=start,b1=klawisz,b2=t³o,b3=lagi,b4=wczytywanie static int iPause; // globalna pauza ruchu: b0=start,b1=klawisz,b2=t<EFBFBD>o,b3=lagi,b4=wczytywanie
static bool bActive; // czy jest aktywnym oknem static bool bActive; // czy jest aktywnym oknem
static void BindTexture(GLuint t); static void BindTexture(GLuint t);
static int iConvertModels; // tworzenie plików binarnych static int iConvertModels; // tworzenie plik<EFBFBD>w binarnych
static int iErorrCounter; // licznik sprawdzañ do œledzenia b³êdów OpenGL static int iErorrCounter; // licznik sprawdza<EFBFBD> do <EFBFBD>ledzenia b<EFBFBD><EFBFBD>d<EFBFBD>w OpenGL
static bool bInactivePause; // automatyczna pauza, gdy okno nieaktywne static bool bInactivePause; // automatyczna pauza, gdy okno nieaktywne
static int iTextures; // licznik u¿ytych tekstur static int iTextures; // licznik u<EFBFBD>ytych tekstur
static int iSlowMotionMask; // maska wy³¹czanych w³aœciwoœci static int iSlowMotionMask; // maska wy<EFBFBD><EFBFBD>czanych w<EFBFBD>a<EFBFBD>ciwo<EFBFBD>ci
static int iModifyTGA; // czy korygowaæ pliki TGA dla szybszego wczytywania static int iModifyTGA; // czy korygowa<EFBFBD> pliki TGA dla szybszego wczytywania
static bool bHideConsole; // hunter-271211: ukrywanie konsoli static bool bHideConsole; // hunter-271211: ukrywanie konsoli
static bool bOldSmudge; // U¿ywanie starej smugi static bool bOldSmudge; // U<EFBFBD>ywanie starej smugi
static TWorld *pWorld; // wskaŸnik na œwiat do usuwania pojazdów static TWorld *pWorld; // wska<EFBFBD>nik na <EFBFBD>wiat do usuwania pojazd<EFBFBD>w
static TAnimModel *pTerrainCompact; // obiekt terenu do ewentualnego zapisania w pliku static TAnimModel *pTerrainCompact; // obiekt terenu do ewentualnego zapisania w pliku
static std::string asTerrainModel; // nazwa obiektu terenu do zapisania w pliku static std::string asTerrainModel; // nazwa obiektu terenu do zapisania w pliku
static bool bRollFix; // czy wykonaæ przeliczanie przechy³ki static bool bRollFix; // czy wykona<EFBFBD> przeliczanie przechy<EFBFBD>ki
static cParser *pParser; static cParser *pParser;
static int iSegmentsRendered; // iloœæ segmentów do regulacji wydajnoœci static int iSegmentsRendered; // ilo<EFBFBD><EFBFBD> segment<EFBFBD>w do regulacji wydajno<EFBFBD>ci
static double fFpsAverage; // oczekiwana wartosæ FPS static double fFpsAverage; // oczekiwana wartos<EFBFBD> FPS
static double fFpsDeviation; // odchylenie standardowe FPS static double fFpsDeviation; // odchylenie standardowe FPS
static double fFpsMin; // dolna granica FPS, przy której promieñ scenerii bêdzie zmniejszany static double fFpsMin; // dolna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zmniejszany
static double fFpsMax; // górna granica FPS, przy której promieñ scenerii bêdzie zwiêkszany static double fFpsMax; // g<EFBFBD>rna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zwi<EFBFBD>kszany
static double fFpsRadiusMax; // maksymalny promieñ renderowania static double fFpsRadiusMax; // maksymalny promie<EFBFBD> renderowania
static int iFpsRadiusMax; // maksymalny promieñ renderowania w rozmiarze tabeli sektorów static int iFpsRadiusMax; // maksymalny promie<EFBFBD> renderowania w rozmiarze tabeli sektor<EFBFBD>w
static double fRadiusFactor; // wspó³czynnik zmiany promienia static double fRadiusFactor; // wsp<EFBFBD><EFBFBD>czynnik zmiany promienia
static TCamera *pCamera; // parametry kamery static TCamera *pCamera; // parametry kamery
static TDynamicObject *pUserDynamic; // pojazd u¿ytkownika, renderowany bez trzêsienia static TDynamicObject *pUserDynamic; // pojazd u<EFBFBD>ytkownika, renderowany bez trz<EFBFBD>sienia
static double fCalibrateIn[6][6]; // parametry kalibracyjne wejϾ z pulpitu static double fCalibrateIn[6][6]; // parametry kalibracyjne wej<EFBFBD><EFBFBD> z pulpitu
static double fCalibrateOut[7][6]; // parametry kalibracyjne wyjϾ dla pulpitu static double fCalibrateOut[7][6]; // parametry kalibracyjne wyj<EFBFBD><EFBFBD> dla pulpitu
static double fCalibrateOutMax[7]; // wartoœci maksymalne wyjœæ dla pulpitu static double fCalibrateOutMax[7]; // warto<EFBFBD>ci maksymalne wyj<EFBFBD><EFBFBD> dla pulpitu
static int iCalibrateOutDebugInfo; // numer wyjœcia kalibrowanego dla którego wyœwietlaæ static int iCalibrateOutDebugInfo; // numer wyj<EFBFBD>cia kalibrowanego dla kt<EFBFBD>rego wy<EFBFBD>wietla<EFBFBD>
// informacje podczas kalibracji // informacje podczas kalibracji
static double fBrakeStep; // krok zmiany hamulca dla klawiszy [Num3] i [Num9] static double fBrakeStep; // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
static bool bJoinEvents; // czy grupowaæ eventy o tych samych nazwach static bool bJoinEvents; // czy grupowa<EFBFBD> eventy o tych samych nazwach
static bool bSmudge; // czy wyœwietlaæ smugê, a pojazd u¿ytkownika na koñcu static bool bSmudge; // czy wy<EFBFBD>wietla<EFBFBD> smug<EFBFBD>, a pojazd u<EFBFBD>ytkownika na ko<EFBFBD>cu
static std::string asTranscript[5]; // napisy na ekranie (widoczne) static std::string asTranscript[5]; // napisy na ekranie (widoczne)
static TTranscripts tranTexts; // obiekt obs³uguj¹cy stenogramy dŸwiêków na ekranie static TTranscripts tranTexts; // obiekt obs<EFBFBD>uguj<EFBFBD>cy stenogramy d<EFBFBD>wi<EFBFBD>k<EFBFBD>w na ekranie
static std::string asLang; // domyœlny jêzyk - http://tools.ietf.org/html/bcp47 static std::string asLang; // domy<EFBFBD>lny j<EFBFBD>zyk - http://tools.ietf.org/html/bcp47
static int iHiddenEvents; // czy ³¹czyæ eventy z torami poprzez nazwê toru static int iHiddenEvents; // czy <EFBFBD><EFBFBD>czy<EFBFBD> eventy z torami poprzez nazw<EFBFBD> toru
static TTextSound *tsRadioBusy[10]; // zajêtoœæ kana³ów radiowych (wskaŸnik na odgrywany dŸwiêk) static TTextSound *tsRadioBusy[10]; // zaj<EFBFBD>to<EFBFBD><EFBFBD> kana<EFBFBD><EFBFBD>w radiowych (wska<EFBFBD>nik na odgrywany d<EFBFBD>wi<EFBFBD>k)
static int iPoKeysPWM[7]; // numery wejϾ dla PWM static int iPoKeysPWM[7]; // numery wej<EFBFBD><EFBFBD> dla PWM
// metody // metody
static void TrainDelete(TDynamicObject *d); static void TrainDelete(TDynamicObject *d);
@@ -314,5 +314,18 @@ class Global
static std::string Bezogonkow(std::string str, bool _ = false); static std::string Bezogonkow(std::string str, bool _ = false);
static double Min0RSpeed(double vel1, double vel2); static double Min0RSpeed(double vel1, double vel2);
static double CutValueToRange(double min, double value, double max); static double CutValueToRange(double min, double value, double max);
// maciek001: zmienne dla MWD
static bool bMWDdebugEnable;
static unsigned long int iMWDBaudrate;
static AnsiString sMWDPortId;
static bool bMWDBreakEnable;
static bool bMWDInputDataEnable;
static double fMWDAnalogCalib[4][3];
static double fMWDzg[2];
static double fMWDpg[2];
static double fMWDph[2];
static double fMWDvolt[2];
static double fMWDamp[2];
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -4085,7 +4085,7 @@ begin
if (EngineType=ElectricSeriesMotor) then if (EngineType=ElectricSeriesMotor) then
begin begin
case RVentType of {wentylatory rozruchowe} case RVentType of {wentylatory rozruchowe}
1: if ActiveDir<>0 then 1: if (ActiveDir<>0) and (RList[MainCtrlActualPos].R>RVentCutOff) then
RventRot:=RventRot+(RVentnmax-RventRot)*RVentSpeed*dt RventRot:=RventRot+(RVentnmax-RventRot)*RVentSpeed*dt
else else
RventRot:=RventRot*(1-RVentSpeed*dt); RventRot:=RventRot*(1-RVentSpeed*dt);

602
Train.cpp

File diff suppressed because it is too large Load Diff

View File

@@ -201,6 +201,7 @@ private:
TGauge ggCabLightButton; // hunter-091012: przelacznik oswietlania kabiny TGauge ggCabLightButton; // hunter-091012: przelacznik oswietlania kabiny
TGauge ggCabLightDimButton; // hunter-091012: przelacznik przyciemnienia TGauge ggCabLightDimButton; // hunter-091012: przelacznik przyciemnienia
TGauge ggBatteryButton; // Stele 161228 hebelek baterii
// oswietlenia kabiny // oswietlenia kabiny
// NBMX wrzesien 2003 - obsluga drzwi // NBMX wrzesien 2003 - obsluga drzwi
@@ -267,6 +268,7 @@ private:
TButton btLampkaBocznik4; TButton btLampkaBocznik4;
TButton btLampkaRadiotelefon; TButton btLampkaRadiotelefon;
TButton btLampkaHamienie; TButton btLampkaHamienie;
TButton btLampkaED; //Stele 161228 hamowanie elektrodynamiczne
TButton btLampkaJazda; // Ra: nie u篡wane TButton btLampkaJazda; // Ra: nie u篡wane
// KURS90 // KURS90
TButton btLampkaBoczniki; TButton btLampkaBoczniki;