2929import com .github .mikephil .charting .data .Entry ;
3030import com .github .mikephil .charting .data .LineData ;
3131import com .github .mikephil .charting .data .LineDataSet ;
32+ import com .github .mikephil .charting .interfaces .datasets .ILineDataSet ;
3233
3334import java .io .File ;
3435import java .io .FileNotFoundException ;
3536import java .io .FileOutputStream ;
3637import java .io .IOException ;
3738import java .util .ArrayList ;
3839import java .util .Date ;
40+ import java .util .List ;
3941import java .util .Locale ;
4042import java .util .Timer ;
4143import java .util .TimerTask ;
@@ -87,21 +89,26 @@ private enum BARO_SENSOR {INBUILT_SENSOR, BMP180_SENSOR}
8789 LineChart mChart ;
8890 @ BindView (R .id .baro_meter )
8991 PointerSpeedometer baroMeter ;
92+ @ BindView (R .id .alti_value )
93+ TextView altiValue ;
9094
9195 private Timer graphTimer ;
9296 private SensorManager sensorManager ;
9397 private Sensor sensor ;
9498 private long startTime , block ;
95- private ArrayList <Entry > entries ;
99+ private ArrayList <Entry > pressureEntries ;
100+ private ArrayList <Entry > altitudeEntries ;
96101 private ArrayList <BaroData > recordedBaroArray ;
97102 private BaroData sensorData ;
98103 private float currentMin = 2 ;
99104 private float currentMax = 0.5f ;
100105 private YAxis y ;
106+ private YAxis y2 ;
101107 private Unbinder unbinder ;
102108 private long previousTimeElapsed = (System .currentTimeMillis () - startTime ) / updatePeriod ;
103109 private BarometerActivity baroSensor ;
104110 private View rootView ;
111+ private String csvHeader = "Timestamp,DateTime,Pressure,Altitude,Latitude,Longitude" ;
105112
106113 public static BaroMeterDataFragment newInstance () {
107114 return new BaroMeterDataFragment ();
@@ -117,7 +124,8 @@ public static void setParameters(float highLimit, int updatePeriod, String type)
117124 public void onCreate (Bundle savedInstanceState ) {
118125 super .onCreate (savedInstanceState );
119126 startTime = System .currentTimeMillis ();
120- entries = new ArrayList <>();
127+ pressureEntries = new ArrayList <>();
128+ altitudeEntries = new ArrayList <>();
121129 baroSensor = (BarometerActivity ) getActivity ();
122130 }
123131
@@ -149,7 +157,8 @@ public void onResume() {
149157 count = 0 ;
150158 currentMin = 2 ;
151159 currentMax = 0.5f ;
152- entries .clear ();
160+ pressureEntries .clear ();
161+ altitudeEntries .clear ();
153162 mChart .clear ();
154163 mChart .invalidate ();
155164 initiateBaroSensor (sensorType );
@@ -181,23 +190,37 @@ private void plotAllRecordedData() {
181190 currentMin = d .getBaro ();
182191 }
183192 Entry entry = new Entry ((float ) (d .getTime () - d .getBlock ()) / 1000 , d .getBaro ());
184- entries .add (entry );
193+ pressureEntries .add (entry );
194+ altitudeEntries .add (new Entry ((float ) (d .getTime () - d .getBlock ()) / 1000 , d .getAltitude ()));
195+ altiValue .setText (String .format (Locale .getDefault (), PSLabSensor .BAROMETER_DATA_FORMAT , d .getAltitude ()));
185196 baroMeter .setWithTremble (false );
186197 baroMeter .setSpeedAt (d .getBaro ());
187198 sum += entry .getY ();
188199 }
189200 y .setAxisMaximum (currentMax );
190201 y .setAxisMinimum (currentMin );
191202 y .setLabelCount (10 );
203+ y2 .setAxisMaximum (getAltitude (currentMax ));
204+ y2 .setAxisMinimum (getAltitude (currentMin ));
205+ y2 .setLabelCount (10 );
192206 statMax .setText (String .format (Locale .getDefault (), PSLabSensor .BAROMETER_DATA_FORMAT , currentMax ));
193207 statMin .setText (String .format (Locale .getDefault (), PSLabSensor .BAROMETER_DATA_FORMAT , currentMin ));
194208 statMean .setText (String .format (Locale .getDefault (), PSLabSensor .BAROMETER_DATA_FORMAT , (sum / recordedBaroArray .size ())));
195209
196- LineDataSet dataSet = new LineDataSet (entries , getString (R .string .baro_unit ));
210+ List <ILineDataSet > dataSets = new ArrayList <>();
211+ LineDataSet dataSet = new LineDataSet (pressureEntries , getString (R .string .baro_unit ));
197212 dataSet .setDrawCircles (false );
198213 dataSet .setDrawValues (false );
199214 dataSet .setLineWidth (2 );
200- LineData data = new LineData (dataSet );
215+ dataSets .add (dataSet );
216+
217+ dataSet = new LineDataSet (altitudeEntries , getString (R .string .alti_unit ));
218+ dataSet .setDrawCircles (false );
219+ dataSet .setDrawValues (false );
220+ dataSet .setLineWidth (2 );
221+ dataSet .setColor (Color .YELLOW );
222+ dataSets .add (dataSet );
223+ LineData data = new LineData (dataSets );
201224
202225 mChart .setData (data );
203226 mChart .notifyDataSetChanged ();
@@ -251,20 +274,34 @@ public void run() {
251274 y .setAxisMaximum (currentMax );
252275 y .setAxisMinimum (currentMin );
253276 y .setLabelCount (10 );
277+ y2 .setAxisMaximum (getAltitude (currentMax ));
278+ y2 .setAxisMinimum (getAltitude (currentMin ));
279+ y2 .setLabelCount (10 );
254280 baroMeter .setWithTremble (false );
255281 baroMeter .setSpeedAt (d .getBaro ());
256282
257283 Entry entry = new Entry ((float ) (d .getTime () - d .getBlock ()) / 1000 , d .getBaro ());
258- entries .add (entry );
284+ pressureEntries .add (entry );
285+ altitudeEntries .add (new Entry ((float ) (d .getTime () - d .getBlock ()) / 1000 , d .getAltitude ()));
259286 count ++;
260287 sum += entry .getY ();
261288 statMean .setText (DataFormatter .formatDouble ((sum / count ), PSLabSensor .BAROMETER_DATA_FORMAT ));
289+ altiValue .setText (String .format (Locale .getDefault (), PSLabSensor .BAROMETER_DATA_FORMAT , d .getAltitude ()));
262290
263- LineDataSet dataSet = new LineDataSet (entries , getString (R .string .baro_unit ));
291+ List <ILineDataSet > dataSets = new ArrayList <>();
292+ LineDataSet dataSet = new LineDataSet (pressureEntries , getString (R .string .baro_unit ));
264293 dataSet .setDrawCircles (false );
265294 dataSet .setDrawValues (false );
266295 dataSet .setLineWidth (2 );
267- LineData data = new LineData (dataSet );
296+ dataSets .add (dataSet );
297+
298+ dataSet = new LineDataSet (altitudeEntries , getString (R .string .alti_unit ));
299+ dataSet .setDrawCircles (false );
300+ dataSet .setDrawValues (false );
301+ dataSet .setLineWidth (2 );
302+ dataSet .setColor (Color .YELLOW );
303+ dataSets .add (dataSet );
304+ LineData data = new LineData (dataSets );
268305
269306 mChart .setData (data );
270307 mChart .notifyDataSetChanged ();
@@ -309,7 +346,7 @@ public void stopData() {
309346 graphTimer = null ;
310347 }
311348 recordedBaroArray .clear ();
312- entries .clear ();
349+ pressureEntries .clear ();
313350 plotAllRecordedData ();
314351 baroSensor .startedPlay = false ;
315352 baroSensor .playingData = false ;
@@ -320,11 +357,12 @@ public void stopData() {
320357 public void saveGraph () {
321358 baroSensor .csvLogger .prepareLogFile ();
322359 baroSensor .csvLogger .writeMetaData (getResources ().getString (R .string .baro_meter ));
323- baroSensor .csvLogger .writeCSVFile ("Timestamp,DateTime,Readings,Latitude,Longitude" );
360+ baroSensor .csvLogger .writeCSVFile (csvHeader );
324361 for (BaroData baroData : baroSensor .recordedBaroData ) {
325362 baroSensor .csvLogger .writeCSVFile (baroData .getTime () + ","
326363 + CSVLogger .FILE_NAME_FORMAT .format (new Date (baroData .getTime ())) + ","
327364 + baroData .getBaro () + ","
365+ + baroData .getAltitude () + ","
328366 + baroData .getLat () + ","
329367 + baroData .getLon ());
330368 }
@@ -343,7 +381,7 @@ private void setupInstruments() {
343381 baroMeter .setMaxSpeed (PreferenceManager .getDefaultSharedPreferences (getActivity ()).getFloat (baroSensor .BAROMETER_LIMIT , 2 ));
344382 XAxis x = mChart .getXAxis ();
345383 this .y = mChart .getAxisLeft ();
346- YAxis y2 = mChart .getAxisRight ();
384+ this . y2 = mChart .getAxisRight ();
347385
348386 mChart .setTouchEnabled (true );
349387 mChart .setHighlightPerDragEnabled (true );
@@ -372,8 +410,11 @@ private void setupInstruments() {
372410 y .setDrawGridLines (true );
373411 y .setLabelCount (10 );
374412
375- y2 .setDrawGridLines (false );
376- y2 .setMaxWidth (0 );
413+ y2 .setTextColor (Color .WHITE );
414+ y2 .setAxisMinimum (getAltitude (currentMin ));
415+ y2 .setAxisMaximum (getAltitude (currentMax ));
416+ y2 .setDrawGridLines (true );
417+ y2 .setLabelCount (10 );
377418 }
378419
379420 @ Override
@@ -416,7 +457,7 @@ private void writeLogToFile(long timestamp, float sensorReading) {
416457 if (getActivity () != null && baroSensor .isRecording ) {
417458 if (baroSensor .writeHeaderToFile ) {
418459 baroSensor .csvLogger .prepareLogFile ();
419- baroSensor .csvLogger .writeCSVFile ("Timestamp,DateTime,Readings,Latitude,Longitude" );
460+ baroSensor .csvLogger .writeCSVFile (csvHeader );
420461 block = timestamp ;
421462 baroSensor .recordSensorDataBlockID (new SensorDataBlock (timestamp , baroSensor .getSensorName ()));
422463 baroSensor .writeHeaderToFile = !baroSensor .writeHeaderToFile ;
@@ -425,13 +466,13 @@ private void writeLogToFile(long timestamp, float sensorReading) {
425466 String dateTime = CSVLogger .FILE_NAME_FORMAT .format (new Date (timestamp ));
426467 Location location = baroSensor .gpsLogger .getDeviceLocation ();
427468 baroSensor .csvLogger .writeCSVFile (timestamp + "," + dateTime + ","
428- + sensorReading + "," + location .getLatitude () + "," + location .getLongitude ());
429- sensorData = new BaroData (timestamp , block , baroValue , location .getLatitude (), location .getLongitude ());
469+ + sensorReading + "," + getAltitude ( sensorReading ) + "," + location .getLatitude () + "," + location .getLongitude ());
470+ sensorData = new BaroData (timestamp , block , baroValue , getAltitude ( baroValue ), location .getLatitude (), location .getLongitude ());
430471 } else {
431472 String dateTime = CSVLogger .FILE_NAME_FORMAT .format (new Date (timestamp ));
432473 baroSensor .csvLogger .writeCSVFile (timestamp + "," + dateTime + ","
433- + sensorReading + ",0.0,0.0" );
434- sensorData = new BaroData (timestamp , block , baroValue , 0.0 , 0.0 );
474+ + sensorReading + "," + getAltitude ( sensorReading ) + ", 0.0,0.0" );
475+ sensorData = new BaroData (timestamp , block , baroValue , getAltitude ( baroValue ), 0.0 , 0.0 );
435476 }
436477 baroSensor .recordSensorData (sensorData );
437478 } else {
@@ -451,6 +492,9 @@ private void visualizeData() {
451492 y .setAxisMaximum (currentMax );
452493 y .setAxisMinimum (currentMin );
453494 y .setLabelCount (10 );
495+ y2 .setAxisMaximum (getAltitude (currentMax ));
496+ y2 .setAxisMinimum (getAltitude (currentMin ));
497+ y2 .setLabelCount (10 );
454498 if (baroValue >= 0 ) {
455499 baroMeter .setWithTremble (false );
456500 baroMeter .setSpeedAt (baroValue );
@@ -465,16 +509,28 @@ private void visualizeData() {
465509 Entry entry = new Entry ((float ) timeElapsed , baroValue );
466510 Long currentTime = System .currentTimeMillis ();
467511 writeLogToFile (currentTime , baroValue );
468- entries .add (entry );
512+ pressureEntries .add (entry );
513+ altitudeEntries .add (new Entry ((float ) timeElapsed , getAltitude (baroValue )));
469514
470515 count ++;
471516 sum += entry .getY ();
472517 statMean .setText (DataFormatter .formatDouble ((sum / count ), PSLabSensor .BAROMETER_DATA_FORMAT ));
473- LineDataSet dataSet = new LineDataSet (entries , getString (R .string .baro_unit ));
518+ altiValue .setText (String .format (Locale .getDefault (), PSLabSensor .BAROMETER_DATA_FORMAT , getAltitude (baroValue )));
519+
520+ List <ILineDataSet > dataSets = new ArrayList <>();
521+ LineDataSet dataSet = new LineDataSet (pressureEntries , getString (R .string .baro_unit ));
474522 dataSet .setDrawCircles (false );
475523 dataSet .setDrawValues (false );
476524 dataSet .setLineWidth (2 );
477- LineData data = new LineData (dataSet );
525+ dataSets .add (dataSet );
526+
527+ dataSet = new LineDataSet (altitudeEntries , getString (R .string .alti_unit ));
528+ dataSet .setDrawCircles (false );
529+ dataSet .setDrawValues (false );
530+ dataSet .setLineWidth (2 );
531+ dataSet .setColor (Color .YELLOW );
532+ dataSets .add (dataSet );
533+ LineData data = new LineData (dataSets );
478534
479535 mChart .setData (data );
480536 mChart .notifyDataSetChanged ();
@@ -512,9 +568,11 @@ private void resetInstrumentData() {
512568 statMax .setText (DataFormatter .formatDouble (0 , DataFormatter .LOW_PRECISION_FORMAT ));
513569 statMin .setText (DataFormatter .formatDouble (0 , DataFormatter .LOW_PRECISION_FORMAT ));
514570 statMean .setText (DataFormatter .formatDouble (0 , DataFormatter .LOW_PRECISION_FORMAT ));
571+ altiValue .setText (DataFormatter .formatDouble (0 , DataFormatter .LOW_PRECISION_FORMAT ));
515572 baroMeter .setSpeedAt (0 );
516573 baroMeter .setWithTremble (false );
517- entries .clear ();
574+ pressureEntries .clear ();
575+ altitudeEntries .clear ();
518576 }
519577
520578 private void initiateBaroSensor (int type ) {
@@ -564,4 +622,12 @@ private void initiateBaroSensor(int type) {
564622 break ;
565623 }
566624 }
625+
626+ private float getAltitude (float pressure ) {
627+ if (pressure <= 0.0 ) {
628+ return 0 ;
629+ } else {
630+ return (float ) (44330 * (1 - Math .pow (pressure , 1.0 / 5.255 )));
631+ }
632+ }
567633}
0 commit comments