16
0
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:
firleju
2016-03-17 18:58:38 +01:00
parent 6c067afa1b
commit 1f939735ce
5 changed files with 96 additions and 38 deletions

View File

@@ -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)

View File

@@ -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);

View File

@@ -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)

View File

@@ -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);
};
//---------------------------------------------------------------------------

View File

@@ -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