private void InitObject() { _config = Config.Instance(); _udpHelper = new UdpHelper(); _deviceControlElement = DeviceControlElement.GetInstance(); _deviceControlElement.AddJoystick(_config.Default.DefaultControlElement.Rus.Guid); _deviceControlElement.AddJoystick(_config.Default.DefaultControlElement.Rud.Guid); _dynamicModelToBmpi = new DynamicModelToBmpi(); _aircraftPosition = new AircraftPosition(); _dynamicModelToVaps = new DynamicModelToVaps(); _modelState = new ModelState(); _channelRadar = new ChannelRadar(); _channelThermalEffect = new ChannelThermalEffect(); _channelTvHeadEffect = new ChannelTvHeadEffect(); _ethernetControlElement = new EthernetControlElement(); _cLSEControl = new CLSEControl(); _cLSEState = new CLSEState(); _parametersOfControl = new ParametersOfControl(); _lptp = new Lptp(); _commandPue = new CommandPue(); if (_typeModel == 0) { _controlElement = new ControlElementKa52(); _dynamicModel = new ModelKa52(); } _startPosition = new StartPosition(); _landing = new Landing(); _route = new Route(); uint version = 0; uint release = 0; uint releaseDay = 0; uint releaseMonth = 0; uint releaseYear = 0; IntPtr pversion = GetIntPtr(version); IntPtr prelease = GetIntPtr(release); IntPtr preleaseDay = GetIntPtr(releaseDay); IntPtr preleaseMonth = GetIntPtr(releaseMonth); IntPtr preleaseYear = GetIntPtr(releaseYear); GetDllVersion(pversion, prelease, preleaseDay, preleaseMonth, preleaseYear); version = (uint)Marshal.ReadInt32(pversion); release = (uint)Marshal.ReadInt32(prelease); releaseDay = (uint)Marshal.ReadInt32(preleaseDay); releaseMonth = (uint)Marshal.ReadInt32(preleaseMonth); releaseYear = (uint)Marshal.ReadInt32(preleaseYear); Init("ConfigBrunner.xml"); }
public override byte[] GetForVaps(DynamicModelToVaps modelToVaps) { double Vpth = Math.Sqrt(out_36 * out_36 + out_37 * out_37); // м/с double PsiP = Math.Asin(out_37 / Vpth); double D2R = 180 / Math.PI; double Psi = out_Kurs; double psi_hi, psi_p_hi; // значения угла курса и путевого угла +-Pi (+-180) if (PsiP >= 0) { psi_p_hi = PsiP; } else { psi_p_hi = PsiP - 2.0 * Math.PI; // путевой угол +-Pi (+-180) } if (Psi >= 0) { psi_hi = Psi; } else { psi_hi = Psi - 2.0 * Math.PI; // угол курса +-Pi (+-180) } double hi = psi_p_hi - psi_hi; // угол сноса +-Pi (+-180) if (hi >= Math.PI) { hi = hi - 2.0 * Math.PI; } if (hi <= -Math.PI) { hi = hi + 2.0 * Math.PI; } double Tetr = 0; // угол наклона траектории, рад // 1 вариант //if (vhcloutp.instrumentsstate.tas != 0) // tetr = math.asin(kinematicsstate.absspeed.y / vhcloutp.instrumentsstate.tas); //// 2 вариант, альтернативно //// истинная воздушная скорость полета //double vp = math.sqrt( // kinematicsstate.absspeed.x // * kinematicsstate.absspeed.x // + kinematicsstate.absspeed.y // * kinematicsstate.absspeed.y // + kinematicsstate.absspeed.z // * kinematicsstate.absspeed.z); ////(кинематическая)м / с //if (vp != 0) // tetr = math.asin(kinematicsstate.absspeed.y / vp); //// ограничение для обоих вараинтов //if (tetr > math.pi / 2.0) tetr = tetr - math.pi / 2.0; //if (tetr < -math.pi / 2.0) tetr = tetr + math.pi / 2.0; //todo: тут нужно заполнить модель modelToVaps.Eng1.N = out_NOborotL; modelToVaps.Eng1.Mode = out_EngPwrL; modelToVaps.Eng1.Egt = out_TGazL; modelToVaps.Eng1.MaxAllowedEgt = 705; modelToVaps.Eng1.EmergencyEgt = 735; modelToVaps.Eng1.EngState = upr_EngineLeftOff; modelToVaps.Eng1.FuelFlow = out_ToplivoCurL; modelToVaps.Eng2.N = out_NOborotR; modelToVaps.Eng2.Mode = out_EngPwrR; modelToVaps.Eng2.Egt = out_TGazR; modelToVaps.Eng2.MaxAllowedEgt = 705; modelToVaps.Eng2.EmergencyEgt = 735; modelToVaps.Eng2.EngState = upr_EngineRightOff; modelToVaps.Eng2.FuelFlow = out_ToplivoCurR; modelToVaps.ModeFly = 1; modelToVaps.RemainingFuel = in_Massa0 - out_MassaCur; modelToVaps.RotorSpeed = out_Nnv; //todo: нужно написать условия о смене значения от скорости ///98 - до 200 ///93 - от 200 до 270 ///91 - от 270 до 300 modelToVaps.MaximumPermissibleRotor = 93; modelToVaps.TotalRotor = out_OShag; modelToVaps.RecommendedValueRotor = 0; modelToVaps.HeadingCurrent = out_Kurs; modelToVaps.HeadingTrack = PsiP * D2R; modelToVaps.AngleDrift = hi * D2R; modelToVaps.Angleslip = out_Skolj; modelToVaps.RollCurrent = out_Kren; modelToVaps.MaximumPermissibleRoll = out_KrenMax; modelToVaps.RecommendedRollValue = 0; modelToVaps.PitchCurrent = out_Tang; modelToVaps.RecommendedPitchValue = 0; modelToVaps.RermissiblePitchPitching = out_TangMaxKabr; modelToVaps.PermissiblePitchDiving = out_TangMaxPikir; modelToVaps.AngleAttack = 0; modelToVaps.PermissibleAngleAttack = 0; modelToVaps.PositionBall = out_Skolj; modelToVaps.AngleTrajectory = 0; modelToVaps.Vy = out_Vy; modelToVaps.MinVy = -5; modelToVaps.MaxVy = +5; modelToVaps.InstrumentSpeedCurrent = out_Vprib; modelToVaps.MaxInstrumentSpeed = out_Vmax; modelToVaps.MinInstrumentSpeed = 50; modelToVaps.SpeedX = out_Vxprib; //?? modelToVaps.SpeedZ = out_Vzprib; //?? modelToVaps.RecommendedDiveSpeed = 0; modelToVaps.RecommendedSpeedDiveEnd = 0; modelToVaps.TrueSpeedCurrent = in_V; //?? modelToVaps.GroundSpeedX = out_Wxg; //?? modelToVaps.GroundSpeedZ = out_Wzg; //?? modelToVaps.Mach = 0; //?? modelToVaps.RelativeHeight = out_Hotn; modelToVaps.BarometricHeight = in_Hbar; modelToVaps.Pressure = 0; //минус высота рельефа modelToVaps.HeightAltimeter = out_Hotn; modelToVaps.DangerousHeight = 50; modelToVaps.Ny.Value = out_ny; modelToVaps.Ny.Min = -0.5; modelToVaps.Ny.Max = out_nyMax; modelToVaps.Nx.Value = 0; modelToVaps.Nx.Min = 0; modelToVaps.Nx.Max = 0; modelToVaps.Nz.Value = out_nz; modelToVaps.Nz.Min = 0; modelToVaps.Nz.Max = 0; modelToVaps.HeadingWind = in_WindDir; modelToVaps.HorizontalWindSpeed = in_WindPwrHorz; modelToVaps.MaxPermissibleWindSpeed = 25; modelToVaps.Mechanization[0] = 0; modelToVaps.Mechanization[1] = 0; modelToVaps.Mechanization[2] = 0; modelToVaps.Mechanization[3] = 0; var dgram = ConvertHelper.ObjectToByte(modelToVaps); for (int i = 68; i < dgram.Length; i = i + 8) { Array.Reverse(dgram, i, 8); } return(dgram); }
public virtual byte[] GetForVaps(DynamicModelToVaps modelToVaps) { return(new byte[1]); }
public override byte[] GetForVaps(DynamicModelToVaps modelToVaps) { double Vpth = Math.Sqrt(KinematicsState.AbsSpeed.X * KinematicsState.AbsSpeed.X + KinematicsState.AbsSpeed.Z * KinematicsState.AbsSpeed.Z); // м/с double PsiP = Math.Asin(KinematicsState.AbsSpeed.Z / Vpth); double D2R = 180 / Math.PI; double Psi = KinematicsState.Angs.Psi; double psi_hi, psi_p_hi; // значения угла курса и путевого угла +-Pi (+-180) if (PsiP >= 0) { psi_p_hi = PsiP; } else { psi_p_hi = PsiP - 2.0 * Math.PI; // путевой угол +-Pi (+-180) } if (Psi >= 0) { psi_hi = Psi; } else { psi_hi = Psi - 2.0 * Math.PI; // угол курса +-Pi (+-180) } double hi = psi_p_hi - psi_hi; // угол сноса +-Pi (+-180) if (hi >= Math.PI) { hi = hi - 2.0 * Math.PI; } if (hi <= -Math.PI) { hi = hi + 2.0 * Math.PI; } double Tetr = 0; // угол наклона траектории, рад // 1 вариант if (VhclOutp.InstrumentsState.TAS != 0) { Tetr = Math.Asin(KinematicsState.AbsSpeed.Y / VhclOutp.InstrumentsState.TAS); } // 2 вариант, альтернативно // истинная воздушная скорость полета double Vp = Math.Sqrt( KinematicsState.AbsSpeed.X * KinematicsState.AbsSpeed.X + KinematicsState.AbsSpeed.Y * KinematicsState.AbsSpeed.Y + KinematicsState.AbsSpeed.Z * KinematicsState.AbsSpeed.Z); //(кинематическая)м / с if (Vp != 0) { Tetr = Math.Asin(KinematicsState.AbsSpeed.Y / Vp); } // ограничение для обоих вараинтов if (Tetr > Math.PI / 2.0) { Tetr = Tetr - Math.PI / 2.0; } if (Tetr < -Math.PI / 2.0) { Tetr = Tetr + Math.PI / 2.0; } //todo: тут нужно заполнить модель modelToVaps.Eng1.N = VhclOutp.EngLeft.N1; modelToVaps.Eng1.Mode = 1; modelToVaps.Eng1.Egt = VhclOutp.EngLeft.Egt; modelToVaps.Eng1.MaxAllowedEgt = 705; modelToVaps.Eng1.EmergencyEgt = 735; modelToVaps.Eng1.EngState = 1; modelToVaps.Eng1.FuelFlow = VhclOutp.EngLeft.FuelFlow; modelToVaps.Eng2.N = VhclOutp.EngRight.N1; modelToVaps.Eng2.Mode = 1; modelToVaps.Eng2.Egt = VhclOutp.EngRight.Egt; modelToVaps.Eng2.MaxAllowedEgt = 705; modelToVaps.Eng2.EmergencyEgt = 735; modelToVaps.Eng2.EngState = 1; modelToVaps.Eng2.FuelFlow = VhclOutp.EngRight.FuelFlow; modelToVaps.ModeFly = 1; modelToVaps.RemainingFuel = VhclOutp.InstrumentsState.FuelMass; modelToVaps.RotorSpeed = VhclOutp.InstrumentsState.RotorRPM; //todo: нужно написать условия о смене значения от скорости ///98 - до 200 ///93 - от 200 до 270 ///91 - от 270 до 300 modelToVaps.MaximumPermissibleRotor = 93; modelToVaps.TotalRotor = VhclOutp.InstrumentsState.CollectivePitch; modelToVaps.RecommendedValueRotor = 0; modelToVaps.HeadingCurrent = 360.0 - KinematicsState.Angs.Psi; modelToVaps.HeadingTrack = PsiP * D2R; modelToVaps.AngleDrift = hi * D2R; modelToVaps.Angleslip = VhclOutp.InstrumentsState.AirPars.Beta; modelToVaps.RollCurrent = KinematicsState.Angs.Gam; //modelToVaps.MaximumPermissibleRoll = VhclInp.FCSState.RoolLimit; modelToVaps.RecommendedRollValue = 0; modelToVaps.PitchCurrent = KinematicsState.Angs.Fi; modelToVaps.RecommendedPitchValue = 0; modelToVaps.RermissiblePitchPitching = 60; modelToVaps.PermissiblePitchDiving = -60; modelToVaps.AngleAttack = VhclOutp.InstrumentsState.AirPars.AOA; modelToVaps.PermissibleAngleAttack = 0; modelToVaps.PositionBall = VhclOutp.InstrumentsState.SlipBallPos; modelToVaps.AngleTrajectory = Tetr * D2R; modelToVaps.Vy = VhclOutp.InstrumentsState.VyVar; modelToVaps.MinVy = -5; modelToVaps.MaxVy = +5; modelToVaps.InstrumentSpeedCurrent = VhclOutp.InstrumentsState.IAS * 3.6; modelToVaps.MaxInstrumentSpeed = 300; modelToVaps.MinInstrumentSpeed = 50; modelToVaps.SpeedX = VhclOutp.InstrumentsState.VsurfX; modelToVaps.SpeedZ = VhclOutp.InstrumentsState.VsurfZ; modelToVaps.RecommendedDiveSpeed = 0; modelToVaps.RecommendedSpeedDiveEnd = 0; modelToVaps.TrueSpeedCurrent = VhclOutp.InstrumentsState.TAS * 3.6; modelToVaps.GroundSpeedX = KinematicsState.AbsSpeed.X * 3.6; modelToVaps.GroundSpeedZ = KinematicsState.AbsSpeed.Z * 3.6; modelToVaps.Mach = VhclOutp.InstrumentsState.TAS / 343.0; modelToVaps.RelativeHeight = KinematicsState.Pos.Elevation; modelToVaps.BarometricHeight = VhclOutp.InstrumentsState.Hbaro; modelToVaps.Pressure = VhclInp.VehicleCtrl.AltimeterBaroPressure; //минус высота рельефа modelToVaps.HeightAltimeter = KinematicsState.Pos.Elevation; modelToVaps.DangerousHeight = 50; modelToVaps.Ny.Value = VhclOutp.InstrumentsState.GLoad.Y; modelToVaps.Ny.Min = -0.5; modelToVaps.Ny.Max = 2.5; modelToVaps.Nx.Value = VhclOutp.InstrumentsState.GLoad.X; modelToVaps.Nx.Min = 0; modelToVaps.Nx.Max = 0; modelToVaps.Nz.Value = VhclOutp.InstrumentsState.GLoad.Z; modelToVaps.Nz.Min = 0; modelToVaps.Nz.Max = 0; modelToVaps.HeadingWind = 0; modelToVaps.HorizontalWindSpeed = Math.Sqrt( VhclInp.AirState.WindSpeed.X * VhclInp.AirState.WindSpeed.X + VhclInp.AirState.WindSpeed.Z * VhclInp.AirState.WindSpeed.Z); modelToVaps.MaxPermissibleWindSpeed = 25; modelToVaps.Mechanization[0] = VhclOutp.NoseGear.RodShift; modelToVaps.Mechanization[1] = VhclOutp.NoseGear.TireShift; modelToVaps.Mechanization[2] = VhclOutp.NoseGear.WheelRot; modelToVaps.Mechanization[3] = VhclOutp.NoseGear.WheelSteer; modelToVaps.Mechanization[4] = VhclOutp.MainGearLeft.RodShift; modelToVaps.Mechanization[5] = VhclOutp.MainGearLeft.TireShift; modelToVaps.Mechanization[6] = VhclOutp.MainGearLeft.WheelRot; modelToVaps.Mechanization[7] = VhclOutp.MainGearLeft.WheelSteer; modelToVaps.Mechanization[8] = VhclOutp.MainGearRight.RodShift; modelToVaps.Mechanization[9] = VhclOutp.MainGearRight.TireShift; modelToVaps.Mechanization[10] = VhclOutp.MainGearRight.WheelRot; modelToVaps.Mechanization[11] = VhclOutp.MainGearRight.WheelSteer; var dgram = ConvertHelper.ObjectToByte(modelToVaps); for (int i = 68; i < dgram.Length; i = i + 8) { Array.Reverse(dgram, i, 8); } return(dgram); }
public override byte[] GetForVaps(DynamicModelToVaps modelToVaps) { //todo: тут нужно заполнить модель modelToVaps.Eng1.N = VhclOutp.EngLeft.N1; modelToVaps.Eng1.Mode = 1; modelToVaps.Eng1.Egt = VhclOutp.EngLeft.Egt; modelToVaps.Eng1.MaxAllowedEgt = 0; modelToVaps.Eng1.EmergencyEgt = 0; modelToVaps.Eng1.EngState = 1; modelToVaps.Eng1.FuelFlow = VhclOutp.EngLeft.FuelFlow; modelToVaps.Eng2.N = VhclOutp.EngRight.N1; modelToVaps.Eng2.Mode = 1; modelToVaps.Eng2.Egt = VhclOutp.EngRight.Egt; modelToVaps.Eng2.MaxAllowedEgt = 0; modelToVaps.Eng2.EmergencyEgt = 0; modelToVaps.Eng2.EngState = 1; modelToVaps.Eng2.FuelFlow = VhclOutp.EngRight.FuelFlow; modelToVaps.ModeFly = 1; modelToVaps.RemainingFuel = 0; modelToVaps.RotorSpeed = VhclOutp.RotorRPM; modelToVaps.MaximumPermissibleRotor = 0; modelToVaps.TotalRotor = VhclOutp.CollectivePitch; modelToVaps.RecommendedValueRotor = 0; modelToVaps.HeadingCurrent = KinematicsState.Angs.Psi; modelToVaps.HeadingTrack = 0; modelToVaps.AngleDrift = 0; modelToVaps.Angleslip = 0; modelToVaps.RollCurrent = KinematicsState.Angs.Gam; modelToVaps.MaximumPermissibleRoll = 0; modelToVaps.RecommendedRollValue = 0; modelToVaps.PitchCurrent = KinematicsState.Angs.Fi; modelToVaps.RecommendedPitchValue = 0; modelToVaps.RermissiblePitchPitching = 0; modelToVaps.PermissiblePitchDiving = 0; modelToVaps.AngleAttack = 0; modelToVaps.PermissibleAngleAttack = 0; modelToVaps.PositionBall = 0; modelToVaps.AngleTrajectory = 0; modelToVaps.Vy = 0; modelToVaps.MinVy = 0; modelToVaps.MaxVy = 0; modelToVaps.InstrumentSpeedCurrent = 0; modelToVaps.MaxInstrumentSpeed = 0; modelToVaps.MinInstrumentSpeed = 0; modelToVaps.SpeedX = KinematicsState.Accel.X; modelToVaps.SpeedZ = KinematicsState.Accel.X; modelToVaps.RecommendedDiveSpeed = 0; modelToVaps.RecommendedSpeedDiveEnd = 0; modelToVaps.TrueSpeedCurrent = 0; modelToVaps.GroundSpeedX = 0; modelToVaps.GroundSpeedZ = 0; modelToVaps.Mach = 0; modelToVaps.RelativeHeight = KinematicsState.Pos.Elevation; modelToVaps.BarometricHeight = 0; modelToVaps.Pressure = 0; modelToVaps.HeightAltimeter = 0; modelToVaps.DangerousHeight = 0; modelToVaps.Ny.Value = 0; modelToVaps.Ny.Min = 0; modelToVaps.Ny.Max = 0; modelToVaps.Nx.Value = 0; modelToVaps.Nx.Min = 0; modelToVaps.Nx.Max = 0; modelToVaps.Nz.Value = 0; modelToVaps.Nz.Min = 0; modelToVaps.Nz.Max = 0; modelToVaps.HeadingWind = 0; modelToVaps.HorizontalWindSpeed = 0; modelToVaps.MaxPermissibleWindSpeed = 0; modelToVaps.Mechanization[0] = VhclOutp.NoseGear.RodShift; modelToVaps.Mechanization[1] = VhclOutp.NoseGear.TireShift; modelToVaps.Mechanization[2] = VhclOutp.NoseGear.WheelRot; modelToVaps.Mechanization[3] = VhclOutp.NoseGear.WheelSteer; modelToVaps.Mechanization[4] = VhclOutp.MainGearLeft.RodShift; modelToVaps.Mechanization[5] = VhclOutp.MainGearLeft.TireShift; modelToVaps.Mechanization[6] = VhclOutp.MainGearLeft.WheelRot; modelToVaps.Mechanization[7] = VhclOutp.MainGearLeft.WheelSteer; modelToVaps.Mechanization[8] = VhclOutp.MainGearRight.RodShift; modelToVaps.Mechanization[9] = VhclOutp.MainGearRight.TireShift; modelToVaps.Mechanization[10] = VhclOutp.MainGearRight.WheelRot; modelToVaps.Mechanization[11] = VhclOutp.MainGearRight.WheelSteer; var dgram = ConvertHelper.ObjectToByte(modelToVaps); for (int i = 68; i < dgram.Length; i = i + 8) { Array.Reverse(dgram, i, 8); } return(dgram); }