16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 15:09:19 +02:00

build 170831. scan table fixes, emergency brake control, mouse support for manual brake

This commit is contained in:
tmj-fstate
2017-08-31 19:43:55 +02:00
parent e5980f946c
commit 61e8b8a906
11 changed files with 179 additions and 58 deletions

View File

@@ -376,9 +376,15 @@ void TSpeedPos::Set(TTrack *track, double dist, int flag)
fVelNext = (trTrack->iCategoryFlag & 1) ? fVelNext = (trTrack->iCategoryFlag & 1) ?
0.0 : 0.0 :
20.0; // jeśli koniec, to pociąg stój, a samochód zwolnij 20.0; // jeśli koniec, to pociąg stój, a samochód zwolnij
/*
vPos = (((iFlags & spReverse) != 0) != ((iFlags & spEnd) != 0)) ? vPos = (((iFlags & spReverse) != 0) != ((iFlags & spEnd) != 0)) ?
trTrack->CurrentSegment()->FastGetPoint_1() : trTrack->CurrentSegment()->FastGetPoint_1() :
trTrack->CurrentSegment()->FastGetPoint_0(); trTrack->CurrentSegment()->FastGetPoint_0();
*/
vPos =
( iFlags & spReverse ) ?
trTrack->CurrentSegment()->FastGetPoint_1() :
trTrack->CurrentSegment()->FastGetPoint_0();
} }
}; };
@@ -648,8 +654,9 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
else else
{ // definitywny koniec skanowania, chyba że dalej puszczamy samochód po gruncie... { // definitywny koniec skanowania, chyba że dalej puszczamy samochód po gruncie...
if( ( iLast == -1 ) if( ( iLast == -1 )
|| ( false == TestFlag( sSpeedTable[iLast].iFlags, spEnabled | spEnd ) ) ) { || ( ( false == TestFlag( sSpeedTable[iLast].iFlags, spEnabled | spEnd ) )
// only if we haven't already marked end of the track && ( sSpeedTable[iLast].trTrack != tLast ) ) ) {
// only if we haven't already marked end of the track and if the new track doesn't duplicate last one
if( TableAddNew() ) { if( TableAddNew() ) {
// zapisanie ostatniego sprawdzonego toru // zapisanie ostatniego sprawdzonego toru
sSpeedTable[iLast].Set( sSpeedTable[iLast].Set(
@@ -659,6 +666,11 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
spEnabled | spEnd )); spEnabled | spEnd ));
} }
} }
else if( sSpeedTable[ iLast ].trTrack == tLast ) {
// otherwise just mark the last added track as the final one
// TODO: investigate exactly how we can wind up not marking the last existing track as actual end
sSpeedTable[ iLast ].iFlags |= spEnd;
}
// to ostatnia pozycja, bo NULL nic nie da, a może się podpiąć obrotnica, czy jakieś transportery // to ostatnia pozycja, bo NULL nic nie da, a może się podpiąć obrotnica, czy jakieś transportery
return; return;
} }
@@ -703,7 +715,7 @@ void TController::TableCheck(double fDistance)
} }
if (sSpeedTable[i].iFlags & spTrack) // jeśli odcinek if (sSpeedTable[i].iFlags & spTrack) // jeśli odcinek
{ {
if (sSpeedTable[i].fDist < -fLength) // a skład wyjechał całą długością poza if (sSpeedTable[i].fDist + sSpeedTable[i].trTrack->Length() < -fLength) // a skład wyjechał całą długością poza
{ // degradacja pozycji { // degradacja pozycji
sSpeedTable[i].iFlags &= ~spEnabled; // nie liczy się sSpeedTable[i].iFlags &= ~spEnabled; // nie liczy się
} }
@@ -996,10 +1008,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
} }
} // koniec obsługi W4 } // koniec obsługi W4
v = sSpeedTable[i].fVelNext; // odczyt prędkości do zmiennej pomocniczej v = sSpeedTable[i].fVelNext; // odczyt prędkości do zmiennej pomocniczej
if (sSpeedTable[i].iFlags & if( sSpeedTable[ i ].iFlags & spSwitch ) {
spSwitch) // zwrotnice są usuwane z tabelki dopiero po zjechaniu z nich // zwrotnice są usuwane z tabelki dopiero po zjechaniu z nich
iDrivigFlags |= iDrivigFlags |= moveSwitchFound; // rozjazd z przodu/pod ogranicza np. sens skanowania wstecz
moveSwitchFound; // rozjazd z przodu/pod ogranicza np. sens skanowania wstecz }
else if (sSpeedTable[i].iFlags & spEvent) // W4 może się deaktywować else if (sSpeedTable[i].iFlags & spEvent) // W4 może się deaktywować
{ // jeżeli event, może być potrzeba wysłania komendy, aby ruszył { // jeżeli event, może być potrzeba wysłania komendy, aby ruszył
// sprawdzanie eventów pasywnych miniętych // sprawdzanie eventów pasywnych miniętych
@@ -1270,12 +1282,13 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
else if (sSpeedTable[i].iFlags & spTrack) // jeśli tor else if (sSpeedTable[i].iFlags & spTrack) // jeśli tor
{ // tor ogranicza prędkość, dopóki cały skład nie przejedzie, { // tor ogranicza prędkość, dopóki cały skład nie przejedzie,
// d=fLength+d; //zamiana na długość liczoną do przodu // d=fLength+d; //zamiana na długość liczoną do przodu
if (v >= 1.0) // EU06 się zawieszało po dojechaniu na koniec toru postojowego if( v >= 1.0 ) // EU06 się zawieszało po dojechaniu na koniec toru postojowego
if (d < -fLength) if( d + sSpeedTable[ i ].trTrack->Length() < -fLength )
continue; // zapętlenie, jeśli już wyjechał za ten odcinek continue; // zapętlenie, jeśli już wyjechał za ten odcinek
if (v < fVelDes) if( v < fVelDes ) {
fVelDes = // ograniczenie aktualnej prędkości aż do wyjechania za ograniczenie
v; // ograniczenie aktualnej prędkości aż do wyjechania za ograniczenie fVelDes = v;
}
// if (v==0.0) fAcc=-0.9; //hamowanie jeśli stop // if (v==0.0) fAcc=-0.9; //hamowanie jeśli stop
continue; // i tyle wystarczy continue; // i tyle wystarczy
} }
@@ -1298,8 +1311,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
} // if (v>=0.0) } // if (v>=0.0)
if (fNext >= 0.0) if (fNext >= 0.0)
{ // jeśli ograniczenie { // jeśli ograniczenie
if ((sSpeedTable[i].iFlags & (spEnabled | spEvent)) == if ((sSpeedTable[i].iFlags & (spEnabled | spEvent)) == (spEnabled | spEvent)) // tylko sygnał przypisujemy
(spEnabled | spEvent)) // tylko sygnał przypisujemy
if (!eSignNext) // jeśli jeszcze nic nie zapisane tam if (!eSignNext) // jeśli jeszcze nic nie zapisane tam
eSignNext = sSpeedTable[i].evEvent; // dla informacji eSignNext = sSpeedTable[i].evEvent; // dla informacji
if (fNext == 0.0) if (fNext == 0.0)
@@ -3590,7 +3602,7 @@ TController::UpdateSituation(double dt) {
// czy stan się nie zmienił. // czy stan się nie zmienił.
// 4. Ewentualnie uzupełnić tabelkę informacjami o sygnałach i ograniczeniach, jeśli się // 4. Ewentualnie uzupełnić tabelkę informacjami o sygnałach i ograniczeniach, jeśli się
// "zużyła". // "zużyła".
TableCheck(routescanrange); // wypełnianie tabelki i aktualizacja odległości TableCheck( routescanrange ); // wypełnianie tabelki i aktualizacja odległości
// 5. Sprawdzić stany sygnalizacji zapisanej w tabelce, wyznaczyć prędkości. // 5. Sprawdzić stany sygnalizacji zapisanej w tabelce, wyznaczyć prędkości.
// 6. Z tabelki wyznaczyć krytyczną odległość i prędkość (najmniejsze przyspieszenie). // 6. Z tabelki wyznaczyć krytyczną odległość i prędkość (najmniejsze przyspieszenie).
// 7. Jeśli jest inny pojazd z przodu, ewentualnie skorygować odległość i prędkość. // 7. Jeśli jest inny pojazd z przodu, ewentualnie skorygować odległość i prędkość.
@@ -4664,9 +4676,12 @@ TController::UpdateSituation(double dt) {
// Ra 2F1H: jest konflikt histerezy pomiędzy nastawioną pozycją a uzyskiwanym // Ra 2F1H: jest konflikt histerezy pomiędzy nastawioną pozycją a uzyskiwanym
// przyspieszeniem - utrzymanie pozycji powoduje przekroczenie przyspieszenia // przyspieszeniem - utrzymanie pozycji powoduje przekroczenie przyspieszenia
if( AbsAccS < AccDesired ) { if( AbsAccS < AccDesired ) {
// jeśli przyspieszenie pojazdu jest mniejsze niż żądane oraz // jeśli przyspieszenie pojazdu jest mniejsze niż żądane oraz...
if( vel < VelDesired - fVelMinus ) { if( vel < (
// jeśli prędkość w kierunku czoła jest mniejsza od dozwolonej o margines VelDesired == 1.0 ? // work around for trains getting stuck on tracks with speed limit = 1
VelDesired :
VelDesired - fVelMinus ) ) {
// ...jeśli prędkość w kierunku czoła jest mniejsza od dozwolonej o margines
if( ( ActualProximityDist > ( if( ( ActualProximityDist > (
mvOccupied->CategoryFlag & 2 ? mvOccupied->CategoryFlag & 2 ?
fMinProximityDist : // cars are allowed to move within min proximity distance fMinProximityDist : // cars are allowed to move within min proximity distance

View File

@@ -867,7 +867,7 @@ public:
/* /*
int BrakeStatus = b_off; //0 - odham, 1 - ham., 2 - uszk., 4 - odluzniacz, 8 - antyposlizg, 16 - uzyte EP, 32 - pozycja R, 64 - powrot z R int BrakeStatus = b_off; //0 - odham, 1 - ham., 2 - uszk., 4 - odluzniacz, 8 - antyposlizg, 16 - uzyte EP, 32 - pozycja R, 64 - powrot z R
*/ */
bool EmergencyBrakeFlag = false; // manual emergency brake bool AlarmChainFlag = false; // manual emergency brake
bool RadioStopFlag = false; /*hamowanie nagle*/ bool RadioStopFlag = false; /*hamowanie nagle*/
int BrakeDelayFlag = 0; /*nastawa opoznienia ham. osob/towar/posp/exp 0/1/2/4*/ int BrakeDelayFlag = 0; /*nastawa opoznienia ham. osob/towar/posp/exp 0/1/2/4*/
int BrakeDelays = 0; /*nastawy mozliwe do uzyskania*/ int BrakeDelays = 0; /*nastawy mozliwe do uzyskania*/
@@ -1084,6 +1084,7 @@ public:
bool DecManualBrakeLevel(int CtrlSpeed); bool DecManualBrakeLevel(int CtrlSpeed);
bool DynamicBrakeSwitch(bool Switch); bool DynamicBrakeSwitch(bool Switch);
bool RadiostopSwitch(bool Switch); bool RadiostopSwitch(bool Switch);
bool AlarmChainSwitch( bool const State );
bool AntiSlippingBrake(void); bool AntiSlippingBrake(void);
bool BrakeReleaser(int state); bool BrakeReleaser(int state);
bool SwitchEPBrake(int state); bool SwitchEPBrake(int state);

View File

@@ -1082,7 +1082,7 @@ void TMoverParameters::CollisionDetect(int CouplerN, double dt)
EventFlag = true; EventFlag = true;
if ((coupler.CouplingFlag & ctrain_pneumatic) == ctrain_pneumatic) if ((coupler.CouplingFlag & ctrain_pneumatic) == ctrain_pneumatic)
EmergencyBrakeFlag = true; // hamowanie nagle - zerwanie przewodow hamulcowych AlarmChainFlag = true; // hamowanie nagle - zerwanie przewodow hamulcowych
coupler.CouplingFlag = 0; coupler.CouplingFlag = 0;
switch (CouplerN) // wyzerowanie flag podlaczenia ale ciagle sa wirtualnie polaczone switch (CouplerN) // wyzerowanie flag podlaczenia ale ciagle sa wirtualnie polaczone
@@ -2780,31 +2780,46 @@ bool TMoverParameters::DynamicBrakeSwitch(bool Switch)
bool TMoverParameters::RadiostopSwitch(bool Switch) bool TMoverParameters::RadiostopSwitch(bool Switch)
{ {
bool EBS; bool EBS;
if ((BrakeSystem != Individual) && (BrakeCtrlPosNo > 0)) if( ( BrakeSystem != Individual )
{ && ( BrakeCtrlPosNo > 0 ) ) {
if ((!RadioStopFlag) && Switch)
{ if( ( true == Switch )
&& ( false == RadioStopFlag ) ) {
RadioStopFlag = Switch; RadioStopFlag = Switch;
EBS = true; EBS = true;
} }
else else {
{ if( ( Switch == false )
if ((abs(V) < 0.1) && && ( std::abs( V ) < 0.1 ) ) {
(Switch == false)) // odblokowanie hamulca bezpieczenistwa tylko po zatrzymaniu // odblokowanie hamulca bezpieczenistwa tylko po zatrzymaniu
{
RadioStopFlag = Switch; RadioStopFlag = Switch;
EBS = true; EBS = true;
} }
else else {
EBS = false; EBS = false;
}
} }
} }
else else {
EBS = false; // nie ma hamulca bezpieczenstwa gdy nie ma hamulca zesp. // nie ma hamulca bezpieczenstwa gdy nie ma hamulca zesp.
EBS = false;
}
return EBS; return EBS;
} }
bool TMoverParameters::AlarmChainSwitch( bool const State ) {
bool stateswitched { false };
if( AlarmChainFlag != State ) {
// simple routine for the time being
AlarmChainFlag = State;
stateswitched = true;
}
return stateswitched;
}
// ************************************************************************************************* // *************************************************************************************************
// Q: 20160710 // Q: 20160710
// hamowanie przeciwpoślizgowe // hamowanie przeciwpoślizgowe
@@ -3282,12 +3297,19 @@ void TMoverParameters::UpdatePipePressure(double dt)
Pipe2->Flow(dpMainValve); Pipe2->Flow(dpMainValve);
} }
// if(EmergencyBrakeFlag)and(BrakeCtrlPosNo=0)then //ulepszony hamulec bezp. // ulepszony hamulec bezp.
if ((RadioStopFlag) || (TestFlag(SecuritySystem.Status, s_SHPebrake)) || if( ( true == RadioStopFlag )
(TestFlag(SecuritySystem.Status, s_CAebrake)) || || ( true == AlarmChainFlag )
(s_CAtestebrake == true) || || ( true == TestFlag( SecuritySystem.Status, s_SHPebrake ) )
(TestFlag(EngDmgFlag, 32)) /* or (not Battery)*/) // ulepszony hamulec bezp. || ( true == TestFlag( SecuritySystem.Status, s_CAebrake ) )
dpMainValve = dpMainValve + PF(0, PipePress, 0.15) * dt; /*
// NOTE: disabled because 32 is 'load destroyed' flag, what does this have to do with emergency brake?
// (if it's supposed to be broken coupler, such event sets alarmchainflag instead when appropriate)
|| ( true == TestFlag( EngDmgFlag, 32 ) )
*/
|| ( true == s_CAtestebrake ) ) {
dpMainValve = dpMainValve + PF( 0, PipePress, 0.15 ) * dt;
}
// 0.2*Spg // 0.2*Spg
Pipe->Flow(-dpMainValve); Pipe->Flow(-dpMainValve);
Pipe->Flow(-(PipePress)*0.001 * dt); Pipe->Flow(-(PipePress)*0.001 * dt);

View File

@@ -217,6 +217,9 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = {
{ user_command::trainbrakeservice, &TTrain::OnCommand_trainbrakeservice }, { user_command::trainbrakeservice, &TTrain::OnCommand_trainbrakeservice },
{ user_command::trainbrakefullservice, &TTrain::OnCommand_trainbrakefullservice }, { user_command::trainbrakefullservice, &TTrain::OnCommand_trainbrakefullservice },
{ user_command::trainbrakeemergency, &TTrain::OnCommand_trainbrakeemergency }, { user_command::trainbrakeemergency, &TTrain::OnCommand_trainbrakeemergency },
{ user_command::manualbrakeincrease, &TTrain::OnCommand_manualbrakeincrease },
{ user_command::manualbrakedecrease, &TTrain::OnCommand_manualbrakedecrease },
{ user_command::alarmchaintoggle, &TTrain::OnCommand_alarmchaintoggle },
{ user_command::wheelspinbrakeactivate, &TTrain::OnCommand_wheelspinbrakeactivate }, { user_command::wheelspinbrakeactivate, &TTrain::OnCommand_wheelspinbrakeactivate },
{ user_command::sandboxactivate, &TTrain::OnCommand_sandboxactivate }, { user_command::sandboxactivate, &TTrain::OnCommand_sandboxactivate },
{ user_command::epbrakecontroltoggle, &TTrain::OnCommand_epbrakecontroltoggle }, { user_command::epbrakecontroltoggle, &TTrain::OnCommand_epbrakecontroltoggle },
@@ -836,7 +839,7 @@ void TTrain::OnCommand_trainbrakecharging( TTrain *Train, command_data const &Co
void TTrain::OnCommand_trainbrakerelease( TTrain *Train, command_data const &Command ) { void TTrain::OnCommand_trainbrakerelease( TTrain *Train, command_data const &Command ) {
if( Command.action != GLFW_RELEASE ) { if( Command.action == GLFW_PRESS ) {
// sound feedback // sound feedback
if( ( Train->is_eztoer() ) if( ( Train->is_eztoer() )
@@ -851,7 +854,7 @@ void TTrain::OnCommand_trainbrakerelease( TTrain *Train, command_data const &Com
void TTrain::OnCommand_trainbrakefirstservice( TTrain *Train, command_data const &Command ) { void TTrain::OnCommand_trainbrakefirstservice( TTrain *Train, command_data const &Command ) {
if( Command.action != GLFW_RELEASE ) { if( Command.action == GLFW_PRESS ) {
// sound feedback // sound feedback
if( ( Train->is_eztoer() ) if( ( Train->is_eztoer() )
@@ -866,7 +869,7 @@ void TTrain::OnCommand_trainbrakefirstservice( TTrain *Train, command_data const
void TTrain::OnCommand_trainbrakeservice( TTrain *Train, command_data const &Command ) { void TTrain::OnCommand_trainbrakeservice( TTrain *Train, command_data const &Command ) {
if( Command.action != GLFW_RELEASE ) { if( Command.action == GLFW_PRESS ) {
// sound feedback // sound feedback
if( ( Train->is_eztoer() ) if( ( Train->is_eztoer() )
@@ -879,14 +882,14 @@ void TTrain::OnCommand_trainbrakeservice( TTrain *Train, command_data const &Com
Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->BrakeLevelSet(
Train->mvOccupied->BrakeCtrlPosNo / 2 Train->mvOccupied->BrakeCtrlPosNo / 2
+ ( Train->mvOccupied->BrakeHandle == FV4a ? + ( Train->mvOccupied->BrakeHandle == FV4a ?
1 : 1 :
0 ) ); 0 ) );
} }
} }
void TTrain::OnCommand_trainbrakefullservice( TTrain *Train, command_data const &Command ) { void TTrain::OnCommand_trainbrakefullservice( TTrain *Train, command_data const &Command ) {
if( Command.action != GLFW_RELEASE ) { if( Command.action == GLFW_PRESS ) {
// sound feedback // sound feedback
if( ( Train->is_eztoer() ) if( ( Train->is_eztoer() )
@@ -901,13 +904,58 @@ void TTrain::OnCommand_trainbrakefullservice( TTrain *Train, command_data const
void TTrain::OnCommand_trainbrakeemergency( TTrain *Train, command_data const &Command ) { void TTrain::OnCommand_trainbrakeemergency( TTrain *Train, command_data const &Command ) {
if( Command.action != GLFW_RELEASE ) { if( Command.action == GLFW_PRESS ) {
Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->Handle->GetPos( bh_EB ) ); Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->Handle->GetPos( bh_EB ) );
/*
if( Train->mvOccupied->BrakeCtrlPosNo <= 0.1 ) { if( Train->mvOccupied->BrakeCtrlPosNo <= 0.1 ) {
// hamulec bezpieczeństwa dla wagonów // hamulec bezpieczeństwa dla wagonów
Train->mvOccupied->RadioStopFlag = true; Train->mvOccupied->RadioStopFlag = true;
} }
*/
}
}
void TTrain::OnCommand_manualbrakeincrease( TTrain *Train, command_data const &Command ) {
if( Command.action != GLFW_RELEASE ) {
if( ( Train->mvOccupied->LocalBrake == ManualBrake )
|| ( Train->mvOccupied->MBrake == true ) ) {
Train->mvOccupied->IncManualBrakeLevel( 1 );
}
}
}
void TTrain::OnCommand_manualbrakedecrease( TTrain *Train, command_data const &Command ) {
if( Command.action != GLFW_RELEASE ) {
if( ( Train->mvOccupied->LocalBrake == ManualBrake )
|| ( Train->mvOccupied->MBrake == true ) ) {
Train->mvOccupied->DecManualBrakeLevel( 1 );
}
}
}
void TTrain::OnCommand_alarmchaintoggle( TTrain *Train, command_data const &Command ) {
if( Command.action == GLFW_PRESS ) {
if( false == Train->mvOccupied->AlarmChainFlag ) {
// pull
Train->mvOccupied->AlarmChainSwitch( true );
// visual feedback
Train->ggAlarmChain.UpdateValue( 1.0 );
}
else {
// release
Train->mvOccupied->AlarmChainSwitch( false );
// visual feedback
Train->ggAlarmChain.UpdateValue( 0.0 );
}
} }
} }
@@ -2871,6 +2919,7 @@ void TTrain::OnKeyDown(int cKey)
} }
else // McZapkie-240302 - klawisze bez shifta else // McZapkie-240302 - klawisze bez shifta
{ {
#ifdef EU07_USE_OLD_COMMAND_SYSTEM
if( cKey == Global::Keys[ k_IncLocalBrakeLevel ] ) if( cKey == Global::Keys[ k_IncLocalBrakeLevel ] )
{ // Ra 2014-09: w { // Ra 2014-09: w
// trybie latania // trybie latania
@@ -2883,10 +2932,8 @@ void TTrain::OnKeyDown(int cKey)
{ {
mvOccupied->IncManualBrakeLevel(1); mvOccupied->IncManualBrakeLevel(1);
} }
#ifdef EU07_USE_OLD_COMMAND_SYSTEM
else if (mvOccupied->LocalBrake != ManualBrake) else if (mvOccupied->LocalBrake != ManualBrake)
mvOccupied->IncLocalBrakeLevel(1); mvOccupied->IncLocalBrakeLevel(1);
#endif
} }
} }
else if (cKey == Global::Keys[k_DecLocalBrakeLevel]) else if (cKey == Global::Keys[k_DecLocalBrakeLevel])
@@ -2899,16 +2946,15 @@ void TTrain::OnKeyDown(int cKey)
if (Global::ctrlState) if (Global::ctrlState)
if ((mvOccupied->LocalBrake == ManualBrake) || (mvOccupied->MBrake == true)) if ((mvOccupied->LocalBrake == ManualBrake) || (mvOccupied->MBrake == true))
mvOccupied->DecManualBrakeLevel(1); mvOccupied->DecManualBrakeLevel(1);
#ifdef EU07_USE_OLD_COMMAND_SYSTEM
else // Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - else // Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku -
// odhamować jakoś trzeba // odhamować jakoś trzeba
if ((mvOccupied->LocalBrake != ManualBrake) || mvOccupied->LocalBrakePos) if ((mvOccupied->LocalBrake != ManualBrake) || mvOccupied->LocalBrakePos)
mvOccupied->DecLocalBrakeLevel(1); mvOccupied->DecLocalBrakeLevel(1);
#endif
} }
} }
else if (cKey == Global::Keys[k_Brake2]) else
{ #endif
if (cKey == Global::Keys[k_Brake2]) {
if (Global::ctrlState) if (Global::ctrlState)
mvOccupied->BrakeLevelSet( mvOccupied->BrakeLevelSet(
mvOccupied->Handle->GetPos(bh_NP)); // yB: czy ten stos funkcji nie powinien być jako oddzielna funkcja movera? mvOccupied->Handle->GetPos(bh_NP)); // yB: czy ten stos funkcji nie powinien być jako oddzielna funkcja movera?
@@ -6414,6 +6460,7 @@ void TTrain::clear_cab_controls()
ggBrakeCtrl.Clear(); ggBrakeCtrl.Clear();
ggLocalBrake.Clear(); ggLocalBrake.Clear();
ggManualBrake.Clear(); ggManualBrake.Clear();
ggAlarmChain.Clear();
ggBrakeProfileCtrl.Clear(); ggBrakeProfileCtrl.Clear();
ggBrakeProfileG.Clear(); ggBrakeProfileG.Clear();
ggBrakeProfileR.Clear(); ggBrakeProfileR.Clear();
@@ -6541,8 +6588,8 @@ void TTrain::clear_cab_controls()
ggRearUpperLightButton.Clear(); ggRearUpperLightButton.Clear();
ggRearLeftEndLightButton.Clear(); ggRearLeftEndLightButton.Clear();
ggRearRightEndLightButton.Clear(); ggRearRightEndLightButton.Clear();
btHaslerBrakes.Clear(12); // ciśnienie w cylindrach do odbijania na haslerze btHaslerBrakes.Clear(12); // ciśnienie w cylindrach do odbijania na haslerze
btHaslerCurrent.Clear(13); // prąd na silnikach do odbijania na haslerze btHaslerCurrent.Clear(13); // prąd na silnikach do odbijania na haslerze
} }
// NOTE: we can get rid of this function once we have per-cab persistent state // NOTE: we can get rid of this function once we have per-cab persistent state
@@ -6642,10 +6689,20 @@ void TTrain::set_cab_controls() {
ggUpperLightButton.PutValue( 1.0 ); ggUpperLightButton.PutValue( 1.0 );
} }
if( ( DynamicObject->iLights[ lightsindex ] & TMoverParameters::light::redmarker_left ) != 0 ) { if( ( DynamicObject->iLights[ lightsindex ] & TMoverParameters::light::redmarker_left ) != 0 ) {
ggLeftEndLightButton.PutValue( 1.0 ); if( ggLeftEndLightButton.SubModel != nullptr ) {
ggLeftEndLightButton.PutValue( 1.0 );
}
else {
ggLeftLightButton.PutValue( -1.0 );
}
} }
if( ( DynamicObject->iLights[ lightsindex ] & TMoverParameters::light::redmarker_right ) != 0 ) { if( ( DynamicObject->iLights[ lightsindex ] & TMoverParameters::light::redmarker_right ) != 0 ) {
ggRightEndLightButton.PutValue( 1.0 ); if( ggRightEndLightButton.SubModel != nullptr ) {
ggRightEndLightButton.PutValue( 1.0 );
}
else {
ggRightLightButton.PutValue( -1.0 );
}
} }
if( true == DynamicObject->DimHeadlights ) { if( true == DynamicObject->DimHeadlights ) {
ggDimHeadlightsButton.PutValue( 1.0 ); ggDimHeadlightsButton.PutValue( 1.0 );
@@ -6691,6 +6748,11 @@ void TTrain::set_cab_controls() {
1.0 : 1.0 :
0.0 ); 0.0 );
} }
// alarm chain
ggAlarmChain.PutValue(
mvControlled->AlarmChainFlag ?
1.0 :
0.0 );
// brake signalling // brake signalling
ggSignallingButton.PutValue( ggSignallingButton.PutValue(
mvControlled->Signalling ? mvControlled->Signalling ?
@@ -6959,6 +7021,7 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con
{ "brakectrl:", ggBrakeCtrl }, { "brakectrl:", ggBrakeCtrl },
{ "localbrake:", ggLocalBrake }, { "localbrake:", ggLocalBrake },
{ "manualbrake:", ggManualBrake }, { "manualbrake:", ggManualBrake },
{ "alarmchain:", ggAlarmChain },
{ "brakeprofile_sw:", ggBrakeProfileCtrl }, { "brakeprofile_sw:", ggBrakeProfileCtrl },
{ "brakeprofileg_sw:", ggBrakeProfileG }, { "brakeprofileg_sw:", ggBrakeProfileG },
{ "brakeprofiler_sw:", ggBrakeProfileR }, { "brakeprofiler_sw:", ggBrakeProfileR },

View File

@@ -141,6 +141,9 @@ class TTrain
static void OnCommand_trainbrakeservice( TTrain *Train, command_data const &Command ); static void OnCommand_trainbrakeservice( TTrain *Train, command_data const &Command );
static void OnCommand_trainbrakefullservice( TTrain *Train, command_data const &Command ); static void OnCommand_trainbrakefullservice( TTrain *Train, command_data const &Command );
static void OnCommand_trainbrakeemergency( TTrain *Train, command_data const &Command ); static void OnCommand_trainbrakeemergency( TTrain *Train, command_data const &Command );
static void OnCommand_manualbrakeincrease( TTrain *Train, command_data const &Command );
static void OnCommand_manualbrakedecrease( TTrain *Train, command_data const &Command );
static void OnCommand_alarmchaintoggle( TTrain *Train, command_data const &Command );
static void OnCommand_wheelspinbrakeactivate( TTrain *Train, command_data const &Command ); static void OnCommand_wheelspinbrakeactivate( TTrain *Train, command_data const &Command );
static void OnCommand_sandboxactivate( TTrain *Train, command_data const &Command ); static void OnCommand_sandboxactivate( TTrain *Train, command_data const &Command );
static void OnCommand_epbrakecontroltoggle( TTrain *Train, command_data const &Command ); static void OnCommand_epbrakecontroltoggle( TTrain *Train, command_data const &Command );
@@ -228,6 +231,7 @@ public: // reszta może by?publiczna
TGauge ggBrakeCtrl; TGauge ggBrakeCtrl;
TGauge ggLocalBrake; TGauge ggLocalBrake;
TGauge ggManualBrake; TGauge ggManualBrake;
TGauge ggAlarmChain;
TGauge ggBrakeProfileCtrl; // nastawiacz GPR - przelacznik obrotowy TGauge ggBrakeProfileCtrl; // nastawiacz GPR - przelacznik obrotowy
TGauge ggBrakeProfileG; // nastawiacz GP - hebelek towarowy TGauge ggBrakeProfileG; // nastawiacz GP - hebelek towarowy
TGauge ggBrakeProfileR; // nastawiacz PR - hamowanie dwustopniowe TGauge ggBrakeProfileR; // nastawiacz PR - hamowanie dwustopniowe

View File

@@ -41,6 +41,9 @@ commanddescription_sequence Commands_descriptions = {
{ "trainbrakeservice", command_target::vehicle }, { "trainbrakeservice", command_target::vehicle },
{ "trainbrakefullservice", command_target::vehicle }, { "trainbrakefullservice", command_target::vehicle },
{ "trainbrakeemergency", command_target::vehicle }, { "trainbrakeemergency", command_target::vehicle },
{ "manualbrakeincrease", command_target::vehicle },
{ "manualbrakedecrease", command_target::vehicle },
{ "alarmchaintoggle", command_target::vehicle },
{ "wheelspinbrakeactivate", command_target::vehicle }, { "wheelspinbrakeactivate", command_target::vehicle },
{ "sandboxactivate", command_target::vehicle }, { "sandboxactivate", command_target::vehicle },
{ "reverserincrease", command_target::vehicle }, { "reverserincrease", command_target::vehicle },

View File

@@ -36,6 +36,9 @@ enum class user_command {
trainbrakeservice, trainbrakeservice,
trainbrakefullservice, trainbrakefullservice,
trainbrakeemergency, trainbrakeemergency,
manualbrakeincrease,
manualbrakedecrease,
alarmchaintoggle,
wheelspinbrakeactivate, wheelspinbrakeactivate,
sandboxactivate, sandboxactivate,
reverserincrease, reverserincrease,

View File

@@ -208,6 +208,12 @@ keyboard_input::default_bindings() {
{ GLFW_KEY_KP_2 }, { GLFW_KEY_KP_2 },
// trainbrakeemergency // trainbrakeemergency
{ GLFW_KEY_KP_0 }, { GLFW_KEY_KP_0 },
// manualbrakeincrease
{ GLFW_KEY_KP_1 | keymodifier::control },
// manualbrakedecrease
{ GLFW_KEY_KP_7 | keymodifier::control },
// alarm chain toggle
{ GLFW_KEY_B | keymodifier::shift | keymodifier::control },
// wheelspinbrakeactivate, // wheelspinbrakeactivate,
{ GLFW_KEY_KP_ENTER }, { GLFW_KEY_KP_ENTER },
// sandboxactivate, // sandboxactivate,

View File

@@ -211,7 +211,10 @@ mouse_input::default_bindings() {
user_command::independentbrakeincrease, user_command::independentbrakeincrease,
user_command::independentbrakedecrease } }, user_command::independentbrakedecrease } },
{ "manualbrake:", { { "manualbrake:", {
user_command::none, user_command::manualbrakeincrease,
user_command::manualbrakedecrease } },
{ "alarmchain:", {
user_command::alarmchaintoggle,
user_command::none } }, user_command::none } },
{ "brakeprofile_sw:", { { "brakeprofile_sw:", {
user_command::brakeactingspeedincrease, user_command::brakeactingspeedincrease,

View File

@@ -24,6 +24,7 @@ static std::unordered_map<std::string, std::string> m_cabcontrols = {
{ "brakectrl:", "train brake" }, { "brakectrl:", "train brake" },
{ "localbrake:", "independent brake" }, { "localbrake:", "independent brake" },
{ "manualbrake:", "manual brake" }, { "manualbrake:", "manual brake" },
{ "alarmchain:", "emergency brake" },
{ "brakeprofile_sw:", "brake acting speed" }, { "brakeprofile_sw:", "brake acting speed" },
{ "brakeprofileg_sw:", "brake acting speed: cargo" }, { "brakeprofileg_sw:", "brake acting speed: cargo" },
{ "brakeprofiler_sw:", "brake acting speed: rapid" }, { "brakeprofiler_sw:", "brake acting speed: rapid" },

View File

@@ -1,5 +1,5 @@
#pragma once #pragma once
#define VERSION_MAJOR 17 #define VERSION_MAJOR 17
#define VERSION_MINOR 829 #define VERSION_MINOR 831
#define VERSION_REVISION 1 #define VERSION_REVISION 0