mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-19 12:19:18 +02:00
Merge branch 'tmj-dev' into milek-dev
This commit is contained in:
212
Train.cpp
212
Train.cpp
@@ -19,6 +19,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "simulation.h"
|
||||
#include "World.h"
|
||||
#include "Camera.h"
|
||||
#include "simulationtime.h"
|
||||
#include "Logs.h"
|
||||
#include "MdlMngr.h"
|
||||
#include "Timer.h"
|
||||
@@ -27,6 +28,12 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "Console.h"
|
||||
#include "sound.h"
|
||||
|
||||
namespace input {
|
||||
|
||||
extern user_command command;
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
control_mapper::insert( TGauge const &Gauge, std::string const &Label ) {
|
||||
|
||||
@@ -599,7 +606,7 @@ bool TTrain::is_eztoer() const {
|
||||
|
||||
return
|
||||
( ( mvControlled->TrainType == dt_EZT )
|
||||
&& ( mvOccupied->BrakeSubsystem == ss_ESt )
|
||||
&& ( mvOccupied->BrakeSubsystem == TBrakeSubSystem::ss_ESt )
|
||||
&& ( mvControlled->Battery == true )
|
||||
&& ( mvControlled->EpFuse == true )
|
||||
&& ( mvControlled->ActiveDir != 0 ) ); // od yB
|
||||
@@ -768,7 +775,7 @@ void TTrain::OnCommand_secondcontrollerincrease( TTrain *Train, command_data con
|
||||
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
// on press or hold
|
||||
if( ( Train->mvControlled->EngineType == DieselElectric )
|
||||
if( ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
|
||||
&& ( true == Train->mvControlled->ShuntMode ) ) {
|
||||
Train->mvControlled->AnPos = clamp(
|
||||
Train->mvControlled->AnPos + 0.025,
|
||||
@@ -784,7 +791,7 @@ void TTrain::OnCommand_secondcontrollerincreasefast( TTrain *Train, command_data
|
||||
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
// on press or hold
|
||||
if( ( Train->mvControlled->EngineType == DieselElectric )
|
||||
if( ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
|
||||
&& ( true == Train->mvControlled->ShuntMode ) ) {
|
||||
Train->mvControlled->AnPos = 1.0;
|
||||
}
|
||||
@@ -836,7 +843,7 @@ void TTrain::OnCommand_secondcontrollerdecrease( TTrain *Train, command_data con
|
||||
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
// on press or hold
|
||||
if( ( Train->mvControlled->EngineType == DieselElectric )
|
||||
if( ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
|
||||
&& ( true == Train->mvControlled->ShuntMode ) ) {
|
||||
Train->mvControlled->AnPos = clamp(
|
||||
Train->mvControlled->AnPos - 0.025,
|
||||
@@ -852,7 +859,7 @@ void TTrain::OnCommand_secondcontrollerdecreasefast( TTrain *Train, command_data
|
||||
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
// on press or hold
|
||||
if( ( Train->mvControlled->EngineType == DieselElectric )
|
||||
if( ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
|
||||
&& ( true == Train->mvControlled->ShuntMode ) ) {
|
||||
Train->mvControlled->AnPos = 0.0;
|
||||
}
|
||||
@@ -881,7 +888,7 @@ void TTrain::OnCommand_independentbrakeincrease( TTrain *Train, command_data con
|
||||
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
|
||||
if( Train->mvOccupied->LocalBrake != ManualBrake ) {
|
||||
if( Train->mvOccupied->LocalBrake != TLocalBrake::ManualBrake ) {
|
||||
Train->mvOccupied->IncLocalBrakeLevel( 1 );
|
||||
}
|
||||
}
|
||||
@@ -891,8 +898,8 @@ void TTrain::OnCommand_independentbrakeincreasefast( TTrain *Train, command_data
|
||||
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
|
||||
if( Train->mvOccupied->LocalBrake != ManualBrake ) {
|
||||
Train->mvOccupied->IncLocalBrakeLevel( 2 );
|
||||
if( Train->mvOccupied->LocalBrake != TLocalBrake::ManualBrake ) {
|
||||
Train->mvOccupied->IncLocalBrakeLevel( LocalBrakePosNo );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -901,10 +908,10 @@ void TTrain::OnCommand_independentbrakedecrease( TTrain *Train, command_data con
|
||||
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
|
||||
if( ( Train->mvOccupied->LocalBrake != ManualBrake )
|
||||
if( ( Train->mvOccupied->LocalBrake != TLocalBrake::ManualBrake )
|
||||
// Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - odhamować jakoś trzeba
|
||||
// TODO: sort AI out so it doesn't do things it doesn't have equipment for
|
||||
|| ( Train->mvOccupied->LocalBrakePos != 0 ) ) {
|
||||
|| ( Train->mvOccupied->LocalBrakePosA > 0 ) ) {
|
||||
Train->mvOccupied->DecLocalBrakeLevel( 1 );
|
||||
}
|
||||
}
|
||||
@@ -914,11 +921,11 @@ void TTrain::OnCommand_independentbrakedecreasefast( TTrain *Train, command_data
|
||||
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
|
||||
if( ( Train->mvOccupied->LocalBrake != ManualBrake )
|
||||
if( ( Train->mvOccupied->LocalBrake != TLocalBrake::ManualBrake )
|
||||
// Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - odhamować jakoś trzeba
|
||||
// TODO: sort AI out so it doesn't do things it doesn't have equipment for
|
||||
|| ( Train->mvOccupied->LocalBrakePos != 0 ) ) {
|
||||
Train->mvOccupied->DecLocalBrakeLevel( 2 );
|
||||
|| ( Train->mvOccupied->LocalBrakePosA > 0 ) ) {
|
||||
Train->mvOccupied->DecLocalBrakeLevel( LocalBrakePosNo );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -927,7 +934,7 @@ void TTrain::OnCommand_independentbrakeset( TTrain *Train, command_data const &C
|
||||
|
||||
Train->mvControlled->LocalBrakePosA = (
|
||||
clamp(
|
||||
reinterpret_cast<double const &>( Command.param1 ),
|
||||
Command.param1,
|
||||
0.0, 1.0 ) );
|
||||
/*
|
||||
Train->mvControlled->LocalBrakePos = (
|
||||
@@ -936,7 +943,7 @@ void TTrain::OnCommand_independentbrakeset( TTrain *Train, command_data const &C
|
||||
0.0,
|
||||
LocalBrakePosNo,
|
||||
clamp(
|
||||
reinterpret_cast<double const &>( Command.param1 ),
|
||||
Command.param1,
|
||||
0.0, 1.0 ) ) ) );
|
||||
*/
|
||||
}
|
||||
@@ -947,9 +954,9 @@ void TTrain::OnCommand_independentbrakebailoff( TTrain *Train, command_data cons
|
||||
// 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->mvControlled->EngineType == TEngineType::ElectricSeriesMotor )
|
||||
|| ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
|
||||
|| ( Train->mvControlled->EngineType == TEngineType::ElectricInductionMotor ) )
|
||||
&& ( Train->mvOccupied->BrakeCtrlPosNo > 0 ) ) {
|
||||
|
||||
if( Command.action == GLFW_PRESS ) {
|
||||
@@ -985,22 +992,22 @@ void TTrain::OnCommand_independentbrakebailoff( TTrain *Train, command_data cons
|
||||
}
|
||||
|
||||
void TTrain::OnCommand_trainbrakeincrease( TTrain *Train, command_data const &Command ) {
|
||||
if (Command.action == GLFW_REPEAT && Train->mvOccupied->BrakeHandle == FV4a)
|
||||
if (Command.action == GLFW_REPEAT && Train->mvOccupied->BrakeHandle == TBrakeHandle::FV4a)
|
||||
Train->mvOccupied->BrakeLevelAdd( Global.brake_speed * Command.time_delta );
|
||||
else if (Command.action == GLFW_PRESS && Train->mvOccupied->BrakeHandle != FV4a)
|
||||
else if (Command.action == GLFW_PRESS && Train->mvOccupied->BrakeHandle != TBrakeHandle::FV4a)
|
||||
Train->set_train_brake( Train->mvOccupied->fBrakeCtrlPos + Global.fBrakeStep );
|
||||
}
|
||||
|
||||
void TTrain::OnCommand_trainbrakedecrease( TTrain *Train, command_data const &Command ) {
|
||||
if (Command.action == GLFW_REPEAT && Train->mvOccupied->BrakeHandle == FV4a)
|
||||
if (Command.action == GLFW_REPEAT && Train->mvOccupied->BrakeHandle == TBrakeHandle::FV4a)
|
||||
Train->mvOccupied->BrakeLevelAdd( -Global.brake_speed * Command.time_delta );
|
||||
else if (Command.action == GLFW_PRESS && Train->mvOccupied->BrakeHandle != FV4a)
|
||||
else if (Command.action == GLFW_PRESS && Train->mvOccupied->BrakeHandle != TBrakeHandle::FV4a)
|
||||
Train->set_train_brake( Train->mvOccupied->fBrakeCtrlPos - Global.fBrakeStep );
|
||||
|
||||
if (Command.action == GLFW_RELEASE) {
|
||||
// release
|
||||
if( ( Train->mvOccupied->BrakeCtrlPos == -1 )
|
||||
&& ( Train->mvOccupied->BrakeHandle == FVel6 )
|
||||
&& ( Train->mvOccupied->BrakeHandle == TBrakeHandle::FVel6 )
|
||||
&& ( Train->DynamicObject->Controller != AIdriver )
|
||||
&& ( Global.iFeedbackMode < 3 ) ) {
|
||||
// Odskakiwanie hamulce EP
|
||||
@@ -1011,12 +1018,12 @@ void TTrain::OnCommand_trainbrakedecrease( TTrain *Train, command_data const &Co
|
||||
|
||||
void TTrain::OnCommand_trainbrakeset( TTrain *Train, command_data const &Command ) {
|
||||
|
||||
Train->mvControlled->BrakeLevelSet(
|
||||
Train->mvOccupied->BrakeLevelSet(
|
||||
interpolate(
|
||||
Train->mvControlled->Handle->GetPos( bh_MIN ),
|
||||
Train->mvControlled->Handle->GetPos( bh_MAX ),
|
||||
Train->mvOccupied->Handle->GetPos( bh_MIN ),
|
||||
Train->mvOccupied->Handle->GetPos( bh_MAX ),
|
||||
clamp(
|
||||
reinterpret_cast<double const &>( Command.param1 ),
|
||||
Command.param1,
|
||||
0.0, 1.0 ) ) );
|
||||
}
|
||||
|
||||
@@ -1029,7 +1036,7 @@ void TTrain::OnCommand_trainbrakecharging( TTrain *Train, command_data const &Co
|
||||
else {
|
||||
// release
|
||||
if( ( Train->mvOccupied->BrakeCtrlPos == -1 )
|
||||
&& ( Train->mvOccupied->BrakeHandle == FVel6 )
|
||||
&& ( Train->mvOccupied->BrakeHandle == TBrakeHandle::FVel6 )
|
||||
&& ( Train->DynamicObject->Controller != AIdriver )
|
||||
&& ( Global.iFeedbackMode < 3 ) ) {
|
||||
// Odskakiwanie hamulce EP
|
||||
@@ -1060,7 +1067,7 @@ void TTrain::OnCommand_trainbrakeservice( TTrain *Train, command_data const &Com
|
||||
|
||||
Train->set_train_brake( (
|
||||
Train->mvOccupied->BrakeCtrlPosNo / 2
|
||||
+ ( Train->mvOccupied->BrakeHandle == FV4a ?
|
||||
+ ( Train->mvOccupied->BrakeHandle == TBrakeHandle::FV4a ?
|
||||
1 :
|
||||
0 ) ) );
|
||||
}
|
||||
@@ -1101,7 +1108,7 @@ void TTrain::OnCommand_trainbrakebasepressureincrease( TTrain *Train, command_da
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
|
||||
switch( Train->mvOccupied->BrakeHandle ) {
|
||||
case FV4a: {
|
||||
case TBrakeHandle::FV4a: {
|
||||
Train->mvOccupied->BrakeCtrlPos2 = clamp( Train->mvOccupied->BrakeCtrlPos2 - 0.01, -1.5, 2.0 );
|
||||
break;
|
||||
}
|
||||
@@ -1118,7 +1125,7 @@ void TTrain::OnCommand_trainbrakebasepressuredecrease( TTrain *Train, command_da
|
||||
if( Command.action != GLFW_RELEASE ) {
|
||||
|
||||
switch( Train->mvOccupied->BrakeHandle ) {
|
||||
case FV4a: {
|
||||
case TBrakeHandle::FV4a: {
|
||||
Train->mvOccupied->BrakeCtrlPos2 = clamp( Train->mvOccupied->BrakeCtrlPos2 + 0.01, -1.5, 2.0 );
|
||||
break;
|
||||
}
|
||||
@@ -1156,7 +1163,7 @@ void TTrain::OnCommand_manualbrakeincrease( TTrain *Train, command_data const &C
|
||||
auto *vehicle { Train->find_nearest_consist_vehicle() };
|
||||
if( vehicle == nullptr ) { return; }
|
||||
|
||||
if( ( vehicle->MoverParameters->LocalBrake == ManualBrake )
|
||||
if( ( vehicle->MoverParameters->LocalBrake == TLocalBrake::ManualBrake )
|
||||
|| ( vehicle->MoverParameters->MBrake == true ) ) {
|
||||
|
||||
vehicle->MoverParameters->IncManualBrakeLevel( 1 );
|
||||
@@ -1171,7 +1178,7 @@ void TTrain::OnCommand_manualbrakedecrease( TTrain *Train, command_data const &C
|
||||
auto *vehicle { Train->find_nearest_consist_vehicle() };
|
||||
if( vehicle == nullptr ) { return; }
|
||||
|
||||
if( ( vehicle->MoverParameters->LocalBrake == ManualBrake )
|
||||
if( ( vehicle->MoverParameters->LocalBrake == TLocalBrake::ManualBrake )
|
||||
|| ( vehicle->MoverParameters->MBrake == true ) ) {
|
||||
|
||||
vehicle->MoverParameters->DecManualBrakeLevel( 1 );
|
||||
@@ -1208,7 +1215,7 @@ void TTrain::OnCommand_wheelspinbrakeactivate( TTrain *Train, command_data const
|
||||
return;
|
||||
}
|
||||
|
||||
if( Train->mvOccupied->BrakeSystem != ElectroPneumatic ) {
|
||||
if( Train->mvOccupied->BrakeSystem != TBrakeSystem::ElectroPneumatic ) {
|
||||
// standard behaviour
|
||||
if( Command.action == GLFW_PRESS ) {
|
||||
// visual feedback
|
||||
@@ -1227,7 +1234,7 @@ void TTrain::OnCommand_wheelspinbrakeactivate( TTrain *Train, command_data const
|
||||
// visual feedback
|
||||
Train->ggAntiSlipButton.UpdateValue( 1.0, Train->dsbPneumaticSwitch );
|
||||
|
||||
if( ( Train->mvOccupied->BrakeHandle == St113 )
|
||||
if( ( Train->mvOccupied->BrakeHandle == TBrakeHandle::St113 )
|
||||
&& ( Train->mvControlled->EpFuse == true ) ) {
|
||||
Train->mvOccupied->SwitchEPBrake( 1 );
|
||||
}
|
||||
@@ -2075,8 +2082,8 @@ void TTrain::OnCommand_linebreakerclose( TTrain *Train, command_data const &Comm
|
||||
|
||||
if( Train->m_linebreakerstate == 2 ) {
|
||||
// we don't need to start the diesel twice, but the other types (with impulse switch setup) still need to be launched
|
||||
if( ( Train->mvControlled->EngineType != DieselEngine )
|
||||
&& ( Train->mvControlled->EngineType != DieselElectric ) ) {
|
||||
if( ( Train->mvControlled->EngineType != TEngineType::DieselEngine )
|
||||
&& ( Train->mvControlled->EngineType != TEngineType::DieselElectric ) ) {
|
||||
// try to finalize state change of the line breaker, set the state based on the outcome
|
||||
Train->m_linebreakerstate = (
|
||||
Train->mvControlled->MainSwitch( true ) ?
|
||||
@@ -2388,7 +2395,7 @@ void TTrain::OnCommand_convertertoggle( TTrain *Train, command_data const &Comma
|
||||
|
||||
void TTrain::OnCommand_converterenable( TTrain *Train, command_data const &Command ) {
|
||||
|
||||
if( Train->mvControlled->ConverterStart == start::automatic ) {
|
||||
if( Train->mvControlled->ConverterStart == start_t::automatic ) {
|
||||
// let the automatic thing do its automatic thing...
|
||||
return;
|
||||
}
|
||||
@@ -2422,7 +2429,7 @@ void TTrain::OnCommand_converterenable( TTrain *Train, command_data const &Comma
|
||||
|
||||
void TTrain::OnCommand_converterdisable( TTrain *Train, command_data const &Command ) {
|
||||
|
||||
if( Train->mvControlled->ConverterStart == start::automatic ) {
|
||||
if( Train->mvControlled->ConverterStart == start_t::automatic ) {
|
||||
// let the automatic thing do its automatic thing...
|
||||
return;
|
||||
}
|
||||
@@ -2462,7 +2469,7 @@ void TTrain::OnCommand_converterdisable( TTrain *Train, command_data const &Comm
|
||||
|
||||
void TTrain::OnCommand_convertertogglelocal( TTrain *Train, command_data const &Command ) {
|
||||
|
||||
if( Train->mvOccupied->ConverterStart == start::automatic ) {
|
||||
if( Train->mvOccupied->ConverterStart == start_t::automatic ) {
|
||||
// let the automatic thing do its automatic thing...
|
||||
return;
|
||||
}
|
||||
@@ -3721,7 +3728,7 @@ void TTrain::OnCommand_doortoggleleft( TTrain *Train, command_data const &Comman
|
||||
Train->mvOccupied->DoorLeftOpened :
|
||||
Train->mvOccupied->DoorRightOpened ) ) {
|
||||
// open
|
||||
if( Train->mvOccupied->DoorOpenCtrl != control::driver ) {
|
||||
if( Train->mvOccupied->DoorOpenCtrl != control_t::driver ) {
|
||||
return;
|
||||
}
|
||||
if( Train->mvOccupied->ActiveCab == 1 ) {
|
||||
@@ -3736,7 +3743,7 @@ void TTrain::OnCommand_doortoggleleft( TTrain *Train, command_data const &Comman
|
||||
}
|
||||
else {
|
||||
// close
|
||||
if( Train->mvOccupied->DoorCloseCtrl != control::driver ) {
|
||||
if( Train->mvOccupied->DoorCloseCtrl != control_t::driver ) {
|
||||
return;
|
||||
}
|
||||
// TODO: move door opening/closing to the update, so the switch animation doesn't hinge on door working
|
||||
@@ -3762,7 +3769,7 @@ void TTrain::OnCommand_doortoggleright( TTrain *Train, command_data const &Comma
|
||||
Train->mvOccupied->DoorRightOpened :
|
||||
Train->mvOccupied->DoorLeftOpened ) ) {
|
||||
// open
|
||||
if( Train->mvOccupied->DoorOpenCtrl != control::driver ) {
|
||||
if( Train->mvOccupied->DoorOpenCtrl != control_t::driver ) {
|
||||
return;
|
||||
}
|
||||
if( Train->mvOccupied->ActiveCab == 1 ) {
|
||||
@@ -3777,7 +3784,7 @@ void TTrain::OnCommand_doortoggleright( TTrain *Train, command_data const &Comma
|
||||
}
|
||||
else {
|
||||
// close
|
||||
if( Train->mvOccupied->DoorCloseCtrl != control::driver ) {
|
||||
if( Train->mvOccupied->DoorCloseCtrl != control_t::driver ) {
|
||||
return;
|
||||
}
|
||||
if( Train->mvOccupied->ActiveCab == 1 ) {
|
||||
@@ -4114,8 +4121,8 @@ void TTrain::UpdateMechPosition(double dt)
|
||||
&& ( pMechOffset.y < 4.0 ) ) // Ra 15-01: przy oglądaniu pantografu bujanie przeszkadza
|
||||
{
|
||||
Math3D::vector3 shakevector;
|
||||
if( ( mvOccupied->EngineType == DieselElectric )
|
||||
|| ( mvOccupied->EngineType == DieselEngine ) ) {
|
||||
if( ( mvOccupied->EngineType == TEngineType::DieselElectric )
|
||||
|| ( mvOccupied->EngineType == TEngineType::DieselEngine ) ) {
|
||||
if( std::abs( mvOccupied->enrot ) > 0.0 ) {
|
||||
// engine vibration
|
||||
shakevector.x +=
|
||||
@@ -4265,8 +4272,8 @@ bool TTrain::Update( double const Deltatime )
|
||||
|| ( ggMainOnButton.GetDesiredValue() > 0.95 ) ) {
|
||||
// keep track of period the line breaker button is held down, to determine when/if circuit closes
|
||||
if( ( fHVoltage > 0.5 * mvControlled->EnginePowerSource.MaxVoltage )
|
||||
|| ( ( mvControlled->EngineType != ElectricSeriesMotor )
|
||||
&& ( mvControlled->EngineType != ElectricInductionMotor )
|
||||
|| ( ( mvControlled->EngineType != TEngineType::ElectricSeriesMotor )
|
||||
&& ( mvControlled->EngineType != TEngineType::ElectricInductionMotor )
|
||||
&& ( true == mvControlled->Battery ) ) ) {
|
||||
// prevent the switch from working if there's no power
|
||||
// TODO: consider whether it makes sense for diesel engines and such
|
||||
@@ -4291,8 +4298,8 @@ bool TTrain::Update( double const Deltatime )
|
||||
if( m_linebreakerstate == 2 ) {
|
||||
// for diesels and/or vehicles with toggle switch setup we complete the engine start here
|
||||
if( ( ggMainOnButton.SubModel == nullptr )
|
||||
|| ( ( mvControlled->EngineType == DieselEngine )
|
||||
|| ( mvControlled->EngineType == DieselElectric ) ) ) {
|
||||
|| ( ( mvControlled->EngineType == TEngineType::DieselEngine )
|
||||
|| ( mvControlled->EngineType == TEngineType::DieselElectric ) ) ) {
|
||||
// try to finalize state change of the line breaker, set the state based on the outcome
|
||||
m_linebreakerstate = (
|
||||
mvControlled->MainSwitch( true ) ?
|
||||
@@ -4337,18 +4344,35 @@ bool TTrain::Update( double const Deltatime )
|
||||
{ // Ra: TODO: odczyty klawiatury/pulpitu nie powinny być uzależnione od istnienia modelu kabiny
|
||||
|
||||
if( ( DynamicObject->Mechanik != nullptr )
|
||||
&& ( false == DynamicObject->Mechanik->AIControllFlag ) // nie blokujemy AI
|
||||
&& ( ( mvOccupied->TrainType == dt_ET40 )
|
||||
|| ( mvOccupied->TrainType == dt_EP05 ) ) ) {
|
||||
// dla ET40 i EU05 automatyczne cofanie nastawnika - i tak nie będzie to działać dobrze...
|
||||
// TODO: remove direct keyboard check, use deltatime to stabilize speed
|
||||
if( ( glfwGetKey( Global.window, GLFW_KEY_KP_ADD ) != GLFW_TRUE )
|
||||
&& ( mvOccupied->MainCtrlPos > mvOccupied->MainCtrlActualPos ) ) {
|
||||
mvOccupied->DecMainCtrl( 1 );
|
||||
&& ( false == DynamicObject->Mechanik->AIControllFlag ) ) {
|
||||
// nie blokujemy AI
|
||||
if( ( mvOccupied->TrainType == dt_ET40 )
|
||||
|| ( mvOccupied->TrainType == dt_EP05 ) ) {
|
||||
// dla ET40 i EU05 automatyczne cofanie nastawnika - i tak nie będzie to działać dobrze...
|
||||
// TODO: use deltatime to stabilize speed
|
||||
if( false == (
|
||||
( input::command == user_command::mastercontrollerset )
|
||||
|| ( input::command == user_command::mastercontrollerincrease )
|
||||
|| ( input::command == user_command::mastercontrollerdecrease ) ) ) {
|
||||
if( mvOccupied->MainCtrlPos > mvOccupied->MainCtrlActualPos ) {
|
||||
mvOccupied->DecMainCtrl( 1 );
|
||||
}
|
||||
else if( mvOccupied->MainCtrlPos < mvOccupied->MainCtrlActualPos ) {
|
||||
// Ra 15-01: a to nie miało być tylko cofanie?
|
||||
mvOccupied->IncMainCtrl( 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
if( ( glfwGetKey( Global.window, GLFW_KEY_KP_SUBTRACT ) != GLFW_TRUE )
|
||||
&& ( mvOccupied->MainCtrlPos < mvOccupied->MainCtrlActualPos ) ) {
|
||||
mvOccupied->IncMainCtrl( 1 ); // Ra 15-01: a to nie miało być tylko cofanie?
|
||||
|
||||
if( ( mvOccupied->BrakeHandle == TBrakeHandle::FVel6 )
|
||||
&& ( mvOccupied->fBrakeCtrlPos < 0.0 )
|
||||
&& ( Global.iFeedbackMode < 3 ) ) {
|
||||
// Odskakiwanie hamulce EP
|
||||
if( false == (
|
||||
( input::command == user_command::trainbrakeset )
|
||||
|| ( input::command == user_command::trainbrakedecrease ) ) ) {
|
||||
set_train_brake( 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4379,8 +4403,8 @@ bool TTrain::Update( double const Deltatime )
|
||||
}
|
||||
|
||||
// Ra 2014-09: napięcia i prądy muszą być ustalone najpierw, bo wysyłane są ewentualnie na PoKeys
|
||||
if ((mvControlled->EngineType != DieselElectric)
|
||||
&& (mvControlled->EngineType != ElectricInductionMotor)) // Ra 2014-09: czy taki rozdzia? ma sens?
|
||||
if ((mvControlled->EngineType != TEngineType::DieselElectric)
|
||||
&& (mvControlled->EngineType != TEngineType::ElectricInductionMotor)) // Ra 2014-09: czy taki rozdzia? ma sens?
|
||||
fHVoltage = mvControlled->RunningTraction.TractionVoltage; // Winger czy to nie jest zle?
|
||||
// *mvControlled->Mains);
|
||||
else
|
||||
@@ -4443,7 +4467,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
asCarName[i] = p->name();
|
||||
bPants[iUnitNo - 1][0] = (bPants[iUnitNo - 1][0] || p->MoverParameters->PantFrontUp);
|
||||
bPants[iUnitNo - 1][1] = (bPants[iUnitNo - 1][1] || p->MoverParameters->PantRearUp);
|
||||
bComp[iUnitNo - 1][0] = (bComp[iUnitNo - 1][0] || p->MoverParameters->CompressorAllow || (p->MoverParameters->CompressorStart == start::automatic));
|
||||
bComp[iUnitNo - 1][0] = (bComp[iUnitNo - 1][0] || p->MoverParameters->CompressorAllow || (p->MoverParameters->CompressorStart == start_t::automatic));
|
||||
bSlip[i] = p->MoverParameters->SlippingWheels;
|
||||
if (p->MoverParameters->CompressorSpeed > 0.00001)
|
||||
{
|
||||
@@ -4542,12 +4566,12 @@ bool TTrain::Update( double const Deltatime )
|
||||
// hunter-080812: wyrzucanie szybkiego na elektrykach gdy nie ma napiecia przy dowolnym ustawieniu kierunkowego
|
||||
// Ra: to już jest w T_MoverParameters::TractionForce(), ale zależy od kierunku
|
||||
if( ( mvControlled->Mains )
|
||||
&& ( mvControlled->EngineType == ElectricSeriesMotor ) ) {
|
||||
&& ( mvControlled->EngineType == TEngineType::ElectricSeriesMotor ) ) {
|
||||
if( std::max( mvControlled->GetTrainsetVoltage(), std::fabs( mvControlled->RunningTraction.TractionVoltage ) ) < 0.5 * mvControlled->EnginePowerSource.MaxVoltage ) {
|
||||
// TODO: check whether it should affect entire consist for EMU
|
||||
// TODO: check whether it should happen if there's power supplied alternatively through hvcouplers
|
||||
// TODO: potentially move this to the mover module, as there isn't much reason to have this dependent on the operator presence
|
||||
mvControlled->MainSwitch( false, ( mvControlled->TrainType == dt_EZT ? range::unit : range::local ) );
|
||||
mvControlled->MainSwitch( false, ( mvControlled->TrainType == dt_EZT ? range_t::unit : range_t::local ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4569,7 +4593,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
{
|
||||
fConverterTimer += Deltatime;
|
||||
if ((mvControlled->CompressorFlag == true) && (mvControlled->CompressorPower == 1) &&
|
||||
((mvControlled->EngineType == ElectricSeriesMotor) ||
|
||||
((mvControlled->EngineType == TEngineType::ElectricSeriesMotor) ||
|
||||
(mvControlled->TrainType == dt_EZT)) &&
|
||||
(DynamicObject->Controller == Humandriver)) // hunter-110212: poprawka dla EZT
|
||||
{ // hunter-091012: poprawka (zmiana warunku z CompressorPower /rozne od
|
||||
@@ -4578,7 +4602,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
{
|
||||
mvControlled->ConvOvldFlag = true;
|
||||
if (mvControlled->TrainType != dt_EZT)
|
||||
mvControlled->MainSwitch( false, ( mvControlled->TrainType == dt_EZT ? range::unit : range::local ) );
|
||||
mvControlled->MainSwitch( false, ( mvControlled->TrainType == dt_EZT ? range_t::unit : range_t::local ) );
|
||||
}
|
||||
else if( fConverterTimer >= fConverterPrzekaznik ) {
|
||||
// changed switch from always true to take into account state of the compressor switch
|
||||
@@ -4697,13 +4721,13 @@ bool TTrain::Update( double const Deltatime )
|
||||
ggLVoltage.Update();
|
||||
}
|
||||
|
||||
if (mvControlled->EngineType == DieselElectric)
|
||||
if (mvControlled->EngineType == TEngineType::DieselElectric)
|
||||
{ // ustawienie zmiennych dla silnika spalinowego
|
||||
fEngine[1] = mvControlled->ShowEngineRotation(1);
|
||||
fEngine[2] = mvControlled->ShowEngineRotation(2);
|
||||
}
|
||||
|
||||
else if (mvControlled->EngineType == DieselEngine)
|
||||
else if (mvControlled->EngineType == TEngineType::DieselEngine)
|
||||
{ // albo dla innego spalinowego
|
||||
fEngine[1] = mvControlled->ShowEngineRotation(1);
|
||||
fEngine[2] = mvControlled->ShowEngineRotation(2);
|
||||
@@ -5088,6 +5112,20 @@ bool TTrain::Update( double const Deltatime )
|
||||
// McZapkie-080602: obroty (albo translacje) regulatorow
|
||||
if (ggMainCtrl.SubModel) {
|
||||
|
||||
#ifdef _WIN32
|
||||
if ((DynamicObject->Mechanik != nullptr)
|
||||
&& (false == DynamicObject->Mechanik->AIControllFlag) // nie blokujemy AI
|
||||
&& (Global.iFeedbackMode == 4)
|
||||
&& (Global.fCalibrateIn[2][1] != 0.0)) {
|
||||
auto const b = clamp<double>(
|
||||
Console::AnalogCalibrateGet(2) * mvOccupied->MainCtrlPosNo,
|
||||
0.0,
|
||||
mvOccupied->MainCtrlPosNo);
|
||||
while (mvOccupied->MainCtrlPos < b) { mvOccupied->MainCtrlPos = b - 1; mvOccupied->IncMainCtrl(1); }
|
||||
while (mvOccupied->MainCtrlPos > b) { mvOccupied->MainCtrlPos = b + 1; mvOccupied->DecMainCtrl(1); }
|
||||
}
|
||||
#endif
|
||||
|
||||
if( mvControlled->CoupledCtrl ) {
|
||||
ggMainCtrl.UpdateValue(
|
||||
double( mvControlled->MainCtrlPos + mvControlled->ScndCtrlPos ),
|
||||
@@ -5137,7 +5175,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
false) // nie blokujemy AI
|
||||
{ // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba
|
||||
// Firleju: dlatego kasujemy i zastepujemy funkcją w Console
|
||||
if (mvOccupied->BrakeHandle == FV4a)
|
||||
if (mvOccupied->BrakeHandle == TBrakeHandle::FV4a)
|
||||
{
|
||||
double b = Console::AnalogCalibrateGet(0);
|
||||
b = b * 8.0 - 2.0;
|
||||
@@ -5145,7 +5183,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
ggBrakeCtrl.UpdateValue(b); // przesów bez zaokrąglenia
|
||||
mvOccupied->BrakeLevelSet(b);
|
||||
}
|
||||
if (mvOccupied->BrakeHandle == FVel6) // może można usunąć ograniczenie do FV4a i FVel6?
|
||||
if (mvOccupied->BrakeHandle == TBrakeHandle::FVel6) // może można usunąć ograniczenie do FV4a i FVel6?
|
||||
{
|
||||
double b = Console::AnalogCalibrateGet(0);
|
||||
b = b * 7.0 - 1.0;
|
||||
@@ -5166,22 +5204,24 @@ bool TTrain::Update( double const Deltatime )
|
||||
#ifdef _WIN32
|
||||
if( ( DynamicObject->Mechanik != nullptr )
|
||||
&& ( false == DynamicObject->Mechanik->AIControllFlag ) // nie blokujemy AI
|
||||
&& ( mvOccupied->BrakeLocHandle == FD1 )
|
||||
&& ( mvOccupied->BrakeLocHandle == TBrakeHandle::FD1 )
|
||||
&& ( ( Global.iFeedbackMode == 4 )
|
||||
/*|| ( Global.bMWDmasterEnable && Global.bMWDBreakEnable )*/ ) ) {
|
||||
// Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba
|
||||
// Firleju: dlatego kasujemy i zastepujemy funkcją w Console
|
||||
auto const b = clamp<double>(
|
||||
Console::AnalogCalibrateGet( 1 ) * 10.0,
|
||||
Console::AnalogCalibrateGet( 1 ),
|
||||
0.0,
|
||||
ManualBrakePosNo );
|
||||
ggLocalBrake.UpdateValue( b ); // przesów bez zaokrąglenia
|
||||
mvOccupied->LocalBrakePos = int( 1.09 * b ); // sposób zaokrąglania jest do ustalenia
|
||||
1.0 );
|
||||
mvOccupied->LocalBrakePosA = b;
|
||||
ggLocalBrake.UpdateValue( b * LocalBrakePosNo );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
// standardowa prodedura z kranem powiązanym z klawiaturą
|
||||
ggLocalBrake.UpdateValue( std::max<double>( mvOccupied->LocalBrakePos, mvOccupied->LocalBrakePosA * LocalBrakePosNo ) );
|
||||
{
|
||||
// standardowa prodedura z kranem powiązanym z klawiaturą
|
||||
ggLocalBrake.UpdateValue( mvOccupied->LocalBrakePosA * LocalBrakePosNo );
|
||||
}
|
||||
ggLocalBrake.Update();
|
||||
}
|
||||
if (ggManualBrake.SubModel != nullptr) {
|
||||
@@ -5342,7 +5382,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
}
|
||||
|
||||
// anti slip system activation, maintained while the control button is down
|
||||
if( mvOccupied->BrakeSystem != ElectroPneumatic ) {
|
||||
if( mvOccupied->BrakeSystem != TBrakeSystem::ElectroPneumatic ) {
|
||||
if( ggAntiSlipButton.GetDesiredValue() > 0.95 ) {
|
||||
mvControlled->AntiSlippingBrake();
|
||||
}
|
||||
@@ -5448,8 +5488,8 @@ TTrain::update_sounds( double const Deltatime ) {
|
||||
|
||||
// McZapkie-280302 - syczenie
|
||||
// TODO: softer volume reduction than plain abrupt stop, perhaps as reusable wrapper?
|
||||
if( ( mvOccupied->BrakeHandle == FV4a )
|
||||
|| ( mvOccupied->BrakeHandle == FVel6 ) ) {
|
||||
if( ( mvOccupied->BrakeHandle == TBrakeHandle::FV4a )
|
||||
|| ( mvOccupied->BrakeHandle == TBrakeHandle::FVel6 ) ) {
|
||||
// upuszczanie z PG
|
||||
fPPress = interpolate( fPPress, static_cast<float>( mvOccupied->Handle->GetSound( s_fv4a_b ) ), 0.05f );
|
||||
volume = (
|
||||
@@ -7119,9 +7159,9 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con
|
||||
if (Parser.getToken<std::string>() == "analog")
|
||||
{
|
||||
// McZapkie-300302: zegarek
|
||||
ggClockSInd.Init(DynamicObject->mdKabina->GetFromName("ClockShand"), gt_Rotate, 1.0/60.0);
|
||||
ggClockMInd.Init(DynamicObject->mdKabina->GetFromName("ClockMhand"), gt_Rotate, 1.0/60.0);
|
||||
ggClockHInd.Init(DynamicObject->mdKabina->GetFromName("ClockHhand"), gt_Rotate, 1.0/12.0);
|
||||
ggClockSInd.Init(DynamicObject->mdKabina->GetFromName("ClockShand"), TGaugeType::gt_Rotate, 1.0/60.0);
|
||||
ggClockMInd.Init(DynamicObject->mdKabina->GetFromName("ClockMhand"), TGaugeType::gt_Rotate, 1.0/60.0);
|
||||
ggClockHInd.Init(DynamicObject->mdKabina->GetFromName("ClockHhand"), TGaugeType::gt_Rotate, 1.0/12.0);
|
||||
}
|
||||
}
|
||||
else if (Label == "evoltage:")
|
||||
@@ -7265,7 +7305,7 @@ void TTrain::set_localbrake(float val)
|
||||
val = std::min(1.0f, std::max(0.0f, val));
|
||||
float min = 0.0f;
|
||||
float max = (float)LocalBrakePosNo;
|
||||
mvControlled->LocalBrakePos = std::round(min + val * (max - min));
|
||||
mvControlled->LocalBrakePosA = std::round(min + val * (max - min));
|
||||
}
|
||||
|
||||
int TTrain::get_drive_direction()
|
||||
|
||||
Reference in New Issue
Block a user