From 7f3b9779c32ff4099a970e1c940c002e07736e19 Mon Sep 17 00:00:00 2001 From: SIRprise Date: Sat, 9 Oct 2021 18:03:25 +0200 Subject: [PATCH] added Color settings --- SSD-LED/Form1.Designer.cs | 155 ++++++++++++++++++++++-- SSD-LED/Form1.cs | 131 ++++++++++++++++++-- SSD-LED/Properties/AssemblyInfo.cs | 4 +- SSD-LED/Properties/Settings.Designer.cs | 50 +++++++- SSD-LED/Properties/Settings.settings | 12 ++ SSD-LED/SSD-LED.csproj | 2 +- SSD-LED/app.config | 12 ++ SSD-LED/bin/Release/SSD-LED.exe | Bin 29696 -> 33792 bytes 8 files changed, 337 insertions(+), 29 deletions(-) diff --git a/SSD-LED/Form1.Designer.cs b/SSD-LED/Form1.Designer.cs index c0609d0..5af8dc9 100644 --- a/SSD-LED/Form1.Designer.cs +++ b/SSD-LED/Form1.Designer.cs @@ -49,7 +49,7 @@ private void InitializeComponent() this.comboBox1 = new System.Windows.Forms.ComboBox(); this.checkBox1 = new System.Windows.Forms.CheckBox(); this.button2 = new System.Windows.Forms.Button(); - this.button1 = new System.Windows.Forms.Button(); + this.btnSaveCfg = new System.Windows.Forms.Button(); this.label2 = new System.Windows.Forms.Label(); this.trackBar1 = new System.Windows.Forms.TrackBar(); this.label1 = new System.Windows.Forms.Label(); @@ -58,6 +58,16 @@ private void InitializeComponent() this.checkBox2 = new System.Windows.Forms.CheckBox(); this.button5 = new System.Windows.Forms.Button(); this.label4 = new System.Windows.Forms.Label(); + this.btnSaveCfg2 = new System.Windows.Forms.Button(); + this.btnApplyColor = new System.Windows.Forms.Button(); + this.tbColorWrite = new System.Windows.Forms.TextBox(); + this.btnColorWrite = new System.Windows.Forms.Button(); + this.tbColorRead = new System.Windows.Forms.TextBox(); + this.btnColorRead = new System.Windows.Forms.Button(); + this.tbColorDefault = new System.Windows.Forms.TextBox(); + this.btnColorDefault = new System.Windows.Forms.Button(); + this.label5 = new System.Windows.Forms.Label(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); this.tabControl1.SuspendLayout(); this.tabPage1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); @@ -70,6 +80,7 @@ private void InitializeComponent() this.tabPage2.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); this.splitContainer2.SuspendLayout(); this.SuspendLayout(); // @@ -123,7 +134,7 @@ private void InitializeComponent() this.splitContainer1.Panel2.Controls.Add(this.comboBox1); this.splitContainer1.Panel2.Controls.Add(this.checkBox1); this.splitContainer1.Panel2.Controls.Add(this.button2); - this.splitContainer1.Panel2.Controls.Add(this.button1); + this.splitContainer1.Panel2.Controls.Add(this.btnSaveCfg); this.splitContainer1.Panel2.Controls.Add(this.label2); this.splitContainer1.Panel2.Controls.Add(this.trackBar1); this.splitContainer1.Panel2.Controls.Add(this.label1); @@ -275,16 +286,16 @@ private void InitializeComponent() this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // - // button1 + // btnSaveCfg // - this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.button1.Location = new System.Drawing.Point(350, 192); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); - this.button1.TabIndex = 3; - this.button1.Text = "Save Config"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); + this.btnSaveCfg.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnSaveCfg.Location = new System.Drawing.Point(350, 192); + this.btnSaveCfg.Name = "btnSaveCfg"; + this.btnSaveCfg.Size = new System.Drawing.Size(75, 23); + this.btnSaveCfg.TabIndex = 3; + this.btnSaveCfg.Text = "Save Config"; + this.btnSaveCfg.UseVisualStyleBackColor = true; + this.btnSaveCfg.Click += new System.EventHandler(this.button1_Click); // // label2 // @@ -342,6 +353,19 @@ private void InitializeComponent() this.splitContainer2.Panel1.Controls.Add(this.checkBox2); this.splitContainer2.Panel1.Controls.Add(this.button5); this.splitContainer2.Panel1.Controls.Add(this.label4); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.checkBox3); + this.splitContainer2.Panel2.Controls.Add(this.btnSaveCfg2); + this.splitContainer2.Panel2.Controls.Add(this.btnApplyColor); + this.splitContainer2.Panel2.Controls.Add(this.tbColorWrite); + this.splitContainer2.Panel2.Controls.Add(this.btnColorWrite); + this.splitContainer2.Panel2.Controls.Add(this.tbColorRead); + this.splitContainer2.Panel2.Controls.Add(this.btnColorRead); + this.splitContainer2.Panel2.Controls.Add(this.tbColorDefault); + this.splitContainer2.Panel2.Controls.Add(this.btnColorDefault); + this.splitContainer2.Panel2.Controls.Add(this.label5); this.splitContainer2.Size = new System.Drawing.Size(518, 423); this.splitContainer2.SplitterDistance = 237; this.splitContainer2.TabIndex = 0; @@ -375,6 +399,101 @@ private void InitializeComponent() this.label4.TabIndex = 0; this.label4.Text = "Autostart setting"; // + // btnSaveCfg2 + // + this.btnSaveCfg2.Location = new System.Drawing.Point(87, 131); + this.btnSaveCfg2.Name = "btnSaveCfg2"; + this.btnSaveCfg2.Size = new System.Drawing.Size(75, 23); + this.btnSaveCfg2.TabIndex = 8; + this.btnSaveCfg2.Text = "Save Config"; + this.btnSaveCfg2.UseVisualStyleBackColor = true; + this.btnSaveCfg2.Click += new System.EventHandler(this.button1_Click); + // + // btnApplyColor + // + this.btnApplyColor.Location = new System.Drawing.Point(6, 131); + this.btnApplyColor.Name = "btnApplyColor"; + this.btnApplyColor.Size = new System.Drawing.Size(75, 23); + this.btnApplyColor.TabIndex = 7; + this.btnApplyColor.Text = "apply"; + this.btnApplyColor.UseVisualStyleBackColor = true; + this.btnApplyColor.Click += new System.EventHandler(this.btnApplyColor_Click); + // + // tbColorWrite + // + this.tbColorWrite.Enabled = false; + this.tbColorWrite.Location = new System.Drawing.Point(172, 80); + this.tbColorWrite.Name = "tbColorWrite"; + this.tbColorWrite.Size = new System.Drawing.Size(100, 20); + this.tbColorWrite.TabIndex = 6; + // + // btnColorWrite + // + this.btnColorWrite.Location = new System.Drawing.Point(6, 78); + this.btnColorWrite.Name = "btnColorWrite"; + this.btnColorWrite.Size = new System.Drawing.Size(75, 23); + this.btnColorWrite.TabIndex = 5; + this.btnColorWrite.Text = "Write"; + this.btnColorWrite.UseVisualStyleBackColor = true; + this.btnColorWrite.Click += new System.EventHandler(this.btnColorWrite_Click); + // + // tbColorRead + // + this.tbColorRead.Enabled = false; + this.tbColorRead.Location = new System.Drawing.Point(172, 51); + this.tbColorRead.Name = "tbColorRead"; + this.tbColorRead.Size = new System.Drawing.Size(100, 20); + this.tbColorRead.TabIndex = 4; + // + // btnColorRead + // + this.btnColorRead.Location = new System.Drawing.Point(6, 49); + this.btnColorRead.Name = "btnColorRead"; + this.btnColorRead.Size = new System.Drawing.Size(75, 23); + this.btnColorRead.TabIndex = 3; + this.btnColorRead.Text = "Read"; + this.btnColorRead.UseVisualStyleBackColor = true; + this.btnColorRead.Click += new System.EventHandler(this.btnColorRead_Click); + // + // tbColorDefault + // + this.tbColorDefault.Enabled = false; + this.tbColorDefault.Location = new System.Drawing.Point(172, 22); + this.tbColorDefault.Name = "tbColorDefault"; + this.tbColorDefault.Size = new System.Drawing.Size(100, 20); + this.tbColorDefault.TabIndex = 2; + // + // btnColorDefault + // + this.btnColorDefault.Location = new System.Drawing.Point(6, 20); + this.btnColorDefault.Name = "btnColorDefault"; + this.btnColorDefault.Size = new System.Drawing.Size(75, 23); + this.btnColorDefault.TabIndex = 1; + this.btnColorDefault.Text = "Default"; + this.btnColorDefault.UseVisualStyleBackColor = true; + this.btnColorDefault.Click += new System.EventHandler(this.button6_Click); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(3, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(70, 13); + this.label5.TabIndex = 0; + this.label5.Text = "Color settings"; + // + // checkBox3 + // + this.checkBox3.AutoSize = true; + this.checkBox3.Checked = true; + this.checkBox3.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBox3.Location = new System.Drawing.Point(6, 108); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.Size = new System.Drawing.Size(172, 17); + this.checkBox3.TabIndex = 9; + this.checkBox3.Text = "enable color scaling (mixcolors)"; + this.checkBox3.UseVisualStyleBackColor = true; + // // SSDLED // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -402,6 +521,8 @@ private void InitializeComponent() this.tabPage2.ResumeLayout(false); this.splitContainer2.Panel1.ResumeLayout(false); this.splitContainer2.Panel1.PerformLayout(); + this.splitContainer2.Panel2.ResumeLayout(false); + this.splitContainer2.Panel2.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); this.splitContainer2.ResumeLayout(false); this.ResumeLayout(false); @@ -424,7 +545,7 @@ private void InitializeComponent() private System.Windows.Forms.ComboBox comboBox1; private System.Windows.Forms.CheckBox checkBox1; private System.Windows.Forms.Button button2; - private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button btnSaveCfg; private System.Windows.Forms.Label label2; private System.Windows.Forms.TrackBar trackBar1; private System.Windows.Forms.Label label1; @@ -433,6 +554,16 @@ private void InitializeComponent() private System.Windows.Forms.Button button5; private System.Windows.Forms.Label label4; private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.Button btnColorDefault; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox tbColorDefault; + private System.Windows.Forms.TextBox tbColorWrite; + private System.Windows.Forms.Button btnColorWrite; + private System.Windows.Forms.TextBox tbColorRead; + private System.Windows.Forms.Button btnColorRead; + private System.Windows.Forms.Button btnApplyColor; + private System.Windows.Forms.Button btnSaveCfg2; + private System.Windows.Forms.CheckBox checkBox3; } } diff --git a/SSD-LED/Form1.cs b/SSD-LED/Form1.cs index d9f6825..b1cc503 100644 --- a/SSD-LED/Form1.cs +++ b/SSD-LED/Form1.cs @@ -16,8 +16,12 @@ public partial class SSDLED : Form #warning TODO: check if screen to restore window is availabe (case: docking station) + show tooltip with process which has most influence in RW private NotifyIcon notifyIcon; - Icon iconBlack; - Color oldIconColor = Color.Black; + Color defaultColor = Color.Black; + Color writeColor = Color.FromArgb(255,0,0); + Color readColor = Color.FromArgb(0,255,0); + bool enableMixColors = true; + Icon iconDefault; + Color oldIconColor; //ManagementClass driveDataClass = new ManagementClass("Win32_PerfFormattedData_PerfDisk_PhysicalDisk"); private PerformanceCounter _diskReadCounter = new PerformanceCounter(); @@ -63,7 +67,8 @@ public SSDLED() //this.Hide(); is useless here... - iconBlack = CreateIcon(Color.Black); + oldIconColor = defaultColor; + iconDefault = CreateIcon(defaultColor); initTrayIcon(); notifyIcon.Text = "Initializing..."; @@ -103,7 +108,7 @@ public SSDLED() private void initTrayIcon() { notifyIcon = new NotifyIcon(); - notifyIcon.Icon = iconBlack; + notifyIcon.Icon = iconDefault; notifyIcon.Visible = true; //create menu items @@ -151,7 +156,7 @@ private Icon CreateIcon(Color color) } catch { - icon = iconBlack; + icon = iconDefault; System.GC.Collect(); System.GC.WaitForPendingFinalizers(); } @@ -173,7 +178,7 @@ private Icon CreateIcon(Color color) if (icon.Size.Height == 0) { //here we are, if we destroy the handle... - icon = iconBlack; + icon = iconDefault; System.GC.Collect(); System.GC.WaitForPendingFinalizers(); } @@ -228,18 +233,15 @@ public void SSDActivityPerfCount() //notifyIcon.Text = Math.Round(bytesPSRead / 1024, 2).ToString() + " KB/s read / " + Math.Round(bytesPSWrite / 1024, 2).ToString() + " KB/s write"; - int scaledKBSRead = (int)((bytesPSRead / 1024) / maxSpeedKBS * 255); - int scaledKBSWrite = (int)((bytesPSWrite / 1024) / maxSpeedKBS * 255); - scaledKBSRead = scaledKBSRead > 255 ? 255 : scaledKBSRead; - scaledKBSWrite = scaledKBSWrite > 255 ? 255 : scaledKBSWrite; + Color newColor = CalculateColor(bytesPSRead, bytesPSWrite); Icon temp = notifyIcon.Icon; - Color newColor = Color.FromArgb(scaledKBSWrite, scaledKBSRead, 0); + //create only new icon if it changed if (oldIconColor != newColor) { notifyIcon.Icon = CreateIcon(newColor); - if (temp != iconBlack) + if (temp != iconDefault) { //if we don't do this, windows refuses after 10000 DestroyIcon(temp.Handle); @@ -251,7 +253,45 @@ public void SSDActivityPerfCount() //notifyIcon.Visible = false; //notifyIcon.Visible = true; - button3.BackColor = Color.FromArgb(scaledKBSWrite, scaledKBSRead, 0); + updateChartWindow(bytesPSRead, bytesPSWrite, newColor); + } + + private Color CalculateColor(float bytesPSRead, float bytesPSWrite) + { + if(enableMixColors) + { + int scaledKBSRead = (int)((bytesPSRead / 1024) / maxSpeedKBS * 255); + int scaledKBSWrite = (int)((bytesPSWrite / 1024) / maxSpeedKBS * 255); + scaledKBSRead = scaledKBSRead > 255 ? 255 : scaledKBSRead; + scaledKBSWrite = scaledKBSWrite > 255 ? 255 : scaledKBSWrite; + + int R = (int)(((readColor.R / 255f) * scaledKBSRead + (writeColor.R / 255f) * scaledKBSWrite));// / 2); + int G = (int)(((readColor.G / 255f) * scaledKBSRead + (writeColor.G / 255f) * scaledKBSWrite));// / 2); + int B = (int)(((readColor.B / 255f) * scaledKBSRead + (writeColor.B / 255f) * scaledKBSWrite));// / 2); + R = R > 255 ? 255 : R; + G = G > 255 ? 255 : G; + B = B > 255 ? 255 : B; + return Color.FromArgb(R, G, B); + } + else + { + if( (((bytesPSRead / 1024) / maxSpeedKBS) > 0) || (((bytesPSRead / 1024) / maxSpeedKBS) > 0)) + { + if(bytesPSRead>bytesPSWrite) + { + return readColor; + } + else + { + return writeColor; + } + } + return defaultColor; + } + } + + private void updateChartWindow(float bytesPSRead, float bytesPSWrite,Color buttonColor) + { int scaledMBSRead = (int)(bytesPSRead / (1024 * 1024) + 0.5); int scaledMBSWrite = (int)(bytesPSWrite / (1024 * 1024) + 0.5); scaledMBSRead = scaledMBSRead < 1 ? 1 : scaledMBSRead; @@ -260,6 +300,7 @@ public void SSDActivityPerfCount() int maxTickCountChart = 100; if ((this.WindowState != FormWindowState.Minimized) && (this.Visible == true)) { + button3.BackColor = buttonColor; chart1.Series["Read"].Points.AddXY(tickCount, scaledMBSRead); chart1.Series["Write"].Points.AddXY(tickCount, scaledMBSWrite); @@ -574,6 +615,20 @@ private bool loadSettings() diskSelectionPFCStr = null; } checkBox1.Checked = tempBool; + + defaultColor = ColorTranslator.FromHtml(Properties.Settings.Default["ColorDefault"].ToString()); + iconDefault = CreateIcon(defaultColor); + tbColorDefault.BackColor = defaultColor; + tbColorDefault.Text = defaultColor.ToString(); + + readColor = ColorTranslator.FromHtml(Properties.Settings.Default["ColorRead"].ToString()); + tbColorRead.BackColor = readColor; + tbColorRead.Text = readColor.ToString(); + + writeColor = ColorTranslator.FromHtml(Properties.Settings.Default["ColorWrite"].ToString()); + tbColorWrite.BackColor = writeColor; + tbColorWrite.Text = writeColor.ToString(); + return true; } catch (Exception) @@ -582,6 +637,13 @@ private bool loadSettings() } } + private string ToHexValue(Color color) + { + return "#" + color.R.ToString("X2") + + color.G.ToString("X2") + + color.B.ToString("X2"); + } + private void saveSettings() { Properties.Settings.Default["MaxSpeed"] = maxSpeedKBS; @@ -591,6 +653,9 @@ private void saveSettings() { Properties.Settings.Default["DriveSelected"] = diskSelectionPFCStr; } + Properties.Settings.Default["ColorDefault"] = ToHexValue(defaultColor); //ColorTranslator.ToHtml(defaultColor); + Properties.Settings.Default["ColorRead"] = ToHexValue(readColor); + Properties.Settings.Default["ColorWrite"] = ToHexValue(writeColor); Properties.Settings.Default.Save(); } @@ -602,6 +667,46 @@ private void button5_Click(object sender, EventArgs e) #endregion + private void button6_Click(object sender, EventArgs e) + { + ColorDialog colorDialog1 = new ColorDialog(); + if (colorDialog1.ShowDialog() == DialogResult.OK) + { + tbColorDefault.BackColor = colorDialog1.Color; + tbColorDefault.Text = colorDialog1.Color.ToString(); + } + } + + private void btnColorRead_Click(object sender, EventArgs e) + { + ColorDialog colorDialog1 = new ColorDialog(); + if (colorDialog1.ShowDialog() == DialogResult.OK) + { + tbColorRead.BackColor = colorDialog1.Color; + tbColorRead.Text = colorDialog1.Color.ToString(); + } + } + + private void btnColorWrite_Click(object sender, EventArgs e) + { + ColorDialog colorDialog1 = new ColorDialog(); + if (colorDialog1.ShowDialog() == DialogResult.OK) + { + tbColorWrite.BackColor = colorDialog1.Color; + tbColorWrite.Text = colorDialog1.Color.ToString(); + } + } + + private void btnApplyColor_Click(object sender, EventArgs e) + { + //apply code + defaultColor = tbColorDefault.BackColor; + readColor = tbColorRead.BackColor; + writeColor = tbColorWrite.BackColor; + + iconDefault = CreateIcon(defaultColor); + enableMixColors = checkBox3.Checked; + } } diff --git a/SSD-LED/Properties/AssemblyInfo.cs b/SSD-LED/Properties/AssemblyInfo.cs index a73fc81..c2b1a74 100644 --- a/SSD-LED/Properties/AssemblyInfo.cs +++ b/SSD-LED/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.5.0")] -[assembly: AssemblyFileVersion("1.0.5.0")] +[assembly: AssemblyVersion("1.0.6.0")] +[assembly: AssemblyFileVersion("1.0.6.0")] diff --git a/SSD-LED/Properties/Settings.Designer.cs b/SSD-LED/Properties/Settings.Designer.cs index 55461f1..02ec59c 100644 --- a/SSD-LED/Properties/Settings.Designer.cs +++ b/SSD-LED/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace SSD_LED.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -70,5 +70,53 @@ public string DriveSelected { this["DriveSelected"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool MixColors { + get { + return ((bool)(this["MixColors"])); + } + set { + this["MixColors"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("#000000")] + public string ColorDefault { + get { + return ((string)(this["ColorDefault"])); + } + set { + this["ColorDefault"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("#00ff00")] + public string ColorRead { + get { + return ((string)(this["ColorRead"])); + } + set { + this["ColorRead"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("#ff0000")] + public string ColorWrite { + get { + return ((string)(this["ColorWrite"])); + } + set { + this["ColorWrite"] = value; + } + } } } diff --git a/SSD-LED/Properties/Settings.settings b/SSD-LED/Properties/Settings.settings index c20a7eb..d4107c7 100644 --- a/SSD-LED/Properties/Settings.settings +++ b/SSD-LED/Properties/Settings.settings @@ -14,5 +14,17 @@ + + True + + + #000000 + + + #00ff00 + + + #ff0000 + \ No newline at end of file diff --git a/SSD-LED/SSD-LED.csproj b/SSD-LED/SSD-LED.csproj index e8b2cab..94f3a25 100644 --- a/SSD-LED/SSD-LED.csproj +++ b/SSD-LED/SSD-LED.csproj @@ -25,7 +25,7 @@ true true 0 - 1.0.5.0 + 1.0.6.0 false true true diff --git a/SSD-LED/app.config b/SSD-LED/app.config index 0538ffc..9376488 100644 --- a/SSD-LED/app.config +++ b/SSD-LED/app.config @@ -19,6 +19,18 @@ + + True + + + #000000 + + + #00ff00 + + + #ff0000 + diff --git a/SSD-LED/bin/Release/SSD-LED.exe b/SSD-LED/bin/Release/SSD-LED.exe index 956a14b6982e0c6704ae6c3eaeead2c056ffccf0..2c3cd298d2fb6ca59da0c5973e28ef14d4a7d151 100644 GIT binary patch literal 33792 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 M8Q=c=f9HY!3C~FdMgRZ+ literal 29696 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 K=JDUo0{;_ak{KZY