Example #1
0
 private void CreateSharedMemReaderIfNotExists()
 {
     if (_sharedMemReader == null && !Settings.Default.RunAsClient)
     {
         _sharedMemReader = new F4SharedMem.Reader();
     }
 }
Example #2
0
 private void Dispose(bool disposing)
 {
     if (!_isDisposed)
     {
         if (disposing)
         {
             //dispose of managed resources here
             Common.Util.DisposeObject(_keyFile);
             _keyFile = null;
             Common.Util.DisposeObject(_sharedMemReader);
             _sharedMemReader = null;
             Common.Util.DisposeObject(_texSharedMemReader);
             _texSharedMemReader = null;
             Common.Util.DisposeObject(_pendingComboKeys);
             _pendingComboKeys = null;
             Common.Util.DisposeObject(_terrainDB);
             _terrainDB = null;
         }
     }
     // Code to dispose the un-managed resources of the class
     _isDisposed = true;
 }
Example #3
0
 public BMSReaderWrapper(Reader BMSreader)
 {
     this.BMSreader = BMSreader;
 }
Example #4
0
        public void UpdateManagerFlightData()
        {
            GetNextMorseCodeUnit();

            if (Settings.Default.RunAsClient)
            {
                PerformClientSideFlightDataUpdates();
                return;
            }

            FlightData flightData = Manager.FlightData;

            string exePath = F4Utils.Process.Util.GetFalconExePath();

            CreateSharedMemReaderIfNotExists();
            F4SharedMem.FlightData fromFalcon = ReadF4SharedMem();

            if (_keyFile == null)
            {
                LoadCurrentKeyFile();
            }
            EnsureTerrainIsLoaded();

            if (exePath != null && ((_sharedMemReader != null && _sharedMemReader.IsFalconRunning)))
            {
                IsSimRunning = true;
                if (fromFalcon == null)
                {
                    fromFalcon = new F4SharedMem.FlightData();
                }
                var hsibits = ((HsiBits)fromFalcon.hsiBits);

                flightData.VviOffFlag = ((hsibits & HsiBits.VVI) == HsiBits.VVI);
                flightData.AoaOffFlag = ((hsibits & HsiBits.AOA) == HsiBits.AOA);
                flightData.HsiOffFlag = ((hsibits & HsiBits.HSI_OFF) == HsiBits.HSI_OFF);
                flightData.AdiOffFlag = ((hsibits & HsiBits.ADI_OFF) == HsiBits.ADI_OFF);
                flightData.PfdOffFlag = false;

                UpdateCpdPowerState(flightData, fromFalcon);

                flightData.RadarAltimeterOffFlag = ((fromFalcon.lightBits & (int)LightBits.RadarAlt) ==
                                                    (int)LightBits.RadarAlt);
                flightData.BarometricPressure = (fromFalcon.AltCalReading / 100.00f);
                flightData.AltimeterUnits     = (((AltBits)fromFalcon.altBits & AltBits.CalType) == AltBits.CalType) ? AltimeterUnits.Hg : AltimeterUnits.hPa;
                flightData.AltimeterMode      = (((AltBits)fromFalcon.altBits & AltBits.PneuFlag) == AltBits.PneuFlag) ? AltimeterMode.Pneumatic : AltimeterMode.Electronic;
                switch (fromFalcon.navMode)
                {
                case (byte)F4SharedMem.Headers.NavModes.ILS_NAV:
                    flightData.NavMode = NavModes.IlsNav;
                    break;

                case (byte)F4SharedMem.Headers.NavModes.ILS_TACAN:
                    flightData.NavMode = NavModes.IlsTcn;
                    break;

                case (byte)F4SharedMem.Headers.NavModes.TACAN:
                    flightData.NavMode = NavModes.Tcn;
                    break;

                case (byte)F4SharedMem.Headers.NavModes.NAV:
                    flightData.NavMode = NavModes.Nav;
                    break;
                }
                UpdateIndicatedAltitude(flightData, fromFalcon);
                UpdateAltitudeAGL(flightData, fromFalcon);
                UpdateIndicatedAirspeed(flightData, fromFalcon);
                UpdateALOW(flightData, fromFalcon);

                flightData.TrueAirspeedInDecimalFeetPerSecond = fromFalcon.vt;
                flightData.MachNumber = fromFalcon.mach;
                flightData.GroundSpeedInDecimalFeetPerSecond =
                    (float)Math.Sqrt((fromFalcon.xDot * fromFalcon.xDot) + (fromFalcon.yDot * fromFalcon.yDot));

                flightData.MagneticHeadingInDecimalDegrees = (360 +
                                                              (fromFalcon.yaw / Common.Math.Constants.RADIANS_PER_DEGREE)) %
                                                             360;


                UpdateVerticalVelocity(flightData, fromFalcon, hsibits);

                flightData.AngleOfAttackInDegrees = ((hsibits & HsiBits.AOA) == HsiBits.AOA) ? 0 : fromFalcon.alpha;

                flightData.AdiAuxFlag = ((hsibits & HsiBits.ADI_AUX) == HsiBits.ADI_AUX);
                flightData.AdiGlideslopeInvalidFlag = ((hsibits & HsiBits.ADI_GS) == HsiBits.ADI_GS);
                flightData.AdiLocalizerInvalidFlag  = ((hsibits & HsiBits.ADI_LOC) == HsiBits.ADI_LOC);

                UpdateMarkerBeaconLight(flightData, fromFalcon);

                if (((hsibits & HsiBits.ADI_OFF) == HsiBits.ADI_OFF))
                {
                    TurnOffADI(flightData);
                }
                else
                {
                    flightData.PitchAngleInDecimalDegrees = ((fromFalcon.pitch / Common.Math.Constants.RADIANS_PER_DEGREE));
                    flightData.RollAngleInDecimalDegrees  = fromFalcon.roll / Common.Math.Constants.RADIANS_PER_DEGREE;
                    flightData.BetaAngleInDecimalDegrees  = fromFalcon.beta;
                    flightData.GammaAngleInDecimalDegrees = fromFalcon.gamma / Common.Math.Constants.RADIANS_PER_DEGREE;
                    flightData.WindOffsetToFlightPathMarkerInDecimalDegrees = fromFalcon.windOffset /
                                                                              Common.Math.Constants.RADIANS_PER_DEGREE;

                    flightData.AdiIlsGlideslopeDeviationInDecimalDegrees = fromFalcon.AdiIlsVerPos /
                                                                           Common.Math.Constants.RADIANS_PER_DEGREE;
                    flightData.AdiIlsLocalizerDeviationInDecimalDegrees = fromFalcon.AdiIlsHorPos /
                                                                          Common.Math.Constants.RADIANS_PER_DEGREE;

                    UpdateHSIToFromFlagVisibilityAndADICommandBarsVisibilityBasedOnBMS4NavMode(flightData, fromFalcon);
                }


                UpdateHSIData(flightData, fromFalcon, hsibits);

                flightData.RateOfTurnInDecimalDegreesPerSecond = _indicatedRateOfTurnCalculator.DetermineIndicatedRateOfTurn(flightData.MagneticHeadingInDecimalDegrees);

                UpdateTACANChannel(flightData, fromFalcon);
                UpdateMapPosition(flightData, fromFalcon);
                flightData.LMFDImage = GetLMFDImage();
                flightData.RMFDImage = GetRMFDImage();
            }
            else //Falcon's not running
            {
                IsSimRunning = false;
                if (Settings.Default.ShutoffIfFalconNotRunning)
                {
                    TurnOffAllInstruments(flightData);
                }


                if (_sharedMemReader != null)
                {
                    Common.Util.DisposeObject(_sharedMemReader);
                    _sharedMemReader = null;
                }
                if (_texSharedMemReader != null)
                {
                    Common.Util.DisposeObject(_texSharedMemReader);
                    _texSharedMemReader = null;
                }

                Common.Util.DisposeObject(_keyFile);
                Common.Util.DisposeObject(_terrainDB);
                _keyFile   = null;
                _terrainDB = null;
            }

            //if running in server mode, send updated flight data to client
            if (Settings.Default.RunAsServer)
            {
                F16CPDServer.SetSimProperty("F4FlightData", Common.Serialization.Util.ToRawBytes(flightData));
            }
        }