static void Main(string[] args) { //make sure only one instance is running SharedSettings.CheckForTwins(); //check for device layout and adjust for Mini or Standard StreamDeck if (SettingsSDMonitor.CheckForLayout() != null) { if (SettingsSDMonitor.CheckForLayout() == "Mini") { isMiniDeck = true; } } //clean display and set brightness ImageManager.deck.ClearKeys(); var displayBrightness = Convert.ToByte(SettingsSDMonitor.displayBrightness); ImageManager.deck.SetBrightness(displayBrightness); //create and process necessary header images ImageManager.ProcessHeaderImages(); //check for State setting and start State accodingly if (SharedSettings.CurrentSate() == 1) { StartMonitorState(); } if (SharedSettings.CurrentSate() == 2) { StartClockState(); } //MonitorState void StartMonitorState() { var showFps = false; if (isMiniDeck == true) { if (SettingsSDMonitor.isFpsCounter == "True") { showFps = true; } } try { //check if MSIAfterburner process is running if (SettingsSDMonitor.CheckForAB() == true) { msiAB = new HardwareMonitor(); msiAB.Connect(); isABRunning = true; } else { msiAB = null; } //define Librehardwaremonitor sensors and connect (CPU temp data requires 'highestAvailable' requestedExecutionLevel !!) ohmComputer.Open(); //set static header images ImageManager.SetStaticHeaders(); if (isMiniDeck == false) { showFps = true; //check if using animations or static images string currentProfile = SharedSettings.config.Read("selectedProfile", "Current_Profile"); if (SharedSettings.IsAnimationEnabled(currentProfile) != "True") { foreach (var button in SettingsSDMonitor.BgButtonList()) { ImageManager.SetStaticImg(SettingsSDMonitor.imageName, button); } //start standard loop without the image animations StartMonitor(); } else { //start both loops in parallel Parallel.Invoke(() => ImageManager.StartAnimation(), () => StartMonitor()); } } else { StartMonitor(); } void StartMonitor() { string typeFps; int KeyLocFps; int KeyLocGpuTemp; int KeyLocGpuLoad; int KeyLocCpuTemp; int KeyLocCpuLoad; if (isMiniDeck == true) { typeFps = "fmini"; KeyLocFps = SettingsSDMonitor.KeyLocFpsMini; KeyLocGpuTemp = SettingsSDMonitor.KeyLocGpuTempMini; KeyLocGpuLoad = SettingsSDMonitor.KeyLocGpuLoadMini; KeyLocCpuTemp = SettingsSDMonitor.KeyLocCpuTempMini; KeyLocCpuLoad = SettingsSDMonitor.KeyLocCpuLoadMini; } else { typeFps = "f"; KeyLocFps = SettingsSDMonitor.KeyLocFps; KeyLocGpuTemp = SettingsSDMonitor.KeyLocGpuTemp; KeyLocGpuLoad = SettingsSDMonitor.KeyLocGpuLoad; KeyLocCpuTemp = SettingsSDMonitor.KeyLocCpuTemp; KeyLocCpuLoad = SettingsSDMonitor.KeyLocCpuLoad; } int counterDefault = 1; //start loop while (true) { if (ImageManager.exitflag) { break; } int countValue = counterDefault++; try { //add key press handler, if pressed send exit command ImageManager.deck.KeyStateChanged += DeckKeyPressed; if (showFps == true) { //connect to msi afterburner and reload values if (isABRunning == true) { var framerateEntry = msiAB.GetEntry(HardwareMonitor.GPU_GLOBAL_INDEX, MONITORING_SOURCE_ID.FRAMERATE); msiAB.ReloadEntry(framerateEntry); //get values for framerate and pass to process int framerateInt = (int)Math.Round(framerateEntry.Data); string dataValue = framerateInt.ToString(); string type = typeFps; ImageManager.ProcessValueImg(dataValue, type, KeyLocFps); } else { string dataValue = "0"; string type = typeFps; ImageManager.ProcessValueImg(dataValue, type, KeyLocFps); } } if (isMiniDeck == false) { //get and set time string timeOutput = DateTime.Now.ToString("hh:mm"); if (timeOutput.StartsWith("0")) { timeOutput = timeOutput.Remove(0, 1); } ImageManager.ProcessValueImg(timeOutput, "ti", SettingsSDMonitor.KeyLocTimeHeader); } //search hardware foreach (IHardware hardware in ohmComputer.Hardware) { hardware.Update(); //check for gpu sensor if (hardware.HardwareType == HardwareType.GpuNvidia || hardware.HardwareType == HardwareType.GpuAti) { foreach (ISensor sensor in hardware.Sensors) { //search for temp sensor if (sensor.SensorType == SensorType.Temperature) { string dataValue = sensor.Value.ToString() + "c"; string type = "t"; ImageManager.ProcessValueImg(dataValue, type, KeyLocGpuTemp); } //search for load sensor if (sensor.SensorType == SensorType.Load) { //add gpu load sensors to list string getValues = sensor.Name + sensor.Value.ToString(); List <string> valueList = new List <string> { getValues }; //get values for gpu and pass to process foreach (string value in valueList) { if (value.Contains("GPU Core")) { //get values for gpu and pass to process int gpuLoadInt = (int)Math.Round(sensor.Value.Value); string dataValue = gpuLoadInt.ToString() + "%"; string type = "l"; ImageManager.ProcessValueImg(dataValue, type, KeyLocGpuLoad); } } } } } //check for cpu sensor if (hardware.HardwareType == HardwareType.CPU) { string cpuTempString; if (hardware.Name.Contains("Ryzen")) { cpuTempString = "Core (Tdie)"; } if (hardware.Name.Contains("Intel")) { cpuTempString = "CPU Package"; } else { cpuTempString = "Core #0"; } foreach (ISensor sensor in hardware.Sensors) { //search for temp sensor if (sensor.SensorType == SensorType.Temperature) { //add cpu temp sensors to list string getValues = sensor.Name + sensor.Value.ToString(); List <string> valueList = new List <string> { getValues }; //get values for cpu and pass to process foreach (string value in valueList) { if (value.Contains(cpuTempString)) { string resultPackage = value.Substring(Math.Max(0, value.Length - 2)); if (!resultPackage.Contains("#")) { string dataValue = resultPackage.ToString() + "c"; string type = "t"; ImageManager.ProcessValueImg(dataValue, type, KeyLocCpuTemp); } } } } //search for load sensor if (sensor.SensorType == SensorType.Load) { //add cpu load sensors to list string getValues = sensor.Name + sensor.Value.ToString(); List <string> valueList = new List <string> { getValues }; //get values for cpu and change Stream Deck image foreach (string value in valueList) { if (value.Contains("CPU Total")) { //get values for cpu and pass to process int cpuLoadInt = (int)Math.Round(sensor.Value.Value); string dataValue = cpuLoadInt.ToString() + "%"; string type = "l"; ImageManager.ProcessValueImg(dataValue, type, KeyLocCpuLoad); } } } } } } //wait 1 second before restarting loop System.Threading.Thread.Sleep(1000); //remove handler ImageManager.deck.KeyStateChanged -= DeckKeyPressed; } catch (Exception) { ExitApp(); } } } } catch (Exception ex) { if (ex.InnerException is StreamDeckSharp.Exceptions.StreamDeckNotFoundException) { string deviceNotFound = " 'Stream Deck' Device not found/connected ! "; MessageBox.Show(deviceNotFound); } ExitApp(); } } // ClockState void StartClockState() { if (isMiniDeck == false) { //clear the FPS monitoring button image/animation again seperatly. This is to prevent corrupted images being left on that button when switching to Clock state ImageManager.deck.ClearKey(0); } //start both loops in parallel Parallel.Invoke(() => ImageManager.StartAnimClock(), () => StartClock()); } void StartClock() { //start loop while (true) { if (ImageManager.exitflag) { break; } try { //add key press handler, if pressed send exit command ImageManager.deck.KeyStateChanged += DeckKeyPressed; //get current time DateTime now = DateTime.Now; string hours = now.Hour.ToString(); if (hours.Length < 2) { hours = "0" + hours; } string minutes = now.ToString("mm"); if (isMiniDeck == true) { //send current time to ImageManager ImageManager.ClockStateMini(hours, minutes); } else { //send current time to ImageManager ImageManager.ClockState(hours, minutes); } //wait 10 seconds between getting current time System.Threading.Thread.Sleep(10000); //remove handler ImageManager.deck.KeyStateChanged -= DeckKeyPressed; } catch (Exception) { ExitApp(); } } } }
//private void a private bool ShowMsiState() { txtLog.Clear(); //lvMsi.Items.Clear(); //lvMsi.Clear(); int normalColumnWidth = 20; dgvMSI.Rows.Clear(); dgvMSI.Columns.Clear(); dgvMSI.AutoGenerateColumns = false; dgvMSI.RowHeadersVisible = false; dgvMSI.MultiSelect = false; dgvMSI.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dgvMSI.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; dgvMSI.DefaultCellStyle.WrapMode = DataGridViewTriState.True; //dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() {HeaderText = "Index", ReadOnly = true, AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill, FillWeight = normalColumnWidth }); //dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() {HeaderText = "Device", ReadOnly = true, AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill, FillWeight = normalColumnWidth }); //dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() {HeaderText = "GpuId", ReadOnly = true, AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "Index", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "Device", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "GpuId", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "Val", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "FanSpeed", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "CoreClock", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "ShaderClock", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "MemoryClock", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "CoreVoltage", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "MemoryVoltage", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "AuxVoltage", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "CoreVoltageBoost", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "MemoryVoltageBoost", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "AuxVoltageBoost", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "PowerLimit", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "CoreClockBoost", ReadOnly = true, FillWeight = normalColumnWidth }); dgvMSI.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "MemoryClockBoost", ReadOnly = true, FillWeight = normalColumnWidth }); //lvMsi.Columns.Add("Index", normalColumnWidth); //lvMsi.Columns.Add("Device", normalColumnWidth); //lvMsi.Columns.Add("GpuId", normalColumnWidth); //foreach (ColumnHeader cl in lvMsi.Columns) //{ // //cl. //} bool result = true; try { if (macm == null) { macm = new ControlMemory(); } else { macm.Disconnect(); macm.Connect(); } } catch (Exception e) { Wr(e.Message); result = false; //return false; } try { if (mahm == null) { mahm = new HardwareMonitor(); } else { mahm.Disconnect(); mahm.Connect(); } } catch (Exception e) { Wr(e.Message); result = false; //return false; } if (!result) { return(result); } for (int i = 0; i < mahm.Header.GpuEntryCount; i++) { //wr("***** MSI AFTERTERBURNER GPU " + i + " *****"); ControlMemoryGpuEntry ge = macm.GpuEntries[i]; dgvMSI.Rows.Add(new String[] { i.ToString(), mahm.GpuEntries[i].Index.ToString(), mahm.GpuEntries[i].Device, mahm.GpuEntries[i].GpuId, "Cur:" + "\n" + "Min:" + "\n" + "Max:" + "\n" + "Def:", ge.FanSpeedCur.ToString() + "\n" + ge.FanSpeedMin.ToString() + "\n" + ge.FanSpeedMax.ToString() + "\n" + ge.FanSpeedDef.ToString(), ge.CoreClockCur.ToString() + "\n" + ge.CoreClockMin.ToString() + "\n" + ge.CoreClockMax.ToString() + "\n" + ge.CoreClockDef.ToString(), ge.ShaderClockCur.ToString() + "\n" + ge.ShaderClockMin.ToString() + "\n" + ge.ShaderClockMax.ToString() + "\n" + ge.ShaderClockDef.ToString(), ge.MemoryClockCur.ToString() + "\n" + ge.MemoryClockMin.ToString() + "\n" + ge.MemoryClockMax.ToString() + "\n" + ge.MemoryClockDef.ToString(), ge.CoreVoltageCur.ToString() + "\n" + ge.CoreVoltageMin.ToString() + "\n" + ge.CoreVoltageMax.ToString() + "\n" + ge.CoreVoltageDef.ToString(), ge.MemoryVoltageCur.ToString() + "\n" + ge.MemoryVoltageMin.ToString() + "\n" + ge.MemoryVoltageMax.ToString() + "\n" + ge.MemoryVoltageDef.ToString(), ge.AuxVoltageCur.ToString() + "\n" + ge.AuxVoltageMin.ToString() + "\n" + ge.AuxVoltageMax.ToString() + "\n" + ge.AuxVoltageDef.ToString(), ge.CoreVoltageBoostCur.ToString() + "\n" + ge.CoreVoltageBoostMin.ToString() + "\n" + ge.CoreVoltageBoostMax.ToString() + "\n" + ge.CoreVoltageBoostDef.ToString(), ge.MemoryVoltageBoostCur.ToString() + "\n" + ge.MemoryVoltageBoostMin.ToString() + "\n" + ge.MemoryVoltageBoostMax.ToString() + "\n" + ge.MemoryVoltageBoostDef.ToString(), ge.AuxVoltageBoostCur.ToString() + "\n" + ge.AuxVoltageBoostMin.ToString() + "\n" + ge.AuxVoltageBoostMax.ToString() + "\n" + ge.AuxVoltageBoostDef.ToString(), ge.PowerLimitCur.ToString() + "\n" + ge.PowerLimitMin.ToString() + "\n" + ge.PowerLimitMax.ToString() + "\n" + ge.PowerLimitDef.ToString(), ge.CoreClockBoostCur.ToString() + "\n" + ge.CoreClockBoostMin.ToString() + "\n" + ge.CoreClockBoostMax.ToString() + "\n" + ge.CoreClockBoostDef.ToString(), ge.MemoryClockBoostCur.ToString() + "\n" + ge.MemoryClockBoostMin.ToString() + "\n" + ge.MemoryClockBoostMax.ToString() + "\n" + ge.MemoryClockBoostDef.ToString() }); //ListViewItem li = lvMsi.Items.Add(mahm.GpuEntries[i].Index.ToString()); //li.SubItems.Add(mahm.GpuEntries[i].Device); //li.SubItems.Add(mahm.GpuEntries[i].GpuId); //li.SubItems.Add(mahm.Entries[i].); } Wr("***** macm.Header.MasterGpu " + macm.Header.MasterGpu.ToString()); Wr(); for (int i = 0; i < macm.Header.GpuEntryCount; i++) { Wr("***** MSI AFTERTERBURNER GPU " + i + " *****"); Wr("Index: " + macm.GpuEntries[i].Index.ToString()); Wr(macm.GpuEntries[i].ToString().Replace(";", Environment.NewLine)); Wr(); } Wr(); Wr("****************************************************************"); Wr(); for (int i = 0; i < mahm.Header.EntryCount; i++) { Wr("***** MSI AFTERTERBURNER DATA SOURCE " + i + " *****"); Wr(mahm.Entries[i].ToString());//.Replace(";", "\n")); Wr(); } return(true); }