diff --git a/app/src/main/java/uk/org/openseizuredetector/FragmentBatt.java b/app/src/main/java/uk/org/openseizuredetector/FragmentBatt.java new file mode 100644 index 0000000..4bb0432 --- /dev/null +++ b/app/src/main/java/uk/org/openseizuredetector/FragmentBatt.java @@ -0,0 +1,144 @@ +package uk.org.openseizuredetector; + +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.appcompat.widget.SwitchCompat; + +import com.github.mikephil.charting.charts.LineChart; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.utils.ValueFormatter; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + + +public class FragmentBatt extends FragmentOsdBaseClass { + String TAG = "FragmentBatt"; + + LineChart mLineChart; + LineData lineData; + LineDataSet lineDataSet; + List watchHistory = new ArrayList<>(); + List phoneHistory = new ArrayList<>(); + List hrHistoryStrings = new ArrayList<>(); + List hrAveragesStrings = new ArrayList<>(); + private List listToDisplay; + private List listToDisplayStrings; + + + public FragmentBatt() { + // Required empty public constructor + } + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + lineDataSet = new LineDataSet(new ArrayList(), "Battery history"); + //lineDataSet.setColors(ColorTemplate.JOYFUL_COLORS); + lineDataSet.setValueTextColor(Color.BLACK); + lineDataSet.setValueTextSize(18f); + lineDataSet.setDrawValues(false); + lineDataSet.setCircleSize(0f); + lineDataSet.setLineWidth(3f); + //lineDataSetAverage = new LineDataSet(new ArrayList(),"Heart rate history" ); + //lineDataSetAverage.setColors(ColorTemplate.JOYFUL_COLORS); + //lineDataSetAverage.setValueTextColor(Color.BLACK); + //lineDataSetAverage.setValueTextSize(18f); + + } + + @Override + public void onResume() { + super.onResume(); + mLineChart = mRootView.findViewById(R.id.lineChart); + mLineChart.getLegend().setEnabled(false); + XAxis xAxis = mLineChart.getXAxis(); + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); + xAxis.setTextSize(10f); + xAxis.setDrawAxisLine(true); + xAxis.setDrawLabels(true); + // Note: the default text colour is BLACK, so does not show up on black background!!! + // This took a lot of finding.... + xAxis.setTextColor(Color.WHITE); + + YAxis yAxis = mLineChart.getAxisLeft(); + yAxis.setAxisMinValue(40f); + yAxis.setAxisMaxValue(240f); + yAxis.setDrawGridLines(true); + yAxis.setDrawLabels(true); + yAxis.setTextColor(Color.WHITE); + // Inhibit the decimal part of the y axis labels. + yAxis.setValueFormatter(new ValueFormatter() { + @Override + public String getFormattedValue(float v) { + DecimalFormat format = new DecimalFormat("###"); + return format.format(v); + } + }); + + YAxis yAxis2 = mLineChart.getAxisRight(); + yAxis2.setDrawGridLines(false); + yAxis2.setEnabled(false); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_batt, container, false); + } + + @Override + protected void updateUi() { + Log.d(TAG, "updateUi()"); + if (mConnection.mBound) { + + int nWatchBattArr = mConnection.mSdServer.mSdData.watchBattBuff.getNumVals(); + double watchBattArr[] = mConnection.mSdServer.mSdData.watchBattBuff.getVals(); // This gives us a simple vector of hr values to plot. + int nPhoneBattArr = mConnection.mSdServer.mSdData.phoneBattBuff.getNumVals(); + double phoneBattArr[] = mConnection.mSdServer.mSdData.phoneBattBuff.getVals(); + if (Objects.nonNull(mConnection.mSdServer.mSdData.watchBattBuff) && nWatchBattArr > 0) { + Log.v(TAG, "hrWatchBattBuff.getNumVals=" + nWatchBattArr); + lineDataSet.clear(); + String xVals[] = new String[nWatchBattArr]; + for (int i = 0; i < nWatchBattArr; i++) { + //Log.d(TAG,"i="+i+", HR="+hrHistArr[i]); + xVals[i] = String.valueOf(i); + lineDataSet.addEntry(new Entry((float) watchBattArr[i], i)); + } + Log.d(TAG, "xVals=" + Arrays.toString(xVals) + ", lneDataSet=" + lineDataSet.toSimpleString()); + lineDataSet.setColors(new int[]{0xffff0000}); + LineData watchBattHistLineData = new LineData(xVals, lineDataSet); + + + mLineChart.setData(watchBattHistLineData); + mLineChart.getData().notifyDataChanged(); + mLineChart.notifyDataSetChanged(); + mLineChart.refreshDrawableState(); + float xSpan = (nWatchBattArr * 5.0f) / 60.0f; // time in minutes assuming one point every 5 seconds. + mLineChart.setDescription(getString(R.string.watch_batt_hist) + + String.format("%.1f", xSpan) + + " " + getString(R.string.minutes)); + mLineChart.setDescriptionTextSize(12f); + mLineChart.invalidate(); + //if (mConnection.mBound){ + // lineChart.postInvalidate(); + //} + } + } + } +} diff --git a/app/src/main/java/uk/org/openseizuredetector/FragmentHrAlg.java b/app/src/main/java/uk/org/openseizuredetector/FragmentHrAlg.java index 957cff9..ab3be42 100644 --- a/app/src/main/java/uk/org/openseizuredetector/FragmentHrAlg.java +++ b/app/src/main/java/uk/org/openseizuredetector/FragmentHrAlg.java @@ -26,7 +26,7 @@ import java.util.Objects; public class FragmentHrAlg extends FragmentOsdBaseClass { - String TAG = "FragmentOsdAlg"; + String TAG = "FragmentHrAlg"; LineChart mLineChart; LineData lineData; diff --git a/app/src/main/java/uk/org/openseizuredetector/MainActivity2.java b/app/src/main/java/uk/org/openseizuredetector/MainActivity2.java index 59950fa..23d6bac 100644 --- a/app/src/main/java/uk/org/openseizuredetector/MainActivity2.java +++ b/app/src/main/java/uk/org/openseizuredetector/MainActivity2.java @@ -295,7 +295,7 @@ public class MainActivity2 extends AppCompatActivity { case 1: return new FragmentHrAlg(); case 2: - return new FragmentMlAlg(); + return new FragmentBatt(); case 3: return new FragmentSystem(); case 4: diff --git a/app/src/main/java/uk/org/openseizuredetector/SdData.java b/app/src/main/java/uk/org/openseizuredetector/SdData.java index 8eaf1ed..10bf111 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdData.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdData.java @@ -67,6 +67,9 @@ public class SdData implements Parcelable { public long batteryPc; // watch battery public int phoneBatteryPc; + public CircBuf watchBattBuff = new CircBuf(24*3600/5, -1); // 24 hour buffer + public CircBuf phoneBattBuff = new CircBuf(24*3600/5, -1); // 24 hour buffer + /* Heart Rate Alarm Settings */ public boolean mHRAlarmActive = false; public boolean mHRNullAsAlarm = false; @@ -166,6 +169,7 @@ public class SdData implements Parcelable { specPower = jo.optInt("specPower"); roiPower = jo.optInt("roiPower"); batteryPc = jo.optInt("batteryPc"); + watchBattBuff.add(batteryPc); watchConnected = jo.optBoolean("watchConnected"); watchAppRunning = jo.optBoolean("watchAppRunning"); alarmState = jo.optInt("alarmState"); diff --git a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java index 971e98b..9477b13 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java @@ -360,6 +360,7 @@ public abstract class SdDataSource { mSamplePeriod = (short) dataObject.getInt("analysisPeriod"); mSampleFreq = (short) dataObject.getInt("sampleFreq"); mSdData.batteryPc = (short) dataObject.getInt("battery"); + mSdData.watchBattBuff.add(mSdData.batteryPc); Log.v(TAG, "updateFromJSON - mSamplePeriod=" + mSamplePeriod + " mSampleFreq=" + mSampleFreq); mUtil.writeToSysLogFile("SDDataSource.updateFromJSON - Settings Received"); @@ -443,6 +444,7 @@ public abstract class SdDataSource { double[] fft = null; // Update phone battery level - it is done here so it is called for all data sources. mSdData.phoneBatteryPc = getPhoneBatteryLevel(); + mSdData.phoneBattBuff.add(mSdData.phoneBatteryPc); try { // FIXME - Use specified sampleFreq, not this hard coded one mSampleFreq = 25; diff --git a/app/src/main/res/layout/fragment_batt.xml b/app/src/main/res/layout/fragment_batt.xml new file mode 100644 index 0000000..4a6e11e --- /dev/null +++ b/app/src/main/res/layout/fragment_batt.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b188ce7..620d805 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -566,4 +566,6 @@ "Heart Rate History (bpm): " minutes "Algorithms: " + Battery History + Watch Battery History (%)