diff --git a/app/src/main/java/com/example/hpostesting/data/constant/HemoCubeCommands.kt b/app/src/main/java/com/example/hpostesting/data/constant/HemoCubeCommands.kt index f246fb2..95e9b73 100644 --- a/app/src/main/java/com/example/hpostesting/data/constant/HemoCubeCommands.kt +++ b/app/src/main/java/com/example/hpostesting/data/constant/HemoCubeCommands.kt @@ -9,6 +9,7 @@ enum class HemoCubeCommands(val command: String) { PRINT_COMMAND("P\r"), READ_DAC_COMMAND("R\r"), DEVICE_CONFIGURATION_COMMAND("I\r"), + LOAD_DAC_VALUES("E\r"), FIRST_GAIN_COMMAND("T\r"), SECOND_GAIN_COMMAND("U\r"), THIRD_GAIN_COMMAND("V\r"), diff --git a/app/src/main/java/com/example/hpostesting/data/constant/TestStatus.kt b/app/src/main/java/com/example/hpostesting/data/constant/TestStatus.kt index 51f30ea..6c9a129 100644 --- a/app/src/main/java/com/example/hpostesting/data/constant/TestStatus.kt +++ b/app/src/main/java/com/example/hpostesting/data/constant/TestStatus.kt @@ -8,6 +8,8 @@ enum class TestStatus(val code: Double) { FIRST_EMPTY_AIR_READING_COMPLETED(4.2), FIRST_EMPTY_AIR_READING_PRINT_STARTED(4.3), FIRST_EMPTY_AIR_READING_PRINT_COMPLETED(4.4), + EPROM_ADC_RETRIEVAL_STARTED(4.5), + EPROM_ADC_RETRIEVAL_COMPLETED(4.6), BUFFER_STARTED(4.0), BUFFER_COMPLETED(5.0), BUFFER_PRINT_STARTED(6.0), diff --git a/app/src/main/java/com/example/hpostesting/data/model/patient/PatientData.kt b/app/src/main/java/com/example/hpostesting/data/model/patient/PatientData.kt index ea66c7f..df9f5ec 100644 --- a/app/src/main/java/com/example/hpostesting/data/model/patient/PatientData.kt +++ b/app/src/main/java/com/example/hpostesting/data/model/patient/PatientData.kt @@ -45,7 +45,6 @@ data class PatientDetails( OTHER } - data class Address( var house: String?, val street: String?, diff --git a/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt b/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt index d1e55d8..f4b35b5 100644 --- a/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt +++ b/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt @@ -38,8 +38,8 @@ import javax.inject.Named class NetworkException(message: String, cause: Throwable) : Exception(message, cause) class DatabaseRepository @Inject constructor( - @Named("Auth")private val molbioAuthApi: MolbioAuthApi, - private val molbioResultApi: MolbioResultApi + @Named("Auth") private val molbioAuthApi: MolbioAuthApi, + private val molbioResultApi: MolbioResultApi, ) : Repository { private val db: FirebaseFirestore = Firebase.firestore @@ -81,6 +81,7 @@ class DatabaseRepository @Inject constructor( override suspend fun downloadClientCertificate(): Result { return safeApiCall { molbioResultApi.downloadClientCertificate() } } + override suspend fun uploadLogs(logFile: MultipartBody.Part): Result { return safeApiCall { molbioResultApi.uploadLogs(logFile) } } @@ -149,7 +150,7 @@ class DatabaseRepository @Inject constructor( } override suspend fun uploadFileToStorage( - patientID: String, filePath: String + patientID: String, filePath: String, ): Response { try { @@ -240,5 +241,4 @@ class DatabaseRepository @Inject constructor( override fun addTestToDatabase(testDetails: UserData): Any { TODO("Not yet implemented") } - } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt index 5565aeb..c016485 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt @@ -119,7 +119,6 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { // } // } - try { if (checkHemoCubeKitData()) { DataHolder.selectedTest!!.kitSerial = @@ -156,7 +155,6 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { pullTrigger() } - binding.btnGo.setOnClickListener { val serialNumber = binding.nameEditText.text.toString().trim() if (serialNumber.isNotEmpty() && isSerialValid(serialNumber)) { @@ -258,7 +256,6 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { } } - //this function is called if barcode is detected. override fun dcssdkEventBarcode(barcodeData: ByteArray?, barcodeType: Int, fromScannerID: Int) { val result = String(barcodeData!!) 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 index 7304554..008828e 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/calibration/CalibrationActivity.kt @@ -163,13 +163,11 @@ class CalibrationActivity : AppCompatActivity() { 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 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 28d2098..e6313af 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 @@ -50,7 +50,6 @@ class CalibrationFragment : Fragment() { loadSavedCalibration() } - private fun initViews() { binding.btnSubmit.visibility = View.GONE listenToHemoCube() diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt index 7a5a31c..92f7aef 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt @@ -269,22 +269,22 @@ class HomeFragment : Fragment() { hemoCubeViewModel.downloadClientCertificate() } } - }else if (deviceId.isNotEmpty()) { - fetchDeviceCredentials() - // This code will execute after credentials have been successfully fetched and stored. - userID = sharedPreference.getString("username", "").toString() - password = sharedPreference.getString("password", "").toString() - accessToken = sharedPreference.getString(Constants.ACCESS_TOKEN, "").toString() - if (accessToken.isEmpty()) { - hemoCubeViewModel.login(createLoginRequestData(userID, password)) - } else { - // Continue with your existing logic if the token is not empty. + } else if (deviceId.isNotEmpty()) { + fetchDeviceCredentials() + // This code will execute after credentials have been successfully fetched and stored. + userID = sharedPreference.getString("username", "").toString() + password = sharedPreference.getString("password", "").toString() + accessToken = sharedPreference.getString(Constants.ACCESS_TOKEN, "").toString() + if (accessToken.isEmpty()) { + hemoCubeViewModel.login(createLoginRequestData(userID, password)) + } else { + // Continue with your existing logic if the token is not empty. isTokenAvailable = true hemoCubeViewModel.deviceUpdate(createDeviceUpdateRequestData()) hemoCubeViewModel.uploadLogs() hemoCubeViewModel.startPeriodicCheckUpdate() } - } else { + } else { Toast.makeText( requireContext(), "Contact Help and get your device provision done", @@ -356,12 +356,22 @@ class HomeFragment : Fragment() { val fileName = "nats_certificate.zip" val downloadDirectory = "NATS" val file = downloadFile(url, requireContext(), fileName, downloadDirectory) - Toast.makeText(requireContext(), "NATS certificate Downloaded", Toast.LENGTH_SHORT).show() + Toast.makeText( + requireContext(), + "NATS certificate Downloaded", + Toast.LENGTH_SHORT + ).show() - val unzipDirectoryPath = requireContext().getExternalFilesDir(null)?.absolutePath + "/$downloadDirectory" + val unzipDirectoryPath = + requireContext().getExternalFilesDir(null)?.absolutePath + "/$downloadDirectory" unzip(file.absolutePath, unzipDirectoryPath) - Toast.makeText(requireContext(), "NATS certificate Extracted", Toast.LENGTH_SHORT).show() + Toast.makeText( + requireContext(), + "NATS certificate Extracted", + Toast.LENGTH_SHORT + ).show() } + is Result.Error -> { response.exception.let { message -> Toast.makeText( @@ -459,7 +469,12 @@ class HomeFragment : Fragment() { ) } - private fun downloadFile(responseBody: ResponseBody, context: Context, fileName: String, downloadDirectory: String): File { + private fun downloadFile( + responseBody: ResponseBody, + context: Context, + fileName: String, + downloadDirectory: String, + ): File { // Ensure the download directory exists val fileDir = File(context.getExternalFilesDir(null), downloadDirectory) if (!fileDir.exists()) { @@ -480,8 +495,6 @@ class HomeFragment : Fragment() { } - - private fun unzip(zipFilePath: String, destDirectory: String) { val destDir = File(destDirectory) if (!destDir.exists()) { @@ -542,21 +555,26 @@ class HomeFragment : Fragment() { try { val db = Firebase.firestore // Ensure deviceId is not null or empty - val deviceId = sharedPreference.getString(Constants.DEVICE_ID, "").takeIf { it!!.isNotBlank() } - ?: throw IllegalStateException("Device ID is missing or blank.") + val deviceId = + sharedPreference.getString(Constants.DEVICE_ID, "").takeIf { it!!.isNotBlank() } + ?: throw IllegalStateException("Device ID is missing or blank.") val deviceRef = db.collection("devices").whereEqualTo("deviceId", deviceId) deviceRef.get() .addOnSuccessListener { documentSnapshot -> if (!documentSnapshot.isEmpty) { - val deviceData = documentSnapshot.documents[0].toObject(DeviceData::class.java) + val deviceData = + documentSnapshot.documents[0].toObject(DeviceData::class.java) deviceData?.let { data -> val username = data.username val password = data.password val natsToken = data.natsToken // Log for debugging - Log.d("fetchDeviceCredentials", "Username: $username, Password: $password") + Log.d( + "fetchDeviceCredentials", + "Username: $username, Password: $password" + ) // Save credentials in SharedPreferences with(sharedPreference.edit()) { putString("username", username) @@ -806,25 +824,25 @@ class HomeFragment : Fragment() { hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userDataList -> val resultList = MolbioV2ResultRequest(mutableListOf(MolbioV2Result())) userDataList.forEach { userData -> - if (!userData.molbioFlag && isTokenAvailable) { - resultList.results?.add( - MolbioV2Result( - rawData = userData, - analysisId = userData._id, - analysisDate = "2024-02-08 16:33:56", //userData.reportUploadTime, - analysisStatus = userData.classificationResult, - thresholds = Constants.BUFFER_INTENSITY_THRESHOLDS[userData.deviceId].toString(), - interpretation = userData.classificationResult, - testId = userData._id, - testTime = userData.testTime, - collectionTime = "2024-02-08 16:33:56",//userData.testTime, - expiryTime = "2024-02-08 16:33:56",//userData.testTime, - ) + if (!userData.molbioFlag && isTokenAvailable) { + resultList.results?.add( + MolbioV2Result( + rawData = userData, + analysisId = userData._id, + analysisDate = "2024-02-08 16:33:56", //userData.reportUploadTime, + analysisStatus = userData.classificationResult, + thresholds = Constants.BUFFER_INTENSITY_THRESHOLDS[userData.deviceId].toString(), + interpretation = userData.classificationResult, + testId = userData._id, + testTime = userData.testTime, + collectionTime = "2024-02-08 16:33:56",//userData.testTime, + expiryTime = "2024-02-08 16:33:56",//userData.testTime, ) + ) } - if(!userData.localFlag){ + if (!userData.localFlag) { userData.localFlag = true hemoCubeViewModel.bulkAddResultTestToDb(userData) } diff --git a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsActivity.kt index b839ced..1389767 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsActivity.kt @@ -127,7 +127,6 @@ class DiagnosticsActivity : AppCompatActivity() { } } - fun onErrorReported(msg: String) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() if (!isFinishing) onBackPressed() diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardFragment.kt index b13d0ea..1f6b32c 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardFragment.kt @@ -61,7 +61,6 @@ class DigitalCardFragment : Fragment() { binding.blood.text = "Blood Group: ${testDetails?.bloodGroup}" binding.sicklecell.text = "Sickle-Cell: ${DataHolder.hemoCubeTestData?.prdClassification.toString()}" - } // Update the UI with the fetched details val originalDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt index 005b0e0..460f26c 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt @@ -134,7 +134,6 @@ class HemoCubeFragment : Fragment() { checkAndStartProcess() it.visibility = View.GONE } - } if (sharedPreferences.getString(Constants.USER_ID, "").toString() == "ADMIN") { @@ -361,6 +360,20 @@ class HemoCubeFragment : Fragment() { }) } + private fun loadDACValues() { + hemoCubeViewModel.progressBar.postValue(true) + (activity as HemocubeActivity).mService.sendAndListenToHemoCube( + HemoCubeCommands.LOAD_DAC_VALUES, + object : UsbServiceListener { + override fun onUsbRead(data: ByteArray?) { + } + + override fun onUsbError(e: Exception?) { + hemoCubeViewModel.progressBar.postValue(false) + } + }) + } + fun handleUsbData(stringData: String) { if (stringData.contains("#")) { isTestOngoing = true @@ -373,6 +386,7 @@ class HemoCubeFragment : Fragment() { when { resultData.contains("SNE") && this.testStatusCode < TestStatus.CONFIG_COMPLETED.code -> { processV2HardwareId(resultData) + loadDACValues() } (resultData.contains("SN") && !resultData.contains("SNS") && !resultData.contains("SNE") && resultData.length >= 15) && this.testStatusCode < TestStatus.CONFIG_COMPLETED.code -> { @@ -392,6 +406,17 @@ class HemoCubeFragment : Fragment() { fetchResult() } + (resultData.contains("#RS") && this.testStatusCode < TestStatus.EPROM_ADC_RETRIEVAL_STARTED.code) -> { + this.testStatusCode = TestStatus.EPROM_ADC_RETRIEVAL_STARTED.code + hemoCubeViewModel.messages.postValue("EPROM ADC Fetch") + } + + (resultData.contains("#RC") && this.testStatusCode < TestStatus.EPROM_ADC_RETRIEVAL_COMPLETED.code) -> { + this.testStatusCode = TestStatus.EPROM_ADC_RETRIEVAL_COMPLETED.code + hemoCubeViewModel.messages.postValue("EPROM ADC Loaded") + showStartBufferButton() + } + resultData.contains("#BS") && this.testStatusCode < TestStatus.BUFFER_STARTED.code -> { hemoCubeViewModel.messages.postValue(getString(R.string.buffer_started)) this.testStatusCode = TestStatus.BUFFER_STARTED.code @@ -642,10 +667,6 @@ class HemoCubeFragment : Fragment() { if (!hardwareId.isNullOrBlank()) { updateDeviceId(hardwareId) - activity?.runOnUiThread { - binding.btnPlacebuffer.visibility = View.VISIBLE - } - hemoCubeViewModel.messages.postValue(getString(R.string.start)) } else { hemoCubeViewModel.messages.postValue("Config error") } @@ -659,6 +680,13 @@ class HemoCubeFragment : Fragment() { } } + fun showStartBufferButton() { + activity?.runOnUiThread { + binding.btnPlacebuffer.visibility = View.VISIBLE + } + hemoCubeViewModel.messages.postValue(getString(R.string.start)) + } + fun extractV1HardwareId(input: String): String? { val regex = Regex("SN (\\S+)") val matchResult = regex.find(input) diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt index 8228afc..ca5edf2 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt @@ -61,6 +61,7 @@ open class HemocubeActivity : AppCompatActivity() { } } + private val connection = object : ServiceConnection { override fun onServiceConnected(className: ComponentName, service: IBinder) { val binder = service as UsbService.UsbServiceBinder @@ -81,7 +82,6 @@ open class HemocubeActivity : AppCompatActivity() { super.attachBaseContext(newBase) } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityHemocubeBinding.inflate(layoutInflater) @@ -125,7 +125,6 @@ open class HemocubeActivity : AppCompatActivity() { } } - @SuppressLint("MutableImplicitPendingIntent") private fun requestUserPermission(manager: UsbManager, device: UsbDevice) { val mPendingIntent: PendingIntent @@ -176,7 +175,6 @@ open class HemocubeActivity : AppCompatActivity() { } } - fun onErrorReported(msg: String) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() if (!isFinishing) onBackPressed() diff --git a/app/src/main/java/com/example/hpostesting/presentation/jig/JigFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/jig/JigFragment.kt index 9a7204a..4b29d4d 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/jig/JigFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/jig/JigFragment.kt @@ -57,17 +57,11 @@ class JigFragment : Fragment(), IDcsSdkApiDelegate { } private fun initScanner() { - //Setting up the SDK handler sdkHandler = SDKHandler(requireContext()) - //Registers a particular object which conforms to IDcsSdkApiDelegate interface as a receiver of SDK notifications. sdkHandler!!.dcssdkSetDelegate(this) - //this command is telling the sdk that we're going to be connecting to the scanner via USB sdkHandler!!.dcssdkSetOperationalMode(DCSSDKDefs.DCSSDK_MODE.DCSSDK_OPMODE_SNAPI) - //deciding what kind of notifications we want to receive. Explained more in the function - //first we use bitmapping to set these values into the notifications_mask. var notifications_mask = 0 - // We would like to subscribe to all barcode events notifications_mask = notifications_mask or DCSSDKDefs.DCSSDK_EVENT.DCSSDK_EVENT_BARCODE.value sdkHandler!!.dcssdkSubsribeForEvents(notifications_mask) @@ -165,9 +159,7 @@ class JigFragment : Fragment(), IDcsSdkApiDelegate { } private fun pullTrigger() { - // Check if the list is not empty before accessing its elements if (mScannerInfoList.isNotEmpty()) { - // Only proceed if the scanner is not active if (!mScannerInfoList[0].isActive) { sdkHandler?.dcssdkEstablishCommunicationSession(mScannerInfoList[0].scannerID) } @@ -221,7 +213,6 @@ class JigFragment : Fragment(), IDcsSdkApiDelegate { // TODO("Not yet implemented") // } - override fun dcssdkEventImage(bytes: ByteArray?, i: Int) {} override fun dcssdkEventVideo(bytes: ByteArray?, i: Int) {} diff --git a/app/src/main/java/com/example/hpostesting/presentation/testRight/UsbService.kt b/app/src/main/java/com/example/hpostesting/presentation/testRight/UsbService.kt index 6f5e98e..cf240ab 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/testRight/UsbService.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/testRight/UsbService.kt @@ -14,6 +14,7 @@ import com.hoho.android.usbserial.driver.UsbSerialDriver import com.hoho.android.usbserial.driver.UsbSerialPort import com.hoho.android.usbserial.util.SerialInputOutputManager import java.io.IOException + class UsbService : Service() { private val binder = UsbServiceBinder() private lateinit var mPort: UsbSerialPort @@ -39,10 +40,11 @@ class UsbService : Service() { Log.d(TAG, "My Usb Connected ${mPort.driver}") val usbIoManager = SerialInputOutputManager(mPort, - object : SerialInputOutputManager.Listener{ + object : SerialInputOutputManager.Listener { override fun onNewData(data: ByteArray?) { listener?.onUsbRead(data) } + override fun onRunError(e: Exception?) { Log.e(TAG, "onRunError() called inside eventDrivenWrite()") listener?.onUsbError(e) @@ -51,13 +53,15 @@ class UsbService : Service() { }) usbIoManager.start(); } + fun disconnect() { - if(isUsbConnected){ + if (isUsbConnected) { mPort.close() isUsbConnected = false; Log.d(TAG, "My Usb disconnected:: ${mPort.driver}") } } + fun eventDrivenWrite(command: TestRightCommands, listener: UsbServiceListener) { this.listener = listener try { diff --git a/app/src/main/java/com/example/hpostesting/presentation/trueheme/TrueHemeViewModel.kt b/app/src/main/java/com/example/hpostesting/presentation/trueheme/TrueHemeViewModel.kt index 9ebae05..cbbc818 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/trueheme/TrueHemeViewModel.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/trueheme/TrueHemeViewModel.kt @@ -82,7 +82,6 @@ class TrueHemeViewModel @Inject constructor( val uploadLogs = MutableLiveData?>() - // Get the device ID of the device you want to retrieve data for (e.g., the first device in the list) private val _networkStatusLiveData = NetworkStatusLiveData(context) @@ -90,7 +89,6 @@ class TrueHemeViewModel @Inject constructor( val allKitTestData = hemoCubeBufferDao.getAll() val deviceData = MutableLiveData() - val networkStatusLiveData: LiveData get() = _networkStatusLiveData val deviceMessages = MutableLiveData() @@ -381,7 +379,6 @@ class TrueHemeViewModel @Inject constructor( hemoCubeDao.deleteById(id = userId) } - private fun addResultTestToDbforbuffercheck(bufferCheckData: BufferCheckData) { viewModelScope.launch { try {