Android Open Source - BleSensorTag Ble Sensor Manager






From Project

Back to project page BleSensorTag.

License

The source code is released under:

MIT License

If you think the Android project BleSensorTag listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package sample.ble.sensortag.fusion.sensors;
//from  ww  w  . ja va2 s. co  m
import android.content.Context;
import android.util.Log;
import android.util.SparseArray;
import sample.ble.sensortag.ble.BleManager;
import sample.ble.sensortag.ble.BleServiceListener;
import sample.ble.sensortag.sensor.TiRangeSensors;
import sample.ble.sensortag.sensor.TiSensor;
import sample.ble.sensortag.sensor.TiSensors;

public class BleSensorManager extends ISensorManager implements BleServiceListener {
    private static final String TAG = BleSensorManager.class.getSimpleName();

    // experimentally selected value
    private static final double SENSOR_CALIBRATION = 75f;
    private static final double SENSOR_FUSION_COEFF = -180f / Math.PI;
    private final double[] fusedOrientation = new double[3];

    private final Context context;
    private final BleManager bleManager = new BleManager();

    private final String deviceAddress;
    private final SparseArray<BleSensor> sensors = new SparseArray<BleSensor>();

    private boolean isConnected = false;

    public BleSensorManager(Context context, String deviceAddress) {
        this.context = context;
        this.deviceAddress = deviceAddress;
    }

    @SuppressWarnings("unchecked")
    @Override
    public ISensor getSensor(int sensorType) {
        if (sensors.get(sensorType) != null)
            return sensors.get(sensorType);

        final TiSensor<?> sensor = TiSensors.getSensor(BleSensor.getSensorUuid(sensorType));
        if (sensor instanceof TiRangeSensors<?, ?>) {
            final BleSensor result = new BleSensor((TiRangeSensors<float[], Float>) sensor);
            return result;
        }
        throw new IllegalStateException();
    }

    @Override
    public void enable() {
        Log.d(TAG, "enable");
        bleManager.setServiceListener(BleSensorManager.this);
        if (!bleManager.initialize(context)) {
            Log.e(TAG, "Unable to initialize Bluetooth");
            throw new SensorManagerException();
        }
        // Automatically connects to the device upon successful start-up initialization.
        Log.d(TAG, "connecting: " + deviceAddress);
        bleManager.connect(context, deviceAddress);
    }

    @Override
    public void disable() {
        Log.d(TAG, "disable");
        isConnected = false;
        bleManager.disconnect();
        bleManager.close();
    }

    @Override
    public void registerSensor(int sensorType) {
        final BleSensor sensor = (BleSensor) getSensor(sensorType);
        sensors.put(sensorType, sensor);
        enableTiSensor(sensorType, true);
    }

    @Override
    public void unregisterSensor(int sensorType) {
        enableTiSensor(sensorType, false);
        sensors.remove(sensorType);
    }

    @Override
    public double[] patchSensorFusion(float[] values) {
        fusedOrientation[0] = values[1] * SENSOR_FUSION_COEFF;
        fusedOrientation[1] = values[2] * SENSOR_FUSION_COEFF;
        fusedOrientation[2] = values[0] * SENSOR_FUSION_COEFF;
        return fusedOrientation;
    }

    @Override
    public void onConnected() {
        Log.d(TAG, "connected");
    }

    @Override
    public void onDisconnected() {
        Log.d(TAG, "disconnected");
    }

    @Override
    public void onServiceDiscovered() {
        isConnected = true;
        Log.d(TAG, "services discovered");
        final int count = sensors.size();
        for (int i=0; i<count; ++i) {
            final BleSensor sensor = sensors.valueAt(i);
            enableTiSensor(sensor.getType(), true);
        }
    }

    @Override
    public void onDataAvailable(String serviceUuid, String characteristicUUid, String text, byte[] data) {
        if (listener == null)
            return;

        @SuppressWarnings("unchecked")
        final TiRangeSensors<float[], Float> sensor =
                (TiRangeSensors<float[], Float>) TiSensors.getSensor(serviceUuid);

        final int sensorType = BleSensor.getSensorType(serviceUuid);
        final float[] values = sensor.getData();
        calibrate(values);
        listener.onSensorChanged(sensorType, values);
    }

    private void enableTiSensor(int sensorType, boolean enable) {
        if (bleManager.getState() != BleManager.STATE_CONNECTED)
            return;
        if (!isConnected)
            return;

        final BleSensor sensor = (BleSensor) getSensor(sensorType);
        final TiRangeSensors<?, ?> tiSensors = sensor.getTiSensor();
        tiSensors.setPeriod(tiSensors.getMinPeriod());
        bleManager.enableSensor(tiSensors, enable);
        if (enable)
            bleManager.updateSensor(tiSensors);
        Log.d(TAG, (enable ? "enable" : "disable") + " sensor: " + tiSensors.getName());
    }

    private static void calibrate(float[] values) {
        values[0] /= SENSOR_CALIBRATION;
        values[1] /= SENSOR_CALIBRATION;
        values[2] /= SENSOR_CALIBRATION;
    }
}




Java Source Code List

sample.ble.sensortag.BleSensorsRecordService.java
sample.ble.sensortag.BleServiceBindingActivity.java
sample.ble.sensortag.BleService.java
sample.ble.sensortag.BluetoothStateReciever.java
sample.ble.sensortag.DeviceScanActivity.java
sample.ble.sensortag.DeviceServicesActivity.java
sample.ble.sensortag.adapters.BleDevicesAdapter.java
sample.ble.sensortag.adapters.TiServicesAdapter.java
sample.ble.sensortag.ble.BleActionsReceiver.java
sample.ble.sensortag.ble.BleDevicesScanner.java
sample.ble.sensortag.ble.BleExecutorListener.java
sample.ble.sensortag.ble.BleGattExecutor.java
sample.ble.sensortag.ble.BleManager.java
sample.ble.sensortag.ble.BleServiceListener.java
sample.ble.sensortag.ble.BleUtils.java
sample.ble.sensortag.config.AppConfig.java
sample.ble.sensortag.dialogs.AppDialog.java
sample.ble.sensortag.dialogs.EnableBluetoothDialog.java
sample.ble.sensortag.dialogs.ErrorDialog.java
sample.ble.sensortag.fusion.SensorFusionActivity.java
sample.ble.sensortag.fusion.SensorFusionFragment.java
sample.ble.sensortag.fusion.engine.SensorFusionEngine.java
sample.ble.sensortag.fusion.engine.SensorFusionHelper.java
sample.ble.sensortag.fusion.sensors.AndroidSensorManager.java
sample.ble.sensortag.fusion.sensors.AndroidSensor.java
sample.ble.sensortag.fusion.sensors.BleSensorManager.java
sample.ble.sensortag.fusion.sensors.BleSensor.java
sample.ble.sensortag.fusion.sensors.ISensorManager.java
sample.ble.sensortag.fusion.sensors.ISensor.java
sample.ble.sensortag.fusion.sensors.SensorManagerException.java
sample.ble.sensortag.gl.GLSurfaceView.java
sample.ble.sensortag.gl.GlFragment.java
sample.ble.sensortag.gl.ModelLoader.java
sample.ble.sensortag.gl.ModelRenderer.java
sample.ble.sensortag.info.TiDeviceInfoSerivce.java
sample.ble.sensortag.info.TiGapSerivce.java
sample.ble.sensortag.info.TiGattSerivce.java
sample.ble.sensortag.info.TiInfoService.java
sample.ble.sensortag.info.TiInfoServices.java
sample.ble.sensortag.sensor.TiAccelerometerSensor.java
sample.ble.sensortag.sensor.TiGyroscopeSensor.java
sample.ble.sensortag.sensor.TiHumiditySensor.java
sample.ble.sensortag.sensor.TiKeysSensor.java
sample.ble.sensortag.sensor.TiMagnetometerSensor.java
sample.ble.sensortag.sensor.TiPeriodicalSensor.java
sample.ble.sensortag.sensor.TiPressureSensor.java
sample.ble.sensortag.sensor.TiRangeSensors.java
sample.ble.sensortag.sensor.TiSensorUtils.java
sample.ble.sensortag.sensor.TiSensor.java
sample.ble.sensortag.sensor.TiSensors.java
sample.ble.sensortag.sensor.TiTemperatureSensor.java
sample.ble.sensortag.sensor.TiTestSensor.java