package com.cellbots.logger.localServer; import android.hardware.SensorEvent; import android.location.Location; import android.util.Base64; import android.util.Log; import java.util.HashMap; import java.util.Iterator; /** * Class for keeping a snapshot of the current telemetry information. * * @author clchen@google.com (Charles L. Chen) */ public class TelemetrySnapshot { private double mLat; private double mLon; private double mAlt; private HashMap<String, SensorEvent> mSensors; public TelemetrySnapshot() { mLat = 0; mLon = 0; mAlt = 0; mSensors = new HashMap<String, SensorEvent>(); } public void updateLocation(double latitude, double longitude, double altitude) { mLat = latitude; mLon = longitude; mAlt = altitude; } public void updateSensor(SensorEvent event) { mSensors.put(event.sensor.getName(), event); } private Telemetry.Sensor getSensor(String sensorName) { SensorEvent event = mSensors.get(sensorName); Telemetry.Sensor.SensorType sensorType = null; switch (event.sensor.getType()) { case android.hardware.Sensor.TYPE_AMBIENT_TEMPERATURE: sensorType = Telemetry.Sensor.SensorType.AMBIENT_TEMPERATURE; break; case android.hardware.Sensor.TYPE_LIGHT: sensorType = Telemetry.Sensor.SensorType.LIGHT; break; case android.hardware.Sensor.TYPE_PRESSURE: sensorType = Telemetry.Sensor.SensorType.PRESSURE; break; case android.hardware.Sensor.TYPE_RELATIVE_HUMIDITY: sensorType = Telemetry.Sensor.SensorType.RELATIVE_HUMIDITY; break; default: Log.e("Telemetry Error", "Unknown sensor type:" + sensorName); return null; } return Telemetry.Sensor.newBuilder() .setSensorType(sensorType).setValue(event.values[0]).build(); } private Telemetry.ThreeAxisSensor getThreeAxisSensor(String sensorName) { SensorEvent event = mSensors.get(sensorName); Telemetry.ThreeAxisSensor.SensorType sensorType = null; switch (event.sensor.getType()) { case android.hardware.Sensor.TYPE_ACCELEROMETER: sensorType = Telemetry.ThreeAxisSensor.SensorType.ACCELEROMETER; break; case android.hardware.Sensor.TYPE_GRAVITY: sensorType = Telemetry.ThreeAxisSensor.SensorType.GRAVITY; break; case android.hardware.Sensor.TYPE_GYROSCOPE: sensorType = Telemetry.ThreeAxisSensor.SensorType.GYROSCOPE; break; case android.hardware.Sensor.TYPE_LINEAR_ACCELERATION: sensorType = Telemetry.ThreeAxisSensor.SensorType.LINEAR_ACCELERATION; break; case android.hardware.Sensor.TYPE_MAGNETIC_FIELD: sensorType = Telemetry.ThreeAxisSensor.SensorType.MAGNETIC_FIELD; break; case android.hardware.Sensor.TYPE_ORIENTATION: sensorType = Telemetry.ThreeAxisSensor.SensorType.ORIENTATION; break; case android.hardware.Sensor.TYPE_ROTATION_VECTOR: sensorType = Telemetry.ThreeAxisSensor.SensorType.ROTATION_VECTOR; break; default: Log.e("Telemetry Error", "Unknown sensor type:" + sensorName); return null; } return Telemetry.ThreeAxisSensor.newBuilder().setSensorType(sensorType) .setX(event.values[0]).setY(event.values[1]).setZ(event.values[2]).build(); } private Telemetry.Position getPosition() { return Telemetry.Position.newBuilder() .setLatitude((float) mLat) .setLongitude((float) mLon) .setAltitude((float) mAlt).build(); } public String getBase64EncodedProtobufDataPacket() { Telemetry.DataPacket.Builder dataPacket = Telemetry.DataPacket.newBuilder(); dataPacket.setTimestamp(System.currentTimeMillis()); dataPacket.setPosition(getPosition()); Iterator<String> sensorsIt = mSensors.keySet().iterator(); while (sensorsIt.hasNext()) { String sensorName = sensorsIt.next(); SensorEvent event = mSensors.get(sensorName); if (event.values.length == 1) { Telemetry.Sensor s = getSensor(sensorName); if (s != null) { dataPacket.addSensor(s); } } else if (event.values.length == 3) { Telemetry.ThreeAxisSensor tas = getThreeAxisSensor(sensorName); if (tas != null) { dataPacket.addThreeAxisSensor(tas); } } else { Log.e("Telemetry Error", "Unknown sensor type:" + sensorName); return null; } } byte[] dataBytes = dataPacket.build().toByteArray(); return Base64.encodeToString(dataBytes, Base64.DEFAULT); } }