16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-17 23:39:18 +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 "LPT.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: stan wejścia zmieniany klawiaturą albo dedykowanym urządzeniem
// Ra: stan wyjścia zmieniany przez symulację (mierniki, kontrolki)
// Ra: klasa statyczna gromadz<EFBFBD>ca sygna<EFBFBD>y steruj<EFBFBD>ce oraz informacje zwrotne
// Ra: stan wej<EFBFBD>cia zmieniany klawiatur<EFBFBD> albo dedykowanym urz<EFBFBD>dzeniem
// Ra: stan wyj<EFBFBD>cia zmieniany przez symulacj<EFBFBD> (mierniki, kontrolki)
/*******************************
Do klawisza klawiatury przypisana jest maska bitowa oraz numer wejścia.
Naciśnięcie klawisza powoduje wywołanie procedury ustawienia bitu o podanej
masce na podanym wejściu. Zwonienie klawisza analogicznie wywołuje zerowanie
Do klawisza klawiatury przypisana jest maska bitowa oraz numer wej<EFBFBD>cia.
Naci<EFBFBD>ni<EFBFBD>cie klawisza powoduje wywo<EFBFBD>anie procedury ustawienia bitu o podanej
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
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
bity do sterowania. Podział na wejścia jest również ze względów organizacyjnych,
np. sterowanie światłami może mieć oddzielny numer wejścia niż przełączanie
radia, ponieważ nie ma potrzeby ich uzależniać (tzn. badać wspólną maskę bitową).
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<EFBFBD> na wej<EFBFBD>cia jest r<EFBFBD>wnie<EFBFBD> ze wzgl<EFBFBD>d<EFBFBD>w organizacyjnych,
np. sterowanie <EFBFBD>wiat<EFBFBD>ami mo<EFBFBD>e mie<EFBFBD> oddzielny numer wej<EFBFBD>cia ni<EFBFBD> prze<EFBFBD><EFBFBD>czanie
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
konstrukcji pojazdu. Sprawdza on zależności (w tym uszkodzenia) za pomocą
operacji logicznych na maskach bitowych. Do każdego wejścia jest przypisana
jedna, oddzielna maska 32 bit, ale w razie potrzeby istnieje też możliwość
korzystania z masek innych wejść. Skrypt może też wysyłać maski na inne wejścia,
ale należy unikać rekurencji.
Do ka<EFBFBD>dego wej<EFBFBD>cia podpi<EFBFBD>ty jest skrypt binarny, charakterystyczny dla danej
konstrukcji pojazdu. Sprawdza on zale<EFBFBD>no<EFBFBD>ci (w tym uszkodzenia) za pomoc<EFBFBD>
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<EFBFBD> mo<EFBFBD>liwo<EFBFBD><EFBFBD>
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<EFBFBD>y unika<EFBFBD> rekurencji.
Definiowanie wejść 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
należy dążyć do unifikacji. Skrypty mogą również używać dodatkowych masek bitowych.
Maski bitowe odpowiadają stanom przełączników, czujników, styczników itd.
Definiowanie wej<EFBFBD><EFBFBD> oraz przeznaczenia ich masek jest w gestii konstruktora
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<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<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
- naciśnięcie przycisku zamieniane jest na maskę bitową oraz numer wejścia
- wywoływany jest skrypt danego wejścia z ową maską
- skrypt sprawdza zależności i np. modyfikuje własności fizyki albo inne maski
- ewentualnie do wyzwalacza czasowego dodana jest maska i numer wejścia
- naci<EFBFBD>ni<EFBFBD>cie przycisku zamieniane jest na mask<EFBFBD> bitow<EFBFBD> oraz numer wej<EFBFBD>cia
- wywo<EFBFBD>ywany jest skrypt danego wej<EFBFBD>cia z ow<EFBFBD> mask<EFBFBD>
- 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<EFBFBD>cia
/*******************************/
/* //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")]
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::iConfig = 0;
TPoKeys55 *Console::PoKeys55[2] = {NULL, NULL};
TLPT *Console::LPT = NULL;
int Console::iSwitch[8]; // bistabilne w kabinie, załączane z [Shift], wyłączane bez
int Console::iButton[8]; // monostabilne w kabinie, załączane podczas trzymania klawisza
MWDComm * Console::MWD = NULL; // maciek001: obiekt dla MWD
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()
{
PoKeys55[0] = PoKeys55[1] = NULL;
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]
iButton[i] = 0; // bity 0..127 - bez [Shift], 128..255 - z [Shift]
}
@@ -129,6 +131,7 @@ Console::~Console()
{
delete PoKeys55[0];
delete PoKeys55[1];
delete MWD;
};
void Console::ModeSet(int m, int h)
@@ -138,24 +141,24 @@ void Console::ModeSet(int m, int h)
};
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[4] = iSwitch[5] = iSwitch[6] = iSwitch[7] = 0; // bity 128..255 - z [Ctrl]
switch (iMode)
{
case 1: // kontrolki klawiatury
case 2: // kontrolki klawiatury
iConfig = 0; // licznik użycia Scroll Lock
iConfig = 0; // licznik u<EFBFBD>ycia Scroll Lock
break;
case 3: // LPT
LPT = new TLPT(); // otwarcie inpout32.dll
if (LPT ? LPT->Connect(iConfig) : false)
{ // wysłać 0?
BitsUpdate(-1); // aktualizacjia stanów, bo przy wczytywaniu mogło być nieaktywne
{ // wys<EFBFBD>a<EFBFBD> 0?
BitsUpdate(-1); // aktualizacjia stan<EFBFBD>w, bo przy wczytywaniu mog<EFBFBD>o by<EFBFBD> nieaktywne
WriteLog("Feedback Mode 3: InpOut32.dll OK");
}
else
{ // połączenie nie wyszło, ma być NULL
{ // po<EFBFBD><EFBFBD>czenie nie wysz<EFBFBD>o, ma by<EFBFBD> NULL
delete LPT;
LPT = NULL;
}
@@ -165,25 +168,34 @@ int Console::On()
if (PoKeys55[0] ? PoKeys55[0]->Connect() : false)
{
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
{ // połączenie nie wyszło, ma być NULL
{ // po<EFBFBD><EFBFBD>czenie nie wysz<EFBFBD>o, ma by<EFBFBD> NULL
delete PoKeys55[0];
PoKeys55[0] = NULL;
}
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;
};
void Console::Off()
{ // wyłączenie informacji zwrotnych (reset pulpitu)
{ // wy<EFBFBD><EFBFBD>czenie informacji zwrotnych (reset pulpitu)
BitsClear(-1);
if ((iMode == 1) || (iMode == 2))
if (iConfig & 1) // licznik użycia Scroll Lock
{ // bez sensu to jest, ale mi się samo włącza
SetLedState(VK_SCROLL, true); // przyciśnięty
if (iConfig & 1) // licznik u<EFBFBD>ycia Scroll Lock
{ // bez sensu to jest, ale mi si<EFBFBD> samo w<EFBFBD><EFBFBD>cza
SetLedState(VK_SCROLL, true); // przyci<EFBFBD>ni<EFBFBD>ty
SetLedState(VK_SCROLL, false); // zwolniony
}
delete PoKeys55[0];
@@ -192,103 +204,154 @@ void Console::Off()
PoKeys55[1] = NULL;
delete LPT;
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)
{ // ustawienie bitów o podanej masce (mask) na wejściu (entry)
if ((iBits & mask) != mask) // jeżeli zmiana
{ // ustawienie bit<EFBFBD>w o podanej masce (mask) na wej<EFBFBD>ciu (entry)
if ((iBits & mask) != mask) // je<EFBFBD>eli zmiana
{
int old = iBits; // poprzednie stany
iBits |= mask;
BitsUpdate(old ^ iBits); // 1 dla bitów zmienionych
BitsUpdate(old ^ iBits); // 1 dla bit<EFBFBD>w zmienionych
if (iMode == 4)
WriteLog("PoKeys::BitsSet: mask: " + std::to_string(mask) + " iBits: " + std::to_string(iBits));
}
};
void Console::BitsClear(int mask, int entry)
{ // zerowanie bitów o podanej masce (mask) na wejściu (entry)
if (iBits & mask) // jeżeli zmiana
{ // zerowanie bit<EFBFBD>w o podanej masce (mask) na wej<EFBFBD>ciu (entry)
if (iBits & mask) // je<EFBFBD>eli zmiana
{
int old = iBits; // poprzednie stany
iBits &= ~mask;
BitsUpdate(old ^ iBits); // 1 dla bitów zmienionych
BitsUpdate(old ^ iBits); // 1 dla bit<EFBFBD>w zmienionych
}
};
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)
{
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
SetLedState(VK_CAPITAL, iBits & 3);
if (mask & 4) // gdy jazda na oporach
{ // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny
SetLedState(VK_SCROLL, true); // przyciśnięty
{ // Scroll Lock ma jako<EFBFBD> dziwnie... zmiana stanu na przeciwny
SetLedState(VK_SCROLL, true); // przyci<EFBFBD>ni<EFBFBD>ty
SetLedState(VK_SCROLL, false); // zwolniony
++iConfig; // licznik użycia Scroll Lock
++iConfig; // licznik u<EFBFBD>ycia Scroll Lock
}
break;
case 2: // sterowanie światełkami klawiatury: CA+SHP
case 2: // sterowanie <EFBFBD>wiate<EFBFBD>kami klawiatury: CA+SHP
if (mask & 2) // gdy CA
SetLedState(VK_CAPITAL, iBits & 2);
if (mask & 1) // gdy SHP
{ // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny
SetLedState(VK_SCROLL, true); // przyciśnięty
{ // Scroll Lock ma jako<EFBFBD> dziwnie... zmiana stanu na przeciwny
SetLedState(VK_SCROLL, true); // przyci<EFBFBD>ni<EFBFBD>ty
SetLedState(VK_SCROLL, false); // zwolniony
++iConfig; // licznik użycia Scroll Lock
++iConfig; // licznik u<EFBFBD>ycia Scroll Lock
}
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)
LPT->Out(iBits);
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])
{ // 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
PoKeys55[0]->Write(0x40, 23 - 1, (iBits & 0x0001) ? 1 : 0);
if (mask & 0x0002) // b1 gdy zmieniony CA
PoKeys55[0]->Write(0x40, 24 - 1, (iBits & 0x0002) ? 1 : 0);
if (mask & 0x0004) // b2 gdy jazda na oporach
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);
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);
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);
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);
if (mask & 0x0080) // b7 Lampka "przetwornicy"
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);
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);
if (mask & 0x0400) // b10 Kontrolka wysokiego rozruchu
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);
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);
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);
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);
}
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)
{ // na razie tak - czyta się tylko klawiatura
{ // na razie tak - czyta si<EFBFBD> tylko klawiatura
return Global::bActive && (GetKeyState(x) < 0);
};
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 (PoKeys55[0])
{
@@ -300,7 +363,7 @@ void Console::ValueSet(int x, double y)
y = Global::CutValueToRange(0, y, Global::fCalibrateOutMax[x]);
if (Global::iCalibrateOutDebugInfo == x)
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)
WriteLog(" fraction=" + std::to_string(y),false);
}
@@ -312,27 +375,64 @@ void Console::ValueSet(int x, double y)
WriteLog(" calibrated=" + std::to_string(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()
{ // 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 (PoKeys55[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;
}
else
{ // błąd komunikacji - zapauzować symulację?
if (!(Global::iPause & 8)) // jeśli jeszcze nie oflagowana
{ // b<EFBFBD><EFBFBD>d komunikacji - zapauzowa<EFBFBD> symulacj<EFBFBD>?
if (!(Global::iPause & 8)) // je<EFBFBD>li jeszcze nie oflagowana
Global::iTextMode = VK_F1; // pokazanie czasu/pauzy
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)
{ // pobranie wartości analogowej
{ // pobranie warto<EFBFBD>ci analogowej
if (iMode == 4)
if (PoKeys55[0])
return PoKeys55[0]->fAnalog[x];
@@ -340,19 +440,33 @@ float Console::AnalogGet(int x)
};
float Console::AnalogCalibrateGet(int x)
{ // pobranie i kalibracja wartości analogowej, jeśli nie ma PoKeys zwraca NULL
if (iMode == 4 && PoKeys55[0])
{
float b = PoKeys55[0]->fAnalog[x];
return (((((Global::fCalibrateIn[x][5] * b) + Global::fCalibrateIn[x][4]) * b +
Global::fCalibrateIn[x][3]) * b + Global::fCalibrateIn[x][2]) * b +
Global::fCalibrateIn[x][1]) *b + Global::fCalibrateIn[x][0];
}
return -1.0; //odcięcie
{ // pobranie i kalibracja warto<EFBFBD>ci analogowej, je<EFBFBD>li nie ma PoKeys zwraca NULL
if (iMode == 4 && PoKeys55[0])
{
float b = PoKeys55[0]->fAnalog[x];
return (((((Global::fCalibrateIn[x][5] * b) + Global::fCalibrateIn[x][4]) * b +
Global::fCalibrateIn[x][3]) * b + Global::fCalibrateIn[x][2]) * b +
Global::fCalibrateIn[x][1]) *b + Global::fCalibrateIn[x][0];
}
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)
{ // pobranie wartości cyfrowej
{ // pobranie warto<EFBFBD>ci cyfrowej
if (iMode == 4)
if (PoKeys55[0])
return PoKeys55[0]->iInputs[x];
@@ -360,35 +474,35 @@ unsigned char Console::DigitalGet(int x)
};
void Console::OnKeyDown(int k)
{ // naciśnięcie klawisza z powoduje wyłączenie, a
if (k & 0x10000) // jeśli [Shift]
{ // ustawienie bitu w tabeli przełączników bistabilnych
if (k & 0x20000) // jeśli [Ctrl], to zestaw dodatkowy
iSwitch[4 + (char(k) >> 5)] |= 1 << (k & 31); // załącz bistabliny dodatkowy
{ // naci<EFBFBD>ni<EFBFBD>cie klawisza z powoduje wy<EFBFBD><EFBFBD>czenie, a
if (k & 0x10000) // je<EFBFBD>li [Shift]
{ // ustawienie bitu w tabeli prze<EFBFBD><EFBFBD>cznik<EFBFBD>w bistabilnych
if (k & 0x20000) // je<EFBFBD>li [Ctrl], to zestaw dodatkowy
iSwitch[4 + (char(k) >> 5)] |= 1 << (k & 31); // za<EFBFBD><EFBFBD>cz bistabliny dodatkowy
else
{ // z [Shift] włączenie bitu bistabilnego i dodatkowego monostabilnego
iSwitch[char(k) >> 5] |= 1 << (k & 31); // załącz bistabliny podstawowy
iButton[4 + (char(k) >> 5)] |= (1 << (k & 31)); // załącz monostabilny dodatkowy
{ // z [Shift] w<EFBFBD><EFBFBD>czenie bitu bistabilnego i dodatkowego monostabilnego
iSwitch[char(k) >> 5] |= 1 << (k & 31); // za<EFBFBD><EFBFBD>cz bistabliny podstawowy
iButton[4 + (char(k) >> 5)] |= (1 << (k & 31)); // za<EFBFBD><EFBFBD>cz monostabilny dodatkowy
}
}
else
{ // zerowanie bitu w tabeli przełączników bistabilnych
if (k & 0x20000) // jeśli [Ctrl], to zestaw dodatkowy
iSwitch[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wyłącz bistabilny dodatkowy
{ // zerowanie bitu w tabeli prze<EFBFBD><EFBFBD>cznik<EFBFBD>w bistabilnych
if (k & 0x20000) // je<EFBFBD>li [Ctrl], to zestaw dodatkowy
iSwitch[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz bistabilny dodatkowy
else
{
iSwitch[char(k) >> 5] &= ~(1 << (k & 31)); // wyłącz bistabilny podstawowy
iButton[char(k) >> 5] |= 1 << (k & 31); // załącz monostabilny podstawowy
iSwitch[char(k) >> 5] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz bistabilny podstawowy
iButton[char(k) >> 5] |= 1 << (k & 31); // za<EFBFBD><EFBFBD>cz monostabilny podstawowy
}
}
};
void Console::OnKeyUp(int k)
{ // puszczenie klawisza w zasadzie nie ma znaczenia dla iSwitch, ale zeruje iButton
if ((k & 0x20000) == 0) // monostabilne tylko bez [Ctrl]
if (k & 0x10000) // jeśli [Shift]
iButton[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wyłącz monostabilny dodatkowy
if (k & 0x10000) // je<EFBFBD>li [Shift]
iButton[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz monostabilny dodatkowy
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)
{

View File

@@ -13,6 +13,7 @@ http://mozilla.org/MPL/2.0/.
class TConsoleDevice; // urz¹dzenie pod³¹czalne za pomoc¹ DLL
class TPoKeys55;
class TLPT;
class MWDComm; // maciek001: dodana obsluga portu COM
// klasy konwersji znaków wprowadzanych z klawiatury
class TKeyTrans
@@ -31,6 +32,7 @@ class Console
static int iBits; // podstawowy zestaw lampek
static TPoKeys55 *PoKeys55[2]; // mo¿e ich byæ kilka
static TLPT *LPT;
static MWDComm *MWD; // maciek001: na potrzeby MWD
static void BitsUpdate(int mask);
// 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

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))
{ // z dalsz<73> akcj<63> czekamy do godziny odjazdu
/* potencjalny problem z ruszaniem z w4
if (TrainParams->CheckTrainLatency() < 0)
WaitingSet(20); //Jak sp<73><70>niony to czeka 20s
*/
// iDrivigFlags|=moveLate1; //oflagowa<77>, gdy odjazd ze
// sp<73><70>nieniem, b<>dzie jecha<68> forsowniej
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
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)
{ // to W6
@@ -1378,7 +1384,7 @@ void TController::TablePurger()
{ // 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)
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>
if (k < 0)
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
public:
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 VelRoad; // aktualna prędkość drogowa (ze znaku W27)
// (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_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
Global::pWorld = &World; // Ra: wskaŸnik potrzebny do usuwania pojazdów
return World.Init(hWnd, hDC); // true jeœli wszystko pójdzie dobrze
Global::pWorld = &World; // Ra: wska<EFBFBD>nik potrzebny do usuwania pojazd<EFBFBD>w
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;
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;
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;
if (pDane->dwData == 'EU07') // sygnatura danych
World.OnCommandGet((DaneRozkaz *)(pDane->lpData));
break;
case WM_ACTIVATE: // watch for window activate message
// 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);
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)
Global::iPause &= ~4; // odpauzowanie, gdy jest na pierwszym planie
else
Global::iPause |= 4; // w³¹czenie pauzy, gdy nieaktywy
Global::iPause |= 4; // w<EFBFBD><EFBFBD>czenie pauzy, gdy nieaktywy
if (Global::bActive)
SetCursorPos(mx, my);
ShowCursor(!Global::bActive);
@@ -472,8 +472,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, // handle for this window
case WM_KEYDOWN:
if (Global::bActive)
{
if (wParam != 17) // bo naciœniêcia [Ctrl] nie ma po co przekazywaæ
if (wParam != 145) //[Scroll Lock] te¿ nie
if (wParam != 17) // bo naci<EFBFBD>ni<EFBFBD>cia [Ctrl] nie ma po co przekazywa<EFBFBD>
if (wParam != 145) //[Scroll Lock] te<EFBFBD> nie
World.OnKeyDown(wParam);
switch (wParam)
{
@@ -481,27 +481,27 @@ LRESULT CALLBACK WndProc(HWND hWnd, // handle for this window
if (DebugModeFlag)
break;
case 19: //[Pause]
if (Global::iPause & 1) // jeœli pauza startowa
Global::iPause &= ~1; // odpauzowanie, gdy po wczytaniu mia³o nie startowaæ
if (Global::iPause & 1) // je<EFBFBD>li pauza 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
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
// 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
// Global::iPause&=~10; //odpauzowanie pauzy PoKeys (chyba nic nie da) i
// ewentualnie klawiszowej równie¿
// ewentualnie klawiszowej r<EFBFBD>wnie<EFBFBD>
// else
Global::iPause ^= 2; // zmiana stanu zapauzowania
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;
case VK_F7:
if (DebugModeFlag)
{ // siatki wyœwietlane tyko w trybie testowym
{ // siatki wy<EFBFBD>wietlane tyko w trybie testowym
Global::bWireFrame = !Global::bWireFrame;
++Global::iReCompile; // odœwie¿yæ siatki
// Ra: jeszcze usun¹æ siatki ze skompilowanych obiektów!
++Global::iReCompile; // od<EFBFBD>wie<EFBFBD>y<EFBFBD> siatki
// Ra: jeszcze usun<EFBFBD><EFBFBD> siatki ze skompilowanych obiekt<EFBFBD>w!
}
break;
}
@@ -578,9 +578,9 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
MSG msg; // windows message structure
BOOL done = FALSE; // bool variable to exit loop
fullscreen = true;
DeleteFile("errors.txt"); // usuniêcie starego
Global::LoadIniFile("eu07.ini"); // teraz dopiero mo¿na przejrzeæ plik z ustawieniami
Global::InitKeys("keys.ini"); // wczytanie mapowania klawiszy - jest na sta³e
DeleteFile("errors.txt"); // usuni<EFBFBD>cie starego
Global::LoadIniFile("eu07.ini"); // teraz dopiero mo<EFBFBD>na przejrze<EFBFBD> plik z ustawieniami
Global::InitKeys("keys.ini"); // wczytanie mapowania klawiszy - jest na sta<EFBFBD>e
// hunter-271211: ukrywanie konsoli
if (Global::iWriteLogEnabled & 2)
@@ -590,7 +590,7 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
}
std::string commandline( lpCmdLine ); // parametry uruchomienia
if( false == commandline.empty() )
{ // analizowanie parametrów
{ // analizowanie parametr<EFBFBD>w
cParser parser( commandline );
std::string token;
do {
@@ -609,15 +609,15 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
parser >> Global::asHumanCtrlVehicle;
}
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
}
else if( token == "-e3d" )
{ // wygenerowanie wszystkich plików E3D
{ // wygenerowanie wszystkich plik<EFBFBD>w E3D
if (Global::iConvertModels > 0)
Global::iConvertModels = -Global::iConvertModels; // specjalny tryb
else
Global::iConvertModels = -7; // z optymalizacj¹, bananami i prawid³owym Opacity
Global::iConvertModels = -7; // z optymalizacj<EFBFBD>, bananami i prawid<EFBFBD>owym Opacity
}
else
Error(
@@ -644,9 +644,9 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
return 0; // quit if window was not created
SetForegroundWindow(hWnd);
// 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))
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;
SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &iOldSpeed, 0);
SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &iOldDelay, 0);
@@ -656,20 +656,20 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
WriteLog("No joystick");
if (Global::iModifyTGA < 0)
{ // tylko modyfikacja TGA, bez uruchamiania symulacji
Global::iMaxTextureSize = 64; //¿eby nie zamulaæ pamiêci
World.ModifyTGA(); // rekurencyjne przegl¹danie katalogów
Global::iMaxTextureSize = 64; //<EFBFBD>eby nie zamula<EFBFBD> pami<EFBFBD>ci
World.ModifyTGA(); // rekurencyjne przegl<EFBFBD>danie katalog<EFBFBD>w
}
else
{
if (Global::iConvertModels < 0)
{
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);
} // po zrobieniu E3D odpalamy normalnie sceneriê, by j¹ zobaczyæ
} // po zrobieniu E3D odpalamy normalnie sceneri<EFBFBD>, by j<EFBFBD> zobaczy<EFBFBD>
// else
//{//g³ówna pêtla programu
Console::On(); // w³¹czenie konsoli
//{//g<EFBFBD><EFBFBD>wna p<EFBFBD>tla programu
Console::On(); // w<EFBFBD><EFBFBD>czenie konsoli
while (!done) // loop that runs while done=FALSE
{
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
// DrawGLScene()
// 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?
SwapBuffers(hDC); // Swap Buffers (Double Buffering)
else
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_SETKEYBOARDDELAY, iOldDelay, NULL, 0);

View File

@@ -25,55 +25,55 @@ http://mozilla.org/MPL/2.0/.
// namespace Global {
// parametry do u¿ytku wewnêtrznego
// parametry do u<EFBFBD>ytku wewn<EFBFBD>trznego
// double Global::tSinceStart=0;
TGround *Global::pGround = NULL;
// 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::CreatorName4[30]="2004 Arkadiusz Œlusarczyk <Winger>";
// char Global::CreatorName5[30]="2003-2009 £ukasz Kirchner <Nbmx>";
// char Global::CreatorName4[30]="2004 Arkadiusz <EFBFBD>lusarczyk <Winger>";
// char Global::CreatorName5[30]="2003-2009 <EFBFBD>ukasz Kirchner <Nbmx>";
std::string Global::asCurrentSceneryPath = "scenery/";
std::string Global::asCurrentTexturePath = std::string(szTexturePath);
std::string Global::asCurrentDynamicPath = "";
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
bool Global::detonatoryOK; // info o nowych detonatorach
double Global::ABuDebug = 0;
std::string Global::asSky = "1";
double Global::fOpenGL = 0.0; // wersja OpenGL - do sprawdzania obecnoœci rozszerzeñ
bool Global::bOpenGL_1_5 = false; // czy s¹ dostêpne funkcje OpenGL 1.5
double Global::fLuminance = 1.0; // jasnoœæ œwiat³a do automatycznego zapalania
int Global::iReCompile = 0; // zwiêkszany, gdy trzeba odœwie¿yæ siatki
double Global::fOpenGL = 0.0; // wersja OpenGL - do sprawdzania obecno<EFBFBD>ci rozszerze<EFBFBD>
bool Global::bOpenGL_1_5 = false; // czy s<EFBFBD> dost<EFBFBD>pne funkcje OpenGL 1.5
double Global::fLuminance = 1.0; // jasno<EFBFBD><EFBFBD> <20>wiat<EFBFBD>a do automatycznego zapalania
int Global::iReCompile = 0; // zwi<EFBFBD>kszany, gdy trzeba od<EFBFBD>wie<EFBFBD>y<EFBFBD> siatki
HWND Global::hWnd = NULL; // uchwyt okna
int Global::iCameraLast = -1;
std::string Global::asRelease = "16.1.1174.483";
std::string Global::asVersion =
"Compilation 2017-01-13, release " + Global::asRelease + "."; // tutaj, bo wysy³any
int Global::iViewMode = 0; // co aktualnie widaæ: 0-kabina, 1-latanie, 2-sprzêgi, 3-dokumenty
int Global::iTextMode = 0; // tryb pracy wyœwietlacza tekstowego
"Compilation 2017-01-13, release " + Global::asRelease + "."; // tutaj, bo wysy<EFBFBD>any
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<EFBFBD>wietlacza tekstowego
int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0}; // numer ekranu wyœwietlacza tekstowego
double Global::fSunDeclination = 0.0; // deklinacja S³oñca
double Global::fTimeAngleDeg = 0.0; // godzina w postaci k¹ta
float Global::fClockAngleDeg[6]; // k¹ty obrotu cylindrów dla zegara cyfrowego
0, 0, 0, 0, 0, 0}; // numer ekranu wy<EFBFBD>wietlacza tekstowego
double Global::fSunDeclination = 0.0; // deklinacja S<EFBFBD>o<EFBFBD>ca
double Global::fTimeAngleDeg = 0.0; // godzina w postaci k<EFBFBD>ta
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::szTexturesDDS[4] = {"dds", "tga", "tex", "bmp"}; // lista tekstur od DDS
int Global::iKeyLast = 0; // ostatnio naciœniêty klawisz w celu logowania
GLuint Global::iTextureId = 0; // ostatnio u¿yta tekstura 2D
int Global::iKeyLast = 0; // ostatnio naci<EFBFBD>ni<EFBFBD>ty klawisz w celu logowania
GLuint Global::iTextureId = 0; // ostatnio u<EFBFBD>yta tekstura 2D
int Global::iPause = 0x10; // globalna pauza ruchu
bool Global::bActive = true; // czy jest aktywnym oknem
int Global::iErorrCounter = 0; // licznik sprawdzañ do œledzenia b³êdów OpenGL
int Global::iTextures = 0; // licznik u¿ytych tekstur
int Global::iErorrCounter = 0; // licznik sprawdza<EFBFBD> do <EFBFBD>ledzenia b<EFBFBD><EFBFBD>d<EFBFBD>w OpenGL
int Global::iTextures = 0; // licznik u<EFBFBD>ytych tekstur
TWorld *Global::pWorld = 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
TDynamicObject *Global::pUserDynamic = NULL; // pojazd u¿ytkownika, renderowany bez trzêsienia
bool Global::bSmudge = false; // czy wyœwietlaæ smugê, a pojazd u¿ytkownika na koñcu
TDynamicObject *Global::pUserDynamic = NULL; // pojazd u<EFBFBD>ytkownika, renderowany bez trz<EFBFBD>sienia
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)
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
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::diffuseDayLight[] = {0.55f, 0.54f, 0.50f, 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::specularLight[] = {0.95f, 0.94f, 0.90f, 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::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];
bool Global::bRollFix = true; // czy wykonaæ przeliczanie przechy³ki
bool Global::bJoinEvents = false; // czy grupowaæ eventy o tych samych nazwach
int Global::iHiddenEvents = 1; // czy ³¹czyæ eventy z torami poprzez nazwê toru
bool Global::bRollFix = true; // czy wykona<EFBFBD> przeliczanie przechy<EFBFBD>ki
bool Global::bJoinEvents = false; // czy grupowa<EFBFBD> eventy o tych samych nazwach
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::iWindowWidth = 800;
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::iFeedbackPort = 0; // dodatkowy adres dla informacji zwrotnych
bool Global::bFreeFly = false;
@@ -114,52 +114,52 @@ float Global::fMouseXScale = 1.5;
float Global::fMouseYScale = 0.2;
std::string Global::SceneryFile = "td.scn";
std::string Global::asHumanCtrlVehicle = "EU07-424";
int Global::iMultiplayer = 0; // blokada dzia³ania niektórych funkcji na rzecz komunikacji
double Global::fMoveLight = -1; // ruchome œwiat³o
double Global::fLatitudeDeg = 52.0; // szerokoϾ geograficzna
float Global::fFriction = 1.0; // mno¿nik tarcia - KURS90
int Global::iMultiplayer = 0; // blokada dzia<EFBFBD>ania niekt<EFBFBD>rych funkcji na rzecz komunikacji
double Global::fMoveLight = -1; // ruchome <EFBFBD>wiat<EFBFBD>o
double Global::fLatitudeDeg = 52.0; // szeroko<EFBFBD><EFBFBD> geograficzna
float Global::fFriction = 1.0; // mno<EFBFBD>nik tarcia - KURS90
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::bEnableTraction = true;
bool Global::bLoadTraction = true;
bool Global::bLiveTraction = true;
int Global::iDefaultFiltering = 9; // domyœlne rozmywanie tekstur TGA bez alfa
int Global::iBallastFiltering = 9; // domyœlne rozmywanie tekstur podsypki
int Global::iRailProFiltering = 5; // domyœlne rozmywanie tekstur szyn
int Global::iDynamicFiltering = 5; // domyœlne rozmywanie tekstur pojazdów
bool Global::bUseVBO = false; // czy jest VBO w karcie graficznej (czy u¿yæ)
int Global::iDefaultFiltering = 9; // domy<EFBFBD>lne rozmywanie tekstur TGA bez alfa
int Global::iBallastFiltering = 9; // domy<EFBFBD>lne rozmywanie tekstur podsypki
int Global::iRailProFiltering = 5; // domy<EFBFBD>lne rozmywanie tekstur szyn
int Global::iDynamicFiltering = 5; // domy<EFBFBD>lne rozmywanie tekstur pojazd<EFBFBD>w
bool Global::bUseVBO = false; // czy jest VBO w karcie graficznej (czy u<EFBFBD>y<EFBFBD>)
GLint Global::iMaxTextureSize = 16384; // maksymalny rozmiar tekstury
bool Global::bSmoothTraction = false; // wyg³adzanie drutów starym sposobem
char **Global::szDefaultExt = Global::szTexturesDDS; // domyœlnie od DDS
bool Global::bSmoothTraction = false; // wyg<EFBFBD>adzanie drut<EFBFBD>w starym sposobem
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
bool Global::bGlutFont = false; // czy tekst generowany przez GLUT32.DLL
int Global::iConvertModels = 7; // tworzenie plików binarnych, +2-optymalizacja transformów
int Global::iSlowMotionMask = -1; // maska wy³¹czanych w³aœciwoœci dla zwiêkszenia FPS
int Global::iModifyTGA = 7; // czy korygowaæ pliki TGA dla szybszego wczytywania
// bool Global::bTerrainCompact=true; //czy zapisaæ teren w pliku
int Global::iConvertModels = 7; // tworzenie plik<EFBFBD>w binarnych, +2-optymalizacja transform<EFBFBD>w
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<EFBFBD> pliki TGA dla szybszego wczytywania
// bool Global::bTerrainCompact=true; //czy zapisa<EFBFBD> teren w pliku
TAnimModel *Global::pTerrainCompact = NULL; // do zapisania terenu 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::fFpsMin = 0.0; // dolna granica FPS, przy której promieñ scenerii bêdzie zmniejszany
double Global::fFpsMax = 0.0; // górna granica FPS, przy której promieñ scenerii bêdzie zwiêkszany
double Global::fFpsRadiusMax = 3000.0; // maksymalny promieñ renderowania
int Global::iFpsRadiusMax = 225; // maksymalny promieñ renderowania
double Global::fRadiusFactor = 1.1; // wspó³czynnik jednorazowej zmiany promienia scenerii
bool Global::bOldSmudge = false; // U¿ywanie starej smugi
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<EFBFBD>rna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zwi<EFBFBD>kszany
double Global::fFpsRadiusMax = 3000.0; // maksymalny promie<EFBFBD> renderowania
int Global::iFpsRadiusMax = 225; // maksymalny promie<EFBFBD> renderowania
double Global::fRadiusFactor = 1.1; // wsp<EFBFBD><EFBFBD>czynnik jednorazowej zmiany promienia scenerii
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::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::bDecompressDDS = false; // czy programowa dekompresja DDS
// 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},
{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};
int Global::iCalibrateOutDebugInfo = -1;
int Global::iPoKeysPWM[7] = {0, 1, 2, 3, 4, 5, 6};
// parametry przejœciowe (do usuniêcia)
// bool Global::bTimeChange=false; //Ra: ZiomalCl wy³¹czy³ star¹ wersjê nocy
// bool Global::bRenderAlpha=true; //Ra: wywali³am tê flagê
// parametry przej<EFBFBD>ciowe (do usuni<EFBFBD>cia)
// bool Global::bTimeChange=false; //Ra: ZiomalCl wy<EFBFBD><EFBFBD>czy<EFBFBD> star<EFBFBD> wersj<EFBFBD> nocy
// bool Global::bRenderAlpha=true; //Ra: wywali<EFBFBD>am t<EFBFBD> flag<EFBFBD>
bool Global::bnewAirCouplers = true;
bool Global::bDoubleAmbient = false; // podwójna jasnoœæ ambient
double Global::fTimeSpeed = 1.0; // przyspieszenie czasu, zmienna do testów
bool Global::bDoubleAmbient = false; // podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
double Global::fTimeSpeed = 1.0; // przyspieszenie czasu, zmienna do test<EFBFBD>w
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)
{ // zerowanie pozycji kamer
pFreeCameraInit[i] = vector3(0, 0, 0); // wspó³rzêdne w scenerii
pFreeCameraInitAngle[i] = vector3(0, 0, 0); // k¹ty obrotu w radianach
pFreeCameraInit[i] = vector3(0, 0, 0); // wsp<EFBFBD><EFBFBD>rz<EFBFBD>dne w scenerii
pFreeCameraInitAngle[i] = vector3(0, 0, 0); // k<EFBFBD>ty obrotu w radianach
}
cParser parser( asFileName, cParser::buffer_FILE );
ConfigParse( parser );
@@ -308,7 +319,7 @@ void Global::ConfigParse(cParser &Parser) {
>> Global::fMouseYScale;
}
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;
Global::bEnableTraction = ( token == "yes" );
}
@@ -317,14 +328,14 @@ void Global::ConfigParse(cParser &Parser) {
Parser.getTokens(); Parser >> token;
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 >> Global::fFriction;
}
else if( token == "livetraction" ) {
// 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;
Global::bLiveTraction = ( token == "yes" );
}
@@ -347,7 +358,7 @@ void Global::ConfigParse(cParser &Parser) {
// ShaXbee - domyslne rozszerzenie tekstur
Parser.getTokens(); Parser >> token;
if( token == "tga" ) {
// domyœlnie od TGA
// domy<EFBFBD>lnie od TGA
Global::szDefaultExt = Global::szTexturesTGA;
}
}
@@ -411,7 +422,7 @@ void Global::ConfigParse(cParser &Parser) {
else { Global::iMaxTextureSize = 16384; }
}
else if( token == "doubleambient" ) {
// podwójna jasnoœæ ambient
// podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
Parser.getTokens(); Parser >> token;
Global::bDoubleAmbient = ( token == "yes" );
}
@@ -422,14 +433,14 @@ void Global::ConfigParse(cParser &Parser) {
if( Global::fMoveLight == 0.f ) { // pobranie daty z systemu
std::time_t timenow = std::time( 0 );
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:
// 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)
// 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 ) +
0.0702570 * std::sin( fMoveLight ) - 0.0067580 * std::cos( 2 * fMoveLight ) +
0.0009070 * std::sin( 2 * fMoveLight ) -
@@ -437,12 +448,12 @@ void Global::ConfigParse(cParser &Parser) {
}
}
else if( token == "smoothtraction" ) {
// podwójna jasnoœæ ambient
// podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
Parser.getTokens(); Parser >> token;
Global::bSmoothTraction = ( token == "yes" );
}
else if( token == "timespeed" ) {
// przyspieszenie czasu, zmienna do testów
// przyspieszenie czasu, zmienna do test<EFBFBD>w
Parser.getTokens( 1, false );
Parser >> Global::fTimeSpeed;
}
@@ -457,12 +468,12 @@ void Global::ConfigParse(cParser &Parser) {
Global::bGlutFont = ( token == "yes" );
}
else if( token == "latitude" ) {
// szerokoϾ geograficzna
// szeroko<EFBFBD><EFBFBD> geograficzna
Parser.getTokens( 1, false );
Parser >> Global::fLatitudeDeg;
}
else if( token == "convertmodels" ) {
// tworzenie plików binarnych
// tworzenie plik<EFBFBD>w binarnych
Parser.getTokens( 1, false );
Parser >> Global::iConvertModels;
}
@@ -472,12 +483,12 @@ void Global::ConfigParse(cParser &Parser) {
Global::bInactivePause = ( token == "yes" );
}
else if( token == "slowmotion" ) {
// tworzenie plików binarnych
// tworzenie plik<EFBFBD>w binarnych
Parser.getTokens( 1, false );
Parser >> Global::iSlowMotionMask;
}
else if( token == "modifytga" ) {
// czy korygowaæ pliki TGA dla szybszego wczytywania
// czy korygowa<EFBFBD> pliki TGA dla szybszego wczytywania
Parser.getTokens( 1, false );
Parser >> Global::iModifyTGA;
}
@@ -492,12 +503,12 @@ void Global::ConfigParse(cParser &Parser) {
Global::bOldSmudge = ( token == "yes" );
}
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;
Global::bRollFix = ( token == "yes" );
}
else if( token == "fpsaverage" ) {
// oczekiwana wartosæ FPS
// oczekiwana wartos<EFBFBD> FPS
Parser.getTokens( 1, false );
Parser >> Global::fFpsAverage;
}
@@ -507,76 +518,76 @@ void Global::ConfigParse(cParser &Parser) {
Parser >> Global::fFpsDeviation;
}
else if( token == "fpsradiusmax" ) {
// maksymalny promieñ renderowania
// maksymalny promie<EFBFBD> renderowania
Parser.getTokens( 1, false );
Parser >> Global::fFpsRadiusMax;
}
else if(token == "calibratein"){
// parametry kalibracji wejϾ
// parametry kalibracji wej<EFBFBD><EFBFBD>
Parser.getTokens( 1, false );
int in; Parser >> in;
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
>> Global::fCalibrateIn[ in ][ 0 ] // wyraz wolny
>> Global::fCalibrateIn[ in ][ 1 ] // mno¿nik
>> Global::fCalibrateIn[ in ][ 2 ] // mno¿nik dla kwadratu
>> Global::fCalibrateIn[ in ][ 3 ]; // mno¿nik dla szeœcianu
Global::fCalibrateIn[ in ][ 4 ] = 0.0; // mno¿nik 4 potêgi
Global::fCalibrateIn[ in ][ 5 ] = 0.0; // mno¿nik 5 potêgi
>> Global::fCalibrateIn[ in ][ 1 ] // mno<EFBFBD>nik
>> Global::fCalibrateIn[ in ][ 2 ] // mno<EFBFBD>nik dla kwadratu
>> Global::fCalibrateIn[ in ][ 3 ]; // mno<EFBFBD>nik dla sze<EFBFBD>cianu
Global::fCalibrateIn[ in ][ 4 ] = 0.0; // mno<EFBFBD>nik 4 pot<EFBFBD>gi
Global::fCalibrateIn[ in ][ 5 ] = 0.0; // mno<EFBFBD>nik 5 pot<EFBFBD>gi
}
else if(token == "calibrate5din"){
// parametry kalibracji wejϾ
// parametry kalibracji wej<EFBFBD><EFBFBD>
Parser.getTokens( 1, false );
int in; Parser >> in;
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
>> Global::fCalibrateIn[ in ][ 0 ] // wyraz wolny
>> Global::fCalibrateIn[ in ][ 1 ] // mno¿nik
>> Global::fCalibrateIn[ in ][ 2 ] // mno¿nik dla kwadratu
>> Global::fCalibrateIn[ in ][ 3 ] // mno¿nik dla szeœcianu
>> Global::fCalibrateIn[ in ][ 4 ] // mno¿nik 4 potêgi
>> Global::fCalibrateIn[ in ][ 5 ]; // mno¿nik 5 potêgi
>> Global::fCalibrateIn[ in ][ 1 ] // mno<EFBFBD>nik
>> Global::fCalibrateIn[ in ][ 2 ] // mno<EFBFBD>nik dla kwadratu
>> Global::fCalibrateIn[ in ][ 3 ] // mno<EFBFBD>nik dla sze<EFBFBD>cianu
>> Global::fCalibrateIn[ in ][ 4 ] // mno<EFBFBD>nik 4 pot<EFBFBD>gi
>> Global::fCalibrateIn[ in ][ 5 ]; // mno<EFBFBD>nik 5 pot<EFBFBD>gi
}
else if(token == "calibrateout"){
// parametry kalibracji wyjϾ
// parametry kalibracji wyj<EFBFBD><EFBFBD>
Parser.getTokens( 1, false );
int out; Parser >> out;
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
>> Global::fCalibrateOut[ out ][ 0 ] // wyraz wolny
>> Global::fCalibrateOut[ out ][ 1 ] // mno¿nik liniowy
>> Global::fCalibrateOut[ out ][ 2 ] // mno¿nik dla kwadratu
>> Global::fCalibrateOut[ out ][ 3 ]; // mno¿nik dla szeœcianu
Global::fCalibrateOut[ out ][ 4 ] = 0.0; // mno¿nik dla 4 potêgi
Global::fCalibrateOut[ out ][ 5 ] = 0.0; // mno¿nik dla 5 potêgi
>> Global::fCalibrateOut[ out ][ 1 ] // mno<EFBFBD>nik liniowy
>> Global::fCalibrateOut[ out ][ 2 ] // mno<EFBFBD>nik dla kwadratu
>> Global::fCalibrateOut[ out ][ 3 ]; // mno<EFBFBD>nik dla sze<EFBFBD>cianu
Global::fCalibrateOut[ out ][ 4 ] = 0.0; // mno<EFBFBD>nik dla 4 pot<EFBFBD>gi
Global::fCalibrateOut[ out ][ 5 ] = 0.0; // mno<EFBFBD>nik dla 5 pot<EFBFBD>gi
}
else if(token == "calibrate5dout"){
// parametry kalibracji wyjϾ
// parametry kalibracji wyj<EFBFBD><EFBFBD>
Parser.getTokens( 1, false );
int out; Parser >> out;
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
>> Global::fCalibrateOut[ out ][ 0 ] // wyraz wolny
>> Global::fCalibrateOut[ out ][ 1 ] // mno¿nik liniowy
>> Global::fCalibrateOut[ out ][ 2 ] // mno¿nik dla kwadratu
>> Global::fCalibrateOut[ out ][ 3 ] // mno¿nik dla szeœcianu
>> Global::fCalibrateOut[ out ][ 4 ] // mno¿nik dla 4 potêgi
>> Global::fCalibrateOut[ out ][ 5 ]; // mno¿nik dla 5 potêgi
>> Global::fCalibrateOut[ out ][ 1 ] // mno<EFBFBD>nik liniowy
>> Global::fCalibrateOut[ out ][ 2 ] // mno<EFBFBD>nik dla kwadratu
>> Global::fCalibrateOut[ out ][ 3 ] // mno<EFBFBD>nik dla sze<EFBFBD>cianu
>> Global::fCalibrateOut[ out ][ 4 ] // mno<EFBFBD>nik dla 4 pot<EFBFBD>gi
>> Global::fCalibrateOut[ out ][ 5 ]; // mno<EFBFBD>nik dla 5 pot<EFBFBD>gi
}
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
>> Global::fCalibrateOutMax[ 0 ]
@@ -588,12 +599,12 @@ void Global::ConfigParse(cParser &Parser) {
>> Global::fCalibrateOutMax[ 6 ];
}
else if( token == "calibrateoutdebuginfo" ) {
// wyjœcie z info o przebiegu kalibracji
// wyj<EFBFBD>cie z info o przebiegu kalibracji
Parser.getTokens( 1, false );
Parser >> Global::iCalibrateOutDebugInfo;
}
else if( token == "pwm" ) {
// zmiana numerów wyjœæ PWM
// zmiana numer<EFBFBD>w wyj<EFBFBD><EFBFBD> PWM
Parser.getTokens( 2, false );
int pwm_out, pwm_no;
Parser
@@ -607,27 +618,27 @@ void Global::ConfigParse(cParser &Parser) {
Parser >> Global::fBrakeStep;
}
else if( token == "joinduplicatedevents" ) {
// czy grupowaæ eventy o tych samych nazwach
// czy grupowa<EFBFBD> eventy o tych samych nazwach
Parser.getTokens(); Parser >> token;
Global::bJoinEvents = ( token == "yes" );
}
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 >> Global::iHiddenEvents;
}
else if( token == "pause" ) {
// czy po wczytaniu ma byæ pauza?
// czy po wczytaniu ma by<EFBFBD> pauza?
Parser.getTokens(); Parser >> token;
iPause |= ( token == "yes" ? 1 : 0 );
}
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 >> Global::asLang;
}
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 >> Global::fOpenGL;
}
@@ -644,50 +655,99 @@ void Global::ConfigParse(cParser &Parser) {
>> Global::Background[ 1 ] // g
>> 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 != "" )
&& ( token != "endconfig" ) ); //(!Parser->EndOfFile)
// na koniec trochê zale¿noœci
if (!bLoadTraction) // wczytywanie drutów i s³upów
{ // tutaj wy³¹czenie, bo mog¹ nie byæ zdefiniowane w INI
bEnableTraction = false; // false = pantograf siê nie po³amie
bLiveTraction = false; // false = pantografy zawsze zbieraj¹ 95% MaxVoltage
// na koniec troch<EFBFBD> zale<EFBFBD>no<EFBFBD>ci
if (!bLoadTraction) // wczytywanie drut<EFBFBD>w i s<EFBFBD>up<EFBFBD>w
{ // tutaj wy<EFBFBD><EFBFBD>czenie, bo mog<EFBFBD> nie by<EFBFBD> zdefiniowane w INI
bEnableTraction = false; // false = pantograf si<EFBFBD> nie po<EFBFBD>amie
bLiveTraction = false; // false = pantografy zawsze zbieraj<EFBFBD> 95% MaxVoltage
}
// if (fMoveLight>0) bDoubleAmbient=false; //wtedy tylko jedno œwiat³o ruchome
// if (fOpenGL<1.3) iMultisampling=0; //mo¿na by z góry wy³¹czyæ, ale nie mamy jeszcze fOpenGL
// if (fMoveLight>0) bDoubleAmbient=false; //wtedy tylko jedno <EFBFBD>wiat<EFBFBD>o ruchome
// 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)
{ // antyaliasing ca³oekranowy wy³¹cza rozmywanie drutów
{ // antyaliasing ca<EFBFBD>oekranowy wy<EFBFBD><EFBFBD>cza rozmywanie drut<EFBFBD>w
bSmoothTraction = false;
}
if (iMultiplayer > 0)
{
bInactivePause = false; // okno "w tle" nie mo¿e pauzowaæ, jeœli w³¹czona komunikacja
// pauzowanie jest zablokowane dla (iMultiplayer&2)>0, wiêc iMultiplayer=1 da siê zapauzowaæ
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<EFBFBD>c iMultiplayer=1 da si<EFBFBD> zapauzowa<EFBFBD>
// (tryb instruktora)
}
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 +
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)
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
// TBD: remove, or launch depending on passed flag?
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
iFpsRadiusMax = 0.000025 * fFpsRadiusMax *
fFpsRadiusMax; // maksymalny promieñ renderowania 3000.0 -> 225
fFpsRadiusMax; // maksymalny promie<EFBFBD> renderowania 3000.0 -> 225
if (iFpsRadiusMax > 400)
iFpsRadiusMax = 400;
if (fDistanceFactor > 1.0)
{ // dla 1.0 specjalny tryb bez przeliczania
fDistanceFactor =
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 *=
(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))
// {
// 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...");
/* TQueryParserComp *Parser;
Parser=new TQueryParserComp(NULL);
@@ -830,7 +890,7 @@ void Global::SetCameraPosition(vector3 pNewCameraPosition)
}
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;
while (pCameraRotation < -M_PI)
pCameraRotation += 2 * M_PI;
@@ -840,7 +900,7 @@ void Global::SetCameraRotation(double Yaw)
}
void Global::BindTexture(GLuint t)
{ // ustawienie aktualnej tekstury, tylko gdy siê zmienia
{ // ustawienie aktualnej tekstury, tylko gdy si<EFBFBD> zmienia
if (t != iTextureId)
{
iTextureId = t;
@@ -848,18 +908,18 @@ void Global::BindTexture(GLuint t)
};
void Global::TrainDelete(TDynamicObject *d)
{ // usuniêcie pojazdu prowadzonego przez u¿ytkownika
{ // usuni<EFBFBD>cie pojazdu prowadzonego przez u<EFBFBD>ytkownika
if (pWorld)
pWorld->TrainDelete(d);
};
TDynamicObject * Global::DynamicNearest()
{ // ustalenie pojazdu najbli¿szego kamerze
{ // ustalenie pojazdu najbli<EFBFBD>szego kamerze
return pGround->DynamicNearest(pCamera->Pos);
};
TDynamicObject * Global::CouplerNearest()
{ // ustalenie pojazdu najbli¿szego kamerze
{ // ustalenie pojazdu najbli<EFBFBD>szego kamerze
return pGround->CouplerNearest(pCamera->Pos);
};
@@ -870,7 +930,7 @@ bool Global::AddToQuery(TEvent *event, TDynamicObject *who)
//---------------------------------------------------------------------------
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;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
@@ -885,146 +945,146 @@ bool Global::DoEvents()
TTranscripts::TTranscripts()
{
iCount = 0; // brak linijek do wyœwietlenia
iStart = 0; // wype³niaæ od linijki 0
iCount = 0; // brak linijek do wy<EFBFBD>wietlenia
iStart = 0; // wype<EFBFBD>nia<EFBFBD> od linijki 0
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].iNext = -1; // nie ma kolejnej
}
fRefreshTime = 360.0; // wartoœc zaporowa
fRefreshTime = 360.0; // warto<EFBFBD>c zaporowa
};
TTranscripts::~TTranscripts(){};
void TTranscripts::AddLine(char const *txt, float show, float hide, bool it)
{ // dodanie linii do tabeli, (show) i (hide) w [s] od aktualnego czasu
if (show == hide)
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;
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) :
false) // póki nie koniec i wczeœniej puszczane
i = aLines[i].iNext; // przejœcie do kolejnej linijki
//(i) wskazuje na liniê, po której nale¿y wstawiæ dany tekst, chyba ¿e
false) // p<EFBFBD>ki nie koniec i wcze<EFBFBD>niej puszczane
i = aLines[i].iNext; // przej<EFBFBD>cie do kolejnej linijki
//(i) wskazuje na lini<EFBFBD>, po kt<EFBFBD>rej nale<EFBFBD>y wstawi<EFBFBD> dany tekst, chyba <EFBFBD>e
while (txt ? *txt : false)
for (j = 0; j < MAX_TRANSCRIPTS; ++j)
if (aLines[j].fHide < 0.0)
{ // znaleziony pierwszy wolny
aLines[j].iNext = aLines[i].iNext; // dotychczasowy nastêpny bêdzie za nowym
if (aLines[iStart].fHide < 0.0) // jeœli tablica jest pusta
iStart = j; // fHide trzeba sprawdziæ przed ewentualnym nadpisaniem, gdy i=j=0
aLines[j].iNext = aLines[i].iNext; // dotychczasowy nast<EFBFBD>pny b<EFBFBD>dzie za nowym
if (aLines[iStart].fHide < 0.0) // je<EFBFBD>li tablica jest pusta
iStart = j; // fHide trzeba sprawdzi<EFBFBD> przed ewentualnym nadpisaniem, gdy i=j=0
else
aLines[i].iNext = j; // a nowy bêdzie za tamtym wczeœniejszym
aLines[j].fShow = show; // wyœwietlaæ od
aLines[j].fHide = hide; // wyœwietlaæ do
aLines[i].iNext = j; // a nowy b<EFBFBD>dzie za tamtym wcze<EFBFBD>niejszym
aLines[j].fShow = show; // wy<EFBFBD>wietla<EFBFBD> od
aLines[j].fHide = hide; // wy<EFBFBD>wietla<EFBFBD> do
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)
{ // jak jest podzia³ linijki na wiersze
{ // jak jest podzia<EFBFBD> linijki na wiersze
aLines[j].asText = aLines[j].asText.substr(0, k - 1);
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
txt = NULL; // koniec dodawania
if (fRefreshTime > show) // jeœli odœwie¿acz ustawiony jest na póŸniej
fRefreshTime = show; // to odœwie¿yæ wczeœniej
break; // wiêcej ju¿ nic
if (fRefreshTime > show) // je<EFBFBD>li od<EFBFBD>wie<EFBFBD>acz ustawiony jest na p<EFBFBD><EFBFBD>niej
fRefreshTime = show; // to od<EFBFBD>wie<EFBFBD>y<EFBFBD> wcze<EFBFBD>niej
break; // wi<EFBFBD>cej ju<EFBFBD> nic
}
};
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)
return; // pusty tekst
int i = 0, j = int(0.5 + 10.0 * len); //[0.1s]
if (*txt == '[')
{ // powinny byæ dwa nawiasy
{ // powinny by<EFBFBD> dwa nawiasy
while (*++txt ? *txt != ']' : false)
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)
{
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)
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)
++txt; // pominiêcie drugiego ]
++txt; // pomini<EFBFBD>cie drugiego ]
}
}
AddLine(txt, 0.1 * i, 0.1 * j, false);
};
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)
return; // nie czas jeszcze na zmiany
// czas odœwie¿enia mo¿na ustaliæ wg tabelki, kiedy coœ siê w niej zmienia
fRefreshTime = Global::fTimeAngleDeg + 360.0; // wartoϾ zaporowa
int i = iStart, j = -1; // od czegoœ trzeba zacz¹æ
bool change = false; // czy zmieniaæ napisy?
// 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<EFBFBD><EFBFBD> zaporowa
int i = iStart, j = -1; // od czego<EFBFBD> trzeba zacz<EFBFBD><EFBFBD>
bool change = false; // czy zmienia<EFBFBD> napisy?
do
{
if (aLines[i].fHide >= 0.0) // o ile aktywne
if (aLines[i].fHide < Global::fTimeAngleDeg)
{ // gdy czas wyœwietlania up³yn¹³
aLines[i].fHide = -1.0; // teraz bêdzie woln¹ pozycj¹
{ // gdy czas wy<EFBFBD>wietlania up<EFBFBD>yn<EFBFBD><EFBFBD>
aLines[i].fHide = -1.0; // teraz b<EFBFBD>dzie woln<EFBFBD> pozycj<EFBFBD>
if (i == iStart)
iStart = aLines[i].iNext >= 0 ? aLines[i].iNext : 0; // przestawienie pierwszego
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;
}
else
{ // gdy ma byæ pokazane
if (aLines[i].fShow > Global::fTimeAngleDeg) // bêdzie pokazane w przysz³oœci
if (fRefreshTime > aLines[i].fShow) // a nie ma nic wczeœniej
{ // gdy ma by<EFBFBD> pokazane
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<EFBFBD>niej
fRefreshTime = aLines[i].fShow;
if (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;
i = aLines[i].iNext; // kolejna linijka
} while (i >= 0); // póki po tablicy
change = true; // bo na razie nie ma warunku, ¿e coœ siê doda³o
} while (i >= 0); // p<EFBFBD>ki po tablicy
change = true; // bo na razie nie ma warunku, <EFBFBD>e co<EFBFBD> si<EFBFBD> doda<EFBFBD>o
if (change)
{ // aktualizacja linijek ekranowych
i = iStart;
j = -1;
do
{
if (aLines[i].fHide > 0.0) // jeœli nie ukryte
if (aLines[i].fShow < Global::fTimeAngleDeg) // to dodanie linijki do wyœwietlania
if (aLines[i].fHide > 0.0) // je<EFBFBD>li nie ukryte
if (aLines[i].fShow < Global::fTimeAngleDeg) // to dodanie linijki do wy<EFBFBD>wietlania
if (j < 5 - 1) // ograniczona liczba linijek
Global::asTranscript[++j] = aLines[i].asText; // skopiowanie tekstu
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)
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"
" ^^L$A|S^CS<--RZo±,l'uP.,as>L\"lz"
"<EFBFBD>^^L$A|S^CS<--RZo<EFBFBD>,l'uP.,as>L\"lz"
"RAAAALCCCEEEEIIDDNNOOOOxRUUUUYTB"
"raaaalccceeeeiiddnnoooo-ruuuuyt?";
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)
if (str[i] & 0x80)
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] = ' ';
else if (_)
if (str[i] == '_') // nazwy stacji nie mog¹ zawieraæ spacji
str[i] = ' '; // wiêc trzeba wyœwietlaæ inaczej
if (str[i] == '_') // nazwy stacji nie mog<EFBFBD> zawiera<EFBFBD> spacji
str[i] = ' '; // wi<EFBFBD>c trzeba wy<EFBFBD>wietla<EFBFBD> inaczej
return str;
};
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( vel2 == -1.0 ) { vel2 = std::numeric_limits<double>::max(); }
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 MaxKeys = 74;
// klasy dla wskaŸników globalnych
// klasy dla wska<EFBFBD>nik<EFBFBD>w globalnych
class TGround;
class TWorld;
class TCamera;
@@ -121,21 +121,21 @@ class TEvent;
class TTextSound;
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:
float fShow; // czas pokazania
float fHide; // czas ukrycia/usuniêcia
std::string asText; // tekst gotowy do wyœwietlenia (usuniête znaczniki czasu)
bool bItalic; // czy kursywa (dŸwiêk nieistotny dla prowadz¹cego)
int iNext; // nastêpna u¿ywana linijka, ¿eby nie przestawiaæ fizycznie tabeli
float fHide; // czas ukrycia/usuni<EFBFBD>cia
std::string asText; // tekst gotowy do wy<EFBFBD>wietlenia (usuni<EFBFBD>te znaczniki czasu)
bool bItalic; // czy kursywa (d<EFBFBD>wi<EFBFBD>k nieistotny dla prowadz<EFBFBD>cego)
int iNext; // nast<EFBFBD>pna u<EFBFBD>ywana linijka, <EFBFBD>eby nie przestawia<EFBFBD> fizycznie tabeli
};
#define MAX_TRANSCRIPTS 30
class TTranscripts
{ // klasa obs³uguj¹ca napisy do dŸwiêków
TTranscript aLines[MAX_TRANSCRIPTS]; // pozycje na napisy do wyœwietlenia
int iCount; // liczba zajêtych pozycji
int iStart; // pierwsza istotna pozycja w tabeli, ¿eby sortowaæ przestawiaj¹c numerki
{ // klasa obs<EFBFBD>uguj<EFBFBD>ca napisy do d<EFBFBD>wi<EFBFBD>k<EFBFBD>w
TTranscript aLines[MAX_TRANSCRIPTS]; // pozycje na napisy do wy<EFBFBD>wietlenia
int iCount; // liczba zaj<EFBFBD>tych pozycji
int iStart; // pierwsza istotna pozycja w tabeli, <EFBFBD>eby sortowa<EFBFBD> przestawiaj<EFBFBD>c numerki
float fRefreshTime;
public:
@@ -143,20 +143,20 @@ class TTranscripts
~TTranscripts();
void AddLine(char const *txt, float show, float hide, bool it);
void Add(char const *txt, float len,
bool backgorund = false); // dodanie tekstów, d³ugoœæ dŸwiêku, czy istotne
void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekundê)
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<EFBFBD>)
};
class Global
{
private:
static GLuint iTextureId; // ostatnio u¿yta tekstura 2D
static GLuint iTextureId; // ostatnio u<EFBFBD>yta tekstura 2D
public:
// double Global::tSinceStart;
static int Keys[MaxKeys];
static Math3D::vector3 pCameraPosition; // pozycja kamery w œwiecie
static Math3D::vector3 pCameraPosition; // pozycja kamery w <EFBFBD>wiecie
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 Math3D::vector3 pFreeCameraInit[ 10 ]; // pozycje kamery
static Math3D::vector3 pFreeCameraInitAngle[ 10 ];
@@ -227,81 +227,81 @@ class Global
static std::string asSky;
static bool bnewAirCouplers;
// Ra: nowe zmienne globalne
static int iDefaultFiltering; // domyœlne rozmywanie tekstur TGA
static int iBallastFiltering; // domyœlne rozmywanie tekstury podsypki
static int iRailProFiltering; // domyœlne rozmywanie tekstury szyn
static int iDynamicFiltering; // domyœlne rozmywanie tekstur pojazdów
static int iReCompile; // zwiêkszany, gdy trzeba odœwie¿yæ siatki
static int iDefaultFiltering; // domy<EFBFBD>lne rozmywanie tekstur TGA
static int iBallastFiltering; // domy<EFBFBD>lne rozmywanie tekstury podsypki
static int iRailProFiltering; // domy<EFBFBD>lne rozmywanie tekstury szyn
static int iDynamicFiltering; // domy<EFBFBD>lne rozmywanie tekstur pojazd<EFBFBD>w
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 int iFeedbackMode; // tryb pracy informacji zwrotnej
static int iFeedbackPort; // dodatkowy adres dla informacji zwrotnych
static double fOpenGL; // wersja OpenGL - przyda siê
static bool bOpenGL_1_5; // czy s¹ dostêpne funkcje OpenGL 1.5
static double fLuminance; // jasnoœæ œwiat³a do automatycznego zapalania
static int iMultiplayer; // blokada dzia³ania niektórych eventów na rzecz kominikacji
static double fOpenGL; // wersja OpenGL - przyda si<EFBFBD>
static bool bOpenGL_1_5; // czy s<EFBFBD> dost<EFBFBD>pne funkcje OpenGL 1.5
static double fLuminance; // jasno<EFBFBD><EFBFBD> <20>wiat<EFBFBD>a do automatycznego zapalania
static int iMultiplayer; // blokada dzia<EFBFBD>ania niekt<EFBFBD>rych event<EFBFBD>w na rzecz kominikacji
static HWND hWnd; // uchwyt okna
static int iCameraLast;
static std::string asRelease; // numer
static std::string asVersion; // z opisem
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 int iTextMode; // tryb pracy wyœwietlacza tekstowego
static int iScreenMode[12]; // numer ekranu wyœwietlacza tekstowego
static bool bDoubleAmbient; // podwójna jasnoœæ ambient
static int iTextMode; // tryb pracy wy<EFBFBD>wietlacza tekstowego
static int iScreenMode[12]; // numer ekranu wy<EFBFBD>wietlacza tekstowego
static bool bDoubleAmbient; // podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
static double fMoveLight; // numer dnia w roku albo -1
static bool bSmoothTraction; // wyg³adzanie drutów
static double fSunDeclination; // deklinacja S³oñca
static double fTimeSpeed; // przyspieszenie czasu, zmienna do testów
static double fTimeAngleDeg; // godzina w postaci k¹ta
static float fClockAngleDeg[6]; // k¹ty obrotu cylindrów dla zegara cyfrowego
static double fLatitudeDeg; // szerokoϾ geograficzna
static bool bSmoothTraction; // wyg<EFBFBD>adzanie drut<EFBFBD>w
static double fSunDeclination; // deklinacja S<EFBFBD>o<EFBFBD>ca
static double fTimeSpeed; // przyspieszenie czasu, zmienna do test<EFBFBD>w
static double fTimeAngleDeg; // godzina w postaci k<EFBFBD>ta
static float fClockAngleDeg[6]; // k<EFBFBD>ty obrotu cylindr<EFBFBD>w dla zegara cyfrowego
static double fLatitudeDeg; // szeroko<EFBFBD><EFBFBD> geograficzna
static char *szTexturesTGA[4]; // lista tekstur od TGA
static char *szTexturesDDS[4]; // lista tekstur od DDS
static int iMultisampling; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px
static bool bGlutFont; // tekst generowany przez GLUT
static int iKeyLast; // ostatnio naciœniêty klawisz w celu logowania
static int iPause; // globalna pauza ruchu: b0=start,b1=klawisz,b2=t³o,b3=lagi,b4=wczytywanie
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<EFBFBD>o,b3=lagi,b4=wczytywanie
static bool bActive; // czy jest aktywnym oknem
static void BindTexture(GLuint t);
static int iConvertModels; // tworzenie plików binarnych
static int iErorrCounter; // licznik sprawdzañ do œledzenia b³êdów OpenGL
static int iConvertModels; // tworzenie plik<EFBFBD>w binarnych
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 int iTextures; // licznik u¿ytych tekstur
static int iSlowMotionMask; // maska wy³¹czanych w³aœciwoœci
static int iModifyTGA; // czy korygowaæ pliki TGA dla szybszego wczytywania
static int iTextures; // licznik u<EFBFBD>ytych tekstur
static int iSlowMotionMask; // maska wy<EFBFBD><EFBFBD>czanych w<EFBFBD>a<EFBFBD>ciwo<EFBFBD>ci
static int iModifyTGA; // czy korygowa<EFBFBD> pliki TGA dla szybszego wczytywania
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 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 int iSegmentsRendered; // iloœæ segmentów do regulacji wydajnoœci
static double fFpsAverage; // oczekiwana wartosæ FPS
static int iSegmentsRendered; // ilo<EFBFBD><EFBFBD> segment<EFBFBD>w do regulacji wydajno<EFBFBD>ci
static double fFpsAverage; // oczekiwana wartos<EFBFBD> FPS
static double fFpsDeviation; // odchylenie standardowe FPS
static double fFpsMin; // dolna granica FPS, przy której promieñ scenerii bêdzie zmniejszany
static double fFpsMax; // górna granica FPS, przy której promieñ scenerii bêdzie zwiêkszany
static double fFpsRadiusMax; // maksymalny promieñ renderowania
static int iFpsRadiusMax; // maksymalny promieñ renderowania w rozmiarze tabeli sektorów
static double fRadiusFactor; // wspó³czynnik zmiany promienia
static double fFpsMin; // dolna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zmniejszany
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<EFBFBD> renderowania
static int iFpsRadiusMax; // maksymalny promie<EFBFBD> renderowania w rozmiarze tabeli sektor<EFBFBD>w
static double fRadiusFactor; // wsp<EFBFBD><EFBFBD>czynnik zmiany promienia
static TCamera *pCamera; // parametry kamery
static TDynamicObject *pUserDynamic; // pojazd u¿ytkownika, renderowany bez trzêsienia
static double fCalibrateIn[6][6]; // parametry kalibracyjne wejϾ z pulpitu
static double fCalibrateOut[7][6]; // parametry kalibracyjne wyjϾ dla pulpitu
static double fCalibrateOutMax[7]; // wartoœci maksymalne wyjœæ dla pulpitu
static int iCalibrateOutDebugInfo; // numer wyjœcia kalibrowanego dla którego wyœwietlaæ
static TDynamicObject *pUserDynamic; // pojazd u<EFBFBD>ytkownika, renderowany bez trz<EFBFBD>sienia
static double fCalibrateIn[6][6]; // parametry kalibracyjne wej<EFBFBD><EFBFBD> z pulpitu
static double fCalibrateOut[7][6]; // parametry kalibracyjne wyj<EFBFBD><EFBFBD> dla pulpitu
static double fCalibrateOutMax[7]; // warto<EFBFBD>ci maksymalne wyj<EFBFBD><EFBFBD> dla pulpitu
static int iCalibrateOutDebugInfo; // numer wyj<EFBFBD>cia kalibrowanego dla kt<EFBFBD>rego wy<EFBFBD>wietla<EFBFBD>
// informacje podczas kalibracji
static double fBrakeStep; // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
static bool bJoinEvents; // czy grupowaæ eventy o tych samych nazwach
static bool bSmudge; // czy wyœwietlaæ smugê, a pojazd u¿ytkownika na koñcu
static bool bJoinEvents; // czy grupowa<EFBFBD> eventy o tych samych nazwach
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 TTranscripts tranTexts; // obiekt obs³uguj¹cy stenogramy dŸwiêków na ekranie
static std::string asLang; // domyœlny jêzyk - http://tools.ietf.org/html/bcp47
static int iHiddenEvents; // czy ³¹czyæ eventy z torami poprzez nazwê toru
static TTextSound *tsRadioBusy[10]; // zajêtoœæ kana³ów radiowych (wskaŸnik na odgrywany dŸwiêk)
static int iPoKeysPWM[7]; // numery wejϾ dla PWM
static TTranscripts tranTexts; // obiekt obs<EFBFBD>uguj<EFBFBD>cy stenogramy d<EFBFBD>wi<EFBFBD>k<EFBFBD>w na ekranie
static std::string asLang; // domy<EFBFBD>lny j<EFBFBD>zyk - http://tools.ietf.org/html/bcp47
static int iHiddenEvents; // czy <EFBFBD><EFBFBD>czy<EFBFBD> eventy z torami poprzez nazw<EFBFBD> toru
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<EFBFBD><EFBFBD> dla PWM
// metody
static void TrainDelete(TDynamicObject *d);
@@ -314,5 +314,18 @@ class Global
static std::string Bezogonkow(std::string str, bool _ = false);
static double Min0RSpeed(double vel1, double vel2);
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
begin
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
else
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 ggCabLightDimButton; // hunter-091012: przelacznik przyciemnienia
TGauge ggBatteryButton; // Stele 161228 hebelek baterii
// oswietlenia kabiny
// NBMX wrzesien 2003 - obsluga drzwi
@@ -267,6 +268,7 @@ private:
TButton btLampkaBocznik4;
TButton btLampkaRadiotelefon;
TButton btLampkaHamienie;
TButton btLampkaED; //Stele 161228 hamowanie elektrodynamiczne
TButton btLampkaJazda; // Ra: nie u篡wane
// KURS90
TButton btLampkaBoczniki;