/** * Copyright (c) 2012-2013 Nokia Corporation. All rights reserved. * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation. * Oracle and Java are trademarks or registered trademarks of Oracle and/or its * affiliates. Other product and company names mentioned herein may be trademarks * or trade names of their respective owners. * See LICENSE.TXT for license information. */ package com.nokia.example.racer.sensor; import java.io.IOException; import javax.microedition.io.Connector; import javax.microedition.sensor.ChannelInfo; 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; /* * Implements AccelerationProvider if sensors are supported. */ class AccelerationProviderImpl extends AccelerationProvider implements DataListener { private SensorConnection sensor; private int dataType; /** * AccelerationProviderImpl constructor. Opens connection to the acceleration sensor. * * @throws IOException */ public AccelerationProviderImpl() throws IOException { SensorInfo infos[] = SensorManager.findSensors("acceleration", null); if (infos.length > 0) { dataType = infos[0].getChannelInfos()[0].getDataType(); try { sensor = (SensorConnection) Connector.open(infos[0].getUrl()); sensor.setDataListener(this, 1); } catch (SecurityException se) { throw new IOException("could not open sensor"); } catch (IOException ioe) { throw new IOException("could not open sensor"); } catch (IllegalArgumentException iae) { throw new IOException("could not open sensor"); } } else { throw new IOException("acceleration sensor not found"); } } /** * Closes the sensor connection. */ public void close() { if (sensor != null) { sensor.removeDataListener(); try { sensor.close(); sensor = null; } catch (IOException ioe) { // Nothing to do here. } } } /** * A method that is called when new sensor data has been received. Delegates data forward. * @see javax.microedition.sensor.DataListener#dataReceived(javax.microedition.sensor.SensorConnection, javax.microedition.sensor.Data[], boolean) * * @param sc * @param datas Contains sensor data (x, y, z) * @param bln */ public void dataReceived(SensorConnection sc, Data[] datas, boolean bln) { switch (dataType) { case ChannelInfo.TYPE_DOUBLE: final double[] data0 = datas[0].getDoubleValues(); final double[] data1 = datas[1].getDoubleValues(); final double[] data2 = datas[2].getDoubleValues(); dataReceived(data0[data0.length - 1], data1[data1.length - 1], data2[data2.length - 1]); break; default: break; } } }