save calibration data in shared prefs

This commit is contained in:
Pritimay Sarkar
2024-01-14 13:03:12 +05:30
parent f0f3fcea0a
commit 3e4ee64ef3
4 changed files with 201 additions and 68 deletions

View File

@@ -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

View File

@@ -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 = ""
)

View File

@@ -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<String>()
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<String>): List<Pair<String, String>> {
val pattern = Regex("([A-Z]+)\\s(\\d+)")
val parsedData = mutableListOf<Pair<String, String>>()
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()
}

View File

@@ -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<DeviceData?>()
val networkStatusLiveData: LiveData<Boolean>
get() = _networkStatusLiveData
val fireBaseUpload = MutableLiveData<String>()
val savedCalibrationData = MutableLiveData<String>()
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
}
}
}