16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-24 00:49:18 +02:00

build 190327. tempomat status cab indicator, nullptr crash fixes, ai logic tweaks.

This commit is contained in:
tmj-fstate
2019-03-27 20:42:31 +01:00
parent 9a94693f96
commit 9bca179752
6 changed files with 132 additions and 76 deletions

View File

@@ -1824,8 +1824,7 @@ void TController::Activation()
} }
} }
// Ra: to przełączanie poniżej jest tu bez sensu // Ra: to przełączanie poniżej jest tu bez sensu
mvOccupied->ActiveCab = mvOccupied->ActiveCab = iDirection; // aktywacja kabiny w prowadzonym pojeżdzie (silnikowy może być odwrotnie?)
iDirection; // aktywacja kabiny w prowadzonym pojeżdzie (silnikowy może być odwrotnie?)
// mvOccupied->CabNo=iDirection; // mvOccupied->CabNo=iDirection;
// mvOccupied->ActiveDir=0; //żeby sam ustawił kierunek // mvOccupied->ActiveDir=0; //żeby sam ustawił kierunek
mvOccupied->CabActivisation(); // uruchomienie kabin w członach mvOccupied->CabActivisation(); // uruchomienie kabin w członach
@@ -1965,6 +1964,7 @@ void TController::AutoRewident()
&& ( mvControlling->EngineType == TEngineType::ElectricInductionMotor ) ) { && ( mvControlling->EngineType == TEngineType::ElectricInductionMotor ) ) {
fAccThreshold += 0.10; fAccThreshold += 0.10;
} }
fNominalAccThreshold = fAccThreshold;
} }
if( OrderCurrentGet() & ( Obey_train | Bank ) ) { if( OrderCurrentGet() & ( Obey_train | Bank ) ) {
@@ -2356,8 +2356,10 @@ void TController::SetVelocity(double NewVel, double NewVelNext, TStopReason r)
double TController::BrakeAccFactor() const double TController::BrakeAccFactor() const
{ {
double Factor = 1.0; double Factor = 1.0;
if( ( ActualProximityDist > fMinProximityDist )
|| ( mvOccupied->Vel > VelDesired + fVelPlus ) ) { if( ( fAccThreshold != 0.0 )
&& ( ( ActualProximityDist > fMinProximityDist )
|| ( mvOccupied->Vel > VelDesired + fVelPlus ) ) ) {
Factor += ( fBrakeReaction * ( /*mvOccupied->BrakeCtrlPosR*/BrakeCtrlPosition < 0.5 ? 1.5 : 1 ) ) * mvOccupied->Vel / ( std::max( 0.0, ActualProximityDist ) + 1 ) * ( ( AccDesired - AbsAccS_pub ) / fAccThreshold ); Factor += ( fBrakeReaction * ( /*mvOccupied->BrakeCtrlPosR*/BrakeCtrlPosition < 0.5 ? 1.5 : 1 ) ) * mvOccupied->Vel / ( std::max( 0.0, ActualProximityDist ) + 1 ) * ( ( AccDesired - AbsAccS_pub ) / fAccThreshold );
} }
return Factor; return Factor;
@@ -2522,7 +2524,15 @@ bool TController::PrepareEngine()
// enable train brake if it's off // enable train brake if it's off
if( mvOccupied->fBrakeCtrlPos == mvOccupied->Handle->GetPos( bh_NP ) ) { if( mvOccupied->fBrakeCtrlPos == mvOccupied->Handle->GetPos( bh_NP ) ) {
mvOccupied->BrakeLevelSet( mvOccupied->Handle->GetPos( bh_RP ) ); mvOccupied->BrakeLevelSet( mvOccupied->Handle->GetPos( bh_RP ) );
BrakeLevelSet(gbh_RP); // GBH }
// sync virtual brake state with the 'real' one
std::unordered_map<int, int> const brakepositions {
{ mvOccupied->Handle->GetPos( bh_RP ), gbh_RP },
{ mvOccupied->Handle->GetPos( bh_NP ), gbh_NP },
{ mvOccupied->Handle->GetPos( bh_FS ), gbh_FS } };
auto const lookup { brakepositions.find( static_cast<int>( mvOccupied->fBrakeCtrlPos ) ) };
if( lookup != brakepositions.end() ) {
BrakeLevelSet( lookup->second ); // GBH
} }
} }
} }
@@ -2861,7 +2871,7 @@ bool TController::DecBrake()
// mvOccupied->BrakeLevelAdd(-1.0); // mvOccupied->BrakeLevelAdd(-1.0);
/* if (mvOccupied->BrakeCtrlPosR < 0.74) GBH */ /* if (mvOccupied->BrakeCtrlPosR < 0.74) GBH */
if (BrakeCtrlPosition < 0.74) if (BrakeCtrlPosition < 0.74)
/*mvOccupied->*/BrakeLevelSet(0.0); /*mvOccupied->*/BrakeLevelSet(gbh_RP);
} }
} }
if( !OK ) { if( !OK ) {
@@ -3067,7 +3077,7 @@ bool TController::IncSpeed()
if (!mvControlling->FuseFlag) if (!mvControlling->FuseFlag)
if (Ready || (iDrivigFlags & movePress) || (mvOccupied->ShuntMode)) //{(BrakePress<=0.01*MaxBrakePress)} if (Ready || (iDrivigFlags & movePress) || (mvOccupied->ShuntMode)) //{(BrakePress<=0.01*MaxBrakePress)}
{ {
OK = mvControlling->IncMainCtrl(std::max(1,mvOccupied->MainCtrlPosNo/10)); OK = IncSpeedEIM();
// cruise control // cruise control
auto const SpeedCntrlVel { ( auto const SpeedCntrlVel { (
( ActualProximityDist > std::max( 50.0, fMaxProximityDist ) ) ? ( ActualProximityDist > std::max( 50.0, fMaxProximityDist ) ) ?
@@ -3169,6 +3179,34 @@ bool TController::DecSpeed(bool force)
return OK; return OK;
}; };
bool TController::IncSpeedEIM() {
bool OK = false; // domyślnie false, aby wyszło z pętli while
switch( mvControlling->EIMCtrlType ) {
case 0:
OK = mvControlling->IncMainCtrl( std::max( 1, mvOccupied->MainCtrlPosNo / 10 ) );
break;
case 1:
OK = mvControlling->MainCtrlPos < 6;
if( OK )
mvControlling->MainCtrlPos = 6;
/*
// TBD, TODO: set position based on desired acceleration?
OK = mvControlling->MainCtrlPos < mvControlling->MainCtrlPosNo;
if( OK ) {
mvControlling->MainCtrlPos = clamp( mvControlling->MainCtrlPos + 1, 6, mvControlling->MainCtrlPosNo );
}
*/
break;
case 2:
OK = mvControlling->MainCtrlPos < 4;
if( OK )
mvControlling->MainCtrlPos = 4;
break;
}
return OK;
}
bool TController::DecSpeedEIM() bool TController::DecSpeedEIM()
{ // zmniejszenie prędkości (ale nie hamowanie) { // zmniejszenie prędkości (ale nie hamowanie)
bool OK = false; // domyślnie false, aby wyszło z pętli while bool OK = false; // domyślnie false, aby wyszło z pętli while
@@ -3216,59 +3254,59 @@ void TController::SpeedSet()
if (mvControlling->MainCtrlPosNo > 0) if (mvControlling->MainCtrlPosNo > 0)
{ // jeśli ma czym kręcić { // jeśli ma czym kręcić
// TODO: sprawdzanie innego czlonu //if (!FuseFlagCheck()) // TODO: sprawdzanie innego czlonu //if (!FuseFlagCheck())
if ((AccDesired < fAccGravity - 0.05) || if( ( iDrivigFlags & moveIncSpeed ) == 0 ) {
(mvOccupied->Vel > VelDesired)) // jeśli nie ma przyspieszać // przetok rozłączać od razu (no dependency on fActionTime)
mvControlling->DecMainCtrl(2); // na zero while( ( mvControlling->MainCtrlPos )
else if (fActionTime >= 0.0) && ( mvControlling->DecMainCtrl( 1 ) ) ) {
{ // jak już można coś poruszać, przetok rozłączać od razu ; // na zero
if (iDrivigFlags & moveIncSpeed) }
{ // jak ma jechać if( fActionTime >= 0.0 ) {
if (fReady < 0.4) // 0.05*Controlling->MaxBrakePress) fActionTime = -5.0; // niech trochę potrzyma
{ // jak jest odhamowany }
if (mvOccupied->ActiveDir > 0) mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania
mvOccupied->DirectionForward(); //żeby EN57 jechały na drugiej nastawie }
{ else {
if (mvControlling->MainCtrlPos && // jak ma jechać
!mvControlling->StLinFlag) // jak niby jedzie, ale ma rozłączone liniowe if( fActionTime < 0.0 ) { break; }
mvControlling->DecMainCtrl(2); // to na zero i czekać na przewalenie kułakowego if( fReady > 0.4 ) { break; }
else
switch (mvControlling->MainCtrlPos) if( mvOccupied->ActiveDir > 0 ) {
{ // ruch nastawnika uzależniony jest od aktualnie ustawionej mvOccupied->DirectionForward(); //żeby EN57 jechały na drugiej nastawie
// pozycji }
case 0:
if (mvControlling->MainCtrlActualPos) // jeśli kułakowy nie jest if( ( mvControlling->MainCtrlPos > 0 )
// wyzerowany && ( false == mvControlling->StLinFlag ) ) {
break; // to czekać na wyzerowanie // jak niby jedzie, ale ma rozłączone liniowe to na zero i czekać na przewalenie kułakowego
mvControlling->IncMainCtrl(1); // przetok; bez "break", bo nie mvControlling->DecMainCtrl( 2 );
// ma czekania na 1. pozycji }
case 1: else {
if (VelDesired >= 20) // ruch nastawnika uzależniony jest od aktualnie ustawionej pozycji
mvControlling->IncMainCtrl(1); // szeregowa switch( mvControlling->MainCtrlPos ) {
case 2: case 0:
if (VelDesired >= 50) if( mvControlling->MainCtrlActualPos ) {
mvControlling->IncMainCtrl(1); // równoległa // jeśli kułakowy nie jest wyzerowany to czekać na wyzerowanie
case 3: break;
if (VelDesired >= 80)
mvControlling->IncMainCtrl(1); // bocznik 1
case 4:
if (VelDesired >= 90)
mvControlling->IncMainCtrl(1); // bocznik 2
case 5:
if (VelDesired >= 100)
mvControlling->IncMainCtrl(1); // bocznik 3
}
if (mvControlling->MainCtrlPos) // jak załączył pozycję
{
fActionTime = -5.0; // niech trochę potrzyma
mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania
} }
} mvControlling->IncMainCtrl( 1 ); // przetok; bez "break", bo nie ma czekania na 1. pozycji
case 1:
if( VelDesired >= 20 )
mvControlling->IncMainCtrl( 1 ); // szeregowa
case 2:
if( VelDesired >= 50 )
mvControlling->IncMainCtrl( 1 ); // równoległa
case 3:
if( VelDesired >= 80 )
mvControlling->IncMainCtrl( 1 ); // bocznik 1
case 4:
if( VelDesired >= 90 )
mvControlling->IncMainCtrl( 1 ); // bocznik 2
case 5:
if( VelDesired >= 100 )
mvControlling->IncMainCtrl( 1 ); // bocznik 3
} }
} }
else if( mvControlling->MainCtrlPos ) // jak załączył pozycję
{ {
while (mvControlling->MainCtrlPos)
mvControlling->DecMainCtrl(1); // na zero
fActionTime = -5.0; // niech trochę potrzyma fActionTime = -5.0; // niech trochę potrzyma
mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania
} }
@@ -3872,15 +3910,14 @@ bool TController::PutCommand( std::string NewCommand, double NewValue1, double N
if( ( NewCommand == "Shunt" ) || ( NewCommand == "Loose_shunt" ) ) if( ( NewCommand == "Shunt" ) || ( NewCommand == "Loose_shunt" ) )
{ // NewValue1 - ilość wagonów (-1=wszystkie); NewValue2: 0=odczep, 1..63=dołącz, -1=bez zmian { // NewValue1 - ilość wagonów (-1=wszystkie); NewValue2: 0=odczep, 1..63=dołącz, -1=bez zmian
//-3,-y - podłączyć do całego stojącego składu (sprzęgiem y>=1), zmienić kierunek i czekać w //-3,-y - podłączyć do całego stojącego składu (sprzęgiem y>=1), zmienić kierunek i czekać w trybie pociągowym
// trybie pociągowym
//-2,-y - podłączyć do całego stojącego składu (sprzęgiem y>=1), zmienić kierunek i czekać //-2,-y - podłączyć do całego stojącego składu (sprzęgiem y>=1), zmienić kierunek i czekać
//-2, y - podłączyć do całego stojącego składu (sprzęgiem y>=1) i czekać //-2, y - podłączyć do całego stojącego składu (sprzęgiem y>=1) i czekać
//-1,-y - podłączyć do całego stojącego składu (sprzęgiem y>=1) i jechać w powrotną stronę //-1,-y - podłączyć do całego stojącego składu (sprzęgiem y>=1) i jechać w powrotną stronę
//-1, y - podłączyć do całego stojącego składu (sprzęgiem y>=1) i jechać dalej //-1, y - podłączyć do całego stojącego składu (sprzęgiem y>=1) i jechać dalej
//-1, 0 - tryb manewrowy bez zmian (odczepianie z pozostawieniem wagonów nie ma sensu) //-1, 0 - tryb manewrowy bez zmian (odczepianie z pozostawieniem wagonów nie ma sensu)
// 0, 0 - odczepienie lokomotywy // 0, 0 - odczepienie lokomotywy
// 1,-y - podłączyć się do składu (sprzęgiem y>=1), a następnie odczepić i zabrać (x) wagonów // x,-y - podłączyć się do składu (sprzęgiem y>=1), a następnie odczepić i zabrać (x) wagonów
// 1, 0 - odczepienie lokomotywy z jednym wagonem // 1, 0 - odczepienie lokomotywy z jednym wagonem
iDrivigFlags &= ~moveStopHere; // podjeżanie do semaforów zezwolone iDrivigFlags &= ~moveStopHere; // podjeżanie do semaforów zezwolone
if (!iEngineActive) if (!iEngineActive)
@@ -4167,7 +4204,7 @@ TController::UpdateSituation(double dt) {
Need_TryAgain = true; // reset jak przy wywaleniu nadmiarowego Need_TryAgain = true; // reset jak przy wywaleniu nadmiarowego
} }
// check door state // check door state
auto const switchsides { p->DirectionGet() <= 0 }; auto const switchsides { p->DirectionGet() != iDirection };
IsAnyDoorOpen[ side::right ] = IsAnyDoorOpen[ side::right ] =
IsAnyDoorOpen[ side::right ] IsAnyDoorOpen[ side::right ]
|| ( false == vehicle->Doors.instances[ ( switchsides ? side::left : side::right ) ].is_closed ); || ( false == vehicle->Doors.instances[ ( switchsides ? side::left : side::right ) ].is_closed );
@@ -4589,20 +4626,21 @@ TController::UpdateSituation(double dt) {
auto *vehicleparameters { vehicle->MoverParameters }; auto *vehicleparameters { vehicle->MoverParameters };
int const end { ( vehicle->DirectionGet() > 0 ? end::front : end::rear ) }; int const end { ( vehicle->DirectionGet() > 0 ? end::front : end::rear ) };
auto const &neighbour { vehicleparameters->Neighbours[ end ] }; auto const &neighbour { vehicleparameters->Neighbours[ end ] };
// próba podczepienia if( neighbour.vehicle != nullptr ) {
vehicleparameters->Attach( // próba podczepienia
end, neighbour.vehicle_end, vehicleparameters->Attach(
neighbour.vehicle->MoverParameters, end, neighbour.vehicle_end,
iCoupler ); neighbour.vehicle->MoverParameters,
if( vehicleparameters->Couplers[ end ].CouplingFlag == iCoupler ) { iCoupler );
// jeżeli został podłączony if( vehicleparameters->Couplers[ end ].CouplingFlag == iCoupler ) {
iCoupler = 0; // dalsza jazda manewrowa już bez łączenia // jeżeli został podłączony
iDrivigFlags &= ~moveConnect; // zdjęcie flagi doczepiania iCoupler = 0; // dalsza jazda manewrowa już bez łączenia
SetVelocity(0, 0, stopJoin); // wyłączyć przyspieszanie iDrivigFlags &= ~moveConnect; // zdjęcie flagi doczepiania
CheckVehicles(); // sprawdzić światła nowego składu SetVelocity( 0, 0, stopJoin ); // wyłączyć przyspieszanie
JumpToNextOrder(); // wykonanie następnej komendy CheckVehicles(); // sprawdzić światła nowego składu
JumpToNextOrder(); // wykonanie następnej komendy
}
} }
} // if (AIControllFlag) //koniec zblokowania, bo była zmienna lokalna } // if (AIControllFlag) //koniec zblokowania, bo była zmienna lokalna
} }
else { else {
@@ -5788,6 +5826,7 @@ TController::UpdateSituation(double dt) {
// przy odłączaniu nie zwalniamy tu hamulca // przy odłączaniu nie zwalniamy tu hamulca
if( AbsAccS < AccDesired - 0.05 ) { if( AbsAccS < AccDesired - 0.05 ) {
// jeśli opóźnienie większe od wymaganego (z histerezą) luzowanie, gdy za dużo // jeśli opóźnienie większe od wymaganego (z histerezą) luzowanie, gdy za dużo
// TBD: check if the condition isn't redundant with the DecBrake() code
if( /*GBH mvOccupied->BrakeCtrlPos*/BrakeCtrlPosition >= 0 ) { if( /*GBH mvOccupied->BrakeCtrlPos*/BrakeCtrlPosition >= 0 ) {
DecBrake(); // tutaj zmniejszało o 1 przy odczepianiu DecBrake(); // tutaj zmniejszało o 1 przy odczepianiu
} }
@@ -6552,6 +6591,9 @@ void TController::TakeControl(bool yes)
void TController::DirectionForward(bool forward) void TController::DirectionForward(bool forward)
{ // ustawienie jazdy do przodu dla true i do tyłu dla false (zależy od kabiny) { // ustawienie jazdy do przodu dla true i do tyłu dla false (zależy od kabiny)
ZeroSpeed( true ); // TODO: check if force switch is needed anymore here ZeroSpeed( true ); // TODO: check if force switch is needed anymore here
// HACK: make sure the master controller isn't set in position which prevents direction change
mvControlling->MainCtrlPos = std::min( mvControlling->MainCtrlPos, mvControlling->MaxMainCtrlPosNoDirChange );
if( forward ) { if( forward ) {
// do przodu w obecnej kabinie // do przodu w obecnej kabinie
while( ( mvOccupied->ActiveDir <= 0 ) while( ( mvOccupied->ActiveDir <= 0 )

View File

@@ -6810,6 +6810,9 @@ vehicle_table::update_traction( TDynamicObject *Vehicle ) {
if( pantograph->hvPowerWire != nullptr ) { if( pantograph->hvPowerWire != nullptr ) {
// jeżeli znamy drut z poprzedniego przebiegu // jeżeli znamy drut z poprzedniego przebiegu
for( int attempts = 0; attempts < 30; ++attempts ) { for( int attempts = 0; attempts < 30; ++attempts ) {
// sanity check. shouldn't happen in theory, but did happen in practice
if( pantograph->hvPowerWire == nullptr ) { break; }
// powtarzane aż do znalezienia odpowiedniego odcinka na liście dwukierunkowej // powtarzane aż do znalezienia odpowiedniego odcinka na liście dwukierunkowej
if( pantograph->hvPowerWire->iLast & 0x3 ) { if( pantograph->hvPowerWire->iLast & 0x3 ) {
// dla ostatniego i przedostatniego przęsła wymuszamy szukanie innego // dla ostatniego i przedostatniego przęsła wymuszamy szukanie innego
@@ -6825,6 +6828,7 @@ vehicle_table::update_traction( TDynamicObject *Vehicle ) {
} }
// obliczamy wyraz wolny równania płaszczyzny (to miejsce nie jest odpowienie) // obliczamy wyraz wolny równania płaszczyzny (to miejsce nie jest odpowienie)
// podstawiamy równanie parametryczne drutu do równania płaszczyzny pantografu // podstawiamy równanie parametryczne drutu do równania płaszczyzny pantografu
// TODO: investigate this routine with reardriver/negative speed, does it picks the right wire?
auto const fRaParam = auto const fRaParam =
-( glm::dot( pantograph->hvPowerWire->pPoint1, vFront ) - glm::dot( pant0, vFront ) ) -( glm::dot( pantograph->hvPowerWire->pPoint1, vFront ) - glm::dot( pant0, vFront ) )
/ glm::dot( pantograph->hvPowerWire->vParametric, vFront ); / glm::dot( pantograph->hvPowerWire->vParametric, vFront );

View File

@@ -502,7 +502,7 @@ bool TMoverParameters::Dettach(int ConnectNo)
bool TMoverParameters::DirectionForward() bool TMoverParameters::DirectionForward()
{ {
if ((MainCtrlPosNo > 0) && (ActiveDir < 1) && (MainCtrlPos <= MaxMainCtrlPosNoDirChange) && (EIMDirectionChangeAllow())) if ((MainCtrlPosNo > 0) && (ActiveDir < 1) && (EIMDirectionChangeAllow()))
{ {
++ActiveDir; ++ActiveDir;
DirAbsolute = ActiveDir * CabNo; DirAbsolute = ActiveDir * CabNo;
@@ -2345,7 +2345,7 @@ bool TMoverParameters::DirectionBackward(void)
DB = true; // DB = true; //
return DB; // exit; TODO: czy dobrze przetlumaczone? return DB; // exit; TODO: czy dobrze przetlumaczone?
} }
if ((MainCtrlPosNo > 0) && (ActiveDir > -1) && (MainCtrlPos <= MaxMainCtrlPosNoDirChange) && (EIMDirectionChangeAllow())) if ((MainCtrlPosNo > 0) && (ActiveDir > -1) && (EIMDirectionChangeAllow()))
{ {
if (EngineType == TEngineType::WheelsDriven) if (EngineType == TEngineType::WheelsDriven)
CabNo--; CabNo--;
@@ -2366,7 +2366,11 @@ bool TMoverParameters::DirectionBackward(void)
bool TMoverParameters::EIMDirectionChangeAllow(void) bool TMoverParameters::EIMDirectionChangeAllow(void)
{ {
bool OK = false; bool OK = false;
/*
// NOTE: disabled while eimic variables aren't immediately synced with master controller changes inside ai module
OK = (EngineType != TEngineType::ElectricInductionMotor || ((eimic <= 0) && (eimic_real <= 0) && (Vel < 0.1))); OK = (EngineType != TEngineType::ElectricInductionMotor || ((eimic <= 0) && (eimic_real <= 0) && (Vel < 0.1)));
*/
OK = ( MainCtrlPos <= MaxMainCtrlPosNoDirChange );
return OK; return OK;
} }
@@ -4326,6 +4330,7 @@ double TMoverParameters::CouplerForce( int const End, double dt ) {
// zderzenie // zderzenie
coupler.CheckCollision = true; coupler.CheckCollision = true;
if( ( coupler.CouplerType == TCouplerType::Automatic ) if( ( coupler.CouplerType == TCouplerType::Automatic )
&& ( coupler.CouplerType == othercoupler.CouplerType )
&& ( coupler.CouplingFlag == coupling::faux ) ) { && ( coupler.CouplingFlag == coupling::faux ) ) {
// sprzeganie wagonow z samoczynnymi sprzegami // sprzeganie wagonow z samoczynnymi sprzegami
// EN57 // EN57

View File

@@ -5725,6 +5725,7 @@ bool TTrain::Update( double const Deltatime )
btLampkaMalfunction.Turn( mvControlled->dizel_heat.PA ); btLampkaMalfunction.Turn( mvControlled->dizel_heat.PA );
btLampkaMotorBlowers.Turn( ( mvControlled->MotorBlowers[ end::front ].is_active ) && ( mvControlled->MotorBlowers[ end::rear ].is_active ) ); btLampkaMotorBlowers.Turn( ( mvControlled->MotorBlowers[ end::front ].is_active ) && ( mvControlled->MotorBlowers[ end::rear ].is_active ) );
btLampkaCoolingFans.Turn( mvControlled->RventRot > 1.0 ); btLampkaCoolingFans.Turn( mvControlled->RventRot > 1.0 );
btLampkaTempomat.Turn( mvControlled->ScndCtrlPos > 0 );
// universal devices state indicators // universal devices state indicators
for( auto idx = 0; idx < btUniversals.size(); ++idx ) { for( auto idx = 0; idx < btUniversals.size(); ++idx ) {
btUniversals[ idx ].Turn( ggUniversals[ idx ].GetValue() > 0.5 ); btUniversals[ idx ].Turn( ggUniversals[ idx ].GetValue() > 0.5 );
@@ -5786,6 +5787,7 @@ bool TTrain::Update( double const Deltatime )
btLampkaMalfunction.Turn( false ); btLampkaMalfunction.Turn( false );
btLampkaMotorBlowers.Turn( false ); btLampkaMotorBlowers.Turn( false );
btLampkaCoolingFans.Turn( false ); btLampkaCoolingFans.Turn( false );
btLampkaTempomat.Turn( false );
// universal devices state indicators // universal devices state indicators
for( auto &universal : btUniversals ) { for( auto &universal : btUniversals ) {
universal.Turn( false ); universal.Turn( false );
@@ -7424,6 +7426,7 @@ void TTrain::clear_cab_controls()
btLampkaMalfunctionB.Clear(); btLampkaMalfunctionB.Clear();
btLampkaMotorBlowers.Clear(); btLampkaMotorBlowers.Clear();
btLampkaCoolingFans.Clear(); btLampkaCoolingFans.Clear();
btLampkaTempomat.Clear();
ggLeftLightButton.Clear(); ggLeftLightButton.Clear();
ggRightLightButton.Clear(); ggRightLightButton.Clear();
@@ -7769,6 +7772,7 @@ bool TTrain::initialize_button(cParser &Parser, std::string const &Label, int co
{ "i-vent_trim:", btLampkaWentZaluzje }, { "i-vent_trim:", btLampkaWentZaluzje },
{ "i-motorblowers:", btLampkaMotorBlowers }, { "i-motorblowers:", btLampkaMotorBlowers },
{ "i-coolingfans:", btLampkaCoolingFans }, { "i-coolingfans:", btLampkaCoolingFans },
{ "i-tempomat:", btLampkaTempomat },
{ "i-trainheating:", btLampkaOgrzewanieSkladu }, { "i-trainheating:", btLampkaOgrzewanieSkladu },
{ "i-security_aware:", btLampkaCzuwaka }, { "i-security_aware:", btLampkaCzuwaka },
{ "i-security_cabsignal:", btLampkaSHP }, { "i-security_cabsignal:", btLampkaSHP },

View File

@@ -583,6 +583,7 @@ public: // reszta może by?publiczna
TButton btLampkaMalfunctionB; TButton btLampkaMalfunctionB;
TButton btLampkaMotorBlowers; TButton btLampkaMotorBlowers;
TButton btLampkaCoolingFans; TButton btLampkaCoolingFans;
TButton btLampkaTempomat;
TButton btCabLight; // hunter-171012: lampa oswietlajaca kabine TButton btCabLight; // hunter-171012: lampa oswietlajaca kabine
// Ra 2013-12: wirtualne "lampki" do odbijania na haslerze w PoKeys // Ra 2013-12: wirtualne "lampki" do odbijania na haslerze w PoKeys

View File

@@ -1,5 +1,5 @@
#pragma once #pragma once
#define VERSION_MAJOR 19 #define VERSION_MAJOR 19
#define VERSION_MINOR 303 #define VERSION_MINOR 327
#define VERSION_REVISION 0 #define VERSION_REVISION 0