mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-18 08:59:18 +02:00
Merge branch 'tmj-dev' into nogfx
This commit is contained in:
158
Driver.cpp
158
Driver.cpp
@@ -187,7 +187,7 @@ void TSpeedPos::CommandCheck()
|
||||
}
|
||||
};
|
||||
|
||||
bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len, TOrders const &Orders )
|
||||
bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len )
|
||||
{ // przeliczenie odległości od punktu (*p), w kierunku (*dir), zaczynając od pojazdu
|
||||
// dla kolejnych pozycji podawane są współrzędne poprzedniego obiektu w (*p)
|
||||
vector3 v = vPos - *p; // wektor od poprzedniego obiektu (albo pojazdu) do punktu zmiany
|
||||
@@ -253,19 +253,6 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len, TOrders const &Ord
|
||||
|
||||
if( trTrack->iCategoryFlag & 1 ) {
|
||||
// railways
|
||||
/*
|
||||
if( ( iFlags & spElapsed ) == 0 ) {
|
||||
// jeśli nie wjechał
|
||||
// TODO: remove this block when the detection of vehicles ahead is working properly
|
||||
if( false == trTrack->Dynamics.empty() ) {
|
||||
// to zabronić wjazdu (chyba że ten z przodu też jedzie prosto)
|
||||
fVelNext = 25.0; // can't force full stop as it can prevent vehicles from leaving the track. slow down should be enough to ensure slow enough movement to stop
|
||||
if( Global::iWriteLogEnabled & 8 ) {
|
||||
WriteLog( "Track " + trTrack->NameGet() + " is occupied. Vehicle count: " + std::to_string( trTrack->Dynamics.size() ) + ", distance: " + std::to_string( fDist ) + " m." );
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
if( iFlags & spSwitch ) {
|
||||
// jeśli odcinek zmienny
|
||||
if( ( ( trTrack->GetSwitchState() & 1 ) != 0 ) !=
|
||||
@@ -701,7 +688,7 @@ void TController::TableCheck(double fDistance)
|
||||
{ // aktualizacja rekordów z wyjątkiem ostatniego
|
||||
if (sSpeedTable[i].iFlags & spEnabled) // jeśli pozycja istotna
|
||||
{
|
||||
if (sSpeedTable[i].Update(&pos, &dir, len, OrderCurrentGet()))
|
||||
if(sSpeedTable[i].Update( &pos, &dir, len ))
|
||||
{
|
||||
if( Global::iWriteLogEnabled & 8 ) {
|
||||
WriteLog( "Speed table for " + OwnerName() + " detected switch change at " + sSpeedTable[ i ].trTrack->NameGet() + " (generating fresh trace)" );
|
||||
@@ -744,7 +731,7 @@ void TController::TableCheck(double fDistance)
|
||||
}
|
||||
}
|
||||
}
|
||||
sSpeedTable[iLast].Update(&pos, &dir, len, OrderCurrentGet()); // aktualizacja ostatniego
|
||||
sSpeedTable[iLast].Update( &pos, &dir, len ); // aktualizacja ostatniego
|
||||
// WriteLog("TableCheck: Upate last track. Dist=" + AnsiString(sSpeedTable[iLast].fDist));
|
||||
if( sSpeedTable[ iLast ].fDist < fDistance ) {
|
||||
TableTraceRoute( fDistance, pVehicles[ 1 ] ); // doskanowanie dalszego odcinka
|
||||
@@ -1736,7 +1723,41 @@ void TController::AutoRewident()
|
||||
fAccThreshold = -fBrake_a0[BrakeAccTableSize] - 1 * fBrake_a1[BrakeAccTableSize];
|
||||
fBrakeReaction = 1.00 + fLength*0.005;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
double TController::ESMVelocity(bool Main)
|
||||
{
|
||||
double fCurrentCoeff = 0.9;
|
||||
double fFrictionCoeff = 0.85;
|
||||
double ESMVel = 9999;
|
||||
int MCPN = mvControlling->MainCtrlActualPos;
|
||||
int SCPN = mvControlling->ScndCtrlActualPos;
|
||||
if (Main)
|
||||
MCPN += 1;
|
||||
else
|
||||
SCPN += 1;
|
||||
if ((mvControlling->RList[MCPN].ScndAct < 255)&&(mvControlling->ScndCtrlActualPos==0))
|
||||
SCPN = mvControlling->RList[MCPN].ScndAct;
|
||||
double FrictionMax = mvControlling->Mass*9.81*mvControlling->Adhesive(mvControlling->RunningTrack.friction)*fFrictionCoeff;
|
||||
double IF = mvControlling->Imax;
|
||||
double MS = 0;
|
||||
double Fmax = 0;
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
MS = mvControlling->MomentumF(IF, IF, SCPN);
|
||||
Fmax = MS * mvControlling->RList[MCPN].Bn*mvControlling->RList[MCPN].Mn * 2 / mvControlling->WheelDiameter * mvControlling->Transmision.Ratio;
|
||||
IF = 0.5*IF*(1 + FrictionMax/Fmax);
|
||||
}
|
||||
IF = std::min(IF, mvControlling->Imax*fCurrentCoeff);
|
||||
double R = mvControlling->RList[MCPN].R + mvControlling->CircuitRes + mvControlling->RList[MCPN].Mn*mvControlling->WindingRes;
|
||||
double pole = mvControlling->MotorParam[SCPN].fi *
|
||||
std::max(abs(IF) / (abs(IF) + mvControlling->MotorParam[SCPN].Isat) - mvControlling->MotorParam[SCPN].fi0, 0.0);
|
||||
double Us = abs(mvControlling->Voltage) - IF*R;
|
||||
double ns = std::max(0.0, Us / (pole*mvControlling->RList[MCPN].Mn));
|
||||
ESMVel = ns * mvControlling->WheelDiameter*M_PI*3.6/mvControlling->Transmision.Ratio;
|
||||
return ESMVel;
|
||||
}
|
||||
;
|
||||
|
||||
int TController::CheckDirection() {
|
||||
|
||||
@@ -2486,51 +2507,64 @@ bool TController::IncSpeed()
|
||||
(mvControlling->StLinFlag)) // youBy polecił dodać 2012-09-08 v367
|
||||
// na pozycji 0 przejdzie, a na pozostałych będzie czekać, aż się załączą liniowe
|
||||
// (zgaśnie DelayCtrlFlag)
|
||||
if (Ready || (iDrivigFlags & movePress))
|
||||
if (fabs(mvControlling->Im) <
|
||||
(fReady < 0.4 ? mvControlling->Imin : mvControlling->IminLo))
|
||||
{ // Ra: wywalał nadmiarowy, bo Im może być ujemne; jak nie odhamowany, to nie
|
||||
// przesadzać z prądem
|
||||
if ((mvOccupied->Vel <= 30) ||
|
||||
(mvControlling->Imax > mvControlling->ImaxLo) ||
|
||||
(fVoltage + fVoltage <
|
||||
mvControlling->EnginePowerSource.CollectorParameters.MinV +
|
||||
mvControlling->EnginePowerSource.CollectorParameters.MaxV))
|
||||
{ // bocznik na szeregowej przy ciezkich bruttach albo przy wysokim rozruchu
|
||||
// pod górę albo przy niskim napięciu
|
||||
if (mvControlling->MainCtrlPos ?
|
||||
mvControlling->RList[mvControlling->MainCtrlPos].R > 0.0 :
|
||||
true) // oporowa
|
||||
{
|
||||
OK = (mvControlling->DelayCtrlFlag ?
|
||||
true :
|
||||
mvControlling->IncMainCtrl(1)); // kręcimy nastawnik jazdy
|
||||
if ((OK) &&
|
||||
(mvControlling->MainCtrlPos ==
|
||||
1)) // czekaj na 1 pozycji, zanim się nie włączą liniowe
|
||||
iDrivigFlags |= moveIncSpeed;
|
||||
else
|
||||
iDrivigFlags &= ~moveIncSpeed; // usunięcie flagi czekania
|
||||
}
|
||||
else // jeśli bezoporowa (z wyjątekiem 0)
|
||||
OK = false; // to dać bocznik
|
||||
}
|
||||
else
|
||||
{ // przekroczone 30km/h, można wejść na jazdę równoległą
|
||||
if (mvControlling->ScndCtrlPos) // jeśli ustawiony bocznik
|
||||
if (mvControlling->MainCtrlPos <
|
||||
mvControlling->MainCtrlPosNo - 1) // a nie jest ostatnia pozycja
|
||||
mvControlling->DecScndCtrl(2); // to bocznik na zero po chamsku
|
||||
// (ktoś miał to poprawić...)
|
||||
OK = mvControlling->IncMainCtrl(1);
|
||||
}
|
||||
if ((mvControlling->MainCtrlPos > 2) &&
|
||||
(mvControlling->Im == 0)) // brak prądu na dalszych pozycjach
|
||||
Need_TryAgain = true; // nie załączona lokomotywa albo wywalił
|
||||
// nadmiarowy
|
||||
else if (!OK) // nie da się wrzucić kolejnej pozycji
|
||||
OK = mvControlling->IncScndCtrl(1); // to dać bocznik
|
||||
}
|
||||
if (Ready || (iDrivigFlags & movePress))
|
||||
{
|
||||
bool scndctrl = ((mvOccupied->Vel <= 30) ||
|
||||
(mvControlling->Imax > mvControlling->ImaxLo) ||
|
||||
(fVoltage + fVoltage <
|
||||
mvControlling->EnginePowerSource.CollectorParameters.MinV +
|
||||
mvControlling->EnginePowerSource.CollectorParameters.MaxV) ||
|
||||
(mvControlling->MainCtrlPos == mvControlling->MainCtrlPosNo));
|
||||
scndctrl = ((scndctrl) && (mvControlling->MainCtrlPos > 1) && (mvControlling->RList[mvControlling->MainCtrlActualPos].R < 0.01)&& (mvControlling->ScndCtrlPos != mvControlling->ScndCtrlPosNo));
|
||||
double Vs = 99999;
|
||||
if((mvControlling->MainCtrlPos != mvControlling->MainCtrlPosNo)||(mvControlling->ScndCtrlPos!=mvControlling->ScndCtrlPosNo))
|
||||
Vs = ESMVelocity(!scndctrl);
|
||||
|
||||
if ((fabs(mvControlling->Im) <
|
||||
(fReady < 0.4 ? mvControlling->Imin : mvControlling->IminLo))||(mvControlling->Vel>Vs))
|
||||
{ // Ra: wywalał nadmiarowy, bo Im może być ujemne; jak nie odhamowany, to nie
|
||||
// przesadzać z prądem
|
||||
if ((mvOccupied->Vel <= 30) ||
|
||||
(mvControlling->Imax > mvControlling->ImaxLo) ||
|
||||
(fVoltage + fVoltage <
|
||||
mvControlling->EnginePowerSource.CollectorParameters.MinV +
|
||||
mvControlling->EnginePowerSource.CollectorParameters.MaxV))
|
||||
{ // bocznik na szeregowej przy ciezkich bruttach albo przy wysokim rozruchu
|
||||
// pod górę albo przy niskim napięciu
|
||||
if (mvControlling->MainCtrlPos ?
|
||||
mvControlling->RList[mvControlling->MainCtrlPos].R > 0.0 :
|
||||
true) // oporowa
|
||||
{
|
||||
OK = (mvControlling->DelayCtrlFlag ?
|
||||
true :
|
||||
mvControlling->IncMainCtrl(1)); // kręcimy nastawnik jazdy
|
||||
if ((OK) &&
|
||||
(mvControlling->MainCtrlPos ==
|
||||
1)) // czekaj na 1 pozycji, zanim się nie włączą liniowe
|
||||
iDrivigFlags |= moveIncSpeed;
|
||||
else
|
||||
iDrivigFlags &= ~moveIncSpeed; // usunięcie flagi czekania
|
||||
}
|
||||
else // jeśli bezoporowa (z wyjątekiem 0)
|
||||
OK = false; // to dać bocznik
|
||||
}
|
||||
else
|
||||
{ // przekroczone 30km/h, można wejść na jazdę równoległą
|
||||
if (mvControlling->ScndCtrlPos) // jeśli ustawiony bocznik
|
||||
if (mvControlling->MainCtrlPos <
|
||||
mvControlling->MainCtrlPosNo - 1) // a nie jest ostatnia pozycja
|
||||
mvControlling->DecScndCtrl(2); // to bocznik na zero po chamsku
|
||||
// (ktoś miał to poprawić...)
|
||||
OK = mvControlling->IncMainCtrl(1);
|
||||
}
|
||||
if ((mvControlling->MainCtrlPos > 2) &&
|
||||
(mvControlling->Im == 0)) // brak prądu na dalszych pozycjach
|
||||
Need_TryAgain = true; // nie załączona lokomotywa albo wywalił
|
||||
// nadmiarowy
|
||||
else if (!OK) // nie da się wrzucić kolejnej pozycji
|
||||
OK = mvControlling->IncScndCtrl(1); // to dać bocznik
|
||||
}
|
||||
}
|
||||
mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania
|
||||
break;
|
||||
case Dumb:
|
||||
|
||||
Reference in New Issue
Block a user