diff --git a/app/build.gradle b/app/build.gradle index 419fccc..f9177f4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -162,4 +162,5 @@ dependencies { // implementation("io.nats:jnats:2.11.2") implementation 'com.google.android.play:core:1.10.3' + implementation fileTree(dir: 'libs', include: ['*.aar']) } \ No newline at end of file diff --git a/app/libs/barcode_scanner_library_v2.6.19.0-release.aar b/app/libs/barcode_scanner_library_v2.6.19.0-release.aar new file mode 100755 index 0000000..f8b2d2c Binary files /dev/null and b/app/libs/barcode_scanner_library_v2.6.19.0-release.aar differ 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 9e7fb32..2f7ae9b 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt @@ -3,9 +3,11 @@ package com.example.hpostesting.presentation import android.content.Context import android.content.Intent import android.content.SharedPreferences +import android.os.AsyncTask import android.os.Bundle import android.util.Log import android.view.View +import android.widget.EditText import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.example.hpostesting.data.DataHolder @@ -20,16 +22,29 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanIntentResult import com.journeyapps.barcodescanner.ScanOptions +import com.zebra.barcode.sdk.sms.ConfigurationUpdateEvent +import com.zebra.scannercontrol.DCSSDKDefs +import com.zebra.scannercontrol.DCSSDKDefs.DCSSDK_COMMAND_OPCODE +import com.zebra.scannercontrol.DCSSDKDefs.DCSSDK_RESULT +import com.zebra.scannercontrol.DCSScannerInfo +import com.zebra.scannercontrol.FirmwareUpdateEvent +import com.zebra.scannercontrol.IDcsSdkApiDelegate +import com.zebra.scannercontrol.SDKHandler import `in`.sminnovations.hpostesting.R import `in`.sminnovations.hpostesting.databinding.ActivityKitScanBinding +import java.nio.charset.StandardCharsets -class KitScanActivity : AppCompatActivity() { +class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { private val TAG = "KitScanActivity" private lateinit var binding: ActivityKitScanBinding private lateinit var sharedPreference: SharedPreferences + var sdkHandler: SDKHandler? = null + var editBarcode: EditText? = null + var mScannerInfoList = ArrayList() + private val barcodeLauncher = registerForActivityResult( ScanContract() ) { result: ScanIntentResult -> @@ -51,6 +66,35 @@ class KitScanActivity : AppCompatActivity() { super.attachBaseContext(newBase) } + + override fun dcssdkEventScannerAppeared(dcsScannerInfo: DCSScannerInfo?) {} + + override fun dcssdkEventScannerDisappeared(i: Int) {} + + override fun dcssdkEventCommunicationSessionEstablished(dcsScannerInfo: DCSScannerInfo?) {} + + override fun dcssdkEventCommunicationSessionTerminated(i: Int) {} +// override fun dcssdkEventBarcode(p0: ByteArray?, p1: Int, p2: Int) { +// TODO("Not yet implemented") +// } + + + override fun dcssdkEventImage(bytes: ByteArray?, i: Int) {} + + override fun dcssdkEventVideo(bytes: ByteArray?, i: Int) {} + + override fun dcssdkEventBinaryData(bytes: ByteArray?, i: Int) {} + + override fun dcssdkEventFirmwareUpdate(firmwareUpdateEvent: FirmwareUpdateEvent?) {} + + override fun dcssdkEventAuxScannerAppeared( + dcsScannerInfo: DCSScannerInfo?, + dcsScannerInfo1: DCSScannerInfo? + ) { + } + + override fun dcssdkEventConfigurationUpdate(configurationUpdateEvent: ConfigurationUpdateEvent?) {} + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -110,7 +154,8 @@ class KitScanActivity : AppCompatActivity() { setSupportActionBar(binding.toolbar) binding.btnScanNow.setOnClickListener { - startScanningNow() +// startScanningNow() + pullTrigger() } @@ -164,6 +209,79 @@ class KitScanActivity : AppCompatActivity() { Toast.makeText(this, R.string.invalid_kit_number, Toast.LENGTH_LONG).show() } } + + //Setting up the SDK handler + + //Setting up the SDK handler + sdkHandler = SDKHandler(this) + + //Registers a particular object which conforms to IDcsSdkApiDelegate interface as a receiver of SDK notifications. + + //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 + + //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. + + + //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 + // We would like to subscribe to all barcode events + notifications_mask = + notifications_mask or DCSSDKDefs.DCSSDK_EVENT.DCSSDK_EVENT_BARCODE.value + // subscribe to events set in notification mask + // subscribe to events set in notification mask + sdkHandler!!.dcssdkSubsribeForEvents(notifications_mask) + + + //so adding all the scanners to the mScannerInfoList, then connecting to the first scanner. + //There's only one scanner so this step is unnecessary, I did it thinking about possible scalability. + //here I just get the list of available scanners which also returns the USB scanner attached to the tinker board. + + + //so adding all the scanners to the mScannerInfoList, then connecting to the first scanner. + //There's only one scanner so this step is unnecessary, I did it thinking about possible scalability. + //here I just get the list of available scanners which also returns the USB scanner attached to the tinker board. + mScannerInfoList.addAll(sdkHandler!!.dcssdkGetAvailableScannersList()) + + //I'm doing mScannerInfoList.get(0) because there's only one scanner which will be at position 0. + + //I'm doing mScannerInfoList.get(0) because there's only one scanner which will be at position 0. + sdkHandler!!.dcssdkEstablishCommunicationSession(mScannerInfoList[0].scannerID) + } + + fun pullTrigger() { + if (!mScannerInfoList[0].isActive) { + sdkHandler!!.dcssdkEstablishCommunicationSession(mScannerInfoList[0].scannerID) + } + val inXML = " 1 " + val outXML = StringBuilder() + val result: DCSSDK_RESULT = + sdkHandler!!.dcssdkExecuteCommandOpCodeInXMLForScanner( + DCSSDK_COMMAND_OPCODE.DCSSDK_DEVICE_PULL_TRIGGER, inXML, outXML, 1 + ) + if (result == DCSSDK_RESULT.DCSSDK_RESULT_SUCCESS) Log.d( + "Scanning", + "Success" + ) else if (result == DCSSDK_RESULT.DCSSDK_RESULT_FAILURE) Log.d("Scanning", "Failed") + //new MyAsyncTask(1, DCSSDKDefs.DCSSDK_COMMAND_OPCODE.DCSSDK_DEVICE_PULL_TRIGGER,null).execute(inXML); + } + + //this function is called if barcode is detected. + override fun dcssdkEventBarcode(barcodeData: ByteArray?, barcodeType: Int, fromScannerID: Int) { + val result = String(barcodeData!!) + Log.d("BARCODE", result) + runOnUiThread { + binding.tvTitle2.text = result + } } private fun checkHemoCubeKitData(): Boolean { 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 f1c20b0..24269a1 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 @@ -218,6 +218,10 @@ class HemoCubeFragment : Fragment() { private fun handleReadingFinish() { if (allReadingsComplete(repeatReadingCount, readingsPerSample) && uploadedToCloud) { + if (validationError) { + hemoCubeViewModel.messages.postValue("Error") + return + } activity?.runOnUiThread { binding.btnSubmit.visibility = View.GONE val i = Intent( @@ -738,7 +742,7 @@ class HemoCubeFragment : Fragment() { 3 )?.get(0)!! ) { - validationError = true +// validationError = true testState.allErrorMessages += "Error: Invalid Test. Improper buffer reading (low)" activity?.runOnUiThread { binding.errorMessage.text = getString(R.string.error_improper_buffer_low) @@ -758,7 +762,7 @@ class HemoCubeFragment : Fragment() { 3 )?.get(1)!! ) { - validationError = true +// validationError = true testState.allErrorMessages += "Error: Invalid Test. Improper buffer reading (high)" + "\n" activity?.runOnUiThread { binding.errorMessage.text = @@ -806,7 +810,7 @@ class HemoCubeFragment : Fragment() { val slopeClass = slopeRatioClassification(calculatedSlopeRatio) if (fittedAbs1 <= fittedAbs2) { - validationError = true +// validationError = true testState.allErrorMessages += "Error: Invalid Test. Problem with de-oxygenation" + "\n" activity?.runOnUiThread { binding.errorMessage.text = getString(R.string.error_invalid_test) @@ -815,14 +819,14 @@ class HemoCubeFragment : Fragment() { } if (fittedAbs1 < 0 || fittedAbs2 < 0 || fittedAbs3 < 0 || fittedAbs4 < 0) { - validationError = true +// validationError = true activity?.runOnUiThread { binding.errorMessage.text = getString(R.string.error_negative_abs) // binding.errorMessage.visibility = View.VISIBLE } } - if ((led1Average < 0.7 || led2Average < 0.7 || led3Average < 0.7 || led4Average < 0.7) && calculatedSlopeRatio > 35.0) { + if (led1Average < 0.0 || led2Average < 0.0 || led3Average < 0.0 || led4Average < 0.0) { validationError = true activity?.runOnUiThread { binding.errorMessage.text = "Severely Low Hb. Repeat test with 12 ul in 2 ml Buffer" @@ -831,7 +835,7 @@ class HemoCubeFragment : Fragment() { } if (fittedAbs3 < 0.1) { - validationError = true +// validationError = true testState.allErrorMessages += "Error: Low Hb. Repeat test" + "\n" activity?.runOnUiThread { binding.errorMessage.text = "Error: Low Hb. Repeat test" @@ -937,7 +941,7 @@ class HemoCubeFragment : Fragment() { fun deviceRatioClassification(ratio: Double?): String { try { if (ratio != null) { - if (ratio in 0.2..0.29) { + if (ratio in 0.1..0.29) { // setSubtitleTextColor(R.color.green_2) return "Normal" } diff --git a/app/src/main/res/layout/activity_kitscan_java.xml b/app/src/main/res/layout/activity_kitscan_java.xml new file mode 100644 index 0000000..3b1068c --- /dev/null +++ b/app/src/main/res/layout/activity_kitscan_java.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/barcode_scanner_library_v2.0.8.0/barcode_scanner_library_v2.0.8.0.aar b/barcode_scanner_library_v2.0.8.0/barcode_scanner_library_v2.0.8.0.aar new file mode 100644 index 0000000..d544082 Binary files /dev/null and b/barcode_scanner_library_v2.0.8.0/barcode_scanner_library_v2.0.8.0.aar differ diff --git a/barcode_scanner_library_v2.0.8.0/build.gradle b/barcode_scanner_library_v2.0.8.0/build.gradle new file mode 100644 index 0000000..38a0a59 --- /dev/null +++ b/barcode_scanner_library_v2.0.8.0/build.gradle @@ -0,0 +1,2 @@ +configurations.maybeCreate("default") +artifacts.add("default", file('barcode_scanner_library_v2.0.8.0.aar')) \ No newline at end of file