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 @@ + + + + + + + +