Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: feature to see altitude from pressure added in Barometer #1924

Merged
merged 1 commit into from
Aug 15, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ private RealmObject getObject(String objectType, String[] data, long time, long
returnObject = new LuxData(time, block, Float.valueOf(data[2]), Double.valueOf(data[3]), Double.valueOf(data[4]));
break;
case "Barometer":
returnObject = new BaroData(time, block, Float.valueOf(data[2]), Double.valueOf(data[3]), Double.valueOf(data[4]));
returnObject = new BaroData(time, block, Float.valueOf(data[2]), Float.valueOf(data[3]), Double.valueOf(data[4]), Double.valueOf(data[5]));
break;
case "Accelerometer":
returnObject = new AccelerometerData(time, block, Float.valueOf(data[2]), Float.valueOf(data[3]), Float.valueOf(data[4]), Double.valueOf(data[5]), Double.valueOf(data[6]));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ private void populateMapData(SensorDataBlock block) {
JSONObject i = new JSONObject();
i.put("date", CSVLogger.FILE_NAME_FORMAT.format(d.getTime()));
i.put("data", d.getBaro());
i.put("altitude", d.getAltitude());
i.put("lon", d.getLon());
i.put("lat", d.getLat());
if (d.getLat() != 0.0 && d.getLon() != 0.0) array.put(i);
Expand Down
112 changes: 89 additions & 23 deletions app/src/main/java/io/pslab/fragment/BaroMeterDataFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,15 @@
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
Expand Down Expand Up @@ -87,21 +89,26 @@ private enum BARO_SENSOR {INBUILT_SENSOR, BMP180_SENSOR}
LineChart mChart;
@BindView(R.id.baro_meter)
PointerSpeedometer baroMeter;
@BindView(R.id.alti_value)
TextView altiValue;

private Timer graphTimer;
private SensorManager sensorManager;
private Sensor sensor;
private long startTime, block;
private ArrayList<Entry> entries;
private ArrayList<Entry> pressureEntries;
private ArrayList<Entry> altitudeEntries;
private ArrayList<BaroData> recordedBaroArray;
private BaroData sensorData;
private float currentMin = 2;
private float currentMax = 0.5f;
private YAxis y;
private YAxis y2;
private Unbinder unbinder;
private long previousTimeElapsed = (System.currentTimeMillis() - startTime) / updatePeriod;
private BarometerActivity baroSensor;
private View rootView;
private String csvHeader = "Timestamp,DateTime,Pressure,Altitude,Latitude,Longitude";

public static BaroMeterDataFragment newInstance() {
return new BaroMeterDataFragment();
Expand All @@ -117,7 +124,8 @@ public static void setParameters(float highLimit, int updatePeriod, String type)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startTime = System.currentTimeMillis();
entries = new ArrayList<>();
pressureEntries = new ArrayList<>();
altitudeEntries = new ArrayList<>();
baroSensor = (BarometerActivity) getActivity();
}

Expand Down Expand Up @@ -149,7 +157,8 @@ public void onResume() {
count = 0;
currentMin = 2;
currentMax = 0.5f;
entries.clear();
pressureEntries.clear();
altitudeEntries.clear();
mChart.clear();
mChart.invalidate();
initiateBaroSensor(sensorType);
Expand Down Expand Up @@ -181,23 +190,37 @@ private void plotAllRecordedData() {
currentMin = d.getBaro();
}
Entry entry = new Entry((float) (d.getTime() - d.getBlock()) / 1000, d.getBaro());
entries.add(entry);
pressureEntries.add(entry);
altitudeEntries.add(new Entry((float) (d.getTime() - d.getBlock()) / 1000, d.getAltitude()));
altiValue.setText(String.format(Locale.getDefault(), PSLabSensor.BAROMETER_DATA_FORMAT, d.getAltitude()));
baroMeter.setWithTremble(false);
baroMeter.setSpeedAt(d.getBaro());
sum += entry.getY();
}
y.setAxisMaximum(currentMax);
y.setAxisMinimum(currentMin);
y.setLabelCount(10);
y2.setAxisMaximum(getAltitude(currentMax));
y2.setAxisMinimum(getAltitude(currentMin));
y2.setLabelCount(10);
statMax.setText(String.format(Locale.getDefault(), PSLabSensor.BAROMETER_DATA_FORMAT, currentMax));
statMin.setText(String.format(Locale.getDefault(), PSLabSensor.BAROMETER_DATA_FORMAT, currentMin));
statMean.setText(String.format(Locale.getDefault(), PSLabSensor.BAROMETER_DATA_FORMAT, (sum / recordedBaroArray.size())));

LineDataSet dataSet = new LineDataSet(entries, getString(R.string.baro_unit));
List<ILineDataSet> dataSets = new ArrayList<>();
LineDataSet dataSet = new LineDataSet(pressureEntries, getString(R.string.baro_unit));
dataSet.setDrawCircles(false);
dataSet.setDrawValues(false);
dataSet.setLineWidth(2);
LineData data = new LineData(dataSet);
dataSets.add(dataSet);

dataSet = new LineDataSet(altitudeEntries, getString(R.string.alti_unit));
dataSet.setDrawCircles(false);
dataSet.setDrawValues(false);
dataSet.setLineWidth(2);
dataSet.setColor(Color.YELLOW);
dataSets.add(dataSet);
LineData data = new LineData(dataSets);

mChart.setData(data);
mChart.notifyDataSetChanged();
Expand Down Expand Up @@ -251,20 +274,34 @@ public void run() {
y.setAxisMaximum(currentMax);
y.setAxisMinimum(currentMin);
y.setLabelCount(10);
y2.setAxisMaximum(getAltitude(currentMax));
y2.setAxisMinimum(getAltitude(currentMin));
y2.setLabelCount(10);
baroMeter.setWithTremble(false);
baroMeter.setSpeedAt(d.getBaro());

Entry entry = new Entry((float) (d.getTime() - d.getBlock()) / 1000, d.getBaro());
entries.add(entry);
pressureEntries.add(entry);
altitudeEntries.add(new Entry((float) (d.getTime() - d.getBlock()) / 1000, d.getAltitude()));
count++;
sum += entry.getY();
statMean.setText(DataFormatter.formatDouble((sum / count), PSLabSensor.BAROMETER_DATA_FORMAT));
altiValue.setText(String.format(Locale.getDefault(), PSLabSensor.BAROMETER_DATA_FORMAT, d.getAltitude()));

LineDataSet dataSet = new LineDataSet(entries, getString(R.string.baro_unit));
List<ILineDataSet> dataSets = new ArrayList<>();
LineDataSet dataSet = new LineDataSet(pressureEntries, getString(R.string.baro_unit));
dataSet.setDrawCircles(false);
dataSet.setDrawValues(false);
dataSet.setLineWidth(2);
LineData data = new LineData(dataSet);
dataSets.add(dataSet);

dataSet = new LineDataSet(altitudeEntries, getString(R.string.alti_unit));
dataSet.setDrawCircles(false);
dataSet.setDrawValues(false);
dataSet.setLineWidth(2);
dataSet.setColor(Color.YELLOW);
dataSets.add(dataSet);
LineData data = new LineData(dataSets);

mChart.setData(data);
mChart.notifyDataSetChanged();
Expand Down Expand Up @@ -309,7 +346,7 @@ public void stopData() {
graphTimer = null;
}
recordedBaroArray.clear();
entries.clear();
pressureEntries.clear();
plotAllRecordedData();
baroSensor.startedPlay = false;
baroSensor.playingData = false;
Expand All @@ -320,11 +357,12 @@ public void stopData() {
public void saveGraph() {
baroSensor.csvLogger.prepareLogFile();
baroSensor.csvLogger.writeMetaData(getResources().getString(R.string.baro_meter));
baroSensor.csvLogger.writeCSVFile("Timestamp,DateTime,Readings,Latitude,Longitude");
baroSensor.csvLogger.writeCSVFile(csvHeader);
for (BaroData baroData : baroSensor.recordedBaroData) {
baroSensor.csvLogger.writeCSVFile(baroData.getTime() + ","
+ CSVLogger.FILE_NAME_FORMAT.format(new Date(baroData.getTime())) + ","
+ baroData.getBaro() + ","
+ baroData.getAltitude() + ","
+ baroData.getLat() + ","
+ baroData.getLon());
}
Expand All @@ -343,7 +381,7 @@ private void setupInstruments() {
baroMeter.setMaxSpeed(PreferenceManager.getDefaultSharedPreferences(getActivity()).getFloat(baroSensor.BAROMETER_LIMIT, 2));
XAxis x = mChart.getXAxis();
this.y = mChart.getAxisLeft();
YAxis y2 = mChart.getAxisRight();
this.y2 = mChart.getAxisRight();

mChart.setTouchEnabled(true);
mChart.setHighlightPerDragEnabled(true);
Expand Down Expand Up @@ -372,8 +410,11 @@ private void setupInstruments() {
y.setDrawGridLines(true);
y.setLabelCount(10);

y2.setDrawGridLines(false);
y2.setMaxWidth(0);
y2.setTextColor(Color.WHITE);
y2.setAxisMinimum(getAltitude(currentMin));
y2.setAxisMaximum(getAltitude(currentMax));
y2.setDrawGridLines(true);
y2.setLabelCount(10);
}

@Override
Expand Down Expand Up @@ -416,7 +457,7 @@ private void writeLogToFile(long timestamp, float sensorReading) {
if (getActivity() != null && baroSensor.isRecording) {
if (baroSensor.writeHeaderToFile) {
baroSensor.csvLogger.prepareLogFile();
baroSensor.csvLogger.writeCSVFile("Timestamp,DateTime,Readings,Latitude,Longitude");
baroSensor.csvLogger.writeCSVFile(csvHeader);
block = timestamp;
baroSensor.recordSensorDataBlockID(new SensorDataBlock(timestamp, baroSensor.getSensorName()));
baroSensor.writeHeaderToFile = !baroSensor.writeHeaderToFile;
Expand All @@ -425,13 +466,13 @@ private void writeLogToFile(long timestamp, float sensorReading) {
String dateTime = CSVLogger.FILE_NAME_FORMAT.format(new Date(timestamp));
Location location = baroSensor.gpsLogger.getDeviceLocation();
baroSensor.csvLogger.writeCSVFile(timestamp + "," + dateTime + ","
+ sensorReading + "," + location.getLatitude() + "," + location.getLongitude());
sensorData = new BaroData(timestamp, block, baroValue, location.getLatitude(), location.getLongitude());
+ sensorReading + "," + getAltitude(sensorReading) + "," + location.getLatitude() + "," + location.getLongitude());
sensorData = new BaroData(timestamp, block, baroValue, getAltitude(baroValue), location.getLatitude(), location.getLongitude());
} else {
String dateTime = CSVLogger.FILE_NAME_FORMAT.format(new Date(timestamp));
baroSensor.csvLogger.writeCSVFile(timestamp + "," + dateTime + ","
+ sensorReading + ",0.0,0.0");
sensorData = new BaroData(timestamp, block, baroValue, 0.0, 0.0);
+ sensorReading + "," + getAltitude(sensorReading) + ",0.0,0.0");
sensorData = new BaroData(timestamp, block, baroValue, getAltitude(baroValue), 0.0, 0.0);
}
baroSensor.recordSensorData(sensorData);
} else {
Expand All @@ -451,6 +492,9 @@ private void visualizeData() {
y.setAxisMaximum(currentMax);
y.setAxisMinimum(currentMin);
y.setLabelCount(10);
y2.setAxisMaximum(getAltitude(currentMax));
y2.setAxisMinimum(getAltitude(currentMin));
y2.setLabelCount(10);
if (baroValue >= 0) {
baroMeter.setWithTremble(false);
baroMeter.setSpeedAt(baroValue);
Expand All @@ -465,16 +509,28 @@ private void visualizeData() {
Entry entry = new Entry((float) timeElapsed, baroValue);
Long currentTime = System.currentTimeMillis();
writeLogToFile(currentTime, baroValue);
entries.add(entry);
pressureEntries.add(entry);
altitudeEntries.add(new Entry((float) timeElapsed, getAltitude(baroValue)));

count++;
sum += entry.getY();
statMean.setText(DataFormatter.formatDouble((sum / count), PSLabSensor.BAROMETER_DATA_FORMAT));
LineDataSet dataSet = new LineDataSet(entries, getString(R.string.baro_unit));
altiValue.setText(String.format(Locale.getDefault(), PSLabSensor.BAROMETER_DATA_FORMAT, getAltitude(baroValue)));

List<ILineDataSet> dataSets = new ArrayList<>();
LineDataSet dataSet = new LineDataSet(pressureEntries, getString(R.string.baro_unit));
dataSet.setDrawCircles(false);
dataSet.setDrawValues(false);
dataSet.setLineWidth(2);
LineData data = new LineData(dataSet);
dataSets.add(dataSet);

dataSet = new LineDataSet(altitudeEntries, getString(R.string.alti_unit));
dataSet.setDrawCircles(false);
dataSet.setDrawValues(false);
dataSet.setLineWidth(2);
dataSet.setColor(Color.YELLOW);
dataSets.add(dataSet);
LineData data = new LineData(dataSets);

mChart.setData(data);
mChart.notifyDataSetChanged();
Expand Down Expand Up @@ -512,9 +568,11 @@ private void resetInstrumentData() {
statMax.setText(DataFormatter.formatDouble(0, DataFormatter.LOW_PRECISION_FORMAT));
statMin.setText(DataFormatter.formatDouble(0, DataFormatter.LOW_PRECISION_FORMAT));
statMean.setText(DataFormatter.formatDouble(0, DataFormatter.LOW_PRECISION_FORMAT));
altiValue.setText(DataFormatter.formatDouble(0, DataFormatter.LOW_PRECISION_FORMAT));
baroMeter.setSpeedAt(0);
baroMeter.setWithTremble(false);
entries.clear();
pressureEntries.clear();
altitudeEntries.clear();
}

private void initiateBaroSensor(int type) {
Expand Down Expand Up @@ -564,4 +622,12 @@ private void initiateBaroSensor(int type) {
break;
}
}

private float getAltitude(float pressure) {
if (pressure <= 0.0) {
return 0;
} else {
return (float) (44330 * (1 - Math.pow(pressure, 1.0 / 5.255)));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where did you get these values and equations? Better mention reference as a comment

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

}
}
}
14 changes: 12 additions & 2 deletions app/src/main/java/io/pslab/models/BaroData.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,16 @@ public class BaroData extends RealmObject {
private long time;
private long block;
private float baro;
private float altitude;
private double lat, lon;

public BaroData() {/**/}

public BaroData(long time, long block, float baro, double lat, double lon) {
public BaroData(long time, long block, float baro, float altitude, double lat, double lon) {
this.time = time;
this.block = block;
this.baro = baro;
this.altitude = altitude;
this.lat = lat;
this.lon = lon;
}
Expand Down Expand Up @@ -49,6 +51,14 @@ public void setBaro(float baro) {
this.baro = baro;
}

public float getAltitude() {
return altitude;
}

public void setAltitude(float altitude) {
this.altitude = altitude;
}

public double getLat() {
return lat;
}
Expand All @@ -67,6 +77,6 @@ public void setLon(double lon) {

@Override
public String toString() {
return "Block - " + block + ", Time - " + time + ", Baro - " + baro + ", Lat - " + lat + ", Lon - " + lon;
return "Block - " + block + ", Time - " + time + ", Baro - " + baro + ", Altitude - " + altitude + ", Lat - " + lat + ", Lon - " + lon;
}
}
11 changes: 11 additions & 0 deletions app/src/main/res/layout/fragment_barometer_data.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,17 @@
android:id="@+id/baro_avg"
style="@style/baro_meter_stat_display" />

<TextView
android:id="@+id/label_alti_stat_avg"
style="@style/baro_meter_stat_heading"
android:text="@string/avg_alti" />

<TextView
android:id="@+id/alti_value"
style="@style/baro_meter_stat_display"
android:layout_marginBottom="@dimen/baro_altitude_box_margin"
/>

</LinearLayout>

<LinearLayout
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/dimens.xml
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,7 @@
<dimen name="baro_display_font_size">16sp</dimen>
<dimen name="baro_guage_font_size">8sp</dimen>
<dimen name="baro_sensor_label_title_size">16sp</dimen>
<dimen name="baro_altitude_box_margin">10dp</dimen>

<dimen name="gas_sensor_label_title_size">16sp</dimen>

Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -898,8 +898,10 @@
<string name="delete_all">Delete All Data</string>
<string name="delete_all_message">Are You Sure?</string>
<string name="baro_meter">Barometer</string>
<string name="alti_unit">m</string>
<string name="baro_unit">atm</string>
<string name="avg_baro">Avg (atm)</string>
<string name="avg_alti">Altitude (m)</string>
<string name="min_baro">Min (atm)</string>
<string name="max_baro">Max (atm)</string>
<string name="baro_meter_description">Measures the atmospheric pressure</string>
Expand Down