16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-23 00:29:19 +02:00

compressor logic tweaks, battery cab controls, pump sounds

This commit is contained in:
tmj-fstate
2020-01-01 20:37:19 +01:00
parent 2b7f0af9ce
commit 10262f37dc
9 changed files with 102 additions and 15 deletions

View File

@@ -3782,6 +3782,7 @@ void TDynamicObject::TurnOff()
// przeliczanie dźwięków, bo będzie słychać bez wyświetlania sektora z pojazdem
void TDynamicObject::RenderSounds() {
if( false == simulation::is_ready ) { return; }
if( Global.iPause != 0 ) { return; }
if( ( m_startjoltplayed )
@@ -5094,11 +5095,25 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co
}
else if( token == "oilpump:" ) {
// plik z dzwiekiem wentylatora, mnozniki i ofsety amp. i czest.
m_powertrainsounds.oil_pump.deserialize( parser, sound_type::single );
m_powertrainsounds.oil_pump.owner( this );
}
else if( token == "fuelpump:" ) {
m_powertrainsounds.fuel_pump.deserialize( parser, sound_type::single );
m_powertrainsounds.fuel_pump.owner( this );
}
else if( token == "waterpump:" ) {
m_powertrainsounds.water_pump.deserialize( parser, sound_type::single );
m_powertrainsounds.water_pump.owner( this );
}
else if( token == "waterheater:" ) {
m_powertrainsounds.water_heater.deserialize( parser, sound_type::single );
m_powertrainsounds.water_heater.owner( this );
}
else if( ( token == "tractionmotor:" )
&& ( MoverParameters->Power > 0 ) ) {
// plik z dzwiekiem silnika, mnozniki i ofsety amp. i czest.
@@ -6611,7 +6626,7 @@ TDynamicObject::powertrain_sounds::position( glm::vec3 const Location ) {
std::vector<sound_source *> enginesounds = {
&inverter,
&motor_relay, &dsbWejscie_na_bezoporow, &motor_parallel, &motor_shuntfield, &rsWentylator,
&engine, &engine_ignition, &engine_shutdown, &engine_revving, &engine_turbo, &oil_pump, &radiator_fan, &radiator_fan_aux,
&engine, &engine_ignition, &engine_shutdown, &engine_revving, &engine_turbo, &oil_pump, &fuel_pump, &water_pump, &water_heater, &radiator_fan, &radiator_fan_aux,
&transmission, &rsEngageSlippery
};
for( auto sound : enginesounds ) {
@@ -6639,7 +6654,36 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
else {
oil_pump.stop();
}
// fuel pump
if( true == Vehicle.FuelPump.is_active ) {
fuel_pump
.pitch( fuel_pump.m_frequencyoffset + fuel_pump.m_frequencyfactor * 1.f )
.gain( fuel_pump.m_amplitudeoffset + fuel_pump.m_amplitudefactor * 1.f )
.play( sound_flags::exclusive | sound_flags::looping );
}
else {
fuel_pump.stop();
}
// water pump
if( true == Vehicle.WaterPump.is_active ) {
water_pump
.pitch( water_pump.m_frequencyoffset + water_pump.m_frequencyfactor * 1.f )
.gain( water_pump.m_amplitudeoffset + water_pump.m_amplitudefactor * 1.f )
.play( sound_flags::exclusive | sound_flags::looping );
}
else {
water_pump.stop();
}
// water heater
if( true == Vehicle.WaterHeater.is_active ) {
water_heater
.pitch( water_heater.m_frequencyoffset + water_heater.m_frequencyfactor * 1.f )
.gain( water_heater.m_amplitudeoffset + water_heater.m_amplitudefactor * 1.f )
.play( sound_flags::exclusive | sound_flags::looping );
}
else {
water_heater.stop();
}
// engine sounds
// ignition
if( engine_state_last != Vehicle.Mains ) {

View File

@@ -369,6 +369,9 @@ private:
sound_source engine_turbo { sound_placement::engine };
double engine_turbo_pitch { 1.0 };
sound_source oil_pump { sound_placement::engine };
sound_source fuel_pump { sound_placement::engine };
sound_source water_pump { sound_placement::engine };
sound_source water_heater { sound_placement::engine };
sound_source radiator_fan { sound_placement::engine };
sound_source radiator_fan_aux { sound_placement::engine };
sound_source transmission { sound_placement::engine };

View File

@@ -1281,6 +1281,7 @@ public:
bool CompressorAllow = false; /*! zezwolenie na uruchomienie sprezarki NBMX*/
bool CompressorAllowLocal{ true }; // local device state override (most units don't have this fitted so it's set to true not to intefere)
bool CompressorGovernorLock{ false }; // indicates whether compressor pressure switch was activated due to reaching cut-out pressure
bool CompressorTankValve{ false }; // indicates excessive pressure is vented from compressor tank directly and instantly
start_t CompressorStart{ start_t::manual }; // whether the compressor is started manually, or another way
start_t PantographCompressorStart{ start_t::manual };
// TODO converter parameters, for when we start cleaning up mover parameters

View File

@@ -3707,6 +3707,8 @@ void TMoverParameters::CompressorCheck(double dt) {
CompressedVolume = std::max( 0.0, CompressedVolume - dt * AirLeakRate * 0.1 ); // nieszczelności: 0.001=1l/s
Compressor = CompressedVolume / VeselVolume;
// assorted operational logic
auto const MaxCompressorF { CompressorList[ TCompressorList::cl_MaxFactor ][ CompressorListPos ] * MaxCompressor };
auto const MinCompressorF { CompressorList[ TCompressorList::cl_MinFactor ][ CompressorListPos ] * MinCompressor };
@@ -3792,7 +3794,8 @@ void TMoverParameters::CompressorCheck(double dt) {
CompressorSpeedF
* ( 2.0 * MaxCompressorF - Compressor ) / MaxCompressorF
* enginefactor
* dt;
* dt
* ( CompressorGovernorLock ? 0.0 : 1.0 ); // with the lock active air is vented out
break;
}
default: {
@@ -3806,10 +3809,16 @@ void TMoverParameters::CompressorCheck(double dt) {
}
if( ( pressureistoohigh )
&& ( false == governorlockispresent ) ) {
&& ( ( false == governorlockispresent ) || ( CompressorPower == 3 ) ) ) {
// vent some air out if there's no governor lock to stop the compressor from exceeding acceptable pressure level
SetFlag( SoundFlag, sound::relay | sound::loud );
CompressedVolume *= 0.8;
CompressedVolume *= (
false == governorlockispresent ? 0.80 : // arbitrary amount
CompressorTankValve ? MinCompressorF / MaxCompressorF : // drop to mincompressor level
0.999 ); // HACK: drop a tiny bit so the sound doesn't trigger repeatedly
if( ( false == governorlockispresent ) || ( CompressorTankValve ) ) {
CompressorGovernorLock = false;
}
}
// tymczasowo tylko obciążenie sprężarki, tak z 5A na sprężarkę
@@ -9221,6 +9230,7 @@ void TMoverParameters::LoadFIZ_Brake( std::string const &line ) {
*/
extract_value( MinCompressor, "MinCP", line, "" );
extract_value( MaxCompressor, "MaxCP", line, "" );
extract_value( CompressorTankValve, "CompressorTankValve", line, "" );
extract_value( CompressorSpeed, "CompressorSpeed", line, "" );
extract_value( EmergencyValveOff, "MinEVP", line, "" );
extract_value( EmergencyValveOn, "MaxEVP", line, "" );

View File

@@ -1932,7 +1932,8 @@ void TTrain::OnCommand_batteryenable( TTrain *Train, command_data const &Command
if( Command.action == GLFW_PRESS ) {
// visual feedback
Train->ggBatteryButton.UpdateValue( 1.0, Train->dsbSwitch );
Train->ggBatteryButton.UpdateValue( 1.0f, Train->dsbSwitch );
Train->ggBatteryOnButton.UpdateValue( 1.0f, Train->dsbSwitch );
if( true == Train->mvOccupied->Battery ) { return; } // already on
@@ -1953,6 +1954,7 @@ void TTrain::OnCommand_batteryenable( TTrain *Train, command_data const &Command
// return the switch to neutral position
Train->ggBatteryButton.UpdateValue( 0.5f );
}
Train->ggBatteryOnButton.UpdateValue( 0.0f, Train->dsbSwitch );
}
}
@@ -1960,7 +1962,8 @@ void TTrain::OnCommand_batterydisable( TTrain *Train, command_data const &Comman
// TBD, TODO: ewentualnie zablokować z FIZ, np. w samochodach się nie odłącza akumulatora
if( Command.action == GLFW_PRESS ) {
// visual feedback
Train->ggBatteryButton.UpdateValue( 0.0, Train->dsbSwitch );
Train->ggBatteryButton.UpdateValue( 0.0f, Train->dsbSwitch );
Train->ggBatteryOffButton.UpdateValue( 1.0f, Train->dsbSwitch );
if( false == Train->mvOccupied->Battery ) { return; } // already off
@@ -1978,6 +1981,7 @@ void TTrain::OnCommand_batterydisable( TTrain *Train, command_data const &Comman
// return the switch to neutral position
Train->ggBatteryButton.UpdateValue( 0.5f );
}
Train->ggBatteryOffButton.UpdateValue( 0.0f, Train->dsbSwitch );
}
}
@@ -2279,10 +2283,11 @@ void TTrain::OnCommand_pantographlowerall( TTrain *Train, command_data const &Co
void TTrain::OnCommand_pantographcompressorvalvetoggle( TTrain *Train, command_data const &Command ) {
if( ( Train->mvControlled->TrainType == dt_EZT ?
if( ( Train->ggPantCompressorValve.SubModel == nullptr )
&& ( Train->mvControlled->TrainType == dt_EZT ?
( Train->mvControlled != Train->mvOccupied ) :
( Train->iCabn != 0 ) ) ) {
// tylko w maszynowym
// tylko w maszynowym, unless actual device is present
return;
}
@@ -2305,7 +2310,8 @@ void TTrain::OnCommand_pantographcompressorvalvetoggle( TTrain *Train, command_d
void TTrain::OnCommand_pantographcompressoractivate( TTrain *Train, command_data const &Command ) {
if( ( Train->mvControlled->TrainType == dt_EZT ?
if( ( Train->ggPantCompressorValve.SubModel == nullptr )
&& ( Train->mvControlled->TrainType == dt_EZT ?
( Train->mvControlled != Train->mvOccupied ) :
( Train->iCabn != 0 ) ) ) {
// tylko w maszynowym
@@ -6737,6 +6743,8 @@ bool TTrain::Update( double const Deltatime )
ggCabLightButton.Update();
ggCabLightDimButton.Update();
ggBatteryButton.Update();
ggBatteryOnButton.Update();
ggBatteryOffButton.Update();
ggWaterPumpBreakerButton.Update();
ggWaterPumpButton.Update();
@@ -7942,6 +7950,8 @@ void TTrain::clear_cab_controls()
ggCabLightButton.Clear();
ggCabLightDimButton.Clear();
ggBatteryButton.Clear();
ggBatteryOnButton.Clear();
ggBatteryOffButton.Clear();
//-------
ggFuseButton.Clear();
ggConverterFuseButton.Clear();
@@ -8529,7 +8539,8 @@ bool TTrain::initialize_button(cParser &Parser, std::string const &Label, int co
std::unordered_map<std::string, bool const *> const autolights = {
{ "i-doorpermit_left:", &mvOccupied->Doors.instances[ ( cab_to_end() == end::front ? side::left : side::right ) ].open_permit },
{ "i-doorpermit_right:", &mvOccupied->Doors.instances[ ( cab_to_end() == end::front ? side::right : side::left ) ].open_permit },
{ "i-doorstep:", &mvOccupied->Doors.step_enabled }
{ "i-doorstep:", &mvOccupied->Doors.step_enabled },
{ "i-mainpipelock:", &mvOccupied->LockPipe }
};
{
auto lookup = autolights.find( Label );
@@ -8688,6 +8699,8 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con
{ "cablight_sw:", ggCabLightButton },
{ "cablightdim_sw:", ggCabLightDimButton },
{ "battery_sw:", ggBatteryButton },
{ "batteryon_sw:", ggBatteryOnButton },
{ "batteryoff_sw:", ggBatteryOffButton },
{ "distancecounter_sw:", ggDistanceCounterButton },
{ "universal0:", ggUniversals[ 0 ] },
{ "universal1:", ggUniversals[ 1 ] },

View File

@@ -512,6 +512,8 @@ public: // reszta może by?publiczna
TGauge ggCabLightButton; // hunter-091012: przelacznik oswietlania kabiny
TGauge ggCabLightDimButton; // hunter-091012: przelacznik przyciemnienia
TGauge ggBatteryButton; // Stele 161228 hebelek baterii
TGauge ggBatteryOnButton;
TGauge ggBatteryOffButton;
// oswietlenia kabiny
// NBMX wrzesien 2003 - obsluga drzwi

View File

@@ -821,6 +821,12 @@ drivermouse_input::default_bindings() {
{ "battery_sw:", {
user_command::batterytoggle,
user_command::none } },
{ "batteryon_sw:", {
user_command::batteryenable,
user_command::none } },
{ "batteryoff_sw:", {
user_command::batterydisable,
user_command::none } },
{ "universal0:", {
user_command::generictoggle0,
user_command::none } },

View File

@@ -178,6 +178,8 @@ init() {
"interior light",
"interior light dimmer",
"battery",
"battery",
"battery",
"interactive part",
"interactive part",
"interactive part",
@@ -346,6 +348,8 @@ init() {
"oswietlenie kabiny",
"przyciemnienie oswietlenia kabiny",
"bateria",
"bateria",
"bateria",
"element ruchomy",
"element ruchomy",
"element ruchomy",
@@ -467,6 +471,8 @@ init() {
"cablight_sw:",
"cablightdim_sw:",
"battery_sw:",
"batteryon_sw:",
"batteryoff_sw:",
"universal0:",
"universal1:",
"universal2:",

View File

@@ -167,6 +167,8 @@ enum string {
cab_cablight_sw,
cab_cablightdim_sw,
cab_battery_sw,
cab_batteryon_sw,
cab_batteryoff_sw,
cab_universal0,
cab_universal1,
cab_universal2,