From 07ba31cd7bd44805d969853369c4d0024a978c32 Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Wed, 2 Oct 2019 22:45:41 +0200 Subject: [PATCH] ai brake release logic tweak, auto sandbox cab control fix, sound source fixes --- Driver.cpp | 10 ++++++++-- PyInt.cpp | 3 ++- Train.cpp | 20 ++++++++++++++++---- Train.h | 2 +- sound.cpp | 9 ++++++++- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index 0d3ad5eb..35b9917e 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -6072,7 +6072,10 @@ TController::UpdateSituation(double dt) { // jeśli opóźnienie większe od wymaganego (z histerezą) luzowanie, gdy za dużo // TBD: check if the condition isn't redundant with the DecBrake() code if( /*GBH mvOccupied->BrakeCtrlPos*/BrakeCtrlPosition >= 0 ) { - DecBrake(); // tutaj zmniejszało o 1 przy odczepianiu + if( VelDesired > 0.0 ) { + // sanity check to prevent unintended brake release on sharp slopes + DecBrake(); // tutaj zmniejszało o 1 przy odczepianiu + } } } else if( mvOccupied->Handle->TimeEP ) { @@ -6115,7 +6118,10 @@ TController::UpdateSituation(double dt) { // yB: luzuje hamulec dopiero przy różnicy opóźnień rzędu 0.2 if( OrderCurrentGet() != Disconnect ) { // przy odłączaniu nie zwalniamy tu hamulca - DecBrake(); // tutaj zmniejszało o 1 przy odczepianiu + if( VelDesired > 0.0 ) { + // sanity check to prevent unintended brake release on sharp slopes + DecBrake(); // tutaj zmniejszało o 1 przy odczepianiu + } } fBrakeTime = ( mvOccupied->BrakeDelayFlag > bdelay_G ? diff --git a/PyInt.cpp b/PyInt.cpp index cbaac2e9..ea7720af 100644 --- a/PyInt.cpp +++ b/PyInt.cpp @@ -111,7 +111,7 @@ auto python_taskqueue::init() -> bool { // release the lock, save the state for future use m_mainthread = PyEval_SaveThread(); - WriteLog( "Python Interpreter setup complete" ); + WriteLog( "Python Interpreter: setup complete" ); // init workers for( auto &worker : m_workers ) { @@ -319,6 +319,7 @@ void python_taskqueue::run( GLFWwindow *Context, rendertask_sequence &Tasks, thr void python_taskqueue::error() { + ErrorLog( "Python Interpreter: encountered error" ); if( m_stderr != nullptr ) { // std err pythona jest buforowane PyErr_Print(); diff --git a/Train.cpp b/Train.cpp index 9e1cb264..59b96f11 100644 --- a/Train.cpp +++ b/Train.cpp @@ -202,6 +202,9 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = { { user_command::alarmchaintoggle, &TTrain::OnCommand_alarmchaintoggle }, { user_command::wheelspinbrakeactivate, &TTrain::OnCommand_wheelspinbrakeactivate }, { user_command::sandboxactivate, &TTrain::OnCommand_sandboxactivate }, + { user_command::autosandboxtoggle, &TTrain::OnCommand_autosandboxtoggle }, + { user_command::autosandboxactivate, &TTrain::OnCommand_autosandboxactivate }, + { user_command::autosandboxdeactivate, &TTrain::OnCommand_autosandboxdeactivate }, { user_command::epbrakecontroltoggle, &TTrain::OnCommand_epbrakecontroltoggle }, { user_command::trainbrakeoperationmodeincrease, &TTrain::OnCommand_trainbrakeoperationmodeincrease }, { user_command::trainbrakeoperationmodedecrease, &TTrain::OnCommand_trainbrakeoperationmodedecrease }, @@ -1549,7 +1552,7 @@ void TTrain::OnCommand_autosandboxactivate(TTrain *Train, command_data const &Co if (Command.action == GLFW_PRESS) { // only reacting to press, so the switch doesn't flip back and forth if key is held down Train->mvOccupied->SandboxAutoAllow(true); - Train->ggAutoSandAllow.UpdateValue(1.0, Train->dsbSwitch); + Train->ggAutoSandButton.UpdateValue(1.0, Train->dsbSwitch); } }; @@ -1557,7 +1560,7 @@ void TTrain::OnCommand_autosandboxdeactivate(TTrain *Train, command_data const & if (Command.action == GLFW_PRESS) { // only reacting to press, so the switch doesn't flip back and forth if key is held down Train->mvOccupied->SandboxAutoAllow(false); - Train->ggAutoSandAllow.UpdateValue(0.0, Train->dsbSwitch); + Train->ggAutoSandButton.UpdateValue(0.0, Train->dsbSwitch); } }; @@ -6439,6 +6442,7 @@ bool TTrain::Update( double const Deltatime ) ggUniveralBrakeButton3.Update(); ggAntiSlipButton.Update(); ggSandButton.Update(); + ggAutoSandButton.Update(); ggFuseButton.Update(); ggConverterFuseButton.Update(); ggStLinOffButton.Update(); @@ -7679,6 +7683,7 @@ void TTrain::clear_cab_controls() ggUniveralBrakeButton2.Clear(); ggUniveralBrakeButton3.Clear(); ggSandButton.Clear(); + ggAutoSandButton.Clear(); ggAntiSlipButton.Clear(); ggHornButton.Clear(); ggHornLowButton.Clear(); @@ -8153,7 +8158,14 @@ void TTrain::set_cab_controls( int const Cab ) { 1.f : 0.f ); } - + // sandbox + if( ggAutoSandButton.type() != TGaugeType::push ) { + ggAutoSandButton.PutValue( + mvControlled->SandDoseAutoAllow ? + 1.f : + 0.f ); + } + // we reset all indicators, as they're set during the update pass // TODO: when cleaning up break setting indicator state into a separate function, so we can reuse it } @@ -8346,7 +8358,7 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con { "universalbrake2_bt:", ggUniveralBrakeButton2 }, { "universalbrake3_bt:", ggUniveralBrakeButton3 }, { "sand_bt:", ggSandButton }, - { "autosandallow_sw:", ggAutoSandAllow }, + { "autosandallow_sw:", ggAutoSandButton }, { "antislip_bt:", ggAntiSlipButton }, { "horn_bt:", ggHornButton }, { "hornlow_bt:", ggHornLowButton }, diff --git a/Train.h b/Train.h index 570c17fb..aa574239 100644 --- a/Train.h +++ b/Train.h @@ -436,7 +436,7 @@ public: // reszta może by?publiczna TGauge ggUniveralBrakeButton2; TGauge ggUniveralBrakeButton3; TGauge ggSandButton; // guzik piasecznicy - TGauge ggAutoSandAllow; // przełącznik piasecznicy + TGauge ggAutoSandButton; // przełącznik piasecznicy TGauge ggAntiSlipButton; TGauge ggFuseButton; TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania nadmiarowego przetwornic i ogrzewania diff --git a/sound.cpp b/sound.cpp index f3306e78..b8d6ef5a 100644 --- a/sound.cpp +++ b/sound.cpp @@ -509,7 +509,9 @@ sound_source::update_basic( audio::openal_source &Source ) { // when it happens update active sample counters, and potentially activate the looping update_counter( sound_id::begin, -1 ); update_counter( soundhandle, 1 ); - Source.loop( TestFlag( m_flags, sound_flags::looping ) ); + if( soundhandle == sound_id::main ) { + Source.loop( TestFlag( m_flags, sound_flags::looping ) ); + } } } @@ -574,7 +576,12 @@ sound_source::update_basic( audio::openal_source &Source ) { } else { // the emitter is either all done or was terminated early + /* update_counter( Source.sounds[ Source.sound_index - 1 ], -1 ); + */ + for( auto &soundchunk : m_soundchunks ) { + soundchunk.first.playing = 0; + } } } }