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