/**
 *
 * @author Peter Miklosko
 * @homepage http://www.peterscorner.co.uk
 */

import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.sensor.Data;
import javax.microedition.sensor.DataListener;
import javax.microedition.sensor.SensorConnection;
import javax.microedition.sensor.SensorInfo;
import javax.microedition.sensor.SensorManager;

public class SensorData implements DataListener
{
    private SensorConnection sensor;
    private String sensorURL;
    private int x, y, z;
    
    public SensorData()
    {
        sensorURL = getSensorURL();
        x = 0; y = 0; z = 0;
        try
        {
            sensor = (SensorConnection) Connector.open(sensorURL);
            sensor.setDataListener(this, 10);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }        
    }
    
    // Get coordinates
    public int getX(){ synchronized(this) { return x;}}
    public int getY(){ synchronized(this) { return y;}}
    public int getZ(){ synchronized(this) { return z;}}
    
    // Data listener for sensor
    public void dataReceived(SensorConnection sensor, Data[] data, boolean isDataLost)
    {
        synchronized(this)
        {
            for(int i = 0; i < data.length; i++)
            {
                if(data[i].getChannelInfo().getName().compareTo("axis_x") == 0)
                {
                    x = getAverage(data[i].getIntValues());
                }
                else if(data[i].getChannelInfo().getName().compareTo("axis_y") == 0)
                {
                    y = getAverage(data[i].getIntValues());
                }
                else if(data[i].getChannelInfo().getName().compareTo("axis_z") == 0)
                {
                    z = getAverage(data[i].getIntValues());
                }                
            }           
        }
        
    }
    
    private int getAverage(int[] values)
    {
        int average = 0;
        
        for(int i = 0; i < values.length; i++)
        {
            average += values[i];
        }
        return average/values.length;
    }
    
    // Close connection when MIDlet will be close down
    public void closeConnection()
    {
        try
        {
            sensor.close();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            System.out.println("Sensor connection closed");
        }
    }

    // Get URL of sensor on the mobile phone
    private String getSensorURL()
    {
        SensorInfo[] si = 
        	SensorManager.findSensors("acceleration", 
        				SensorInfo.CONTEXT_TYPE_USER);
        							
        String URL = new String();
        for(int i=0; i < si.length; i++)
        {
            SensorInfo s = si[i];
            URL = s.getUrl();
        }
        return URL;
    }
}

