<phyphox xmlns="http://phyphox.org/xml" version="1.7" locale="en">
    <title>Velocity-Time-Graphs</title>
    <icon>3</icon>
    <category>Walk the graph</category>
    <description>
        Test experiment for LiDAR development. Select one of three different graphs to walk along. A score in % indicates how well graph and motion match.
    </description>
    <data-containers>
        <container size="1" init="1" static="false">button</container>

        <container size="2">tpreview</container>
        <container size="1">lastx</container>
        <container size="2">preview</container>

        <container size="0">xinmeter</container>
        <container size="0">xin</container>
        <container size="0">tin</container>
        <container size="1">tlast</container>
        <container size="1">tinfirst</container>
        <container size="1">newoffset</container>
        <container size="1" init="-1000">offset</container>
        <container size="0">tcorrected</container>
        <container size="0">x</container>
        <container size="0">t</container>
        <container size="0">xshow</container>
        <container size="0">tshow</container>

        <container size="1" init="0.1">dt</container> <!-- Schrittweite für Glättung (kann normalerweise so bleiben) -->
        <container size="1" init="0.5">d</container>  <!-- Breite der Glättung in Sekunden -->

        <container size="0">tout</container>
        <container size="0">xout</container>
        <container size="0">vout</container>
        <container size="0">aout</container>

        <container size="0">toutpreview</container>
        <container size="0">xoutpreview</container>
        <container size="0">voutpreview</container>
        <container size="0">aoutpreview</container>

        <container size="1" init="0" static="true">linear_start</container>
        <container size="1" init="12" static="true">linear_stop</container>
        <container size="0" static="true">linear_time</container>
        <container size="0" static="true">linear</container>
        <container size="0" static="true">linear_v</container>

        <container size="1" init="0" static="true">sin_start</container>
        <container size="1" init="14" static="true">sin_stop</container>
        <container size="0" static="true">sin_time</container>
        <container size="0" static="true">sin</container>
        <container size="0" static="true">sin_v</container>

        <container size="1" init="0" static="true">piece_start</container>
        <container size="1" init="13" static="true">piece_stop</container>
        <container size="0" static="true">piece_time</container>
        <container size="0" static="true">piece</container>
        <container size="0" static="true">piece_v</container>

        <container size="1" init="0">plotselect</container>
        <container size="0">reference_plot_time</container>
        <container size="0">reference_plot</container>
        <container size="0">reference_plot_v</container>

        <container size="1">newsmoothstart</container>
        <container size="1">newsmoothstop</container>
        <container size="1">tmaxsmooth</container>

        <container size="101">newsmoothti100</container>
        <container size="101">newsmoothti</container>
        <container size="101">newsmoothxi</container>
        <container size="101">newsmoothvi</container>
        <container size="101">newsmoothai</container>

        <container size="101">incompletesmoothti</container>
        <container size="101">incompletesmoothxi</container>
        <container size="101">incompletesmoothvi</container>
        <container size="101">incompletesmoothai</container>

        <container size="1">temp</container>

        <container size="0">scorable_time</container>
        <container size="0">scorable_data</container>
        <container size="0">scorable_ref</container>
        <container size="0">scores</container>
        <container size="1">score</container>
    </data-containers>
    <input>
        <depth x1="0.4" x2="0.6" y1="0.4" y2="0.6" mode="average" smooth="false">
            <output component="z">xinmeter</output>
            <output component="t">tin</output>
        </depth>
    </input>
    <analysis>

        <multiply>
            <input clear="true">xinmeter</input>
            <input type="value">100</input>
            <output>xin</output>
        </multiply>

        <!-- VORSCHAU DER POSITION -->

        <append>
            <input clear="false">xin</input>
            <output clear="false">lastx</output>
        </append>

        <append>
            <input clear="false">reference_plot_time</input>
            <input type="value">0</input>
            <output clear="false">tpreview</output>
        </append>

        <append>
            <input clear="false">lastx</input>
            <input clear="false">lastx</input>
            <output clear="false">preview</output>
        </append>

        <!-- VORGABE-KURVE -->

        <!-- Gerade -->

        <formula formula="([2]-[1])/[3]+1">
            <input clear="false">linear_start</input>
            <input clear="false">linear_stop</input>
            <input clear="false">dt</input>
            <output>temp</output>
        </formula>

        <ramp>
            <input as="start" clear="false">linear_start</input>
            <input as="stop" clear="false">linear_stop</input>
            <input as="length">temp</input>
            <output>linear_time</output>
        </ramp>

        <formula formula="1">              <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. -->
            <input clear="false">linear_time</input>
            <output>linear</output>
        </formula>

        <formula formula="((heaviside([1_]-0)*heaviside(6-[1_])/(6-0)*300) + (heaviside([1_]-6)*heaviside(12-[1_])/(12-6)*1))  /  max(min(abs([1_]-6)*1000,1),0)">              <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. -->
            <input clear="false">linear_time</input>
            <output>linear_v</output>
        </formula>

        <!-- Sinus -->

        <formula formula="([2]-[1])/[3]+1">
            <input clear="false">sin_start</input>
            <input clear="false">sin_stop</input>
            <input clear="false">dt</input>
            <output>temp</output>
        </formula>

        <ramp>
            <input as="start" clear="false">sin_start</input>
            <input as="stop" clear="false">sin_stop</input>
            <input as="length">temp</input>
            <output>sin_time</output>
        </ramp>

        <formula formula="200*(sin(2*3.14*[1_]/5)+1)+100">  <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. -->
            <input clear="false">sin_time</input>
            <output>sin</output>
        </formula>

        <formula formula="((heaviside([1_]-0)*heaviside(4-[1_])/(4-0)*1) + (heaviside([1_]-4)*heaviside(10-[1_])/(10-4)*300) + (heaviside([1_]-10)*heaviside(14-[1_])/(14-10)*1)) /  max(min(abs([1_]-4)*1000,1),0) * max(min(abs([1_]-10)*1000,1),0)">  <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. -->
            <input clear="false">sin_time</input>
            <output>sin_v</output>
        </formula>

        <!-- Abschnittsweise -->

        <formula formula="([2]-[1])/[3]+1">
            <input clear="false">piece_start</input>
            <input clear="false">piece_stop</input>
            <input clear="false">dt</input>
            <output>temp</output>
        </formula>

        <ramp>
            <input as="start" clear="false">piece_start</input>
            <input as="stop" clear="false">piece_stop</input>
            <input as="length">temp</input>
            <output>piece_time</output>
        </ramp>

        <formula formula="100 + (min(max([1_],0),5)-0)/(5-0)*100 - (min(max([1_],5),7)-5)/(7-5)*100 + (min(max([1_],8),10)-8)/(10-8)*200">    <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. -->
            <input clear="false">piece_time</input>
            <output>piece</output>
        </formula>

        <formula formula="(heaviside([1_]-0)*heaviside(5-[1_])/(5-0)*100 + heaviside([1_]-5)*heaviside(13-[1_])/(13-5)*400)  /  max(min(abs([1_]-5)*1000,1),0)">    <!-- Formel für die Vorgabekurve. Normalerweise muss nur diese Zeile geändert werden. Start und Stop weiter oben <data-containers> ändern. -->
            <input clear="false">piece_time</input>
            <output>piece_v</output>
        </formula>

        <!-- Auswahl des Nutzers (linear, sinus, piecewise) übernehmen -->

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">0</input>
            <input type="empty" />
            <output clear="true">reference_plot</output>
        </if>

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">0</input>
            <input type="empty" />
            <output clear="true">reference_plot_v</output>
        </if>

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">1</input>
            <input clear="false">linear</input>
            <output clear="true">reference_plot</output>
        </if>

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">1</input>
            <input clear="false">linear_v</input>
            <output clear="true">reference_plot_v</output>
        </if>

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">1</input>
            <input clear="false">linear_time</input>
            <output clear="true">reference_plot_time</output>
        </if>

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">2</input>
            <input clear="false">sin</input>
            <output clear="true">reference_plot</output>
        </if>

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">2</input>
            <input clear="false">sin_v</input>
            <output clear="true">reference_plot_v</output>
        </if>

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">2</input>
            <input clear="false">sin_time</input>
            <output clear="true">reference_plot_time</output>
        </if>

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">3</input>
            <input clear="false">piece</input>
            <output clear="true">reference_plot</output>
        </if>

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">3</input>
            <input clear="false">piece_v</input>
            <output clear="true">reference_plot_v</output>
        </if>

        <if equal="true">
            <input clear="false">plotselect</input>
            <input type="value">3</input>
            <input clear="false">piece_time</input>
            <output clear="true">reference_plot_time</output>
        </if>

        <!-- MESSWERTE -->

        <!-- Ersten Wert auf Null setzen und Button berücksichtigen -->

        <first>
            <input clear="false">tin</input>
            <output>tinfirst</output>           <!-- First timestamp of new data from Arduino. This is in units of the Arduino and will have an offset -->
        </first>

        <append>
            <input type="value">-3</input>      <!-- Startzeit für den allerersten Datenpunkt -->
            <input clear="false">t</input>
            <output>tlast</output>              <!-- Last timestamp already stored or start value. This is in units of the x axis -->
        </append>

        <formula formula="[1]-[2]-0.05">
            <input clear="false">tinfirst</input>
            <input clear="false">tlast</input>
            <output clear="true">newoffset</output>    <!-- Possible new offset to continue existing data if there is no valid offset -->
        </formula>

        <if less="true">
            <input clear="false">offset</input>
            <input type="value">-100</input>
            <input clear="false">newoffset</input>      <!-- Set offset to newoffset if it is no longer valid -->
            <output clear="false">offset</output>
        </if>

        <subtract>
            <input clear="true">tin</input>
            <input clear="false">offset</input>
            <output clear="true">tcorrected</output>    <!-- Timestamps corresponding to xin data, aligned such that it continues any previous measurement. -->
        </subtract>

        <if equal="true">
            <input clear="false">button</input>
            <input type="value">0</input>
            <input type="value">-1000</input>
            <output clear="false">offset</output>       <!-- If the button is not pressed, reset the offset -->
        </if>

        <if equal="true">
            <input clear="false">button</input>
            <input type="value">0</input>
            <input type="empty" />
            <output clear="true">tcorrected</output>    <!-- If the button is not pressed, clear incoming data -->
        </if>

        <if equal="true">
            <input clear="false">button</input>
            <input type="value">0</input>
            <input type="empty" />
            <output clear="true">xin</output>           <!-- If the button is not pressed, clear incoming data -->
        </if>

        <append>
            <input clear="true">xin</input>
            <output clear="false">x</output>            <!-- Append new data if it is still there... -->
        </append>

        <append>
            <input clear="true">tcorrected</input>
            <output clear="false">t</output>            <!-- Append new data if it is still there... -->
        </append>

        <!-- Neue Stützstellen für Glättung suchen -->

        <append>
            <input type="value">0</input>
            <input clear="false">tout</input>
            <output>temp</output>               <!-- Letzter schon berechneter Glättungswert -->
        </append>

        <add>
            <input>temp</input>
            <input clear="false">dt</input>
            <output>newsmoothstart</output>     <!-- Erster zu berechnender Glättungswert -->
        </add>

        <append>
            <input type="value">0</input>
            <input clear="false">t</input>
            <output>temp</output>               <!-- Letzter Rohdatenwert, der schon aufgenommen wurde -->
        </append>

        <subtract>
            <input>temp</input>
            <input clear="false">d</input>
            <output>tmaxsmooth</output>         <!-- Maximale Zeit, bis zu der eine Glättung schon sinnvoll wäre -->
        </subtract>

        <formula formula="[1]+100*[2]">
            <input clear="false">newsmoothstart</input>
            <input clear="false">dt</input>
            <output>newsmoothstop</output>      <!-- Höchster der möglichen neuen Glättungswerte, der aber weit hinter den sinnvollen liegen kann -->
        </formula>

        <ramp>
            <input as="start">newsmoothstart</input>
            <input as="stop">newsmoothstop</input>
            <output>newsmoothti100</output>     <!-- Mögliche neue Glättungswerte -->
        </ramp>

        <rangefilter>
            <input clear="false">newsmoothti100</input>
            <input as="max" clear="false">tmaxsmooth</input>
            <output>newsmoothti</output>        <!-- Die Zeiten, zu denen wir nun wirklich glätten -->
        </rangefilter>

        <append>
            <input type="value">0</input>
            <input clear="false">t</input>
            <output>temp</output>               <!-- Erneut letzter Rohdatenwert, der schon aufgenommen wurde -->
        </append>

        <rangefilter>
            <input>newsmoothti100</input>
            <input as="min" clear="false">tmaxsmooth</input>
            <input as="max">temp</input>
            <output>incompletesmoothti</output>        <!-- Die Zeiten für neuere Datenpunkt, die wir nur als Vorschau glätten -->
        </rangefilter>

        <!-- Glätten -->

        <loess>
            <input as="x" clear="false">t</input>
            <input as="y" clear="false">x</input>
            <input as="xi" clear="false">newsmoothti</input>
            <input as="d" clear="false">d</input>
            <output as="yi0">newsmoothxi</output>
            <output as="yi1">newsmoothvi</output>
            <output as="yi2">newsmoothai</output>
        </loess>

        <loess>
            <input as="x" clear="false">t</input>
            <input as="y" clear="false">x</input>
            <input as="xi" clear="false">incompletesmoothti</input>
            <input as="d" clear="false">d</input>
            <output as="yi0">incompletesmoothxi</output>
            <output as="yi1">incompletesmoothvi</output>
            <output as="yi2">incompletesmoothai</output>
        </loess>

        <!-- Ergebnisse anhängen -->

        <append>
            <input>newsmoothti</input>
            <output clear="false">tout</output>
        </append>

        <append>
            <input>newsmoothxi</input>
            <output clear="false">xout</output>
        </append>

        <append>
            <input>newsmoothvi</input>
            <output clear="false">vout</output>
        </append>

        <append>
            <input>newsmoothai</input>
            <output clear="false">aout</output>
        </append>

        <!-- Puffer mit finalen Ergebnissen und Vorschau-Ergebnissen -->

        <append>
            <input clear="false">tout</input>
            <input clear="true">incompletesmoothti</input>
            <output clear="true">toutpreview</output>
        </append>

        <append>
            <input clear="false">xout</input>
            <input clear="true">incompletesmoothxi</input>
            <output clear="true">xoutpreview</output>
        </append>

        <append>
            <input clear="false">vout</input>
            <input clear="true">incompletesmoothvi</input>
            <output clear="true">voutpreview</output>
        </append>

        <append>
            <input clear="false">aout</input>
            <input clear="true">incompletesmoothai</input>
            <output clear="true">aoutpreview</output>
        </append>

        <!-- SCORE -->

        <rangefilter>
            <input clear="false">reference_plot_time</input>            <!-- Limit the time datapoints for the score to the reference times within the range of already gathered data -->
            <input as="max" clear="true">tmaxsmooth</input>
            <input clear="false">reference_plot</input>
            <output>scorable_time</output>
            <output>scorable_ref</output>
        </rangefilter>

        <interpolate method="linear">
            <input clear="false" as="x">tout</input>
            <input clear="false" as="y">xout</input>
            <input clear="false" as="xi">scorable_time</input>          <!-- Interpolate data points from the user in the places of the reference curve --> 
            <output>scorable_data</output>
        </interpolate>

        <formula formula="min(max((50-abs([1_]-[2_])+10)/50, 0),1)">      <!-- (50-...+10)/50 sorgt dafür, dass es ab 6 cm Abstand 0 Punkt gibt und bei 1 cm Abstand die volle Punktzahl von 1 Punkt. Min und max verhindern, dass der Wert kleiner 0 oder größer 1 wird. -->
            <input clear="false">scorable_data</input>
            <input clear="false">scorable_ref</input>
            <output>scores</output>                                     <!-- Assign a score in the range of 0 to 1 to each compared point. -->
        </formula>

        <average>
            <input clear="false">scores</input>                         <!-- Final score is the average of individual scores -->
            <output as="average">score</output>
        </average>

        <append>
            <input clear="false">t</input>
            <output>tshow</output>
        </append>

        <append>
            <input clear="false">x</input>
            <output>xshow</output>
        </append>

        <!-- Fill some graphs with empty data to allow plotting if we do not yet have data -->

        <count>
            <input clear="false">toutpreview</input>
            <output>temp</output>
        </count>

        <if less="true">
            <input clear="false">temp</input>
            <input type="value">1</input>
            <input type="value">0</input>
            <output clear="false">toutpreview</output>
        </if>

        <if less="true">
            <input clear="false">temp</input>
            <input type="value">1</input>
            <input type="value">0</input>
            <output clear="false">xoutpreview</output>
        </if>

        <count>
            <input clear="false">tshow</input>
            <output>temp</output>
        </count>

        <if less="true">
            <input clear="false">temp</input>
            <input type="value">1</input>
            <input type="value">0</input>
            <output clear="false">tshow</output>
        </if>

        <if less="true">
            <input clear="false">temp</input>
            <input type="value">1</input>
            <input type="value">0</input>
            <output clear="false">xshow</output>
        </if>

    </analysis>
    <views>
        <view label="Walk the Graph">
            <value label="v-t-Score" size="2" precision="0" unit="%" factor="100">
                <input>score</input>
            </value>
            <button label="(Re)Start">
                <input type="value">-1000</input>
                <output>offset</output>
                <input type="empty" />
                <output>t</output>
                <input type="empty" />
                <output>x</output>
                <input type="empty" />
                <output>tout</output>
                <input type="empty" />
                <output>xout</output>
                <input type="empty" />
                <output>vout</output>
                <input type="empty" />
                <output>aout</output>
            </button>
            <graph label="Velocity-Time-Diagram" partialUpdate="true" labelX="Time" labelY="Velocity" unitX="s" precisionX="0" unitY="cm/s" scaleMinX="fixed" minX="-3" scaleMaxX="fixed" maxX="17" scaleMinY="fixed" minY="-100" scaleMaxY="fixed" maxY="100" aspectRatio="1.6">
                <input axis="x" lineWidth="2">toutpreview</input>
                <input axis="y">voutpreview</input>
                <input axis="x" color="green">reference_plot_time</input>
                <input axis="y">reference_plot_v</input>
            </graph>
            <graph label="Distance-Time-Diagram" partialUpdate="false" labelX="Time" labelY="Distance" unitX="s" precisionX="0" unitY="cm" scaleMinX="fixed" minX="-3" scaleMaxX="fixed" maxX="17" scaleMinY="fixed" minY="0" scaleMaxY="fixed" maxY="700" aspectRatio="1.6">
                <input axis="x" lineWidth="2">toutpreview</input>
                <input axis="y">xoutpreview</input>
                <input axis="x" style="dots" color="white">tshow</input>
                <input axis="y">xshow</input>
                <input axis="x" color="yellow">tpreview</input>
                <input axis="y">preview</input>
            </graph>
            <separator height="1" />
            <depth-gui label="Control" />
        </view>
        <view label="Select Graph">
            <button label="Off">
                <input type="value">0</input>
                <output>plotselect</output>
            </button>
            <button label="Graph 1">
                <input type="value">1</input>
                <output>plotselect</output>
            </button>
            <button label="Graph 2">
                <input type="value">2</input>
                <output>plotselect</output>
            </button>
            <button label="Graph 3">
                <input type="value">3</input>
                <output>plotselect</output>
            </button>
        </view>
    </views>
    <export>
        <set name="Data">
            <data name="t">tout</data>
            <data name="s">xout</data>
            <data name="v">vout</data>
            <data name="a">aout</data>
        </set>
    </export>
</phyphox>