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

audio device list, customizable relay reset cab controls, pantograph control ai hint, minor vehicle initialization tweaks, minor ai logic tweaks

This commit is contained in:
tmj-fstate
2020-04-02 01:08:35 +02:00
parent c22f4c900f
commit c417f388b1
13 changed files with 292 additions and 76 deletions

View File

@@ -638,6 +638,8 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
if (pTrack->eType == tt_Cross) { if (pTrack->eType == tt_Cross) {
// na skrzyżowaniach trzeba wybrać segment, po którym pojedzie pojazd // na skrzyżowaniach trzeba wybrać segment, po którym pojedzie pojazd
// dopiero tutaj jest ustalany kierunek segmentu na skrzyżowaniu // dopiero tutaj jest ustalany kierunek segmentu na skrzyżowaniu
/*
// NOTE: manual selection disabled due to multiplayer
int routewanted; int routewanted;
if( false == AIControllFlag ) { if( false == AIControllFlag ) {
routewanted = ( routewanted = (
@@ -648,7 +650,8 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
else { else {
routewanted = 1 + std::floor( Random( static_cast<double>( pTrack->RouteCount() ) - 0.001 ) ); routewanted = 1 + std::floor( Random( static_cast<double>( pTrack->RouteCount() ) - 0.001 ) );
} }
*/
auto const routewanted { 1 + std::floor( Random( static_cast<double>( pTrack->RouteCount() ) - 0.001 ) ) };
sSpeedTable[iLast].iFlags |= sSpeedTable[iLast].iFlags |=
( ( pTrack->CrossSegment( ( ( pTrack->CrossSegment(
(fLastDir < 0 ? (fLastDir < 0 ?
@@ -1829,17 +1832,20 @@ void TController::Activation()
TDynamicObject *old = pVehicle, *d = pVehicle; // w tym siedzi AI TDynamicObject *old = pVehicle, *d = pVehicle; // w tym siedzi AI
TController *drugi; // jakby były dwa, to zamienić miejscami, a nie robić wycieku pamięci poprzez nadpisanie TController *drugi; // jakby były dwa, to zamienić miejscami, a nie robić wycieku pamięci poprzez nadpisanie
auto const localbrakelevel { mvOccupied->LocalBrakePosA }; auto const localbrakelevel { mvOccupied->LocalBrakePosA };
// switch off tempomat
SpeedCntrl( 0.0 );
mvControlling->DecScndCtrl( 2 );
// reset controls
ZeroSpeed(); ZeroSpeed();
ZeroDirection(); ZeroDirection();
mvOccupied->SpringBrakeActivate(true); mvOccupied->SpringBrakeActivate( true );
if (TestFlag(d->MoverParameters->Couplers[iDirectionOrder < 0 ? end::rear : end::front].CouplingFlag, ctrain_controll)) { if (TestFlag(d->MoverParameters->Couplers[iDirectionOrder < 0 ? end::rear : end::front].CouplingFlag, ctrain_controll)) {
mvControlling->MainSwitch( false); // dezaktywacja czuwaka, jeśli przejście do innego członu mvControlling->MainSwitch( false ); // dezaktywacja czuwaka, jeśli przejście do innego członu
mvOccupied->DecLocalBrakeLevel(LocalBrakePosNo); // zwolnienie hamulca w opuszczanym pojeździe mvOccupied->DecLocalBrakeLevel(LocalBrakePosNo); // zwolnienie hamulca w opuszczanym pojeździe
// mvOccupied->BrakeLevelSet((mvOccupied->BrakeHandle==FVel6)?4:-2); //odcięcie na // mvOccupied->BrakeLevelSet((mvOccupied->BrakeHandle==FVel6)?4:-2); //odcięcie na
// zaworze maszynisty, FVel6 po drugiej stronie nie luzuje // zaworze maszynisty, FVel6 po drugiej stronie nie luzuje
mvOccupied->BrakeLevelSet( mvOccupied->BrakeLevelSet( mvOccupied->Handle->GetPos(bh_NP) ); // odcięcie na zaworze maszynisty
mvOccupied->Handle->GetPos(bh_NP)); // odcięcie na zaworze maszynisty BrakeLevelSet( gbh_NP ); //ustawienie zmiennej GBH
BrakeLevelSet(gbh_NP); //ustawienie zmiennej GBH
} }
mvOccupied->CabOccupied = mvOccupied->CabActive; // użytkownik moze zmienić CabOccupied wychodząc mvOccupied->CabOccupied = mvOccupied->CabActive; // użytkownik moze zmienić CabOccupied wychodząc
mvOccupied->CabDeactivisation(); // tak jest w Train.cpp mvOccupied->CabDeactivisation(); // tak jest w Train.cpp
@@ -2623,6 +2629,10 @@ bool TController::PrepareEngine()
} }
else if (false == IsLineBreakerClosed) { else if (false == IsLineBreakerClosed) {
ZeroSpeed(); ZeroSpeed();
if( mvOccupied->DirActive == 0 ) {
OrderDirectionChange( iDirection, mvOccupied );
}
mvControlling->FuseOn(); // consist-wide ground relay reset
if( mvOccupied->TrainType == dt_SN61 ) { if( mvOccupied->TrainType == dt_SN61 ) {
// specjalnie dla SN61 żeby nie zgasł // specjalnie dla SN61 żeby nie zgasł
while( ( mvControlling->RList[ mvControlling->MainCtrlPos ].Mn == 0 ) while( ( mvControlling->RList[ mvControlling->MainCtrlPos ].Mn == 0 )
@@ -2636,7 +2646,6 @@ bool TController::PrepareEngine()
} }
} }
else { else {
OK = ( OrderDirectionChange( iDirection, mvOccupied ) == -1 );
mvControlling->ConverterSwitch( true ); mvControlling->ConverterSwitch( true );
// w EN57 sprężarka w ra jest zasilana z silnikowego // w EN57 sprężarka w ra jest zasilana z silnikowego
mvControlling->CompressorSwitch( true ); mvControlling->CompressorSwitch( true );
@@ -2658,6 +2667,7 @@ bool TController::PrepareEngine()
if( lookup != brakepositions.end() ) { if( lookup != brakepositions.end() ) {
BrakeLevelSet( lookup->second ); // GBH BrakeLevelSet( lookup->second ); // GBH
} }
OK = ( VelforDriver == -1 );
} }
} }
else else
@@ -2717,14 +2727,14 @@ bool TController::ReleaseEngine() {
mvOccupied->BrakeReleaser( 0 ); mvOccupied->BrakeReleaser( 0 );
if( std::abs( fAccGravity ) < 0.01 ) { if( std::abs( fAccGravity ) < 0.01 ) {
// release train brake if on flats... // release train brake if on flats...
if( mvOccupied->LocalBrake != TLocalBrake::ManualBrake ) {
// ...as long as it's a vehicle with independent brake, anyway
// TODO: check if we shouldn't leave it engaged instead // TODO: check if we shouldn't leave it engaged instead
while( true == mvOccupied->DecBrakeLevel() ) { while( true == DecBrake() ) {
// tu moze zmieniać na -2, ale to bez znaczenia
; ;
} }
// ...and engage independent brake // ...and engage independent brake
while( true == mvOccupied->IncLocalBrakeLevel( 1 ) ) { mvOccupied->IncLocalBrakeLevel( LocalBrakePosNo );
;
} }
} }
else { else {
@@ -4854,7 +4864,8 @@ TController::UpdateSituation(double dt) {
} }
} }
else { else {
if( ( IdleTime > 45.0 ) if( ( mvOccupied->AIHintPantUpIfIdle )
&& ( IdleTime > 45.0 )
// NOTE: abs(stoptime) covers either at least 15 sec remaining for a scheduled stop, or 15+ secs spent at a basic stop // NOTE: abs(stoptime) covers either at least 15 sec remaining for a scheduled stop, or 15+ secs spent at a basic stop
&& ( std::abs( fStopTime ) > 15.0 ) ) { && ( std::abs( fStopTime ) > 15.0 ) ) {
// spending a longer at a stop, raise also front pantograph // spending a longer at a stop, raise also front pantograph
@@ -6160,12 +6171,11 @@ TController::UpdateSituation(double dt) {
if ((mvControlling->EngineType == TEngineType::ElectricSeriesMotor) || if ((mvControlling->EngineType == TEngineType::ElectricSeriesMotor) ||
(mvControlling->TrainType & dt_EZT) || (mvControlling->TrainType & dt_EZT) ||
(mvControlling->EngineType == TEngineType::DieselElectric)) (mvControlling->EngineType == TEngineType::DieselElectric))
if (mvControlling->FuseFlag || Need_TryAgain) if (mvControlling->FuseFlag || Need_TryAgain || (false == mvControlling->GroundRelay))
{ {
Need_TryAgain = false; // true, jeśli druga pozycja w elektryku nie załapała Need_TryAgain = false; // true, jeśli druga pozycja w elektryku nie załapała
mvControlling->DecScndCtrl(2); // nastawnik bocznikowania na 0 mvControlling->DecScndCtrl(2); // nastawnik bocznikowania na 0
mvControlling->DecMainCtrl(2); // nastawnik jazdy na 0 mvControlling->DecMainCtrl(2); // nastawnik jazdy na 0
mvControlling->MainSwitch(true); // Ra: dodałem, bo EN57 stawały po wywaleniu
if (mvControlling->FuseOn()) { if (mvControlling->FuseOn()) {
++iDriverFailCount; ++iDriverFailCount;
if (iDriverFailCount > maxdriverfails) if (iDriverFailCount > maxdriverfails)
@@ -6173,6 +6183,7 @@ TController::UpdateSituation(double dt) {
if (iDriverFailCount > maxdriverfails * 2) if (iDriverFailCount > maxdriverfails * 2)
SetDriverPsyche(); SetDriverPsyche();
} }
mvControlling->MainSwitch(true); // Ra: dodałem, bo EN57 stawały po wywaleniu
} }
// NOTE: as a stop-gap measure the routine is limited to trains only while car calculations seem off // NOTE: as a stop-gap measure the routine is limited to trains only while car calculations seem off
if( mvControlling->CategoryFlag == 1 ) { if( mvControlling->CategoryFlag == 1 ) {
@@ -6464,13 +6475,18 @@ TController::UpdateSituation(double dt) {
if( ( mvOccupied->Vel < 0.01 ) if( ( mvOccupied->Vel < 0.01 )
&& ( ( VelDesired == 0.0 ) && ( ( VelDesired == 0.0 )
|| ( AccDesired == 0.0 ) ) ) { || ( AccDesired == 0.0 ) ) ) {
if( mvOccupied->LocalBrake != TLocalBrake::ManualBrake ) {
// do it only if the vehicle actually has the independent brake
if( mvOccupied->BrakeCtrlPos == mvOccupied->Handle->GetPos( bh_RP ) ) { if( mvOccupied->BrakeCtrlPos == mvOccupied->Handle->GetPos( bh_RP ) ) {
if( mvOccupied->LocalBrakePosA == 0.0 ) {
// dodatkowy na pozycję 1 // dodatkowy na pozycję 1
mvOccupied->IncLocalBrakeLevel( 1 ); mvOccupied->IncLocalBrakeLevel( LocalBrakePosNo );
}
} }
else { else {
mvOccupied->BrakeLevelSet( mvOccupied->Handle->GetPos( bh_RP ) ); //GBH mvOccupied->BrakeLevelSet( mvOccupied->Handle->GetPos( bh_RP ) ); //GBH
BrakeLevelSet(gbh_RP); BrakeLevelSet( gbh_RP );
}
} }
} }
} }

View File

@@ -1794,14 +1794,25 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
static_cast<int>( std::floor(MoverParameters->Handle->GetPos(bh_NP)) ); static_cast<int>( std::floor(MoverParameters->Handle->GetPos(bh_NP)) );
else else
MoverParameters->BrakeCtrlPos = static_cast<int>( std::floor(MoverParameters->Handle->GetPos(bh_RP)) ); MoverParameters->BrakeCtrlPos = static_cast<int>( std::floor(MoverParameters->Handle->GetPos(bh_RP)) );
// engage independent brake if applicable, if the vehicle is to be on standby
// NOTE: with more than one driver in the consist this is likely to go awery, since all but one will be sent to sleep
// TBD, TODO: have the virtual helper release independent brakes during consist check?
if( DriverType != "" ) {
if( MoverParameters->LocalBrake != TLocalBrake::ManualBrake ) {
if( fVel < 1.0 ) {
MoverParameters->IncLocalBrakeLevel( LocalBrakePosNo );
}
}
}
} }
else else
MoverParameters->BrakeCtrlPos = MoverParameters->BrakeCtrlPos =
static_cast<int>( std::floor(MoverParameters->Handle->GetPos(bh_NP)) ); static_cast<int>( std::floor(MoverParameters->Handle->GetPos(bh_NP)) );
MoverParameters->BrakeLevelSet( // poprawienie hamulca po ewentualnym przestawieniu przez Pascal
MoverParameters->BrakeCtrlPos); // poprawienie hamulca po ewentualnym // TODO: check if needed, we're not in Pascal anymore, Toto
// przestawieniu przez Pascal MoverParameters->BrakeLevelSet(MoverParameters->BrakeCtrlPos);
// dodatkowe parametry yB // dodatkowe parametry yB
MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać
@@ -3763,7 +3774,7 @@ bool TDynamicObject::Update(double dt, double dt1)
// compartment lights // compartment lights
// if the vehicle has a controller, we base the light state on state of the controller otherwise we check the vehicle itself // if the vehicle has a controller, we base the light state on state of the controller otherwise we check the vehicle itself
if( ( ctOwner != nullptr ? ctOwner->Controlling()->Battery != SectionLightsActive : if( ( ctOwner != nullptr ? ctOwner->Controlling()->Battery != SectionLightsActive :
Mechanik != nullptr ? Mechanik->primary() == false : // don't touch lights in a stand-alone manned vehicle Mechanik != nullptr ? false : // don't touch lights in a stand-alone manned vehicle
MoverParameters->CompartmentLights.is_active == true ) ) { // without controller switch the lights off MoverParameters->CompartmentLights.is_active == true ) ) { // without controller switch the lights off
toggle_lights(); toggle_lights();
} }

View File

@@ -245,6 +245,18 @@ enum sound {
removeadapter = 1 << 15, removeadapter = 1 << 15,
}; };
// customizable reset button
enum relay_t {
maincircuitground = 1 << 0,
auxiliarycircuitground = 1 << 1,
tractionnmotoroverload = 1 << 2,
primaryconverteroverload = 1 << 3,
secondaryconverteroverload = 1 << 4,
ventillatoroverload = 1 << 5,
heatingoverload = 1 << 6,
electrodynamicbrakesoverload = 1 << 7,
};
//szczególne typy pojazdów (inna obsługa) dla zmiennej TrainType //szczególne typy pojazdów (inna obsługa) dla zmiennej TrainType
//zamienione na flagi bitowe, aby szybko wybierać grupę (np. EZT+SZT) //zamienione na flagi bitowe, aby szybko wybierać grupę (np. EZT+SZT)
// TODO: convert to enums, they're used as specific checks anyway // TODO: convert to enums, they're used as specific checks anyway
@@ -1042,6 +1054,7 @@ public:
TBrakePressure BrakePressureActual; //wartości ważone dla aktualnej pozycji kranu TBrakePressure BrakePressureActual; //wartości ważone dla aktualnej pozycji kranu
int ASBType = 0; /*0: brak hamulca przeciwposlizgowego, 1: reczny, 2: automat*/ int ASBType = 0; /*0: brak hamulca przeciwposlizgowego, 1: reczny, 2: automat*/
int UniversalBrakeButtonFlag[3] = { 0, 0, 0 }; /* mozliwe działania przycisków hamulcowych */ int UniversalBrakeButtonFlag[3] = { 0, 0, 0 }; /* mozliwe działania przycisków hamulcowych */
int UniversalResetButtonFlag[3] = { 0, 0, 0 }; // customizable reset buttons assignments
int TurboTest = 0; int TurboTest = 0;
double MaxBrakeForce = 0.0; /*maksymalna sila nacisku hamulca*/ double MaxBrakeForce = 0.0; /*maksymalna sila nacisku hamulca*/
double MaxBrakePress[5]; //pomocniczy, proz, sred, lad, pp double MaxBrakePress[5]; //pomocniczy, proz, sred, lad, pp
@@ -1453,6 +1466,7 @@ public:
bool AutoRelayFlag = false; /*mozna zmieniac jesli AutoRelayType=2*/ bool AutoRelayFlag = false; /*mozna zmieniac jesli AutoRelayType=2*/
bool FuseFlag = false; /*!o bezpiecznik nadmiarowy*/ bool FuseFlag = false; /*!o bezpiecznik nadmiarowy*/
bool ConvOvldFlag = false; /*! nadmiarowy przetwornicy i ogrzewania*/ bool ConvOvldFlag = false; /*! nadmiarowy przetwornicy i ogrzewania*/
bool GroundRelay { true }; // switches off to protect against damage from earths
bool StLinFlag = false; /*!o styczniki liniowe*/ bool StLinFlag = false; /*!o styczniki liniowe*/
bool StLinSwitchOff{ false }; // state of the button forcing motor connectors open bool StLinSwitchOff{ false }; // state of the button forcing motor connectors open
bool ResistorsFlag = false; /*!o jazda rezystorowa*/ bool ResistorsFlag = false; /*!o jazda rezystorowa*/
@@ -1560,6 +1574,7 @@ public:
int iLights[2]; // bity zapalonych świateł tutaj, żeby dało się liczyć pobór prądu int iLights[2]; // bity zapalonych świateł tutaj, żeby dało się liczyć pobór prądu
int AIHintPantstate{ 0 }; // suggested pantograph setup int AIHintPantstate{ 0 }; // suggested pantograph setup
bool AIHintPantUpIfIdle{ true }; // whether raise both pantographs if idling for a while
double AIHintLocalBrakeAccFactor{ 1.05 }; // suggested acceleration weight for local brake operation double AIHintLocalBrakeAccFactor{ 1.05 }; // suggested acceleration weight for local brake operation
public: public:
@@ -1706,11 +1721,13 @@ public:
bool CompartmentLightsSwitchOff( bool State, range_t const Notify = range_t::consist ); // compartment lights state toggle bool CompartmentLightsSwitchOff( bool State, range_t const Notify = range_t::consist ); // compartment lights state toggle
bool MainSwitch( bool const State, range_t const Notify = range_t::consist );/*! wylacznik glowny*/ bool MainSwitch( bool const State, range_t const Notify = range_t::consist );/*! wylacznik glowny*/
void MainSwitch_( bool const State ); void MainSwitch_( bool const State );
bool MainSwitchCheck() const; // checks conditions for closing the line breaker
bool ConverterSwitch( bool State, range_t const Notify = range_t::consist );/*! wl/wyl przetwornicy*/ bool ConverterSwitch( bool State, range_t const Notify = range_t::consist );/*! wl/wyl przetwornicy*/
bool CompressorSwitch( bool State, range_t const Notify = range_t::consist );/*! wl/wyl sprezarki*/ bool CompressorSwitch( bool State, range_t const Notify = range_t::consist );/*! wl/wyl sprezarki*/
bool ChangeCompressorPreset( int const Change, range_t const Notify = range_t::consist ); bool ChangeCompressorPreset( int const Change, range_t const Notify = range_t::consist );
/*-funkcje typowe dla lokomotywy elektrycznej*/ /*-funkcje typowe dla lokomotywy elektrycznej*/
void LowVoltagePowerCheck( double const Deltatime );
void MainsCheck( double const Deltatime ); void MainsCheck( double const Deltatime );
void PowerCouplersCheck( double const Deltatime ); void PowerCouplersCheck( double const Deltatime );
void ConverterCheck( double const Timestep ); // przetwornica void ConverterCheck( double const Timestep ); // przetwornica
@@ -1722,9 +1739,11 @@ public:
void MotorBlowersCheck( double const Timestep ); void MotorBlowersCheck( double const Timestep );
void PantographsCheck( double const Timestep ); void PantographsCheck( double const Timestep );
void LightsCheck( double const Timestep ); void LightsCheck( double const Timestep );
bool FuseOn(void); //bezpiecznik nadamiary bool FuseOn( range_t const Notify = range_t::consist ); //bezpiecznik nadamiary
bool FuseFlagCheck(void) const; // sprawdzanie flagi nadmiarowego bool FuseFlagCheck(void) const; // sprawdzanie flagi nadmiarowego
void FuseOff(void); // wylaczenie nadmiarowego void FuseOff(void); // wylaczenie nadmiarowego
bool UniversalResetButton( int const Button, range_t const Notify = range_t::consist );
bool RelayReset( int const Relays ); // resets specified relays
double ShowCurrent( int AmpN ) const; //pokazuje bezwgl. wartosc pradu na wybranym amperomierzu double ShowCurrent( int AmpN ) const; //pokazuje bezwgl. wartosc pradu na wybranym amperomierzu
double ShowCurrentP(int AmpN) const; //pokazuje bezwgl. wartosc pradu w wybranym pojezdzie //Q 20160722 double ShowCurrentP(int AmpN) const; //pokazuje bezwgl. wartosc pradu w wybranym pojezdzie //Q 20160722

View File

@@ -1414,6 +1414,8 @@ void TMoverParameters::compute_movement_( double const Deltatime ) {
// TODO: gather and move current calculations to dedicated method // TODO: gather and move current calculations to dedicated method
TotalCurrent = 0; TotalCurrent = 0;
// low voltage power sources
LowVoltagePowerCheck( Deltatime );
// power sources // power sources
PantographsCheck( Deltatime ); PantographsCheck( Deltatime );
// main circuit // main circuit
@@ -1497,6 +1499,21 @@ void TMoverParameters::MainsCheck( double const Deltatime ) {
} }
} }
void TMoverParameters::LowVoltagePowerCheck( double const Deltatime ) {
auto const lowvoltagepower { Battery | ConverterFlag };
switch( EngineType ) {
case TEngineType::ElectricSeriesMotor: {
GroundRelay &= lowvoltagepower;
break;
}
default: {
break;
}
}
}
void TMoverParameters::PowerCouplersCheck( double const Deltatime ) { void TMoverParameters::PowerCouplersCheck( double const Deltatime ) {
// TODO: add support for other power sources // TODO: add support for other power sources
auto localvoltage { 0.0 }; auto localvoltage { 0.0 };
@@ -3272,15 +3289,7 @@ void TMoverParameters::MainSwitch_( bool const State ) {
bool const initialstate { Mains || dizel_startup }; bool const initialstate { Mains || dizel_startup };
if( ( false == State ) if( ( false == State )
|| ( ( ( ScndCtrlPos == 0 ) || ( EngineType == TEngineType::ElectricInductionMotor ) ) || ( true == MainSwitchCheck() ) ) {
&& ( ( ConvOvldFlag == false ) || ( TrainType == dt_EZT ) )
&& ( MainsInitTimeCountdown <= 0.0 )
&& ( true == NoVoltRelay )
&& ( true == OvervoltageRelay )
&& ( LastSwitchingTime > CtrlDelay )
&& ( HasCamshaft ? IsMainCtrlActualNoPowerPos() : ( LineBreakerClosesAtNoPowerPosOnly ? IsMainCtrlNoPowerPos() : true ) )
&& ( false == TestFlag( DamageFlag, dtrain_out ) )
&& ( false == TestFlag( EngDmgFlag, 1 ) ) ) ) {
if( true == State ) { if( true == State ) {
// switch on // switch on
@@ -3312,6 +3321,21 @@ void TMoverParameters::MainSwitch_( bool const State ) {
} }
} }
bool TMoverParameters::MainSwitchCheck() const {
return (
( ( ScndCtrlPos == 0 ) || ( EngineType == TEngineType::ElectricInductionMotor ) )
&& ( MainsInitTimeCountdown <= 0.0 )
&& ( ( ConvOvldFlag == false ) || ( TrainType == dt_EZT ) )
&& ( true == GroundRelay )
&& ( true == NoVoltRelay )
&& ( true == OvervoltageRelay )
&& ( LastSwitchingTime > CtrlDelay )
&& ( HasCamshaft ? IsMainCtrlActualNoPowerPos() : ( LineBreakerClosesAtNoPowerPosOnly ? IsMainCtrlNoPowerPos() : true ) )
&& ( false == TestFlag( DamageFlag, dtrain_out ) )
&& ( false == TestFlag( EngDmgFlag, 1 ) ) );
}
// ************************************************************************************************* // *************************************************************************************************
// Q: 20160713 // Q: 20160713
// włączenie / wyłączenie przetwornicy // włączenie / wyłączenie przetwornicy
@@ -6021,21 +6045,21 @@ bool TMoverParameters::FuseFlagCheck(void) const
// Q: 20160713 // Q: 20160713
// Załączenie bezpiecznika nadmiarowego // Załączenie bezpiecznika nadmiarowego
// ************************************************************************************************* // *************************************************************************************************
bool TMoverParameters::FuseOn(void) bool TMoverParameters::FuseOn( range_t const Notify )
{ {
bool FO = false; bool const result { RelayReset( relay_t::maincircuitground | relay_t::tractionnmotoroverload ) };
if ((IsMainCtrlNoPowerPos()) && (ScndCtrlPos == 0) && (TrainType != dt_ET40) &&
((Mains) || (TrainType != dt_EZT)) && (!TestFlag(EngDmgFlag, 1))) if( Notify != range_t::local ) {
{ // w ET40 jest blokada nastawnika, ale czy działa dobrze? SendCtrlToNext(
SendCtrlToNext("FuseSwitch", 1, CabActive); "FuseSwitch",
if (((EngineType == TEngineType::ElectricSeriesMotor) || ((EngineType == TEngineType::DieselElectric))) && FuseFlag) 1,
{ CabActive,
FuseFlag = false; // wlaczenie ponowne obwodu ( Notify == range_t::unit ?
FO = true; coupling::control | coupling::permanent :
SetFlag(SoundFlag, sound::relay | sound::loud); coupling::control ) );
} }
}
return FO; return result;
} }
// ************************************************************************************************* // *************************************************************************************************
@@ -6052,6 +6076,81 @@ void TMoverParameters::FuseOff(void)
} }
} }
// resets relays assigned to specified customizable reset button
bool TMoverParameters::UniversalResetButton( int const Button, range_t const Notify ) {
auto const lowvoltagepower { Battery || ConverterFlag };
if( false == lowvoltagepower ) { return false; }
auto const relays { UniversalResetButtonFlag[ Button ] };
if( relays == 0 ) { return false; }
auto const result { RelayReset( relays ) };
if( Notify != range_t::local ) {
SendCtrlToNext(
"RelayReset",
relays,
CabActive,
( Notify == range_t::unit ?
coupling::control | coupling::permanent :
coupling::control ) );
}
return result;
}
// resets state of specified relays
bool TMoverParameters::RelayReset( int const Relays ) {
auto const lowvoltagepower { Battery || ConverterFlag };
bool reset { false };
if( TestFlag( Relays, relay_t::maincircuitground ) ) {
if( ( ( EngineType == TEngineType::ElectricSeriesMotor ) || ( EngineType == TEngineType::DieselElectric ) )
&& ( IsMainCtrlNoPowerPos() )
&& ( ScndCtrlPos == 0 )
&& ( DirActive != 0 )
&& ( !TestFlag( EngDmgFlag, 1 ) ) ) {
// NOTE: true means the relay is operational
reset |= ( !GroundRelay && lowvoltagepower );
GroundRelay |= lowvoltagepower;
}
}
if( TestFlag( Relays, relay_t::tractionnmotoroverload ) ) {
if( ( ( EngineType == TEngineType::ElectricSeriesMotor ) || ( EngineType == TEngineType::DieselElectric ) )
&& ( IsMainCtrlNoPowerPos() )
&& ( ScndCtrlPos == 0 )
&& ( DirActive != 0 )
&& ( !TestFlag( EngDmgFlag, 1 ) ) ) {
// NOTE: false means the relay is operational
// TODO: cleanup, flip the FuseFlag code to match other relays
// TODO: check whether the power is required, TBD, TODO: make it configurable?
reset |= ( FuseFlag && lowvoltagepower );
FuseFlag &= !lowvoltagepower;
}
}
if( TestFlag( Relays, relay_t::primaryconverteroverload ) ) {
if( ( false == Mains )
&& ( false == ConverterAllow )
&& ( TrainType != dt_EZT ) ) { // for EMUs the relay is reset automatically when converter switches off
// NOTE: false means the relay is operational
// TODO: cleanup, flip the FuseFlag code to match other relays
// TODO: check whether the power is required, TBD, TODO: make it configurable?
reset |= ( ConvOvldFlag && lowvoltagepower );
ConvOvldFlag &= !lowvoltagepower;
}
}
if( reset ) {
SetFlag( SoundFlag, sound::relay | sound::loud );
}
return reset;
}
// ************************************************************************************************* // *************************************************************************************************
// Q: 20160713 // Q: 20160713
// Przeliczenie prędkości liniowej na obrotową // Przeliczenie prędkości liniowej na obrotową
@@ -9854,7 +9953,7 @@ void TMoverParameters::LoadFIZ_Cntrl( std::string const &line ) {
CompartmentLights.start_type = CompartmentLights.start_type =
lookup != starts.end() ? lookup != starts.end() ?
lookup->second : lookup->second :
start_t::automatic; start_t::automatic; // legacy behaviour
} }
} }
@@ -10217,6 +10316,10 @@ void TMoverParameters::LoadFIZ_Switches( std::string const &Input ) {
PantSwitchType = ToLower( PantSwitchType ); PantSwitchType = ToLower( PantSwitchType );
ConvSwitchType = ToLower( ConvSwitchType ); ConvSwitchType = ToLower( ConvSwitchType );
StLinSwitchType = ToLower( StLinSwitchType ); StLinSwitchType = ToLower( StLinSwitchType );
// universal reset buttons assignments
extract_value( UniversalResetButtonFlag[ 0 ], "RelayResetButton1", Input, "" );
extract_value( UniversalResetButtonFlag[ 1 ], "RelayResetButton2", Input, "" );
extract_value( UniversalResetButtonFlag[ 2 ], "RelayResetButton3", Input, "" );
} }
void TMoverParameters::LoadFIZ_MotorParamTable( std::string const &Input ) { void TMoverParameters::LoadFIZ_MotorParamTable( std::string const &Input ) {
@@ -10260,6 +10363,7 @@ void TMoverParameters::LoadFIZ_Circuit( std::string const &Input ) {
void TMoverParameters::LoadFIZ_AI( std::string const &Input ) { void TMoverParameters::LoadFIZ_AI( std::string const &Input ) {
extract_value( AIHintPantstate, "Pantstate", Input, "" ); extract_value( AIHintPantstate, "Pantstate", Input, "" );
extract_value( AIHintPantUpIfIdle, "IdlePantUp", Input, "" );
extract_value( AIHintLocalBrakeAccFactor, "LocalBrakeAccFactor", Input, "" ); extract_value( AIHintLocalBrakeAccFactor, "LocalBrakeAccFactor", Input, "" );
} }
@@ -10751,6 +10855,8 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir)
DirActive = 0; // Dir; //nastawnik kierunkowy - musi być ustawiane osobno! DirActive = 0; // Dir; //nastawnik kierunkowy - musi być ustawiane osobno!
DirAbsolute = DirActive * CabActive; // kierunek jazdy względem sprzęgów DirAbsolute = DirActive * CabActive; // kierunek jazdy względem sprzęgów
LimPipePress = CntrlPipePress; LimPipePress = CntrlPipePress;
Battery = true;
} }
else { // zahamowany} else { // zahamowany}
WriteLog( "Braked" ); WriteLog( "Braked" );
@@ -11208,14 +11314,7 @@ bool TMoverParameters::RunCommand( std::string Command, double CValue1, double C
} }
else if (Command == "FuseSwitch") else if (Command == "FuseSwitch")
{ {
if (((EngineType == TEngineType::ElectricSeriesMotor) || (EngineType == TEngineType::DieselElectric)) && FuseFlag && FuseOn( range_t::local );
(CValue1 == 1) && (MainCtrlActualPos == 0) && (ScndCtrlActualPos == 0) && Mains)
/* if (EngineType=ElectricSeriesMotor) and (CValue1=1) and
(MainCtrlActualPos=0) and (ScndCtrlActualPos=0) and Mains then*/
FuseFlag = false; /*wlaczenie ponowne obwodu*/
// if ((EngineType=ElectricSeriesMotor)or(EngineType=DieselElectric)) and not FuseFlag and
// (CValue1=0) and Mains then
// FuseFlag:=true;
OK = SendCtrlToNext( Command, CValue1, CValue2, Couplertype ); OK = SendCtrlToNext( Command, CValue1, CValue2, Couplertype );
} }
else if (Command == "ConverterSwitch") /*NBMX*/ else if (Command == "ConverterSwitch") /*NBMX*/

View File

@@ -299,6 +299,9 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = {
{ user_command::motoroverloadrelaythresholdsetlow, &TTrain::OnCommand_motoroverloadrelaythresholdsetlow }, { user_command::motoroverloadrelaythresholdsetlow, &TTrain::OnCommand_motoroverloadrelaythresholdsetlow },
{ user_command::motoroverloadrelaythresholdsethigh, &TTrain::OnCommand_motoroverloadrelaythresholdsethigh }, { user_command::motoroverloadrelaythresholdsethigh, &TTrain::OnCommand_motoroverloadrelaythresholdsethigh },
{ user_command::motoroverloadrelayreset, &TTrain::OnCommand_motoroverloadrelayreset }, { user_command::motoroverloadrelayreset, &TTrain::OnCommand_motoroverloadrelayreset },
{ user_command::universalrelayreset1, &TTrain::OnCommand_universalrelayreset },
{ user_command::universalrelayreset2, &TTrain::OnCommand_universalrelayreset },
{ user_command::universalrelayreset3, &TTrain::OnCommand_universalrelayreset },
{ user_command::heatingtoggle, &TTrain::OnCommand_heatingtoggle }, { user_command::heatingtoggle, &TTrain::OnCommand_heatingtoggle },
{ user_command::heatingenable, &TTrain::OnCommand_heatingenable }, { user_command::heatingenable, &TTrain::OnCommand_heatingenable },
{ user_command::heatingdisable, &TTrain::OnCommand_heatingdisable }, { user_command::heatingdisable, &TTrain::OnCommand_heatingdisable },
@@ -3115,11 +3118,7 @@ void TTrain::OnCommand_converteroverloadrelayreset( TTrain *Train, command_data
// visual feedback // visual feedback
Train->ggConverterFuseButton.UpdateValue( 1.0, Train->dsbSwitch ); Train->ggConverterFuseButton.UpdateValue( 1.0, Train->dsbSwitch );
if( ( Train->mvControlled->Mains == false ) Train->mvControlled->RelayReset( relay_t::primaryconverteroverload );
&& ( Train->ggConverterButton.GetValue() < 0.05 )
&& ( Train->mvControlled->TrainType != dt_EZT ) ) {
Train->mvControlled->ConvOvldFlag = false;
}
} }
else if( Command.action == GLFW_RELEASE ) { else if( Command.action == GLFW_RELEASE ) {
// visual feedback // visual feedback
@@ -3626,6 +3625,23 @@ void TTrain::OnCommand_motoroverloadrelayreset( TTrain *Train, command_data cons
} }
} }
void TTrain::OnCommand_universalrelayreset( TTrain *Train, command_data const &Command ) {
auto const itemindex = static_cast<int>( Command.command ) - static_cast<int>( user_command::universalrelayreset1 );
auto &item = Train->ggRelayResetButtons[ itemindex ];
// NOTE: relay reset switches are impulse-only
if( Command.action == GLFW_PRESS ) {
Train->mvOccupied->UniversalResetButton( itemindex );
// visual feedback
item.UpdateValue( 1.0 );
}
else if( Command.action == GLFW_RELEASE ) {
// visual feedback
item.UpdateValue( 0.0 );
}
}
void TTrain::OnCommand_lightspresetactivatenext( TTrain *Train, command_data const &Command ) { void TTrain::OnCommand_lightspresetactivatenext( TTrain *Train, command_data const &Command ) {
if( Train->mvOccupied->LightsPosNo == 0 ) { if( Train->mvOccupied->LightsPosNo == 0 ) {
@@ -4681,7 +4697,6 @@ void TTrain::OnCommand_springbrakeenable(TTrain *Train, command_data const &Comm
Train->mvOccupied->SpringBrakeActivate(true); Train->mvOccupied->SpringBrakeActivate(true);
// visual feedback // visual feedback
Train->ggSpringBrakeOnButton.UpdateValue(1.0, Train->dsbSwitch); Train->ggSpringBrakeOnButton.UpdateValue(1.0, Train->dsbSwitch);
Train->ggSpringBrakeToggleButton.UpdateValue(1.0, Train->dsbSwitch);
Train->ggSpringBrakeOffButton.UpdateValue(0.0, Train->dsbSwitch); Train->ggSpringBrakeOffButton.UpdateValue(0.0, Train->dsbSwitch);
} }
else if (Command.action == GLFW_RELEASE) { else if (Command.action == GLFW_RELEASE) {
@@ -4697,7 +4712,6 @@ void TTrain::OnCommand_springbrakedisable(TTrain *Train, command_data const &Com
Train->mvOccupied->SpringBrakeActivate(false); Train->mvOccupied->SpringBrakeActivate(false);
// visual feedback // visual feedback
Train->ggSpringBrakeOffButton.UpdateValue(1.0, Train->dsbSwitch); Train->ggSpringBrakeOffButton.UpdateValue(1.0, Train->dsbSwitch);
Train->ggSpringBrakeToggleButton.UpdateValue(0.0, Train->dsbSwitch);
Train->ggSpringBrakeOnButton.UpdateValue(0.0, Train->dsbSwitch); Train->ggSpringBrakeOnButton.UpdateValue(0.0, Train->dsbSwitch);
} }
else if (Command.action == GLFW_RELEASE) { else if (Command.action == GLFW_RELEASE) {
@@ -5838,7 +5852,7 @@ bool TTrain::Update( double const Deltatime )
|| ( ( ggMainOnButton.SubModel != nullptr ) && ( ggMainOnButton.GetDesiredValue() > 0.95 ) || ( ( ggMainOnButton.SubModel != nullptr ) && ( ggMainOnButton.GetDesiredValue() > 0.95 )
|| ( ggIgnitionKey.GetDesiredValue() > 0.95 ) ) ) { // HACK: fallback || ( ggIgnitionKey.GetDesiredValue() > 0.95 ) ) ) { // HACK: fallback
// keep track of period the line breaker button is held down, to determine when/if circuit closes // keep track of period the line breaker button is held down, to determine when/if circuit closes
if( ( mvControlled->MainsInitTimeCountdown <= 0.0 ) if( ( mvControlled->MainSwitchCheck() )
&& ( ( fHVoltage > 0.5 * mvControlled->EnginePowerSource.MaxVoltage ) && ( ( fHVoltage > 0.5 * mvControlled->EnginePowerSource.MaxVoltage )
|| ( ( mvControlled->EngineType != TEngineType::ElectricSeriesMotor ) || ( ( mvControlled->EngineType != TEngineType::ElectricSeriesMotor )
&& ( mvControlled->EngineType != TEngineType::ElectricInductionMotor ) && ( mvControlled->EngineType != TEngineType::ElectricInductionMotor )
@@ -6424,9 +6438,14 @@ bool TTrain::Update( double const Deltatime )
|| ( mvControlled->MainCtrlActualPos == 0 ) ); // do EU04 || ( mvControlled->MainCtrlActualPos == 0 ) ); // do EU04
btLampkaStyczn.Turn( btLampkaStyczn.Turn(
( ( mvOccupied->StLinFlag ) /* || ( mvOccupied->BrakePress > 2.0 ) || ( mvOccupied->PipePress < 3.6 ) */ ) ? ( ( mvControlled->StLinFlag ) /* || ( mvControlled->BrakePress > 2.0 ) || ( mvControlled->PipePress < 3.6 ) */ ) ?
false : false :
( mvOccupied->BrakePress < 1.0 ) ); // mozna prowadzic rozruch ( mvControlled->BrakePress < 1.0 ) ); // mozna prowadzic rozruch
btLampkaPrzekRozn.Turn(
( ( mvControlled->GroundRelay ) || ( mvControlled->BrakePress > 2.0 ) || ( mvControlled->PipePress < 3.6 ) ) ?
false :
( mvControlled->BrakePress < 1.0 ) ); // relay is off and needs a reset
if( ( ( mvControlled->CabOccupied == 1 ) && ( TestFlag( mvControlled->Couplers[ end::rear ].CouplingFlag, coupling::control ) ) ) if( ( ( mvControlled->CabOccupied == 1 ) && ( TestFlag( mvControlled->Couplers[ end::rear ].CouplingFlag, coupling::control ) ) )
|| ( ( mvControlled->CabOccupied == -1 ) && ( TestFlag( mvControlled->Couplers[ end::front ].CouplingFlag, coupling::control ) ) ) ) { || ( ( mvControlled->CabOccupied == -1 ) && ( TestFlag( mvControlled->Couplers[ end::front ].CouplingFlag, coupling::control ) ) ) ) {
@@ -6889,7 +6908,6 @@ bool TTrain::Update( double const Deltatime )
ggMainButton.Update(); ggMainButton.Update();
ggSecurityResetButton.Update(); ggSecurityResetButton.Update();
ggReleaserButton.Update(); ggReleaserButton.Update();
ggSpringBrakeToggleButton.Update();
ggSpringBrakeOnButton.Update(); ggSpringBrakeOnButton.Update();
ggSpringBrakeOffButton.Update(); ggSpringBrakeOffButton.Update();
ggUniveralBrakeButton1.Update(); ggUniveralBrakeButton1.Update();
@@ -6961,10 +6979,12 @@ bool TTrain::Update( double const Deltatime )
for (auto &speedctrlbutton : ggSpeedCtrlButtons) { for (auto &speedctrlbutton : ggSpeedCtrlButtons) {
speedctrlbutton.Update( lowvoltagepower ); speedctrlbutton.Update( lowvoltagepower );
} }
for( auto &universal : ggUniversals ) { for( auto &universal : ggUniversals ) {
universal.Update(); universal.Update();
} }
for( auto &relayresetbutton : ggRelayResetButtons ) {
relayresetbutton.Update();
}
// hunter-091012 // hunter-091012
ggInstrumentLightButton.Update(); ggInstrumentLightButton.Update();
ggDashboardLightButton.Update(); ggDashboardLightButton.Update();
@@ -8252,7 +8272,6 @@ void TTrain::clear_cab_controls()
ggMainOnButton.Clear(); ggMainOnButton.Clear();
ggSecurityResetButton.Clear(); ggSecurityResetButton.Clear();
ggReleaserButton.Clear(); ggReleaserButton.Clear();
ggSpringBrakeToggleButton.Clear();
ggSpringBrakeOnButton.Clear(); ggSpringBrakeOnButton.Clear();
ggSpringBrakeOffButton.Clear(); ggSpringBrakeOffButton.Clear();
ggUniveralBrakeButton1.Clear(); ggUniveralBrakeButton1.Clear();
@@ -8278,6 +8297,9 @@ void TTrain::clear_cab_controls()
for( auto &universal : ggUniversals ) { for( auto &universal : ggUniversals ) {
universal.Clear(); universal.Clear();
} }
for( auto &relayresetbutton : ggRelayResetButtons ) {
relayresetbutton.Clear();
}
ggInstrumentLightButton.Clear(); ggInstrumentLightButton.Clear();
ggDashboardLightButton.Clear(); ggDashboardLightButton.Clear();
ggTimetableLightButton.Clear(); ggTimetableLightButton.Clear();
@@ -8952,7 +8974,6 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con
{ "main_on_bt:", ggMainOnButton }, { "main_on_bt:", ggMainOnButton },
{ "security_reset_bt:", ggSecurityResetButton }, { "security_reset_bt:", ggSecurityResetButton },
{ "releaser_bt:", ggReleaserButton }, { "releaser_bt:", ggReleaserButton },
{ "springbraketoggle_bt:", ggSpringBrakeToggleButton },
{ "springbrakeon_bt:", ggSpringBrakeOnButton }, { "springbrakeon_bt:", ggSpringBrakeOnButton },
{ "springbrakeoff_bt:", ggSpringBrakeOffButton }, { "springbrakeoff_bt:", ggSpringBrakeOffButton },
{ "universalbrake1_bt:", ggUniveralBrakeButton1 }, { "universalbrake1_bt:", ggUniveralBrakeButton1 },
@@ -9046,6 +9067,9 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con
{ "batteryon_sw:", ggBatteryOnButton }, { "batteryon_sw:", ggBatteryOnButton },
{ "batteryoff_sw:", ggBatteryOffButton }, { "batteryoff_sw:", ggBatteryOffButton },
{ "distancecounter_sw:", ggDistanceCounterButton }, { "distancecounter_sw:", ggDistanceCounterButton },
{ "relayreset1_bt:", ggRelayResetButtons[ 0 ] },
{ "relayreset2_bt:", ggRelayResetButtons[ 1 ] },
{ "relayreset3_bt:", ggRelayResetButtons[ 2 ] },
{ "universal0:", ggUniversals[ 0 ] }, { "universal0:", ggUniversals[ 0 ] },
{ "universal1:", ggUniversals[ 1 ] }, { "universal1:", ggUniversals[ 1 ] },
{ "universal2:", ggUniversals[ 2 ] }, { "universal2:", ggUniversals[ 2 ] },
@@ -9107,6 +9131,7 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con
{ "pantrearoff_sw:", &mvControlled->Pantographs[end::rear].valve.is_disabled }, { "pantrearoff_sw:", &mvControlled->Pantographs[end::rear].valve.is_disabled },
{ "radio_sw:", &mvOccupied->Radio }, { "radio_sw:", &mvOccupied->Radio },
{ "cablight_sw:", &Cabine[ iCabn ].bLight }, { "cablight_sw:", &Cabine[ iCabn ].bLight },
{ "springbraketoggle_bt:", &mvOccupied->SpringBrake.Activate },
}; };
{ {
auto lookup = autoboolgauges.find( Label ); auto lookup = autoboolgauges.find( Label );

View File

@@ -325,6 +325,7 @@ class TTrain {
static void OnCommand_motoroverloadrelaythresholdsetlow( TTrain *Train, command_data const &Command ); static void OnCommand_motoroverloadrelaythresholdsetlow( TTrain *Train, command_data const &Command );
static void OnCommand_motoroverloadrelaythresholdsethigh( TTrain *Train, command_data const &Command ); static void OnCommand_motoroverloadrelaythresholdsethigh( TTrain *Train, command_data const &Command );
static void OnCommand_motoroverloadrelayreset( TTrain *Train, command_data const &Command ); static void OnCommand_motoroverloadrelayreset( TTrain *Train, command_data const &Command );
static void OnCommand_universalrelayreset( TTrain *Train, command_data const &Command );
static void OnCommand_heatingtoggle( TTrain *Train, command_data const &Command ); static void OnCommand_heatingtoggle( TTrain *Train, command_data const &Command );
static void OnCommand_heatingenable( TTrain *Train, command_data const &Command ); static void OnCommand_heatingenable( TTrain *Train, command_data const &Command );
static void OnCommand_heatingdisable( TTrain *Train, command_data const &Command ); static void OnCommand_heatingdisable( TTrain *Train, command_data const &Command );
@@ -474,7 +475,6 @@ public: // reszta może by?publiczna
TGauge ggMainButton; // EZT TGauge ggMainButton; // EZT
TGauge ggSecurityResetButton; TGauge ggSecurityResetButton;
TGauge ggReleaserButton; TGauge ggReleaserButton;
TGauge ggSpringBrakeToggleButton;
TGauge ggSpringBrakeOnButton; TGauge ggSpringBrakeOnButton;
TGauge ggSpringBrakeOffButton; TGauge ggSpringBrakeOffButton;
TGauge ggUniveralBrakeButton1; TGauge ggUniveralBrakeButton1;
@@ -536,6 +536,7 @@ public: // reszta może by?publiczna
std::array<TGauge, 10> ggSpeedCtrlButtons; // NOTE: temporary arrangement until we have dynamically built control table std::array<TGauge, 10> ggSpeedCtrlButtons; // NOTE: temporary arrangement until we have dynamically built control table
std::array<TGauge, 10> ggUniversals; // NOTE: temporary arrangement until we have dynamically built control table std::array<TGauge, 10> ggUniversals; // NOTE: temporary arrangement until we have dynamically built control table
std::array<TGauge, 3> ggRelayResetButtons; // NOTE: temporary arrangement until we have dynamically built control table
TGauge ggInstrumentLightButton; TGauge ggInstrumentLightButton;
TGauge ggDashboardLightButton; TGauge ggDashboardLightButton;

View File

@@ -463,6 +463,21 @@ openal_renderer::fetch_source() {
bool bool
openal_renderer::init_caps() { openal_renderer::init_caps() {
if( ::alcIsExtensionPresent( nullptr, "ALC_ENUMERATION_EXT" ) == AL_TRUE ) {
// enumeration supported
WriteLog( "available audio devices:" );
auto const *devices { ::alcGetString( nullptr, ALC_DEVICE_SPECIFIER ) };
auto const
*device { devices },
*next { devices + 1 };
while( (device) && (*device != '\0') && (next) && (*next != '\0') ) {
WriteLog( { device } );
auto const len { std::strlen( device ) };
device += ( len + 1 );
next += ( len + 2 );
}
}
// NOTE: default value of audio renderer variable is empty string, meaning argument of NULL i.e. 'preferred' device // NOTE: default value of audio renderer variable is empty string, meaning argument of NULL i.e. 'preferred' device
m_device = ::alcOpenDevice( Global.AudioRenderer.c_str() ); m_device = ::alcOpenDevice( Global.AudioRenderer.c_str() );
if( m_device == nullptr ) { if( m_device == nullptr ) {

View File

@@ -113,6 +113,9 @@ commanddescription_sequence Commands_descriptions = {
{ "motoroverloadrelaythresholdsetlow", command_target::vehicle }, { "motoroverloadrelaythresholdsetlow", command_target::vehicle },
{ "motoroverloadrelaythresholdsethigh", command_target::vehicle }, { "motoroverloadrelaythresholdsethigh", command_target::vehicle },
{ "motoroverloadrelayreset", command_target::vehicle }, { "motoroverloadrelayreset", command_target::vehicle },
{ "universalrelayreset1", command_target::vehicle },
{ "universalrelayreset2", command_target::vehicle },
{ "universalrelayreset3", command_target::vehicle },
{ "notchingrelaytoggle", command_target::vehicle }, { "notchingrelaytoggle", command_target::vehicle },
{ "epbrakecontroltoggle", command_target::vehicle }, { "epbrakecontroltoggle", command_target::vehicle },
{ "trainbrakeoperationmodeincrease", command_target::vehicle }, { "trainbrakeoperationmodeincrease", command_target::vehicle },

View File

@@ -105,6 +105,9 @@ enum class user_command {
motoroverloadrelaythresholdsetlow, motoroverloadrelaythresholdsetlow,
motoroverloadrelaythresholdsethigh, motoroverloadrelaythresholdsethigh,
motoroverloadrelayreset, motoroverloadrelayreset,
universalrelayreset1,
universalrelayreset2,
universalrelayreset3,
notchingrelaytoggle, notchingrelaytoggle,
epbrakecontroltoggle, epbrakecontroltoggle,
trainbrakeoperationmodeincrease, trainbrakeoperationmodeincrease,

View File

@@ -116,6 +116,9 @@ driverkeyboard_input::default_bindings() {
// motoroverloadrelaythresholdsetlow, // motoroverloadrelaythresholdsetlow,
// motoroverloadrelaythresholdsethigh, // motoroverloadrelaythresholdsethigh,
{ user_command::motoroverloadrelayreset, GLFW_KEY_N }, { user_command::motoroverloadrelayreset, GLFW_KEY_N },
// universalrelayreset1,
// universalrelayreset2,
// universalrelayreset3,
{ user_command::notchingrelaytoggle, GLFW_KEY_G }, { user_command::notchingrelaytoggle, GLFW_KEY_G },
{ user_command::epbrakecontroltoggle, GLFW_KEY_Z | keymodifier::control }, { user_command::epbrakecontroltoggle, GLFW_KEY_Z | keymodifier::control },
{ user_command::trainbrakeoperationmodeincrease, GLFW_KEY_KP_2 | keymodifier::control }, { user_command::trainbrakeoperationmodeincrease, GLFW_KEY_KP_2 | keymodifier::control },

View File

@@ -645,6 +645,15 @@ drivermouse_input::default_bindings() {
{ "converterfuse_bt:", { { "converterfuse_bt:", {
user_command::converteroverloadrelayreset, user_command::converteroverloadrelayreset,
user_command::none } }, user_command::none } },
{ "relayreset1_bt:", {
user_command::universalrelayreset1,
user_command::none } },
{ "relayreset2_bt:", {
user_command::universalrelayreset2,
user_command::none } },
{ "relayreset3_bt:", {
user_command::universalrelayreset3,
user_command::none } },
{ "stlinoff_bt:", { { "stlinoff_bt:", {
user_command::motorconnectorsopen, user_command::motorconnectorsopen,
user_command::none } }, user_command::none } },

View File

@@ -140,6 +140,9 @@ init() {
"whistle", "whistle",
"motor overload relay reset", "motor overload relay reset",
"converter overload relay reset", "converter overload relay reset",
"relay reset",
"relay reset",
"relay reset",
"motor connectors", "motor connectors",
"left door (permit)", "left door (permit)",
"right door (permit)", "right door (permit)",
@@ -338,6 +341,9 @@ init() {
"gwizdawka", "gwizdawka",
"przekaznik nadmiarowy silnikow trakcyjnych", "przekaznik nadmiarowy silnikow trakcyjnych",
"przekaznik nadmiarowy przetwornicy", "przekaznik nadmiarowy przetwornicy",
"przekazniki nadmiarowe",
"przekazniki nadmiarowe",
"przekazniki nadmiarowe",
"styczniki liniowe", "styczniki liniowe",
"drzwi lewe (zezwol)", "drzwi lewe (zezwol)",
"drzwi prawe (zezwol)", "drzwi prawe (zezwol)",
@@ -489,6 +495,9 @@ init() {
"whistle_bt:", "whistle_bt:",
"fuse_bt:", "fuse_bt:",
"converterfuse_bt:", "converterfuse_bt:",
"relayreset1_bt:",
"relayreset2_bt:",
"relayreset3_bt:",
"stlinoff_bt:", "stlinoff_bt:",
"doorleftpermit_sw:", "doorleftpermit_sw:",
"doorrightpermit_sw:", "doorrightpermit_sw:",

View File

@@ -129,6 +129,9 @@ enum string {
cab_whistle_bt, cab_whistle_bt,
cab_fuse_bt, cab_fuse_bt,
cab_converterfuse_bt, cab_converterfuse_bt,
cab_relayreset1,
cab_relayreset2,
cab_relayreset3,
cab_stlinoff_bt, cab_stlinoff_bt,
cab_doorleftpermit_sw, cab_doorleftpermit_sw,
cab_doorrightpermit_sw, cab_doorrightpermit_sw,