/* Anmerkungen
 *  Arduino-Messbox startet mit der Messung beim einschalten, nicht wenn das Experiment gestartet wird
 *  Beim Pausieren des Experimentes läuft die Messzeit weiter
 *  Offsets im Auge behalten/ feinschliff geben
 */

#include <Arduino_LSM9DS1.h>
#include <phyphoxBle.h>


//Variablen
float timerOffset = 0;
float timer1 = 0;
float timer2 = 0;
float accx, accy, accz, acc;
float accx1, accy1, accz1, acc1;

void setup() {
   
   PhyphoxBLE::start("Phyduino");
   

 //Experiment
 PhyphoxBleExperiment accleration;

 accleration.setTitle("Beschleunigungsmessung");
 accleration.setCategory("Arduino Experiment");
 accleration.setDescription("Misst die Beschleunigungen in x-, y-, z-Richtung, sowie die Gesamtbeschleunigung und trägt diese in vier Graphen über der Zeit auf");

 //View
 PhyphoxBleExperiment::View firstView;
 firstView.setLabel("FirstView");

 //Graph
 PhyphoxBleExperiment::Graph firstGraph;  /*Erzeugt einen Graphen, der die Beschleunigung über die Zeit plottet*/
 firstGraph.setLabel("Beschleunigung");
 firstGraph.setUnitX("s");
 firstGraph.setUnitY("m/s²");
 firstGraph.setLabelX("time");
 firstGraph.setLabelY("accleration");

 firstGraph.setChannel(4,5); 
 /*Bestimmt, welche Datensätze geplottet werden
 *erster Parameter ist die x-Achse
 *zweiter Paratmeter ist die y-Achse
 */

 //Zweiter Graph
 PhyphoxBleExperiment::Graph secondGraph;  /*Erzeugt einen Graphen, der die Beschleunigung in x-Richtung über die Zeit plottet*/
 secondGraph.setLabel("Beschleunigung x-Achse");
 secondGraph.setUnitX("s");
 secondGraph.setUnitY("m/s²");
 secondGraph.setLabelX("time");
 secondGraph.setLabelY("accleration");

 secondGraph.setChannel(4,1); 
 /*Bestimmt, welche Datensätze geplottet werden
 *erster Parameter ist die x-Achse
 *zweiter Paratmeter ist die y-Achse
 */

 //Dritter Graph
 PhyphoxBleExperiment::Graph thirdGraph;  /*Erzeugt einen Graphen, der die Beschleunigung in y-Richtung über die Zeit plottet*/
 thirdGraph.setLabel("Beschleunigung y-Achse");
 thirdGraph.setUnitX("s");
 thirdGraph.setUnitY("m/s²");
 thirdGraph.setLabelX("time");
 thirdGraph.setLabelY("accleration");

 thirdGraph.setChannel(4,2); 
 /*Bestimmt, welche Datensätze geplottet werden
 *erster Parameter ist die x-Achse
 *zweiter Paratmeter ist die y-Achse
 */

//Vierter Graph
 PhyphoxBleExperiment::Graph fourthGraph;  /*Erzeugt einen Graphen, der die Beschleunigung in z-Richtung über die Zeit plottet*/
 fourthGraph.setLabel("Beschleunigung z-Achse");
 fourthGraph.setUnitX("s");
 fourthGraph.setUnitY("m/s²");
 fourthGraph.setLabelX("time");
 fourthGraph.setLabelY("accleration");

 fourthGraph.setChannel(4,3); 
 /*Bestimmt, welche Datensätze geplottet werden
 *erster Parameter ist die x-Achse
 *zweiter Paratmeter ist die y-Achse
 */

 firstView.addElement(firstGraph); //fügt den 1. Graphen zum View hinzu
 firstView.addElement(secondGraph); //fügt den 2. Graphen zum View hinzu
 firstView.addElement(thirdGraph); //fügt den 3. Graphen zum View hinzu
 firstView.addElement(fourthGraph); //fügt den 4. Graphen zum View hinzu
 accleration.addView(firstView); //fügt "View" dem Experiment "accleration" hinzu
 PhyphoxBLE::addExperiment(accleration); //fügt das Experiment "accleration" dem Sever hinzu

if (!IMU.begin()) {
while (1);
}

pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
 
      if (timerOffset == 0) {
        timerOffset = millis(); }
        else if (timerOffset != 0) {
        timer1 = millis() - (float)timerOffset;
        // von ms in s umrechnen
        timer2 = timer1 / 1000;
        }
      if (IMU.accelerationAvailable()) {
       IMU.readAcceleration(accx, accy, accz);  
       accx1= accx*9.81+0.415;
       accy1=accy*9.81+0.165;
       accz1=accz*9.81+0.350;
       acc1 = sqrt(pow(accx1, 2) + pow (accy1, 2) + pow(accz1, 2));
       // Zeit und Beschleunigungen an Phyphox senden
       PhyphoxBLE::write(accx1, accy1, accz1, timer2, acc1);
       }
}