16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-17 23:39: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,42 +7366,36 @@ 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 tRight = MoverParameters->iLights[vehicleend] & (light::auxiliary_right | light::headlight_right); // a tu z prawej
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
HighBeamLights = false;
DimHeadlights = false;
break;
case 1:
// przyciemnione normalne
DimHeadlights = true; // odpalamy przyciemnienie normalnych reflektorow
HighBeamLights = false;
break;
case 3:
// dlugie przyciemnione
DimHeadlights = true;
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;
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;
}
// obsługa przyciemnionych
DimHeadlights = dps.isDimmed;
// obsługa długich
if (dps.isHighBeam)
{
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
}
}
}

View File

@@ -1377,6 +1377,7 @@ class TMoverParameters
TDESchemeTable DElist;
TWiperSchemeTable WiperList;
int WiperListSize;
int modernWpierListSize;
double Vadd = 1.0;
TMPTRelayTable MPTRelay;
@@ -1774,9 +1775,23 @@ class TMoverParameters
// 2 - swiatla normalne
// 3 - swiatla dlugie przyciemnione
// 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 modernDimmerCanCycle {false};
// Barwa reflektora
int refR{255}; // Czerwony
@@ -2067,6 +2082,7 @@ private:
void LoadFIZ_FFList( std::string const &Input );
void LoadFIZ_WiperList(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_PowerParamsDecode( TPowerParameters &Powerparameters, std::string const Prefix, std::string const &Input );
TPowerType LoadFIZ_PowerDecode( std::string const &Power );
@@ -2088,6 +2104,7 @@ private:
bool readFFList( std::string const &line );
bool readWWList( std::string const &line );
bool readWiperList( std::string const &line );
bool readDimmerList(std::string const &line);
bool readLightsList( std::string const &Input );
bool readCompressorList(std::string const &Input);
void BrakeValveDecode( std::string const &s ); //Q 20160719

View File

@@ -8927,7 +8927,7 @@ bool startBPT;
bool startMPT, startMPT0;
bool startRLIST, startUCLIST;
bool startDIZELMOMENTUMLIST, startDIZELV2NMAXLIST, startHYDROTCLIST, startPMAXLIST;
bool startDLIST, startFFLIST, startWWLIST, startWiperList;
bool startDLIST, startFFLIST, startWWLIST, startWiperList, startDimmerList;
bool startLIGHTSLIST;
bool startCOMPRESSORLIST;
int LISTLINE;
@@ -9298,6 +9298,22 @@ bool TMoverParameters::readWiperList(std::string const& line)
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
bool TMoverParameters::readWWList( std::string const &line ) {
@@ -9482,6 +9498,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
startFFLIST = false;
startWWLIST = false;
startWiperList = false;
startDimmerList = false;
startLIGHTSLIST = false;
startCOMPRESSORLIST = false;
std::string file = TypeName + ".fiz";
@@ -9589,6 +9606,13 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
startWiperList = false;
continue;
}
if (issection("endDimmerList", inputline))
{
// skonczylismy czytac liste konfiguracji pstryka od przyciemnienia
startBPT = false;
startDimmerList = false;
continue;
}
if( issection( "END-WWL", inputline ) ) {
startBPT = false;
startWWLIST = false;
@@ -9895,6 +9919,16 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
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 ) ) {
startBPT = false;
@@ -9967,6 +10001,10 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
readWiperList(inputline);
continue;
}
if (true == startDimmerList)
{
readDimmerList(inputline);
}
if( true == startLIGHTSLIST ) {
readLightsList( inputline );
continue;
@@ -9988,11 +10026,10 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
else
result = false;
if (!modernContainOffPos)
modernDimmerState = 2; // jak nie ma opcji wylaczonej to niech sie odpali normalnie
// ustawiamy domyslna pozycje dimmera
if (!enableModernDimmer)
{
modernDimmerState = 2;
modernDimmerPosition = modernDimmerDefaultPosition;
}
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[ 2 ], "RelayResetButton3", Input, "" );
extract_value(enableModernDimmer, "ModernDimmer", Input, "");
extract_value(modernContainOffPos, "ModernDimmerOffPosition", Input, "");
// pantograph presets
{
auto &presets { PantsPreset.first };
@@ -11329,6 +11365,12 @@ void TMoverParameters::LoadFIZ_WiperList(std::string const &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 ) {
extract_value( LightsPosNo, "Size", Input, "" );

View File

@@ -4890,35 +4890,48 @@ void TTrain::OnCommand_modernlightdimmerincrease(TTrain* Train, command_data con
if (Command.action == GLFW_PRESS)
{
// update modern dimmer state
if (Train->mvOccupied->modernDimmerState < 4)
Train->mvOccupied->modernDimmerState++;
Train->Dynamic()->SetLights();
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();
// visual feedback
if (Train->ggModernLightDimSw.SubModel != nullptr)
if (Train->mvOccupied->modernContainOffPos)
Train->ggModernLightDimSw.UpdateValue(Train->mvOccupied->modernDimmerState, Train->dsbSwitch);
else
Train->ggModernLightDimSw.UpdateValue(Train->mvOccupied->modernDimmerState - 1, Train->dsbSwitch);
Train->ggModernLightDimSw.UpdateValue(dimPos, Train->dsbSwitch);
}
}
void TTrain::OnCommand_modernlightdimmerdecrease(TTrain *Train, command_data const &Command)
{
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)
{
byte minPos = (Train->mvOccupied->modernContainOffPos) ? 0 : 1; // prevent switching to 0 if its not enabled
// update modern dimmer state
if (Train->mvOccupied->modernDimmerState > minPos)
Train->mvOccupied->modernDimmerState--;
Train->Dynamic()->SetLights();
// visual feedback
auto &dimPos = Train->mvOccupied->modernDimmerPosition;
auto dimCount = Train->mvOccupied->dimPositions.size();
if (dimCount == 0)
return;
if (dimPos > 0)
dimPos--;
else if (Train->mvOccupied->modernDimmerCanCycle)
dimPos = static_cast<int>(dimCount - 1); // ostatnia pozycja
else
return; // już na minimum i nie można cyklicznie
Train->Dynamic()->SetLights();
if (Train->ggModernLightDimSw.SubModel != nullptr)
if (Train->mvOccupied->modernContainOffPos)
Train->ggModernLightDimSw.UpdateValue(Train->mvOccupied->modernDimmerState, Train->dsbSwitch);
else
Train->ggModernLightDimSw.UpdateValue(Train->mvOccupied->modernDimmerState - 1, Train->dsbSwitch);
}
Train->ggModernLightDimSw.UpdateValue(dimPos, Train->dsbSwitch);
}
}
void TTrain::OnCommand_redmarkertogglerearleft( TTrain *Train, command_data const &Command ) {
@@ -5104,7 +5117,7 @@ void TTrain::OnCommand_headlightsdimtoggle( TTrain *Train, command_data const &C
return;
if( Command.action == GLFW_PRESS ) {
// 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
OnCommand_headlightsdimenable( Train, Command );
@@ -5136,8 +5149,7 @@ void TTrain::OnCommand_headlightsdimenable( TTrain *Train, command_data const &C
Train->DynamicObject->DimHeadlights = true;
*/
WriteLog("Switch do 1");
Train->DynamicObject->MoverParameters->modernDimmerState = 1; // ustawiamy modern dimmer na flage przyciemnienia
Train->DynamicObject->MoverParameters->modernDimmerPosition = 1; // ustawiamy modern dimmer na flage przyciemnienia
Train->DynamicObject->RaLightsSet(Train->DynamicObject->MoverParameters->iLights[0],
Train->DynamicObject->MoverParameters->iLights[1]
); // aktualizacja swiatelek
@@ -5163,8 +5175,7 @@ void TTrain::OnCommand_headlightsdimdisable( TTrain *Train, command_data const &
Train->DynamicObject->DimHeadlights = false;
*/
WriteLog("Switch do 2");
Train->DynamicObject->MoverParameters->modernDimmerState = 2; // ustawiamy modern dimmer na flage rozjasnienia
Train->DynamicObject->MoverParameters->modernDimmerPosition = 0; // ustawiamy modern dimmer na flage rozjasnienia
Train->DynamicObject->RaLightsSet(
Train->DynamicObject->MoverParameters->iLights[0],
Train->DynamicObject->MoverParameters->iLights[1]
@@ -9937,10 +9948,8 @@ void TTrain::set_cab_controls( int const Cab ) {
}
if (ggModernLightDimSw.SubModel != nullptr) {
if (mvOccupied->modernContainOffPos)
ggModernLightDimSw.PutValue(mvOccupied->modernDimmerState);
else
ggModernLightDimSw.PutValue(mvOccupied->modernDimmerState - 1);
mvOccupied->modernDimmerPosition = mvOccupied->modernDimmerDefaultPosition;
ggModernLightDimSw.PutValue(mvOccupied->modernDimmerDefaultPosition);
}
// Init separate buttons
@@ -10081,8 +10090,8 @@ void TTrain::set_cab_controls( int const Cab ) {
ggRightLightButton.PutValue( -1.f );
}
}
if( 1 == DynamicObject->MoverParameters->modernDimmerState ) {
ggDimHeadlightsButton.PutValue( 1.f );
if( 1 == DynamicObject->MoverParameters->modernDimmerPosition ) {
ggDimHeadlightsButton.PutValue(DynamicObject->MoverParameters->modernDimmerPosition);
}
// cab lights
if( true == Cabine[Cab].bLightDim ) {