Skip to content

Commit ab3a44e

Browse files
authored
Fixes #2046 Fixes crash when data is loaded which has been written on device with German locale (#2094)
1 parent ebf5a79 commit ab3a44e

20 files changed

+622
-289
lines changed

app/src/main/java/io/pslab/DataFormatter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ public class DataFormatter {
1212
public static final char decSeparator = DecimalFormatSymbols.getInstance().getDecimalSeparator();
1313

1414
public static String formatDouble(double value, String format) {
15-
return String.format(Locale.getDefault(), format, value);
15+
return String.format(Locale.ROOT, format, value);
1616
}
1717
}

app/src/main/java/io/pslab/activity/DataLoggerActivity.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
214214
getFileData(file);
215215
} else
216216
CustomSnackBar.showSnackBar(findViewById(android.R.id.content),
217-
getString(R.string.no_file_selected),null,null, Snackbar.LENGTH_SHORT);
217+
getString(R.string.no_file_selected), null, null, Snackbar.LENGTH_SHORT);
218218
}
219219
}
220220

@@ -236,12 +236,12 @@ private void getFileData(File file) {
236236
realm.copyToRealm(object);
237237
} else {
238238
CustomSnackBar.showSnackBar(findViewById(android.R.id.content),
239-
getString(R.string.incorrect_import_format),null,null, Snackbar.LENGTH_SHORT);
239+
getString(R.string.incorrect_import_format), null, null, Snackbar.LENGTH_SHORT);
240240
}
241241
realm.commitTransaction();
242242
} catch (Exception e) {
243243
CustomSnackBar.showSnackBar(findViewById(android.R.id.content),
244-
getString(R.string.incorrect_import_format),null,null, Snackbar.LENGTH_SHORT);
244+
getString(R.string.incorrect_import_format), null, null, Snackbar.LENGTH_SHORT);
245245
}
246246
} else if (i == 0) {
247247
block = System.currentTimeMillis();
@@ -277,7 +277,7 @@ private RealmObject getObject(String objectType, String[] data, long time, long
277277
returnObject = new GyroData(time, block, Float.valueOf(data[2]), Float.valueOf(data[3]), Float.valueOf(data[4]), Double.valueOf(data[5]), Double.valueOf(data[6]));
278278
break;
279279
case "Compass":
280-
returnObject = new CompassData(time, block, data[2].equals("null") ? "0" : data[2], data[3].equals("null") ? "0" : data[3], data[4].equals("null") ? "0" : data[4], data[5], Double.valueOf(data[6]), Double.valueOf(data[7]));
280+
returnObject = new CompassData(time, block, data[2].equals("null") ? 0f : Float.valueOf(data[2]), data[3].equals("null") ? 0f : Float.valueOf(data[3]), data[4].equals("null") ? 0f : Float.valueOf(data[4]), data[5], Double.valueOf(data[6]), Double.valueOf(data[7]));
281281
break;
282282
case "Thermometer":
283283
returnObject = new ThermometerData(time, block, Float.valueOf(data[2]), Double.valueOf(data[5]), Double.valueOf(data[6]));

app/src/main/java/io/pslab/activity/MultimeterActivity.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import io.pslab.fragment.MultimeterSettingsFragment;
4747
import io.pslab.models.MultimeterData;
4848
import io.pslab.models.SensorDataBlock;
49+
import io.pslab.others.CSVDataLine;
4950
import io.pslab.others.CSVLogger;
5051
import io.pslab.others.CustomSnackBar;
5152
import io.pslab.others.GPSLogger;
@@ -67,6 +68,14 @@ public class MultimeterActivity extends AppCompatActivity {
6768
public static final String PREFS_NAME = "customDialogPreference";
6869
public static final String NAME = "savingData";
6970
private static final int MY_PERMISSIONS_REQUEST_STORAGE_FOR_DATA = 101;
71+
private static final CSVDataLine CSV_HEADER =
72+
new CSVDataLine()
73+
.add("Timestamp")
74+
.add("DateTime")
75+
.add("Data")
76+
.add("Value")
77+
.add("Latitude")
78+
.add("Longitude");
7079
private final String KEY_LOG = "has_log";
7180
private final String DATA_BLOCK = "data_block";
7281
public boolean recordData = false;
@@ -105,7 +114,7 @@ public class MultimeterActivity extends AppCompatActivity {
105114
SharedPreferences multimeter_data;
106115
private ScienceLab scienceLab;
107116
private int knobState;
108-
private String dataRecorded;
117+
private CSVDataLine dataRecorded;
109118
private String defaultValue;
110119
private Menu menu;
111120
private Boolean switchIsChecked;
@@ -116,7 +125,6 @@ public class MultimeterActivity extends AppCompatActivity {
116125
private boolean locationEnabled = true;
117126
private long recordPeriod;
118127
private double lat = 0, lon = 0;
119-
private String multimeterCSVheader = "Timestamp,DateTime,Data,Value,Latitude,Longitude";
120128
private GPSLogger gpsLogger;
121129
private Realm realm;
122130
private long block;
@@ -153,7 +161,7 @@ public void onClick(View v) {
153161
});
154162

155163
multimeter_data = this.getSharedPreferences(NAME, MODE_PRIVATE);
156-
dataRecorded = multimeterCSVheader;
164+
dataRecorded = CSV_HEADER;
157165
knobState = multimeter_data.getInt("KnobState", 2);
158166
switchIsChecked = multimeter_data.getBoolean("SwitchState", false);
159167
aSwitch.setChecked(switchIsChecked);
@@ -445,7 +453,13 @@ private void record(String data, String value) {
445453
lon = 0.0;
446454
}
447455
long timestamp = System.currentTimeMillis();
448-
dataRecorded = timestamp + "," + CSVLogger.FILE_NAME_FORMAT.format(new Date(timestamp)) + "," + data + "," + value + "," + lat + "," + lon;
456+
dataRecorded = new CSVDataLine()
457+
.add(timestamp)
458+
.add(CSVLogger.FILE_NAME_FORMAT.format(new Date(timestamp)))
459+
.add(data)
460+
.add(value)
461+
.add(lat)
462+
.add(lon);
449463
multimeterLogger.writeCSVFile(dataRecorded);
450464
recordSensorData(new MultimeterData(timestamp, block, data, value, lat, lon));
451465
}
@@ -491,7 +505,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
491505
if (isDataRecorded) {
492506
MenuItem item1 = menu.findItem(R.id.record_pause_data);
493507
item1.setIcon(R.drawable.ic_record_white);
494-
dataRecorded = multimeterCSVheader;
508+
dataRecorded = CSV_HEADER;
495509
// Export Data
496510
CustomSnackBar.showSnackBar(coordinatorLayout,
497511
getString(R.string.csv_store_text) + " " + multimeterLogger.getCurrentFilePath()
@@ -513,7 +527,7 @@ public void onClick(View view) {
513527
multimeterLogger = new CSVLogger(getString(R.string.multimeter));
514528
multimeterLogger.prepareLogFile();
515529
multimeterLogger.writeMetaData(getResources().getString(R.string.multimeter));
516-
multimeterLogger.writeCSVFile(multimeterCSVheader);
530+
multimeterLogger.writeCSVFile(CSV_HEADER);
517531
block = System.currentTimeMillis();
518532
recordSensorDataBlockID(new SensorDataBlock(block, getResources().getString(R.string.multimeter)));
519533
isRecordingStarted = true;

app/src/main/java/io/pslab/activity/OscilloscopeActivity.java

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import io.pslab.models.OscilloscopeData;
6969
import io.pslab.models.SensorDataBlock;
7070
import io.pslab.others.AudioJack;
71+
import io.pslab.others.CSVDataLine;
7172
import io.pslab.others.CSVLogger;
7273
import io.pslab.others.CustomSnackBar;
7374
import io.pslab.others.GPSLogger;
@@ -89,6 +90,16 @@
8990
public class OscilloscopeActivity extends AppCompatActivity implements View.OnClickListener {
9091

9192
private static final String PREF_NAME = "OscilloscopeActivity";
93+
private static final CSVDataLine CSV_HEADER = new CSVDataLine()
94+
.add("Timestamp")
95+
.add("DateTime")
96+
.add("Mode")
97+
.add("Channel")
98+
.add("xData")
99+
.add("yData")
100+
.add("Timebase")
101+
.add("lat")
102+
.add("lon");
92103
private final Object lock = new Object();
93104
@BindView(R.id.chart_os)
94105
public LineChart mChart;
@@ -189,7 +200,6 @@ public class OscilloscopeActivity extends AppCompatActivity implements View.OnCl
189200
private long block;
190201
private Timer recordTimer;
191202
private long recordPeriod = 100;
192-
private String oscilloscopeCSVHeader = "Timestamp,DateTime,Mode,Channel,xData,yData,Timebase,lat,lon";
193203
private String loggingXdata = "";
194204
private final String KEY_LOG = "has_log";
195205
private final String DATA_BLOCK = "data_block";
@@ -539,7 +549,7 @@ public void onClick(View view) {
539549
csvLogger = new CSVLogger(getResources().getString(R.string.oscilloscope));
540550
csvLogger.prepareLogFile();
541551
csvLogger.writeMetaData(getResources().getString(R.string.oscilloscope));
542-
csvLogger.writeCSVFile(oscilloscopeCSVHeader);
552+
csvLogger.writeCSVFile(CSV_HEADER);
543553
recordSensorDataBlockID(new SensorDataBlock(block, getResources().getString(R.string.oscilloscope)));
544554
CustomSnackBar.showSnackBar(mainLayout, getString(R.string.data_recording_start), null, null, Snackbar.LENGTH_SHORT);
545555
}
@@ -679,12 +689,21 @@ public void pauseData() {
679689
private void logChannelData(String[] channels) {
680690
long timestamp = System.currentTimeMillis();
681691
int noOfChannels = channels.length;
682-
String timeData = timestamp + "," + CSVLogger.FILE_NAME_FORMAT.format(new Date(timestamp));
683-
String locationData = lat + "," + lon;
692+
String dateTime = CSVLogger.FILE_NAME_FORMAT.format(new Date(timestamp));
684693
for (int i = 0; i < noOfChannels; i++) {
685694
recordSensorData(new OscilloscopeData(timestamp + i, block, noOfChannels, channels[i], loggingXdata, loggingYdata[i], xAxisScale, lat, lon));
686-
String data = timeData + "," + noOfChannels + "," + channels[i] + "," + loggingXdata + "," + loggingYdata[i] + "," + xAxisScale + "," + locationData;
687-
csvLogger.writeCSVFile(data);
695+
csvLogger.writeCSVFile(
696+
new CSVDataLine()
697+
.add(timestamp)
698+
.add(dateTime)
699+
.add(noOfChannels)
700+
.add(channels[i])
701+
.add(loggingXdata)
702+
.add(loggingYdata[i])
703+
.add(xAxisScale)
704+
.add(lat)
705+
.add(lon)
706+
);
688707
}
689708
}
690709

@@ -978,7 +997,7 @@ protected Void doInBackground(String... channels) {
978997
String[] xDataString = null;
979998
maxAmp = 0;
980999
scienceLab.captureTraces(4, samples, timeGap, channel, isTriggerSelected, null);
981-
Thread.sleep((long)(samples*timeGap*1e-3));
1000+
Thread.sleep((long) (samples * timeGap * 1e-3));
9821001
for (int i = 0; i < noOfChannels; i++) {
9831002
entries.add(new ArrayList<>());
9841003
channel = channels[i];
@@ -1052,12 +1071,12 @@ protected Void doInBackground(String... channels) {
10521071
double max = xData[xData.length - 1];
10531072
for (int j = 0; j < 500; j++) {
10541073
double x = j * max / 500;
1055-
double t = 2*Math.PI*freq*(x - phase);
1074+
double t = 2 * Math.PI * freq * (x - phase);
10561075
double y;
1057-
if (t%(2*Math.PI) < 2*Math.PI*dc) {
1076+
if (t % (2 * Math.PI) < 2 * Math.PI * dc) {
10581077
y = offset + amp;
10591078
} else {
1060-
y = offset - 2*amp;
1079+
y = offset - 2 * amp;
10611080
}
10621081
curveFitEntries.get(curveFitEntries.size() - 1).add(new Entry((float) x, (float) y));
10631082
}
@@ -1097,7 +1116,7 @@ protected Void doInBackground(String... channels) {
10971116
float audioValue = (float) map(buffer[i], -32768, 32767, -3, 3);
10981117
if (!isFourierTransformSelected) {
10991118
if (noOfChannels == 1) {
1100-
xDataString[i] = String.valueOf(2.0*i);
1119+
xDataString[i] = String.valueOf(2.0 * i);
11011120
}
11021121
entries.get(entries.size() - 1).add(new Entry(i, audioValue));
11031122
} else {

app/src/main/java/io/pslab/activity/PowerSourceActivity.java

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import io.pslab.items.SquareImageButton;
4545
import io.pslab.models.PowerSourceData;
4646
import io.pslab.models.SensorDataBlock;
47+
import io.pslab.others.CSVDataLine;
4748
import io.pslab.others.CSVLogger;
4849
import io.pslab.others.CustomSnackBar;
4950
import io.pslab.others.GPSLogger;
@@ -58,6 +59,15 @@
5859
public class PowerSourceActivity extends AppCompatActivity {
5960

6061
public static final String POWER_PREFERENCES = "Power_Preferences";
62+
private static final CSVDataLine CSV_HEADER = new CSVDataLine()
63+
.add("Timestamp")
64+
.add("DateTime")
65+
.add("PV1")
66+
.add("PV2")
67+
.add("PV3")
68+
.add("PCS")
69+
.add("Latitude")
70+
.add("Longitude");
6171

6272
private final int CONTROLLER_MIN = 1;
6373
private final int PV1_CONTROLLER_MAX = 1001;
@@ -210,11 +220,11 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
210220
float voltage = Float.parseFloat(voltageValue);
211221
if (voltage < -5.00f) {
212222
voltage = -5.00f;
213-
displayPV1.setText(String.valueOf(voltage) + " V");
223+
displayPV1.setText(voltage + " V");
214224
}
215225
if (voltage > 5.00f) {
216226
voltage = 5.00f;
217-
displayPV1.setText(String.valueOf(voltage) + " V");
227+
displayPV1.setText(voltage + " V");
218228
}
219229
controllerPV1.setProgress(mapPowerToProgress(voltage, PV1_CONTROLLER_MAX,
220230
5.00f, -5.00f));
@@ -232,11 +242,11 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
232242
float voltage = Float.parseFloat(voltageValue);
233243
if (voltage < -3.30f) {
234244
voltage = -3.30f;
235-
displayPV2.setText(String.valueOf(voltage) + " V");
245+
displayPV2.setText(voltage + " V");
236246
}
237247
if (voltage > 3.30f) {
238248
voltage = 3.30f;
239-
displayPV2.setText(String.valueOf(voltage) + " V");
249+
displayPV2.setText(voltage + " V");
240250
}
241251
controllerPV2.setProgress(mapPowerToProgress(voltage, PV2_CONTROLLER_MAX,
242252
3.30f, -3.30f));
@@ -254,11 +264,11 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
254264
float voltage = Float.parseFloat(voltageValue);
255265
if (voltage < 0.00f) {
256266
voltage = 0.00f;
257-
displayPV3.setText(String.valueOf(voltage) + " V");
267+
displayPV3.setText(voltage + " V");
258268
}
259269
if (voltage > 3.30f) {
260270
voltage = 3.30f;
261-
displayPV3.setText(String.valueOf(voltage) + " V");
271+
displayPV3.setText(voltage + " V");
262272
}
263273
controllerPV3.setProgress(mapPowerToProgress(voltage, PV3_CONTROLLER_MAX,
264274
3.30f, 0.00f));
@@ -276,11 +286,11 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
276286
float current = Float.parseFloat(currentValue);
277287
if (current < 0.00f) {
278288
current = 0.00f;
279-
displayPCS.setText(String.valueOf(current) + " mA");
289+
displayPCS.setText(current + " mA");
280290
}
281291
if (current > 3.30f) {
282292
current = 3.30f;
283-
displayPCS.setText(String.valueOf(current) + " mA");
293+
displayPCS.setText(current + " mA");
284294
}
285295
controllerPCS.setProgress(mapPowerToProgress(current, PCS_CONTROLLER_MAX,
286296
3.30f, 0.00f));
@@ -571,6 +581,7 @@ private void removeCursor() {
571581
displayPV3.setCursorVisible(false);
572582
displayPCS.setCursorVisible(false);
573583
}
584+
574585
/**
575586
* Click listeners to increment and decrement buttons
576587
*
@@ -909,7 +920,7 @@ private int mapPowerToProgress(float power, int CONTROLLER_MAX, float max, float
909920
*/
910921
private float limitDigits(float number) {
911922
try {
912-
return Float.valueOf(String.format(Locale.US, "%.2f", number));
923+
return Float.valueOf(String.format(Locale.ROOT, "%.2f", number));
913924
} catch (NumberFormatException e) {
914925
return 0.00f;
915926
}
@@ -957,7 +968,7 @@ private void recordData() {
957968
powerSourceLogger = new CSVLogger(getString(R.string.power_source));
958969
powerSourceLogger.prepareLogFile();
959970
powerSourceLogger.writeMetaData(getString(R.string.power_source));
960-
powerSourceLogger.writeCSVFile("Timestamp,DateTime,PV1,PV2,PV2,PCS,Latitude,Longitude");
971+
powerSourceLogger.writeCSVFile(CSV_HEADER);
961972
writeHeaderToFile = !writeHeaderToFile;
962973
recordSensorDataBlockID(new SensorDataBlock(block, getResources().getString(R.string.power_source)));
963974
}
@@ -975,9 +986,17 @@ private void recordData() {
975986
lon = 0.0;
976987
}
977988
timestamp = System.currentTimeMillis();
978-
String dateTime = CSVLogger.FILE_NAME_FORMAT.format(new Date(System.currentTimeMillis()));
979-
powerSourceLogger.writeCSVFile(System.currentTimeMillis() + "," + dateTime + "," + String.valueOf(voltagePV1)
980-
+ "," + String.valueOf(voltagePV2) + "," + String.valueOf(voltagePV3) + "," + String.valueOf(currentPCS) + "," + lat + "," + lon);
989+
powerSourceLogger.writeCSVFile(
990+
new CSVDataLine()
991+
.add(System.currentTimeMillis())
992+
.add(CSVLogger.FILE_NAME_FORMAT.format(new Date(System.currentTimeMillis())))
993+
.add(voltagePV1)
994+
.add(voltagePV2)
995+
.add(voltagePV3)
996+
.add(currentPCS)
997+
.add(lat)
998+
.add(lon)
999+
);
9811000
recordSensorData(new PowerSourceData(timestamp, block, voltagePV1, voltagePV2, voltagePV3, currentPCS, lat, lon));
9821001
}
9831002

0 commit comments

Comments
 (0)