diff --git a/RaceOverlay/Data/Mapper.cs b/RaceOverlay/Data/Mapper.cs
index 39bb6c6..16bd390 100644
--- a/RaceOverlay/Data/Mapper.cs
+++ b/RaceOverlay/Data/Mapper.cs
@@ -7,6 +7,36 @@
namespace RaceOverlay.Data;
+[Flags]
+public enum IrsdkFlags : uint
+{
+ None = 0x00000000,
+ Checkered = 0x00000001,
+ White = 0x00000002,
+ Green = 0x00000004,
+ Yellow = 0x00000008,
+ Red = 0x00000010,
+ Blue = 0x00000020,
+ Debris = 0x00000040,
+ Crossed = 0x00000080,
+ YellowWaving = 0x00000100,
+ OneLapToGreen = 0x00000200,
+ GreenHeld = 0x00000400,
+ TenToGo = 0x00000800,
+ FiveToGo = 0x00001000,
+ RandomWaving = 0x00002000,
+ Caution = 0x00004000,
+ CautionWaving = 0x00008000,
+ Black = 0x00010000,
+ Disqualify = 0x00020000,
+ Servicible = 0x00040000,
+ Furled = 0x00080000,
+ Repair = 0x00100000,
+ StartHidden = 0x10000000,
+ StartReady = 0x20000000,
+ StartSet = 0x40000000
+}
+
public class Mapper
{
public static double LogNumber { get; } = 1600 / Math.Log(2);
@@ -296,6 +326,10 @@ public static iRacingData MapData(IRacingSdk irsdkSharper)
data.InGarage = irsdkSharper.Data.GetBool("IsInGarage");
+ var Flag = irsdkSharper.Data.GetValue("SessionFlags");
+
+ data.LocalDriver.CurrentIrsdkFlags = (IrsdkFlags)Flag;
+ Console.WriteLine(data.LocalDriver.CurrentIrsdkFlags);
// Return Dataset
return data;
diff --git a/RaceOverlay/Data/Models/LocalDriver.cs b/RaceOverlay/Data/Models/LocalDriver.cs
index 7139115..6c7a651 100644
--- a/RaceOverlay/Data/Models/LocalDriver.cs
+++ b/RaceOverlay/Data/Models/LocalDriver.cs
@@ -4,4 +4,5 @@ public class LocalDriver
{
public float LastLapDelta { get; set; }
public float BestLapDelta { get; set; }
+ public IrsdkFlags CurrentIrsdkFlags { get; set; }
}
\ No newline at end of file
diff --git a/RaceOverlay/Internals/Overlay.cs b/RaceOverlay/Internals/Overlay.cs
index 25840bf..ade2de4 100644
--- a/RaceOverlay/Internals/Overlay.cs
+++ b/RaceOverlay/Internals/Overlay.cs
@@ -1,11 +1,13 @@
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
+using System.Reflection;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
+using System.Windows.Media.Imaging;
using Newtonsoft.Json.Linq;
using RaceOverlay.Data;
@@ -753,5 +755,41 @@ protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
+ protected void LoadEmbeddedImage(Canvas targetCanvas, string manifestResourceName)
+ {
+ if (targetCanvas == null) return;
+
+ // Get the current assembly where the code is executing
+ var assembly = Assembly.GetExecutingAssembly();
+
+ // The 'using' statement ensures the stream is properly closed and disposed of
+ using (var stream = assembly.GetManifestResourceStream(manifestResourceName))
+ {
+ if (stream == null)
+ {
+ // If the stream is null, the resource was not found.
+ // This is a critical debugging step!
+ Console.WriteLine($"ERROR: Embedded resource not found: {manifestResourceName}");
+ return;
+ }
+
+ var image = new BitmapImage();
+
+ // --- This is the standard way to load a BitmapImage from a stream ---
+ image.BeginInit();
+ image.StreamSource = stream;
+ image.CacheOption = BitmapCacheOption.OnLoad; // Important for closing the stream
+ image.EndInit();
+ // ---------------------------------------------------------------------
+
+ var brush = new ImageBrush(image) { Stretch = Stretch.Uniform };
+
+ // Freeze for performance
+ brush.Freeze();
+
+ targetCanvas.Background = brush;
+ }
+ }
+
}
\ No newline at end of file
diff --git a/RaceOverlay/MainWindow.xaml.cs b/RaceOverlay/MainWindow.xaml.cs
index 1e4ec32..6e6aeec 100644
--- a/RaceOverlay/MainWindow.xaml.cs
+++ b/RaceOverlay/MainWindow.xaml.cs
@@ -11,6 +11,7 @@
using RaceOverlay.Internals;
using RaceOverlay.Overlays.EnergyInfo;
using RaceOverlay.Overlays.Electronics;
+using RaceOverlay.Overlays.FlagPanel;
using RaceOverlay.Overlays.FuelCalculator;
using RaceOverlay.Overlays.LaptimeDelta;
using RaceOverlay.Overlays.Leaderboard;
@@ -64,6 +65,7 @@ private void _initOverlays()
// Add here every Overlay
Overlays.Add(new Electronics());
Overlays.Add(new EnergyInfo());
+ Overlays.Add(new FlagPanel());
Overlays.Add(new FuelCalculator());
Overlays.Add(new Inputs());
Overlays.Add(new LaptimeDelta());
diff --git a/RaceOverlay/Overlays/FlagPanel/FlagPanel.xaml b/RaceOverlay/Overlays/FlagPanel/FlagPanel.xaml
new file mode 100644
index 0000000..a92677c
--- /dev/null
+++ b/RaceOverlay/Overlays/FlagPanel/FlagPanel.xaml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RaceOverlay/Overlays/FlagPanel/FlagPanel.xaml.cs b/RaceOverlay/Overlays/FlagPanel/FlagPanel.xaml.cs
new file mode 100644
index 0000000..5c81cd5
--- /dev/null
+++ b/RaceOverlay/Overlays/FlagPanel/FlagPanel.xaml.cs
@@ -0,0 +1,250 @@
+using System.Diagnostics;
+using System.Windows;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Threading;
+using RaceOverlay.Data;
+using RaceOverlay.Internals;
+
+namespace RaceOverlay.Overlays.FlagPanel;
+
+public partial class FlagPanel : Overlay
+{
+
+ private IrsdkFlags _flag;
+ private bool _wasGreen;
+ public FlagPanel(): base("Flag Panel", "This Overlay shows the current flag state")
+ {
+ InitializeComponent();
+ _setWindowSize(100, 100);
+ LoadEmbeddedImage(CheckeredFlag, "RaceOverlay.Overlays.FlagPanel.checkered_flag.png");
+ LoadEmbeddedImage(DsqFlag, "RaceOverlay.Overlays.FlagPanel.dsq_flag.png");
+ LoadEmbeddedImage(RepairFlag, "RaceOverlay.Overlays.FlagPanel.meetball_flag.png");
+ LoadEmbeddedImage(DebrisFlag, "RaceOverlay.Overlays.FlagPanel.debris_flag.png");
+ SetGreen();
+
+ Thread updateThread = new Thread(UpdateThreadMethod);
+
+ updateThread.IsBackground = true;
+ updateThread.Start();
+ }
+
+ public override void _updateWindow()
+ {
+ if (_flag.HasFlag(IrsdkFlags.Disqualify))
+ {
+ SetDsq();
+ _wasGreen = false;
+ return;
+ }
+
+ if (_flag.HasFlag(IrsdkFlags.Checkered))
+ {
+ SetCheckered();
+ _wasGreen = false;
+ return;
+ }
+
+ if (_flag.HasFlag(IrsdkFlags.Black) || _flag.HasFlag(IrsdkFlags.Furled))
+ {
+ SetBlack();
+ _wasGreen = false;
+ return;
+ }
+
+ if (_flag.HasFlag(IrsdkFlags.Debris))
+ {
+ _wasGreen = false;
+ SetDebris();
+ return;
+ }
+
+ if (_flag.HasFlag(IrsdkFlags.Repair))
+ {
+ _wasGreen = false;
+ SetRepair();
+ return;
+ }
+
+ if (_flag.HasFlag(IrsdkFlags.Red))
+ {
+ SetRed();
+ _wasGreen = false;
+ return;
+ }
+
+ if (_flag.HasFlag(IrsdkFlags.Blue))
+ {
+ SetBlue();
+ _wasGreen = false;
+ return;
+ }
+
+ if (_flag.HasFlag(IrsdkFlags.CautionWaving) || _flag.HasFlag(IrsdkFlags.Caution) || _flag.HasFlag(IrsdkFlags.Yellow) || _flag.HasFlag(IrsdkFlags.YellowWaving))
+ {
+ SetYellow();
+ _wasGreen = false;
+ return;
+ }
+
+ if (_flag.HasFlag(IrsdkFlags.White))
+ {
+ SetWhite();
+ _wasGreen = false;
+ return;
+ }
+
+ if (_flag.HasFlag(IrsdkFlags.Green))
+ {
+ SetGreen();
+ return;
+ }
+
+ if (!(
+ _flag.HasFlag(IrsdkFlags.Disqualify) ||
+ _flag.HasFlag(IrsdkFlags.Black) ||
+ _flag.HasFlag(IrsdkFlags.Furled) ||
+ _flag.HasFlag(IrsdkFlags.Red) ||
+ _flag.HasFlag(IrsdkFlags.Blue) ||
+ _flag.HasFlag(IrsdkFlags.CautionWaving) ||
+ _flag.HasFlag(IrsdkFlags.Caution) ||
+ _flag.HasFlag(IrsdkFlags.Yellow) ||
+ _flag.HasFlag(IrsdkFlags.YellowWaving) ||
+ _flag.HasFlag(IrsdkFlags.White) ||
+ _flag.HasFlag(IrsdkFlags.Checkered) ||
+ _flag.HasFlag(IrsdkFlags.Debris) ||
+ _flag.HasFlag(IrsdkFlags.Repair) ||
+ _flag.HasFlag(IrsdkFlags.Green)
+ ) )
+ {
+ FlagCanvas.Background = new BrushConverter().ConvertFromString("#FF393939") as SolidColorBrush;
+ CheckeredFlag.Visibility = Visibility.Collapsed;
+ DsqFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Visibility = Visibility.Visible;
+ DebrisFlag.Visibility = Visibility.Collapsed;
+ RepairFlag.Visibility = Visibility.Collapsed;
+ }
+ }
+
+ public override void _getData()
+ {
+ if (!_devMode)
+ {
+ InCar = MainWindow.IRacingData.InCar;
+ }
+ else
+ {
+ InCar = true;
+ }
+ _flag = MainWindow.IRacingData.LocalDriver.CurrentIrsdkFlags;
+ }
+
+ protected override void _scaleWindow(double scale)
+ {
+ try
+ {
+ ContentScaleTransform.ScaleX = scale;
+ ContentScaleTransform.ScaleY = scale;
+ }
+ catch (Exception e)
+ {
+ Debug.WriteLine(e);
+ }
+ }
+
+ private void SetGreen()
+ {
+ CheckeredFlag.Visibility = Visibility.Collapsed;
+ DsqFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Visibility = Visibility.Visible;
+ DebrisFlag.Visibility = Visibility.Collapsed;
+ RepairFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Background = Brushes.Lime;
+ }
+
+ private void SetRed()
+ {
+ FlagCanvas.Background = Brushes.Red;
+ CheckeredFlag.Visibility = Visibility.Collapsed;
+ DsqFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Visibility = Visibility.Visible;
+ DebrisFlag.Visibility = Visibility.Collapsed;
+ RepairFlag.Visibility = Visibility.Collapsed;
+ }
+
+ private void SetYellow()
+ {
+ FlagCanvas.Background = Brushes.Yellow;
+ CheckeredFlag.Visibility = Visibility.Collapsed;
+ DsqFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Visibility = Visibility.Visible;
+ DebrisFlag.Visibility = Visibility.Collapsed;
+ RepairFlag.Visibility = Visibility.Collapsed;
+ }
+
+ private void SetBlue()
+ {
+ FlagCanvas.Background = Brushes.Blue;
+ CheckeredFlag.Visibility = Visibility.Collapsed;
+ DsqFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Visibility = Visibility.Visible;
+ DebrisFlag.Visibility = Visibility.Collapsed;
+ RepairFlag.Visibility = Visibility.Collapsed;
+ }
+
+ private void SetWhite()
+ {
+ FlagCanvas.Background = Brushes.White;
+ CheckeredFlag.Visibility = Visibility.Collapsed;
+ DsqFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Visibility = Visibility.Visible;
+ DebrisFlag.Visibility = Visibility.Collapsed;
+ RepairFlag.Visibility = Visibility.Collapsed;
+ }
+
+ private void SetBlack()
+ {
+ FlagCanvas.Background = Brushes.Black;
+ CheckeredFlag.Visibility = Visibility.Collapsed;
+ DsqFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Visibility = Visibility.Visible;
+ DebrisFlag.Visibility = Visibility.Collapsed;
+ RepairFlag.Visibility = Visibility.Collapsed;
+ }
+
+ private void SetCheckered()
+ {
+ CheckeredFlag.Visibility = Visibility.Visible;
+ DsqFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Visibility = Visibility.Collapsed;
+ DebrisFlag.Visibility = Visibility.Collapsed;
+ RepairFlag.Visibility = Visibility.Collapsed;
+ }
+
+ private void SetDsq()
+ {
+ CheckeredFlag.Visibility = Visibility.Collapsed;
+ DsqFlag.Visibility = Visibility.Visible;
+ FlagCanvas.Visibility = Visibility.Collapsed;
+ DebrisFlag.Visibility = Visibility.Collapsed;
+ RepairFlag.Visibility = Visibility.Collapsed;
+ }
+
+ private void SetRepair()
+ {
+ CheckeredFlag.Visibility = Visibility.Collapsed;
+ DsqFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Visibility = Visibility.Collapsed;
+ DebrisFlag.Visibility = Visibility.Collapsed;
+ RepairFlag.Visibility = Visibility.Visible;
+ }
+
+ private void SetDebris()
+ {
+ CheckeredFlag.Visibility = Visibility.Collapsed;
+ DsqFlag.Visibility = Visibility.Collapsed;
+ FlagCanvas.Visibility = Visibility.Collapsed;
+ DebrisFlag.Visibility = Visibility.Visible;
+ RepairFlag.Visibility = Visibility.Collapsed;
+ }
+}
\ No newline at end of file
diff --git a/RaceOverlay/Overlays/FlagPanel/checkered_flag.png b/RaceOverlay/Overlays/FlagPanel/checkered_flag.png
new file mode 100644
index 0000000..85d710c
Binary files /dev/null and b/RaceOverlay/Overlays/FlagPanel/checkered_flag.png differ
diff --git a/RaceOverlay/Overlays/FlagPanel/debris_flag.png b/RaceOverlay/Overlays/FlagPanel/debris_flag.png
new file mode 100644
index 0000000..d01daf8
Binary files /dev/null and b/RaceOverlay/Overlays/FlagPanel/debris_flag.png differ
diff --git a/RaceOverlay/Overlays/FlagPanel/dsq_flag.png b/RaceOverlay/Overlays/FlagPanel/dsq_flag.png
new file mode 100644
index 0000000..c4fe12d
Binary files /dev/null and b/RaceOverlay/Overlays/FlagPanel/dsq_flag.png differ
diff --git a/RaceOverlay/Overlays/FlagPanel/meetball_flag.png b/RaceOverlay/Overlays/FlagPanel/meetball_flag.png
new file mode 100644
index 0000000..1d23d21
Binary files /dev/null and b/RaceOverlay/Overlays/FlagPanel/meetball_flag.png differ
diff --git a/RaceOverlay/RaceOverlay.csproj b/RaceOverlay/RaceOverlay.csproj
index 48afc67..283adf5 100644
--- a/RaceOverlay/RaceOverlay.csproj
+++ b/RaceOverlay/RaceOverlay.csproj
@@ -44,6 +44,14 @@
+
+
+
+
+
+
+
+