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