public void Adapt(IInstrument instrument, F4TexSharedMem.IReader texSharedMemReader, Rectangle sourceRectangle, InstrumentType instrumentType)
            {
                if (instrument == null || instrument.Renderer as IMfdRenderer == null)
                {
                    return;
                }

                var mfd = instrument.Renderer as IMfdRenderer;

                try
                {
                    mfd.InstrumentState.TestMode = Extractor.State.OptionsFormIsShowing;
                    if ((NetworkMode)Settings.Default.NetworkingMode == NetworkMode.Client && instrument.Form != null && instrument.Form.Visible)
                    {
                        mfd.InstrumentState.SourceImage = ExtractorClient.GetInstrumentImage(instrumentType);
                    }
                    else if (!mfd.InstrumentState.TestMode)
                    {
                        mfd.InstrumentState.SourceImage = sourceRectangle.IsEmpty
                            ? null
                            : texSharedMemReader != null?texSharedMemReader.GetImage(sourceRectangle) : null;
                    }
                    mfd.InstrumentState.SourceRectangle = mfd.InstrumentState.SourceImage != null ? new Rectangle(0, 0, mfd.InstrumentState.SourceImage.Width, mfd.InstrumentState.SourceImage.Height) : Rectangle.Empty;
                    mfd.InstrumentState.Blank           = !Extractor.State.SimRunning;
                    if (!Extractor.State.Running || !Extractor.State.KeepRunning)
                    {
                        mfd.InstrumentState.SourceImage = null;
                    }
                    if ((NetworkMode)Settings.Default.NetworkingMode == NetworkMode.Server)
                    {
                        ExtractorServer.SetInstrumentImage(mfd.InstrumentState.SourceImage, instrumentType);
                    }
                }
                catch (InvalidOperationException) { }
                catch (AccessViolationException) { }
            }
Exemple #2
0
        public void UpdateRendererStatesFromFlightData(
            IDictionary <InstrumentType, IInstrument> instruments,
            FlightData flightData,
            TerrainDB terrainDB,
            Action updateEHSIBrightnessLabelVisibility,
            F4TexSharedMem.IReader texSharedmemReader)
        {
            if (flightData == null || (Extractor.State.NetworkMode != NetworkMode.Client && !Extractor.State.SimRunning))
            {
                flightData = new FlightData {
                    hsiBits = Int32.MaxValue
                };
            }
            var hsi  = instruments[InstrumentType.HSI].Renderer as IHorizontalSituationIndicator;
            var ehsi = instruments[InstrumentType.EHSI].Renderer as IEHSI;
            var adi  = instruments[InstrumentType.ADI].Renderer as IADI;
            var isis = instruments[InstrumentType.ISIS].Renderer as IISIS;


            if (Extractor.State.SimRunning || Extractor.State.NetworkMode == NetworkMode.Client || Extractor.State.OptionsFormIsShowing)
            {
                var hsibits = ((HsiBits)flightData.hsiBits);
                if (Extractor.State.NetworkMode != NetworkMode.Client)
                {
                    var altitudeAgl = _radarAltitudeCalculator.ComputeRadarAltitude(flightData, terrainDB);
                    if (flightData.ExtensionData == null)
                    {
                        flightData.ExtensionData = new FlightDataExtensionData();
                    }
                    (flightData.ExtensionData as FlightDataExtensionData).AltitudeAGL = altitudeAgl;
                }
                _flightDataAdapterSet.ISIS.Adapt(instruments[InstrumentType.ISIS].Renderer as IISIS, flightData);
                _flightDataAdapterSet.VVI.Adapt(instruments[InstrumentType.VVI].Renderer as IVerticalVelocityIndicator, flightData);
                _flightDataAdapterSet.Altimeter.Adapt(instruments[InstrumentType.Altimeter].Renderer as IAltimeter, flightData);
                _flightDataAdapterSet.AirspeedIndicator.Adapt(instruments[InstrumentType.ASI].Renderer as IAirspeedIndicator, flightData);
                _flightDataAdapterSet.Compass.Adapt(instruments[InstrumentType.Compass].Renderer as ICompass, flightData);
                _flightDataAdapterSet.AOAIndicator.Adapt(instruments[InstrumentType.AOAIndicator].Renderer as IAngleOfAttackIndicator, flightData);
                _flightDataAdapterSet.AOAIndexer.Adapt(instruments[InstrumentType.AOAIndexer].Renderer as IAngleOfAttackIndexer, flightData);
                UpdateADI(instruments[InstrumentType.ADI].Renderer as IADI, hsibits);
                _flightDataAdapterSet.StandbyADI.Adapt(instruments[InstrumentType.BackupADI].Renderer as IStandbyADI, flightData);
                UpdateHSI(instruments[InstrumentType.HSI].Renderer as IHorizontalSituationIndicator, instruments[InstrumentType.EHSI].Renderer as IEHSI, hsibits, flightData);


                //***** UPDATE SOME COMPLEX HSI/ADI VARIABLES
                if (ADIIsTurnedOff(hsibits))
                {
                    SetADIToOffState(instruments[InstrumentType.ADI].Renderer as IADI);
                    SetISISToOffState(instruments[InstrumentType.ISIS].Renderer as IISIS);
                }
                else
                {
                    SetADIPitchAndRoll(instruments[InstrumentType.ADI].Renderer as IADI, flightData);
                    SetISISPitchAndRoll(instruments[InstrumentType.ISIS].Renderer as IISIS, flightData);

                    //The following floating data is also crossed up in the flightData.h File:
                    //float AdiIlsHorPos;       // Position of horizontal ILS bar ----Vertical
                    //float AdiIlsVerPos;       // Position of vertical ILS bar-----horizontal
                    var commandBarsOn = ((float)(Math.Abs(Math.Round(flightData.AdiIlsHorPos, 4))) != 0.1745f);
                    if ((Math.Abs((flightData.AdiIlsVerPos / Common.Math.Constants.RADIANS_PER_DEGREE)) > 1.0f)
                        ||
                        (Math.Abs((flightData.AdiIlsHorPos / Common.Math.Constants.RADIANS_PER_DEGREE)) > 5.0f))
                    {
                        commandBarsOn = false;
                    }
                    hsi.InstrumentState.ShowToFromFlag  = true;
                    ehsi.InstrumentState.ShowToFromFlag = true;

                    //if the TOTALFLAGS flag is off, then we're most likely in NAV mode
                    if ((hsibits & HsiBits.TotalFlags) != HsiBits.TotalFlags)
                    {
                        hsi.InstrumentState.ShowToFromFlag  = false;
                        ehsi.InstrumentState.ShowToFromFlag = false;
                    }
                    //if the TO/FROM flag is showing in shared memory, then we are most likely in TACAN mode
                    else if ((((hsibits & HsiBits.ToTrue) == HsiBits.ToTrue)
                              ||
                              ((hsibits & HsiBits.FromTrue) == HsiBits.FromTrue)))
                    {
                        if (!commandBarsOn) //better make sure we're not in any ILS mode too though
                        {
                            hsi.InstrumentState.ShowToFromFlag  = true;
                            ehsi.InstrumentState.ShowToFromFlag = true;
                        }
                    }

                    //if the glideslope or localizer flags on the ADI are turned on, then we must be in an ILS mode and therefore we
                    //know we don't need to show the HSI TO/FROM flags.
                    if (((hsibits & HsiBits.ADI_GS) == HsiBits.ADI_GS)
                        ||
                        ((hsibits & HsiBits.ADI_LOC) == HsiBits.ADI_LOC))
                    {
                        hsi.InstrumentState.ShowToFromFlag  = false;
                        ehsi.InstrumentState.ShowToFromFlag = false;
                    }
                    if (commandBarsOn)
                    {
                        hsi.InstrumentState.ShowToFromFlag  = false;
                        ehsi.InstrumentState.ShowToFromFlag = false;
                    }
                    adi.InstrumentState.ShowCommandBars            = commandBarsOn;
                    adi.InstrumentState.GlideslopeDeviationDegrees = flightData.AdiIlsVerPos / Common.Math.Constants.RADIANS_PER_DEGREE;
                    adi.InstrumentState.LocalizerDeviationDegrees  = flightData.AdiIlsHorPos / Common.Math.Constants.RADIANS_PER_DEGREE;

                    isis.InstrumentState.ShowCommandBars            = commandBarsOn;
                    isis.InstrumentState.GlideslopeDeviationDegrees = flightData.AdiIlsVerPos / Common.Math.Constants.RADIANS_PER_DEGREE;
                    isis.InstrumentState.LocalizerDeviationDegrees  = flightData.AdiIlsHorPos / Common.Math.Constants.RADIANS_PER_DEGREE;
                }

                UpdateNavigationMode(hsi, ehsi, adi, isis, flightData);
                if (((hsibits & HsiBits.HSI_OFF) == HsiBits.HSI_OFF))
                {
                    TurnOffHSI(hsi);
                    TurnOffEHSI(ehsi);
                }
                else
                {
                    UpdateHSIFlightData(hsi, flightData, hsibits);
                    UpdateEHSIFlightData(ehsi, flightData, hsibits);
                }

                UpdateHSIAndEHSICourseDeviationAndToFromFlags(hsi, ehsi);
                UpdateEHSI(updateEHSIBrightnessLabelVisibility);
                _flightDataAdapterSet.HYDA.Adapt(instruments[InstrumentType.HYDA].Renderer as IHydraulicPressureGauge, flightData);
                _flightDataAdapterSet.HYDB.Adapt(instruments[InstrumentType.HYDB].Renderer as IHydraulicPressureGauge, flightData);
                _flightDataAdapterSet.CabinPress.Adapt(instruments[InstrumentType.CabinPress].Renderer as ICabinPressureAltitudeIndicator, flightData);
                _flightDataAdapterSet.RollTrim.Adapt(instruments[InstrumentType.RollTrim].Renderer as IRollTrimIndicator, flightData);
                _flightDataAdapterSet.PitchTrim.Adapt(instruments[InstrumentType.PitchTrim].Renderer as IPitchTrimIndicator, flightData);
                _flightDataAdapterSet.AzimuthIndicator.Adapt(instruments[InstrumentType.AzimuthIndicator].Renderer as IAzimuthIndicator, flightData);
                _flightDataAdapterSet.RWR.Adapt(instruments[InstrumentType.RWR].Renderer as IRWRRenderer, flightData);
                _flightDataAdapterSet.CautionPanel.Adapt(instruments[InstrumentType.CautionPanel].Renderer as ICautionPanel, flightData);
                _flightDataAdapterSet.CMDS.Adapt(instruments[InstrumentType.CMDS].Renderer as ICMDSPanel, flightData);
                _flightDataAdapterSet.DED.Adapt(instruments[InstrumentType.DED].Renderer as IDataEntryDisplayPilotFaultList, flightData);
                _flightDataAdapterSet.PFL.Adapt(instruments[InstrumentType.PFL].Renderer as IDataEntryDisplayPilotFaultList, flightData);
                _flightDataAdapterSet.EPUFuel.Adapt(instruments[InstrumentType.EPUFuel].Renderer as IEPUFuelGauge, flightData);
                _flightDataAdapterSet.FuelFlow.Adapt(instruments[InstrumentType.FuelFlow].Renderer as IFuelFlow, flightData);
                _flightDataAdapterSet.FuelQuantity.Adapt(instruments[InstrumentType.FuelQuantity].Renderer as IFuelQuantityIndicator, flightData);
                _flightDataAdapterSet.LandingGearLights.Adapt(instruments[InstrumentType.GearLights].Renderer as ILandingGearWheelsLights, flightData);
                _flightDataAdapterSet.NWS.Adapt(instruments[InstrumentType.NWSIndexer].Renderer as INosewheelSteeringIndexer, flightData);
                _flightDataAdapterSet.Speedbrake.Adapt(instruments[InstrumentType.Speedbrake].Renderer as ISpeedbrakeIndicator, flightData);
                _flightDataAdapterSet.RPM1.Adapt(instruments[InstrumentType.RPM1].Renderer as ITachometer, flightData);
                _flightDataAdapterSet.RPM2.Adapt(instruments[InstrumentType.RPM2].Renderer as ITachometer, flightData);
                _flightDataAdapterSet.FTIT1.Adapt(instruments[InstrumentType.FTIT1].Renderer as IFanTurbineInletTemperature, flightData);
                _flightDataAdapterSet.FTIT2.Adapt(instruments[InstrumentType.FTIT2].Renderer as IFanTurbineInletTemperature, flightData);
                _flightDataAdapterSet.NOZ1.Adapt(instruments[InstrumentType.NOZ1].Renderer as INozzlePositionIndicator, flightData);
                _flightDataAdapterSet.NOZ2.Adapt(instruments[InstrumentType.NOZ2].Renderer as INozzlePositionIndicator, flightData);
                _flightDataAdapterSet.OIL1.Adapt(instruments[InstrumentType.OIL1].Renderer as IOilPressureGauge, flightData);
                _flightDataAdapterSet.OIL2.Adapt(instruments[InstrumentType.OIL2].Renderer as IOilPressureGauge, flightData);
                _flightDataAdapterSet.Accelerometer.Adapt(instruments[InstrumentType.Accelerometer].Renderer as IAccelerometer, flightData);
            }
            else //Falcon's not running
            {
                if (instruments[InstrumentType.VVI].Renderer is IVerticalVelocityIndicatorEU)
                {
                    ((IVerticalVelocityIndicatorEU)instruments[InstrumentType.VVI].Renderer).InstrumentState.OffFlag = true;
                }
                else if (instruments[InstrumentType.VVI].Renderer is IVerticalVelocityIndicatorUSA)
                {
                    ((IVerticalVelocityIndicatorUSA)instruments[InstrumentType.VVI].Renderer).InstrumentState.OffFlag = true;
                }
                ((IAngleOfAttackIndicator)(instruments[InstrumentType.AOAIndicator].Renderer)).InstrumentState.OffFlag = true;
                hsi.InstrumentState.OffFlag     = true;
                ehsi.InstrumentState.NoDataFlag = true;
                ((IADI)instruments[InstrumentType.ADI].Renderer).InstrumentState.OffFlag = true;
                ((IStandbyADI)instruments[InstrumentType.BackupADI].Renderer).InstrumentState.OffFlag = true;
                ((IAzimuthIndicator)instruments[InstrumentType.AzimuthIndicator].Renderer).InstrumentState.RWRPowerOn = false;
                ((IISIS)instruments[InstrumentType.ISIS].Renderer).InstrumentState.RadarAltitudeAGL = 0;
                ((IISIS)instruments[InstrumentType.ISIS].Renderer).InstrumentState.OffFlag          = true;
                updateEHSIBrightnessLabelVisibility();
            }
            _flightDataAdapterSet.LMFD.Adapt(instruments[InstrumentType.LMFD], texSharedmemReader, _textureTexturesSharedMemoryImageCoordinates.LMFD, InstrumentType.LMFD);
            _flightDataAdapterSet.RMFD.Adapt(instruments[InstrumentType.RMFD], texSharedmemReader, _textureTexturesSharedMemoryImageCoordinates.RMFD, InstrumentType.RMFD);
            _flightDataAdapterSet.MFD3.Adapt(instruments[InstrumentType.MFD3], texSharedmemReader, _textureTexturesSharedMemoryImageCoordinates.MFD3, InstrumentType.MFD3);
            _flightDataAdapterSet.MFD4.Adapt(instruments[InstrumentType.MFD4], texSharedmemReader, _textureTexturesSharedMemoryImageCoordinates.MFD4, InstrumentType.MFD4);
            _flightDataAdapterSet.HUD.Adapt(instruments[InstrumentType.HUD], texSharedmemReader, _textureTexturesSharedMemoryImageCoordinates.HUD, InstrumentType.HUD);
        }