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) { } }
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); }