mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-19 23:49:18 +02:00
1. Dodanie możliwości definicji kalibracji wyjść i wejść PWM jako funkcja piątego stopnia
2. Do użycia są dwa nowe słowa kluczowe w ini: calibrate5din, calibrate5dout oba z 6 parametrami 3. Przerzucenie calibracji wejść do Console z Train 4. Dodanie funkcji obcinającej zmienną do podanego zakresu
This commit is contained in:
23
Console.cpp
23
Console.cpp
@@ -197,7 +197,8 @@ void Console::BitsSet(int mask, int entry)
|
||||
int old = iBits; // poprzednie stany
|
||||
iBits |= mask;
|
||||
BitsUpdate(old ^ iBits); // 1 dla bitów zmienionych
|
||||
WriteLog("PoKeys::BitsSet: mask: " + AnsiString(mask) + " iBits: " + AnsiString(iBits));
|
||||
if (iMode == 4)
|
||||
WriteLog("PoKeys::BitsSet: mask: " + AnsiString(mask) + " iBits: " + AnsiString(iBits));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -288,10 +289,10 @@ void Console::ValueSet(int x, double y)
|
||||
if (PoKeys55[0])
|
||||
{
|
||||
PoKeys55[0]->PWM(
|
||||
x, (((Global::fCalibrateOut[x][3] * y) + Global::fCalibrateOut[x][2]) * y +
|
||||
Global::fCalibrateOut[x][1]) *
|
||||
y +
|
||||
Global::fCalibrateOut[x][0]); // zakres <0;1>
|
||||
x, (((((Global::fCalibrateOut[x][5] * y) + Global::fCalibrateOut[x][4]) * y +
|
||||
Global::fCalibrateOut[x][3]) * y + Global::fCalibrateOut[x][2]) * y +
|
||||
Global::fCalibrateOut[x][1]) * y +
|
||||
Global::fCalibrateOut[x][0]); // zakres <0;1>
|
||||
}
|
||||
};
|
||||
|
||||
@@ -320,6 +321,18 @@ float Console::AnalogGet(int x)
|
||||
return -1.0;
|
||||
};
|
||||
|
||||
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 NULL;
|
||||
};
|
||||
|
||||
unsigned char Console::DigitalGet(int x)
|
||||
{ // pobranie wartości cyfrowej
|
||||
if (iMode == 4)
|
||||
|
||||
@@ -51,6 +51,7 @@ class Console
|
||||
static void ValueSet(int x, double y);
|
||||
static void Update();
|
||||
static float AnalogGet(int x);
|
||||
static float AnalogCalibrateGet(int x);
|
||||
static unsigned char DigitalGet(int x);
|
||||
static void OnKeyDown(int k);
|
||||
static void OnKeyUp(int k);
|
||||
|
||||
63
Globals.cpp
63
Globals.cpp
@@ -161,15 +161,19 @@ bool Global::bDecompressDDS = false; // czy programowa dekompresja DDS
|
||||
|
||||
// parametry do kalibracji
|
||||
// kolejno wspó³czynniki dla potêg 0, 1, 2, 3 wartoœci odczytanej z urz¹dzenia
|
||||
double Global::fCalibrateIn[6][4] = {
|
||||
{0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}};
|
||||
double Global::fCalibrateOut[7][4] = {{0, 1, 0, 0},
|
||||
{0, 1, 0, 0},
|
||||
{0, 1, 0, 0},
|
||||
{0, 1, 0, 0},
|
||||
{0, 1, 0, 0},
|
||||
{0, 1, 0, 0},
|
||||
{0, 1, 0, 0}};
|
||||
double Global::fCalibrateIn[6][6] = {{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0}};
|
||||
double Global::fCalibrateOut[7][6] = {{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0},
|
||||
{0, 1, 0, 0, 0, 0}};
|
||||
|
||||
// parametry przejœciowe (do usuniêcia)
|
||||
// bool Global::bTimeChange=false; //Ra: ZiomalCl wy³¹czy³ star¹ wersjê nocy
|
||||
@@ -442,7 +446,21 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp)
|
||||
fCalibrateIn[i][1] = GetNextSymbol().ToDouble(); // mno¿nik
|
||||
fCalibrateIn[i][2] = GetNextSymbol().ToDouble(); // mno¿nik dla kwadratu
|
||||
fCalibrateIn[i][3] = GetNextSymbol().ToDouble(); // mno¿nik dla szeœcianu
|
||||
}
|
||||
fCalibrateIn[i][4] = 0.0; // mno¿nik 4 potêgi
|
||||
fCalibrateIn[i][5] = 0.0; // mno¿nik 5 potêgi
|
||||
}
|
||||
else if (str == AnsiString("calibrate5din")) // parametry kalibracji wejϾ
|
||||
{ //
|
||||
i = GetNextSymbol().ToIntDef(-1); // numer wejœcia
|
||||
if ((i < 0) || (i > 5))
|
||||
i = 5; // na ostatni, bo i tak trzeba pomin¹æ wartoœci
|
||||
fCalibrateIn[i][0] = GetNextSymbol().ToDouble(); // wyraz wolny
|
||||
fCalibrateIn[i][1] = GetNextSymbol().ToDouble(); // mno¿nik
|
||||
fCalibrateIn[i][2] = GetNextSymbol().ToDouble(); // mno¿nik dla kwadratu
|
||||
fCalibrateIn[i][3] = GetNextSymbol().ToDouble(); // mno¿nik dla szeœcianu
|
||||
fCalibrateIn[i][4] = GetNextSymbol().ToDouble(); // mno¿nik 4 potêgi
|
||||
fCalibrateIn[i][5] = GetNextSymbol().ToDouble(); // mno¿nik 5 potêgi
|
||||
}
|
||||
else if (str == AnsiString("calibrateout")) // parametry kalibracji wyjϾ
|
||||
{ //
|
||||
i = GetNextSymbol().ToIntDef(-1); // numer wejœcia
|
||||
@@ -452,7 +470,21 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp)
|
||||
fCalibrateOut[i][1] = GetNextSymbol().ToDouble(); // mno¿nik liniowy
|
||||
fCalibrateOut[i][2] = GetNextSymbol().ToDouble(); // mno¿nik dla kwadratu
|
||||
fCalibrateOut[i][3] = GetNextSymbol().ToDouble(); // mno¿nik dla szeœcianu
|
||||
fCalibrateOut[i][4] = 0.0; // mno¿nik dla 4 potêgi
|
||||
fCalibrateOut[i][5] = 0.0; // mno¿nik dla 5 potêgi
|
||||
}
|
||||
else if (str == AnsiString("calibrate5dout")) // parametry kalibracji wyjϾ
|
||||
{ //
|
||||
i = GetNextSymbol().ToIntDef(-1); // numer wejœcia
|
||||
if ((i < 0) || (i > 6))
|
||||
i = 6; // na ostatni, bo i tak trzeba pomin¹æ wartoœci
|
||||
fCalibrateOut[i][0] = GetNextSymbol().ToDouble(); // wyraz wolny
|
||||
fCalibrateOut[i][1] = GetNextSymbol().ToDouble(); // mno¿nik liniowy
|
||||
fCalibrateOut[i][2] = GetNextSymbol().ToDouble(); // mno¿nik dla kwadratu
|
||||
fCalibrateOut[i][3] = GetNextSymbol().ToDouble(); // mno¿nik dla szeœcianu
|
||||
fCalibrateOut[i][4] = GetNextSymbol().ToDouble(); // mno¿nik dla 4 potêgi
|
||||
fCalibrateOut[i][5] = GetNextSymbol().ToDouble(); // mno¿nik dla 5 potêgi
|
||||
}
|
||||
else if (str == AnsiString("brakestep")) // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
|
||||
fBrakeStep = GetNextSymbol().ToDouble();
|
||||
else if (str ==
|
||||
@@ -848,7 +880,7 @@ AnsiString Global::Bezogonkow(AnsiString str, bool _)
|
||||
if (str[i] == '_') // nazwy stacji nie mog¹ zawieraæ spacji
|
||||
str[i] = ' '; // wiêc trzeba wyœwietlaæ inaczej
|
||||
return str;
|
||||
}
|
||||
};
|
||||
|
||||
double Global::Min0RSpeed(double vel1, double vel2)
|
||||
{ // rozszerzenie funkcji Min0R o wartoœci -1.0
|
||||
@@ -857,7 +889,14 @@ double Global::Min0RSpeed(double vel1, double vel2)
|
||||
if (vel2 == -1.0)
|
||||
vel2 = std::numeric_limits<double>::max();
|
||||
return Min0R(vel1, vel2);
|
||||
}
|
||||
};
|
||||
|
||||
double Global::CutValueToRange(double min, double value, double max)
|
||||
{ // przycinanie wartosci do podanych granic
|
||||
value = Max0R(value, min);
|
||||
value = Min0R(value, max);
|
||||
return value;
|
||||
};
|
||||
|
||||
|
||||
#pragma package(smart_init)
|
||||
|
||||
@@ -296,8 +296,8 @@ class Global
|
||||
static double fRadiusFactor; // wspó³czynnik zmiany promienia
|
||||
static TCamera *pCamera; // parametry kamery
|
||||
static TDynamicObject *pUserDynamic; // pojazd u¿ytkownika, renderowany bez trzêsienia
|
||||
static double fCalibrateIn[6][4]; // parametry kalibracyjne wejϾ z pulpitu
|
||||
static double fCalibrateOut[7][4]; // parametry kalibracyjne wyjϾ dla pulpitu
|
||||
static double fCalibrateIn[6][6]; // parametry kalibracyjne wejϾ z pulpitu
|
||||
static double fCalibrateOut[7][6]; // parametry kalibracyjne wyjϾ dla pulpitu
|
||||
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
|
||||
@@ -316,6 +316,7 @@ class Global
|
||||
static bool DoEvents();
|
||||
static AnsiString Bezogonkow(AnsiString str, bool _ = false);
|
||||
static double Min0RSpeed(double vel1, double vel2);
|
||||
static double CutValueToRange(double min, double value, double max);
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
42
Train.cpp
42
Train.cpp
@@ -3716,22 +3716,24 @@ bool TTrain::Update()
|
||||
if (ggBrakeCtrl.SubModel)
|
||||
{
|
||||
if (DynamicObject->Mechanik ?
|
||||
(DynamicObject->Mechanik->AIControllFlag ? false : Global::iFeedbackMode == 4) :
|
||||
(DynamicObject->Mechanik->AIControllFlag ? false :
|
||||
Global::iFeedbackMode == 4 ) :
|
||||
false) // nie blokujemy AI
|
||||
{ // Ra: nie najlepsze miejsce, ale na pocz¹tek gdzieœ to daæ trzeba
|
||||
double b = Console::AnalogGet(0); // odczyt z pulpitu i modyfikacja pozycji kranu
|
||||
if ((b >= 0.0) && ((mvOccupied->BrakeHandle == FV4a) ||
|
||||
(mvOccupied->BrakeHandle ==
|
||||
FVel6))) // mo¿e mo¿na usun¹æ ograniczenie do FV4a i FVel6?
|
||||
// Firleju: dlatego kasujemy i zastepujemy funkcj¹ w Console
|
||||
// double b = Console::AnalogGet(0); // odczyt z pulpitu i modyfikacja pozycji kranu
|
||||
if (double b = Console::AnalogCalibrateGet(0) && ((mvOccupied->BrakeHandle == FV4a) ||
|
||||
(mvOccupied->BrakeHandle == FVel6))) // mo¿e mo¿na usun¹æ ograniczenie do FV4a i FVel6?
|
||||
{
|
||||
b = (((Global::fCalibrateIn[0][3] * b) + Global::fCalibrateIn[0][2]) * b +
|
||||
Global::fCalibrateIn[0][1]) *
|
||||
b +
|
||||
Global::fCalibrateIn[0][0];
|
||||
if (b < -2.0)
|
||||
// b = (((Global::fCalibrateIn[0][3] * b) + Global::fCalibrateIn[0][2]) * b +
|
||||
// Global::fCalibrateIn[0][1]) *b +
|
||||
// Global::fCalibrateIn[0][0];
|
||||
|
||||
b = Global::CutValueToRange(-2.0, b, mvOccupied->BrakeCtrlPosNo); // przyciêcie zmiennej do granic
|
||||
/*if (b < -2.0)
|
||||
b = -2.0;
|
||||
else if (b > mvOccupied->BrakeCtrlPosNo)
|
||||
b = mvOccupied->BrakeCtrlPosNo;
|
||||
b = mvOccupied->BrakeCtrlPosNo;*/
|
||||
ggBrakeCtrl.UpdateValue(b); // przesów bez zaokr¹glenia
|
||||
mvOccupied->BrakeLevelSet(b);
|
||||
}
|
||||
@@ -3749,17 +3751,19 @@ bool TTrain::Update()
|
||||
(DynamicObject->Mechanik->AIControllFlag ? false : Global::iFeedbackMode == 4) :
|
||||
false) // nie blokujemy AI
|
||||
{ // Ra: nie najlepsze miejsce, ale na pocz¹tek gdzieœ to daæ trzeba
|
||||
double b = Console::AnalogGet(1); // odczyt z pulpitu i modyfikacja pozycji kranu
|
||||
if ((b >= 0.0) && (mvOccupied->BrakeLocHandle == FD1))
|
||||
// Firleju: dlatego kasujemy i zastepujemy funkcj¹ w Console
|
||||
// double b = Console::AnalogGet(1); // odczyt z pulpitu i modyfikacja pozycji kranu
|
||||
if (double b = Console::AnalogCalibrateGet(1) && (mvOccupied->BrakeLocHandle == FD1))
|
||||
{
|
||||
b = (((Global::fCalibrateIn[1][3] * b) + Global::fCalibrateIn[1][2]) * b +
|
||||
Global::fCalibrateIn[1][1]) *
|
||||
b +
|
||||
Global::fCalibrateIn[1][0];
|
||||
if (b < 0.0)
|
||||
//b = (((Global::fCalibrateIn[1][3] * b) + Global::fCalibrateIn[1][2]) * b +
|
||||
// Global::fCalibrateIn[1][1]) *
|
||||
// b +
|
||||
// Global::fCalibrateIn[1][0];
|
||||
b = Global::CutValueToRange(0.0, b, Hamulce::LocalBrakePosNo); // przyciêcie zmiennej do granic
|
||||
/*if (b < 0.0)
|
||||
b = 0.0;
|
||||
else if (b > Hamulce::LocalBrakePosNo)
|
||||
b = Hamulce::LocalBrakePosNo;
|
||||
b = Hamulce::LocalBrakePosNo;*/
|
||||
ggLocalBrake.UpdateValue(b); // przesów bez zaokr¹glenia
|
||||
mvOccupied->LocalBrakePos =
|
||||
int(1.09 * b); // sposób zaokr¹glania jest do ustalenia
|
||||
|
||||
Reference in New Issue
Block a user