package tinygsn.model.vsensor; import java.io.Serializable; import java.util.ArrayList; import tinygsn.beans.DataField; import tinygsn.beans.DataTypes; import tinygsn.beans.StreamElement; import tinygsn.model.utils.Parameter; public class GeolocateVirtualSensor extends AbstractVirtualSensor { private DataField[] outputStructure = null; private Double lastLatitudeTL = 0.0; private Double lastLongitudeTL = 0.0; private Double lastLatitudeBR = 0.0; private Double lastLongitudeBR = 0.0; private Long lastLocationTime = 0L; private String LOGTAG = "GeolocateVirtualSensor"; @Override public boolean initialize() { return true; } @Override public void dispose() { } @Override public void dataAvailable(String inputStreamName, StreamElement streamElement) { streamElement = super.anonymizeData(inputStreamName, streamElement); if (inputStreamName.endsWith("AndroidGPSWrapper")) { lastLatitudeTL = (Double) streamElement.getData("latitudeTopLeft"); lastLongitudeTL = (Double) streamElement.getData("longitudeTopLeft"); lastLatitudeBR = (Double) streamElement.getData("latitudeBottomRight"); lastLongitudeBR = (Double) streamElement.getData("longitudeBottomRight"); lastLocationTime = streamElement.getTimeStamp(); } else { Serializable[] data = new Serializable[outputStructure.length]; for (int i=0;i< data.length-5;i++){ data[i] = streamElement.getData()[i]; } data[data.length-5] = lastLatitudeTL; data[data.length-4] = lastLongitudeTL; data[data.length-3] = lastLatitudeBR; data[data.length-2] = lastLongitudeBR; data[data.length-1] = lastLocationTime; dataProduced(new StreamElement(outputStructure, data, streamElement.getTimeStamp())); } } @Override public ArrayList<Parameter> getParameters() { ArrayList<Parameter> list = new ArrayList<>(); return list; } @Override protected void initParameter(String key, String value) { } @Override public DataField[] getOutputStructure(DataField[] in) { for (DataField df : in){ if (df.getName().startsWith("latitude") || df.getName().startsWith("longitude")){ return outputStructure; } } outputStructure = new DataField[in.length + 5]; for(int i=0;i<in.length;i++){ outputStructure[i] = in[i]; } outputStructure[in.length] = new DataField("latitudeTopLeft", DataTypes.DOUBLE); outputStructure[in.length+1] = new DataField("longitudeTopLeft", DataTypes.DOUBLE); outputStructure[in.length+2] = new DataField("latitudeBottomRight", DataTypes.DOUBLE); outputStructure[in.length+3] = new DataField("longitudeBottomRight", DataTypes.DOUBLE); outputStructure[in.length+4] = new DataField("locationTime", DataTypes.BIGINT); return outputStructure; } }