#include "FastIMU.h"
#include <Wire.h>

#include "SoundData.h"
#include <MusicDefinitions.h>
#include "XT_DAC_Audio.h"

#define IMU_ADDRESS 0x68
MPU6500 IMU;

calData calib = { 0 };  //Calibration data
AccelData accelData;    //Sensor data
GyroData gyroData;
MagData magData;

//Variables for detecting movement.
bool isMoving;
double speedThreshold = 5; //Speed determines the sensitivity of the shake detection
bool enableAudio;

//Importing the sound data
XT_Wav_Class Sound(audioRaw);
XT_DAC_Audio_Class DacAudio(25, 0);

void setup() {
  Wire.begin();
  Wire.setClock(400000);  //400khz clock
  Serial.begin(115200);
  DacAudio.Play(&Sound);
}

//Plays the sound
void PlaySound() {
  Serial.println("Sound");
  DacAudio.FillBuffer();
  if (Sound.Playing == false)
    DacAudio.Play(&Sound);
  else {
    enableAudio = false;
  }
}

//Checks if the Accelerometer detects high acceleration based on the speedTreshold.
void CheckSuddenChange() {
  IMU.update();
  IMU.getAccel(&accelData);

  if (!isMoving) {
    if (accelData.accelX > speedThreshold || accelData.accelX < -speedThreshold) {
      isMoving = true;
    }
    if (accelData.accelY > speedThreshold || accelData.accelY < -speedThreshold) {
      isMoving = true;
    }
    if (accelData.accelZ > speedThreshold || accelData.accelZ < -speedThreshold) {
      isMoving = true;
    }
  } else {
    if (!accelData.accelX < speedThreshold && !accelData.accelX > -speedThreshold) {
      isMoving = false;
      enableAudio = true;
    }
    if (!accelData.accelY < speedThreshold && !accelData.accelY > -speedThreshold) {
      isMoving = false;
      enableAudio = true;
    }
    if (!accelData.accelZ < speedThreshold && !accelData.accelZ > -speedThreshold) {
      isMoving = false;
      enableAudio = true;
    }
  }
}

void loop() {
  CheckSuddenChange();
  if (enableAudio) {
    PlaySound();
  }
}
