diff --git a/MorseTrainer/Config.cs b/MorseTrainer/Config.cs
index 2464c04..51697d8 100644
--- a/MorseTrainer/Config.cs
+++ b/MorseTrainer/Config.cs
@@ -42,6 +42,7 @@ namespace MorseTrainer
Default._duration = 60;
Default._startDelay = 2;
Default._stopDelay = 2;
+ Default._paper = false;
Default._volume = 1.0f;
Default._method = CharGenerator.Method.Koch;
@@ -245,6 +246,24 @@ namespace MorseTrainer
}
}
+ private bool _paper;
+
+ ///
+ /// Gets or sets the paper value which lets the user control when to analyze
+ ///
+ public bool Paper
+ {
+ get
+ {
+ return _paper;
+ }
+ set
+ {
+ _paper = value;
+ }
+ }
+
+
private float _volume;
///
diff --git a/MorseTrainer/Form1.Designer.cs b/MorseTrainer/Form1.Designer.cs
index aeb9a65..3d7e56f 100644
--- a/MorseTrainer/Form1.Designer.cs
+++ b/MorseTrainer/Form1.Designer.cs
@@ -52,7 +52,6 @@
this.txtAnalysis = new System.Windows.Forms.RichTextBox();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
- this.label7 = new System.Windows.Forms.Label();
this.sliderStartDelay = new System.Windows.Forms.TrackBar();
this.sliderStopDelay = new System.Windows.Forms.TrackBar();
this.txtFrequency = new System.Windows.Forms.TextBox();
@@ -74,6 +73,9 @@
this.mnuContextRestoreDefaults = new System.Windows.Forms.ToolStripMenuItem();
this.mnuContextSetProsignKeys = new System.Windows.Forms.ToolStripMenuItem();
this.mnuContextAbout = new System.Windows.Forms.ToolStripMenuItem();
+ this.radPaper = new System.Windows.Forms.RadioButton();
+ this.radTimed = new System.Windows.Forms.RadioButton();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
((System.ComponentModel.ISupportInitialize)(this.sliderFrequency)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.sliderWPM)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.sliderDuration)).BeginInit();
@@ -82,6 +84,7 @@
((System.ComponentModel.ISupportInitialize)(this.sliderStopDelay)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.sliderVolume)).BeginInit();
this.mnuStrip.SuspendLayout();
+ this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// label1
@@ -194,15 +197,6 @@
this.label6.TabIndex = 10;
this.label6.Text = "Start Delay";
//
- // label7
- //
- this.label7.AutoSize = true;
- this.label7.Location = new System.Drawing.Point(357, 188);
- this.label7.Name = "label7";
- this.label7.Size = new System.Drawing.Size(87, 20);
- this.label7.TabIndex = 11;
- this.label7.Text = "Stop Delay";
- //
// sliderStartDelay
//
this.sliderStartDelay.Location = new System.Drawing.Point(147, 185);
@@ -268,7 +262,7 @@
// btnKoch
//
this.btnKoch.AutoSize = true;
- this.btnKoch.Location = new System.Drawing.Point(24, 484);
+ this.btnKoch.Location = new System.Drawing.Point(8, 19);
this.btnKoch.Name = "btnKoch";
this.btnKoch.Size = new System.Drawing.Size(70, 24);
this.btnKoch.TabIndex = 19;
@@ -280,7 +274,7 @@
// btnCustom
//
this.btnCustom.AutoSize = true;
- this.btnCustom.Location = new System.Drawing.Point(24, 522);
+ this.btnCustom.Location = new System.Drawing.Point(8, 57);
this.btnCustom.Name = "btnCustom";
this.btnCustom.Size = new System.Drawing.Size(89, 24);
this.btnCustom.TabIndex = 20;
@@ -292,7 +286,7 @@
// cmbKoch
//
this.cmbKoch.FormattingEnabled = true;
- this.cmbKoch.Location = new System.Drawing.Point(139, 483);
+ this.cmbKoch.Location = new System.Drawing.Point(123, 18);
this.cmbKoch.Name = "cmbKoch";
this.cmbKoch.Size = new System.Drawing.Size(100, 28);
this.cmbKoch.TabIndex = 21;
@@ -300,7 +294,7 @@
//
// txtCustom
//
- this.txtCustom.Location = new System.Drawing.Point(139, 522);
+ this.txtCustom.Location = new System.Drawing.Point(123, 57);
this.txtCustom.Name = "txtCustom";
this.txtCustom.Size = new System.Drawing.Size(602, 26);
this.txtCustom.TabIndex = 22;
@@ -308,7 +302,7 @@
// chkFavorNew
//
this.chkFavorNew.AutoSize = true;
- this.chkFavorNew.Location = new System.Drawing.Point(259, 484);
+ this.chkFavorNew.Location = new System.Drawing.Point(243, 19);
this.chkFavorNew.Name = "chkFavorNew";
this.chkFavorNew.Size = new System.Drawing.Size(192, 24);
this.chkFavorNew.TabIndex = 23;
@@ -388,22 +382,57 @@
this.mnuContextAbout.Text = "About...";
this.mnuContextAbout.Click += new System.EventHandler(this.mnuContextAbout_Click);
//
+ // radPaper
+ //
+ this.radPaper.AutoSize = true;
+ this.radPaper.Location = new System.Drawing.Point(361, 216);
+ this.radPaper.Name = "radPaper";
+ this.radPaper.Size = new System.Drawing.Size(76, 24);
+ this.radPaper.TabIndex = 29;
+ this.radPaper.Text = "Paper";
+ this.radPaper.UseVisualStyleBackColor = true;
+ this.radPaper.Click += new System.EventHandler(this.radTimedPaper_Click);
+ //
+ // radTimed
+ //
+ this.radTimed.AutoSize = true;
+ this.radTimed.Checked = true;
+ this.radTimed.Location = new System.Drawing.Point(361, 186);
+ this.radTimed.Name = "radTimed";
+ this.radTimed.Size = new System.Drawing.Size(77, 24);
+ this.radTimed.TabIndex = 30;
+ this.radTimed.TabStop = true;
+ this.radTimed.Text = "Timed";
+ this.radTimed.UseVisualStyleBackColor = true;
+ this.radTimed.Click += new System.EventHandler(this.radTimedPaper_Click);
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.chkFavorNew);
+ this.groupBox1.Controls.Add(this.txtCustom);
+ this.groupBox1.Controls.Add(this.cmbKoch);
+ this.groupBox1.Controls.Add(this.btnCustom);
+ this.groupBox1.Controls.Add(this.btnKoch);
+ this.groupBox1.Location = new System.Drawing.Point(21, 471);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(735, 94);
+ this.groupBox1.TabIndex = 31;
+ this.groupBox1.TabStop = false;
+ //
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(941, 580);
this.ContextMenuStrip = this.mnuStrip;
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.radTimed);
+ this.Controls.Add(this.radPaper);
this.Controls.Add(this.txtVolume);
this.Controls.Add(this.txtStopDelay);
this.Controls.Add(this.txtStartDelay);
this.Controls.Add(this.sliderVolume);
this.Controls.Add(this.label8);
- this.Controls.Add(this.chkFavorNew);
- this.Controls.Add(this.txtCustom);
- this.Controls.Add(this.cmbKoch);
- this.Controls.Add(this.btnCustom);
- this.Controls.Add(this.btnKoch);
this.Controls.Add(this.btnStartStop);
this.Controls.Add(this.txtDuration);
this.Controls.Add(this.txtFarnsworth);
@@ -411,7 +440,6 @@
this.Controls.Add(this.txtFrequency);
this.Controls.Add(this.sliderStopDelay);
this.Controls.Add(this.sliderStartDelay);
- this.Controls.Add(this.label7);
this.Controls.Add(this.label6);
this.Controls.Add(this.label5);
this.Controls.Add(this.txtAnalysis);
@@ -436,6 +464,8 @@
((System.ComponentModel.ISupportInitialize)(this.sliderStopDelay)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.sliderVolume)).EndInit();
this.mnuStrip.ResumeLayout(false);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@@ -454,7 +484,6 @@
private System.Windows.Forms.RichTextBox txtAnalysis;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
- private System.Windows.Forms.Label label7;
private System.Windows.Forms.TrackBar sliderStartDelay;
private System.Windows.Forms.TrackBar sliderStopDelay;
private System.Windows.Forms.TextBox txtFrequency;
@@ -476,6 +505,9 @@
private System.Windows.Forms.ToolStripMenuItem mnuContextRestoreDefaults;
private System.Windows.Forms.ToolStripMenuItem mnuContextSetProsignKeys;
private System.Windows.Forms.ToolStripMenuItem mnuContextAbout;
+ private System.Windows.Forms.RadioButton radPaper;
+ private System.Windows.Forms.RadioButton radTimed;
+ private System.Windows.Forms.GroupBox groupBox1;
}
}
diff --git a/MorseTrainer/Form1.cs b/MorseTrainer/Form1.cs
index df64302..fdf97dd 100644
--- a/MorseTrainer/Form1.cs
+++ b/MorseTrainer/Form1.cs
@@ -173,6 +173,15 @@ namespace MorseTrainer
StopDelaySlider = config.StopDelay;
StopDelayText = config.StopDelay;
+ if (config.Paper)
+ {
+ radPaper.Checked = true;
+ }
+ else
+ {
+ radTimed.Checked = true;
+ }
+
Volume = config.Volume;
VolumeSlider = config.Volume;
VolumeText = config.Volume;
@@ -206,6 +215,7 @@ namespace MorseTrainer
config.StartDelay = (UInt16)sliderStartDelay.Value;
config.StopDelay = (UInt16)sliderStopDelay.Value;
+ config.Paper = radPaper.Checked;
config.Volume = (float)sliderVolume.Value / 10.0f;
config.GenerationMethod = btnKoch.Checked ? CharGenerator.Method.Koch : CharGenerator.Method.Custom;
@@ -230,9 +240,13 @@ namespace MorseTrainer
btnStartStop.Enabled = false;
_runner.RequestStop();
}
+ //else if (_runner.IsListenMode && _runner.IsPaper)
+ //{
+ //}
else
{
_recorded.Clear();
+ _charGenerator.Custom = txtCustom.Text.ToUpperInvariant();
String word = _charGenerator.CreateRandomString();
_builder.StartBuildAsync(word, new AsyncCallback(FirstWaveReadyCallback));
btnStartStop.Text = "Stop";
@@ -303,6 +317,17 @@ namespace MorseTrainer
private void _runner_StopDelayEnter(object sender, EventArgs e)
{
+ if (_runner.IsPaper)
+ {
+ if (this.InvokeRequired)
+ {
+ Invoke(new EventHandler(_runner_StopDelayEnter), sender, e);
+ }
+ else
+ {
+ btnStartStop.Text = "Copied";
+ }
+ }
}
private void _runner_StopDelayExit(object sender, EventArgs e)
@@ -333,6 +358,12 @@ namespace MorseTrainer
btnStartStop.Enabled = true;
}
}
+
+ private void radTimedPaper_Click(object sender, EventArgs e)
+ {
+ _runner.IsPaper = radPaper.Checked;
+ }
+
#endregion
#region Analysis
@@ -1336,5 +1367,6 @@ namespace MorseTrainer
private ProsignKeyAssigner _dlgAssigner;
#endregion
+
}
}
diff --git a/MorseTrainer/KeyCaptureForm.cs b/MorseTrainer/KeyCaptureForm.cs
index 6bc02ec..331a3c2 100644
--- a/MorseTrainer/KeyCaptureForm.cs
+++ b/MorseTrainer/KeyCaptureForm.cs
@@ -1,4 +1,22 @@
-using System;
+/*
+ Morse Trainer
+ Copyright (C) 2016 Mark Hamann
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
diff --git a/MorseTrainer/Runner.cs b/MorseTrainer/Runner.cs
index a2cf359..41ac1f5 100644
--- a/MorseTrainer/Runner.cs
+++ b/MorseTrainer/Runner.cs
@@ -52,9 +52,13 @@ namespace MorseTrainer
// send is done, but finishing up the rest of the word
SendFinished,
- // send is
+ // send is finished and counting down to end
StopDelay,
+ // send is finished and waiting for user to indicate the manual input is
+ // complete
+ PaperDelay,
+
// stop requested
StopRequest
}
@@ -102,6 +106,35 @@ namespace MorseTrainer
_timer.Elapsed += _timer_Elapsed;
}
+ ///
+ /// Gets or sets the paper option. When true, the user must call
+ /// PaperCopyComplete to start analysis. When false, the timer
+ /// is used.
+ ///
+ public bool IsPaper
+ {
+ get
+ {
+ return _paper;
+ }
+ set
+ {
+ _paper = value;
+ }
+ }
+
+ ///
+ /// Call PaperCopyComplete when in IsPaper mode and the user is ready
+ /// to have the input analyzed
+ ///
+ public void PaperCopyComplete()
+ {
+ if (_state == State.PaperDelay)
+ {
+ StateExit();
+ }
+ }
+
///
/// Gets whether the runner is idle (false) or in one of the running states (true)
///
@@ -122,7 +155,8 @@ namespace MorseTrainer
get
{
return _state == State.Sending ||
- _state == State.SendFinished ||
+ _state == State.SendFinished ||
+ _state == State.PaperDelay ||
_state == State.StopDelay;
}
}
@@ -165,6 +199,10 @@ namespace MorseTrainer
OnStopDelayExit();
nextState = State.Idle;
break;
+ case State.PaperDelay:
+ OnStopDelayExit();
+ nextState = State.Idle;
+ break;
}
return nextState;
}
@@ -186,8 +224,15 @@ namespace MorseTrainer
OnMorseEnter();
break;
case State.StopDelay:
- _timer.Interval = _stopDelay * 1000;
- _timer.Start();
+ if (_paper)
+ {
+ _state = State.PaperDelay;
+ }
+ else
+ {
+ _timer.Interval = _stopDelay * 1000;
+ _timer.Start();
+ }
OnStopDelayEnter();
break;
}
@@ -378,6 +423,7 @@ namespace MorseTrainer
private int _startDelay;
private int _sendDuration;
private int _stopDelay;
+ private bool _paper;
#region IDisposable Support
private bool disposedValue = false; // To detect redundant calls