conversion of remaining train controls to the new control system, fix for potentially incorrect rendering of flex track pieces

This commit is contained in:
tmj-fstate
2018-01-10 20:46:58 +01:00
parent 377740dfad
commit c166c5429e
7 changed files with 578 additions and 233 deletions

View File

@@ -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))

623
Train.cpp
View File

@@ -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<TDynamicObject *>( 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<TDynamicObject *>( 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);

20
Train.h
View File

@@ -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

View File

@@ -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<TDynamicObject *>( 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<TDynamicObject *>( 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 )

View File

@@ -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;
*/
};
}

View File

@@ -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
};

View File

@@ -31,6 +31,7 @@ keyboard_input::recall_bindings() {
std::unordered_map<std::string, int> 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"