From ece758b5d7012fb2ecf68960232203719bb7d05b Mon Sep 17 00:00:00 2001 From: BALEHOK Date: Fri, 20 May 2016 02:31:43 +0300 Subject: [PATCH 01/24] PWM lib, UI --- PWM.sln | 18 +++- PWM/{PWM.Designer.cs => FormPWM.Designer.cs} | 98 ++++++++++++------- PWM/FormPWM.cs | 69 +++++++++++++ PWM/{PWM.resx => FormPWM.resx} | 3 + PWM/PWM.cs | 56 ----------- PWM/PWM.csproj | 21 ++-- PWM/Program.cs | 2 +- PwmLib/PWM.cs | 37 +++++++ PwmLib/Properties/AssemblyInfo.cs | 36 +++++++ PwmLib/PwmLib.csproj | 59 +++++++++++ lib/igfxDHLibv2_0.dll | Bin 0 -> 77824 bytes 11 files changed, 297 insertions(+), 102 deletions(-) rename PWM/{PWM.Designer.cs => FormPWM.Designer.cs} (62%) create mode 100644 PWM/FormPWM.cs rename PWM/{PWM.resx => FormPWM.resx} (96%) delete mode 100644 PWM/PWM.cs create mode 100644 PwmLib/PWM.cs create mode 100644 PwmLib/Properties/AssemblyInfo.cs create mode 100644 PwmLib/PwmLib.csproj create mode 100644 lib/igfxDHLibv2_0.dll diff --git a/PWM.sln b/PWM.sln index 48b4ab3..8f24990 100644 --- a/PWM.sln +++ b/PWM.sln @@ -1,20 +1,36 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22823.1 +VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PWM", "PWM\PWM.csproj", "{2F0EABF3-467D-4F47-9F90-8158AB3D64D2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PwmLib", "PwmLib\PwmLib.csproj", "{B770C3D4-35DE-4C73-BB83-30B8F139B3FC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2F0EABF3-467D-4F47-9F90-8158AB3D64D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F0EABF3-467D-4F47-9F90-8158AB3D64D2}.Debug|Any CPU.Build.0 = Debug|Any CPU {2F0EABF3-467D-4F47-9F90-8158AB3D64D2}.Debug|x64.ActiveCfg = Debug|x64 {2F0EABF3-467D-4F47-9F90-8158AB3D64D2}.Debug|x64.Build.0 = Debug|x64 + {2F0EABF3-467D-4F47-9F90-8158AB3D64D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F0EABF3-467D-4F47-9F90-8158AB3D64D2}.Release|Any CPU.Build.0 = Release|Any CPU {2F0EABF3-467D-4F47-9F90-8158AB3D64D2}.Release|x64.ActiveCfg = Release|x64 {2F0EABF3-467D-4F47-9F90-8158AB3D64D2}.Release|x64.Build.0 = Release|x64 + {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Debug|x64.ActiveCfg = Debug|Any CPU + {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Debug|x64.Build.0 = Debug|Any CPU + {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Release|Any CPU.Build.0 = Release|Any CPU + {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Release|x64.ActiveCfg = Release|Any CPU + {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PWM/PWM.Designer.cs b/PWM/FormPWM.Designer.cs similarity index 62% rename from PWM/PWM.Designer.cs rename to PWM/FormPWM.Designer.cs index 7b25368..64c5769 100644 --- a/PWM/PWM.Designer.cs +++ b/PWM/FormPWM.Designer.cs @@ -1,6 +1,6 @@ namespace PWM { - partial class PWM + partial class FormPWM { /// /// Required designer variable. @@ -28,14 +28,17 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.lOne = new System.Windows.Forms.Label(); + this.vOne = new System.Windows.Forms.Label(); this.lCurrent = new System.Windows.Forms.Label(); this.vCurrent = new System.Windows.Forms.Label(); this.lNew = new System.Windows.Forms.Label(); this.tNew = new System.Windows.Forms.TextBox(); this.bSet = new System.Windows.Forms.Button(); - this.lOne = new System.Windows.Forms.Label(); - this.vOne = new System.Windows.Forms.Label(); + this.btn_Refresh = new System.Windows.Forms.Button(); + this.tmr_Refresh = new System.Windows.Forms.Timer(this.components); this.flowLayoutPanel1.SuspendLayout(); this.SuspendLayout(); // @@ -48,18 +51,42 @@ private void InitializeComponent() this.flowLayoutPanel1.Controls.Add(this.lNew); this.flowLayoutPanel1.Controls.Add(this.tNew); this.flowLayoutPanel1.Controls.Add(this.bSet); + this.flowLayoutPanel1.Controls.Add(this.btn_Refresh); this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(2); this.flowLayoutPanel1.Name = "flowLayoutPanel1"; - this.flowLayoutPanel1.Size = new System.Drawing.Size(254, 132); + this.flowLayoutPanel1.Size = new System.Drawing.Size(238, 140); this.flowLayoutPanel1.TabIndex = 0; // + // lOne + // + this.lOne.AutoSize = true; + this.lOne.Location = new System.Drawing.Point(2, 0); + this.lOne.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lOne.Name = "lOne"; + this.lOne.Size = new System.Drawing.Size(56, 17); + this.lOne.TabIndex = 5; + this.lOne.Text = "Value 1"; + // + // vOne + // + this.vOne.AutoSize = true; + this.flowLayoutPanel1.SetFlowBreak(this.vOne, true); + this.vOne.Location = new System.Drawing.Point(62, 0); + this.vOne.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.vOne.Name = "vOne"; + this.vOne.Size = new System.Drawing.Size(32, 17); + this.vOne.TabIndex = 6; + this.vOne.Text = "???"; + // // lCurrent // this.lCurrent.AutoSize = true; - this.lCurrent.Location = new System.Drawing.Point(3, 25); + this.lCurrent.Location = new System.Drawing.Point(2, 17); + this.lCurrent.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.lCurrent.Name = "lCurrent"; - this.lCurrent.Size = new System.Drawing.Size(77, 25); + this.lCurrent.Size = new System.Drawing.Size(55, 17); this.lCurrent.TabIndex = 0; this.lCurrent.Text = "Current"; // @@ -67,67 +94,68 @@ private void InitializeComponent() // this.vCurrent.AutoSize = true; this.flowLayoutPanel1.SetFlowBreak(this.vCurrent, true); - this.vCurrent.Location = new System.Drawing.Point(86, 25); + this.vCurrent.Location = new System.Drawing.Point(61, 17); + this.vCurrent.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.vCurrent.Name = "vCurrent"; - this.vCurrent.Size = new System.Drawing.Size(45, 25); + this.vCurrent.Size = new System.Drawing.Size(32, 17); this.vCurrent.TabIndex = 1; this.vCurrent.Text = "???"; // // lNew // this.lNew.AutoSize = true; - this.lNew.Location = new System.Drawing.Point(3, 50); + this.lNew.Location = new System.Drawing.Point(2, 34); + this.lNew.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.lNew.Name = "lNew"; - this.lNew.Size = new System.Drawing.Size(51, 25); + this.lNew.Size = new System.Drawing.Size(35, 17); this.lNew.TabIndex = 2; this.lNew.Text = "New"; // // tNew // this.flowLayoutPanel1.SetFlowBreak(this.tNew, true); - this.tNew.Location = new System.Drawing.Point(60, 53); + this.tNew.Location = new System.Drawing.Point(41, 36); + this.tNew.Margin = new System.Windows.Forms.Padding(2); this.tNew.Name = "tNew"; - this.tNew.Size = new System.Drawing.Size(100, 29); + this.tNew.Size = new System.Drawing.Size(74, 22); this.tNew.TabIndex = 3; // // bSet // - this.bSet.Location = new System.Drawing.Point(3, 88); + this.bSet.Location = new System.Drawing.Point(2, 62); + this.bSet.Margin = new System.Windows.Forms.Padding(2); this.bSet.Name = "bSet"; - this.bSet.Size = new System.Drawing.Size(102, 38); + this.bSet.Size = new System.Drawing.Size(74, 25); this.bSet.TabIndex = 4; this.bSet.Text = "Set"; this.bSet.UseVisualStyleBackColor = true; this.bSet.Click += new System.EventHandler(this.bSet_Click); // - // lOne + // btn_Refresh // - this.lOne.AutoSize = true; - this.lOne.Location = new System.Drawing.Point(3, 0); - this.lOne.Name = "lOne"; - this.lOne.Size = new System.Drawing.Size(79, 25); - this.lOne.TabIndex = 5; - this.lOne.Text = "Value 1"; + this.btn_Refresh.Location = new System.Drawing.Point(98, 62); + this.btn_Refresh.Margin = new System.Windows.Forms.Padding(20, 2, 2, 2); + this.btn_Refresh.Name = "btn_Refresh"; + this.btn_Refresh.Size = new System.Drawing.Size(74, 25); + this.btn_Refresh.TabIndex = 7; + this.btn_Refresh.Text = "Refresh"; + this.btn_Refresh.UseVisualStyleBackColor = true; + this.btn_Refresh.Click += new System.EventHandler(this.btnRefresh_Click); // - // vOne + // tmr_Refresh // - this.vOne.AutoSize = true; - this.flowLayoutPanel1.SetFlowBreak(this.vOne, true); - this.vOne.Location = new System.Drawing.Point(88, 0); - this.vOne.Name = "vOne"; - this.vOne.Size = new System.Drawing.Size(45, 25); - this.vOne.TabIndex = 6; - this.vOne.Text = "???"; + this.tmr_Refresh.Interval = 3000; + this.tmr_Refresh.Tick += new System.EventHandler(this.tmr_Refresh_Tick); // - // PWM + // FormPWM // - this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 24F); + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(254, 132); + this.ClientSize = new System.Drawing.Size(238, 140); this.Controls.Add(this.flowLayoutPanel1); + this.Margin = new System.Windows.Forms.Padding(2); this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "PWM"; + this.Name = "FormPWM"; this.Text = "PWM"; this.flowLayoutPanel1.ResumeLayout(false); this.flowLayoutPanel1.PerformLayout(); @@ -145,6 +173,8 @@ private void InitializeComponent() private System.Windows.Forms.Button bSet; private System.Windows.Forms.Label lOne; private System.Windows.Forms.Label vOne; + private System.Windows.Forms.Button btn_Refresh; + private System.Windows.Forms.Timer tmr_Refresh; } } diff --git a/PWM/FormPWM.cs b/PWM/FormPWM.cs new file mode 100644 index 0000000..db365db --- /dev/null +++ b/PWM/FormPWM.cs @@ -0,0 +1,69 @@ +using System; +using System.Threading; +using System.Windows.Forms; + +namespace PWM +{ + public partial class FormPWM : Form + { + private PwmLib.PWM _pwm; + + public FormPWM() + { + InitializeComponent(); + + _pwm = new PwmLib.PWM(); + RefreshV(); + + tmr_Refresh.Start(); + } + void RefreshV() + { + int a = 0, freq = 0; + var error = _pwm.GetFrequency(ref a, ref freq); + if (error != 0) + { + MessageBox.Show($"failed to get PWM: {error}"); + } + + vCurrent.Text = freq.ToString(); + vOne.Text = a.ToString(); + } + + private void bSet_Click(object sender, EventArgs e) + { + int v; + if (!int.TryParse(tNew.Text, out v) || v < 200) + { + MessageBox.Show("Invalid value < 200"); + return; + } + + var error = _pwm.SetFrequency(v); + + if (error != 0) + { + MessageBox.Show($"failed to set PWM: {error}"); + } + + RefreshV(); + } + + private void btnRefresh_Click(object sender, EventArgs e) + { + RefreshV(); + } + + private void tmr_Refresh_Tick(object sender, EventArgs e) + { + RefreshV(); + + var color = vCurrent.BackColor; + vCurrent.BackColor = System.Drawing.Color.Green; + Refresh(); + Thread.Sleep(50); + + vCurrent.BackColor = color; + } + } +} diff --git a/PWM/PWM.resx b/PWM/FormPWM.resx similarity index 96% rename from PWM/PWM.resx rename to PWM/FormPWM.resx index 1af7de1..c9c688b 100644 --- a/PWM/PWM.resx +++ b/PWM/FormPWM.resx @@ -117,4 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + \ No newline at end of file diff --git a/PWM/PWM.cs b/PWM/PWM.cs deleted file mode 100644 index 413a008..0000000 --- a/PWM/PWM.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using igfxDHLib; -using System.Runtime.Remoting.Metadata.W3cXsd2001; - -namespace PWM -{ - public partial class PWM : Form - { - private byte[] baseData; - private DataHandler dh; - - public PWM() - { - InitializeComponent(); - dh = new igfxDHLib.DataHandler(); - RefreshV(); - } - void RefreshV() - { - uint error = 0; - baseData = new byte[8]; - dh.GetDataFromDriver(ESCAPEDATATYPE_ENUM.GET_SET_PWM_FREQUENCY, 4, ref error, ref baseData[0]); - if (error != 0) - MessageBox.Show(string.Format("failed to get PWM: {0:X}", error)); - vCurrent.Text = string.Format("{0}", BitConverter.ToInt32(baseData, 4)); - vOne.Text = string.Format("{0}", BitConverter.ToInt32(baseData, 0)); - } - - private void bSet_Click(object sender, EventArgs e) - { - int v; - if(!int.TryParse(tNew.Text, out v) || v < 200) - { - MessageBox.Show("Invalid value < 200"); - return; - } - byte[] b = BitConverter.GetBytes(v); - Array.Copy(b, 0, baseData, 4, 4); - - uint error = 0; - dh.SendDataToDriver(ESCAPEDATATYPE_ENUM.GET_SET_PWM_FREQUENCY, 4, ref error, ref baseData[0]); - if (error != 0) - MessageBox.Show(string.Format("failed set get PWM: {0:X}", error)); - - RefreshV(); - } - } -} diff --git a/PWM/PWM.csproj b/PWM/PWM.csproj index 240dd15..86f3dfd 100644 --- a/PWM/PWM.csproj +++ b/PWM/PWM.csproj @@ -72,10 +72,6 @@ MinimumRecommendedRules.ruleset - - .\igfxDHLibv2_0.dll - True - @@ -84,21 +80,20 @@ - - + Form - - PWM.cs + + FormPWM.cs - - PWM.cs + + FormPWM.cs ResXFileCodeGenerator @@ -123,6 +118,12 @@ + + + {b770c3d4-35de-4c73-bb83-30b8f139b3fc} + PwmLib + + + \ No newline at end of file diff --git a/lib/igfxDHLibv2_0.dll b/lib/igfxDHLibv2_0.dll new file mode 100644 index 0000000000000000000000000000000000000000..f304912c7cb4b5908eadb0345897df5f5f99e71e GIT binary patch literal 77824 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 E1*1&)t^fc4 literal 0 HcmV?d00001 From b821ed5b1c1841c6d9180dff3ddaf606b58dfcfe Mon Sep 17 00:00:00 2001 From: BALEHOK Date: Fri, 20 May 2016 20:20:03 +0300 Subject: [PATCH 02/24] wpf app, tray icon --- PWM.sln | 10 +++ PWM/App.config | 2 +- PWM/PWM.csproj | 6 +- PWM/Properties/Resources.Designer.cs | 2 +- PWM/Properties/Settings.Designer.cs | 2 +- Wpf/App.config | 6 ++ Wpf/App.xaml | 9 ++ Wpf/App.xaml.cs | 95 ++++++++++++++++++++ Wpf/MainWindow.xaml | 17 ++++ Wpf/MainWindow.xaml.cs | 68 +++++++++++++++ Wpf/Properties/AssemblyInfo.cs | 55 ++++++++++++ Wpf/Properties/Resources.Designer.cs | 73 ++++++++++++++++ Wpf/Properties/Resources.resx | 124 +++++++++++++++++++++++++++ Wpf/Properties/Settings.Designer.cs | 30 +++++++ Wpf/Properties/Settings.settings | 7 ++ Wpf/Resources/tray.ico | Bin 0 -> 45451 bytes Wpf/Wpf.csproj | 117 +++++++++++++++++++++++++ 17 files changed, 619 insertions(+), 4 deletions(-) create mode 100644 Wpf/App.config create mode 100644 Wpf/App.xaml create mode 100644 Wpf/App.xaml.cs create mode 100644 Wpf/MainWindow.xaml create mode 100644 Wpf/MainWindow.xaml.cs create mode 100644 Wpf/Properties/AssemblyInfo.cs create mode 100644 Wpf/Properties/Resources.Designer.cs create mode 100644 Wpf/Properties/Resources.resx create mode 100644 Wpf/Properties/Settings.Designer.cs create mode 100644 Wpf/Properties/Settings.settings create mode 100644 Wpf/Resources/tray.ico create mode 100644 Wpf/Wpf.csproj diff --git a/PWM.sln b/PWM.sln index 8f24990..adeb0a1 100644 --- a/PWM.sln +++ b/PWM.sln @@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PWM", "PWM\PWM.csproj", "{2 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PwmLib", "PwmLib\PwmLib.csproj", "{B770C3D4-35DE-4C73-BB83-30B8F139B3FC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf", "Wpf\Wpf.csproj", "{CBCB0057-1FA5-43B2-A1DF-83D635EEDFF7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -31,6 +33,14 @@ Global {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Release|Any CPU.Build.0 = Release|Any CPU {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Release|x64.ActiveCfg = Release|Any CPU {B770C3D4-35DE-4C73-BB83-30B8F139B3FC}.Release|x64.Build.0 = Release|Any CPU + {CBCB0057-1FA5-43B2-A1DF-83D635EEDFF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CBCB0057-1FA5-43B2-A1DF-83D635EEDFF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CBCB0057-1FA5-43B2-A1DF-83D635EEDFF7}.Debug|x64.ActiveCfg = Debug|Any CPU + {CBCB0057-1FA5-43B2-A1DF-83D635EEDFF7}.Debug|x64.Build.0 = Debug|Any CPU + {CBCB0057-1FA5-43B2-A1DF-83D635EEDFF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CBCB0057-1FA5-43B2-A1DF-83D635EEDFF7}.Release|Any CPU.Build.0 = Release|Any CPU + {CBCB0057-1FA5-43B2-A1DF-83D635EEDFF7}.Release|x64.ActiveCfg = Release|Any CPU + {CBCB0057-1FA5-43B2-A1DF-83D635EEDFF7}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PWM/App.config b/PWM/App.config index 74ade9d..8227adb 100644 --- a/PWM/App.config +++ b/PWM/App.config @@ -1,6 +1,6 @@ - + diff --git a/PWM/PWM.csproj b/PWM/PWM.csproj index 86f3dfd..f055e48 100644 --- a/PWM/PWM.csproj +++ b/PWM/PWM.csproj @@ -9,7 +9,7 @@ Properties PWM PWM - v4.0 + v4.5.2 512 true @@ -23,6 +23,7 @@ DEBUG;TRACE prompt 4 + false AnyCPU @@ -32,6 +33,7 @@ TRACE prompt 4 + false true @@ -61,6 +63,7 @@ x86 prompt MinimumRecommendedRules.ruleset + false bin\x86\Release\ @@ -70,6 +73,7 @@ x86 prompt MinimumRecommendedRules.ruleset + false diff --git a/PWM/Properties/Resources.Designer.cs b/PWM/Properties/Resources.Designer.cs index f1deae0..a7e40a5 100644 --- a/PWM/Properties/Resources.Designer.cs +++ b/PWM/Properties/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.0 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/PWM/Properties/Settings.Designer.cs b/PWM/Properties/Settings.Designer.cs index e50b58c..dcbfee1 100644 --- a/PWM/Properties/Settings.Designer.cs +++ b/PWM/Properties/Settings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.0 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/Wpf/App.config b/Wpf/App.config new file mode 100644 index 0000000..88fa402 --- /dev/null +++ b/Wpf/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Wpf/App.xaml b/Wpf/App.xaml new file mode 100644 index 0000000..af83ec3 --- /dev/null +++ b/Wpf/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/Wpf/App.xaml.cs b/Wpf/App.xaml.cs new file mode 100644 index 0000000..5dfaaac --- /dev/null +++ b/Wpf/App.xaml.cs @@ -0,0 +1,95 @@ +using System.Windows; +using System; +using System.ComponentModel; +using NotifyIcon = System.Windows.Forms.NotifyIcon; +using PwmLib; + +namespace Wpf +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + private Container _components; + private NotifyIcon _notifyIcon; + private PWM _pwm = new PWM(); + + protected override void OnStartup(StartupEventArgs e) + { + base.OnStartup(e); + + _components = new Container(); + _notifyIcon = new NotifyIcon(_components) + { + ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(), + Icon = Wpf.Properties.Resources.tray, + Text = "trololo", + Visible = true + }; + + AddMenuItems(_notifyIcon.ContextMenuStrip.Items); + + _notifyIcon.ContextMenuStrip.Opening += ContextMenuStrip_Opening; + _notifyIcon.DoubleClick += NotifyIcon_DoubleClick; + } + + protected override void OnExit(ExitEventArgs e) + { + if (_notifyIcon != null) + { + _notifyIcon.Dispose(); + } + + if (_components != null) + { + _components.Dispose(); + } + + base.OnExit(e); + + } + + private System.Windows.Forms.ToolStripLabel _currentFreqLabel; + private void AddMenuItems(System.Windows.Forms.ToolStripItemCollection items) + { + _currentFreqLabel = new System.Windows.Forms.ToolStripLabel("???"); + items.Add(_currentFreqLabel); + items.Add(new System.Windows.Forms.ToolStripButton("Set PWM frequency", null, setFreq_Click)); + items.Add(new System.Windows.Forms.ToolStripSeparator()); + items.Add(new System.Windows.Forms.ToolStripButton("Exit", null, onExit_Clicked)); + + } + + private void ContextMenuStrip_Opening(object sender, CancelEventArgs e) + { + e.Cancel = false; + + int a = 0, currentFreq = 0; + if (_pwm.GetFrequency(ref a, ref currentFreq) == 0) + { + _currentFreqLabel.Text = currentFreq.ToString(); + } + else + { + _currentFreqLabel.Text = "driver error"; + } + } + + private void onExit_Clicked(object sender, EventArgs e) + { + Shutdown(); + } + + private void setFreq_Click(object sender, EventArgs e) + { + var form = new MainWindow(_pwm); + form.Show(); + } + + private void NotifyIcon_DoubleClick(object sender, EventArgs e) + { + MessageBox.Show("you double clicked me", "Fuck!", MessageBoxButton.YesNo); + } + } +} diff --git a/Wpf/MainWindow.xaml b/Wpf/MainWindow.xaml new file mode 100644 index 0000000..9f52b7d --- /dev/null +++ b/Wpf/MainWindow.xaml @@ -0,0 +1,17 @@ + + +