LCOV - code coverage report
Current view: top level - input_output - FGXMLElement.h (source / functions) Hit Total Coverage
Test: JSBSim-Coverage-Statistics Lines: 5 5 100.0 %
Date: 2010-08-24 Functions: 0 0 -
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       2                 :            : 
       3                 :            :  File:         FGXMLElement.h
       4                 :            :  Author:       Jon S. Berndt
       5                 :            :  Date started: 9/28/04
       6                 :            : 
       7                 :            :  ------------- Copyright (C) 2004  Jon S. Berndt (jon@jsbsim.org) -------------
       8                 :            : 
       9                 :            :  This program is free software; you can redistribute it and/or modify it under
      10                 :            :  the terms of the GNU Lesser General Public License as published by the Free Software
      11                 :            :  Foundation; either version 2 of the License, or (at your option) any later
      12                 :            :  version.
      13                 :            : 
      14                 :            :  This program is distributed in the hope that it will be useful, but WITHOUT
      15                 :            :  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
      16                 :            :  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
      17                 :            :  details.
      18                 :            : 
      19                 :            :  You should have received a copy of the GNU Lesser General Public License along with
      20                 :            :  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
      21                 :            :  Place - Suite 330, Boston, MA  02111-1307, USA.
      22                 :            : 
      23                 :            :  Further information about the GNU Lesser General Public License can also be found on
      24                 :            :  the world wide web at http://www.gnu.org.
      25                 :            : 
      26                 :            : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      27                 :            : SENTRY
      28                 :            : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
      29                 :            : 
      30                 :            : #ifndef XMLELEMENT_H
      31                 :            : #define XMLELEMENT_H
      32                 :            : 
      33                 :            : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      34                 :            : INCLUDES
      35                 :            : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
      36                 :            : 
      37                 :            : #include <string>
      38                 :            : #include <map>
      39                 :            : #include <vector>
      40                 :            : 
      41                 :            : #include "math/FGColumnVector3.h"
      42                 :            : 
      43                 :            : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      44                 :            : DEFINITIONS
      45                 :            : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
      46                 :            : 
      47                 :            : #define ID_XMLELEMENT "$Id: FGXMLElement.h,v 1.16 2009/10/24 22:59:30 jberndt Exp $"
      48                 :            : 
      49                 :            : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      50                 :            : FORWARD DECLARATIONS
      51                 :            : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
      52                 :            : 
      53                 :            : namespace JSBSim {
      54                 :            : 
      55                 :            : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      56                 :            : CLASS DOCUMENTATION
      57                 :            : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
      58                 :            : 
      59                 :            : /** Encapsulates an XML element.
      60                 :            :     This class handles the creation, storage, and manipulation of XML elements.
      61                 :            :     This class also can convert supplied values as follows:
      62                 :            : 
      63                 :            :     convert ["from"]["to"] = factor, so: from * factor = to
      64                 :            :     - convert["M"]["FT"] = 3.2808399;
      65                 :            :     - convert["FT"]["M"] = 1.0/convert["M"]["FT"];
      66                 :            :     - convert["M2"]["FT2"] = convert["M"]["FT"]*convert["M"]["FT"];
      67                 :            :     - convert["FT2"]["M2"] = 1.0/convert["M2"]["FT2"];
      68                 :            :     - convert["FT"]["IN"] = 12.0;
      69                 :            :     - convert["IN"]["FT"] = 1.0/convert["FT"]["IN"];
      70                 :            :     - convert["LBS"]["KG"] = 0.45359237;
      71                 :            :     - convert["KG"]["LBS"] = 1.0/convert["LBS"]["KG"];
      72                 :            :     - convert["SLUG*FT2"]["KG*M2"] = 1.35594;
      73                 :            :     - convert["KG*M2"]["SLUG*FT2"] = 1.0/convert["SLUG*FT2"]["KG*M2"];
      74                 :            :     - convert["RAD"]["DEG"] = 360.0/(2.0*3.1415926);
      75                 :            :     - convert["DEG"]["RAD"] = 1.0/convert["RAD"]["DEG"];
      76                 :            :     - convert["LBS/FT"]["N/M"] = 14.5939;
      77                 :            :     - convert["LBS/FT/SEC"]["N/M/SEC"] = 14.5939;
      78                 :            :     - convert["N/M"]["LBS/FT"] = 1.0/convert["LBS/FT"]["N/M"];
      79                 :            :     - convert["N/M/SEC"]["LBS/FT/SEC"] = 1.0/convert["LBS/FT/SEC"]["N/M/SEC"];
      80                 :            :     - convert["WATTS"]["HP"] = 0.001341022;
      81                 :            :     - convert["HP"]["WATTS"] = 1.0/convert["WATTS"]["HP"];
      82                 :            :     - convert["N"]["LBS"] = 0.22482;
      83                 :            :     - convert["LBS"]["N"] = 1.0/convert["N"]["LBS"];
      84                 :            :     - convert["KTS"]["FT/SEC"] = ktstofps;
      85                 :            :     - convert["KG/MIN"]["LBS/MIN"] = convert["KG"]["LBS"];
      86                 :            :     - convert["LBS/HP*HR"]["KG/KW*HR"] = 0.6083;
      87                 :            :     - convert["KG/KW*HR"]["LBS/HP*HR"] = 1/convert["LBS/HP*HR"]["KG/KW*HR"];
      88                 :            :     - convert["KG/L"]["LBS/GAL"] = 8.3454045;
      89                 :            : 
      90                 :            :     - convert["M"]["M"] = 1.00;
      91                 :            :     - convert["FT"]["FT"] = 1.00;
      92                 :            :     - convert["IN"]["IN"] = 1.00;
      93                 :            :     - convert["DEG"]["DEG"] = 1.00;
      94                 :            :     - convert["RAD"]["RAD"] = 1.00;
      95                 :            :     - convert["M2"]["M2"] = 1.00;
      96                 :            :     - convert["FT2"]["FT2"] = 1.00;
      97                 :            :     - convert["KG*M2"]["KG*M2"] = 1.00;
      98                 :            :     - convert["SLUG*FT2"]["SLUG*FT2"] = 1.00;
      99                 :            :     - convert["KG"]["KG"] = 1.00;
     100                 :            :     - convert["LBS"]["LBS"] = 1.00;
     101                 :            :     - convert["LBS/FT"]["LBS/FT"] = 1.00;
     102                 :            :     - convert["N/M"]["N/M"] = 1.00;
     103                 :            :     - convert["LBS/FT/SEC"]["LBS/FT/SEC"] = 1.00;
     104                 :            :     - convert["N/M/SEC"]["N/M/SEC"] = 1.00;
     105                 :            :     - convert["PSI"]["PSI"] = 1.00;
     106                 :            :     - convert["INHG"]["INHG"] = 1.00;
     107                 :            :     - convert["HP"]["HP"] = 1.00;
     108                 :            :     - convert["N"]["N"] = 1.00;
     109                 :            :     - convert["WATTS"]["WATTS"] = 1.00;
     110                 :            :     - convert["KTS"]["KTS"] = 1.0;
     111                 :            :     - convert["FT/SEC"]["FT/SEC"] = 1.0;
     112                 :            :     - convert["KG/MIN"]["KG/MIN"] = 1.0;
     113                 :            :     - convert["LBS/MIN"]["LBS/MIN"] = 1.0;
     114                 :            :     - convert["LBS/HP*HR"]["LBS/HP*HR"] = 1.0;
     115                 :            :     - convert["KG/KW*HR"]["KG/KW*HR"] = 1.0;
     116                 :            :     - convert["KG/L"]["KG/L"] = 1.0;
     117                 :            :     - convert["LBS/GAL"]["LBS/GAL"] = 1.0;
     118                 :            : 
     119                 :            :     Where:
     120                 :            :     - N = newtons
     121                 :            :     - M = meters
     122                 :            :     - M2 = meters squared
     123                 :            :     - KG = kilograms
     124                 :            :     - LBS = pounds force
     125                 :            :     - FT = feet
     126                 :            :     - FT2 = feet squared
     127                 :            :     - SEC = seconds
     128                 :            :     - MIN = minutes
     129                 :            :     - SLUG = slug
     130                 :            :     - DEG = degrees
     131                 :            :     - RAD = radians
     132                 :            :     - WATTS = watts
     133                 :            :     - HP = horsepower
     134                 :            :     - HR = hour
     135                 :            :     - L = liter
     136                 :            :     - GAL = gallon (U.S. liquid) 
     137                 :            : 
     138                 :            :     @author Jon S. Berndt
     139                 :            :     @version $Id: FGXMLElement.h,v 1.16 2009/10/24 22:59:30 jberndt Exp $
     140                 :            : */
     141                 :            : 
     142                 :            : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     143                 :            : CLASS DECLARATION
     144                 :            : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
     145                 :            : 
     146                 :            : class Element {
     147                 :            : public:
     148                 :            :   /** Constructor
     149                 :            :       @param nm the name of this element (if given)
     150                 :            :       */
     151                 :            :   Element(const std::string& nm);
     152                 :            :   /// Destructor
     153                 :            :   ~Element(void);
     154                 :            : 
     155                 :            :   /** Retrieves an attribute.
     156                 :            :       @param key specifies the attribute key to retrieve the value of.
     157                 :            :       @return the key value (as a string), or the empty string if no such
     158                 :            :               attribute exists. */
     159                 :            :   std::string GetAttributeValue(const std::string& key);
     160                 :            : 
     161                 :            :   /** Retrieves an attribute value as a double precision real number.
     162                 :            :       @param key specifies the attribute key to retrieve the value of.
     163                 :            :       @return the key value (as a number), or the HUGE_VAL if no such
     164                 :            :               attribute exists. */
     165                 :            :   double GetAttributeValueAsNumber(const std::string& key);
     166                 :            : 
     167                 :            :   /** Retrieves the element name.
     168                 :            :       @return the element name, or the empty string if no name has been set.*/
     169                 :       5256 :   const std::string& GetName(void) const {return name;}
     170                 :            : 
     171                 :            :   /** Gets a line of data belonging to an element.
     172                 :            :       @param i the index of the data line to return (0 by default).
     173                 :            :       @return a string representing the data line requested, or the empty string
     174                 :            :               if none exists.*/
     175                 :            :   std::string GetDataLine(unsigned int i=0);
     176                 :            : 
     177                 :            :   /// Returns the number of lines of data stored
     178                 :        816 :   unsigned int GetNumDataLines(void) {return (unsigned int)data_lines.size();}
     179                 :            : 
     180                 :            :   /// Returns the number of child elements for this element.
     181                 :            :   unsigned int GetNumElements(void) {return (unsigned int)children.size();}
     182                 :            : 
     183                 :            :   /// Returns the number of named child elements for this element.
     184                 :            :   unsigned int GetNumElements(const std::string& element_name);
     185                 :            : 
     186                 :            :   /** Converts the element data to a number.
     187                 :            :       This function attempts to convert the first (and presumably only) line of
     188                 :            :       data "owned" by the element into a real number. If there is not exactly one
     189                 :            :       line of data owned by the element, then HUGE_VAL is returned.
     190                 :            :       @return the numeric value of the data owned by the element.*/
     191                 :            :   double GetDataAsNumber(void);
     192                 :            : 
     193                 :            :   /** Returns a pointer to the element requested by index.
     194                 :            :       This function also resets an internal counter to the index, so that
     195                 :            :       subsequent calls to GetNextElement() will return the following
     196                 :            :       elements sequentially, until the last element is reached. At that point,
     197                 :            :       GetNextElement() will return NULL.
     198                 :            :       @param el the index of the requested element (0 by default)
     199                 :            :       @return a pointer to the Element, or 0 if no valid element exists. */
     200                 :            :   Element* GetElement(unsigned int el=0);
     201                 :            : 
     202                 :            :   /** Returns a pointer to the next element in the list.
     203                 :            :       The function GetElement() must be called first to be sure that this
     204                 :            :       function will return the correct element. The call to GetElement() resets
     205                 :            :       the internal counter to zero. Subsequent calls to GetNextElement() return
     206                 :            :       a pointer to subsequent elements in the list. When the final element is
     207                 :            :       reached, 0 is returned.
     208                 :            :       @return a pointer to the next Element in the sequence, or 0 if no valid
     209                 :            :               Element is present. */
     210                 :            :   Element* GetNextElement(void);
     211                 :            : 
     212                 :            :   /** Returns a pointer to the parent of an element.
     213                 :            :       @return a pointer to the parent Element, or 0 if this is the top level Element. */
     214                 :       1014 :   Element* GetParent(void) {return parent;}
     215                 :            : 
     216                 :            :   /** Searches for a specified element.
     217                 :            :       Finds the first element that matches the supplied string, or simply the first
     218                 :            :       element if no search string is supplied. This function call resets the internal
     219                 :            :       element counter to the first element.
     220                 :            :       @param el the search string (empty string by default).
     221                 :            :       @return a pointer to the first element that matches the supplied search string. */
     222                 :            :   Element* FindElement(const std::string& el="");
     223                 :            : 
     224                 :            :   /** Searches for the next element as specified.
     225                 :            :       This function would be called after FindElement() is first called (in order to
     226                 :            :       reset the internal counter). If no argument is supplied (or the empty string)
     227                 :            :       a pointer to the very next element is returned. Otherwise, the next occurence
     228                 :            :       of the named element is returned. If the end of the list is reached, 0 is
     229                 :            :       returned.
     230                 :            :       @param el the name of the next element to find.
     231                 :            :       @return the pointer to the found element, or 0 if no appropriate element us
     232                 :            :               found.*/
     233                 :            :   Element* FindNextElement(const std::string& el="");
     234                 :            : 
     235                 :            :   /** Searches for the named element and returns the string data belonging to it.
     236                 :            :       This function allows the data belonging to a named element to be returned
     237                 :            :       as a string. If no element is found, the empty string is returned. If no
     238                 :            :       argument is supplied, the data string for the first element is returned.
     239                 :            :       @param el the name of the element being searched for (the empty string by
     240                 :            :       default)
     241                 :            :       @return the data value for the named element as a string, or the empty
     242                 :            :               string if the element cannot be found. */
     243                 :            :   std::string FindElementValue(const std::string& el="");
     244                 :            : 
     245                 :            :   /** Searches for the named element and returns the data belonging to it as a number.
     246                 :            :       This function allows the data belonging to a named element to be returned
     247                 :            :       as a double. If no element is found, HUGE_VAL is returned. If no
     248                 :            :       argument is supplied, the data for the first element is returned.
     249                 :            :       @param el the name of the element being searched for (the empty string by
     250                 :            :       default)
     251                 :            :       @return the data value for the named element as a double, or HUGE_VAL if the
     252                 :            :               data is missing. */
     253                 :            :   double FindElementValueAsNumber(const std::string& el="");
     254                 :            : 
     255                 :            :   /** Searches for the named element and converts and returns the data belonging to it.
     256                 :            :       This function allows the data belonging to a named element to be returned
     257                 :            :       as a double. If no element is found, HUGE_VAL is returned. If no
     258                 :            :       argument is supplied, the data for the first element is returned. Additionally,
     259                 :            :       this function converts the value from the units specified in the config file (via
     260                 :            :       the UNITS="" attribute in the element definition) to the native units used by
     261                 :            :       JSBSim itself, as specified by the target_units parameter. The currently
     262                 :            :       allowable unit conversions are seen in the source file FGXMLElement.cpp.
     263                 :            :       Also, see above in the main documentation for this class.
     264                 :            :       @param el the name of the element being searched for (the empty string by
     265                 :            :       default)
     266                 :            :       @param target_units the string representing the native units used by JSBSim
     267                 :            :              to which the value returned will be converted.
     268                 :            :       @return the unit-converted data value for the named element as a double,
     269                 :            :               or HUGE_VAL if the data is missing. */
     270                 :            :   double FindElementValueAsNumberConvertTo(const std::string& el, const std::string& target_units);
     271                 :            : 
     272                 :            :   /** Searches for the named element and converts and returns the data belonging to it.
     273                 :            :       This function allows the data belonging to a named element to be returned
     274                 :            :       as a double. If no element is found, HUGE_VAL is returned. If no
     275                 :            :       argument is supplied, the data for the first element is returned. Additionally,
     276                 :            :       this function converts the value from the units specified in the supplied_units
     277                 :            :       parameter to the units specified in the target_units parameter. JSBSim itself,
     278                 :            :       as specified by the target_units parameter. The currently allowable unit
     279                 :            :       conversions are seen in the source file FGXMLElement.cpp. Also, see above
     280                 :            :       in the main documentation for this class.
     281                 :            :       @param el the name of the element being searched for (the empty string by
     282                 :            :       default)
     283                 :            :       @param supplied_units the string representing the units of the value as
     284                 :            :              supplied by the config file.
     285                 :            :       @param target_units the string representing the native units used by JSBSim
     286                 :            :              to which the value returned will be converted.
     287                 :            :       @return the unit-converted data value for the named element as a double,
     288                 :            :               or HUGE_VAL if the data is missing. */
     289                 :            :   double FindElementValueAsNumberConvertFromTo( const std::string& el,
     290                 :            :                                                 const std::string& supplied_units,
     291                 :            :                                                 const std::string& target_units);
     292                 :            : 
     293                 :            :   /** Composes a 3-element column vector for the supplied location or orientation.
     294                 :            :       This function processes a LOCATION or ORIENTATION construct, returning a
     295                 :            :       filled-out 3-element column vector containing the X, Y, Z or ROLL, PITCH,
     296                 :            :       YAW elements found in the supplied element. If one of the mentioned components
     297                 :            :       is not found, that component is set to zero and a warning message is printed.
     298                 :            :       All three elements should be supplied.
     299                 :            :       @param target_units the string representing the native units used by JSBSim
     300                 :            :              to which the value returned will be converted.
     301                 :            :       @return a column vector object built from the LOCATION or ORIENT components. */
     302                 :            :   FGColumnVector3 FindElementTripletConvertTo( const std::string& target_units);
     303                 :            : 
     304                 :            :   /** This function sets the value of the parent class attribute to the supplied
     305                 :            :       Element pointer.
     306                 :            :       @param p pointer to the parent Element. */
     307                 :        923 :   void SetParent(Element* p) {parent = p;}
     308                 :            : 
     309                 :            :   /** Adds a child element to the list of children stored for this element.
     310                 :            :   *   @param el Child element to add. */
     311                 :        899 :   void AddChildElement(Element* el) {children.push_back(el);}
     312                 :            : 
     313                 :            :   /** Stores an attribute belonging to this element.
     314                 :            :   *   @param name The string name of the attribute.
     315                 :            :   *   @param value The string value of the attribute. */
     316                 :            :   void AddAttribute(const std::string& name, const std::string& value);
     317                 :            : 
     318                 :            :   /** Stores data belonging to this element.
     319                 :            :   *   @param d the data to store. */
     320                 :            :   void AddData(std::string d);
     321                 :            : 
     322                 :            :   /** Prints the element.
     323                 :            :   *   Prints this element and calls the Print routine for child elements.
     324                 :            :   *   @param d The tab level. A level corresponds to a single space. */
     325                 :            :   void Print(unsigned int level=0);
     326                 :            : 
     327                 :            : private:
     328                 :            :   std::string name;
     329                 :            :   std::map <std::string, std::string> attributes;
     330                 :            :   std::vector <std::string> data_lines;
     331                 :            :   std::vector <Element*> children;
     332                 :            :   std::vector <std::string> attribute_key;
     333                 :            :   Element *parent;
     334                 :            :   unsigned int element_index;
     335                 :            :   typedef std::map <std::string, std::map <std::string, double> > tMapConvert;
     336                 :            :   static tMapConvert convert;
     337                 :            :   static bool converterIsInitialized;
     338                 :            : };
     339                 :            : 
     340                 :            : } // namespace JSBSim
     341                 :            : 
     342                 :            : //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     343                 :            : 
     344                 :            : #endif

Generated by: LCOV version 1.9