From 8b636ee68826f6f230fe79f67eb069548ea460fb Mon Sep 17 00:00:00 2001
From: Adam M Rivera <a432511@gmail.com>
Date: Tue, 24 Apr 2012 16:16:33 -0500
Subject: [PATCH] Planner: Tidied up the implementation of the parser and added
 a parameter meta data repository for easy access to the parsed data.

---
 .../ArdupilotMegaPlanner/ArdupilotMega.csproj |  9 ++++-
 .../ConfigurationView/ConfigRawParams.cs      | 17 +++++++-
 Tools/ArdupilotMegaPlanner/MainV2.cs          |  2 +-
 ...onParser.cs => ParameterMetaDataParser.cs} | 15 ++++---
 .../Utilities/ParameterMetaDataRepository.cs  | 40 +++++++++++++++++++
 Tools/ArdupilotMegaPlanner/app.config         |  2 +
 6 files changed, 73 insertions(+), 12 deletions(-)
 rename Tools/ArdupilotMegaPlanner/Utilities/{ParameterInformationParser.cs => ParameterMetaDataParser.cs} (92%)
 create mode 100644 Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataRepository.cs

diff --git a/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj b/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj
index 2e41a7222..1e1da8469 100644
--- a/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj
+++ b/Tools/ArdupilotMegaPlanner/ArdupilotMega.csproj
@@ -208,6 +208,7 @@
     <Reference Include="System.Xml">
       <Private>False</Private>
     </Reference>
+    <Reference Include="System.Xml.Linq" />
     <Reference Include="ZedGraph, Version=5.1.2.878, Culture=neutral, PublicKeyToken=02a83cbd123fcd60, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
     </Reference>
@@ -225,6 +226,7 @@
     <Compile Include="Attributes\DisplayTextAttribute.cs" />
     <Compile Include="Attributes\PrivateAttribute.cs" />
     <Compile Include="CodeGen.cs" />
+    <Compile Include="Constants\ParameterMetaDataConstants.cs" />
     <Compile Include="Controls\BackstageView\BackstageView.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -552,7 +554,8 @@
     <Compile Include="LangUtility.cs" />
     <Compile Include="ThemeManager.cs" />
     <Compile Include="Utilities\EnumTranslator.cs" />
-    <Compile Include="Utilities\ParameterInformationParser.cs" />
+    <Compile Include="Utilities\ParameterMetaDataParser.cs" />
+    <Compile Include="Utilities\ParameterMetaDataRepository.cs" />
     <EmbeddedResource Include="Antenna\Tracker.resx">
       <DependentUpon>Tracker.cs</DependentUpon>
     </EmbeddedResource>
@@ -1081,7 +1084,9 @@
     <None Include="AeroSimRCAPMHil.zip">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
-    <None Include="app.config" />
+    <None Include="app.config">
+      <SubType>Designer</SubType>
+    </None>
     <None Include="arducopter-xplane.zip">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
diff --git a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.cs b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.cs
index a831f31c1..2ee33bf48 100644
--- a/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.cs
+++ b/Tools/ArdupilotMegaPlanner/GCSViews/ConfigurationView/ConfigRawParams.cs
@@ -2,12 +2,16 @@
 using System.Collections;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.Configuration;
 using System.Drawing;
 using System.Data;
 using System.IO;
 using System.Linq;
 using System.Text;
+using System.Xml.Linq;
 using System.Windows.Forms;
+using ArdupilotMega.Constants;
+using ArdupilotMega.Utilities;
 using log4net;
 using ArdupilotMega.Controls.BackstageView;
 using ArdupilotMega.Controls;
@@ -19,6 +23,8 @@ namespace ArdupilotMega.GCSViews.ConfigurationView
         private static readonly ILog log =
           LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 
+        private readonly ParameterMetaDataRepository _parameterMetaDataRepository;
+
         // Changes made to the params between writing to the copter
         readonly Hashtable _changes = new Hashtable();
 
@@ -41,6 +47,9 @@ namespace ArdupilotMega.GCSViews.ConfigurationView
         public ConfigRawParams()
         {
             InitializeComponent();
+           
+            // Init the accessor class for the parameter meta data
+            _parameterMetaDataRepository = new ParameterMetaDataRepository();
         }
 
         Hashtable loadParamFile(string Filename)
@@ -397,7 +406,13 @@ namespace ArdupilotMega.GCSViews.ConfigurationView
                 Params.Rows[Params.RowCount - 1].Cells[Value.Index].Value = ((float)MainV2.comPort.param[value]).ToString("0.###");
                 try
                 {
-                    if (tooltips[value] != null)
+                    string metaDataDescription = _parameterMetaDataRepository.GetParameterMetaData(value, ParameterMetaDataConstants.Description);
+                    if(!String.IsNullOrEmpty(metaDataDescription))
+                    {
+                       Params.Rows[Params.RowCount - 1].Cells[Command.Index].ToolTipText = metaDataDescription;
+                       Params.Rows[Params.RowCount - 1].Cells[Value.Index].ToolTipText = metaDataDescription;
+                    }
+                    else if (tooltips[value] != null)
                     {
                         Params.Rows[Params.RowCount - 1].Cells[Command.Index].ToolTipText = ((paramsettings)tooltips[value]).desc;
                         //Params.Rows[Params.RowCount - 1].Cells[RawValue.Index].ToolTipText = ((paramsettings)tooltips[value]).desc;
diff --git a/Tools/ArdupilotMegaPlanner/MainV2.cs b/Tools/ArdupilotMegaPlanner/MainV2.cs
index 9a8e4d803..a8ace39bd 100644
--- a/Tools/ArdupilotMegaPlanner/MainV2.cs
+++ b/Tools/ArdupilotMegaPlanner/MainV2.cs
@@ -1232,7 +1232,7 @@ namespace ArdupilotMega
             }
 
             // TODO: Move this to a more appropriate place, like right after CheckForUpdate();
-            ParameterInformationParser.GetParameterInformation();
+            ParameterMetaDataParser.GetParameterInformation();
         }
 
 
diff --git a/Tools/ArdupilotMegaPlanner/Utilities/ParameterInformationParser.cs b/Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataParser.cs
similarity index 92%
rename from Tools/ArdupilotMegaPlanner/Utilities/ParameterInformationParser.cs
rename to Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataParser.cs
index e67cf8ec4..a737da4f5 100644
--- a/Tools/ArdupilotMegaPlanner/Utilities/ParameterInformationParser.cs
+++ b/Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataParser.cs
@@ -7,15 +7,14 @@ using System.Net;
 using System.Text.RegularExpressions;
 using System.Windows.Forms;
 using System.Xml;
+using ArdupilotMega.Constants;
 using log4net;
 
 namespace ArdupilotMega.Utilities
 {
-   public static class ParameterInformationParser
+   public static class ParameterMetaDataParser
    {
-      private const string META_DELIMETER = "@";
-      private const string PARAM_KEY = "Param";
-      private static readonly Regex _paramMetaRegex = new Regex(String.Format("{0}(?<MetaKey>[^:]+):(?<MetaValue>.+)", META_DELIMETER));
+      private static readonly Regex _paramMetaRegex = new Regex(String.Format("{0}(?<MetaKey>[^:]+):(?<MetaValue>.+)", ParameterMetaDataConstants.Delimeter));
       private static readonly ILog log =
          LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 
@@ -29,7 +28,7 @@ namespace ArdupilotMega.Utilities
             parameterLocations.RemoveAll(String.IsNullOrEmpty);
 
             string sStartupPath = Application.StartupPath;
-            using(var objXmlTextWriter = new XmlTextWriter(String.Format("{0}\\ParameterMetaData.xml", sStartupPath), null))
+            using (var objXmlTextWriter = new XmlTextWriter(String.Format("{0}\\{1}", sStartupPath, ConfigurationManager.AppSettings["ParameterMetaDataXMLFileName"]), null))
             {
                objXmlTextWriter.Formatting = Formatting.Indented;
                objXmlTextWriter.WriteStartDocument();
@@ -100,7 +99,7 @@ namespace ArdupilotMega.Utilities
       private static void ParseParameterInformation(string fileContents, XmlTextWriter objXmlTextWriter)
       {
          var indicies = new List<int>();
-         GetIndexOfMarkers(ref indicies, fileContents, META_DELIMETER + PARAM_KEY, 0);
+         GetIndexOfMarkers(ref indicies, fileContents, ParameterMetaDataConstants.Delimeter + ParameterMetaDataConstants.Param, 0);
 
          if(indicies.Count > 0)
          {
@@ -115,7 +114,7 @@ namespace ArdupilotMega.Utilities
                if(!String.IsNullOrEmpty(subStringToSearch))
                {
                   var metaIndicies = new List<int>();
-                  GetIndexOfMarkers(ref metaIndicies, subStringToSearch, META_DELIMETER, 0);
+                  GetIndexOfMarkers(ref metaIndicies, subStringToSearch, ParameterMetaDataConstants.Delimeter, 0);
 
                   if(metaIndicies.Count > 0)
                   {
@@ -125,7 +124,7 @@ namespace ArdupilotMega.Utilities
                      // Match based on the regex defined at the top of this class
                      Match paramNameKeyMatch = _paramMetaRegex.Match(paramNameKey);
 
-                     if (paramNameKeyMatch.Success && paramNameKeyMatch.Groups["MetaKey"].Value == PARAM_KEY)
+                     if (paramNameKeyMatch.Success && paramNameKeyMatch.Groups["MetaKey"].Value == ParameterMetaDataConstants.Param)
                      {
                         objXmlTextWriter.WriteStartElement(paramNameKeyMatch.Groups["MetaValue"].Value.Trim(new char[] { ' ' }));
 
diff --git a/Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataRepository.cs b/Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataRepository.cs
new file mode 100644
index 000000000..0697a76c0
--- /dev/null
+++ b/Tools/ArdupilotMegaPlanner/Utilities/ParameterMetaDataRepository.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Configuration;
+using System.IO;
+using System.Windows.Forms;
+using System.Xml.Linq;
+
+namespace ArdupilotMega.Utilities
+{
+   public class ParameterMetaDataRepository
+   {
+      private static XDocument _parameterMetaDataXML;
+
+      /// <summary>
+      /// Initializes a new instance of the <see cref="ParameterMetaDataRepository"/> class.
+      /// </summary>
+      public ParameterMetaDataRepository()
+      {
+         string paramMetaDataXMLFileName = String.Format("{0}\\{1}", Application.StartupPath, ConfigurationManager.AppSettings["ParameterMetaDataXMLFileName"]);
+         if (File.Exists(paramMetaDataXMLFileName))
+            _parameterMetaDataXML = XDocument.Load(paramMetaDataXMLFileName);
+      }
+
+      /// <summary>
+      /// Gets the parameter meta data.
+      /// </summary>
+      /// <param name="nodeKey">The node key.</param>
+      /// <param name="metaKey">The meta key.</param>
+      /// <returns></returns>
+      public string GetParameterMetaData(string nodeKey, string metaKey)
+      {
+         if(_parameterMetaDataXML != null)
+         {
+            // Use this to find the endpoint node we are looking for
+            // Either it will be pulled from a file in the ArduPlane hierarchy or the ArduCopter hierarchy
+            string endpointSearchString = (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane) ? "arduplane" : "arducopter";
+         }
+         return string.Empty;
+      }
+   }
+}
diff --git a/Tools/ArdupilotMegaPlanner/app.config b/Tools/ArdupilotMegaPlanner/app.config
index 3ff7811e1..92d311e0c 100644
--- a/Tools/ArdupilotMegaPlanner/app.config
+++ b/Tools/ArdupilotMegaPlanner/app.config
@@ -10,6 +10,8 @@
       value="http://ardupilot-mega.googlecode.com/git/Tools/ArdupilotMegaPlanner/bin/Release/"/>
     <add key="ParameterLocations"
       value="http://a432511-wip.googlecode.com/git-history/param-suffix/ArduCopter/Parameters.pde"/>
+    <add key="ParameterMetaDataXMLFileName"
+      value="ParameterMetaData.xml"/>
   </appSettings>
   <log4net>
     <appender name="Console" type="log4net.Appender.ConsoleAppender">
-- 
GitLab