diff --git a/MorseTrainer/Analyzer.cs b/MorseTrainer/Analyzer.cs
index d445715..e471bb1 100644
--- a/MorseTrainer/Analyzer.cs
+++ b/MorseTrainer/Analyzer.cs
@@ -35,8 +35,14 @@ namespace MorseTrainer
{
_resultsRTB.Clear();
MorseCompareResults results = Comparer.Compare(sent, recorded);
+ ShowStrings(results);
+ ShowStats(results);
+ }
+
+ private void ShowStrings(MorseCompareResults results)
+ {
Write("I sent : ");
- ResultsDisplayFlags flags = ResultsDisplayFlags.Valid | ResultsDisplayFlags.Dropped;
+ ResultsFlags flags = ResultsFlags.Valid | ResultsFlags.Dropped;
foreach (MorseSubstring substring in results.SubStrings)
{
Write(substring.Str(flags), substring.Color);
@@ -44,13 +50,59 @@ namespace MorseTrainer
Write(Environment.NewLine);
Write("You typed: ");
- flags = ResultsDisplayFlags.Valid | ResultsDisplayFlags.Extra;
+ flags = ResultsFlags.Valid | ResultsFlags.Extra;
foreach (MorseSubstring substring in results.SubStrings)
{
Write(substring.Str(flags), substring.Color);
}
Write(Environment.NewLine);
+ }
+ private void ShowStats(MorseCompareResults results)
+ {
+ int[] sent = new int[256];
+ int[] valid = new int[256];
+ int[] dropped = new int[256];
+ int[] extra = new int[256];
+ int totalValid = 0;
+
+ foreach (char c in results.Sent)
+ {
+ sent[c]++;
+ }
+ foreach (MorseSubstring substring in results.SubStrings)
+ {
+ int[] counter = null;
+ switch (substring.ResultInfo & ResultsFlags.All)
+ {
+ case ResultsFlags.Dropped:
+ counter = dropped;
+ break;
+ case ResultsFlags.Extra:
+ counter = extra;
+ break;
+ case ResultsFlags.Valid:
+ counter = valid;
+ totalValid += substring.Chars.Length;
+ break;
+ }
+ if (counter != null)
+ {
+ foreach (char c in substring.Chars)
+ {
+ counter[c]++;
+ }
+ }
+ }
+
+ Write(String.Format("Sent {0} and {1} recorded valid: {2}%" + Environment.NewLine, results.Sent.Length, totalValid, (float)totalValid / (float)results.Sent.Length));
+ foreach (char c in MorseInfo.PossibleCharacters)
+ {
+ if (sent[c] != 0 || extra[c] != 0)
+ {
+ Write(String.Format(" {0} {1}/{2} : {3},{4}" + Environment.NewLine, MorseInfo.ExpandProsigns(c), valid[c], sent[c], dropped[c], extra[c]));
+ }
+ }
}
private void Write(String text)
diff --git a/MorseTrainer/MorseCompareResults.cs b/MorseTrainer/MorseCompareResults.cs
index 5838a7e..e123a3b 100644
--- a/MorseTrainer/MorseCompareResults.cs
+++ b/MorseTrainer/MorseCompareResults.cs
@@ -29,7 +29,7 @@ namespace MorseTrainer
/// Flags that indicate how to display results
///
[Flags]
- public enum ResultsDisplayFlags
+ public enum ResultsFlags
{
///
/// Display characters that were received as sent
@@ -148,7 +148,15 @@ namespace MorseTrainer
///
/// Flags saying which characters to include
///
- public abstract String Str(ResultsDisplayFlags flags = ResultsDisplayFlags.All);
+ public abstract String Str(ResultsFlags flags = ResultsFlags.All);
+
+ ///
+ /// Gets information about the string
+ ///
+ public abstract ResultsFlags ResultInfo
+ {
+ get;
+ }
protected string _str;
}
@@ -163,16 +171,24 @@ namespace MorseTrainer
{
}
- public override string Str(ResultsDisplayFlags flags)
+ public override string Str(ResultsFlags flags)
{
String ret = "";
- if ((flags & ResultsDisplayFlags.Valid) != 0)
+ if ((flags & ResultsFlags.Valid) != 0)
{
ret = MorseInfo.ExpandProsigns(_str);
}
return ret;
}
+ public override ResultsFlags ResultInfo
+ {
+ get
+ {
+ return ResultsFlags.Valid;
+ }
+ }
+
public override Color Color
{
get
@@ -192,16 +208,24 @@ namespace MorseTrainer
{
}
- public override string Str(ResultsDisplayFlags flags)
+ public override string Str(ResultsFlags flags)
{
String ret = "";
- if ((flags & ResultsDisplayFlags.Dropped) != 0)
+ if ((flags & ResultsFlags.Dropped) != 0)
{
ret = MorseInfo.ExpandProsigns(_str);
}
return ret;
}
+ public override ResultsFlags ResultInfo
+ {
+ get
+ {
+ return ResultsFlags.Dropped;
+ }
+ }
+
public override Color Color
{
get
@@ -221,16 +245,24 @@ namespace MorseTrainer
{
}
- public override string Str(ResultsDisplayFlags flags)
+ public override string Str(ResultsFlags flags)
{
String ret = "";
- if ((flags & ResultsDisplayFlags.Extra) != 0)
+ if ((flags & ResultsFlags.Extra) != 0)
{
ret = MorseInfo.ExpandProsigns(_str);
}
return ret;
}
+ public override ResultsFlags ResultInfo
+ {
+ get
+ {
+ return ResultsFlags.Extra;
+ }
+ }
+
public override Color Color
{
get
diff --git a/MorseTrainer/MorseInfo.cs b/MorseTrainer/MorseInfo.cs
index 5df4070..f36f99e 100644
--- a/MorseTrainer/MorseInfo.cs
+++ b/MorseTrainer/MorseInfo.cs
@@ -130,8 +130,19 @@ namespace MorseTrainer
}
__elements[i] = elements;
}
+
+ List hasConversion = new List();
+ for (int i=0; i<256; i++)
+ {
+ if (__conversions[i] != null)
+ {
+ hasConversion.Add((Char)i);
+ }
+ }
+ __orderedPossibleCharacters = hasConversion.ToArray();
}
+ private static readonly Char[] __orderedPossibleCharacters;
private static Dictionary __prosignExpansionToValue;
private static Dictionary __prosignValueToExpansion;
private static String[] __conversions;
@@ -186,6 +197,24 @@ namespace MorseTrainer
return replaced;
}
+ ///
+ /// Converts a string with prosign constants into a string containing
+ /// the expanded prosigns
+ ///
+ /// A char with prosign constants
+ /// A string with expanded prosigns
+ public static String ExpandProsigns(Char c)
+ {
+ String replaced = c.ToString();
+ foreach (KeyValuePair kv in __prosignExpansionToValue)
+ {
+ String expansion = kv.Key;
+ String value = kv.Value.ToString();
+ replaced = replaced.Replace(value, expansion);
+ }
+ return replaced;
+ }
+
///
/// Converts a string with prosign constants into a string containing
/// the expanded prosigns
@@ -203,5 +232,16 @@ namespace MorseTrainer
}
return replaced;
}
+
+ ///
+ /// Gets an array of possible characters in ASCII/prosign order
+ ///
+ public static Char[] PossibleCharacters
+ {
+ get
+ {
+ return __orderedPossibleCharacters;
+ }
+ }
}
}