Example #1
0
        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");
        }
Example #2
0
        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);
        }
Example #3
0
 public virtual byte[] GetForVaps(DynamicModelToVaps modelToVaps)
 {
     return(new byte[1]);
 }
Example #4
0
        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);
        }
Example #5
0
        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);
        }