From f81a6e7dde970a4acec4ece66b40de63b015a10c Mon Sep 17 00:00:00 2001 From: Graham Jones Date: Sat, 13 Jan 2024 13:42:38 +0000 Subject: [PATCH] Partial merge of the HR history graphs by @AroonPro - still need to add averaging option and then make the x scale user selectable - it is 3 hours at the moment --- app/src/main/AndroidManifest.xml | 2 +- .../openseizuredetector/FragmentHrAlg.java | 108 ++++++++++++++++-- .../uk/org/openseizuredetector/SdAlgHr.java | 6 + .../org/openseizuredetector/SdDataSource.java | 2 +- app/src/main/res/layout/fragment_hr_alg.xml | 31 ++++- 5 files changed, 136 insertions(+), 13 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2237625..1954c1a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="4.2.1k"> diff --git a/app/src/main/java/uk/org/openseizuredetector/FragmentHrAlg.java b/app/src/main/java/uk/org/openseizuredetector/FragmentHrAlg.java index f81b662..3989cd6 100644 --- a/app/src/main/java/uk/org/openseizuredetector/FragmentHrAlg.java +++ b/app/src/main/java/uk/org/openseizuredetector/FragmentHrAlg.java @@ -1,5 +1,6 @@ package uk.org.openseizuredetector; +import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -7,8 +8,39 @@ 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.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.utils.ColorTemplate; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + + public class FragmentHrAlg extends FragmentOsdBaseClass { String TAG = "FragmentOsdAlg"; + + LineChart lineChart; + LineData lineData; + LineDataSet lineDataSet; + List hrHistory = new ArrayList<>(); + List hrAverages = new ArrayList<>(); + List hrHistoryStrings = new ArrayList<>(); + List hrAveragesStrings = new ArrayList<>(); + private List listToDisplay; + private List listToDisplayStrings; + + private TextView tvAvgAHr; + private TextView tvHr; + private TextView tv; + private TextView tvCurrent; + private SwitchCompat switchAverages; + public FragmentHrAlg() { // Required empty public constructor } @@ -17,6 +49,16 @@ public class FragmentHrAlg extends FragmentOsdBaseClass { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + lineDataSet = new LineDataSet(new ArrayList(),"Heart rate history" ); + lineDataSet.setColors(ColorTemplate.JOYFUL_COLORS); + lineDataSet.setValueTextColor(Color.BLACK); + lineDataSet.setValueTextSize(18f); + lineDataSet.setDrawValues(false); + //lineDataSetAverage = new LineDataSet(new ArrayList(),"Heart rate history" ); + //lineDataSetAverage.setColors(ColorTemplate.JOYFUL_COLORS); + //lineDataSetAverage.setValueTextColor(Color.BLACK); + //lineDataSetAverage.setValueTextSize(18f); + } @Override @@ -28,16 +70,66 @@ public class FragmentHrAlg extends FragmentOsdBaseClass { @Override protected void updateUi() { - Log.d(TAG,"updateUi()"); - TextView tv; - tv = (TextView)mRootView.findViewById(R.id.fragment_hr_alg_tv1); + Log.d(TAG, "updateUi()"); + tv = (TextView) mRootView.findViewById(R.id.fragment_hr_alg_tv1); + tvHr = (TextView) mRootView.findViewById(R.id.current_hr_tv); + tvAvgAHr = (TextView) mRootView.findViewById(R.id.adaptive_avg_hr_tv); if (mConnection.mBound) { tv.setText("Bound to Server"); - } else { - tv.setText("****NOT BOUND TO SERVER***"); - return; + + tvCurrent = mRootView.findViewById(R.id.textView2); + if (Objects.nonNull(tvCurrent)) { + if (Objects.nonNull(tvHr)) + tvHr.setText( String.valueOf((short)mConnection.mSdServer.mSdData.mHR)); + if (Objects.nonNull(tvAvgAHr)) + tvAvgAHr.setText( String.valueOf((short)mConnection.mSdServer.mSdData + .mAdaptiveHrAverage)); + tvCurrent.setText(new StringBuilder() + .append(mConnection.mSdServer.mSdData.mAdaptiveHrAverage) + .append("\nResult of checks: Adaptive Hr Alarm Standing: ") + .append(mConnection.mSdServer.mSdData.mAdaptiveHrAlarmStanding) + .append("\nAverage Hr Alarm Standing: ") + .append(mConnection.mSdServer.mSdData.mAdaptiveHrAlarmStanding) + .toString()); + + switchAverages = mRootView.findViewById(R.id.hr_average_switch); + + if (Objects.nonNull(mConnection.mSdServer.mSdDataSource.mSdAlgHr)) { + Log.v(TAG,"mSdAlgHr si not null"); + CircBuf hrHist = mConnection.mSdServer.mSdDataSource.mSdAlgHr.getHrHistBuff(); + int nHistArr = hrHist.getNumVals(); + double hrHistArr[] = hrHist.getVals(); // This gives us a simple vector of hr values to plot. + if (Objects.nonNull(hrHist) && nHistArr > 0) { + Log.v(TAG, "hrHist.getNumVals="+nHistArr); + lineDataSet.clear(); + String xVals[] = new String[nHistArr]; + for (int i = 0; i retVal = new ArrayList(); retVal.add(checkSimpleHr(hrVal)); retVal.add(checkAdaptiveHr(hrVal)); diff --git a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java index eadbded..f64ea8b 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java @@ -95,7 +95,7 @@ public abstract class SdDataSource { private short mFallWindow; private int mMute; // !=0 means muted by keypress on watch. private SdAlgNn mSdAlgNn; - private SdAlgHr mSdAlgHr; + protected SdAlgHr mSdAlgHr; // Values for SD_MODE private int SIMPLE_SPEC_FMAX = 10; diff --git a/app/src/main/res/layout/fragment_hr_alg.xml b/app/src/main/res/layout/fragment_hr_alg.xml index c7780da..0618663 100644 --- a/app/src/main/res/layout/fragment_hr_alg.xml +++ b/app/src/main/res/layout/fragment_hr_alg.xml @@ -5,13 +5,15 @@ android:layout_height="match_parent" tools:context=".FragmentOsdBaseClass"> + - + + + + + + + + + + + +