Skip to content

Commit ab54e56

Browse files
authored
Use improved CSV logger data structure (#2105)
1 parent e4d6322 commit ab54e56

File tree

1 file changed

+74
-52
lines changed

1 file changed

+74
-52
lines changed

app/src/main/java/io/pslab/fragment/SoundMeterDataFragment.java

Lines changed: 74 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import io.pslab.models.SensorDataBlock;
4343
import io.pslab.models.SoundData;
4444
import io.pslab.others.AudioJack;
45+
import io.pslab.others.CSVDataLine;
4546
import io.pslab.others.CSVLogger;
4647
import io.pslab.others.CustomSnackBar;
4748

@@ -53,6 +54,13 @@
5354
public class SoundMeterDataFragment extends Fragment {
5455

5556
public static final String TAG = "SoundMeterFragment";
57+
private static final CSVDataLine CSV_HEADER =
58+
new CSVDataLine()
59+
.add("Timestamp")
60+
.add("DateTime")
61+
.add("Readings")
62+
.add("Latitude")
63+
.add("Longitude");
5664
@BindView(R.id.sound_max)
5765
TextView statMax;
5866
@BindView(R.id.sound_min)
@@ -102,7 +110,7 @@ public static void setParameters() {
102110
/**
103111
* TODO: Parameters yet to be determined
104112
*/
105-
Log.i(TAG,"parameters yet to be determined");
113+
Log.i(TAG, "parameters yet to be determined");
106114
}
107115

108116
/**********************************************************************************************
@@ -112,15 +120,15 @@ public static void setParameters() {
112120
@Override
113121
public void onCreate(@Nullable Bundle savedInstanceState) {
114122
super.onCreate(savedInstanceState);
115-
soundMeter = (SoundMeterActivity)getActivity();
123+
soundMeter = (SoundMeterActivity) getActivity();
116124
}
117125

118126
@Override
119127
public View onCreateView(LayoutInflater inflater, ViewGroup container,
120128
Bundle savedInstanceState) {
121129
// Inflate the layout for this fragment
122130
rootView = inflater.inflate(R.layout.fragment_sound_meter_data, container, false);
123-
unbinder = ButterKnife.bind(this,rootView);
131+
unbinder = ButterKnife.bind(this, rootView);
124132
setupInstruments();
125133
return rootView;
126134
}
@@ -179,11 +187,11 @@ private void startRecording() {
179187
audioJack = new AudioJack("input");
180188
recordStartTime = System.currentTimeMillis();
181189
chartQ = new ArrayDeque<>();
182-
bgThreadHandler.post(()->{
183-
while(isRecording) {
190+
bgThreadHandler.post(() -> {
191+
while (isRecording) {
184192
short[] buffer = audioJack.read();
185193
Bundle bundle = new Bundle();
186-
bundle.putShortArray("buffer",buffer);
194+
bundle.putShortArray("buffer", buffer);
187195
Message msg = new Message();
188196
msg.setData(bundle);
189197
uiHandler.sendMessage(msg);
@@ -205,23 +213,23 @@ private void stopRecording() {
205213
*********************************************************************************************
206214
*/
207215
private void startBackgroundThread() {
208-
Log.i(TAG,"starting background thread");
216+
Log.i(TAG, "starting background thread");
209217
bgThread = new HandlerThread("Audio Recorder Thread");
210218
bgThread.start();
211219
bgThreadHandler = new Handler(bgThread.getLooper());
212220
uiHandler = new UIHandler(this);
213-
Log.i(TAG,"background Thread started");
221+
Log.i(TAG, "background Thread started");
214222
}
215223

216224
private void stopBackgroundThread() {
217-
Log.i(TAG,"stopping background thread");
218-
if(bgThread!=null) {
225+
Log.i(TAG, "stopping background thread");
226+
if (bgThread != null) {
219227
bgThread.quitSafely();
220228
bgThread = null;
221229
}
222230
bgThreadHandler = null;
223231
uiHandler = null;
224-
Log.i(TAG,"Background Thread Stopped");
232+
Log.i(TAG, "Background Thread Stopped");
225233
}
226234

227235
/**********************************************************************************************
@@ -231,36 +239,36 @@ private void stopBackgroundThread() {
231239
private void updateMeter(short[] buffer) {
232240
double sqrsum = 0.0;
233241
for (int i = 0; i < buffer.length; ++i) {
234-
sqrsum += Math.pow(buffer[i],2);
242+
sqrsum += Math.pow(buffer[i], 2);
235243
}
236-
double rmsamp = Math.sqrt((sqrsum/buffer.length));
237-
238-
maxRmsAmp = Math.max(rmsamp,maxRmsAmp);
239-
minRmsAmp = Math.min(rmsamp,minRmsAmp);
240-
rmsSum = (count<Integer.MAX_VALUE)?(rmsSum+rmsamp):rmsamp;
241-
count = (count<Integer.MAX_VALUE)?(count+1):1;
242-
double avgRmsAmp = rmsSum/count;
243-
244-
double loudness = rmsamp>0?(10*Math.log10(rmsamp/1d)):1;
245-
double maxLoudness = maxRmsAmp>0?(10*Math.log10(maxRmsAmp/1d)):1;
246-
double minLoudness = minRmsAmp>0?(10*Math.log10(minRmsAmp/1d)):1;
247-
double avgLoudness = avgRmsAmp>0?(10*Math.log10(avgRmsAmp/1d)):1;
248-
249-
decibelMeter.setSpeedAt((float)loudness);
250-
statMax.setText(String.format(Locale.getDefault(), PSLabSensor.SOUNDMETER_DATA_FORMAT,maxLoudness));
251-
statMin.setText(String.format(Locale.getDefault(), PSLabSensor.SOUNDMETER_DATA_FORMAT,minLoudness));
252-
statMean.setText(String.format(Locale.getDefault(), PSLabSensor.SOUNDMETER_DATA_FORMAT,avgLoudness));
253-
writeLog(System.currentTimeMillis(),(float)loudness);
244+
double rmsamp = Math.sqrt((sqrsum / buffer.length));
245+
246+
maxRmsAmp = Math.max(rmsamp, maxRmsAmp);
247+
minRmsAmp = Math.min(rmsamp, minRmsAmp);
248+
rmsSum = (count < Integer.MAX_VALUE) ? (rmsSum + rmsamp) : rmsamp;
249+
count = (count < Integer.MAX_VALUE) ? (count + 1) : 1;
250+
double avgRmsAmp = rmsSum / count;
251+
252+
double loudness = rmsamp > 0 ? (10 * Math.log10(rmsamp / 1d)) : 1;
253+
double maxLoudness = maxRmsAmp > 0 ? (10 * Math.log10(maxRmsAmp / 1d)) : 1;
254+
double minLoudness = minRmsAmp > 0 ? (10 * Math.log10(minRmsAmp / 1d)) : 1;
255+
double avgLoudness = avgRmsAmp > 0 ? (10 * Math.log10(avgRmsAmp / 1d)) : 1;
256+
257+
decibelMeter.setSpeedAt((float) loudness);
258+
statMax.setText(String.format(Locale.getDefault(), PSLabSensor.SOUNDMETER_DATA_FORMAT, maxLoudness));
259+
statMin.setText(String.format(Locale.getDefault(), PSLabSensor.SOUNDMETER_DATA_FORMAT, minLoudness));
260+
statMean.setText(String.format(Locale.getDefault(), PSLabSensor.SOUNDMETER_DATA_FORMAT, avgLoudness));
261+
writeLog(System.currentTimeMillis(), (float) loudness);
254262
}
255263

256264
private void updateChart(short[] buffer) {
257265
for (int i = 0; i < buffer.length; ++i) {
258-
float x = (System.currentTimeMillis() - recordStartTime)/1000f;
259-
float y = buffer[i]/1000f;
260-
if(chartQ.size()>=buffer.length)
266+
float x = (System.currentTimeMillis() - recordStartTime) / 1000f;
267+
float y = buffer[i] / 1000f;
268+
if (chartQ.size() >= buffer.length)
261269
chartQ.removeFirst();
262-
chartQ.addLast(new Entry(x,y));
263-
Log.i(TAG,"x : "+x+" "+"y : "+y);
270+
chartQ.addLast(new Entry(x, y));
271+
Log.i(TAG, "x : " + x + " " + "y : " + y);
264272
}
265273
List<Entry> entries = new ArrayList<>(chartQ);
266274
LineDataSet dataSet = new LineDataSet(entries, "Amplitude");
@@ -277,8 +285,8 @@ private void updateChart(short[] buffer) {
277285
* Method to play data which was previously recorded
278286
*/
279287
public void playData() {
280-
CustomSnackBar.showSnackBar(getActivity().findViewById(android.R.id.content),getString(R.string.in_progress),
281-
null,null,Snackbar.LENGTH_SHORT);
288+
CustomSnackBar.showSnackBar(getActivity().findViewById(android.R.id.content), getString(R.string.in_progress),
289+
null, null, Snackbar.LENGTH_SHORT);
282290
/**
283291
* TODO: To be implemented
284292
*/
@@ -290,7 +298,7 @@ public void playData() {
290298
*/
291299
public void stopData() {
292300
CustomSnackBar.showSnackBar(getActivity().findViewById(android.R.id.content), getString(R.string.in_progress),
293-
null,null,Snackbar.LENGTH_SHORT);
301+
null, null, Snackbar.LENGTH_SHORT);
294302
/**
295303
* TODO: To be implemented
296304
*/
@@ -306,21 +314,31 @@ private void writeLog(long timestamp, float dB) {
306314
if (soundMeter.writeHeaderToFile) {
307315
soundMeter.csvLogger.prepareLogFile();
308316
soundMeter.csvLogger.writeMetaData(getResources().getString(R.string.lux_meter));
309-
soundMeter.csvLogger.writeCSVFile("Timestamp,DateTime,Readings,Latitude,Longitude");
317+
soundMeter.csvLogger.writeCSVFile(CSV_HEADER);
310318
block = timestamp;
311319
soundMeter.recordSensorDataBlockID(new SensorDataBlock(timestamp, soundMeter.getSensorName()));
312320
soundMeter.writeHeaderToFile = !soundMeter.writeHeaderToFile;
313321
}
314322
if (soundMeter.addLocation && soundMeter.gpsLogger.isGPSEnabled()) {
315323
String dateTime = CSVLogger.FILE_NAME_FORMAT.format(new Date(timestamp));
316324
Location location = soundMeter.gpsLogger.getDeviceLocation();
317-
soundMeter.csvLogger.writeCSVFile(timestamp + "," + dateTime + ","
318-
+ dB + "," + location.getLatitude() + "," + location.getLongitude());
325+
soundMeter.csvLogger.writeCSVFile(
326+
new CSVDataLine()
327+
.add(timestamp)
328+
.add(dateTime)
329+
.add(dB)
330+
.add(location.getLatitude())
331+
.add(location.getLongitude()));
319332
soundData = new SoundData(timestamp, block, dB, location.getLatitude(), location.getLongitude());
320333
} else {
321334
String dateTime = CSVLogger.FILE_NAME_FORMAT.format(new Date(timestamp));
322-
soundMeter.csvLogger.writeCSVFile(timestamp + "," + dateTime + ","
323-
+ dB + ",0.0,0.0");
335+
soundMeter.csvLogger.writeCSVFile(
336+
new CSVDataLine()
337+
.add(timestamp)
338+
.add(dateTime)
339+
.add(dB)
340+
.add(0.0)
341+
.add(0.0));
324342
soundData = new SoundData(timestamp, block, dB, 0.0, 0.0);
325343
}
326344
soundMeter.recordSensorData(soundData);
@@ -332,41 +350,45 @@ private void writeLog(long timestamp, float dB) {
332350
public void saveGraph() {
333351
soundMeter.csvLogger.prepareLogFile();
334352
soundMeter.csvLogger.writeMetaData(getResources().getString(R.string.lux_meter));
335-
soundMeter.csvLogger.writeCSVFile("Timestamp,DateTime,Readings,Latitude,Longitude");
353+
soundMeter.csvLogger.writeCSVFile(CSV_HEADER);
336354
for (SoundData soundData : soundMeter.recordedSoundData) {
337-
soundMeter.csvLogger.writeCSVFile(soundData.getTime() + ","
338-
+ CSVLogger.FILE_NAME_FORMAT.format(new Date(soundData.getTime())) + ","
339-
+ soundData.getdB() + ","
340-
+ soundData.getLat() + ","
341-
+ soundData.getLon());
355+
soundMeter.csvLogger.writeCSVFile(
356+
new CSVDataLine()
357+
.add(soundData.getTime())
358+
.add(CSVLogger.FILE_NAME_FORMAT.format(new Date(soundData.getTime())))
359+
.add(soundData.getdB())
360+
.add(soundData.getLat())
361+
.add(soundData.getLon()));
342362
}
343363
View view = rootView.findViewById(R.id.soundmeter_linearlayout);
344364
view.setDrawingCacheEnabled(true);
345365
Bitmap b = view.getDrawingCache();
346366
try {
347367
b.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() +
348368
File.separator + CSV_DIRECTORY + File.separator + soundMeter.getSensorName() +
349-
File.separator + CSVLogger.FILE_NAME_FORMAT.format(new Date()) + "_graph.jpg" ));
369+
File.separator + CSVLogger.FILE_NAME_FORMAT.format(new Date()) + "_graph.jpg"));
350370
} catch (FileNotFoundException e) {
351371
e.printStackTrace();
352372
}
353373
}
354374

355375
private static class UIHandler extends Handler {
356376
private SoundMeterDataFragment soundMeterDataFragment;
377+
357378
UIHandler(SoundMeterDataFragment fragment) {
358379
this.soundMeterDataFragment = fragment;
359380
}
381+
360382
@Override
361383
public void handleMessage(Message msg) { //handle the message passed by the background thread which is recording the audio
362-
if(soundMeterDataFragment.isResumed()) {
384+
if (soundMeterDataFragment.isResumed()) {
363385
short[] buffer = msg.getData().getShortArray("buffer");
364386
soundMeterDataFragment.updateMeter(buffer);
365387
/**
366388
* TODO: smooth animation for the graph required
367389
*/
368390
soundMeterDataFragment.updateChart(buffer);
369-
Log.i(TAG,"handling message "+buffer.length+buffer[0]);
391+
Log.i(TAG, "handling message " + buffer.length + buffer[0]);
370392
}
371393
}
372394
}

0 commit comments

Comments
 (0)