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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
20
DynObj.cpp
20
DynObj.cpp
@@ -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 §ion : Sections ) {
|
for( auto §ion : 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 ) ) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 )
|
auto const left { CValue2 > 0 ? 1 : 2 };
|
||||||
&& ( false == Doors.is_locked ) ) {
|
auto const right { 3 - left };
|
||||||
|
|
||||||
auto const left { CValue2 > 0 ? 1 : 2 };
|
if( std::abs( static_cast<int>( CValue1 ) ) & right ) {
|
||||||
auto const right { 3 - left };
|
Doors.instances[ side::right ].open_permit = (CValue1 > 0);
|
||||||
|
|
||||||
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 ) ) & 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*/
|
||||||
|
|||||||
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::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 },
|
||||||
|
|||||||
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_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 };
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
@@ -137,6 +137,8 @@ enum class user_command {
|
|||||||
doortoggleright,
|
doortoggleright,
|
||||||
doorpermitleft,
|
doorpermitleft,
|
||||||
doorpermitright,
|
doorpermitright,
|
||||||
|
doorpermitpresetactivatenext,
|
||||||
|
doorpermitpresetactivateprevious,
|
||||||
dooropenleft,
|
dooropenleft,
|
||||||
dooropenright,
|
dooropenright,
|
||||||
dooropenall,
|
dooropenall,
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
@@ -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 } },
|
||||||
|
|||||||
@@ -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 :
|
||||||
|
|||||||
@@ -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:",
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user