diff --git a/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html b/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html new file mode 100644 index 0000000..bb92e0e --- /dev/null +++ b/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html @@ -0,0 +1,154 @@ + + + + + + Flag Panel + + + +
+ +
+ + + \ No newline at end of file diff --git a/RaceOverlay/API/Overlays/FlagPanel/FlagPanelModel.cs b/RaceOverlay/API/Overlays/FlagPanel/FlagPanelModel.cs new file mode 100644 index 0000000..6f430fa --- /dev/null +++ b/RaceOverlay/API/Overlays/FlagPanel/FlagPanelModel.cs @@ -0,0 +1,49 @@ +using RaceOverlay.Data; + +namespace RaceOverlay.API.Overlays.FlagPanel; + +public class FlagPanelModel +{ + public string flag { get; set; } + + public FlagPanelModel() + { + IrsdkFlags flagState = MainWindow.IRacingData.LocalDriver.CurrentIrsdkFlags; + switch (flagState) + { + case IrsdkFlags.Disqualify: + flag = "dsq"; + break; + case IrsdkFlags.Checkered: + flag = "checkered"; + break; + case IrsdkFlags.Black | IrsdkFlags.Furled: + flag = "black"; + break; + case IrsdkFlags.Debris: + flag = "debris"; + break; + case IrsdkFlags.Repair: + flag = "repair"; + break; + case IrsdkFlags.Red: + flag = "red"; + break; + case IrsdkFlags.Blue: + flag = "blue"; + break; + case IrsdkFlags.Caution | IrsdkFlags.Yellow | IrsdkFlags.CautionWaving | IrsdkFlags.YellowWaving: + flag = "yellow"; + break; + case IrsdkFlags.White: + flag = "white"; + break; + case IrsdkFlags.Green: + flag = "green"; + break; + default: + flag = "none"; + break; + } + } +} \ No newline at end of file diff --git a/RaceOverlay/API/StartAPI.cs b/RaceOverlay/API/StartAPI.cs index 4a8c8e3..05ebd5f 100644 --- a/RaceOverlay/API/StartAPI.cs +++ b/RaceOverlay/API/StartAPI.cs @@ -9,9 +9,11 @@ using Microsoft.Extensions.Hosting; using RaceOverlay.API.Overlays.Electronics; using RaceOverlay.API.Overlays.EnergyInfo; +using RaceOverlay.API.Overlays.FlagPanel; using RaceOverlay.API.Overlays.LaptimeDelta; using RaceOverlay.API.Overlays.SetupHider; using RaceOverlay.API.Overlays.WeatherInfo; +using RaceOverlay.Internals; namespace RaceOverlay.API; @@ -262,6 +264,147 @@ public static IHost StartApiServer() LaptimeDeltaModel data = new LaptimeDeltaModel(MainWindow.IRacingData.LocalDriver.LastLapDelta); return Results.Ok(data); }); + + + // + // Flag Panel + // + endpoints.MapGet("/overlay/flag_panel", () => + { + var assembly = typeof(StartAPI).Assembly; + var resourceName = "RaceOverlay.API.Overlays.FlagPanel.FlagPanel.html"; + + using var stream = assembly.GetManifestResourceStream(resourceName); + if (stream == null) + { + return Results.NotFound("Overlay file not found"); + } + + using var reader = new StreamReader(stream); + var htmlContent = reader.ReadToEnd(); + return Results.Content(htmlContent, "text/html"); + }) + .WithName("GetFlagPanelOverlay"); + + endpoints.MapGet("/overlay/flag_panel/data", () => + { + Debug.WriteLine("GetSetupHiderOverlayData"); + FlagPanelModel data = new FlagPanelModel(); + return Results.Ok(data); + }) + .WithName("GetFlagPanelData"); + + endpoints.MapGet("/overlay/flag_panel/dsq_flag", () => + { + Debug.WriteLine("GetMeetballFlagImage"); + + var assembly = typeof(StartAPI).Assembly; + var resourceName = "RaceOverlay.Overlays.FlagPanel.dsq_flag.png"; + + using (var stream = assembly.GetManifestResourceStream(resourceName)) + { + if (stream == null) + { + Debug.WriteLine($"Resource nicht gefunden: {resourceName}"); + return Results.NotFound("Flag-Bild nicht gefunden"); + } + + using (var memoryStream = new MemoryStream()) + { + stream.CopyTo(memoryStream); + byte[] imageBytes = memoryStream.ToArray(); + string base64String = Convert.ToBase64String(imageBytes); + string mimeType = "image/png"; // Anpassen je nach Bildformat + + ImageClass data = new ImageClass($"data:{mimeType};base64,{base64String}"); + return Results.Ok(data); + } + } + }).WithName("GetFlagPanelDSQImage"); + + endpoints.MapGet("/overlay/flag_panel/checkered_flag", () => + { + Debug.WriteLine("GetMeetballFlagImage"); + + var assembly = typeof(StartAPI).Assembly; + var resourceName = "RaceOverlay.Overlays.FlagPanel.checkered_flag.png"; + + using (var stream = assembly.GetManifestResourceStream(resourceName)) + { + if (stream == null) + { + Debug.WriteLine($"Resource nicht gefunden: {resourceName}"); + return Results.NotFound("Flag-Bild nicht gefunden"); + } + + using (var memoryStream = new MemoryStream()) + { + stream.CopyTo(memoryStream); + byte[] imageBytes = memoryStream.ToArray(); + string base64String = Convert.ToBase64String(imageBytes); + string mimeType = "image/png"; // Anpassen je nach Bildformat + + ImageClass data = new ImageClass($"data:{mimeType};base64,{base64String}"); + return Results.Ok(data); + } + } + }).WithName("GetFlagPanelCheckeredImage"); + + endpoints.MapGet("/overlay/flag_panel/debris_flag", () => + { + Debug.WriteLine("GetMeetballFlagImage"); + + var assembly = typeof(StartAPI).Assembly; + var resourceName = "RaceOverlay.Overlays.FlagPanel.debris_flag.png"; + + using (var stream = assembly.GetManifestResourceStream(resourceName)) + { + if (stream == null) + { + Debug.WriteLine($"Resource nicht gefunden: {resourceName}"); + return Results.NotFound("Flag-Bild nicht gefunden"); + } + + using (var memoryStream = new MemoryStream()) + { + stream.CopyTo(memoryStream); + byte[] imageBytes = memoryStream.ToArray(); + string base64String = Convert.ToBase64String(imageBytes); + string mimeType = "image/png"; // Anpassen je nach Bildformat + + ImageClass data = new ImageClass($"data:{mimeType};base64,{base64String}"); + return Results.Ok(data); + } + } + }).WithName("GetFlagPanelDebrisImage"); + + endpoints.MapGet("/overlay/flag_panel/meetball_flag", () => + { + Debug.WriteLine("GetMeetballFlagImage"); + + var assembly = typeof(StartAPI).Assembly; + var resourceName = "RaceOverlay.Overlays.FlagPanel.meetball_flag.png"; + + using (var stream = assembly.GetManifestResourceStream(resourceName)) + { + if (stream == null) + { + Debug.WriteLine($"Resource nicht gefunden: {resourceName}"); + return Results.NotFound("Flag-Bild nicht gefunden"); + } + + using (var memoryStream = new MemoryStream()) + { + stream.CopyTo(memoryStream); + byte[] imageBytes = memoryStream.ToArray(); + string base64String = Convert.ToBase64String(imageBytes); + string mimeType = "image/png"; // Anpassen je nach Bildformat + + ImageClass data = new ImageClass($"data:{mimeType};base64,{base64String}"); + return Results.Ok(data); + } + } + }).WithName("GetMeetballFlagImage"); }); }) diff --git a/RaceOverlay/API/Overlays/SetupHider/ImageClass.cs b/RaceOverlay/Internals/ImageClass.cs similarity index 74% rename from RaceOverlay/API/Overlays/SetupHider/ImageClass.cs rename to RaceOverlay/Internals/ImageClass.cs index a2ab2db..0f87456 100644 --- a/RaceOverlay/API/Overlays/SetupHider/ImageClass.cs +++ b/RaceOverlay/Internals/ImageClass.cs @@ -1,4 +1,4 @@ -namespace RaceOverlay.API.Overlays.SetupHider; +namespace RaceOverlay.Internals; public class ImageClass { diff --git a/RaceOverlay/MainWindow.xaml.cs b/RaceOverlay/MainWindow.xaml.cs index 6e6aeec..829250d 100644 --- a/RaceOverlay/MainWindow.xaml.cs +++ b/RaceOverlay/MainWindow.xaml.cs @@ -89,6 +89,7 @@ private void _initOverlays() StreamOverlays.Add(new BestLaptimeDelta()); StreamOverlays.Add(new StreamOverlay.Electronics.Electronics()); StreamOverlays.Add(new StreamOverlay.EnergyInfo.EnergyInfo()); + StreamOverlays.Add(new StreamOverlay.FlagPanel.FlagPanel()); StreamOverlays.Add(new StreamOverlay.Inputs.Inputs()); StreamOverlays.Add(new LastLaptimeDelta()); StreamOverlays.Add(new SetupHider()); diff --git a/RaceOverlay/Overlays/FlagPanel/FlagPanel.xaml.cs b/RaceOverlay/Overlays/FlagPanel/FlagPanel.xaml.cs index 5c81cd5..2194751 100644 --- a/RaceOverlay/Overlays/FlagPanel/FlagPanel.xaml.cs +++ b/RaceOverlay/Overlays/FlagPanel/FlagPanel.xaml.cs @@ -20,7 +20,7 @@ public FlagPanel(): base("Flag Panel", "This Overlay shows the current flag stat 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"); + LoadEmbeddedImage(DebrisFlag, "RaceOverlay.Overlays.FlagPanel.debris_flag.png"); SetGreen(); Thread updateThread = new Thread(UpdateThreadMethod); diff --git a/RaceOverlay/RaceOverlay.csproj b/RaceOverlay/RaceOverlay.csproj index d6ebd65..ff61531 100644 --- a/RaceOverlay/RaceOverlay.csproj +++ b/RaceOverlay/RaceOverlay.csproj @@ -52,6 +52,8 @@ + + diff --git a/RaceOverlay/StreamOverlay/FlagPanel/FlagPanel.cs b/RaceOverlay/StreamOverlay/FlagPanel/FlagPanel.cs new file mode 100644 index 0000000..284f224 --- /dev/null +++ b/RaceOverlay/StreamOverlay/FlagPanel/FlagPanel.cs @@ -0,0 +1,12 @@ +namespace RaceOverlay.StreamOverlay.FlagPanel; + +public class FlagPanel: Internals.StreamOverlay +{ + public FlagPanel(): base("Flag Panel", + "This Overlay shows the current flag state", + "http://localhost:5480/overlay/flag_panel") + { + + } + +} \ No newline at end of file