From c166c5429e501e3e6828d1ac54153a65b6b1ec3e Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Wed, 10 Jan 2018 20:46:58 +0100 Subject: [PATCH] conversion of remaining train controls to the new control system, fix for potentially incorrect rendering of flex track pieces --- Track.cpp | 14 +- Train.cpp | 623 +++++++++++++++++++++++++++++++++------------- Train.h | 20 ++ World.cpp | 31 ++- command.cpp | 38 +-- command.h | 38 +-- keyboardinput.cpp | 47 +++- 7 files changed, 578 insertions(+), 233 deletions(-) diff --git a/Track.cpp b/Track.cpp index a6fbd837..db3e1ebd 100644 --- a/Track.cpp +++ b/Track.cpp @@ -487,8 +487,18 @@ void TTrack::Load(cParser *parser, vector3 pOrigin) } if( fRadius != 0 ) // gdy podany promień segsize = clamp( std::fabs( fRadius ) * ( 0.02 / Global::SplineFidelity ), 2.0 / Global::SplineFidelity, 10.0 ); - else - segsize = 10.0; // for straights, 10m per segment works good enough + else { + // HACK: crude check whether claimed straight is an actual straight piece + // NOTE: won't detect cases where control points are placed on the straight line formed by the ends, but, eh + if( ( cp1 == Math3D::vector3() ) + && ( cp1 == Math3D::vector3() ) ) { + segsize = 10.0; // for straights, 10m per segment works good enough + } + else { + // HACK: divide roughly in 10 segments. + segsize = clamp( fTrackLength * ( 0.1 / Global::SplineFidelity ), 2.0 / Global::SplineFidelity, 10.0 ); + } + } if ((((p1 + p1 + p2) / 3.0 - p1 - cp1).Length() < 0.02) || (((p1 + p2 + p2) / 3.0 - p2 + cp1).Length() < 0.02)) diff --git a/Train.cpp b/Train.cpp index ff2deb40..91a76901 100644 --- a/Train.cpp +++ b/Train.cpp @@ -16,6 +16,7 @@ http://mozilla.org/MPL/2.0/. #include "Train.h" #include "Globals.h" +#include "simulation.h" #include "Logs.h" #include "MdlMngr.h" #include "Timer.h" @@ -194,6 +195,8 @@ void TCab::Update() // TBD, TODO: consider this approach if we ever want to have customized consist behaviour to received commands, based on the consist/vehicle type or whatever TTrain::commandhandler_map const TTrain::m_commandhandlers = { + { user_command::aidriverenable, &TTrain::OnCommand_aidriverenable }, + { user_command::aidriverdisable, &TTrain::OnCommand_aidriverdisable }, { user_command::mastercontrollerincrease, &TTrain::OnCommand_mastercontrollerincrease }, { user_command::mastercontrollerincreasefast, &TTrain::OnCommand_mastercontrollerincreasefast }, { user_command::mastercontrollerdecrease, &TTrain::OnCommand_mastercontrollerdecrease }, @@ -216,7 +219,12 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = { { user_command::trainbrakefirstservice, &TTrain::OnCommand_trainbrakefirstservice }, { user_command::trainbrakeservice, &TTrain::OnCommand_trainbrakeservice }, { user_command::trainbrakefullservice, &TTrain::OnCommand_trainbrakefullservice }, + { user_command::trainbrakehandleoff, &TTrain::OnCommand_trainbrakehandleoff }, { user_command::trainbrakeemergency, &TTrain::OnCommand_trainbrakeemergency }, + { user_command::trainbrakebasepressureincrease, &TTrain::OnCommand_trainbrakebasepressureincrease }, + { user_command::trainbrakebasepressuredecrease, &TTrain::OnCommand_trainbrakebasepressuredecrease }, + { user_command::trainbrakebasepressurereset, &TTrain::OnCommand_trainbrakebasepressurereset }, + { user_command::trainbrakeoperationtoggle, &TTrain::OnCommand_trainbrakeoperationtoggle }, { user_command::manualbrakeincrease, &TTrain::OnCommand_manualbrakeincrease }, { user_command::manualbrakedecrease, &TTrain::OnCommand_manualbrakedecrease }, { user_command::alarmchaintoggle, &TTrain::OnCommand_alarmchaintoggle }, @@ -225,6 +233,8 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = { { user_command::epbrakecontroltoggle, &TTrain::OnCommand_epbrakecontroltoggle }, { user_command::brakeactingspeedincrease, &TTrain::OnCommand_brakeactingspeedincrease }, { user_command::brakeactingspeeddecrease, &TTrain::OnCommand_brakeactingspeeddecrease }, + { user_command::brakeloadcompensationincrease, &TTrain::OnCommand_brakeloadcompensationincrease }, + { user_command::brakeloadcompensationdecrease, &TTrain::OnCommand_brakeloadcompensationdecrease }, { user_command::mubrakingindicatortoggle, &TTrain::OnCommand_mubrakingindicatortoggle }, { user_command::reverserincrease, &TTrain::OnCommand_reverserincrease }, { user_command::reverserdecrease, &TTrain::OnCommand_reverserdecrease }, @@ -258,6 +268,8 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = { { user_command::headlighttogglerearupper, &TTrain::OnCommand_headlighttogglerearupper }, { user_command::redmarkertogglerearleft, &TTrain::OnCommand_redmarkertogglerearleft }, { user_command::redmarkertogglerearright, &TTrain::OnCommand_redmarkertogglerearright }, + { user_command::redmarkerstoggle, &TTrain::OnCommand_redmarkerstoggle }, + { user_command::endsignalstoggle, &TTrain::OnCommand_endsignalstoggle }, { user_command::headlightsdimtoggle, &TTrain::OnCommand_headlightsdimtoggle }, { user_command::interiorlighttoggle, &TTrain::OnCommand_interiorlighttoggle }, { user_command::interiorlightdimtoggle, &TTrain::OnCommand_interiorlightdimtoggle }, @@ -265,11 +277,17 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = { { user_command::doorlocktoggle, &TTrain::OnCommand_doorlocktoggle }, { user_command::doortoggleleft, &TTrain::OnCommand_doortoggleleft }, { user_command::doortoggleright, &TTrain::OnCommand_doortoggleright }, + { user_command::carcouplingincrease, &TTrain::OnCommand_carcouplingincrease }, + { user_command::carcouplingdisconnect, &TTrain::OnCommand_carcouplingdisconnect }, { user_command::departureannounce, &TTrain::OnCommand_departureannounce }, { user_command::hornlowactivate, &TTrain::OnCommand_hornlowactivate }, { user_command::hornhighactivate, &TTrain::OnCommand_hornhighactivate }, { user_command::radiotoggle, &TTrain::OnCommand_radiotoggle }, + { user_command::radiochannelincrease, &TTrain::OnCommand_radiochannelincrease }, + { user_command::radiochanneldecrease, &TTrain::OnCommand_radiochanneldecrease }, { user_command::radiostoptest, &TTrain::OnCommand_radiostoptest }, + { user_command::cabchangeforward, &TTrain::OnCommand_cabchangeforward }, + { user_command::cabchangebackward, &TTrain::OnCommand_cabchangebackward }, { user_command::generictoggle0, &TTrain::OnCommand_generictoggle }, { user_command::generictoggle1, &TTrain::OnCommand_generictoggle }, { user_command::generictoggle2, &TTrain::OnCommand_generictoggle }, @@ -528,7 +546,46 @@ bool TTrain::is_eztoer() const { && ( mvControlled->ActiveDir != 0 ) ); // od yB } +// locates nearest vehicle belonging to the consist +TDynamicObject * +TTrain::find_nearest_consist_vehicle() const { + + if( false == FreeFlyModeFlag ) { + return DynamicObject; + } + auto coupler { -2 }; // scan for vehicle, not any specific coupler + auto *vehicle{ DynamicObject->ABuScanNearestObject( DynamicObject->GetTrack(), 1, 1500, coupler ) }; + if( vehicle == nullptr ) + vehicle = DynamicObject->ABuScanNearestObject( DynamicObject->GetTrack(), -1, 1500, coupler ); + // TBD, TODO: perform owner test for the located vehicle + return vehicle; +} + + // command handlers +void TTrain::OnCommand_aidriverenable( TTrain *Train, command_data const &Command ) { + + if( Command.action == GLFW_PRESS ) { + // on press + if( Train->DynamicObject->Mechanik == nullptr ) { return; } + + if( true == Train->DynamicObject->Mechanik->AIControllFlag ) { + //żeby nie trzeba było rozłączać dla zresetowania + Train->DynamicObject->Mechanik->TakeControl( false ); + } + Train->DynamicObject->Mechanik->TakeControl( true ); + } +} + +void TTrain::OnCommand_aidriverdisable( TTrain *Train, command_data const &Command ) { + + if( Command.action == GLFW_PRESS ) { + // on press + if( Train->DynamicObject->Mechanik ) + Train->DynamicObject->Mechanik->TakeControl( false ); + } +} + void TTrain::OnCommand_mastercontrollerincrease( TTrain *Train, command_data const &Command ) { if( Command.action != GLFW_RELEASE ) { @@ -690,25 +747,42 @@ void TTrain::OnCommand_independentbrakedecreasefast( TTrain *Train, command_data } void TTrain::OnCommand_independentbrakebailoff( TTrain *Train, command_data const &Command ) { - // TODO: check if this set of conditions can be simplified. - // it'd be more flexible to have an attribute indicating whether bail off position is supported - if( ( Train->mvControlled->TrainType != dt_EZT ) - && ( ( Train->mvControlled->EngineType == ElectricSeriesMotor ) - || ( Train->mvControlled->EngineType == DieselElectric ) - || ( Train->mvControlled->EngineType == ElectricInductionMotor ) ) - && ( Train->mvOccupied->BrakeCtrlPosNo > 0 ) ) { - if( Command.action != GLFW_RELEASE ) { - // press or hold - Train->mvOccupied->BrakeReleaser( 1 ); - // visual feedback - Train->ggReleaserButton.UpdateValue( 1.0, Train->dsbSwitch ); + if( false == FreeFlyModeFlag ) { + // TODO: check if this set of conditions can be simplified. + // it'd be more flexible to have an attribute indicating whether bail off position is supported + if( ( Train->mvControlled->TrainType != dt_EZT ) + && ( ( Train->mvControlled->EngineType == ElectricSeriesMotor ) + || ( Train->mvControlled->EngineType == DieselElectric ) + || ( Train->mvControlled->EngineType == ElectricInductionMotor ) ) + && ( Train->mvOccupied->BrakeCtrlPosNo > 0 ) ) { + + if( Command.action != GLFW_RELEASE ) { + // press or hold + Train->mvOccupied->BrakeReleaser( 1 ); + // visual feedback + Train->ggReleaserButton.UpdateValue( 1.0, Train->dsbSwitch ); + } + else { + // release + Train->mvOccupied->BrakeReleaser( 0 ); + // visual feedback + Train->ggReleaserButton.UpdateValue( 0.0, Train->dsbSwitch ); + } } - else { - // release - Train->mvOccupied->BrakeReleaser( 0 ); - // visual feedback - Train->ggReleaserButton.UpdateValue( 0.0, Train->dsbSwitch ); + } + else { + // car brake handling, while in walk mode + auto *vehicle { Train->find_nearest_consist_vehicle() }; + if( vehicle != nullptr ) { + if( Command.action != GLFW_RELEASE ) { + // press or hold + vehicle->MoverParameters->BrakeReleaser( 1 ); + } + else { + // release + vehicle->MoverParameters->BrakeReleaser( 0 ); + } } } } @@ -874,6 +948,14 @@ void TTrain::OnCommand_trainbrakefullservice( TTrain *Train, command_data const } } +void TTrain::OnCommand_trainbrakehandleoff( TTrain *Train, command_data const &Command ) { + + if( Command.action == GLFW_PRESS ) { + + Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->Handle->GetPos( bh_NP ) ); + } +} + void TTrain::OnCommand_trainbrakeemergency( TTrain *Train, command_data const &Command ) { if( Command.action == GLFW_PRESS ) { @@ -888,14 +970,70 @@ void TTrain::OnCommand_trainbrakeemergency( TTrain *Train, command_data const &C } } +void TTrain::OnCommand_trainbrakebasepressureincrease( TTrain *Train, command_data const &Command ) { + + if( Command.action != GLFW_RELEASE ) { + + switch( Train->mvOccupied->BrakeHandle ) { + case FV4a: { + Train->mvOccupied->BrakeCtrlPos2 = clamp( Train->mvOccupied->BrakeCtrlPos2 - 0.01, -1.5, 2.0 ); + break; + } + default: { + Train->mvOccupied->BrakeLevelAdd( 0.01 ); + break; + } + } + } +} + +void TTrain::OnCommand_trainbrakebasepressuredecrease( TTrain *Train, command_data const &Command ) { + + if( Command.action != GLFW_RELEASE ) { + + switch( Train->mvOccupied->BrakeHandle ) { + case FV4a: { + Train->mvOccupied->BrakeCtrlPos2 = clamp( Train->mvOccupied->BrakeCtrlPos2 + 0.01, -1.5, 2.0 ); + break; + } + default: { + Train->mvOccupied->BrakeLevelAdd( -0.01 ); + break; + } + } + } +} + +void TTrain::OnCommand_trainbrakebasepressurereset( TTrain *Train, command_data const &Command ) { + + if( Command.action == GLFW_PRESS ) { + + Train->mvOccupied->BrakeCtrlPos2 = 0; + } +} + +void TTrain::OnCommand_trainbrakeoperationtoggle( TTrain *Train, command_data const &Command ) { + + if( Command.action == GLFW_PRESS ) { + + auto *vehicle { Train->find_nearest_consist_vehicle() }; + if( vehicle == nullptr ) { return; } + + vehicle->MoverParameters->Hamulec->SetBrakeStatus( vehicle->MoverParameters->Hamulec->GetBrakeStatus() ^ b_dmg ); + } +} + void TTrain::OnCommand_manualbrakeincrease( TTrain *Train, command_data const &Command ) { if( Command.action != GLFW_RELEASE ) { - if( ( Train->mvOccupied->LocalBrake == ManualBrake ) - || ( Train->mvOccupied->MBrake == true ) ) { + auto *vehicle { Train->find_nearest_consist_vehicle() }; + if( vehicle == nullptr ) { return; } - Train->mvOccupied->IncManualBrakeLevel( 1 ); + if( ( vehicle->MoverParameters->LocalBrake == ManualBrake ) + || ( vehicle->MoverParameters->MBrake == true ) ) { + + vehicle->MoverParameters->IncManualBrakeLevel( 1 ); } } } @@ -904,10 +1042,13 @@ void TTrain::OnCommand_manualbrakedecrease( TTrain *Train, command_data const &C if( Command.action != GLFW_RELEASE ) { - if( ( Train->mvOccupied->LocalBrake == ManualBrake ) - || ( Train->mvOccupied->MBrake == true ) ) { + auto *vehicle { Train->find_nearest_consist_vehicle() }; + if( vehicle == nullptr ) { return; } - Train->mvOccupied->DecManualBrakeLevel( 1 ); + if( ( vehicle->MoverParameters->LocalBrake == ManualBrake ) + || ( vehicle->MoverParameters->MBrake == true ) ) { + + vehicle->MoverParameters->DecManualBrakeLevel( 1 ); } } } @@ -940,26 +1081,38 @@ void TTrain::OnCommand_wheelspinbrakeactivate( TTrain *Train, command_data const } return; } - if( Train->mvOccupied->BrakeSystem == ElectroPneumatic ) { - return; - } - if( Command.action != GLFW_RELEASE ) { - // press or hold - Train->mvControlled->AntiSlippingBrake(); - // visual feedback - Train->ggAntiSlipButton.UpdateValue( 1.0, Train->dsbSwitch ); + if( Train->mvOccupied->BrakeSystem != ElectroPneumatic ) { + // standard behaviour + if( Command.action != GLFW_RELEASE ) { + // press or hold + Train->mvControlled->AntiSlippingBrake(); + // visual feedback + Train->ggAntiSlipButton.UpdateValue( 1.0, Train->dsbSwitch ); + } + else { + // release + // visual feedback + Train->ggAntiSlipButton.UpdateValue( 0.0 ); + } } else { - // release -/* - // audio feedback - if( Train->ggAntiSlipButton.GetValue() > 0.5 ) { - Train->play_sound( Train->dsbSwitch ); + // electro-pneumatic, custom case + if( Command.action != GLFW_RELEASE ) { + // press or hold + if( ( Train->mvOccupied->BrakeHandle == St113 ) + && ( Train->mvControlled->EpFuse == true ) ) { + Train->mvOccupied->SwitchEPBrake( 1 ); + } + // visual feedback + Train->ggAntiSlipButton.UpdateValue( 1.0, Train->dsbPneumaticSwitch ); + } + else { + // release + Train->mvOccupied->SwitchEPBrake( 0 ); + // visual feedback + Train->ggAntiSlipButton.UpdateValue( 0.0 ); } -*/ - // visual feedback - Train->ggAntiSlipButton.UpdateValue( 0.0 ); } } @@ -1023,36 +1176,45 @@ void TTrain::OnCommand_epbrakecontroltoggle( TTrain *Train, command_data const & void TTrain::OnCommand_brakeactingspeedincrease( TTrain *Train, command_data const &Command ) { if( Command.action == GLFW_PRESS ) { - if( ( Train->mvOccupied->BrakeDelayFlag & bdelay_M ) != 0 ) { + + auto *vehicle { Train->find_nearest_consist_vehicle() }; + if( vehicle == nullptr ) { return; } + + if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_M ) != 0 ) { // can't speed it up any more than this return; } auto const fasterbrakesetting = ( - Train->mvOccupied->BrakeDelayFlag < bdelay_R ? - Train->mvOccupied->BrakeDelayFlag << 1 : - Train->mvOccupied->BrakeDelayFlag | bdelay_M ); - if( true == Train->mvOccupied->BrakeDelaySwitch( fasterbrakesetting ) ) { - // visual feedback - if( Train->ggBrakeProfileCtrl.SubModel != nullptr ) { - Train->ggBrakeProfileCtrl.UpdateValue( - ( ( Train->mvOccupied->BrakeDelayFlag & bdelay_R ) != 0 ? - 2.0 : - Train->mvOccupied->BrakeDelayFlag - 1 ), - Train->dsbSwitch ); - } - if( Train->ggBrakeProfileG.SubModel != nullptr ) { - Train->ggBrakeProfileG.UpdateValue( - ( Train->mvOccupied->BrakeDelayFlag == bdelay_G ? - 1.0 : - 0.0 ), - Train->dsbSwitch ); - } - if( Train->ggBrakeProfileR.SubModel != nullptr ) { - Train->ggBrakeProfileR.UpdateValue( - ( ( Train->mvOccupied->BrakeDelayFlag & bdelay_R ) != 0 ? - 1.0 : - 0.0 ), - Train->dsbSwitch ); + vehicle->MoverParameters->BrakeDelayFlag < bdelay_R ? + vehicle->MoverParameters->BrakeDelayFlag << 1 : + vehicle->MoverParameters->BrakeDelayFlag | bdelay_M ); + + if( true == vehicle->MoverParameters->BrakeDelaySwitch( fasterbrakesetting ) ) { + + if( vehicle == Train->DynamicObject ) { + // visual feedback + // TODO: add setting indicator to vehicle + if( Train->ggBrakeProfileCtrl.SubModel != nullptr ) { + Train->ggBrakeProfileCtrl.UpdateValue( + ( ( Train->mvOccupied->BrakeDelayFlag & bdelay_R ) != 0 ? + 2.0 : + Train->mvOccupied->BrakeDelayFlag - 1 ), + Train->dsbSwitch ); + } + if( Train->ggBrakeProfileG.SubModel != nullptr ) { + Train->ggBrakeProfileG.UpdateValue( + ( Train->mvOccupied->BrakeDelayFlag == bdelay_G ? + 1.0 : + 0.0 ), + Train->dsbSwitch ); + } + if( Train->ggBrakeProfileR.SubModel != nullptr ) { + Train->ggBrakeProfileR.UpdateValue( + ( ( Train->mvOccupied->BrakeDelayFlag & bdelay_R ) != 0 ? + 1.0 : + 0.0 ), + Train->dsbSwitch ); + } } } } @@ -1061,41 +1223,72 @@ void TTrain::OnCommand_brakeactingspeedincrease( TTrain *Train, command_data con void TTrain::OnCommand_brakeactingspeeddecrease( TTrain *Train, command_data const &Command ) { if( Command.action == GLFW_PRESS ) { - if( Train->mvOccupied->BrakeDelayFlag == bdelay_G ) { + + auto *vehicle { Train->find_nearest_consist_vehicle() }; + if( vehicle == nullptr ) { return; } + + if( vehicle->MoverParameters->BrakeDelayFlag == bdelay_G ) { // can't slow it down any more than this return; } auto const slowerbrakesetting = ( - Train->mvOccupied->BrakeDelayFlag < bdelay_M ? - Train->mvOccupied->BrakeDelayFlag >> 1 : - Train->mvOccupied->BrakeDelayFlag ^ bdelay_M ); - if( true == Train->mvOccupied->BrakeDelaySwitch( slowerbrakesetting ) ) { - // visual feedback - if( Train->ggBrakeProfileCtrl.SubModel != nullptr ) { - Train->ggBrakeProfileCtrl.UpdateValue( - ( ( Train->mvOccupied->BrakeDelayFlag & bdelay_R ) != 0 ? - 2.0 : - Train->mvOccupied->BrakeDelayFlag - 1 ), - Train->dsbSwitch ); - } - if( Train->ggBrakeProfileG.SubModel != nullptr ) { - Train->ggBrakeProfileG.UpdateValue( - ( Train->mvOccupied->BrakeDelayFlag == bdelay_G ? - 1.0 : - 0.0 ), - Train->dsbSwitch ); - } - if( Train->ggBrakeProfileR.SubModel != nullptr ) { - Train->ggBrakeProfileR.UpdateValue( - ( ( Train->mvOccupied->BrakeDelayFlag & bdelay_R ) != 0 ? - 1.0 : - 0.0 ), - Train->dsbSwitch ); + vehicle->MoverParameters->BrakeDelayFlag < bdelay_M ? + vehicle->MoverParameters->BrakeDelayFlag >> 1 : + vehicle->MoverParameters->BrakeDelayFlag ^ bdelay_M ); + + if( true == vehicle->MoverParameters->BrakeDelaySwitch( slowerbrakesetting ) ) { + + if( vehicle == Train->DynamicObject ) { + // visual feedback + // TODO: add setting indicator to vehicle + if( Train->ggBrakeProfileCtrl.SubModel != nullptr ) { + Train->ggBrakeProfileCtrl.UpdateValue( + ( ( Train->mvOccupied->BrakeDelayFlag & bdelay_R ) != 0 ? + 2.0 : + Train->mvOccupied->BrakeDelayFlag - 1 ), + Train->dsbSwitch ); + } + if( Train->ggBrakeProfileG.SubModel != nullptr ) { + Train->ggBrakeProfileG.UpdateValue( + ( Train->mvOccupied->BrakeDelayFlag == bdelay_G ? + 1.0 : + 0.0 ), + Train->dsbSwitch ); + } + if( Train->ggBrakeProfileR.SubModel != nullptr ) { + Train->ggBrakeProfileR.UpdateValue( + ( ( Train->mvOccupied->BrakeDelayFlag & bdelay_R ) != 0 ? + 1.0 : + 0.0 ), + Train->dsbSwitch ); + } } } } } +void TTrain::OnCommand_brakeloadcompensationincrease( TTrain *Train, command_data const &Command ) { + + if( ( true == FreeFlyModeFlag ) + && ( Command.action == GLFW_PRESS ) ) { + auto *vehicle { Train->find_nearest_consist_vehicle() }; + if( vehicle != nullptr ) { + vehicle->MoverParameters->IncBrakeMult(); + } + } +} + +void TTrain::OnCommand_brakeloadcompensationdecrease( TTrain *Train, command_data const &Command ) { + + if( ( true == FreeFlyModeFlag ) + && ( Command.action == GLFW_PRESS ) ) { + auto *vehicle { Train->find_nearest_consist_vehicle() }; + if( vehicle != nullptr ) { + vehicle->MoverParameters->DecBrakeMult(); + } + } +} + void TTrain::OnCommand_mubrakingindicatortoggle( TTrain *Train, command_data const &Command ) { if( Train->ggSignallingButton.SubModel == nullptr ) { @@ -2442,6 +2635,58 @@ void TTrain::OnCommand_redmarkertogglerearright( TTrain *Train, command_data con } } +void TTrain::OnCommand_redmarkerstoggle( TTrain *Train, command_data const &Command ) { + + if( ( true == FreeFlyModeFlag ) + && ( Command.action == GLFW_PRESS ) ) { + + auto *vehicle { std::get( simulation::Region->find_vehicle( Global::pCameraPosition, 10, false, true ) ) }; + + if( vehicle == nullptr ) { return; } + + int const CouplNr { + clamp( + vehicle->DirectionGet() + * ( LengthSquared3( vehicle->HeadPosition() - Global::pCameraPosition ) > LengthSquared3( vehicle->RearPosition() - Global::pCameraPosition ) ? + 1 : + -1 ), + 0, 1 ) }; // z [-1,1] zrobić [0,1] + + auto const lightset { light::redmarker_left | light::redmarker_right }; + + vehicle->iLights[ CouplNr ] = ( + false == TestFlag( vehicle->iLights[ CouplNr ], lightset ) ? + vehicle->iLights[ CouplNr ] |= lightset : // turn signals on + vehicle->iLights[ CouplNr ] ^= lightset ); // turn signals off + } +} + +void TTrain::OnCommand_endsignalstoggle( TTrain *Train, command_data const &Command ) { + + if( ( true == FreeFlyModeFlag ) + && ( Command.action == GLFW_PRESS ) ) { + + auto *vehicle { std::get( simulation::Region->find_vehicle( Global::pCameraPosition, 10, false, true ) ) }; + + if( vehicle == nullptr ) { return; } + + int const CouplNr { + clamp( + vehicle->DirectionGet() + * ( LengthSquared3( vehicle->HeadPosition() - Global::pCameraPosition ) > LengthSquared3( vehicle->RearPosition() - Global::pCameraPosition ) ? + 1 : + -1 ), + 0, 1 ) }; // z [-1,1] zrobić [0,1] + + auto const lightset { light::rearendsignals }; + + vehicle->iLights[ CouplNr ] = ( + false == TestFlag( vehicle->iLights[ CouplNr ], lightset ) ? + vehicle->iLights[ CouplNr ] |= lightset : // turn signals on + vehicle->iLights[ CouplNr ] ^= lightset ); // turn signals off + } +} + void TTrain::OnCommand_headlightsdimtoggle( TTrain *Train, command_data const &Command ) { // NOTE: the check is disabled, as we're presuming light control is present in every vehicle @@ -2721,6 +2966,48 @@ void TTrain::OnCommand_doortoggleright( TTrain *Train, command_data const &Comma } } +void TTrain::OnCommand_carcouplingincrease( TTrain *Train, command_data const &Command ) { + + if( true == FreeFlyModeFlag ) { + // tryb freefly + auto coupler { -1 }; + auto *vehicle { Train->DynamicObject->ABuScanNearestObject( Train->DynamicObject->GetTrack(), 1, 1500, coupler ) }; + if( vehicle == nullptr ) + vehicle = Train->DynamicObject->ABuScanNearestObject( Train->DynamicObject->GetTrack(), -1, 1500, coupler ); + + if( ( coupler != -1 ) + && ( vehicle != nullptr ) ) { + + vehicle->couple( coupler ); + } + if( Train->DynamicObject->Mechanik ) { + // aktualizacja flag kierunku w składzie + Train->DynamicObject->Mechanik->CheckVehicles( Connect ); + } + } +} + +void TTrain::OnCommand_carcouplingdisconnect( TTrain *Train, command_data const &Command ) { + + if( true == FreeFlyModeFlag ) { + // tryb freefly + auto coupler { -1 }; + auto *vehicle { Train->DynamicObject->ABuScanNearestObject( Train->DynamicObject->GetTrack(), 1, 1500, coupler ) }; + if( vehicle == nullptr ) + vehicle = Train->DynamicObject->ABuScanNearestObject( Train->DynamicObject->GetTrack(), -1, 1500, coupler ); + + if( ( coupler != -1 ) + && ( vehicle != nullptr ) ) { + + vehicle->uncouple( coupler ); + } + if( Train->DynamicObject->Mechanik ) { + // aktualizacja flag kierunku w składzie + Train->DynamicObject->Mechanik->CheckVehicles( Disconnect ); + } + } +} + void TTrain::OnCommand_departureannounce( TTrain *Train, command_data const &Command ) { if( Train->ggDepartureSignalButton.SubModel == nullptr ) { @@ -2854,6 +3141,21 @@ void TTrain::OnCommand_radiotoggle( TTrain *Train, command_data const &Command ) } } +void TTrain::OnCommand_radiochannelincrease( TTrain *Train, command_data const &Command ) { + + if( Command.action == GLFW_PRESS ) { + Train->iRadioChannel = clamp( Train->iRadioChannel + 1, 1, 10 ); + } +} + +void TTrain::OnCommand_radiochanneldecrease( TTrain *Train, command_data const &Command ) { + + if( Command.action == GLFW_PRESS ) { + Train->iRadioChannel = clamp( Train->iRadioChannel - 1, 1, 10 ); + } +} + + void TTrain::OnCommand_radiostoptest( TTrain *Train, command_data const &Command ) { if( Command.action == GLFW_PRESS ) { @@ -2861,6 +3163,38 @@ void TTrain::OnCommand_radiostoptest( TTrain *Train, command_data const &Command } } +void TTrain::OnCommand_cabchangeforward( TTrain *Train, command_data const &Command ) { + + if( Command.action == GLFW_PRESS ) { + if( false == Train->CabChange( 1 ) ) { + if( TestFlag( Train->DynamicObject->MoverParameters->Couplers[ side::front ].CouplingFlag, coupling::gangway ) ) { + // przejscie do nastepnego pojazdu + Global::changeDynObj = Train->DynamicObject->PrevConnected; + Global::changeDynObj->MoverParameters->ActiveCab = ( + Train->DynamicObject->PrevConnectedNo ? + -1 : + 1 ); + } + } + } +} + +void TTrain::OnCommand_cabchangebackward( TTrain *Train, command_data const &Command ) { + + if( Command.action == GLFW_PRESS ) { + if( false == Train->CabChange( -1 ) ) { + if( TestFlag( Train->DynamicObject->MoverParameters->Couplers[ side::rear ].CouplingFlag, coupling::gangway ) ) { + // przejscie do nastepnego pojazdu + Global::changeDynObj = Train->DynamicObject->NextConnected; + Global::changeDynObj->MoverParameters->ActiveCab = ( + Train->DynamicObject->NextConnectedNo ? + -1 : + 1 ); + } + } + } +} + void TTrain::OnKeyDown(int cKey) { // naciśnięcie klawisza bool const isEztOer = @@ -2870,32 +3204,15 @@ void TTrain::OnKeyDown(int cKey) && ( mvOccupied->BrakeSubsystem == ss_ESt ) && ( mvControlled->ActiveDir != 0 ) ); // od yB - if (Global::shiftState) + if ( false == Global::shiftState) { // wciśnięty [Shift] - if( cKey == Global::Keys[ k_BrakeProfile ] ) // McZapkie-240302-B: +#ifdef EU07_USE_OLD_COMMAND_SYSTEM + if( cKey == Global::Keys[ k_BrakeProfile ] ) // McZapkie-240302-B: //----------- - - // przelacznik opoznienia - // hamowania + // przelacznik opoznienia hamowania { // yB://ABu: male poprawki, zeby bylo mozna ustawic dowolny wagon int CouplNr = -2; - if( !FreeFlyModeFlag ) - { -#ifdef EU07_USE_OLD_COMMAND_SYSTEM - if( Global::ctrlState ) - if (mvOccupied->BrakeDelaySwitch(bdelay_R + bdelay_M)) - { - play_sound( dsbPneumaticRelay ); - } - else - ; - else if (mvOccupied->BrakeDelaySwitch(bdelay_P)) - { - play_sound( dsbPneumaticRelay ); - } -#endif - } - else + if( true == FreeFlyModeFlag ) { TDynamicObject *temp; temp = (DynamicObject->ABuScanNearestObject(DynamicObject->GetTrack(), -1, 1500, CouplNr)); @@ -2917,43 +3234,20 @@ void TTrain::OnKeyDown(int cKey) temp->MoverParameters->BrakeDelayFlag < bdelay_R ? temp->MoverParameters->BrakeDelayFlag << 1 : temp->MoverParameters->BrakeDelayFlag | bdelay_M ); - if( true == temp->MoverParameters->BrakeDelaySwitch( fasterbrakesetting ) ) { -#ifdef EU07_USE_OLD_SOUNDCODE - dsbPneumaticRelay.play(); -#endif - } + temp->MoverParameters->BrakeDelaySwitch( fasterbrakesetting ); } } } else if( cKey == GLFW_KEY_Q ) // ze Shiftem - włączenie AI - { // McZapkie-240302 - wlaczanie automatycznego pilota (zadziala tylko w - // trybie debugmode) + { // McZapkie-240302 - wlaczanie automatycznego pilota (zadziala tylko w trybie debugmode) if (DynamicObject->Mechanik) { if (DebugModeFlag) - if (DynamicObject->Mechanik->AIControllFlag) //żeby nie trzeba było - // rozłączać dla - // zresetowania - DynamicObject->Mechanik->TakeControl(false); - DynamicObject->Mechanik->TakeControl(true); - } - } -#ifdef EU07_USE_OLD_COMMAND_SYSTEM - else if (cKey == Global::Keys[k_UpperSign]) // ABu 060205: światło górne - - // włączenie - { - if (mvOccupied->LightsPosNo > 0) //kręciolek od swiatel - { - if ((mvOccupied->LightsPos < mvOccupied->LightsPosNo) || (mvOccupied->LightsWrap)) - { - mvOccupied->LightsPos++; - if (mvOccupied->LightsPos > mvOccupied->LightsPosNo) - { - mvOccupied->LightsPos = 1; + if( DynamicObject->Mechanik->AIControllFlag ) { + //żeby nie trzeba było rozłączać dla zresetowania + DynamicObject->Mechanik->TakeControl( false ); } - play_sound( dsbSwitch ); - SetLights(); - } + DynamicObject->Mechanik->TakeControl(true); } } #endif @@ -2963,7 +3257,7 @@ void TTrain::OnKeyDown(int cKey) #ifdef EU07_USE_OLD_COMMAND_SYSTEM if( cKey == Global::Keys[ k_IncLocalBrakeLevel ] ) { // Ra 2014-09: w - // trybie latania + // trybie latania // obsługa jest w // World.cpp if (!FreeFlyModeFlag) @@ -2993,9 +3287,7 @@ void TTrain::OnKeyDown(int cKey) mvOccupied->DecLocalBrakeLevel(1); } } - else -#endif - if (cKey == Global::Keys[k_Brake2]) { + else 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? @@ -3007,13 +3299,12 @@ void TTrain::OnKeyDown(int cKey) mvOccupied->BrakeCtrlPos2 = 0; // wyrownaj kapturek } } - if (cKey == Global::Keys[k_BrakeProfile]) + else if (cKey == Global::Keys[k_BrakeProfile]) { // yB://ABu: male poprawki, zeby // bylo mozna ustawic dowolny // wagon int CouplNr = -2; if( false == FreeFlyModeFlag ) { -#ifdef EU07_USE_OLD_COMMAND_SYSTEM if( Global::ctrlState ) if (mvOccupied->BrakeDelaySwitch(bdelay_R)) { @@ -3025,7 +3316,6 @@ void TTrain::OnKeyDown(int cKey) { play_sound( dsbPneumaticRelay ); } -#endif } else { TDynamicObject *temp; @@ -3066,11 +3356,13 @@ void TTrain::OnKeyDown(int cKey) else if (cKey == Global::Keys[k_CabForward]) { if( !CabChange( 1 ) ) { - if( TestFlag( DynamicObject->MoverParameters->Couplers[ 0 ].CouplingFlag, - ctrain_passenger ) ) { // przejscie do nastepnego pojazdu + if( TestFlag( DynamicObject->MoverParameters->Couplers[ 0 ].CouplingFlag, ctrain_passenger ) ) { + // przejscie do nastepnego pojazdu Global::changeDynObj = DynamicObject->PrevConnected; - Global::changeDynObj->MoverParameters->ActiveCab = - DynamicObject->PrevConnectedNo ? -1 : 1; + Global::changeDynObj->MoverParameters->ActiveCab = ( + DynamicObject->PrevConnectedNo ? + -1 : + 1 ); } } /* @@ -3082,12 +3374,13 @@ void TTrain::OnKeyDown(int cKey) else if (cKey == Global::Keys[k_CabBackward]) { if (!CabChange(-1)) - if (TestFlag(DynamicObject->MoverParameters->Couplers[1].CouplingFlag, - ctrain_passenger)) - { // przejscie do poprzedniego + if (TestFlag(DynamicObject->MoverParameters->Couplers[1].CouplingFlag, ctrain_passenger)) { + // przejscie do poprzedniego Global::changeDynObj = DynamicObject->NextConnected; - Global::changeDynObj->MoverParameters->ActiveCab = - DynamicObject->NextConnectedNo ? -1 : 1; + Global::changeDynObj->MoverParameters->ActiveCab = ( + DynamicObject->NextConnectedNo ? + -1 : + 1 ); } /* NOTE: disabled to allow 'prototypical' 'tricking' pantograph compressor to run unattended @@ -3117,7 +3410,6 @@ void TTrain::OnKeyDown(int cKey) } } - } else if (cKey == Global::Keys[k_DeCouple]) { @@ -3141,7 +3433,7 @@ void TTrain::OnKeyDown(int cKey) } } - +#endif // else if (DebugModeFlag) { // przesuwanie składu o 100m @@ -3189,6 +3481,7 @@ void TTrain::OnKeyDown(int cKey) } } } +#ifdef EU07_USE_OLD_COMMAND_SYSTEM if (cKey == GLFW_KEY_MINUS) { // zmniejszenie numeru kanału radiowego if (iRadioChannel > 0) @@ -3199,6 +3492,7 @@ void TTrain::OnKeyDown(int cKey) if (iRadioChannel < 8) ++iRadioChannel; // 0=wyłączony } +#endif } } @@ -4758,8 +5052,7 @@ bool TTrain::Update( double const Deltatime ) btInstrumentLight.Turn( false ); #ifdef EU07_USE_OLD_COMMAND_SYSTEM - // hunter-091012: przepisanie univ4 i zrobione z uwzglednieniem przelacznika - // swiatla + // hunter-091012: przepisanie univ4 i zrobione z uwzglednieniem przelacznika swiatla if (Console::Pressed(Global::Keys[k_Univ4])) { if( Global::shiftState ) @@ -4813,7 +5106,6 @@ bool TTrain::Update( double const Deltatime ) play_sound( dsbPneumaticSwitch ); } } -#endif if ((mvOccupied->BrakeHandle == FV4a) && (Console::Pressed(Global::Keys[k_IncBrakeLevel]))) { if (Global::ctrlState) @@ -4822,7 +5114,6 @@ bool TTrain::Update( double const Deltatime ) if (mvOccupied->BrakeCtrlPos2 < -1.5) mvOccupied->BrakeCtrlPos2 = -1.5; } -#ifdef EU07_USE_OLD_COMMAND_SYSTEM else { // mvOccupied->BrakeCtrlPosR+=(mvOccupied->BrakeCtrlPosR>mvOccupied->BrakeCtrlPosNo?0:dt*2); @@ -4830,7 +5121,6 @@ bool TTrain::Update( double const Deltatime ) // mvOccupied->BrakeCtrlPos= // floor(mvOccupied->BrakeCtrlPosR+0.499); } -#endif } if ((mvOccupied->BrakeHandle == FV4a) && (Console::Pressed(Global::Keys[k_DecBrakeLevel]))) @@ -4841,7 +5131,6 @@ bool TTrain::Update( double const Deltatime ) if (mvOccupied->BrakeCtrlPos2 < -3) mvOccupied->BrakeCtrlPos2 = -3; } -#ifdef EU07_USE_OLD_COMMAND_SYSTEM else { // mvOccupied->BrakeCtrlPosR-=(mvOccupied->BrakeCtrlPosR<-1?0:dt*2); @@ -4849,7 +5138,6 @@ bool TTrain::Update( double const Deltatime ) // floor(mvOccupied->BrakeCtrlPosR+0.499); mvOccupied->BrakeLevelAdd(-dt * 2); } -#endif } if( ( mvOccupied->BrakeSystem == ElectroPneumatic ) @@ -4871,7 +5159,6 @@ bool TTrain::Update( double const Deltatime ) } } -#ifdef EU07_USE_OLD_COMMAND_SYSTEM if (Console::Pressed(Global::Keys[k_DepartureSignal])) { ggDepartureSignalButton.PutValue(1); diff --git a/Train.h b/Train.h index b2ad720b..b3d79190 100644 --- a/Train.h +++ b/Train.h @@ -113,9 +113,14 @@ class TTrain bool initialize_button(cParser &Parser, std::string const &Label, int const Cabindex); // helper, returns true for EMU with oerlikon brake bool is_eztoer() const; + // locates nearest vehicle belonging to the consist + TDynamicObject *find_nearest_consist_vehicle() const; + // command handlers // NOTE: we're currently using universal handlers and static handler map but it may be beneficial to have these implemented on individual class instance basis // TBD, TODO: consider this approach if we ever want to have customized consist behaviour to received commands, based on the consist/vehicle type or whatever + static void OnCommand_aidriverenable( TTrain *Train, command_data const &Command ); + static void OnCommand_aidriverdisable( TTrain *Train, command_data const &Command ); static void OnCommand_mastercontrollerincrease( TTrain *Train, command_data const &Command ); static void OnCommand_mastercontrollerincreasefast( TTrain *Train, command_data const &Command ); static void OnCommand_mastercontrollerdecrease( TTrain *Train, command_data const &Command ); @@ -138,7 +143,12 @@ class TTrain static void OnCommand_trainbrakefirstservice( 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_trainbrakehandleoff( TTrain *Train, command_data const &Command ); static void OnCommand_trainbrakeemergency( TTrain *Train, command_data const &Command ); + static void OnCommand_trainbrakebasepressureincrease( TTrain *Train, command_data const &Command ); + static void OnCommand_trainbrakebasepressuredecrease( TTrain *Train, command_data const &Command ); + static void OnCommand_trainbrakebasepressurereset( TTrain *Train, command_data const &Command ); + static void OnCommand_trainbrakeoperationtoggle( 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 ); @@ -147,6 +157,8 @@ class TTrain static void OnCommand_epbrakecontroltoggle( TTrain *Train, command_data const &Command ); static void OnCommand_brakeactingspeedincrease( TTrain *Train, command_data const &Command ); static void OnCommand_brakeactingspeeddecrease( TTrain *Train, command_data const &Command ); + static void OnCommand_brakeloadcompensationincrease( TTrain *Train, command_data const &Command ); + static void OnCommand_brakeloadcompensationdecrease( TTrain *Train, command_data const &Command ); static void OnCommand_mubrakingindicatortoggle( TTrain *Train, command_data const &Command ); static void OnCommand_reverserincrease( TTrain *Train, command_data const &Command ); static void OnCommand_reverserdecrease( TTrain *Train, command_data const &Command ); @@ -180,6 +192,8 @@ class TTrain static void OnCommand_headlighttogglerearupper( TTrain *Train, command_data const &Command ); static void OnCommand_redmarkertogglerearleft( TTrain *Train, command_data const &Command ); static void OnCommand_redmarkertogglerearright( TTrain *Train, command_data const &Command ); + static void OnCommand_redmarkerstoggle( TTrain *Train, command_data const &Command ); + static void OnCommand_endsignalstoggle( TTrain *Train, command_data const &Command ); static void OnCommand_headlightsdimtoggle( TTrain *Train, command_data const &Command ); static void OnCommand_interiorlighttoggle( TTrain *Train, command_data const &Command ); static void OnCommand_interiorlightdimtoggle( TTrain *Train, command_data const &Command ); @@ -187,11 +201,17 @@ class TTrain static void OnCommand_doorlocktoggle( TTrain *Train, command_data const &Command ); static void OnCommand_doortoggleleft( TTrain *Train, command_data const &Command ); static void OnCommand_doortoggleright( TTrain *Train, command_data const &Command ); + static void OnCommand_carcouplingincrease( TTrain *Train, command_data const &Command ); + static void OnCommand_carcouplingdisconnect( TTrain *Train, command_data const &Command ); static void OnCommand_departureannounce( TTrain *Train, command_data const &Command ); static void OnCommand_hornlowactivate( TTrain *Train, command_data const &Command ); static void OnCommand_hornhighactivate( TTrain *Train, command_data const &Command ); static void OnCommand_radiotoggle( TTrain *Train, command_data const &Command ); + static void OnCommand_radiochannelincrease( TTrain *Train, command_data const &Command ); + static void OnCommand_radiochanneldecrease( TTrain *Train, command_data const &Command ); static void OnCommand_radiostoptest( TTrain *Train, command_data const &Command ); + static void OnCommand_cabchangeforward( TTrain *Train, command_data const &Command ); + static void OnCommand_cabchangebackward( TTrain *Train, command_data const &Command ); static void OnCommand_generictoggle( TTrain *Train, command_data const &Command ); // members diff --git a/World.cpp b/World.cpp index 6f91d04b..9de820a4 100644 --- a/World.cpp +++ b/World.cpp @@ -338,8 +338,7 @@ bool TWorld::Init( GLFWwindow *Window ) { return true; }; -void TWorld::OnKeyDown(int cKey) -{ +void TWorld::OnKeyDown(int cKey) { // dump keypress info in the log if( !Global::iPause ) { // podczas pauzy klawisze nie działają @@ -647,32 +646,28 @@ void TWorld::OnKeyDown(int cKey) else if (!Global::iPause) //podczas pauzy sterownaie nie działa if (Train) if (Controlled) - if( ( cKey == GLFW_KEY_Q ) - || ( ( Controlled->Controller == Humandriver ) - || ( true == DebugModeFlag ) ) ) { + if( ( Controlled->Controller == Humandriver ) + || ( true == DebugModeFlag ) ) { Train->OnKeyDown( cKey ); // przekazanie klawisza do kabiny } if (FreeFlyModeFlag) // aby nie odluźniało wagonu za lokomotywą { // operacje wykonywane na dowolnym pojeździe, przeniesione tu z kabiny -/* // NOTE: disabled so it doesn't interfere with new system controls in outside view // TODO: implement as part of the new system +#ifdef EU07_USE_OLD_COMMAND_SYSTEM if (cKey == Global::Keys[k_Releaser]) // odluźniacz { // działa globalnie, sprawdzić zasięg - TDynamicObject *temp = Global::DynamicNearest(); - if (temp) { - if (Global::ctrlState) // z ctrl odcinanie { - temp->MoverParameters->Hamulec->SetBrakeStatus( temp->MoverParameters->Hamulec->GetBrakeStatus() ^ 128 ); - } - else { - temp->MoverParameters->BrakeReleaser(1); - } + TDynamicObject *temp{ std::get( simulation::Region->find_vehicle( Global::pCameraPosition, 10, false, false ) ) }; + if( temp ) { + if( Global::ctrlState ) // z ctrl odcinanie { + temp->MoverParameters->Hamulec->SetBrakeStatus( temp->MoverParameters->Hamulec->GetBrakeStatus() ^ b_dmg ); + } + else { + temp->MoverParameters->BrakeReleaser( 1 ); } } - else -*/ - if (cKey == Global::Keys[k_Heating]) // Ra: klawisz nie jest najszczęśliwszy + else if (cKey == Global::Keys[k_Heating]) // Ra: klawisz nie jest najszczęśliwszy { // zmiana próżny/ładowny; Ra: zabrane z kabiny auto *vehicle { std::get( simulation::Region->find_vehicle( Global::pCameraPosition, 10, false, false ) ) }; if (vehicle) @@ -744,6 +739,7 @@ void TWorld::OnKeyDown(int cKey) } } } +#endif } } @@ -1453,6 +1449,7 @@ TWorld::Update_UI() { uitextline3 += "; LcB: " + to_string( vehicle->MoverParameters->LocBrakePress, 2 ) + + "; hat: " + to_string( vehicle->MoverParameters->BrakeCtrlPos2, 2 ) + "; pipes: " + to_string( vehicle->MoverParameters->PipePress, 2 ) + "/" + to_string( vehicle->MoverParameters->ScndPipePress, 2 ) + "/" + to_string( vehicle->MoverParameters->EqvtPipePress, 2 ) diff --git a/command.cpp b/command.cpp index 3ac2b537..e9d31988 100644 --- a/command.cpp +++ b/command.cpp @@ -19,6 +19,8 @@ namespace simulation { command_queue Commands; commanddescription_sequence Commands_descriptions = { + { "aidriverenable", command_target::vehicle }, + { "aidriverdisable", command_target::vehicle }, { "mastercontrollerincrease", command_target::vehicle }, { "mastercontrollerincreasefast", command_target::vehicle }, { "mastercontrollerdecrease", command_target::vehicle }, @@ -40,7 +42,12 @@ commanddescription_sequence Commands_descriptions = { { "trainbrakefirstservice", command_target::vehicle }, { "trainbrakeservice", command_target::vehicle }, { "trainbrakefullservice", command_target::vehicle }, + { "trainbrakehandleoff", command_target::vehicle }, { "trainbrakeemergency", command_target::vehicle }, + { "trainbrakebasepressureincrease", command_target::vehicle }, + { "trainbrakebasepressuredecrease", command_target::vehicle }, + { "trainbrakebasepressurereset", command_target::vehicle }, + { "trainbrakeoperationtoggle", command_target::vehicle }, { "manualbrakeincrease", command_target::vehicle }, { "manualbrakedecrease", command_target::vehicle }, { "alarmchaintoggle", command_target::vehicle }, @@ -60,12 +67,19 @@ commanddescription_sequence Commands_descriptions = { { "epbrakecontroltoggle", command_target::vehicle }, { "brakeactingspeedincrease", command_target::vehicle }, { "brakeactingspeeddecrease", command_target::vehicle }, + { "brakeloadcompensationincrease", command_target::vehicle }, + { "brakeloadcompensationdecrease", command_target::vehicle }, { "mubrakingindicatortoggle", command_target::vehicle }, { "alerteracknowledge", command_target::vehicle }, { "hornlowactivate", command_target::vehicle }, { "hornhighactivate", command_target::vehicle }, { "radiotoggle", command_target::vehicle }, + { "radiochannelincrease", command_target::vehicle }, + { "radiochanneldecrease", command_target::vehicle }, { "radiostoptest", command_target::vehicle }, + // TBD, TODO: make cab change controls entity-centric + { "cabchangeforward", command_target::vehicle }, + { "cabchangebackward", command_target::vehicle }, { "viewturn", command_target::entity }, { "movehorizontal", command_target::entity }, @@ -78,15 +92,9 @@ commanddescription_sequence Commands_descriptions = { { "moveback", command_target::entity }, { "moveup", command_target::entity }, { "movedown", command_target::entity }, -/* -const int k_CabForward = 42; -const int k_CabBackward = 43; -const int k_Couple = 44; -const int k_DeCouple = 45; -const int k_ProgramQuit = 46; -// const int k_ProgramPause= 47; -const int k_ProgramHelp = 48; -*/ + // TBD, TODO: make coupling controls entity-centric + { "carcouplingincrease", command_target::vehicle }, + { "carcouplingdisconnect", command_target::vehicle }, { "doortoggleleft", command_target::vehicle }, { "doortoggleright", command_target::vehicle }, { "departureannounce", command_target::vehicle }, @@ -97,9 +105,6 @@ const int k_ProgramHelp = 48; { "pantographtogglerear", command_target::vehicle }, { "pantographlowerall", command_target::vehicle }, { "heatingtoggle", command_target::vehicle }, -/* -// const int k_FreeFlyMode= 59; -*/ { "lightspresetactivatenext", command_target::vehicle }, { "lightspresetactivateprevious", command_target::vehicle }, { "headlighttoggleleft", command_target::vehicle }, @@ -112,16 +117,14 @@ const int k_ProgramHelp = 48; { "headlighttogglerearupper", command_target::vehicle }, { "redmarkertogglerearleft", command_target::vehicle }, { "redmarkertogglerearright", command_target::vehicle }, + { "redmarkerstoggle", command_target::vehicle }, + { "endsignalstoggle", command_target::vehicle }, { "headlightsdimtoggle", command_target::vehicle }, { "motorconnectorsopen", command_target::vehicle }, { "motordisconnect", command_target::vehicle }, { "interiorlighttoggle", command_target::vehicle }, { "interiorlightdimtoggle", command_target::vehicle }, { "instrumentlighttoggle", command_target::vehicle }, -/* -const int k_EndSign = 70; -const int k_Active = 71; -*/ { "generictoggle0", command_target::vehicle }, { "generictoggle1", command_target::vehicle }, { "generictoggle2", command_target::vehicle }, @@ -133,9 +136,6 @@ const int k_Active = 71; { "generictoggle8", command_target::vehicle }, { "generictoggle9", command_target::vehicle }, { "batterytoggle", command_target::vehicle } -/* -const int k_WalkMode = 73; -*/ }; } diff --git a/command.h b/command.h index 10c7c460..be604dd1 100644 --- a/command.h +++ b/command.h @@ -14,6 +14,8 @@ http://mozilla.org/MPL/2.0/. enum class user_command { + aidriverenable, + aidriverdisable, mastercontrollerincrease, mastercontrollerincreasefast, mastercontrollerdecrease, @@ -35,7 +37,12 @@ enum class user_command { trainbrakefirstservice, trainbrakeservice, trainbrakefullservice, + trainbrakehandleoff, trainbrakeemergency, + trainbrakebasepressureincrease, + trainbrakebasepressuredecrease, + trainbrakebasepressurereset, + trainbrakeoperationtoggle, manualbrakeincrease, manualbrakedecrease, alarmchaintoggle, @@ -55,12 +62,18 @@ enum class user_command { epbrakecontroltoggle, brakeactingspeedincrease, brakeactingspeeddecrease, + brakeloadcompensationincrease, + brakeloadcompensationdecrease, mubrakingindicatortoggle, alerteracknowledge, hornlowactivate, hornhighactivate, radiotoggle, + radiochannelincrease, + radiochanneldecrease, radiostoptest, + cabchangeforward, + cabchangebackward, viewturn, movehorizontal, @@ -73,15 +86,9 @@ enum class user_command { moveback, moveup, movedown, -/* -const int k_CabForward = 42; -const int k_CabBackward = 43; -const int k_Couple = 44; -const int k_DeCouple = 45; -const int k_ProgramQuit = 46; -// const int k_ProgramPause= 47; -const int k_ProgramHelp = 48; -*/ + + carcouplingincrease, + carcouplingdisconnect, doortoggleleft, doortoggleright, departureannounce, @@ -92,9 +99,6 @@ const int k_ProgramHelp = 48; pantographtogglerear, pantographlowerall, heatingtoggle, -/* -// const int k_FreeFlyMode= 59; -*/ lightspresetactivatenext, lightspresetactivateprevious, headlighttoggleleft, @@ -107,16 +111,14 @@ const int k_ProgramHelp = 48; headlighttogglerearupper, redmarkertogglerearleft, redmarkertogglerearright, + redmarkerstoggle, + endsignalstoggle, headlightsdimtoggle, motorconnectorsopen, motordisconnect, interiorlighttoggle, interiorlightdimtoggle, instrumentlighttoggle, -/* -const int k_EndSign = 70; -const int k_Active = 71; -*/ generictoggle0, generictoggle1, generictoggle2, @@ -128,9 +130,7 @@ const int k_Active = 71; generictoggle8, generictoggle9, batterytoggle, -/* -const int k_WalkMode = 73; -*/ + none = -1 }; diff --git a/keyboardinput.cpp b/keyboardinput.cpp index 0729469f..8071e9f3 100644 --- a/keyboardinput.cpp +++ b/keyboardinput.cpp @@ -31,6 +31,7 @@ keyboard_input::recall_bindings() { std::unordered_map nametokeymap = { { "0", GLFW_KEY_0 }, { "1", GLFW_KEY_1 }, { "2", GLFW_KEY_2 }, { "3", GLFW_KEY_3 }, { "4", GLFW_KEY_4 }, { "5", GLFW_KEY_5 }, { "6", GLFW_KEY_6 }, { "7", GLFW_KEY_7 }, { "8", GLFW_KEY_8 }, { "9", GLFW_KEY_9 }, + { "-", GLFW_KEY_MINUS }, { "=", GLFW_KEY_EQUAL }, { "a", GLFW_KEY_A }, { "b", GLFW_KEY_B }, { "c", GLFW_KEY_C }, { "d", GLFW_KEY_D }, { "e", GLFW_KEY_E }, { "f", GLFW_KEY_F }, { "g", GLFW_KEY_G }, { "h", GLFW_KEY_H }, { "i", GLFW_KEY_I }, { "j", GLFW_KEY_J }, { "k", GLFW_KEY_K }, { "l", GLFW_KEY_L }, { "m", GLFW_KEY_M }, { "n", GLFW_KEY_N }, { "o", GLFW_KEY_O }, @@ -41,6 +42,7 @@ keyboard_input::recall_bindings() { { ";", GLFW_KEY_SEMICOLON }, { "'", GLFW_KEY_APOSTROPHE }, { "enter", GLFW_KEY_ENTER }, { ",", GLFW_KEY_COMMA }, { ".", GLFW_KEY_PERIOD }, { "/", GLFW_KEY_SLASH }, { "space", GLFW_KEY_SPACE }, + { "insert", GLFW_KEY_INSERT },{ "delete", GLFW_KEY_DELETE }, { "home", GLFW_KEY_HOME }, { "end", GLFW_KEY_END }, // numpad block { "num_/", GLFW_KEY_KP_DIVIDE }, { "num_*", GLFW_KEY_KP_MULTIPLY }, { "num_-", GLFW_KEY_KP_SUBTRACT }, { "num_7", GLFW_KEY_KP_7 }, { "num_8", GLFW_KEY_KP_8 }, { "num_9", GLFW_KEY_KP_9 }, { "num_+", GLFW_KEY_KP_ADD }, @@ -165,6 +167,10 @@ void keyboard_input::default_bindings() { m_commands = { + // aidriverenable + { GLFW_KEY_Q | keymodifier::shift }, + // aidriverdisable + { GLFW_KEY_Q }, // mastercontrollerincrease { GLFW_KEY_KP_ADD }, // mastercontrollerincreasefast @@ -207,17 +213,27 @@ keyboard_input::default_bindings() { { GLFW_KEY_KP_5 }, // trainbrakefullservice { GLFW_KEY_KP_2 }, + // trainbrakehandleoff + { GLFW_KEY_KP_5 | keymodifier::control }, // trainbrakeemergency { GLFW_KEY_KP_0 }, + // trainbrakebasepressureincrease + { GLFW_KEY_KP_3 | keymodifier::control }, + // trainbrakebasepressuredecrease + { GLFW_KEY_KP_9 | keymodifier::control }, + // trainbrakebasepressurereset + { GLFW_KEY_KP_6 | keymodifier::control }, + // trainbrakeoperationtoggle + { GLFW_KEY_KP_4 | keymodifier::control }, // 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 }, - // sandboxactivate, + // sandboxactivate { GLFW_KEY_S }, // reverserincrease { GLFW_KEY_D }, @@ -247,6 +263,10 @@ keyboard_input::default_bindings() { { GLFW_KEY_B | keymodifier::shift }, // brakeactingspeeddecrease { GLFW_KEY_B }, + // brakeloadcompensationincrease + { GLFW_KEY_H | keymodifier::shift | keymodifier::control }, + // brakeloadcompensationdecrease + { GLFW_KEY_H | keymodifier::control }, // mubrakingindicatortoggle { GLFW_KEY_L | keymodifier::shift }, // alerteracknowledge @@ -257,8 +277,16 @@ keyboard_input::default_bindings() { { GLFW_KEY_A | keymodifier::shift }, // radiotoggle { GLFW_KEY_R | keymodifier::control }, + // radiochannelincrease + { GLFW_KEY_R | keymodifier::shift }, + // radiochanneldecrease + { GLFW_KEY_R }, // radiostoptest { GLFW_KEY_R | keymodifier::shift | keymodifier::control }, + // cabchangeforward + { GLFW_KEY_HOME }, + // cabchangebackward + { GLFW_KEY_END }, // viewturn { -1 }, // movehorizontal @@ -281,11 +309,11 @@ keyboard_input::default_bindings() { { GLFW_KEY_PAGE_UP }, // movedown { GLFW_KEY_PAGE_DOWN }, + // carcouplingincrease + { GLFW_KEY_INSERT }, + // carcouplingdisconnect + { GLFW_KEY_DELETE }, /* -const int k_CabForward = 42; -const int k_CabBackward = 43; -const int k_Couple = 44; -const int k_DeCouple = 45; const int k_ProgramQuit = 46; // const int k_ProgramPause= 47; const int k_ProgramHelp = 48; @@ -337,12 +365,16 @@ const int k_ProgramHelp = 48; { GLFW_KEY_Y | keymodifier::control | keymodifier::shift }, // redmarkertogglerearright { GLFW_KEY_I | keymodifier::control | keymodifier::shift }, + // redmarkerstoggle + { GLFW_KEY_E | keymodifier::shift }, + // endsignalstoggle + { GLFW_KEY_E }, // headlightsdimtoggle { GLFW_KEY_L | keymodifier::control }, // motorconnectorsopen { GLFW_KEY_L }, // motordisconnect - { GLFW_KEY_E | keymodifier::shift }, + { GLFW_KEY_E | keymodifier::control }, // interiorlighttoggle { GLFW_KEY_APOSTROPHE }, // interiorlightdimtoggle @@ -350,7 +382,6 @@ const int k_ProgramHelp = 48; // instrumentlighttoggle { GLFW_KEY_SEMICOLON }, /* -const int k_EndSign = 70; const int k_Active = 71; */ // "generictoggle0"