diff --git a/app/build.gradle b/app/build.gradle index 7839f4b..1a6b819 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ android { // prod - production, preprod - preproduction, quality - qc, dev - development defaultConfig { - applicationId "in.sminnovations.hpostesting.preprod" + applicationId "in.sminnovations.hpostesting.dev" minSdk 21 targetSdk 34 versionCode 90 diff --git a/app/src/main/java/com/example/hpostesting/data/model/calibration/CalibrationData.kt b/app/src/main/java/com/example/hpostesting/data/model/calibration/CalibrationData.kt new file mode 100644 index 0000000..53871f3 --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/data/model/calibration/CalibrationData.kt @@ -0,0 +1,13 @@ +package com.example.hpostesting.data.model.calibration + +data class CalibrationData ( + var led1Slope: Double = 1.0, + var led1Intercept: Double = 0.0, + var led2Slope: Double = 1.0, + var led2Intercept: Double = 0.0, + var led3Slope: Double = 1.0, + var led3Intercept: Double = 0.0, + var led4Slope: Double = 1.0, + var led4Intercept: Double = 0.0, + var calibratedAt: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationFragment.kt index b62244d..cd93680 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationFragment.kt @@ -1,8 +1,11 @@ package com.example.hpostesting.presentation.calibration import android.content.Context +import android.content.Intent import android.content.SharedPreferences import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -12,8 +15,10 @@ import androidx.fragment.app.activityViewModels import androidx.lifecycle.MutableLiveData import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.constant.HemoCubeCommands +import com.example.hpostesting.data.model.calibration.CalibrationData import com.example.hpostesting.data.model.patient.DeviceData import com.example.hpostesting.presentation.UsbServiceListener +import com.example.hpostesting.presentation.dashboard.DashboardActivity import com.google.firebase.crashlytics.ktx.crashlytics import com.google.firebase.ktx.Firebase import `in`.sminnovations.hpostesting.databinding.FragmentCalibrationBinding @@ -27,6 +32,7 @@ class CalibrationFragment: Fragment() { private var resultData: String = "" private val messages = MutableLiveData() private var startListening = MutableLiveData(false) + private lateinit var calibrationData: CalibrationData override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, @@ -41,6 +47,7 @@ class CalibrationFragment: Fragment() { super.onViewCreated(view, savedInstanceState) initViews() observeViewModel() + loadSavedCalibration() } @@ -50,9 +57,140 @@ class CalibrationFragment: Fragment() { getDeviceId() binding.btnSubmit.setOnClickListener { binding.btnSubmit.visibility = View.GONE + saveCalibration() + } + + val etLed1Slope = binding.etLed1Slope + etLed1Slope.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + calibrationData.led1Slope = s.toString().toDoubleOrNull() ?: 0.0 + } + }) + val etLed1Intercept = binding.etLed1Intercept + etLed1Intercept.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + calibrationData.led1Intercept = s.toString().toDoubleOrNull() ?: 0.0 + } + }) + + val etLed2Slope = binding.etLed2Slope + etLed2Slope.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + calibrationData.led2Slope = s.toString().toDoubleOrNull() ?: 0.0 + } + }) + val etLed2Intercept = binding.etLed2Intercept + etLed2Intercept.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + calibrationData.led2Intercept = s.toString().toDoubleOrNull() ?: 0.0 + } + }) + + val etLed3Slope = binding.etLed3Slope + etLed3Slope.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + calibrationData.led3Slope = s.toString().toDoubleOrNull() ?: 0.0 + } + }) + val etLed3Intercept = binding.etLed3Intercept + etLed3Intercept.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + calibrationData.led3Intercept = s.toString().toDoubleOrNull() ?: 0.0 + } + }) + + val etLed4Slope = binding.etLed4Slope + etLed4Slope.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + calibrationData.led4Slope = s.toString().toDoubleOrNull() ?: 0.0 + } + }) + val etLed4Intercept = binding.etLed4Intercept + etLed4Intercept.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + calibrationData.led4Intercept = s.toString().toDoubleOrNull() ?: 0.0 + } + }) + } + + private fun loadSavedCalibration() { + calibrationData = calibrationViewModel.loadSavedCalibrationData() + activity?.runOnUiThread() { + binding.etLed1Slope.text = + Editable.Factory.getInstance().newEditable(calibrationData.led1Slope.toString()) + binding.etLed1Intercept.text = + Editable.Factory.getInstance().newEditable(calibrationData.led1Intercept.toString()) + + binding.etLed2Slope.text = + Editable.Factory.getInstance().newEditable(calibrationData.led2Slope.toString()) + binding.etLed2Intercept.text = + Editable.Factory.getInstance().newEditable(calibrationData.led2Intercept.toString()) + + binding.etLed3Slope.text = + Editable.Factory.getInstance().newEditable(calibrationData.led3Slope.toString()) + binding.etLed3Intercept.text = + Editable.Factory.getInstance().newEditable(calibrationData.led3Intercept.toString()) + + binding.etLed4Slope.text = + Editable.Factory.getInstance().newEditable(calibrationData.led4Slope.toString()) + binding.etLed4Intercept.text = + Editable.Factory.getInstance().newEditable(calibrationData.led4Intercept.toString()) } } + private fun saveCalibration() { + if (calibrationViewModel.saveCalibration(calibrationData)) { + startActivity(Intent(requireActivity(), DashboardActivity::class.java)) + } + } private fun observeViewModel() { @@ -94,21 +232,6 @@ class CalibrationFragment: Fragment() { }) } - private fun runAutoDacCommand() { - calibrationViewModel.progressBar.postValue(true) - (activity as CalibrationActivity).mService.sendAndListenToHemoCube( - HemoCubeCommands.AUTO_DAC_COMMAND, - object : UsbServiceListener { - override fun onUsbRead(data: ByteArray?) { - - - } - override fun onUsbError(e: Exception?) { - calibrationViewModel.progressBar.postValue(false) - } - }) - } - private fun listenToHemoCube() { val fullReadOutput = StringBuilder() @@ -138,24 +261,6 @@ class CalibrationFragment: Fragment() { } } } - - if (resultData.contains("#CC")) { - activity?.runOnUiThread { - binding.ivCheck.visibility = View.VISIBLE - } - } - - if (resultData.contains("END") || fullReadOutput.contains("END")) { -// autoDacViewModel.addAutoDacDataToDb( -// DiagnosticsData( -// deviceId = sharedPreferences.getString(Constants.DEVICE_ID, "").toString(), -// deviceData = resultData, -// runTime = SimpleDateFormat( -// "yyyy-MM-dd HH:mm:ss", Locale.getDefault() -// ).format(Calendar.getInstance().time) -// ) -// ) - } } override fun onUsbError(e: Exception?) { @@ -167,22 +272,6 @@ class CalibrationFragment: Fragment() { } } - - fun parseData(inputData: List): List> { - val pattern = Regex("([A-Z]+)\\s(\\d+)") - val parsedData = mutableListOf>() - - for (item in inputData) { - val matchResult = pattern.find(item) - if (matchResult != null) { - val (letters, numbers) = matchResult.destructured - parsedData.add(Pair(letters, numbers)) - } - } - - return parsedData - } - private fun showToast(message: String) { Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationViewModel.kt b/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationViewModel.kt index cb89b5c..045546c 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationViewModel.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationViewModel.kt @@ -8,8 +8,10 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.hpostesting.data.NetworkStatusLiveData +import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.dao.HemoCubeDao import com.example.hpostesting.data.model.Response +import com.example.hpostesting.data.model.calibration.CalibrationData import com.example.hpostesting.data.model.diagnostics.DiagnosticsData import com.example.hpostesting.data.model.patient.DeviceData import com.example.hpostesting.data.repository.Repository @@ -19,7 +21,6 @@ import javax.inject.Inject @HiltViewModel class CalibrationViewModel @Inject constructor( - private val hemoCubeDao: HemoCubeDao, private val repository: Repository, context: Context ) : ViewModel() { @@ -30,30 +31,60 @@ class CalibrationViewModel @Inject constructor( context.getSharedPreferences("HEMOCUBE", Context.MODE_PRIVATE) private val _networkStatusLiveData = NetworkStatusLiveData(context) - val allUserData = hemoCubeDao.getAll() val deviceData = MutableLiveData() val networkStatusLiveData: LiveData get() = _networkStatusLiveData val fireBaseUpload = MutableLiveData() + val savedCalibrationData = MutableLiveData() - fun addAutoDacDataToDb(data: DiagnosticsData) { - viewModelScope.launch { - try { - when (val response = repository.addDiagnostics(data)) { - is Response.Success -> { - Log.i("Testdb", "Data uploaded to Firestore successfully") - fireBaseUpload.postValue("Success") - } + fun loadSavedCalibrationData(): CalibrationData { + val calibrationData = CalibrationData() - is Response.Error -> { - Log.e("Testdb", "Error uploading data to Firestore: $response") - fireBaseUpload.postValue("Error") - } - } - } catch (e: Exception) { - Log.e("Testdb", "Exception during data upload: ${e.message}") - fireBaseUpload.postValue("Error") + val sharedPreferenceKeys = arrayOf( + "LED1SLOPE", "LED1INTERCEPT", + "LED2SLOPE", "LED2INTERCEPT", + "LED3SLOPE", "LED3INTERCEPT", + "LED4SLOPE", "LED4INTERCEPT", + "CALIBRATED_AT" + ) + + with(calibrationData) { + led1Slope = sharedPreference.getString(sharedPreferenceKeys[0], "")?.toDoubleOrNull() ?: 0.0 + led1Intercept = sharedPreference.getString(sharedPreferenceKeys[1], "")?.toDoubleOrNull() ?: 0.0 + led2Slope = sharedPreference.getString(sharedPreferenceKeys[2], "")?.toDoubleOrNull() ?: 0.0 + led2Intercept = sharedPreference.getString(sharedPreferenceKeys[3], "")?.toDoubleOrNull() ?: 0.0 + led3Slope = sharedPreference.getString(sharedPreferenceKeys[4], "")?.toDoubleOrNull() ?: 0.0 + led3Intercept = sharedPreference.getString(sharedPreferenceKeys[5], "")?.toDoubleOrNull() ?: 0.0 + led4Slope = sharedPreference.getString(sharedPreferenceKeys[6], "")?.toDoubleOrNull() ?: 0.0 + led4Intercept = sharedPreference.getString(sharedPreferenceKeys[7], "")?.toDoubleOrNull() ?: 0.0 + calibratedAt = sharedPreference.getString(sharedPreferenceKeys[8], "") ?: "" + } + + return calibrationData + } + + fun saveCalibration(calibrationData: CalibrationData): Boolean { + try { + with(sharedPreference.edit()) { + putString("LED1SLOPE", calibrationData.led1Slope.toString()) + putString("LED1INTERCEPT", calibrationData.led1Intercept.toString()) + + putString("LED2SLOPE", calibrationData.led2Slope.toString()) + putString("LED2INTERCEPT", calibrationData.led2Intercept.toString()) + + putString("LED3SLOPE", calibrationData.led3Slope.toString()) + putString("LED3INTERCEPT", calibrationData.led3Intercept.toString()) + + putString("LED4SLOPE", calibrationData.led4Slope.toString()) + putString("LED4INTERCEPT", calibrationData.led4Intercept.toString()) + + putString("CALIBRATED_AT", calibrationData.calibratedAt) + apply() } + + return true + } catch (e: Exception) { + return false } } } \ No newline at end of file