save calibration data in shared prefs
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 = ""
|
||||
)
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user