コード例 #1
0
ファイル: AirBrake.cs プロジェクト: mspielberg/dv-airbrake
        private static void ApplyBrakingForce(BrakeSystem car, ExtraBrakeState state)
        {
            var cylinderBrakingFactor   = Mathf.InverseLerp(Main.settings.returnSpringStrength, Constants.FullApplicationPressure, state.cylinderPressure);
            var mechanicalBrakingFactor = GetMechanicalBrakeFactor(car);

            car.brakingFactor = Mathf.Max(mechanicalBrakingFactor, cylinderBrakingFactor);
        }
コード例 #2
0
 public override string GetFullStatus(BrakeSystem lastCarBrakeSystem, Dictionary <BrakeSystemComponent, PressureUnit> units)
 {
     // display differently depending upon whether vacuum or air braked system
     if (Car.CarBrakeSystemType == "vacuum_piped")
     {
         var s = $" {Simulator.Catalog.GetString("V")} {FormatStrings.FormatPressure(Car.Train.EqualReservoirPressurePSIorInHg, PressureUnit.InHg, PressureUnit.InHg, true)}";
         if (lastCarBrakeSystem != null && lastCarBrakeSystem != this)
         {
             s += $" {Simulator.Catalog.GetString("EOT")} {lastCarBrakeSystem.GetStatus(units)}";
         }
         if (HandbrakePercent > 0)
         {
             s += $" {Simulator.Catalog.GetString("Handbrake")} {HandbrakePercent:F0}%";
         }
         return(s);
     }
     else // air braked by default
     {
         var s = $"{Simulator.Catalog.GetString("BP")} {FormatStrings.FormatPressure(BrakeLine1PressurePSI, PressureUnit.PSI, units[BrakeSystemComponent.BrakePipe], false)}";
         if (lastCarBrakeSystem != null && lastCarBrakeSystem != this)
         {
             s += $" {Simulator.Catalog.GetString("EOT")} {lastCarBrakeSystem.GetStatus(units)}";
         }
         if (HandbrakePercent > 0)
         {
             s += $" {Simulator.Catalog.GetString("Handbrake")} {HandbrakePercent:F0}%";
         }
         return(s);
     }
 }
コード例 #3
0
        public override CarPart.CarPart Create()
        {
            var rearSuspension = new Suspension(
                type: GetRandomSuspensionType(),
                cost: randomGenerator.GetRandomValueInRange(40000, 100000),
                manufacturer: GetRandomManufacturer());
            var frontSuspension = new Suspension(
                type: GetRandomSuspensionType(),
                cost: randomGenerator.GetRandomValueInRange(40000, 100000),
                manufacturer: GetRandomManufacturer());

            var drivetrain = new Drivetrain(
                cost: randomGenerator.GetRandomValueInRange(30000, 100000),
                type: GetRandomDrivetrainType(),
                manufacturer: GetRandomManufacturer());

            var steeringPowerType = GetRandomSteeringPowerType();

            var brakeSystem = new BrakeSystem(
                type: GetRandomBrakesType(),
                cost: randomGenerator.GetRandomValueInRange(10000, 50000),
                manufacturer: GetRandomManufacturer());

            return(new Chassis(
                       manufacturer: GetRandomManufacturer(),
                       brakeSystem: brakeSystem,
                       drivetrain: drivetrain,
                       rearSuspension: rearSuspension,
                       frontSuspension: frontSuspension,
                       steeringPowerType: steeringPowerType,
                       wheels: new Wheel(
                           cost: randomGenerator.GetRandomValueInRange(10000, 30000),
                           manufacturer: GetRandomManufacturer())));
        }
コード例 #4
0
 public override string GetFullStatus(BrakeSystem lastCarBrakeSystem, Dictionary <BrakeSystemComponent, Pressure.Unit> units)
 {
     // display differently depending upon whether vacuum or air braked system
     if (Car.CarBrakeSystemType == "vacuum_piped")
     {
         string s = string.Format(" V {0}", FormatStrings.FormatPressure(Car.Train.EqualReservoirPressurePSIorInHg, Pressure.Unit.InHg, Pressure.Unit.InHg, true));
         if (lastCarBrakeSystem != null && lastCarBrakeSystem != this)
         {
             s += " EOT " + lastCarBrakeSystem.GetStatus(units);
         }
         if (HandbrakePercent > 0)
         {
             s += string.Format(" Handbrake {0:F0}%", HandbrakePercent);
         }
         return(s);
     }
     else // air braked by default
     {
         var s = string.Format("BP {0}", FormatStrings.FormatPressure(BrakeLine1PressurePSI, Pressure.Unit.PSI, units[BrakeSystemComponent.BrakePipe], false));
         if (lastCarBrakeSystem != null && lastCarBrakeSystem != this)
         {
             s += " EOT " + lastCarBrakeSystem.GetStatus(units);
         }
         if (HandbrakePercent > 0)
         {
             s += string.Format(" Handbrake {0:F0}%", HandbrakePercent);
         }
         return(s);
     }
 }
コード例 #5
0
        public Motorcycle(bool kickstart, BrakeSystem brakes, string title, string description, double price, int mileage, string make, string model) : base(title, description, price, mileage, make, model)
        {
            KickStart = kickstart;
            Brakes    = brakes;

            Title += " (MotorCycle)";
        }
コード例 #6
0
        public override void InitializeFromCopy(BrakeSystem copy)
        {
            ManualBraking thiscopy = (ManualBraking)copy;

            ManualMaxApplicationRateValuepS = thiscopy.ManualMaxApplicationRateValuepS;
            ManualReleaseRateValuepS        = thiscopy.ManualReleaseRateValuepS;
        }
コード例 #7
0
ファイル: AirBrake.cs プロジェクト: mspielberg/dv-airbrake
 private static float GetMechanicalBrakeFactor(BrakeSystem car)
 {
     if (car.hasIndependentBrake && !car.hasCompressor) // Caboose only
     {
         return(car.independentBrakePosition);
     }
     return(0f);
 }
コード例 #8
0
ファイル: AirBrake.cs プロジェクト: mspielberg/dv-airbrake
 private static void UpdateBrakePipeGauge(BrakeSystem car, ExtraBrakeState state)
 {
     // AirBrake.DebugLog(car, $"before: BP={ExtraBrakeState.Instance(car).brakePipePressureUnsmoothed}, gauge={car.brakePipePressure}, vel={car.brakePipePressureRef}");
     car.brakePipePressure = Mathf.SmoothDamp(
         car.brakePipePressure,
         state.brakePipePressureUnsmoothed,
         ref car.brakePipePressureRef, 0.2f);
     // AirBrake.DebugLog(car, $"after: BP={ExtraBrakeState.Instance(car).brakePipePressureUnsmoothed}, gauge={car.brakePipePressure}, vel={car.brakePipePressureRef}");
 }
コード例 #9
0
        public override string GetFullStatus(BrakeSystem lastCarBrakeSystem, Dictionary <BrakeSystemComponent, PressureUnit> units)
        {
            var s = $" {Simulator.Catalog.GetString("BC")} {FormatStrings.FormatPressure(CylPressurePSI, PressureUnit.PSI, units[BrakeSystemComponent.BrakeCylinder], true)}";

            if (HandbrakePercent > 0)
            {
                s += $" {Simulator.Catalog.GetString("Handbrake")} {HandbrakePercent:F0}%";
            }
            return(s);
        }
コード例 #10
0
        public override string GetFullStatus(BrakeSystem lastCarBrakeSystem, Dictionary <BrakeSystemComponent, PressureUnit> units)
        {
            string s = string.Format(" BC {0}", FormatStrings.FormatPressure(CylPressurePSI, PressureUnit.PSI, units[BrakeSystemComponent.BrakeCylinder], true));

            if (HandbrakePercent > 0)
            {
                s += string.Format(" Handbrake {0:F0}%", HandbrakePercent);
            }
            return(s);
        }
コード例 #11
0
        public override string GetFullStatus(BrakeSystem lastCarBrakeSystem, Dictionary <BrakeSystemComponent, PressureUnit> units)
        {
            var s = string.Format("BP {0}", FormatStrings.FormatPressure(BrakeLine1PressurePSI, PressureUnit.PSI, units[BrakeSystemComponent.BrakePipe], false));

            if (lastCarBrakeSystem != null && lastCarBrakeSystem != this)
            {
                s += " EOT " + lastCarBrakeSystem.GetStatus(units);
            }
            if (HandbrakePercent > 0)
            {
                s += string.Format(" Handbrake {0:F0}%", HandbrakePercent);
            }
            return(s);
        }
コード例 #12
0
ファイル: VacuumSinglePipe.cs プロジェクト: robwor/openrails
        public override string GetFullStatus(BrakeSystem lastCarBrakeSystem, Dictionary <BrakeSystemComponent, PressureUnit> units)
        {
            string s = string.Format(" V {0}", FormatStrings.FormatPressure(Car.Train.EqualReservoirPressurePSIorInHg, PressureUnit.InHg, PressureUnit.InHg, true));

            if (lastCarBrakeSystem != null && lastCarBrakeSystem != this)
            {
                s += " EOT " + lastCarBrakeSystem.GetStatus(units);
            }
            if (HandbrakePercent > 0)
            {
                s += string.Format(" Handbrake {0:F0}%", HandbrakePercent);
            }
            return(s);
        }
コード例 #13
0
        public async Task <IHttpActionResult> Post(int id, BrakeSystemInputModel model)
        {
            BrakeSystem brakeSystem = new BrakeSystem()
            {
                Id = model.Id, Name = model.Name
            };
            CommentsStagingModel comment = new CommentsStagingModel()
            {
                Comment = model.Comment
            };
            var attachments     = SetUpAttachmentsModels(model.Attachments);
            var changeRequestId = await _brakeSystemApplicationService.DeleteAsync(brakeSystem, id, CurrentUser.Email, comment, attachments);

            return(Ok(changeRequestId));
        }
コード例 #14
0
        private Expression <Func <VehicleToBrakeConfigDocument, bool> > AddBrakeSystemFilter(
            Expression <Func <VehicleToBrakeConfigDocument, bool> > filterEx)
        {
            if (BrakeSystem == null || !BrakeSystem.Any())
            {
                return(filterEx);
            }
            Expression <Func <VehicleToBrakeConfigDocument, bool> > brakeSystemFilterEx = null;

            foreach (var brakeSystem in BrakeSystem)
            {
                brakeSystemFilterEx = brakeSystemFilterEx.OrElse(x => x.BrakeSystemName == brakeSystem);
            }

            return(filterEx.AndAlso(brakeSystemFilterEx));
        }
コード例 #15
0
ファイル: AirBrake.cs プロジェクト: mspielberg/dv-airbrake
 private static void RechargeMainReservoir(BrakeSystem car, ExtraBrakeState state, float dt)
 {
     if (car.compressorRunning)
     {
         var increase = car.compressorProductionRate * Main.settings.compressorSpeed * dt;
         car.mainReservoirPressureUnsmoothed =
             Mathf.Clamp(car.mainReservoirPressureUnsmoothed + increase, 0f, Constants.MaxMainReservoirPressure);
     }
     AirFlow.OneWayFlow(
         dt,
         ref car.mainReservoirPressureUnsmoothed,
         ref state.brakePipePressureUnsmoothed,
         Constants.MainReservoirVolume,
         Constants.BrakePipeVolume,
         float.PositiveInfinity);
     car.mainReservoirPressure = Mathf.SmoothDamp(car.mainReservoirPressure, car.mainReservoirPressureUnsmoothed, ref car.mainResPressureRef, 0.8f);
 }
コード例 #16
0
ファイル: Components.cs プロジェクト: mspielberg/dv-airbrake
        private static void Update(BrakeSystem car, float dt)
        {
            var state = ExtraBrakeState.Instance(car);

            foreach (var c**k in new HoseAndCock[] { car.Front, car.Rear })
            {
                float rate = c**k.IsOpenToAtmosphere
                    ? AirFlow.Vent(
                    dt,
                    ref state.brakePipePressureUnsmoothed,
                    Constants.BrakePipeVolume,
                    VentRate)
                    : 0f;
                // AirBrake.DebugLog(car, $"cockOpen={c**k.IsOpenToAtmosphere}, ventRate={rate}");
                c**k.exhaustFlow = Mathf.SmoothDamp(c**k.exhaustFlow, rate, ref c**k.exhaustFlowRef, 0.1f);
            }
        }
コード例 #17
0
ファイル: VacuumSinglePipe.cs プロジェクト: robwor/openrails
        public override void InitializeFromCopy(BrakeSystem copy)
        {
            VacuumSinglePipe thiscopy = (VacuumSinglePipe)copy;

            MaxBrakeForceN          = thiscopy.MaxBrakeForceN;
            MaxHandbrakeForceN      = thiscopy.MaxHandbrakeForceN;
            MaxForcePressurePSI     = thiscopy.MaxForcePressurePSI;
            MaxReleaseRatePSIpS     = thiscopy.MaxReleaseRatePSIpS;
            MaxApplicationRatePSIpS = thiscopy.MaxApplicationRatePSIpS;
            //  ApplyChargingRatePSIpS = thiscopy.ApplyChargingRatePSIpS;
            //   PipeTimeFactorS = thiscopy.PipeTimeFactorS;
            //  ReleaseTimeFactorS = thiscopy.ReleaseTimeFactorS;
            NumCylinders            = thiscopy.NumCylinders;
            CylVol                  = thiscopy.CylVol;
            PipeVol                 = thiscopy.PipeVol;
            VacResVol               = thiscopy.VacResVol;
            HasDirectAdmissionValue = thiscopy.HasDirectAdmissionValue;
        }
コード例 #18
0
        public override string GetFullStatus(BrakeSystem lastCarBrakeSystem, Dictionary <BrakeSystemComponent, PressureUnit> units)
        {
            string s = string.Format(" EQ {0}", FormatStrings.FormatPressure(Car.Train.BrakeLine1PressurePSIorInHg, PressureUnit.PSI, units[BrakeSystemComponent.EqualizingReservoir], true));

            s += string.Format(
                " BC {0} BP {1}",
                FormatStrings.FormatPressure(CylPressurePSI, PressureUnit.PSI, units[BrakeSystemComponent.BrakeCylinder], true),
                FormatStrings.FormatPressure(BrakeLine1PressurePSI, PressureUnit.PSI, units[BrakeSystemComponent.BrakePipe], true)
                );
            if (lastCarBrakeSystem != null && lastCarBrakeSystem != this)
            {
                s += " EOT " + lastCarBrakeSystem.GetStatus(units);
            }
            if (HandbrakePercent > 0)
            {
                s += string.Format(" Handbrake {0:F0}%", HandbrakePercent);
            }
            return(s);
        }
コード例 #19
0
        public override void InitializeFromCopy(BrakeSystem copy)
        {
            AirSinglePipe thiscopy = (AirSinglePipe)copy;

            MaxHandbrakeForceN           = thiscopy.MaxHandbrakeForceN;
            MaxBrakeForceN               = thiscopy.MaxBrakeForceN;
            MaxCylPressurePSI            = thiscopy.MaxCylPressurePSI;
            AuxCylVolumeRatio            = thiscopy.AuxCylVolumeRatio;
            AuxBrakeLineVolumeRatio      = thiscopy.AuxBrakeLineVolumeRatio;
            EmergResVolumeM3             = thiscopy.EmergResVolumeM3;
            RetainerPressureThresholdPSI = thiscopy.RetainerPressureThresholdPSI;
            ReleaseRatePSIpS             = thiscopy.ReleaseRatePSIpS;
            MaxReleaseRatePSIpS          = thiscopy.MaxReleaseRatePSIpS;
            MaxApplicationRatePSIpS      = thiscopy.MaxApplicationRatePSIpS;
            MaxAuxilaryChargingRatePSIpS = thiscopy.MaxAuxilaryChargingRatePSIpS;
            EmergResChargingRatePSIpS    = thiscopy.EmergResChargingRatePSIpS;
            EmergAuxVolumeRatio          = thiscopy.EmergAuxVolumeRatio;
            TwoPipes            = thiscopy.TwoPipes;
            NoMRPAuxResCharging = thiscopy.NoMRPAuxResCharging;
            HoldingValve        = thiscopy.HoldingValve;
        }
コード例 #20
0
        private async Task UpdateVehicleToBrakeConfigDocuments(BrakeSystem updatedBrakeSystem)
        {
            bool isEndReached = false;
            int  pageNumber   = 1;

            do
            {
                var vehicleToBrakeConfigSearchResult =
                    await
                    _vehicletoBrakeConfigSearchService.SearchAsync(null,
                                                                   $"brakeSystemId eq {updatedBrakeSystem.Id}", new SearchOptions()
                {
                    RecordCount = 1000, PageNumber = pageNumber
                });

                var existingVehicleToBrakeConfigDocuments = vehicleToBrakeConfigSearchResult.Documents;

                if (existingVehicleToBrakeConfigDocuments != null &&
                    existingVehicleToBrakeConfigDocuments.Any())
                {
                    foreach (
                        var existingVehicleToBrakeConfigDocument in
                        existingVehicleToBrakeConfigDocuments)
                    {
                        existingVehicleToBrakeConfigDocument.BrakeSystemName = updatedBrakeSystem.Name;
                    }

                    await
                    this._vehicleToBrakeConfigIndexingService.UploadDocumentsAsync(
                        existingVehicleToBrakeConfigDocuments.ToList());

                    pageNumber++;
                }
                else
                {
                    isEndReached = true;
                }
            } while (!isEndReached);
        }
コード例 #21
0
        public override async Task <long> SubmitAddChangeRequestAsync(BrakeConfig entity, string requestedBy,
                                                                      List <ChangeRequestItemStaging> changeRequestItemStagings = null, CommentsStagingModel comment = null,
                                                                      List <AttachmentsModel> attachmentsStagingModels          = null, string changeContent = null)
        {
            if (entity.BrakeSystemId.Equals(default(int)) ||
                entity.BrakeABSId.Equals(default(int)) ||
                entity.FrontBrakeTypeId.Equals(default(int)) ||
                entity.RearBrakeTypeId.Equals(default(int)))
            {
                throw new ArgumentException(nameof(entity));
            }

            changeRequestItemStagings = new List <ChangeRequestItemStaging>();
            // Validation check for insert of new brake config

            await ValidateConfigurationDoesNotMatchWithExistingBrakeConfig(entity);
            await ValidateNoChangeRequestExistsWithSameConfiguration(entity);
            await ValidateBrakeConfigLookUpHasNoChangeRequest(entity);


            changeRequestItemStagings.Add(new ChangeRequestItemStaging()
            {
                ChangeType      = ChangeType.Add,
                EntityId        = entity.Id.ToString(),
                CreatedDateTime = DateTime.UtcNow,
                Entity          = typeof(BrakeConfig).Name,
                Payload         = base.Serializer.Serialize(entity)
            });

            var brakeTypeRepositoryService   = Repositories.GetRepositoryService <BrakeType>() as IVcdbSqlServerEfRepositoryService <BrakeType>;
            var brakeAbsRepositoryService    = Repositories.GetRepositoryService <BrakeABS>() as IVcdbSqlServerEfRepositoryService <BrakeABS>;
            var brakeSystemRepositoryService = Repositories.GetRepositoryService <BrakeSystem>() as IVcdbSqlServerEfRepositoryService <BrakeSystem>;

            BrakeType   frontBrakeType = null;
            BrakeType   rearBrakeType  = null;
            BrakeABS    brakeAbs       = null;
            BrakeSystem brakeSystem    = null;

            if (brakeTypeRepositoryService != null && brakeAbsRepositoryService != null && brakeSystemRepositoryService != null)
            {
                var frontBrakeTypes = await brakeTypeRepositoryService.GetAsync(m => m.Id == entity.FrontBrakeTypeId && m.DeleteDate == null, 1);

                if (frontBrakeTypes != null && frontBrakeTypes.Any())
                {
                    frontBrakeType = frontBrakeTypes.First();
                }
                var rearBrakeTypes = await brakeTypeRepositoryService.GetAsync(m => m.Id == entity.RearBrakeTypeId && m.DeleteDate == null, 1);

                if (rearBrakeTypes != null && rearBrakeTypes.Any())
                {
                    rearBrakeType = rearBrakeTypes.First();
                }
                var brakeAbses = await brakeAbsRepositoryService.GetAsync(m => m.Id == entity.BrakeABSId && m.DeleteDate == null, 1);

                if (brakeAbses != null && brakeAbses.Any())
                {
                    brakeAbs = brakeAbses.First();
                }
                var brakeSystems = await brakeSystemRepositoryService.GetAsync(m => m.Id == entity.BrakeSystemId && m.DeleteDate == null, 1);

                if (brakeSystems != null && brakeSystems.Any())
                {
                    brakeSystem = brakeSystems.First();
                }

                changeContent = string.Format("{0} / {1} / {2} / {3}", frontBrakeType.Name, rearBrakeType.Name, brakeAbs.Name, brakeSystem.Name);
            }

            // NOTE: change-request-comments-staging perfomed on base

            return(await base.SubmitAddChangeRequestAsync(entity, requestedBy, changeRequestItemStagings, comment, attachmentsStagingModels, changeContent));
        }
コード例 #22
0
        // Get Brake information for train
        public override string GetFullStatus(BrakeSystem lastCarBrakeSystem, Dictionary <BrakeSystemComponent, PressureUnit> units)
        {
            string s = "Manual Brake";

            return(s);
        }
コード例 #23
0
ファイル: AirBrake.cs プロジェクト: mspielberg/dv-airbrake
 public static ref float CylinderPressure(this BrakeSystem brakeSystem) =>
 ref ExtraBrakeState.Instance(brakeSystem).cylinderPressure;
コード例 #24
0
        public override void InitializeFromCopy(BrakeSystem copy)
        {
            SingleTransferPipe thiscopy = (SingleTransferPipe)copy;

            BrakePipeVolumeM3 = thiscopy.BrakePipeVolumeM3;
        }
コード例 #25
0
        private static bool Prefix(HoseSeparationChecker __instance, List <HoseSeparationChecker.BrakeHoseCheckPair> ___brakeHosesToCheck, List <HoseSeparationChecker.MUCableCheckPair> ___muCablesToCheck)
        {
            if (NetworkManager.IsClient())
            {
                if (Trainset.allSets.Count == 0 || Brakeset.allSets.Count == 0)
                {
                    return(false);
                }
                for (int i = ___brakeHosesToCheck.Count - 1; i >= 0; i--)
                {
                    HoseSeparationChecker.BrakeHoseCheckPair brakeHoseCheckPair = ___brakeHosesToCheck[i];
                    BrakeSystem parentSystem  = brakeHoseCheckPair.a.parentSystem;
                    BrakeSystem parentSystem2 = brakeHoseCheckPair.b.parentSystem;
                    if (parentSystem == null || parentSystem2 == null)
                    {
                        ___brakeHosesToCheck.RemoveAt(i);
                    }
                    else
                    {
                        TrainCar component  = parentSystem.GetComponent <TrainCar>();
                        TrainCar component2 = parentSystem2.GetComponent <TrainCar>();
                        if (!component.GetComponent <NetworkTrainPosSync>().hasLocalPlayerAuthority&& !component2.GetComponent <NetworkTrainPosSync>().hasLocalPlayerAuthority)
                        {
                            continue;
                        }

                        Coupler         coupler = brakeHoseCheckPair.a.isFront ? component.frontCoupler : component.rearCoupler;
                        Coupler         c       = brakeHoseCheckPair.b.isFront ? component2.frontCoupler : component2.rearCoupler;
                        CouplingHoseRig rig     = CouplingHoseRig.GetRig(coupler);
                        CouplingHoseRig rig2    = CouplingHoseRig.GetRig(c);
                        if (rig && rig2 && Vector3.SqrMagnitude(rig.ropeAnchor.position - rig2.ropeAnchor.position) > 1.9599999f)
                        {
                            Debug.Log("Breaking hose connection due to separation", __instance);
                            coupler.DisconnectAirHose(true);
                        }
                    }
                }
                for (int j = ___muCablesToCheck.Count - 1; j >= 0; j--)
                {
                    HoseSeparationChecker.MUCableCheckPair mucableCheckPair = ___muCablesToCheck[j];
                    MultipleUnitModule muModule  = mucableCheckPair.a.muModule;
                    MultipleUnitModule muModule2 = mucableCheckPair.b.muModule;
                    if (muModule == null || muModule2 == null)
                    {
                        Debug.LogError(string.Format("Encountered null for {0} a: {1} b: {2}, removing pair", "MultipleUnitModule", muModule == null, muModule2 == null));
                        ___muCablesToCheck.RemoveAt(j);
                    }
                    else
                    {
                        if (!muModule.GetComponent <NetworkTrainPosSync>().hasLocalPlayerAuthority&& !muModule2.GetComponent <NetworkTrainPosSync>().hasLocalPlayerAuthority)
                        {
                            continue;
                        }

                        CouplingHoseMultipleUnitAdapter hoseAdapter  = mucableCheckPair.a.HoseAdapter;
                        CouplingHoseRig couplingHoseRig              = (hoseAdapter != null) ? hoseAdapter.rig : null;
                        CouplingHoseMultipleUnitAdapter hoseAdapter2 = mucableCheckPair.b.HoseAdapter;
                        CouplingHoseRig couplingHoseRig2             = (hoseAdapter2 != null) ? hoseAdapter2.rig : null;
                        if (couplingHoseRig && couplingHoseRig2 && Vector3.SqrMagnitude(couplingHoseRig.ropeAnchor.position - couplingHoseRig2.ropeAnchor.position) > 1.9599999f)
                        {
                            Debug.Log("Breaking MU hose connection due to separation", __instance);
                            mucableCheckPair.a.Disconnect(true);
                        }
                    }
                }
                return(false);
            }
            return(true);
        }
コード例 #26
0
 public abstract void InitializeFromCopy(BrakeSystem copy);
コード例 #27
0
        private IEnumerable <CarGroup> GetCarGroups(IEnumerable <TrainCar> cars, bool individual)
        {
            Job?  prevJob       = null;
            Track?prevDestTrack = null;
            int   startIndex    = 0;
            float maxStress     = 0f;

            var firstCar  = cars.First();
            var groupCars = new List <TrainCar>()
            {
                firstCar
            };
            float minBrakePipePressure      = firstCar.brakeSystem.brakePipePressure;
            float minBrakeReservoirPressure = GetAuxReservoirPressure(firstCar);
            float maxBrakeCylinderPressure  = GetBrakeCylinderPressure(firstCar);
            float maxBrakeFactor            = firstCar.brakeSystem.brakingFactor;

            int i = 0;

            foreach (var car in cars)
            {
                float       carStress             = car.GetComponent <TrainStress>().derailBuildUp;
                Job?        job                   = JobChainController.GetJobOfCar(car);
                Track?      nextDestination       = GetNextDestinationTrack(job, car.logicCar);
                BrakeSystem brakeSystem           = car.brakeSystem;
                float       pipePressure          = brakeSystem.brakePipePressure;
                float       auxReservoirPressure  = GetAuxReservoirPressure(car);
                float       brakeCylinderPressure = GetBrakeCylinderPressure(car);
                if (individual || nextDestination == null || nextDestination != prevDestTrack || job != prevJob)
                {
                    // complete previous group
                    if (i > 0)
                    {
                        yield return(new CarGroup(
                                         startIndex,
                                         i,
                                         groupCars,
                                         maxStress,
                                         prevJob,
                                         prevDestTrack,
                                         minBrakePipePressure,
                                         minBrakeReservoirPressure,
                                         maxBrakeCylinderPressure,
                                         maxBrakeFactor));
                    }

                    // start new group
                    startIndex = i;
                    groupCars  = new List <TrainCar>()
                    {
                        car
                    };
                    prevJob                   = job;
                    prevDestTrack             = nextDestination;
                    maxStress                 = carStress;
                    minBrakePipePressure      = pipePressure;
                    minBrakeReservoirPressure = auxReservoirPressure;
                    maxBrakeCylinderPressure  = brakeCylinderPressure;
                    maxBrakeFactor            = brakeSystem.brakingFactor;
                }
                else
                {
                    groupCars.Add(car);
                    if (carStress > maxStress)
                    {
                        maxStress = carStress;
                    }
                    if (pipePressure < minBrakePipePressure)
                    {
                        minBrakeReservoirPressure = auxReservoirPressure;
                    }
                    if (auxReservoirPressure < minBrakeReservoirPressure)
                    {
                        minBrakeReservoirPressure = auxReservoirPressure;
                    }
                    if (brakeCylinderPressure > maxBrakeCylinderPressure)
                    {
                        maxBrakeCylinderPressure = brakeCylinderPressure;
                    }
                    if (brakeSystem.brakingFactor > maxBrakeFactor)
                    {
                        maxBrakeFactor = brakeSystem.brakingFactor;
                    }
                }
                i++;
            }

            // complete last group
            yield return(new CarGroup(
                             startIndex,
                             i,
                             groupCars,
                             maxStress,
                             prevJob,
                             prevDestTrack,
                             minBrakePipePressure,
                             minBrakeReservoirPressure,
                             maxBrakeCylinderPressure,
                             maxBrakeFactor));
        }
コード例 #28
0
        // Get Brake information for train
        public override string GetFullStatus(BrakeSystem lastCarBrakeSystem, Dictionary <BrakeSystemComponent, Pressure.Unit> units)
        {
            string s = Simulator.Catalog.GetString("Manual Brake");

            return(s);
        }
コード例 #29
0
        public override void InitializeFromCopy(BrakeSystem copy)
        {
            SingleTransferPipe thiscopy = (SingleTransferPipe)copy;

            MaxHandbrakeForceN = thiscopy.MaxHandbrakeForceN;
        }
コード例 #30
0
        protected static void PropagateBrakeLinePressures(float elapsedClockSeconds, TrainCar trainCar, bool twoPipes)
        {
            var   train = trainCar.Train;
            var   lead  = trainCar as MSTSLocomotive;
            var   brakePipeTimeFactorS = lead == null ? 0.003f : lead.BrakePipeTimeFactorS;
            int   nSteps = (int)(elapsedClockSeconds * 2 / brakePipeTimeFactorS + 1);
            float dt     = elapsedClockSeconds / nSteps;

            // Propagate brake line (1) data
            if (lead != null && lead.BrakePipeChargingRatePSIpS >= 1000)
            {   // pressure gradient disabled
                if (lead.BrakeSystem.BrakeLine1PressurePSI < train.BrakeLine1PressurePSIorInHg)
                {
                    var dp1 = train.BrakeLine1PressurePSIorInHg - lead.BrakeSystem.BrakeLine1PressurePSI;
                    lead.MainResPressurePSI -= dp1 * lead.BrakeSystem.BrakePipeVolumeM3 / lead.MainResVolumeM3;
                }
                foreach (TrainCar car in train.Cars)
                {
                    if (car.BrakeSystem.BrakeLine1PressurePSI >= 0)
                    {
                        car.BrakeSystem.BrakeLine1PressurePSI = train.BrakeLine1PressurePSIorInHg;
                    }
                }
            }
            else
            {   // approximate pressure gradient in line1
                float serviceTimeFactor = lead != null ? lead.TrainBrakeController != null && lead.TrainBrakeController.EmergencyBraking ? lead.BrakeEmergencyTimeFactorS : lead.BrakeServiceTimeFactorS : 0;
                for (int i = 0; i < nSteps; i++)
                {
//                    Trace.TraceWarning("lead.BrakeLine1PressurePSI {0} car1.BrakeLine1PressurePSI {1} car2.BrakeLine1PressurePSI {2} lead.MainResPressurePSI {3} car1.AuxResPressure {4} i {5}",
//                        lead.BrakeSystem.BrakeLine1PressurePSI, train.Cars[1].BrakeSystem.BrakeLine1PressurePSI, train.Cars[2].BrakeSystem.BrakeLine1PressurePSI,  lead.MainResPressurePSI, (train.Cars[1].BrakeSystem as AirSinglePipe).AuxResPressurePSI, i);
                    if (lead != null)
                    {
                        if (lead.BrakeSystem.BrakeLine1PressurePSI < train.BrakeLine1PressurePSIorInHg)
                        {
                            float dp = dt * lead.BrakePipeChargingRatePSIpS;
                            if (lead.BrakeSystem.BrakeLine1PressurePSI + dp > train.BrakeLine1PressurePSIorInHg)
                            {
                                dp = train.BrakeLine1PressurePSIorInHg - lead.BrakeSystem.BrakeLine1PressurePSI;
                            }
                            if (lead.BrakeSystem.BrakeLine1PressurePSI + dp > lead.MainResPressurePSI)
                            {
                                dp = lead.MainResPressurePSI - lead.BrakeSystem.BrakeLine1PressurePSI;
                            }
                            if (dp < 0)
                            {
                                dp = 0;
                            }
                            lead.BrakeSystem.BrakeLine1PressurePSI += dp;
                            lead.MainResPressurePSI -= dp * lead.BrakeSystem.BrakePipeVolumeM3 / lead.MainResVolumeM3;
                        }
                        else if (lead.BrakeSystem.BrakeLine1PressurePSI > train.BrakeLine1PressurePSIorInHg)
                        {
                            lead.BrakeSystem.BrakeLine1PressurePSI *= (1 - dt / serviceTimeFactor);
                        }
                    }
                    TrainCar car0 = train.Cars[0];
                    float    p0   = car0.BrakeSystem.BrakeLine1PressurePSI;
                    float    brakePipeVolumeM30 = car0.BrakeSystem.BrakePipeVolumeM3;
                    foreach (TrainCar car in train.Cars)
                    {
                        float p1 = car.BrakeSystem.BrakeLine1PressurePSI;
                        if (car == train.Cars[0] || car.BrakeSystem.FrontBrakeHoseConnected && car.BrakeSystem.AngleCockAOpen && car0.BrakeSystem.AngleCockBOpen)
                        {
                            float dp = Math.Min(dt * (p1 - p0) / brakePipeTimeFactorS * 2, p1 - p0);
                            car.BrakeSystem.BrakeLine1PressurePSI  -= dp * brakePipeVolumeM30 / (brakePipeVolumeM30 + car.BrakeSystem.BrakePipeVolumeM3);
                            car0.BrakeSystem.BrakeLine1PressurePSI += dp * car.BrakeSystem.BrakePipeVolumeM3 / (brakePipeVolumeM30 + car.BrakeSystem.BrakePipeVolumeM3);
                        }
                        if (!car.BrakeSystem.FrontBrakeHoseConnected)
                        {
                            if (car.BrakeSystem.AngleCockAOpen)
                            {
                                car.BrakeSystem.BrakeLine1PressurePSI -= dt * p1 / brakePipeTimeFactorS;
                            }
                            if (car0.BrakeSystem.AngleCockBOpen && car != car0)
                            {
                                car0.BrakeSystem.BrakeLine1PressurePSI -= dt * p0 / brakePipeTimeFactorS;
                            }
                        }
                        if (car == train.Cars[train.Cars.Count - 1] && car.BrakeSystem.AngleCockBOpen)
                        {
                            car.BrakeSystem.BrakeLine1PressurePSI -= dt * p1 / brakePipeTimeFactorS;
                        }
                        p0   = car.BrakeSystem.BrakeLine1PressurePSI;
                        car0 = car;
                        brakePipeVolumeM30 = car0.BrakeSystem.BrakePipeVolumeM3;
                    }
                }
            }

            // Propagate main reservoir pipe (2) and engine brake pipe (3) data
            int first = -1;
            int last  = -1;

            train.FindLeadLocomotives(ref first, ref last);
            float sumpv = 0;
            float sumv  = 0;
            int   continuousFromInclusive = 0;
            int   continuousToExclusive   = train.Cars.Count;

            for (int i = 0; i < train.Cars.Count; i++)
            {
                BrakeSystem brakeSystem = train.Cars[i].BrakeSystem;
                if (i < first && (!train.Cars[i + 1].BrakeSystem.FrontBrakeHoseConnected || !brakeSystem.AngleCockBOpen || !train.Cars[i + 1].BrakeSystem.AngleCockAOpen || !train.Cars[i].BrakeSystem.TwoPipes))
                {
                    if (continuousFromInclusive < i + 1)
                    {
                        sumv = sumpv = 0;
                        continuousFromInclusive = i + 1;
                    }
                    continue;
                }
                if (i > last && i > 0 && (!brakeSystem.FrontBrakeHoseConnected || !brakeSystem.AngleCockAOpen || !train.Cars[i - 1].BrakeSystem.AngleCockBOpen || !train.Cars[i].BrakeSystem.TwoPipes))
                {
                    if (continuousToExclusive > i)
                    {
                        continuousToExclusive = i;
                    }
                    continue;
                }

                // Collect main reservoir pipe (2) data
                if (first <= i && i <= last || twoPipes && continuousFromInclusive <= i && i < continuousToExclusive)
                {
                    sumv  += brakeSystem.BrakePipeVolumeM3;
                    sumpv += brakeSystem.BrakePipeVolumeM3 * brakeSystem.BrakeLine2PressurePSI;
                    var eng = train.Cars[i] as MSTSLocomotive;
                    if (eng != null)
                    {
                        sumv  += eng.MainResVolumeM3;
                        sumpv += eng.MainResVolumeM3 * eng.MainResPressurePSI;
                    }
                }

                // Collect and propagate engine brake pipe (3) data
                if (i < first || i > last)
                {
                    brakeSystem.BrakeLine3PressurePSI = 0;
                }
                else
                {
                    if (lead != null)
                    {
                        float p = brakeSystem.BrakeLine3PressurePSI;
                        if (p > 1000)
                        {
                            p -= 1000;
                        }
                        var prevState = lead.EngineBrakeState;
                        if (p < train.BrakeLine3PressurePSI && p < lead.MainResPressurePSI)
                        {
                            float dp = elapsedClockSeconds * lead.EngineBrakeApplyRatePSIpS / (last - first + 1);
                            if (p + dp > train.BrakeLine3PressurePSI)
                            {
                                dp = train.BrakeLine3PressurePSI - p;
                            }
                            p += dp;
                            lead.EngineBrakeState = ValveState.Apply;
                            sumpv -= dp * brakeSystem.GetCylVolumeM3() / lead.MainResVolumeM3;
                        }
                        else if (p > train.BrakeLine3PressurePSI)
                        {
                            float dp = elapsedClockSeconds * lead.EngineBrakeReleaseRatePSIpS / (last - first + 1);
                            if (p - dp < train.BrakeLine3PressurePSI)
                            {
                                dp = p - train.BrakeLine3PressurePSI;
                            }
                            p -= dp;
                            lead.EngineBrakeState = ValveState.Release;
                        }
                        else
                        {
                            lead.EngineBrakeState = ValveState.Lap;
                        }
                        if (lead.EngineBrakeState != prevState)
                        {
                            switch (lead.EngineBrakeState)
                            {
                            case ValveState.Release: lead.SignalEvent(Event.EngineBrakePressureIncrease); break;

                            case ValveState.Apply: lead.SignalEvent(Event.EngineBrakePressureDecrease); break;

                            case ValveState.Lap: lead.SignalEvent(Event.EngineBrakePressureStoppedChanging); break;
                            }
                        }
                        if (lead.BailOff || (lead.DynamicBrakeAutoBailOff && train.MUDynamicBrakePercent > 0))
                        {
                            p += 1000;
                        }
                        brakeSystem.BrakeLine3PressurePSI = p;
                    }
                }
            }
            if (sumv > 0)
            {
                sumpv /= sumv;
            }

            if (!train.Cars[continuousFromInclusive].BrakeSystem.FrontBrakeHoseConnected && train.Cars[continuousFromInclusive].BrakeSystem.AngleCockAOpen ||
                (continuousToExclusive == train.Cars.Count || !train.Cars[continuousToExclusive].BrakeSystem.FrontBrakeHoseConnected) && train.Cars[continuousToExclusive - 1].BrakeSystem.AngleCockBOpen)
            {
                sumpv = 0;
            }

            // Propagate main reservoir pipe (2) data
            train.BrakeLine2PressurePSI = sumpv;
            for (int i = 0; i < train.Cars.Count; i++)
            {
                if (first <= i && i <= last || twoPipes && continuousFromInclusive <= i && i < continuousToExclusive)
                {
                    train.Cars[i].BrakeSystem.BrakeLine2PressurePSI = sumpv;
                    if (sumpv != 0 && train.Cars[i] is MSTSLocomotive)
                    {
                        (train.Cars[i] as MSTSLocomotive).MainResPressurePSI = sumpv;
                    }
                }
                else
                {
                    train.Cars[i].BrakeSystem.BrakeLine2PressurePSI = train.Cars[i] is MSTSLocomotive ? (train.Cars[i] as MSTSLocomotive).MainResPressurePSI : 0;
                }
            }
        }