From 059d64827f6c9976c9c0436a1c04dcbaf0a175c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Sun, 13 Nov 2022 13:36:50 +0100 Subject: [PATCH] Add initial support for Performance Overlay --- .gitignore | 2 + PerformanceOverlay/App.config | 18 ++ PerformanceOverlay/Controller.cs | 140 ++++++++++ PerformanceOverlay/External/GlobalHotKey.cs | 160 +++++++++++ PerformanceOverlay/Overlays.cs | 187 +++++++++++++ PerformanceOverlay/PerformanceOverlay.csproj | 66 +++++ PerformanceOverlay/Program.cs | 29 ++ PerformanceOverlay/RTSSSharedMemoryNET.dll | Bin 0 -> 76288 bytes PerformanceOverlay/Resources.Designer.cs | 83 ++++++ PerformanceOverlay/Resources.resx | 127 +++++++++ PerformanceOverlay/Resources/NotifyIcon.ico | Bin 0 -> 45451 bytes .../Resources/traffic-light-outline.ico | Bin 0 -> 169871 bytes .../Resources/traffic-light-outline.png | Bin 0 -> 608 bytes PerformanceOverlay/Sensors.cs | 259 ++++++++++++++++++ PerformanceOverlay/Settings.Designer.cs | 50 ++++ PerformanceOverlay/Settings.cs | 32 +++ PerformanceOverlay/Settings.settings | 12 + PerformanceOverlay/app.manifest | 60 ++++ SteamDeckTools.sln | 28 +- 19 files changed, 1252 insertions(+), 1 deletion(-) create mode 100644 PerformanceOverlay/App.config create mode 100644 PerformanceOverlay/Controller.cs create mode 100644 PerformanceOverlay/External/GlobalHotKey.cs create mode 100644 PerformanceOverlay/Overlays.cs create mode 100644 PerformanceOverlay/PerformanceOverlay.csproj create mode 100644 PerformanceOverlay/Program.cs create mode 100644 PerformanceOverlay/RTSSSharedMemoryNET.dll create mode 100644 PerformanceOverlay/Resources.Designer.cs create mode 100644 PerformanceOverlay/Resources.resx create mode 100644 PerformanceOverlay/Resources/NotifyIcon.ico create mode 100644 PerformanceOverlay/Resources/traffic-light-outline.ico create mode 100644 PerformanceOverlay/Resources/traffic-light-outline.png create mode 100644 PerformanceOverlay/Sensors.cs create mode 100644 PerformanceOverlay/Settings.Designer.cs create mode 100644 PerformanceOverlay/Settings.cs create mode 100644 PerformanceOverlay/Settings.settings create mode 100644 PerformanceOverlay/app.manifest diff --git a/.gitignore b/.gitignore index 0307020..9a9bd73 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ bin/ obj/ /.vs/ *.user +build-release/ +.vscode/ diff --git a/PerformanceOverlay/App.config b/PerformanceOverlay/App.config new file mode 100644 index 0000000..b3fb96a --- /dev/null +++ b/PerformanceOverlay/App.config @@ -0,0 +1,18 @@ + + + + +
+ + + + + + True + + + FPS + + + + \ No newline at end of file diff --git a/PerformanceOverlay/Controller.cs b/PerformanceOverlay/Controller.cs new file mode 100644 index 0000000..498b6e0 --- /dev/null +++ b/PerformanceOverlay/Controller.cs @@ -0,0 +1,140 @@ +using PerformanceOverlay.External; +using RTSSSharedMemoryNET; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PerformanceOverlay +{ + internal class Controller : IDisposable + { + Container components = new Container(); + RTSSSharedMemoryNET.OSD? osd; + ToolStripMenuItem showItem; + Sensors sensors = new Sensors(); + + LibreHardwareMonitor.Hardware.Computer libreHardwareComputer = new LibreHardwareMonitor.Hardware.Computer + { + IsCpuEnabled = true, + IsGpuEnabled = true, + IsStorageEnabled = true, + IsBatteryEnabled = true + }; + + public Controller() + { + var contextMenu = new System.Windows.Forms.ContextMenuStrip(components); + + showItem = new ToolStripMenuItem("&Show OSD"); + showItem.Click += ShowItem_Click; + showItem.Checked = Settings.Default.ShowOSD; + contextMenu.Items.Add(showItem); + contextMenu.Items.Add(new ToolStripSeparator()); + foreach (var mode in Enum.GetValues()) + { + var modeItem = new ToolStripMenuItem(mode.ToString()); + modeItem.Tag = mode; + modeItem.Click += delegate + { + Settings.Default.OSDModeParsed = mode; + updateContextItems(contextMenu); + }; + contextMenu.Items.Add(modeItem); + } + updateContextItems(contextMenu); + + contextMenu.Items.Add(new ToolStripSeparator()); + + var exitItem = contextMenu.Items.Add("&Exit"); + exitItem.Click += ExitItem_Click; + + var notifyIcon = new System.Windows.Forms.NotifyIcon(components); + notifyIcon.Icon = Resources.traffic_light_outline1; + notifyIcon.Text = "Steam Deck Fan Control"; + notifyIcon.Visible = true; + notifyIcon.ContextMenuStrip = contextMenu; + notifyIcon.Click += NotifyIcon_Click; + + var osdTimer = new System.Windows.Forms.Timer(components); + osdTimer.Tick += OsdTimer_Tick; + osdTimer.Interval = 250; + osdTimer.Enabled = true; + + GlobalHotKey.RegisterHotKey("F11", () => + { + showItem.Checked = !showItem.Checked; + }); + + // Select next overlay + GlobalHotKey.RegisterHotKey("Shift+F11", () => + { + var values = Enum.GetValues().ToList(); + + int index = values.IndexOf(Settings.Default.OSDModeParsed); + Settings.Default.OSDModeParsed = values[(index + 1) % values.Count]; + + showItem.Checked = true; + updateContextItems(contextMenu); + }); + } + + private void updateContextItems(ContextMenuStrip contextMenu) + { + foreach (ToolStripItem item in contextMenu.Items) + { + if (item.Tag is Overlays.Mode) + ((ToolStripMenuItem)item).Checked = ((Overlays.Mode)item.Tag == Settings.Default.OSDModeParsed); + } + } + + private void NotifyIcon_Click(object? sender, EventArgs e) + { + ((NotifyIcon)sender).ContextMenuStrip.Show(Control.MousePosition); + } + + private void ShowItem_Click(object? sender, EventArgs e) + { + showItem.Checked = !showItem.Checked; + } + + private void OsdTimer_Tick(object? sender, EventArgs e) + { + if (!showItem.Checked) + { + using (osd) { } + osd = null; + return; + } + + sensors.Update(); + + var osdOverlay = Overlays.GetOSD(Settings.Default.OSDModeParsed, sensors); + + try + { + if (osd == null) + osd = new OSD("PerformanceOverlay"); + osd.Update(osdOverlay); + } + catch(SystemException) + { + osd = null; + } + } + + private void ExitItem_Click(object? sender, EventArgs e) + { + Application.Exit(); + } + + public void Dispose() + { + components.Dispose(); + using (osd) { } + using (sensors) { } + } + } +} diff --git a/PerformanceOverlay/External/GlobalHotKey.cs b/PerformanceOverlay/External/GlobalHotKey.cs new file mode 100644 index 0000000..f172d1d --- /dev/null +++ b/PerformanceOverlay/External/GlobalHotKey.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using System.Windows.Input; + +namespace PerformanceOverlay.External +{ + public class GlobalHotKey : IDisposable + { + /// + /// Registers a global hotkey + /// + /// e.g. Alt + Shift + Control + Win + S + /// Action to be called when hotkey is pressed + /// true, if registration succeeded, otherwise false + public static bool RegisterHotKey(string aKeyGestureString, Action aAction) + { + var c = new KeyGestureConverter(); + KeyGesture aKeyGesture = (KeyGesture)c.ConvertFrom(aKeyGestureString); + return RegisterHotKey(aKeyGesture.Modifiers, aKeyGesture.Key, aAction); + } + + public static bool RegisterHotKey(ModifierKeys aModifier, Key aKey, Action aAction) + { + if (aModifier == ModifierKeys.None && false) + { + throw new ArgumentException("Modifier must not be ModifierKeys.None"); + } + if (aAction is null) + { + throw new ArgumentNullException(nameof(aAction)); + } + + System.Windows.Forms.Keys aVirtualKeyCode = (System.Windows.Forms.Keys)KeyInterop.VirtualKeyFromKey(aKey); + currentID = currentID + 1; + bool aRegistered = RegisterHotKey(window.Handle, currentID, + (uint)aModifier | MOD_NOREPEAT, + (uint)aVirtualKeyCode); + + if (aRegistered) + { + registeredHotKeys.Add(new HotKeyWithAction(aModifier, aKey, aAction)); + } + return aRegistered; + } + + public void Dispose() + { + // unregister all the registered hot keys. + for (int i = currentID; i > 0; i--) + { + UnregisterHotKey(window.Handle, i); + } + + // dispose the inner native window. + window.Dispose(); + } + + static GlobalHotKey() + { + window.KeyPressed += (s, e) => + { + registeredHotKeys.ForEach(x => + { + if (e.Modifier == x.Modifier && e.Key == x.Key) + { + x.Action(); + } + }); + }; + } + + private static readonly InvisibleWindowForMessages window = new InvisibleWindowForMessages(); + private static int currentID; + private static uint MOD_NOREPEAT = 0x4000; + private static List registeredHotKeys = new List(); + + private class HotKeyWithAction + { + + public HotKeyWithAction(ModifierKeys modifier, Key key, Action action) + { + Modifier = modifier; + Key = key; + Action = action; + } + + public ModifierKeys Modifier { get; } + public Key Key { get; } + public Action Action { get; } + } + + // Registers a hot key with Windows. + [DllImport("user32.dll")] + private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); + // Unregisters the hot key with Windows. + [DllImport("user32.dll")] + private static extern bool UnregisterHotKey(IntPtr hWnd, int id); + + private class InvisibleWindowForMessages : System.Windows.Forms.NativeWindow, IDisposable + { + public InvisibleWindowForMessages() + { + CreateHandle(new System.Windows.Forms.CreateParams()); + } + + private static int WM_HOTKEY = 0x0312; + protected override void WndProc(ref System.Windows.Forms.Message m) + { + base.WndProc(ref m); + + if (m.Msg == WM_HOTKEY) + { + var aWPFKey = KeyInterop.KeyFromVirtualKey(((int)m.LParam >> 16) & 0xFFFF); + ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF); + if (KeyPressed != null) + { + KeyPressed(this, new HotKeyPressedEventArgs(modifier, aWPFKey)); + } + } + } + + public class HotKeyPressedEventArgs : EventArgs + { + private ModifierKeys _modifier; + private Key _key; + + internal HotKeyPressedEventArgs(ModifierKeys modifier, Key key) + { + _modifier = modifier; + _key = key; + } + + public ModifierKeys Modifier + { + get { return _modifier; } + } + + public Key Key + { + get { return _key; } + } + } + + + public event EventHandler KeyPressed; + + #region IDisposable Members + + public void Dispose() + { + this.DestroyHandle(); + } + + #endregion + } + } + +} diff --git a/PerformanceOverlay/Overlays.cs b/PerformanceOverlay/Overlays.cs new file mode 100644 index 0000000..228fee4 --- /dev/null +++ b/PerformanceOverlay/Overlays.cs @@ -0,0 +1,187 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Policy; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using static System.Net.Mime.MediaTypeNames; + +namespace PerformanceOverlay +{ + internal class Overlays + { + public enum Mode + { + FPS, + Minimal, + Detail, + All + } + + public class Entry + { + public String? Text { get; set; } + public IList Include { get; set; } = new List(); + public IList Exclude { get; set; } = new List(); + public IList Nested { get; set; } = new List(); + public String Separator { get; set; } = ""; + public bool IgnoreMissing { get; set; } + + public static readonly Regex attributeRegex = new Regex("{([^}]+)}", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); + + public Entry() + { } + + public Entry(String text) + { + this.Text = text; + } + + public IEnumerable AllAttributes + { + get + { + return attributeRegex.Matches(Text ?? ""); + } + } + + private String EvaluateText(Sensors sensors) + { + String output = Text ?? ""; + + foreach (var attribute in AllAttributes) + { + String attributeName = attribute.Groups[1].Value; + String? value = sensors.GetValue(attributeName); + if (value is null && IgnoreMissing) + return ""; + output = output.Replace(attribute.Value, value ?? "-"); + } + + return output; + } + + public String? GetValue(Mode mode, Sensors sensors) + { + if (Exclude.Count > 0 && Exclude.Contains(mode)) + return null; + if (Include.Count > 0 && !Include.Contains(mode)) + return null; + + String output = EvaluateText(sensors); + + if (Nested.Count > 0) + { + var outputs = Nested.Select(entry => entry.GetValue(mode, sensors)).Where(output => output != null); + if (outputs.Count() == 0) + return null; + + output += String.Join(Separator, outputs); + } + + if (output == String.Empty) + return null; + + return output; + } + } + + public static readonly String[] Helpers = + { + "", + "", + }; + + public static readonly Entry OSD = new Entry + { + Nested = { + new Entry { Text = " FPS", Include = { Mode.FPS } }, + + new Entry { + Nested = + { + new Entry + { + Text = "BATT", + Nested = + { + new Entry("{BATT_%} %"), + new Entry("{BATT_W} W") + } + }, + new Entry + { + Text = "GPU", + Nested = + { + new Entry("{GPU_%} %"), + new Entry("{GPU_W} W"), + new Entry { Text = "{GPU_T} C", IgnoreMissing = true } + } + }, + new Entry + { + Text = "CPU", + Nested = + { + new Entry("{CPU_%} %"), + new Entry("{CPU_W} W"), + new Entry { Text = "{CPU_T} C", IgnoreMissing = true } + } + }, + new Entry + { + Text = "RAM", + Nested = + { + new Entry("{MEM_GB} GiB") + } + }, + new Entry + { + Text = "", + Nested = + { + new Entry(" FPS") + } + }, + new Entry + { + Text = "" + } + }, + Separator = "| ", + Include = { Mode.Minimal } + }, + + new Entry { Text = "MEM {MEM_MB} MB", Exclude = { Mode.FPS, Mode.Minimal } }, + new Entry { Text = "CPU {CPU_%} %", Exclude = { Mode.FPS, Mode.Minimal } }, + new Entry { Text = "RAM {GPU_MB} MB", Exclude = { Mode.FPS, Mode.Minimal } }, + new Entry { Text = " FPS ms", Exclude = { Mode.FPS, Mode.Minimal } }, + new Entry { + Text = "BAT ", + Nested = { + new Entry("{BATT_%} %"), + new Entry("{BATT_W} W") + }, + Exclude = { Mode.FPS, Mode.Minimal } + }, + new Entry { Text = "Frametime", Exclude = { Mode.FPS, Mode.Minimal } }, + new Entry { Text = "", Exclude = { Mode.FPS, Mode.Minimal } }, + new Entry { Text = " ms", Exclude = { Mode.FPS, Mode.Minimal } } + }, + Separator = "\r\n" + }; + + public static String GetOSD(Mode mode, Sensors sensors) + { + var sb = new StringBuilder(); + + sb.AppendJoin("", Helpers); + sb.Append(OSD.GetValue(mode, sensors) ?? ""); + + return sb.ToString(); + } + } +} diff --git a/PerformanceOverlay/PerformanceOverlay.csproj b/PerformanceOverlay/PerformanceOverlay.csproj new file mode 100644 index 0000000..c671cce --- /dev/null +++ b/PerformanceOverlay/PerformanceOverlay.csproj @@ -0,0 +1,66 @@ + + + + WinExe + net6.0-windows + enable + true + enable + app.manifest + Resources\traffic-light-outline.ico + True + + + + + + + + + + + + + + + + + + + + + RTSSSharedMemoryNET.dll + + + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + PreserveNewest + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + \ No newline at end of file diff --git a/PerformanceOverlay/Program.cs b/PerformanceOverlay/Program.cs new file mode 100644 index 0000000..b862fbc --- /dev/null +++ b/PerformanceOverlay/Program.cs @@ -0,0 +1,29 @@ +using RTSSSharedMemoryNET; + +namespace PerformanceOverlay +{ + internal static class Program + { + [STAThread] + static void Main() + { + ApplicationConfiguration.Initialize(); + + try + { + foreach (var entry in RTSSSharedMemoryNET.OSD.GetOSDEntries()) + { + Console.WriteLine("Entry: {0}", entry.Owner); + Console.WriteLine("\t", entry.Text); + } + } + catch(SystemException) + { } + + using (var controller = new Controller()) + { + Application.Run(); + } + } + } +} \ No newline at end of file diff --git a/PerformanceOverlay/RTSSSharedMemoryNET.dll b/PerformanceOverlay/RTSSSharedMemoryNET.dll new file mode 100644 index 0000000000000000000000000000000000000000..d19766560e10889c15072e16853ca4d3178d9aaf GIT binary patch literal 76288 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 ~wf;Zb2%FYjAXY1}Bqy$hml}Qm- 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 l-%Y)H +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace PerformanceOverlay { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PerformanceOverlay.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap traffic_light_outline { + get { + object obj = ResourceManager.GetObject("traffic_light_outline", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon traffic_light_outline1 { + get { + object obj = ResourceManager.GetObject("traffic_light_outline1", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + } +} diff --git a/PerformanceOverlay/Resources.resx b/PerformanceOverlay/Resources.resx new file mode 100644 index 0000000..70b93f1 --- /dev/null +++ b/PerformanceOverlay/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Resources\traffic-light-outline.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\traffic-light-outline.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/PerformanceOverlay/Resources/NotifyIcon.ico b/PerformanceOverlay/Resources/NotifyIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5d06b9f2857b39f0b5d3395e3e7999ba6bcc3a38 GIT binary patch literal 45451 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 literal 0 HcmV?d00001 diff --git a/PerformanceOverlay/Resources/traffic-light-outline.ico b/PerformanceOverlay/Resources/traffic-light-outline.ico new file mode 100644 index 0000000000000000000000000000000000000000..81940de67149f280e35900542be7b1059948430d GIT binary patch literal 169871 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 y4ly*aGBUC AllSensors = new Dictionary + { + { + "CPU_%", new HardwareSensor() + { + HardwareType = HardwareType.Cpu, + HardwareName = "AMD Custom APU 0405", + SensorType = SensorType.Load, + SensorName = "CPU Total", + Format = "F0" + } + }, + { + "CPU_W", new HardwareSensor() + { + HardwareType = HardwareType.Cpu, + HardwareName = "AMD Custom APU 0405", + SensorType = SensorType.Power, + SensorName = "Package", + Format = "F1" + } + }, + { + "CPU_T", new HardwareSensor() + { + HardwareType = HardwareType.Cpu, + HardwareName = "AMD Custom APU 0405", + SensorType = SensorType.Temperature, + SensorName = "Core (Tctl/Tdie)", + Format = "F1", + IgnoreZero = true + } + }, + { + "MEM_GB", new HardwareSensor() + { + HardwareType = HardwareType.Memory, + HardwareName = "Generic Memory", + SensorType = SensorType.Data, + SensorName = "Memory Used", + Format = "F1" + } + }, + { + "MEM_MB", new HardwareSensor() + { + HardwareType = HardwareType.Memory, + HardwareName = "Generic Memory", + SensorType = SensorType.Data, + SensorName = "Memory Used", + Format = "F0", + Multiplier = 1024 + } + }, + { + "GPU_%", new HardwareSensor() + { + HardwareType = HardwareType.GpuAmd, + HardwareName = "AMD Custom GPU 0405", + SensorType = SensorType.Load, + SensorName = "D3D 3D", + Format = "F0" + } + }, + { + "GPU_MB", new HardwareSensor() + { + HardwareType = HardwareType.GpuAmd, + HardwareName = "AMD Custom GPU 0405", + SensorType = SensorType.SmallData, + SensorName = "D3D Dedicated Memory Used", + Format = "F0" + } + }, + { + "GPU_GB", new HardwareSensor() + { + HardwareType = HardwareType.GpuAmd, + HardwareName = "AMD Custom GPU 0405", + SensorType = SensorType.SmallData, + SensorName = "D3D Dedicated Memory Used", + Format = "F0", + Multiplier = 1.0f/1024.0f + } + }, + { + "GPU_W", new HardwareSensor() + { + HardwareType = HardwareType.GpuAmd, + HardwareName = "AMD Custom GPU 0405", + SensorType = SensorType.Power, + SensorName = "GPU SoC", + Format = "F1" + } + }, + { + "GPU_T", new HardwareSensor() + { + HardwareType = HardwareType.GpuAmd, + HardwareName = "AMD Custom GPU 0405", + SensorType = SensorType.Temperature, + SensorName = "GPU Temperature", + Format = "F1", + IgnoreZero = true + } + }, + { + "BATT_%", new HardwareSensor() + { + HardwareType = HardwareType.Battery, + HardwareName = "GETAC", + SensorType = SensorType.Level, + SensorName = "Charge Level", + Format = "F0" + } + }, + { + "BATT_W", new HardwareSensor() + { + HardwareType = HardwareType.Battery, + HardwareName = "GETAC", + SensorType = SensorType.Power, + SensorName = "Charge/Discharge Rate", + Format = "F1" + } + } + }; + + private LibreHardwareMonitor.Hardware.Computer libreHardwareComputer = new LibreHardwareMonitor.Hardware.Computer + { + IsCpuEnabled = true, + IsMemoryEnabled = true, + IsGpuEnabled = true, + IsStorageEnabled = true, + IsBatteryEnabled = true + }; + + public IList AllHardwareSensors { get; private set; } = new List(); + + public Sensors() + { + libreHardwareComputer.Open(); + } + + public void Dispose() + { + libreHardwareComputer.Close(); + } + + public void Update() + { + var allSensors = new List(); + + foreach (IHardware hardware in libreHardwareComputer.Hardware) + { + try + { + hardware.Update(); + } + catch (SystemException) { } + hardware.Accept(new SensorVisitor(sensor => allSensors.Add(sensor))); + } + + this.AllHardwareSensors = allSensors; + } + + public string? GetValue(String name) + { + if (!AllSensors.ContainsKey(name)) + return null; + + return AllSensors[name].GetValue(this); + } + } +} diff --git a/PerformanceOverlay/Settings.Designer.cs b/PerformanceOverlay/Settings.Designer.cs new file mode 100644 index 0000000..7956a7f --- /dev/null +++ b/PerformanceOverlay/Settings.Designer.cs @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace PerformanceOverlay { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.3.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ShowOSD { + get { + return ((bool)(this["ShowOSD"])); + } + set { + this["ShowOSD"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("FPS")] + public string OSDMode { + get { + return ((string)(this["OSDMode"])); + } + set { + this["OSDMode"] = value; + } + } + } +} diff --git a/PerformanceOverlay/Settings.cs b/PerformanceOverlay/Settings.cs new file mode 100644 index 0000000..76da60c --- /dev/null +++ b/PerformanceOverlay/Settings.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static PerformanceOverlay.Overlays; + +namespace PerformanceOverlay +{ + internal partial class Settings + { + public Overlays.Mode OSDModeParsed + { + get + { + try + { + return (Mode)Enum.Parse(OSDMode); + } + catch (ArgumentException) + { + return Mode.FPS; + } + } + set + { + OSDMode = value.ToString(); + Save(); + } + } + } +} diff --git a/PerformanceOverlay/Settings.settings b/PerformanceOverlay/Settings.settings new file mode 100644 index 0000000..5191aa6 --- /dev/null +++ b/PerformanceOverlay/Settings.settings @@ -0,0 +1,12 @@ + + + + + + True + + + FPS + + + \ No newline at end of file diff --git a/PerformanceOverlay/app.manifest b/PerformanceOverlay/app.manifest new file mode 100644 index 0000000..209b401 --- /dev/null +++ b/PerformanceOverlay/app.manifest @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + true + true + + + + + + + diff --git a/SteamDeckTools.sln b/SteamDeckTools.sln index 5f8a00a..df09d7d 100644 --- a/SteamDeckTools.sln +++ b/SteamDeckTools.sln @@ -3,18 +3,44 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.3.32901.215 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FanControl", "FanControl\FanControl.csproj", "{A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FanControl", "FanControl\FanControl.csproj", "{A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PerformanceOverlay", "PerformanceOverlay\PerformanceOverlay.csproj", "{DCA71DCC-A3ED-4890-A56C-3E2183A3C023}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Debug|x64.ActiveCfg = Debug|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Debug|x64.Build.0 = Debug|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Debug|x86.ActiveCfg = Debug|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Debug|x86.Build.0 = Debug|Any CPU {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Release|Any CPU.ActiveCfg = Release|Any CPU {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Release|Any CPU.Build.0 = Release|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Release|x64.ActiveCfg = Release|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Release|x64.Build.0 = Release|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Release|x86.ActiveCfg = Release|Any CPU + {A0D9B170-89BA-4F7A-9331-BE6A721E8D5B}.Release|x86.Build.0 = Release|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Debug|x64.ActiveCfg = Debug|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Debug|x64.Build.0 = Debug|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Debug|x86.ActiveCfg = Debug|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Debug|x86.Build.0 = Debug|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Release|Any CPU.Build.0 = Release|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Release|x64.ActiveCfg = Release|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Release|x64.Build.0 = Release|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Release|x86.ActiveCfg = Release|Any CPU + {DCA71DCC-A3ED-4890-A56C-3E2183A3C023}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE