From cf48989f393a0454d8865b67aed159b7c6943470 Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Wed, 15 Feb 2017 00:37:12 +0100 Subject: [PATCH 1/2] fixes for sound transcripts, conversion of win1250cp to plain ascii, tga loader --- DynObj.cpp | 12 ++++++++- DynObj.h | 2 +- Event.cpp | 1 + Globals.cpp | 64 +++++++++++++++++++++++++++++++++++++++----- Globals.h | 20 +++++++++++--- McZapkie/mctools.cpp | 15 +++++++++++ McZapkie/mctools.h | 12 ++++++--- RealSound.cpp | 7 +++-- Texture.cpp | 13 +++++---- World.cpp | 18 +++++++++++++ mtable.cpp | 8 +++++- 11 files changed, 148 insertions(+), 24 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index a6f95689..9dba3343 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -4633,8 +4633,13 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, */ if( true == pAnimations.empty() ) { // 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) + } +*/ /* //pojazd może mieć pantograf do innych celów niż napęd if (MoverParameters->EnginePowerSource.SourceType!=CurrentCollector) {//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 != "" ) && ( 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) mdModel->Init(); // obrócenie modelu oraz optymalizacja, również zapisanie // binarnego diff --git a/DynObj.h b/DynObj.h index 56f31d02..bda873a7 100644 --- a/DynObj.h +++ b/DynObj.h @@ -185,7 +185,7 @@ private: private: // zmienne i metody do animacji submodeli; Ra: sprzatam animacje w pojeździe 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: int iAnimations; // liczba obiektów animujących /* diff --git a/Event.cpp b/Event.cpp index 5ea1ddf5..de274e49 100644 --- a/Event.cpp +++ b/Event.cpp @@ -317,6 +317,7 @@ void TEvent::Load(cParser *parser, vector3 *org) { if (token.find('#') != std::string::npos) 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 // dowiązany) Params[6].asCommand = cm_PassengerStopPoint; diff --git a/Globals.cpp b/Globals.cpp index 1780eee5..348fa827 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -74,7 +74,9 @@ int Global::iSegmentsRendered = 90; // ilość segmentów do regulacji wydajnoś TCamera *Global::pCamera = NULL; // parametry kamery TDynamicObject *Global::pUserDynamic = NULL; // pojazd użytkownika, renderowany bez trzęsienia bool Global::bSmudge = false; // czy wyświetlać smugę, a pojazd użytkownika na końcu +/* std::string Global::asTranscript[5]; // napisy na ekranie (widoczne) +*/ TTranscripts Global::tranTexts; // obiekt obsługujący stenogramy dźwięków na ekranie // parametry scenerii @@ -1130,6 +1132,7 @@ bool Global::DoEvents() TTranscripts::TTranscripts() { +/* iCount = 0; // brak linijek do wyświetlenia iStart = 0; // wypełniać od linijki 0 for (int i = 0; i < MAX_TRANSCRIPTS; ++i) @@ -1137,19 +1140,35 @@ TTranscripts::TTranscripts() aLines[i].fHide = -1.0; // wolna pozycja (czas symulacji, 360.0 to doba) aLines[i].iNext = -1; // nie ma kolejnej } +*/ fRefreshTime = 360.0; // wartośc zaporowa }; 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 if (show == hide) return; // komentarz jest ignorowany show = Global::fTimeAngleDeg + show / 240.0; // jeśli doba to 360, to 1s będzie równe 1/240 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ąć while ((aLines[i].iNext >= 0) ? (aLines[aLines[i].iNext].fShow <= show) : false) // póki nie koniec i wcześniej puszczane i = aLines[i].iNext; // przejście do kolejnej linijki +*/ +/* //(i) wskazuje na linię, po której należy wstawić dany tekst, chyba że while (txt ? *txt : false) for (j = 0; j < MAX_TRANSCRIPTS; ++j) @@ -1176,11 +1195,13 @@ void TTranscripts::AddLine(char const *txt, float show, float hide, bool it) fRefreshTime = show; // to odświeżyć wcześniej 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 - if (!txt) + if (true == txt.empty()) return; // pusty tekst +/* int i = 0, j = int(0.5 + 10.0 * len); //[0.1s] if (*txt == '[') { // powinny być dwa nawiasy @@ -1197,14 +1218,44 @@ void TTranscripts::Add(char const *txt, float len, bool backgorund) ++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() { // usuwanie niepotrzebnych (nie częściej niż 10 razy na sekundę) - if (fRefreshTime > Global::fTimeAngleDeg) + if( Global::fTimeAngleDeg < fRefreshTime ) return; // nie czas jeszcze na zmiany // czas odświeżenia można ustalić wg tabelki, kiedy coś się w niej zmienia - fRefreshTime = Global::fTimeAngleDeg + 360.0; // wartość zaporowa + // 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ąć bool change = false; // czy zmieniać napisy? do @@ -1247,6 +1298,7 @@ void TTranscripts::Update() for (++j; j < 5; ++j) Global::asTranscript[j] = ""; // i czyszczenie nieużywanych linijek } +*/ }; // Ra: tymczasowe rozwiązanie kwestii zagranicznych (czeskich) napisów diff --git a/Globals.h b/Globals.h index c50f5d83..2793ed30 100644 --- a/Globals.h +++ b/Globals.h @@ -130,21 +130,31 @@ class TTranscript int iNext; // następna używana linijka, żeby nie przestawiać fizycznie tabeli }; +/* #define MAX_TRANSCRIPTS 30 +*/ class TTranscripts { // klasa obsługująca napisy do dźwięków +/* TTranscript aLines[MAX_TRANSCRIPTS]; // pozycje na napisy do wyświetlenia +*/ +public: + std::deque aLines; +/* int iCount; // liczba zajętych pozycji int iStart; // pierwsza istotna pozycja w tabeli, żeby sortować przestawiając numerki +*/ +private: float fRefreshTime; public: TTranscripts(); ~TTranscripts(); - void AddLine(char const *txt, float show, float hide, bool it); - void Add(char const *txt, float len, - bool backgorund = false); // dodanie tekstów, długość dźwięku, czy istotne - void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekundę) + void AddLine(std::string const &txt, float show, float hide, bool it); + // dodanie tekstów, długość dźwięku, czy istotne + void Add(std::string const &txt, float len, bool background = false); + // usuwanie niepotrzebnych (ok. 10 razy na sekundę) + void Update(); }; class Global @@ -298,7 +308,9 @@ class Global static double fBrakeStep; // krok zmiany hamulca dla klawiszy [Num3] i [Num9] static bool bJoinEvents; // czy grupować eventy o tych samych nazwach static bool bSmudge; // czy wyświetlać smugę, a pojazd użytkownika na końcu +/* static std::string asTranscript[5]; // napisy na ekranie (widoczne) +*/ static TTranscripts tranTexts; // obiekt obsługujący stenogramy dźwięków na ekranie static std::string asLang; // domyślny język - http://tools.ietf.org/html/bcp47 static int iHiddenEvents; // czy łączyć eventy z torami poprzez nazwę toru diff --git a/McZapkie/mctools.cpp b/McZapkie/mctools.cpp index fe17d484..2c751394 100644 --- a/McZapkie/mctools.cpp +++ b/McZapkie/mctools.cpp @@ -412,6 +412,21 @@ std::string ToUpper(std::string const &text) return uppercase; } +// replaces polish letters with basic ascii +void +win1250_to_ascii( std::string &Input ) { + + std::unordered_map 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::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, double &phi, double &Xout, double &Yout) /*wylicza polozenie Xout Yout i orientacje phi punktu na elemencie dL luku*/ diff --git a/McZapkie/mctools.h b/McZapkie/mctools.h index a38abb27..817f34ec 100644 --- a/McZapkie/mctools.h +++ b/McZapkie/mctools.h @@ -107,15 +107,15 @@ bool FuzzyLogicAI(double Test, double Threshold, double Probability); /*operacje na stringach*/ std::string ReadWord( std::ifstream& infile); /*czyta slowo z wiersza pliku tekstowego*/ //std::string Ups(std::string s); -std::string TrimSpace(std::string &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 TrimSpace(std::string &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 DUE(std::string s); /*Delete Until 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::vector &Split(const std::string &s, char delim, std::vector &elems); std::vector Split(const std::string &s, char delim); -std::vector Split(const std::string &s); +//std::vector Split(const std::string &s); std::string to_string(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, int width); std::string to_hex_str( int const _Val, int const width = 4 ); + inline std::string to_string(bool _Val) { 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 ToUpper(std::string const &text); +// replaces polish letters with basic ascii +void win1250_to_ascii( std::string &Input ); + /*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); /*wylicza polozenie Xout Yout i orientacje phi punktu na elemencie dL luku*/ diff --git a/RealSound.cpp b/RealSound.cpp index 42aa71a5..17cd51f3 100644 --- a/RealSound.cpp +++ b/RealSound.cpp @@ -271,22 +271,25 @@ void TTextSound::Play(double Volume, int Looping, bool ListenerInside, vector3 N pSound->GetStatus(&stat); if (!(stat & DSBSTATUS_PLAYING)) // jeśli nie jest aktualnie odgrywany { +/* std::string t( asText ); size_t i; do { // na razie zrobione jakkolwiek, docelowo przenieść teksty do tablicy nazw i = t.find('\r'); // znak nowej linii if( i == std::string::npos ) { - Global::tranTexts.Add( t.c_str(), fTime, true ); + Global::tranTexts.Add( t, fTime, true ); } 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); while (t.empty() ? false : (unsigned char)(t[1]) < 33) t.erase(0, 1); } } while (i != std::string::npos); +*/ + Global::tranTexts.Add( asText, fTime, true ); } } TRealSound::Play(Volume, Looping, ListenerInside, NewPosition); diff --git a/Texture.cpp b/Texture.cpp index 9e509d20..fb9a4dd0 100644 --- a/Texture.cpp +++ b/Texture.cpp @@ -175,7 +175,7 @@ opengl_texture::load_DDS() { data_width = ddsd.dwWidth; 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 offset = 0; @@ -194,11 +194,13 @@ opengl_texture::load_DDS() { data_state = resource_state::failed; return; } + + int datasize = filesize - offset; /* // 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 = filesize - offset; /* // 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 @@ -331,7 +333,8 @@ opengl_texture::load_TGA() { int const pixelcount = data_width * data_height; 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 ) { // expand greyscale data buffer[ 1 ] = buffer[ 0 ]; @@ -473,8 +476,8 @@ opengl_texture::create() { datasize, (GLubyte *)&data[0] + dataoffset ); dataoffset += datasize; - datawidth = std::max( datawidth / 2, 4 ); - dataheight = std::max( dataheight / 2, 4 ); + datawidth = std::max( datawidth / 2, 1 ); + dataheight = std::max( dataheight / 2, 1 ); } else{ // uncompressed texture data diff --git a/World.cpp b/World.cpp index 56e70d25..c0188625 100644 --- a/World.cpp +++ b/World.cpp @@ -2611,6 +2611,7 @@ TWorld::Render_UI() { } // if ((Global::iTextMode!=VK_F3)) { // stenogramy dźwięków (ukryć, gdy tabelka skanowania lub rozkład?) +/* glColor3f( 1.0f, 1.0f, 0.0f ); //żółte for( int i = 0; i < 5; ++i ) { // kilka linijek if( Global::asTranscript[ i ].empty() ) @@ -2620,6 +2621,23 @@ TWorld::Render_UI() { 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) diff --git a/mtable.cpp b/mtable.cpp index 680f6cc6..877271b8 100644 --- a/mtable.cpp +++ b/mtable.cpp @@ -13,6 +13,7 @@ http://mozilla.org/MPL/2.0/. #include "stdafx.h" #include "mtable.h" +#include "mczapkie/mctools.h" // using namespace Mtable; std::shared_ptr Mtable::GlobalTime; @@ -278,8 +279,10 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax) if (s != "|") break; } // while (!(() || fin.eof())); - if (s != "|") + if( s != "|" ) { Relation1 = s; + win1250_to_ascii( Relation1 ); + } else ConversionError = -5; while (fin >> s || !fin.bad()) @@ -294,6 +297,7 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax) break; } // while (!( || (fin.eof()))); fin >> Relation2; + win1250_to_ascii( Relation2 ); while (fin >> s || !fin.bad()) { if (s == "Wymagany") @@ -352,6 +356,8 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax) while (s.find("|") == std::string::npos) fin >> s; fin >> record->StationName; + // get rid of non-ascii chars. TODO: run correct version based on locale + win1250_to_ascii( record->StationName ); do { fin >> s; From ad5adba032dc6fb7ce7ab4da665e1b7b1346bc1a Mon Sep 17 00:00:00 2001 From: maciek001 Date: Thu, 16 Feb 2017 13:48:15 +0100 Subject: [PATCH 2/2] Poprawki do MWD - SerialPort --- Console.cpp | 314 +++++++++-------------- Console.h | 4 +- Console/MWD.cpp | 669 +++++++++++++++++++++++------------------------- Console/MWD.h | 67 ++--- Globals.cpp | 200 ++++++++------- Globals.h | 25 +- Texture.h | 2 +- Train.cpp | 4 +- 8 files changed, 595 insertions(+), 690 deletions(-) diff --git a/Console.cpp b/Console.cpp index 9943c924..00157d5f 100644 --- a/Console.cpp +++ b/Console.cpp @@ -114,7 +114,7 @@ int Console::iMode = 0; int Console::iConfig = 0; TPoKeys55 *Console::PoKeys55[2] = {NULL, 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::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] iButton[i] = 0; // bity 0..127 - bez [Shift], 128..255 - z [Shift] } + MWDComm = NULL; }; Console::~Console() { delete PoKeys55[0]; delete PoKeys55[1]; - delete MWD; + delete MWDComm; }; void Console::ModeSet(int m, int h) @@ -177,17 +178,20 @@ int Console::On() PoKeys55[0] = NULL; } break; - case 5: // maciek001: MWD OK - MWD = new MWDComm(); - if (!(MWD->Open())) - { - delete MWD; - iMode = 0; - Global::iFeedbackMode = 0; - WriteLog("COM Port not open!"); - } - break; } + + 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; }; @@ -206,8 +210,8 @@ void Console::Off() PoKeys55[1] = NULL; delete LPT; LPT = NULL; - delete MWD; // maciek001: zamykanie portu COM i takie tam inne ;) - MWD = NULL; + delete MWDComm; + MWDComm = NULL; }; 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); } break; - case 5: // maciek001: MWD lampki i kontrolki - /* out3: ogrzewanie sk?adu, opory rozruchowe, poslizg, zaluzjewent, -, -, czuwak, shp - out4: stycz.liniowe, pezekaznikróżnicobwpomoc, nadmiarprzetw, roznicowy obw. gł, - nadmiarsilniki, wylszybki, zanikprąduprzyjeździenaoporach, nadmiarsprezarki - out5: HASLER */ - if (mask & 0x0001) - if (iBits & 1) - { - MWD->WriteDataBuff[4] |= 1 << 7; // SHP HASLER też - if (!MWD->bSHPstate) - { - MWD->bSHPstate = true; - MWD->bPrzejazdSHP = true; - } - else - MWD->bPrzejazdSHP = false; - } - else - { - MWD->WriteDataBuff[4] &= ~(1 << 7); - MWD->bPrzejazdSHP = false; - MWD->bSHPstate = false; - } - if (mask & 0x0002) - if (iBits & 2) - MWD->WriteDataBuff[4] |= 1 << 6; // CA - else - MWD->WriteDataBuff[4] &= ~(1 << 6); - if (mask & 0x0004) - if (iBits & 4) - MWD->WriteDataBuff[4] |= 1 << 1; // jazda na oporach rozruchowych - else - MWD->WriteDataBuff[4] &= ~(1 << 1); - if (mask & 0x0008) - if (iBits & 8) - MWD->WriteDataBuff[5] |= 1 << 5; // wyłącznik szybki - else - MWD->WriteDataBuff[5] &= ~(1 << 5); - if (mask & 0x0010) - if (iBits & 0x10) - MWD->WriteDataBuff[5] |= 1 << 4; // nadmiarowy silników trakcyjnych - else - MWD->WriteDataBuff[5] &= ~(1 << 4); - if (mask & 0x0020) - if (iBits & 0x20) - MWD->WriteDataBuff[4] |= 1 << 0; // styczniki liniowe - else - MWD->WriteDataBuff[5] &= ~(1 << 0); - if (mask & 0x0040) - if (iBits & 0x40) - MWD->WriteDataBuff[4] |= 1 << 2; // poślizg - else - MWD->WriteDataBuff[4] &= ~(1 << 2); - if (mask & 0x0080) - if (iBits & 0x80) - MWD->WriteDataBuff[5] |= 1 << 2; // (nadmiarowy) przetwornicy? ++ - else - MWD->WriteDataBuff[5] &= ~(1 << 2); - if (mask & 0x0100) - if (iBits & 0x100) - MWD->WriteDataBuff[5] |= 1 << 7; // nadmiarowy sprężarki - else - MWD->WriteDataBuff[5] &= ~(1 << 7); - if (mask & 0x0200) - if (iBits & 0x200) - MWD->WriteDataBuff[2] |= 1 << 1; // wentylatory i opory - else - MWD->WriteDataBuff[2] &= ~(1 << 1); - if (mask & 0x0400) - if (iBits & 0x400) - MWD->WriteDataBuff[2] |= 1 << 2; // wysoki rozruch - else - MWD->WriteDataBuff[2] &= ~(1 << 2); - if (mask & 0x0800) - if (iBits & 0x800) - MWD->WriteDataBuff[4] |= 1 << 0; // ogrzewanie pociągu - else - MWD->WriteDataBuff[4] &= ~(1 << 0); - if (mask & 0x1000) - if (iBits & 0x1000) - MWD->bHamowanie = true; // hasler: ciśnienie w hamulcach HASLER rysik 2 - else - MWD->bHamowanie = false; - if (mask & 0x2000) - if (iBits & 0x2000) - MWD->WriteDataBuff[6] |= - 1 << 4; // hasler: prąd "na" silnikach HASLER rysik 3 - else - MWD->WriteDataBuff[6] &= ~(1 << 4); - if (mask & 0x4000) - if (iBits & 0x4000) - MWD->WriteDataBuff[6] |= 1 << 7; // brzęczyk SHP/CA - else - MWD->WriteDataBuff[6] &= ~(1 << 7); - // if(mask & 0x8000) if(iBits & 0x8000) MWD->WriteDataBuff[1] |= 1<<7; (puste) - // else MWD->WriteDataBuff[0] &= ~(1<<7); - break; - } + } + if (Global::bMWDmasterEnable) + { + // maciek001: MWDComm lampki i kontrolki + // out3: ogrzewanie sk?adu, opory rozruchowe, poslizg, zaluzjewent, -, -, czuwak, shp + // out4: stycz.liniowe, pezekaznikr??nicobwpomoc, nadmiarprzetw, roznicowy obw. g?, nadmiarsilniki, wylszybki, zanikpr?duprzyje?dzienaoporach, nadmiarsprezarki + // out5: HASLER */ + if (mask & 0x0001) if (iBits & 1) { + MWDComm->WriteDataBuff[4] |= 1 << 7; // SHP HASLER też + if (!MWDComm->bSHPstate) { + MWDComm->bSHPstate = true; + MWDComm->bPrzejazdSHP = true; + } + else MWDComm->bPrzejazdSHP = false; + } + else { + MWDComm->WriteDataBuff[4] &= ~(1 << 7); + MWDComm->bPrzejazdSHP = false; + MWDComm->bSHPstate = false; + } + if (mask & 0x0002) if (iBits & 2) MWDComm->WriteDataBuff[4] |= 1 << 6; // CA + else MWDComm->WriteDataBuff[4] &= ~(1 << 6); + if (mask & 0x0004) if (iBits & 4) MWDComm->WriteDataBuff[4] |= 1 << 1; // jazda na oporach rozruchowych + else MWDComm->WriteDataBuff[4] &= ~(1 << 1); + if (mask & 0x0008) if (iBits & 8) MWDComm->WriteDataBuff[5] |= 1 << 5; // wy??cznik szybki + else MWDComm->WriteDataBuff[5] &= ~(1 << 5); + if (mask & 0x0010) if (iBits & 0x10) MWDComm->WriteDataBuff[5] |= 1 << 4; // nadmiarowy silnik?w trakcyjnych + else MWDComm->WriteDataBuff[5] &= ~(1 << 4); + if (mask & 0x0020) if (iBits & 0x20) MWDComm->WriteDataBuff[4] |= 1 << 0; // styczniki liniowe + else MWDComm->WriteDataBuff[5] &= ~(1 << 0); + if (mask & 0x0040) if (iBits & 0x40) MWDComm->WriteDataBuff[4] |= 1 << 2; // po?lizg + else MWDComm->WriteDataBuff[4] &= ~(1 << 2); + if (mask & 0x0080) if (iBits & 0x80) MWDComm->WriteDataBuff[5] |= 1 << 2; // (nadmiarowy) przetwornicy? ++ + else MWDComm->WriteDataBuff[5] &= ~(1 << 2); + if (mask & 0x0100) if (iBits & 0x100) MWDComm->WriteDataBuff[5] |= 1 << 7; // nadmiarowy spr??arki + else MWDComm->WriteDataBuff[5] &= ~(1 << 7); + if (mask & 0x0200) if (iBits & 0x200) MWDComm->WriteDataBuff[2] |= 1 << 1; // wentylatory i opory + else MWDComm->WriteDataBuff[2] &= ~(1 << 1); + if (mask & 0x0400) if (iBits & 0x400) MWDComm->WriteDataBuff[2] |= 1 << 2; // wysoki rozruch + else MWDComm->WriteDataBuff[2] &= ~(1 << 2); + if (mask & 0x0800) if (iBits & 0x800) MWDComm->WriteDataBuff[4] |= 1 << 0; // ogrzewanie poci?gu + else MWDComm->WriteDataBuff[4] &= ~(1 << 0); + if (mask & 0x1000) if (iBits & 0x1000) MWDComm->bHamowanie = true; // hasler: ci?nienie w hamulcach HASLER rysik 2 + else MWDComm->bHamowanie = false; + if (mask & 0x2000) if (iBits & 0x2000) MWDComm->WriteDataBuff[6] |= 1 << 4; // hasler: pr?d "na" silnikach HASLER rysik 3 + else MWDComm->WriteDataBuff[6] &= ~(1 << 4); + if (mask & 0x4000) if (iBits & 0x4000) MWDComm->WriteDataBuff[6] |= 1 << 7; // brz?czyk SHP/CA + else MWDComm->WriteDataBuff[6] &= ~(1 << 7); + //if(mask & 0x8000) if(iBits & 0x8000) MWDComm->WriteDataBuff[1] |= 1<<7; (puste) + //else MWDComm->WriteDataBuff[0] &= ~(1<<7); + } }; bool Console::Pressed(int x) @@ -431,61 +388,43 @@ void Console::ValueSet(int x, double y) WriteLog(" calibrated=" + std::to_string(temp)); PoKeys55[0]->PWM(x, temp); } - if (iMode == 5 && MWD) // pwm-y i prędkość - { - unsigned int iliczba; - if (x == 0) - { - iliczba = (unsigned int)floor((y / (Global::fMWDzg[0] * 10) * Global::fMWDzg[1]) + - 0.5); // zbiornik główny - MWD->WriteDataBuff[12] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[11] = (unsigned char)iliczba; - } - else if (x == 1) - { - iliczba = (unsigned int)floor((y / (Global::fMWDpg[0] * 10) * Global::fMWDpg[1]) + - 0.5); // przewód główny - MWD->WriteDataBuff[10] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[9] = (unsigned char)iliczba; - } - else if (x == 2) - { - iliczba = (unsigned int)floor((y / (Global::fMWDph[0] * 10) * Global::fMWDph[1]) + - 0.5); // cylinder hamulcowy - MWD->WriteDataBuff[8] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[7] = (unsigned char)iliczba; - } - else if (x == 3) - { - iliczba = (unsigned int)floor((y / Global::fMWDvolt[0] * Global::fMWDvolt[1]) + - 0.5); // woltomierz WN - MWD->WriteDataBuff[14] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[13] = (unsigned char)iliczba; - } - else if (x == 4) - { - iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + - 0.5); // amp WN 1 - MWD->WriteDataBuff[16] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[15] = (unsigned char)iliczba; - } - else if (x == 5) - { - iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + - 0.5); // amp WN 2 - MWD->WriteDataBuff[18] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[17] = (unsigned char)iliczba; - } - else if (x == 6) - { - iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + - 0.5); // amp WN 3 - MWD->WriteDataBuff[20] = (unsigned int)(iliczba >> 8); - MWD->WriteDataBuff[19] = (unsigned char)iliczba; - } - else if (x == 7) - MWD->WriteDataBuff[0] = (unsigned char)floor(y); // prędkość - } + if (Global::bMWDmasterEnable) + { + unsigned int iliczba; + switch (x) + { + case 0: iliczba = (unsigned int)floor((y / (Global::fMWDzg[0] * 10) * Global::fMWDzg[1]) + 0.5); // zbiornik g??wny + MWDComm->WriteDataBuff[12] = (unsigned char)(iliczba >> 8); + MWDComm->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 + MWDComm->WriteDataBuff[10] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[9] = (unsigned char)iliczba; + break; + case 2: iliczba = (unsigned int)floor((y / (Global::fMWDph[0] * 10) * Global::fMWDph[1]) + 0.5); // cylinder hamulcowy + MWDComm->WriteDataBuff[8] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[7] = (unsigned char)iliczba; + break; + case 3: iliczba = (unsigned int)floor((y / Global::fMWDvolt[0] * Global::fMWDvolt[1]) + 0.5); // woltomierz WN + MWDComm->WriteDataBuff[14] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[13] = (unsigned char)iliczba; + break; + case 4: iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 1 + MWDComm->WriteDataBuff[16] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[15] = (unsigned char)iliczba; + break; + case 5: iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 2 + MWDComm->WriteDataBuff[18] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[17] = (unsigned char)iliczba; + break; + 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); + MWDComm->WriteDataBuff[19] = (unsigned char)iliczba; + break; + case 7: MWDComm->WriteDataBuff[0] = (unsigned char)floor(y); // prędkość + break; + } + } }; void Console::Update() @@ -503,10 +442,11 @@ void Console::Update() Global::iPause |= 8; // tak??? PoKeys55[0]->Connect(); // próba ponownego podłączenia } - if (iMode == 5) // Obs?uga MWD OK - { - MWD->Run(); - } + if (Global::bMWDmasterEnable) + { + if (MWDComm->GetMWDState()) MWDComm->Run(); + else MWDComm->Close(); + } }; float Console::AnalogGet(int x) @@ -531,25 +471,19 @@ float Console::AnalogCalibrateGet(int x) b + Global::fCalibrateIn[x][0]; } - if (iMode == 5 && MWD) // maciek001: obs?uga hamulc?w (wej?? analogowych) OK - { - float b = MWD->fAnalog[x]; - // b = - // b*(Global::fMWDAnalogCalib[x][0]-Global::fMWDAnalogCalib[x][1])/Global::fMWDAnalogCalib[x][3]+Global::fMWDAnalogCalib[x][1]/Global::fMWDAnalogCalib[x][3]; - b = (b - Global::fMWDAnalogCalib[x][1]) / - (Global::fMWDAnalogCalib[x][1] - Global::fMWDAnalogCalib[x][0]); - switch (x) - { - case 0: - return (b * 8 - 2); - break; - case 1: - return (b * 10); - break; - default: - return 0; - } - } + if (Global::bMWDmasterEnable && Global::bMWDBreakEnable) + { + float b = (float)MWDComm->uiAnalog[x]; + b = (b - Global::fMWDAnalogInCalib[x][0]) / (Global::fMWDAnalogInCalib[x][1] - Global::fMWDAnalogInCalib[x][0]); + switch (x) + { + case 0: return (b * 8 - 2); + break; + case 1: return (b * 10); + break; + default: return 0; + } + } return -1.0; // odcięcie }; diff --git a/Console.h b/Console.h index 440bc63b..aedaff1f 100644 --- a/Console.h +++ b/Console.h @@ -13,7 +13,7 @@ http://mozilla.org/MPL/2.0/. class TConsoleDevice; // urządzenie podłączalne za pomocą DLL class TPoKeys55; class TLPT; -class MWDComm; // maciek001: dodana obsluga portu COM +class TMWDComm; // maciek001: dodana obsluga portu COM // klasy konwersji znaków wprowadzanych z klawiatury class TKeyTrans @@ -32,7 +32,7 @@ class Console static int iBits; // podstawowy zestaw lampek static TPoKeys55 *PoKeys55[2]; // może ich być kilka static TLPT *LPT; - static MWDComm *MWD; // maciek001: na potrzeby MWD + static TMWDComm *MWDComm; // maciek001: na potrzeby MWD static void BitsUpdate(int mask); // zmienne dla trybu "jednokabinowego", potrzebne do współpracy z pulpitem (PoKeys) // używając klawiatury, każdy pojazd powinien mieć własny stan przełączników diff --git a/Console/MWD.cpp b/Console/MWD.cpp index c400abc7..5f546ce3 100644 --- a/Console/MWD.cpp +++ b/Console/MWD.cpp @@ -22,55 +22,62 @@ http://mozilla.org/MPL/2.0/. #include -#define BYTETOWRITE 31 /* ilość bajtów przesyłanych z MaSzyny*/ -#define BYTETOREAD 16 /* ilość bajtów przesyłanych do MaSzyny*/ - HANDLE hComm; -MWDComm::MWDComm() // konstruktor +TMWDComm::TMWDComm() // konstruktor { - MWDTime = 0; - bSHPstate = false; - bPrzejazdSHP = false; - bKabina1 = true; // pasuje wyciągnąć dane na temat kabiny i ustawiać te dwa parametry! - bKabina2 = false; - bHamowanie = false; - bCzuwak = false; + MWDTime = 0; + bSHPstate = false; + bPrzejazdSHP = false; + bKabina1 = true; // pasuje wyciągnąć dane na temat kabiny i ustawiać te dwa parametry! + bKabina2 = false; + bHamowanie = false; + bCzuwak = false; - bRysik1H = false; - bRysik1L = false; - bRysik2H = false; - bRysik2L = false; + bRysik1H = false; + bRysik1L = false; + bRysik2H = false; + bRysik2L = false; - bocznik = 0; - nastawnik = 0; - kierunek = 0; - bnkMask = 0; + bocznik = 0; + nastawnik = 0; + kierunek = 0; + bnkMask = 0; - int i = 0; - while (i < BYTETOWRITE) - { - if (i < BYTETOREAD) - ReadDataBuff[i] = 0; - WriteDataBuff[i] = 0; - i++; - } - i = 0; - while (i < 6) - { - lastStateData[i] = 0; - maskSwitch[i] = 0; - bitSwitch[i] = 0; - i++; - } + int i = 6; + + while (i) + { + i--; + lastStateData[i] = 0; + maskData[i] = 0; + maskSwitch[i] = 0; + bitSwitch[i] = 0; + } + + i = 0; + while (i 0) return 1; @@ -149,26 +160,33 @@ inline bool MWDComm::GetMWDState() // sprawdzanie otwarcia portu COM 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; - ReadFile(hComm, &ReadDataBuff[0], BYTETOREAD, &bytes_read, NULL); + DWORD bytes_read; + ReadFile(hComm, &ReadDataBuff[0], BYTETOREAD, &bytes_read, NULL); - fAnalog[0] = - (float)((ReadDataBuff[9] << 8) + ReadDataBuff[8]) / - Global::fMWDAnalogCalib[0][2]; // 4095.0f; //max wartosc wynikająca z rozdzielczości - fAnalog[1] = - (float)((ReadDataBuff[11] << 8) + ReadDataBuff[10]) / Global::fMWDAnalogCalib[1][2]; - fAnalog[2] = - (float)((ReadDataBuff[13] << 8) + ReadDataBuff[12]) / Global::fMWDAnalogCalib[2][2]; - fAnalog[3] = - (float)((ReadDataBuff[15] << 8) + ReadDataBuff[14]) / Global::fMWDAnalogCalib[3][2]; - CheckData(); - - return TRUE; + if (Global::bMWDBreakEnable) + { + uiAnalog[0] = (ReadDataBuff[9] << 8) + ReadDataBuff[8]; + uiAnalog[1] = (ReadDataBuff[11] << 8) + ReadDataBuff[10]; + uiAnalog[2] = (ReadDataBuff[13] << 8) + ReadDataBuff[12]; + uiAnalog[3] = (ReadDataBuff[15] << 8) + ReadDataBuff[14]; + if (Global::bMWDdebugEnable && (Global::iMWDDebugMode & 1)) + { + WriteLog("Main Break = " + to_string(uiAnalog[0])); + WriteLog("Locomotiv Break = " + to_string(uiAnalog[1])); + } + 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 fdwEvtMask; @@ -178,29 +196,30 @@ bool MWDComm::SendData() // wysyłanie danych 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 (!(MWDTime % 5)) - { - if (GetMWDState()) - { - SendData(); - if (Global::bMWDInputDataEnable) - ReadData(); - return 1; - } - else - { - WriteLog("Port COM: connection ERROR!"); - // może spróbować się połączyć znowu? - return 0; - } - MWDTime = 0; - } + if (GetMWDState()) + { + MWDTime++; + if (!(MWDTime % Global::iMWDdivider)) + { + MWDTime = 0; + SendData(); + ReadData(); + return 1; + } + } + else + { + WriteLog("Port COM: connection ERROR!"); + Close(); + // może spróbować się połączyć znowu? + 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; while (i < 6) @@ -257,298 +276,238 @@ void MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowa // wciskanie przycisków klawiatury /*PORT0*/ - if (maskData[0] & 0x02 && lastStateData[0] & 0x02) - KeyBoard('M', 1); // wyłączenie wyłącznika szybkiego - else - KeyBoard('M', 0); // monostabilny - if (maskData[0] & 0x04 && lastStateData[0] & 0x04) - { // impuls załączający wyłącznik szybki - KeyBoard(0x10, 1); // monostabilny - KeyBoard('M', 1); - } - else - { - KeyBoard('M', 0); - KeyBoard(0x10, 0); - } - if (maskData[0] & 0x08 && lastStateData[0] & 0x08) - KeyBoard('N', 1); // odblok nadmiarowego silników trakcyjnych - else - KeyBoard('N', 0); // monostabilny - if (maskData[0] & 0x20 && lastStateData[0] & 0x20) - { // odblok nadmiarowego przetwornicy, ogrzewania poc. - KeyBoard(0x11, 1); // różnicowego obwodów pomocniczych - KeyBoard('N', 1); // monostabilny - } - else - { - KeyBoard('N', 0); - KeyBoard(0x11, 0); - } - if (maskData[0] & 0x40 && lastStateData[0] & 0x40) - KeyBoard('L', 1); // wył. styczników liniowych - else - KeyBoard('L', 0); // monostabilny - if (maskData[0] & 0x80 && lastStateData[0] & 0x80) - KeyBoard(0x20, 1); // kasowanie czuwaka/SHP - else - KeyBoard(0x20, 0); // kasowanie czuwaka/SHP + if (maskData[0] & 0x02) if (lastStateData[0] & 0x02) KeyBoard('M', 1); // wyłączenie wyłącznika szybkiego + else KeyBoard('M', 0); // monostabilny + if (maskData[0] & 0x04) if (lastStateData[0] & 0x04) { // impuls załączający wyłącznik szybki + KeyBoard(0x10, 1); // monostabilny + KeyBoard('M', 1); + } + else { + KeyBoard('M', 0); + KeyBoard(0x10, 0); + } + if (maskData[0] & 0x08) if (lastStateData[0] & 0x08) KeyBoard('N', 1); // odblok nadmiarowego silników trakcyjnych + else KeyBoard('N', 0); // monostabilny + if (maskData[0] & 0x20) if (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) if (lastStateData[0] & 0x40) KeyBoard('L', 1); // wył. styczników liniowych + else KeyBoard('L', 0); // monostabilny + if (maskData[0] & 0x80) if (lastStateData[0] & 0x80) KeyBoard(0x20, 1); // kasowanie czuwaka/SHP + else KeyBoard(0x20, 0); // kasowanie czuwaka/SHP /*PORT1*/ // puszczanie przycisku bistabilnego klawiatury - if (maskSwitch[1] & 0x02) - { - if (bitSwitch[1] & 0x02) - { - KeyBoard('X', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('X', 0); - maskSwitch[1] &= ~0x02; - } - if (maskSwitch[1] & 0x04) - { - if (bitSwitch[1] & 0x04) - { - KeyBoard('C', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('C', 0); - maskSwitch[1] &= ~0x04; - } - if (maskSwitch[1] & 0x10) - { - if (bitSwitch[1] & 0x10) - { - KeyBoard('H', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('H', 0); - maskSwitch[1] &= ~0x10; - } - if (maskSwitch[1] & 0x20 || maskSwitch[1] & 0x40) - { - if (maskSwitch[1] & 0x20) - KeyBoard(0x10, 0); - if (maskSwitch[1] & 0x40) - KeyBoard(0x11, 0); - KeyBoard('B', 0); - maskSwitch[1] &= ~0x60; - } - if (maskSwitch[1] & 0x80) - { - if (bitSwitch[1] & 0x80) - { - KeyBoard('F', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('F', 0); - maskSwitch[1] &= ~0x80; - } + if (maskSwitch[1] & 0x02) { + if (bitSwitch[1] & 0x02) { + KeyBoard('X', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('X', 0); + maskSwitch[1] &= ~0x02; + } + if (maskSwitch[1] & 0x04) { + if (bitSwitch[1] & 0x04) { + KeyBoard('C', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('C', 0); + maskSwitch[1] &= ~0x04; + } + if (maskSwitch[1] & 0x10) { + if (bitSwitch[1] & 0x10) { + KeyBoard('H', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('H', 0); + maskSwitch[1] &= ~0x10; + } + if (maskSwitch[1] & 0x20 || maskSwitch[1] & 0x40) { + if (maskSwitch[1] & 0x20) KeyBoard(0x10, 0); + if (maskSwitch[1] & 0x40) KeyBoard(0x11, 0); + KeyBoard('B', 0); + maskSwitch[1] &= ~0x60; + } + if (maskSwitch[1] & 0x80) { + if (bitSwitch[1] & 0x80) { + KeyBoard('F', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('F', 0); + maskSwitch[1] &= ~0x80; + } - if (maskData[1] & 0x02 && lastStateData[1] & 0x02) - { // przetwornica - KeyBoard(0x10, 1); // bistabilny - KeyBoard('X', 1); - maskSwitch[1] |= 0x02; - bitSwitch[1] |= 0x02; - } - else - { - maskSwitch[1] |= 0x02; - bitSwitch[1] &= ~0x02; - KeyBoard('X', 1); - } - if (maskData[1] & 0x04 && lastStateData[1] & 0x04) - { // sprężarka - KeyBoard(0x10, 1); // bistabilny - KeyBoard('C', 1); - maskSwitch[1] |= 0x04; - bitSwitch[1] |= 0x04; - } - else - { - maskSwitch[1] |= 0x04; - bitSwitch[1] &= ~0x04; - KeyBoard('C', 1); - } - if (maskData[1] & 0x08 && lastStateData[1] & 0x08) - KeyBoard('S', 1); // piasecznica - else - KeyBoard('S', 0); // monostabilny - if (maskData[1] & 0x10 && lastStateData[1] & 0x10) - { // ogrzewanie składu - KeyBoard(0x11, 1); // bistabilny - KeyBoard('H', 1); - maskSwitch[1] |= 0x10; - bitSwitch[1] |= 0x10; - } - else - { - maskSwitch[1] |= 0x10; - bitSwitch[1] &= ~0x10; - KeyBoard('H', 1); - } - if (maskData[1] & 0x20 || maskData[1] & 0x40) - { // przełącznik hamowania - if (lastStateData[1] & 0x20) - { // Shift+B - KeyBoard(0x10, 1); - maskSwitch[1] |= 0x20; - } - else if (lastStateData[1] & 0x40) - { // Ctrl+B - KeyBoard(0x11, 1); - maskSwitch[1] |= 0x40; - } - KeyBoard('B', 1); - } - if (maskData[1] & 0x80 && lastStateData[1] & 0x80) - { // rozruch wysoki/niski - KeyBoard(0x10, 1); // bistabilny - KeyBoard('F', 1); - maskSwitch[1] |= 0x80; - bitSwitch[1] |= 0x80; - } - else - { - maskSwitch[1] |= 0x80; - bitSwitch[1] &= ~0x80; - KeyBoard('F', 1); - } + if (maskData[1] & 0x02) if (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) 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) - { // pantograf przedni - KeyBoard(0x10, 1); // bistabilny - KeyBoard('P', 1); - maskSwitch[2] |= 0x01; - bitSwitch[2] |= 0x01; - } - else - { - maskSwitch[2] |= 0x01; - bitSwitch[2] &= ~0x01; - KeyBoard('P', 1); - } - if (maskData[2] & 0x02 && lastStateData[2] & 0x02) - { // pantograf tylni - KeyBoard(0x10, 1); // bistabilny - KeyBoard('O', 1); - maskSwitch[2] |= 0x02; - bitSwitch[2] |= 0x02; - } - else - { - maskSwitch[2] |= 0x02; - bitSwitch[2] &= ~0x02; - KeyBoard('O', 1); - } - if (maskData[2] & 0x04 && lastStateData[2] & 0x04) - { // przyhamowanie przy poślizgu - KeyBoard(0x10, 1); // monostabilny - KeyBoard(0x0D, 1); - } - else - { + //PORT2 + if (maskSwitch[2] & 0x01) { + if (bitSwitch[2] & 0x01) { + KeyBoard('P', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('P', 0); + maskSwitch[2] &= ~0x01; + } + if (maskSwitch[2] & 0x02) { + if (bitSwitch[2] & 0x02) { + KeyBoard('O', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('O', 0); + maskSwitch[2] &= ~0x02; + } - 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) - { - if (bitSwitch[3] & 0x01) - { - KeyBoard('J', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('J', 0); - maskSwitch[3] &= ~0x01; - } + KeyBoard(0x0D, 0); + KeyBoard(0x10, 0); + } + /*if(maskData[2] & 0x08) if (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) 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 - KeyBoard(0x10, 1); // bistabilny - KeyBoard('J', 1); - maskSwitch[3] |= 0x01; - bitSwitch[3] |= 0x01; - } - else - { - maskSwitch[3] |= 0x01; - bitSwitch[3] &= ~0x01; - KeyBoard('J', 1); - } + + //PORT3 + + if (maskSwitch[3] & 0x01) { + if (bitSwitch[3] & 0x01) { + KeyBoard('J', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('J', 0); + maskSwitch[3] &= ~0x01; + } + + if (maskData[3] & 0x01) 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); @@ -790,7 +749,7 @@ void MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowa WriteDataBuff[6] &= ~(1 << 3); } -void MWDComm::KeyBoard(int key, bool s) // emulacja klawiatury +void TMWDComm::KeyBoard(int key, bool s) // emulacja klawiatury { INPUT ip; // Set up a generic keyboard event. diff --git a/Console/MWD.h b/Console/MWD.h index 5963c08b..ad35ee87 100644 --- a/Console/MWD.h +++ b/Console/MWD.h @@ -19,48 +19,53 @@ http://mozilla.org/MPL/2.0/. #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 long DWORD; -class MWDComm +class TMWDComm { - private: - int MWDTime; // - char lastStateData[6], maskData[6], maskSwitch[6], bitSwitch[6]; - int bocznik, nastawnik, kierunek; - char bnkMask; +private: + int MWDTime; // + char lastStateData[6], maskData[6], maskSwitch[6], bitSwitch[6]; + int bocznik, nastawnik, kierunek; + char bnkMask; - bool ReadData(); // BYTE *pReadDataBuff); - bool SendData(); // BYTE *pWriteDataBuff); - void CheckData(); // sprawdzanie zmian wejść i kontrola mazaków HASLERA - void KeyBoard(int key, bool s); + bool ReadData(); //BYTE *pReadDataBuff); + bool SendData(); //BYTE *pWriteDataBuff); + void CheckData(); //sprawdzanie zmian wejść i kontrola mazaków HASLERA + void KeyBoard(int key, bool s); - bool bRysik1H; - bool bRysik1L; - bool bRysik2H; - bool bRysik2L; + //void CheckData2(); - public: - bool Open(); // Otwarcie portu - bool Close(); // Zamknięcie portu - bool Run(); // Obsługa portu - bool GetMWDState(); // sprawdź czy port jest otwarty, 0 zamknięty, 1 otwarty + bool bRysik1H; + bool bRysik1L; + bool bRysik2H; + bool bRysik2L; - // zmienne do rysików HASLERA - bool bSHPstate; - bool bPrzejazdSHP; - bool bKabina1; - bool bKabina2; - bool bHamowanie; - bool bCzuwak; +public: + bool Open(); // Otwarcie portu + bool Close(); // Zamknięcie portu + bool Run(); // Obsługa portu + bool GetMWDState(); // sprawdź czy port jest otwarty, 0 zamknięty, 1 otwarty - 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; + + unsigned int uiAnalog[4]; // trzymanie danych z wejść analogowych - BYTE ReadDataBuff[17]; // bufory danych - BYTE WriteDataBuff[31]; + BYTE ReadDataBuff[BYTETOREAD]; //17]; // bufory danych + BYTE WriteDataBuff[BYTETOWRITE]; //31]; - MWDComm(); // konstruktor - ~MWDComm(); // destruktor + TMWDComm(); // konstruktor + ~TMWDComm(); // destruktor }; #endif diff --git a/Globals.cpp b/Globals.cpp index 348fa827..d8cabf78 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -191,17 +191,20 @@ int Global::iBpp = 32; // chyba już nie używa się kart, na których 16bpp co //randomizacja std::mt19937 Global::random_engine = std::mt19937(std::time(NULL)); // maciek001: konfiguracja wstępna portu COM -bool Global::bMWDdebugEnable = false; -bool Global::bMWDInputDataEnable = false; -unsigned int Global::iMWDBaudrate = 500000; -std::string Global::sMWDPortId = "COM1"; // nazwa portu z którego korzystamy - na razie nie działa -bool Global::bMWDBreakEnable = false; // zmienić na FALSE!!! jak już będzie działać wczytywanie z *.ini -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) -double Global::fMWDzg[2] = {0.9, 1023}; -double Global::fMWDpg[2] = {0.8, 1023}; -double Global::fMWDph[2] = {0.6, 1023}; -double Global::fMWDvolt[2] = {4000, 1023}; -double Global::fMWDamp[2] = {800, 1023}; +bool Global::bMWDmasterEnable = false; // główne włączenie portu! +bool Global::bMWDdebugEnable = false; // włącz dodawanie do logu +int Global::iMWDDebugMode = 0; // co ma wyświetlać w logu +std::string Global::sMWDPortId = "COM1"; // nazwa portu z którego korzystamy +unsigned long int Global::iMWDBaudrate = 9600; // prędkość transmisji danych +bool Global::bMWDInputEnable = false; // włącz wejścia +bool Global::bMWDBreakEnable = false; // włącz wejścia analogowe +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::fMWDzg[2] = { 0.9, 1023 }; +double Global::fMWDpg[2] = { 0.8, 1023 }; +double Global::fMWDph[2] = { 0.6, 1023 }; +double Global::fMWDvolt[2] = { 4000, 1023 }; +double Global::fMWDamp[2] = { 800, 1023 }; +int Global::iMWDdivider = 5; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- @@ -806,93 +809,94 @@ void Global::ConfigParse(cParser &Parser) >> Global::Background[2]; // b } // maciek001: ustawienia MWD - else if (token == "mwddebug") - { // czy włączyć obslugę hamulców - Parser.getTokens(); - Parser >> token; - bMWDdebugEnable = (token == "yes"); - } - else if (token == "comportname") - { - Parser.getTokens(); - Parser >> sMWDPortId; - if (bMWDdebugEnable) - WriteLog("PortName " + sMWDPortId); - } - else if (token == "mwdbaudrate") - { // pobierz prędkość transmisji danych - Parser.getTokens(1, false); - Parser >> iMWDBaudrate; - if (bMWDdebugEnable) - WriteLog("PortName " + to_string(iMWDBaudrate)); - } - else if (token == "mwdbreakenable") - { // czy włączyć obsługę hamulców - Parser.getTokens(); - Parser >> token; - bMWDBreakEnable = (token == "yes"); - } - else if (token == "mwdinputenable") - { - Parser.getTokens(); - Parser >> token; - bMWDInputDataEnable = (token == "yes"); - } - else if (token == "mwdbreak") // wartość max dla potencjometru hamulca zasadniczego - { - Parser.getTokens(); - Parser >> token; - int i = stol_def(token, -1); // numer wejďż˝cia - if ((i >= 0) && (i <= 3)) - { - Parser.getTokens(3, false); - Parser >> fMWDAnalogCalib[i][0] // max -> 2^16 -1 - >> fMWDAnalogCalib[i][1] // min -> 0 - >> - fMWDAnalogCalib[i][2]; // rozdzielczość -> 255 maksymalna możliwa wartość z ADC - if (bMWDdebugEnable) - WriteLog("Break settings " + to_string(i) + ": " + - to_string(fMWDAnalogCalib[i][0]) + " " + - to_string(fMWDAnalogCalib[i][1]) + " " + - to_string(fMWDAnalogCalib[i][2])); - } - } - else if (token == "mwdzbiornikglowny") - { - Parser.getTokens(2, false); - Parser >> fMWDzg[0] >> fMWDzg[1]; - if (bMWDdebugEnable) - WriteLog("AirTank settings: " + to_string(fMWDzg[0]) + " " + to_string(fMWDzg[1])); - } - else if (token == "mwdprzewodglowny") - { - Parser.getTokens(2, false); - Parser >> fMWDpg[0] >> fMWDpg[1]; - if (bMWDdebugEnable) - WriteLog("MainAirPipe settings: " + to_string(fMWDpg[0]) + " " + - to_string(fMWDpg[1])); - } - else if (token == "mwdcylinderhamulcowy") - { - Parser.getTokens(2, false); - Parser >> fMWDph[0] >> fMWDph[1]; - if (bMWDdebugEnable) - WriteLog("AirPipe settings: " + to_string(fMWDph[0]) + " " + to_string(fMWDph[1])); - } - else if (token == "mwdwoltomierzwn") - { - Parser.getTokens(2, false); - Parser >> fMWDvolt[0] >> fMWDvolt[1]; - if (bMWDdebugEnable) - WriteLog("Volt settings: " + to_string(fMWDvolt[0]) + " " + to_string(fMWDvolt[1])); - } - else if (token == "mwdamperomierzwn") - { - Parser.getTokens(2, false); - Parser >> fMWDamp[0] >> fMWDamp[1]; - if (bMWDdebugEnable) - WriteLog("Amp settings: " + to_string(fMWDamp[0]) + " " + to_string(fMWDamp[1])); - } + else if (token == "mwdmasterenable") { // główne włączenie maszyny! + Parser.getTokens(); + Parser >> token; + bMWDmasterEnable = (token == "yes"); + if (bMWDdebugEnable) WriteLog("SerialPort Master Enable"); + } + else if (token == "mwddebugenable") { // logowanie pracy + Parser.getTokens(); + Parser >> token; + bMWDdebugEnable = (token == "yes"); + if (bMWDdebugEnable) WriteLog("MWD Debug Mode On"); + } + else if (token == "mwddebugmode") { // co ma być debugowane? + Parser.getTokens(1, false); + Parser >> iMWDDebugMode; + if (bMWDdebugEnable) WriteLog("Debug Mode = " + to_string(iMWDDebugMode)); + } + else if (token == "mwdcomportname") { // nazwa portu COM + Parser.getTokens(); + Parser >> sMWDPortId; + if (bMWDdebugEnable) WriteLog("PortName " + sMWDPortId); + } + else if (token == "mwdbaudrate") { // prędkość transmisji danych + Parser.getTokens(1, false); + Parser >> iMWDBaudrate; + if (bMWDdebugEnable) WriteLog("Baud rate = " + to_string((int)(iMWDBaudrate / 1000)) + (" kbps")); + } + else if (token == "mwdinputenable") { // włącz wejścia + Parser.getTokens(); + Parser >> token; + bMWDInputEnable = (token == "yes"); + if (bMWDdebugEnable && bMWDInputEnable) WriteLog("MWD Input Enable"); + } + else if (token == "mwdbreakenable") { // włącz obsługę hamulców + Parser.getTokens(); + Parser >> token; + bMWDBreakEnable = (token == "yes"); + if (bMWDdebugEnable && bMWDBreakEnable) WriteLog("MWD Break Enable"); + } + else if (token == "mwdmainbreakconfig") { // ustawienia hamulca zespolonego + Parser.getTokens(2, false); + Parser >> fMWDAnalogInCalib[0][0] >> fMWDAnalogInCalib[0][1]; + if (bMWDdebugEnable) WriteLog("Main break settings: " + to_string(fMWDAnalogInCalib[0][0]) + (" ") + to_string(fMWDAnalogInCalib[0][1])); + } + else if (token == "mwdlocbreakconfig") { // ustawienia hamulca lokomotywy + Parser.getTokens(2, false); + Parser >> fMWDAnalogInCalib[1][0] >> fMWDAnalogInCalib[1][1]; + if (bMWDdebugEnable) WriteLog("Locomotive break settings: " + to_string(fMWDAnalogInCalib[1][0]) + to_string(" ") + to_string(fMWDAnalogInCalib[1][1])); + } + else if (token == "mwdanalogin1config") { // ustawienia hamulca zespolonego + Parser.getTokens(2, false); + 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])); + } + else if (token == "mwdanalogin2config") { // ustawienia hamulca lokomotywy + Parser.getTokens(2, false); + 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 == "mwdmaintankpress") { // max ciśnienie w zbiorniku głownym i rozdzielczość + Parser.getTokens(2, false); + Parser >> fMWDzg[0] >> fMWDzg[1]; + if (bMWDdebugEnable) WriteLog("MainAirTank settings: " + to_string(fMWDzg[0]) + to_string(" ") + to_string(fMWDzg[1])); + } + else if (token == "mwdmainpipepress") { // max ciśnienie w przewodzie głownym i rozdzielczość + Parser.getTokens(2, false); + Parser >> fMWDpg[0] >> fMWDpg[1]; + if (bMWDdebugEnable) WriteLog("MainAirPipe settings: " + to_string(fMWDpg[0]) + to_string(" ") + to_string(fMWDpg[1])); + } + else if (token == "mwdbreakpress") { // max ciśnienie w hamulcach i rozdzielczość + Parser.getTokens(2, false); + Parser >> fMWDph[0] >> fMWDph[1]; + if (bMWDdebugEnable) WriteLog("AirPipe settings: " + to_string(fMWDph[0]) + to_string(" ") + to_string(fMWDph[1])); + } + else if (token == "mwdhivoltmeter") { // max napięcie na woltomierzu WN + Parser.getTokens(2, false); + Parser >> fMWDvolt[0] >> fMWDvolt[1]; + if (bMWDdebugEnable) WriteLog("VoltMeter settings: " + to_string(fMWDvolt[0]) + to_string(" ") + to_string(fMWDvolt[1])); + } + else if (token == "mwdhiampmeter") { + Parser.getTokens(2, false); + Parser >> fMWDamp[0] >> fMWDamp[1]; + if (bMWDdebugEnable) WriteLog("Amp settings: " + to_string(fMWDamp[0]) + to_string(" ") + to_string(fMWDamp[1])); + } + else if (token == "mwddivider") { + Parser.getTokens(1, false); + Parser >> iMWDdivider; + } } while ((token != "") && (token != "endconfig")); //(!Parser->EndOfFile) // na koniec trochę zależności if (!bLoadTraction) // wczytywanie drutów i słupów diff --git a/Globals.h b/Globals.h index 2793ed30..c2b2b708 100644 --- a/Globals.h +++ b/Globals.h @@ -333,16 +333,19 @@ class Global static double CutValueToRange(double min, double value, double max); // maciek001: zmienne dla MWD - static bool bMWDdebugEnable; - static unsigned int iMWDBaudrate; - static std::string sMWDPortId; - static bool bMWDBreakEnable; - static bool bMWDInputDataEnable; - static double fMWDAnalogCalib[4][3]; - static double fMWDzg[2]; - static double fMWDpg[2]; - static double fMWDph[2]; - static double fMWDvolt[2]; - static double fMWDamp[2]; + static bool bMWDmasterEnable; // główne włączenie portu COM + static bool bMWDdebugEnable; // logowanie pracy + static int iMWDDebugMode; + static std::string sMWDPortId; // nazwa portu COM + static unsigned long int iMWDBaudrate; // prędkość transmisji + static bool bMWDInputEnable; // włącz wejścia + static bool bMWDBreakEnable; // włącz wejścia analogowe (hamulce) + static double fMWDAnalogInCalib[4][2]; // ustawienia kranów hamulca zespolonego i dodatkowego - min i max + static double fMWDzg[2]; // max wartość wskazywana i max wartość generowana (rozdzielczość) + static double fMWDpg[2]; + static double fMWDph[2]; + static double fMWDvolt[2]; + static double fMWDamp[2]; + static int iMWDdivider; }; //--------------------------------------------------------------------------- diff --git a/Texture.h b/Texture.h index 168bdfe1..5779c7cc 100644 --- a/Texture.h +++ b/Texture.h @@ -25,7 +25,7 @@ struct opengl_texture { void load(); void create(); // 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 is_ready{ false }; // indicates the texture was processed and is ready for use std::string traits; // requested texture attributes: wrapping modes etc diff --git a/Train.cpp b/Train.cpp index 27010ef9..e557dcbe 100644 --- a/Train.cpp +++ b/Train.cpp @@ -3758,7 +3758,7 @@ bool TTrain::Update( double const Deltatime ) { if (DynamicObject->Mechanik ? (DynamicObject->Mechanik->AIControllFlag ? false : - Global::iFeedbackMode == 4 ) : + (Global::iFeedbackMode == 4 || (Global::bMWDmasterEnable && Global::bMWDBreakEnable))) : false) // nie blokujemy AI { // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba // Firleju: dlatego kasujemy i zastepujemy funkcją w Console @@ -3782,7 +3782,7 @@ bool TTrain::Update( double const Deltatime ) if (ggLocalBrake.SubModel) { if (DynamicObject->Mechanik ? - (DynamicObject->Mechanik->AIControllFlag ? false : Global::iFeedbackMode == 4) : + (DynamicObject->Mechanik->AIControllFlag ? false : (Global::iFeedbackMode == 4 || Global::bMWDmasterEnable)) : false) // nie blokujemy AI { // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba // Firleju: dlatego kasujemy i zastepujemy funkcją w Console