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

Merged branch mover_in_c++ into mover_in_c++

This commit is contained in:
firleju
2017-02-16 19:19:19 +01:00
17 changed files with 743 additions and 714 deletions

View File

@@ -114,7 +114,7 @@ int Console::iMode = 0;
int Console::iConfig = 0; int Console::iConfig = 0;
TPoKeys55 *Console::PoKeys55[2] = {NULL, NULL}; TPoKeys55 *Console::PoKeys55[2] = {NULL, NULL};
TLPT *Console::LPT = NULL; TLPT *Console::LPT = NULL;
MWDComm *Console::MWD = NULL; // maciek001: obiekt dla MWD TMWDComm *Console::MWDComm = NULL; // maciek001: obiekt dla MWD
int Console::iSwitch[8]; // bistabilne w kabinie, załączane z [Shift], wyłączane bez 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 int Console::iButton[8]; // monostabilne w kabinie, załączane podczas trzymania klawisza
@@ -126,13 +126,14 @@ Console::Console()
iSwitch[i] = 0; // bity 0..127 - bez [Ctrl], 128..255 - z [Ctrl] iSwitch[i] = 0; // bity 0..127 - bez [Ctrl], 128..255 - z [Ctrl]
iButton[i] = 0; // bity 0..127 - bez [Shift], 128..255 - z [Shift] iButton[i] = 0; // bity 0..127 - bez [Shift], 128..255 - z [Shift]
} }
MWDComm = NULL;
}; };
Console::~Console() Console::~Console()
{ {
delete PoKeys55[0]; delete PoKeys55[0];
delete PoKeys55[1]; delete PoKeys55[1];
delete MWD; delete MWDComm;
}; };
void Console::ModeSet(int m, int h) void Console::ModeSet(int m, int h)
@@ -177,17 +178,20 @@ int Console::On()
PoKeys55[0] = NULL; PoKeys55[0] = NULL;
} }
break; break;
case 5: // maciek001: MWD OK
MWD = new MWDComm();
if (!(MWD->Open()))
{
delete MWD;
iMode = 0;
Global::iFeedbackMode = 0;
WriteLog("COM Port not open!");
}
break;
} }
if (Global::bMWDmasterEnable)
{
WriteLog("Opening ComPort");
MWDComm = new TMWDComm();
if (!(MWDComm->Open())) // jeżeli nie otwarł portu
{
WriteLog("ERROR: ComPort is NOT OPEN!");
delete MWDComm;
MWDComm = NULL;
}
}
return 0; return 0;
}; };
@@ -206,8 +210,8 @@ void Console::Off()
PoKeys55[1] = NULL; PoKeys55[1] = NULL;
delete LPT; delete LPT;
LPT = NULL; LPT = NULL;
delete MWD; // maciek001: zamykanie portu COM i takie tam inne ;) delete MWDComm;
MWD = NULL; MWDComm = NULL;
}; };
void Console::BitsSet(int mask, int entry) void Console::BitsSet(int mask, int entry)
@@ -296,104 +300,57 @@ void Console::BitsUpdate(int mask)
PoKeys55[0]->Write(0x40, 16 - 1, (iBits & 0x4000) ? 1 : 0); PoKeys55[0]->Write(0x40, 16 - 1, (iBits & 0x4000) ? 1 : 0);
} }
break; break;
case 5: // maciek001: MWD lampki i kontrolki }
/* out3: ogrzewanie sk?adu, opory rozruchowe, poslizg, zaluzjewent, -, -, czuwak, shp if (Global::bMWDmasterEnable)
out4: stycz.liniowe, pezekaznikróżnicobwpomoc, nadmiarprzetw, roznicowy obw. gł, {
nadmiarsilniki, wylszybki, zanikprąduprzyjeździenaoporach, nadmiarsprezarki // maciek001: MWDComm lampki i kontrolki
out5: HASLER */ // out3: ogrzewanie sk?adu, opory rozruchowe, poslizg, zaluzjewent, -, -, czuwak, shp
if (mask & 0x0001) // out4: stycz.liniowe, pezekaznikr??nicobwpomoc, nadmiarprzetw, roznicowy obw. g?, nadmiarsilniki, wylszybki, zanikpr?duprzyje?dzienaoporach, nadmiarsprezarki
if (iBits & 1) // out5: HASLER */
{ if (mask & 0x0001) if (iBits & 1) {
MWD->WriteDataBuff[4] |= 1 << 7; // SHP HASLER też MWDComm->WriteDataBuff[4] |= 1 << 7; // SHP HASLER też
if (!MWD->bSHPstate) if (!MWDComm->bSHPstate) {
{ MWDComm->bSHPstate = true;
MWD->bSHPstate = true; MWDComm->bPrzejazdSHP = true;
MWD->bPrzejazdSHP = true; }
} else MWDComm->bPrzejazdSHP = false;
else }
MWD->bPrzejazdSHP = false; else {
} MWDComm->WriteDataBuff[4] &= ~(1 << 7);
else MWDComm->bPrzejazdSHP = false;
{ MWDComm->bSHPstate = false;
MWD->WriteDataBuff[4] &= ~(1 << 7); }
MWD->bPrzejazdSHP = false; if (mask & 0x0002) if (iBits & 2) MWDComm->WriteDataBuff[4] |= 1 << 6; // CA
MWD->bSHPstate = false; else MWDComm->WriteDataBuff[4] &= ~(1 << 6);
} if (mask & 0x0004) if (iBits & 4) MWDComm->WriteDataBuff[4] |= 1 << 1; // jazda na oporach rozruchowych
if (mask & 0x0002) else MWDComm->WriteDataBuff[4] &= ~(1 << 1);
if (iBits & 2) if (mask & 0x0008) if (iBits & 8) MWDComm->WriteDataBuff[5] |= 1 << 5; // wy??cznik szybki
MWD->WriteDataBuff[4] |= 1 << 6; // CA else MWDComm->WriteDataBuff[5] &= ~(1 << 5);
else if (mask & 0x0010) if (iBits & 0x10) MWDComm->WriteDataBuff[5] |= 1 << 4; // nadmiarowy silnik?w trakcyjnych
MWD->WriteDataBuff[4] &= ~(1 << 6); else MWDComm->WriteDataBuff[5] &= ~(1 << 4);
if (mask & 0x0004) if (mask & 0x0020) if (iBits & 0x20) MWDComm->WriteDataBuff[4] |= 1 << 0; // styczniki liniowe
if (iBits & 4) else MWDComm->WriteDataBuff[5] &= ~(1 << 0);
MWD->WriteDataBuff[4] |= 1 << 1; // jazda na oporach rozruchowych if (mask & 0x0040) if (iBits & 0x40) MWDComm->WriteDataBuff[4] |= 1 << 2; // po?lizg
else else MWDComm->WriteDataBuff[4] &= ~(1 << 2);
MWD->WriteDataBuff[4] &= ~(1 << 1); if (mask & 0x0080) if (iBits & 0x80) MWDComm->WriteDataBuff[5] |= 1 << 2; // (nadmiarowy) przetwornicy? ++
if (mask & 0x0008) else MWDComm->WriteDataBuff[5] &= ~(1 << 2);
if (iBits & 8) if (mask & 0x0100) if (iBits & 0x100) MWDComm->WriteDataBuff[5] |= 1 << 7; // nadmiarowy spr??arki
MWD->WriteDataBuff[5] |= 1 << 5; // wyłącznik szybki else MWDComm->WriteDataBuff[5] &= ~(1 << 7);
else if (mask & 0x0200) if (iBits & 0x200) MWDComm->WriteDataBuff[2] |= 1 << 1; // wentylatory i opory
MWD->WriteDataBuff[5] &= ~(1 << 5); else MWDComm->WriteDataBuff[2] &= ~(1 << 1);
if (mask & 0x0010) if (mask & 0x0400) if (iBits & 0x400) MWDComm->WriteDataBuff[2] |= 1 << 2; // wysoki rozruch
if (iBits & 0x10) else MWDComm->WriteDataBuff[2] &= ~(1 << 2);
MWD->WriteDataBuff[5] |= 1 << 4; // nadmiarowy silników trakcyjnych if (mask & 0x0800) if (iBits & 0x800) MWDComm->WriteDataBuff[4] |= 1 << 0; // ogrzewanie poci?gu
else else MWDComm->WriteDataBuff[4] &= ~(1 << 0);
MWD->WriteDataBuff[5] &= ~(1 << 4); if (mask & 0x1000) if (iBits & 0x1000) MWDComm->bHamowanie = true; // hasler: ci?nienie w hamulcach HASLER rysik 2
if (mask & 0x0020) else MWDComm->bHamowanie = false;
if (iBits & 0x20) if (mask & 0x2000) if (iBits & 0x2000) MWDComm->WriteDataBuff[6] |= 1 << 4; // hasler: pr?d "na" silnikach HASLER rysik 3
MWD->WriteDataBuff[4] |= 1 << 0; // styczniki liniowe else MWDComm->WriteDataBuff[6] &= ~(1 << 4);
else if (mask & 0x4000) if (iBits & 0x4000) MWDComm->WriteDataBuff[6] |= 1 << 7; // brz?czyk SHP/CA
MWD->WriteDataBuff[5] &= ~(1 << 0); else MWDComm->WriteDataBuff[6] &= ~(1 << 7);
if (mask & 0x0040) //if(mask & 0x8000) if(iBits & 0x8000) MWDComm->WriteDataBuff[1] |= 1<<7; (puste)
if (iBits & 0x40) //else MWDComm->WriteDataBuff[0] &= ~(1<<7);
MWD->WriteDataBuff[4] |= 1 << 2; // poślizg }
else
MWD->WriteDataBuff[4] &= ~(1 << 2);
if (mask & 0x0080)
if (iBits & 0x80)
MWD->WriteDataBuff[5] |= 1 << 2; // (nadmiarowy) przetwornicy? ++
else
MWD->WriteDataBuff[5] &= ~(1 << 2);
if (mask & 0x0100)
if (iBits & 0x100)
MWD->WriteDataBuff[5] |= 1 << 7; // nadmiarowy sprężarki
else
MWD->WriteDataBuff[5] &= ~(1 << 7);
if (mask & 0x0200)
if (iBits & 0x200)
MWD->WriteDataBuff[2] |= 1 << 1; // wentylatory i opory
else
MWD->WriteDataBuff[2] &= ~(1 << 1);
if (mask & 0x0400)
if (iBits & 0x400)
MWD->WriteDataBuff[2] |= 1 << 2; // wysoki rozruch
else
MWD->WriteDataBuff[2] &= ~(1 << 2);
if (mask & 0x0800)
if (iBits & 0x800)
MWD->WriteDataBuff[4] |= 1 << 0; // ogrzewanie pociągu
else
MWD->WriteDataBuff[4] &= ~(1 << 0);
if (mask & 0x1000)
if (iBits & 0x1000)
MWD->bHamowanie = true; // hasler: ciśnienie w hamulcach HASLER rysik 2
else
MWD->bHamowanie = false;
if (mask & 0x2000)
if (iBits & 0x2000)
MWD->WriteDataBuff[6] |=
1 << 4; // hasler: prąd "na" silnikach HASLER rysik 3
else
MWD->WriteDataBuff[6] &= ~(1 << 4);
if (mask & 0x4000)
if (iBits & 0x4000)
MWD->WriteDataBuff[6] |= 1 << 7; // brzęczyk SHP/CA
else
MWD->WriteDataBuff[6] &= ~(1 << 7);
// if(mask & 0x8000) if(iBits & 0x8000) MWD->WriteDataBuff[1] |= 1<<7; (puste)
// else MWD->WriteDataBuff[0] &= ~(1<<7);
break;
}
}; };
bool Console::Pressed(int x) bool Console::Pressed(int x)
@@ -431,61 +388,43 @@ void Console::ValueSet(int x, double y)
WriteLog(" calibrated=" + std::to_string(temp)); WriteLog(" calibrated=" + std::to_string(temp));
PoKeys55[0]->PWM(x, temp); PoKeys55[0]->PWM(x, temp);
} }
if (iMode == 5 && MWD) // pwm-y i prędkość if (Global::bMWDmasterEnable)
{ {
unsigned int iliczba; unsigned int iliczba;
if (x == 0) switch (x)
{ {
iliczba = (unsigned int)floor((y / (Global::fMWDzg[0] * 10) * Global::fMWDzg[1]) + case 0: iliczba = (unsigned int)floor((y / (Global::fMWDzg[0] * 10) * Global::fMWDzg[1]) + 0.5); // zbiornik g??wny
0.5); // zbiornik główny MWDComm->WriteDataBuff[12] = (unsigned char)(iliczba >> 8);
MWD->WriteDataBuff[12] = (unsigned char)(iliczba >> 8); MWDComm->WriteDataBuff[11] = (unsigned char)iliczba;
MWD->WriteDataBuff[11] = (unsigned char)iliczba; break;
} case 1: iliczba = (unsigned int)floor((y / (Global::fMWDpg[0] * 10) * Global::fMWDpg[1]) + 0.5); // przew?d g??wny
else if (x == 1) MWDComm->WriteDataBuff[10] = (unsigned char)(iliczba >> 8);
{ MWDComm->WriteDataBuff[9] = (unsigned char)iliczba;
iliczba = (unsigned int)floor((y / (Global::fMWDpg[0] * 10) * Global::fMWDpg[1]) + break;
0.5); // przewód główny case 2: iliczba = (unsigned int)floor((y / (Global::fMWDph[0] * 10) * Global::fMWDph[1]) + 0.5); // cylinder hamulcowy
MWD->WriteDataBuff[10] = (unsigned char)(iliczba >> 8); MWDComm->WriteDataBuff[8] = (unsigned char)(iliczba >> 8);
MWD->WriteDataBuff[9] = (unsigned char)iliczba; MWDComm->WriteDataBuff[7] = (unsigned char)iliczba;
} break;
else if (x == 2) case 3: iliczba = (unsigned int)floor((y / Global::fMWDvolt[0] * Global::fMWDvolt[1]) + 0.5); // woltomierz WN
{ MWDComm->WriteDataBuff[14] = (unsigned char)(iliczba >> 8);
iliczba = (unsigned int)floor((y / (Global::fMWDph[0] * 10) * Global::fMWDph[1]) + MWDComm->WriteDataBuff[13] = (unsigned char)iliczba;
0.5); // cylinder hamulcowy break;
MWD->WriteDataBuff[8] = (unsigned char)(iliczba >> 8); case 4: iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 1
MWD->WriteDataBuff[7] = (unsigned char)iliczba; MWDComm->WriteDataBuff[16] = (unsigned char)(iliczba >> 8);
} MWDComm->WriteDataBuff[15] = (unsigned char)iliczba;
else if (x == 3) break;
{ case 5: iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 2
iliczba = (unsigned int)floor((y / Global::fMWDvolt[0] * Global::fMWDvolt[1]) + MWDComm->WriteDataBuff[18] = (unsigned char)(iliczba >> 8);
0.5); // woltomierz WN MWDComm->WriteDataBuff[17] = (unsigned char)iliczba;
MWD->WriteDataBuff[14] = (unsigned char)(iliczba >> 8); break;
MWD->WriteDataBuff[13] = (unsigned char)iliczba; case 6: iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 3
} MWDComm->WriteDataBuff[20] = (unsigned int)(iliczba >> 8);
else if (x == 4) MWDComm->WriteDataBuff[19] = (unsigned char)iliczba;
{ break;
iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + case 7: MWDComm->WriteDataBuff[0] = (unsigned char)floor(y); // prędkość
0.5); // amp WN 1 break;
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ędkość
}
}; };
void Console::Update() void Console::Update()
@@ -503,10 +442,11 @@ void Console::Update()
Global::iPause |= 8; // tak??? Global::iPause |= 8; // tak???
PoKeys55[0]->Connect(); // próba ponownego podłączenia PoKeys55[0]->Connect(); // próba ponownego podłączenia
} }
if (iMode == 5) // Obs?uga MWD OK if (Global::bMWDmasterEnable)
{ {
MWD->Run(); if (MWDComm->GetMWDState()) MWDComm->Run();
} else MWDComm->Close();
}
}; };
float Console::AnalogGet(int x) float Console::AnalogGet(int x)
@@ -531,25 +471,19 @@ float Console::AnalogCalibrateGet(int x)
b + b +
Global::fCalibrateIn[x][0]; Global::fCalibrateIn[x][0];
} }
if (iMode == 5 && MWD) // maciek001: obs?uga hamulc?w (wej?? analogowych) OK if (Global::bMWDmasterEnable && Global::bMWDBreakEnable)
{ {
float b = MWD->fAnalog[x]; float b = (float)MWDComm->uiAnalog[x];
// b = b = (b - Global::fMWDAnalogInCalib[x][0]) / (Global::fMWDAnalogInCalib[x][1] - Global::fMWDAnalogInCalib[x][0]);
// b*(Global::fMWDAnalogCalib[x][0]-Global::fMWDAnalogCalib[x][1])/Global::fMWDAnalogCalib[x][3]+Global::fMWDAnalogCalib[x][1]/Global::fMWDAnalogCalib[x][3]; switch (x)
b = (b - Global::fMWDAnalogCalib[x][1]) / {
(Global::fMWDAnalogCalib[x][1] - Global::fMWDAnalogCalib[x][0]); case 0: return (b * 8 - 2);
switch (x) break;
{ case 1: return (b * 10);
case 0: break;
return (b * 8 - 2); default: return 0;
break; }
case 1: }
return (b * 10);
break;
default:
return 0;
}
}
return -1.0; // odcięcie return -1.0; // odcięcie
}; };

View File

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

View File

@@ -22,55 +22,62 @@ http://mozilla.org/MPL/2.0/.
#include <windows.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; HANDLE hComm;
MWDComm::MWDComm() // konstruktor TMWDComm::TMWDComm() // konstruktor
{ {
MWDTime = 0; MWDTime = 0;
bSHPstate = false; bSHPstate = false;
bPrzejazdSHP = false; bPrzejazdSHP = false;
bKabina1 = true; // pasuje wyciągnąć dane na temat kabiny i ustawiać te dwa parametry! bKabina1 = true; // pasuje wyciągnąć dane na temat kabiny i ustawiać te dwa parametry!
bKabina2 = false; bKabina2 = false;
bHamowanie = false; bHamowanie = false;
bCzuwak = false; bCzuwak = false;
bRysik1H = false; bRysik1H = false;
bRysik1L = false; bRysik1L = false;
bRysik2H = false; bRysik2H = false;
bRysik2L = false; bRysik2L = false;
bocznik = 0; bocznik = 0;
nastawnik = 0; nastawnik = 0;
kierunek = 0; kierunek = 0;
bnkMask = 0; bnkMask = 0;
int i = 0; int i = 6;
while (i < BYTETOWRITE)
{ while (i)
if (i < BYTETOREAD) {
ReadDataBuff[i] = 0; i--;
WriteDataBuff[i] = 0; lastStateData[i] = 0;
i++; maskData[i] = 0;
} maskSwitch[i] = 0;
i = 0; bitSwitch[i] = 0;
while (i < 6) }
{
lastStateData[i] = 0; i = 0;
maskSwitch[i] = 0; while (i<BYTETOWRITE)
bitSwitch[i] = 0; {
i++; 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 TMWDComm::~TMWDComm() // destruktor
{ {
Close(); Close();
} }
bool MWDComm::Open() // otwieranie portu COM bool TMWDComm::Open() // otwieranie portu COM
{ {
LPCSTR portId = Global::sMWDPortId.c_str(); LPCSTR portId = Global::sMWDPortId.c_str();
hComm = CreateFile(portId, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, hComm = CreateFile(portId, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
@@ -124,8 +131,12 @@ bool MWDComm::Open() // otwieranie portu COM
return TRUE; return TRUE;
} }
bool MWDComm::Close() // zamykanie portu COM bool TMWDComm::Close() // zamykanie portu COM
{ {
Global::bMWDmasterEnable = false; // główne włączenie portu!
Global::bMWDInputEnable = false; // włącz wejścia
Global::bMWDBreakEnable = false; // włącz wejścia analogowe
WriteLog("COM Port is closing..."); WriteLog("COM Port is closing...");
int i = 0; int i = 0;
while (i < BYTETOWRITE) // zerowanie danych... while (i < BYTETOWRITE) // zerowanie danych...
@@ -141,7 +152,7 @@ bool MWDComm::Close() // zamykanie portu COM
return TRUE; return TRUE;
} }
inline bool MWDComm::GetMWDState() // sprawdzanie otwarcia portu COM inline bool TMWDComm::GetMWDState() // sprawdzanie otwarcia portu COM
{ {
if (hComm > 0) if (hComm > 0)
return 1; return 1;
@@ -149,26 +160,33 @@ inline bool MWDComm::GetMWDState() // sprawdzanie otwarcia portu COM
return 0; return 0;
} }
bool MWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i zapis do zmiennych bool TMWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i zapis do zmiennych
{ {
DWORD bytes_read; DWORD bytes_read;
ReadFile(hComm, &ReadDataBuff[0], BYTETOREAD, &bytes_read, NULL); ReadFile(hComm, &ReadDataBuff[0], BYTETOREAD, &bytes_read, NULL);
fAnalog[0] = if (Global::bMWDBreakEnable)
(float)((ReadDataBuff[9] << 8) + ReadDataBuff[8]) / {
Global::fMWDAnalogCalib[0][2]; // 4095.0f; //max wartosc wynikająca z rozdzielczości uiAnalog[0] = (ReadDataBuff[9] << 8) + ReadDataBuff[8];
fAnalog[1] = uiAnalog[1] = (ReadDataBuff[11] << 8) + ReadDataBuff[10];
(float)((ReadDataBuff[11] << 8) + ReadDataBuff[10]) / Global::fMWDAnalogCalib[1][2]; uiAnalog[2] = (ReadDataBuff[13] << 8) + ReadDataBuff[12];
fAnalog[2] = uiAnalog[3] = (ReadDataBuff[15] << 8) + ReadDataBuff[14];
(float)((ReadDataBuff[13] << 8) + ReadDataBuff[12]) / Global::fMWDAnalogCalib[2][2]; if (Global::bMWDdebugEnable && (Global::iMWDDebugMode & 1))
fAnalog[3] = {
(float)((ReadDataBuff[15] << 8) + ReadDataBuff[14]) / Global::fMWDAnalogCalib[3][2]; WriteLog("Main Break = " + to_string(uiAnalog[0]));
CheckData(); WriteLog("Locomotiv Break = " + to_string(uiAnalog[1]));
}
return TRUE; if (Global::bMWDdebugEnable && (Global::iMWDDebugMode & 2))
{
WriteLog("Analog input 1 = " + to_string(uiAnalog[2]));
WriteLog("Analog imput 2 = " + to_string(uiAnalog[3]));
}
}
if (Global::bMWDInputEnable) CheckData();
return TRUE;
} }
bool MWDComm::SendData() // wysyłanie danych bool TMWDComm::SendData() // wysyłanie danych
{ {
DWORD bytes_write; DWORD bytes_write;
DWORD fdwEvtMask; DWORD fdwEvtMask;
@@ -178,29 +196,30 @@ bool MWDComm::SendData() // wysyłanie danych
return TRUE; return TRUE;
} }
bool MWDComm::Run() // wywoływanie obsługi MWD + generacja większego opóźnienia bool TMWDComm::Run() // wywoływanie obsługi MWD + generacja większego opóźnienia
{ {
MWDTime++; if (GetMWDState())
if (!(MWDTime % 5)) {
{ MWDTime++;
if (GetMWDState()) if (!(MWDTime % Global::iMWDdivider))
{ {
SendData(); MWDTime = 0;
if (Global::bMWDInputDataEnable) SendData();
ReadData(); ReadData();
return 1; return 1;
} }
else }
{ else
WriteLog("Port COM: connection ERROR!"); {
// może spróbować się połączyć znowu? WriteLog("Port COM: connection ERROR!");
return 0; Close();
} // może spróbować się połączyć znowu?
MWDTime = 0; return 0;
} }
return 1;
} }
void MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowanie maszyną void TMWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowanie maszyną
{ {
int i = 0; int i = 0;
while (i < 6) while (i < 6)
@@ -257,298 +276,238 @@ void MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowa
// wciskanie przycisków klawiatury // wciskanie przycisków klawiatury
/*PORT0*/ /*PORT0*/
if (maskData[0] & 0x02 && lastStateData[0] & 0x02) if (maskData[0] & 0x02) if (lastStateData[0] & 0x02) KeyBoard('M', 1); // wyłączenie wyłącznika szybkiego
KeyBoard('M', 1); // wyłączenie wyłącznika szybkiego else KeyBoard('M', 0); // monostabilny
else if (maskData[0] & 0x04) if (lastStateData[0] & 0x04) { // impuls załączający wyłącznik szybki
KeyBoard('M', 0); // monostabilny KeyBoard(0x10, 1); // monostabilny
if (maskData[0] & 0x04 && lastStateData[0] & 0x04) KeyBoard('M', 1);
{ // impuls załączający wyłącznik szybki }
KeyBoard(0x10, 1); // monostabilny else {
KeyBoard('M', 1); KeyBoard('M', 0);
} KeyBoard(0x10, 0);
else }
{ if (maskData[0] & 0x08) if (lastStateData[0] & 0x08) KeyBoard('N', 1); // odblok nadmiarowego silników trakcyjnych
KeyBoard('M', 0); else KeyBoard('N', 0); // monostabilny
KeyBoard(0x10, 0); if (maskData[0] & 0x20) if (lastStateData[0] & 0x20) { // odblok nadmiarowego przetwornicy, ogrzewania poc.
} KeyBoard(0x11, 1); // różnicowego obwodów pomocniczych
if (maskData[0] & 0x08 && lastStateData[0] & 0x08) KeyBoard('N', 1); // monostabilny
KeyBoard('N', 1); // odblok nadmiarowego silników trakcyjnych }
else else {
KeyBoard('N', 0); // monostabilny KeyBoard('N', 0);
if (maskData[0] & 0x20 && lastStateData[0] & 0x20) KeyBoard(0x11, 0);
{ // odblok nadmiarowego przetwornicy, ogrzewania poc. }
KeyBoard(0x11, 1); // różnicowego obwodów pomocniczych if (maskData[0] & 0x40) if (lastStateData[0] & 0x40) KeyBoard('L', 1); // wył. styczników liniowych
KeyBoard('N', 1); // monostabilny else KeyBoard('L', 0); // monostabilny
} if (maskData[0] & 0x80) if (lastStateData[0] & 0x80) KeyBoard(0x20, 1); // kasowanie czuwaka/SHP
else else KeyBoard(0x20, 0); // kasowanie czuwaka/SHP
{
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*/ /*PORT1*/
// puszczanie przycisku bistabilnego klawiatury // puszczanie przycisku bistabilnego klawiatury
if (maskSwitch[1] & 0x02) if (maskSwitch[1] & 0x02) {
{ if (bitSwitch[1] & 0x02) {
if (bitSwitch[1] & 0x02) KeyBoard('X', 0);
{ KeyBoard(0x10, 0);
KeyBoard('X', 0); }
KeyBoard(0x10, 0); else KeyBoard('X', 0);
} maskSwitch[1] &= ~0x02;
else }
KeyBoard('X', 0); if (maskSwitch[1] & 0x04) {
maskSwitch[1] &= ~0x02; if (bitSwitch[1] & 0x04) {
} KeyBoard('C', 0);
if (maskSwitch[1] & 0x04) KeyBoard(0x10, 0);
{ }
if (bitSwitch[1] & 0x04) else KeyBoard('C', 0);
{ maskSwitch[1] &= ~0x04;
KeyBoard('C', 0); }
KeyBoard(0x10, 0); if (maskSwitch[1] & 0x10) {
} if (bitSwitch[1] & 0x10) {
else KeyBoard('H', 0);
KeyBoard('C', 0); KeyBoard(0x10, 0);
maskSwitch[1] &= ~0x04; }
} else KeyBoard('H', 0);
if (maskSwitch[1] & 0x10) maskSwitch[1] &= ~0x10;
{ }
if (bitSwitch[1] & 0x10) if (maskSwitch[1] & 0x20 || maskSwitch[1] & 0x40) {
{ if (maskSwitch[1] & 0x20) KeyBoard(0x10, 0);
KeyBoard('H', 0); if (maskSwitch[1] & 0x40) KeyBoard(0x11, 0);
KeyBoard(0x10, 0); KeyBoard('B', 0);
} maskSwitch[1] &= ~0x60;
else }
KeyBoard('H', 0); if (maskSwitch[1] & 0x80) {
maskSwitch[1] &= ~0x10; if (bitSwitch[1] & 0x80) {
} KeyBoard('F', 0);
if (maskSwitch[1] & 0x20 || maskSwitch[1] & 0x40) KeyBoard(0x10, 0);
{ }
if (maskSwitch[1] & 0x20) else KeyBoard('F', 0);
KeyBoard(0x10, 0); maskSwitch[1] &= ~0x80;
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) if (maskData[1] & 0x02) if (lastStateData[1] & 0x02) { // przetwornica
{ // rozruch wysoki/niski KeyBoard(0x10, 1); // bistabilny
KeyBoard(0x10, 1); // bistabilny KeyBoard('X', 1);
KeyBoard('F', 1); maskSwitch[1] |= 0x02;
maskSwitch[1] |= 0x80; bitSwitch[1] |= 0x02;
bitSwitch[1] |= 0x80; }
} else {
else maskSwitch[1] |= 0x02;
{ bitSwitch[1] &= ~0x02;
maskSwitch[1] |= 0x80; KeyBoard('X', 1);
bitSwitch[1] &= ~0x80; }
KeyBoard('F', 1); if (maskData[1] & 0x04) if (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) if (lastStateData[1] & 0x08) KeyBoard('S', 1); // piasecznica
else KeyBoard('S', 0); // monostabilny
if (maskData[1] & 0x10) if (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);
}
/*PORT2*/ if (maskData[1] & 0x80) if (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);
}
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) //PORT2
{ // pantograf przedni if (maskSwitch[2] & 0x01) {
KeyBoard(0x10, 1); // bistabilny if (bitSwitch[2] & 0x01) {
KeyBoard('P', 1); KeyBoard('P', 0);
maskSwitch[2] |= 0x01; KeyBoard(0x10, 0);
bitSwitch[2] |= 0x01; }
} else KeyBoard('P', 0);
else maskSwitch[2] &= ~0x01;
{ }
maskSwitch[2] |= 0x01; if (maskSwitch[2] & 0x02) {
bitSwitch[2] &= ~0x01; if (bitSwitch[2] & 0x02) {
KeyBoard('P', 1); KeyBoard('O', 0);
} KeyBoard(0x10, 0);
if (maskData[2] & 0x02 && lastStateData[2] & 0x02) }
{ // pantograf tylni else KeyBoard('O', 0);
KeyBoard(0x10, 1); // bistabilny maskSwitch[2] &= ~0x02;
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 (maskData[2] & 0x01) if (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) if (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) if (lastStateData[2] & 0x04) { // przyhamowanie przy poślizgu
KeyBoard(0x10, 1); // monostabilny
KeyBoard(0x0D, 1);
}
else {
if (maskSwitch[3] & 0x01) KeyBoard(0x0D, 0);
{ KeyBoard(0x10, 0);
if (bitSwitch[3] & 0x01) }
{ /*if(maskData[2] & 0x08) if (lastStateData[2] & 0x08){ // przyciemnienie świateł
KeyBoard('J', 0); KeyBoard(' ',0); // bistabilny
KeyBoard(0x10, 0); KeyBoard(0x10,1);
} KeyBoard(' ',1);
else }else{
KeyBoard('J', 0); KeyBoard(' ',0);
maskSwitch[3] &= ~0x01; KeyBoard(0x10,0);
} KeyBoard(' ',1);
}
if(maskData[2] & 0x10) if (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) if (lastStateData[2] & 0x20) KeyBoard(0x66, 1); // odluźniacz
else KeyBoard(0x66, 0); // monostabilny
if (maskData[2] & 0x40) if (lastStateData[2] & 0x40) { // syrena wysoka
KeyBoard(0x10, 1); // monostabilny
KeyBoard('A', 1);
}
else {
KeyBoard('A', 0);
KeyBoard(0x10, 0);
}
if (maskData[2] & 0x80) if (lastStateData[2] & 0x80) KeyBoard('A', 1); // syrena niska
else KeyBoard('A', 0); // monostabilny
if (maskData[3] & 0x01 && lastStateData[3] & 0x01)
{ // bateria //PORT3
KeyBoard(0x10, 1); // bistabilny
KeyBoard('J', 1); if (maskSwitch[3] & 0x01) {
maskSwitch[3] |= 0x01; if (bitSwitch[3] & 0x01) {
bitSwitch[3] |= 0x01; KeyBoard('J', 0);
} KeyBoard(0x10, 0);
else }
{ else KeyBoard('J', 0);
maskSwitch[3] |= 0x01; maskSwitch[3] &= ~0x01;
bitSwitch[3] &= ~0x01; }
KeyBoard('J', 1);
} if (maskData[3] & 0x01) if (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); if(maskData[3] & 0x04 && lastStateData[1] & 0x04) { KeyBoard(0x10,1);
@@ -790,7 +749,7 @@ void MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowa
WriteDataBuff[6] &= ~(1 << 3); WriteDataBuff[6] &= ~(1 << 3);
} }
void MWDComm::KeyBoard(int key, bool s) // emulacja klawiatury void TMWDComm::KeyBoard(int key, bool s) // emulacja klawiatury
{ {
INPUT ip; INPUT ip;
// Set up a generic keyboard event. // Set up a generic keyboard event.

View File

@@ -19,48 +19,53 @@ http://mozilla.org/MPL/2.0/.
#define MWDH #define MWDH
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#define BYTETOWRITE 31 // ilość bajtów przesyłanych z MaSzyny
#define BYTETOREAD 16 // ilość bajtów przesyłanych do MaSzyny
typedef unsigned char BYTE; typedef unsigned char BYTE;
typedef unsigned long DWORD; typedef unsigned long DWORD;
class MWDComm class TMWDComm
{ {
private: private:
int MWDTime; // int MWDTime; //
char lastStateData[6], maskData[6], maskSwitch[6], bitSwitch[6]; char lastStateData[6], maskData[6], maskSwitch[6], bitSwitch[6];
int bocznik, nastawnik, kierunek; int bocznik, nastawnik, kierunek;
char bnkMask; char bnkMask;
bool ReadData(); // BYTE *pReadDataBuff); bool ReadData(); //BYTE *pReadDataBuff);
bool SendData(); // BYTE *pWriteDataBuff); bool SendData(); //BYTE *pWriteDataBuff);
void CheckData(); // sprawdzanie zmian wejść i kontrola mazaków HASLERA void CheckData(); //sprawdzanie zmian wejść i kontrola mazaków HASLERA
void KeyBoard(int key, bool s); void KeyBoard(int key, bool s);
bool bRysik1H; //void CheckData2();
bool bRysik1L;
bool bRysik2H;
bool bRysik2L;
public: bool bRysik1H;
bool Open(); // Otwarcie portu bool bRysik1L;
bool Close(); // Zamknięcie portu bool bRysik2H;
bool Run(); // Obsługa portu bool bRysik2L;
bool GetMWDState(); // sprawdź czy port jest otwarty, 0 zamknięty, 1 otwarty
// zmienne do rysików HASLERA public:
bool bSHPstate; bool Open(); // Otwarcie portu
bool bPrzejazdSHP; bool Close(); // Zamknięcie portu
bool bKabina1; bool Run(); // Obsługa portu
bool bKabina2; bool GetMWDState(); // sprawdź czy port jest otwarty, 0 zamknięty, 1 otwarty
bool bHamowanie;
bool bCzuwak;
float fAnalog[4]; // trzymanie danych z wejść analogowych // zmienne do rysików HASLERA
bool bSHPstate;
bool bPrzejazdSHP;
bool bKabina1;
bool bKabina2;
bool bHamowanie;
bool bCzuwak;
BYTE ReadDataBuff[17]; // bufory danych unsigned int uiAnalog[4]; // trzymanie danych z wejść analogowych
BYTE WriteDataBuff[31];
MWDComm(); // konstruktor BYTE ReadDataBuff[BYTETOREAD]; //17]; // bufory danych
~MWDComm(); // destruktor BYTE WriteDataBuff[BYTETOWRITE]; //31];
TMWDComm(); // konstruktor
~TMWDComm(); // destruktor
}; };
#endif #endif

View File

@@ -4633,8 +4633,13 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
*/ */
if( true == pAnimations.empty() ) if( true == pAnimations.empty() )
{ // Ra: tworzenie tabeli animacji, jeśli jeszcze nie było { // Ra: tworzenie tabeli animacji, jeśli jeszcze nie było
if (!iAnimations) // jeśli nie podano jawnie, ile ma być animacji /*
// disabled as default animation amounts are no longer supported
if( !iAnimations ) {
// jeśli nie podano jawnie, ile ma być animacji
iAnimations = 28; // tyle było kiedyś w każdym pojeździe (2 wiązary wypadły) iAnimations = 28; // tyle było kiedyś w każdym pojeździe (2 wiązary wypadły)
}
*/
/* //pojazd może mieć pantograf do innych celów niż napęd /* //pojazd może mieć pantograf do innych celów niż napęd
if (MoverParameters->EnginePowerSource.SourceType!=CurrentCollector) if (MoverParameters->EnginePowerSource.SourceType!=CurrentCollector)
{//nie będzie pantografów, to się trochę uprości {//nie będzie pantografów, to się trochę uprości
@@ -5463,6 +5468,11 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
} while( ( token != "" ) } while( ( token != "" )
&& ( false == Stop_InternalData ) ); && ( false == Stop_InternalData ) );
if( !iAnimations ) {
// if the animations weren't defined the model is likely to be non-functional. warrants a warning.
ErrorLog( "Animations tag is missing from the .mmd file \"" + asFileName + "\"" );
}
if (mdModel) if (mdModel)
mdModel->Init(); // obrócenie modelu oraz optymalizacja, również zapisanie mdModel->Init(); // obrócenie modelu oraz optymalizacja, również zapisanie
// binarnego // binarnego

View File

@@ -185,7 +185,7 @@ private:
private: // zmienne i metody do animacji submodeli; Ra: sprzatam animacje w pojeździe private: // zmienne i metody do animacji submodeli; Ra: sprzatam animacje w pojeździe
public: // tymczasowo udostępnione do wyszukiwania drutu public: // tymczasowo udostępnione do wyszukiwania drutu
int iAnimType[ANIM_TYPES]; // 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki int iAnimType[ ANIM_TYPES ]; // 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki
private: private:
int iAnimations; // liczba obiektów animujących int iAnimations; // liczba obiektów animujących
/* /*

View File

@@ -317,6 +317,7 @@ void TEvent::Load(cParser *parser, vector3 *org)
{ {
if (token.find('#') != std::string::npos) if (token.find('#') != std::string::npos)
token.erase(token.find('#')); // obcięcie unikatowości token.erase(token.find('#')); // obcięcie unikatowości
win1250_to_ascii( token ); // get rid of non-ascii chars
bEnabled = false; // nie do kolejki (dla SetVelocity też, ale jak jest do toru bEnabled = false; // nie do kolejki (dla SetVelocity też, ale jak jest do toru
// dowiązany) // dowiązany)
Params[6].asCommand = cm_PassengerStopPoint; Params[6].asCommand = cm_PassengerStopPoint;

View File

@@ -74,7 +74,9 @@ int Global::iSegmentsRendered = 90; // ilość segmentów do regulacji wydajnoś
TCamera *Global::pCamera = NULL; // parametry kamery TCamera *Global::pCamera = NULL; // parametry kamery
TDynamicObject *Global::pUserDynamic = NULL; // pojazd użytkownika, renderowany bez trzęsienia TDynamicObject *Global::pUserDynamic = NULL; // pojazd użytkownika, renderowany bez trzęsienia
bool Global::bSmudge = false; // czy wyświetlać smugę, a pojazd użytkownika na końcu bool Global::bSmudge = false; // czy wyświetlać smugę, a pojazd użytkownika na końcu
/*
std::string Global::asTranscript[5]; // napisy na ekranie (widoczne) std::string Global::asTranscript[5]; // napisy na ekranie (widoczne)
*/
TTranscripts Global::tranTexts; // obiekt obsługujący stenogramy dźwięków na ekranie TTranscripts Global::tranTexts; // obiekt obsługujący stenogramy dźwięków na ekranie
// parametry scenerii // parametry scenerii
@@ -189,17 +191,20 @@ int Global::iBpp = 32; // chyba już nie używa się kart, na których 16bpp co
//randomizacja //randomizacja
std::mt19937 Global::random_engine = std::mt19937(std::time(NULL)); std::mt19937 Global::random_engine = std::mt19937(std::time(NULL));
// maciek001: konfiguracja wstępna portu COM // maciek001: konfiguracja wstępna portu COM
bool Global::bMWDdebugEnable = false; bool Global::bMWDmasterEnable = false; // główne włączenie portu!
bool Global::bMWDInputDataEnable = false; bool Global::bMWDdebugEnable = false; // włącz dodawanie do logu
unsigned int Global::iMWDBaudrate = 500000; int Global::iMWDDebugMode = 0; // co ma wyświetlać w logu
std::string Global::sMWDPortId = "COM1"; // nazwa portu z którego korzystamy - na razie nie działa std::string Global::sMWDPortId = "COM1"; // nazwa portu z którego korzystamy
bool Global::bMWDBreakEnable = false; // zmienić na FALSE!!! jak już będzie działać wczytywanie z *.ini unsigned long int Global::iMWDBaudrate = 9600; // prędkość transmisji danych
double Global::fMWDAnalogCalib[4][3] = {{1023, 0, 1023},{1023, 0, 1023},{1023, 0, 1023},{1023, 0, 1023}}; // wartość max potencjometru, wartość min potencjometru, rozdzielczość (max. wartość jaka może być -1) bool Global::bMWDInputEnable = false; // włącz wejścia
double Global::fMWDzg[2] = {0.9, 1023}; bool Global::bMWDBreakEnable = false; // włącz wejścia analogowe
double Global::fMWDpg[2] = {0.8, 1023}; double Global::fMWDAnalogInCalib[4][2] = { { 0, 1023 },{ 0, 1023 },{ 0, 1023 },{ 0, 1023 } }; // wartość max potencjometru, wartość min potencjometru, rozdzielczość (max. wartość jaka może być)
double Global::fMWDph[2] = {0.6, 1023}; double Global::fMWDzg[2] = { 0.9, 1023 };
double Global::fMWDvolt[2] = {4000, 1023}; double Global::fMWDpg[2] = { 0.8, 1023 };
double Global::fMWDamp[2] = {800, 1023}; double Global::fMWDph[2] = { 0.6, 1023 };
double Global::fMWDvolt[2] = { 4000, 1023 };
double Global::fMWDamp[2] = { 800, 1023 };
int Global::iMWDdivider = 5;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -804,93 +809,94 @@ void Global::ConfigParse(cParser &Parser)
>> Global::Background[2]; // b >> Global::Background[2]; // b
} }
// maciek001: ustawienia MWD // maciek001: ustawienia MWD
else if (token == "mwddebug") else if (token == "mwdmasterenable") { // główne włączenie maszyny!
{ // czy włączyć obslugę hamulców Parser.getTokens();
Parser.getTokens(); Parser >> token;
Parser >> token; bMWDmasterEnable = (token == "yes");
bMWDdebugEnable = (token == "yes"); if (bMWDdebugEnable) WriteLog("SerialPort Master Enable");
} }
else if (token == "comportname") else if (token == "mwddebugenable") { // logowanie pracy
{ Parser.getTokens();
Parser.getTokens(); Parser >> token;
Parser >> sMWDPortId; bMWDdebugEnable = (token == "yes");
if (bMWDdebugEnable) if (bMWDdebugEnable) WriteLog("MWD Debug Mode On");
WriteLog("PortName " + sMWDPortId); }
} else if (token == "mwddebugmode") { // co ma być debugowane?
else if (token == "mwdbaudrate") Parser.getTokens(1, false);
{ // pobierz prędkość transmisji danych Parser >> iMWDDebugMode;
Parser.getTokens(1, false); if (bMWDdebugEnable) WriteLog("Debug Mode = " + to_string(iMWDDebugMode));
Parser >> iMWDBaudrate; }
if (bMWDdebugEnable) else if (token == "mwdcomportname") { // nazwa portu COM
WriteLog("PortName " + to_string(iMWDBaudrate)); Parser.getTokens();
} Parser >> sMWDPortId;
else if (token == "mwdbreakenable") if (bMWDdebugEnable) WriteLog("PortName " + sMWDPortId);
{ // czy włączyć obsługę hamulców }
Parser.getTokens(); else if (token == "mwdbaudrate") { // prędkość transmisji danych
Parser >> token; Parser.getTokens(1, false);
bMWDBreakEnable = (token == "yes"); Parser >> iMWDBaudrate;
} if (bMWDdebugEnable) WriteLog("Baud rate = " + to_string((int)(iMWDBaudrate / 1000)) + (" kbps"));
else if (token == "mwdinputenable") }
{ else if (token == "mwdinputenable") { // włącz wejścia
Parser.getTokens(); Parser.getTokens();
Parser >> token; Parser >> token;
bMWDInputDataEnable = (token == "yes"); bMWDInputEnable = (token == "yes");
} if (bMWDdebugEnable && bMWDInputEnable) WriteLog("MWD Input Enable");
else if (token == "mwdbreak") // wartość max dla potencjometru hamulca zasadniczego }
{ else if (token == "mwdbreakenable") { // włącz obsługę hamulców
Parser.getTokens(); Parser.getTokens();
Parser >> token; Parser >> token;
int i = stol_def(token, -1); // numer wej�cia bMWDBreakEnable = (token == "yes");
if ((i >= 0) && (i <= 3)) if (bMWDdebugEnable && bMWDBreakEnable) WriteLog("MWD Break Enable");
{ }
Parser.getTokens(3, false); else if (token == "mwdmainbreakconfig") { // ustawienia hamulca zespolonego
Parser >> fMWDAnalogCalib[i][0] // max -> 2^16 -1 Parser.getTokens(2, false);
>> fMWDAnalogCalib[i][1] // min -> 0 Parser >> fMWDAnalogInCalib[0][0] >> fMWDAnalogInCalib[0][1];
>> if (bMWDdebugEnable) WriteLog("Main break settings: " + to_string(fMWDAnalogInCalib[0][0]) + (" ") + to_string(fMWDAnalogInCalib[0][1]));
fMWDAnalogCalib[i][2]; // rozdzielczość -> 255 maksymalna możliwa wartość z ADC }
if (bMWDdebugEnable) else if (token == "mwdlocbreakconfig") { // ustawienia hamulca lokomotywy
WriteLog("Break settings " + to_string(i) + ": " + Parser.getTokens(2, false);
to_string(fMWDAnalogCalib[i][0]) + " " + Parser >> fMWDAnalogInCalib[1][0] >> fMWDAnalogInCalib[1][1];
to_string(fMWDAnalogCalib[i][1]) + " " + if (bMWDdebugEnable) WriteLog("Locomotive break settings: " + to_string(fMWDAnalogInCalib[1][0]) + to_string(" ") + to_string(fMWDAnalogInCalib[1][1]));
to_string(fMWDAnalogCalib[i][2])); }
} else if (token == "mwdanalogin1config") { // ustawienia hamulca zespolonego
} Parser.getTokens(2, false);
else if (token == "mwdzbiornikglowny") Parser >> fMWDAnalogInCalib[2][0] >> fMWDAnalogInCalib[2][1];
{ if (bMWDdebugEnable) WriteLog("Analog input 1 settings: " + to_string(fMWDAnalogInCalib[2][0]) + to_string(" ") + to_string(fMWDAnalogInCalib[2][1]));
Parser.getTokens(2, false); }
Parser >> fMWDzg[0] >> fMWDzg[1]; else if (token == "mwdanalogin2config") { // ustawienia hamulca lokomotywy
if (bMWDdebugEnable) Parser.getTokens(2, false);
WriteLog("AirTank settings: " + to_string(fMWDzg[0]) + " " + to_string(fMWDzg[1])); Parser >> fMWDAnalogInCalib[3][0] >> fMWDAnalogInCalib[3][1];
} if (bMWDdebugEnable) WriteLog("Analog input 2 settings: " + to_string(fMWDAnalogInCalib[3][0]) + to_string(" ") + to_string(fMWDAnalogInCalib[3][1]));
else if (token == "mwdprzewodglowny") }
{ else if (token == "mwdmaintankpress") { // max ciśnienie w zbiorniku głownym i rozdzielczość
Parser.getTokens(2, false); Parser.getTokens(2, false);
Parser >> fMWDpg[0] >> fMWDpg[1]; Parser >> fMWDzg[0] >> fMWDzg[1];
if (bMWDdebugEnable) if (bMWDdebugEnable) WriteLog("MainAirTank settings: " + to_string(fMWDzg[0]) + to_string(" ") + to_string(fMWDzg[1]));
WriteLog("MainAirPipe settings: " + to_string(fMWDpg[0]) + " " + }
to_string(fMWDpg[1])); else if (token == "mwdmainpipepress") { // max ciśnienie w przewodzie głownym i rozdzielczość
} Parser.getTokens(2, false);
else if (token == "mwdcylinderhamulcowy") Parser >> fMWDpg[0] >> fMWDpg[1];
{ if (bMWDdebugEnable) WriteLog("MainAirPipe settings: " + to_string(fMWDpg[0]) + to_string(" ") + to_string(fMWDpg[1]));
Parser.getTokens(2, false); }
Parser >> fMWDph[0] >> fMWDph[1]; else if (token == "mwdbreakpress") { // max ciśnienie w hamulcach i rozdzielczość
if (bMWDdebugEnable) Parser.getTokens(2, false);
WriteLog("AirPipe settings: " + to_string(fMWDph[0]) + " " + to_string(fMWDph[1])); Parser >> fMWDph[0] >> fMWDph[1];
} if (bMWDdebugEnable) WriteLog("AirPipe settings: " + to_string(fMWDph[0]) + to_string(" ") + to_string(fMWDph[1]));
else if (token == "mwdwoltomierzwn") }
{ else if (token == "mwdhivoltmeter") { // max napięcie na woltomierzu WN
Parser.getTokens(2, false); Parser.getTokens(2, false);
Parser >> fMWDvolt[0] >> fMWDvolt[1]; Parser >> fMWDvolt[0] >> fMWDvolt[1];
if (bMWDdebugEnable) if (bMWDdebugEnable) WriteLog("VoltMeter settings: " + to_string(fMWDvolt[0]) + to_string(" ") + to_string(fMWDvolt[1]));
WriteLog("Volt settings: " + to_string(fMWDvolt[0]) + " " + to_string(fMWDvolt[1])); }
} else if (token == "mwdhiampmeter") {
else if (token == "mwdamperomierzwn") Parser.getTokens(2, false);
{ Parser >> fMWDamp[0] >> fMWDamp[1];
Parser.getTokens(2, false); if (bMWDdebugEnable) WriteLog("Amp settings: " + to_string(fMWDamp[0]) + to_string(" ") + to_string(fMWDamp[1]));
Parser >> fMWDamp[0] >> fMWDamp[1]; }
if (bMWDdebugEnable) else if (token == "mwddivider") {
WriteLog("Amp settings: " + to_string(fMWDamp[0]) + " " + to_string(fMWDamp[1])); Parser.getTokens(1, false);
} Parser >> iMWDdivider;
}
} while ((token != "") && (token != "endconfig")); //(!Parser->EndOfFile) } while ((token != "") && (token != "endconfig")); //(!Parser->EndOfFile)
// na koniec trochę zależności // na koniec trochę zależności
if (!bLoadTraction) // wczytywanie drutów i słupów if (!bLoadTraction) // wczytywanie drutów i słupów
@@ -1130,6 +1136,7 @@ bool Global::DoEvents()
TTranscripts::TTranscripts() TTranscripts::TTranscripts()
{ {
/*
iCount = 0; // brak linijek do wyświetlenia iCount = 0; // brak linijek do wyświetlenia
iStart = 0; // wypełniać od linijki 0 iStart = 0; // wypełniać od linijki 0
for (int i = 0; i < MAX_TRANSCRIPTS; ++i) for (int i = 0; i < MAX_TRANSCRIPTS; ++i)
@@ -1137,19 +1144,35 @@ TTranscripts::TTranscripts()
aLines[i].fHide = -1.0; // wolna pozycja (czas symulacji, 360.0 to doba) aLines[i].fHide = -1.0; // wolna pozycja (czas symulacji, 360.0 to doba)
aLines[i].iNext = -1; // nie ma kolejnej aLines[i].iNext = -1; // nie ma kolejnej
} }
*/
fRefreshTime = 360.0; // wartośc zaporowa fRefreshTime = 360.0; // wartośc zaporowa
}; };
TTranscripts::~TTranscripts(){}; TTranscripts::~TTranscripts(){};
void TTranscripts::AddLine(char const *txt, float show, float hide, bool it)
void TTranscripts::AddLine(std::string const &txt, float show, float hide, bool it)
{ // dodanie linii do tabeli, (show) i (hide) w [s] od aktualnego czasu { // dodanie linii do tabeli, (show) i (hide) w [s] od aktualnego czasu
if (show == hide) if (show == hide)
return; // komentarz jest ignorowany return; // komentarz jest ignorowany
show = Global::fTimeAngleDeg + show / 240.0; // jeśli doba to 360, to 1s będzie równe 1/240 show = Global::fTimeAngleDeg + show / 240.0; // jeśli doba to 360, to 1s będzie równe 1/240
hide = Global::fTimeAngleDeg + hide / 240.0; hide = Global::fTimeAngleDeg + hide / 240.0;
TTranscript transcript;
transcript.asText = txt;
transcript.fShow = show;
transcript.fHide = hide;
transcript.bItalic = it;
aLines.emplace_back( transcript );
// set the next refresh time while at it
// TODO, TBD: sort the transcript lines? in theory, they should be coming arranged in the right order anyway
// short of cases with multiple sounds overleaping
fRefreshTime = aLines.front().fHide;
/*
int i = iStart, j, k; // od czegoś trzeba zacząć int i = iStart, j, k; // od czegoś trzeba zacząć
while ((aLines[i].iNext >= 0) ? (aLines[aLines[i].iNext].fShow <= show) : while ((aLines[i].iNext >= 0) ? (aLines[aLines[i].iNext].fShow <= show) :
false) // póki nie koniec i wcześniej puszczane false) // póki nie koniec i wcześniej puszczane
i = aLines[i].iNext; // przejście do kolejnej linijki i = aLines[i].iNext; // przejście do kolejnej linijki
*/
/*
//(i) wskazuje na linię, po której należy wstawić dany tekst, chyba że //(i) wskazuje na linię, po której należy wstawić dany tekst, chyba że
while (txt ? *txt : false) while (txt ? *txt : false)
for (j = 0; j < MAX_TRANSCRIPTS; ++j) for (j = 0; j < MAX_TRANSCRIPTS; ++j)
@@ -1176,11 +1199,13 @@ void TTranscripts::AddLine(char const *txt, float show, float hide, bool it)
fRefreshTime = show; // to odświeżyć wcześniej fRefreshTime = show; // to odświeżyć wcześniej
break; // więcej już nic break; // więcej już nic
} }
*/
}; };
void TTranscripts::Add(char const *txt, float len, bool backgorund) void TTranscripts::Add(std::string const &txt, float len, bool backgorund)
{ // dodanie tekstów, długość dźwięku, czy istotne { // dodanie tekstów, długość dźwięku, czy istotne
if (!txt) if (true == txt.empty())
return; // pusty tekst return; // pusty tekst
/*
int i = 0, j = int(0.5 + 10.0 * len); //[0.1s] int i = 0, j = int(0.5 + 10.0 * len); //[0.1s]
if (*txt == '[') if (*txt == '[')
{ // powinny być dwa nawiasy { // powinny być dwa nawiasy
@@ -1197,14 +1222,44 @@ void TTranscripts::Add(char const *txt, float len, bool backgorund)
++txt; // pominięcie drugiego ] ++txt; // pominięcie drugiego ]
} }
} }
AddLine(txt, 0.1 * i, 0.1 * j, false); */
std::string asciitext{ txt }; win1250_to_ascii( asciitext ); // TODO: launch relevant conversion table based on language
cParser parser( asciitext );
while( true == parser.getTokens( 3, false, "[]\n" ) ) {
float begin, end;
std::string transcript;
parser
>> begin
>> end
>> transcript;
AddLine( transcript, 0.10 * begin, 0.12 * end, false );
}
// try to handle malformed(?) cases with no show/hide times
std::string transcript; parser >> transcript;
while( false == transcript.empty() ) {
WriteLog( "Transcript text with no display/hide times: \"" + transcript + "\"" );
AddLine( transcript, 0.0, 0.12 * transcript.size(), false );
transcript = ""; parser >> transcript;
}
}; };
void TTranscripts::Update() void TTranscripts::Update()
{ // usuwanie niepotrzebnych (nie częściej niż 10 razy na sekundę) { // usuwanie niepotrzebnych (nie częściej niż 10 razy na sekundę)
if (fRefreshTime > Global::fTimeAngleDeg) if( Global::fTimeAngleDeg < fRefreshTime )
return; // nie czas jeszcze na zmiany return; // nie czas jeszcze na zmiany
// czas odświeżenia można ustalić wg tabelki, kiedy coś się w niej zmienia // czas odświeżenia można ustalić wg tabelki, kiedy coś się w niej zmienia
fRefreshTime = Global::fTimeAngleDeg + 360.0; // wartość zaporowa // fRefreshTime = Global::fTimeAngleDeg + 360.0; // wartość zaporowa
while( ( false == aLines.empty() )
&& ( Global::fTimeAngleDeg >= aLines.front().fHide ) ) {
// remove expired lines
aLines.pop_front();
}
// update next refresh time
if( false == aLines.empty() ) { fRefreshTime = aLines.front().fHide; }
else { fRefreshTime = 360.0f; }
/*
int i = iStart, j = -1; // od czegoś trzeba zacząć int i = iStart, j = -1; // od czegoś trzeba zacząć
bool change = false; // czy zmieniać napisy? bool change = false; // czy zmieniać napisy?
do do
@@ -1247,6 +1302,7 @@ void TTranscripts::Update()
for (++j; j < 5; ++j) for (++j; j < 5; ++j)
Global::asTranscript[j] = ""; // i czyszczenie nieużywanych linijek Global::asTranscript[j] = ""; // i czyszczenie nieużywanych linijek
} }
*/
}; };
// Ra: tymczasowe rozwiązanie kwestii zagranicznych (czeskich) napisów // Ra: tymczasowe rozwiązanie kwestii zagranicznych (czeskich) napisów

View File

@@ -130,21 +130,31 @@ class TTranscript
int iNext; // następna używana linijka, żeby nie przestawiać fizycznie tabeli int iNext; // następna używana linijka, żeby nie przestawiać fizycznie tabeli
}; };
/*
#define MAX_TRANSCRIPTS 30 #define MAX_TRANSCRIPTS 30
*/
class TTranscripts class TTranscripts
{ // klasa obsługująca napisy do dźwięków { // klasa obsługująca napisy do dźwięków
/*
TTranscript aLines[MAX_TRANSCRIPTS]; // pozycje na napisy do wyświetlenia TTranscript aLines[MAX_TRANSCRIPTS]; // pozycje na napisy do wyświetlenia
*/
public:
std::deque<TTranscript> aLines;
/*
int iCount; // liczba zajętych pozycji int iCount; // liczba zajętych pozycji
int iStart; // pierwsza istotna pozycja w tabeli, żeby sortować przestawiając numerki int iStart; // pierwsza istotna pozycja w tabeli, żeby sortować przestawiając numerki
*/
private:
float fRefreshTime; float fRefreshTime;
public: public:
TTranscripts(); TTranscripts();
~TTranscripts(); ~TTranscripts();
void AddLine(char const *txt, float show, float hide, bool it); void AddLine(std::string const &txt, float show, float hide, bool it);
void Add(char const *txt, float len, // dodanie tekstów, długość dźwięku, czy istotne
bool backgorund = false); // dodanie tekstów, długość dźwięku, czy istotne void Add(std::string const &txt, float len, bool background = false);
void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekundę) // usuwanie niepotrzebnych (ok. 10 razy na sekundę)
void Update();
}; };
class Global class Global
@@ -298,7 +308,9 @@ class Global
static double fBrakeStep; // krok zmiany hamulca dla klawiszy [Num3] i [Num9] static double fBrakeStep; // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
static bool bJoinEvents; // czy grupować eventy o tych samych nazwach static bool bJoinEvents; // czy grupować eventy o tych samych nazwach
static bool bSmudge; // czy wyświetlać smugę, a pojazd użytkownika na końcu static bool bSmudge; // czy wyświetlać smugę, a pojazd użytkownika na końcu
/*
static std::string asTranscript[5]; // napisy na ekranie (widoczne) static std::string asTranscript[5]; // napisy na ekranie (widoczne)
*/
static TTranscripts tranTexts; // obiekt obsługujący stenogramy dźwięków na ekranie static TTranscripts tranTexts; // obiekt obsługujący stenogramy dźwięków na ekranie
static std::string asLang; // domyślny język - http://tools.ietf.org/html/bcp47 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 int iHiddenEvents; // czy łączyć eventy z torami poprzez nazwę toru
@@ -321,16 +333,19 @@ class Global
static double CutValueToRange(double min, double value, double max); static double CutValueToRange(double min, double value, double max);
// maciek001: zmienne dla MWD // maciek001: zmienne dla MWD
static bool bMWDdebugEnable; static bool bMWDmasterEnable; // główne włączenie portu COM
static unsigned int iMWDBaudrate; static bool bMWDdebugEnable; // logowanie pracy
static std::string sMWDPortId; static int iMWDDebugMode;
static bool bMWDBreakEnable; static std::string sMWDPortId; // nazwa portu COM
static bool bMWDInputDataEnable; static unsigned long int iMWDBaudrate; // prędkość transmisji
static double fMWDAnalogCalib[4][3]; static bool bMWDInputEnable; // włącz wejścia
static double fMWDzg[2]; static bool bMWDBreakEnable; // włącz wejścia analogowe (hamulce)
static double fMWDpg[2]; static double fMWDAnalogInCalib[4][2]; // ustawienia kranów hamulca zespolonego i dodatkowego - min i max
static double fMWDph[2]; static double fMWDzg[2]; // max wartość wskazywana i max wartość generowana (rozdzielczość)
static double fMWDvolt[2]; static double fMWDpg[2];
static double fMWDamp[2]; static double fMWDph[2];
static double fMWDvolt[2];
static double fMWDamp[2];
static int iMWDdivider;
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -412,6 +412,21 @@ std::string ToUpper(std::string const &text)
return uppercase; return uppercase;
} }
// replaces polish letters with basic ascii
void
win1250_to_ascii( std::string &Input ) {
std::unordered_map<char, char> charmap{
{ 165, 'A' }, { 198, 'C' }, { 202, 'E' }, { 163, 'L' }, { 209, 'N' }, { 211, 'O' }, { 140, 'S' }, { 143, 'Z' }, { 175, 'Z' },
{ 185, 'a' }, { 230, 'c' }, { 234, 'e' }, { 179, 'l' }, { 241, 'n' }, { 243, 'o' }, { 156, 's' }, { 159, 'z' }, { 191, 'z' }
};
std::unordered_map<char, char>::const_iterator lookup;
for( auto &input : Input ) {
if( ( lookup = charmap.find( input ) ) != charmap.end() )
input = lookup->second;
}
}
void ComputeArc(double X0, double Y0, double Xn, double Yn, double R, double L, double dL, void ComputeArc(double X0, double Y0, double Xn, double Yn, double R, double L, double dL,
double &phi, double &Xout, double &Yout) double &phi, double &Xout, double &Yout)
/*wylicza polozenie Xout Yout i orientacje phi punktu na elemencie dL luku*/ /*wylicza polozenie Xout Yout i orientacje phi punktu na elemencie dL luku*/

View File

@@ -107,15 +107,15 @@ bool FuzzyLogicAI(double Test, double Threshold, double Probability);
/*operacje na stringach*/ /*operacje na stringach*/
std::string ReadWord( std::ifstream& infile); /*czyta slowo z wiersza pliku tekstowego*/ std::string ReadWord( std::ifstream& infile); /*czyta slowo z wiersza pliku tekstowego*/
//std::string Ups(std::string s); //std::string Ups(std::string s);
std::string TrimSpace(std::string &s); //std::string TrimSpace(std::string &s);
char* TrimAndReduceSpaces(const char* s); //char* TrimAndReduceSpaces(const char* s);
std::string ExtractKeyWord(std::string InS, std::string KeyWord); /*wyciaga slowo kluczowe i lancuch do pierwszej spacji*/ //std::string ExtractKeyWord(std::string InS, std::string KeyWord); /*wyciaga slowo kluczowe i lancuch do pierwszej spacji*/
std::string DUE(std::string s); /*Delete Until Equal sign*/ std::string DUE(std::string s); /*Delete Until Equal sign*/
std::string DWE(std::string s); /*Delete While Equal sign*/ std::string DWE(std::string s); /*Delete While Equal sign*/
std::string ExchangeCharInString(std::string const &s, const char &aim, const char &target); // zamienia jeden znak na drugi std::string ExchangeCharInString(std::string const &s, const char &aim, const char &target); // zamienia jeden znak na drugi
std::vector<std::string> &Split(const std::string &s, char delim, std::vector<std::string> &elems); std::vector<std::string> &Split(const std::string &s, char delim, std::vector<std::string> &elems);
std::vector<std::string> Split(const std::string &s, char delim); std::vector<std::string> Split(const std::string &s, char delim);
std::vector<std::string> Split(const std::string &s); //std::vector<std::string> Split(const std::string &s);
std::string to_string(int _Val); std::string to_string(int _Val);
std::string to_string(unsigned int _Val); std::string to_string(unsigned int _Val);
@@ -125,6 +125,7 @@ std::string to_string(double _Val);
std::string to_string(double _Val, int precision); std::string to_string(double _Val, int precision);
std::string to_string(double _Val, int precision, int width); std::string to_string(double _Val, int precision, int width);
std::string to_hex_str( int const _Val, int const width = 4 ); std::string to_hex_str( int const _Val, int const width = 4 );
inline std::string to_string(bool _Val) inline std::string to_string(bool _Val)
{ {
return _Val == true ? "true" : "false"; return _Val == true ? "true" : "false";
@@ -135,6 +136,9 @@ int stol_def(const std::string & str, const int & DefaultValue);
std::string ToLower(std::string const &text); std::string ToLower(std::string const &text);
std::string ToUpper(std::string const &text); std::string ToUpper(std::string const &text);
// replaces polish letters with basic ascii
void win1250_to_ascii( std::string &Input );
/*procedury, zmienne i funkcje graficzne*/ /*procedury, zmienne i funkcje graficzne*/
void ComputeArc(double X0, double Y0, double Xn, double Yn, double R, double L, double dL, double & phi, double & Xout, double & Yout); void ComputeArc(double X0, double Y0, double Xn, double Yn, double R, double L, double dL, double & phi, double & Xout, double & Yout);
/*wylicza polozenie Xout Yout i orientacje phi punktu na elemencie dL luku*/ /*wylicza polozenie Xout Yout i orientacje phi punktu na elemencie dL luku*/

View File

@@ -271,22 +271,25 @@ void TTextSound::Play(double Volume, int Looping, bool ListenerInside, vector3 N
pSound->GetStatus(&stat); pSound->GetStatus(&stat);
if (!(stat & DSBSTATUS_PLAYING)) // jeśli nie jest aktualnie odgrywany if (!(stat & DSBSTATUS_PLAYING)) // jeśli nie jest aktualnie odgrywany
{ {
/*
std::string t( asText ); std::string t( asText );
size_t i; size_t i;
do do
{ // na razie zrobione jakkolwiek, docelowo przenieść teksty do tablicy nazw { // na razie zrobione jakkolwiek, docelowo przenieść teksty do tablicy nazw
i = t.find('\r'); // znak nowej linii i = t.find('\r'); // znak nowej linii
if( i == std::string::npos ) { if( i == std::string::npos ) {
Global::tranTexts.Add( t.c_str(), fTime, true ); Global::tranTexts.Add( t, fTime, true );
} }
else else
{ {
Global::tranTexts.Add(t.substr(0, i).c_str(), fTime, true); Global::tranTexts.Add(t.substr(0, i), fTime, true);
t.erase(0, i + 1); t.erase(0, i + 1);
while (t.empty() ? false : (unsigned char)(t[1]) < 33) while (t.empty() ? false : (unsigned char)(t[1]) < 33)
t.erase(0, 1); t.erase(0, 1);
} }
} while (i != std::string::npos); } while (i != std::string::npos);
*/
Global::tranTexts.Add( asText, fTime, true );
} }
} }
TRealSound::Play(Volume, Looping, ListenerInside, NewPosition); TRealSound::Play(Volume, Looping, ListenerInside, NewPosition);

View File

@@ -175,7 +175,7 @@ opengl_texture::load_DDS() {
data_width = ddsd.dwWidth; data_width = ddsd.dwWidth;
data_height = ddsd.dwHeight; data_height = ddsd.dwHeight;
data_mapcount = 1;// ddsd.dwMipMapCount; data_mapcount = ddsd.dwMipMapCount;
int blockSize = ( data_format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ? 8 : 16 ); int blockSize = ( data_format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ? 8 : 16 );
int offset = 0; int offset = 0;
@@ -194,11 +194,13 @@ opengl_texture::load_DDS() {
data_state = resource_state::failed; data_state = resource_state::failed;
return; return;
} }
int datasize = filesize - offset;
/* /*
// this approach loads only the first mipmap and relies on graphics card to fill the rest // this approach loads only the first mipmap and relies on graphics card to fill the rest
data_mapcount = 1;
int datasize = ( ( data_width + 3 ) / 4 ) * ( ( data_height + 3 ) / 4 ) * blockSize; int datasize = ( ( data_width + 3 ) / 4 ) * ( ( data_height + 3 ) / 4 ) * blockSize;
*/ */
int datasize = filesize - offset;
/* /*
// calculate size of accepted data // calculate size of accepted data
// NOTE: this is a fallback, as we should be able to just move the file caret by calculated offset and read the rest // NOTE: this is a fallback, as we should be able to just move the file caret by calculated offset and read the rest
@@ -331,7 +333,8 @@ opengl_texture::load_TGA() {
int const pixelcount = data_width * data_height; int const pixelcount = data_width * data_height;
for( int i = 0; i < pixelcount; ++i ) { for( int i = 0; i < pixelcount; ++i ) {
file.read( (char *)buffer, sizeof( unsigned char ) );
file.read( (char *)&buffer[ 0 ], sizeof( unsigned char ) * bytesperpixel );
if( bytesperpixel == 1 ) { if( bytesperpixel == 1 ) {
// expand greyscale data // expand greyscale data
buffer[ 1 ] = buffer[ 0 ]; buffer[ 1 ] = buffer[ 0 ];
@@ -473,8 +476,8 @@ opengl_texture::create() {
datasize, (GLubyte *)&data[0] + dataoffset ); datasize, (GLubyte *)&data[0] + dataoffset );
dataoffset += datasize; dataoffset += datasize;
datawidth = std::max( datawidth / 2, 4 ); datawidth = std::max( datawidth / 2, 1 );
dataheight = std::max( dataheight / 2, 4 ); dataheight = std::max( dataheight / 2, 1 );
} }
else{ else{
// uncompressed texture data // uncompressed texture data

View File

@@ -25,7 +25,7 @@ struct opengl_texture {
void load(); void load();
void create(); void create();
// members // members
GLuint id{ -1 }; // associated GL resource GLuint id{ (GLuint) -1 }; // associated GL resource
bool has_alpha{ false }; // indicates the texture has alpha channel bool has_alpha{ false }; // indicates the texture has alpha channel
bool is_ready{ false }; // indicates the texture was processed and is ready for use bool is_ready{ false }; // indicates the texture was processed and is ready for use
std::string traits; // requested texture attributes: wrapping modes etc std::string traits; // requested texture attributes: wrapping modes etc

View File

@@ -3758,7 +3758,7 @@ bool TTrain::Update( double const Deltatime )
{ {
if (DynamicObject->Mechanik ? if (DynamicObject->Mechanik ?
(DynamicObject->Mechanik->AIControllFlag ? false : (DynamicObject->Mechanik->AIControllFlag ? false :
Global::iFeedbackMode == 4 ) : (Global::iFeedbackMode == 4 || (Global::bMWDmasterEnable && Global::bMWDBreakEnable))) :
false) // nie blokujemy AI false) // nie blokujemy AI
{ // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba { // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba
// Firleju: dlatego kasujemy i zastepujemy funkcją w Console // Firleju: dlatego kasujemy i zastepujemy funkcją w Console
@@ -3782,7 +3782,7 @@ bool TTrain::Update( double const Deltatime )
if (ggLocalBrake.SubModel) if (ggLocalBrake.SubModel)
{ {
if (DynamicObject->Mechanik ? if (DynamicObject->Mechanik ?
(DynamicObject->Mechanik->AIControllFlag ? false : Global::iFeedbackMode == 4) : (DynamicObject->Mechanik->AIControllFlag ? false : (Global::iFeedbackMode == 4 || Global::bMWDmasterEnable)) :
false) // nie blokujemy AI false) // nie blokujemy AI
{ // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba { // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba
// Firleju: dlatego kasujemy i zastepujemy funkcją w Console // Firleju: dlatego kasujemy i zastepujemy funkcją w Console

View File

@@ -2611,6 +2611,7 @@ TWorld::Render_UI() {
} }
// if ((Global::iTextMode!=VK_F3)) // if ((Global::iTextMode!=VK_F3))
{ // stenogramy dźwięków (ukryć, gdy tabelka skanowania lub rozkład?) { // stenogramy dźwięków (ukryć, gdy tabelka skanowania lub rozkład?)
/*
glColor3f( 1.0f, 1.0f, 0.0f ); //żółte glColor3f( 1.0f, 1.0f, 0.0f ); //żółte
for( int i = 0; i < 5; ++i ) { // kilka linijek for( int i = 0; i < 5; ++i ) { // kilka linijek
if( Global::asTranscript[ i ].empty() ) if( Global::asTranscript[ i ].empty() )
@@ -2620,6 +2621,23 @@ TWorld::Render_UI() {
glPrint( Global::Bezogonkow( Global::asTranscript[ i ] ).c_str() ); glPrint( Global::Bezogonkow( Global::asTranscript[ i ] ).c_str() );
} }
} }
*/
int i = 0;
for( auto const &transcript : Global::tranTexts.aLines ) {
if( Global::fTimeAngleDeg >= transcript.fShow ) {
cParser parser( transcript.asText );
while( true == parser.getTokens(1, false, "|") ) {
std::string transcriptline; parser >> transcriptline;
::glColor3f( 1.0f, 1.0f, 0.0f ); //żółte
::glRasterPos2f( -0.20f, -0.05f - 0.01f * i );
glPrint( transcriptline.c_str() );
++i;
}
}
}
} }
} }
// if (Global::iViewMode!=Global::iTextMode) // if (Global::iViewMode!=Global::iTextMode)

View File

@@ -13,6 +13,7 @@ http://mozilla.org/MPL/2.0/.
#include "stdafx.h" #include "stdafx.h"
#include "mtable.h" #include "mtable.h"
#include "mczapkie/mctools.h"
// using namespace Mtable; // using namespace Mtable;
std::shared_ptr<TMTableTime> Mtable::GlobalTime; std::shared_ptr<TMTableTime> Mtable::GlobalTime;
@@ -278,8 +279,10 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
if (s != "|") if (s != "|")
break; break;
} // while (!(() || fin.eof())); } // while (!(() || fin.eof()));
if (s != "|") if( s != "|" ) {
Relation1 = s; Relation1 = s;
win1250_to_ascii( Relation1 );
}
else else
ConversionError = -5; ConversionError = -5;
while (fin >> s || !fin.bad()) while (fin >> s || !fin.bad())
@@ -294,6 +297,7 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
break; break;
} // while (!( || (fin.eof()))); } // while (!( || (fin.eof())));
fin >> Relation2; fin >> Relation2;
win1250_to_ascii( Relation2 );
while (fin >> s || !fin.bad()) while (fin >> s || !fin.bad())
{ {
if (s == "Wymagany") if (s == "Wymagany")
@@ -352,6 +356,8 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
while (s.find("|") == std::string::npos) while (s.find("|") == std::string::npos)
fin >> s; fin >> s;
fin >> record->StationName; fin >> record->StationName;
// get rid of non-ascii chars. TODO: run correct version based on locale
win1250_to_ascii( record->StationName );
do do
{ {
fin >> s; fin >> s;