diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1db88e9..3df785f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -43,6 +43,10 @@
android:name="com.example.hpostesting.presentation.autodac.AutoDacActivity"
android:exported="false"
android:theme="@style/Theme.HPOS.NoActionBar" />
+
()
private val sharedPreference: SharedPreferences =
- context.getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
+ context.getSharedPreferences("AUTO_DAC", Context.MODE_PRIVATE)
private val _networkStatusLiveData = NetworkStatusLiveData(context)
val allUserData = hemoCubeDao.getAll()
diff --git a/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationActivity.kt
new file mode 100644
index 0000000..9f3d16a
--- /dev/null
+++ b/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationActivity.kt
@@ -0,0 +1,183 @@
+package com.example.hpostesting.presentation.calibration
+
+import android.annotation.SuppressLint
+import android.app.PendingIntent
+import android.content.BroadcastReceiver
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.content.ServiceConnection
+import android.hardware.usb.UsbDevice
+import android.hardware.usb.UsbDeviceConnection
+import android.hardware.usb.UsbManager
+import android.os.Bundle
+import android.os.IBinder
+import android.util.Log
+import android.view.Menu
+import android.widget.Toast
+import androidx.activity.viewModels
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.core.view.get
+import com.example.hpostesting.data.DataHolder
+import com.example.hpostesting.data.constant.Constants
+import com.example.hpostesting.data.constant.LanguageManager
+import com.example.hpostesting.presentation.testRight.UsbService
+import com.hoho.android.usbserial.driver.UsbSerialDriver
+import com.hoho.android.usbserial.driver.UsbSerialProber
+import dagger.hilt.android.AndroidEntryPoint
+import `in`.sminnovations.hpostesting.R
+import `in`.sminnovations.hpostesting.databinding.ActivityCalibrationBinding
+
+@AndroidEntryPoint
+class CalibrationActivity: AppCompatActivity() {
+ private lateinit var binding: ActivityCalibrationBinding
+ val viewModel: CalibrationViewModel by viewModels()
+ private var myMenu: Menu? = null
+
+ private lateinit var mDriver: UsbSerialDriver
+ private var mConnection: UsbDeviceConnection? = null
+ lateinit var mService: UsbService
+
+ private val TAG = "Calibration"
+
+ private val broadcastReceiver = object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+
+ synchronized(this) {
+ val device: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)
+
+ if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
+ device?.apply {
+ connectUsb(true)
+ DataHolder.usbConnected.postValue(true)
+ }
+ } else {
+ onErrorReported("permission denied for device")
+ DataHolder.usbConnected.postValue(true)
+ }
+ }
+
+ }
+ }
+
+
+ private val connection = object : ServiceConnection {
+ override fun onServiceConnected(className: ComponentName, service: IBinder) {
+ val binder = service as UsbService.UsbServiceBinder
+ mService = binder.getService()
+ viewModel.isServiceConnected = true
+ mConnection.let { mService.connect(mDriver, mConnection!!) }
+ moveToNext()
+ }
+
+ override fun onServiceDisconnected(arg0: ComponentName) {
+ viewModel.isServiceConnected = false
+ }
+ }
+
+ override fun attachBaseContext(newBase: Context?) {
+ val languageCode = LanguageManager.getSavedLanguage(newBase!!)
+ LanguageManager.setLocale(newBase, languageCode)
+ super.attachBaseContext(newBase)
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityCalibrationBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+// setSupportActionBar(binding.myToolbar)
+ supportActionBar?.setDisplayHomeAsUpEnabled(true)
+ setupListener()
+ connectUsb(false)
+
+ }
+
+ private fun setupListener() {
+ DataHolder.usbConnected.observe(this) {
+ Log.d("USB OBSERVE", "HemoCube called -> $it")
+ if (it) {
+ myMenu?.get(0)?.icon =
+ ContextCompat.getDrawable(this, R.drawable.ic_baseline_usb_24)
+ } else {
+ myMenu?.get(0)?.icon =
+ ContextCompat.getDrawable(this, R.drawable.ic_baseline_usb_off_24)
+ Toast.makeText(this, "Device is Disconnected", Toast.LENGTH_SHORT).show()
+ }
+ }
+ }
+ open fun connectUsb(permissionGranted: Boolean) {
+ Log.d(TAG, "connectUsb() called, permission variable = $permissionGranted")
+ val manager = getSystemService(Context.USB_SERVICE) as UsbManager
+ val availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager)
+
+ if (availableDrivers.isEmpty()) {
+ onErrorReported("No Device is Connected")
+ } else {
+ mDriver = availableDrivers[0]
+ mConnection = manager.openDevice(mDriver.device)
+
+ if (mConnection == null) {
+ requestUserPermission(manager, mDriver.device)
+ } else {
+ setupService()
+ }
+ }
+ }
+
+
+ fun onErrorReported(msg: String) {
+ Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
+ if (!isFinishing) onBackPressed()
+ }
+
+
+ private fun moveToNext() {
+ if (supportFragmentManager.isDestroyed) return
+
+ supportFragmentManager.beginTransaction().replace(binding.fgCalibration.id, CalibrationFragment())
+ .commit()
+ }
+
+ @SuppressLint("MutableImplicitPendingIntent")
+ private fun requestUserPermission(manager: UsbManager, device: UsbDevice) {
+ val mPendingIntent: PendingIntent
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
+ mPendingIntent = PendingIntent.getBroadcast(
+ this, 0, Intent(Constants.HOMOCUBE_USB_PERMISSION), PendingIntent.FLAG_MUTABLE
+ )
+ } else {
+ mPendingIntent = PendingIntent.getBroadcast(
+ this,
+ 0,
+ Intent(Constants.HOMOCUBE_USB_PERMISSION),
+ PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
+ )
+ }
+
+ val filter = IntentFilter(Constants.HOMOCUBE_USB_PERMISSION)
+ registerReceiver(broadcastReceiver, filter)
+ manager.requestPermission(device, mPendingIntent)
+ }
+
+
+ fun setupService() {
+ val intent = Intent(this, UsbService::class.java)
+ bindService(intent, connection, Context.BIND_AUTO_CREATE)
+ }
+
+
+ override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ menuInflater.inflate(R.menu.my_menu, menu)
+ return true
+ }
+ override fun onDestroy() {
+ super.onDestroy()
+ if (viewModel.isServiceConnected) {
+ mService.disconnect()
+ unbindService(connection)
+ viewModel.isServiceConnected = false
+ }
+ }
+}
\ 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
new file mode 100644
index 0000000..764cd44
--- /dev/null
+++ b/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationFragment.kt
@@ -0,0 +1,189 @@
+package com.example.hpostesting.presentation.calibration
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Toast
+import androidx.fragment.app.Fragment
+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.patient.DeviceData
+import com.example.hpostesting.presentation.UsbServiceListener
+import com.google.firebase.crashlytics.ktx.crashlytics
+import com.google.firebase.ktx.Firebase
+import `in`.sminnovations.hpostesting.databinding.FragmentCalibrationBinding
+
+class CalibrationFragment: Fragment() {
+
+ private lateinit var binding: FragmentCalibrationBinding
+ private val calibrationViewModel: CalibrationViewModel by activityViewModels()
+ private lateinit var sharedPreferences: SharedPreferences
+ private var currentDeviceData: DeviceData? = null
+ private var resultData: String = ""
+ private val messages = MutableLiveData()
+ private var startListening = MutableLiveData(false)
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?,
+ ): View {
+ binding = FragmentCalibrationBinding.inflate(inflater, container, false)
+ sharedPreferences =
+ requireContext().getSharedPreferences("AUTO_DAC", Context.MODE_PRIVATE)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initViews()
+ observeViewModel()
+ }
+
+
+ private fun initViews() {
+ binding.btnSubmit.visibility = View.GONE
+ listenToHemoCube()
+ getDeviceId()
+ binding.btnSubmit.setOnClickListener {
+ binding.btnSubmit.visibility = View.GONE
+ }
+ }
+
+
+ private fun observeViewModel() {
+
+ calibrationViewModel.deviceData.observe(viewLifecycleOwner) {
+ currentDeviceData = it
+ }
+
+ messages.observe(viewLifecycleOwner) {
+ binding.tvSubtitle4.text = it
+ }
+
+ calibrationViewModel.fireBaseUpload.observe(viewLifecycleOwner) { result ->
+ if (result == "Success") {
+ showToast("Auto Dac data uploaded successfully")
+ }
+ if (result == "Local") {
+ showToast("Auto Dac uploading failed, note it down manually")
+ }
+
+ binding.progressBar.visibility = View.GONE
+ }
+ }
+
+ private fun getDeviceId() {
+ calibrationViewModel.progressBar.postValue(true)
+ (activity as CalibrationActivity).mService.sendAndListenToHemoCube(
+ HemoCubeCommands.getDeviceId,
+ object : UsbServiceListener {
+ override fun onUsbRead(data: ByteArray?) {
+ data?.let {
+ val stringData = String(it)
+ calibrationViewModel.messages.postValue(stringData)
+ binding.tvSubtitle4.text = stringData
+ }
+ }
+ override fun onUsbError(e: Exception?) {
+ calibrationViewModel.progressBar.postValue(false)
+ }
+ })
+ }
+
+ 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()
+ startListening.postValue(true)
+
+ try {
+ (activity as CalibrationActivity).mService.listenToHemoCube(object :
+ UsbServiceListener {
+ override fun onUsbRead(data: ByteArray?) {
+ data?.let {
+ val stringData = String(it)
+ calibrationViewModel.messages.postValue(stringData)
+ fullReadOutput.append(stringData)
+ resultData += stringData
+ binding.tvSubtitle4.text = resultData
+ if (stringData.contains("SN")) {
+ val slData = stringData.split(" ")
+ if (slData.size > 1) {
+ val hardwareId = slData[1].trim()
+ with(sharedPreferences.edit()) {
+ putString(Constants.DEVICE_ID, hardwareId)
+ apply()
+ }
+ }
+ activity?.runOnUiThread {
+ binding.btnSubmit.visibility = View.VISIBLE
+ }
+ }
+ }
+
+ 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?) {
+ calibrationViewModel.progressBar.postValue(false)
+ }
+ })
+ } catch (e: Exception) {
+ Firebase.crashlytics.recordException(e)
+ }
+ }
+
+
+ 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()
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..185d9da
--- /dev/null
+++ b/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationViewModel.kt
@@ -0,0 +1,59 @@
+package com.example.hpostesting.presentation.calibration
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.util.Log
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.example.hpostesting.data.NetworkStatusLiveData
+import com.example.hpostesting.data.dao.HemoCubeDao
+import com.example.hpostesting.data.model.Response
+import com.example.hpostesting.data.model.diagnostics.DiagnosticsData
+import com.example.hpostesting.data.model.patient.DeviceData
+import com.example.hpostesting.data.repository.Repository
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class CalibrationViewModel @Inject constructor(
+ private val hemoCubeDao: HemoCubeDao,
+ private val repository: Repository,
+ context: Context
+) : ViewModel() {
+ var isServiceConnected = false
+ val progressBar = MutableLiveData(false)
+ val messages = MutableLiveData()
+ private val sharedPreference: SharedPreferences =
+ context.getSharedPreferences("CALIBRATION", Context.MODE_PRIVATE)
+
+ private val _networkStatusLiveData = NetworkStatusLiveData(context)
+ val allUserData = hemoCubeDao.getAll()
+ val deviceData = MutableLiveData()
+ val networkStatusLiveData: LiveData
+ get() = _networkStatusLiveData
+ val fireBaseUpload = 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")
+ }
+
+ 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")
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/GalleryFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/GalleryFragment.kt
index b4e0bce..f2c88f2 100644
--- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/GalleryFragment.kt
+++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/GalleryFragment.kt
@@ -8,6 +8,7 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.example.hpostesting.presentation.autodac.AutoDacActivity
import com.example.hpostesting.presentation.buffercheck.HemocubeBufferCheckActivity
+import com.example.hpostesting.presentation.calibration.CalibrationActivity
import com.example.hpostesting.presentation.diagnostics.DiagnosticsActivity
import `in`.sminnovations.hpostesting.databinding.FragmentGalleryBinding
@@ -30,10 +31,6 @@ class GalleryFragment : Fragment() {
_binding = FragmentGalleryBinding.inflate(inflater, container, false)
val root: View = binding.root
-// val textView: TextView = binding.textGallery
-// galleryViewModel.text.observe(viewLifecycleOwner) {
-//// textView.text = it
-// }
binding.btnSubmit.setOnClickListener {
startActivity(Intent(requireContext(), HemocubeBufferCheckActivity::class.java))
}
@@ -46,6 +43,10 @@ class GalleryFragment : Fragment() {
startActivity(Intent(requireContext(), AutoDacActivity::class.java))
}
+ binding.btnCalibration.setOnClickListener {
+ startActivity(Intent(requireContext(), CalibrationActivity::class.java))
+ }
+
return root
}
diff --git a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsViewModel.kt b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsViewModel.kt
index 27319f4..48919ab 100644
--- a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsViewModel.kt
+++ b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsViewModel.kt
@@ -33,7 +33,7 @@ class DiagnosticsViewModel @Inject constructor(
val progressBar = MutableLiveData(false)
val messages = MutableLiveData()
private val sharedPreference: SharedPreferences =
- context.getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
+ context.getSharedPreferences("DIAGNOSTICS", Context.MODE_PRIVATE)
private val _networkStatusLiveData = NetworkStatusLiveData(context)
val allUserData = hemoCubeDao.getAll()
diff --git a/app/src/main/res/drawable/border.xml b/app/src/main/res/drawable/border.xml
new file mode 100644
index 0000000..176c850
--- /dev/null
+++ b/app/src/main/res/drawable/border.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_calibration.xml b/app/src/main/res/layout/activity_calibration.xml
new file mode 100644
index 0000000..94948b7
--- /dev/null
+++ b/app/src/main/res/layout/activity_calibration.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_calibration.xml b/app/src/main/res/layout/fragment_calibration.xml
new file mode 100644
index 0000000..34e0393
--- /dev/null
+++ b/app/src/main/res/layout/fragment_calibration.xml
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_gallery.xml b/app/src/main/res/layout/fragment_gallery.xml
index e279e64..9ab4166 100644
--- a/app/src/main/res/layout/fragment_gallery.xml
+++ b/app/src/main/res/layout/fragment_gallery.xml
@@ -50,4 +50,18 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_diagnostics" />
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 183aa71..352473c 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -111,6 +111,7 @@
सबमिट करें
डिवाइस नुस्खा
Auto DAC
+ Calibration
स्थान
सैम्पल शुरू करें
नया किट
diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml
index 85b2af6..0820cfc 100644
--- a/app/src/main/res/values-kn/strings.xml
+++ b/app/src/main/res/values-kn/strings.xml
@@ -111,6 +111,7 @@
ಸಲ್ಲಿಸಿ
ಡೆವೈಸ್ ಟೆಸ್ಟ್
Auto DAC
+ Calibration
ಪ್ರಾರಂಭಿಸಿ
ನಮೂನೆ ಪ್ರಾರಂಭಿಸಿ
ಹೊಸ ಕಿಟ್
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 20babce..1535467 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -112,6 +112,7 @@
Submit
Device Diagnostics
Auto DAC
+ Calibration
Start
Start Sample
New Kit