From f29216599dca93b317525fc4781fb13dcb2b9ba5 Mon Sep 17 00:00:00 2001 From: ConnorMolz <114417919+ConnorMolz@users.noreply.github.com> Date: Mon, 2 Jun 2025 13:41:59 +0200 Subject: [PATCH 1/4] Basic implementation of Flag Panel --- .../API/Overlays/FlagPanel/FlagPanel.html | 87 +++++++++++ .../API/Overlays/FlagPanel/FlagPanelModel.cs | 6 + RaceOverlay/API/StartAPI.cs | 142 ++++++++++++++++++ .../SetupHider => Internals}/ImageClass.cs | 2 +- RaceOverlay/RaceOverlay.csproj | 2 + 5 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html create mode 100644 RaceOverlay/API/Overlays/FlagPanel/FlagPanelModel.cs rename RaceOverlay/{API/Overlays/SetupHider => Internals}/ImageClass.cs (74%) diff --git a/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html b/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html new file mode 100644 index 0000000..7de84f5 --- /dev/null +++ b/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html @@ -0,0 +1,87 @@ + + + + + + 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..2659e58 --- /dev/null +++ b/RaceOverlay/API/Overlays/FlagPanel/FlagPanelModel.cs @@ -0,0 +1,6 @@ +namespace RaceOverlay.API.Overlays.FlagPanel; + +public class FlagPanelModel +{ + +} \ No newline at end of file diff --git a/RaceOverlay/API/StartAPI.cs b/RaceOverlay/API/StartAPI.cs index 4a8c8e3..8e2b9b8 100644 --- a/RaceOverlay/API/StartAPI.cs +++ b/RaceOverlay/API/StartAPI.cs @@ -12,6 +12,7 @@ using RaceOverlay.API.Overlays.LaptimeDelta; using RaceOverlay.API.Overlays.SetupHider; using RaceOverlay.API.Overlays.WeatherInfo; +using RaceOverlay.Internals; namespace RaceOverlay.API; @@ -262,6 +263,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"); + SetupHiderModel data = new SetupHiderModel(); + 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/RaceOverlay.csproj b/RaceOverlay/RaceOverlay.csproj index d6ebd65..ff61531 100644 --- a/RaceOverlay/RaceOverlay.csproj +++ b/RaceOverlay/RaceOverlay.csproj @@ -52,6 +52,8 @@ + + From f3bd69305f14a1ad8955aff5e13efbc2e518f425 Mon Sep 17 00:00:00 2001 From: ConnorMolz <114417919+ConnorMolz@users.noreply.github.com> Date: Mon, 2 Jun 2025 13:54:25 +0200 Subject: [PATCH 2/4] Fix style --- .../API/Overlays/FlagPanel/FlagPanel.html | 85 +++++++++++++++++-- 1 file changed, 76 insertions(+), 9 deletions(-) diff --git a/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html b/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html index 7de84f5..154b101 100644 --- a/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html +++ b/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html @@ -18,15 +18,21 @@ .overlay-container { background-color: #1E1E1E; border-radius: 10px; - position: relative; + padding: 10px; + display: flex; + justify-content: center; + align-items: center; + } + + .flag-canvas { + border-radius: 5px; + display: block; }
- - - +
\ No newline at end of file From e0c579f052a915f9fbc089f2c375298b69ae52a8 Mon Sep 17 00:00:00 2001 From: ConnorMolz <114417919+ConnorMolz@users.noreply.github.com> Date: Mon, 2 Jun 2025 14:08:14 +0200 Subject: [PATCH 3/4] Finish up Flag Panel Stream Overlay --- .../API/Overlays/FlagPanel/FlagPanel.html | 2 +- .../API/Overlays/FlagPanel/FlagPanelModel.cs | 45 ++++++++++++++++++- RaceOverlay/API/StartAPI.cs | 3 +- .../Overlays/FlagPanel/FlagPanel.xaml.cs | 2 +- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html b/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html index 154b101..bb92e0e 100644 --- a/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html +++ b/RaceOverlay/API/Overlays/FlagPanel/FlagPanel.html @@ -98,7 +98,7 @@ ctx.drawImage(debrisFlag, 0, 0, canvas.width, canvas.height); break; } - case "meetball": { + case "repair": { ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.drawImage(meetball_flag, 0, 0, canvas.width, canvas.height); break; diff --git a/RaceOverlay/API/Overlays/FlagPanel/FlagPanelModel.cs b/RaceOverlay/API/Overlays/FlagPanel/FlagPanelModel.cs index 2659e58..6f430fa 100644 --- a/RaceOverlay/API/Overlays/FlagPanel/FlagPanelModel.cs +++ b/RaceOverlay/API/Overlays/FlagPanel/FlagPanelModel.cs @@ -1,6 +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 8e2b9b8..05ebd5f 100644 --- a/RaceOverlay/API/StartAPI.cs +++ b/RaceOverlay/API/StartAPI.cs @@ -9,6 +9,7 @@ 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; @@ -288,7 +289,7 @@ public static IHost StartApiServer() endpoints.MapGet("/overlay/flag_panel/data", () => { Debug.WriteLine("GetSetupHiderOverlayData"); - SetupHiderModel data = new SetupHiderModel(); + FlagPanelModel data = new FlagPanelModel(); return Results.Ok(data); }) .WithName("GetFlagPanelData"); 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); From 606b2accb131a8e9b5833101a75772cabf849b93 Mon Sep 17 00:00:00 2001 From: ConnorMolz <114417919+ConnorMolz@users.noreply.github.com> Date: Mon, 2 Jun 2025 14:12:12 +0200 Subject: [PATCH 4/4] Add to main window --- RaceOverlay/MainWindow.xaml.cs | 1 + RaceOverlay/StreamOverlay/FlagPanel/FlagPanel.cs | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 RaceOverlay/StreamOverlay/FlagPanel/FlagPanel.cs 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/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