mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-23 06:19: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:
66
Driver.cpp
66
Driver.cpp
@@ -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...
|
||||||
// TODO: check if we shouldn't leave it engaged instead
|
if( mvOccupied->LocalBrake != TLocalBrake::ManualBrake ) {
|
||||||
while( true == mvOccupied->DecBrakeLevel() ) {
|
// ...as long as it's a vehicle with independent brake, anyway
|
||||||
// tu moze zmieniać na -2, ale to bez znaczenia
|
// TODO: check if we shouldn't leave it engaged instead
|
||||||
;
|
while( true == DecBrake() ) {
|
||||||
}
|
;
|
||||||
// ...and engage independent brake
|
}
|
||||||
while( true == mvOccupied->IncLocalBrakeLevel( 1 ) ) {
|
// ...and engage independent brake
|
||||||
;
|
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->BrakeCtrlPos == mvOccupied->Handle->GetPos( bh_RP ) ) {
|
if( mvOccupied->LocalBrake != TLocalBrake::ManualBrake ) {
|
||||||
// dodatkowy na pozycję 1
|
// do it only if the vehicle actually has the independent brake
|
||||||
mvOccupied->IncLocalBrakeLevel( 1 );
|
if( mvOccupied->BrakeCtrlPos == mvOccupied->Handle->GetPos( bh_RP ) ) {
|
||||||
}
|
if( mvOccupied->LocalBrakePosA == 0.0 ) {
|
||||||
else {
|
// dodatkowy na pozycję 1
|
||||||
mvOccupied->BrakeLevelSet( mvOccupied->Handle->GetPos( bh_RP ) ); //GBH
|
mvOccupied->IncLocalBrakeLevel( LocalBrakePosNo );
|
||||||
BrakeLevelSet(gbh_RP);
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mvOccupied->BrakeLevelSet( mvOccupied->Handle->GetPos( bh_RP ) ); //GBH
|
||||||
|
BrakeLevelSet( gbh_RP );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
19
DynObj.cpp
19
DynObj.cpp
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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*/
|
||||||
|
|||||||
53
Train.cpp
53
Train.cpp
@@ -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 );
|
||||||
|
|||||||
3
Train.h
3
Train.h
@@ -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;
|
||||||
|
|||||||
@@ -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 ) {
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
@@ -105,6 +105,9 @@ enum class user_command {
|
|||||||
motoroverloadrelaythresholdsetlow,
|
motoroverloadrelaythresholdsetlow,
|
||||||
motoroverloadrelaythresholdsethigh,
|
motoroverloadrelaythresholdsethigh,
|
||||||
motoroverloadrelayreset,
|
motoroverloadrelayreset,
|
||||||
|
universalrelayreset1,
|
||||||
|
universalrelayreset2,
|
||||||
|
universalrelayreset3,
|
||||||
notchingrelaytoggle,
|
notchingrelaytoggle,
|
||||||
epbrakecontroltoggle,
|
epbrakecontroltoggle,
|
||||||
trainbrakeoperationmodeincrease,
|
trainbrakeoperationmodeincrease,
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
@@ -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 } },
|
||||||
|
|||||||
@@ -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:",
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user