  UDCF - Universal Dive Computer Format
  Kai Schroeder <kai@streit.cc> und Steffen Reith
  <streit@streit.cc>,
  16. Februar 2002

  Das UDCF dient dazu, die Tauchgangs-Profile verschiedener Tauchcom-
  puter sowie unterschiedlicher Tauchsimulations-Programme untereinander
  auf einfache Art und Weise austauschbar zu machen. Damit ist es
  moeglich, mit beliebigen Tauchcomputern aufgezeichnete ,,reale``
  Tauchgangs-Profile nach Konvertierung in das UDCF auf allen Computer-
  systemen auszuwerten bzw. mit anderen Dekompressionsmodellen zu rech-
  nen.
  ______________________________________________________________________

  Table of Contents



















































  1. Struktur von UDCF-Dateien

  2. Elemente des UDCF (in alphabetischer Reihenfolge)

     2.1 <acv> ... </acv>   (optional)
     2.2 <addinfo> ... </addinfo>   (optional)
     2.3 <alarm> ... </alarm>   (optional)
     2.4 <altitude> ... </altitude>   (vorgeschrieben)
     2.5 <d> ... </d>   (vorgeschrieben)
     2.6 <datatrak> ... </datatrak>   (optional)
     2.7 <date> ... </date>   (vorgeschrieben)
     2.8 <day> ... </day>   (vorgeschrieben)
     2.9 <delta> ... </delta>   (vorgeschrieben)
     2.10 <deltamode/>   (vorgeschrieben)
     2.11 <density> ... </density>   (vorgeschrieben)
     2.12 <device> ... </device>   (vorgeschrieben)
     2.13 <dive> ... </dive>   (vorgeschrieben)
     2.14 <gases> ... </gases>   (vorgeschrieben)
     2.15 <he> ... </he>   (vorgeschrieben)
     2.16 <hour> ... </hour>   (vorgeschrieben)
     2.17 Kommentare
     2.18 <minute> ... </minute>   (vorgeschrieben)
     2.19 <mix> ... </mix>   (vorgeschrieben)
     2.20 <mixname> ... </mixname>   (vorgeschrieben)
     2.21 <model> ... </model>   (vorgeschrieben)
     2.22 <month> ... </month>   (vorgeschrieben)
     2.23 <n2> ... </n2>   (vorgeschrieben)
     2.24 <o2> ... </o2>   (vorgeschrieben)
     2.25 <pend> ... </pend>   (optional)
     2.26 <persinfo> ... </persinfo>   (optional)
     2.27 <place> ... </place>   (optional)
     2.28 <profile udcf="1"> ... </profile>   (vorgeschrieben)
     2.29 <program> ... </program>   (optional)
     2.30 <pstart> ... </pstart>   (vorgeschrieben)
     2.31 <repgroup> ... </repgroup>   (vorgeschrieben)
     2.32 <samples> ... </samples>   (vorgeschrieben)
     2.33 <serialid> ... </serialid>   (optional)
     2.34 <surfaceinterval> ... </surfaceinterval>   (vorgeschrieben)
     2.35 <switch> ... </switch>   (vorgeschrieben)
     2.36 <t> ... </t>   (vorgeschrieben)
     2.37 <tank> ... </tank>   (optional)
     2.38 <tankvolume> ... </tankvolume>   (optional)
     2.39 <tausim> ... </tausim>   (optional)
     2.40 <temperature> ... </temperature>   (optional)
     2.41 <time> ... </time>   (vorgeschrieben)
     2.42 <timedepthmode/>   (vorgeschrieben)
     2.43 <totaldives> ... </totaldives>   (optional)
     2.44 <units> ... </units>   (vorgeschrieben)
     2.45 <vendor> ... </vendor>   (vorgeschrieben)
     2.46 <version> ... </version>   (vorgeschrieben)
     2.47 <work> ... </work>   (optional)
     2.48 <year> ... </year>   (vorgeschrieben)

  3. Eine Grammatik fuer UDCF



  ______________________________________________________________________

  11..  SSttrruukkttuurr vvoonn UUDDCCFF--DDaatteeiieenn

  Eine UDCF-Datei besteht aus verschiedenen (Gruppen von) Elementen und
  Schluesselwoertern, die ein Tauchgangs-Profil sowie den aufzeichnenden
  Tauchcomputer oder das zur Generierung verwendete Programm eindeutig
  beschreiben. Dabei ist eine zwingende Reihenfolge vorgeschrieben.
  Manche Elemente bzw. Schluesselwoerter sind optional und entfallen je
  nach verwendetem Tauchcomputer-Modell bzw. Programm.  Die Intention
  bei der Entwicklung des UDCF war es, ein moeglichst einfaches und
  maechtiges Format zum Datenaustausch zu entwickeln. Um die
  Programmierung von Parsern zu vereinfachen wurde UDCF so entwickelt,
  dass gaengige XML-Parser zum Einsatz kommen koennen.

  Nachfolgend werden diese Elemente und Schluesselwoerter beschrieben.

  Der generelle Aufbau einer UDCF-Datei ist folgender:


  1. Dateikopf

  2. Angabe des verwendeten Einheitensystems (SI, metrisch oder
     imperial)

  3. Daten zum aufzeichnenden Tauchcomputer oder generierenden Programm
     (Hersteller, Modell, Versionsnummer)

  4. zusaetzliche Informationen (optional)

  5. die jeweils ein Profil kennzeichnenden allgemeinen Daten wie Ort
     (optional), Datum, Uhrzeit, Oberflaechenintervall, minimale
     Wassertemperatur (optional), Dichte des Wassers, Hoehe ueber Normal
     Null des Einstiegs und Angaben zu den verwendeten Atemgasen. Fuer
     eine optional durchzufuehrende Luftverbrauchsrechnung koennen
     weitere Angaben zu Flaschengroesse, Fuelldruck zu Beginn und Ende
     des Tauchgangs gemacht werden.

  6. Tauchcomputer- oder Programm-spezifische Informationen, die aber
     nicht fuer die Darstellung des Profiles oder die Berechnung der
     Gewebesaettigung notwendig sind (optional)

  7. Zeit- und Tiefenangaben oder nur Tiefenangaben bei festem
     Aufzeichnungsintervall (das sich aber waehrend eines Tauchgangs
     aendern kann) sowie zusaetzliche optionale Warnmeldungen (bei
     aufzeichnenden Tauchcomputern)

  8. Dateiabschluss

  Es koennen mehrere Tauchgangs-Profile hintereinander in einer UDCF-
  Datei abgelegt werden, die Punkte 5., 6. und 7. wiederholen sich dann.
  Allerdings koennen nicht Profile verschiedener Tauchcomputer oder
  Programme gemischt in einer UDCF-Datei abgelegt werden.



  22..  EElleemmeennttee ddeess UUDDCCFF ((iinn aallpphhaabbeettiisscchheerr RReeiihheennffoollggee))

  22..11..  <<aaccvv>> ...... <<//aaccvv>>   ((ooppttiioonnaall))

  Gibt das Atemminutenvolumen fuer dieses Atemgas an.

  Innerhalb der <``mix''>-Sektion die letzte Anweisung.

  Beispiel: siehe <``tank''>



  22..22..  <<aaddddiinnffoo>> ...... <<//aaddddiinnffoo>>   ((ooppttiioonnaall))

  Zusaetzliche (optionale) Informationen werden mit <addinfo>
  geklammert.

  Elemente innerhalb <addinfo> sind: <``persinfo''>, <``totaldives''>
  und <``serialid''>.
  Steht im Dateikopf nach der <``device''>-Sektion und vor <repgroup>.

  Beispiel:




                  <!-- vorherige Anweisungen -->
                  </device>
                  <addinfo>
                    <persinfo>+49-931-123456</persinfo>
                    <totaldives>124</totaldives>
                    <serialid>71.60.66</serialid>
                  </addinfo>
                  <repgroup>
                  <!-- weitere Anweisungen -->





  22..33..  <<aallaarrmm>> ...... <<//aallaarrmm>>   ((ooppttiioonnaall))


  Warnmeldungen des aufzeichnenden Tauchcomputers. Zur Zeit werden
  folgende Schluesselwoerter erkannt:



               Schluesselwort         Warnmeldung des Tauchcomputers
               -----------------------------------------------------------------
                   rbt                 verbleibende Grundzeit ist ueberschritten
                   error               allgemeiner Fehler (deko-stop verpasst, etc.)
                   ascent              zu schneller Aufstieg
                   deco                Computer meldet "Deko-Stop" notwendig
                   breath              zu hohe Atemfrequenz
                   surface             Oberflaeche erreicht




  Steht innerhalb der <``samples''>-Sektion und nach der zugehoerigen
  Tiefenangabe.  Es koennen auch mehrere Warnmeldungen hintereinander zu
  einer Tiefenangabe erscheinen.

  Beispiel: siehe 2. Beispiel <``samples''>



  22..44..  <<aallttiittuuddee>> ...... <<//aallttiittuuddee>>   ((vvoorrggeesscchhrriieebbeenn))

  Die Hoehe ueber Normal Null des Einstiegs als reelle Zahl mit einer
  Nachkommastelle.

  Steht innerhalb der <``dive''>-Sektion nach <``density''> als letzte
  Anweisung vor der <``gases''>-Sektion.

  Beispiel:




                    <!-- Hoehe 800m (Walchensee) -->
                    <altitude>800.0</altitude>


  22..55..  <<dd>> ...... <<//dd>>   ((vvoorrggeesscchhrriieebbeenn))

  Tiefenangabe als reelle Zahl, je nach verwendeten Einheiten als Meter
  (SI, metrisch) oder Fuss (imperial).

  Steht innerhalb der <``''>-Sektion.

  Die erste und letzte Tiefenangabe fuer ein Tauchgangs-Profil muss
  <d>0.0</d> sein, da ein Tauchgang immer an der Oberflaeche bei Null
  Meter Tiefe beginnt und endet (in Datatrak-Dateien z.B. beginnt das
  Profil nicht mit Null).

  Beispiel: siehe <``samples''>


  22..66..  <<ddaattaattrraakk>> ...... <<//ddaattaattrraakk>>   ((ooppttiioonnaall))

  Mit <datatrak> werden spezifische Informationen bezueglich des bei
  Aladin-Tauchcomputern der Firma Uwatec verwendeten Datenformats
  geklammert. Zur Zeit werden folgende Elemente verwendet:

  +o  <tissues> - gibt die Anzahl der einbezogenen Kompartimente an (8
     Stueck bei allen Aladin-Tauchcomputern)

  +o  <ip> - der initiale Saettigungsdruck eines Kompartimentes zu Beginn
     des Tauchganges. Die erste Anweisung gibt die Saettigung des
     schnellsten, die letzte Anweisung die Saettigung des langsamsten
     Gewebes an. Pro Kompartiment sind dafuer zwei Bytes reserviert. Da
     die genaue Kodierung noch nicht bekannt ist, werden zur Zeit die
     Dezimalwerte dieser beiden Bytes, durch Leerzeichen voneinander
     getrennt, angegeben.

  Steht innerhalb der optionalen <``program''>-Sektion als einzige
  Anweisung.

  Beispiel:



                 <!-- vorherige Anweisungen -->
                 </gases>
                 <program>
                   <datatrak>
                     <tissues>8</tissues>
                     <!-- 2 bytes per tissue, not decoded yet -->
                     <ip> 95  11</ip>
                     <ip>103  11</ip>
                     <ip>107  11</ip>
                     <ip>110  11</ip>
                     <ip>224  11</ip>
                     <ip>156  12</ip>
                     <ip>122  12</ip>
                     <ip>212  11</ip>
                   </datatrak>
                 </program>
                 <deltamode/>
                 <samples>
                 <!-- hier Profildaten -->








  22..77..  <<ddaattee>> ...... <<//ddaattee>>   ((vvoorrggeesscchhrriieebbeenn))

  Das Datum, an dem der Tauchgang durchgefuehrt bzw. das Profil mit
  einem Programm generiert wurde.

  Die Elemente innerhalb <date> sind <``year''>, <``month''> und
  <``day''>, wobei diese Reihenfolge zwingend vorgeschrieben ist.

  Steht innerhalb der <``dive''>-Sektion nach <``place''> (falls
  angegeben) und vor <``time''>.

  Beispiel:




                 <profile udcf="1">
                 <!-- hier Angaben zu Einheiten und Hersteller -->
                 <repgroup>
                   <dive>
                     <!-- hier Angaben zum Ort, falls bekannt -->
                     <!-- Datum 6.4.1999 -->
                     <date><year>1999</year><month>4</month><day>6</day></date>
                     <!-- hier weitere Anweisungen -->
                   </dive>
                 <!-- hier weitere Anweisungen -->
                 </profile>





  22..88..  <<ddaayy>> ...... <<//ddaayy>>   ((vvoorrggeesscchhrriieebbeenn))

  Der Tag des Monats, an dem der Tauchgang durchgefuehrt bzw. das Profil
  von einem Programm generiert wurde. Die Angabe erfolgt als ganze Zahl
  (integer).

  Steht innerhalb von <``date''>. Die Reihenfolge <``year''>,
  <``month''>, <``day''> muss dabei zwingend eingehalten werden.

  Beispiel: siehe <``date''>



  22..99..  <<ddeellttaa>> ...... <<//ddeellttaa>>   ((vvoorrggeesscchhrriieebbeenn))

  Gibt das Zeitintervall an, in dem die nachfolgenden Tiefenangaben
  aufgezeichnet wurden. Die Anweisung wird ab der nachfolgenden
  Tiefenangabe wirksam.

  <delta> ist die erste Anweisung innerhalb der <``samples''>-Sektion,
  wenn in <``deltamode/''> geschaltet wurde und kann beliebig oft
  innerhalb der <``samples''>-Sektion stehen.

  Beispiel: siehe 2. Beispiel <``samples''>


  22..1100..  <<ddeellttaammooddee//>>   ((vvoorrggeesscchhrriieebbeenn))

  Damit wird vorgegeben, dass in der <``samples''>-Sektion nur
  Tiefenangaben (bei konstantem Zeitintervall) folgen.

  Steht direkt vor der <``samples''>-Anweisung. Siehe auch
  <``timedepthmode/''>.

  Bei <deltamode/> muss in der nachfolgenden <``samples''>-Sektion als
  erste Anweisung das Zeitintervall mittels <``delta''> angegeben
  werden.

  Beispiel:  siehe <``samples''>



  22..1111..  <<ddeennssiittyy>> ...... <<//ddeennssiittyy>>   ((vvoorrggeesscchhrriieebbeenn))

  Die Dichte des Wassers.

  Steht innerhalb der <``dive''>-Sektion nach <``temperature''> und vor
  <``altitude''>.

  Reines Suesswasser hat eine Dichte von 1000.0 kg/m^3, die mittlere
  Dichte von Meerwasser (Salzwasser) betraegt 1030.0 kg/m^3.

  Beispiele:



                    <!-- Salzwasser -->
                    <density>1030.0</density>







                    <!-- Suesswasser -->
                    <density>1000.0</density>





  22..1122..  <<ddeevviiccee>> ...... <<//ddeevviiccee>>   ((vvoorrggeesscchhrriieebbeenn))

  Mit der <device>-Sektion werden die Angaben zum Hersteller des
  aufzeichnenden Tauchcomputers oder des generierenden Programms, des
  Modells und der Version geklammert.

  Die Elemente innerhalb von <device> sind: <``vendor''>, <``model''>
  und <``version''>.

  Gehoert zum Dateikopf und steht nach der <``units''>-Anweisung.

  Beispiel:




                 <profile udcf="1">
                 <units>metric</units>
                 <device>
                   <vendor>Suunto</vendor>
                   <model>EON</model>
                   <version>1</version>
                 </device>
                 <!-- hier weitere Anweisungen -->
                 </profile>



  22..1133..  <<ddiivvee>> ...... <<//ddiivvee>>   ((vvoorrggeesscchhrriieebbeenn))

  Mit <dive> werden innerhalb einer <``repgroup''>-Anweisung die Daten
  zu einem Tauchgangs-Profil angegeben. Sind mehrere Tauchgangs-Profile
  innerhalb von <``repgroup''> angegeben, so wird jedes Profil einzeln
  mit <dive> gekapselt; es stehen dann mehrere <dive>-Sektionen
  hintereinander.

  Die einzelnen Elemente, mit denen ein Tauchgangs-Profil eindeutig
  beschrieben wird, sind die folgenden: <``place''>, <``date''>,
  <``time''>, <``surfaceinterval''>, <``temperature''>, <``density''>,
  <``altitude''>, <``gases''>, <``program''> und <``samples''>.

  Beispiel:




                 <profile udcf="1">
                 <!-- hier Angaben zu Einheiten und Hersteller -->
                 <repgroup>
                   <dive>
                     <place>Illes Medes, Kueste, Torbogen</place>
                     <date><year>1999</year<month>4</month><day>6</day>></date>
                     <time><hour>16</hour><minute>21</minute></time>
                     <surfaceinterval>293.0</surfaceinterval>
                     <temperature>12.0</temperature>
                     <density>1030.0</density>
                     <altitude>0.0</altitude>
                     <gases>
                       <!-- hier Angaben zu den verwendeten Atemgasen -->
                     </gases>
                     <program>
                       <!-- hier Tauchcomputer- bzw. Programm-spezifische Angaben -->
                     </program>
                     <samples>
                       <!-- hier Zeit-/Tiefenangaben zum Profil -->
                     </samples>
                   </dive>
                   <dive>
                     <!-- Ort, Datum, Uhrzeit, Atemgas, eigentliche Profildaten -->
                   </dive>
                   <!-- hier koennen noch weitere TG-Profile abgelegt werden -->
                 </repgroup>
                 </profile>





  22..1144..  <<ggaasseess>> ...... <<//ggaasseess>>   ((vvoorrggeesscchhrriieebbeenn))

  Hierin werden die verwendeten Atemgase (eines oder mehrere)
  spezifiziert. Fuer jedes verwendete Atemgas muss eine
  <``mix''>-Sektion innerhalb <gases> angelegt werden.

  Die <gases>-Sektion steht innerhalb der <``dive''>-Sektion nach
  <``altitude''> und vor <``program''>.

  Beispiel:






               <!-- weitere Anweisungen der UDCF-Datei -->
               <altitude>0.0</altitude>
               <gases>
                 <!-- erstes verwendetes Atemgas -->
                 <mix>
                   <mixname>air</mixname>
                   <tank>
                     <!-- an dieser Stelle kann optional zusaetzlich -->
                     <!-- das Flaschenvolumen angegeben werden -->
                     <pstart>20000000.0</pstart>
                     <pend>10400000.0</pend>
                   </tank>
                   <o2>0.21</o2>
                   <n2>0.79</n2>
                   <he>0.0</he>
                   <!-- an dieser Stelle kann optional zusaetzlich -->
                   <!-- das Atemminutenvolumen angegeben werden -->
                 </mix>
                 <!-- zweites verwendetes Atemgas -->
                 <mix>
                  <!-- Spezifikation dieses Atemgases -->
                 </mix>
                 <!-- hier koennen noch weitere Atemgase angegeben werden -->
               </gases>
               <program>
               <!-- hier folgen weitere Anweisungen -->






  22..1155..  <<hhee>> ...... <<//hhee>>   ((vvoorrggeesscchhrriieebbeenn))

  Gibt Helium-Anteil des Atemgases an. Die Angabe erfolgt als
  (Volumen-)Prozentangabe, wobei die Prozentangabe als reelle Zahl
  kleiner oder gleich 1.0 erfolgt.

  Steht innerhalb der <``mix''>-Sektion nach <``n2''> und vor <``acv''>
  (falls angegeben).

  Beispiel:



                    <-- 90% Helium-Gehalt -->
                    <he>0.9</he>





  22..1166..  <<hhoouurr>> ...... <<//hhoouurr>>   ((vvoorrggeesscchhrriieebbeenn))

  Die volle Stunde, zu der der Tauchgang durchgefuehrt bzw. das Profil
  von einem Programm generiert wurde. Die Angabe erfolgt als ganze Zahl
  (integer).

  Steht innerhalb von <``time''>. Die Reihenfolge <hour>, <``minute''>
  ist zwingend vorgeschrieben.

  Beispiel: siehe <``time''>




  22..1177..  KKoommmmeennttaarree

  An beliebiger Stelle koennen Kommentare eingefuegt werden. Ein
  Kommentar wird durch die Zeichenfolge ,,<!--`` eingeleitet und mit der
  Zeichenfolge ,,-->`` beendet. Dazwischen koennen beliebige Zeichen
  stehen (auch Zeilenumbrueche).

  Beispiel: <!-- Das ist ein Kommentar. -->



  22..1188..  <<mmiinnuuttee>> ...... <<//mmiinnuuttee>>   ((vvoorrggeesscchhrriieebbeenn))

  Die Minuten der Stunde, zu der der Tauchgang durchgefuehrt bzw. das
  Profil von einem Programm generiert wurde. Die Angabe erfolgt als
  ganze Zahl (integer).

  Steht innerhalb von <``time''>. Die Reihenfolge <``hour''>, <minute>
  ist zwingend vorgeschrieben.

  Beispiel: siehe <``time''>



  22..1199..  <<mmiixx>> ...... <<//mmiixx>>   ((vvoorrggeesscchhrriieebbeenn))

  Die in <mix> eingeschlossenen Anweisungen definieren ein verwendetes
  Atemgas. Werden mehrere verschiedene Atemgase benutzt, so stehen
  mehrere <mix>-Sektionen hintereinander.

  Die das Atemgas eindeutig spezifizierenden Elemente sind die
  folgenden: <``mixname''>, <``tank''>, <``o2''>, <``n2''>, <``he''> und
  <``acv''>.

  Steht innerhalb der <``gases''>-Sektion.

  Beispiel: siehe <``gases''>



  22..2200..  <<mmiixxnnaammee>> ...... <<//mmiixxnnaammee>>   ((vvoorrggeesscchhrriieebbeenn))

  Eindeutiger Bezeichner eines Atemgases.

  In der <``samples''>-Sektion wird mittels dieses Bezeichners das
  Atemgas eingestellt.

  <mixname> ist das erste Element innerhalb der <``mix''>-Sektion.

  Beispiel: siehe <``gases''>



  22..2211..  <<mmooddeell>> ...... <<//mmooddeell>>   ((vvoorrggeesscchhrriieebbeenn))

  Innerhalb von <model> steht das Modell des Tauchcomputers oder der
  Programmname des generierenden Programms.

  Steht innerhalb der <``device''>-Sektion nach <``vendor''> und vor
  <``version''>.

  Beispiel: siehe <``device''>




  22..2222..  <<mmoonntthh>> ...... <<//mmoonntthh>>   ((vvoorrggeesscchhrriieebbeenn))

  Der Monat, an dem der Tauchgang durchgefuehrt bzw. das Profil von
  einem Programm generiert wurde. Die Angabe erfolgt als ganze Zahl
  (integer).

  Steht innerhalb von <``date''>. Die Reihenfolge <``year''>,
  <``month''>, <``day''> muss dabei zwingend eingehalten werden.

  Beispiel: siehe <``date''>



  22..2233..  <<nn22>> ...... <<//nn22>>   ((vvoorrggeesscchhrriieebbeenn))

  Gibt den Stickstoff-Anteil des Atemgases an. Die Angabe erfolgt als
  (Volumen-)Prozentangabe, wobei die Prozentangabe als reelle Zahl
  kleiner oder gleich 1.0 erfolgt.

  Steht innerhalb der <``mix''>-Sektion nach <``o2''> und vor <``he''>.

  Beispiel:



                    <mixname>mein_nitrox</mixname>
                    <tank>
                       <!-- Angaben fuer Atemgas-Verbrauchsberechnung -->
                    </tank>
                    <!-- 37,5% Sauerstoff-Gehalt -->
                    <o2>0.375</o2>
                    <n2>0.625</n2>
                    <he>0.0</he>





  22..2244..  <<oo22>> ...... <<//oo22>>   ((vvoorrggeesscchhrriieebbeenn))

  Gibt den Sauerstoff-Anteil des Atemgases an. Die Angabe erfolgt als
  (Volumen-)Prozentangabe, wobei die Prozentangabe als reelle Zahl
  kleiner oder gleich 1.0 erfolgt.

  Steht innerhalb der <``mix''>-Sektion nach <``mixname''> und
  <``tank''> (falls angegeben) und vor <``n2''>.


  Beispiel:



                    <mixname>mein_nitrox</mixname>
                    <tank>
                       <!-- Angaben fuer Atemgas-Verbrauchsberechnung -->
                    </tank>
                    <!-- 37,5% Sauerstoff-Gehalt -->
                    <o2>0.375</o2>
                    <n2>0.625</n2>
                    <he>0.0</he>






  22..2255..  <<ppeenndd>> ...... <<//ppeenndd>>   ((ooppttiioonnaall))

  End-Fuelldruck der Flasche nach Beendigung des Tauchgangs.

  Steht (falls angegeben) innerhalb der optionalen <``tank''>-Sektion
  als letzte Anweisung nach <``pstart''>.

  Beispiel: siehe <tank>



  22..2266..  <<ppeerrssiinnffoo>> ...... <<//ppeerrssiinnffoo>>   ((ooppttiioonnaall))

  Zur Angabe von persoenlichen Informationen, falls gewuenscht.

  Steht innerhalb der (optionalen) <``addinfo''>-Sektion als erste
  Anweisung (falls angegeben).

  Beispiel: siehe <``addinfo''>



  22..2277..  <<ppllaaccee>> ...... <<//ppllaaccee>>   ((ooppttiioonnaall))

  Bezeichnet den Ort, an dem der Tauchgang durchgefuehrt wurde - falls
  bekannt.

  Wenn der Ort bekannt ist, ist <place> die erste Anweisung innerhalb
  von <``dive''>. Ansonsten entfaellt <place>.

  Beispiel:



                 <profile udcf="1">
                 <!-- hier allgemeine Angaben  -->
                   <dive>
                     <place>Illes Medes, Kueste, Torbogen</place>
                     <!-- hier weitere Anweisungen -->
                   </dive>
                 <!-- hier weitere Anweisungen -->
                 </profile>





  22..2288..  <<pprrooffiillee uuddccff==""11"">> ...... <<//pprrooffiillee>>   ((vvoorrggeesscchhrriieebbeenn))

  Jede UDCF-Datei beginnt mit <profile udcf="1"> und endet mit
  </profile> als letzter Anweisung. Dazwischen stehen alle weiteren
  Anweisungen.



  22..2299..  <<pprrooggrraamm>> ...... <<//pprrooggrraamm>>   ((ooppttiioonnaall))

  Klammerung von zusaetzlichen, Programm-spezifischen Informationen, die
  zur Auswertung der Gewebesaettigung notwendig sind bzw. Programm-
  interne Parameter zur grafischen Darstellung der Daten.

  Ein UDCF-Parser wertet die Daten zwischen <program> und </program>
  nicht aus, sondern gibt sie ohne jede weitere Bearbeitung an das
  rufende Programm weiter. Damit wird es Programmen ermoeglicht
  spezifische Meta-Informationen abzulegen, die UDCF nicht bekannt sind.
  Die einzige Konvention ist, dass jedes Programm seine Meta-
  Informationen mit <program> </program> klammert.

  Anmerkung fuer Programmierer: bitte dokumentiert, in welcher Form ihr
  eure Daten zur Gewebesaettigung oder andere wichtige Parameter
  kodiert, damit sie von anderen Programmen korrekt gelesen und
  weiterverarbeitet werden koennen!

  Zur Zeit werden folgende Elemente verwendet: <``datatrak''>,
  <``tausim''>.

  <program> steht innerhalb der <``dive''>-Sektion nach der <``gases''>-
  und vor der <``samples''>-Sektion.

  Beispiel: siehe <``datatrak''> und <``tausim''>


  22..3300..  <<ppssttaarrtt>> ...... <<//ppssttaarrtt>>   ((vvoorrggeesscchhrriieebbeenn))

  Anfangs-Fuelldruck der Flasche.

  Steht innerhalb der optionalen <``tank''>-Sektion nach
  <``tankvolume''> (falls angegeben) und vor <``pend''> (falls
  angegeben).

  Im Gegensatz zu <``tankvolume''> oder <``pend''>, die wahlweise
  angegeben werden koennen, muss <pstart> immer in der
  <``tank''>-Sektion erscheinen, weil ohne diese Information keine
  Atemgas-Verbrauchsrechnung durchgefuehrt werden kann.

  Beispiel: siehe <tank>


  22..3311..  <<rreeppggrroouupp>> ...... <<//rreeppggrroouupp>>   ((vvoorrggeesscchhrriieebbeenn))

  Mit <repgroup> werden ,,zusammengehoerige Tauchgaenge`` geklammert.
  Mit ,,zusammengehoerig`` sind hier Tauchgaenge gemeint, die ein
  endliches Oberflaechenintervall aufweisen (ausser dem ersten
  Tauchgang) und z.B. alle waehrend eines Urlaubes durchgefuehrt wurden.
  Die einzelnen Tauchgaenge innerhalb <repgroup> werden mit dem Element
  <``dive''> voneinander getrennt.

  In einer UDCF-Datei koennen mehrere <repgroup>-Sektionen
  hintereinander stehen.  Innerhalb einer <repgroup>-Sektion muss
  mindestens ein Tauchgangs-Profil enthalten sein. Der erste in einer
  <repgroup> abgelegte Tauchgang sollte ein "unendliches"
  Oberflaechenintervall aufweisen.


  Beispiel:

















            <profile udcf="1">
            <!-- hier Angaben zu Einheiten und Hersteller -->
            <repgroup>
              <dive>
                <!-- hier Anweisungen zum ersten Tauchgang -->
                <!-- (sollte ein ,,unendliches`` Oberflaechenintervall aufweisen) -->
              </dive>
              <dive>
                <!-- hier Anweisungen zum zweiten Tauchgang -->
                <!-- (sollte ein endliches Oberflaechenintervall aufweisen) -->
              </dive>
              <dive>
                <!-- hier Anweisungen zu einem dritten Tauchgang -->
                <!-- (sollte ein endliches Oberflaechenintervall aufweisen) -->
              </dive>
            </repgroup>
            <repgroup>
              <!-- hier Anweisungen zu weiteren Tauchgaengen -->
            </repgroup>
            </profile>






  22..3322..  <<ssaammpplleess>> ...... <<//ssaammpplleess>>   ((vvoorrggeesscchhrriieebbeenn))

  Innerhalb von <samples> erfolgen die Angaben zu den eigentlichen
  Profildaten (nur Tiefenangaben bei konstantem Zeitintervall oder Zeit-
  und Tiefenangaben sowie eventuelle Warnmeldungen des aufzeichnenden
  Tauchcomputers). Ebenso wird hier das verwendete Atemgas bzw.
  eventuelle Wechsel des Atemgases angegeben.  Die Angabe der ersten
  <``switch''>-Anweisung nach <samples> ist zwingend.

  <samples> ist die letzte Sektion innerhalb der <``dive''>-Sektion.

  Beispiel 1:




























                 <!-- weitere Anweisungen -->
                 <!-- Bei von Tauchsimulations-Programmen generierten -->
                 <!-- Profilen wird normalerweise Zeit und Tiefe als -->
                 <!-- Paar angegeben -->
                 <timedepthmode/>
                 <samples>
                   <!-- Bei Tauchgangsbeginn Atemgas ,,1`` (in der -->
                   <!-- <gases>-Sektion definiert) verwenden -->
                   <switch>1</switch>
                   <!-- Ein Tauchgang beginnt immer bei 0 Minuten -->
                   <!-- und 0 Meter Tiefe ! -->
                   <t>0.0</t><d>0.0</d>
                   <t>5.0</t><d>40.0</d>
                   <t>15.0</t><d>40.0</d>
                   <t>18.0</t><d>28.0</d>
                   <t>25.0</t>15.0<d></d>
                   <t>31.0</t><d>6.0</d>
                   <!-- Wechsel zu Atemgas ,,2`` -->
                   <switch>2</switch>
                   <t>34.0</t><d>3.0</d>
                   <t>38.0</t><d>3.0</d>
                   <!-- Ein Tauchgang endet immer an der Oberflaeche -->
                   <!-- bei 0 Meter Tiefe ! -->
                   <t></t><d>0.0</d>
                 </samples>
               </dive>
               <!-- hier koennen weitere Daten zu Tauchgaengen folgen -->





  Beispiel 2:

































                 <!-- vorherige Anweisungen -->
                 <!-- Tauchcomputer zeichnen mit konstantem Zeitintervall -->
                 <!-- die Tiefen auf, deshalb kann eine zusaetzliche -->
                 <!-- Angabe der Zeit zu jeder Tiefe entfallen -->
                 <deltamode/>
                 <samples>
                   <!-- die Tiefen wurden in Intervallen von 20 Sekunden -->
                   <!-- aufgezeichnet -->
                   <delta>20.0</delta>
                   <!-- Bei Tauchgangsbeginn Luft als Atemgas verwenden  -->
                   <!-- (in <gases>-Sektion definiert) -->
                   <switch>air</switch>
                   <!-- Ein Tauchgang beginnt immer bei 0 Minuten -->
                   <!-- und 0 Meter Tiefe ! -->
                   <d> 0.0</d>
                   <d> 4.7</d>
                   <d> 7.0</d>
                   <d>11.1</d>
                   <!-- hier folgen weitere Tiefenangaben -->
                   <d>13.9</d>
                   <d>13.9</d><work>1</work>
                   <d>14.1</d><work>1</work>
                   <d>14.5</d><work>1</work>
                   <d>15.0</d><work>1</work>
                   <d>15.2</d>
                   <d>13.8</d>
                   <d>12.8</d><alarm>ascent</alarm>
                   <d>10.2</d>
                   <d> 9.4</d>
                   <d> 8.1</d>
                   <d> 7.2</d>
                   <d> 6.1</d>
                   <d> 5.3</d>
                   <d> 4.2</d><alarm>breath</alarm>
                   <d> 3.4</d>
                   <d> 3.6</d>
                   <d> 4.1</d>
                   <d> 3.6</d>
                   <d> 2.8</d>
                   <d> 2.7</d>
                   <d> 2.0</d>
                   <d> 1.1</d>
                   <!-- Ein Tauchgang endet immer an der Oberflaeche -->
                   <!-- bei 0 Meter Tiefe ! -->
                   <d>0.0</d>
                 </samples>
               </dive>
               <!-- hier koennen weitere Daten zu Tauchgaengen folgen -->





  22..3333..  <<sseerriiaalliidd>> ...... <<//sseerriiaalliidd>>   ((ooppttiioonnaall))

  Seriennummer des aufzeichnenden Tauchcomputers.

  Steht innerhalb der (optionalen) <``addinfo''>-Sektion als letzte
  Anweisung (falls angegeben) nach <``totaldives''> (falls angegeben).

  Beispiel: siehe <``addinfo''>





  22..3344..  <<ssuurrffaacceeiinntteerrvvaall>> ...... <<//ssuurrffaacceeiinntteerrvvaall>>   ((vvoorrggeesscchhrriieebbeenn))

  Das Oberflaechenintervall zwischen zwei aufeinander folgenden
  Tauchgaengen.

  Ist der folgende Tauchgang ein ,,Wiederholungs-Tauchgang`` (Gewebe
  noch nicht vollstaendig entsaettigt), so wird das
  Oberflaechenintervall in Minuten als reelle Zahl mit einer
  Nachkommastelle angegeben. Sind die Gewebe bei dem nachfolgenden
  Tauchgang dagegen vollstaendig entsaettigt, so wird das Schluesselwort
  ,,infinity`` von <surfaceinterval> eingeklammert.

  Die Anweisung steht innerhalb der <``dive''>-Sektion nach den Orts-,
  Datums- und Uhrzeit-Angaben und vor <``temperature''>.

  Beispiele:



                    <!-- Oberflaechenintervall 36 Minuten: -->
                    <surfaceinterval>36.0</surfaceinterval>

                    <!-- Gewebe vollstaendig entsaettigt: -->
                    <surfaceinterval>infinity</surfaceinterval>





  22..3355..  <<sswwiittcchh>> ...... <<//sswwiittcchh>>   ((vvoorrggeesscchhrriieebbeenn))

  Gibt das verwendete Atemgas an.

  <switch> steht innerhalb der <``samples''s>-Sektion vor der ersten
  Tiefen- oder Zeit-/Tiefenangabe. In <``deltamode/''> ist es nach
  <``delta''> die zweite Anweisung, in <``timedepthmode/''> die erste
  Anweisung.

  Die Anweisung ist wirksam ab der folgenden Tiefen- oder
  Zeit-/Tiefenangabe.  Es kann beliebig oft mit <switch> auf ein anderes
  Atemgas gewechselt werden.

  Beispiel: siehe <``samples''>



  22..3366..  <<tt>> ...... <<//tt>>   ((vvoorrggeesscchhrriieebbeenn))

  Absolute Zeitangabe in Minuten (metrische, imperiale Einheiten) oder
  Sekunden (SI-Einheiten) seit Beginn des Tauchgangs.

  Steht innerhalb der <samples>-Sektion.

  Die erste <t>-Anweisung muss <t>0.0</t> sein (in Verbindung mit
  <d>0.0</d>).

  Beispiel: siehe <``samples''>



  22..3377..  <<ttaannkk>> ...... <<//ttaannkk>>   ((ooppttiioonnaall))

  In der <tank>-Sektion werden die fuer eine Atemgas-Verbrauchsrechnung
  noetigen Angaben abgelegt.


  Die Elemente innerhalb <tank> sind: <``tankvolume''>, <``pstart''> und
  <``pend''>.

  <tank> folgt innerhalb der <``mix''>-Sektion direkt hinter
  <``mixname''> und vor den Angaben zur Atemgas-Zusammensetzung.

  Beispiel 1:


                    <!-- vorherige Anweisungen -->
                    <mix>
                      <mixname>air</mixname>
                      <tank>
                        <tankvolume>10.0</tankvolume>
                        <pstart>20000000.0</pstart>
                        <!-- da unten das Atemminutenvolumen angegeben ist -->
                        <!-- kann hier die Angabe des Enddrucks in der -->
                        <!-- Flasche entfallen -->
                      </tank>
                      <o2>0.21</o2>
                      <n2>0.79</n2>
                      <he>0.0</he>
                      <acv>20.0</acv>
                    </mix>
                    <!-- weitere Anweisungen -->




  Beispiel 2:


                    <!-- vorherige Anweisungen -->
                    <mix>
                      <!-- der Name des Atemgemisches darf auch z.B. einfach eine Ziffer sein -->
                      <mixname>1</mixname>
                      <tank>
                        <!-- da Anfangs- und Endfuelldruck angegeben sind -->
                        <!-- kann daraus ohne Angabe des Flaschenvolumens -->
                        <!-- das Atemminutenvolumen berechnet werden -->
                        <pstart>20000000.0</pstart>
                        <pend>10400000.0</pend>
                      </tank>
                      <o2>0.21</o2>
                      <n2>0.79</n2>
                      <he>0.0</he>
                    </mix>
                    <!-- weitere Anweisungen -->





  22..3388..  <<ttaannkkvvoolluummee>> ...... <<//ttaannkkvvoolluummee>>   ((ooppttiioonnaall))

  Volumen der Flasche in Liter (SI, metrisch) oder Kubik-Fuss
  (imperial).

  Steht innerhalb der optionalen <``tank''>-Sektion als erste Anweisung
  (falls angegeben) vor <``pstart''>.

  Beispiel: siehe <tank>




  22..3399..  <<ttaauussiimm>> ...... <<//ttaauussiimm>>   ((ooppttiioonnaall))

  Damit werden spezifische Informationen des Tauchsimulationsprogramms
  ,,Tausim`` geklammert. Zur Zeit (Tausim v0.99) werden folgende
  Elemente verwendet:

  +o  interne Parameter zur Darstellung des Profiles

  +o  <pres>, <timeinc>, <depthinc>, <durdep>, <nstatic>, <rls>

  +o  weitere Informationen zum verwendeten Dekomodell

  +o  <decomodel> - zur Zeit wird nur das Schluesselwort ,,ZH-L16``
     verwendet

  +o  <buehl> - gibt die verwendete Version an

  +o  ,,3`` - urspruengliche Version

  +o  ,,4`` - Version fuer Dekompressionstabellen

  +o  ,,5`` - Version fuer den Gebrauch in Tauchcomputern

  +o  <tissues> - Anzahl der einbezogenen Kompartimente, normalerweise 16
     Stueck.  Fuer jedes dieser Kompartimente wird nachfolgend der
     Saettigungsdruck zu Beginn des Tauchganges angegeben.

  +o  <ip> - Saettigung eines Gewebes (Kompartimentes) zu Beginn des
     Tauchganges.  Es erscheinen soviele <ip>-Anweisungen wie unter
     <tissues> angegeben. Die erste Anweisung gibt die Saettigung des
     schnellsten, die letzte Anweisung die Saettigung des langsamsten
     Gewebes an. Die Angaben erfolgen in der SI-Einheit Pascal.

  Steht innerhalb der optionalen <``program''>-Sektion als einzige
  Anweisung.

  Beispiel:





























            <!-- vorherige Anweisungen -->
            </gases>
            <program>
              <tausim>
                <pres>4000000.0</pres>
                <timeinc>5</timeinc>
                <depthinc>5</depthinc>
                <durdep>0</durdep>
                <nstatic>7</nstatic>
                <rls>50</rls>
                <decomodel>ZH-L16</decomodel>
                <buehl>5</buehl>
                <tissues>16</tissues>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
                <ip>75073.70000</ip>
              </tausim>
            </program>
            <timedepthmode/>
            <samples>
            <!-- eigentliche Profildaten  -->





  22..4400..  <<tteemmppeerraattuurree>> ...... <<//tteemmppeerraattuurree>>   ((ooppttiioonnaall))

  Die niedrigste Wassertemperatur waehrend des Tauchgangs, falls
  bekannt. Ist diese unbekannt, entfaellt das Feld <temperature>.

  Steht innerhalb der <``dive''>-Sektion nach der Angabe des
  Oberflaechenintervalls mittels <``surfaceinterval''> und vor
  <``density''>. Die Temperatur wird als reelle Zahl mit einer
  Nachkommastelle angegeben.

  Beispiel:


                    <!-- niedrigste Wassertemperatur 12 Grad Celsius -->
                    <temperature>12.0</temperature>




  Alternativ kann dieser Tag auch in der samples-section verwendet
  werden, um die Temperatur des aktuellen Samples anzuzeigen.


  22..4411..  <<ttiimmee>> ...... <<//ttiimmee>>   ((vvoorrggeesscchhrriieebbeenn))

  Die Uhrzeit, an dem der Tauchgang durchgefuehrt bzw. das Profil mit
  einem Programm generiert wurde.
  Die Elemente innerhalb <time> sind <``hour''> und <``minute''>, wobei
  diese Reihenfolge zwingend vorgeschrieben ist.

  Steht innerhalb der <``dive''>-Sektion nach <``date''>.

  Beispiel:


                 <profile udcf="1">
                 <!-- hier Angaben zu Einheiten und Hersteller -->
                 <repgroup>
                   <dive>
                     <!-- hier Angaben zum Ort (falls bekannt) und Datum -->
                     <time><hour>16</hour><minute>21</minute></time>
                     <!-- hier weitere Anweisungen -->
                   </dive>
                 <!-- hier weitere Anweisungen -->
                 </profile>





  22..4422..  <<ttiimmeeddeepptthhmmooddee//>>   ((vvoorrggeesscchhrriieebbeenn))

  Damit wird vorgegeben, dass in der <``samples''>-Sektion Zeit- und
  Tiefenangaben folgen.

  Steht direkt vor der <``samples''>-Anweisung. Siehe auch
  <``deltamode''>.

  Im Gegensatz zu <``deltamode/''> muss in der nachfolgenden
  <``samples''>-Sektion keine weitere Anweisung zu diesem Modus
  angegeben werden.

  Beispiel:  siehe <samples>



  22..4433..  <<ttoottaallddiivveess>> ...... <<//ttoottaallddiivveess>>   ((ooppttiioonnaall))

  Gesamtzahl der Tauchgaenge.

  Steht innerhalb der (optionalen) <``addinfo''>-Sektion nach
  <``persinfo''> (falls angegeben) und vor <``serialid''> (falls
  angegeben).

  Beispiel: siehe <``addinfo''>



  22..4444..  <<uunniittss>> ...... <<//uunniittss>>   ((vvoorrggeesscchhrriieebbeenn))

  Gibt das verwendete Einheitensystem an. Erlaubte Schluesselwoerter
  sind ,,si``, ,,metric`` oder ,,imperial``.

  Erste Anweisung nach <``profile udcf="1"''>.









  Einheiten:        si: Druck [Pa], Hoehe [m], Temperatur [K],
                        Dichte [kg/m^3], Zeit [s]
                metric: Druck [bar], Hoehe [m], Temperatur [Grad Celsius],
                        Dichte [kg/m^3], Zeit [min]
              imperial: Druck [psi], Hoehe [feet], Temperatur [Grad Fahrenheit],
                        Dichte [ ??? ], Zeit [min]




  Beispiel:


                 <profile udcf="1">
                 <units>metric</units>
                 <!-- hier weitere Anweisungen -->
                 </profile>





  22..4455..  <<vveennddoorr>> ...... <<//vveennddoorr>>   ((vvoorrggeesscchhrriieebbeenn))

  In <vendor> wird der Hersteller des aufzeichnenden Tauchcomputers bzw.
  des generierenden Programms angegeben.

  Steht innerhalb der <``device''>-Sektion als erste Anweisung vor
  <``model''>.

  Beispiel: siehe <``device''>


  22..4466..  <<vveerrssiioonn>> ...... <<//vveerrssiioonn>>   ((vvoorrggeesscchhrriieebbeenn))

  In <version> wird die Versionsnummer des aufzeichnenden Tauchcomputers
  bzw. des generierenden Programms angegeben.

  Steht innerhalb der <``device''>-Sektion als letzte Anweisung hinter
  <``model''>.

  Beispiel: siehe <``device''>


  22..4477..  <<wwoorrkk>> ...... <<//wwoorrkk>>   ((ooppttiioonnaall))

  Arbeitsleistungsangabe bei luftintegrierten Tauchcomputern. Zur Zeit
  werden folgende Stufen in Datatrak-Dateien erkannt: 1, 2, 4

  Steht innerhalb der <samples>-Sektion und nach der zugehoerigen
  Tiefenangabe.

  Beispiel: siehe 2. Beispiel <``samples''>


  22..4488..  <<yyeeaarr>> ...... <<//yyeeaarr>>   ((vvoorrggeesscchhrriieebbeenn))

  Das Jahr, in dem der Tauchgang durchgefuehrt bzw. das Profil von einem
  Programm generiert wurde; die Anweisung steht innerhalb von <date>.
  Die Angabe sollte als vierstellige :-) ganze Zahl (integer) erfolgen.

  Steht innerhalb von <``date''>. Die Reihenfolge <year>, <``month''>,
  <``day''> muss dabei zwingend eingehalten werden.

  Beispiel: siehe <``date''>

  CC..  EEiinnee GGrraammmmaattiikk ffuueerr UUDDCCFF

  Klein geschriebende Woerter (z.B. profile, units_section oder
  mix_list) stehen fuer Nichtterminale, Woerter die nur aus
  Grossbuchstaben zusammengesetzt sind oder in Ausfuehrungszeichen
  stehen (z.B. <UNITS>, </UNITS>, "Imperial" oder <ALARM>BREATH</ALARM>)
  repraesentieren Terminalwoerter.




  profile -> <PROFILE UDCF = "1">
              units_section
              device_section
              additional_section
              repgroups
             </PROFILE>






  units_section -> <UNITS>
                    unitsymbol
                   </UNITS>






  unitsymbol -> "Metric" | "Imperial"






  device_section -> <DEVICE>
                     <VENDOR>
                      vendorString
                     </VENDOR>
                     <MODEL>
                      modelString
                     </MODEL>
                     <VERSION>
                      versionID
                     </VERSION>
                    </DEVICE>
  vendorString -> String
  modelString -> String
  versionID -> Integer













  additional_section ->  <ADDINFO>
                          personal_desc
                          totalDives_desc
                          IDString_desc
                         </ADDINFO>
                        |
                         Empty






  personal_desc ->  <PERSINFO>
                     String
                    </PERSINFO>
                   |
                    Empty






  totalDives_desc ->  <TOTALDIVES>
                       Integer
                      </TOTALDIVES>
                     |
                      Empty






  IDString_desc ->  <SERIALID>
                     String
                    </SERIALID>
                   |
                    Empty






  repgroups ->   repgroups repgroupdesc
               | repgroupdesc






  repgroupdesc -> <REPGROUP>
                   divelist
                  </REPGROUP>






  divelist ->   divelist dive_desc
              | dive_desc

  dive_desc -> <DIVE>
                place_desc
                date
                time
                surface_interval
                temperature
                density
                alt_info
                gases_section
                prg_data
                samples
               </DIVE>






  place_desc ->  <PLACE>
                  String
                 </PLACE>
                |
                 Empty






  date -> <DATE>
           <YEAR>
            year_desc
           </YEAR>
           <MONTH>
            month_desc
           </MONTH>
           <DAY>
            day_desc
           </DAY>
          </DATE>
  day_desc -> Integer
  month_desc -> Integer
  year_desc -> Integer






  time -> <TIME>
           <HOUR>
            hour_desc
           </HOUR>
           <MINUTE>
            minute_desc
           </MINUTE>
          </TIME>
  hour_desc ->   Integer
  minute_desc -> Integer







  temperature ->  <TEMPERATURE>
                    temp_desc
                  </TEMPERATURE>
                 |
                  Empty
  temp_desc -> Real






  density -> <DENSITY>
              density_desc
             </DENSITY>
  density_desc -> Real






  alt_info -> <ALTITUDE>
               level
              </ALTITUDE>
  level -> Real






  surface_interval -> <SURFACEINTERVAL>
                       interval_desc
                      </SURFACEINTERVAL>
  interval_desc -> secs | INFINITY
  secs -> Real






  gases_section -> <GASES>
                    mix_list
                   </GASES>






  mix_list ->   mix_desc mix_list
              | mix_desc












  mix_desc -> <MIX>
               <MIXNAME> mixname </MIXNAME>
               tank_info
               <O2> o2_ratio </O2>
               <N2> n2_ratio </N2>
               <HE> he_ratio </HE>
               acv_desc
              </MIX>
  mixname -> String
  n2_ratio -> Real
  o2_ratio -> Real
  he_ratio -> Real






  acv_desc ->  <ACV>
                acv_value
               </ACV>
              |
               Empty
  acv_value -> Real






  tank_info ->  <TANK>
                 tank_volume_info
                 <PSTART>
                  press_in
                 </PSTART>
                 press_end_desc
                </TANK>
               |
                Emtpy






  press_end_desc -> <PEND>
                     press_out
                    </PEND>
                   |
                    Empty






  press_in -> Real
  press_out -> Real








  tank_volume_info ->  <TANKVOLUME>
                        volume
                       </TANKVOLUME>
                      |
                       Empty
  volume -> Real






  prg_data ->  <PRG>
                String
               </PRG>
              |
               Empty






  samples ->  delta_mode_marker
              <SAMPLES>
               delta_marker switch_desc sample_list_delta
              </SAMPLES>
            | timedep_mode_marker
              <SAMPLES>
               switch_desc sample_list_timedepth
              </SAMPLES>






  delta_mode_marker -> DELTAMODE






  timedep_mode_marker -> TIMEDEPTHMODE






  sample_list_delta ->   sampledesc_delta sample_list_delta
                       | sampledesc_delta






  sample_list_timedepth ->   sampledesc_timedepth sample_list_timedepth
                           | sampledesc_timedepth





  sampledesc_delta ->   depth
                      | switch_desc
                      | temperature
                      | markers






  sampledesc_timedepth ->   point
                          | switch_desc
                          | temperature
                          | markers






  delta_marker ->
                  <DELTA>
                   delta
                  </DELTA>






  delta -> Real






  markers ->   <ALARM>SURFACE</ALARM>
             | <ALARM>ASCENT</ALARM>
             | <ALARM>DECO</ALARM>
             | <ALARM>BREATH</ALARM>
             | <ALARM>RBT</ALARM>
             | <ALARM>ERROR</ALARM>
             | workdesc






  depth -> <DEPTH> Real </DEPTH>






  point -> <T>
            Real
           </T>
           <DEPTH>
            Real
           </DEPTH>



  switch_desc -> <SWITCH>
                  changedMix
                 </SWITCH>
  changedMix -> String






  workdesc -> <WORK>
               Real
              </WORK>






  String -> [a-zA-Z0-9\+\-\.@.,:;'=&\!$\~\(\)\*\ ]+






  Real -> ((([0-9]+)|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?)|[0-9]+)






  Integer -> -?[0-9]+






  Empty -> Epsilon

























