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

Poprawka dla MWD aby kompilował się na VS

This commit is contained in:
firleju
2017-01-18 06:10:08 +01:00
parent 6440d64b2c
commit 51fff210e1
8 changed files with 4664 additions and 4069 deletions

View File

@@ -14,10 +14,10 @@ http://mozilla.org/MPL/2.0/.
author: Maciej Witek 2016 author: Maciej Witek 2016
Autor nie ponosi odpowiedzialności za niewłaciwe używanie lub działanie programu! Autor nie ponosi odpowiedzialności za niewłaciwe używanie lub działanie programu!
*/ */
#include "stdafx.h"
#include "MWD.h" #include "MWD.h"
#include "Logs.h"
#include "Globals.h" #include "Globals.h"
#include "Logs.h"
#include "World.h" #include "World.h"
#include <windows.h> #include <windows.h>
@@ -47,15 +47,16 @@ MWDComm::MWDComm() // konstruktor
kierunek = 0; kierunek = 0;
bnkMask = 0; bnkMask = 0;
int i=0; int i = 0;
while(i<BYTETOWRITE) while (i < BYTETOWRITE)
{ {
if(i<BYTETOREAD)ReadDataBuff[i] = 0; if (i < BYTETOREAD)
ReadDataBuff[i] = 0;
WriteDataBuff[i] = 0; WriteDataBuff[i] = 0;
i++; i++;
} }
i=0; i = 0;
while(i<6) while (i < 6)
{ {
lastStateData[i] = 0; lastStateData[i] = 0;
maskSwitch[i] = 0; maskSwitch[i] = 0;
@@ -72,14 +73,18 @@ MWDComm::~MWDComm() // destruktor
bool MWDComm::Open() // otwieranie portu COM bool MWDComm::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, FILE_ATTRIBUTE_NORMAL, NULL); hComm = CreateFile(portId, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hComm == INVALID_HANDLE_VALUE){ 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. 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!"); WriteLog("PortCOM ERROR! not open!");
//some other error occurred. Inform user. // some other error occurred. Inform user.
return FALSE; return FALSE;
} }
@@ -108,10 +113,10 @@ bool MWDComm::Open() // otwieranie portu COM
CommDCB.Parity = NOPARITY; CommDCB.Parity = NOPARITY;
CommDCB.StopBits = ONESTOPBIT; CommDCB.StopBits = ONESTOPBIT;
//konfiguracja portu // konfiguracja portu
if (!SetCommState (hComm, &CommDCB)) if (!SetCommState(hComm, &CommDCB))
{ {
//dwError = GetLastError (); // dwError = GetLastError ();
WriteLog("Unable to configure the serial port!"); WriteLog("Unable to configure the serial port!");
return FALSE; return FALSE;
} }
@@ -123,7 +128,7 @@ bool MWDComm::Close() // zamykanie portu COM
{ {
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...
{ {
WriteDataBuff[i] = 0; WriteDataBuff[i] = 0;
i++; i++;
@@ -138,8 +143,10 @@ bool MWDComm::Close() // zamykanie portu COM
inline bool MWDComm::GetMWDState() // sprawdzanie otwarcia portu COM inline bool MWDComm::GetMWDState() // sprawdzanie otwarcia portu COM
{ {
if(hComm > 0) return 1; if (hComm > 0)
else return 0; return 1;
else
return 0;
} }
bool MWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i zapis do zmiennych bool MWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i zapis do zmiennych
@@ -147,10 +154,15 @@ bool MWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i zap
DWORD bytes_read; DWORD bytes_read;
ReadFile(hComm, &ReadDataBuff[0], BYTETOREAD, &bytes_read, NULL); 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[0] =
fAnalog[1] = (float)((ReadDataBuff[11]<<8)+ReadDataBuff[10]) / Global::fMWDAnalogCalib[1][3]; (float)((ReadDataBuff[9] << 8) + ReadDataBuff[8]) /
fAnalog[2] = (float)((ReadDataBuff[13]<<8)+ReadDataBuff[12]) / Global::fMWDAnalogCalib[2][3]; Global::fMWDAnalogCalib[0][3]; // 4095.0f; //max wartosc wynikająca z rozdzielczości
fAnalog[3] = (float)((ReadDataBuff[15]<<8)+ReadDataBuff[14]) / Global::fMWDAnalogCalib[3][3]; 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(); CheckData();
return TRUE; return TRUE;
@@ -169,14 +181,16 @@ bool MWDComm::SendData() // wysy
bool MWDComm::Run() // wywoływanie obsługi MWD + generacja większego opóźnienia bool MWDComm::Run() // wywoływanie obsługi MWD + generacja większego opóźnienia
{ {
MWDTime++; MWDTime++;
if(!(MWDTime%5)) if (!(MWDTime % 5))
{ {
if(GetMWDState()) if (GetMWDState())
{ {
SendData(); SendData();
if (Global::bMWDInputDataEnable) ReadData(); if (Global::bMWDInputDataEnable)
ReadData();
return 1; return 1;
}else }
else
{ {
WriteLog("Port COM: connection ERROR!"); WriteLog("Port COM: connection ERROR!");
// może spróbować się połączyć znowu? // może spróbować się połączyć znowu?
@@ -186,12 +200,12 @@ bool MWDComm::Run() // wywo
} }
} }
bool MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowanie maszyną void MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowanie maszyną
{ {
int i=0; int i = 0;
while(i<6) while (i < 6)
{ {
maskData[i] = ReadDataBuff[i]^lastStateData[i]; maskData[i] = ReadDataBuff[i] ^ lastStateData[i];
lastStateData[i] = ReadDataBuff[i]; lastStateData[i] = ReadDataBuff[i];
i++; i++;
} }
@@ -200,9 +214,11 @@ bool MWDComm::CheckData() // sprawdzanie wej
Port0: 0 NC odblok. przek. sprężarki i wentyl. oporów Port0: 0 NC odblok. przek. sprężarki i wentyl. oporów
1 M wyłącznik wył. szybkiego 1 M wyłącznik wył. szybkiego
2 Shift+M impuls załączający wył. szybki 2 Shift+M impuls załączający wył. szybki
3 N odblok. przekaźników nadmiarowych i różnicowego obwodu głównego 3 N odblok. przekaźników nadmiarowych
i różnicowego obwodu głównego
4 NC rezerwa 4 NC rezerwa
5 Ctrl+N odblok. przek. nadmiarowych przetwornicy, ogrzewania pociągu i różnicowych obw. pomocniczych 5 Ctrl+N odblok. przek. nadmiarowych
przetwornicy, ogrzewania pociągu i różnicowych obw. pomocniczych
6 L wył. styczników liniowych 6 L wył. styczników liniowych
7 SPACE kasowanie czuwaka 7 SPACE kasowanie czuwaka
@@ -211,7 +227,8 @@ bool MWDComm::CheckData() // sprawdzanie wej
2 (Shift) C sprężarka 2 (Shift) C sprężarka
3 S piasecznice 3 S piasecznice
4 (Shift) H ogrzewanie składu 4 (Shift) H ogrzewanie składu
5 przel. hamowania Shift+B pspbpwy Ctrl+B pospieszny B towarowy 5 przel. hamowania Shift+B
pspbpwy Ctrl+B pospieszny B towarowy
6 przel. hamowania 6 przel. hamowania
7 (Shift) F rozruch w/n 7 (Shift) F rozruch w/n
@@ -235,172 +252,238 @@ bool MWDComm::CheckData() // sprawdzanie wej
*/ */
/* po przełączeniu bistabilnego najpierw wciskamy klawisz i przy następnym /* po przełączeniu bistabilnego najpierw wciskamy klawisz i przy następnym
wejściu w pętlę MWD puszczamy bo inaczej nie działa */ wejściu w pętlę MWD puszczamy bo inaczej nie działa
*/
// wciskanie przycisków klawiatury // wciskanie przycisków klawiatury
/*PORT0*/ /*PORT0*/
if(maskData[0] & 0x02 && lastStateData[0] & 0x02) KeyBoard('M',1); // wyłączenie wyłącznika szybkiego if (maskData[0] & 0x02 && lastStateData[0] & 0x02)
else KeyBoard('M',0); // monostabilny KeyBoard('M', 1); // wyłączenie wyłącznika szybkiego
if(maskData[0] & 0x04 && lastStateData[0] & 0x04) { // impuls załączający wyłącznik szybki else
KeyBoard(0x10,1); // monostabilny KeyBoard('M', 0); // monostabilny
KeyBoard('M',1); if (maskData[0] & 0x04 && lastStateData[0] & 0x04)
}else{ { // impuls załączający wyłącznik szybki
KeyBoard('M',0); KeyBoard(0x10, 1); // monostabilny
KeyBoard(0x10,0); KeyBoard('M', 1);
} }
if(maskData[0] & 0x08 && lastStateData[0] & 0x08) KeyBoard('N',1); // odblok nadmiarowego silników trakcyjnych else
else KeyBoard('N',0); // monostabilny {
if(maskData[0] & 0x20 && lastStateData[0] & 0x20) { // odblok nadmiarowego przetwornicy, ogrzewania poc. KeyBoard('M', 0);
KeyBoard(0x11,1); // różnicowego obwodów pomocniczych KeyBoard(0x10, 0);
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 if (maskData[0] & 0x08 && lastStateData[0] & 0x08)
else KeyBoard('L',0); // monostabilny KeyBoard('N', 1); // odblok nadmiarowego silników trakcyjnych
if(maskData[0] & 0x80 && lastStateData[0] & 0x80) KeyBoard(0x20,1); // kasowanie czuwaka/SHP else
else KeyBoard(0x20,0); // kasowanie czuwaka/SHP 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*/ /*PORT1*/
// puszczanie przycisku bistabilnego klawiatury // puszczanie przycisku bistabilnego klawiatury
if(maskSwitch[1]&0x02){ if (maskSwitch[1] & 0x02)
if(bitSwitch[1] &0x02){ {
KeyBoard('X',0); if (bitSwitch[1] & 0x02)
KeyBoard(0x10,0); {
}else KeyBoard('X',0); KeyBoard('X', 0);
KeyBoard(0x10, 0);
}
else
KeyBoard('X', 0);
maskSwitch[1] &= ~0x02; maskSwitch[1] &= ~0x02;
} }
if(maskSwitch[1]&0x04){ if (maskSwitch[1] & 0x04)
if(bitSwitch[1] &0x04){ {
KeyBoard('C',0); if (bitSwitch[1] & 0x04)
KeyBoard(0x10,0); {
}else KeyBoard('C',0); KeyBoard('C', 0);
KeyBoard(0x10, 0);
}
else
KeyBoard('C', 0);
maskSwitch[1] &= ~0x04; maskSwitch[1] &= ~0x04;
} }
if(maskSwitch[1]&0x10){ if (maskSwitch[1] & 0x10)
if(bitSwitch[1] &0x10){ {
KeyBoard('H',0); if (bitSwitch[1] & 0x10)
KeyBoard(0x10,0); {
}else KeyBoard('H',0); KeyBoard('H', 0);
KeyBoard(0x10, 0);
}
else
KeyBoard('H', 0);
maskSwitch[1] &= ~0x10; maskSwitch[1] &= ~0x10;
} }
if(maskSwitch[1] & 0x20 || maskSwitch[1] & 0x40){ if (maskSwitch[1] & 0x20 || maskSwitch[1] & 0x40)
if(maskSwitch[1] & 0x20) KeyBoard(0x10,0); {
if(maskSwitch[1] & 0x40) KeyBoard(0x11,0); if (maskSwitch[1] & 0x20)
KeyBoard('B',0); KeyBoard(0x10, 0);
if (maskSwitch[1] & 0x40)
KeyBoard(0x11, 0);
KeyBoard('B', 0);
maskSwitch[1] &= ~0x60; maskSwitch[1] &= ~0x60;
} }
if(maskSwitch[1]&0x80){ if (maskSwitch[1] & 0x80)
if(bitSwitch[1] &0x80){ {
KeyBoard('F',0); if (bitSwitch[1] & 0x80)
KeyBoard(0x10,0); {
}else KeyBoard('F',0); KeyBoard('F', 0);
KeyBoard(0x10, 0);
}
else
KeyBoard('F', 0);
maskSwitch[1] &= ~0x80; maskSwitch[1] &= ~0x80;
} }
if (maskData[1] & 0x02 && lastStateData[1] & 0x02)
if(maskData[1] & 0x02 && lastStateData[1] & 0x02) { // przetwornica { // przetwornica
KeyBoard(0x10,1); // bistabilny KeyBoard(0x10, 1); // bistabilny
KeyBoard('X',1); KeyBoard('X', 1);
maskSwitch[1] |= 0x02; maskSwitch[1] |= 0x02;
bitSwitch[1] |= 0x02; bitSwitch[1] |= 0x02;
}else{ }
else
{
maskSwitch[1] |= 0x02; maskSwitch[1] |= 0x02;
bitSwitch[1] &= ~0x02; bitSwitch[1] &= ~0x02;
KeyBoard('X',1); KeyBoard('X', 1);
} }
if(maskData[1] & 0x04 && lastStateData[1] & 0x04) { // sprężarka if (maskData[1] & 0x04 && lastStateData[1] & 0x04)
KeyBoard(0x10,1); // bistabilny { // sprężarka
KeyBoard('C',1); KeyBoard(0x10, 1); // bistabilny
KeyBoard('C', 1);
maskSwitch[1] |= 0x04; maskSwitch[1] |= 0x04;
bitSwitch[1] |= 0x04; bitSwitch[1] |= 0x04;
}else{ }
else
{
maskSwitch[1] |= 0x04; maskSwitch[1] |= 0x04;
bitSwitch[1] &= ~0x04; bitSwitch[1] &= ~0x04;
KeyBoard('C',1); KeyBoard('C', 1);
} }
if(maskData[1] & 0x08 && lastStateData[1] & 0x08) KeyBoard('S',1); // piasecznica if (maskData[1] & 0x08 && lastStateData[1] & 0x08)
else KeyBoard('S',0); // monostabilny KeyBoard('S', 1); // piasecznica
if(maskData[1] & 0x10 && lastStateData[1] & 0x10) { // ogrzewanie składu else
KeyBoard(0x11,1); // bistabilny KeyBoard('S', 0); // monostabilny
KeyBoard('H',1); if (maskData[1] & 0x10 && lastStateData[1] & 0x10)
{ // ogrzewanie składu
KeyBoard(0x11, 1); // bistabilny
KeyBoard('H', 1);
maskSwitch[1] |= 0x10; maskSwitch[1] |= 0x10;
bitSwitch[1] |= 0x10; bitSwitch[1] |= 0x10;
}else{ }
else
{
maskSwitch[1] |= 0x10; maskSwitch[1] |= 0x10;
bitSwitch[1] &= ~0x10; bitSwitch[1] &= ~0x10;
KeyBoard('H',1); KeyBoard('H', 1);
} }
if(maskData[1] & 0x20 || maskData[1] & 0x40){ // przełącznik hamowania if (maskData[1] & 0x20 || maskData[1] & 0x40)
if(lastStateData[1] & 0x20){ // Shift+B { // przełącznik hamowania
KeyBoard(0x10,1); if (lastStateData[1] & 0x20)
{ // Shift+B
KeyBoard(0x10, 1);
maskSwitch[1] |= 0x20; maskSwitch[1] |= 0x20;
}else if(lastStateData[1] & 0x40){ // Ctrl+B }
KeyBoard(0x11,1); else if (lastStateData[1] & 0x40)
{ // Ctrl+B
KeyBoard(0x11, 1);
maskSwitch[1] |= 0x40; maskSwitch[1] |= 0x40;
} }
KeyBoard('B',1); KeyBoard('B', 1);
} }
if(maskData[1] & 0x80 && lastStateData[1] & 0x80) { // rozruch wysoki/niski if (maskData[1] & 0x80 && lastStateData[1] & 0x80)
KeyBoard(0x10,1); // bistabilny { // rozruch wysoki/niski
KeyBoard('F',1); KeyBoard(0x10, 1); // bistabilny
KeyBoard('F', 1);
maskSwitch[1] |= 0x80; maskSwitch[1] |= 0x80;
bitSwitch[1] |= 0x80; bitSwitch[1] |= 0x80;
}else{ }
else
{
maskSwitch[1] |= 0x80; maskSwitch[1] |= 0x80;
bitSwitch[1] &= ~0x80; bitSwitch[1] &= ~0x80;
KeyBoard('F',1); KeyBoard('F', 1);
} }
/*PORT2*/ /*PORT2*/
if(maskSwitch[2]&0x01){ if (maskSwitch[2] & 0x01)
if(bitSwitch[2] &0x01){ {
KeyBoard('P',0); if (bitSwitch[2] & 0x01)
KeyBoard(0x10,0); {
}else KeyBoard('P',0); KeyBoard('P', 0);
KeyBoard(0x10, 0);
}
else
KeyBoard('P', 0);
maskSwitch[2] &= ~0x01; maskSwitch[2] &= ~0x01;
} }
if(maskSwitch[2]&0x02){ if (maskSwitch[2] & 0x02)
if(bitSwitch[2] &0x02){ {
KeyBoard('O',0); if (bitSwitch[2] & 0x02)
KeyBoard(0x10,0); {
}else KeyBoard('O',0); KeyBoard('O', 0);
KeyBoard(0x10, 0);
}
else
KeyBoard('O', 0);
maskSwitch[2] &= ~0x02; maskSwitch[2] &= ~0x02;
} }
if (maskData[2] & 0x01 && lastStateData[2] & 0x01)
if(maskData[2] & 0x01 && lastStateData[2] & 0x01) { // pantograf przedni { // pantograf przedni
KeyBoard(0x10,1); // bistabilny KeyBoard(0x10, 1); // bistabilny
KeyBoard('P',1); KeyBoard('P', 1);
maskSwitch[2] |= 0x01; maskSwitch[2] |= 0x01;
bitSwitch[2] |= 0x01; bitSwitch[2] |= 0x01;
}else{ }
else
{
maskSwitch[2] |= 0x01; maskSwitch[2] |= 0x01;
bitSwitch[2] &= ~0x01; bitSwitch[2] &= ~0x01;
KeyBoard('P',1); KeyBoard('P', 1);
} }
if(maskData[2] & 0x02 && lastStateData[2] & 0x02) { // pantograf tylni if (maskData[2] & 0x02 && lastStateData[2] & 0x02)
KeyBoard(0x10,1); // bistabilny { // pantograf tylni
KeyBoard('O',1); KeyBoard(0x10, 1); // bistabilny
KeyBoard('O', 1);
maskSwitch[2] |= 0x02; maskSwitch[2] |= 0x02;
bitSwitch[2] |= 0x02; bitSwitch[2] |= 0x02;
}else{ }
else
{
maskSwitch[2] |= 0x02; maskSwitch[2] |= 0x02;
bitSwitch[2] &= ~0x02; bitSwitch[2] &= ~0x02;
KeyBoard('O',1); KeyBoard('O', 1);
} }
if(maskData[2] & 0x04 && lastStateData[2] & 0x04) { // przyhamowanie przy poślizgu if (maskData[2] & 0x04 && lastStateData[2] & 0x04)
KeyBoard(0x10,1); // monostabilny { // przyhamowanie przy poślizgu
KeyBoard(0x0D,1); KeyBoard(0x10, 1); // monostabilny
}else{ KeyBoard(0x0D, 1);
}
else
{
KeyBoard(0x0D,0); KeyBoard(0x0D, 0);
KeyBoard(0x10,0); KeyBoard(0x10, 0);
} }
/*if(maskData[2] & 0x08 && lastStateData[2] & 0x08){ // przyciemnienie świateł /*if(maskData[2] & 0x08 && lastStateData[2] & 0x08){ // przyciemnienie świateł
KeyBoard(' ',0); // bistabilny KeyBoard(' ',0); // bistabilny
@@ -420,38 +503,51 @@ bool MWDComm::CheckData() // sprawdzanie wej
KeyBoard(0x11,0); KeyBoard(0x11,0);
KeyBoard(' ',1); KeyBoard(' ',1);
}*/ }*/
if(maskData[2] & 0x20 && lastStateData[2] & 0x20) KeyBoard(0x66,1); // odluźniacz if (maskData[2] & 0x20 && lastStateData[2] & 0x20)
else KeyBoard(0x66,0); // monostabilny KeyBoard(0x66, 1); // odluźniacz
if(maskData[2] & 0x40 && lastStateData[2] & 0x40) { // syrena wysoka else
KeyBoard(0x10,1); // monostabilny KeyBoard(0x66, 0); // monostabilny
KeyBoard('A',1); if (maskData[2] & 0x40 && lastStateData[2] & 0x40)
}else{ { // syrena wysoka
KeyBoard('A',0); KeyBoard(0x10, 1); // monostabilny
KeyBoard(0x10,0); KeyBoard('A', 1);
} }
if(maskData[2] & 0x80 && lastStateData[2] & 0x80) KeyBoard('A',1); // syrena niska else
else KeyBoard('A',0); // monostabilny {
KeyBoard('A', 0);
KeyBoard(0x10, 0);
}
if (maskData[2] & 0x80 && lastStateData[2] & 0x80)
KeyBoard('A', 1); // syrena niska
else
KeyBoard('A', 0); // monostabilny
/*PORT3*/ /*PORT3*/
if(maskSwitch[3]&0x01){ if (maskSwitch[3] & 0x01)
if(bitSwitch[3] &0x01){ {
KeyBoard('J',0); if (bitSwitch[3] & 0x01)
KeyBoard(0x10,0); {
}else KeyBoard('J',0); KeyBoard('J', 0);
KeyBoard(0x10, 0);
}
else
KeyBoard('J', 0);
maskSwitch[3] &= ~0x01; maskSwitch[3] &= ~0x01;
} }
if(maskData[3] & 0x01 && lastStateData[3] & 0x01) { // bateria if (maskData[3] & 0x01 && lastStateData[3] & 0x01)
KeyBoard(0x10,1); // bistabilny { // bateria
KeyBoard('J',1); KeyBoard(0x10, 1); // bistabilny
KeyBoard('J', 1);
maskSwitch[3] |= 0x01; maskSwitch[3] |= 0x01;
bitSwitch[3] |= 0x01; bitSwitch[3] |= 0x01;
}else{ }
else
{
maskSwitch[3] |= 0x01; maskSwitch[3] |= 0x01;
bitSwitch[3] &= ~0x01; bitSwitch[3] &= ~0x01;
KeyBoard('J',1); KeyBoard('J', 1);
} }
/* /*
@@ -491,7 +587,7 @@ bool MWDComm::CheckData() // sprawdzanie wej
KeyBoard(0x10,0); KeyBoard(0x10,0);
} }
/*PORT4*//* /*PORT4*/ /*
if(maskData[4] & 0x02 && lastStateData[1] & 0x02) { if(maskData[4] & 0x02 && lastStateData[1] & 0x02) {
KeyBoard(0x10,1); KeyBoard(0x10,1);
KeyBoard('X',1); // KeyBoard('X',1); //
@@ -537,13 +633,14 @@ bool MWDComm::CheckData() // sprawdzanie wej
KeyBoard(0x10,0); KeyBoard(0x10,0);
} }
/*PORT5*//* /*PORT5*/ /*
if(maskData[5] & 0x02 && lastStateData[1] & 0x02) { if(maskData[5] & 0x02 && lastStateData[1] & 0x02) {
KeyBoard(0x10,1); KeyBoard(0x10,1);
KeyBoard('X',1); // KeyBoard('X',1); //
KeyBoard('X',0); KeyBoard('X',0);
KeyBoard(0x10,0); KeyBoard(0x10,0);
}else{ KeyBoard('X',1); // }else{
KeyBoard('X',1); //
KeyBoard('X',0); KeyBoard('X',0);
} }
if(maskData[5] & 0x04 && lastStateData[1] & 0x04) { if(maskData[5] & 0x04 && lastStateData[1] & 0x04) {
@@ -551,115 +648,146 @@ bool MWDComm::CheckData() // sprawdzanie wej
KeyBoard('C',1); // KeyBoard('C',1); //
KeyBoard('C',0); KeyBoard('C',0);
KeyBoard(0x10,0); KeyBoard(0x10,0);
}else{ KeyBoard('C',1); // }else{
KeyBoard('C',1); //
KeyBoard('C',0); KeyBoard('C',0);
} }
if(maskData[5] & 0x08 && lastStateData[1] & 0x08) KeyBoard('S',1); // if(maskData[5] & 0x08 && lastStateData[1] & 0x08) KeyBoard('S',1); //
else KeyBoard('S',0); else
KeyBoard('S',0);
if(maskData[5] & 0x10 && lastStateData[1] & 0x10) { if(maskData[5] & 0x10 && lastStateData[1] & 0x10) {
KeyBoard(0x11,1); KeyBoard(0x11,1);
KeyBoard('H',1); KeyBoard('H',1);
}else{ KeyBoard('H',0); }else{
KeyBoard('H',0);
KeyBoard(0x11,0); KeyBoard(0x11,0);
} }
if(maskData[5] & 0x20 && lastStateData[1] & 0x20) { if(maskData[5] & 0x20 && lastStateData[1] & 0x20) {
KeyBoard(0x11,1); KeyBoard(0x11,1);
KeyBoard(' ',1); KeyBoard(' ',1);
}else{ KeyBoard(' ',0); }else{
KeyBoard(' ',0);
KeyBoard(0x11,0); KeyBoard(0x11,0);
} }
if(maskData[5] & 0x40 && lastStateData[1] & 0x40) { if(maskData[5] & 0x40 && lastStateData[1] & 0x40) {
KeyBoard(0x10,1); KeyBoard(0x10,1);
KeyBoard(' ',1); KeyBoard(' ',1);
}else{ KeyBoard(' ',0); }else{
KeyBoard(' ',0);
KeyBoard(0x10,0); KeyBoard(0x10,0);
} }
if(maskData[5] & 0x80 && lastStateData[1] & 0x80) { if(maskData[5] & 0x80 && lastStateData[1] & 0x80) {
KeyBoard(0x10,1); KeyBoard(0x10,1);
KeyBoard('F',1); KeyBoard('F',1);
}else{ KeyBoard('F',0); }else{
KeyBoard('F',0);
KeyBoard(0x10,0); KeyBoard(0x10,0);
}//*/ }//*/
/* NASTAWNIK, BOCZNIK i KIERUNEK */ /* NASTAWNIK, BOCZNIK i KIERUNEK */
if(bnkMask & 1){ //puszczanie klawiszy if (bnkMask & 1)
KeyBoard(0x6B,0); { // puszczanie klawiszy
KeyBoard(0x6B, 0);
bnkMask &= ~1; bnkMask &= ~1;
} }
if(bnkMask & 2){ if (bnkMask & 2)
KeyBoard(0x6D,0); {
KeyBoard(0x6D, 0);
bnkMask &= ~2; bnkMask &= ~2;
} }
if(bnkMask & 4){ if (bnkMask & 4)
KeyBoard(0x6F,0); {
KeyBoard(0x6F, 0);
bnkMask &= ~4; bnkMask &= ~4;
} }
if(bnkMask & 8){ if (bnkMask & 8)
KeyBoard(0x6A,0); {
KeyBoard(0x6A, 0);
bnkMask &= ~8; bnkMask &= ~8;
} }
if(nastawnik < ReadDataBuff[6]) if (nastawnik < ReadDataBuff[6])
{ {
bnkMask |= 1; bnkMask |= 1;
nastawnik++; nastawnik++;
KeyBoard(0x6B,1); //wciśnij + i dodaj 1 do nastawnika KeyBoard(0x6B, 1); // wciśnij + i dodaj 1 do nastawnika
} }
if(nastawnik > ReadDataBuff[6]) if (nastawnik > ReadDataBuff[6])
{ {
bnkMask |= 2; bnkMask |= 2;
nastawnik--; nastawnik--;
KeyBoard(0x6D,1); //wciśnij - i odejmij 1 do nastawnika KeyBoard(0x6D, 1); // wciśnij - i odejmij 1 do nastawnika
} }
if(bocznik < ReadDataBuff[7]) if (bocznik < ReadDataBuff[7])
{ {
bnkMask |= 4; bnkMask |= 4;
bocznik++; bocznik++;
KeyBoard(0x6F,1); //wciśnij / i dodaj 1 do bocznika KeyBoard(0x6F, 1); // wciśnij / i dodaj 1 do bocznika
} }
if(bocznik > ReadDataBuff[7]) if (bocznik > ReadDataBuff[7])
{ {
bnkMask |= 8; bnkMask |= 8;
bocznik--; bocznik--;
KeyBoard(0x6A,1); //wciśnij * i odejmij 1 do bocznika KeyBoard(0x6A, 1); // wciśnij * i odejmij 1 do bocznika
} }
/* Obsługa HASLERA */ /* Obsługa HASLERA */
if(ReadDataBuff[0] & 0x80) bCzuwak = true; if (ReadDataBuff[0] & 0x80)
bCzuwak = true;
if(bKabina1){ // logika rysika 1 if (bKabina1)
{ // logika rysika 1
bRysik1H = true; bRysik1H = true;
bRysik1L = false; bRysik1L = false;
if(bPrzejazdSHP) bRysik1H = false; if (bPrzejazdSHP)
}else if(bKabina2){ bRysik1H = false;
}
else if (bKabina2)
{
bRysik1L = true; bRysik1L = true;
bRysik1H = false; bRysik1H = false;
if(bPrzejazdSHP) bRysik1L = false; if (bPrzejazdSHP)
}else{ bRysik1L = false;
}
else
{
bRysik1H = false; bRysik1H = false;
bRysik1L = false; bRysik1L = false;
} }
if(bHamowanie){ // logika rysika 2 if (bHamowanie)
{ // logika rysika 2
bRysik2H = false; bRysik2H = false;
bRysik2L = true; bRysik2L = true;
}else{ }
if(bCzuwak) bRysik2H = true; else
else bRysik2H = false; {
if (bCzuwak)
bRysik2H = true;
else
bRysik2H = false;
bRysik2L = false; bRysik2L = false;
} }
bCzuwak = false; bCzuwak = false;
if(bRysik1H)WriteDataBuff[6] |= 1<<0; if (bRysik1H)
else WriteDataBuff[6] &= ~(1<<0); WriteDataBuff[6] |= 1 << 0;
if(bRysik1L)WriteDataBuff[6] |= 1<<1; else
else WriteDataBuff[6] &= ~(1<<1); WriteDataBuff[6] &= ~(1 << 0);
if(bRysik2H)WriteDataBuff[6] |= 1<<2; if (bRysik1L)
else WriteDataBuff[6] &= ~(1<<2); WriteDataBuff[6] |= 1 << 1;
if(bRysik2L)WriteDataBuff[6] |= 1<<3; else
else WriteDataBuff[6] &= ~(1<<3); 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 void MWDComm::KeyBoard(int key, bool s) // emulacja klawiatury
@@ -673,15 +801,16 @@ void MWDComm::KeyBoard(int key, bool s) // emulacja klawiatury
ip.ki.wVk = key; // virtual-key code for the "a" key ip.ki.wVk = key; // virtual-key code for the "a" key
if(s){// Press the "A" key if (s)
{ // Press the "A" key
ip.ki.dwFlags = 0; // 0 for key press ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT)); SendInput(1, &ip, sizeof(INPUT));
}else{ }
else
{
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT)); SendInput(1, &ip, sizeof(INPUT));
} }
//return 1; // return 1;
} }

View File

@@ -15,7 +15,6 @@ http://mozilla.org/MPL/2.0/.
Autor nie ponosi odpowiedzialności za niewłaciwe używanie lub działanie programu! Autor nie ponosi odpowiedzialności za niewłaciwe używanie lub działanie programu!
*/ */
#ifndef MWDH #ifndef MWDH
#define MWDH #define MWDH
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -25,15 +24,15 @@ typedef unsigned long DWORD;
class MWDComm class MWDComm
{ {
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);
bool 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; bool bRysik1H;
@@ -41,7 +40,7 @@ private:
bool bRysik2H; bool bRysik2H;
bool bRysik2L; bool bRysik2L;
public: public:
bool Open(); // Otwarcie portu bool Open(); // Otwarcie portu
bool Close(); // Zamknięcie portu bool Close(); // Zamknięcie portu
bool Run(); // Obsługa portu bool Run(); // Obsługa portu
@@ -55,19 +54,16 @@ public:
bool bHamowanie; bool bHamowanie;
bool bCzuwak; bool bCzuwak;
float fAnalog[4]; // trzymanie danych z wejść analogowych float fAnalog[4]; // trzymanie danych z wejść analogowych
BYTE ReadDataBuff[17]; // bufory danych BYTE ReadDataBuff[17]; // bufory danych
BYTE WriteDataBuff[31]; BYTE WriteDataBuff[31];
MWDComm(); //konstruktor MWDComm(); // konstruktor
~MWDComm(); //destruktor ~MWDComm(); // destruktor
}; };
#endif #endif
/* /*
INFO - zmiany dokonane w innych plikach niezbędne do prawidłowego działania: INFO - zmiany dokonane w innych plikach niezbędne do prawidłowego działania:

View File

@@ -11,21 +11,21 @@ http://mozilla.org/MPL/2.0/.
Copyright (C) 2001-2004 Marcin Wozniak, Maciej Czapkiewicz and others Copyright (C) 2001-2004 Marcin Wozniak, Maciej Czapkiewicz and others
*/ */
#include "stdafx.h" #include "stdafx.h"
#include "Driver.h" #include "Driver.h"
#include <direct.h>
#include "Globals.h"
#include "Logs.h"
#include "mtable.h"
#include "DynObj.h" #include "DynObj.h"
#include "Event.h" #include "Event.h"
#include "Globals.h"
#include "Ground.h" #include "Ground.h"
#include "Logs.h"
#include "McZapkie/MOVER.h"
#include "McZapkie/mctools.h"
#include "MemCell.h" #include "MemCell.h"
#include "World.h" #include "World.h"
#include "McZapkie/mctools.h" #include "mtable.h"
#include "McZapkie/MOVER.h" #include <direct.h>
#define LOGVELOCITY 0 #define LOGVELOCITY 0
#define LOGORDERS 0 #define LOGORDERS 0
@@ -112,7 +112,7 @@ void TSpeedPos::Clear()
{ {
iFlags = 0; // brak flag to brak reakcji iFlags = 0; // brak flag to brak reakcji
fVelNext = -1.0; // pr<70>dko<6B><6F> bez ogranicze<7A> fVelNext = -1.0; // pr<70>dko<6B><6F> bez ogranicze<7A>
fSectionVelocityDist = 0.0; //brak d<>ugo<67>ci fSectionVelocityDist = 0.0; // brak d<>ugo<67>ci
fDist = 0.0; fDist = 0.0;
vPos = vector3(0, 0, 0); vPos = vector3(0, 0, 0);
trTrack = NULL; // brak wska<6B>nika trTrack = NULL; // brak wska<6B>nika
@@ -138,7 +138,7 @@ void TSpeedPos::CommandCheck()
// SetVelocity 40 -1 -> PutValues: jecha<68> 40 a<> do mini<6E>cia (koniec ograniczenia( // SetVelocity 40 -1 -> PutValues: jecha<68> 40 a<> do mini<6E>cia (koniec ograniczenia(
fVelNext = value1; fVelNext = value1;
iFlags &= ~(spShuntSemaphor | spPassengerStopPoint | spStopOnSBL); iFlags &= ~(spShuntSemaphor | spPassengerStopPoint | spStopOnSBL);
iFlags |= spSemaphor;// nie manewrowa, nie przystanek, nie zatrzyma<6D> na SBL, ale semafor iFlags |= spSemaphor; // nie manewrowa, nie przystanek, nie zatrzyma<6D> na SBL, ale semafor
if (value1 == 0.0) // je<6A>li pierwsza zerowa if (value1 == 0.0) // je<6A>li pierwsza zerowa
if (value2 != 0.0) // a druga nie if (value2 != 0.0) // a druga nie
{ // S1 na SBL, mo<6D>na przejecha<68> po zatrzymaniu (tu nie mamy pr<70>dko<6B>ci ani odleg<65>o<EFBFBD>ci) { // S1 na SBL, mo<6D>na przejecha<68> po zatrzymaniu (tu nie mamy pr<70>dko<6B>ci ani odleg<65>o<EFBFBD>ci)
@@ -162,7 +162,8 @@ void TSpeedPos::CommandCheck()
// przystanek, najwy<77>ej AI zignoruje przy analizie tabelki // przystanek, najwy<77>ej AI zignoruje przy analizie tabelki
if ((iFlags & spPassengerStopPoint) == 0) if ((iFlags & spPassengerStopPoint) == 0)
fVelNext = 0.0; // TrainParams->IsStop()?0.0:-1.0; //na razie tak fVelNext = 0.0; // TrainParams->IsStop()?0.0:-1.0; //na razie tak
iFlags |= spPassengerStopPoint; // niestety nie da si<73> w tym miejscu wsp<73><70>pracowa<77> z rozk<7A>adem iFlags |=
spPassengerStopPoint; // niestety nie da si<73> w tym miejscu wsp<73><70>pracowa<77> z rozk<7A>adem
break; break;
case cm_SetProximityVelocity: case cm_SetProximityVelocity:
// musi zosta<74> gdy<64> inaczej nie dzia<69>aj<61> manewry // musi zosta<74> gdy<64> inaczej nie dzia<69>aj<61> manewry
@@ -204,7 +205,8 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
} }
else else
{ {
iFlags ^= spElapsed; // 32-mini<6E>ty - b<>dziemy liczy<7A> odleg<65>o<EFBFBD><6F> wzgl<67>dem przeciwnego ko<6B>ca iFlags ^=
spElapsed; // 32-mini<6E>ty - b<>dziemy liczy<7A> odleg<65>o<EFBFBD><6F> wzgl<67>dem przeciwnego ko<6B>ca
// toru (nadal mo<6D>e by<62> z przodu i ogranicza<7A>) // toru (nadal mo<6D>e by<62> z przodu i ogranicza<7A>)
if ((iFlags & 0x43) == 3) // tylko je<6A>li (istotny) tor, bo eventy s<> punktowe if ((iFlags & 0x43) == 3) // tylko je<6A>li (istotny) tor, bo eventy s<> punktowe
if (trTrack) // mo<6D>e by<62> NULL, je<6A>li koniec toru (????) if (trTrack) // mo<6D>e by<62> NULL, je<6A>li koniec toru (????)
@@ -245,7 +247,8 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
{ {
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("Tor " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + WriteLog("Tor " + trTrack->NameGet() + " zajety przed pojazdem. Num=" +
std::to_string(trTrack->iNumDynamics) + "Dist= " + std::to_string(fDist)); std::to_string(trTrack->iNumDynamics) +
"Dist= " + std::to_string(fDist));
fVelNext = fVelNext =
0.0; // to zabroni<6E> wjazdu (chyba <20>e ten z przodu te<74> jedzie prosto) 0.0; // to zabroni<6E> wjazdu (chyba <20>e ten z przodu te<74> jedzie prosto)
} }
@@ -263,14 +266,16 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
// na Mydelniczce potrafi skanowa<77> na wprost mimo pojechania na bok // na Mydelniczce potrafi skanowa<77> na wprost mimo pojechania na bok
} }
// poni<6E>sze nie dotyczy trybu <20><>czenia? // poni<6E>sze nie dotyczy trybu <20><>czenia?
if ((iFlags & spElapsed) ? false : if ((iFlags & spElapsed) ?
false :
trTrack->iNumDynamics > trTrack->iNumDynamics >
0) // je<6A>li jeszcze nie wjechano na tor, a co<63> na nim jest 0) // je<6A>li jeszcze nie wjechano na tor, a co<63> na nim jest
{ {
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("Rozjazd " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + WriteLog("Rozjazd " + trTrack->NameGet() + " zajety przed pojazdem. Num=" +
std::to_string(trTrack->iNumDynamics) + "Dist= "+ std::to_string(fDist)); std::to_string(trTrack->iNumDynamics) +
//fDist -= 30.0; "Dist= " + std::to_string(fDist));
// fDist -= 30.0;
fVelNext = 0.0; // to niech stanie w zwi<77>kszonej odleg<65>o<EFBFBD>ci fVelNext = 0.0; // to niech stanie w zwi<77>kszonej odleg<65>o<EFBFBD>ci
// else if (fVelNext==0.0) //je<6A>li zosta<74>a wyzerowana // else if (fVelNext==0.0) //je<6A>li zosta<74>a wyzerowana
// fVelNext=trTrack->VelocityGet(); //odczyt pr<70>dko<6B>ci // fVelNext=trTrack->VelocityGet(); //odczyt pr<70>dko<6B>ci
@@ -300,11 +305,13 @@ std::string TSpeedPos::TableText()
{ // o ile pozycja istotna { // o ile pozycja istotna
return "Flags=#" + to_hex_str(iFlags, 8) + ", Dist=" + to_string(fDist, 1, 7) + return "Flags=#" + to_hex_str(iFlags, 8) + ", Dist=" + to_string(fDist, 1, 7) +
", Vel=" + std::to_string(fVelNext) + ", Name=" + GetName(); ", Vel=" + std::to_string(fVelNext) + ", Name=" + GetName();
//if (iFlags & spTrack) // je<6A>li tor // if (iFlags & spTrack) // je<6A>li tor
// return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) + // return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1)
// +
// ", Vel=" + AnsiString(fVelNext) + ", Track=" + trTrack->NameGet(); // ", Vel=" + AnsiString(fVelNext) + ", Track=" + trTrack->NameGet();
//else if (iFlags & spEvent) // je<6A>li event // else if (iFlags & spEvent) // je<6A>li event
// return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) + // return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1)
// +
// ", Vel=" + AnsiString(fVelNext) + ", Event=" + evEvent->asName; // ", Vel=" + AnsiString(fVelNext) + ", Event=" + evEvent->asName;
} }
return "Empty"; return "Empty";
@@ -312,7 +319,8 @@ std::string TSpeedPos::TableText()
bool TSpeedPos::IsProperSemaphor(TOrders order) bool TSpeedPos::IsProperSemaphor(TOrders order)
{ // sprawdzenie czy semafor jest zgodny z trybem jazdy { // sprawdzenie czy semafor jest zgodny z trybem jazdy
if (order < 0x40) // Wait_for_orders, Prepare_engine, Change_direction, Connect, Disconnect, Shunt if (order <
0x40) // Wait_for_orders, Prepare_engine, Change_direction, Connect, Disconnect, Shunt
{ {
if (iFlags & (spSemaphor | spShuntSemaphor)) if (iFlags & (spSemaphor | spShuntSemaphor))
return true; return true;
@@ -336,8 +344,10 @@ bool TSpeedPos::Set(TEvent *event, double dist, TOrders order)
CommandCheck(); // sprawdzenie typu komendy w evencie i okre<72>lenie pr<70>dko<6B>ci CommandCheck(); // sprawdzenie typu komendy w evencie i okre<72>lenie pr<70>dko<6B>ci
// zale<6C>nie od trybu sprawdzenie czy jest tutaj gdzie<69> semafor lub tarcza manewrowa // zale<6C>nie od trybu sprawdzenie czy jest tutaj gdzie<69> semafor lub tarcza manewrowa
// je<6A>li wskazuje stop wtedy wystawiamy true jako koniec sprawdzania // je<6A>li wskazuje stop wtedy wystawiamy true jako koniec sprawdzania
// WriteLog("EventSet: Vel=" + AnsiString(fVelNext) + " iFlags=" + AnsiString(iFlags) + " order="+AnsiString(order)); // WriteLog("EventSet: Vel=" + AnsiString(fVelNext) + " iFlags=" + AnsiString(iFlags) + "
if (order < 0x40) // Wait_for_orders, Prepare_engine, Change_direction, Connect, Disconnect, Shunt // order="+AnsiString(order));
if (order <
0x40) // Wait_for_orders, Prepare_engine, Change_direction, Connect, Disconnect, Shunt
{ {
if (iFlags & (spSemaphor | spShuntSemaphor) && fVelNext == 0.0) if (iFlags & (spSemaphor | spShuntSemaphor) && fVelNext == 0.0)
return true; return true;
@@ -358,7 +368,8 @@ void TSpeedPos::Set(TTrack *track, double dist, int flag)
trTrack = track; // TODO: (t) mo<6D>e by<62> NULL i nie odczytamy ko<6B>ca poprzedniego :/ trTrack = track; // TODO: (t) mo<6D>e by<62> NULL i nie odczytamy ko<6B>ca poprzedniego :/
if (trTrack) if (trTrack)
{ {
iFlags = flag | (trTrack->eType == tt_Normal ? 2 : 10); // zapami<6D>tanie kierunku wraz z typem iFlags =
flag | (trTrack->eType == tt_Normal ? 2 : 10); // zapami<6D>tanie kierunku wraz z typem
if (iFlags & spSwitch) if (iFlags & spSwitch)
if (trTrack->GetSwitchState() & 1) if (trTrack->GetSwitchState() & 1)
iFlags |= spSwitchStatus; iFlags |= spSwitchStatus;
@@ -390,7 +401,7 @@ void TController::TableClear()
eSignSkip = NULL; // nic nie pomijamy eSignSkip = NULL; // nic nie pomijamy
}; };
TEvent * TController::CheckTrackEvent(double fDirection, TTrack *Track) TEvent *TController::CheckTrackEvent(double fDirection, TTrack *Track)
{ // sprawdzanie event<6E>w na podanym torze do podstawowego skanowania { // sprawdzanie event<6E>w na podanym torze do podstawowego skanowania
TEvent *e = (fDirection > 0) ? Track->evEvent2 : Track->evEvent1; TEvent *e = (fDirection > 0) ? Track->evEvent2 : Track->evEvent1;
if (!e) if (!e)
@@ -416,12 +427,13 @@ bool TController::TableNotFound(TEvent *e)
{ // sprawdzenie, czy nie zosta<74> ju<6A> dodany do tabelki (np. podw<64>jne W4 robi problemy) { // sprawdzenie, czy nie zosta<74> ju<6A> dodany do tabelki (np. podw<64>jne W4 robi problemy)
int j = (iLast + 1) % iSpeedTableSize; // j, aby sprawdzi<7A> te<74> ostatni<6E> pozycj<63> int j = (iLast + 1) % iSpeedTableSize; // j, aby sprawdzi<7A> te<74> ostatni<6E> pozycj<63>
for (int i = iFirst; i != j; i = (i + 1) % iSpeedTableSize) for (int i = iFirst; i != j; i = (i + 1) % iSpeedTableSize)
if ((sSpeedTable[i].iFlags & (spEnabled | spEvent)) == (spEnabled | if ((sSpeedTable[i].iFlags & (spEnabled | spEvent)) ==
spEvent)) // o ile u<>ywana pozycja (spEnabled | spEvent)) // o ile u<>ywana pozycja
if (sSpeedTable[i].evEvent == e) if (sSpeedTable[i].evEvent == e)
{ {
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TableNotFound: Event already in SpeedTable: " + sSpeedTable[i].evEvent->asName); WriteLog("TableNotFound: Event already in SpeedTable: " +
sSpeedTable[i].evEvent->asName);
return false; // ju<6A> jest, drugi raz dodawa<77> nie ma po co return false; // ju<6A> jest, drugi raz dodawa<77> nie ma po co
} }
return true; // nie ma, czyli mo<6D>na doda<64> return true; // nie ma, czyli mo<6D>na doda<64>
@@ -499,8 +511,9 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
-1.0 : -1.0 :
1.0; // flaga ustawiona, gdy Point2 toru jest bli<6C>ej 1.0; // flaga ustawiona, gdy Point2 toru jest bli<6C>ej
fCurrentDistance = sSpeedTable[iLast].fDist; // aktualna odleg<65>o<EFBFBD><6F> do jego Point1 fCurrentDistance = sSpeedTable[iLast].fDist; // aktualna odleg<65>o<EFBFBD><6F> do jego Point1
fTrackLength = fTrackLength = sSpeedTable[iLast].iFlags & (spElapsed | spEnd) ?
sSpeedTable[iLast].iFlags & (spElapsed | spEnd) ? 0.0 : pTrack->Length(); // nie dolicza<7A> d<>ugo<67>ci gdy: 0.0 :
pTrack->Length(); // nie dolicza<7A> d<>ugo<67>ci gdy:
// 32-mini<6E>ty pocz<63>tek, // 32-mini<6E>ty pocz<63>tek,
// 64-jazda do ko<6B>ca toru // 64-jazda do ko<6B>ca toru
} }
@@ -523,8 +536,11 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
if (TableAddNew()) if (TableAddNew())
{ {
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TableTraceRoute: new event found " + pEvent->asName + " by " + OwnerName()); WriteLog("TableTraceRoute: new event found " + pEvent->asName +
if (sSpeedTable[iLast].Set( pEvent, fCurrentDistance, OrderCurrentGet())) // dodanie odczytu sygna<6E>u " by " + OwnerName());
if (sSpeedTable[iLast].Set(
pEvent, fCurrentDistance,
OrderCurrentGet())) // dodanie odczytu sygna<6E>u
{ {
fDistance = fCurrentDistance; // je<6A>li sygna<6E> stop, to nie ma fDistance = fCurrentDistance; // je<6A>li sygna<6E> stop, to nie ma
// potrzeby dalej skanowa<77> // potrzeby dalej skanowa<77>
@@ -589,8 +605,9 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
sSpeedTable[iLast].iFlags &= sSpeedTable[iLast].iFlags &=
~spReverse; // usuni<6E>cie flagi kierunku, bo mo<6D>e by<62> b<><62>dna ~spReverse; // usuni<6E>cie flagi kierunku, bo mo<6D>e by<62> b<><62>dna
if (sSpeedTable[iLast].iFlags < 0) if (sSpeedTable[iLast].iFlags < 0)
sSpeedTable[iLast].iFlags |= sSpeedTable[iLast].iFlags |= spReverse; // ustawienie flagi kierunku
spReverse; // ustawienie flagi kierunku na podstawie wybranego segmentu // na podstawie wybranego
// segmentu
if (int(fLastDir) * sSpeedTable[iLast].iFlags < 0) if (int(fLastDir) * sSpeedTable[iLast].iFlags < 0)
fLastDir = -fLastDir; fLastDir = -fLastDir;
if (AIControllFlag) // dla AI na razie losujemy kierunek na kolejnym if (AIControllFlag) // dla AI na razie losujemy kierunek na kolejnym
@@ -711,9 +728,10 @@ void TController::TableCheck(double fDistance)
if (sSpeedTable[i].Update(&pos, &dir, len)) if (sSpeedTable[i].Update(&pos, &dir, len))
{ {
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TableCheck: Switch change. Delete next entries. (" + sSpeedTable[i].trTrack->NameGet() + ")"); WriteLog("TableCheck: Switch change. Delete next entries. (" +
sSpeedTable[i].trTrack->NameGet() + ")");
int k = (iLast + 1) % iSpeedTableSize; // skanujemy razem z ostatni<6E> pozycj<63> int k = (iLast + 1) % iSpeedTableSize; // skanujemy razem z ostatni<6E> pozycj<63>
for (int j = (i+1) % iSpeedTableSize; j != k; j = (j + 1) % iSpeedTableSize) for (int j = (i + 1) % iSpeedTableSize; j != k; j = (j + 1) % iSpeedTableSize)
{ // kasowanie wszystkich rekord<72>w za zmienion<6F> zwrotnic<69> { // kasowanie wszystkich rekord<72>w za zmienion<6F> zwrotnic<69>
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TableCheck: Delete from table: " + sSpeedTable[j].GetName()); WriteLog("TableCheck: Delete from table: " + sSpeedTable[j].GetName());
@@ -735,16 +753,20 @@ void TController::TableCheck(double fDistance)
{ {
if (sSpeedTable[i].fDist < -fLength) // a sk<73>ad wyjecha<68> ca<63><61> d<>ugo<67>ci<63> poza if (sSpeedTable[i].fDist < -fLength) // a sk<73>ad wyjecha<68> ca<63><61> d<>ugo<67>ci<63> poza
{ // degradacja pozycji { // degradacja pozycji
// WriteLog( "TableCheck: Track is behind. Delete from table: " + sSpeedTable[i].trTrack->NameGet()); // WriteLog( "TableCheck: Track is behind. Delete from table: " +
// sSpeedTable[i].trTrack->NameGet());
sSpeedTable[i].iFlags &= ~spEnabled; // nie liczy si<73> sSpeedTable[i].iFlags &= ~spEnabled; // nie liczy si<73>
} }
else if ((sSpeedTable[i].iFlags & 0xF0000028) == else if ((sSpeedTable[i].iFlags & 0xF0000028) == spElapsed) // jest z ty<74>u
spElapsed) // jest z ty<74>u (najechany) i nie jest zwrotnic<69> ani skrzy<7A>owaniem // (najechany) i nie
// jest zwrotnic<69>
// ani skrzy<7A>owaniem
if (sSpeedTable[i].fVelNext < 0) // a nie ma ograniczenia pr<70>dko<6B>ci if (sSpeedTable[i].fVelNext < 0) // a nie ma ograniczenia pr<70>dko<6B>ci
{ {
sSpeedTable[i].iFlags = sSpeedTable[i].iFlags =
0; // to nie ma go po co trzyma<6D> (odtykacz usunie ze <20>rodka) 0; // to nie ma go po co trzyma<6D> (odtykacz usunie ze <20>rodka)
// WriteLog("TableCheck: Track without speed. Delete from table: " + sSpeedTable[i].trTrack->NameGet()); // WriteLog("TableCheck: Track without speed. Delete from table: " +
// sSpeedTable[i].trTrack->NameGet());
} }
} }
else if (sSpeedTable[i].iFlags & spEvent) // je<6A>li event else if (sSpeedTable[i].iFlags & spEvent) // je<6A>li event
@@ -756,7 +778,8 @@ void TController::TableCheck(double fDistance)
sSpeedTable[i].fDist < -fLength) sSpeedTable[i].fDist < -fLength)
{ // poci<63>g staje zawsze, a samoch<63>d tylko je<6A>li nie przejedzie ca<63><61> { // poci<63>g staje zawsze, a samoch<63>d tylko je<6A>li nie przejedzie ca<63><61>
// d<>ugo<67>ci<63> (mo<6D>e by<62> zaskoczony zmian<61>) // d<>ugo<67>ci<63> (mo<6D>e by<62> zaskoczony zmian<61>)
// WriteLog("TableCheck: Event is behind. Delete from table: " + sSpeedTable[i].evEvent->asName); // WriteLog("TableCheck: Event is behind. Delete from table: " +
// sSpeedTable[i].evEvent->asName);
sSpeedTable[i].iFlags &= ~1; // degradacja pozycji dla samochodu; sSpeedTable[i].iFlags &= ~1; // degradacja pozycji dla samochodu;
// semafory usuwane tylko przy sprawdzaniu, // semafory usuwane tylko przy sprawdzaniu,
// bo wysy<73>aj<61> komendy // bo wysy<73>aj<61> komendy
@@ -798,7 +821,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
double a; // przyspieszenie double a; // przyspieszenie
double v; // pr<70>dko<6B><6F> double v; // pr<70>dko<6B><6F>
double d; // droga double d; // droga
double d_to_next_sem = 10000.0; //ustaiwamy na pewno dalej ni<6E> widzi AI double d_to_next_sem = 10000.0; // ustaiwamy na pewno dalej ni<6E> widzi AI
TCommandType go = cm_Unknown; TCommandType go = cm_Unknown;
eSignNext = NULL; eSignNext = NULL;
int i, k = iLast - iFirst + 1; int i, k = iLast - iFirst + 1;
@@ -831,15 +854,15 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
// ju<6A> semafora) // ju<6A> semafora)
#if LOGSTOPS #if LOGSTOPS
WriteLog(pVehicle->asName + " as " + TrainParams->TrainName + ": at " + WriteLog(pVehicle->asName + " as " + TrainParams->TrainName + ": at " +
std::to_string(GlobalTime->hh) + ":" + std::to_string(GlobalTime->mm) + std::to_string(GlobalTime->hh) + ":" +
" skipped " + asNextStop); // informacja std::to_string(GlobalTime->mm) + " skipped " +
asNextStop); // informacja
#endif #endif
fLastStopExpDist = mvOccupied->DistCounter + 0.250 + fLastStopExpDist = mvOccupied->DistCounter + 0.250 +
0.001 * fLength; // przy jakim dystansie (stanie 0.001 * fLength; // przy jakim dystansie (stanie
// licznika) ma przesun<75><6E> na // licznika) ma przesun<75><6E> na
// nast<73>pny post<73>j // nast<73>pny post<73>j
TrainParams->UpdateMTable( TrainParams->UpdateMTable(GlobalTime->hh, GlobalTime->mm,
GlobalTime->hh, GlobalTime->mm,
asNextStop.substr(19, asNextStop.length())); asNextStop.substr(19, asNextStop.length()));
TrainParams->StationIndexInc(); // przej<65>cie do nast<73>pnej TrainParams->StationIndexInc(); // przej<65>cie do nast<73>pnej
asNextStop = asNextStop =
@@ -853,8 +876,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
} // koniec obs<62>ugi przelotu na W4 } // koniec obs<62>ugi przelotu na W4
else else
{ // zatrzymanie na W4 { // zatrzymanie na W4
if (!eSignNext) //je<6A>li nie widzi nast<73>pnego sygna<6E>u if (!eSignNext) // je<EFBFBD>li nie widzi nast<73>pnego sygna<6E>u
eSignNext = sSpeedTable[i].evEvent; //ustawia dotychczasow<6F> eSignNext = sSpeedTable[i].evEvent; // ustawia dotychczasow<6F>
if (mvOccupied->Vel > 0.3) // je<6A>li jedzie (nie trzeba czeka<6B>, a<> si<73> if (mvOccupied->Vel > 0.3) // je<6A>li jedzie (nie trzeba czeka<6B>, a<> si<73>
// drgania wyt<79>umi<6D> - drzwi zamykane od 1.0) // drgania wyt<79>umi<6D> - drzwi zamykane od 1.0)
sSpeedTable[i].fVelNext = 0; // to b<>dzie zatrzymanie sSpeedTable[i].fVelNext = 0; // to b<>dzie zatrzymanie
@@ -1000,7 +1023,9 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
// ma przesun<75><6E> na nast<73>pny post<73>j // ma przesun<75><6E> na nast<73>pny post<73>j
// Controlled-> //zapisa<73> odleg<65>o<EFBFBD><6F> do przejechania // Controlled-> //zapisa<73> odleg<65>o<EFBFBD><6F> do przejechania
TrainParams->StationIndexInc(); // przej<65>cie do nast<73>pnej TrainParams->StationIndexInc(); // przej<65>cie do nast<73>pnej
asNextStop = TrainParams->NextStop(); // pobranie kolejnego miejsca zatrzymania asNextStop =
TrainParams
->NextStop(); // pobranie kolejnego miejsca zatrzymania
// TableClear(); //aby od nowa sprawdzi<7A>o W4 z inn<6E> nazw<7A> ju<6A> - to nie jest dobry pomys<79> // TableClear(); //aby od nowa sprawdzi<7A>o W4 z inn<6E> nazw<7A> ju<6A> - to nie jest dobry pomys<79>
#if LOGSTOPS #if LOGSTOPS
WriteLog(pVehicle->asName + " as " + TrainParams->TrainName + WriteLog(pVehicle->asName + " as " + TrainParams->TrainName +
@@ -1012,7 +1037,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
iDrivigFlags |= moveStopHere; // nie podje<6A>d<EFBFBD>a<EFBFBD> do semafora, iDrivigFlags |= moveStopHere; // nie podje<6A>d<EFBFBD>a<EFBFBD> do semafora,
// je<6A>li droga nie jest wolna // je<6A>li droga nie jest wolna
else else
iDrivigFlags &= ~moveStopHere; //po czasie jed<65> dalej iDrivigFlags &= ~moveStopHere; // po czasie jed<65> dalej
iDrivigFlags |= moveStopCloser; // do nast<73>pnego W4 podjecha<68> iDrivigFlags |= moveStopCloser; // do nast<73>pnego W4 podjecha<68>
// blisko (z doci<63>ganiem) // blisko (z doci<63>ganiem)
iDrivigFlags &= ~moveStartHorn; // bez tr<74>bienia przed odjazdem iDrivigFlags &= ~moveStartHorn; // bez tr<74>bienia przed odjazdem
@@ -1075,15 +1100,18 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
if (sSpeedTable[i].fDist < 0.0 && sSemNext == &sSpeedTable[i]) if (sSpeedTable[i].fDist < 0.0 && sSemNext == &sSpeedTable[i])
{ {
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TableUpdate: semaphor " + sSemNext->GetName() + " passed by " + OwnerName()); WriteLog("TableUpdate: semaphor " + sSemNext->GetName() + " passed by " +
OwnerName());
sSemNext = NULL; // je<6A>li min<69>li<6C>my semafor od ograniczenia to go kasujemy ze sSemNext = NULL; // je<6A>li min<69>li<6C>my semafor od ograniczenia to go kasujemy ze
// zmiennej sprawdzaj<61>cej dla skanowania w prz<72>d // zmiennej sprawdzaj<61>cej dla skanowania w prz<72>d
} }
if (sSpeedTable[i].fDist < 0.0 && sSemNextStop == &sSpeedTable[i]) if (sSpeedTable[i].fDist < 0.0 && sSemNextStop == &sSpeedTable[i])
{ {
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TableUpdate: semaphor " + sSemNextStop->GetName() + " passed by " + OwnerName()); WriteLog("TableUpdate: semaphor " + sSemNextStop->GetName() +
sSemNextStop = NULL; // je<6A>li min<69>li<6C>my semafor od ograniczenia to go kasujemy ze " passed by " + OwnerName());
sSemNextStop =
NULL; // je<6A>li min<69>li<6C>my semafor od ograniczenia to go kasujemy ze
// zmiennej sprawdzaj<61>cej dla skanowania w prz<72>d // zmiennej sprawdzaj<61>cej dla skanowania w prz<72>d
} }
if (sSpeedTable[i].fDist > 0.0 && if (sSpeedTable[i].fDist > 0.0 &&
@@ -1096,7 +1124,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
// byl nowy to go dorzucamy do zmiennej, <20>eby ca<63>y // byl nowy to go dorzucamy do zmiennej, <20>eby ca<63>y
// czas widzia<69> najbli<6C>szy // czas widzia<69> najbli<6C>szy
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TableUpdate: Next semaphor: " + sSemNext->GetName() + " by " + OwnerName()); WriteLog("TableUpdate: Next semaphor: " + sSemNext->GetName() + " by " +
OwnerName());
} }
if (!sSemNextStop || (sSemNextStop && sSemNextStop->fVelNext != 0 && if (!sSemNextStop || (sSemNextStop && sSemNextStop->fVelNext != 0 &&
sSpeedTable[i].fVelNext == 0)) sSpeedTable[i].fVelNext == 0))
@@ -1108,10 +1137,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
{ // w trybie poci<63>gowym: mo<6D>na przyspieszy<7A> do wskazanej pr<70>dko<6B>ci (po { // w trybie poci<63>gowym: mo<6D>na przyspieszy<7A> do wskazanej pr<70>dko<6B>ci (po
// zjechaniu z rozjazd<7A>w) // zjechaniu z rozjazd<7A>w)
v = -1.0; // ignorowa<77>? v = -1.0; // ignorowa<77>?
//TODO trzeba zmieni<6E> przypisywanie VelSignal na VelSignalLast // TODO trzeba zmieni<6E> przypisywanie VelSignal na VelSignalLast
if (sSpeedTable[i].fDist < 0.0) // je<6A>li wska<6B>nik zosta<74> mini<6E>ty if (sSpeedTable[i].fDist < 0.0) // je<6A>li wska<6B>nik zosta<74> mini<6E>ty
{ {
VelSignalLast = v; //ustawienie pr<70>dko<6B>ci na -1 VelSignalLast = v; // ustawienie pr<70>dko<6B>ci na -1
// iStationStart=TrainParams->StationIndex; //zaktualizowa<77> // iStationStart=TrainParams->StationIndex; //zaktualizowa<77>
// wy<77>wietlanie rozk<7A>adu // wy<77>wietlanie rozk<7A>adu
} }
@@ -1149,10 +1178,12 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
else if (sSpeedTable[i].IsProperSemaphor(OrderCurrentGet())) else if (sSpeedTable[i].IsProperSemaphor(OrderCurrentGet()))
{ // to semaphor { // to semaphor
if (sSpeedTable[i].fDist < 0) if (sSpeedTable[i].fDist < 0)
VelSignalLast = sSpeedTable[i].fVelNext; //mini<6E>ty daje pr<70>dko<6B><6F> obowi<77>zuj<75>c<EFBFBD> VelSignalLast =
sSpeedTable[i].fVelNext; // mini<6E>ty daje pr<70>dko<6B><6F> obowi<77>zuj<75>c<EFBFBD>
else else
{ {
iDrivigFlags |= moveSemaphorFound; //je<6A>li z przodu to dajemy falg<6C>, <20>e jest iDrivigFlags |= moveSemaphorFound; // je<EFBFBD>li z przodu to dajemy falg<6C>, <20>e
// jest
d_to_next_sem = Min0R(sSpeedTable[i].fDist, d_to_next_sem); d_to_next_sem = Min0R(sSpeedTable[i].fDist, d_to_next_sem);
} }
if (sSpeedTable[i].fDist <= d_to_next_sem) if (sSpeedTable[i].fDist <= d_to_next_sem)
@@ -1172,12 +1203,15 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
if (sSpeedTable[i].fSectionVelocityDist == 0.0) if (sSpeedTable[i].fSectionVelocityDist == 0.0)
{ {
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TableUpdate: Event is behind. SVD = 0: " + sSpeedTable[i].evEvent->asName); WriteLog("TableUpdate: Event is behind. SVD = 0: " +
sSpeedTable[i].iFlags = 0; // je<6A>li punktowy to kasujemy i nie dajemy ograniczenia na sta<74>e sSpeedTable[i].evEvent->asName);
sSpeedTable[i].iFlags =
0; // je<6A>li punktowy to kasujemy i nie dajemy ograniczenia na sta<74>e
} }
else if (sSpeedTable[i].fSectionVelocityDist < 0.0) else if (sSpeedTable[i].fSectionVelocityDist < 0.0)
{ // ograniczenie obowi<77>zuj<75>ce do nast<73>pnego { // ograniczenie obowi<77>zuj<75>ce do nast<73>pnego
if (sSpeedTable[i].fVelNext == Global::Min0RSpeed(sSpeedTable[i].fVelNext, VelLimitLast) && if (sSpeedTable[i].fVelNext ==
Global::Min0RSpeed(sSpeedTable[i].fVelNext, VelLimitLast) &&
sSpeedTable[i].fVelNext != VelLimitLast) sSpeedTable[i].fVelNext != VelLimitLast)
{ // je<6A>li ograniczenie jest mniejsze ni<6E> obecne to obowi<77>zuje od zaraz { // je<6A>li ograniczenie jest mniejsze ni<6E> obecne to obowi<77>zuje od zaraz
VelLimitLast = sSpeedTable[i].fVelNext; VelLimitLast = sSpeedTable[i].fVelNext;
@@ -1186,40 +1220,48 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
{ // je<6A>li wi<77>ksze to musi wyjecha<68> za poprzednie { // je<6A>li wi<77>ksze to musi wyjecha<68> za poprzednie
VelLimitLast = sSpeedTable[i].fVelNext; VelLimitLast = sSpeedTable[i].fVelNext;
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TableUpdate: Event is behind. SVD < 0: " + sSpeedTable[i].evEvent->asName); WriteLog("TableUpdate: Event is behind. SVD < 0: " +
sSpeedTable[i].iFlags = 0; // wyjechali<6C>my poza poprzednie, mo<6D>na skasowa<77> sSpeedTable[i].evEvent->asName);
sSpeedTable[i].iFlags =
0; // wyjechali<6C>my poza poprzednie, mo<6D>na skasowa<77>
} }
} }
else else
{ // je<6A>li wi<77>ksze to ograniczenie ma swoj<6F> d<>ugo<67><6F> { // je<6A>li wi<77>ksze to ograniczenie ma swoj<6F> d<>ugo<67><6F>
if (sSpeedTable[i].fVelNext == Global::Min0RSpeed(sSpeedTable[i].fVelNext, VelLimitLast) && if (sSpeedTable[i].fVelNext ==
Global::Min0RSpeed(sSpeedTable[i].fVelNext, VelLimitLast) &&
sSpeedTable[i].fVelNext != VelLimitLast) sSpeedTable[i].fVelNext != VelLimitLast)
{ // je<6A>li ograniczenie jest mniejsze ni<6E> obecne to obowi<77>zuje od zaraz { // je<6A>li ograniczenie jest mniejsze ni<6E> obecne to obowi<77>zuje od zaraz
VelLimitLast = sSpeedTable[i].fVelNext; VelLimitLast = sSpeedTable[i].fVelNext;
} }
else if (sSpeedTable[i].fDist < -fLength && sSpeedTable[i].fVelNext != VelLimitLast) else if (sSpeedTable[i].fDist < -fLength &&
sSpeedTable[i].fVelNext != VelLimitLast)
{ // je<6A>li wi<77>ksze to musi wyjecha<68> za poprzednie { // je<6A>li wi<77>ksze to musi wyjecha<68> za poprzednie
VelLimitLast = sSpeedTable[i].fVelNext; VelLimitLast = sSpeedTable[i].fVelNext;
} }
else if (sSpeedTable[i].fDist < -fLength - sSpeedTable[i].fSectionVelocityDist) else if (sSpeedTable[i].fDist <
-fLength - sSpeedTable[i].fSectionVelocityDist)
{ // { //
VelLimitLast = -1.0; VelLimitLast = -1.0;
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
WriteLog("TableUpdate: Event is behind. SVD > 0: " + sSpeedTable[i].evEvent->asName); WriteLog("TableUpdate: Event is behind. SVD > 0: " +
sSpeedTable[i].iFlags = 0; // wyjechali<6C>my poza poprzednie, mo<6D>na skasowa<77> sSpeedTable[i].evEvent->asName);
sSpeedTable[i].iFlags =
0; // wyjechali<6C>my poza poprzednie, mo<6D>na skasowa<77>
} }
} }
} }
} }
//sprawdzenie event<6E>w pasywnych przed nami // sprawdzenie event<6E>w pasywnych przed nami
if ((mvOccupied->CategoryFlag & 1) ? if ((mvOccupied->CategoryFlag & 1) ?
sSpeedTable[i].fDist > pVehicles[0]->fTrackBlock - 20.0 : sSpeedTable[i].fDist > pVehicles[0]->fTrackBlock - 20.0 :
false) // jak sygna<6E> jest dalej ni<6E> zawalidroga false) // jak sygna<6E> jest dalej ni<6E> zawalidroga
v = 0.0; // to mo<6D>e by<62> podany dla tamtego: jecha<68> tak, jakby tam stop by<62> v = 0.0; // to mo<6D>e by<62> podany dla tamtego: jecha<68> tak, jakby tam stop by<62>
else else
{ // zawalidrogi nie ma (albo pojazd jest samochodem), sprawdzi<7A> sygna<6E> { // zawalidrogi nie ma (albo pojazd jest samochodem), sprawdzi<7A> sygna<6E>
if (sSpeedTable[i].iFlags & spShuntSemaphor) // je<6A>li Tm - w zasadzie to sprawdzi<7A> if (sSpeedTable[i].iFlags &
spShuntSemaphor) // je<6A>li Tm - w zasadzie to sprawdzi<7A>
// komend<6E>! // komend<6E>!
{ // je<6A>li podana pr<70>dko<6B><6F> manewrowa { // je<6A>li podana pr<70>dko<6B><6F> manewrowa
if ((OrderCurrentGet() & Obey_train) ? v == 0.0 : false) if ((OrderCurrentGet() & Obey_train) ? v == 0.0 : false)
@@ -1250,13 +1292,17 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
} }
} }
} }
else if (!(sSpeedTable[i].iFlags & spSectionVel)) //je<6A>li jaki<6B> event pasywny ale nie ograniczenie else if (!(sSpeedTable[i].iFlags &
if (go == cm_Unknown) // je<6A>li nie by<62>o komendy wcze<7A>niej - pierwsza si<73> liczy spSectionVel)) // je<6A>li jaki<6B> event pasywny ale nie ograniczenie
if (go ==
cm_Unknown) // je<6A>li nie by<62>o komendy wcze<7A>niej - pierwsza si<73> liczy
// - ustawianie VelSignal // - ustawianie VelSignal
if (v < 0.0 ? true : v >= 1.0) // bo warto<74><6F> 0.1 s<>u<EFBFBD>y do hamowania tylko if (v < 0.0 ? true :
v >= 1.0) // bo warto<74><6F> 0.1 s<>u<EFBFBD>y do hamowania tylko
{ {
go = cm_SetVelocity; // mo<6D>e odjecha<68> go = cm_SetVelocity; // mo<6D>e odjecha<68>
// Ra 2014-06: (VelSignal) nie mo<6D>e by<62> tu ustawiane, bo semafor mo<6D>e // Ra 2014-06: (VelSignal) nie mo<6D>e by<62> tu ustawiane, bo semafor
// mo<6D>e
// by<62> daleko // by<62> daleko
// VelSignal=v; //nie do ko<6B>ca tak, to jest druga pr<70>dko<6B><6F>; -1 nie // VelSignal=v; //nie do ko<6B>ca tak, to jest druga pr<70>dko<6B><6F>; -1 nie
// wpisywa<77>... // wpisywa<77>...
@@ -1270,11 +1316,13 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
if (sSpeedTable[i].iFlags & spEvent) // je<6A>li event if (sSpeedTable[i].iFlags & spEvent) // je<6A>li event
if ((sSpeedTable[i].evEvent != eSignSkip) ? if ((sSpeedTable[i].evEvent != eSignSkip) ?
true : true :
(sSpeedTable[i].fVelNext != 0.0)) // ale inny ni<6E> ten, (sSpeedTable[i].fVelNext !=
0.0)) // ale inny ni<6E> ten,
// na kt<6B>rym mini<6E>to // na kt<6B>rym mini<6E>to
// S1, chyba <20>e si<73> // S1, chyba <20>e si<73>
// ju<6A> zmieni<6E>o // ju<6A> zmieni<6E>o
iDrivigFlags &= ~moveVisibility; // sygna<6E> zezwalaj<61>cy na iDrivigFlags &=
~moveVisibility; // sygna<6E> zezwalaj<61>cy na
// jazd<7A> wy<77><79>cza jazd<7A> na // jazd<7A> wy<77><79>cza jazd<7A> na
// widoczno<6E><6F> (S1 na SBL) // widoczno<6E><6F> (S1 na SBL)
@@ -1288,12 +1336,15 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
eSignNext = sSpeedTable[i].evEvent; // dla informacji eSignNext = sSpeedTable[i].evEvent; // dla informacji
if (iDrivigFlags & if (iDrivigFlags &
moveStopHere) // je<6A>li ma sta<74>, dostaje komend<6E> od razu moveStopHere) // je<6A>li ma sta<74>, dostaje komend<6E> od razu
go = cm_Command; // komenda z kom<6F>rki, do wykonania po zatrzymaniu go = cm_Command; // komenda z kom<6F>rki, do wykonania po
else if (sSpeedTable[i].fDist <= 20.0) // je<6A>li ma doci<63>gn<67><6E>, to niech // zatrzymaniu
else if (sSpeedTable[i].fDist <=
20.0) // je<6A>li ma doci<63>gn<67><6E>, to niech
// doci<63>ga (moveStopCloser // doci<63>ga (moveStopCloser
// dotyczy doci<63>gania do W4, nie // dotyczy doci<63>gania do W4, nie
// semafora) // semafora)
go = cm_Command; // komenda z kom<6F>rki, do wykonania po zatrzymaniu go = cm_Command; // komenda z kom<6F>rki, do wykonania po
// zatrzymaniu
} }
} // je<6A>li nie ma zawalidrogi } // je<6A>li nie ma zawalidrogi
} // je<6A>li event } // je<6A>li event
@@ -1369,7 +1420,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
(OrderCurrentGet() & Obey_train)) (OrderCurrentGet() & Obey_train))
VelSignalLast = -1.0; // je<6A>li mieli<6C>my ograniczenie z semafora i nie ma przed nami VelSignalLast = -1.0; // je<6A>li mieli<6C>my ograniczenie z semafora i nie ma przed nami
if (VelSignalLast >= 0.0) //analiza spisanych z tabelki ogranicze<7A> i nadpisanie aktualnego if (VelSignalLast >= 0.0) // analiza spisanych z tabelki ogranicze<7A> i nadpisanie aktualnego
fVelDes = Min0R(fVelDes, VelSignalLast); fVelDes = Min0R(fVelDes, VelSignalLast);
if (VelLimitLast >= 0.0) if (VelLimitLast >= 0.0)
fVelDes = Min0R(fVelDes, VelLimitLast); fVelDes = Min0R(fVelDes, VelLimitLast);
@@ -1501,7 +1552,8 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
"Coupler.Force[N] TractionForce [kN] FrictionForce [kN] " "Coupler.Force[N] TractionForce [kN] FrictionForce [kN] "
"BrakeForce [kN] BrakePress [MPa] PipePress [MPa] " "BrakeForce [kN] BrakePress [MPa] PipePress [MPa] "
"MotorCurrent [A] MCP SCP BCP LBP DmgFlag Command CVal1 CVal2") "MotorCurrent [A] MCP SCP BCP LBP DmgFlag Command CVal1 CVal2")
.c_str() << "\r\n"; .c_str()
<< "\r\n";
#endif #endif
#if LOGPRESS == 1 #if LOGPRESS == 1
LogFile << string("t\tVel\tAcc\tPP\tVVP\tBP\tBVP\tCVP").c_str() << "\n"; LogFile << string("t\tVel\tAcc\tPP\tVVP\tBP\tBVP\tCVP").c_str() << "\n";
@@ -1909,7 +1961,8 @@ bool TController::CheckVehicles(TOrders user)
} }
else if (OrderCurrentGet() & (Shunt | Connect)) else if (OrderCurrentGet() & (Shunt | Connect))
{ {
Lights(16, (pVehicles[1]->MoverParameters->CabNo) ? Lights(16,
(pVehicles[1]->MoverParameters->CabNo) ?
1 : 1 :
0); //<2F>wiat<61>a manewrowe (Tb1) na poje<6A>dzie z nap<61>dem 0); //<2F>wiat<61>a manewrowe (Tb1) na poje<6A>dzie z nap<61>dem
if (OrderCurrentGet() & Connect) // je<6A>li <20><>czenie, skanowa<77> dalej if (OrderCurrentGet() & Connect) // je<6A>li <20><>czenie, skanowa<77> dalej
@@ -2173,9 +2226,7 @@ void TController::SetDriverPsyche()
bool TController::PrepareEngine() bool TController::PrepareEngine()
{ // odpalanie silnika { // odpalanie silnika
bool OK = false, bool OK = false, voltfront = false, voltrear = false;
voltfront = false,
voltrear = false;
LastReactionTime = 0.0; LastReactionTime = 0.0;
ReactionTime = PrepareTime; ReactionTime = PrepareTime;
iDrivigFlags |= moveActive; // mo<6D>e skanowa<77> sygna<6E>y i reagowa<77> na komendy iDrivigFlags |= moveActive; // mo<6D>e skanowa<77> sygna<6E>y i reagowa<77> na komendy
@@ -2596,7 +2647,8 @@ bool TController::IncSpeed()
break; break;
case ElectricInductionMotor: case ElectricInductionMotor:
if (!mvControlling->FuseFlag) if (!mvControlling->FuseFlag)
if (Ready || (iDrivigFlags & movePress) || (mvOccupied->ShuntMode)) //{(BrakePress<=0.01*MaxBrakePress)} if (Ready || (iDrivigFlags & movePress) ||
(mvOccupied->ShuntMode)) //{(BrakePress<=0.01*MaxBrakePress)}
{ {
OK = mvControlling->IncMainCtrl(1); OK = mvControlling->IncMainCtrl(1);
} }
@@ -2953,7 +3005,8 @@ bool TController::PutCommand(std::string NewCommand, double NewValue1, double Ne
if (ConversionError == -8) if (ConversionError == -8)
ErrorLog("Missed timetable: " + NewCommand); ErrorLog("Missed timetable: " + NewCommand);
WriteLog("Cannot load timetable file " + NewCommand + "\r\nError " + WriteLog("Cannot load timetable file " + NewCommand + "\r\nError " +
std::to_string(ConversionError) + " in position " + std::to_string(TrainParams->StationCount)); std::to_string(ConversionError) + " in position " +
std::to_string(TrainParams->StationCount));
NewCommand = ""; // puste, dla wymiennej tekstury NewCommand = ""; // puste, dla wymiennej tekstury
} }
else else
@@ -2967,20 +3020,21 @@ bool TController::PutCommand(std::string NewCommand, double NewValue1, double Ne
NewCommand = Global::asCurrentSceneryPath + NewCommand + ".wav"; // na razie jeden NewCommand = Global::asCurrentSceneryPath + NewCommand + ".wav"; // na razie jeden
if (FileExists(NewCommand)) if (FileExists(NewCommand))
{ // wczytanie d<>wi<77>ku odjazdu podawanego bezpo<70>renido { // wczytanie d<>wi<77>ku odjazdu podawanego bezpo<70>renido
tsGuardSignal = new TTextSound(NewCommand.c_str(), 30, pVehicle->GetPosition().x, tsGuardSignal =
pVehicle->GetPosition().y, pVehicle->GetPosition().z, new TTextSound(NewCommand.c_str(), 30, pVehicle->GetPosition().x,
false); pVehicle->GetPosition().y, pVehicle->GetPosition().z, false);
// rsGuardSignal->Stop(); // rsGuardSignal->Stop();
iGuardRadio = 0; // nie przez radio iGuardRadio = 0; // nie przez radio
} }
else else
{ {
NewCommand = NewCommand.insert(NewCommand.find_last_of("."),"radio"); // wstawienie przed kropk<70> NewCommand = NewCommand.insert(NewCommand.find_last_of("."),
"radio"); // wstawienie przed kropk<70>
if (FileExists(NewCommand)) if (FileExists(NewCommand))
{ // wczytanie d<>wi<77>ku odjazdu w wersji radiowej (s<>ycha<68> tylko w kabinie) { // wczytanie d<>wi<77>ku odjazdu w wersji radiowej (s<>ycha<68> tylko w kabinie)
tsGuardSignal = new TTextSound(NewCommand.c_str(), -1, pVehicle->GetPosition().x, tsGuardSignal = new TTextSound(
pVehicle->GetPosition().y, pVehicle->GetPosition().z, NewCommand.c_str(), -1, pVehicle->GetPosition().x,
false); pVehicle->GetPosition().y, pVehicle->GetPosition().z, false);
iGuardRadio = iRadioChannel; iGuardRadio = iRadioChannel;
} }
} }
@@ -3524,7 +3578,7 @@ bool TController::UpdateSituation(double dt)
double scanmax = (mvOccupied->Vel > 5.0) ? double scanmax = (mvOccupied->Vel > 5.0) ?
400 + fBrakeDist : 400 + fBrakeDist :
30.0 * fDriverDist; // 1500m dla stoj<6F>cych poci<63>g<EFBFBD>w; Ra 2015-01: przy 30.0 * fDriverDist; // 1500m dla stoj<6F>cych poci<63>g<EFBFBD>w; Ra 2015-01: przy
//double scanmax = Max0R(400 + fBrakeDist, 1500); // double scanmax = Max0R(400 + fBrakeDist, 1500);
// d<>u<EFBFBD>szej drodze skanowania AI je<6A>dzi spokojniej // d<>u<EFBFBD>szej drodze skanowania AI je<6A>dzi spokojniej
// 2. Sprawdzi<7A>, czy tabelka pokrywa za<7A>o<EFBFBD>ony odcinek (nie musi, je<6A>li jest STOP). // 2. Sprawdzi<7A>, czy tabelka pokrywa za<7A>o<EFBFBD>ony odcinek (nie musi, je<6A>li jest STOP).
// 3. Sprawdzi<7A>, czy trajektoria ruchu przechodzi przez zwrotnice - je<6A>li tak, to sprawdzi<7A>, // 3. Sprawdzi<7A>, czy trajektoria ruchu przechodzi przez zwrotnice - je<6A>li tak, to sprawdzi<7A>,
@@ -3884,7 +3938,8 @@ bool TController::UpdateSituation(double dt)
case Change_direction | Connect: // zmiana kierunku podczas pod<6F><64>czania case Change_direction | Connect: // zmiana kierunku podczas pod<6F><64>czania
if (OrderList[OrderPos] != Obey_train) // spokojne manewry if (OrderList[OrderPos] != Obey_train) // spokojne manewry
{ {
VelSignal = Global::Min0RSpeed(VelSignal, 40); // je<6A>li manewry, to ograniczamy pr<70>dko<6B><6F> VelSignal =
Global::Min0RSpeed(VelSignal, 40); // je<6A>li manewry, to ograniczamy pr<70>dko<6B><6F>
if (AIControllFlag) if (AIControllFlag)
{ // to poni<6E>ej tylko dla AI { // to poni<6E>ej tylko dla AI
if (iVehicleCount >= 0) // je<6A>li jest co odczepi<70> if (iVehicleCount >= 0) // je<6A>li jest co odczepi<70>
@@ -4018,7 +4073,8 @@ bool TController::UpdateSituation(double dt)
// nast<73>pnie ograniczana // nast<73>pnie ograniczana
if (TrainParams) // je<6A>li ma rozk<7A>ad if (TrainParams) // je<6A>li ma rozk<7A>ad
if (TrainParams->TTVmax > 0.0) // i ograniczenie w rozk<7A>adzie if (TrainParams->TTVmax > 0.0) // i ograniczenie w rozk<7A>adzie
VelDesired = Global::Min0RSpeed(VelDesired, VelDesired = Global::Min0RSpeed(
VelDesired,
TrainParams->TTVmax); // to nie przekracza<7A> rozkladowej TrainParams->TTVmax); // to nie przekracza<7A> rozkladowej
SetDriverPsyche(); // ustawia AccPreferred (potrzebne tu?) SetDriverPsyche(); // ustawia AccPreferred (potrzebne tu?)
// Ra: odczyt (ActualProximityDist), (VelNext) i (AccPreferred) z tabelki pr<70>dkosci // Ra: odczyt (ActualProximityDist), (VelNext) i (AccPreferred) z tabelki pr<70>dkosci
@@ -4086,7 +4142,9 @@ bool TController::UpdateSituation(double dt)
// ma taboru do pod<6F><64>czenia // ma taboru do pod<6F><64>czenia
// Ra 2F1H: z tym (fTrackBlock) to nie jest najlepszy pomys<79>, bo lepiej by // Ra 2F1H: z tym (fTrackBlock) to nie jest najlepszy pomys<79>, bo lepiej by
// by<62>o por<6F>wna<6E> z odleg<65>o<EFBFBD>ci<63> od sygnalizatora z przodu // by<62>o por<6F>wna<6E> z odleg<65>o<EFBFBD>ci<63> od sygnalizatora z przodu
if ((OrderList[OrderPos] & Connect) ? (pVehicles[0]->fTrackBlock > 2000 || pVehicles[0]->fTrackBlock > FirstSemaphorDist) : if ((OrderList[OrderPos] & Connect) ?
(pVehicles[0]->fTrackBlock > 2000 ||
pVehicles[0]->fTrackBlock > FirstSemaphorDist) :
true) true)
if ((comm = BackwardScan()) != cm_Unknown) // je<6A>li w drug<75> mo<6D>na jecha<68> if ((comm = BackwardScan()) != cm_Unknown) // je<6A>li w drug<75> mo<6D>na jecha<68>
{ // nale<6C>y sprawdza<7A> odleg<65>o<EFBFBD><6F> od znalezionego sygnalizatora, { // nale<6C>y sprawdza<7A> odleg<65>o<EFBFBD><6F> od znalezionego sygnalizatora,
@@ -4226,16 +4284,18 @@ bool TController::UpdateSituation(double dt)
VelDesired = 0.0; // jak ma czeka<6B>, to nie ma jazdy VelDesired = 0.0; // jak ma czeka<6B>, to nie ma jazdy
// else if (VelSignal<0) // else if (VelSignal<0)
// VelDesired=fVelMax; //ile fabryka dala (Ra: uwzgl<67>dione wagony) // VelDesired=fVelMax; //ile fabryka dala (Ra: uwzgl<67>dione wagony)
else if (VelSignal >= 0) // je<6A>li sk<73>ad by<62> zatrzymany na pocz<63>tku i teraz ju<6A> mo<6D>e jecha<68> else if (VelSignal >=
0) // je<6A>li sk<73>ad by<62> zatrzymany na pocz<63>tku i teraz ju<6A> mo<6D>e jecha<68>
VelDesired = Global::Min0RSpeed(VelDesired, VelSignal); VelDesired = Global::Min0RSpeed(VelDesired, VelSignal);
if (mvOccupied->RunningTrack.Velmax >= if (mvOccupied->RunningTrack.Velmax >=
0) // ograniczenie pr<70>dko<6B>ci z trajektorii ruchu 0) // ograniczenie pr<70>dko<6B>ci z trajektorii ruchu
VelDesired = VelDesired = Global::Min0RSpeed(
Global::Min0RSpeed(VelDesired, VelDesired,
mvOccupied->RunningTrack.Velmax); // uwaga na ograniczenia szlakowej! mvOccupied->RunningTrack.Velmax); // uwaga na ograniczenia szlakowej!
if (VelforDriver >= 0) // tu jest zero przy zmianie kierunku jazdy if (VelforDriver >= 0) // tu jest zero przy zmianie kierunku jazdy
VelDesired = Global::Min0RSpeed(VelDesired, VelforDriver); // Ra: tu mo<6D>e by<62> 40, je<6A>li VelDesired =
Global::Min0RSpeed(VelDesired, VelforDriver); // Ra: tu mo<6D>e by<62> 40, je<6A>li
// mechanik nie ma znajomo<6D>ci // mechanik nie ma znajomo<6D>ci
// szlaaku, albo kierowca je<6A>dzi // szlaaku, albo kierowca je<6A>dzi
// 70 // 70
@@ -4247,7 +4307,8 @@ bool TController::UpdateSituation(double dt)
TrainParams TrainParams
->TTVmax); // jesli nie spozniony to nie przekracza<7A> rozkladowej ->TTVmax); // jesli nie spozniony to nie przekracza<7A> rozkladowej
if (VelDesired > 0.0) if (VelDesired > 0.0)
if ((sSemNext && sSemNext->fVelNext != 0.0) || (iDrivigFlags & moveStopHere)==0) if ((sSemNext && sSemNext->fVelNext != 0.0) ||
(iDrivigFlags & moveStopHere) == 0)
{ // je<6A>li mo<6D>na jecha<68>, to odpali<6C> d<>wi<77>k kierownika oraz zamkn<6B><6E> drzwi w { // je<6A>li mo<6D>na jecha<68>, to odpali<6C> d<>wi<77>k kierownika oraz zamkn<6B><6E> drzwi w
// sk<73>adzie, je<6A>li nie mamy czeka<6B> na sygna<6E> te<74> trzeba odpali<6C> // sk<73>adzie, je<6A>li nie mamy czeka<6B> na sygna<6E> te<74> trzeba odpali<6C>
@@ -4536,8 +4597,8 @@ bool TController::UpdateSituation(double dt)
WriteLog("Dist=" + FloatToStrF(ActualProximityDist, ffFixed, 7, 1) + WriteLog("Dist=" + FloatToStrF(ActualProximityDist, ffFixed, 7, 1) +
", VelDesired=" + FloatToStrF(VelDesired, ffFixed, 7, 1) + ", VelDesired=" + FloatToStrF(VelDesired, ffFixed, 7, 1) +
", AccDesired=" + FloatToStrF(AccDesired, ffFixed, 7, 3) + ", AccDesired=" + FloatToStrF(AccDesired, ffFixed, 7, 3) +
", VelSignal=" + AnsiString(VelSignal) + ", VelNext=" + ", VelSignal=" + AnsiString(VelSignal) +
AnsiString(VelNext)); ", VelNext=" + AnsiString(VelNext));
#endif #endif
if (AccDesired > 0.1) if (AccDesired > 0.1)
if (vel < 10.0) // Ra 2F1H: je<6A>li pr<70>dko<6B><6F> jest ma<6D>a, a mo<6D>na przyspiesza<7A>, if (vel < 10.0) // Ra 2F1H: je<6A>li pr<70>dko<6B><6F> jest ma<6D>a, a mo<6D>na przyspiesza<7A>,
@@ -4648,7 +4709,8 @@ bool TController::UpdateSituation(double dt)
(AbsAccS > (AbsAccS >
AccDesired + 0.05))) // u g<>ry ustawia si<73> hamowanie na fAccThreshold AccDesired + 0.05))) // u g<>ry ustawia si<73> hamowanie na fAccThreshold
// if not MinVelFlag) // if not MinVelFlag)
if (fBrakeTime < 0 ? true : (AccDesired < fAccGravity - 0.3) || if (fBrakeTime < 0 ? true :
(AccDesired < fAccGravity - 0.3) ||
(mvOccupied->BrakeCtrlPos <= 0)) (mvOccupied->BrakeCtrlPos <= 0))
if (!IncBrake()) // je<6A>li up<75>yn<79><6E> czas reakcji hamulca, chyba <20>e if (!IncBrake()) // je<6A>li up<75>yn<79><6E> czas reakcji hamulca, chyba <20>e
// nag<61>e albo luzowa<77> // nag<61>e albo luzowa<77>
@@ -4683,8 +4745,8 @@ bool TController::UpdateSituation(double dt)
// Mietek-end1 // Mietek-end1
SpeedSet(); // ci<63>gla regulacja pr<70>dko<6B>ci SpeedSet(); // ci<63>gla regulacja pr<70>dko<6B>ci
#if LOGVELOCITY #if LOGVELOCITY
WriteLog("BrakePos=" + AnsiString(mvOccupied->BrakeCtrlPos) + ", MainCtrl=" + WriteLog("BrakePos=" + AnsiString(mvOccupied->BrakeCtrlPos) +
AnsiString(mvControlling->MainCtrlPos)); ", MainCtrl=" + AnsiString(mvControlling->MainCtrlPos));
#endif #endif
/* //Ra: mamy teraz wska<6B>nik na cz<63>on silnikowy, gorzej jak s<> dwa w /* //Ra: mamy teraz wska<6B>nik na cz<63>on silnikowy, gorzej jak s<> dwa w
@@ -4937,10 +4999,10 @@ void TController::OrdersInit(double fVel)
{ {
t = TrainParams->TimeTable + i; t = TrainParams->TimeTable + i;
if (DebugModeFlag) // normalnie nie ma po co tego wypisywa<77> if (DebugModeFlag) // normalnie nie ma po co tego wypisywa<77>
WriteLog( t->StationName + " " + std::to_string(t->Ah) + ":" + WriteLog(t->StationName + " " + std::to_string(t->Ah) + ":" +
std::to_string(t->Am) + ", " + std::to_string(t->Dh) + ":" + std::to_string(t->Am) + ", " + std::to_string(t->Dh) + ":" +
std::to_string(t->Dm) + " " + t->StationWare); std::to_string(t->Dm) + " " + t->StationWare);
if( t->StationWare.find('@') != std::string::npos ) if (t->StationWare.find('@') != std::string::npos)
{ // zmiana kierunku i dalsza jazda wg rozk<7A>adu { // zmiana kierunku i dalsza jazda wg rozk<7A>adu
if (iDrivigFlags & movePushPull) // SZT r<>wnie<69>! SN61 zale<6C>nie od wagon<6F>w... if (iDrivigFlags & movePushPull) // SZT r<>wnie<69>! SN61 zale<6C>nie od wagon<6F>w...
{ // je<6A>li sk<73>ad zespolony, wystarczy zmieni<6E> kierunek jazdy { // je<6A>li sk<73>ad zespolony, wystarczy zmieni<6E> kierunek jazdy
@@ -5026,7 +5088,7 @@ bool TController::BackwardTrackBusy(TTrack *Track)
return false; // wolny return false; // wolny
}; };
TEvent * TController::CheckTrackEventBackward(double fDirection, TTrack *Track) TEvent *TController::CheckTrackEventBackward(double fDirection, TTrack *Track)
{ // sprawdzanie eventu w torze, czy jest sygna<6E>owym - skanowanie do ty<74>u { // sprawdzanie eventu w torze, czy jest sygna<6E>owym - skanowanie do ty<74>u
TEvent *e = (fDirection > 0) ? Track->evEvent2 : Track->evEvent1; TEvent *e = (fDirection > 0) ? Track->evEvent2 : Track->evEvent1;
if (e) if (e)
@@ -5036,8 +5098,8 @@ TEvent * TController::CheckTrackEventBackward(double fDirection, TTrack *Track)
return NULL; return NULL;
}; };
TTrack * TController::BackwardTraceRoute(double &fDistance, double &fDirection, TTrack *TController::BackwardTraceRoute(double &fDistance, double &fDirection, TTrack *Track,
TTrack *Track, TEvent *&Event) TEvent *&Event)
{ // szukanie sygnalizatora w kierunku przeciwnym jazdy (eventu odczytu kom<6F>rki pami<6D>ci) { // szukanie sygnalizatora w kierunku przeciwnym jazdy (eventu odczytu kom<6F>rki pami<6D>ci)
TTrack *pTrackChVel = Track; // tor ze zmian<61> pr<70>dko<6B>ci TTrack *pTrackChVel = Track; // tor ze zmian<61> pr<70>dko<6B>ci
TTrack *pTrackFrom; // odcinek poprzedni, do znajdywania ko<6B>ca dr<64>g TTrack *pTrackFrom; // odcinek poprzedni, do znajdywania ko<6B>ca dr<64>g

View File

@@ -10,10 +10,10 @@ http://mozilla.org/MPL/2.0/.
#pragma once #pragma once
//#include <fstream> //#include <fstream>
#include <string>
#include "Classes.h" #include "Classes.h"
#include "dumb3d.h" #include "dumb3d.h"
#include "mczapkie/mover.h" #include "mczapkie/mover.h"
#include <string>
using namespace Math3D; using namespace Math3D;
using namespace Mtable; using namespace Mtable;
@@ -52,10 +52,12 @@ enum TMovementStatus
moveGuardSignal = 0x8000, // sygnał od kierownika (minął czas postoju) moveGuardSignal = 0x8000, // sygnał od kierownika (minął czas postoju)
moveVisibility = 0x10000, // jazda na widoczność po przejechaniu S1 na SBL moveVisibility = 0x10000, // jazda na widoczność po przejechaniu S1 na SBL
moveDoorOpened = 0x20000, // drzwi zostały otwarte - doliczyć czas na zamknięcie moveDoorOpened = 0x20000, // drzwi zostały otwarte - doliczyć czas na zamknięcie
movePushPull = 0x40000, // zmiana czoła przez zmianę kabiny - nie odczepiać przy zmianie kierunku movePushPull =
0x40000, // zmiana czoła przez zmianę kabiny - nie odczepiać przy zmianie kierunku
moveSemaphorFound = 0x80000, // na drodze skanowania został znaleziony semafor moveSemaphorFound = 0x80000, // na drodze skanowania został znaleziony semafor
moveSemaphorWasElapsed = 0x100000, // minięty został semafor moveSemaphorWasElapsed = 0x100000, // minięty został semafor
moveTrainInsideStation = 0x200000, // pociąg między semaforem a rozjazdami lub następnym semaforem moveTrainInsideStation =
0x200000, // pociąg między semaforem a rozjazdami lub następnym semaforem
moveSpeedLimitFound = 0x400000 // pociąg w ograniczeniu z podaną jego długością moveSpeedLimitFound = 0x400000 // pociąg w ograniczeniu z podaną jego długością
}; };
@@ -126,9 +128,9 @@ class TSpeedPos
public: public:
double fDist; // aktualna odległość (ujemna gdy minięte) double fDist; // aktualna odległość (ujemna gdy minięte)
double fVelNext; // prędkość obowiązująca od tego miejsca double fVelNext; // prędkość obowiązująca od tego miejsca
double fSectionVelocityDist; //długość ograniczenia prędkości double fSectionVelocityDist; // długość ograniczenia prędkości
// double fAcc; // double fAcc;
int iFlags; //flagi typu wpisu do tabelki int iFlags; // flagi typu wpisu do tabelki
// 1=istotny,2=tor,4=odwrotnie,8-zwrotnica (może się zmienić),16-stan // 1=istotny,2=tor,4=odwrotnie,8-zwrotnica (może się zmienić),16-stan
// zwrotnicy,32-minięty,64=koniec,128=łuk // zwrotnicy,32-minięty,64=koniec,128=łuk
// 0x100=event,0x200=manewrowa,0x400=przystanek,0x800=SBL,0x1000=wysłana komenda,0x2000=W5 // 0x100=event,0x200=manewrowa,0x400=przystanek,0x800=SBL,0x1000=wysłana komenda,0x2000=W5
@@ -219,8 +221,8 @@ class TController
// migacz lub czeka na stan zwrotnicy // migacz lub czeka na stan zwrotnicy
private: private:
TDynamicObject *pVehicle; // pojazd w którym siedzi sterujący TDynamicObject *pVehicle; // pojazd w którym siedzi sterujący
TDynamicObject * TDynamicObject
pVehicles[2]; // skrajne pojazdy w składzie (niekoniecznie bezpośrednio sterowane) *pVehicles[2]; // skrajne pojazdy w składzie (niekoniecznie bezpośrednio sterowane)
TMoverParameters *mvControlling; // jakim pojazdem steruje (może silnikowym w EZT) TMoverParameters *mvControlling; // jakim pojazdem steruje (może silnikowym w EZT)
TMoverParameters *mvOccupied; // jakim pojazdem hamuje TMoverParameters *mvOccupied; // jakim pojazdem hamuje
TTrainParameters *TrainParams; // rozkład jazdy zawsze jest, nawet jeśli pusty TTrainParameters *TrainParams; // rozkład jazdy zawsze jest, nawet jeśli pusty
@@ -251,7 +253,7 @@ class TController
public: public:
double VelNext; // prędkość, jaka ma być po przejechaniu długości ProximityDist double VelNext; // prędkość, jaka ma być po przejechaniu długości ProximityDist
private: private:
double fProximityDist; //odleglosc podawana w SetProximityVelocity(); >0:przeliczać do double fProximityDist; // odleglosc podawana w SetProximityVelocity(); >0:przeliczać do
// punktu, <0:podana wartość // punktu, <0:podana wartość
double FirstSemaphorDist; // odległość do pierwszego znalezionego semafora double FirstSemaphorDist; // odległość do pierwszego znalezionego semafora
public: public:
@@ -312,7 +314,7 @@ class TController
void ControllingSet(); // znajduje człon do sterowania void ControllingSet(); // znajduje człon do sterowania
void AutoRewident(); // ustawia hamulce w składzie void AutoRewident(); // ustawia hamulce w składzie
public: public:
Mtable::TTrainParameters * Timetable() Mtable::TTrainParameters *Timetable()
{ {
return TrainParams; return TrainParams;
}; };
@@ -358,12 +360,12 @@ class TController
double Distance(vector3 &p1, vector3 &n, vector3 &p2); double Distance(vector3 &p1, vector3 &n, vector3 &p2);
private: // Ra: metody obsługujące skanowanie toru private: // Ra: metody obsługujące skanowanie toru
TEvent * CheckTrackEvent(double fDirection, TTrack *Track); TEvent *CheckTrackEvent(double fDirection, TTrack *Track);
bool TableCheckEvent(TEvent *e); bool TableCheckEvent(TEvent *e);
bool TableAddNew(); bool TableAddNew();
bool TableNotFound(TEvent *e); bool TableNotFound(TEvent *e);
void TableClear(); void TableClear();
TEvent * TableCheckTrackEvent(double fDirection, TTrack *Track); TEvent *TableCheckTrackEvent(double fDirection, TTrack *Track);
void TableTraceRoute(double fDistance, TDynamicObject *pVehicle = NULL); void TableTraceRoute(double fDistance, TDynamicObject *pVehicle = NULL);
void TableCheck(double fDistance); void TableCheck(double fDistance);
TCommandType TableUpdate(double &fVelDes, double &fDist, double &fNext, double &fAcc); TCommandType TableUpdate(double &fVelDes, double &fDist, double &fNext, double &fAcc);
@@ -371,8 +373,8 @@ class TController
private: // Ra: stare funkcje skanujące, używane do szukania sygnalizatora z tyłu private: // Ra: stare funkcje skanujące, używane do szukania sygnalizatora z tyłu
bool BackwardTrackBusy(TTrack *Track); bool BackwardTrackBusy(TTrack *Track);
TEvent * CheckTrackEventBackward(double fDirection, TTrack *Track); TEvent *CheckTrackEventBackward(double fDirection, TTrack *Track);
TTrack * BackwardTraceRoute(double &fDistance, double &fDirection, TTrack *Track, TTrack *BackwardTraceRoute(double &fDistance, double &fDirection, TTrack *Track,
TEvent *&Event); TEvent *&Event);
void SetProximityVelocity(double dist, double vel, const vector3 *pos); void SetProximityVelocity(double dist, double vel, const vector3 *pos);
TCommandType BackwardScan(); TCommandType BackwardScan();

File diff suppressed because it is too large Load Diff

View File

@@ -317,8 +317,8 @@ class Global
// maciek001: zmienne dla MWD // maciek001: zmienne dla MWD
static bool bMWDdebugEnable; static bool bMWDdebugEnable;
static unsigned long int iMWDBaudrate; static unsigned int iMWDBaudrate;
static AnsiString sMWDPortId; static std::string sMWDPortId;
static bool bMWDBreakEnable; static bool bMWDBreakEnable;
static bool bMWDInputDataEnable; static bool bMWDInputDataEnable;
static double fMWDAnalogCalib[4][3]; static double fMWDAnalogCalib[4][3];

1530
Train.cpp

File diff suppressed because it is too large Load Diff

64
Train.h
View File

@@ -12,18 +12,18 @@ http://mozilla.org/MPL/2.0/.
//#include "Track.h" //#include "Track.h"
//#include "TrkFoll.h" //#include "TrkFoll.h"
#include "Model3d.h"
#include "Spring.h"
#include "Gauge.h"
#include "Button.h" #include "Button.h"
#include "DynObj.h" #include "DynObj.h"
#include "Gauge.h"
#include "Model3d.h"
#include "Spring.h"
#include "mtable.h" #include "mtable.h"
#include "Sound.h"
#include "AdvSound.h" #include "AdvSound.h"
#include "RealSound.h"
#include "FadeSound.h" #include "FadeSound.h"
#include "PyInt.h" #include "PyInt.h"
#include "RealSound.h"
#include "Sound.h"
#include <string> #include <string>
// typedef enum {st_Off, st_Starting, st_On, st_ShuttingDown} T4State; // typedef enum {st_Off, st_Starting, st_On, st_ShuttingDown} T4State;
@@ -63,8 +63,8 @@ class TCab
TButton *btList; // Ra 2014-08: lista animacji dwustanowych (lampek) w kabinie TButton *btList; // Ra 2014-08: lista animacji dwustanowych (lampek) w kabinie
int iButtonsMax, iButtons; // ile miejsca w tablicy i ile jest w u篡ciu int iButtonsMax, iButtons; // ile miejsca w tablicy i ile jest w u篡ciu
public: public:
TGauge * Gauge(int n = -1); // pobranie adresu obiektu TGauge *Gauge(int n = -1); // pobranie adresu obiektu
TButton * Button(int n = -1); // pobranie adresu obiektu TButton *Button(int n = -1); // pobranie adresu obiektu
void Update(); void Update();
}; };
@@ -102,16 +102,15 @@ class TTrain
bool LoadMMediaFile(std::string const &asFileName); bool LoadMMediaFile(std::string const &asFileName);
PyObject *GetTrainState(); PyObject *GetTrainState();
private: private:
// clears state of all cabin controls // clears state of all cabin controls
void void clear_cab_controls();
clear_cab_controls(); // initializes a gauge matching provided label. returns: true if the label was found, false
// initializes a gauge matching provided label. returns: true if the label was found, false otherwise // otherwise
bool bool initialize_gauge(cParser &Parser, std::string const &Label, int const Cabindex);
initialize_gauge( cParser &Parser, std::string const &Label, int const Cabindex ); // initializes a button matching provided label. returns: true if the label was found, false
// initializes a button matching provided label. returns: true if the label was found, false otherwise // otherwise
bool bool initialize_button(cParser &Parser, std::string const &Label, int const Cabindex);
initialize_button( cParser &Parser, std::string const &Label, int const Cabindex );
private: //瞠by go nic z zewn靖rz nie przestawia這 private: //瞠by go nic z zewn靖rz nie przestawia這
TDynamicObject *DynamicObject; // przestawia zmiana pojazdu [F5] TDynamicObject *DynamicObject; // przestawia zmiana pojazdu [F5]
@@ -163,7 +162,7 @@ private:
TGauge ggMainButton; // EZT TGauge ggMainButton; // EZT
TGauge ggSecurityResetButton; TGauge ggSecurityResetButton;
TGauge ggReleaserButton; TGauge ggReleaserButton;
TGauge ggSandButton; //guzik piasecznicy TGauge ggSandButton; // guzik piasecznicy
TGauge ggAntiSlipButton; TGauge ggAntiSlipButton;
TGauge ggFuseButton; TGauge ggFuseButton;
TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania
@@ -175,7 +174,7 @@ private:
TGauge ggRightLightButton; TGauge ggRightLightButton;
TGauge ggLeftEndLightButton; TGauge ggLeftEndLightButton;
TGauge ggRightEndLightButton; TGauge ggRightEndLightButton;
TGauge ggLightsButton; //przelacznik reflektorow (wszystkich) TGauge ggLightsButton; // przelacznik reflektorow (wszystkich)
// hunter-230112: przelacznik swiatel tylnich // hunter-230112: przelacznik swiatel tylnich
TGauge ggRearUpperLightButton; TGauge ggRearUpperLightButton;
@@ -268,7 +267,7 @@ private:
TButton btLampkaBocznik4; TButton btLampkaBocznik4;
TButton btLampkaRadiotelefon; TButton btLampkaRadiotelefon;
TButton btLampkaHamienie; TButton btLampkaHamienie;
TButton btLampkaED; //Stele 161228 hamowanie elektrodynamiczne TButton btLampkaED; // Stele 161228 hamowanie elektrodynamiczne
TButton btLampkaJazda; // Ra: nie u篡wane TButton btLampkaJazda; // Ra: nie u篡wane
// KURS90 // KURS90
TButton btLampkaBoczniki; TButton btLampkaBoczniki;
@@ -396,20 +395,21 @@ private:
float fHVoltage; // napi?cie dla dynamicznych ga?ek float fHVoltage; // napi?cie dla dynamicznych ga?ek
float fHCurrent[4]; // pr?dy: suma i amperomierze 1,2,3 float fHCurrent[4]; // pr?dy: suma i amperomierze 1,2,3
float fEngine[4]; // obroty te? trzeba pobra? float fEngine[4]; // obroty te? trzeba pobra?
int iCarNo, iPowerNo, iUnitNo; //liczba pojazdow, czlonow napednych i jednostek spi皻ych ze sob<6F> int iCarNo, iPowerNo, iUnitNo; // liczba pojazdow, czlonow napednych i jednostek spi皻ych ze
// sob<6F>
bool bDoors[20][3]; // drzwi dla wszystkich czlonow bool bDoors[20][3]; // drzwi dla wszystkich czlonow
int iUnits[20]; // numer jednostki int iUnits[20]; // numer jednostki
int iDoorNo[20]; // liczba drzwi int iDoorNo[20]; // liczba drzwi
char cCode[20]; //kod pojazdu char cCode[20]; // kod pojazdu
std::string asCarName[20]; //nazwa czlonu std::string asCarName[20]; // nazwa czlonu
bool bMains[8]; //WSy bool bMains[8]; // WSy
float fCntVol[8]; //napiecie NN float fCntVol[8]; // napiecie NN
bool bPants[8][2]; //podniesienie pantografow bool bPants[8][2]; // podniesienie pantografow
bool bFuse[8]; //nadmiarowe bool bFuse[8]; // nadmiarowe
bool bBatt[8]; //baterie bool bBatt[8]; // baterie
bool bConv[8]; //przetwornice bool bConv[8]; // przetwornice
bool bComp[8][2]; //sprezarki bool bComp[8][2]; // sprezarki
bool bHeat[8]; //grzanie bool bHeat[8]; // grzanie
// McZapkie: do syczenia // McZapkie: do syczenia
float fPPress, fNPress; float fPPress, fNPress;
float fSPPress, fSNPress; float fSPPress, fSNPress;
@@ -424,11 +424,11 @@ private:
{ {
return iRadioChannel; return iRadioChannel;
}; };
inline TDynamicObject * Dynamic() inline TDynamicObject *Dynamic()
{ {
return DynamicObject; return DynamicObject;
}; };
inline TMoverParameters * Controlled() inline TMoverParameters *Controlled()
{ {
return mvControlled; return mvControlled;
}; };