diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 00319af1..ac0242ad 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1050,7 +1050,7 @@ public: TPowerSource PowerSourceDecode(std::string s); //Q 20160719 TPowerType PowerDecode(std::string s); //Q 20160719 TEngineTypes EngineDecode(std::string s); //Q 20160721 - bool CreateBrakeSys(); //Q 20160722 + bool CreateBrakeSys(bool ReadyFlag = true); //Q 20160722 bool CheckLocomotiveParameters(bool ReadyFlag, int Dir); std::string EngineDescription(int what); }; diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 84ebcf1b..21154082 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -6874,276 +6874,296 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir) { - bool OK; - int b; - int DefBrakeTable[8] = {15, 4, 25, 25, 13, 3, 12, 2}; + WriteLog("check locomotive parameters..."); + int b; + bool OK = true; - OK = true; + AutoRelayFlag = (AutoRelayType == 1); - AutoRelayFlag = (AutoRelayType == 1); - Sand = SandCapacity; + Sand = SandCapacity; - // WriteLog("aa = " + AxleArangement + " " + std::string( Pos("o", AxleArangement)) ); + // WriteLog("aa = " + AxleArangement + " " + std::string( Pos("o", AxleArangement)) ); - // if ((Pos("o", AxleArangement) > 0) && (EngineType == ElectricSeriesMotor)) - // OK = (RList[1].Bn * RList[1].Mn == NPoweredAxles); //test poprawnosci ilosci osi - // indywidualnie napedzanych + if ((Pos("o", AxleArangement) > 0) && (EngineType == ElectricSeriesMotor)) + OK = (RList[1].Bn * RList[1].Mn == + NPoweredAxles); // test poprawnosci ilosci osi indywidualnie napedzanych + // WriteLogSS("aa ok", BoolToYN(OK)); - // if ((Pos(LoadType, LoadAccepted) == 0) && (LoadType != "")) - // { - // WriteLog("Load Accepted fail"); - // Load = 0; - // OK = false; - // } + if (BrakeSystem == Individual) + if (BrakeSubsystem != ss_None) + OK = false; //! - // if (BrakeSystem == Individual) - // if (BrakeSubsystem != ss_None) - // { - // WriteLog("BrakeSubsystem fail"); - // OK = false; //! - // } + if ((BrakeVVolume == 0) && (MaxBrakePress[3] > 0) && (BrakeSystem != Individual)) + BrakeVVolume = MaxBrakePress[3] / (5 - MaxBrakePress[3]) * + (BrakeCylRadius * BrakeCylRadius * BrakeCylDist * BrakeCylNo * PI) * 1000; + if (BrakeVVolume == 0) + BrakeVVolume = 0.01; - // if ((BrakeVVolume == 0) && (MaxBrakePress[3] > 0) && (BrakeSystem != Individual)) - // BrakeVVolume = MaxBrakePress[3] / (5 - MaxBrakePress[3]) * (BrakeCylRadius * BrakeCylRadius - // * BrakeCylDist * BrakeCylNo * PI) * 1000; - // if (BrakeVVolume == 0) BrakeVVolume = 0.01; - BrakeVVolume = 0.01; // q + // WriteLog("BVV = " + FloatToStr(BrakeVVolume)); - switch (BrakeValve) - { - case W: - case K: - { - Hamulec = new TWest(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA); - // if(MBPM<2) //jesli przystawka wazaca - // (dynamic_cast(Hamulec))->SetLP(0,MaxBrakePress[3],0); - // else - // (dynamic_cast(Hamulec))->SetLP(Mass, MBPM, MaxBrakePress[1]); - break; - } - case KE: - { - Hamulec = new TKE(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, - BrakeDelays, BrakeMethod, NAxles, NBpA); - // (dynamic_cast(Hamulec))->SetRM(RapidMult); - // if(MBPM<2) //jesli przystawka wazaca - // (dynamic_cast(Hamulec))->SetLP(0, MaxBrakePress[3], 0); - // else - // (dynamic_cast(Hamulec))->SetLP(Mass, MBPM, MaxBrakePress[1]); - break; - } - case NESt3: - case ESt3: - case ESt3AL2: - case ESt4: - { - Hamulec = new TNESt3(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA); - // (dynamic_cast(Hamulec))->SetSize(BrakeValveSize,BrakeValveParams); - // if(MBPM<2) //jesli przystawka wazaca - // (dynamic_cast(Hamulec))->SetLP(0, MaxBrakePress[3], 0); - // else - // (dynamic_cast(Hamulec))->SetLP(Mass, MBPM, MaxBrakePress[1]); - break; - } + if ((TestFlag(BrakeDelays, bdelay_G)) && + ((!TestFlag(BrakeDelays, bdelay_R)) || + (Power > 1))) // ustalanie srednicy przewodu glownego (lokomotywa lub napędowy + Spg = 0.792; + else + Spg = 0.507; - case LSt: - { - Hamulec = new TLSt(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, - BrakeDelays, BrakeMethod, NAxles, NBpA); - //(dynamic_cast(Hamulec))->SetRM(RapidMult); - break; - } - case EStED: - { - Hamulec = new TEStED(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA); - //(dynamic_cast(Hamulec))->SetRM(RapidMult); - break; - } - case EP2: - { - Hamulec = new TEStEP2(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA); - //(dynamic_cast(Hamulec))->SetLP(Mass, MBPM, MaxBrakePress[1]); - break; - } + // taki mini automat - powinno byc ladnie dobrze :) + BrakeDelayFlag = bdelay_P; + if ((TestFlag(BrakeDelays, bdelay_G)) && !(TestFlag(BrakeDelays, bdelay_R))) + BrakeDelayFlag = bdelay_G; + if ((TestFlag(BrakeDelays, bdelay_R)) && !(TestFlag(BrakeDelays, bdelay_G))) + BrakeDelayFlag = bdelay_R; - case CV1: - { - Hamulec = new TCV1(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, - BrakeDelays, BrakeMethod, NAxles, NBpA); - break; - } - case CV1_L_TR: - { - Hamulec = new TCV1L_TR(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA); - break; - } + int DefBrakeTable[8] = { 15, 4, 25, 25, 13, 3, 12, 2 }; - default: - Hamulec = new TBrake(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA); - } + // checking ready flag + // to dac potem do init + if (ReadyFlag) // gotowy do drogi + { + // WriteLog("Ready to depart"); + CompressedVolume = VeselVolume * MinCompressor * (9.8) / 10; + ScndPipePress = CompressedVolume / VeselVolume; + PipePress = CntrlPipePress; + BrakePress = 0; + LocalBrakePos = 0; - // Hamulec->SetASBP(MaxBrakePress[4]); + if (CabNo == 0) + BrakeCtrlPos = floor(Handle->GetPos(bh_NP)); // Q: TODO: Trunc na floor + else + BrakeCtrlPos = floor(Handle->GetPos(bh_RP)); + MainSwitch(false); + PantFront(true); + PantRear(true); + MainSwitch(true); + ActiveDir = 0; // Dir; //nastawnik kierunkowy - musi być ustawiane osobno! + DirAbsolute = ActiveDir * CabNo; // kierunek jazdy względem sprzęgów + LimPipePress = CntrlPipePress; + } + else + { // zahamowany} + WriteLog("Bracked"); + Volume = BrakeVVolume * MaxBrakePress[3]; + CompressedVolume = VeselVolume * MinCompressor * 0.55; + ScndPipePress = 5.1; + PipePress = LowPipePress; + PipeBrakePress = MaxBrakePress[3]; + BrakePress = MaxBrakePress[3]; + LocalBrakePos = 0; + BrakeCtrlPos = Trunc(Handle->GetPos(bh_NP)); // Q: TODO: Trunc na floor + LimPipePress = LowPipePress; + } - switch (BrakeHandle) - { - case FV4a: - Handle = new TFV4aM(); - break; - case FVel6: - Handle = new TFVel6(); - break; - case testH: - Handle = new Ttest(); - break; - case M394: - Handle = new TM394(); - break; - case Knorr: - Handle = new TH14K1(); - break; - case St113: - Handle = new TSt113(); - break; - default: - Handle = new TDriverHandle(); - } + if (LoadFlag > 0) + { + if (Load < MaxLoad * 0.45) + { + IncBrakeMult(); + IncBrakeMult(); + DecBrakeMult(); // TODO: przeinesiono do mover.cpp + if (Load < MaxLoad * 0.35) + DecBrakeMult(); + } + if (Load >= MaxLoad * 0.45) + { + IncBrakeMult(); // TODO: przeinesiono do mover.cpp + if (Load >= MaxLoad * 0.55) + IncBrakeMult(); + } + } - switch (BrakeLocHandle) - { - case FD1: - { - LocHandle = new TFD1(); - LocHandle->Init(MaxBrakePress[0]); - break; - } - case Knorr: - { - LocHandle = new TH1405(); - LocHandle->Init(MaxBrakePress[0]); - break; - } - default: - LocHandle = new TDriverHandle(); - } + if (BrakeOpModes & bom_PS) + BrakeOpModeFlag = bom_PS; + else + BrakeOpModeFlag = bom_PN; - // ustalanie srednicy przewodu glownego (lokomotywa lub napędowy - if ((TestFlag(BrakeDelays, bdelay_G)) && ((!TestFlag(BrakeDelays, bdelay_R)) || (Power > 1))) - Spg = 0.792; - else - Spg = 0.507; + // yB: jesli pojazdy nie maja zadeklarowanych czasow, to wsadz z przepisow +-16,(6)% + for (b = 1; b < 4; b++) + { + if (BrakeDelay[b] == 0) + BrakeDelay[b] = DefBrakeTable[b]; + BrakeDelay[b] = BrakeDelay[b] * (2.5 + Random(0.0, 0.2)) / 3.0; + } - Pipe = new TReservoir(); - Pipe2 = new TReservoir(); // zabezpieczenie, bo sie PG wywala... :( - Pipe->CreateCap((Max0R(Dim.L, 14) + 0.5) * Spg * 1); // dlugosc x przekroj x odejscia i takie - // tam - Pipe2->CreateCap((Max0R(Dim.L, 14) + 0.5) * Spg * 1); + // WriteLog("SPG = " + FloatToStr(Spg)); - if (LightsPosNo > 0) - LightsPos = LightsDefPos; + switch (BrakeValve) + { + case W: + case K: + { + WriteLog("XBT W, K"); + Hamulec = new TWest(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + if (MBPM < 2) // jesli przystawka wazaca + Hamulec->SetLP(0, MaxBrakePress[3], 0); + else + Hamulec->SetLP(Mass, MBPM, MaxBrakePress[1]); + break; + } + case KE: + { + WriteLog("XBT WKE"); + Hamulec = new TKE(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, + BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, HighPipePress, + LowPipePress, BrakePress, BrakeDelayFlag); + Hamulec->SetRM(RapidMult); + if (MBPM < 2) // jesli przystawka wazaca + Hamulec->SetLP(0, MaxBrakePress[3], 0); + else + Hamulec->SetLP(Mass, MBPM, MaxBrakePress[1]); + break; + } + case NESt3: + case ESt3: + case ESt3AL2: + case ESt4: + { + WriteLog("XBT NESt3, ESt3, ESt3AL2, ESt4"); + Hamulec = new TNESt3(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + (static_cast(Hamulec))->SetSize(BrakeValveSize, BrakeValveParams); + if (MBPM < 2) // jesli przystawka wazaca + Hamulec->SetLP(0, MaxBrakePress[3], 0); + else + Hamulec->SetLP(Mass, MBPM, MaxBrakePress[1]); + break; + } - // to dac potem do init + case LSt: + { + WriteLog("XBT LSt"); + Hamulec = new TLSt(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, + BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, HighPipePress, + LowPipePress, BrakePress, BrakeDelayFlag); + Hamulec->SetRM(RapidMult); + break; + } + case EStED: + { + WriteLog("XBT EStED"); + Hamulec = new TEStED(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + Hamulec->SetRM(RapidMult); + break; + } + case EP2: + { + WriteLog("XBT EP2"); + Hamulec = new TEStEP2(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + Hamulec->SetLP(Mass, MBPM, MaxBrakePress[1]); + break; + } - if (ReadyFlag) // gotowy do drogi - { - WriteLog("Ready to depart"); - CompressedVolume = VeselVolume * MinCompressor * (9.8) / 10; - ScndPipePress = CompressedVolume / VeselVolume; - PipePress = CntrlPipePress; - BrakePress = 0; - LocalBrakePos = 0; + case CV1: + { + WriteLog("XBT CV1"); + Hamulec = new TCV1(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, + BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, HighPipePress, + LowPipePress, BrakePress, BrakeDelayFlag); + break; + } + case CV1_L_TR: + { + WriteLog("XBT CV1_L_T"); + Hamulec = new TCV1L_TR(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + break; + } - if (CabNo == 0) - BrakeCtrlPos = floor(Handle->GetPos(bh_NP)); // Q: TODO: Trunc na floor - else - BrakeCtrlPos = floor(Handle->GetPos(bh_RP)); - MainSwitch(false); - PantFront(true); - PantRear(true); - MainSwitch(true); - ActiveDir = 0; // Dir; //nastawnik kierunkowy - musi być ustawiane osobno! - DirAbsolute = ActiveDir * CabNo; // kierunek jazdy względem sprzęgów - LimPipePress = CntrlPipePress; - } - else - { // zahamowany} - WriteLog("Bracked"); - // Volume = BrakeVVolume * MaxBrakePress[3]; - // CompressedVolume = VeselVolume * MinCompressor * 0.55; - // ScndPipePress = 5.1; - // PipePress = LowPipePress; - // PipeBrakePress = MaxBrakePress[3]; - // BrakePress = MaxBrakePress[3]; - // LocalBrakePos = 0; - // BrakeCtrlPos = floor(Handle->GetPos(bh_NP)); //Q: TODO: Trunc na floor - // LimPipePress = LowPipePress; - } + default: + Hamulec = new TBrake(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + } - // ActFlowSpeed = 0; - // BrakeCtrlPosR = BrakeCtrlPos; + Hamulec->SetASBP(MaxBrakePress[4]); - // if (BrakeLocHandle == Knorr) - // LocalBrakePos = 5; + switch (BrakeHandle) + { + case FV4a: + Handle = new TFV4aM(); + break; + case FVel6: + Handle = new TFVel6(); + break; + case testH: + Handle = new Ttest(); + break; + case M394: + Handle = new TM394(); + break; + case Knorr: + Handle = new TH14K1(); + break; + case St113: + Handle = new TSt113(); + break; + default: + Handle = new TDriverHandle(); + } - // Pipe->CreatePress(PipePress); - // Pipe2->CreatePress(ScndPipePress); - // Pipe->Act(); - // Pipe2->Act(); + switch (BrakeLocHandle) + { + case FD1: + { + LocHandle = new TFD1(); + LocHandle->Init(MaxBrakePress[0]); + break; + } + case Knorr: + { + LocHandle = new TH1405(); + LocHandle->Init(MaxBrakePress[0]); + break; + } + default: + LocHandle = new TDriverHandle(); + } - // EqvtPipePress = PipePress; + Pipe = new TReservoir(); + Pipe2 = new TReservoir(); // zabezpieczenie, bo sie PG wywala... :( + Pipe->CreateCap((Max0R(Dim.L, 14) + 0.5) * Spg * 1); // dlugosc x przekroj x odejscia i takie + // tam + Pipe2->CreateCap((Max0R(Dim.L, 14) + 0.5) * Spg * 1); - // Handle->Init(PipePress); + if (LightsPosNo > 0) + LightsPos = LightsDefPos; - //--ComputeConstans(); // TODO: - //przeinesiono do mover.cpp + ActFlowSpeed = 0; + BrakeCtrlPosR = BrakeCtrlPos; - if (LoadFlag > 0) - { - if (Load < MaxLoad * 0.45) - { - IncBrakeMult(); - IncBrakeMult(); - DecBrakeMult(); // TODO: przeinesiono do mover.cpp - if (Load < MaxLoad * 0.35) - DecBrakeMult(); - } - if (Load >= MaxLoad * 0.45) - { - IncBrakeMult(); // TODO: przeinesiono do mover.cpp - if (Load >= MaxLoad * 0.55) - IncBrakeMult(); - } - } + if (BrakeLocHandle == Knorr) + LocalBrakePos = 5; - // taki mini automat - powinno byc ladnie dobrze :) - // BrakeDelayFlag = bdelay_P; - // if ((TestFlag(BrakeDelays, bdelay_G)) && !(TestFlag(BrakeDelays, bdelay_R))) - // BrakeDelayFlag = bdelay_G; - // if ((TestFlag(BrakeDelays, bdelay_R)) && !(TestFlag(BrakeDelays, bdelay_G))) - // BrakeDelayFlag = bdelay_R; + Pipe->CreatePress(PipePress); + Pipe2->CreatePress(ScndPipePress); + Pipe->Act(); + Pipe2->Act(); - // yB: jesli pojazdy nie maja zadeklarowanych czasow, to wsadz z przepisow +-16,(6)% - // for ( b=1; b<4; b++) - // { - // if (BrakeDelay[b] == 0) - // BrakeDelay[b] = DefBrakeTable[b]; - // BrakeDelay[b] = BrakeDelay[b] * (2.5 + random(0.0, 0.2)) / 3.0; - // } + EqvtPipePress = PipePress; - // if(TrainType == dt_ET22) - // CompressorPower = 0; + Handle->Init(PipePress); - // Hamulec->Init(PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + ComputeConstans(); - // ScndPipePress = Compressor; - WriteLog("OK=" + to_string(OK)); + if (TrainType == dt_ET22) + CompressorPower = 0; - return OK; + // Hamulec->Init(PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + + ScndPipePress = Compressor; + + // WriteLogSS("OK=", BoolTo10(OK)); + // WriteLog(""); + + return OK; } // ************************************************************************************************* @@ -7151,7 +7171,7 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir) // Funkcja pelniaca role pierwotnej CheckLocomotiveParameters(bool ReadyFlag, int Dir) // wywolywana w dynobj.cpp w double TDynamicObject::Init() // ************************************************************************************************* -bool TMoverParameters::CreateBrakeSys() +bool TMoverParameters::CreateBrakeSys(bool ReadyFlag) { WriteLog("check locomotive parameters..."); int b; @@ -7187,6 +7207,83 @@ bool TMoverParameters::CreateBrakeSys() else Spg = 0.507; + // taki mini automat - powinno byc ladnie dobrze :) + BrakeDelayFlag = bdelay_P; + if ((TestFlag(BrakeDelays, bdelay_G)) && !(TestFlag(BrakeDelays, bdelay_R))) + BrakeDelayFlag = bdelay_G; + if ((TestFlag(BrakeDelays, bdelay_R)) && !(TestFlag(BrakeDelays, bdelay_G))) + BrakeDelayFlag = bdelay_R; + + int DefBrakeTable[8] = {15, 4, 25, 25, 13, 3, 12, 2}; + + // checking ready flag + // to dac potem do init + if (ReadyFlag) // gotowy do drogi + { + // WriteLog("Ready to depart"); + CompressedVolume = VeselVolume * MinCompressor * (9.8) / 10; + ScndPipePress = CompressedVolume / VeselVolume; + PipePress = CntrlPipePress; + BrakePress = 0; + LocalBrakePos = 0; + + if (CabNo == 0) + BrakeCtrlPos = floor(Handle->GetPos(bh_NP)); // Q: TODO: Trunc na floor + else + BrakeCtrlPos = floor(Handle->GetPos(bh_RP)); + MainSwitch(false); + PantFront(true); + PantRear(true); + MainSwitch(true); + ActiveDir = 0; // Dir; //nastawnik kierunkowy - musi być ustawiane osobno! + DirAbsolute = ActiveDir * CabNo; // kierunek jazdy względem sprzęgów + LimPipePress = CntrlPipePress; + } + else + { // zahamowany} + WriteLog("Bracked"); + Volume = BrakeVVolume * MaxBrakePress[3]; + CompressedVolume = VeselVolume * MinCompressor * 0.55; + ScndPipePress = 5.1; + PipePress = LowPipePress; + PipeBrakePress = MaxBrakePress[3]; + BrakePress = MaxBrakePress[3]; + LocalBrakePos = 0; + BrakeCtrlPos = Trunc(Handle->GetPos(bh_NP)); // Q: TODO: Trunc na floor + LimPipePress = LowPipePress; + } + + if (LoadFlag > 0) + { + if (Load < MaxLoad * 0.45) + { + IncBrakeMult(); + IncBrakeMult(); + DecBrakeMult(); // TODO: przeinesiono do mover.cpp + if (Load < MaxLoad * 0.35) + DecBrakeMult(); + } + if (Load >= MaxLoad * 0.45) + { + IncBrakeMult(); // TODO: przeinesiono do mover.cpp + if (Load >= MaxLoad * 0.55) + IncBrakeMult(); + } + } + + if (BrakeOpModes & bom_PS) + BrakeOpModeFlag = bom_PS; + else + BrakeOpModeFlag = bom_PN; + + // yB: jesli pojazdy nie maja zadeklarowanych czasow, to wsadz z przepisow +-16,(6)% + for (b = 1; b < 4; b++) + { + if (BrakeDelay[b] == 0) + BrakeDelay[b] = DefBrakeTable[b]; + BrakeDelay[b] = BrakeDelay[b] * (2.5 + Random(0.0, 0.2)) / 3.0; + } + // WriteLog("SPG = " + FloatToStr(Spg)); switch (BrakeValve) @@ -7196,25 +7293,25 @@ bool TMoverParameters::CreateBrakeSys() { WriteLog("XBT W, K"); Hamulec = new TWest(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, - PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); if (MBPM < 2) // jesli przystawka wazaca - (static_cast(Hamulec))->SetLP(0, MaxBrakePress[3], 0); + Hamulec->SetLP(0, MaxBrakePress[3], 0); else - (static_cast(Hamulec))->SetLP(Mass, MBPM, MaxBrakePress[1]); + Hamulec->SetLP(Mass, MBPM, MaxBrakePress[1]); break; } case KE: { WriteLog("XBT WKE"); Hamulec = new TKE(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, - BrakeDelays, BrakeMethod, NAxles, NBpA, - PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); - (static_cast(Hamulec))->SetRM(RapidMult); + BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, HighPipePress, + LowPipePress, BrakePress, BrakeDelayFlag); + Hamulec->SetRM(RapidMult); if (MBPM < 2) // jesli przystawka wazaca - (static_cast(Hamulec))->SetLP(0, MaxBrakePress[3], 0); + Hamulec->SetLP(0, MaxBrakePress[3], 0); else - (static_cast(Hamulec))->SetLP(Mass, MBPM, MaxBrakePress[1]); + Hamulec->SetLP(Mass, MBPM, MaxBrakePress[1]); break; } case NESt3: @@ -7224,13 +7321,13 @@ bool TMoverParameters::CreateBrakeSys() { WriteLog("XBT NESt3, ESt3, ESt3AL2, ESt4"); Hamulec = new TNESt3(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, - PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); (static_cast(Hamulec))->SetSize(BrakeValveSize, BrakeValveParams); if (MBPM < 2) // jesli przystawka wazaca - (static_cast(Hamulec))->SetLP(0, MaxBrakePress[3], 0); + Hamulec->SetLP(0, MaxBrakePress[3], 0); else - (static_cast(Hamulec))->SetLP(Mass, MBPM, MaxBrakePress[1]); + Hamulec->SetLP(Mass, MBPM, MaxBrakePress[1]); break; } @@ -7238,27 +7335,27 @@ bool TMoverParameters::CreateBrakeSys() { WriteLog("XBT LSt"); Hamulec = new TLSt(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, - BrakeDelays, BrakeMethod, NAxles, NBpA, - PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); - (static_cast(Hamulec))->SetRM(RapidMult); + BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, HighPipePress, + LowPipePress, BrakePress, BrakeDelayFlag); + Hamulec->SetRM(RapidMult); break; } case EStED: { WriteLog("XBT EStED"); Hamulec = new TEStED(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, - PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); - (static_cast(Hamulec))->SetRM(RapidMult); + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + Hamulec->SetRM(RapidMult); break; } case EP2: { WriteLog("XBT EP2"); Hamulec = new TEStEP2(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, - PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); - (static_cast(Hamulec))->SetLP(Mass, MBPM, MaxBrakePress[1]); + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + Hamulec->SetLP(Mass, MBPM, MaxBrakePress[1]); break; } @@ -7266,23 +7363,23 @@ bool TMoverParameters::CreateBrakeSys() { WriteLog("XBT CV1"); Hamulec = new TCV1(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, BrakeCylNo, - BrakeDelays, BrakeMethod, NAxles, NBpA, - PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, HighPipePress, + LowPipePress, BrakePress, BrakeDelayFlag); break; } case CV1_L_TR: { WriteLog("XBT CV1_L_T"); Hamulec = new TCV1L_TR(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, - PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); break; } default: Hamulec = new TBrake(MaxBrakePress[3], BrakeCylRadius, BrakeCylDist, BrakeVVolume, - BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, - PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + BrakeCylNo, BrakeDelays, BrakeMethod, NAxles, NBpA, PipePress, + HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); } Hamulec->SetASBP(MaxBrakePress[4]); @@ -7332,55 +7429,17 @@ bool TMoverParameters::CreateBrakeSys() Pipe = new TReservoir(); Pipe2 = new TReservoir(); // zabezpieczenie, bo sie PG wywala... :( Pipe->CreateCap((Max0R(Dim.L, 14) + 0.5) * Spg * 1); // dlugosc x przekroj x odejscia i takie - // tam + // tam Pipe2->CreateCap((Max0R(Dim.L, 14) + 0.5) * Spg * 1); if (LightsPosNo > 0) LightsPos = LightsDefPos; - // checking ready flag - // to dac potem do init - bool ReadyFlag = true; - if (ReadyFlag) // gotowy do drogi - { - // WriteLog("Ready to depart"); - CompressedVolume = VeselVolume * MinCompressor * (9.8) / 10; - ScndPipePress = CompressedVolume / VeselVolume; - PipePress = CntrlPipePress; - BrakePress = 0; - LocalBrakePos = 0; - - if (CabNo == 0) - BrakeCtrlPos = floor(Handle->GetPos(bh_NP)); // Q: TODO: Trunc na floor - else - BrakeCtrlPos = floor(Handle->GetPos(bh_RP)); - MainSwitch(false); - PantFront(true); - PantRear(true); - MainSwitch(true); - ActiveDir = 0; // Dir; //nastawnik kierunkowy - musi być ustawiane osobno! - DirAbsolute = ActiveDir * CabNo; // kierunek jazdy względem sprzęgów - LimPipePress = CntrlPipePress; - } - else - { // zahamowany} - // WriteLog("Bracked"); - // Volume = BrakeVVolume * MaxBrakePress[3]; - // CompressedVolume = VeselVolume * MinCompressor * 0.55; - // ScndPipePress = 5.1; - // PipePress = LowPipePress; - // PipeBrakePress = MaxBrakePress[3]; - // BrakePress = MaxBrakePress[3]; - // LocalBrakePos = 0; - // BrakeCtrlPos = Trunc(Handle->GetPos(bh_NP)); //Q: TODO: Trunc na floor - // LimPipePress = LowPipePress; - } - ActFlowSpeed = 0; BrakeCtrlPosR = BrakeCtrlPos; - // if(BrakeLocHandle==Knorr) - // LocalBrakePos =5; + if (BrakeLocHandle == Knorr) + LocalBrakePos = 5; Pipe->CreatePress(PipePress); Pipe2->CreatePress(ScndPipePress); @@ -7391,32 +7450,17 @@ bool TMoverParameters::CreateBrakeSys() Handle->Init(PipePress); - // taki mini automat - powinno byc ladnie dobrze :) - BrakeDelayFlag = bdelay_P; - if ((TestFlag(BrakeDelays, bdelay_G)) && !(TestFlag(BrakeDelays, bdelay_R))) - BrakeDelayFlag = bdelay_G; - if ((TestFlag(BrakeDelays, bdelay_R)) && !(TestFlag(BrakeDelays, bdelay_G))) - BrakeDelayFlag = bdelay_R; + ComputeConstans(); - int DefBrakeTable[8] = {15, 4, 25, 25, 13, 3, 12, 2}; + if (TrainType == dt_ET22) + CompressorPower = 0; - // yB: jesli pojazdy nie maja zadeklarowanych czasow, to wsadz z przepisow +-16,(6)% - // for ( b=1; b<4; b++) - // { - // if (BrakeDelay[b] == 0) - // BrakeDelay[b] = DefBrakeTable[b]; - // BrakeDelay[b] = BrakeDelay[b] * (2.5 + random(0.0, 0.2)) / 3.0; - // } - - // if(TrainType == dt_ET22) - // CompressorPower = 0; - - //Hamulec->Init(PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); + // Hamulec->Init(PipePress, HighPipePress, LowPipePress, BrakePress, BrakeDelayFlag); ScndPipePress = Compressor; // WriteLogSS("OK=", BoolTo10(OK)); - //WriteLog(""); + // WriteLog(""); return OK; } diff --git a/McZapkie/Oerlikon_ESt.cpp b/McZapkie/Oerlikon_ESt.cpp index 3341c1a9..db1da53e 100644 --- a/McZapkie/Oerlikon_ESt.cpp +++ b/McZapkie/Oerlikon_ESt.cpp @@ -322,7 +322,7 @@ void TNESt3::EStParams(double i_crc) // parametry charakterystyczne dla ESt { } -void TNESt3::Init(double PP, double HPP, double LPP, double BP, unsigned char BDF) +void TNESt3::Init(double PP, double HPP, double LPP, double BP, int BDF) { ValveRes->CreatePress(1 * PP); BrakeCyl->CreatePress(1 * BP); diff --git a/McZapkie/Oerlikon_ESt.h b/McZapkie/Oerlikon_ESt.h index c27b2200..de6a3f9a 100644 --- a/McZapkie/Oerlikon_ESt.h +++ b/McZapkie/Oerlikon_ESt.h @@ -184,14 +184,19 @@ class TNESt3 : public TBrake bool autom; // odluzniacz samoczynny double LBP; // cisnienie hamulca pomocniczego + void Init(double PP, double HPP, double LPP, double BP, int BDF) /*override*/; + public: inline TNESt3(double i_mbp, double i_bcr, double i_bcd, double i_brc, - int i_bcn, int i_BD, int i_mat, int i_ba, int i_nbpa) : TBrake(i_mbp, i_bcr, i_bcd, i_brc, i_bcn - , i_BD, i_mat, i_ba, i_nbpa) { } + int i_bcn, int i_BD, int i_mat, int i_ba, int i_nbpa, + double PP, double HPP, double LPP, double BP, int BDF) : TBrake(i_mbp, i_bcr, i_bcd, i_brc, i_bcn + , i_BD, i_mat, i_ba, i_nbpa, PP, HPP, LPP, BP, BDF) + { + Init(PP, HPP, LPP, BP, BDF); + } virtual double GetPF(double PP, double dt, double Vel) /*override*/; // przeplyw miedzy komora wstepna i PG void EStParams(double i_crc); // parametry charakterystyczne dla ESt - virtual void Init(double PP, double HPP, double LPP, double BP, unsigned char BDF) /*override*/; virtual double GetCRP() /*override*/; void CheckState(double BCP, double &dV1); // glowny przyrzad rozrzadczy void CheckReleaser(double dt); // odluzniacz diff --git a/McZapkie/hamulce.h b/McZapkie/hamulce.h index 2ca5335a..9818a9c3 100644 --- a/McZapkie/hamulce.h +++ b/McZapkie/hamulce.h @@ -219,6 +219,8 @@ Knorr/West EP - bool SetBDF(int nBDF); //nastawiacz GPRM void Releaser(int state); //odluzniacz virtual void SetEPS(double nEPS); //hamulec EP + virtual void SetRM(double RMR) {}; //ustalenie przelozenia rapida + virtual void SetLP(double TM, double LM, double TBP) {}; //parametry przystawki wazacej void ASB(int state); //hamulec przeciwposlizgowy int GetStatus(); //flaga statusu, moze sie przydac do odglosow void SetASBP(double Press); //ustalenie cisnienia pp