16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-24 03:09:18 +02:00

door operation permit preset cab control, door control system enhancements, minor bug fixes

This commit is contained in:
tmj-fstate
2019-02-15 16:07:02 +01:00
parent 852fdcfa0e
commit 6947107f3c
13 changed files with 203 additions and 82 deletions

View File

@@ -3172,7 +3172,7 @@ void TController::SpeedSet()
// Ra 2014-06: "automatyczna" skrzynia biegów... // Ra 2014-06: "automatyczna" skrzynia biegów...
if (!mvControlling->MotorParam[mvControlling->ScndCtrlPos].AutoSwitch) // gdy biegi ręczne if (!mvControlling->MotorParam[mvControlling->ScndCtrlPos].AutoSwitch) // gdy biegi ręczne
if ((mvControlling->ShuntMode ? mvControlling->AnPos : 1.0) * mvControlling->Vel > 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 > // if (mvControlling->enrot>0.95*mvControlling->dizel_nMmax) //youBy: jeśli obroty >
// 0,95 nmax, wrzuć wyższy bieg - Ra: to nie działa // 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 { // 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 lewe = ( pVehicle->DirectionGet() > 0 ) ? 1 : 2;
auto const prawe = 3 - lewe; auto const prawe = 3 - lewe;
if( ( pVehicle->MoverParameters->Doors.open_permit == false ) if( ( true == pVehicle->MoverParameters->Doors.permit_needed )
&& ( true == AIControllFlag ) ) { && ( true == AIControllFlag ) ) {
// grant door control permission if it's not automatic // grant door control permission if it's not automatic
// TBD: stricter requirements? // TBD: stricter requirements?
@@ -3247,7 +3247,8 @@ void TController::Doors( bool const Open, int const Side ) {
} }
else { else {
// zamykanie // 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 // the doors are already closed and we don't have to revoke control permit, we can skip all hard work
iDrivigFlags &= ~moveDoorOpened; iDrivigFlags &= ~moveDoorOpened;
} }

View File

@@ -2287,18 +2287,19 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
int int
TDynamicObject::init_sections( TModel3d const *Model, std::string const &Nameprefix ) { TDynamicObject::init_sections( TModel3d const *Model, std::string const &Nameprefix ) {
std::string sectionname;
auto sectioncount = 0; auto sectioncount = 0;
auto sectionindex = 0; auto sectionindex = 0;
TSubModel *sectionsubmodel { nullptr }; TSubModel *sectionsubmodel { nullptr };
do { do {
sectionname = // section names for index < 10 match either prefix0X or prefixX
Nameprefix + ( // section names above 10 match prefixX
sectionindex < 10 ? auto const sectionindexname { std::to_string( sectionindex ) };
"0" + std::to_string( sectionindex ) : sectionsubmodel = Model->GetFromName( Nameprefix + sectionindexname );
std::to_string( sectionindex ) ); if( ( sectionsubmodel == nullptr )
sectionsubmodel = Model->GetFromName( sectionname ); && ( sectionindex < 10 ) ) {
sectionsubmodel = Model->GetFromName( Nameprefix + "0" + sectionindexname );
}
if( sectionsubmodel != nullptr ) { if( sectionsubmodel != nullptr ) {
Sections.push_back( { Sections.push_back( {
sectionsubmodel, sectionsubmodel,
@@ -2771,10 +2772,7 @@ TDynamicObject::update_load_sections() {
for( auto &section : Sections ) { for( auto &section : Sections ) {
section.load = ( section.load = GetSubmodelFromName( mdLoad, section.compartment->pName );
mdLoad != nullptr ?
mdLoad->GetFromName( section.compartment->pName ) :
nullptr );
if( ( section.load != nullptr ) if( ( section.load != nullptr )
&& ( section.load->count_children() > 0 ) ) { && ( section.load->count_children() > 0 ) ) {

View File

@@ -638,6 +638,20 @@ class TMoverParameters
private: private:
// types // 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 // basic approximation of a generic device
// TBD: inheritance or composition? // TBD: inheritance or composition?
struct basic_device { struct basic_device {
@@ -722,9 +736,13 @@ private:
bool has_autowarning { false }; bool has_autowarning { false };
float auto_duration { -1.f }; // automatic door closure delay period float auto_duration { -1.f }; // automatic door closure delay period
float auto_velocity { -1.f }; // automatic door closure velocity threshold 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 // ld inputs
bool lock_enabled { true }; bool lock_enabled { true };
bool open_permit { true }; // internal data
int permit_preset { -1 }; // curent position of preset selection switch
// vehicle parts // vehicle parts
std::array<basic_door, 2> instances; // door on the right and left side of the vehicle std::array<basic_door, 2> instances; // door on the right and left side of the vehicle
// ld outputs // ld outputs
@@ -1472,7 +1490,8 @@ public:
/* funckje dla wagonow*/ /* funckje dla wagonow*/
bool AssignLoad( std::string const &Name, float const Amount = 0.f ); bool AssignLoad( std::string const &Name, float const Amount = 0.f );
bool LoadingDone(double LSpeed, std::string const &Loadname); 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 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 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 bool signal_departure( bool const State, range_t const Notify = range_t::consist ); // toggles departure warning

View File

@@ -4595,8 +4595,13 @@ double TMoverParameters::TractionForce( double dt ) {
case TEngineType::ElectricSeriesMotor: { case TEngineType::ElectricSeriesMotor: {
// update the state of voltage relays // update the state of voltage relays
auto const voltage { std::max( GetTrainsetVoltage(), std::abs( RunningTraction.TractionVoltage ) ) }; auto const voltage { std::max( GetTrainsetVoltage(), std::abs( RunningTraction.TractionVoltage ) ) };
NoVoltRelay = ( voltage >= EnginePowerSource.CollectorParameters.MinV ); NoVoltRelay =
OvervoltageRelay = ( voltage <= EnginePowerSource.CollectorParameters.MaxV ) || ( false == EnginePowerSource.CollectorParameters.OVP ); ( 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 // wywalanie szybkiego z powodu niewłaściwego napięcia
EventFlag |= ( ( true == Mains ) EventFlag |= ( ( true == Mains )
&& ( ( false == NoVoltRelay ) || ( false == OvervoltageRelay ) ) && ( ( false == NoVoltRelay ) || ( false == OvervoltageRelay ) )
@@ -5582,10 +5587,10 @@ bool TMoverParameters::AutoRelayCheck(void)
// sprawdzenie wszystkich warunkow (AutoRelayFlag, AutoSwitch, Im<Imin) // sprawdzenie wszystkich warunkow (AutoRelayFlag, AutoSwitch, Im<Imin)
auto const ARFASI2 { ( auto const ARFASI2 { (
( !AutoRelayFlag ) ( false == AutoRelayFlag )
|| ( ( MotorParam[ ScndCtrlActualPos ].AutoSwitch ) && ( abs( Im ) < Imin ) ) ) }; || ( ( MotorParam[ ScndCtrlActualPos ].AutoSwitch ) && ( abs( Im ) < Imin ) ) ) };
auto const ARFASI { ( auto const ARFASI { (
( !AutoRelayFlag ) ( false == AutoRelayFlag )
|| ( ( RList[ MainCtrlActualPos ].AutoSwitch ) && ( abs( Im ) < Imin ) ) || ( ( RList[ MainCtrlActualPos ].AutoSwitch ) && ( abs( Im ) < Imin ) )
|| ( ( !RList[ MainCtrlActualPos ].AutoSwitch ) && ( RList[ MainCtrlActualPos ].Relay < MainCtrlPos ) ) ) }; || ( ( !RList[ MainCtrlActualPos ].AutoSwitch ) && ( RList[ MainCtrlActualPos ].Relay < MainCtrlPos ) ) ) };
// brak PSR na tej pozycji działa PSR i prąd poniżej progu // 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 ); 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 }; bool const initialstate { Doors.instances[Door].open_permit };
if( ( true == Battery ) if( ( false == Doors.permit_presets.empty() ) // HACK: for cases where preset switch is used before battery
&& ( false == Doors.is_locked ) ) { || ( ( true == Battery )
&& ( false == Doors.is_locked ) ) ) {
Doors.instances[ Door ].open_permit = true; Doors.instances[ Door ].open_permit = State;
} }
if( Notify != range_t::local ) { if( Notify != range_t::local ) {
SendCtrlToNext( SendCtrlToNext(
"DoorPermit", "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 : 1 :
2 ), 2 ),
CabNo, CabNo,
@@ -6872,8 +6897,12 @@ TMoverParameters::update_doors( double const Deltatime ) {
&& ( Vel >= 10.0 ); && ( Vel >= 10.0 );
for( auto &door : Doors.instances ) { for( auto &door : Doors.instances ) {
// revoke permit if...
door.open_permit = door.open_permit && ( false == door.remote_close ) && ( false == Doors.is_locked ); 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.is_open =
( door.position >= Doors.range ) ( door.position >= Doors.range )
@@ -6882,35 +6911,41 @@ TMoverParameters::update_doors( double const Deltatime ) {
( door.position <= 0.f ) ( door.position <= 0.f )
&& ( door.step_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.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 ) && ( Doors.open_permit || 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.local_close = door.local_close && ( false == door.is_closed );
door.remote_close = door.remote_close && ( false == door.is_closed ); door.remote_close = door.remote_close && ( false == door.is_closed );
auto const openrequest { auto const openrequest {
( localopencontrol && door.local_open ) ( localopencontrol && door.local_open )
|| ( remoteopencontrol && door.remote_open ) }; || ( remoteopencontrol && door.remote_open ) };
auto const autocloserequest { auto const autocloserequest {
( ( Doors.auto_velocity != -1.f ) && ( Vel > Doors.auto_velocity ) ) ( ( 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 { auto const closerequest {
( remoteclosecontrol && door.remote_close ) ( door.remote_close && remoteclosecontrol )
|| ( localclosecontrol && door.local_close ) || ( door.local_close && localclosecontrol )
|| ( autocloserequest && door.local_close ) }; || ( autocloserequest && door.is_open ) };
door.is_opening = door.is_opening =
( false == door.is_open ) ( false == door.is_open )
&& ( true == Battery )
&& ( false == closerequest ) && ( false == closerequest )
&& ( door.is_opening || openrequest ); && ( ( true == door.is_opening )
|| ( ( true == openrequest )
&& ( false == Doors.is_locked ) ) );
door.is_closing = door.is_closing =
( false == door.is_closed ) ( false == door.is_closed )
&& ( true == Battery )
&& ( false == openrequest ) && ( false == openrequest )
&& ( door.is_closing || closerequest ); && ( door.is_closing || closerequest );
if( true == door.is_opening ) { if( true == door.is_opening ) {
door.auto_timer = ( door.auto_timer = (
( remoteopencontrol && door.remote_open ) ? ( localopencontrol && door.local_open ) ? Doors.auto_duration :
-1.f : ( remoteopencontrol && door.remote_open && Doors.auto_include_remote ) ? Doors.auto_duration :
Doors.auto_duration ); -1.f );
} }
// doors // 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 // 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 }; std::array<side, 2> const doorids { side::right, side::left };
for( auto const doorid : doorids ) { 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 // automatic closing conditions
extract_value( Doors.auto_duration, "DoorStayOpen", line, "" ); extract_value( Doors.auto_duration, "DoorStayOpen", line, "" );
extract_value( Doors.auto_velocity, "DoorAutoCloseVel", 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 }; auto permitpresets = Split( extract_value( "DoorPermitList", line ), '|' );
extract_value( doorneedpermit, "DoorNeedPermit", line, "" ); for( auto const &permit : permitpresets ) {
Doors.open_permit = ( false == doorneedpermit ); 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, "" ); 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{ std::map<std::string, TPowerSource> powersources{
{ "Transducer", TPowerSource::Transducer }, { "Transducer", TPowerSource::Transducer },
{ "Generator", TPowerSource::Generator }, { "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 }, { "CurrentCollector", TPowerSource::CurrentCollector },
{ "PowerCable", TPowerSource::PowerCable }, { "PowerCable", TPowerSource::PowerCable },
{ "Heater", TPowerSource::Heater }, { "Heater", TPowerSource::Heater },
@@ -9250,10 +9299,12 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir)
BrakeDelayFlag = bdelay_G; BrakeDelayFlag = bdelay_G;
if ((TestFlag(BrakeDelays, bdelay_R)) && !(TestFlag(BrakeDelays, bdelay_G))) if ((TestFlag(BrakeDelays, bdelay_R)) && !(TestFlag(BrakeDelays, bdelay_G)))
BrakeDelayFlag = bdelay_R; BrakeDelayFlag = bdelay_R;
/*
// disabled, as test mode is used in specific situations and not really a default
if (BrakeOpModes & bom_PS) if (BrakeOpModes & bom_PS)
BrakeOpModeFlag = bom_PS; BrakeOpModeFlag = bom_PS;
else else
*/
BrakeOpModeFlag = bom_PN; BrakeOpModeFlag = bom_PN;
// yB: jesli pojazdy nie maja zadeklarowanych czasow, to wsadz z przepisow +-16,(6)% // 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") { else if (Command == "DoorPermit") {
if( ( true == Battery )
&& ( false == Doors.is_locked ) ) {
auto const left { CValue2 > 0 ? 1 : 2 }; auto const left { CValue2 > 0 ? 1 : 2 };
auto const right { 3 - left }; auto const right { 3 - left };
if( static_cast<int>( CValue1 ) & right ) { if( std::abs( static_cast<int>( CValue1 ) ) & right ) {
Doors.instances[ side::right ].open_permit = true; Doors.instances[ side::right ].open_permit = (CValue1 > 0);
}
if( static_cast<int>( CValue1 ) & left ) {
Doors.instances[ side::left ].open_permit = true;
} }
if( std::abs( static_cast<int>( CValue1 ) ) & left ) {
Doors.instances[ side::left ].open_permit = (CValue1 > 0);
} }
OK = SendCtrlToNext( Command, CValue1, CValue2, Couplertype ); OK = SendCtrlToNext( Command, CValue1, CValue2, Couplertype );
} }
else if (Command == "DoorOpen") /*NBMX*/ else if (Command == "DoorOpen") /*NBMX*/

View File

@@ -325,6 +325,8 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = {
{ user_command::doortoggleright, &TTrain::OnCommand_doortoggleright }, { user_command::doortoggleright, &TTrain::OnCommand_doortoggleright },
{ user_command::doorpermitleft, &TTrain::OnCommand_doorpermitleft }, { user_command::doorpermitleft, &TTrain::OnCommand_doorpermitleft },
{ user_command::doorpermitright, &TTrain::OnCommand_doorpermitright }, { 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::dooropenleft, &TTrain::OnCommand_dooropenleft },
{ user_command::dooropenright, &TTrain::OnCommand_dooropenright }, { user_command::dooropenright, &TTrain::OnCommand_dooropenright },
{ user_command::doorcloseleft, &TTrain::OnCommand_doorcloseleft }, { 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 ) { void TTrain::OnCommand_dooropenleft( TTrain *Train, command_data const &Command ) {
auto const remoteopencontrol { auto const remoteopencontrol {
@@ -5839,6 +5862,7 @@ bool TTrain::Update( double const Deltatime )
// NBMX wrzesien 2003 - drzwi // NBMX wrzesien 2003 - drzwi
ggDoorLeftPermitButton.Update(); ggDoorLeftPermitButton.Update();
ggDoorRightPermitButton.Update(); ggDoorRightPermitButton.Update();
ggDoorPermitPresetButton.Update();
ggDoorLeftButton.Update(); ggDoorLeftButton.Update();
ggDoorRightButton.Update(); ggDoorRightButton.Update();
ggDoorLeftOnButton.Update(); ggDoorLeftOnButton.Update();
@@ -5869,11 +5893,12 @@ bool TTrain::Update( double const Deltatime )
InstrumentLightType == 1 ? mvControlled->Mains : InstrumentLightType == 1 ? mvControlled->Mains :
InstrumentLightType == 2 ? mvControlled->ConverterFlag : InstrumentLightType == 2 ? mvControlled->ConverterFlag :
InstrumentLightType == 3 ? mvControlled->Battery || mvControlled->ConverterFlag : InstrumentLightType == 3 ? mvControlled->Battery || mvControlled->ConverterFlag :
InstrumentLightType == 4 ? mvControlled->Battery || mvControlled->ConverterFlag :
false ) }; false ) };
if( InstrumentLightType == 3 ) { InstrumentLightActive = (
// TODO: link the light state with the state of the master key InstrumentLightType == 3 ? true : // TODO: link the light state with the state of the master key
InstrumentLightActive = true; InstrumentLightType == 4 ? ( mvOccupied->iLights[end::front] != 0 ) || ( mvOccupied->iLights[end::rear] != 0 ) :
} InstrumentLightActive );
btInstrumentLight.Turn( InstrumentLightActive && lightpower ); btInstrumentLight.Turn( InstrumentLightActive && lightpower );
btDashboardLight.Turn( DashboardLightActive && lightpower ); btDashboardLight.Turn( DashboardLightActive && lightpower );
btTimetableLight.Turn( TimetableLightActive && lightpower ); btTimetableLight.Turn( TimetableLightActive && lightpower );
@@ -6245,7 +6270,10 @@ TTrain::update_sounds( double const Deltatime ) {
|| TestFlag( mvOccupied->SecuritySystem.Status, s_SHPalarm ) ) { || TestFlag( mvOccupied->SecuritySystem.Status, s_SHPalarm ) ) {
if( false == dsbBuzzer.is_playing() ) { 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 Console::BitsSet( 1 << 14 ); // ustawienie bitu 16 na PoKeys
} }
} }
@@ -6270,9 +6298,10 @@ TTrain::update_sounds( double const Deltatime ) {
auto const frequency { ( auto const frequency { (
true == dsbHasler.is_combined() ? true == dsbHasler.is_combined() ?
fTachoVelocity * 0.01 : fTachoVelocity * 0.01 :
1.0 ) }; dsbHasler.m_frequencyoffset + dsbHasler.m_frequencyfactor ) };
dsbHasler dsbHasler
.pitch( frequency ) .pitch( frequency )
.gain( dsbHasler.m_amplitudeoffset + dsbHasler.m_amplitudefactor )
.play( sound_flags::exclusive | sound_flags::looping ); .play( sound_flags::exclusive | sound_flags::looping );
} }
else if( fTachoCount < 1.f ) { else if( fTachoCount < 1.f ) {
@@ -7116,6 +7145,7 @@ void TTrain::clear_cab_controls()
ggRadioTest.Clear(); ggRadioTest.Clear();
ggDoorLeftPermitButton.Clear(); ggDoorLeftPermitButton.Clear();
ggDoorRightPermitButton.Clear(); ggDoorRightPermitButton.Clear();
ggDoorPermitPresetButton.Clear();
ggDoorLeftButton.Clear(); ggDoorLeftButton.Clear();
ggDoorRightButton.Clear(); ggDoorRightButton.Clear();
ggDoorLeftOnButton.Clear(); ggDoorLeftOnButton.Clear();
@@ -7429,6 +7459,7 @@ void TTrain::set_cab_controls( int const Cab ) {
0.f ) ); 0.f ) );
// doors // doors
// NOTE: for the time being permit switches are presumed to be impulse switches // 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 ); 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 ); ggDoorRightButton.PutValue( mvOccupied->Doors.instances[ ( mvOccupied->ActiveCab == 1 ? side::right : side::left ) ].is_closed ? 0.f : 1.f );
// door lock // door lock
@@ -7676,6 +7707,10 @@ bool TTrain::initialize_button(cParser &Parser, std::string const &Label, int co
btInstrumentLight.Load( Parser, DynamicObject ); btInstrumentLight.Load( Parser, DynamicObject );
InstrumentLightType = 3; InstrumentLightType = 3;
} }
else if( Label == "i-instrumentlight_l:" ) {
btInstrumentLight.Load( Parser, DynamicObject );
InstrumentLightType = 4;
}
else if (Label == "i-doors:") else if (Label == "i-doors:")
{ {
int i = Parser.getToken<int>() - 1; 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 }, { "stlinoff_bt:", ggStLinOffButton },
{ "doorleftpermit_sw:", ggDoorLeftPermitButton }, { "doorleftpermit_sw:", ggDoorLeftPermitButton },
{ "doorrightpermit_sw:", ggDoorRightPermitButton }, { "doorrightpermit_sw:", ggDoorRightPermitButton },
{ "doorpermitpreset_sw:", ggDoorPermitPresetButton },
{ "door_left_sw:", ggDoorLeftButton }, { "door_left_sw:", ggDoorLeftButton },
{ "door_right_sw:", ggDoorRightButton }, { "door_right_sw:", ggDoorRightButton },
{ "doorlefton_sw:", ggDoorLeftOnButton }, { "doorlefton_sw:", ggDoorLeftOnButton },

View File

@@ -315,6 +315,8 @@ class TTrain
static void OnCommand_doortoggleright( TTrain *Train, command_data const &Command ); static void OnCommand_doortoggleright( TTrain *Train, command_data const &Command );
static void OnCommand_doorpermitleft( 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_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_dooropenleft( TTrain *Train, command_data const &Command );
static void OnCommand_dooropenright( 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 ); 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 // NBMX wrzesien 2003 - obsluga drzwi
TGauge ggDoorLeftPermitButton; TGauge ggDoorLeftPermitButton;
TGauge ggDoorRightPermitButton; TGauge ggDoorRightPermitButton;
TGauge ggDoorPermitPresetButton;
TGauge ggDoorLeftButton; TGauge ggDoorLeftButton;
TGauge ggDoorRightButton; TGauge ggDoorRightButton;
TGauge ggDoorLeftOnButton; TGauge ggDoorLeftOnButton;
@@ -517,7 +520,7 @@ public: // reszta może by?publiczna
TButton btInstrumentLight; TButton btInstrumentLight;
TButton btDashboardLight; TButton btDashboardLight;
TButton btTimetableLight; 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 InstrumentLightActive{ false };
bool DashboardLightActive{ false }; bool DashboardLightActive{ false };
bool TimetableLightActive{ false }; bool TimetableLightActive{ false };

View File

@@ -144,6 +144,8 @@ commanddescription_sequence Commands_descriptions = {
{ "doortoggleright", command_target::vehicle }, { "doortoggleright", command_target::vehicle },
{ "doorpermitleft", command_target::vehicle }, { "doorpermitleft", command_target::vehicle },
{ "doorpermitright", command_target::vehicle }, { "doorpermitright", command_target::vehicle },
{ "doorpermitpresetactivatenext", command_target::vehicle },
{ "doorpermitpresetactivateprevious", command_target::vehicle },
{ "dooropenleft", command_target::vehicle }, { "dooropenleft", command_target::vehicle },
{ "dooropenright", command_target::vehicle }, { "dooropenright", command_target::vehicle },
{ "dooropenall", command_target::vehicle }, { "dooropenall", command_target::vehicle },

View File

@@ -137,6 +137,8 @@ enum class user_command {
doortoggleright, doortoggleright,
doorpermitleft, doorpermitleft,
doorpermitright, doorpermitright,
doorpermitpresetactivatenext,
doorpermitpresetactivateprevious,
dooropenleft, dooropenleft,
dooropenright, dooropenright,
dooropenall, dooropenall,

View File

@@ -144,8 +144,13 @@ driverkeyboard_input::default_bindings() {
{ user_command::carcouplingdisconnect, GLFW_KEY_DELETE }, { user_command::carcouplingdisconnect, GLFW_KEY_DELETE },
{ user_command::doortoggleleft, GLFW_KEY_COMMA }, { user_command::doortoggleleft, GLFW_KEY_COMMA },
{ user_command::doortoggleright, GLFW_KEY_PERIOD }, { 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, // dooropenleft,
// dooropenright, // dooropenright,
{ user_command::dooropenall, GLFW_KEY_SLASH | keymodifier::shift },
// doorcloseleft, // doorcloseleft,
// doorcloseright, // doorcloseright,
{ user_command::doorcloseall, GLFW_KEY_SLASH | keymodifier::control }, { user_command::doorcloseall, GLFW_KEY_SLASH | keymodifier::control },
@@ -202,8 +207,8 @@ driverkeyboard_input::default_bindings() {
{ user_command::instrumentlighttoggle, GLFW_KEY_SEMICOLON }, { user_command::instrumentlighttoggle, GLFW_KEY_SEMICOLON },
// instrumentlightenable, // instrumentlightenable,
// instrumentlightdisable, // instrumentlightdisable,
// dashboardlighttoggle, { user_command::dashboardlighttoggle, GLFW_KEY_SEMICOLON | keymodifier::shift },
// timetablelighttoggle, { user_command::timetablelighttoggle, GLFW_KEY_APOSTROPHE | keymodifier::shift },
{ user_command::generictoggle0, GLFW_KEY_0 }, { user_command::generictoggle0, GLFW_KEY_0 },
{ user_command::generictoggle1, GLFW_KEY_1 }, { user_command::generictoggle1, GLFW_KEY_1 },
{ user_command::generictoggle2, GLFW_KEY_2 }, { user_command::generictoggle2, GLFW_KEY_2 },

View File

@@ -557,6 +557,9 @@ drivermouse_input::default_bindings() {
{ "doorrightpermit_sw:", { { "doorrightpermit_sw:", {
user_command::doorpermitright, user_command::doorpermitright,
user_command::none } }, user_command::none } },
{ "doorpermitpreset_sw:", {
user_command::doorpermitpresetactivatenext,
user_command::doorpermitpresetactivateprevious } },
{ "door_left_sw:", { { "door_left_sw:", {
user_command::doortoggleleft, user_command::doortoggleleft,
user_command::none } }, user_command::none } },

View File

@@ -59,7 +59,7 @@ basic_station::update_load( TDynamicObject *First, Mtable::TTrainParameters &Sch
firststop ? 0 : firststop ? 0 :
std::min<float>( std::min<float>(
parameters.LoadAmount, parameters.LoadAmount,
Random( parameters.MaxLoad * 0.10 * stationsizemodifier ) ) ); Random( parameters.MaxLoad * 0.15f * stationsizemodifier ) ) );
auto loadcount = static_cast<int>( auto loadcount = static_cast<int>(
laststop ? laststop ?
0 : 0 :

View File

@@ -97,16 +97,17 @@ init() {
"motor overload relay reset", "motor overload relay reset",
"converter overload relay reset", "converter overload relay reset",
"motor connectors", "motor connectors",
"left door (permit)",
"right door (permit)",
"door (permit)",
"left door", "left door",
"right door", "right door",
"left door", "left door (open)",
"right door", "right door (open)",
"left door", "left door (close)",
"right door", "right door (close)",
"left door", "all doors (open)",
"right door", "all doors (close)",
"all doors",
"all doors",
"departure signal", "departure signal",
"upper headlight", "upper headlight",
"left headlight", "left headlight",
@@ -238,16 +239,17 @@ init() {
"przekaznik nadmiarowy silnikow trakcyjnych", "przekaznik nadmiarowy silnikow trakcyjnych",
"przekaznik nadmiarowy przetwornicy", "przekaznik nadmiarowy przetwornicy",
"styczniki liniowe", "styczniki liniowe",
"drzwi lewe (zezwol)",
"drzwi prawe (zezwol)",
"drzwi (zezwol)",
"drzwi lewe", "drzwi lewe",
"drzwi prawe", "drzwi prawe",
"drzwi lewe", "drzwi lewe (otworz)",
"drzwi prawe", "drzwi prawe (otworz)",
"drzwi lewe", "drzwi lewe (zamknij)",
"drzwi prawe", "drzwi prawe (zamknij)",
"drzwi lewe", "drzwi (otworz)",
"drzwi prawe", "drzwi (zamknij)",
"drzwi",
"drzwi",
"sygnal odjazdu", "sygnal odjazdu",
"reflektor gorny", "reflektor gorny",
"reflektor lewy", "reflektor lewy",
@@ -353,6 +355,7 @@ init() {
"stlinoff_bt:", "stlinoff_bt:",
"doorleftpermit_sw:", "doorleftpermit_sw:",
"doorrightpermit_sw:", "doorrightpermit_sw:",
"doorpermitpreset_sw:",
"door_left_sw:", "door_left_sw:",
"door_right_sw:", "door_right_sw:",
"doorlefton_sw:", "doorlefton_sw:",

View File

@@ -88,6 +88,7 @@ enum string {
cab_stlinoff_bt, cab_stlinoff_bt,
cab_doorleftpermit_sw, cab_doorleftpermit_sw,
cab_doorrightpermit_sw, cab_doorrightpermit_sw,
cab_doorpermitpreset_sw,
cab_door_left_sw, cab_door_left_sw,
cab_door_right_sw, cab_door_right_sw,
cab_doorlefton_sw, cab_doorlefton_sw,