Code:
<phyphox xmlns="https://phyphox.org/xml" version="1.18">
<title>Accelerometer and Gyroscope w/angle</title>
<category>puck.js</category>
<color>green</color>
<description>Read the accelerometer and gyroscope of a puck with angle report.js.</description>
<data-containers>
<container size="0">preAngle</container>
<container size="0">angle</container>
<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>t0</container>
<container size="0">tout</container>
</data-containers>
<input>
<bluetooth id="puck.js" uuid="6e400001-b5a3-f393-e0a9-e50e24dcca9e" mtu="53" mode="notification">
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e">reset(); </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="hexadecimal">0d</config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e">echo(false); </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e">function directOut(s) { </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e"> NRF.updateServices({ </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e"> "6e400001-b5a3-f393-e0a9-e50e24dcca9e" : { </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e"> "6e400003-b5a3-f393-e0a9-e50e24dcca9e" : { </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e"> value : s, </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e"> notify : true, </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e"> }}}); </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e">} </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e">let t0 = Date.now(); </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e">Puck.on("accel", function(data) { </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e"> let t = Math.round(Date.now() - t0); </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e"> directOut(t </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e"> +","+data.acc.x+","+data.acc.y+","+data.acc.z </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e"> +","+data.gyro.x+","+data.gyro.y+","+data.gyro.z); </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e">}); </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e">Puck.accelOn(); </config>
<config char="6e400002-b5a3-f393-e0a9-e50e24dcca9e" conversion="hexadecimal">0d</config>
<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>
<analysis>
<first>
<input as="value" keep="true">t</input>
<output as="first">t0</output>
</first>
<formula formula="([1_]-[2])/1000">
<input keep="true">t</input>
<input keep="true">t0</input>
<output>tout</output>
</formula>
<multiply>
<input keep="true">accXRaw</input>
<input type="value">0.00119751</input>
<output>accXCal</output>
</multiply>
<divide>
<input keep="true">accXCal</input>
<input type="value">9.81</input>
<output>preAngle</output>
</divide>
<asin>
<input as="value">preAngle</input>
<output>angle</output>
</asin>
<multiply>
<input keep="true">accYRaw</input>
<input type="value">0.00119751</input>
<output>accYCal</output>
</multiply>
<multiply>
<input keep="true">accZRaw</input>
<input type="value">0.00119751</input>
<output>accZCal</output>
</multiply>
<multiply>
<input keep="true">gyrXRaw</input>
<input type="value">0.000130495</input>
<output>gyrXCal</output>
</multiply>
<multiply>
<input keep="true">gyrYRaw</input>
<input type="value">0.000130495</input>
<output>gyrYCal</output>
</multiply>
<multiply>
<input keep="true">gyrZRaw</input>
<input type="value">0.000130495</input>
<output>gyrZCal</output>
</multiply>
</analysis>
<views>
<view label="Accelerometer">
<value label="Inclination (X-axis)">
<input>angle</input>
</value>
<graph label="Acceleration x" partialUpdate="true" labelX="[[quantity_short_time]]" labelY="[[quantity_short_acceleration]]" unitX="[[unit_short_second]]" unitY="[[unit_short_meter_per_square_second]]" unitYperX="m/s³" timeOnX="true" color="green">
<input axis="x">tout</input>
<input axis="y">accXCal</input>
</graph>
<graph label="Acceleration y" partialUpdate="true" labelX="[[quantity_short_time]]" labelY="[[quantity_short_acceleration]]" unitX="[[unit_short_second]]" unitY="[[unit_short_meter_per_square_second]]" unitYperX="m/s³" timeOnX="true" color="blue">
<input axis="x">tout</input>
<input axis="y">accYCal</input>
</graph>
<graph label="Acceleration z" partialUpdate="true" labelX="[[quantity_short_time]]" labelY="[[quantity_short_acceleration]]" unitX="[[unit_short_second]]" unitY="[[unit_short_meter_per_square_second]]" unitYperX="m/s³" timeOnX="true" color="yellow">
<input axis="x">tout</input>
<input axis="y">accZCal</input>
</graph>
</view>
<view label="Gyroscope">
<graph label="Angular velocity x" partialUpdate="true" labelX="[[quantity_short_time]]" labelY="[[quantity_short_angular_velocity]]" unitX="[[unit_short_second]]" unitY="[[unit_short_radian_per_second]]" unitYperX="rad/s²" timeOnX="true" color="green">
<input axis="x">tout</input>
<input axis="y">gyrXCal</input>
</graph>
<graph label="Angular velocity y" partialUpdate="true" labelX="[[quantity_short_time]]" labelY="[[quantity_short_angular_velocity]]" unitX="[[unit_short_second]]" unitY="[[unit_short_radian_per_second]]" unitYperX="rad/s²" timeOnX="true" color="blue">
<input axis="x">tout</input>
<input axis="y">gyrYCal</input>
</graph>
<graph label="Angular velocity z" partialUpdate="true" labelX="[[quantity_short_time]]" labelY="[[quantity_short_angular_velocity]]" unitX="[[unit_short_second]]" unitY="[[unit_short_radian_per_second]]" unitYperX="rad/s²" timeOnX="true" color="yellow">
<input axis="x">tout</input>
<input axis="y">gyrZCal</input>
</graph>
</view>
<view label="Angle (x)">
<value label="Inclination (x-axis)">
<input>angle</input>
</value>
</view>
</views>
<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>