Skip to content

Commit 9e421d5

Browse files
authored
Merge pull request #173 from OpenSeizureDetector/169-v424+-ble-data-source-issues_2nd_attempt
169 v424+ ble data source issues 2nd attempt
2 parents 2c58f01 + 5a14836 commit 9e421d5

16 files changed

Lines changed: 416 additions & 33 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- Improved start-up checks for permissions
55
- Improved system re-start after changing settings (but still not perfect!)
66
- Disabled the CNN algorithm by default as it is causing some false alarms (Issue #170)
7+
- Added watch signal strength history graph and watch battery hisory graph to main activity
78
V4.2.5 - Set BLE device time if the characteristic is available.
89
V4.2.4 - Added checks and a FAULT condition for Bluetooth errors in Bluetooth Data Source
910
V4.2.3 - Uses 3d accelerometer data to calculate magnitude if vector magnitude is not sent from data source.

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools"
44
android:versionCode="139"
5-
android:versionName="4.2.6c">
5+
android:versionName="4.2.6">
66
<!-- android:allowBackup="false" -->
77
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
88

app/src/main/java/uk/org/openseizuredetector/FragmentBatt.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public void onCreate(Bundle savedInstanceState) {
6464
@Override
6565
public void onResume() {
6666
super.onResume();
67-
mLineChart = mRootView.findViewById(R.id.lineChart);
67+
mLineChart = mRootView.findViewById(R.id.battLineChart);
6868
mLineChart.getLegend().setEnabled(false);
6969
XAxis xAxis = mLineChart.getXAxis();
7070
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
@@ -76,8 +76,8 @@ public void onResume() {
7676
xAxis.setTextColor(Color.WHITE);
7777

7878
YAxis yAxis = mLineChart.getAxisLeft();
79-
yAxis.setAxisMinValue(40f);
80-
yAxis.setAxisMaxValue(240f);
79+
yAxis.setAxisMinValue(0f);
80+
yAxis.setAxisMaxValue(100f);
8181
yAxis.setDrawGridLines(true);
8282
yAxis.setDrawLabels(true);
8383
yAxis.setTextColor(Color.WHITE);
@@ -111,6 +111,7 @@ protected void updateUi() {
111111
double watchBattArr[] = mConnection.mSdServer.mSdData.watchBattBuff.getVals(); // This gives us a simple vector of hr values to plot.
112112
int nPhoneBattArr = mConnection.mSdServer.mSdData.phoneBattBuff.getNumVals();
113113
double phoneBattArr[] = mConnection.mSdServer.mSdData.phoneBattBuff.getVals();
114+
Log.i(TAG,"updateUi() - nWatchBattArr="+nWatchBattArr+", nPhoneBattArr="+nPhoneBattArr);
114115
if (Objects.nonNull(mConnection.mSdServer.mSdData.watchBattBuff) && nWatchBattArr > 0) {
115116
Log.v(TAG, "hrWatchBattBuff.getNumVals=" + nWatchBattArr);
116117
lineDataSet.clear();

app/src/main/java/uk/org/openseizuredetector/FragmentCommon.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,11 @@ protected void updateUi() {
193193
tv.setText(getString(R.string.DataSource) + " = " + "Phone (Demo Mode)");
194194
tv.setBackgroundColor(warnColour);
195195
tv.setTextColor(warnTextColour);
196-
} else if (mConnection.mSdServer.mSdDataSourceName.equals("BLE")) {
196+
} else if (mConnection.mSdServer.mSdDataSourceName.equals("BLE")
197+
|| mConnection.mSdServer.mSdDataSourceName.equals("BLE2")) {
197198
tv.setText(getString(R.string.DataSource) + " = " + mConnection.mSdServer.mSdDataSourceName
198199
+ " ("+ mConnection.mSdServer.mSdData.watchSdName + ", "
199-
+ mConnection.mSdServer.mSdData.watchPartNo+")");
200+
+ mConnection.mSdServer.mSdData.watchSerNo+")");
200201
} else {
201202
tv.setText(getString(R.string.DataSource) + " = " + mConnection.mSdServer.mSdDataSourceName);
202203
}

app/src/main/java/uk/org/openseizuredetector/FragmentSystem.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,20 @@ protected void updateUi() {
174174
tv.setBackgroundColor(okColour);
175175
tv.setTextColor(okTextColour);
176176
}
177+
tv = (TextView) mRootView.findViewById(R.id.watch_manuf_tv);
178+
tv.setText(mConnection.mSdServer.mSdData.watchManuf);
179+
tv = (TextView) mRootView.findViewById(R.id.watch_partno_tv);
180+
tv.setText(mConnection.mSdServer.mSdData.watchPartNo);
181+
tv = (TextView) mRootView.findViewById(R.id.watch_fwver_tv);
182+
tv.setText(mConnection.mSdServer.mSdData.watchFwVersion);
183+
tv = (TextView) mRootView.findViewById(R.id.watch_sdname_tv);
184+
tv.setText(mConnection.mSdServer.mSdData.watchSdName);
185+
tv = (TextView) mRootView.findViewById(R.id.watch_sdver_tv);
186+
tv.setText(mConnection.mSdServer.mSdData.watchSdVersion);
187+
tv = (TextView) mRootView.findViewById(R.id.watch_batt_tv);
188+
tv.setText(mConnection.mSdServer.mSdData.batteryPc+" %");
189+
tv = (TextView) mRootView.findViewById(R.id.watch_signal_tv);
190+
tv.setText(String.format("%.0f dB", mConnection.mSdServer.mSdData.watchSignalStrength));
177191
}
178192
} catch (Exception e) {
179193
Log.e(TAG, "UpdateUi: Exception - ");
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package uk.org.openseizuredetector;
2+
3+
import android.graphics.Color;
4+
import android.os.Bundle;
5+
import android.util.Log;
6+
import android.view.LayoutInflater;
7+
import android.view.View;
8+
import android.view.ViewGroup;
9+
import android.widget.TextView;
10+
11+
import androidx.appcompat.widget.SwitchCompat;
12+
13+
import com.github.mikephil.charting.charts.LineChart;
14+
import com.github.mikephil.charting.components.XAxis;
15+
import com.github.mikephil.charting.components.YAxis;
16+
import com.github.mikephil.charting.data.Entry;
17+
import com.github.mikephil.charting.data.LineData;
18+
import com.github.mikephil.charting.data.LineDataSet;
19+
import com.github.mikephil.charting.utils.ValueFormatter;
20+
21+
import java.text.DecimalFormat;
22+
import java.util.ArrayList;
23+
import java.util.Arrays;
24+
import java.util.List;
25+
import java.util.Objects;
26+
27+
28+
public class FragmentWatchSig extends FragmentOsdBaseClass {
29+
String TAG = "FragmentWatchSig";
30+
31+
LineChart mLineChart;
32+
LineData lineData;
33+
LineDataSet lineDataSet;
34+
List<Entry> sigHistory = new ArrayList<>();
35+
List<String> hrHistoryStrings = new ArrayList<>();
36+
37+
private TextView tvCurrSigStren;
38+
39+
public FragmentWatchSig() {
40+
// Required empty public constructor
41+
}
42+
43+
44+
@Override
45+
public void onCreate(Bundle savedInstanceState) {
46+
super.onCreate(savedInstanceState);
47+
lineDataSet = new LineDataSet(new ArrayList<Entry>(), "Watch Signal Strength history");
48+
//lineDataSet.setColors(ColorTemplate.JOYFUL_COLORS);
49+
lineDataSet.setValueTextColor(Color.BLACK);
50+
lineDataSet.setValueTextSize(18f);
51+
lineDataSet.setDrawValues(false);
52+
lineDataSet.setCircleSize(0f);
53+
lineDataSet.setLineWidth(3f);
54+
//lineDataSetAverage = new LineDataSet(new ArrayList<Entry>(),"Heart rate history" );
55+
//lineDataSetAverage.setColors(ColorTemplate.JOYFUL_COLORS);
56+
//lineDataSetAverage.setValueTextColor(Color.BLACK);
57+
//lineDataSetAverage.setValueTextSize(18f);
58+
59+
}
60+
61+
@Override
62+
public void onResume() {
63+
super.onResume();
64+
mLineChart = mRootView.findViewById(R.id.sigStrengthLineChart);
65+
mLineChart.getLegend().setEnabled(false);
66+
XAxis xAxis = mLineChart.getXAxis();
67+
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
68+
xAxis.setTextSize(10f);
69+
xAxis.setDrawAxisLine(true);
70+
xAxis.setDrawLabels(true);
71+
// Note: the default text colour is BLACK, so does not show up on black background!!!
72+
// This took a lot of finding....
73+
xAxis.setTextColor(Color.WHITE);
74+
75+
YAxis yAxis = mLineChart.getAxisLeft();
76+
//yAxis.setAxisMinValue(40f);
77+
//yAxis.setAxisMaxValue(240f);
78+
yAxis.setDrawGridLines(true);
79+
yAxis.setDrawLabels(true);
80+
yAxis.setTextColor(Color.WHITE);
81+
// Inhibit the decimal part of the y axis labels.
82+
yAxis.setValueFormatter(new ValueFormatter() {
83+
@Override
84+
public String getFormattedValue(float v) {
85+
DecimalFormat format = new DecimalFormat("###");
86+
return format.format(v);
87+
}
88+
});
89+
90+
YAxis yAxis2 = mLineChart.getAxisRight();
91+
yAxis2.setDrawGridLines(false);
92+
yAxis2.setEnabled(false);
93+
}
94+
95+
@Override
96+
public View onCreateView(LayoutInflater inflater, ViewGroup container,
97+
Bundle savedInstanceState) {
98+
// Inflate the layout for this fragment
99+
return inflater.inflate(R.layout.fragment_watch_sig, container, false);
100+
}
101+
102+
@Override
103+
protected void updateUi() {
104+
Log.d(TAG, "updateUi()");
105+
tvCurrSigStren = (TextView) mRootView.findViewById(R.id.current_sig_strength_tv);
106+
if (mConnection.mBound) {
107+
if (Objects.nonNull(tvCurrSigStren))
108+
tvCurrSigStren.setText(String.valueOf((int) mConnection.mSdServer.mSdData.watchSignalStrength));
109+
double histArr[] = mConnection.mSdServer.mSdData.watchSignalStrengthBuff.getVals();
110+
int nHist = histArr.length;
111+
if (Objects.nonNull(histArr) && nHist > 0) {
112+
Log.v(TAG, "nHist=" + nHist);
113+
lineDataSet.clear();
114+
String xVals[] = new String[nHist];
115+
for (int i = 0; i < nHist; i++) {
116+
//Log.d(TAG,"i="+i+", HR="+hrHistArr[i]);
117+
xVals[i] = String.valueOf(i);
118+
lineDataSet.addEntry(new Entry((float) histArr[i], i));
119+
}
120+
Log.d(TAG, "xVals=" + Arrays.toString(xVals) + ", lneDataSet=" + lineDataSet.toSimpleString());
121+
lineDataSet.setColors(new int[]{0xffff0000});
122+
LineData histLineData = new LineData(xVals, lineDataSet);
123+
124+
125+
mLineChart.setData(histLineData);
126+
mLineChart.getData().notifyDataChanged();
127+
mLineChart.notifyDataSetChanged();
128+
mLineChart.refreshDrawableState();
129+
float xSpan = (nHist * 5.0f) / 60.0f; // time in minutes assuming one point every 5 seconds.
130+
mLineChart.setDescription("Signal Strength History "
131+
+ String.format("%.1f", xSpan)
132+
+ " " + getString(R.string.minutes));
133+
mLineChart.setDescriptionTextSize(12f);
134+
mLineChart.invalidate();
135+
//if (mConnection.mBound){
136+
// lineChart.postInvalidate();
137+
//}
138+
}
139+
140+
} else {
141+
Log.w(TAG,"not Bound to Server");
142+
return;
143+
}
144+
145+
146+
}
147+
148+
}

app/src/main/java/uk/org/openseizuredetector/MainActivity2.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,10 @@ public Fragment createFragment(int position) {
318318
return new FragmentHrAlg();
319319
case 2:
320320
return new FragmentSystem();
321-
//case 3:
322-
// return new FragmentBatt();
321+
case 3:
322+
return new FragmentWatchSig();
323+
case 4:
324+
return new FragmentBatt();
323325
//case 4:
324326
// return new FragmentDataSharing();
325327

@@ -331,7 +333,7 @@ public Fragment createFragment(int position) {
331333

332334
@Override
333335
public int getItemCount() {
334-
return 3;
336+
return 5;
335337
}
336338
}
337339

app/src/main/java/uk/org/openseizuredetector/SdData.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public class SdData implements Parcelable {
6969

7070
public CircBuf watchBattBuff = new CircBuf(24*3600/5, -1); // 24 hour buffer
7171
public CircBuf phoneBattBuff = new CircBuf(24*3600/5, -1); // 24 hour buffer
72+
public CircBuf watchSignalStrengthBuff = new CircBuf(4*3600/5, -1); // 4 hour buffer
7273

7374
/* Heart Rate Alarm Settings */
7475
public boolean mHRAlarmActive = false;
@@ -136,12 +137,14 @@ public class SdData implements Parcelable {
136137
public double mO2Sat = 0;
137138

138139
public double mPseizure = 0.;
140+
public float watchSignalStrength;
139141

140142
public SdData() {
141143
simpleSpec = new int[10];
142144
rawData = new double[N_RAW_DATA];
143145
rawData3D = new double[N_RAW_DATA * 3];
144146
dataTime = new Time(Time.getCurrentTimezone());
147+
dataTime.setToNow();
145148
timeDiff = 0f;
146149
}
147150

@@ -162,8 +165,12 @@ public boolean fromJSON(String jsonStr) {
162165
// FIXME - this doesn't work!!!
163166
Time tnow = new Time();
164167
tnow.setToNow();
165-
timeDiff = (tnow.toMillis(false)
166-
- dataTime.toMillis(false))/1000f;
168+
if (dataTime != null) {
169+
timeDiff = (tnow.toMillis(false)
170+
- dataTime.toMillis(false)) / 1000f;
171+
} else {
172+
timeDiff = 0f;
173+
}
167174
dataTime.setToNow();
168175
Log.v(TAG, "fromJSON(): dataTime = " + dataTime.toString());
169176
maxVal = jo.optInt("maxVal");
@@ -322,6 +329,7 @@ public String toSettingsJSON() {
322329
jsonObj.put("watchSdName", watchSdName);
323330
jsonObj.put("watchFwVersion", watchFwVersion);
324331
jsonObj.put("watchSdVersion", watchSdVersion);
332+
jsonObj.put("watchSignalStrength", watchSignalStrength);
325333

326334
retval = jsonObj.toString();
327335
} catch (Exception ex) {

app/src/main/java/uk/org/openseizuredetector/SdDataSource.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,6 @@ public String updateFromJSON(String jsonStr) {
390390
mSamplePeriod = (short) dataObject.getInt("analysisPeriod");
391391
mSampleFreq = (short) dataObject.getInt("sampleFreq");
392392
mSdData.batteryPc = (short) dataObject.getInt("battery");
393-
mSdData.watchBattBuff.add(mSdData.batteryPc);
394393

395394
Log.v(TAG, "updateFromJSON - mSamplePeriod=" + mSamplePeriod + " mSampleFreq=" + mSampleFreq);
396395
mUtil.writeToSysLogFile("SDDataSource.updateFromJSON - Settings Received");
@@ -475,6 +474,7 @@ protected void doAnalysis() {
475474
// Update phone battery level - it is done here so it is called for all data sources.
476475
mSdData.phoneBatteryPc = getPhoneBatteryLevel();
477476
mSdData.phoneBattBuff.add(mSdData.phoneBatteryPc);
477+
mSdData.watchBattBuff.add(mSdData.batteryPc);
478478
try {
479479
// FIXME - Use specified sampleFreq, not this hard coded one
480480
mSampleFreq = 25;
@@ -538,8 +538,12 @@ protected void doAnalysis() {
538538
mSdData.roiPower = (long) roiPower / ACCEL_SCALE_FACTOR;
539539
Time tnow = new Time();
540540
tnow.setToNow();
541-
mSdData.timeDiff = (tnow.toMillis(false)
542-
- mSdData.dataTime.toMillis(false))/1000f;
541+
if (mSdData.dataTime != null) {
542+
mSdData.timeDiff = (tnow.toMillis(false)
543+
- mSdData.dataTime.toMillis(false)) / 1000f;
544+
} else {
545+
mSdData.timeDiff = 0f;
546+
}
543547
mSdData.dataTime.setToNow();
544548

545549
mSdData.dataTime.setToNow();

0 commit comments

Comments
 (0)