From eac577f1a1959bd311ff58f7d1049f586569588a Mon Sep 17 00:00:00 2001 From: vsuryakumar Date: Sun, 5 Feb 2023 22:48:20 +0530 Subject: [PATCH] Added 3 sample run for one click + updated to store patient details + fixed long(infinite) loading issue on fetchIntensityValues methods. --- .../example/hpos/data/PreferenceUtility.kt | 8 ++ .../example/hpos/data/constant/Constants.kt | 2 + .../com/example/hpos/domain/SaveRawData.kt | 25 ++++++ .../testRight/TestRightExpReference.kt | 6 +- .../testRight/TestRightExpSample.kt | 82 ++++++++++++++++--- .../testRight/TestRightResults.kt | 4 +- .../testRight/TestRightViewModel.kt | 20 ++++- 7 files changed, 130 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/example/hpos/data/PreferenceUtility.kt b/app/src/main/java/com/example/hpos/data/PreferenceUtility.kt index 0b4d651..e8786bf 100644 --- a/app/src/main/java/com/example/hpos/data/PreferenceUtility.kt +++ b/app/src/main/java/com/example/hpos/data/PreferenceUtility.kt @@ -16,4 +16,12 @@ object PreferenceUtility { return prefix + counter } + fun generateId(context: Context): String { + val prefs: SharedPreferences = + context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) + val counter = prefs.getInt(KEY_COUNTER, 100) + prefs.edit().putInt(KEY_COUNTER, counter + 1).apply() + return counter.toString() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpos/data/constant/Constants.kt b/app/src/main/java/com/example/hpos/data/constant/Constants.kt index b0bc411..18ea8b4 100644 --- a/app/src/main/java/com/example/hpos/data/constant/Constants.kt +++ b/app/src/main/java/com/example/hpos/data/constant/Constants.kt @@ -24,4 +24,6 @@ object Constants { const val ERROR_NORMAL = 400 const val ERROR_CRITICAL = 401 + + const val NO_OF_TIMES_TO_RUN_SAMPLE = 3 } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpos/domain/SaveRawData.kt b/app/src/main/java/com/example/hpos/domain/SaveRawData.kt index 034f3ad..fc4feba 100644 --- a/app/src/main/java/com/example/hpos/domain/SaveRawData.kt +++ b/app/src/main/java/com/example/hpos/domain/SaveRawData.kt @@ -1,6 +1,7 @@ package com.example.hpos.domain import com.example.hpos.data.constant.Constants +import com.example.hpos.data.model.PatientData import com.example.hpos.data.model.TestRightCalculationData import com.opencsv.CSVWriter import java.io.File @@ -56,4 +57,28 @@ class SaveRawData { return outputString } + fun saveLogWithPatientData(folderPath: String, fileName: String, calculationData: TestRightCalculationData, patientData: PatientData) { + val fileObj = File(folderPath, fileName) + val writer = FileWriter(fileObj) + + writer.append(getLogStringFromObjWithPatientData(calculationData, patientData)) + writer.flush() + writer.close() + } + + private fun getLogStringFromObjWithPatientData(calculationData: TestRightCalculationData, patientData: PatientData) : String { + var outputString = "Test calculation logs ==>\n" + outputString += "Name = ${patientData.name}\n" + outputString += "Age = ${patientData.age}\n" + outputString += "Gender = ${patientData.gender}\n" + outputString += "Absorbance one = ${String.format("%.3f", calculationData.absorbanceOne)}, found at wavelength = ${String.format("%.3f", calculationData.wavelengthOfAbsorbanceOne)}\n" + outputString += "Absorbance two = ${String.format("%.3f", calculationData.absorbanceTwo)}, found at wavelength = ${String.format("%.3f", calculationData.wavelengthOfAbsorbanceTwo)}\n" + + outputString += "Calculated Ratio = ${String.format("%.3f", calculationData.ratioValue)}\n" + outputString += "\tlies in range min value = ${String.format("%.3f", calculationData.ratioMinRange)} & range max value = ${String.format("%.3f", calculationData.ratioMaxRange)}\n" + outputString += "Results = ${calculationData.result}\n" + + return outputString + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpReference.kt b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpReference.kt index 8eea58e..d013bf8 100644 --- a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpReference.kt +++ b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpReference.kt @@ -264,12 +264,14 @@ class TestRightExpReference : Fragment() { fullReadOutput.append(stringData) // Log.d(TAG, stringData) - if (stringData.contains("OK", true)) { +// if (stringData.contains("OK", true)) { + if (fullReadOutput.substring(Math.max(fullReadOutput.length - 15, 0)).contains("OK", true)) { + Log.d(TAG, "onUsbRead() called in sendCmdToFetchLightIntensities()") // Log.d(TAG, fullReadOutput.toString()) viewModel.mapIntensityValues(fullReadOutput.toString(), true) - viewModel.saveLogTest(requireContext().applicationContext, true, fullReadOutput.toString()) +// viewModel.saveLogTest(requireContext().applicationContext, true, fullReadOutput.toString()) DataHolder.isReferenceTaken = true diff --git a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpSample.kt b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpSample.kt index 8d7ec5f..77165b7 100644 --- a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpSample.kt +++ b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpSample.kt @@ -10,6 +10,8 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import com.example.hpos.R +import com.example.hpos.data.DataHolder +import com.example.hpos.data.PreferenceUtility import com.example.hpos.data.constant.Constants import com.example.hpos.data.constant.TestRightCommands import com.example.hpos.data.model.PatientData @@ -133,9 +135,10 @@ class TestRightExpSample : Fragment() { data?.let { val stringData = String(it) fullReadOutput.append(stringData) - - if (stringData.contains("OK", true)) { -// viewModel.progressBar.postValue(false) + Log.d(TAG, stringData) +// if (stringData.contains("OK", true)) { +// if (stringData.contains("OK", true) || fullReadOutput.substring(Math.max(fullReadOutput.length - 15, 0)).contains("OK", true)) { + if (fullReadOutput.substring(Math.max(fullReadOutput.length - 15, 0)).contains("OK", true)) { Log.d(TAG, "onUsbRead() called in sendCmdToRun()") Handler(Looper.getMainLooper()).postDelayed( Runnable { @@ -166,14 +169,18 @@ class TestRightExpSample : Fragment() { data?.let { val stringData = String(it) fullReadOutput.append(stringData) -// Log.d(TAG, stringData) - if (stringData.contains("OK", true)) { + Log.d(TAG, stringData) +// if (stringData.contains("OK", true)) { +// if (stringData.contains("OK", true) || stringData.contains("O", true) || stringData.contains("K", true)) { +// if (stringData.contains("OK", true) || fullReadOutput.substring(Math.max(fullReadOutput.length - 15, 0)).contains("OK", true)) { + if (fullReadOutput.substring(Math.max(fullReadOutput.length - 15, 0)).contains("OK", true)) { Log.d(TAG, "onUsbRead() called in sendCmdToFetchLightIntensities()") viewModel.mapIntensityValues(fullReadOutput.toString(), false) - viewModel.saveLogTest(requireContext().applicationContext, false, fullReadOutput.toString()) +// viewModel.saveLogTest(requireContext().applicationContext, false, fullReadOutput.toString()) - showResultsAfterAcquiring() +// showResultsAfterAcquiring() + checkIfToRunAgain() } } } @@ -185,9 +192,34 @@ class TestRightExpSample : Fragment() { }) } - private fun showResultsAfterAcquiring() { + private fun checkIfToRunAgain() { + viewModel.numberOfSampleRun++ + + viewModel.mapWavelengthToAbsorbance() + // Todo: Save CSV + Test CSV + viewModel.calculateResults() + // Todo: Save Log + + saveDataLocally() + + if (viewModel.numberOfSampleRun < Constants.NO_OF_TIMES_TO_RUN_SAMPLE) { + Handler(Looper.getMainLooper()).postDelayed( + { + startAcquiring() + }, + Constants.DELAY_BETWEEN_COMMANDS + ) + } else { + viewModel.numberOfSampleRun = 0 + showResultsAfterAcquiring() + } + } + + private fun showResultsAfterAcquiring() { +// viewModel.mapWavelengthToAbsorbance() +// viewModel.calculateResults() viewModel.progressBar.postValue(false) // binding.progressBar.visibility = View.GONE @@ -195,9 +227,35 @@ class TestRightExpSample : Fragment() { .commit() } -// fun View.setAllEnabled(enabled: Boolean) { -// isEnabled = enabled -// if (this is ViewGroup) children.forEach { child -> child.setAllEnabled(enabled) } -// } + private fun saveDataLocally() { + val patientName = viewModel.patientDetails.name +// if (patientName.length > 5){ +// patientName = patientName.substring(0, 5) +// } + + val id = PreferenceUtility.generateId(requireContext()) + + val prefixCsv = "HPOSSC_${DataHolder.deviceSerialNumber}_${patientName}_" + val fileExtensionCsv = ".csv" + val fileNameCsv = prefixCsv + id + fileExtensionCsv + saveCsv(fileNameCsv) + + val prefixTxt = "log_${DataHolder.deviceSerialNumber}_${patientName}_" + val fileExtensionTxt = ".txt" + val fileNameTxt = prefixTxt + id + fileExtensionTxt + saveLog(fileNameTxt) + } + + private fun saveCsv(fileName: String) { + Log.d(TAG, "saveCsv() called") + + viewModel.saveCsv(requireContext().applicationContext, fileName) + viewModel.saveCsvForTesting(requireContext().applicationContext, "detailed_$fileName") + } + + private fun saveLog(fileName: String) { + Log.d(TAG, "saveLog() called") + viewModel.saveLogWithPatient(requireContext().applicationContext, fileName) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightResults.kt b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightResults.kt index 7cc3d00..57f6650 100644 --- a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightResults.kt +++ b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightResults.kt @@ -39,8 +39,8 @@ class TestRightResults : Fragment() { super.onViewCreated(view, savedInstanceState) setupListeners() updateResults() - saveCsv() - saveLog() +// saveCsv() +// saveLog() } private fun setupListeners() { diff --git a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightViewModel.kt b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightViewModel.kt index 2a49b48..d35304f 100644 --- a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightViewModel.kt +++ b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightViewModel.kt @@ -27,6 +27,7 @@ class TestRightViewModel : ViewModel() { val progressBar = MutableLiveData(false) // val errorTriggered = MutableLiveData("") val errorTriggered = MutableLiveData() + var numberOfSampleRun = 0 lateinit var patientDetails: PatientData @@ -97,7 +98,7 @@ class TestRightViewModel : ViewModel() { if (isReference) DataHolder.intensityReferenceArray.clear() else intensitySampleArray.clear() - Log.d(TAG, fullString) +// Log.d(TAG, fullString) val listOfString = fullString.split("\n") for (line in listOfString) { @@ -268,6 +269,23 @@ class TestRightViewModel : ViewModel() { } } + fun saveLogWithPatient(appContext: Context, fileName: String) { + var folderPath: String? = DataHolder.appFolderPath + + if (DataHolder.isAppFolderCreated) { + SaveRawData().saveLogWithPatientData(folderPath!!, fileName, calculationData, patientDetails) + } else { + folderPath = MyUtils.createAppFolder(appContext) + if (folderPath != null){ + DataHolder.isAppFolderCreated = true + DataHolder.appFolderPath = folderPath + SaveRawData().saveLogWithPatientData(folderPath, fileName, calculationData, patientDetails) + } else { +// errorTriggered.postValue("Unable to save Log, Please try again") + } + } + } + fun saveLogTest(appContext: Context, isReference: Boolean, fullString: String) { var fileName: String = "test_log_" + SimpleDateFormat("ddMMyyyy_HHmmss").format(Date()) + ".txt"