<?xml version="1.0" ?>
<!--
 This file is part of FlightGear, the free flight simulator
 http://www.flightgear.org/

 Copyright (C) 2009 Torsten Dreyer, Torsten (at) t3r _dot_ de

 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License as
 published by the Free Software Foundation; either version 2 of the
 License, or (at your option) any later version.

 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 General Public License for more details.
-->
<!--
  Interpolate the METAR weather values over time and write
  the environment values in /environment/config/*
  All filters are enabled if /environment/metar/valid=true
  -->
<PropertyList> 
  <filter>
    <!-- 
      transfer the METAR QNH to the interpolation controller
      limit the rate of change to approx 0.01hpa/sec
    -->
    <name>MetarController:pressure-sea-level-inhg</name>
    <type>noise-spike</type>
    <max-rate-of-change>0.006</max-rate-of-change>
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
      </condition>
    </enable>
    <input>/environment/metar/pressure-sea-level-inhg</input>
    <output>/environment/config/boundary/entry/pressure-sea-level-inhg</output>
    <output>/environment/config/aloft/entry/pressure-sea-level-inhg</output>
  </filter>

  <filter>
    <!-- 
      transfer the sea-level temperature to each layer of
      interpolation controller. We have no idea here about
      the temperature gradient, so just assume ISA.
    -->
    <name>MetarController:temperature-sea-level-degc</name>
    <type>noise-spike</type>
    <max-rate-of-change>0.01667</max-rate-of-change>
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
      </condition>
    </enable>
    <input>/environment/metar/temperature-sea-level-degc</input>
    <output>/environment/config/boundary/entry[0]/temperature-sea-level-degc</output>
    <output>/environment/config/boundary/entry[1]/temperature-sea-level-degc</output>
    <output>/environment/config/aloft/entry[0]/temperature-sea-level-degc</output>
    <output>/environment/config/aloft/entry[1]/temperature-sea-level-degc</output>
    <output>/environment/config/aloft/entry[2]/temperature-sea-level-degc</output>
    <output>/environment/config/aloft/entry[3]/temperature-sea-level-degc</output>
    <output>/environment/config/aloft/entry[4]/temperature-sea-level-degc</output>
  </filter>

  <filter>
    <!--
      transfer the sea-level dewpoint to each layer of
      interpolation controller. This is most certainly
      wrong in most cases.
    -->
    <name>MetarController:dewpoint-sea-level-degc</name>
    <type>noise-spike</type>
    <max-rate-of-change>0.01667</max-rate-of-change>
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
      </condition>
    </enable>
    <input>/environment/metar/dewpoint-sea-level-degc</input>
    <output>/environment/config/boundary/entry[0]/dewpoint-sea-level-degc</output>
    <output>/environment/config/boundary/entry[1]/dewpoint-sea-level-degc</output>
    <output>/environment/config/aloft/entry[0]/dewpoint-sea-level-degc</output>
    <output>/environment/config/aloft/entry[1]/dewpoint-sea-level-degc</output>
    <output>/environment/config/aloft/entry[2]/dewpoint-sea-level-degc</output>
    <output>/environment/config/aloft/entry[3]/dewpoint-sea-level-degc</output>
    <output>/environment/config/aloft/entry[4]/dewpoint-sea-level-degc</output>
  </filter>

  <filter>
    <!--
      transfer the visibility to each layer of
      interpolation controller. We are not very creative here and 
      use the same visibility for all layers but top four which
      are left untouched.
    -->
    <name>MetarController:visibility-m</name>
    <type>exponential</type>
    <filter-time>5</filter-time>
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
      </condition>
    </enable>
    <input>/environment/metar/min-visibility-m</input>
    <output>/environment/config/boundary/entry[0]/visibility-m</output>
    <output>/environment/config/boundary/entry[1]/visibility-m</output>
    <output>/environment/config/aloft/entry[0]/visibility-m</output>
  </filter>

  <filter>
    <!-- 
      transfer the rain intensity to the target environment
    -->
    <name>MetarController:rain-norm</name>
    <type>noise-spike</type>
    <max-rate-of-change>1.0</max-rate-of-change>
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
      </condition>
    </enable>
    <input>/environment/metar/rain-norm</input>
    <output>/environment/rain-norm</output>
  </filter>

  <filter>
    <!-- 
      transfer the snow intensity to the target environment
    -->
    <name>MetarController:snow-norm</name>
    <type>noise-spike</type>
    <max-rate-of-change>1.0</max-rate-of-change>
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
      </condition>
    </enable>
    <input>/environment/metar/snow-norm</input>
    <output>/environment/snow-norm</output>
  </filter>

  <!-- interpolate the wind vector's components -->
  <filter>
    <name>MetarController:wind-from-north-fps</name>
    <type>exponential</type>
    <filter-time>30</filter-time>
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
      </condition>
    </enable>
    <input>/environment/metar/base-wind-from-north-fps</input>
    <output>/environment/config/boundary/entry[0]/wind-from-north-fps</output>
  </filter>

  <filter>
    <name>MetarController:wind-from-east-fps</name>
    <type>exponential</type>
    <filter-time>30</filter-time>
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
      </condition>
    </enable>
    <input>/environment/metar/base-wind-from-east-fps</input>
    <output>/environment/config/boundary/entry[0]/wind-from-east-fps</output>
  </filter>

  <!-- Adjust the wind-vector for the layers -->
  <!-- TODO: handle variable winds -->
  <filter include="layer-heading-offset.xml"/>
  <filter include="layer-heading-offset.xml">
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
        <property>/environment/params/metar-updates-winds-aloft</property>
      </condition>
    </enable>
    <input>
      <offset>/environment/config/aloft/entry[0]/wind-heading-change-deg</offset>
    </input>
    <output>/environment/config/aloft/entry[0]/wind-from-heading-deg</output>
  </filter>
  <filter include="layer-heading-offset.xml">
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
        <property>/environment/params/metar-updates-winds-aloft</property>
      </condition>
    </enable>
    <input>
      <offset>/environment/config/aloft/entry[1]/wind-heading-change-deg</offset>
    </input>
    <output>/environment/config/aloft/entry[1]/wind-from-heading-deg</output>
  </filter>
  <filter include="layer-heading-offset.xml">
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
        <property>/environment/params/metar-updates-winds-aloft</property>
      </condition>
    </enable>
    <input>
      <offset>/environment/config/aloft/entry[2]/wind-heading-change-deg</offset>
    </input>
    <output>/environment/config/aloft/entry[2]/wind-from-heading-deg</output>
  </filter>
  <filter include="layer-heading-offset.xml">
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
        <property>/environment/params/metar-updates-winds-aloft</property>
      </condition>
    </enable>
    <input>
      <offset>/environment/config/aloft/entry[3]/wind-heading-change-deg</offset>
    </input>
    <output>/environment/config/aloft/entry[3]/wind-from-heading-deg</output>
  </filter>
  <filter include="layer-heading-offset.xml">
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
        <property>/environment/params/metar-updates-winds-aloft</property>
      </condition>
    </enable>
    <input>
      <offset>/environment/config/aloft/entry[4]/wind-heading-change-deg</offset>
    </input>
    <output>/environment/config/aloft/entry[4]/wind-from-heading-deg</output>
  </filter>

  <filter include="layer-speed-change.xml"/>
  <filter include="layer-speed-change.xml">
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
        <property>/environment/params/metar-updates-winds-aloft</property>
      </condition>
    </enable>
    <input>
      <offset>/environment/config/aloft/entry[0]/wind-speed-change-rel</offset>
    </input>
    <output>/environment/config/aloft/entry[0]/wind-speed-kt</output>
  </filter>
  <filter include="layer-speed-change.xml">
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
        <property>/environment/params/metar-updates-winds-aloft</property>
      </condition>
    </enable>
    <input>
      <offset>/environment/config/aloft/entry[1]/wind-speed-change-rel</offset>
    </input>
    <output>/environment/config/aloft/entry[1]/wind-speed-kt</output>
  </filter>
  <filter include="layer-speed-change.xml">
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
        <property>/environment/params/metar-updates-winds-aloft</property>
      </condition>
    </enable>
    <input>
      <offset>/environment/config/aloft/entry[2]/wind-speed-change-rel</offset>
    </input>
    <output>/environment/config/aloft/entry[2]/wind-speed-kt</output>
  </filter>
  <filter include="layer-speed-change.xml">
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
        <property>/environment/params/metar-updates-winds-aloft</property>
      </condition>
    </enable>
    <input>
      <offset>/environment/config/aloft/entry[3]/wind-speed-change-rel</offset>
    </input>
    <output>/environment/config/aloft/entry[3]/wind-speed-kt</output>
  </filter>
  <filter include="layer-speed-change.xml">
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
        <property>/environment/params/metar-updates-winds-aloft</property>
      </condition>
    </enable>
    <input>
      <offset>/environment/config/aloft/entry[4]/wind-speed-change-rel</offset>
    </input>
    <output>/environment/config/aloft/entry[4]/wind-speed-kt</output>
  </filter>

  <!-- Clouds -->
  <filter include="clouds-altitude-interpolate.xml"/>
  <filter include="clouds-altitude-interpolate.xml">
    <params>
      <from>/environment/metar/clouds/layer[1]/elevation-ft</from>
      <to>/environment/clouds/layer[1]/elevation-ft</to>
    </params>
  </filter>
  <filter include="clouds-altitude-interpolate.xml">
    <params>
      <from>/environment/metar/clouds/layer[2]/elevation-ft</from>
      <to>/environment/clouds/layer[2]/elevation-ft</to>
    </params>
  </filter>
  <filter include="clouds-altitude-interpolate.xml">
    <params>
      <from>/environment/metar/clouds/layer[3]/elevation-ft</from>
      <to>/environment/clouds/layer[3]/elevation-ft</to>
    </params>
  </filter>
  <filter include="clouds-altitude-interpolate.xml">
    <params>
      <from>/environment/metar/clouds/layer[4]/elevation-ft</from>
      <to>/environment/clouds/layer[4]/elevation-ft</to>
    </params>
  </filter>

  <filter include="clouds-thickness.xml"/>
  <filter include="clouds-thickness.xml">
    <input>/environment/metar/clouds/layer[1]/thickness-ft</input>
    <output>/environment/clouds/layer[1]/thickness-ft</output>
  </filter>
  <filter include="clouds-thickness.xml">
    <input>/environment/metar/clouds/layer[2]/thickness-ft</input>
    <output>/environment/clouds/layer[2]/thickness-ft</output>
  </filter>
  <filter include="clouds-thickness.xml">
    <input>/environment/metar/clouds/layer[3]/thickness-ft</input>
    <output>/environment/clouds/layer[3]/thickness-ft</output>
  </filter>
  <filter include="clouds-thickness.xml">
    <input>/environment/metar/clouds/layer[4]/thickness-ft</input>
    <output>/environment/clouds/layer[4]/thickness-ft</output>
  </filter>

  <filter include="clouds-coverage.xml"/>
  <filter include="clouds-coverage.xml">
    <params>
      <from>/environment/metar/clouds/layer[1]/coverage-type</from>
      <to>environment/clouds/layer[1]/coverage-type</to>
    </params>
  </filter>
  <filter include="clouds-coverage.xml">
    <params>
      <from>/environment/metar/clouds/layer[2]/coverage-type</from>
      <to>environment/clouds/layer[2]/coverage-type</to>
    </params>
  </filter>
  <filter include="clouds-coverage.xml">
    <params>
      <from>/environment/metar/clouds/layer[3]/coverage-type</from>
      <to>environment/clouds/layer[3]/coverage-type</to>
    </params>
  </filter>
  <filter include="clouds-coverage.xml">
    <params>
      <from>/environment/metar/clouds/layer[4]/coverage-type</from>
      <to>environment/clouds/layer[4]/coverage-type</to>
    </params>
  </filter>
  <filter>
    <name>MetarController:cloud-visibility-m</name>
    <type>exponential</type>
    <filter-time>5</filter-time>
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
      </condition>
    </enable>
    <input>/environment/metar/clouds/layer[0]/visibility-m</input>
    <output>/environment/clouds/layer[0]/visibility-m</output>
  </filter>
  <filter>
    <name>MetarController:cloud-alpha</name>
    <type>exponential</type>
    <filter-time>5</filter-time>
    <enable>
      <condition>
        <property>/environment/metar/valid</property>
        <property>/environment/params/metar-updates-environment</property>
      </condition>
    </enable>
    <input>/environment/metar/clouds/layer[0]/alpha</input>
    <output>/environment/clouds/layer[0]/alpha</output>
  </filter>
</PropertyList>