Skip to content

Commit f2108b9

Browse files
committed
started working on logic analyzer logging
1 parent e09392b commit f2108b9

File tree

3 files changed

+209
-2
lines changed

3 files changed

+209
-2
lines changed

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

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package io.pslab.fragment;
22

33
import android.app.Activity;
4+
import android.content.Context;
45
import android.content.SharedPreferences;
56
import android.graphics.Color;
7+
import android.location.Location;
8+
import android.location.LocationManager;
69
import android.os.AsyncTask;
710
import android.os.Bundle;
811
import android.os.Handler;
912
import android.support.annotation.NonNull;
1013
import android.support.annotation.Nullable;
1114
import android.support.design.widget.BottomSheetBehavior;
15+
import android.support.design.widget.Snackbar;
1216
import android.support.v4.app.Fragment;
1317
import android.support.v4.view.ViewPager;
1418
import android.support.v7.app.AppCompatActivity;
@@ -45,18 +49,28 @@
4549
import io.pslab.activity.LogicalAnalyzerActivity;
4650
import io.pslab.communication.ScienceLab;
4751
import io.pslab.communication.digitalChannel.DigitalChannel;
52+
import io.pslab.models.LogicAnalyzerData;
53+
import io.pslab.models.OscilloscopeData;
54+
import io.pslab.models.SensorDataBlock;
55+
import io.pslab.others.CSVLogger;
56+
import io.pslab.others.CustomSnackBar;
57+
import io.pslab.others.GPSLogger;
58+
import io.pslab.others.LocalDataLog;
4859
import io.pslab.others.LogicAnalyzerAxisFormatter;
4960
import io.pslab.others.MathUtils;
5061
import io.pslab.others.ScienceLabCommon;
5162
import io.pslab.others.SwipeGestureDetector;
5263

5364
import java.util.ArrayList;
5465
import java.util.Arrays;
66+
import java.util.Date;
5567
import java.util.LinkedHashMap;
5668
import java.util.List;
5769

5870
import butterknife.ButterKnife;
5971
import in.goodiebag.carouselpicker.CarouselPicker;
72+
import io.realm.Realm;
73+
import io.realm.RealmObject;
6074

6175
import static android.content.Context.MODE_PRIVATE;
6276

@@ -102,6 +116,15 @@ public class LALogicLinesFragment extends Fragment {
102116
private TextView tvTimeUnit, xCoordinateText;
103117
private ImageView ledImageView;
104118
private Runnable logicAnalysis;
119+
private Realm realm;
120+
private ImageView recordButton;
121+
private GPSLogger gpsLogger;
122+
private CSVLogger csvLogger;
123+
private ArrayList<String> recordXAxis;
124+
private ArrayList<String> recordYAxis;
125+
private ArrayList<Integer> recordChannelMode;
126+
private String[] channels = new String[]{"LA1", "LA2", "LA3", "LA4"};
127+
private String csvHeader = "Timestamp,DateTime,Channel,ChannelMode,xData,yData,lat,lon";
105128

106129
public static LALogicLinesFragment newInstance(Activity activity) {
107130
LALogicLinesFragment laLogicLinesFragment = new LALogicLinesFragment();
@@ -114,7 +137,12 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
114137
super.onCreate(savedInstanceState);
115138
ButterKnife.bind(getActivity());
116139
scienceLab = ScienceLabCommon.scienceLab;
117-
140+
realm = LocalDataLog.with().getRealm();
141+
gpsLogger = new GPSLogger(getContext(), (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE));
142+
csvLogger = new CSVLogger(getString(R.string.logical_analyzer));
143+
recordXAxis = new ArrayList<>();
144+
recordYAxis = new ArrayList<>();
145+
recordChannelMode = new ArrayList<>();
118146
logicAnalysis = new Runnable() {
119147
@Override
120148
public void run() {
@@ -149,14 +177,51 @@ public void run() {
149177
@Override
150178
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
151179
View v = inflater.inflate(R.layout.logic_analyzer_logic_lines, container, false);
152-
153180
// LED Indicator
154181
ledImageView = v.findViewById(R.id.imageView_led_la);
155182

156183
// Heading
157184
tvTimeUnit = v.findViewById(R.id.la_tv_time_unit);
158185
tvTimeUnit.setText(getString(R.string.time_unit_la));
159186

187+
//recordButton
188+
189+
recordButton = v.findViewById(R.id.la_record_button);
190+
recordButton.setOnClickListener(new View.OnClickListener() {
191+
@Override
192+
public void onClick(View v) {
193+
long block = System.currentTimeMillis();
194+
double lat;
195+
double lon;
196+
if (gpsLogger.isGPSEnabled()) {
197+
Location location = gpsLogger.getDeviceLocation();
198+
if (location != null) {
199+
lat = location.getLatitude();
200+
lon = location.getLongitude();
201+
} else {
202+
lat = 0.0;
203+
lon = 0.0;
204+
}
205+
} else {
206+
lat = 0.0;
207+
lon = 0.0;
208+
}
209+
csvLogger.prepareLogFile();
210+
csvLogger.writeMetaData(getContext().getResources().getString(R.string.logical_analyzer));
211+
csvLogger.writeCSVFile(csvHeader);
212+
recordSensorDataBlockID(new SensorDataBlock(block, getResources().getString(R.string.logical_analyzer)));
213+
long timestamp = System.currentTimeMillis();
214+
String timeData = timestamp + "," + CSVLogger.FILE_NAME_FORMAT.format(new Date(timestamp));
215+
String locationData = lat + "," + lon;
216+
for (int i = 0; i < recordXAxis.size(); i ++) {
217+
recordSensorData(new LogicAnalyzerData(timestamp + i, block, channels[i], recordChannelMode.get(i), recordXAxis.get(i), recordYAxis.get(i), lat, lon));
218+
String data = timeData + "," + channels[i] + "," + recordChannelMode.get(i) + "," + recordXAxis.get(i) + "," + recordYAxis.get(i) + "," + locationData;
219+
csvLogger.writeCSVFile(data);
220+
}
221+
CustomSnackBar.showSnackBar(v, getString(R.string.file_created_success_message), null, null, Snackbar.LENGTH_SHORT);
222+
}
223+
});
224+
160225
// Carousel View
161226
carouselPicker = v.findViewById(R.id.carouselPicker);
162227
llChannel1 = v.findViewById(R.id.ll_chart_channel_1);
@@ -830,6 +895,10 @@ protected void onPostExecute(Void aVoid) {
830895
Log.v("x Axis", stringBuilder1.toString());
831896
Log.v("y Axis", stringBuilder2.toString());
832897

898+
recordXAxis.clear();
899+
recordXAxis.add(stringBuilder1.toString());
900+
recordYAxis.add(stringBuilder2.toString());
901+
recordChannelMode.add(digitalChannel.mode);
833902
// Plot the fetched data
834903
switch (edgeOption) {
835904
case "EVERY EDGE":
@@ -951,8 +1020,12 @@ protected void onPostExecute(Void aVoid) {
9511020
yaxis.add(digitalChannelArray.get(0).getYAxis());
9521021
yaxis.add(digitalChannelArray.get(1).getYAxis());
9531022

1023+
recordXAxis.clear();
1024+
recordYAxis.clear();
1025+
recordChannelMode.clear();
9541026
// Plot the fetched data
9551027
for (int i = 0; i < channelMode; i++) {
1028+
storeAxisValues(xaxis.get(i), yaxis.get(i), digitalChannelArray.get(i).mode);
9561029
switch (edgeOption[i]) {
9571030
case "EVERY EDGE":
9581031
singleChannelEveryEdge(xaxis.get(i), yaxis.get(i));
@@ -1081,8 +1154,12 @@ protected void onPostExecute(Void aVoid) {
10811154
yaxis.add(digitalChannelArray.get(1).getYAxis());
10821155
yaxis.add(digitalChannelArray.get(2).getYAxis());
10831156

1157+
recordXAxis.clear();
1158+
recordYAxis.clear();
1159+
recordChannelMode.clear();
10841160
// Plot the fetched data
10851161
for (int i = 0; i < channelMode; i++) {
1162+
storeAxisValues(xaxis.get(i), yaxis.get(i), digitalChannelArray.get(i).mode);
10861163
switch (edgeOption[i]) {
10871164
case "EVERY EDGE":
10881165
singleChannelEveryEdge(xaxis.get(i), yaxis.get(i));
@@ -1221,8 +1298,12 @@ protected void onPostExecute(Void aVoid) {
12211298
yaxis.add(digitalChannelArray.get(2).getYAxis());
12221299
yaxis.add(digitalChannelArray.get(3).getYAxis());
12231300

1301+
recordXAxis.clear();
1302+
recordYAxis.clear();
1303+
recordChannelMode.clear();
12241304
// Plot the fetched data
12251305
for (int i = 0; i < channelMode; i++) {
1306+
storeAxisValues(xaxis.get(i), yaxis.get(i), digitalChannelArray.get(i).mode);
12261307
switch (edgeOption[i]) {
12271308
case "EVERY EDGE":
12281309
singleChannelEveryEdge(xaxis.get(i), yaxis.get(i));
@@ -1270,4 +1351,28 @@ protected void onPostExecute(Void aVoid) {
12701351
analyze_button.setClickable(true);
12711352
}
12721353
}
1354+
1355+
private void storeAxisValues(double[] xaxis, double[] yaxis, int mode) {
1356+
StringBuilder stringBuilder1 = new StringBuilder();
1357+
StringBuilder stringBuilder2 = new StringBuilder();
1358+
for (int i = 0; i < xaxis.length; i++) {
1359+
stringBuilder1.append(DataFormatter.formatDouble(xaxis[i], DataFormatter.LOW_PRECISION_FORMAT));
1360+
stringBuilder2.append(DataFormatter.formatDouble(yaxis[i], DataFormatter.LOW_PRECISION_FORMAT));
1361+
stringBuilder1.append(" ");
1362+
stringBuilder2.append(" ");
1363+
}
1364+
recordChannelMode.add(mode);
1365+
}
1366+
1367+
public void recordSensorDataBlockID(SensorDataBlock block) {
1368+
realm.beginTransaction();
1369+
realm.copyToRealm(block);
1370+
realm.commitTransaction();
1371+
}
1372+
1373+
public void recordSensorData(RealmObject sensorData) {
1374+
realm.beginTransaction();
1375+
realm.copyToRealm((LogicAnalyzerData) sensorData);
1376+
realm.commitTransaction();
1377+
}
12731378
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package io.pslab.models;
2+
3+
import io.realm.RealmObject;
4+
import io.realm.annotations.PrimaryKey;
5+
6+
public class LogicAnalyzerData extends RealmObject {
7+
@PrimaryKey
8+
private long time;
9+
private long block;
10+
private String dataX, dataY, channel;
11+
private double lat, lon;
12+
private int channelMode;
13+
14+
public LogicAnalyzerData() {/**/}
15+
16+
public LogicAnalyzerData(long time, long block, String channel, int channelMode, String dataX, String dataY, double lat, double lon) {
17+
this.time = time;
18+
this.block = block;
19+
this.channel = channel;
20+
this.channelMode = channelMode;
21+
this.dataX = dataX;
22+
this.dataY = dataY;
23+
this.lat = lat;
24+
this.lon = lon;
25+
}
26+
27+
public long getBlock() {
28+
return block;
29+
}
30+
31+
public void setBlock(long block) {
32+
this.block = block;
33+
}
34+
35+
public long getTime() {
36+
return time;
37+
}
38+
39+
public void setTime(long time) {
40+
this.time = time;
41+
}
42+
43+
public String getChannel() {
44+
return channel;
45+
}
46+
47+
public void setChannel(String channel) {
48+
this.channel = channel;
49+
}
50+
51+
public int getChannelMode() {
52+
return channelMode;
53+
}
54+
55+
public void setChannelMode(int channelMode) {
56+
this.channelMode = channelMode;
57+
}
58+
59+
public String getDataY() {
60+
return dataY;
61+
}
62+
63+
public void setDataY(String dataY) {
64+
this.dataY = dataY;
65+
}
66+
67+
public String getDataX() {
68+
return dataX;
69+
}
70+
71+
public void setDataX(String dataX) {
72+
this.dataX = dataX;
73+
}
74+
75+
public double getLon() {
76+
return lon;
77+
}
78+
79+
public void setLon(double lon) {
80+
this.lon = lon;
81+
}
82+
83+
public double getLat() {
84+
return lat;
85+
}
86+
87+
public void setLat(double lat) {
88+
this.lat = lat;
89+
}
90+
91+
@Override
92+
public String toString() {
93+
return "Block - " + block + ", Time - " + time + ", Channel - " + channel + ", ChannelMode - " + channelMode + ", dataX - " + dataX + ", dataY - " + dataY + ", Lat - " + lat + ", Lon - " + lon;
94+
}
95+
}

app/src/main/res/layout-land/logic_analyzer_logic_lines.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,13 @@
7171
android:tag="red"
7272
app:srcCompat="@drawable/red_led" />
7373

74+
<ImageView
75+
android:id="@+id/la_record_button"
76+
android:layout_width="25dp"
77+
android:layout_height="25dp"
78+
android:src="@drawable/ic_record_white"
79+
android:contentDescription="@string/record_title"
80+
android:layout_gravity="end"/>
7481
</FrameLayout>
7582

7683
</LinearLayout>

0 commit comments

Comments
 (0)