From 9deac8e2789fe8fc3b6795e67610707bd463ff02 Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Thu, 9 Nov 2023 08:08:04 +0530 Subject: [PATCH 1/4] fix device ratio calc --- .../hpostesting/presentation/hemocube/HemoCubeFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt index fdc5cd9..362e32a 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt @@ -403,7 +403,7 @@ class HemoCubeFragment : Fragment() { val led2Average = log10(led2BufferForDevice?.div(led2SampleForDevice!!) ?: 0.0) val led3Average = log10(led3BufferForDevice?.div(led3SampleForDevice!!) ?: 0.0) val led4Average = log10(led4BufferForDevice?.div(led4SampleForDevice!!) ?: 0.0) - val deviceRatio = led1Average / led3Average + val deviceRatio = led3Average / led1Average if (led1Average < 0 || led2Average < 0) { activity?.runOnUiThread { From 29846ddf7d66a35b7a8e1bab8933975d8baa1ccf Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Thu, 9 Nov 2023 08:14:38 +0530 Subject: [PATCH 2/4] show result processing message --- .../hpostesting/presentation/hemocube/HemoCubeFragment.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt index 362e32a..d56ee51 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt @@ -392,6 +392,7 @@ class HemoCubeFragment : Fragment() { private fun processResult() { try { + hemoCubeViewModel.messages.postValue("processing result") val deviceLog = resultData val pInfo = requireActivity().packageManager.getPackageInfo( @@ -462,6 +463,7 @@ class HemoCubeFragment : Fragment() { private fun findResult(calculatedRatio: Double?): String { try { + hemoCubeViewModel.messages.postValue("result classification") if (calculatedRatio != null) { if (calculatedRatio < 0.05) return "Inconclusive. Very low Absorbance - Repeat test with Higher Blood Volume" From d3083c8dbc0b392c7fcb63ee82acfa5c077f0e1c Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Mon, 13 Nov 2023 08:06:24 +0530 Subject: [PATCH 3/4] add environment name in gradle --- app/build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 55ec74c..4fae05b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,12 +14,13 @@ android { compileSdk 34 namespace 'in.sminnovations.hpostesting' + // prod - production, preprod - preproduction, quality - qc, defaultConfig { applicationId "in.sminnovations.hpostesting" minSdk 21 targetSdk 34 - versionCode 24 - versionName "2.1.24" + versionCode 28 + versionName "2.1.28" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } From 74ad03bf8bdd6bb6ee733e7686d9a080be4ff3d3 Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Tue, 14 Nov 2023 00:22:40 +0530 Subject: [PATCH 4/4] add buffer validation withn bounds --- .../hpostesting/data/constant/Constants.kt | 3 + .../presentation/hemocube/HemoCubeFragment.kt | 57 ++++++++++++++----- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt b/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt index bcef509..33aff22 100644 --- a/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt +++ b/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt @@ -74,4 +74,7 @@ object Constants { const val BUFFER_VALUE_3 = "BufferValue3" const val BUFFER_VALUE_4 = "BufferValue4" const val DEVICE_ID = "DEVICE_ID" + + const val BUFFER_LED_LOWER_BOUND = 20000 + const val BUFFER_LED_HIGHER_BOUND = 24000 } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt index d56ee51..735fcc6 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt @@ -45,12 +45,13 @@ class HemoCubeFragment : Fragment() { private val testingTrace = Firebase.performance.newTrace("testing_trace") private var led1BufferForDevice = 0.0 private var led2BufferForDevice = 0.0 - private var led3BufferForDevice = 0.0 + private var led3BufferForDevice = 0.0 private var led4BufferForDevice = 0.0 private var led1SampleForDevice = 0.0 private var led2SampleForDevice = 0.0 - private var led3SampleForDevice = 0.0 + private var led3SampleForDevice = 0.0 private var led4SampleForDevice = 0.0 + private var validationError = false override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, @@ -96,8 +97,8 @@ class HemoCubeFragment : Fragment() { binding.tvSubtitle4.visibility = View.VISIBLE binding.tvSubtitle4.text = "Sample Started" } - startSampleProcess() - it.visibility = View.GONE + startSampleProcess() + it.visibility = View.GONE } binding.btnPlacebuffer.setOnClickListener { @@ -355,7 +356,8 @@ class HemoCubeFragment : Fragment() { sampleIntensity = resultLines[7].split(' ')[1].trim() led3SampleForDevice = resultLines[7].split(' ')[1].trim().toDoubleOrNull()!! sampleIntensity = resultLines[8].split(' ')[1].split('\r')[0].trim() - led4SampleForDevice = resultLines[8].split(' ')[1].split('\r')[0].trim().toDoubleOrNull()!! + led4SampleForDevice = + resultLines[8].split(' ')[1].split('\r')[0].trim().toDoubleOrNull()!! processResult() } } @@ -406,9 +408,34 @@ class HemoCubeFragment : Fragment() { val led4Average = log10(led4BufferForDevice?.div(led4SampleForDevice!!) ?: 0.0) val deviceRatio = led3Average / led1Average - if (led1Average < 0 || led2Average < 0) { + if (led1Average < 0 || led2Average < 0 || led3Average < 0 || led4Average < 0) { + validationError = true activity?.runOnUiThread { - binding.errorMessage.text = "Warning: Negative Abs. Retake Blank Reading" + binding.errorMessage.text = "Error: Negative Abs. Retake Blank Reading" + binding.errorMessage.visibility = View.VISIBLE + } + } + + if (led1BufferForDevice < Constants.BUFFER_LED_LOWER_BOUND + || led2BufferForDevice < Constants.BUFFER_LED_LOWER_BOUND + || led3BufferForDevice < Constants.BUFFER_LED_LOWER_BOUND + || led4BufferForDevice < Constants.BUFFER_LED_LOWER_BOUND + ) { + validationError = true + activity?.runOnUiThread { + binding.errorMessage.text = "Error: Invalid Test. Blank reading is too low" + binding.errorMessage.visibility = View.VISIBLE + } + } + + if (led1BufferForDevice > Constants.BUFFER_LED_HIGHER_BOUND + || led2BufferForDevice > Constants.BUFFER_LED_HIGHER_BOUND + || led3BufferForDevice > Constants.BUFFER_LED_HIGHER_BOUND + || led4BufferForDevice > Constants.BUFFER_LED_HIGHER_BOUND + ) { + validationError = true + activity?.runOnUiThread { + binding.errorMessage.text = "Error: Invalid Test. Blank reading is too high" binding.errorMessage.visibility = View.VISIBLE } } @@ -444,11 +471,13 @@ class HemoCubeFragment : Fragment() { apply() } } - activity?.runOnUiThread { - binding.btnSubmit.visibility = View.VISIBLE - binding.btnSubmit.isEnabled = true - binding.btnSubmit.isClickable = true - binding.clParent.setBackgroundColor(Color.parseColor("#edfffd")) + if (!validationError) { + activity?.runOnUiThread { + binding.btnSubmit.visibility = View.VISIBLE + binding.btnSubmit.isEnabled = true + binding.btnSubmit.isClickable = true + binding.clParent.setBackgroundColor(Color.parseColor("#edfffd")) + } } } } catch (e: Exception) { @@ -480,14 +509,14 @@ class HemoCubeFragment : Fragment() { if (calculatedRatio > 0.35) return "Inconclusive. Repeat with test with lower volume of blood" } else { - return "NULL" + return "INVALID" } } catch (e: Exception) { showToast("error while performing classification") Firebase.crashlytics.recordException(e) return "ERROR" } - return "NULL" + return "INVALID" } private fun showToast(message: String) {