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

Modern dimmer overhaul

Now it supports custom positions
This commit is contained in:
2025-07-15 16:06:42 +02:00
parent 3659d87349
commit 13f7551b5f
4 changed files with 130 additions and 68 deletions

View File

@@ -7366,41 +7366,35 @@ void TDynamicObject::RaLightsSet(int head, int rear)
bool tLeft = MoverParameters->iLights[vehicleend] & (light::auxiliary_left | light::headlight_left); // roboczo czy jakiekolwiek swiatlo z lewej jest zapalone bool tLeft = MoverParameters->iLights[vehicleend] & (light::auxiliary_left | light::headlight_left); // roboczo czy jakiekolwiek swiatlo z lewej jest zapalone
bool tRight = MoverParameters->iLights[vehicleend] & (light::auxiliary_right | light::headlight_right); // a tu z prawej bool tRight = MoverParameters->iLights[vehicleend] & (light::auxiliary_right | light::headlight_right); // a tu z prawej
if (Controller == Humandriver) { if (Controller == Humandriver) {
switch (MoverParameters->modernDimmerState)
int &currentDimPos = MoverParameters->modernDimmerPosition;
auto &dimmerPositions = MoverParameters->dimPositions;
TMoverParameters::dimPosition dps = dimmerPositions[currentDimPos];
// domyślnie
HighBeamLights = false;
DimHeadlights = false;
// obsługa OFF
if (dps.isOff)
{ {
case 0:
// wylaczone
MoverParameters->iLights[vehicleend] &= 0 | light::rearendsignals; // zostawiamy tylko tabliczki jesli sa MoverParameters->iLights[vehicleend] &= 0 | light::rearendsignals; // zostawiamy tylko tabliczki jesli sa
HighBeamLights = false; HighBeamLights = false;
DimHeadlights = false; DimHeadlights = false;
break; }
case 1:
// przyciemnione normalne // obsługa przyciemnionych
DimHeadlights = true; // odpalamy przyciemnienie normalnych reflektorow DimHeadlights = dps.isDimmed;
HighBeamLights = false;
break; // obsługa długich
case 3: if (dps.isHighBeam)
// dlugie przyciemnione {
DimHeadlights = true;
HighBeamLights = true; HighBeamLights = true;
MoverParameters->iLights[vehicleend] &= MoverParameters->iLights[vehicleend] &=
light::headlight_upper | light::rearendsignals | light::redmarker_left | light::redmarker_right | light::rearendsignals; // nie ruszamy gornych i koncowek light::headlight_upper | light::rearendsignals | light::redmarker_left | light::redmarker_right | light::rearendsignals; // nie ruszamy gornych i koncowek
MoverParameters->iLights[vehicleend] |= tLeft ? light::highbeamlight_left : 0; // jesli swiatlo z lewej zapalone to odpal dlugie MoverParameters->iLights[vehicleend] |= tLeft ? light::highbeamlight_left : 0; // jesli swiatlo z lewej zapalone to odpal dlugie
MoverParameters->iLights[vehicleend] |= tRight ? light::highbeamlight_right : 0; // a tu z prawej MoverParameters->iLights[vehicleend] |= tRight ? light::highbeamlight_right : 0; // a tu z prawej
break;
case 4:
// zwykle dlugie
DimHeadlights = false;
HighBeamLights = true;
MoverParameters->iLights[vehicleend] &=
light::headlight_upper | light::rearendsignals | light::redmarker_left | light::redmarker_right | light::rearendsignals; // nie ruszamy gornych i koncowek
MoverParameters->iLights[vehicleend] |= tLeft ? light::highbeamlight_left : 0; // jesli swiatlo z lewej zapalone to odpal dlugie
MoverParameters->iLights[vehicleend] |= tRight ? light::highbeamlight_right : 0; // a tu z prawej
break;
default: // to case 2 - zwykle
DimHeadlights = false;
HighBeamLights = false;
break;
} }
} }

View File

@@ -1377,6 +1377,7 @@ class TMoverParameters
TDESchemeTable DElist; TDESchemeTable DElist;
TWiperSchemeTable WiperList; TWiperSchemeTable WiperList;
int WiperListSize; int WiperListSize;
int modernWpierListSize;
double Vadd = 1.0; double Vadd = 1.0;
TMPTRelayTable MPTRelay; TMPTRelayTable MPTRelay;
@@ -1774,9 +1775,23 @@ class TMoverParameters
// 2 - swiatla normalne // 2 - swiatla normalne
// 3 - swiatla dlugie przyciemnione // 3 - swiatla dlugie przyciemnione
// 4 - swiatla dlugie normalne // 4 - swiatla dlugie normalne
int modernDimmerState{0};
bool modernContainOffPos{true}; struct dimPosition
{
bool isOff = false;
bool isDimmed = false;
bool isHighBeam = false;
};
// default positions
std::vector<dimPosition> dimPositions = {{false, false, false}, // 0 - Not dimmed
{false, true, false}}; // 1 - Dimmed
int modernDimmerPosition{0};
int modernDimmerDefaultPosition{0};
//bool modernContainOffPos{true};
bool enableModernDimmer {false}; bool enableModernDimmer {false};
bool modernDimmerCanCycle {false};
// Barwa reflektora // Barwa reflektora
int refR{255}; // Czerwony int refR{255}; // Czerwony
@@ -2067,6 +2082,7 @@ private:
void LoadFIZ_FFList( std::string const &Input ); void LoadFIZ_FFList( std::string const &Input );
void LoadFIZ_WiperList(std::string const &Input); void LoadFIZ_WiperList(std::string const &Input);
void LoadFIZ_LightsList( std::string const &Input ); void LoadFIZ_LightsList( std::string const &Input );
void LoadFIZ_DimmerList(std::string const &Input);
void LoadFIZ_CompressorList(std::string const &Input); void LoadFIZ_CompressorList(std::string const &Input);
void LoadFIZ_PowerParamsDecode( TPowerParameters &Powerparameters, std::string const Prefix, std::string const &Input ); void LoadFIZ_PowerParamsDecode( TPowerParameters &Powerparameters, std::string const Prefix, std::string const &Input );
TPowerType LoadFIZ_PowerDecode( std::string const &Power ); TPowerType LoadFIZ_PowerDecode( std::string const &Power );
@@ -2088,6 +2104,7 @@ private:
bool readFFList( std::string const &line ); bool readFFList( std::string const &line );
bool readWWList( std::string const &line ); bool readWWList( std::string const &line );
bool readWiperList( std::string const &line ); bool readWiperList( std::string const &line );
bool readDimmerList(std::string const &line);
bool readLightsList( std::string const &Input ); bool readLightsList( std::string const &Input );
bool readCompressorList(std::string const &Input); bool readCompressorList(std::string const &Input);
void BrakeValveDecode( std::string const &s ); //Q 20160719 void BrakeValveDecode( std::string const &s ); //Q 20160719

View File

@@ -8927,7 +8927,7 @@ bool startBPT;
bool startMPT, startMPT0; bool startMPT, startMPT0;
bool startRLIST, startUCLIST; bool startRLIST, startUCLIST;
bool startDIZELMOMENTUMLIST, startDIZELV2NMAXLIST, startHYDROTCLIST, startPMAXLIST; bool startDIZELMOMENTUMLIST, startDIZELV2NMAXLIST, startHYDROTCLIST, startPMAXLIST;
bool startDLIST, startFFLIST, startWWLIST, startWiperList; bool startDLIST, startFFLIST, startWWLIST, startWiperList, startDimmerList;
bool startLIGHTSLIST; bool startLIGHTSLIST;
bool startCOMPRESSORLIST; bool startCOMPRESSORLIST;
int LISTLINE; int LISTLINE;
@@ -9298,6 +9298,22 @@ bool TMoverParameters::readWiperList(std::string const& line)
return true; return true;
} }
bool TMoverParameters::readDimmerList(std::string const& line)
{
cParser parser(line);
if (false == parser.getTokens(3, false))
{
WriteLog("Read DimmerList: arguments missing in line " + std::to_string(LISTLINE + 1));
return false;
}
int idx = LISTLINE++;
dimPosition dps;
parser >> dps.isHighBeam >> dps.isDimmed >> dps.isOff;
dimPositions.push_back(dps);
return true;
}
// parsowanie WWList // parsowanie WWList
bool TMoverParameters::readWWList( std::string const &line ) { bool TMoverParameters::readWWList( std::string const &line ) {
@@ -9482,6 +9498,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
startFFLIST = false; startFFLIST = false;
startWWLIST = false; startWWLIST = false;
startWiperList = false; startWiperList = false;
startDimmerList = false;
startLIGHTSLIST = false; startLIGHTSLIST = false;
startCOMPRESSORLIST = false; startCOMPRESSORLIST = false;
std::string file = TypeName + ".fiz"; std::string file = TypeName + ".fiz";
@@ -9589,6 +9606,13 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
startWiperList = false; startWiperList = false;
continue; continue;
} }
if (issection("endDimmerList", inputline))
{
// skonczylismy czytac liste konfiguracji pstryka od przyciemnienia
startBPT = false;
startDimmerList = false;
continue;
}
if( issection( "END-WWL", inputline ) ) { if( issection( "END-WWL", inputline ) ) {
startBPT = false; startBPT = false;
startWWLIST = false; startWWLIST = false;
@@ -9895,6 +9919,16 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
continue; continue;
} }
if (issection("DimmerList:", inputline))
{
dimPositions.clear(); // uzywamy customowej listy
startBPT = false;
startDimmerList = true;
fizlines.emplace("DimmerList", inputline);
LoadFIZ_DimmerList(inputline);
continue;
}
if( issection( "LightsList:", inputline ) ) { if( issection( "LightsList:", inputline ) ) {
startBPT = false; startBPT = false;
@@ -9967,6 +10001,10 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
readWiperList(inputline); readWiperList(inputline);
continue; continue;
} }
if (true == startDimmerList)
{
readDimmerList(inputline);
}
if( true == startLIGHTSLIST ) { if( true == startLIGHTSLIST ) {
readLightsList( inputline ); readLightsList( inputline );
continue; continue;
@@ -9988,11 +10026,10 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
else else
result = false; result = false;
if (!modernContainOffPos) // ustawiamy domyslna pozycje dimmera
modernDimmerState = 2; // jak nie ma opcji wylaczonej to niech sie odpali normalnie
if (!enableModernDimmer) if (!enableModernDimmer)
{ {
modernDimmerState = 2; modernDimmerPosition = modernDimmerDefaultPosition;
} }
WriteLog("CERROR: " + to_string(ConversionError) + ", SUCCES: " + to_string(result)); WriteLog("CERROR: " + to_string(ConversionError) + ", SUCCES: " + to_string(result));
@@ -11199,7 +11236,6 @@ void TMoverParameters::LoadFIZ_Switches( std::string const &Input ) {
extract_value( UniversalResetButtonFlag[ 1 ], "RelayResetButton2", Input, "" ); extract_value( UniversalResetButtonFlag[ 1 ], "RelayResetButton2", Input, "" );
extract_value( UniversalResetButtonFlag[ 2 ], "RelayResetButton3", Input, "" ); extract_value( UniversalResetButtonFlag[ 2 ], "RelayResetButton3", Input, "" );
extract_value(enableModernDimmer, "ModernDimmer", Input, ""); extract_value(enableModernDimmer, "ModernDimmer", Input, "");
extract_value(modernContainOffPos, "ModernDimmerOffPosition", Input, "");
// pantograph presets // pantograph presets
{ {
auto &presets { PantsPreset.first }; auto &presets { PantsPreset.first };
@@ -11329,6 +11365,12 @@ void TMoverParameters::LoadFIZ_WiperList(std::string const &Input)
extract_value(WiperAngle, "Angle", Input, ""); extract_value(WiperAngle, "Angle", Input, "");
} }
void TMoverParameters::LoadFIZ_DimmerList(std::string const &Input)
{
extract_value(modernWpierListSize, "Size", Input, "");
extract_value(modernDimmerCanCycle, "Cycle", Input, "");
extract_value(modernDimmerDefaultPosition, "DefaultPos", Input, "");
}
void TMoverParameters::LoadFIZ_LightsList( std::string const &Input ) { void TMoverParameters::LoadFIZ_LightsList( std::string const &Input ) {
extract_value( LightsPosNo, "Size", Input, "" ); extract_value( LightsPosNo, "Size", Input, "" );

View File

@@ -4890,34 +4890,47 @@ void TTrain::OnCommand_modernlightdimmerincrease(TTrain* Train, command_data con
if (Command.action == GLFW_PRESS) if (Command.action == GLFW_PRESS)
{ {
// update modern dimmer state // update modern dimmer state
if (Train->mvOccupied->modernDimmerState < 4)
Train->mvOccupied->modernDimmerState++; auto &dimPos = Train->mvOccupied->modernDimmerPosition;
auto dimCount = Train->mvOccupied->dimPositions.size();
if (dimPos + 1 < dimCount)
dimPos++;
else if (Train->mvOccupied->modernDimmerCanCycle)
dimPos = 0; // return to 0
else
return; // już na minimum i nie można cyklicznie
// update lightning
Train->Dynamic()->SetLights(); Train->Dynamic()->SetLights();
// visual feedback // visual feedback
if (Train->ggModernLightDimSw.SubModel != nullptr) if (Train->ggModernLightDimSw.SubModel != nullptr)
if (Train->mvOccupied->modernContainOffPos) Train->ggModernLightDimSw.UpdateValue(dimPos, Train->dsbSwitch);
Train->ggModernLightDimSw.UpdateValue(Train->mvOccupied->modernDimmerState, Train->dsbSwitch);
else
Train->ggModernLightDimSw.UpdateValue(Train->mvOccupied->modernDimmerState - 1, Train->dsbSwitch);
} }
} }
void TTrain::OnCommand_modernlightdimmerdecrease(TTrain *Train, command_data const &Command) void TTrain::OnCommand_modernlightdimmerdecrease(TTrain *Train, command_data const &Command)
{ {
if (!Train->mvOccupied->enableModernDimmer) if (!Train->mvOccupied->enableModernDimmer)
return; // if modern dimmer is disabled, skip entire command return; // jeśli dimmer jest wyłączony, olewamy
if (Command.action == GLFW_PRESS) if (Command.action == GLFW_PRESS)
{ {
byte minPos = (Train->mvOccupied->modernContainOffPos) ? 0 : 1; // prevent switching to 0 if its not enabled auto &dimPos = Train->mvOccupied->modernDimmerPosition;
// update modern dimmer state auto dimCount = Train->mvOccupied->dimPositions.size();
if (Train->mvOccupied->modernDimmerState > minPos)
Train->mvOccupied->modernDimmerState--; if (dimCount == 0)
Train->Dynamic()->SetLights(); return;
// visual feedback
if (Train->ggModernLightDimSw.SubModel != nullptr) if (dimPos > 0)
if (Train->mvOccupied->modernContainOffPos) dimPos--;
Train->ggModernLightDimSw.UpdateValue(Train->mvOccupied->modernDimmerState, Train->dsbSwitch); else if (Train->mvOccupied->modernDimmerCanCycle)
dimPos = static_cast<int>(dimCount - 1); // ostatnia pozycja
else else
Train->ggModernLightDimSw.UpdateValue(Train->mvOccupied->modernDimmerState - 1, Train->dsbSwitch); return; // już na minimum i nie można cyklicznie
Train->Dynamic()->SetLights();
if (Train->ggModernLightDimSw.SubModel != nullptr)
Train->ggModernLightDimSw.UpdateValue(dimPos, Train->dsbSwitch);
} }
} }
@@ -5104,7 +5117,7 @@ void TTrain::OnCommand_headlightsdimtoggle( TTrain *Train, command_data const &C
return; return;
if( Command.action == GLFW_PRESS ) { if( Command.action == GLFW_PRESS ) {
// only reacting to press, so the switch doesn't flip back and forth if key is held down // only reacting to press, so the switch doesn't flip back and forth if key is held down
if (Train->DynamicObject->MoverParameters->modernDimmerState == 2) if (Train->DynamicObject->MoverParameters->modernDimmerPosition == 0)
{ {
// turn on // turn on
OnCommand_headlightsdimenable( Train, Command ); OnCommand_headlightsdimenable( Train, Command );
@@ -5136,8 +5149,7 @@ void TTrain::OnCommand_headlightsdimenable( TTrain *Train, command_data const &C
Train->DynamicObject->DimHeadlights = true; Train->DynamicObject->DimHeadlights = true;
*/ */
WriteLog("Switch do 1"); Train->DynamicObject->MoverParameters->modernDimmerPosition = 1; // ustawiamy modern dimmer na flage przyciemnienia
Train->DynamicObject->MoverParameters->modernDimmerState = 1; // ustawiamy modern dimmer na flage przyciemnienia
Train->DynamicObject->RaLightsSet(Train->DynamicObject->MoverParameters->iLights[0], Train->DynamicObject->RaLightsSet(Train->DynamicObject->MoverParameters->iLights[0],
Train->DynamicObject->MoverParameters->iLights[1] Train->DynamicObject->MoverParameters->iLights[1]
); // aktualizacja swiatelek ); // aktualizacja swiatelek
@@ -5163,8 +5175,7 @@ void TTrain::OnCommand_headlightsdimdisable( TTrain *Train, command_data const &
Train->DynamicObject->DimHeadlights = false; Train->DynamicObject->DimHeadlights = false;
*/ */
WriteLog("Switch do 2"); Train->DynamicObject->MoverParameters->modernDimmerPosition = 0; // ustawiamy modern dimmer na flage rozjasnienia
Train->DynamicObject->MoverParameters->modernDimmerState = 2; // ustawiamy modern dimmer na flage rozjasnienia
Train->DynamicObject->RaLightsSet( Train->DynamicObject->RaLightsSet(
Train->DynamicObject->MoverParameters->iLights[0], Train->DynamicObject->MoverParameters->iLights[0],
Train->DynamicObject->MoverParameters->iLights[1] Train->DynamicObject->MoverParameters->iLights[1]
@@ -9937,10 +9948,8 @@ void TTrain::set_cab_controls( int const Cab ) {
} }
if (ggModernLightDimSw.SubModel != nullptr) { if (ggModernLightDimSw.SubModel != nullptr) {
if (mvOccupied->modernContainOffPos) mvOccupied->modernDimmerPosition = mvOccupied->modernDimmerDefaultPosition;
ggModernLightDimSw.PutValue(mvOccupied->modernDimmerState); ggModernLightDimSw.PutValue(mvOccupied->modernDimmerDefaultPosition);
else
ggModernLightDimSw.PutValue(mvOccupied->modernDimmerState - 1);
} }
// Init separate buttons // Init separate buttons
@@ -10081,8 +10090,8 @@ void TTrain::set_cab_controls( int const Cab ) {
ggRightLightButton.PutValue( -1.f ); ggRightLightButton.PutValue( -1.f );
} }
} }
if( 1 == DynamicObject->MoverParameters->modernDimmerState ) { if( 1 == DynamicObject->MoverParameters->modernDimmerPosition ) {
ggDimHeadlightsButton.PutValue( 1.f ); ggDimHeadlightsButton.PutValue(DynamicObject->MoverParameters->modernDimmerPosition);
} }
// cab lights // cab lights
if( true == Cabine[Cab].bLightDim ) { if( true == Cabine[Cab].bLightDim ) {