<phyphox version="1.15">
    <title>Accelerometer and Gyroscope</title>
    <category>puck.js</category>
    <description>Read the accelerometer and gyroscope of a puck.js.</description>
    <data-containers>
        <container size="0">accXRaw</container>
        <container size="0">accYRaw</container>
        <container size="0">accZRaw</container>
        <container size="0">accXCal</container>
        <container size="0">accYCal</container>
        <container size="0">accZCal</container>
        <container size="0">gyrXRaw</container>
        <container size="0">gyrYRaw</container>
        <container size="0">gyrZRaw</container>
        <container size="0">gyrXCal</container>
        <container size="0">gyrYCal</container>
        <container size="0">gyrZCal</container>
        <container size="0">t</container>
        <container size="1">t0</container>
        <container size="0">tout</container>
    </data-containers>
    <input>
        <bluetooth uuid="6e400001-b5a3-f393-e0a9-e50e24dcca9e" mode="notification" id="puck.js" mtu="53">

            <!-- SCRIPT FOR PUCK.JS -->
            <!-- Warning: This has to be split into little chunks to stay within the puck's max MTU of 53 byte. -->
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">reset();                                                    </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="hexadecimal">0d</config> <!-- Carriage return -->
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">echo(false);                                                </config>

            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">function directOut(s) {                                     </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">    NRF.updateServices({                                    </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">        "6e400001-b5a3-f393-e0a9-e50e24dcca9e" : {          </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">            "6e400003-b5a3-f393-e0a9-e50e24dcca9e" : {      </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">                value : s,                                  </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">                notify : true,                              </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">    }}});                                                   </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">}                                                           </config>

            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">let t0 = Date.now();                                        </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">Puck.on("accel", function(data) {                           </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">    let t = Math.round(Date.now() - t0);                    </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">    directOut(t                                             </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">         +","+data.acc.x+","+data.acc.y+","+data.acc.z      </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">         +","+data.gyro.x+","+data.gyro.y+","+data.gyro.z); </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">});                                                         </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="string">Puck.accelOn();                                             </config>
            <config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="hexadecimal">0d</config> <!-- Carriage return -->
            <!-- END SCRIPT FOR PUCK.JS -->


            <output char="6e400003-b5a3-f393-e0a9-e50e24dcca9e" conversion="formattedString" separator="," index="0">t</output>
            <output char="6e400003-b5a3-f393-e0a9-e50e24dcca9e" conversion="formattedString" separator="," index="1">accXRaw</output>
            <output char="6e400003-b5a3-f393-e0a9-e50e24dcca9e" conversion="formattedString" separator="," index="2">accYRaw</output>
            <output char="6e400003-b5a3-f393-e0a9-e50e24dcca9e" conversion="formattedString" separator="," index="3">accZRaw</output>
            <output char="6e400003-b5a3-f393-e0a9-e50e24dcca9e" conversion="formattedString" separator="," index="4">gyrXRaw</output>
            <output char="6e400003-b5a3-f393-e0a9-e50e24dcca9e" conversion="formattedString" separator="," index="5">gyrYRaw</output>
            <output char="6e400003-b5a3-f393-e0a9-e50e24dcca9e" conversion="formattedString" separator="," index="6">gyrZRaw</output>
        </bluetooth>
    </input>
    <views>
        <view label="Accelerometer">
            <graph label="Acceleration x" timeOnX="true" linearTime="true" labelX="[[quantity_short_time]]" unitX="[[unit_short_second]]" labelY="[[quantity_short_acceleration]]" unitY="[[unit_short_meter_per_square_second]]" unitYperX="m/s³" partialUpdate="true" color="green">
                <input axis="x">tout</input>
                <input axis="y">accXCal</input>
            </graph>
            <graph label="Acceleration y" timeOnX="true" linearTime="true" labelX="[[quantity_short_time]]" unitX="[[unit_short_second]]" labelY="[[quantity_short_acceleration]]" unitY="[[unit_short_meter_per_square_second]]" unitYperX="m/s³" partialUpdate="true" color="blue">
                <input axis="x">tout</input>
                <input axis="y">accYCal</input>
            </graph>
            <graph label="Acceleration z" timeOnX="true" linearTime="true" labelX="[[quantity_short_time]]" unitX="[[unit_short_second]]" labelY="[[quantity_short_acceleration]]" unitY="[[unit_short_meter_per_square_second]]" unitYperX="m/s³" partialUpdate="true" color="yellow">
                <input axis="x">tout</input>
                <input axis="y">accZCal</input>
            </graph>
        </view>
        <view label="Gyroscope">
            <graph label="Angular velocity x" timeOnX="true" linearTime="true" labelX="[[quantity_short_time]]" unitX="[[unit_short_second]]" labelY="[[quantity_short_angular_velocity]]" unitY="[[unit_short_radian_per_second]]" unitYperX="rad/s²" partialUpdate="true" color="green">
                <input axis="x">tout</input>
                <input axis="y">gyrXCal</input>
            </graph>
            <graph label="Angular velocity y" timeOnX="true" linearTime="true" labelX="[[quantity_short_time]]" unitX="[[unit_short_second]]" labelY="[[quantity_short_angular_velocity]]" unitY="[[unit_short_radian_per_second]]" unitYperX="rad/s²" partialUpdate="true" color="blue">
                <input axis="x">tout</input>
                <input axis="y">gyrYCal</input>
            </graph>
            <graph label="Angular velocity z" timeOnX="true" linearTime="true" labelX="[[quantity_short_time]]" unitX="[[unit_short_second]]" labelY="[[quantity_short_angular_velocity]]" unitY="[[unit_short_radian_per_second]]" unitYperX="rad/s²" partialUpdate="true" color="yellow">
                <input axis="x">tout</input>
                <input axis="y">gyrZCal</input>
            </graph>
        </view>
    </views>
    <analysis>
        <first>
            <input clear="false">t</input>
            <output>t0</output>
        </first>
        <formula formula="([1_]-[2])/1000">
            <input clear="false">t</input>
            <input clear="false">t0</input>
            <output clear="true">tout</output>
        </formula>
        <multiply>
            <input clear="false">accXRaw</input>
            <input type="value">0.00119751</input> <!-- 9.81 / 32768 * 4 -->
            <output clear="true">accXCal</output>
        </multiply>
        <multiply>
            <input clear="false">accYRaw</input>
            <input type="value">0.00119751</input>
            <output clear="true">accYCal</output>
        </multiply>
        <multiply>
            <input clear="false">accZRaw</input>
            <input type="value">0.00119751</input>
            <output clear="true">accZCal</output>
        </multiply>

        <multiply>
            <input clear="false">gyrXRaw</input>
            <input type="value">0.000130495</input> <!-- 245 / 32768 * pi/180 -->
            <output clear="true">gyrXCal</output>
        </multiply>
        <multiply>
            <input clear="false">gyrYRaw</input>
            <input type="value">0.000130495</input>
            <output clear="true">gyrYCal</output>
        </multiply>
        <multiply>
            <input clear="false">gyrZRaw</input>
            <input type="value">0.000130495</input>
            <output clear="true">gyrZCal</output>
        </multiply>
    </analysis>
    <export>
        <set name="Accelerometer and Gyroscope">
            <data name="Time (s)">tout</data>
            <data name="Acceleration x (m/s²)">accXCal</data>
            <data name="Acceleration y (m/s²)">accYCal</data>
            <data name="Acceleration z (m/s²)">accZCal</data>
            <data name="Angular velocity x (rad/s)">gyrXCal</data>
            <data name="Angular velocity y (rad/s)">gyrYCal</data>
            <data name="Angular velocity z (rad/s)">gyrZCal</data>
        </set>
    </export>
</phyphox>
