package com.example.es2librarydemo;

import java.util.ArrayList;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import com.ubhave.sensormanager.ESException;
import com.ubhave.sensormanager.ESSensorManager;
import com.ubhave.sensormanager.SensorDataListener;
import com.ubhave.sensormanager.config.SensorConfig;
import com.ubhave.sensormanager.config.sensors.pull.PullSensorConfig;
import com.ubhave.sensormanager.data.SensorData;
import com.ubhave.sensormanager.data.pullsensor.AccelerometerData;
import com.ubhave.sensormanager.data.pullsensor.MicrophoneData;
import com.ubhave.sensormanager.data.pushsensor.ProximityData;
import com.ubhave.sensormanager.sensors.SensorUtils;

/*
 * Example activity to demonstrate some features of the EmotionSense Sensor Libraries
 * More details at: http://emotionsense.org/ , http://emotionsense.org/code.html
 */
public class DemoActivity extends Activity implements SensorDataListener
{
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_demo);

		initialise();

		Button startButton = (Button) findViewById(R.id.start_button);
		startButton.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View arg0)
			{
				onButtonClicked();
			}
		});

		// subscribe to proximity sensor events
		try
		{
			ESSensorManager esSensorManager = ESSensorManager.getSensorManager(this);
			esSensorManager.subscribeToSensorData
			(SensorUtils.SENSOR_TYPE_PROXIMITY, this);
		}
		catch (Exception exp)
		{

		}

	}

	// capture and process accelerometer sensor data
	private double captureSensorData()
	{
		try
		{
			// get sensor manager
			ESSensorManager esSensorManager = ESSensorManager.getSensorManager(DemoActivity.this);

			// set sense window length to 4 seconds
			esSensorManager.setSensorConfig(SensorUtils.SENSOR_TYPE_ACCELEROMETER,
					PullSensorConfig.SENSE_WINDOW_LENGTH_MILLIS, 4000L);

			// capture sensor data
			AccelerometerData aData = (AccelerometerData) esSensorManager
					.getDataFromSensor(SensorUtils.SENSOR_TYPE_ACCELEROMETER);

			// calculate magnitude of acceleration for each of the xyz vectors
			ArrayList<float[]> sensorReadings = aData.getSensorReadings();

			float[] mag = new float[sensorReadings.size()];
			for (int i = 0; i < sensorReadings.size(); i++)
			{
				float[] vector = sensorReadings.get(i);
				mag[i] = (float) Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]);
			}

			// calculate standard deviation
			float stdDev = stdDev(mag);
			return stdDev;

		}
		catch (ESException e)
		{
			e.printStackTrace();
		}

		return 0.0;
	}

	private void onButtonClicked()
	{

		TextView textView = (TextView) findViewById(R.id.status_textView);
		textView.setText("Sensing...");

		// start a background task to capture and process sensor data
		new AsyncTask<Void, Void, Void>()
		{
			float stdDev = 0.0f;
			final TextView textView = (TextView) findViewById(R.id.status_textView);

			@Override
			protected Void doInBackground(Void... params)
			{
				stdDev = (float) captureSensorData();
				return null;
			}

			@Override
			protected void onPostExecute(Void params)
			{
				// udpate UI
				if (stdDev > 2.0)
				{
					textView.setText("Moving");
				}
				else
				{
					textView.setText("Stationary");
				}
			}

		}.execute();
	}

	public static float mean(float[] input)
	{
		float sum = 0.0f;
		for (float i : input)
		{
			sum += i;
		}
		return sum / (float) input.length;
	}

	public static float stdDev(float[] input)
	{
		float means = mean(input);
		float stddev = 0.0f;
		for (int j = 0; j < input.length; j++)
		{
			stddev += (means - input[j]) * (means - input[j]);
		}
		stddev /= (float) input.length;
		stddev = (float) Math.sqrt(stddev);
		return stddev;
	}

	private void initialise()
	{
		// initialise
		ESThread thread = new ESThread(this);
		thread.start();
		try
		{
			Thread.sleep(2000);
		}
		catch (InterruptedException e1)
		{
		}
	}

	@Override
	public void onCrossingLowBatteryThreshold(boolean arg0)
	{
	}

	@Override
	public void onDataSensed(SensorData arg0)
	{
		// on proximity sensor isNear() event, capture and process sensor data
		ProximityData pData = (ProximityData) arg0;
		if (pData.isNear())
		{
			onButtonClicked();
		}
	}
}
