mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-19 02:09:17 +02:00
door operation permit preset cab control, door control system enhancements, minor bug fixes
This commit is contained in:
@@ -3172,7 +3172,7 @@ void TController::SpeedSet()
|
||||
// Ra 2014-06: "automatyczna" skrzynia biegów...
|
||||
if (!mvControlling->MotorParam[mvControlling->ScndCtrlPos].AutoSwitch) // gdy biegi ręczne
|
||||
if ((mvControlling->ShuntMode ? mvControlling->AnPos : 1.0) * mvControlling->Vel >
|
||||
0.6 * mvControlling->MotorParam[mvControlling->ScndCtrlPos].mfi)
|
||||
0.75 * mvControlling->MotorParam[mvControlling->ScndCtrlPos].mfi)
|
||||
// if (mvControlling->enrot>0.95*mvControlling->dizel_nMmax) //youBy: jeśli obroty >
|
||||
// 0,95 nmax, wrzuć wyższy bieg - Ra: to nie działa
|
||||
{ // jak prędkość większa niż 0.6 maksymalnej na danym biegu, wrzucić wyższy
|
||||
@@ -3223,7 +3223,7 @@ void TController::Doors( bool const Open, int const Side ) {
|
||||
auto const lewe = ( pVehicle->DirectionGet() > 0 ) ? 1 : 2;
|
||||
auto const prawe = 3 - lewe;
|
||||
|
||||
if( ( pVehicle->MoverParameters->Doors.open_permit == false )
|
||||
if( ( true == pVehicle->MoverParameters->Doors.permit_needed )
|
||||
&& ( true == AIControllFlag ) ) {
|
||||
// grant door control permission if it's not automatic
|
||||
// TBD: stricter requirements?
|
||||
@@ -3247,7 +3247,8 @@ void TController::Doors( bool const Open, int const Side ) {
|
||||
}
|
||||
else {
|
||||
// zamykanie
|
||||
if( ( true == pVehicle->MoverParameters->Doors.open_permit ) && ( false == doors_open() ) ) {
|
||||
if( ( false == pVehicle->MoverParameters->Doors.permit_needed )
|
||||
&& ( false == doors_open() ) ) {
|
||||
// the doors are already closed and we don't have to revoke control permit, we can skip all hard work
|
||||
iDrivigFlags &= ~moveDoorOpened;
|
||||
}
|
||||
|
||||
20
DynObj.cpp
20
DynObj.cpp
@@ -2287,18 +2287,19 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
|
||||
int
|
||||
TDynamicObject::init_sections( TModel3d const *Model, std::string const &Nameprefix ) {
|
||||
|
||||
std::string sectionname;
|
||||
auto sectioncount = 0;
|
||||
auto sectionindex = 0;
|
||||
TSubModel *sectionsubmodel { nullptr };
|
||||
|
||||
do {
|
||||
sectionname =
|
||||
Nameprefix + (
|
||||
sectionindex < 10 ?
|
||||
"0" + std::to_string( sectionindex ) :
|
||||
std::to_string( sectionindex ) );
|
||||
sectionsubmodel = Model->GetFromName( sectionname );
|
||||
// section names for index < 10 match either prefix0X or prefixX
|
||||
// section names above 10 match prefixX
|
||||
auto const sectionindexname { std::to_string( sectionindex ) };
|
||||
sectionsubmodel = Model->GetFromName( Nameprefix + sectionindexname );
|
||||
if( ( sectionsubmodel == nullptr )
|
||||
&& ( sectionindex < 10 ) ) {
|
||||
sectionsubmodel = Model->GetFromName( Nameprefix + "0" + sectionindexname );
|
||||
}
|
||||
if( sectionsubmodel != nullptr ) {
|
||||
Sections.push_back( {
|
||||
sectionsubmodel,
|
||||
@@ -2771,10 +2772,7 @@ TDynamicObject::update_load_sections() {
|
||||
|
||||
for( auto §ion : Sections ) {
|
||||
|
||||
section.load = (
|
||||
mdLoad != nullptr ?
|
||||
mdLoad->GetFromName( section.compartment->pName ) :
|
||||
nullptr );
|
||||
section.load = GetSubmodelFromName( mdLoad, section.compartment->pName );
|
||||
|
||||
if( ( section.load != nullptr )
|
||||
&& ( section.load->count_children() > 0 ) ) {
|
||||
|
||||
@@ -638,6 +638,20 @@ class TMoverParameters
|
||||
private:
|
||||
// types
|
||||
|
||||
// communication cable, exchanging control signals with adjacent vehicle
|
||||
struct jumper_cable {
|
||||
// types
|
||||
using flag_pair = std::pair<bool, bool>;
|
||||
// members
|
||||
// booleans
|
||||
// std::array<bool, 1> flags {};
|
||||
// boolean pairs, exchanged data is swapped when connected to a matching end (front to front or back to back)
|
||||
// TBD, TODO: convert to regular bool array for efficiency once it's working?
|
||||
std::array<flag_pair, 1> flag_pairs {};
|
||||
// integers
|
||||
// std::array<int, 1> values {};
|
||||
};
|
||||
|
||||
// basic approximation of a generic device
|
||||
// TBD: inheritance or composition?
|
||||
struct basic_device {
|
||||
@@ -722,9 +736,13 @@ private:
|
||||
bool has_autowarning { false };
|
||||
float auto_duration { -1.f }; // automatic door closure delay period
|
||||
float auto_velocity { -1.f }; // automatic door closure velocity threshold
|
||||
bool auto_include_remote { false }; // automatic door closure applies also to remote control
|
||||
bool permit_needed { false };
|
||||
std::vector<int> permit_presets; // permit presets selectable with preset switch
|
||||
// ld inputs
|
||||
bool lock_enabled { true };
|
||||
bool open_permit { true };
|
||||
// internal data
|
||||
int permit_preset { -1 }; // curent position of preset selection switch
|
||||
// vehicle parts
|
||||
std::array<basic_door, 2> instances; // door on the right and left side of the vehicle
|
||||
// ld outputs
|
||||
@@ -1472,7 +1490,8 @@ public:
|
||||
/* funckje dla wagonow*/
|
||||
bool AssignLoad( std::string const &Name, float const Amount = 0.f );
|
||||
bool LoadingDone(double LSpeed, std::string const &Loadname);
|
||||
bool PermitDoors( side const Door, range_t const Notify = range_t::consist );
|
||||
bool PermitDoors( side const Door, bool const State = true, range_t const Notify = range_t::consist );
|
||||
bool ChangeDoorPermitPreset( int const Change, range_t const Notify = range_t::consist );
|
||||
bool OperateDoors( side const Door, bool const State, range_t const Notify = range_t::consist );
|
||||
bool LockDoors( bool const State, range_t const Notify = range_t::consist );
|
||||
bool signal_departure( bool const State, range_t const Notify = range_t::consist ); // toggles departure warning
|
||||
|
||||
@@ -4595,8 +4595,13 @@ double TMoverParameters::TractionForce( double dt ) {
|
||||
case TEngineType::ElectricSeriesMotor: {
|
||||
// update the state of voltage relays
|
||||
auto const voltage { std::max( GetTrainsetVoltage(), std::abs( RunningTraction.TractionVoltage ) ) };
|
||||
NoVoltRelay = ( voltage >= EnginePowerSource.CollectorParameters.MinV );
|
||||
OvervoltageRelay = ( voltage <= EnginePowerSource.CollectorParameters.MaxV ) || ( false == EnginePowerSource.CollectorParameters.OVP );
|
||||
NoVoltRelay =
|
||||
( EnginePowerSource.SourceType != TPowerSource::CurrentCollector )
|
||||
|| ( voltage >= EnginePowerSource.CollectorParameters.MinV );
|
||||
OvervoltageRelay =
|
||||
( EnginePowerSource.SourceType != TPowerSource::CurrentCollector )
|
||||
|| ( voltage <= EnginePowerSource.CollectorParameters.MaxV )
|
||||
|| ( false == EnginePowerSource.CollectorParameters.OVP );
|
||||
// wywalanie szybkiego z powodu niewłaściwego napięcia
|
||||
EventFlag |= ( ( true == Mains )
|
||||
&& ( ( false == NoVoltRelay ) || ( false == OvervoltageRelay ) )
|
||||
@@ -5582,10 +5587,10 @@ bool TMoverParameters::AutoRelayCheck(void)
|
||||
|
||||
// sprawdzenie wszystkich warunkow (AutoRelayFlag, AutoSwitch, Im<Imin)
|
||||
auto const ARFASI2 { (
|
||||
( !AutoRelayFlag )
|
||||
( false == AutoRelayFlag )
|
||||
|| ( ( MotorParam[ ScndCtrlActualPos ].AutoSwitch ) && ( abs( Im ) < Imin ) ) ) };
|
||||
auto const ARFASI { (
|
||||
( !AutoRelayFlag )
|
||||
( false == AutoRelayFlag )
|
||||
|| ( ( RList[ MainCtrlActualPos ].AutoSwitch ) && ( abs( Im ) < Imin ) )
|
||||
|| ( ( !RList[ MainCtrlActualPos ].AutoSwitch ) && ( RList[ MainCtrlActualPos ].Relay < MainCtrlPos ) ) ) };
|
||||
// brak PSR na tej pozycji działa PSR i prąd poniżej progu
|
||||
@@ -6721,21 +6726,41 @@ bool TMoverParameters::LoadingDone(double const LSpeed, std::string const &Loadn
|
||||
return ( LoadStatus >= 4 );
|
||||
}
|
||||
|
||||
bool TMoverParameters::PermitDoors( side const Door, range_t const Notify ) {
|
||||
bool TMoverParameters::ChangeDoorPermitPreset( int const Change, range_t const Notify ) {
|
||||
|
||||
auto const initialstate { Doors.permit_preset };
|
||||
|
||||
if( false == Doors.permit_presets.empty() ) {
|
||||
|
||||
Doors.permit_preset = clamp<int>( Doors.permit_preset + Change, 0, Doors.permit_presets.size() - 1 );
|
||||
auto const doors { Doors.permit_presets[ Doors.permit_preset ] };
|
||||
auto const permitleft = doors & 1;
|
||||
auto const permitright = doors & 2;
|
||||
|
||||
PermitDoors( ( CabNo > 0 ? side::left : side::right ), permitleft, Notify );
|
||||
PermitDoors( ( CabNo > 0 ? side::right : side::left ), permitright, Notify );
|
||||
}
|
||||
|
||||
return ( Doors.permit_preset != initialstate );
|
||||
}
|
||||
|
||||
bool TMoverParameters::PermitDoors( side const Door, bool const State, range_t const Notify ) {
|
||||
|
||||
bool const initialstate { Doors.instances[Door].open_permit };
|
||||
|
||||
if( ( true == Battery )
|
||||
&& ( false == Doors.is_locked ) ) {
|
||||
if( ( false == Doors.permit_presets.empty() ) // HACK: for cases where preset switch is used before battery
|
||||
|| ( ( true == Battery )
|
||||
&& ( false == Doors.is_locked ) ) ) {
|
||||
|
||||
Doors.instances[ Door ].open_permit = true;
|
||||
Doors.instances[ Door ].open_permit = State;
|
||||
}
|
||||
|
||||
if( Notify != range_t::local ) {
|
||||
|
||||
SendCtrlToNext(
|
||||
"DoorPermit",
|
||||
( Door == ( CabNo > 0 ? side::left : side::right ) ? // 1=lewe, 2=prawe (swap if reversed)
|
||||
( State ? 1 : -1 ) // positive: grant, negative: revoke
|
||||
* ( Door == ( CabNo > 0 ? side::left : side::right ) ? // 1=lewe, 2=prawe (swap if reversed)
|
||||
1 :
|
||||
2 ),
|
||||
CabNo,
|
||||
@@ -6872,8 +6897,12 @@ TMoverParameters::update_doors( double const Deltatime ) {
|
||||
&& ( Vel >= 10.0 );
|
||||
|
||||
for( auto &door : Doors.instances ) {
|
||||
|
||||
door.open_permit = door.open_permit && ( false == door.remote_close ) && ( false == Doors.is_locked );
|
||||
// revoke permit if...
|
||||
door.open_permit =
|
||||
( true == door.open_permit ) // ...we already have one...
|
||||
&& ( ( false == Doors.permit_presets.empty() ) // ...there's no permit preset switch...
|
||||
|| ( ( false == Doors.is_locked ) // ...and the door lock is engaged...
|
||||
&& ( false == door.remote_close ) ) );// ...or about to be closed
|
||||
|
||||
door.is_open =
|
||||
( door.position >= Doors.range )
|
||||
@@ -6882,35 +6911,41 @@ TMoverParameters::update_doors( double const Deltatime ) {
|
||||
( door.position <= 0.f )
|
||||
&& ( door.step_position <= 0.f );
|
||||
|
||||
door.local_open = door.local_open && ( false == door.is_open ) && ( Doors.open_permit || door.open_permit );
|
||||
door.remote_open = door.remote_open && ( false == door.is_open ) && ( Doors.open_permit || door.open_permit );
|
||||
door.local_close = door.local_close && ( false == door.is_closed );
|
||||
door.local_open = door.local_open && ( false == door.is_open ) && ( ( false == Doors.permit_needed ) || door.open_permit );
|
||||
door.remote_open = door.remote_open && ( false == door.is_open ) && ( ( false == Doors.permit_needed ) || door.open_permit );
|
||||
door.local_close = door.local_close && ( false == door.is_closed );
|
||||
door.remote_close = door.remote_close && ( false == door.is_closed );
|
||||
|
||||
auto const openrequest {
|
||||
( localopencontrol && door.local_open )
|
||||
|| ( remoteopencontrol && door.remote_open ) };
|
||||
|
||||
auto const autocloserequest {
|
||||
( ( Doors.auto_velocity != -1.f ) && ( Vel > Doors.auto_velocity ) )
|
||||
|| ( ( Doors.auto_duration != -1.f ) && ( door.auto_timer <= 0.f ) ) };
|
||||
|| ( ( door.auto_timer != -1.f ) && ( door.auto_timer <= 0.f ) )
|
||||
|| ( ( Doors.permit_needed ) && ( false == door.open_permit ) ) };
|
||||
auto const closerequest {
|
||||
( remoteclosecontrol && door.remote_close )
|
||||
|| ( localclosecontrol && door.local_close )
|
||||
|| ( autocloserequest && door.local_close ) };
|
||||
( door.remote_close && remoteclosecontrol )
|
||||
|| ( door.local_close && localclosecontrol )
|
||||
|| ( autocloserequest && door.is_open ) };
|
||||
door.is_opening =
|
||||
( false == door.is_open )
|
||||
&& ( true == Battery )
|
||||
&& ( false == closerequest )
|
||||
&& ( door.is_opening || openrequest );
|
||||
&& ( ( true == door.is_opening )
|
||||
|| ( ( true == openrequest )
|
||||
&& ( false == Doors.is_locked ) ) );
|
||||
door.is_closing =
|
||||
( false == door.is_closed )
|
||||
&& ( true == Battery )
|
||||
&& ( false == openrequest )
|
||||
&& ( door.is_closing || closerequest );
|
||||
|
||||
if( true == door.is_opening ) {
|
||||
door.auto_timer = (
|
||||
( remoteopencontrol && door.remote_open ) ?
|
||||
-1.f :
|
||||
Doors.auto_duration );
|
||||
( localopencontrol && door.local_open ) ? Doors.auto_duration :
|
||||
( remoteopencontrol && door.remote_open && Doors.auto_include_remote ) ? Doors.auto_duration :
|
||||
-1.f );
|
||||
}
|
||||
|
||||
// doors
|
||||
@@ -6994,7 +7029,7 @@ TMoverParameters::update_doors( double const Deltatime ) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
// the door are closed if their timer goes below 0, or if the vehicle is moving faster than defined threshold
|
||||
std::array<side, 2> const doorids { side::right, side::left };
|
||||
for( auto const doorid : doorids ) {
|
||||
@@ -7007,6 +7042,7 @@ TMoverParameters::update_doors( double const Deltatime ) {
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// *************************************************************************************************
|
||||
@@ -8123,11 +8159,23 @@ void TMoverParameters::LoadFIZ_Doors( std::string const &line ) {
|
||||
// automatic closing conditions
|
||||
extract_value( Doors.auto_duration, "DoorStayOpen", line, "" );
|
||||
extract_value( Doors.auto_velocity, "DoorAutoCloseVel", line, "" );
|
||||
// operation permit override
|
||||
extract_value( Doors.auto_include_remote, "DoorAutoCloseRemote", line, "" );
|
||||
// operation permit
|
||||
extract_value( Doors.permit_needed, "DoorNeedPermit", line, "" );
|
||||
{
|
||||
bool doorneedpermit { false };
|
||||
extract_value( doorneedpermit, "DoorNeedPermit", line, "" );
|
||||
Doors.open_permit = ( false == doorneedpermit );
|
||||
auto permitpresets = Split( extract_value( "DoorPermitList", line ), '|' );
|
||||
for( auto const &permit : permitpresets ) {
|
||||
Doors.permit_presets.emplace_back( std::stoi( permit ) );
|
||||
}
|
||||
if( false == Doors.permit_presets.empty() ) {
|
||||
// HACK: legacy position indices start from 1, so we deduct 1 to arrive at proper index into the array
|
||||
extract_value( Doors.permit_preset, "DoorPermitListDefault", line, "1" );
|
||||
Doors.permit_preset =
|
||||
std::min<int>(
|
||||
Doors.permit_presets.size(),
|
||||
Doors.permit_preset )
|
||||
- 1;
|
||||
}
|
||||
}
|
||||
|
||||
extract_value( Doors.open_rate, "OpenSpeed", line, "" );
|
||||
@@ -8935,7 +8983,8 @@ TPowerSource TMoverParameters::LoadFIZ_SourceDecode( std::string const &Source )
|
||||
std::map<std::string, TPowerSource> powersources{
|
||||
{ "Transducer", TPowerSource::Transducer },
|
||||
{ "Generator", TPowerSource::Generator },
|
||||
{ "Accu", TPowerSource::Accumulator },
|
||||
{ "Accu", TPowerSource::Accumulator }, // legacy compatibility leftover. TODO: check if we can get rid of it
|
||||
{ "Accumulator", TPowerSource::Accumulator },
|
||||
{ "CurrentCollector", TPowerSource::CurrentCollector },
|
||||
{ "PowerCable", TPowerSource::PowerCable },
|
||||
{ "Heater", TPowerSource::Heater },
|
||||
@@ -9250,10 +9299,12 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir)
|
||||
BrakeDelayFlag = bdelay_G;
|
||||
if ((TestFlag(BrakeDelays, bdelay_R)) && !(TestFlag(BrakeDelays, bdelay_G)))
|
||||
BrakeDelayFlag = bdelay_R;
|
||||
|
||||
/*
|
||||
// disabled, as test mode is used in specific situations and not really a default
|
||||
if (BrakeOpModes & bom_PS)
|
||||
BrakeOpModeFlag = bom_PS;
|
||||
else
|
||||
*/
|
||||
BrakeOpModeFlag = bom_PN;
|
||||
|
||||
// yB: jesli pojazdy nie maja zadeklarowanych czasow, to wsadz z przepisow +-16,(6)%
|
||||
@@ -9632,19 +9683,16 @@ bool TMoverParameters::RunCommand( std::string Command, double CValue1, double C
|
||||
}
|
||||
else if (Command == "DoorPermit") {
|
||||
|
||||
if( ( true == Battery )
|
||||
&& ( false == Doors.is_locked ) ) {
|
||||
auto const left { CValue2 > 0 ? 1 : 2 };
|
||||
auto const right { 3 - left };
|
||||
|
||||
auto const left { CValue2 > 0 ? 1 : 2 };
|
||||
auto const right { 3 - left };
|
||||
|
||||
if( static_cast<int>( CValue1 ) & right ) {
|
||||
Doors.instances[ side::right ].open_permit = true;
|
||||
}
|
||||
if( static_cast<int>( CValue1 ) & left ) {
|
||||
Doors.instances[ side::left ].open_permit = true;
|
||||
}
|
||||
if( std::abs( static_cast<int>( CValue1 ) ) & right ) {
|
||||
Doors.instances[ side::right ].open_permit = (CValue1 > 0);
|
||||
}
|
||||
if( std::abs( static_cast<int>( CValue1 ) ) & left ) {
|
||||
Doors.instances[ side::left ].open_permit = (CValue1 > 0);
|
||||
}
|
||||
|
||||
OK = SendCtrlToNext( Command, CValue1, CValue2, Couplertype );
|
||||
}
|
||||
else if (Command == "DoorOpen") /*NBMX*/
|
||||
|
||||
48
Train.cpp
48
Train.cpp
@@ -325,6 +325,8 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = {
|
||||
{ user_command::doortoggleright, &TTrain::OnCommand_doortoggleright },
|
||||
{ user_command::doorpermitleft, &TTrain::OnCommand_doorpermitleft },
|
||||
{ user_command::doorpermitright, &TTrain::OnCommand_doorpermitright },
|
||||
{ user_command::doorpermitpresetactivatenext, &TTrain::OnCommand_doorpermitpresetactivatenext },
|
||||
{ user_command::doorpermitpresetactivateprevious, &TTrain::OnCommand_doorpermitpresetactivateprevious },
|
||||
{ user_command::dooropenleft, &TTrain::OnCommand_dooropenleft },
|
||||
{ user_command::dooropenright, &TTrain::OnCommand_dooropenright },
|
||||
{ user_command::doorcloseleft, &TTrain::OnCommand_doorcloseleft },
|
||||
@@ -4237,6 +4239,27 @@ void TTrain::OnCommand_doorpermitright( TTrain *Train, command_data const &Comma
|
||||
}
|
||||
}
|
||||
|
||||
void TTrain::OnCommand_doorpermitpresetactivatenext( TTrain *Train, command_data const &Command ) {
|
||||
|
||||
if( Command.action == GLFW_PRESS ) {
|
||||
|
||||
Train->mvOccupied->ChangeDoorPermitPreset( 1 );
|
||||
// visual feedback
|
||||
Train->ggDoorPermitPresetButton.UpdateValue( Train->mvOccupied->Doors.permit_preset, Train->dsbSwitch );
|
||||
}
|
||||
}
|
||||
|
||||
void TTrain::OnCommand_doorpermitpresetactivateprevious( TTrain *Train, command_data const &Command ) {
|
||||
|
||||
if( Command.action == GLFW_PRESS ) {
|
||||
|
||||
Train->mvOccupied->ChangeDoorPermitPreset( -1 );
|
||||
// visual feedback
|
||||
Train->ggDoorPermitPresetButton.UpdateValue( Train->mvOccupied->Doors.permit_preset, Train->dsbSwitch );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TTrain::OnCommand_dooropenleft( TTrain *Train, command_data const &Command ) {
|
||||
|
||||
auto const remoteopencontrol {
|
||||
@@ -5839,6 +5862,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
// NBMX wrzesien 2003 - drzwi
|
||||
ggDoorLeftPermitButton.Update();
|
||||
ggDoorRightPermitButton.Update();
|
||||
ggDoorPermitPresetButton.Update();
|
||||
ggDoorLeftButton.Update();
|
||||
ggDoorRightButton.Update();
|
||||
ggDoorLeftOnButton.Update();
|
||||
@@ -5869,11 +5893,12 @@ bool TTrain::Update( double const Deltatime )
|
||||
InstrumentLightType == 1 ? mvControlled->Mains :
|
||||
InstrumentLightType == 2 ? mvControlled->ConverterFlag :
|
||||
InstrumentLightType == 3 ? mvControlled->Battery || mvControlled->ConverterFlag :
|
||||
InstrumentLightType == 4 ? mvControlled->Battery || mvControlled->ConverterFlag :
|
||||
false ) };
|
||||
if( InstrumentLightType == 3 ) {
|
||||
// TODO: link the light state with the state of the master key
|
||||
InstrumentLightActive = true;
|
||||
}
|
||||
InstrumentLightActive = (
|
||||
InstrumentLightType == 3 ? true : // TODO: link the light state with the state of the master key
|
||||
InstrumentLightType == 4 ? ( mvOccupied->iLights[end::front] != 0 ) || ( mvOccupied->iLights[end::rear] != 0 ) :
|
||||
InstrumentLightActive );
|
||||
btInstrumentLight.Turn( InstrumentLightActive && lightpower );
|
||||
btDashboardLight.Turn( DashboardLightActive && lightpower );
|
||||
btTimetableLight.Turn( TimetableLightActive && lightpower );
|
||||
@@ -6245,7 +6270,10 @@ TTrain::update_sounds( double const Deltatime ) {
|
||||
|| TestFlag( mvOccupied->SecuritySystem.Status, s_SHPalarm ) ) {
|
||||
|
||||
if( false == dsbBuzzer.is_playing() ) {
|
||||
dsbBuzzer.play( sound_flags::looping );
|
||||
dsbBuzzer
|
||||
.pitch( dsbBuzzer.m_frequencyoffset + dsbBuzzer.m_frequencyfactor )
|
||||
.gain( dsbBuzzer.m_amplitudeoffset + dsbBuzzer.m_amplitudefactor )
|
||||
.play( sound_flags::looping );
|
||||
Console::BitsSet( 1 << 14 ); // ustawienie bitu 16 na PoKeys
|
||||
}
|
||||
}
|
||||
@@ -6270,9 +6298,10 @@ TTrain::update_sounds( double const Deltatime ) {
|
||||
auto const frequency { (
|
||||
true == dsbHasler.is_combined() ?
|
||||
fTachoVelocity * 0.01 :
|
||||
1.0 ) };
|
||||
dsbHasler.m_frequencyoffset + dsbHasler.m_frequencyfactor ) };
|
||||
dsbHasler
|
||||
.pitch( frequency )
|
||||
.gain( dsbHasler.m_amplitudeoffset + dsbHasler.m_amplitudefactor )
|
||||
.play( sound_flags::exclusive | sound_flags::looping );
|
||||
}
|
||||
else if( fTachoCount < 1.f ) {
|
||||
@@ -7116,6 +7145,7 @@ void TTrain::clear_cab_controls()
|
||||
ggRadioTest.Clear();
|
||||
ggDoorLeftPermitButton.Clear();
|
||||
ggDoorRightPermitButton.Clear();
|
||||
ggDoorPermitPresetButton.Clear();
|
||||
ggDoorLeftButton.Clear();
|
||||
ggDoorRightButton.Clear();
|
||||
ggDoorLeftOnButton.Clear();
|
||||
@@ -7429,6 +7459,7 @@ void TTrain::set_cab_controls( int const Cab ) {
|
||||
0.f ) );
|
||||
// doors
|
||||
// NOTE: for the time being permit switches are presumed to be impulse switches
|
||||
ggDoorPermitPresetButton.PutValue( mvOccupied->Doors.permit_preset );
|
||||
ggDoorLeftButton.PutValue( mvOccupied->Doors.instances[ ( mvOccupied->ActiveCab == 1 ? side::left : side::right ) ].is_closed ? 0.f : 1.f );
|
||||
ggDoorRightButton.PutValue( mvOccupied->Doors.instances[ ( mvOccupied->ActiveCab == 1 ? side::right : side::left ) ].is_closed ? 0.f : 1.f );
|
||||
// door lock
|
||||
@@ -7676,6 +7707,10 @@ bool TTrain::initialize_button(cParser &Parser, std::string const &Label, int co
|
||||
btInstrumentLight.Load( Parser, DynamicObject );
|
||||
InstrumentLightType = 3;
|
||||
}
|
||||
else if( Label == "i-instrumentlight_l:" ) {
|
||||
btInstrumentLight.Load( Parser, DynamicObject );
|
||||
InstrumentLightType = 4;
|
||||
}
|
||||
else if (Label == "i-doors:")
|
||||
{
|
||||
int i = Parser.getToken<int>() - 1;
|
||||
@@ -7725,6 +7760,7 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con
|
||||
{ "stlinoff_bt:", ggStLinOffButton },
|
||||
{ "doorleftpermit_sw:", ggDoorLeftPermitButton },
|
||||
{ "doorrightpermit_sw:", ggDoorRightPermitButton },
|
||||
{ "doorpermitpreset_sw:", ggDoorPermitPresetButton },
|
||||
{ "door_left_sw:", ggDoorLeftButton },
|
||||
{ "door_right_sw:", ggDoorRightButton },
|
||||
{ "doorlefton_sw:", ggDoorLeftOnButton },
|
||||
|
||||
5
Train.h
5
Train.h
@@ -315,6 +315,8 @@ class TTrain
|
||||
static void OnCommand_doortoggleright( TTrain *Train, command_data const &Command );
|
||||
static void OnCommand_doorpermitleft( TTrain *Train, command_data const &Command );
|
||||
static void OnCommand_doorpermitright( TTrain *Train, command_data const &Command );
|
||||
static void OnCommand_doorpermitpresetactivatenext( TTrain *Train, command_data const &Command );
|
||||
static void OnCommand_doorpermitpresetactivateprevious( TTrain *Train, command_data const &Command );
|
||||
static void OnCommand_dooropenleft( TTrain *Train, command_data const &Command );
|
||||
static void OnCommand_dooropenright( TTrain *Train, command_data const &Command );
|
||||
static void OnCommand_doorcloseleft( TTrain *Train, command_data const &Command );
|
||||
@@ -445,6 +447,7 @@ public: // reszta może by?publiczna
|
||||
// NBMX wrzesien 2003 - obsluga drzwi
|
||||
TGauge ggDoorLeftPermitButton;
|
||||
TGauge ggDoorRightPermitButton;
|
||||
TGauge ggDoorPermitPresetButton;
|
||||
TGauge ggDoorLeftButton;
|
||||
TGauge ggDoorRightButton;
|
||||
TGauge ggDoorLeftOnButton;
|
||||
@@ -517,7 +520,7 @@ public: // reszta może by?publiczna
|
||||
TButton btInstrumentLight;
|
||||
TButton btDashboardLight;
|
||||
TButton btTimetableLight;
|
||||
int InstrumentLightType{ 0 }; // ABu 030405 - swiecenie uzaleznione od: 0-nic, 1-obw.gl, 2-przetw., 3-rozrzad
|
||||
int InstrumentLightType{ 0 }; // ABu 030405 - swiecenie uzaleznione od: 0-nic, 1-obw.gl, 2-przetw., 3-rozrzad, 4-external lights
|
||||
bool InstrumentLightActive{ false };
|
||||
bool DashboardLightActive{ false };
|
||||
bool TimetableLightActive{ false };
|
||||
|
||||
@@ -144,6 +144,8 @@ commanddescription_sequence Commands_descriptions = {
|
||||
{ "doortoggleright", command_target::vehicle },
|
||||
{ "doorpermitleft", command_target::vehicle },
|
||||
{ "doorpermitright", command_target::vehicle },
|
||||
{ "doorpermitpresetactivatenext", command_target::vehicle },
|
||||
{ "doorpermitpresetactivateprevious", command_target::vehicle },
|
||||
{ "dooropenleft", command_target::vehicle },
|
||||
{ "dooropenright", command_target::vehicle },
|
||||
{ "dooropenall", command_target::vehicle },
|
||||
|
||||
@@ -137,6 +137,8 @@ enum class user_command {
|
||||
doortoggleright,
|
||||
doorpermitleft,
|
||||
doorpermitright,
|
||||
doorpermitpresetactivatenext,
|
||||
doorpermitpresetactivateprevious,
|
||||
dooropenleft,
|
||||
dooropenright,
|
||||
dooropenall,
|
||||
|
||||
@@ -144,8 +144,13 @@ driverkeyboard_input::default_bindings() {
|
||||
{ user_command::carcouplingdisconnect, GLFW_KEY_DELETE },
|
||||
{ user_command::doortoggleleft, GLFW_KEY_COMMA },
|
||||
{ user_command::doortoggleright, GLFW_KEY_PERIOD },
|
||||
{ user_command::doorpermitleft, GLFW_KEY_COMMA | keymodifier::shift },
|
||||
{ user_command::doorpermitright, GLFW_KEY_PERIOD | keymodifier::shift },
|
||||
{ user_command::doorpermitpresetactivatenext, GLFW_KEY_PERIOD | keymodifier::shift | keymodifier::control },
|
||||
{ user_command::doorpermitpresetactivateprevious, GLFW_KEY_COMMA | keymodifier::shift | keymodifier::control },
|
||||
// dooropenleft,
|
||||
// dooropenright,
|
||||
{ user_command::dooropenall, GLFW_KEY_SLASH | keymodifier::shift },
|
||||
// doorcloseleft,
|
||||
// doorcloseright,
|
||||
{ user_command::doorcloseall, GLFW_KEY_SLASH | keymodifier::control },
|
||||
@@ -202,8 +207,8 @@ driverkeyboard_input::default_bindings() {
|
||||
{ user_command::instrumentlighttoggle, GLFW_KEY_SEMICOLON },
|
||||
// instrumentlightenable,
|
||||
// instrumentlightdisable,
|
||||
// dashboardlighttoggle,
|
||||
// timetablelighttoggle,
|
||||
{ user_command::dashboardlighttoggle, GLFW_KEY_SEMICOLON | keymodifier::shift },
|
||||
{ user_command::timetablelighttoggle, GLFW_KEY_APOSTROPHE | keymodifier::shift },
|
||||
{ user_command::generictoggle0, GLFW_KEY_0 },
|
||||
{ user_command::generictoggle1, GLFW_KEY_1 },
|
||||
{ user_command::generictoggle2, GLFW_KEY_2 },
|
||||
|
||||
@@ -557,6 +557,9 @@ drivermouse_input::default_bindings() {
|
||||
{ "doorrightpermit_sw:", {
|
||||
user_command::doorpermitright,
|
||||
user_command::none } },
|
||||
{ "doorpermitpreset_sw:", {
|
||||
user_command::doorpermitpresetactivatenext,
|
||||
user_command::doorpermitpresetactivateprevious } },
|
||||
{ "door_left_sw:", {
|
||||
user_command::doortoggleleft,
|
||||
user_command::none } },
|
||||
|
||||
@@ -59,7 +59,7 @@ basic_station::update_load( TDynamicObject *First, Mtable::TTrainParameters &Sch
|
||||
firststop ? 0 :
|
||||
std::min<float>(
|
||||
parameters.LoadAmount,
|
||||
Random( parameters.MaxLoad * 0.10 * stationsizemodifier ) ) );
|
||||
Random( parameters.MaxLoad * 0.15f * stationsizemodifier ) ) );
|
||||
auto loadcount = static_cast<int>(
|
||||
laststop ?
|
||||
0 :
|
||||
|
||||
@@ -97,16 +97,17 @@ init() {
|
||||
"motor overload relay reset",
|
||||
"converter overload relay reset",
|
||||
"motor connectors",
|
||||
"left door (permit)",
|
||||
"right door (permit)",
|
||||
"door (permit)",
|
||||
"left door",
|
||||
"right door",
|
||||
"left door",
|
||||
"right door",
|
||||
"left door",
|
||||
"right door",
|
||||
"left door",
|
||||
"right door",
|
||||
"all doors",
|
||||
"all doors",
|
||||
"left door (open)",
|
||||
"right door (open)",
|
||||
"left door (close)",
|
||||
"right door (close)",
|
||||
"all doors (open)",
|
||||
"all doors (close)",
|
||||
"departure signal",
|
||||
"upper headlight",
|
||||
"left headlight",
|
||||
@@ -238,16 +239,17 @@ init() {
|
||||
"przekaznik nadmiarowy silnikow trakcyjnych",
|
||||
"przekaznik nadmiarowy przetwornicy",
|
||||
"styczniki liniowe",
|
||||
"drzwi lewe (zezwol)",
|
||||
"drzwi prawe (zezwol)",
|
||||
"drzwi (zezwol)",
|
||||
"drzwi lewe",
|
||||
"drzwi prawe",
|
||||
"drzwi lewe",
|
||||
"drzwi prawe",
|
||||
"drzwi lewe",
|
||||
"drzwi prawe",
|
||||
"drzwi lewe",
|
||||
"drzwi prawe",
|
||||
"drzwi",
|
||||
"drzwi",
|
||||
"drzwi lewe (otworz)",
|
||||
"drzwi prawe (otworz)",
|
||||
"drzwi lewe (zamknij)",
|
||||
"drzwi prawe (zamknij)",
|
||||
"drzwi (otworz)",
|
||||
"drzwi (zamknij)",
|
||||
"sygnal odjazdu",
|
||||
"reflektor gorny",
|
||||
"reflektor lewy",
|
||||
@@ -353,6 +355,7 @@ init() {
|
||||
"stlinoff_bt:",
|
||||
"doorleftpermit_sw:",
|
||||
"doorrightpermit_sw:",
|
||||
"doorpermitpreset_sw:",
|
||||
"door_left_sw:",
|
||||
"door_right_sw:",
|
||||
"doorlefton_sw:",
|
||||
|
||||
@@ -88,6 +88,7 @@ enum string {
|
||||
cab_stlinoff_bt,
|
||||
cab_doorleftpermit_sw,
|
||||
cab_doorrightpermit_sw,
|
||||
cab_doorpermitpreset_sw,
|
||||
cab_door_left_sw,
|
||||
cab_door_right_sw,
|
||||
cab_doorlefton_sw,
|
||||
|
||||
Reference in New Issue
Block a user