private void ReadDefines()
        {
            int iLognest = 0;
            List<stDefine> lDefines = new List<stDefine>();

            foreach (string sLine2 in m_sHeaderFile)
            {
                string sLine = sLine2.ToUpper().Replace('\t', ' ').Replace('\r', ' ').Trim();
                if (sLine.StartsWith("#define".ToUpper()))
                {
                    int iCommentStart = sLine.LastIndexOf("//");
                    if (iCommentStart < 0)
                    {
                        iCommentStart = sLine.LastIndexOf("/*");
                    }
                    if (iCommentStart > 0)
                    {
                        sLine = sLine.Substring(0, iCommentStart).Trim();
                    }
                    int iValueStart = sLine.LastIndexOf(' ');
                    int iNameStart = sLine.IndexOf(' ');
                    int iNameEnd = sLine.IndexOf(" ", iNameStart + 1);

                    //#define NUMBER_OF_ELEMENTS             3     // single or polyphase?
                    int iResult;
                    if (iNameEnd > 0 && iValueStart >= iNameEnd && int.TryParse(sLine.Substring(iValueStart), out iResult))
                    {
                        stDefine stADefine = new stDefine();
                        stADefine.sName = sLine.Substring(iNameStart, iNameEnd - iNameStart).Trim();
                        stADefine.iValue = int.Parse(sLine.Substring(iValueStart));
                        if (stADefine.sName.Length > iLognest)
                        {
                            iLognest = stADefine.sName.Length;
                        }
                        lDefines.Add(stADefine);
                    }
                }
            }

            stDefine stADefine2 = new stDefine();
            stADefine2.sName = "defined(1)||";
            stADefine2.iValue = 1;
            lDefines.Add(stADefine2);

            // sort defines by length
            for (int i = iLognest; i > 0; i--)
            {
                foreach (stDefine def in lDefines)
                {
                    if (def.sName.Length == i)
                    {
                        m_Defines.Add(def);
                    }
                }

            }
        }
        /// <summary>
        /// Loads a previously saved xml configuration that describes all the tables in a meter
        /// </summary>
        /// <param name="sFileName"></param>
        public void LoadXML(string sFileName)
        {
            XmlDocument docXML = new XmlDocument();
            docXML.Load(sFileName);

            m_Defines.Clear();
            foreach (XmlNode node in docXML.SelectNodes("OpticalInterface/Defines/Define"))
            {
                stDefine newDefine = new stDefine();
                newDefine.sName = node.SelectSingleNode("Name").InnerText;
                newDefine.iValue = int.Parse(node.SelectSingleNode("Value").InnerText);
                m_Defines.Add(newDefine);
            }

            m_AllTablesID.Clear();
            foreach (XmlNode node in docXML.SelectNodes("OpticalInterface/AllTables/Table"))
            {
                stTableID newTable = new stTableID();
                newTable.sName = node.SelectSingleNode("Name").InnerText;
                newTable.iValue = int.Parse(node.SelectSingleNode("Value").InnerText);
                m_AllTablesID.Add(newTable);
            }

            m_SupportedTables.Clear();
            foreach (XmlNode node in docXML.SelectNodes("OpticalInterface/SupportedTables/SupportedTable"))
            {
                stTable newTable = new stTable();
                newTable.sName = node.SelectSingleNode("Name").InnerText;
                newTable.sStructure = node.SelectSingleNode("StructureName").InnerText;
                m_SupportedTables.Add(newTable);
            }

            m_TableStructures.Clear();
            foreach (XmlNode node in docXML.SelectNodes("OpticalInterface/Tables/Table"))
            {
                stTableStructure newTable = new stTableStructure();
                newTable.sFields = new List<string>();
                newTable.sFieldsType = new List<string>();
                newTable.sDescription = new List<string>();
                newTable.sStructureName = node.SelectSingleNode("Name").InnerText;
                newTable.bBitField = bool.Parse(node.SelectSingleNode("BitField").InnerText);

                foreach (XmlNode fieldnode in node.SelectNodes("Fields/Field"))
                {
                    newTable.sFields.Add(fieldnode.SelectSingleNode("Name").InnerText);
                    newTable.sFieldsType.Add(fieldnode.SelectSingleNode("Type").InnerText);
                    newTable.sDescription.Add(fieldnode.SelectSingleNode("Description").InnerText);
                }
                m_TableStructures.Add(newTable);
            }
        }