Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/LightningGauges/LightningGauges/LightningGauges.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@
<None Include="FodyWeavers.xml">
<SubType>Designer</SubType>
</None>
<EmbeddedResource Include="images\rpm100.bmp" />
<Content Include="ISISDigits.ttf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
Expand Down
60 changes: 50 additions & 10 deletions src/LightningGauges/LightningGauges/Renderers/F16/Tachometer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ public class Tachometer : InstrumentRendererBase, ITachometer
{
private const string RPM_BACKGROUND_IMAGE_FILENAME = "rpm.bmp";
private const string RPM_BACKGROUND2_IMAGE_FILENAME = "rpm2.bmp";
private const string RPM_BACKGROUND100_IMAGE_FILENAME = "rpm100.bmp";

private const string RPM_NEEDLE_IMAGE_FILENAME = "arrow_rpm.bmp";
private const string RPM_NEEDLE_MASK_FILENAME = "arrow_rpmmask.bmp";

private static readonly string IMAGES_FOLDER_NAME = "images";
private static readonly string IMAGES_FOLDER_NAME = "images";

private static Bitmap _background;
private static Bitmap _backgroundPW;
private static Bitmap _background2;
private static ImageMaskPair _needle;
private static readonly object _imagesLock = new object();
Expand All @@ -39,8 +41,10 @@ private static void LoadImageResources()
{
lock (_imagesLock)
{
if (_background == null) _background = (Bitmap) ResourceUtil.LoadBitmapFromEmbeddedResource(IMAGES_FOLDER_NAME + Path.DirectorySeparatorChar + RPM_BACKGROUND_IMAGE_FILENAME);
if (_background2 == null) _background2 = (Bitmap) ResourceUtil.LoadBitmapFromEmbeddedResource(IMAGES_FOLDER_NAME + Path.DirectorySeparatorChar + RPM_BACKGROUND2_IMAGE_FILENAME);

if (_background == null) _background = (Bitmap)ResourceUtil.LoadBitmapFromEmbeddedResource(IMAGES_FOLDER_NAME + Path.DirectorySeparatorChar + RPM_BACKGROUND_IMAGE_FILENAME);
if (_backgroundPW == null) _backgroundPW = (Bitmap)ResourceUtil.LoadBitmapFromEmbeddedResource(IMAGES_FOLDER_NAME + Path.DirectorySeparatorChar + RPM_BACKGROUND100_IMAGE_FILENAME);
if (_background2 == null) _background2 = (Bitmap)ResourceUtil.LoadBitmapFromEmbeddedResource(IMAGES_FOLDER_NAME + Path.DirectorySeparatorChar + RPM_BACKGROUND2_IMAGE_FILENAME);
if (_needle == null)
{
_needle = ResourceUtil.CreateImageMaskPairFromEmbeddedResources(
Expand Down Expand Up @@ -69,7 +73,7 @@ public float RPMPercent
var pct = value;
if (float.IsInfinity(pct) || float.IsNaN(pct)) pct = 0;
if (pct < 0) pct = 0;
if (pct > 110) pct = 110;
if (pct > 100) pct = 100;
_rpmPercent = pct;
}
}
Expand All @@ -78,6 +82,12 @@ public float RPMPercent
public class TachometerOptions
{
public bool IsSecondary { get; set; }
public enum TachometerEngineType
{
PWEngine,
GEEngine
}
public TachometerEngineType EngineType { get; set; }
}

public override void Render(Graphics destinationGraphics, Rectangle destinationRectangle)
Expand All @@ -94,7 +104,7 @@ public override void Render(Graphics destinationGraphics, Rectangle destinationR
destinationGraphics.ResetTransform(); //clear any existing transforms
destinationGraphics.SetClip(destinationRectangle); //set the clipping region on the graphics object to our render rectangle's boundaries
destinationGraphics.FillRectangle(Brushes.Black, destinationRectangle);
destinationGraphics.ScaleTransform(destinationRectangle.Width / (float) width, destinationRectangle.Height / (float) height);
destinationGraphics.ScaleTransform(destinationRectangle.Width / (float)width, destinationRectangle.Height / (float)height);
//set the initial scale transformation
destinationGraphics.TranslateTransform(-39, -39);
//save the basic canvas transform and clip settings so we can revert to them later, as needed
Expand All @@ -109,18 +119,34 @@ public override void Render(Graphics destinationGraphics, Rectangle destinationR
}
else
{
destinationGraphics.DrawImageFast(
_background, new Rectangle(0, 0, _background.Width, _background.Height), new Rectangle(0, 0, _background.Width, _background.Height), GraphicsUnit.Pixel);
if (Options.EngineType == TachometerOptions.TachometerEngineType.GEEngine)
{
destinationGraphics.DrawImageFast(
_background, new Rectangle(0, 0, _background.Width, _background.Height), new Rectangle(0, 0, _background.Width, _background.Height), GraphicsUnit.Pixel);
}
else if (Options.EngineType == TachometerOptions.TachometerEngineType.PWEngine)
{
destinationGraphics.DrawImageFast(
_backgroundPW, new Rectangle(0, 0, _backgroundPW.Width, _backgroundPW.Height), new Rectangle(0, 0, _backgroundPW.Width, _backgroundPW.Height), GraphicsUnit.Pixel);
}

}
GraphicsUtil.RestoreGraphicsState(destinationGraphics, ref basicState);

//draw the needle
GraphicsUtil.RestoreGraphicsState(destinationGraphics, ref basicState);
var angle = GetAngle(InstrumentState.RPMPercent);

var angle = 0f;
if (Options.EngineType == TachometerOptions.TachometerEngineType.GEEngine)
{
angle= GetAngle(InstrumentState.RPMPercent);
}
else if (Options.EngineType == TachometerOptions.TachometerEngineType.PWEngine)
{
angle = GetAnglePW(InstrumentState.RPMPercent);
}
destinationGraphics.TranslateTransform(_background.Width / 2.0f, _background.Width / 2.0f);
destinationGraphics.RotateTransform(angle);
destinationGraphics.TranslateTransform(-(float) _background.Width / 2.0f, -(float) _background.Width / 2.0f);
destinationGraphics.TranslateTransform(-(float)_background.Width / 2.0f, -(float)_background.Width / 2.0f);
destinationGraphics.DrawImageFast(_needle.MaskedImage, new Point(0, 0));
GraphicsUtil.RestoreGraphicsState(destinationGraphics, ref basicState);

Expand All @@ -142,5 +168,19 @@ private static float GetAngle(float RPMPercent)
}
return angle;
}

private static float GetAnglePW(float RPMPercent)
{
float angle = 0;
if (RPMPercent >= 0.0f && RPMPercent <= 60.0f)
{
angle = 1.9f * RPMPercent; //1.7 degrees per of space per 1 percent of readout
}
else if (RPMPercent >= 60.0f)
{
angle = 118.5f + (RPMPercent - 60.0f) * 5.3f; //4.7 degrees of space for 1 percent of readout
}
return angle;
}
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class AzimuthIndicatorFlightDataAdapter : IAzimuthIndicatorFlightDataAdapter
{
public void Adapt(IAzimuthIndicator azimuthIndicator, FlightData flightData)
{
azimuthIndicator.InstrumentState.MagneticHeadingDegrees = (360 + (flightData.yaw / Common.Math.Constants.RADIANS_PER_DEGREE)) % 360;
azimuthIndicator.InstrumentState.MagneticHeadingDegrees = flightData.currentHeading;
azimuthIndicator.InstrumentState.RollDegrees = ((flightData.roll / Common.Math.Constants.RADIANS_PER_DEGREE));
var rwrObjectCount = flightData.RwrObjectCount;
if (flightData.RWRsymbol != null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class CompassFlightDataAdapter : ICompassFlightDataAdapter
{
public void Adapt(ICompass compass, FlightData flightData)
{
compass.InstrumentState.MagneticHeadingDegrees = (360 + (flightData.yaw / Constants.RADIANS_PER_DEGREE)) % 360;
compass.InstrumentState.MagneticHeadingDegrees = flightData.currentHeading;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public void Adapt(IISIS isis, FlightData flightData)
isis.InstrumentState.RadarAltitudeAGL = -flightData.RALT;
isis.InstrumentState.RadarAltitudeValid = (flightData.miscBits & (uint)MiscBits.RALT_Valid) == (uint)MiscBits.RALT_Valid;
isis.InstrumentState.MachNumber = flightData.mach;
isis.InstrumentState.MagneticHeadingDegrees = (360 +(flightData.yaw/Common.Math.Constants.RADIANS_PER_DEGREE))%360;
isis.InstrumentState.MagneticHeadingDegrees = flightData.currentHeading;
isis.InstrumentState.NeverExceedSpeedKnots = 850;
isis.InstrumentState.PitchDegrees = ((flightData.pitch/Common.Math.Constants.RADIANS_PER_DEGREE));
isis.InstrumentState.RollDegrees = ((flightData.roll/Common.Math.Constants.RADIANS_PER_DEGREE));
Expand Down
6 changes: 3 additions & 3 deletions src/MFDExtractor/MFDExtractor/FlightDataUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -384,10 +384,10 @@ private static void UpdateEHSI(Action updateEHSIBrightnessLabelVisibility)
private static void UpdateHSI(IHorizontalSituationIndicator hsi, IEHSI ehsi, HsiBits hsibits, FlightData fromFalcon)
{
hsi.InstrumentState.OffFlag = ((hsibits & HsiBits.HSI_OFF) == HsiBits.HSI_OFF) && !Extractor.State.OptionsFormIsShowing;
hsi.InstrumentState.MagneticHeadingDegrees = (360 + (fromFalcon.yaw / Common.Math.Constants.RADIANS_PER_DEGREE)) % 360;
hsi.InstrumentState.MagneticHeadingDegrees = fromFalcon.currentHeading;
ehsi.InstrumentState.NoDataFlag = ((hsibits & HsiBits.HSI_OFF) == HsiBits.HSI_OFF) && !Extractor.State.OptionsFormIsShowing; ;
ehsi.InstrumentState.NoPowerFlag = ((fromFalcon.powerBits & (int)PowerBits.BusPowerBattery) != (int)PowerBits.BusPowerBattery) && !Extractor.State.OptionsFormIsShowing;
ehsi.InstrumentState.MagneticHeadingDegrees = (360 + (fromFalcon.yaw / Common.Math.Constants.RADIANS_PER_DEGREE)) % 360;
ehsi.InstrumentState.NoPowerFlag = ((fromFalcon.powerBits & (int)PowerBits.BusPowerBattery) != (int)PowerBits.BusPowerBattery) && !Extractor.State.OptionsFormIsShowing;
ehsi.InstrumentState.MagneticHeadingDegrees = fromFalcon.currentHeading;
}

private static void UpdateADI(IADI adi, HsiBits hsibits)
Expand Down
1 change: 1 addition & 0 deletions src/MFDExtractor/MFDExtractor/MFDExtractor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@
<Compile Include="RendererFactories\FuelQualityIndicatorRendererFactory.cs" />
<Compile Include="RendererFactories\ISISRendererFactory.cs" />
<Compile Include="RendererFactories\AzimuthIndicatorRendererFactory.cs" />
<Compile Include="RendererFactories\TachometerRendererFactory.cs" />
<Compile Include="RendererFactories\VVIRendererFactory.cs" />
<Compile Include="RendererFactory.cs" />
<Compile Include="Renderer\MfdRenderer.cs" />
Expand Down
12 changes: 12 additions & 0 deletions src/MFDExtractor/MFDExtractor/Properties/Settings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/MFDExtractor/MFDExtractor/Properties/Settings.settings
Original file line number Diff line number Diff line change
Expand Up @@ -1499,5 +1499,8 @@
<Setting Name="PollingDelay" Type="System.Int32" Scope="User">
<Value Profile="(Default)">5</Value>
</Setting>
<Setting Name="IsPwEngine" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings>
</SettingsFile>
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using LightningGauges.Renderers.F16;
using MFDExtractor.Properties;

namespace MFDExtractor.RendererFactories
{
internal interface ITachometerRendererFactory
{
ITachometer Create();
}


class TachometerRendererFactory : ITachometerRendererFactory
{
public ITachometer Create()
{
return new Tachometer
{
Options =
{
EngineType = Settings.Default.IsPwEngine
?Tachometer.TachometerOptions.TachometerEngineType.PWEngine
:Tachometer.TachometerOptions.TachometerEngineType.GEEngine,
IsSecondary=false
}
};
}
}

}
10 changes: 7 additions & 3 deletions src/MFDExtractor/MFDExtractor/RendererFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,15 @@ internal class RendererFactory : IRendererFactory
private readonly IFuelQualityIndicatorRendererFactory _fuelQualityIndicatorRendererFactory;
private readonly IISISRendererFactory _isisRendererFactory;
private readonly IVVIRendererFactory _vviRendererFactory;
private readonly ITachometerRendererFactory _tachometerRendererFactory;
public RendererFactory(
IAzimuthIndicatorRendererFactory azimuthIndicatorFactory = null,
IRWRRendererFactory rwrRendererFactory=null,
IFuelQualityIndicatorRendererFactory fuelQualityIndicatorRendererFactory=null,
IAltimeterRendererFactory altimeterRendererFactory=null,
IISISRendererFactory isisRendererFactory=null,
IVVIRendererFactory vviRendererFactory=null
IVVIRendererFactory vviRendererFactory=null,
ITachometerRendererFactory tachometerRendererFactory=null
)
{
_azimuthIndicatorFactory = azimuthIndicatorFactory ?? new AzimuthIndicatorRendererFactory();
Expand All @@ -40,6 +42,7 @@ public RendererFactory(
_fuelQualityIndicatorRendererFactory = fuelQualityIndicatorRendererFactory ?? new FuelQualityIndicatorRendererFactory();
_isisRendererFactory = isisRendererFactory ?? new ISISRendererFactory();
_vviRendererFactory = vviRendererFactory ?? new VVIRendererFactory();
_tachometerRendererFactory = tachometerRendererFactory ?? new TachometerRendererFactory();
}

public IInstrumentRenderer CreateRenderer(InstrumentType instrumentType)
Expand Down Expand Up @@ -174,12 +177,13 @@ private IVerticalVelocityIndicator CreateVVIRenderer()

private ITachometer CreateRPM2Renderer()
{
return new Tachometer {Options = {IsSecondary = true}};
return new Tachometer { Options = { IsSecondary = true } };
}

private ITachometer CreateRPM1Renderer()
{
return new Tachometer {Options = {IsSecondary = false}};
return _tachometerRendererFactory.Create();

}

private ISpeedbrakeIndicator CreateSpeedbrakeRenderer()
Expand Down
Loading