private void ReadAllTables()
        {
            string sTablesXML = "<tables>";
            int iCurrentTableNumber = 0;
            bool bStartFound = false;

            // Read tables
            foreach (string sLine in m_sHeaderFile)
            {
                int iCommaPos = sLine.IndexOf(',');
                int iEqualPos = sLine.IndexOf('=');
                if (sLine.ToUpper().Contains("eStdT00_GenConfig".ToUpper()))
                {
                    bStartFound = true;
                }

                if (bStartFound)
                {
                    if (sLine.Contains("}"))
                    {
                        break;
                    }

                    if (iCommaPos > 0 && (iCommaPos < iEqualPos || iEqualPos == -1))
                    {
                        sTablesXML += "<table Number='" + iCurrentTableNumber.ToString() + "'>" + sLine.Substring(0, iCommaPos).Trim() + "</table>\r\n";

                        stTableID table = new stTableID();
                        table.sName = sLine.Substring(0, iCommaPos).Trim();
                        table.iValue = iCurrentTableNumber;
                        m_AllTablesID.Add(table);

                        iCurrentTableNumber++;
                    }
                    else if (iEqualPos > 0)
                    {
                        if (sLine.Contains("ANSI_MANFCT_TABLE_OFFSET"))
                        {
                            iCurrentTableNumber = 2048;
                        }
                        else if (sLine.Contains("ANSI_KF_CLASS_TABLE_OFFSET+140"))
                        {
                            iCurrentTableNumber = 2148 + 140;
                        }
                        else if (sLine.Contains("ANSI_KF_CLASS_TABLE_OFFSET"))
                        {
                            iCurrentTableNumber = 2148;
                        }
                        sTablesXML += "<table Number='" + iCurrentTableNumber.ToString() + "'>" + sLine.Substring(0, iEqualPos).Trim() + "</table>\r\n";

                        stTableID table = new stTableID();
                        table.sName = sLine.Substring(0, iEqualPos).Trim();
                        table.iValue = iCurrentTableNumber;
                        m_AllTablesID.Add(table);

                        iCurrentTableNumber++;
                    }
                    else
                    {
                        // Unable to process line
                        iCurrentTableNumber = 0;
                    }
                }
            }
            sTablesXML += "</tables>";
        }
        /// <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);
            }
        }