diff --git a/Driver.cpp b/Driver.cpp index d6ace476..e4bc70d2 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -376,9 +376,15 @@ void TSpeedPos::Set(TTrack *track, double dist, int flag) fVelNext = (trTrack->iCategoryFlag & 1) ? 0.0 : 20.0; // jeśli koniec, to pociąg stój, a samochód zwolnij +/* vPos = (((iFlags & spReverse) != 0) != ((iFlags & spEnd) != 0)) ? trTrack->CurrentSegment()->FastGetPoint_1() : 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 { // definitywny koniec skanowania, chyba że dalej puszczamy samochód po gruncie... if( ( iLast == -1 ) - || ( false == TestFlag( sSpeedTable[iLast].iFlags, spEnabled | spEnd ) ) ) { - // only if we haven't already marked end of the track + || ( ( false == TestFlag( sSpeedTable[iLast].iFlags, spEnabled | spEnd ) ) + && ( 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() ) { // zapisanie ostatniego sprawdzonego toru sSpeedTable[iLast].Set( @@ -659,6 +666,11 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) 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 return; } @@ -703,7 +715,7 @@ void TController::TableCheck(double fDistance) } 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 sSpeedTable[i].iFlags &= ~spEnabled; // nie liczy się } @@ -996,10 +1008,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN } } // koniec obsługi W4 v = sSpeedTable[i].fVelNext; // odczyt prędkości do zmiennej pomocniczej - if (sSpeedTable[i].iFlags & - spSwitch) // zwrotnice są usuwane z tabelki dopiero po zjechaniu z nich - iDrivigFlags |= - moveSwitchFound; // rozjazd z przodu/pod ogranicza np. sens skanowania wstecz + if( sSpeedTable[ i ].iFlags & spSwitch ) { + // zwrotnice są usuwane z tabelki dopiero po zjechaniu z nich + iDrivigFlags |= moveSwitchFound; // rozjazd z przodu/pod ogranicza np. sens skanowania wstecz + } else if (sSpeedTable[i].iFlags & spEvent) // W4 może się deaktywować { // jeżeli event, może być potrzeba wysłania komendy, aby ruszył // 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 { // tor ogranicza prędkość, dopóki cały skład nie przejedzie, // 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 (d < -fLength) + if( v >= 1.0 ) // EU06 się zawieszało po dojechaniu na koniec toru postojowego + if( d + sSpeedTable[ i ].trTrack->Length() < -fLength ) continue; // zapętlenie, jeśli już wyjechał za ten odcinek - if (v < fVelDes) - fVelDes = - v; // ograniczenie aktualnej prędkości aż do wyjechania za ograniczenie + if( v < fVelDes ) { + // ograniczenie aktualnej prędkości aż do wyjechania za ograniczenie + fVelDes = v; + } // if (v==0.0) fAcc=-0.9; //hamowanie jeśli stop continue; // i tyle wystarczy } @@ -1298,8 +1311,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN } // if (v>=0.0) if (fNext >= 0.0) { // jeśli ograniczenie - if ((sSpeedTable[i].iFlags & (spEnabled | spEvent)) == - (spEnabled | spEvent)) // tylko sygnał przypisujemy + if ((sSpeedTable[i].iFlags & (spEnabled | spEvent)) == (spEnabled | spEvent)) // tylko sygnał przypisujemy if (!eSignNext) // jeśli jeszcze nic nie zapisane tam eSignNext = sSpeedTable[i].evEvent; // dla informacji if (fNext == 0.0) @@ -3590,7 +3602,7 @@ TController::UpdateSituation(double dt) { // czy stan się nie zmienił. // 4. Ewentualnie uzupełnić tabelkę informacjami o sygnałach i ograniczeniach, jeśli się // "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. // 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ść. @@ -4664,9 +4676,12 @@ TController::UpdateSituation(double dt) { // Ra 2F1H: jest konflikt histerezy pomiędzy nastawioną pozycją a uzyskiwanym // przyspieszeniem - utrzymanie pozycji powoduje przekroczenie przyspieszenia if( AbsAccS < AccDesired ) { - // jeśli przyspieszenie pojazdu jest mniejsze niż żądane oraz - if( vel < VelDesired - fVelMinus ) { - // jeśli prędkość w kierunku czoła jest mniejsza od dozwolonej o margines + // jeśli przyspieszenie pojazdu jest mniejsze niż żądane oraz... + if( vel < ( + 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 > ( mvOccupied->CategoryFlag & 2 ? fMinProximityDist : // cars are allowed to move within min proximity distance diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 68a331cb..bcb743c9 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -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 */ - bool EmergencyBrakeFlag = false; // manual emergency brake + bool AlarmChainFlag = false; // manual emergency brake bool RadioStopFlag = false; /*hamowanie nagle*/ int BrakeDelayFlag = 0; /*nastawa opoznienia ham. osob/towar/posp/exp 0/1/2/4*/ int BrakeDelays = 0; /*nastawy mozliwe do uzyskania*/ @@ -1084,6 +1084,7 @@ public: bool DecManualBrakeLevel(int CtrlSpeed); bool DynamicBrakeSwitch(bool Switch); bool RadiostopSwitch(bool Switch); + bool AlarmChainSwitch( bool const State ); bool AntiSlippingBrake(void); bool BrakeReleaser(int state); bool SwitchEPBrake(int state); diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index e338b93d..53453b95 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -1082,7 +1082,7 @@ void TMoverParameters::CollisionDetect(int CouplerN, double dt) EventFlag = true; if ((coupler.CouplingFlag & ctrain_pneumatic) == ctrain_pneumatic) - EmergencyBrakeFlag = true; // hamowanie nagle - zerwanie przewodow hamulcowych + AlarmChainFlag = true; // hamowanie nagle - zerwanie przewodow hamulcowych coupler.CouplingFlag = 0; 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 EBS; - if ((BrakeSystem != Individual) && (BrakeCtrlPosNo > 0)) - { - if ((!RadioStopFlag) && Switch) - { + if( ( BrakeSystem != Individual ) + && ( BrakeCtrlPosNo > 0 ) ) { + + if( ( true == Switch ) + && ( false == RadioStopFlag ) ) { RadioStopFlag = Switch; EBS = true; } - else - { - if ((abs(V) < 0.1) && - (Switch == false)) // odblokowanie hamulca bezpieczenistwa tylko po zatrzymaniu - { + else { + if( ( Switch == false ) + && ( std::abs( V ) < 0.1 ) ) { + // odblokowanie hamulca bezpieczenistwa tylko po zatrzymaniu RadioStopFlag = Switch; EBS = true; } - else + else { EBS = false; + } } } - else - EBS = false; // nie ma hamulca bezpieczenstwa gdy nie ma hamulca zesp. + else { + // nie ma hamulca bezpieczenstwa gdy nie ma hamulca zesp. + EBS = false; + } 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 // hamowanie przeciwpoślizgowe @@ -3282,12 +3297,19 @@ void TMoverParameters::UpdatePipePressure(double dt) Pipe2->Flow(dpMainValve); } - // if(EmergencyBrakeFlag)and(BrakeCtrlPosNo=0)then //ulepszony hamulec bezp. - if ((RadioStopFlag) || (TestFlag(SecuritySystem.Status, s_SHPebrake)) || - (TestFlag(SecuritySystem.Status, s_CAebrake)) || - (s_CAtestebrake == true) || - (TestFlag(EngDmgFlag, 32)) /* or (not Battery)*/) // ulepszony hamulec bezp. - dpMainValve = dpMainValve + PF(0, PipePress, 0.15) * dt; + // ulepszony hamulec bezp. + if( ( true == RadioStopFlag ) + || ( true == AlarmChainFlag ) + || ( true == TestFlag( SecuritySystem.Status, s_SHPebrake ) ) + || ( true == TestFlag( SecuritySystem.Status, s_CAebrake ) ) +/* + // 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 Pipe->Flow(-dpMainValve); Pipe->Flow(-(PipePress)*0.001 * dt); diff --git a/Train.cpp b/Train.cpp index 61ca575a..c6f54547 100644 --- a/Train.cpp +++ b/Train.cpp @@ -217,6 +217,9 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = { { user_command::trainbrakeservice, &TTrain::OnCommand_trainbrakeservice }, { user_command::trainbrakefullservice, &TTrain::OnCommand_trainbrakefullservice }, { 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::sandboxactivate, &TTrain::OnCommand_sandboxactivate }, { 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 ) { - if( Command.action != GLFW_RELEASE ) { + if( Command.action == GLFW_PRESS ) { // sound feedback 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 ) { - if( Command.action != GLFW_RELEASE ) { + if( Command.action == GLFW_PRESS ) { // sound feedback 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 ) { - if( Command.action != GLFW_RELEASE ) { + if( Command.action == GLFW_PRESS ) { // sound feedback if( ( Train->is_eztoer() ) @@ -879,14 +882,14 @@ void TTrain::OnCommand_trainbrakeservice( TTrain *Train, command_data const &Com Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->BrakeCtrlPosNo / 2 + ( Train->mvOccupied->BrakeHandle == FV4a ? - 1 : - 0 ) ); + 1 : + 0 ) ); } } void TTrain::OnCommand_trainbrakefullservice( TTrain *Train, command_data const &Command ) { - if( Command.action != GLFW_RELEASE ) { + if( Command.action == GLFW_PRESS ) { // sound feedback 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 ) { - if( Command.action != GLFW_RELEASE ) { + if( Command.action == GLFW_PRESS ) { Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->Handle->GetPos( bh_EB ) ); +/* if( Train->mvOccupied->BrakeCtrlPosNo <= 0.1 ) { // hamulec bezpieczeństwa dla wagonów 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 { +#ifdef EU07_USE_OLD_COMMAND_SYSTEM if( cKey == Global::Keys[ k_IncLocalBrakeLevel ] ) { // Ra 2014-09: w // trybie latania @@ -2883,10 +2932,8 @@ void TTrain::OnKeyDown(int cKey) { mvOccupied->IncManualBrakeLevel(1); } -#ifdef EU07_USE_OLD_COMMAND_SYSTEM else if (mvOccupied->LocalBrake != ManualBrake) mvOccupied->IncLocalBrakeLevel(1); -#endif } } else if (cKey == Global::Keys[k_DecLocalBrakeLevel]) @@ -2899,16 +2946,15 @@ void TTrain::OnKeyDown(int cKey) if (Global::ctrlState) if ((mvOccupied->LocalBrake == ManualBrake) || (mvOccupied->MBrake == true)) mvOccupied->DecManualBrakeLevel(1); -#ifdef EU07_USE_OLD_COMMAND_SYSTEM else // Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - // odhamować jakoś trzeba if ((mvOccupied->LocalBrake != ManualBrake) || mvOccupied->LocalBrakePos) mvOccupied->DecLocalBrakeLevel(1); -#endif } } - else if (cKey == Global::Keys[k_Brake2]) - { + else +#endif + if (cKey == Global::Keys[k_Brake2]) { if (Global::ctrlState) mvOccupied->BrakeLevelSet( 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(); ggLocalBrake.Clear(); ggManualBrake.Clear(); + ggAlarmChain.Clear(); ggBrakeProfileCtrl.Clear(); ggBrakeProfileG.Clear(); ggBrakeProfileR.Clear(); @@ -6541,8 +6588,8 @@ void TTrain::clear_cab_controls() ggRearUpperLightButton.Clear(); ggRearLeftEndLightButton.Clear(); ggRearRightEndLightButton.Clear(); - btHaslerBrakes.Clear(12); // ciśnienie w cylindrach do odbijania na haslerze - btHaslerCurrent.Clear(13); // prąd na silnikach 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 } // 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 ); } 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 ) { - ggRightEndLightButton.PutValue( 1.0 ); + if( ggRightEndLightButton.SubModel != nullptr ) { + ggRightEndLightButton.PutValue( 1.0 ); + } + else { + ggRightLightButton.PutValue( -1.0 ); + } } if( true == DynamicObject->DimHeadlights ) { ggDimHeadlightsButton.PutValue( 1.0 ); @@ -6691,6 +6748,11 @@ void TTrain::set_cab_controls() { 1.0 : 0.0 ); } + // alarm chain + ggAlarmChain.PutValue( + mvControlled->AlarmChainFlag ? + 1.0 : + 0.0 ); // brake signalling ggSignallingButton.PutValue( mvControlled->Signalling ? @@ -6959,6 +7021,7 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con { "brakectrl:", ggBrakeCtrl }, { "localbrake:", ggLocalBrake }, { "manualbrake:", ggManualBrake }, + { "alarmchain:", ggAlarmChain }, { "brakeprofile_sw:", ggBrakeProfileCtrl }, { "brakeprofileg_sw:", ggBrakeProfileG }, { "brakeprofiler_sw:", ggBrakeProfileR }, diff --git a/Train.h b/Train.h index e795650e..90a5ac6d 100644 --- a/Train.h +++ b/Train.h @@ -141,6 +141,9 @@ class TTrain static void OnCommand_trainbrakeservice( 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_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_sandboxactivate( 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 ggLocalBrake; TGauge ggManualBrake; + TGauge ggAlarmChain; TGauge ggBrakeProfileCtrl; // nastawiacz GPR - przelacznik obrotowy TGauge ggBrakeProfileG; // nastawiacz GP - hebelek towarowy TGauge ggBrakeProfileR; // nastawiacz PR - hamowanie dwustopniowe diff --git a/command.cpp b/command.cpp index d2bd0fca..3f4b6f56 100644 --- a/command.cpp +++ b/command.cpp @@ -41,6 +41,9 @@ commanddescription_sequence Commands_descriptions = { { "trainbrakeservice", command_target::vehicle }, { "trainbrakefullservice", command_target::vehicle }, { "trainbrakeemergency", command_target::vehicle }, + { "manualbrakeincrease", command_target::vehicle }, + { "manualbrakedecrease", command_target::vehicle }, + { "alarmchaintoggle", command_target::vehicle }, { "wheelspinbrakeactivate", command_target::vehicle }, { "sandboxactivate", command_target::vehicle }, { "reverserincrease", command_target::vehicle }, diff --git a/command.h b/command.h index 0b2c4ba4..a06509e5 100644 --- a/command.h +++ b/command.h @@ -36,6 +36,9 @@ enum class user_command { trainbrakeservice, trainbrakefullservice, trainbrakeemergency, + manualbrakeincrease, + manualbrakedecrease, + alarmchaintoggle, wheelspinbrakeactivate, sandboxactivate, reverserincrease, diff --git a/keyboardinput.cpp b/keyboardinput.cpp index 7db76e4e..cc7041c4 100644 --- a/keyboardinput.cpp +++ b/keyboardinput.cpp @@ -208,6 +208,12 @@ keyboard_input::default_bindings() { { GLFW_KEY_KP_2 }, // trainbrakeemergency { 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, { GLFW_KEY_KP_ENTER }, // sandboxactivate, diff --git a/mouseinput.cpp b/mouseinput.cpp index e5b8c1de..3709740c 100644 --- a/mouseinput.cpp +++ b/mouseinput.cpp @@ -211,7 +211,10 @@ mouse_input::default_bindings() { user_command::independentbrakeincrease, user_command::independentbrakedecrease } }, { "manualbrake:", { - user_command::none, + user_command::manualbrakeincrease, + user_command::manualbrakedecrease } }, + { "alarmchain:", { + user_command::alarmchaintoggle, user_command::none } }, { "brakeprofile_sw:", { user_command::brakeactingspeedincrease, diff --git a/translation.h b/translation.h index c18a865b..297f35cf 100644 --- a/translation.h +++ b/translation.h @@ -24,6 +24,7 @@ static std::unordered_map m_cabcontrols = { { "brakectrl:", "train brake" }, { "localbrake:", "independent brake" }, { "manualbrake:", "manual brake" }, + { "alarmchain:", "emergency brake" }, { "brakeprofile_sw:", "brake acting speed" }, { "brakeprofileg_sw:", "brake acting speed: cargo" }, { "brakeprofiler_sw:", "brake acting speed: rapid" }, diff --git a/version.h b/version.h index 1334935a..5b91b3dc 100644 --- a/version.h +++ b/version.h @@ -1,5 +1,5 @@ #pragma once #define VERSION_MAJOR 17 -#define VERSION_MINOR 829 -#define VERSION_REVISION 1 +#define VERSION_MINOR 831 +#define VERSION_REVISION 0