From ce6bbef469f20e86e2e1a6f9bd7b3eb6e18fc33c Mon Sep 17 00:00:00 2001 From: milesmf Date: Wed, 1 Oct 2025 07:58:50 -0500 Subject: [PATCH 1/8] repomix LLM ready documentation --- CS710S-Java-ENTIRE-CONTEXT.txt | 66364 +++++++++++++++++++++++++++++++ CS710S-Java-ENTIRE-CONTEXT.xml | 66364 +++++++++++++++++++++++++++++++ README.md | 61 +- prompts.md | 49 + repomix-instruction.md | 107 + repomix.config.json | 80 + 6 files changed, 133022 insertions(+), 3 deletions(-) create mode 100644 CS710S-Java-ENTIRE-CONTEXT.txt create mode 100644 CS710S-Java-ENTIRE-CONTEXT.xml create mode 100644 prompts.md create mode 100644 repomix-instruction.md create mode 100644 repomix.config.json diff --git a/CS710S-Java-ENTIRE-CONTEXT.txt b/CS710S-Java-ENTIRE-CONTEXT.txt new file mode 100644 index 0000000..55c0290 --- /dev/null +++ b/CS710S-Java-ENTIRE-CONTEXT.txt @@ -0,0 +1,66364 @@ +This file is a merged representation of the entire codebase, combining all repository files into a single document. +Generated by Repomix on: 2025-10-01T12:58:20.019Z + + +This section contains a summary of this file. + + +This file contains a packed representation of the entire repository's contents. +It is designed to be easily consumable by AI systems for analysis, code review, +or other automated processes. + + + +The content is organized as follows: +1. This summary section +2. Repository information +3. Repository structure +4. Repository files, each consisting of: + - File path as an attribute + - Full contents of the file + + + +- This file should be treated as read-only. Any changes should be made to the + original repository files, not this packed version. +- When processing this file, use the file path to distinguish + between different files in the repository. +- Be aware that this file may contain sensitive information. Handle it with + the same level of security as you would the original repository. +- Pay special attention to the Repository Description. These contain important context and guidelines specific to this project. +- Pay special attention to the Repository Instruction. These contain important context and guidelines specific to this project. + + + +- Some files may have been excluded based on .gitignore rules and Repomix's + configuration. +- Binary files are not included in this packed representation. Please refer to + the Repository Structure section for a complete list of file paths, including + binary files. + + + + +Packed CS710S Android codebase for AI analysis of BLE/RFID flows, including Java source, projects, and docs. + + +For more information about Repomix, visit: https://github.com/yamadashy/repomix + + + + + +app/src/main/AndroidManifest.xml +app/src/main/java/com/csl/cs710ademoapp/AccessTask.java +app/src/main/java/com/csl/cs710ademoapp/AccessTask1.java +app/src/main/java/com/csl/cs710ademoapp/adapters/DrawerListAdapter.java +app/src/main/java/com/csl/cs710ademoapp/adapters/ReaderListAdapter.java +app/src/main/java/com/csl/cs710ademoapp/CustomAlertDialog.java +app/src/main/java/com/csl/cs710ademoapp/CustomIME.java +app/src/main/java/com/csl/cs710ademoapp/CustomMediaPlayer.java +app/src/main/java/com/csl/cs710ademoapp/CustomPopupWindow.java +app/src/main/java/com/csl/cs710ademoapp/CustomProgressDialog.java +app/src/main/java/com/csl/cs710ademoapp/DrawerListContent.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AboutFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessAuraSenseFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessColdChainFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessConfigFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessEm4325PassiveFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessFdmicroFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessImpinjFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessKilowayFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessMicronFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessReadWriteFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessReadWriteUserFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessRegisterFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessSecurityFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessSecurityKillFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessSecurityLockFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessUcode8Fragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessUcodeFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AccessXerxesLoggerFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AuraSenseFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AxzonFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/AxzonSelectorFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/ColdChainFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/CommonFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/ConnectionFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/DirectWedgeFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/FdmicroFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/ForegroundFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/HomeFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/HomeSpecialFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/HomeWFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/ImpinjFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/ImpinjM775Fragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/InventoryBarcodeFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/InventoryFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/InventoryRfidiMultiFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/InventoryRfidSearchFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/InventoryRfidSimpleFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/KilowayFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/LongjingFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/MicronFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/SettingAdminFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/SettingFilterFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/SettingFilterPostFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/SettingFilterPreFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/SettingFilterRssiFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/SettingFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/SettingOperateFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/SettingWedgeFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/Test1Fragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/TestFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/Ucode8Fragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/UcodeFragment.java +app/src/main/java/com/csl/cs710ademoapp/fragments/UtraceFragment.java +app/src/main/java/com/csl/cs710ademoapp/GenericTextWatcher.java +app/src/main/java/com/csl/cs710ademoapp/InventoryBarcodeTask.java +app/src/main/java/com/csl/cs710ademoapp/InventoryRfidTask.java +app/src/main/java/com/csl/cs710ademoapp/MainActivity.java +app/src/main/java/com/csl/cs710ademoapp/MyForegroundService.java +app/src/main/java/com/csl/cs710ademoapp/MyMqttClient.java +app/src/main/java/com/csl/cs710ademoapp/SaveList2ExternalTask.java +app/src/main/java/com/csl/cs710ademoapp/SelectTag.java +app/src/main/java/com/csl/cs710ademoapp/SensorConnector.java +app/src/main/java/com/csl/cs710ademoapp/SettingTask.java +app/src/main/java/com/csl/cs710ademoapp/SharedObjects.java +app/src/main/res/drawable/border.xml +app/src/main/res/drawable/ic_launcher_background.xml +app/src/main/res/drawable/my_edittext_background.xml +app/src/main/res/layout/actionbar_indeterminate_progress.xml +app/src/main/res/layout/activity_main.xml +app/src/main/res/layout/activity_main1.xml +app/src/main/res/layout/custom_edittext_password.xml +app/src/main/res/layout/custom_edittext.xml +app/src/main/res/layout/custom_notification.xml +app/src/main/res/layout/custom_readwrite.xml +app/src/main/res/layout/custom_select.xml +app/src/main/res/layout/custom_select1.xml +app/src/main/res/layout/custom_select2.xml +app/src/main/res/layout/custom_spinner_layout.xml +app/src/main/res/layout/custom_tabbed_layout.xml +app/src/main/res/layout/drawer_list_item.xml +app/src/main/res/layout/fragment_about.xml +app/src/main/res/layout/fragment_access_aurasense.xml +app/src/main/res/layout/fragment_access_coldchain.xml +app/src/main/res/layout/fragment_access_config.xml +app/src/main/res/layout/fragment_access_em4325passive.xml +app/src/main/res/layout/fragment_access_fdmicro.xml +app/src/main/res/layout/fragment_access_impinj.xml +app/src/main/res/layout/fragment_access_kill.xml +app/src/main/res/layout/fragment_access_kiloway.xml +app/src/main/res/layout/fragment_access_lock.xml +app/src/main/res/layout/fragment_access_micron.xml +app/src/main/res/layout/fragment_access_readwrite.xml +app/src/main/res/layout/fragment_access_register.xml +app/src/main/res/layout/fragment_access_ucode.xml +app/src/main/res/layout/fragment_access_ucode8.xml +app/src/main/res/layout/fragment_access_xerxes.xml +app/src/main/res/layout/fragment_connection.xml +app/src/main/res/layout/fragment_directwedge_settings.xml +app/src/main/res/layout/fragment_directwedge.xml +app/src/main/res/layout/fragment_filterpost_content.xml +app/src/main/res/layout/fragment_filterpre_content.xml +app/src/main/res/layout/fragment_filterrssi_content.xml +app/src/main/res/layout/fragment_geiger_search.xml +app/src/main/res/layout/fragment_inventory_barcode.xml +app/src/main/res/layout/fragment_inventory_rfid_multi.xml +app/src/main/res/layout/fragment_inventory_rfid_simple.xml +app/src/main/res/layout/fragment_select_axzon.xml +app/src/main/res/layout/fragment_settings_admin.xml +app/src/main/res/layout/fragment_settings_operate.xml +app/src/main/res/layout/fragment_specials.xml +app/src/main/res/layout/fragment_test.xml +app/src/main/res/layout/fragment_test1.xml +app/src/main/res/layout/fragment_utrace.xml +app/src/main/res/layout/home_layout108.xml +app/src/main/res/layout/home_layout710.xml +app/src/main/res/layout/home_special_layout.xml +app/src/main/res/layout/keyboard_preview.xml +app/src/main/res/layout/keyboard_view.xml +app/src/main/res/layout/list_item.xml +app/src/main/res/layout/popup.xml +app/src/main/res/layout/readers_list_item.xml +app/src/main/res/layout/title_divider.xml +app/src/main/res/menu/menu_connection.xml +app/src/main/res/menu/menu_home.xml +app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +app/src/main/res/values/colors.xml +app/src/main/res/values/dimens.xml +app/src/main/res/values/strings.xml +app/src/main/res/values/styles.xml +app/src/main/res/xml/device_filter.xml +app/src/main/res/xml/method.xml +app/src/main/res/xml/nfc_tech_filter.xml +app/src/main/res/xml/number_pad.xml +app/src/main/res/xml/number_pad1.xml +cslibrary4a/src/main/AndroidManifest.xml +cslibrary4a/src/main/java/com/csl/cslibrary4a/AdapterTab.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/AesCmac.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/BarcodeConnector.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/BarcodeNewland.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/BluetoothConnector.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/BluetoothGatt.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/ConnectorData.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/ControllerConnector.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/Cs108Library4A.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/Cs710Library4A.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/CsLibrary4A.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/CsReaderConnector.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/DeviceFinder.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/NotificationConnector.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/ReaderDevice.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/RfidConnector.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/RfidReader.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/RfidReaderChipData.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/RfidReaderChipE710.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/RfidReaderChipR2000.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/SettingData.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/UsbConnector.java +cslibrary4a/src/main/java/com/csl/cslibrary4a/Utility.java +cslibrary4a/src/main/res/drawable/ic_launcher_background.xml +cslibrary4a/src/main/res/drawable/ic_launcher_foreground.xml +cslibrary4a/src/main/res/layout/popup.xml +cslibrary4a/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +cslibrary4a/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +cslibrary4a/src/main/res/values-night/themes.xml +cslibrary4a/src/main/res/values/colors.xml +cslibrary4a/src/main/res/values/strings.xml +cslibrary4a/src/main/res/values/themes.xml +epctagcoder/src/main/AndroidManifest.xml +epctagcoder/src/main/java/org/epctagcoder/exception/EPCParseException.java +epctagcoder/src/main/java/org/epctagcoder/option/CPI/CPIFilterValue.java +epctagcoder/src/main/java/org/epctagcoder/option/CPI/CPIHeader.java +epctagcoder/src/main/java/org/epctagcoder/option/CPI/CPITagSize.java +epctagcoder/src/main/java/org/epctagcoder/option/CPI/partitionTable/CPIPartitionTableList.java +epctagcoder/src/main/java/org/epctagcoder/option/GDTI/GDTIFilterValue.java +epctagcoder/src/main/java/org/epctagcoder/option/GDTI/GDTIHeader.java +epctagcoder/src/main/java/org/epctagcoder/option/GDTI/GDTITagSize.java +epctagcoder/src/main/java/org/epctagcoder/option/GDTI/partitionTable/GDTIPartitionTableList.java +epctagcoder/src/main/java/org/epctagcoder/option/GIAI/GIAIFilterValue.java +epctagcoder/src/main/java/org/epctagcoder/option/GIAI/GIAIHeader.java +epctagcoder/src/main/java/org/epctagcoder/option/GIAI/GIAITagSize.java +epctagcoder/src/main/java/org/epctagcoder/option/GIAI/partitionTable/GIAIPartitionTableList.java +epctagcoder/src/main/java/org/epctagcoder/option/GRAI/GRAIFilterValue.java +epctagcoder/src/main/java/org/epctagcoder/option/GRAI/GRAIHeader.java +epctagcoder/src/main/java/org/epctagcoder/option/GRAI/GRAITagSize.java +epctagcoder/src/main/java/org/epctagcoder/option/GRAI/partitionTable/GRAIPartitionTableList.java +epctagcoder/src/main/java/org/epctagcoder/option/GSRN/GSRNFilterValue.java +epctagcoder/src/main/java/org/epctagcoder/option/GSRN/GSRNHeader.java +epctagcoder/src/main/java/org/epctagcoder/option/GSRN/GSRNTagSize.java +epctagcoder/src/main/java/org/epctagcoder/option/GSRN/partitionTable/GSRNPartitionTableList.java +epctagcoder/src/main/java/org/epctagcoder/option/GSRNP/GSRNPFilterValue.java +epctagcoder/src/main/java/org/epctagcoder/option/GSRNP/GSRNPHeader.java +epctagcoder/src/main/java/org/epctagcoder/option/GSRNP/GSRNPTagSize.java +epctagcoder/src/main/java/org/epctagcoder/option/GSRNP/partitionTable/GSRNPPartitionTableList.java +epctagcoder/src/main/java/org/epctagcoder/option/PrefixLength.java +epctagcoder/src/main/java/org/epctagcoder/option/SGLN/partitionTable/SGLNPartitionTableList.java +epctagcoder/src/main/java/org/epctagcoder/option/SGLN/SGLNFilterValue.java +epctagcoder/src/main/java/org/epctagcoder/option/SGLN/SGLNHeader.java +epctagcoder/src/main/java/org/epctagcoder/option/SGLN/SGLNTagSize.java +epctagcoder/src/main/java/org/epctagcoder/option/SGTIN/partitionTable/SGTINPartitionTableList.java +epctagcoder/src/main/java/org/epctagcoder/option/SGTIN/SGTINExtensionDigit.java +epctagcoder/src/main/java/org/epctagcoder/option/SGTIN/SGTINFilterValue.java +epctagcoder/src/main/java/org/epctagcoder/option/SGTIN/SGTINHeader.java +epctagcoder/src/main/java/org/epctagcoder/option/SGTIN/SGTINTagSize.java +epctagcoder/src/main/java/org/epctagcoder/option/SSCC/partitionTable/SSCCPartitionTableList.java +epctagcoder/src/main/java/org/epctagcoder/option/SSCC/SSCCExtensionDigit.java +epctagcoder/src/main/java/org/epctagcoder/option/SSCC/SSCCFilterValue.java +epctagcoder/src/main/java/org/epctagcoder/option/SSCC/SSCCHeader.java +epctagcoder/src/main/java/org/epctagcoder/option/SSCC/SSCCTagSize.java +epctagcoder/src/main/java/org/epctagcoder/option/TableItem.java +epctagcoder/src/main/java/org/epctagcoder/parse/CPI/ParseCPI.java +epctagcoder/src/main/java/org/epctagcoder/parse/GDTI/ParseGDTI.java +epctagcoder/src/main/java/org/epctagcoder/parse/GIAI/ParseGIAI.java +epctagcoder/src/main/java/org/epctagcoder/parse/GRAI/ParseGRAI.java +epctagcoder/src/main/java/org/epctagcoder/parse/GSRN/ParseGSRN.java +epctagcoder/src/main/java/org/epctagcoder/parse/GSRNP/ParseGSRNP.java +epctagcoder/src/main/java/org/epctagcoder/parse/SGLN/ParseSGLN.java +epctagcoder/src/main/java/org/epctagcoder/parse/SGTIN/ParseSGTIN.java +epctagcoder/src/main/java/org/epctagcoder/parse/SSCC/ParseSSCC.java +epctagcoder/src/main/java/org/epctagcoder/result/Base.java +epctagcoder/src/main/java/org/epctagcoder/result/CPI.java +epctagcoder/src/main/java/org/epctagcoder/result/GDTI.java +epctagcoder/src/main/java/org/epctagcoder/result/GIAI.java +epctagcoder/src/main/java/org/epctagcoder/result/GRAI.java +epctagcoder/src/main/java/org/epctagcoder/result/GSRN.java +epctagcoder/src/main/java/org/epctagcoder/result/GSRNP.java +epctagcoder/src/main/java/org/epctagcoder/result/SGLN.java +epctagcoder/src/main/java/org/epctagcoder/result/SGTIN.java +epctagcoder/src/main/java/org/epctagcoder/result/SSCC.java +epctagcoder/src/main/java/org/epctagcoder/util/Converter.java +gradle/wrapper/gradle-wrapper.properties +README.md +repomix-instruction.md +repomix.config.json + + + +This section contains the contents of the repository's files. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +package com.csl.cs710ademoapp; + +import android.os.AsyncTask; +import android.os.Handler; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cslibrary4a.RfidReaderChipData; + +import java.util.ArrayList; + +public class AccessTask extends AsyncTask { + final boolean DEBUG = true; + final boolean skipSelect = false; + public enum TaskCancelRReason { + NULL, INVALD_REQUEST, DESTORY, STOP, BUTTON_RELEASE, ERROR, TIMEOUT + } + public TaskCancelRReason taskCancelReason; + public String accessResult; + public String accessTagEpc; + Handler mHandler = new Handler(); + Runnable updateRunnable = null; + + Button button; String buttonText; + TextView registerRunTime, registerTagGot, registerVoltageLevel; + TextView registerYield, registerTotal; + boolean invalidRequest, selectOne = false; + String selectMask; int selectBank, selectOffset; + String strPassword; int powerLevel; + RfidReaderChipData.HostCommands hostCommand; + + CustomMediaPlayer playerO, playerN; + + long timeMillis, startTimeMillis, runTimeMillis; + int accessError, backscatterError; + boolean timeoutError, crcError; + public String resultError = ""; + boolean success; + boolean done = false; + boolean ending = false; + private String endingMessaage; + + int qValue=0; + int repeat=0; + boolean bEnableErrorPopWindow=true; + + boolean gotInventory; + int batteryCountInventory_old; + boolean bSkipClearFilter = false; + + public AccessTask(Button button, boolean invalidRequest, boolean selectOne, + String selectMask, int selectBank, int selectOffset, + String strPassword, int powerLevel, RfidReaderChipData.HostCommands hostCommand, + boolean bEnableErrorPopWindow, Runnable updateRunnable) { + this.button = button; + this.registerTagGot = registerTagGot; + this.registerVoltageLevel = registerVoltageLevel; + + this.invalidRequest = invalidRequest; MainActivity.csLibrary4A.appendToLog("invalidRequest = " + invalidRequest); + this.selectOne = selectOne; + this.selectMask = selectMask; + this.selectBank = selectBank; + this.selectOffset = selectOffset; + this.strPassword = strPassword; + this.powerLevel = powerLevel; + this.hostCommand = hostCommand; + this.bEnableErrorPopWindow = bEnableErrorPopWindow; + this.updateRunnable = updateRunnable; + if (true) { + total = 0; + tagList.clear(); + } + preExecute(); + } + public AccessTask(Button button, TextView textViewWriteCount, boolean invalidRequest, boolean selectOne, + String selectMask, int selectBank, int selectOffset, + String strPassword, int powerLevel, RfidReaderChipData.HostCommands hostCommand, + int qValue, int repeat, boolean resetCount, boolean bSkipClearFilter, + TextView registerRunTime, TextView registerTagGot, TextView registerVoltageLevel, TextView registerYieldView, TextView registerTotalView) { + this.button = button; + this.registerTotal = textViewWriteCount; + this.registerRunTime = registerRunTime; + this.registerTagGot = registerTagGot; + this.registerVoltageLevel = registerVoltageLevel; + this.registerYield = registerYieldView; + this.registerTotal = registerTotalView; + + this.invalidRequest = invalidRequest; MainActivity.csLibrary4A.appendToLog("invalidRequest = " + invalidRequest); + this.selectOne = selectOne; + this.selectMask = selectMask; + this.selectBank = selectBank; + this.selectOffset = selectOffset; + this.strPassword = strPassword; + this.powerLevel = powerLevel; + this.hostCommand = hostCommand; + this.qValue = qValue; + if (repeat > 255) repeat = 255; + this.repeat = repeat; + this.bSkipClearFilter = bSkipClearFilter; + if (bSkipClearFilter) this.selectOne = false; + if (resetCount) { + total = 0; + tagList.clear(); + } + preExecute(); + } + public void setRunnable(Runnable updateRunnable) { + this.updateRunnable = updateRunnable; + } + + void preExecute() { + accessResult = null; MainActivity.csLibrary4A.appendToLog("accessResult is set null"); + playerO = MainActivity.sharedObjects.playerO; + playerN = MainActivity.sharedObjects.playerN; + //playerN.start(); + + buttonText = button.getText().toString().trim(); + String buttonText1 = ""; String strLastChar = ""; + if (buttonText.length() != 0) { + strLastChar = buttonText.substring(buttonText.length() - 1); + if (strLastChar.toUpperCase().matches("E")) { + buttonText1 = buttonText.substring(0, buttonText.length() - 1); + } else if (buttonText.toUpperCase().matches("STOP")) { + buttonText1 = buttonText; + buttonText1 += buttonText1.substring(buttonText.length() - 1); + } else buttonText1 = buttonText; + } + if (repeat > 1 || buttonText.length() == 0) button.setText("Stop"); + else { + if (Character.isUpperCase(strLastChar.charAt(0))) button.setText(buttonText1 + "ING"); + else button.setText(buttonText1 + "ing"); + } + if (registerYield != null && tagList.size()==0) registerYield.setText(""); + if (registerTotal != null && total == 0) registerTotal.setText(""); + + timeMillis = System.currentTimeMillis(); startTimeMillis = timeMillis; runTimeMillis = startTimeMillis; + accessError = 0; backscatterError = 0; timeoutError = false; crcError = false; + success = false; + + if (invalidRequest == false) { + if (strPassword.length() != 8) { invalidRequest = true; MainActivity.csLibrary4A.appendToLog("strPassword.length = " + strPassword.length() + " (not 8)."); } + else if (hostCommand == RfidReaderChipData.HostCommands.CMD_18K6CKILL) { + if (MainActivity.csLibrary4A.setRx000KillPassword(strPassword) == false) { + invalidRequest = true; MainActivity.csLibrary4A.appendToLog("setRx000KillPassword is failed"); + } + } else if (MainActivity.csLibrary4A.setRx000AccessPassword(strPassword) == false) { + invalidRequest = true; + MainActivity.csLibrary4A.appendToLog("setRx000AccessPassword is failed"); + } + } + if (invalidRequest == false) { + if (MainActivity.csLibrary4A.setAccessRetry(true, 7) == false) { + invalidRequest = true; MainActivity.csLibrary4A.appendToLog("setAccessRetry is failed"); + } + } + if (invalidRequest == false) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessTask(): powerLevel = " + powerLevel); + int matchRep = 1; + if (repeat > 1) matchRep = repeat; + if (false && bSkipClearFilter == false) { + MainActivity.csLibrary4A.appendToLog("Going to setSelectCriteria disable"); + MainActivity.csLibrary4A.setSelectCriteriaDisable(-1); + } + if (powerLevel < 0 || powerLevel > MainActivity.powerLevelMax) invalidRequest = true; + else if (skipSelect == false) { + MainActivity.csLibrary4A.appendToLog("AccessTask.preExecute goes to setSelectTag"); + if (MainActivity.csLibrary4A.setSelectedTag(selectOne, selectMask, selectBank, selectOffset, powerLevel, qValue, matchRep) == false) { + invalidRequest = true; MainActivity.csLibrary4A.appendToLog("setSelectedTag is failed with selectMask = " + selectMask + ", selectBank = " + selectBank + ", selectOffset = " + selectOffset + ", powerLevel = " + powerLevel); + } + } + } + gotInventory = false; + taskCancelReason = TaskCancelRReason.NULL; + if (invalidRequest) { + cancel(true); + taskCancelReason = TaskCancelRReason.INVALD_REQUEST; + MainActivity.csLibrary4A.appendToLog("invalidRequest A= " + invalidRequest); + } else { + //MainActivity.csLibrary4A.setTagRead(0); + MainActivity.csLibrary4A.sendHostRegRequestHST_CMD(hostCommand); + } + } + + boolean accessCompleteReceived = false; + + @Override + protected String doInBackground(Void... a) { + boolean ending = false; + int iTimeOut = 5000; + accessCompleteReceived = false; + + while (MainActivity.csLibrary4A.isBleConnected() && isCancelled() == false && ending == false) { + int batteryCount = MainActivity.csLibrary4A.getBatteryCount(); + if (batteryCountInventory_old != batteryCount) { + batteryCountInventory_old = batteryCount; + publishProgress("VV"); + } + if (System.currentTimeMillis() > runTimeMillis + 1000) { + runTimeMillis = System.currentTimeMillis(); + publishProgress("WW"); + } + byte[] notificationData = MainActivity.csLibrary4A.onNotificationEvent(); + RfidReaderChipData.Rx000pkgData rx000pkgData = MainActivity.csLibrary4A.onRFIDEvent(); + if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) timeMillis = System.currentTimeMillis(); + else if (rx000pkgData != null) { + if (rx000pkgData.responseType == null) { + publishProgress("null response"); + } else if (rx000pkgData.responseType == RfidReaderChipData.HostCmdResponseTypes.TYPE_18K6C_TAG_ACCESS) { + accessCompleteReceived = true; + MainActivity.csLibrary4A.appendToLog("rx000pkgData.dataValues = " + MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.dataValues)); + if (rx000pkgData.decodedError == null) { + if (done == false) { + accessResult = rx000pkgData.decodedResult; + MainActivity.csLibrary4A.appendToLog("responseType = " + rx000pkgData.responseType.toString() + ", accessResult = " + accessResult); + if (repeat > 0) repeat--; + if (updateRunnable != null) mHandler.post(updateRunnable); + publishProgress(null, rx000pkgData.decodedResult); + } + done = true; + } else publishProgress(rx000pkgData.decodedError); + iTimeOut = 1000; + } else if (rx000pkgData.responseType == RfidReaderChipData.HostCmdResponseTypes.TYPE_COMMAND_END) { + if (hostCommand == RfidReaderChipData.HostCommands.CMD_18K6CKILL && accessCompleteReceived == false) accessResult = ""; + MainActivity.csLibrary4A.appendToLog("BtData: repeat = " + repeat + ", decodedError = " + rx000pkgData.decodedError + ", resultError = " + resultError); + if (rx000pkgData.decodedError != null) { endingMessaage = rx000pkgData.decodedError; ending = true; } + else if (repeat > 0 && resultError.length() == 0) { + resultError = ""; + if (true) MainActivity.csLibrary4A.appendToLog("Debug_InvCfg: AccessTask.doInBackground goes to setMatchRep with repeat = " + repeat); + MainActivity.csLibrary4A.setMatchRep(repeat); + MainActivity.csLibrary4A.sendHostRegRequestHST_CMD(hostCommand); + } else { + endingMessaage = ""; + ending = true; + } + } else if (rx000pkgData.responseType == RfidReaderChipData.HostCmdResponseTypes.TYPE_18K6C_INVENTORY) { + accessTagEpc = MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.decodedEpc); + done = false; + publishProgress("TT", MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.decodedEpc)); + } else { + publishProgress("Unhandled Response: " + rx000pkgData.responseType.toString()); + } + timeMillis = System.currentTimeMillis(); + } + else if (notificationData != null) { + //MainActivity.csLibrary4A.appendToLog("resultError=" + MainActivity.csLibrary4A.byteArrayToString(notificationData)); + publishProgress("Received notification uplink event 0xA101 with error code=" + MainActivity.csLibrary4A.byteArrayToString(notificationData)); + taskCancelReason = TaskCancelRReason.ERROR; + } + if (System.currentTimeMillis() - timeMillis > iTimeOut) { + //MainActivity.csLibrary4A.appendToLog("endingMessage: iTimeout = " + iTimeOut); + taskCancelReason = TaskCancelRReason.TIMEOUT; + } + if (taskCancelReason != TaskCancelRReason.NULL) { + //MainActivity.csLibrary4A.appendToLog("taskCancelReason=" + TaskCancelRReason.values()); + cancel(true); + } + } + return "End of Asynctask():" + ending; + } + + static int total = 0; + static ArrayList tagList = new ArrayList(); + String tagInventoried = null; + @Override + protected void onProgressUpdate(String... output) { + if (output[0] != null) { + MainActivity.csLibrary4A.appendToLog("onProgressUpdate output[0] = " + output[0]); + if (output[0].length() == 2) { + if (output[0].contains("TT")) { + gotInventory = true; + boolean matched = false; + for (int i = 0; i < tagList.size(); i++) { + if (output[1].matches(tagList.get(i))) { + matched = true; + break; + } + } + if (registerTagGot != null) registerTagGot.setText(output[1]); + if (matched == false) tagInventoried = output[1]; + } else if (output[0].contains("WW")) { + long timePeriod = (System.currentTimeMillis() - startTimeMillis) / 1000; + if (timePeriod > 0) { + if (registerRunTime != null) registerRunTime.setText(String.format("Run time: %d sec", timePeriod)); + } + } else if (taskCancelReason == TaskCancelRReason.NULL) { + if (registerVoltageLevel != null) registerVoltageLevel.setText(MainActivity.csLibrary4A.getBatteryDisplay(true)); + } + } else { + resultError += output[0]; + if (true) + MainActivity.csLibrary4A.appendToLog("output[0]: " + output[0] + ", resultError = " + resultError); + } + } else { + MainActivity.csLibrary4A.appendToLog("onProgressUpdate output[1] = " + output[1]); + if (registerYield != null) { + if (tagInventoried != null) { + tagList.add(tagInventoried); + tagInventoried = null; + } + registerYield.setText("Unique:" + Integer.toString(tagList.size())); + } + if (registerTotal != null) registerTotal.setText("Total:" + Integer.toString(++total)); + } + } + + @Override + protected void onCancelled() { + super.onCancelled(); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("endingMesssage: taskCancelReason = " + taskCancelReason); + MainActivity.csLibrary4A.abortOperation(); + if (taskCancelReason == TaskCancelRReason.NULL) taskCancelReason = TaskCancelRReason.DESTORY; + DeviceConnectTask4RegisterEnding(); + } + + @Override + protected void onPostExecute(String result) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessSecurityLockFragment.InventoryRfidTask.onPostExecute(): " + result); + DeviceConnectTask4RegisterEnding(); + } + + void DeviceConnectTask4RegisterEnding() { + //MainActivity.csLibrary4A.setAccessCount(0); + String strErrorMessage = ""; + if (false) { + boolean success = false; + MainActivity.csLibrary4A.appendToLog("repeat = " + repeat + ", taskCancelReason = " + taskCancelReason.toString() + + ", backscatterError = " + backscatterError + ", accessError =" + accessError + ", accessResult = " + accessResult + ", resultError = " + resultError); + if ((repeat <= 1 && taskCancelReason != TaskCancelRReason.NULL) || backscatterError != 0 || accessError != 0 || accessResult == null || resultError.length() != 0) { + MainActivity.csLibrary4A.appendToLog("FAILURE"); Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_FAILURE, Toast.LENGTH_SHORT).show(); + playerO.start(); + } else { + MainActivity.csLibrary4A.appendToLog("SUCCESS"); Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_SUCCESS, Toast.LENGTH_SHORT).show(); + playerN.start(); + } + } else { + strErrorMessage = ""; + switch (taskCancelReason) { + case NULL: + if (accessResult == null) MainActivity.csLibrary4A.appendToLog("taskCancelReason: NULL accessResult"); + if (resultError != null) MainActivity.csLibrary4A.appendToLog("taskCancelReason: resultError = " + resultError); + if (endingMessaage != null) MainActivity.csLibrary4A.appendToLog("taskCancelReason: endingMessaage = " + endingMessaage); + if (accessResult == null || (resultError != null && resultError.length() != 0) || (endingMessaage != null && endingMessaage.length() != 0)) strErrorMessage += ("Finish as COMMAND END is received " + (gotInventory ? "WITH" : "WITHOUT") + " tag response"); + //else Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_SUCCESS, Toast.LENGTH_SHORT).show(); + break; + case STOP: + strErrorMessage += "Finish as STOP is pressed. "; + break; + case BUTTON_RELEASE: + strErrorMessage += "Finish as BUTTON is released. "; + break; + case ERROR: + strErrorMessage += "Finish due to error received."; + break; + case TIMEOUT: + strErrorMessage += "TIMEOUT without COMMAND_END. "; + break; + case INVALD_REQUEST: + strErrorMessage += "Invalid request. Operation is cancelled. "; + break; + } + MainActivity.csLibrary4A.appendToLog("taskCancelReason = " + taskCancelReason.toString() + ", accessResult = " + (accessResult == null ? "NULL": accessResult) + ", endingMessaage = " + (endingMessaage == null ? "NULL" : endingMessaage) + ", resultError = " + (resultError == null ? "NULL" : resultError)); + if (resultError.length() != 0) { + if (strErrorMessage.trim().length() == 0) strErrorMessage = resultError; + else strErrorMessage += (". " + resultError); + } + if (strErrorMessage.length() != 0) strErrorMessage += ". "; + } + if (endingMessaage != null) if (endingMessaage.length() != 0) strErrorMessage += "Received CommandEND Error = " + endingMessaage; + if (strErrorMessage.length() != 0) endingMessaage = strErrorMessage; + button.setText(buttonText); + if (endingMessaage != null) { + if (endingMessaage.length() != 0) { + MainActivity.csLibrary4A.appendToLog("endingMessage=" + endingMessaage); + if (bEnableErrorPopWindow) { + CustomPopupWindow customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart(endingMessaage, false); + } + } + } + } +} + + + +package com.csl.cs710ademoapp; + +import android.os.AsyncTask; +import android.widget.Button; +import android.widget.Toast; + +import com.csl.cslibrary4a.RfidReaderChipData; + +public class AccessTask1 { + Button button; + boolean invalidRequest; + int accBank, accOffset, accSize, accSizeNow, accBlockCount = 90; String accWriteData, accWriteDataNow; + String selectMask; + int selectBank, selectOffset; + String strPassword; + int powerLevel; + RfidReaderChipData.HostCommands hostCommand; + Runnable updateRunnable = null; + + AccessTask accessTask; + public AccessTask1(Button button, boolean invalidRequest, + int accBank, int accOffset, int accSize, int accBlockCount, String accWriteData, + String selectMask, int selectBank, int selectOffset, + String strPassword, int powerLevel, RfidReaderChipData.HostCommands hostCommand, Runnable updateRunnable) { + this.button = button; + this.invalidRequest = invalidRequest; + MainActivity.csLibrary4A.appendToLog("HelloK: invalidRequest=" + invalidRequest); + this.accBank = accBank; + this.accOffset = accOffset; + if (hostCommand == RfidReaderChipData.HostCommands.CMD_18K6CWRITE) { if (accBlockCount > 16) accBlockCount = 16; } + else if (accBlockCount > 255) accBlockCount = 255; + this.accBlockCount = accBlockCount; + if (accWriteData == null) accWriteData = ""; + if (hostCommand == RfidReaderChipData.HostCommands.CMD_18K6CWRITE) { + MainActivity.csLibrary4A.appendToLog("strOut: accWriteData=" + accWriteData); + accWriteData = deformatWriteAccessData(accWriteData); + if (accWriteData.length() < accSize * 4) { + accSize = accWriteData.length()/4; + if (accSize*4 != accWriteData.length()) accSize++; + } + } + this.accSize = accSize; + if (accSize == 0) { + isResultReady = true; + accessResult = ""; + } + this.accWriteData = accWriteData; + this.selectMask = selectMask; + this.selectBank = selectBank; + this.selectOffset = selectOffset; + this.strPassword = strPassword; + this.powerLevel = powerLevel; + this.hostCommand = hostCommand; + this.updateRunnable = updateRunnable; + MainActivity.csLibrary4A.appendToLog("HelloA, AccessTask1"); + CustomMediaPlayer playerN = MainActivity.sharedObjects.playerN; + playerN.start(); + setup(); + } + + public void execute() { + if (accessTask != null) accessTask.execute(); + } + + public boolean cancel(boolean bCancel) { + if (accessTask == null) return true; + return accessTask.cancel(bCancel); + } + + public AsyncTask.Status getStatus() { + if (accessTask == null) return AsyncTask.Status.FINISHED; + return accessTask.getStatus(); + } + + public String deformatWriteAccessData(String strIn) { + MainActivity.csLibrary4A.appendToLog("strOut: strIn=" + strIn); + String strOut = strIn.replaceAll("\\P{Print}", ""); + MainActivity.csLibrary4A.appendToLog("strOut=" + strOut); + while (strOut.indexOf(":") > 0) { + int index = strOut.indexOf(":"); + String writeDataTemp = ""; + if (index > 4) writeDataTemp = strOut.substring(0, index - 3); + writeDataTemp += strOut.substring(index + 1); + strOut = writeDataTemp; + MainActivity.csLibrary4A.appendToLog("strOut=" + strOut); + } + MainActivity.csLibrary4A.appendToLog("strOut=" + strOut); + return strOut; + } + + boolean isResultReady = false; int tryCount = 0, tryCountMax = 8; + public boolean isResultReady() { + boolean bValue = false; + if (accessTask == null) { } + else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) { } + else if (button.getText().toString().indexOf("ING") > 0) { } + else if (isResultReady == false) { + String strAccessResult = ""; + if (hostCommand != RfidReaderChipData.HostCommands.CMD_18K6CREAD || accBank != 3) strAccessResult = accessTask.accessResult; + else { + int word4line = 7; + for (int i = 0; i < accSizeNow; i=i+word4line) { + if (tryCount < tryCountMax && accessTask.accessResult == null) break; + strAccessResult += String.format("%03d:", accOffset + i); + if (accessTask.accessResult != null) { + if ((i + word4line) * 4 >= accessTask.accessResult.length()) { + int iLastWordIndex = accessTask.accessResult.substring(i * 4).length() / 4; + if (iLastWordIndex * 4 != accessTask.accessResult.substring(i * 4).length()) + iLastWordIndex++; + strAccessResult += String.format("%03d:", accOffset + i + iLastWordIndex - 1) + accessTask.accessResult.substring(i * 4); + } else + strAccessResult += accessTask.accessResult.substring(i * 4, (i + word4line) * 4); + } + strAccessResult += "\n"; + MainActivity.csLibrary4A.appendToLog("i=" + i + ", formatted accessTask.accessResult=" + strAccessResult); + } + } + if (accessResult == null) accessResult = strAccessResult; + else accessResult += strAccessResult; + + MainActivity.csLibrary4A.appendToLog("HelloA: accessResult=" + accessTask.accessResult); + if (accessTask.accessResult != null && accSizeNow >= accSize) { + bValue = true; + Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_SUCCESS, Toast.LENGTH_SHORT).show(); + } + else { + if (accessTask.accessResult != null) { + accOffset += accSizeNow; + accSize -= accSizeNow; + if (accWriteData != null) { if (accWriteData.length() >= accSizeNow*4) accWriteData = accWriteData.substring(accSizeNow*4); } + tryCount = 0; + } + MainActivity.csLibrary4A.appendToLog("HelloA: Going to retry with TryCount=" + tryCount + ", resultError = " + accessTask.resultError); + if (tryCount < tryCountMax) { + MainActivity.csLibrary4A.appendToLog("HelloA: re-setup"); + setup(); + execute(); + } else bValue = true; + } + } else bValue = true; + //MainActivity.csLibrary4A.appendToLog("HelloA: bValue=" + bValue); + isResultReady = bValue; + return bValue; + } + public String accessResult; + public String getResult() { + MainActivity.csLibrary4A.appendToLog("HelloA: accessResult = " + accessResult); + if (accessTask == null) { + MainActivity.csLibrary4A.appendToLog("accessTask is null"); + return null; + } + if (accessTask.getStatus() != AsyncTask.Status.FINISHED) { + MainActivity.csLibrary4A.appendToLog("accessTask.getStatus is not finished"); + return null; + } + if (button.getText().toString().indexOf("ING") > 0) { + MainActivity.csLibrary4A.appendToLog("button is still ing"); + return null; + } + return accessResult; + } + + void setup() { + tryCount++; + if (invalidRequest == false) { + if (MainActivity.csLibrary4A.setAccessBank(accBank) == false) { + MainActivity.csLibrary4A.appendToLog("HelloK: accBank, invalidRequest=" + invalidRequest); + invalidRequest = true; + } + } + if (invalidRequest == false) { + if (MainActivity.csLibrary4A.setAccessOffset(accOffset) == false) { + MainActivity.csLibrary4A.appendToLog("HelloK: accOffset, invalidRequest=" + invalidRequest); + invalidRequest = true; + } + } + if (invalidRequest == false) { + if (accSize == 0) { + MainActivity.csLibrary4A.appendToLog("HelloK: accSize0, invalidRequest=" + invalidRequest); + invalidRequest = true; + } else { + if (accSize > accBlockCount) accSizeNow = accBlockCount; + else accSizeNow = accSize; + MainActivity.csLibrary4A.appendToLog("HelloA: accSize=" + accSize + ", accSizeNow=" + accSizeNow); + if (MainActivity.csLibrary4A.setAccessCount(accSizeNow) == false) { + invalidRequest = true; + } + } + } + if (invalidRequest == false && hostCommand == RfidReaderChipData.HostCommands.CMD_18K6CWRITE) { + if (accWriteData.length() > accSizeNow * 4) accWriteDataNow = accWriteData.substring(0, accSizeNow*4); + else accWriteDataNow = accWriteData; + if (MainActivity.csLibrary4A.setAccessWriteData(accWriteDataNow) == false) { + invalidRequest = true; + } + } + MainActivity.csLibrary4A.appendToLog("HelloA: accOffset=" + accOffset + ", accSizeNow=" + accSizeNow + ", accSize=" + accSize); + MainActivity.csLibrary4A.appendToLog("HelloK: invalidRequest=" + invalidRequest); + accessTask = new AccessTask(button, invalidRequest, true, + selectMask, selectBank, selectOffset, + strPassword, powerLevel, hostCommand, tryCount==tryCountMax, updateRunnable); + } +} + + + +package com.csl.cs710ademoapp.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import com.csl.cs710ademoapp.DrawerListContent; +import com.csl.cs710ademoapp.R; + +import java.util.List; + +/** + * Class to handle the data for NavigationDrawer. + */ +public class DrawerListAdapter extends ArrayAdapter { + Context mContext; + List mData = null; + + /** + * Construtor. Handles the initialization. + * + * @param context - context to be used + * @param resource - layout to be inflated + * @param objects - navidation drawer items + */ + public DrawerListAdapter(Context context, int resource, List objects) { + super(context, resource, objects); + this.mContext = context; + this.mData = objects; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + LayoutInflater inflater = (LayoutInflater) mContext + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + convertView = inflater.inflate(R.layout.drawer_list_item, parent, false); + } + + DrawerListContent.DrawerItem item = mData.get(position); + //Set the label + TextView label1 = (TextView) convertView.findViewById(R.id.drawerItemName); + label1.setText(item.content); + return convertView; + } +} + + + +package com.csl.cs710ademoapp.adapters; + +import android.content.Context; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.CheckedTextView; +import android.widget.TextView; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.ReaderDevice; + +import java.util.ArrayList; + +public class ReaderListAdapter extends ArrayAdapter { + final boolean DEBUG = false; + private final Context context; + private final int resourceId; + private final ArrayList readersList; + private boolean select4detail, select4Rssi, selectDupElim, select4Extra1, select4Extra2; + + public ReaderListAdapter(Context context, int resourceId, ArrayList readersList, boolean select4detail, boolean select4Rssi) { + super(context, resourceId, readersList); + this.context = context; + this.resourceId = resourceId; + this.readersList = readersList; + this.select4detail = select4detail; + this.select4Rssi = select4Rssi; + select4Extra1 = false; + select4Extra2 = false; + } + + public ReaderListAdapter(Context context, int resourceId, ArrayList readersList, boolean select4detail, boolean select4Rssi, boolean selectDupElim, boolean select4Extra1, boolean select4Extra2) { + super(context, resourceId, readersList); + this.context = context; + this.resourceId = resourceId; + this.readersList = readersList; + this.select4detail = select4detail; + this.select4Rssi = select4Rssi; + this.selectDupElim = selectDupElim; + this.select4Extra1 = select4Extra1; + this.select4Extra2 = select4Extra2; + MainActivity.csLibrary4A.appendToLog("select4Extra1 = " + select4Extra1 + ", select4Extra2 = " + select4Extra2); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ReaderDevice reader = readersList.get(position); + if (convertView == null) { + LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + convertView = layoutInflater.inflate(resourceId, null); + } + + CheckedTextView checkedTextView = (CheckedTextView) convertView.findViewById(R.id.reader_checkedtextview); + String text1 = ""; + if (reader.getName() != null) { + if (reader.getName().length() != 0) { + text1 += reader.getName(); + } + } + if (reader.getAddress() != null) { + if (reader.getAddress().length() != 0) { + if (text1.length() != 0) text1 += "\n"; + text1 += reader.getAddress(); + } + } + if (reader.getUpcSerial() != null) { + if (reader.getUpcSerial().length() != 0) { + if (text1.length() != 0) text1 += "\n"; + text1 += reader.getUpcSerial(); + } + } + if (MainActivity.csLibrary4A.isBleScanning()) { + if (reader.getServiceUUID2p1() == 0 || reader.getServiceUUID2p1() == 1) text1 += "\nCS108 Reader"; + else if (reader.getServiceUUID2p1() == 2 || reader.getServiceUUID2p1() == 3) text1 += "\nCS710S Reader"; + else if (reader.getServiceUUID2p1() == 4) text1 += "\nCS463 Reader"; + else if (reader.getServiceUUID2p1() == 5) text1 += "\nCS203XL Reader"; + else if (reader.getServiceUUID2p1() == 6) text1 += "\nConnected paired devices"; + } + checkedTextView.setText(text1); + if (reader.getSelected()) { + checkedTextView.setChecked(true); + } else { + checkedTextView.setChecked(false); + } + + TextView countTextView = (TextView) convertView.findViewById(R.id.reader_count); + if (reader.getCount() != 0) { + countTextView.setText(String.valueOf(reader.getCount())); + } else { + countTextView.setVisibility(View.GONE); + } + + if (select4Rssi) { + TextView rssiTextView = (TextView) convertView.findViewById(R.id.reader_rssi); + rssiTextView.setVisibility(View.VISIBLE); + double rssiValue = reader.getRssi(); + if (MainActivity.csLibrary4A.getRssiDisplaySetting() != 0 && rssiValue > 0) + rssiValue -= MainActivity.csLibrary4A.dBuV_dBm_constant; + rssiTextView.setText(String.format("%.1f", rssiValue)); + } + + if (select4Extra1) { + TextView portTextView = (TextView) convertView.findViewById(R.id.reader_extra1); + portTextView.setVisibility(View.VISIBLE); + int portValue = reader.getPort() + 1; + portTextView.setText(String.valueOf(portValue)); + } + + if (select4Extra2) { + TextView portTextView = (TextView) convertView.findViewById(R.id.reader_extra2); + portTextView.setVisibility(View.VISIBLE); + int codeStatus = reader.getStatus(); + int codeSensor = reader.getCodeSensor(); int codeRssi = reader.getCodeRssi(); float codeTempC = reader.getCodeTempC(); + String brand = reader.getBrand(); + String strExtra = ""; + if (codeStatus > reader.INVALID_STATUS) { //for Bap tags + int portstatus = reader.getStatus(); if (portstatus > reader.INVALID_STATUS) { + if ((portstatus & 2) == 0) strExtra += "Bat OK"; + else strExtra += "Bat NG"; + if ((portstatus & 4) != 0) strExtra += "\nTemper NG"; + } + } else if (codeSensor > reader.INVALID_CODESENSOR && codeRssi > reader.INVALID_CODERSSI) { //for Axzon/Magnus tags + strExtra = "SC=" + String.format("%d", codeSensor); + int iHumidityThreshold = Integer.parseInt(MainActivity.config.config3); + if (false && reader.getCodeSensorMax() > 0) { + float fValue = (float) codeSensor; + fValue /= (float) reader.getCodeSensorMax(); + fValue *= 100; + strExtra += "\nSC=" + String.format("%.1f", fValue) + "%"; + } else if (iHumidityThreshold > 0) { + strExtra += "\nSC=" + (codeSensor >= iHumidityThreshold ? "Dry" : "Wet"); + } + int ocrssiMin = -1; int ocrssiMax = -1; boolean bValidOcrssi = false; + ocrssiMax = Integer.parseInt(MainActivity.config.config1); + ocrssiMin = Integer.parseInt(MainActivity.config.config2); + if (ocrssiMax > 0 && ocrssiMin > 0 && (codeRssi > ocrssiMax || codeRssi < ocrssiMin)) strExtra += ("\nOCRSSI=" + String.format("%d", codeRssi) + ""); + else { + bValidOcrssi = true; strExtra += ("\nOCRSSI=" + String.format("%d", codeRssi)); + } + if (codeTempC > reader.INVALID_CODETEMPC) { + if (bValidOcrssi || portTextView.getText().toString().indexOf("T=") >= 0) + strExtra += ("\nT=" + String.format("%.1f", codeTempC) + (char) 0x00B0 + "C"); + } + int backport = reader.getBackport1(); if (backport > reader.INVALID_BACKPORT) strExtra += String.format("\nBP1=%d", backport); + backport = reader.getBackport2(); if (backport > reader.INVALID_BACKPORT) strExtra += String.format("\nBP2=%d", backport); + } else if (codeTempC > reader.INVALID_CODETEMPC) { //for Ctesius tags + strExtra = ("T=" + String.format("%.1f", codeTempC) + (char) 0x00B0 + "C"); + } else if (brand != null) { //reader.getDetails().contains("E2806894")) { //for code8 tags + strExtra = ((brand != null) ? ("Brand=" + brand) : ""); + } else if (reader.getSensorData() < reader.INVALID_SENSORDATA) { + strExtra = "SD=" + String.valueOf(reader.getSensorData()); + } + portTextView.setText(Html.fromHtml(strExtra)); + } + + TextView readerDetailA = (TextView) convertView.findViewById(R.id.reader_detailA); + TextView readerDetailB = (TextView) convertView.findViewById(R.id.reader_detailB); + if (reader.isConnected() || checkedTextView.isChecked() || select4detail == false) { + readerDetailA.setText(reader.getDetails()); + readerDetailB.setText(""); + if (reader.isConnected()) { + readerDetailB.setText("Connected"); + } else { + int channel = reader.getChannel(); + int phase = reader.getPhase(); + String stringDetailB = null; + if (channel != 0 || phase != 0) { + double dChannel = MainActivity.csLibrary4A.getLogicalChannel2PhysicalFreq(reader.getChannel()); + stringDetailB = "Phase=" + phase + "\n" + dChannel + "MHz"; + } + if (stringDetailB != null) readerDetailB.setText(stringDetailB); + } + if (readerDetailA.getText().toString().length() != 0 || readerDetailB.getText().toString().length() != 0) { + readerDetailA.setVisibility(View.VISIBLE); + readerDetailB.setVisibility(View.VISIBLE); + } else { + readerDetailA.setVisibility(View.GONE); + readerDetailB.setVisibility(View.GONE); + } + } else { + readerDetailA.setVisibility(View.GONE); + readerDetailB.setVisibility(View.GONE); + } + return convertView; + } + + public boolean getSelectDupElim() { return selectDupElim; } + public void setSelectDupElim(boolean selectDupElim) { this.selectDupElim = selectDupElim; } +} + + + +package com.csl.cs710ademoapp; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; + +public class CustomAlertDialog { + Runnable ans_true = null; + Runnable ans_false = null; + AlertDialog dialog = null; + public boolean Confirm(Activity act, String Title, String ConfirmText, + String CancelBtn, String OkBtn, Runnable aProcedure, Runnable bProcedure) { + ans_true = aProcedure; + ans_false= bProcedure; + dialog = new AlertDialog.Builder(act).create(); + dialog.setTitle(Title); + dialog.setMessage(ConfirmText); + dialog.setCancelable(false); + dialog.setButton(DialogInterface.BUTTON_POSITIVE, OkBtn, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int buttonId) { + ans_true.run(); + } + }); + dialog.setButton(DialogInterface.BUTTON_NEGATIVE, CancelBtn, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int buttonId) { + ans_false.run(); + } + }); + dialog.setIcon(R.drawable.alert); + dialog.show(); + return true; + } + + public boolean isShowing() { + if (dialog != null) return dialog.isShowing(); + else return false; + } +} + + + +package com.csl.cs710ademoapp; + +import android.inputmethodservice.InputMethodService; +import android.inputmethodservice.Keyboard; +import android.inputmethodservice.KeyboardView; +import android.os.AsyncTask; +import android.os.Handler; +import android.provider.Settings; +import android.util.Log; +import android.view.View; +import android.view.inputmethod.InputConnection; + +import com.csl.cslibrary4a.RfidReaderChipData; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.util.ArrayList; + +import static android.content.ContentValues.TAG; + +public class CustomIME extends InputMethodService { //implements KeyboardView.OnKeyboardActionListener { + Handler mHandler = new Handler(); + InputConnection ic; + DatagramSocket datagramSocket; + InetAddress hostAddress = null; + + @Override + public void onCreate() { + super.onCreate(); + try { + hostAddress = hostAddress = InetAddress.getByName("127.0.0.1"); + Log.i("Hello", "udpSocket hostAddress is valid"); + datagramSocket = new DatagramSocket(9394, hostAddress); + if (datagramSocket == null) Log.i("Hello", "udpSocket is null"); + else Log.i("Hello", "udpSocket is valid"); + //byte[] buffer = new byte[16]; + //DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 14552); + //udpsocket.send(packet); + } catch (SocketException e) { + Log.e("UDP: ", "udpSocket Socket Error: ", e); + } catch (IOException e) { + Log.e("UDP Send: ", "udpSocket IO Error", e); + } catch (Exception ex) { + Log.i("Hello", "udpSocket Exception Error: " + ex.getMessage()); + } + appendToLog("CustomIME.onCreate()"); + } + @Override + public View onCreateInputView() { + super.onCreateInputView();; + mHandler.post(serviceRunnable); + KeyboardView keyboardView = null; + if (true) { + keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view, null); + Keyboard keyboard = new Keyboard(this, R.xml.number_pad1); + keyboardView.setKeyboard(keyboard); + //keyboardView.setOnKeyboardActionListener(this); + } + ic = getCurrentInputConnection(); + Log.i("Hello", "udpSocket inputConnection is " + (ic == null ? "null" : "valid")); + return keyboardView; + } + @Override + public void onDestroy() { + appendToLog("CustomIME.onDestroy()"); + mHandler.removeCallbacks(serviceRunnable); + datagramSocket.close(); + super.onDestroy(); + } + + Runnable yourRunnable = new Runnable() { + @Override + public void run() { + byte[] buffer = new byte[250]; + Log.i("Hello", "udpSocket yourRunnable starts"); + DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length); + ic = getCurrentInputConnection(); + try { + Log.i("Hello", "udpSocket try starts"); +// String outString = "Client say: bye bye"; +// buffer = outString.getBytes(); +// DatagramPacket outDatagramPackat = new DatagramPacket(buffer, buffer.length, hostAddress, 9394); +// datagramSocket.send(outDatagramPackat); +// Log.i("Hello", "udpSocket sent data"); + + String strDataReceived; + do { + strDataReceived = null; + datagramSocket.receive(datagramPacket); + strDataReceived = new String(datagramPacket.getData(), 0, datagramPacket.getLength()); + Log.i("Hello", "udpSocket received data: " + strDataReceived); + ic.commitText(strDataReceived, 1); + } while (strDataReceived != null && strDataReceived.length() != 0); + } catch (IOException ex) { + Log.i("Hello", "udpSocket receive IOException Error: " + ex.toString()); + } + } + }; + + ArrayList epcArrayList = new ArrayList(); + InventoryRfidTask inventoryRfidTask; + InventoryBarcodeTask inventoryBarcodeTask; + boolean inventoring = false; + private Runnable serviceRunnable = new Runnable() { + @Override + public void run() { + String strCurrentIME = Settings.Secure.getString(getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); + String strCompare = getPackageName(); + appendToLog("CustomIME Debug 0 with strCurrentIME = " + strCurrentIME + ", strCompare = " + strCompare); + if (strCurrentIME.contains(strCompare) == false) { } + else if (MainActivity.sharedObjects == null || MainActivity.csLibrary4A == null) { + if (false) { new Thread(yourRunnable).start(); } + } + else if (MainActivity.mContext == null) return; + else { + if (inventoring == false) { + MainActivity.sharedObjects.serviceArrayList.clear(); + epcArrayList.clear(); + } + appendToLog("CustomIME Debug 1 with activityActive = " + MainActivity.activityActive + ", wedged = " + MainActivity.wedged + ", isBleConnected = " + MainActivity.csLibrary4A.isBleConnected()); + if (MainActivity.activityActive == false /*&& MainActivity.wedged*/ && MainActivity.csLibrary4A.isBleConnected()) { + if (MainActivity.csLibrary4A.getTriggerButtonStatus() == false) { + appendToLog("CustomIME Debug 2 with runningInventoryRfidTask = " + MainActivity.sharedObjects.runningInventoryRfidTask); + appendToLog("CustomIME Debug 2 with runningInventoryBarcodeTask = " + MainActivity.sharedObjects.runningInventoryBarcodeTask); + startStopHandler(); + inventoring = false; + } else if (inventoring == false) { + appendToLog("CustomIME Debug 3 with runningInventoryRfidTask = " + MainActivity.sharedObjects.runningInventoryRfidTask + ", and mrfidToWriteSize = " + MainActivity.csLibrary4A.mrfidToWriteSize()); + appendToLog("CustomIME Debug 3 with runningInventoryBarcodeTask = " + MainActivity.sharedObjects.runningInventoryBarcodeTask); + if (MainActivity.sharedObjects.runningInventoryRfidTask == false && MainActivity.sharedObjects.runningInventoryBarcodeTask == false && MainActivity.csLibrary4A.mrfidToWriteSize() == 0) { + startStopHandler(); + inventoring = true; + } + } else { + appendToLog("CustomIME Debug 4"); + while (MainActivity.sharedObjects.serviceArrayList.size() != 0) { + String strEpc = MainActivity.sharedObjects.serviceArrayList.get(0); + MainActivity.sharedObjects.serviceArrayList.remove(0); + appendToLog("CustomIME Debug 4A with strEpc = " + strEpc); + String strSgtin = null; + if (MainActivity.csLibrary4A.getWedgeOutput() == 1) { + strSgtin = MainActivity.csLibrary4A.getUpcSerial(strEpc); + appendToLog("strSgtin = " + (strSgtin == null ? "null" : strSgtin)); + if (strSgtin == null) strEpc = null; + } + boolean matched = false; + if (epcArrayList != null && strEpc != null) { + for (int i = 0; i < epcArrayList.size(); i++) { + if (epcArrayList.get(i).matches(strEpc)) { + matched = true; + break; + } + } + } + if (matched == false && strEpc != null) { + epcArrayList.add(strEpc); + InputConnection ic = getCurrentInputConnection(); + String strValue = strEpc; + if (strSgtin != null) strValue = strSgtin; + if (MainActivity.csLibrary4A.getWedgePrefix() != null) + strValue = MainActivity.csLibrary4A.getWedgePrefix() + strValue; + if (MainActivity.csLibrary4A.getWedgeSuffix() != null) + strValue += MainActivity.csLibrary4A.getWedgeSuffix(); + appendToLog("CustomIME, serviceRunnable: wedgeDelimiter = " + MainActivity.csLibrary4A.getWedgeDelimiter()); + switch (MainActivity.csLibrary4A.getWedgeDelimiter()) { + default: + strValue += "\n"; + break; + case 0x09: + strValue += "\t"; + break; + case 0x2C: + strValue += ","; + break; + case 0x20: + strValue += " "; + break; + case -1: + break; + } + appendToLog("CustomIME BtData to Keyboard: " + strValue); + ic.commitText(strValue, 1); + } + } + } + } + } + int iDelayms = 500; + if (inventoring) iDelayms = 100; + appendToLog("CustomIME BtData set next time as " + iDelayms); + mHandler.postDelayed(serviceRunnable, iDelayms); + } + }; + + public void appendToLog(String s) { + Log.i(TAG + ".Hello", s); + } + void startStopHandler() { + boolean started = false; + if (inventoryRfidTask != null) { + if (inventoryRfidTask.getStatus() == AsyncTask.Status.RUNNING) started = true; + } + if (inventoryBarcodeTask != null) { + if (inventoryBarcodeTask.getStatus() == AsyncTask.Status.RUNNING) started = true; + } + appendToLog("CustomIME Debug 10"); + if ((started && MainActivity.csLibrary4A.getTriggerButtonStatus()) || (started == false && MainActivity.csLibrary4A.getTriggerButtonStatus() == false)) return; + if (started == false) { + appendToLog("CustomIME Debug 11 with BtData wedgeOutput = " + MainActivity.csLibrary4A.getWedgeOutput()); + if (MainActivity.csLibrary4A.getWedgeOutput() == 2) { + inventoryBarcodeTask = new InventoryBarcodeTask(); + inventoryBarcodeTask.execute(); + } else { + MainActivity.csLibrary4A.setPowerLevel(MainActivity.csLibrary4A.getWedgePower()); + MainActivity.csLibrary4A.appendToLog("Debug_Compact: CustomIME.startStopHandler"); + MainActivity.csLibrary4A.startOperation(RfidReaderChipData.OperationTypes.TAG_INVENTORY_COMPACT); + inventoryRfidTask = new InventoryRfidTask(); + inventoryRfidTask.execute(); + } + } else { + appendToLog("CustomIME Debug 11"); + if (inventoryRfidTask != null) inventoryRfidTask.taskCancelReason = InventoryRfidTask.TaskCancelRReason.BUTTON_RELEASE; + if (inventoryBarcodeTask != null) inventoryBarcodeTask.taskCancelReason = InventoryBarcodeTask.TaskCancelRReason.BUTTON_RELEASE; + } + } +} + + + +package com.csl.cs710ademoapp; + +import android.content.Context; +import android.content.res.AssetFileDescriptor; +import android.media.AudioManager; +import android.media.MediaPlayer; + +import java.io.IOException; + +public class CustomMediaPlayer { + final boolean DEBUG = false; + Context context; + MediaPlayer player; boolean starting = false; + + public CustomMediaPlayer(Context context, String file) { + this.context = context; + player = null; + try { + AssetFileDescriptor afd = context.getAssets().openFd(file); + player = new MediaPlayer(); + player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); + player.prepare(); + player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mp) { + starting = false; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("MediaPlayer is completed."); + } + }); + } catch (IOException e) { + MainActivity.csLibrary4A.appendToLog("mp3 setup FAIL"); + } + } + + public void start() { + player.start(); + if (false) starting = true; + } + public boolean isPlaying() { + return (player.isPlaying() | starting) ; + } + public void pause() { + player.pause(); + } + void setVolume(int volume1, int volume2) { + if (false) player.setVolume(volume1, volume2); + else { + AudioManager audioManager = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE)); + int iVolumeMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); + int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); + MainActivity.csLibrary4A.appendToLog("Hello8: currentVolume = " + currentVolume); + if (currentVolume > 0) { + int volume12 = volume1 + volume2; + volume12 = ( volume12 * iVolumeMax ) / 600; + audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, iVolumeMax, 0); + } + } + } +} + + + +package com.csl.cs710ademoapp; + +import android.content.Context; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.PopupWindow; +import android.widget.TextView; + +import static android.content.Context.LAYOUT_INFLATER_SERVICE; +import static com.csl.cs710ademoapp.MainActivity.csLibrary4A; + +public class CustomPopupWindow { + Context context; + public CustomPopupWindow(Context context) { + this.context = context; + } + + public PopupWindow popupWindow; + public void popupStart(String message, boolean wait) { + LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE); + View popupView = layoutInflater.inflate(R.layout.popup, null); + popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0); + TextView textViewDismiss = (TextView)popupView.findViewById(R.id.dismissMessage); + //int iLenghtMax = 300; + //if (message.length() > iLenghtMax) message = message.substring(0, iLenghtMax) + " ....."; + csLibrary4A.appendToLog("SaveList2ExternalTask: popupStart message = " + message); + textViewDismiss.setText(message); + Button btnDismiss = (Button)popupView.findViewById(R.id.dismiss); + if (wait) btnDismiss.setVisibility(View.GONE); + else { + btnDismiss.setOnClickListener(new Button.OnClickListener() { + @Override + public void onClick(View v) { + popupWindow.dismiss(); + } + }); + } + } +} + + + +package com.csl.cs710ademoapp; + +import android.app.ProgressDialog; +import android.content.Context; + +public class CustomProgressDialog extends ProgressDialog { + public CustomProgressDialog(Context context, String message) { + super(context, ProgressDialog.STYLE_SPINNER); + if (message == null) message = "Progressing. Please wait."; + setTitle(null); + setMessage(message); + setCancelable(false); + } +} + + + +package com.csl.cs710ademoapp; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Class to hold the data for Navigation Drawer Items + */ +public class DrawerListContent { + //An array of sample (Settings) items. + public static List ITEMS = new ArrayList<>(); + + //A map of sample (Settings) items, by ID. + public static Map ITEM_MAP = new HashMap<>(); + + public enum DrawerPositions { + MAIN, SPECIAL, + ABOUT, CONNECT, + INVENTORY, SEARCH, MULTIBANK, + SETTING, FILTER, READWRITE, SECURITY, + + IMPINVENTORY, IMP775, IMPAUTOTUNE, + ALIEN, + UCODE8, UCODEDNA, + BAPCARD, COLDCHAIN, AURASENSE, + KILOWAY, + LONGJING, + AXZON, RFMICRON, + FDMICRO, + CTESIUS, + ASYGNTAG, + + REGISTER, READWRITEUSER, WEDGE, DIRECTWEDGE, SIMINVENTORY, + BLANK; + + public static DrawerPositions toDrawerPosition(int x) { + switch(x) { + case 0: return ABOUT; + case 1: return CONNECT; + case 2: return INVENTORY; + case 3: return SEARCH; + case 4: return MULTIBANK; + case 5: return SIMINVENTORY; + case 6: return SETTING; + case 7: return FILTER; + case 8: return READWRITE; + case 9: return SECURITY; + + case 10: return IMPINVENTORY; + case 11: return ALIEN; + case 12: return UCODE8; + case 13: return UCODEDNA; + case 14: return BAPCARD; + case 15: return COLDCHAIN; + case 16: return AURASENSE; + case 17: return KILOWAY; + case 18: return LONGJING; + case 19: return AXZON; + //case 18: return RFMICRON; + case 20: return FDMICRO; + case 21: return CTESIUS; + case 22: return ASYGNTAG; + + case 23: return REGISTER; + case 24: return READWRITEUSER; + case 25: return WEDGE; + case 26: return DIRECTWEDGE; + } + return null; + } + } + + static { + // Add items. + addItem(new DrawerItem("0", "About", R.drawable.dl_about)); + addItem(new DrawerItem("1", "Connect", R.drawable.dl_rdl)); + addItem(new DrawerItem("2", "Inventory", R.drawable.dl_inv)); + addItem(new DrawerItem("3", "Geiger Search", R.drawable.dl_loc)); + addItem(new DrawerItem("4", "Multi-bank Inventory", R.drawable.dl_inv)); + addItem(new DrawerItem("5", "Simple Inventory", R.drawable.dl_rr)); + addItem(new DrawerItem("6", "Settings", R.drawable.dl_sett)); + addItem(new DrawerItem("7", "Filters", R.drawable.dl_filters)); + addItem(new DrawerItem("8", "Read/Write", R.drawable.dl_access)); + addItem(new DrawerItem("9", "Security", R.drawable.dl_access)); + + addItem(new DrawerItem("10", "Impinj Special Features", R.drawable.dl_loc)); + addItem(new DrawerItem("11", "Alien", R.drawable.dl_loc)); + addItem(new DrawerItem("12", "NXP UCODE 8", R.drawable.dl_loc)); + addItem(new DrawerItem("13", "NXP UCODE DNA", R.drawable.dl_loc)); + addItem(new DrawerItem("14", "uEm CS9010 BAP ID Card", R.drawable.dl_loc)); + addItem(new DrawerItem("15", "uEm Cold Chain CS8300", R.drawable.dl_loc)); + addItem(new DrawerItem("16", "uEm Aura-sense", R.drawable.dl_loc)); + addItem(new DrawerItem("17", "Kiloway KX2005X-BL", R.drawable.dl_rr)); + addItem(new DrawerItem("18", "EL-N2ESL CS6861", R.drawable.dl_rr)); + addItem(new DrawerItem("19", "Axzon", R.drawable.dl_loc)); + addItem(new DrawerItem("20", "FM13DT160", R.drawable.dl_loc)); + addItem(new DrawerItem("21", "Landa CTESIUS", R.drawable.dl_loc)); + addItem(new DrawerItem("22", "Asygn AS321x", R.drawable.dl_loc)); + + addItem(new DrawerItem("23", "Register Tag", R.drawable.dl_rr)); + addItem(new DrawerItem("24", "Large sized memory read/write", R.drawable.dl_rr)); + addItem(new DrawerItem("25", "Wedge", R.drawable.dl_rr)); + addItem(new DrawerItem("26", "Direct Wedge", R.drawable.dl_rr)); + } + + private static void addItem(DrawerItem item) { + + ITEMS.add(item); + ITEM_MAP.put(item.id, item); + } + + public static class DrawerItem { + public String id; + public String content; + public int icon; + + public DrawerItem(String id, String content, int icon_id) { + this.id = id; + this.content = content; + this.icon = icon_id; + } + + @Override + public String toString() { + return content; + } + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; + +import com.csl.cs710ademoapp.BuildConfig; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public class AboutFragment extends CommonFragment { + Handler mHandler = new Handler(); + long timeMillis = 0; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_about, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_about); + actionBar.setTitle(R.string.title_activity_about); + + TextView appVersionView = (TextView) getActivity().findViewById(R.id.appVersion); + appVersionView.setText(BuildConfig.VERSION_NAME); + TextView libVersionView = (TextView) getActivity().findViewById(R.id.libVersion); + libVersionView.setText(MainActivity.csLibrary4A.getlibraryVersion()); + + MainActivity.mSensorConnector.mLocationDevice.turnOn(true); + MainActivity.mSensorConnector.mSensorDevice.turnOn(true); + mHandler.post(updateRunnable); + } + + @Override + public void onDestroy() { + MainActivity.mSensorConnector.mLocationDevice.turnOn(false); + MainActivity.mSensorConnector.mSensorDevice.turnOn(false); + mHandler.removeCallbacks(updateRunnable); + super.onDestroy(); + } + + public AboutFragment() { + super("AboutFragment"); + } + + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + TextView timeStampView = (TextView) getActivity().findViewById(R.id.timeStamp); + TextView locationView = (TextView) getActivity().findViewById(R.id.GeoLocation); + TextView eCompassView = (TextView) getActivity().findViewById(R.id.eCompass); + + TextView radioVersion = (TextView) getActivity().findViewById(R.id.radioVersion); + TextView modelVersion = (TextView) getActivity().findViewById(R.id.modelVersion); + TextView moduleRfidOnStatus = (TextView) getActivity().findViewById(R.id.moduleRfid_onStatus); + TextView moduleBarOnStatus = (TextView) getActivity().findViewById(R.id.moduleBar_onStatus); + TextView triggerOnStatus = (TextView) getActivity().findViewById(R.id.trigger_onStatus); + TextView moduleBattery = (TextView) getActivity().findViewById(R.id.module_battery); + TextView moduleVersionLabel = (TextView) getActivity().findViewById(R.id.module_versionLabel); + if (MainActivity.csLibrary4A.get98XX() == 2) moduleVersionLabel.setText("Atmel firmware version"); + else if (MainActivity.csLibrary4A.get98XX() == 0) moduleVersionLabel.setText("SiliconLab firmware version"); + TextView moduleVersion = (TextView) getActivity().findViewById(R.id.module_version); + TextView radioSerial = (TextView) getActivity().findViewById(R.id.radio_serialnumber); + TextView radioBoardVersion = (TextView) getActivity().findViewById(R.id.radio_boardVersion); + TextView productSerial = (TextView) getActivity().findViewById(R.id.module_productserialnumber); + TextView boardVersion = (TextView) getActivity().findViewById(R.id.module_boardversion); + TextView barcodeSerial = (TextView) getActivity().findViewById(R.id.moduleBar_serialNumber); + TextView barcodeDate = (TextView) getActivity().findViewById(R.id.moduleBar_date); + TextView barcodeVersion = (TextView) getActivity().findViewById(R.id.moduleBar_version); + + TextView bluetoothVersion = (TextView) getActivity().findViewById(R.id.bluetooth_version); + TextView bluetoothAddress = (TextView) getActivity().findViewById(R.id.bluetooth_address); + TextView bluetoothRssi = (TextView) getActivity().findViewById(R.id.bluetooth_rssi); + + timeStampView.setText(MainActivity.mSensorConnector.getTimeStamp()); + locationView.setText(MainActivity.mSensorConnector.mLocationDevice.getLocation()); + eCompassView.setText(MainActivity.mSensorConnector.mSensorDevice.getEcompass()); + if (MainActivity.csLibrary4A.isBleConnected()) { + if (System.currentTimeMillis() - timeMillis > 5000) { + timeMillis = System.currentTimeMillis(); + radioVersion.setText(MainActivity.csLibrary4A.getMacVer()); + modelVersion.setText(MainActivity.csLibrary4A.getModelNumber()); + moduleVersion.setText(MainActivity.csLibrary4A.hostProcessorICGetFirmwareVersion()); + bluetoothVersion.setText(MainActivity.csLibrary4A.getBluetoothICFirmwareVersion()); + MainActivity.csLibrary4A.batteryLevelRequest(); + } + moduleRfidOnStatus.setText(MainActivity.csLibrary4A.getRfidOnStatus() ? "on" : "off"); + triggerOnStatus.setText(MainActivity.csLibrary4A.getTriggerButtonStatus() ? "pressed" : "released"); + moduleBarOnStatus.setText(MainActivity.csLibrary4A.getBarcodeOnStatus() ? "on" : "off"); + moduleBattery.setText(MainActivity.csLibrary4A.getBatteryDisplay(true)); + if (MainActivity.csLibrary4A.isRfidFailure()) radioSerial.setText("Not available"); + else radioSerial.setText(MainActivity.csLibrary4A.getRadioSerial()); + radioBoardVersion.setText(MainActivity.csLibrary4A.getRadioBoardVersion()); + productSerial.setText(MainActivity.csLibrary4A.getHostProcessorICSerialNumber()); + boardVersion.setText(MainActivity.csLibrary4A.getHostProcessorICBoardVersion()); + if (MainActivity.csLibrary4A.isBarcodeFailure()) barcodeSerial.setText("Not available"); + else { + barcodeSerial.setText(MainActivity.csLibrary4A.getBarcodeSerial()); + barcodeDate.setText(MainActivity.csLibrary4A.getBarcodeDate()); + barcodeVersion.setText(MainActivity.csLibrary4A.getBarcodeVersion()); + } + bluetoothAddress.setText(MainActivity.csLibrary4A.getBluetoothDeviceAddress()); + bluetoothRssi.setText(String.valueOf(MainActivity.csLibrary4A.getRssi())); + } else { + radioVersion.setText(""); + moduleRfidOnStatus.setText(""); + moduleBarOnStatus.setText(""); + triggerOnStatus.setText(""); + moduleBattery.setText(""); + moduleVersion.setText(""); + bluetoothVersion.setText(""); + radioSerial.setText(""); + radioBoardVersion.setText(""); + productSerial.setText(""); + boardVersion.setText(""); + barcodeSerial.setText(""); + bluetoothAddress.setText(""); + bluetoothRssi.setText(""); + } + mHandler.postDelayed(updateRunnable, 1000); + } + }; +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cs710ademoapp.MainActivity.tagSelected; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_EM; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_EM_AURASENSE; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_EM_AURASENSE_ATBOOT; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_EM_AURASENSE_ATSELECT; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_EM_BAP; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_EM_COLDCHAIN; + +import android.app.Activity; +import android.os.AsyncTask; +import android.os.Bundle; +import android.text.InputType; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.Spinner; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SelectTag; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class AccessAuraSenseFragment extends CommonFragment { + final boolean DEBUG = true; + Spinner spinnerTagSelect; + SelectTag selectTag; + RadioButton radioButtonAuraSensAtBoot, radioButtonAuraSensAtSelect; + TextView textViewAuraSensorDataOK, textViewAuraSystemConfigurationOK, textViewAuraSensorCalibrationOK, textViewAuraSensorControlOK, textViewAuraSensorDataStoredOK; + CheckBox checkBoxAuraSensorDataRCommandW, checkBoxAuraSystemConfiguration, checkBoxAuraCalibration, checkBoxAuraControl, checkBoxAuraDataStored; + EditText editTextAuraSensorData, editTextAuraSystemConfiguration, editTextAuraSensorCalibration, editTextAuraSensorDataStored; + CheckBox checkBoxAuraSensAtBootCheck, checkBoxAuraSensAtSelectCheck, checkBoxAuraSensWriteCheck; + TextView textViewConfigOk, textViewTemperatureOk, textViewEnableOk; + CheckBox checkBoxConfig, checkBoxTemperature, checkBoxEnable; + TextView textViewTemperature, textViewUnderAlarm, textViewOverAlarm, textViewBatteryAlarm; + EditText editTextTempThresUnder, editTextTempThresOver, editTextTempCountUnder, editTextTempCountOver, editTextMonitorDelay, editTextSamplingInterval; + Spinner spinnerDelayUnit, spinnerIntervalUnit, spinnerEnable; + Spinner spinnerCustomTagType; + TextView textViewCustomTagFound; + Button buttonCs8304StartLogging, buttonCs8304StopLogging, buttonCs8304CheckAlarm, buttonCs8304GetLogging; + TextView textViewCs8304StartLoggingStatus, textViewCs8304StopLoggingStatus, textViewCs8304CheckAlaramStatus, textViewCs8304GetLoggingStatus; + + Button buttonRead, buttonWrite; + + enum ReadWriteTypes { + NULL, AURA_SENSORDATARCOMMANDW, AURA_SYSTEMCONFIGURATION, AURA_CALIBRATION, AURA_CONTROL, AURA_DATASTORED, + COLDCHAIN_CONFIGURATION, COLDCHAIN_TEMPERATURE, COLDCHAIN_ENABLE, + STARTLOGGING, STOPLOGGING, CHECKLOGGING, GETLOGGING + } + + enum eMicroTag { + emAuraSense, emColdChain, emBap, others + } + ReadWriteTypes readWriteTypes; + boolean operationRead = false; + boolean bRequestCheck; + + private AccessTask accessTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_aurasense, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + spinnerTagSelect = (Spinner) getActivity().findViewById(R.id.accessEmicroTagSelect); + ArrayAdapter targetAdapter1 = ArrayAdapter.createFromResource(getActivity(), R.array.emicro_options, R.layout.custom_spinner_layout); + targetAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerTagSelect.setAdapter(targetAdapter1); spinnerTagSelect.setSelection(0); + spinnerTagSelect.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { + LinearLayout layout0 = (LinearLayout) getActivity().findViewById(R.id.accessEmicroSelectLayout); + LinearLayout layout1 = (LinearLayout) getActivity().findViewById(R.id.accessEmMicroAuroSenseLayout); + LinearLayout layout2 = (LinearLayout) getActivity().findViewById(R.id.accessEmMicroColdChainLayout); + TableRow tableRow = (TableRow) getActivity().findViewById(R.id.accessEmicroCCTemperature); + if (MainActivity.csLibrary4A.get98XX() == 2) tableRow.setVisibility(View.GONE); + LinearLayout layout4 = (LinearLayout) getActivity().findViewById(R.id.accessCustomReadWrite); + if (position == eMicroTag.emAuraSense.ordinal()) { + MainActivity.tagType = TAG_EM_AURASENSE; MainActivity.mDid = "E280B12"; + layout0.setVisibility(View.VISIBLE); + layout1.setVisibility(View.VISIBLE); + layout2.setVisibility(View.GONE); + layout4.setVisibility(View.VISIBLE); + } else if (position == eMicroTag.emColdChain.ordinal()) { + MainActivity.tagType = TAG_EM_COLDCHAIN; MainActivity.mDid = "E280B0"; + layout0.setVisibility(View.VISIBLE); + layout1.setVisibility(View.GONE); + layout2.setVisibility(View.VISIBLE); + layout4.setVisibility(View.VISIBLE); + } else if (position == eMicroTag.emBap.ordinal()) { + MainActivity.tagType = TAG_EM_BAP; MainActivity.mDid = "E200B0"; + layout0.setVisibility(View.GONE); + layout1.setVisibility(View.GONE); + layout2.setVisibility(View.GONE); + layout4.setVisibility(View.GONE); + } else { + MainActivity.tagType = TAG_EM; MainActivity.mDid = "E280B"; + layout0.setVisibility(View.GONE); + layout1.setVisibility(View.GONE); + layout2.setVisibility(View.GONE); + layout4.setVisibility(View.GONE); + } + } + + @Override + public void onNothingSelected(AdapterView parentView) { + // your code here + } + + }); + + selectTag = new SelectTag((Activity)getActivity(), 0); + selectTag.tableRowSelectMemoryBank.setVisibility(View.GONE); + + radioButtonAuraSensAtBoot = (RadioButton) getActivity().findViewById(R.id.accessAuraSensAtBoot); + radioButtonAuraSensAtSelect = (RadioButton) getActivity().findViewById(R.id.accessAuraSensAtSelect); + + textViewAuraSystemConfigurationOK = (TextView) getActivity().findViewById(R.id.accessAuraSystemConfigurationOK); + textViewAuraSensorCalibrationOK = (TextView) getActivity().findViewById(R.id.accessAuraSensorCalibrationOK); + textViewAuraSensorControlOK = (TextView) getActivity().findViewById(R.id.accessAuraSensorControlOK); + textViewAuraSensorDataStoredOK = (TextView) getActivity().findViewById(R.id.accessAuraSensorDataStoredOK); + + checkBoxAuraSystemConfiguration = (CheckBox) getActivity().findViewById(R.id.accessAuraSystemConfigurationCheck); + checkBoxAuraCalibration = (CheckBox) getActivity().findViewById(R.id.accessAuraSensorCalibrationCheck); + checkBoxAuraControl = (CheckBox) getActivity().findViewById(R.id.accessAuraSensorControlCheck); + checkBoxAuraDataStored = (CheckBox) getActivity().findViewById(R.id.accessAuraSensorDataStoredCheck); + + editTextAuraSensorData = (EditText) getActivity().findViewById(R.id.accessAuraSensorData); editTextAuraSensorData.setEnabled(false); + editTextAuraSystemConfiguration = (EditText) getActivity().findViewById(R.id.accessAuraSystemConfiguration); editTextAuraSystemConfiguration.setEnabled(false); + editTextAuraSensorCalibration = (EditText) getActivity().findViewById(R.id.accessAuraSensorCalibration); editTextAuraSensorCalibration.setInputType(InputType.TYPE_CLASS_NUMBER); + editTextAuraSensorDataStored = (EditText) getActivity().findViewById(R.id.accessAuraSensorDataStored); editTextAuraSensorDataStored.setEnabled(false); + checkBoxAuraSensAtBootCheck = (CheckBox) getActivity().findViewById(R.id.accessAuraSensAtBootCheck); + checkBoxAuraSensAtSelectCheck = (CheckBox) getActivity().findViewById(R.id.accessAuraSensAtSelectCheck); + checkBoxAuraSensWriteCheck = (CheckBox) getActivity().findViewById(R.id.accessAuraSensAtWriteCheck); + + textViewConfigOk = (TextView) getActivity().findViewById(R.id.accessCCConfigOK); + textViewTemperatureOk = (TextView) getActivity().findViewById(R.id.accessCCTemperatureOK); + textViewEnableOk = (TextView) getActivity().findViewById(R.id.accessCCEnableOK); + + checkBoxConfig = (CheckBox) getActivity().findViewById(R.id.accessCCConfigTitle); + checkBoxTemperature = (CheckBox) getActivity().findViewById(R.id.accessCCTemperatureTitle); + checkBoxEnable = (CheckBox) getActivity().findViewById(R.id.accessCCEnableTitle); + + textViewTemperature = (TextView) getActivity().findViewById(R.id.accessCCTemperature); + textViewUnderAlarm = (TextView) getActivity().findViewById(R.id.accessCCUnderTempAlarm); + textViewOverAlarm = (TextView) getActivity().findViewById(R.id.accessCCOverTempAlarm); + textViewBatteryAlarm = (TextView) getActivity().findViewById(R.id.accessCCBatteryAlarm); + + editTextTempThresUnder = (EditText) getActivity().findViewById(R.id.accessCCTempThresUnder); + editTextTempThresOver = (EditText) getActivity().findViewById(R.id.accessCCTempThresOver); + editTextTempCountUnder = (EditText) getActivity().findViewById(R.id.accessCCTempCountUnder); + editTextTempCountOver = (EditText) getActivity().findViewById(R.id.accessCCTempCountOver); + editTextMonitorDelay = (EditText) getActivity().findViewById(R.id.accessCCMonitorDelay); + editTextSamplingInterval = (EditText) getActivity().findViewById(R.id.accessCCSamplingInverval); + + ArrayAdapter arrayAdapterUnit = ArrayAdapter.createFromResource(getActivity(), R.array.coldChain_unit_options, R.layout.custom_spinner_layout); + arrayAdapterUnit.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerDelayUnit = (Spinner) getActivity().findViewById(R.id.accessCCMonitorUnit); + spinnerDelayUnit.setAdapter(arrayAdapterUnit); + + ArrayAdapter arrayAdapterUnit1 = ArrayAdapter.createFromResource(getActivity(), R.array.coldChain_IntervalUnit_options, R.layout.custom_spinner_layout); + arrayAdapterUnit1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerIntervalUnit = (Spinner) getActivity().findViewById(R.id.accessCCSamplingIntervalUnit); + spinnerIntervalUnit.setAdapter(arrayAdapterUnit1); + + ArrayAdapter arrayAdapterEnable = ArrayAdapter.createFromResource(getActivity(), R.array.coldChain_enable_options, R.layout.custom_spinner_layout); + arrayAdapterEnable.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerEnable = (Spinner) getActivity().findViewById(R.id.accessCCEnable); + spinnerEnable.setAdapter(arrayAdapterEnable); + + textViewCustomTagFound = (TextView) getActivity().findViewById(R.id.accessCustomTagFound); +/* + ArrayAdapter arrayAdapterTagType = ArrayAdapter.createFromResource(getActivity(), R.array.coldChain_tagtype_options, R.layout.custom_spinner_layout); + arrayAdapterTagType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerCustomTagType = (Spinner) getActivity().findViewById(R.id.selectCustomTagType); + spinnerCustomTagType.setAdapter(arrayAdapterTagType); + spinnerCustomTagType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { + switch(position) { + case 0: + LinearLayout linearLayout = (LinearLayout) getActivity().findViewById(R.id.accessCC8304Layout); + linearLayout.setVisibility(View.VISIBLE); + linearLayout = (LinearLayout) getActivity().findViewById(R.id.accessCCmaxduraLayout); + linearLayout.setVisibility(View.GONE); + break; + case 1: + linearLayout = (LinearLayout) getActivity().findViewById(R.id.accessCC8304Layout); + linearLayout.setVisibility(View.GONE); + linearLayout = (LinearLayout) getActivity().findViewById(R.id.accessCCmaxduraLayout); + linearLayout.setVisibility(View.VISIBLE); + break; + } + } + + @Override + public void onNothingSelected(AdapterView parentView) { + // your code here + } + }); +*/ + buttonCs8304StartLogging = (Button) getActivity().findViewById(R.id.accessCs8304StartLogging); + buttonCs8304StartLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.STARTLOGGING; + operationRead = true; startAccessTask(); + } + }); + buttonCs8304StopLogging = (Button) getActivity().findViewById(R.id.accessCs8304StopLogging); + buttonCs8304StopLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.STOPLOGGING; + operationRead = true; startAccessTask(); + } + }); + buttonCs8304CheckAlarm = (Button) getActivity().findViewById(R.id.accessCs8304CheckAlarm); + buttonCs8304CheckAlarm.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.CHECKLOGGING; + operationRead = true; startAccessTask(); + } + }); + buttonCs8304GetLogging = (Button) getActivity().findViewById(R.id.accessCs8304GetLogging); + buttonCs8304GetLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.GETLOGGING; + operationRead = true; startAccessTask(); + } + }); + + textViewCs8304StartLoggingStatus = (TextView) getActivity().findViewById(R.id.accessCs8304StartLoggingStatus); + textViewCs8304StopLoggingStatus = (TextView) getActivity().findViewById(R.id.accessCs8304StopLoggingStatus); + textViewCs8304CheckAlaramStatus = (TextView) getActivity().findViewById(R.id.accessCs8304CheckAlarmStatus); + textViewCs8304GetLoggingStatus = (TextView) getActivity().findViewById(R.id.accessCs8304GetLoggingStatus); + + buttonRead = (Button) getActivity().findViewById(R.id.accessRWReadButton); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + textViewAuraSensorDataOK = (TextView) getActivity().findViewById(R.id.accessAuraSensorDataOK); + checkBoxAuraSensorDataRCommandW = (CheckBox) getActivity().findViewById(R.id.accessAuraSensorDataCheck); + readWriteTypes = ReadWriteTypes.NULL; + operationRead = true; startAccessTask(); + } + }); + + buttonWrite = (Button) getActivity().findViewById(R.id.accessRWWriteButton); + buttonWrite.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + textViewAuraSensorDataOK = (TextView) getActivity().findViewById(R.id.accessAuraWriteSensorDataOK); + checkBoxAuraSensorDataRCommandW = (CheckBox) getActivity().findViewById(R.id.accessAuraWriteSensorDataCheck); + readWriteTypes = ReadWriteTypes.NULL; + operationRead = false; startAccessTask(); + } + }); + + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onDestroy() { + if (accessTask != null) accessTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + if (selectTag != null) selectTag.updateBankSelected(); + userVisibleHint = true; + if (textViewCustomTagFound != null) { + if (tagSelected != null) { + MainActivity.csLibrary4A.appendToLog("tagSelected = " + tagSelected.getUser()); + if (tagSelected.getUser() != null && tagSelected.getUser().indexOf("830") == 0) { + textViewCustomTagFound.setText("CS" + tagSelected.getUser().substring(0, 4) + "-" + tagSelected.getUser().substring(4, 5)); + } else textViewCustomTagFound.setText(""); + } + LinearLayout layout = (LinearLayout) getActivity().findViewById(R.id.accessEmicroCS8304Layout); + if (textViewCustomTagFound.getText().toString().contains("8304")) { + layout.setVisibility(View.VISIBLE); + } else layout.setVisibility(View.GONE); + } + } + else { + if (spinnerTagSelect != null && spinnerTagSelect.getSelectedItemPosition() == eMicroTag.emAuraSense.ordinal()) { + if (radioButtonAuraSensAtBoot != null && radioButtonAuraSensAtSelect != null) { + if (radioButtonAuraSensAtBoot.isChecked()) { + MainActivity.tagType = TAG_EM_AURASENSE_ATBOOT; MainActivity.mDid = "E280B12A"; + } + if (radioButtonAuraSensAtSelect.isChecked()) { + MainActivity.tagType = TAG_EM_AURASENSE_ATSELECT; MainActivity.mDid = "E280B12B"; + } + } + } + userVisibleHint = false; + } + } + + public AccessAuraSenseFragment() { + super("AccessAuraSenseFragment"); + } + + boolean isOperationRunning() { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return true; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return true; + } else if (accessTask != null) { + if (accessTask.getStatus() == AsyncTask.Status.RUNNING) { + Toast.makeText(MainActivity.mContext, "Running acccess task. Please wait", Toast.LENGTH_SHORT).show(); + return true; + } + } + return false; + } + void startAccessTask() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("startAccessTask()"); + if (updating == false) { + updating = true; + bankProcessing = 0; checkProcessing = 0; + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + boolean updating = false; + int bankProcessing = 0, checkProcessing = 0; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + boolean rerunRequest = false; boolean taskRequest = false; + if (accessTask == null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessAuraSenseFragment().updateRunnable(): NULL accessReadWriteTask"); + taskRequest = true; + } else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) { + rerunRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessAuraSenseFragment().updateRunnable(): accessReadWriteTask.getStatus() = " + accessTask.getStatus().toString()); + } else { + taskRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessAuraSenseFragment().updateRunnable(): FINISHED accessReadWriteTask"); + } + if (processResult()) { rerunRequest = true; MainActivity.csLibrary4A.appendToLog("processResult is TRUE");} + else if (taskRequest) { + boolean invalid = processTickItems(); + MainActivity.csLibrary4A.appendToLog("processTickItems, invalid = " + invalid); + if (bankProcessing++ != 0 && invalid) rerunRequest = false; + else { + String selectMask = selectTag.editTextTagID.getText().toString(); + int selectBank = selectTag.spinnerSelectBank.getSelectedItemPosition()+1; + int selectOffset = Integer.valueOf(selectTag.editTextSelectOffset.getText().toString()); + RfidReaderChipData.HostCommands hostCommand; + Button buttonAccess; + if (readWriteTypes == ReadWriteTypes.COLDCHAIN_TEMPERATURE && operationRead) { + hostCommand = RfidReaderChipData.HostCommands.CMD_GETSENSORDATA; + buttonAccess = buttonRead; + } else if (operationRead) { + hostCommand = RfidReaderChipData.HostCommands.CMD_18K6CREAD; + buttonAccess = buttonRead; + } else { + hostCommand = RfidReaderChipData.HostCommands.CMD_18K6CWRITE; + buttonAccess = buttonWrite; + } + MainActivity.csLibrary4A.appendToLog("hostCommand 1 = " + hostCommand.toString()); + accessTask = new AccessTask(buttonAccess, null, invalid, true, + selectMask, selectBank, selectOffset, + selectTag.editTextAccessPassword.getText().toString(), + Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), + hostCommand, + 0, 0, true, false, + null, null, null, null, null); + accessTask.execute(); + rerunRequest = true; + MainActivity.csLibrary4A.appendToLog("accessTask is created with selectBank = " + selectBank); + } + } + if (rerunRequest) { + mHandler.postDelayed(updateRunnable, 500); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessAuraSenseFragment().updateRunnable(): Restart"); + } else updating = false; + MainActivity.csLibrary4A.appendToLog("AccessAuraSenseFragment().updateRunnable(): Ending with updating = " + updating); + } + }; + + boolean processResult() { + String accessResult = null; + if (accessTask == null) return false; + else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) return false; + else { + accessResult = accessTask.accessResult; + if (DEBUG || true) MainActivity.csLibrary4A.appendToLog("accessResult = " + accessResult); + if (readWriteTypes == ReadWriteTypes.STARTLOGGING) textViewCs8304StartLoggingStatus.setText(accessResult); + else if (readWriteTypes == ReadWriteTypes.STOPLOGGING) textViewCs8304StopLoggingStatus.setText(accessResult); + else if (readWriteTypes == ReadWriteTypes.CHECKLOGGING) textViewCs8304CheckAlaramStatus.setText(accessResult); + else if (readWriteTypes == ReadWriteTypes.GETLOGGING) textViewCs8304GetLoggingStatus.setText(accessResult); + else if (accessResult == null) { + if (readWriteTypes == ReadWriteTypes.AURA_SENSORDATARCOMMANDW) { + textViewAuraSensorDataOK.setText("E"); + //checkBoxUserCode1.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.AURA_SYSTEMCONFIGURATION) { + textViewAuraSystemConfigurationOK.setText("E"); + //checkBoxUserCode2.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.AURA_CALIBRATION) { + textViewAuraSensorCalibrationOK.setText("E"); + //checkBoxUserCode3.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.AURA_CONTROL) { + textViewAuraSensorControlOK.setText("E"); + //checkBoxUserCode4.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.AURA_DATASTORED) { + textViewAuraSensorDataStoredOK.setText("E"); + //checkBoxUserCode5.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.COLDCHAIN_CONFIGURATION) { + textViewConfigOk.setText("E"); checkBoxConfig.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.COLDCHAIN_TEMPERATURE && operationRead) { + textViewTemperatureOk.setText("E"); checkBoxTemperature.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.COLDCHAIN_ENABLE) { + textViewEnableOk.setText("E"); + checkBoxEnable.setChecked(false); + } + } else { + if (readWriteTypes == ReadWriteTypes.AURA_SENSORDATARCOMMANDW) { + textViewAuraSensorDataOK.setText("O"); + //checkBoxUserCode1.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) editTextAuraSensorData.setText(showSensorData(accessResult)); + } else if (readWriteTypes == ReadWriteTypes.AURA_SYSTEMCONFIGURATION) { + textViewAuraSystemConfigurationOK.setText("O"); + //checkBoxUserCode2.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) editTextAuraSystemConfiguration.setText(accessResult); + } else if (readWriteTypes == ReadWriteTypes.AURA_CALIBRATION) { + textViewAuraSensorCalibrationOK.setText("O"); + //checkBoxUserCode3.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) { + int iValue = Integer.parseInt(accessResult, 16); + editTextAuraSensorCalibration.setText(String.valueOf(iValue & 0xFF)); + } + } else if (readWriteTypes == ReadWriteTypes.AURA_CONTROL) { + textViewAuraSensorControlOK.setText("O"); + //checkBoxUserCode4.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) { + int iValue = Integer.parseInt(accessResult, 16); + if ((iValue & 0x2000) != 0) checkBoxAuraSensAtBootCheck.setChecked(true); + if ((iValue & 0x4000) != 0) checkBoxAuraSensAtSelectCheck.setChecked(true); + if ((iValue & 0x8000) != 0) checkBoxAuraSensWriteCheck.setChecked(true); + } + } else if (readWriteTypes == ReadWriteTypes.AURA_DATASTORED) { + textViewAuraSensorDataStoredOK.setText("O"); + //checkBoxUserCode5.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) editTextAuraSensorDataStored.setText(showSensorData(accessResult)); + } else if (readWriteTypes == ReadWriteTypes.COLDCHAIN_TEMPERATURE && operationRead == false) { + } else if (readWriteTypes == ReadWriteTypes.COLDCHAIN_CONFIGURATION) { + textViewConfigOk.setText("O"); checkBoxConfig.setChecked(false); readWriteTypes = ReadWriteTypes.NULL; + if (accessResult.length() == 12 && operationRead) { // 43 60 42 FC 04 06 + byte bValue = Byte.parseByte(accessResult.substring(0, 1), 16); + if ((bValue & 8) == 0) { + bValue = Byte.parseByte(accessResult.substring(0, 2), 16); + bValue &= 0x3F; + editTextTempCountUnder.setText(String.valueOf(bValue >> 1)); + editTextTempThresUnder.setText(getTemperatue(accessResult.substring(1, 4))); + + bValue = Byte.parseByte(accessResult.substring(4, 6), 16); + bValue &= 0x3F; + editTextTempCountOver.setText(String.valueOf(bValue >> 1)); + editTextTempThresOver.setText(getTemperatue(accessResult.substring(5, 8))); + + byte bValue2 = Byte.parseByte(accessResult.substring(8, 10), 16); + spinnerDelayUnit.setSelection(((bValue2 & 0xFF) >> 6) + 1); + editTextMonitorDelay.setText(String.valueOf(bValue2 & 0x3F)); + + bValue2 = Byte.parseByte(accessResult.substring(10, 12), 16); + spinnerIntervalUnit.setSelection(((bValue2 & 0xFF) >> 6) + 1); + editTextSamplingInterval.setText(String.valueOf(bValue2 & 0x3F)); + } + } + } else if (readWriteTypes == ReadWriteTypes.COLDCHAIN_TEMPERATURE && operationRead) { + textViewTemperatureOk.setText("O"); checkBoxTemperature.setChecked(false); readWriteTypes = ReadWriteTypes.NULL; + MainActivity.csLibrary4A.appendToLog("accessResult of Temperature = " + accessResult); + + if (accessResult.length() >= 16) { + int indexBegin = accessResult.length() - 16; + String stringValue = accessResult.substring(indexBegin, indexBegin + 4); + MainActivity.csLibrary4A.appendToLog("temperature part of Temperature accessResult = " + stringValue); + accessResult = stringValue; + } + if (accessResult.length() == 4) { + byte bValue = Byte.parseByte(accessResult.substring(0, 1), 16); + if ((bValue & 0x8) != 0) textViewBatteryAlarm.setVisibility(View.VISIBLE); + else if ((bValue & 0x2) != 0) textViewOverAlarm.setVisibility(View.VISIBLE); + else if ((bValue & 01) != 0) textViewUnderAlarm.setVisibility(View.VISIBLE); + + bValue = Byte.parseByte(accessResult.substring(1, 2), 16); + Integer iValue2 = Integer.parseInt(accessResult.substring(2, 4), 16); + iValue2 &= 0x1FF; + if ((bValue & 0x01) != 0 && iValue2 == 0) textViewTemperature.setText("Invalid"); + else { + String stringValue = getTemperatue(accessResult.substring(1, 4)); + stringValue += (char) 0x00B0 + "C"; + textViewTemperature.setText(stringValue); + } + } + } else if (readWriteTypes == ReadWriteTypes.COLDCHAIN_ENABLE) { + textViewEnableOk.setText("O"); checkBoxEnable.setChecked(false); readWriteTypes = ReadWriteTypes.NULL; + if (accessResult.length() == 4 && operationRead) { + byte bValue = Byte.parseByte(accessResult.substring(3, 4), 16); + if ((bValue & 0x01) != 0) spinnerEnable.setSelection(2); + else spinnerEnable.setSelection(1); + } + } + } + accessTask = null; + return true; + } + } + String showSensorData(String accessResult) { + String strValue = ""; + int iValue = Integer.parseInt(accessResult,16); + if ((iValue & 0xFC00) == 0x0C00) { + iValue &= 0x3FF; + if ((iValue & 0x200) == 0) strValue = String.valueOf(iValue); + else { + iValue &= 0x1FF; + iValue ^= 0x1FF; iValue++; iValue = -iValue; + strValue = String.valueOf(iValue); + } + } + return strValue; + } + + boolean processTickItems() { + boolean invalidRequest1 = false; + int accBank = 0, accSize = 0, accOffset = 0; + String writeData = ""; + + if (selectTag.editTextTagID.getText().toString().length() == 0) invalidRequest1 = true; + else if (spinnerTagSelect.getSelectedItemPosition() == eMicroTag.emAuraSense.ordinal()) { + if (checkBoxAuraSensorDataRCommandW != null && checkBoxAuraSensorDataRCommandW.isChecked() == true && checkProcessing < 1) { + accBank = 1; accSize = 1; accOffset = 0x22; readWriteTypes = ReadWriteTypes.AURA_SENSORDATARCOMMANDW; checkProcessing = 1; + if (operationRead) { + textViewAuraSensorDataOK.setText(""); + editTextAuraSensorData.setText(""); + } else { + int iValue = 0; + RadioButton radioButtonAuraSens2Null = (RadioButton) getActivity().findViewById(R.id.accessAuraSens2Null); + RadioButton radioButtonAuraSens2Store = (RadioButton) getActivity().findViewById(R.id.accessAuraSens2Store); + RadioButton radioButtonAuraSens2Calibration = (RadioButton) getActivity().findViewById(R.id.accessAuraSens2Calibration); + + if (radioButtonAuraSens2Null.isChecked()) iValue = 0x8001; + else if (radioButtonAuraSens2Store.isChecked()) iValue = 0x1000; + else if (radioButtonAuraSens2Calibration.isChecked()) iValue = 0x2000; + writeData = String.format("%04X", iValue); + MainActivity.csLibrary4A.appendToLog("WriteData = " + writeData); + } + } else if (checkBoxAuraSystemConfiguration != null && checkBoxAuraSystemConfiguration.isChecked() == true && checkProcessing < 2 && operationRead) { + accBank = 3; accSize = 1; accOffset = 0x120; readWriteTypes = ReadWriteTypes.AURA_SYSTEMCONFIGURATION; checkProcessing = 2; + if (operationRead) { + textViewAuraSystemConfigurationOK.setText(""); + editTextAuraSystemConfiguration.setText(""); + } + } else if (checkBoxAuraCalibration != null && checkBoxAuraCalibration.isChecked() == true && checkProcessing < 3) { + accBank = 3; accSize = 1; accOffset = 0x122; readWriteTypes = ReadWriteTypes.AURA_CALIBRATION; checkProcessing = 3; + if (operationRead) { + textViewAuraSensorCalibrationOK.setText(""); + editTextAuraSensorCalibration.setText(""); + } else { + String strValue = editTextAuraSensorCalibration.getText().toString(); + Integer iValue = Integer.valueOf(strValue); + iValue &= 0xFF; + writeData = String.format("%04X", iValue); + } + } else if (checkBoxAuraControl != null && checkBoxAuraControl.isChecked() == true && checkProcessing < 4) { + accBank = 3; accSize = 1; accOffset = 0x123; readWriteTypes = ReadWriteTypes.AURA_CONTROL; checkProcessing = 4; + if (operationRead) { + textViewAuraSensorControlOK.setText(""); + checkBoxAuraSensAtBootCheck.setChecked(false); checkBoxAuraSensAtSelectCheck.setChecked(false); checkBoxAuraSensWriteCheck.setChecked(false); + } else { + int iValue = (checkBoxAuraSensAtBootCheck.isChecked() ? 0x2000 : 0) | (checkBoxAuraSensAtSelectCheck.isChecked() ? 0x4000 : 0) | (checkBoxAuraSensWriteCheck.isChecked() ? 0x8000 : 0); + writeData = String.format("%04X", iValue); + } + } else if (checkBoxAuraDataStored != null && checkBoxAuraDataStored.isChecked() == true && checkProcessing < 5 && operationRead) { + accBank = 3; + accSize = 1; + accOffset = 0x124; + readWriteTypes = ReadWriteTypes.AURA_DATASTORED; + checkProcessing = 5; + if (operationRead) { + textViewAuraSensorDataStoredOK.setText(""); + editTextAuraSensorDataStored.setText(""); + } + } else { + invalidRequest1 = true; + } + } else if (spinnerTagSelect.getSelectedItemPosition() == eMicroTag.emColdChain.ordinal()) { + accBank = 3; + if (bRequestCheck) { + readWriteTypes = ReadWriteTypes.COLDCHAIN_TEMPERATURE; + if (bankProcessing == 0) { + if (operationRead) { + textViewTemperature.setText(""); + accOffset = 0x10D; + accSize = 1; + writeData = "0000"; + } else invalidRequest1 = true; + } else { + operationRead = true; + MainActivity.csLibrary4A.macWrite(0x11F, 3); + return false; + } + } else if (checkBoxConfig.isChecked() == true) { + accOffset = 0xEC; accSize = 3; readWriteTypes = ReadWriteTypes.COLDCHAIN_CONFIGURATION; textViewConfigOk.setText(""); + if (operationRead) { + editTextTempThresUnder.setText(""); + editTextTempThresOver.setText(""); + editTextTempCountUnder.setText(""); + editTextTempCountOver.setText(""); + editTextMonitorDelay.setText(""); + editTextSamplingInterval.setText(""); + spinnerDelayUnit.setSelection(0); + spinnerIntervalUnit.setSelection(0); + } else { + try { + int underTempCount, underTempThreshold, overTempCount, overTempThreshold; + byte tempBytes[] = new byte[6]; + + tempBytes[0] = 0x40; + tempBytes[0] |= (Byte.parseByte(editTextTempCountUnder.getText().toString()) << 1); + float fValue = Float.parseFloat(editTextTempThresUnder.getText().toString()); + short sValue = setTemperature(fValue); + if ((sValue & (short)0x100) != 0) tempBytes[0] |= 1; + tempBytes[1] = (byte)sValue; + + tempBytes[2] = 0; + tempBytes[2] |= (Byte.parseByte(editTextTempCountOver.getText().toString()) << 1); + fValue = Float.parseFloat(editTextTempThresOver.getText().toString()); + sValue = setTemperature(fValue); + if ((sValue & (short)0x100) != 0) tempBytes[2] |= 1; + tempBytes[3] = (byte)sValue; + + int iTemp = spinnerDelayUnit.getSelectedItemPosition(); + if (iTemp < 1) iTemp = 1; + else if (iTemp > 4) iTemp = 4; + iTemp--; + tempBytes[4] = (byte)iTemp; tempBytes[4] <<= 6; + byte bValue = Byte.parseByte(editTextMonitorDelay.getText().toString()); + tempBytes[4] |= (bValue & 0x3F); + + iTemp = spinnerIntervalUnit.getSelectedItemPosition(); + if (iTemp < 1) iTemp = 1; + else if (iTemp > 4) iTemp = 4; + iTemp--; + tempBytes[5] = (byte)iTemp; tempBytes[5] <<= 6; + bValue = Byte.parseByte(editTextSamplingInterval.getText().toString()); + tempBytes[5] |= (bValue & 0x3F); + + writeData = MainActivity.csLibrary4A.byteArrayToString(tempBytes); + MainActivity.csLibrary4A.appendToLog("editTextTempCountUnder = " + MainActivity.csLibrary4A.byteArrayToString(tempBytes)); + } catch (Exception ex) { + MainActivity.csLibrary4A.appendToLog("Invalid String.parse !!!"); + invalidRequest1 = true; + } + } + } else if (checkBoxTemperature.isChecked() == true) { + readWriteTypes = ReadWriteTypes.COLDCHAIN_TEMPERATURE; + if (bankProcessing == 0) { + if (operationRead) { + textViewTemperature = (TextView) getActivity().findViewById(R.id.accessCCTemperature); + textViewTemperature.setText(""); + textViewUnderAlarm = (TextView) getActivity().findViewById(R.id.accessCCUnderTempAlarm); + textViewUnderAlarm.setVisibility(View.INVISIBLE); + textViewOverAlarm = (TextView) getActivity().findViewById(R.id.accessCCOverTempAlarm); + textViewOverAlarm.setVisibility(View.INVISIBLE); + textViewBatteryAlarm = (TextView) getActivity().findViewById(R.id.accessCCBatteryAlarm); + textViewBatteryAlarm.setVisibility(View.INVISIBLE); + textViewTemperatureOk.setText(""); + if (true) { + MainActivity.csLibrary4A.macWrite(0x11F, 3); + return false; + } + accOffset = 0x100; + accSize = 1; + operationRead = false; + } else invalidRequest1 = true; + } else { + accOffset = 0x100; + accSize = 1; + operationRead = true; + } + } else if (checkBoxEnable.isChecked() == true) { + accOffset = 0x10D; + accSize = 1; + readWriteTypes = ReadWriteTypes.COLDCHAIN_ENABLE; + textViewEnableOk.setText(""); + if (operationRead) spinnerEnable.setSelection(0); + else { + int iSelect = spinnerEnable.getSelectedItemPosition(); + if (iSelect == 0) invalidRequest1 = true; + else if (iSelect == 1) writeData = "0000"; + else writeData = "0001"; + String stringValue = "0000"; + } + } else if (readWriteTypes == ReadWriteTypes.STARTLOGGING || readWriteTypes == ReadWriteTypes.STOPLOGGING || readWriteTypes == ReadWriteTypes.CHECKLOGGING || readWriteTypes == ReadWriteTypes.GETLOGGING) { + MainActivity.csLibrary4A.appendToLog("accessResult 1 bankProcewssing = " + bankProcessing ); + accOffset = 0xF0; accSize = 1; operationRead = true; + if (readWriteTypes == ReadWriteTypes.STARTLOGGING) { + switch(bankProcessing) { + case 0: + textViewCs8304StartLoggingStatus.setText(""); + break; + case 1: + long seconds = System.currentTimeMillis() / (long)1000; + int interval = 10; + float temperatureOffset = 10; //range 20 to 0 represents -20 to 0 degreeC + accOffset = 0; accSize = 4; writeData = ""; + + writeData += String.format("%08X", seconds); + writeData += String.format("%04X", interval); + float fTemp = temperatureOffset / (float) 0.25; + short sTemp = (short) fTemp; + writeData += String.format("%04X", sTemp); + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: UTC seconds = " + seconds + ", writedata = " + writeData); + break; + case 2: + float overTemperature = 20; + float underTemperature = -10; + accOffset = 0x106; accSize = 3; writeData = ""; + + fTemp = overTemperature / (float) 0.25; + sTemp = (short) fTemp; + writeData += String.format("%04X", sTemp); + fTemp = underTemperature / (float) 0.25; + sTemp = (short) fTemp; + writeData += String.format("%04X", sTemp); + writeData += "0000"; //clear Alarm status + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: temperature alarm: writeData = " + writeData); + break; + case 3: + accOffset = 0x104; accSize = 1; writeData = "0001"; + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: status: writeData = " + writeData); + break; + case 4: + accOffset = 0xF0; accSize = 1; writeData = "A000"; + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: control: writeData = " + writeData); + break; + default: + invalidRequest1 = true; readWriteTypes = ReadWriteTypes.NULL; + break; + } + } else if (readWriteTypes == ReadWriteTypes.STOPLOGGING) { + switch(bankProcessing) { + case 0: + textViewCs8304StartLoggingStatus.setText(""); + break; + case 1: + accOffset = 0x104; accSize = 1; writeData = "0002"; + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: status: writeData = " + writeData); + break; + case 2: + case 3: + accOffset = 0xF0; accSize = 1; writeData = "A600"; + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: control: writeData = " + writeData); + break; + default: + invalidRequest1 = true; readWriteTypes = ReadWriteTypes.NULL; + break; + } + } else if (readWriteTypes == ReadWriteTypes.CHECKLOGGING) { + switch(bankProcessing) { + case 0: + textViewCs8304StartLoggingStatus.setText(""); + break; + case 1: + accOffset = 0x108; accSize = 1; writeData = ""; + operationRead = true; + break; + case 2: + int iValue = 0; + try { + iValue = Integer.parseInt(textViewCs8304CheckAlaramStatus.getText().toString(), 16); + } catch (Exception ex) { } + if ((iValue & 2) != 0) { + accOffset = 0x108; accSize = 1; writeData = ""; + iValue &= 0x3; iValue |= 1; + writeData = String.format("%04X", iValue); + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: writeData = " + writeData); + break; + } + default: + invalidRequest1 = true; readWriteTypes = ReadWriteTypes.NULL; + break; + } + } else if (readWriteTypes == ReadWriteTypes.GETLOGGING) { + switch(bankProcessing) { + case 0: + textViewCs8304GetLoggingStatus.setText(""); + break; + default: + invalidRequest1 = true; readWriteTypes = ReadWriteTypes.NULL; + break; + } + } + } else { + invalidRequest1 = true; + } + } else { + invalidRequest1 = true; + } + + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessBank(accBank) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessOffset(accOffset) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (accSize == 0) { + invalidRequest1 = true; + } else if (MainActivity.csLibrary4A.setAccessCount(accSize) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false && operationRead == false) { + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessWriteData(writeData) == false) { + invalidRequest1 = true; + } + } + } + MainActivity.csLibrary4A.appendToLog("found invalidRequest1 = " + invalidRequest1); + return invalidRequest1; + } + + short setTemperature(float fTemperature) { + if (fTemperature > 63.75) fTemperature = (float) 63.75; + else if (fTemperature < -64) fTemperature = -64; + boolean bNegative = false; + if (fTemperature < 0) { bNegative = true; fTemperature = 0 - fTemperature; } + fTemperature += 0.125; fTemperature /= 0.25; + short retValue = (short)fTemperature; + if (bNegative) { retValue--; retValue &= 0xFF; retValue ^= 0xFF; retValue |= 0x100; } + return retValue; + } + String getTemperatue(String stringInput) { + byte bValue = Byte.parseByte(stringInput.substring(0,1), 16); + byte bValue2 = Byte.parseByte(stringInput.substring(1, 2), 16); bValue2 <<= 4; + byte bValue3 = Byte.parseByte(stringInput.substring(2, 3), 16); bValue2 |= bValue3; + String stringValue = ""; short sValue = (short)(bValue2 & 0xFF); + if ((bValue & 0x01) != 0) { stringValue = "-"; bValue2 ^= 0xFF; sValue = (short)(bValue2 & 0xFF); sValue++; } + stringValue += String.valueOf((sValue & 0x1FF) >> 2); + switch (sValue & 0x03) { + case 1: + stringValue += ".25"; + break; + case 2: + stringValue += ".50"; + break; + case 3: + stringValue += ".75"; + break; + } + return stringValue; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.GenericTextWatcher; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class AccessColdChainFragment extends CommonFragment { + final boolean DEBUG = true; + EditText editTextRWTagID, editTextAccessRWAccPassword, editTextaccessRWAntennaPower; + TextView textViewConfigOk, textViewTemperatureOk, textViewEnableOk; + CheckBox checkBoxConfig, checkBoxTemperature, checkBoxEnable; + + EditText editTextTempThresUnder, editTextTempThresOver, editTextTempCountUnder, editTextTempCountOver, editTextMonitorDelay, editTextSamplingInterval; + TextView textViewTemperature, textViewUnderAlarm, textViewOverAlarm, textViewBatteryAlarm; + Spinner spinnerDelayUnit, spinnerIntervalUnit, spinnerEnable, spinnerTagType; + Button buttonRead, buttonWrite, buttonStartLogging, buttonStopLogging, buttonCheckAlarm, buttonGetLogging; + TextView textViewStartLoggingStatus, textViewStopLoggingStatus, textViewCheckAlaramStatus, textViewGetLoggingStatus; + + enum ReadWriteTypes { + NULL, TEMPERATURE, CONFIGURATION, ENABLE, + STARTLOGGING, STOPLOGGING, CHECKLOGGING, GETLOGGING + } + boolean operationRead = false; + ReadWriteTypes readWriteTypes; + + private AccessTask accessTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_coldchain, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + editTextRWTagID = (EditText) getActivity().findViewById(R.id.accessCCTagID); + editTextAccessRWAccPassword = (EditText) getActivity().findViewById(R.id.accessCCAccPasswordValue); + editTextAccessRWAccPassword.addTextChangedListener(new GenericTextWatcher(editTextAccessRWAccPassword, 8)); + editTextAccessRWAccPassword.setText("00000000"); + + textViewConfigOk = (TextView) getActivity().findViewById(R.id.accessCCConfigOK); + textViewTemperatureOk = (TextView) getActivity().findViewById(R.id.accessCCTemperatureOK); + textViewEnableOk = (TextView) getActivity().findViewById(R.id.accessCCEnableOK); + checkBoxConfig = (CheckBox) getActivity().findViewById(R.id.accessCCConfigTitle); + checkBoxTemperature = (CheckBox) getActivity().findViewById(R.id.accessCCTemperatureTitle); + checkBoxEnable = (CheckBox) getActivity().findViewById(R.id.accessCCEnableTitle); + + textViewTemperature = (TextView) getActivity().findViewById(R.id.accessCCTemperature); + textViewUnderAlarm = (TextView) getActivity().findViewById(R.id.accessCCUnderTempAlarm); + textViewOverAlarm = (TextView) getActivity().findViewById(R.id.accessCCOverTempAlarm); + textViewBatteryAlarm = (TextView) getActivity().findViewById(R.id.accessCCBatteryAlarm); + + editTextTempThresUnder = (EditText) getActivity().findViewById(R.id.accessCCTempThresUnder); + editTextTempThresOver = (EditText) getActivity().findViewById(R.id.accessCCTempThresOver); + editTextTempCountUnder = (EditText) getActivity().findViewById(R.id.accessCCTempCountUnder); + editTextTempCountOver = (EditText) getActivity().findViewById(R.id.accessCCTempCountOver); + editTextMonitorDelay = (EditText) getActivity().findViewById(R.id.accessCCMonitorDelay); + editTextSamplingInterval = (EditText) getActivity().findViewById(R.id.accessCCSamplingInverval); + + TextView textViewDegreeC = (TextView) getActivity().findViewById(R.id.accessCCDegreeC); + textViewDegreeC.setText(textViewDegreeC.getText().toString() + (char) 0x00B0 + "C)"); + + ArrayAdapter arrayAdapterUnit = ArrayAdapter.createFromResource(getActivity(), R.array.coldChain_unit_options, R.layout.custom_spinner_layout); + arrayAdapterUnit.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerDelayUnit = (Spinner) getActivity().findViewById(R.id.accessCCMonitorUnit); + spinnerDelayUnit.setAdapter(arrayAdapterUnit); + + ArrayAdapter arrayAdapterUnit1 = ArrayAdapter.createFromResource(getActivity(), R.array.coldChain_IntervalUnit_options, R.layout.custom_spinner_layout); + arrayAdapterUnit1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerIntervalUnit = (Spinner) getActivity().findViewById(R.id.accessCCSamplingIntervalUnit); + spinnerIntervalUnit.setAdapter(arrayAdapterUnit1); + + ArrayAdapter arrayAdapterEnable = ArrayAdapter.createFromResource(getActivity(), R.array.coldChain_enable_options, R.layout.custom_spinner_layout); + arrayAdapterEnable.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerEnable = (Spinner) getActivity().findViewById(R.id.accessCCEnable); + spinnerEnable.setAdapter(arrayAdapterEnable); + + ArrayAdapter arrayAdapterTagType = ArrayAdapter.createFromResource(getActivity(), R.array.coldChain_tagtype_options, R.layout.custom_spinner_layout); + arrayAdapterTagType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerTagType = (Spinner) getActivity().findViewById(R.id.selectCCTagType); + spinnerTagType.setAdapter(arrayAdapterTagType); + spinnerTagType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { + switch(position) { + case 0: + LinearLayout linearLayout = (LinearLayout) getActivity().findViewById(R.id.accessCC8304Layout); + linearLayout.setVisibility(View.VISIBLE); + linearLayout = (LinearLayout) getActivity().findViewById(R.id.accessCCmaxduraLayout); + linearLayout.setVisibility(View.GONE); + break; + case 1: + linearLayout = (LinearLayout) getActivity().findViewById(R.id.accessCC8304Layout); + linearLayout.setVisibility(View.GONE); + linearLayout = (LinearLayout) getActivity().findViewById(R.id.accessCCmaxduraLayout); + linearLayout.setVisibility(View.VISIBLE); + break; + } + } + + @Override + public void onNothingSelected(AdapterView parentView) { + // your code here + } + }); + + editTextaccessRWAntennaPower = (EditText) getActivity().findViewById(R.id.accessCCAntennaPower); + editTextaccessRWAntennaPower.setText(String.valueOf(300)); + + buttonStartLogging = (Button) getActivity().findViewById(R.id.accessCCStartLogging); + buttonStartLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.STARTLOGGING; + operationRead = true; startAccessTask(); + } + }); + buttonStopLogging = (Button) getActivity().findViewById(R.id.accessCCStopLogging); + buttonStopLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.STOPLOGGING; + operationRead = true; startAccessTask(); + } + }); + buttonCheckAlarm = (Button) getActivity().findViewById(R.id.accessCCcheckAlarm); + buttonCheckAlarm.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.CHECKLOGGING; + operationRead = true; startAccessTask(); + } + }); + buttonGetLogging = (Button) getActivity().findViewById(R.id.accessCCGetLogging); + buttonGetLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.GETLOGGING; + operationRead = true; startAccessTask(); + } + }); + + textViewStartLoggingStatus = (TextView) getActivity().findViewById(R.id.accessCCStartLoggingStatus); + textViewStopLoggingStatus = (TextView) getActivity().findViewById(R.id.accessCCStopLoggingStatus); + textViewCheckAlaramStatus = (TextView) getActivity().findViewById(R.id.accessCCcheckAlarmStatus); + textViewGetLoggingStatus = (TextView) getActivity().findViewById(R.id.accessCCGetLoggingStatus); + + buttonRead = (Button) getActivity().findViewById(R.id.accessCCReadButton); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.NULL; + operationRead = true; startAccessTask(); + } + }); + + buttonWrite = (Button) getActivity().findViewById(R.id.accessCCWriteButton); + buttonWrite.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.NULL; + operationRead = false; startAccessTask(); + } + }); + + setupTagID(); + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onDestroy() { + if (accessTask != null) accessTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + userVisibleHint = true; + MainActivity.csLibrary4A.appendToLog("AccessColdChainFragment is now VISIBLE"); + setupTagID(); + // setNotificationListener(); + } else { + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("AccessColdChainFragment is now INVISIBLE"); +// MainActivity.mCs108Library4a.setNotificationListener(null); + } + } + + public AccessColdChainFragment() { + super("AccessColdChainFragment"); + } + + void setupTagID() { + ReaderDevice tagSelected = MainActivity.tagSelected; + boolean bSelected = false; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + bSelected = true; + if (editTextRWTagID != null) editTextRWTagID.setText(tagSelected.getAddress()); + + String stringDetail = tagSelected.getDetails(); + int indexUser = stringDetail.indexOf("USER="); + if (indexUser != -1) { + String stringUser = stringDetail.substring(indexUser + 5); + MainActivity.csLibrary4A.appendToLog("stringUser = " + stringUser); + + boolean bEnableBAPMode = false; + int number = Integer.valueOf(stringUser.substring(3, 4), 16); + if ((number % 2) == 1) bEnableBAPMode = true; +// CheckBox checkBoxBAP = (CheckBox) getActivity().findViewById(R.id.coldChainEnableBAP); +// checkBoxBAP.setChecked(bEnableBAPMode); + } + } + } + } + + boolean isOperationRunning() { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return true; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return true; + } else if (accessTask != null) { + if (accessTask.getStatus() == AsyncTask.Status.RUNNING) { + Toast.makeText(MainActivity.mContext, "Running acccess task. Please wait", Toast.LENGTH_SHORT).show(); + return true; + } + } + return false; + } + + void startAccessTask() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("startAccessTask()"); + if (updating == false) { + updating = true; bankProcessing = 0; + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + boolean updating = false; int bankProcessing = 0; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + boolean rerunRequest = false; boolean taskRequest = false; + if (accessTask == null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessColdChainFragment().updateRunnable(): NULL accessReadWriteTask"); + taskRequest = true; + } else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) { + rerunRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessColdChainFragment().updateRunnable(): accessReadWriteTask.getStatus() = " + accessTask.getStatus().toString()); + } else { + taskRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessColdChainFragment().updateRunnable(): FINISHED accessReadWriteTask"); + } + if (processResult()) { rerunRequest = true; MainActivity.csLibrary4A.appendToLog("processResult is TRUE");} + else if (taskRequest) { + boolean invalid = processTickItems(); + MainActivity.csLibrary4A.appendToLog("processTickItems, invalid = " + invalid); + if (bankProcessing++ != 0 && invalid) rerunRequest = false; + else { + RfidReaderChipData.HostCommands hostCommand; + if (readWriteTypes == ReadWriteTypes.TEMPERATURE) hostCommand = RfidReaderChipData.HostCommands.CMD_GETSENSORDATA; + else if (operationRead) hostCommand = RfidReaderChipData.HostCommands.CMD_18K6CREAD; + else hostCommand = RfidReaderChipData.HostCommands.CMD_18K6CWRITE; + accessTask = new AccessTask((operationRead ? buttonRead : buttonWrite), null, invalid, true, + editTextRWTagID.getText().toString(), 1, 32, + editTextAccessRWAccPassword.getText().toString(), + Integer.valueOf(editTextaccessRWAntennaPower.getText().toString()), + hostCommand, + 0, 0, true, false, + null, null, null, null, null); + accessTask.execute(); + rerunRequest = true; + MainActivity.csLibrary4A.appendToLog("accessTask is created"); + } + } + if (rerunRequest) { + mHandler.postDelayed(updateRunnable, 500); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessColdChainFragment().updateRunnable(): Restart"); + } + else updating = false; + MainActivity.csLibrary4A.appendToLog("AccessColdChainFragment().updateRunnable(): Ending with updating = " + updating); + } + }; + + short setTemperature(float fTemperature) { + if (fTemperature > 63.75) fTemperature = (float) 63.75; + else if (fTemperature < -64) fTemperature = -64; + boolean bNegative = false; + if (fTemperature < 0) { bNegative = true; fTemperature = 0 - fTemperature; } + fTemperature += 0.125; fTemperature /= 0.25; + short retValue = (short)fTemperature; + if (bNegative) { retValue--; retValue &= 0xFF; retValue ^= 0xFF; retValue |= 0x100; } + return retValue; + } + String getTemperatue(String stringInput) { + byte bValue = Byte.parseByte(stringInput.substring(0,1), 16); + byte bValue2 = Byte.parseByte(stringInput.substring(1, 2), 16); bValue2 <<= 4; + byte bValue3 = Byte.parseByte(stringInput.substring(2, 3), 16); bValue2 |= bValue3; + String stringValue = ""; short sValue = (short)(bValue2 & 0xFF); + if ((bValue & 0x01) != 0) { stringValue = "-"; bValue2 ^= 0xFF; sValue = (short)(bValue2 & 0xFF); sValue++; } + stringValue += String.valueOf((sValue & 0x1FF) >> 2); + switch (sValue & 0x03) { + case 1: + stringValue += ".25"; + break; + case 2: + stringValue += ".50"; + break; + case 3: + stringValue += ".75"; + break; + } + return stringValue; + } + + // int accessBank, accSize, accOffset; +// int restartCounter = 0; int restartAccessBank = -1; + boolean processResult() { + String accessResult = null; + if (accessTask == null) return false; + else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) return false; + else { + accessResult = accessTask.accessResult; + MainActivity.csLibrary4A.appendToLog("accessResult 2 bankProcewssing = " + bankProcessing + ", accessResult = " + accessTask.accessResult ); + if (readWriteTypes == ReadWriteTypes.STARTLOGGING) textViewStartLoggingStatus.setText(accessResult); + else if (readWriteTypes == ReadWriteTypes.STOPLOGGING) textViewStopLoggingStatus.setText(accessResult); + else if (readWriteTypes == ReadWriteTypes.CHECKLOGGING) textViewCheckAlaramStatus.setText(accessResult); + else if (readWriteTypes == ReadWriteTypes.GETLOGGING) textViewGetLoggingStatus.setText(accessResult); + else if (accessResult == null) { + if (readWriteTypes == ReadWriteTypes.CONFIGURATION) { + textViewConfigOk.setText("E"); checkBoxConfig.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.TEMPERATURE && operationRead) { + textViewTemperatureOk.setText("E"); checkBoxTemperature.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.ENABLE) { + textViewEnableOk.setText("E"); checkBoxEnable.setChecked(false); + } + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("accessResult = " + accessResult); + if (readWriteTypes == ReadWriteTypes.CONFIGURATION) { + textViewConfigOk.setText("O"); checkBoxConfig.setChecked(false); readWriteTypes = ReadWriteTypes.NULL; + if (accessResult.length() == 12 && operationRead) { // 43 60 42 FC 04 06 + byte bValue = Byte.parseByte(accessResult.substring(0, 1), 16); + if ((bValue & 8) == 0) { + bValue = Byte.parseByte(accessResult.substring(0, 2), 16); + bValue &= 0x3F; + editTextTempCountUnder.setText(String.valueOf(bValue >> 1)); + editTextTempThresUnder.setText(getTemperatue(accessResult.substring(1, 4))); + + bValue = Byte.parseByte(accessResult.substring(4, 6), 16); + bValue &= 0x3F; + editTextTempCountOver.setText(String.valueOf(bValue >> 1)); + editTextTempThresOver.setText(getTemperatue(accessResult.substring(5, 8))); + + byte bValue2 = Byte.parseByte(accessResult.substring(8, 10), 16); + spinnerDelayUnit.setSelection(((bValue2 & 0xFF) >> 6) + 1); + editTextMonitorDelay.setText(String.valueOf(bValue2 & 0x3F)); + + bValue2 = Byte.parseByte(accessResult.substring(10, 12), 16); + spinnerIntervalUnit.setSelection(((bValue2 & 0xFF) >> 6) + 1); + editTextSamplingInterval.setText(String.valueOf(bValue2 & 0x3F)); + } + } + } else if (readWriteTypes == ReadWriteTypes.TEMPERATURE && operationRead) { + textViewTemperatureOk.setText("O"); checkBoxTemperature.setChecked(false); readWriteTypes = ReadWriteTypes.NULL; + MainActivity.csLibrary4A.appendToLog("accessResult of Temperature = " + accessResult); + + if (accessResult.length() >= 16) { + int indexBegin = accessResult.length() - 16; + String stringValue = accessResult.substring(indexBegin, indexBegin + 4); + MainActivity.csLibrary4A.appendToLog("temperature part of Temperature accessResult = " + stringValue); + accessResult = stringValue; + } + if (accessResult.length() == 4) { + byte bValue = Byte.parseByte(accessResult.substring(0, 1), 16); + if ((bValue & 0x8) != 0) textViewBatteryAlarm.setVisibility(View.VISIBLE); + else if ((bValue & 0x2) != 0) textViewOverAlarm.setVisibility(View.VISIBLE); + else if ((bValue & 01) != 0) textViewUnderAlarm.setVisibility(View.VISIBLE); + + bValue = Byte.parseByte(accessResult.substring(1, 2), 16); + Integer iValue2 = Integer.parseInt(accessResult.substring(2, 4), 16); + iValue2 &= 0x1FF; + if ((bValue & 0x01) != 0 && iValue2 == 0) textViewTemperature.setText("Invalid"); + else { + String stringValue = getTemperatue(accessResult.substring(1, 4)); + stringValue += (char) 0x00B0 + "C"; + textViewTemperature.setText(stringValue); + } + } + } else if (readWriteTypes == ReadWriteTypes.ENABLE) { + textViewEnableOk.setText("O"); checkBoxEnable.setChecked(false); readWriteTypes = ReadWriteTypes.NULL; + if (accessResult.length() == 4 && operationRead) { + byte bValue = Byte.parseByte(accessResult.substring(3, 4), 16); + if ((bValue & 0x01) != 0) spinnerEnable.setSelection(2); + else spinnerEnable.setSelection(1); + } + } + } + accessTask = null; + return true; + } + } + boolean processTickItems() { + boolean invalidRequest1 = false; + int accSize = 0, accOffset = 0; + String writeData = ""; + + if (readWriteTypes == ReadWriteTypes.STARTLOGGING || readWriteTypes == ReadWriteTypes.STOPLOGGING || readWriteTypes == ReadWriteTypes.CHECKLOGGING || readWriteTypes == ReadWriteTypes.GETLOGGING) { + MainActivity.csLibrary4A.appendToLog("accessResult 1 bankProcewssing = " + bankProcessing ); + accOffset = 0xF0; accSize = 1; operationRead = true; + if (readWriteTypes == ReadWriteTypes.STARTLOGGING) { + switch(bankProcessing) { + case 0: + textViewStartLoggingStatus.setText(""); + break; + case 1: + long seconds = System.currentTimeMillis() / (long)1000; + int interval = 10; + float temperatureOffset = 10; //range 20 to 0 represents -20 to 0 degreeC + accOffset = 0; accSize = 4; writeData = ""; + + writeData += String.format("%08X", seconds); + writeData += String.format("%04X", interval); + float fTemp = temperatureOffset / (float) 0.25; + short sTemp = (short) fTemp; + writeData += String.format("%04X", sTemp); + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: UTC seconds = " + seconds + ", writedata = " + writeData); + break; + case 2: + float overTemperature = 20; + float underTemperature = -10; + accOffset = 0x106; accSize = 3; writeData = ""; + + fTemp = overTemperature / (float) 0.25; + sTemp = (short) fTemp; + writeData += String.format("%04X", sTemp); + fTemp = underTemperature / (float) 0.25; + sTemp = (short) fTemp; + writeData += String.format("%04X", sTemp); + writeData += "0000"; //clear Alarm status + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: temperature alarm: writeData = " + writeData); + break; + case 3: + accOffset = 0x104; accSize = 1; writeData = "0001"; + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: status: writeData = " + writeData); + break; + case 4: + accOffset = 0xF0; accSize = 1; writeData = "A000"; + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: control: writeData = " + writeData); + break; + default: + invalidRequest1 = true; readWriteTypes = ReadWriteTypes.NULL; + break; + } + } else if (readWriteTypes == ReadWriteTypes.STOPLOGGING) { + switch(bankProcessing) { + case 0: + textViewStartLoggingStatus.setText(""); + break; + case 1: + accOffset = 0x104; accSize = 1; writeData = "0002"; + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: status: writeData = " + writeData); + break; + case 2: + case 3: + accOffset = 0xF0; accSize = 1; writeData = "A600"; + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: control: writeData = " + writeData); + break; + default: + invalidRequest1 = true; readWriteTypes = ReadWriteTypes.NULL; + break; + } + } else if (readWriteTypes == ReadWriteTypes.CHECKLOGGING) { + switch(bankProcessing) { + case 0: + textViewStartLoggingStatus.setText(""); + break; + case 1: + accOffset = 0x108; accSize = 1; writeData = ""; + operationRead = true; + break; + case 2: + int iValue = 0; + try { + iValue = Integer.parseInt(textViewCheckAlaramStatus.getText().toString(), 16); + } catch (Exception ex) { } + if ((iValue & 2) != 0) { + accOffset = 0x108; accSize = 1; writeData = ""; + iValue &= 0x3; iValue |= 1; + writeData = String.format("%04X", iValue); + operationRead = false; + MainActivity.csLibrary4A.appendToLog("accessResult: writeData = " + writeData); + break; + } + default: + invalidRequest1 = true; readWriteTypes = ReadWriteTypes.NULL; + break; + } + } else if (readWriteTypes == ReadWriteTypes.GETLOGGING) { + switch(bankProcessing) { + case 0: + textViewGetLoggingStatus.setText(""); + break; + default: + invalidRequest1 = true; readWriteTypes = ReadWriteTypes.NULL; + break; + } + } + } else if (checkBoxConfig.isChecked() == true) { + accOffset = 0xEC; accSize = 3; readWriteTypes = ReadWriteTypes.CONFIGURATION; textViewConfigOk.setText(""); + if (operationRead) { + editTextTempThresUnder.setText(""); + editTextTempThresOver.setText(""); + editTextTempCountUnder.setText(""); + editTextTempCountOver.setText(""); + editTextMonitorDelay.setText(""); + editTextSamplingInterval.setText(""); + spinnerDelayUnit.setSelection(0); + spinnerIntervalUnit.setSelection(0); + } else { + try { + int underTempCount, underTempThreshold, overTempCount, overTempThreshold; + byte tempBytes[] = new byte[6]; + + tempBytes[0] = 0x40; + tempBytes[0] |= (Byte.parseByte(editTextTempCountUnder.getText().toString()) << 1); + float fValue = Float.parseFloat(editTextTempThresUnder.getText().toString()); + short sValue = setTemperature(fValue); + if ((sValue & (short)0x100) != 0) tempBytes[0] |= 1; + tempBytes[1] = (byte)sValue; + + tempBytes[2] = 0; + tempBytes[2] |= (Byte.parseByte(editTextTempCountOver.getText().toString()) << 1); + fValue = Float.parseFloat(editTextTempThresOver.getText().toString()); + sValue = setTemperature(fValue); + if ((sValue & (short)0x100) != 0) tempBytes[2] |= 1; + tempBytes[3] = (byte)sValue; + + int iTemp = spinnerDelayUnit.getSelectedItemPosition(); + if (iTemp < 1) iTemp = 1; + else if (iTemp > 4) iTemp = 4; + iTemp--; + tempBytes[4] = (byte)iTemp; tempBytes[4] <<= 6; + byte bValue = Byte.parseByte(editTextMonitorDelay.getText().toString()); + tempBytes[4] |= (bValue & 0x3F); + + iTemp = spinnerIntervalUnit.getSelectedItemPosition(); + if (iTemp < 1) iTemp = 1; + else if (iTemp > 4) iTemp = 4; + iTemp--; + tempBytes[5] = (byte)iTemp; tempBytes[5] <<= 6; + bValue = Byte.parseByte(editTextSamplingInterval.getText().toString()); + tempBytes[5] |= (bValue & 0x3F); + + writeData = MainActivity.csLibrary4A.byteArrayToString(tempBytes); + MainActivity.csLibrary4A.appendToLog("editTextTempCountUnder = " + MainActivity.csLibrary4A.byteArrayToString(tempBytes)); + } catch (Exception ex) { + MainActivity.csLibrary4A.appendToLog("Invalid String.parse !!!"); + invalidRequest1 = true; + } + } + } else if (checkBoxTemperature.isChecked() == true) { + readWriteTypes = ReadWriteTypes.TEMPERATURE; + if (bankProcessing == 0) { + if (operationRead) { + textViewTemperature = (TextView) getActivity().findViewById(R.id.accessCCTemperature); + textViewTemperature.setText(""); + textViewUnderAlarm = (TextView) getActivity().findViewById(R.id.accessCCUnderTempAlarm); + textViewUnderAlarm.setVisibility(View.INVISIBLE); + textViewOverAlarm = (TextView) getActivity().findViewById(R.id.accessCCOverTempAlarm); + textViewOverAlarm.setVisibility(View.INVISIBLE); + textViewBatteryAlarm = (TextView) getActivity().findViewById(R.id.accessCCBatteryAlarm); + textViewBatteryAlarm.setVisibility(View.INVISIBLE); + textViewTemperatureOk.setText(""); + if (true) { + MainActivity.csLibrary4A.macWrite(0x11F, 3); + return false; + } + accOffset = 0x100; accSize = 1; operationRead = false; + } else invalidRequest1 = true; + } else { + accOffset = 0x100; accSize = 1; operationRead = true; + } + } else if (checkBoxEnable.isChecked() == true) { + accOffset = 0x10D; accSize = 1; readWriteTypes = ReadWriteTypes.ENABLE; textViewEnableOk.setText(""); + if (operationRead) spinnerEnable.setSelection(0); + else { + int iSelect = spinnerEnable.getSelectedItemPosition(); + if (iSelect == 0) invalidRequest1 = true; + else if (iSelect == 1) writeData = "0000"; + else writeData = "0001"; + String stringValue = "0000"; + } + } else { + invalidRequest1 = true; + } + + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessBank(3) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessOffset(accOffset) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (accSize == 0) { + invalidRequest1 = true; + } else if (MainActivity.csLibrary4A.setAccessCount(accSize) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false && operationRead == false) { + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessWriteData(writeData) == false) { + invalidRequest1 = true; + } + } + } + return invalidRequest1; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public class AccessConfigFragment extends CommonFragment { + boolean bXerxesEnable = false; + EditText editTextPassWord, editTextPower, editText0, editText1, editText2; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_config, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (((AppCompatActivity) getActivity()).getSupportActionBar() != null) { + ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setTitle(R.string.title_activity_axzonConfig); + } + + editTextPassWord = (EditText) getActivity().findViewById(R.id.accessConfigPasswordValue); + editTextPassWord.setText("00000000"); + editTextPower = (EditText) getActivity().findViewById(R.id.accessConfigAntennaPower); + editTextPower.setText("300"); + + TextView textView0 = (TextView) getActivity().findViewById(R.id.accessConfigData0Label); + textView0.setText("select hold(ms)"); + editText0 = (EditText) getActivity().findViewById(R.id.accessConfigData0); + + if (MainActivity.mDid == null) editText0.setText("0"); + else if (MainActivity.mDid.indexOf("E282405") == 0) editText0.setText("9"); + else if (MainActivity.mDid.indexOf("E282403") == 0) editText0.setText("3"); + else editText0.setText("0"); + + TextView textView1 = (TextView) getActivity().findViewById(R.id.accessConfigData1Label); + textView1.setText("Upper Limit of On Chip RSSI"); + editText1 = (EditText) getActivity().findViewById(R.id.accessConfigData1); + editText1.setText("21"); + + TextView textView2 = (TextView) getActivity().findViewById(R.id.accessConfigData2Label); + textView2.setText("Lower Limit On Chip RSSI"); + editText2 = (EditText) getActivity().findViewById(R.id.accessConfigData2); + editText2.setText("13"); + + Button button = (Button) getActivity().findViewById(R.id.accessConfigOKButton); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MainActivity.config.configPassword = editTextPassWord.getText().toString(); + MainActivity.config.configPower = editTextPower.getText().toString(); + MainActivity.config.config0 = editText0.getText().toString(); + MainActivity.config.config1 = editText1.getText().toString(); + MainActivity.config.config2 = editText2.getText().toString(); + + if (MainActivity.mDid != null) if (MainActivity.mDid.indexOf("E282405") == 0) bXerxesEnable = true; + + Fragment fragment; + if (bXerxesEnable) fragment = new AxzonFragment(); + else fragment = new MicronFragment(); + + FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + fragmentTransaction.replace(R.id.content_frame, fragment); + fragmentTransaction.addToBackStack(null); + fragmentTransaction.commit(); + } + }); + } + + public static AccessConfigFragment newInstance(boolean bXerxesEnable) { + AccessConfigFragment myFragment = new AccessConfigFragment(); + myFragment.bXerxesEnable = bXerxesEnable; + return myFragment; + } + public AccessConfigFragment() { + super("AccessConfigFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.GenericTextWatcher; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class AccessEm4325PassiveFragment extends CommonFragment { + final boolean DEBUG = true; + EditText editTextRWTagID, editTextAccessRWAccPassword, editTextaccessRWAntennaPower; + + TextView textViewTemperature; + Button buttonRead; + + enum ReadWriteTypes { + NULL, TEMPERATURE + } + boolean operationRead = false; + ReadWriteTypes readWriteTypes; + + private AccessTask accessTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_em4325passive, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + editTextRWTagID = (EditText) getActivity().findViewById(R.id.accessCCPTagID); + editTextAccessRWAccPassword = (EditText) getActivity().findViewById(R.id.accessCCPAccPasswordValue); + editTextAccessRWAccPassword.addTextChangedListener(new GenericTextWatcher(editTextAccessRWAccPassword, 8)); + editTextAccessRWAccPassword.setText("00000000"); + + textViewTemperature = (TextView) getActivity().findViewById(R.id.accessCCPTemperature); + + editTextaccessRWAntennaPower = (EditText) getActivity().findViewById(R.id.accessCCPAntennaPower); + editTextaccessRWAntennaPower.setText(String.valueOf(300)); + + buttonRead = (Button) getActivity().findViewById(R.id.accessCCPReadButton); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + readWriteTypes = ReadWriteTypes.NULL; + bRequestCheck = true; + operationRead = true; startAccessTask(); + } + }); + + setupTagID(); + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onDestroy() { + if (accessTask != null) accessTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + userVisibleHint = true; + MainActivity.csLibrary4A.appendToLog("AccessEm4325PassiveFragment is now VISIBLE"); + setupTagID(); + // setNotificationListener(); + } else { + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("AccessEm4325PassiveFragment is now INVISIBLE"); +// MainActivity.mCs108Library4a.setNotificationListener(null); + } + } + + public AccessEm4325PassiveFragment() { + super("AccessEm4325PassiveFragment"); + } + + void setupTagID() { + ReaderDevice tagSelected = MainActivity.tagSelected; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + if (editTextRWTagID != null) editTextRWTagID.setText(tagSelected.getAddress()); + } + } + } + + boolean isOperationRunning() { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return true; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return true; + } else if (accessTask != null) { + if (accessTask.getStatus() == AsyncTask.Status.RUNNING) { + Toast.makeText(MainActivity.mContext, "Running acccess task. Please wait", Toast.LENGTH_SHORT).show(); + return true; + } + } + return false; + } + + void startAccessTask() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("startAccessTask()"); + if (updating == false) { + updating = true; bankProcessing = 0; + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + boolean updating = false; int bankProcessing = 0; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + boolean rerunRequest = false; boolean taskRequest = false; + if (accessTask == null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessEm4325PassiveFragment().updateRunnable(): NULL accessReadWriteTask"); + taskRequest = true; + } else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) { + rerunRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessEm4325PassiveFragment().updateRunnable(): accessReadWriteTask.getStatus() = " + accessTask.getStatus().toString()); + } else { + taskRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessEm4325PassiveFragment().updateRunnable(): FINISHED accessReadWriteTask"); + } + if (processResult()) { rerunRequest = true; MainActivity.csLibrary4A.appendToLog("updateRunnable: processResult is TRUE with bankprocessing = " + bankProcessing);} + else if (taskRequest) { + boolean invalid = processTickItems(); + MainActivity.csLibrary4A.appendToLog("updateRunnable: processTickItems Result = " + invalid + ", bankprocessing = " + bankProcessing); + if (bankProcessing++ != 0 && invalid) rerunRequest = false; + else { + RfidReaderChipData.HostCommands hostCommand; + if (readWriteTypes == ReadWriteTypes.TEMPERATURE && operationRead) hostCommand = RfidReaderChipData.HostCommands.CMD_GETSENSORDATA; + else if (operationRead) hostCommand = RfidReaderChipData.HostCommands.CMD_18K6CREAD; + else hostCommand = RfidReaderChipData.HostCommands.CMD_18K6CWRITE; + MainActivity.csLibrary4A.appendToLog("hostCommand = " + hostCommand.toString()); + accessTask = new AccessTask(buttonRead, null, invalid, true, + editTextRWTagID.getText().toString(), 1, 32, + editTextAccessRWAccPassword.getText().toString(), + Integer.valueOf(editTextaccessRWAntennaPower.getText().toString()), + hostCommand, + 0, 0, true, false, + null, null, null, null, null); + accessTask.execute(); + rerunRequest = true; + MainActivity.csLibrary4A.appendToLog("accessTask is created"); + } + } + if (rerunRequest) { + mHandler.postDelayed(updateRunnable, 500); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessEm4325PassiveFragment().updateRunnable(): Restart"); + } + else updating = false; + MainActivity.csLibrary4A.appendToLog("AccessEm4325PassiveFragment().updateRunnable(): Ending with updating = " + updating); + } + }; + + short setTemperature(float fTemperature) { + if (fTemperature > 63.75) fTemperature = (float) 63.75; + else if (fTemperature < -64) fTemperature = -64; + boolean bNegative = false; + if (fTemperature < 0) { bNegative = true; fTemperature = 0 - fTemperature; } + fTemperature += 0.125; fTemperature /= 0.25; + short retValue = (short)fTemperature; + if (bNegative) { retValue--; retValue &= 0xFF; retValue ^= 0xFF; retValue |= 0x100; } + return retValue; + } + String getTemperatue(String stringInput) { + byte bValue = Byte.parseByte(stringInput.substring(0,1), 16); + byte bValue2 = Byte.parseByte(stringInput.substring(1, 2), 16); bValue2 <<= 4; + byte bValue3 = Byte.parseByte(stringInput.substring(2, 3), 16); bValue2 |= bValue3; + String stringValue = ""; short sValue = (short)(bValue2 & 0xFF); + if ((bValue & 0x01) != 0) { stringValue = "-"; bValue2 ^= 0xFF; sValue = (short)(bValue2 & 0xFF); sValue++; } + stringValue += String.valueOf((sValue & 0x1FF) >> 2); + switch (sValue & 0x03) { + case 1: + stringValue += ".25"; + break; + case 2: + stringValue += ".50"; + break; + case 3: + stringValue += ".75"; + break; + } + return stringValue; + } + + + boolean bRequestCheck; + boolean processResult() { + String accessResult = null; + if (accessTask == null) return false; + else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) return false; + else { + accessResult = accessTask.accessResult; + MainActivity.csLibrary4A.appendToLog("accessResult 2 bankProcessing = " + bankProcessing + ", accessResult = " + accessTask.accessResult ); + if (accessResult == null) { + if (readWriteTypes == ReadWriteTypes.TEMPERATURE && operationRead) { + bRequestCheck = false; + } + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("accessResult = " + accessResult); + if (readWriteTypes == ReadWriteTypes.TEMPERATURE && operationRead == false) { + } else if (readWriteTypes == ReadWriteTypes.TEMPERATURE && operationRead) { + bRequestCheck = false; readWriteTypes = ReadWriteTypes.NULL; + MainActivity.csLibrary4A.appendToLog("accessResult of Temperature = " + accessResult); + + if (accessResult.length() >= 16) { + int indexBegin = accessResult.length() - 16; + String stringValue = accessResult.substring(indexBegin, indexBegin + 4); + MainActivity.csLibrary4A.appendToLog("temperature part of Temperature accessResult = " + stringValue); + accessResult = stringValue; //"00B5"; //stringValue; + } + if (accessResult.length() == 4) { + byte bValue = Byte.parseByte(accessResult.substring(1, 2), 16); + Integer iValue2 = Integer.parseInt(accessResult.substring(2, 4), 16); + iValue2 &= 0x1FF; + if ((bValue & 0x01) != 0 && iValue2 == 0) textViewTemperature.setText("Invalid"); + else { + String stringValue = getTemperatue(accessResult.substring(1, 4)); + stringValue += (char) 0x00B0 + "C"; + textViewTemperature.setText(stringValue); + } + } + } + } + accessTask = null; + return true; + } + } + boolean processTickItems() { + boolean invalidRequest1 = false; + int accSize = 0, accOffset = 0; + String writeData = ""; + + if (bRequestCheck) { + readWriteTypes = ReadWriteTypes.TEMPERATURE; + if (bankProcessing == 0) { + if (operationRead) { + textViewTemperature = (TextView) getActivity().findViewById(R.id.accessCCPTemperature); + textViewTemperature.setText(""); + accOffset = 0x10D; accSize = 1; operationRead = false; writeData = "0000"; + } else invalidRequest1 = true; + } else { + operationRead = true; + MainActivity.csLibrary4A.macWrite(0x11F, 3); + return false; + } + } else { + invalidRequest1 = true; + } + + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessBank(3) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessOffset(accOffset) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (accSize == 0) { + invalidRequest1 = true; + } else if (MainActivity.csLibrary4A.setAccessCount(accSize) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false && operationRead == false) { + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessWriteData(writeData) == false) { + invalidRequest1 = true; + } + } + } + return invalidRequest1; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.app.Activity; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SaveList2ExternalTask; +import com.csl.cs710ademoapp.SelectTag; +import com.csl.cslibrary4a.RfidReaderChipData; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import static com.csl.cs710ademoapp.MainActivity.mContext; + +public class AccessFdmicroFragment extends CommonFragment { + SelectTag selectTag; + Spinner spinnerSelectCommand, spinnerSelectAuth, spinnerSelectGetSource; + TableRow tableRowOffsetLength, tableRowValue, tableRowAuth, tableRowGetTemperature, tableRowGetTemperature1, tableRowLogging, tableRowReg, tableRowEnable; + EditText editTextMemoryValue, editTextDelayStart, editTextCntLimit, editTextStep; + TextView textViewTemperatureValue, textViewBatteryValue, textViewLoggingValue, textViewLoggingValue1; + Button buttonRead, buttonWrite; + SimpleDateFormat formatter; + + boolean operationRunning = false, operationRead = false, operationReadTemperature = false, operationReadBattery = false, operationSetLogging = false, operationCheckLogging = false, operationStopLogging = false, operationGetLogging = false; + AccessTask accessTask; + + void clearOperationSelect() { + operationReadTemperature = false; operationReadBattery = false; operationSetLogging = false; operationCheckLogging = false; operationStopLogging = false; operationGetLogging = false; + } + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_fdmicro, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + selectTag = new SelectTag((Activity)getActivity(), 0); + + tableRowOffsetLength = (TableRow) getActivity().findViewById(R.id.accessFDOffsetLengthRow); + tableRowValue = (TableRow) getActivity().findViewById(R.id.accessFDValueRow); + tableRowAuth = (TableRow) getActivity().findViewById(R.id.accessFDAuthRow); + tableRowGetTemperature = (TableRow) getActivity().findViewById(R.id.accessFDGetTemperatureRow); + tableRowGetTemperature1 = (TableRow) getActivity().findViewById(R.id.accessFDGetTemperatureRow1); + tableRowLogging = (TableRow) getActivity().findViewById(R.id.accessFDLoggingRow); + tableRowReg = (TableRow) getActivity().findViewById(R.id.accessFDRegRow); + tableRowEnable = (TableRow) getActivity().findViewById(R.id.accessFDEnableRow); + + spinnerSelectCommand = (Spinner) getActivity().findViewById(R.id.selectCommand); + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.fd_command_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerSelectCommand.setAdapter(targetAdapter); + spinnerSelectCommand.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + commandSelected(position); + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + + editTextMemoryValue = (EditText) getActivity().findViewById(R.id.accessFDMemoryValue); + + spinnerSelectAuth = (Spinner) getActivity().findViewById(R.id.accessFDselectAuth); + ArrayAdapter targetAdapterAuth = ArrayAdapter.createFromResource(getActivity(), R.array.fd_auth_options, R.layout.custom_spinner_layout); + targetAdapterAuth.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerSelectAuth.setAdapter(targetAdapterAuth); + + spinnerSelectGetSource = (Spinner) getActivity().findViewById(R.id.accessFDSelectGetSource); + ArrayAdapter targetAdapterGetSource = ArrayAdapter.createFromResource(getActivity(), R.array.fd_getSource_options, R.layout.custom_spinner_layout); + targetAdapterAuth.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerSelectGetSource.setAdapter(targetAdapterGetSource); + + Button buttonCheckTemperature = (Button) getActivity().findViewById(R.id.accessFDcheckTemperature); + buttonCheckTemperature.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + clearOperationSelect(); operationReadTemperature = true; + textViewTemperatureValue.setText(""); + readWriteOperation(); + } + }); + textViewTemperatureValue = (TextView) getActivity().findViewById(R.id.accessFDtemperatureValue); + + Button buttonCheckBattery = (Button) getActivity().findViewById(R.id.accessFDcheckBattery); + buttonCheckBattery.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + clearOperationSelect(); operationReadBattery = true; + textViewBatteryValue.setText(""); + readWriteOperation(); + } + }); + textViewBatteryValue = (TextView) getActivity().findViewById(R.id.accessFDbatteryValue); + + editTextDelayStart = (EditText) getActivity().findViewById(R.id.accessFDvdetDelayStartCfg); + editTextCntLimit = (EditText) getActivity().findViewById(R.id.accessFDrtcCntLimit); + editTextStep = (EditText) getActivity().findViewById(R.id.accessFDstepCfg); + formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + Button buttonSetLogging = (Button) getActivity().findViewById(R.id.accessFDSetLogging); + buttonSetLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + clearOperationSelect(); operationSetLogging = true; + textViewLoggingValue.setText(""); + readWriteOperation(); + } + }); + Button buttonCheckLogging = (Button) getActivity().findViewById(R.id.accessFDCheckLogging); + buttonCheckLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + clearOperationSelect(); operationCheckLogging = true; + textViewLoggingValue.setText(""); + readWriteOperation(); + } + }); + Button buttonStopLogging = (Button) getActivity().findViewById(R.id.accessFDStopLogging); + buttonStopLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + clearOperationSelect(); operationStopLogging = true; + textViewLoggingValue.setText(""); + readWriteOperation(); + } + }); + Button buttonGetLogging = (Button) getActivity().findViewById(R.id.accessFDGetLogging); + buttonGetLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + clearOperationSelect(); operationGetLogging = true; + textViewLoggingValue1.setText(""); + readWriteOperation(); + } + }); + textViewLoggingValue = (TextView) getActivity().findViewById(R.id.accessFDloggingValue); + textViewLoggingValue1 = (TextView) getActivity().findViewById(R.id.accessFDloggingValue1); + + Button buttonSaveLogging = (Button) getActivity().findViewById(R.id.accessFDSaveLogging); + buttonSaveLogging.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + SaveList2ExternalTask saveExternalTask = new SaveList2ExternalTask(MainActivity.sharedObjects.tagsList); + String strMessage = "EPC: " + selectTag.editTextTagID.getText().toString() + "\n"; + strMessage += textViewLoggingValue1.getText().toString(); + if (logData != null) { + Date date = logData.dateLogStart; + if (date != null) { + long ltime = date.getTime(); + ltime += (logData.minLogStartDelay * 1000 * 60); + if (logData.iSampleSize > 0) { + ltime += (logData.iSampleSize -1 ) * logData.secLogSampleInterval * 1000; + } + date.setTime(ltime); + strMessage += ("Stop: " + formatter.format(date) + "\n"); + } + } + String resultDisplay = saveExternalTask.save2File(strMessage, false); + CustomPopupWindow customPopupWindow = new CustomPopupWindow(mContext); + customPopupWindow.popupStart(resultDisplay, false); + } + }); + + buttonRead = (Button) getActivity().findViewById(R.id.accessRWReadButton); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + clearOperationSelect(); operationRead = true; + readWriteOperation(); + } + }); + + buttonWrite = (Button) getActivity().findViewById(R.id.accessRWWriteButton); + buttonWrite.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isOperationRunning()) return; + clearOperationSelect(); operationRead = false; + readWriteOperation(); + } + }); + + MainActivity.csLibrary4A.setSameCheck(true); + } + + @Override + public void onResume() { + super.onResume(); + MainActivity.csLibrary4A.appendToLog("AccessFdmicro onResume !!!"); + } + + @Override + public void onPause() { + super.onPause(); + } + + @Override + public void onDestroy() { + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (getUserVisibleHint()) { + userVisibleHint = true; + selectTag.updateBankSelected(); + MainActivity.csLibrary4A.appendToLog("AccessFdmicroFragment is now VISIBLE"); + } else { + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("AccessFdmicroFragment is now INVISIBLE"); + } + } + + public AccessFdmicroFragment() { + super("AccessFdmicroFragment"); + } + + class LogData { + Date dateLogStart; + int minLogStartDelay; + int secLogSampleInterval; + int iSampleSize; + } + LogData logData; + + void commandSelected(int position) { + if (position < 0 || position > 2) position = spinnerSelectCommand.getSelectedItemPosition(); + MainActivity.csLibrary4A.appendToLog("commandSelected position = " + position); + switch (position) { + case 0: + tableRowOffsetLength.setVisibility(View.VISIBLE); + tableRowValue.setVisibility(View.VISIBLE); + tableRowValue.setVisibility(View.VISIBLE); + tableRowAuth.setVisibility(View.GONE); + tableRowGetTemperature.setVisibility(View.GONE); + tableRowGetTemperature1.setVisibility(View.GONE); + tableRowLogging.setVisibility(View.GONE); + tableRowReg.setVisibility(View.GONE); + tableRowEnable.setVisibility(View.GONE); + buttonRead.setText(getResources().getString(R.string.read_title)); + buttonWrite.setText("WRITE"); + buttonWrite.setVisibility(View.VISIBLE); + break; + case 1: + tableRowOffsetLength.setVisibility(View.GONE); + tableRowValue.setVisibility(View.GONE); + tableRowAuth.setVisibility(View.VISIBLE); + tableRowGetTemperature.setVisibility(View.GONE); + tableRowGetTemperature1.setVisibility(View.GONE); + tableRowLogging.setVisibility(View.GONE); + tableRowReg.setVisibility(View.GONE); + tableRowEnable.setVisibility(View.GONE); + buttonRead.setText(getResources().getString(R.string.start_title)); + buttonWrite.setVisibility(View.GONE); + break; + case 2: + tableRowOffsetLength.setVisibility(View.GONE); + tableRowValue.setVisibility(View.GONE); + tableRowAuth.setVisibility(View.GONE); + tableRowGetTemperature.setVisibility(View.VISIBLE); + tableRowGetTemperature1.setVisibility(View.VISIBLE); + tableRowLogging.setVisibility(View.GONE); + tableRowReg.setVisibility(View.GONE); + tableRowEnable.setVisibility(View.GONE); + buttonRead.setText(getResources().getString(R.string.read_title)); + buttonWrite.setText("MEASURE"); + buttonWrite.setVisibility(View.VISIBLE); + break; + case 3: + tableRowOffsetLength.setVisibility(View.GONE); + tableRowValue.setVisibility(View.GONE); + tableRowAuth.setVisibility(View.GONE); + tableRowGetTemperature.setVisibility(View.GONE); + tableRowGetTemperature1.setVisibility(View.GONE); + tableRowLogging.setVisibility(View.VISIBLE); + tableRowReg.setVisibility(View.GONE); + tableRowEnable.setVisibility(View.GONE); + buttonRead.setText(getResources().getString(R.string.start_title)); + buttonWrite.setText("STOP"); + buttonWrite.setVisibility(View.VISIBLE); + break; + case 4: + tableRowOffsetLength.setVisibility(View.GONE); + tableRowValue.setVisibility(View.GONE); + tableRowValue.setVisibility(View.GONE); + tableRowAuth.setVisibility(View.GONE); + tableRowGetTemperature.setVisibility(View.GONE); + tableRowGetTemperature1.setVisibility(View.GONE); + tableRowLogging.setVisibility(View.GONE); + tableRowReg.setVisibility(View.VISIBLE); + tableRowEnable.setVisibility(View.GONE); + buttonRead.setText(getResources().getString(R.string.read_title)); + buttonWrite.setText("WRITE"); + buttonWrite.setVisibility(View.VISIBLE); + break; + case 5: + case 6: + case 7: + case 8: + tableRowOffsetLength.setVisibility(View.GONE); + tableRowValue.setVisibility(View.GONE); + tableRowValue.setVisibility(View.GONE); + tableRowAuth.setVisibility(View.GONE); + tableRowGetTemperature.setVisibility(View.GONE); + tableRowGetTemperature1.setVisibility(View.GONE); + tableRowLogging.setVisibility(View.GONE); + tableRowReg.setVisibility(View.GONE); + CheckBox checkBox = (CheckBox) getActivity().findViewById(R.id.accessFDEnable); + if (position == 6) checkBox.setText("refresh temperature measurement"); + else checkBox.setText("Enable"); + if (position == 7) tableRowEnable.setVisibility(View.GONE); + else tableRowEnable.setVisibility(View.VISIBLE); + buttonRead.setText(getResources().getString(R.string.read_title)); + buttonRead.setText(getResources().getString(R.string.start_title)); + buttonWrite.setVisibility(View.GONE); + break; + default: + buttonRead.setText(getResources().getString(R.string.read_title)); + buttonWrite.setText("WRITE"); + buttonWrite.setVisibility(View.VISIBLE); + break; + } + } + + boolean isOperationRunning() { + if (accessTask != null) { + if (accessTask.getStatus() == AsyncTask.Status.RUNNING) { + Toast.makeText(MainActivity.mContext, "Running acccess task. Please wait", Toast.LENGTH_SHORT).show(); + return true; + } + } + return false; + } + void readWriteOperation() { + RfidReaderChipData.HostCommands hostCommand = null; + if (isOperationRunning()) return; + iOtherFlowCount = 0; bLogging = false; iTimeNumber = 0; iTimeTotal = 0; + if (operationReadTemperature || operationReadBattery || operationSetLogging || operationCheckLogging || operationGetLogging) { + operationRead = true; + tableRowEnable.setVisibility(View.GONE); + buttonRead.setText(getResources().getString(R.string.start_title)); + buttonWrite.setVisibility(View.GONE); + + MainActivity.csLibrary4A.set_fdCmdCfg(0x0000); + hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_OPMODE_CHECK; + } else { + MainActivity.csLibrary4A.appendToLog("Item Selected is " + spinnerSelectCommand.getSelectedItemPosition()); + int position = spinnerSelectCommand.getSelectedItemPosition(); + if (operationStopLogging) { + position = 3; operationRead = false; + } + switch (position) { + case 0: + EditText editTextMemoryOffset = (EditText) getActivity().findViewById(R.id.accessFDmemoryOffset); + int iMemoryOffset = getEditTextHexValue(editTextMemoryOffset, 4); + iMemoryOffset &= 0xFFFC; + editTextMemoryOffset.setText(String.format("%X", iMemoryOffset)); + + EditText editTextMemoryLength = (EditText) getActivity().findViewById(R.id.accessFDmemoryLength); + int iMemoryLength = 0; + try { + iMemoryLength = Integer.parseInt(editTextMemoryLength.getText().toString()); + } catch (Exception ex) { } + if (iMemoryLength <= 0) iMemoryLength = 1; + if (operationRead) { + if (iMemoryLength != (iMemoryLength / 4) * 4) + iMemoryLength = ((iMemoryLength / 4) + 1) * 4; + if (iMemoryLength > 512) iMemoryLength = 512; + } else { + if (iMemoryLength > 4) iMemoryLength = 4; + } + editTextMemoryLength.setText(String.valueOf(iMemoryLength)); + + if (operationRead) { + editTextMemoryValue.setText(""); + MainActivity.csLibrary4A.set_fdReadMem(iMemoryOffset, iMemoryLength); + } else { + String strValue = editTextMemoryValue.getText().toString(); + if (strValue.length() > 8) + strValue = strValue.substring(strValue.length() - 8); + if (strValue.length() > 2 * iMemoryLength) + strValue = strValue.substring(strValue.length() - 2 * iMemoryLength); + int iValue = 0; + try { + iValue = Integer.parseInt(strValue, 16); + } catch (Exception ex) { + strValue = "00"; + } + strValue = String.format("%X", iValue); + editTextMemoryValue.setText(strValue); + MainActivity.csLibrary4A.set_fdWriteMem(iMemoryOffset, iMemoryLength, iValue); + } + + hostCommand = (operationRead ? RfidReaderChipData.HostCommands.CMD_FDM_RDMEM : RfidReaderChipData.HostCommands.CMD_FDM_WRMEM); + break; + case 1: + int iConfig = spinnerSelectAuth.getSelectedItemPosition(); + switch (iConfig) { + case 1: + iConfig = 3; + break; + case 2: + iConfig = 4; + break; + default: + break; + } + MainActivity.csLibrary4A.set_fdCmdCfg(iConfig); //0 (user area password), 3 (unlock password), 4 (stop logging password) + + EditText editTextAuthPassword = (EditText) getActivity().findViewById(R.id.selectFDAuthPassword); + int iValue = getEditTextHexValue(editTextAuthPassword, 8); + MainActivity.csLibrary4A.set_fdPwd(iValue); + + hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_AUTH; + break; + case 2: + iConfig = 0; + CheckBox checkBoxGetTemperatureStartGet = (CheckBox) getActivity().findViewById(R.id.accessFDGetTemperatureStartGet); + if (true) { + if (operationRead) checkBoxGetTemperatureStartGet.setChecked(true); + else checkBoxGetTemperatureStartGet.setChecked(false); + } + if (checkBoxGetTemperatureStartGet.isChecked()) iConfig |= 0x80; + switch (spinnerSelectGetSource.getSelectedItemPosition()) { + case 1: + iConfig |= 0x10; + break; + case 2: + iConfig |= 0x20; + break; + case 3: + iConfig |= 0x30; + break; + } + CheckBox checkBoxGetTemperatureResultType = (CheckBox) getActivity().findViewById(R.id.accessFDGetTemperatureResultType); + if (checkBoxGetTemperatureResultType.isChecked()) iConfig |= 4; + CheckBox checkBoxGetTemperatureCheckField = (CheckBox) getActivity().findViewById(R.id.accessFDGetTemperatureCheckField); + if (checkBoxGetTemperatureCheckField.isChecked()) iConfig |= 2; + CheckBox checkBoxGetTemperatureStorageEnable = (CheckBox) getActivity().findViewById(R.id.accessFDGetTemperatureStorageEnable); + if (checkBoxGetTemperatureStorageEnable.isChecked()) iConfig |= 1; + MainActivity.csLibrary4A.set_fdCmdCfg(iConfig); + + EditText editTextStoreOffset = (EditText) getActivity().findViewById(R.id.accessFDStoreOffset); + int iStoreOffset = getEditTextHexValue(editTextStoreOffset, 2); + MainActivity.csLibrary4A.set_fdBlockAddr4GetTemperature(iStoreOffset); + + hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_GET_TEMPERATURE; + break; + case 3: + MainActivity.csLibrary4A.set_fdCmdCfg(operationRead ? 0 : 80); + + if (operationRead) + hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_START_LOGGING; + else { + EditText editText = (EditText) getActivity().findViewById(R.id.selectFDLoggingPassword); + int iPassword = getEditTextHexValue(editText, 8); + MainActivity.csLibrary4A.set_fdPwd(iPassword); + + hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_STOP_LOGGING; + } + break; + case 4: + EditText editText = (EditText) getActivity().findViewById(R.id.accessFDRegOffset); + iValue = getEditTextHexValue(editText, 2); + iValue += 0xC000; + editText.setText(String.format("%04X", iValue)); + + EditText editText1 = (EditText) getActivity().findViewById(R.id.accessFDRegValue); + if (operationRead) { + editText1.setText(""); + MainActivity.csLibrary4A.set_fdRegAddr(iValue); + hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_RDREG; + } else { + int iValue1 = getEditTextHexValue(editText1, 4); + MainActivity.csLibrary4A.set_fdWrite(iValue, iValue1); + hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_WRREG; + } + break; + case 5: + case 6: + case 7: + case 8: + CheckBox checkBox1 = (CheckBox) getActivity().findViewById(R.id.accessFDEnable); + iValue = 0; + if (checkBox1.isChecked()) { + if (position == 8) iValue = 2; + else if (position != 7) iValue = 1; + } + MainActivity.csLibrary4A.set_fdCmdCfg(iValue); + if (position == 5) hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_DEEP_SLEEP; + else if (position == 6) + hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_OPMODE_CHECK; + else if (position == 7) + hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_INIT_REGFILE; + else if (position == 8) + hostCommand = RfidReaderChipData.HostCommands.CMD_FDM_LED_CTRL; + break; + default: + break; + } + } + doAccessTask(hostCommand); + } + + void doAccessTask(RfidReaderChipData.HostCommands hostCommand) { + String selectMask = selectTag.editTextTagID.getText().toString(); + int selectBank = selectTag.spinnerSelectBank.getSelectedItemPosition() + 1; + int selectOffset = Integer.valueOf(selectTag.editTextSelectOffset.getText().toString()); + boolean invalid = false; + accessTask = new AccessTask((operationRead ? buttonRead : buttonWrite), null, invalid, true, + selectMask, selectBank, selectOffset, + selectTag.editTextAccessPassword.getText().toString(), + Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), + hostCommand, + 0, 0, true, false, + null, null, null, null, null); + accessTask.setRunnable(updateRunnable); + accessTask.execute(); + } + + Handler handler = new Handler(); boolean bLogging = false; int iOtherFlowCount = 0, iTimeNumber = 0, iTimeTotal = 0, iDelayToStart = 0; + private final Runnable updateRunnable = new Runnable() { + final boolean DEBUG = true; + @Override + public void run() { + if (accessTask == null) return; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + "accessTask.status = " + accessTask.getStatus().toString()); + if (accessTask.getStatus() == AsyncTask.Status.RUNNING) { + mHandler.postDelayed(updateRunnable, 100); + return; + } + + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + accessTask.accessResult + ": blogging with iOtherFlowCount = " + iOtherFlowCount); + if ((operationReadTemperature || operationReadBattery || operationSetLogging || operationCheckLogging || operationGetLogging) && (iOtherFlowCount == 0)) { + int iValue = 0; + try { + iValue = Integer.parseInt(accessTask.accessResult, 16); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + accessTask.accessResult + ": blogging with iValue = " + iValue); + } catch (Exception ex) { } + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + accessTask.accessResult + ": blogging with iValue after catch = " + iValue); + if ((iValue & 0x1000) != 0) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + accessTask.accessResult + ": blogging A is true"); + bLogging = true; + if (operationCheckLogging == false && operationGetLogging == false) { + iOtherFlowCount = 99; + accessTask.accessResult += ": logging is in processed"; + } + } else bLogging = false; + if (operationReadBattery && (iValue & 0x0100) == 0) { + iOtherFlowCount = 99; + accessTask.accessResult += ": less than 0.9V or no battery."; + } + } + if (operationGetLogging) { + switch (iOtherFlowCount) { + case 0: + MainActivity.csLibrary4A.set_fdReadMem(0, 12); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_RDMEM); + break; + case 1: + if (DEBUG) MainActivity.csLibrary4A.appendToLog("case 1: bLogging = " + bLogging + ", accessTask.accessResult = " + accessTask.accessResult); + if (accessTask.accessResult != null) { + Date date = null; + long lDateTime = -1; + int iDelay = -1, iInterval = -1; + if (accessTask.accessResult.length() >= 24) { + try { + String strDateTime = accessTask.accessResult.substring(6, 8); + strDateTime += accessTask.accessResult.substring(4, 6); + strDateTime += accessTask.accessResult.substring(2, 4); + strDateTime += accessTask.accessResult.substring(0, 2); + lDateTime = 1000 * Long.parseLong(strDateTime, 16); + + String strDelay = accessTask.accessResult.substring(18, 20); + strDelay += accessTask.accessResult.substring(16, 18); + iDelay = Integer.parseInt(strDelay, 16); + + String strInterval = accessTask.accessResult.substring(22, 24); + strInterval += accessTask.accessResult.substring(20, 22); + iInterval = Integer.parseInt(strInterval, 16); + } catch(Exception ex) { } + if (iInterval != -1) { + date = new Date(); + date.setTime(lDateTime); + textViewLoggingValue1.append("Start: " + formatter.format(date) + "\n"); + textViewLoggingValue1.append("delay: " + iDelay + " minutes\n"); + textViewLoggingValue1.append("interval: " + iInterval + " seconds\n"); + } + logData = new LogData(); + logData.dateLogStart = date; + logData.minLogStartDelay = iDelay; + logData.secLogSampleInterval = iInterval; + } + } + if (bLogging) { + MainActivity.csLibrary4A.set_fdRegAddr(0xc094); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_RDREG); + } else { + MainActivity.csLibrary4A.set_fdReadMem(0xb188, 4); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_RDMEM); + } + break; + case 2: + if (DEBUG) MainActivity.csLibrary4A.appendToLog("bLogging = " + bLogging + ", accessTask.accessResult = " + accessTask.accessResult); + if (bLogging) { + operationGetLogging = false; + int iValue = 0; + try { + iValue = Integer.parseInt(accessTask.accessResult.substring(2,4), 16) & 0x30; + } catch (Exception ex) { } + String strMessage = ""; + if (iValue == 0x10) strMessage = "Initial Delay Start"; + else if (iValue == 0x20) strMessage = "Logging in Progress"; + else if (iValue == 00) strMessage = "non-rtc"; + textViewLoggingValue1.setText(accessTask.accessResult + ": " + strMessage + "\n"); + break; + } else { + String strTemp = accessTask.accessResult; + iTimeTotal = Integer.parseInt(strTemp.substring(2, 4) + strTemp.substring(0, 2), 16); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("iTimeTotal is set to " + iTimeTotal + ", with strTemp = " + strTemp); + textViewLoggingValue1.append("status: " + accessTask.accessResult + "\n"); + iTimeTotal++; + } + logData.iSampleSize = 0; + default: + if (DEBUG) MainActivity.csLibrary4A.appendToLog("iOtherFlowCount = " + iOtherFlowCount + ", accessTask.accessResult = " + accessTask.accessResult); + if (iOtherFlowCount != 2) { + String strMessage = ""; //accessTask.accessResult + ": "; + String strAccessResult = accessTask.accessResult.substring(6, 8) + accessTask.accessResult.substring(4, 6) + accessTask.accessResult.substring(2, 4) + accessTask.accessResult.substring(0, 2); + Long lValue = Long.parseLong(strAccessResult, 16); + int iOddBit = 0; + if (DEBUG) MainActivity.csLibrary4A.appendToLog(String.format("accessResult to lValue = %X", lValue)); + for (int i = 0; i < 32; i++) { + if ((lValue & 1) != 0) { + iOddBit++; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("accessResult, i=" + i + ", iOddbit=" + iOddBit); + } + lValue = lValue >> 1; + } + if ((iOddBit & 1) != 0) + strMessage += ("invalid checksum, " + strAccessResult); + else { + iTimeNumber = Integer.parseInt(strAccessResult.substring(0, 4), 16) & 0x7FFF; + strMessage += ("item " + iTimeNumber + ": "); + int iTemperature = Integer.parseInt(strAccessResult.substring(5, 8), 16) & 0x3FF; + strMessage += i2TemperatureString(iTemperature); + logData.iSampleSize++; + } + textViewLoggingValue1.append(strMessage + "\n"); + } + + if (iTimeTotal <= (iOtherFlowCount - 2) || bLogging) { + textViewLoggingValue1.append("end of logging data\n"); + operationGetLogging = false; + commandSelected(spinnerSelectCommand.getSelectedItemPosition()); + } + else { + int iValue = 0x1000 + (iOtherFlowCount - 2) * 4; + MainActivity.csLibrary4A.set_fdReadMem(iValue, 4); + if (DEBUG) MainActivity.csLibrary4A.appendToLog(String.format("set_fdReadMem address = 0x%04x", iValue)); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_RDMEM); + } + break; + } + iOtherFlowCount++; + } else if (operationCheckLogging) { + switch (iOtherFlowCount) { + case 0: + if (DEBUG) MainActivity.csLibrary4A.appendToLog(accessTask.accessResult + ": blogging B is " + bLogging); + if (bLogging) { + MainActivity.csLibrary4A.set_fdRegAddr(0xc096); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_RDREG); + } else { + MainActivity.csLibrary4A.set_fdReadMem(0xb188, 4); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_RDMEM); + } + break; + default: + operationCheckLogging = false; + textViewLoggingValue.setText(accessTask.accessResult); + commandSelected(spinnerSelectCommand.getSelectedItemPosition()); + break; + } + iOtherFlowCount++; + } else if (operationSetLogging) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + "operationSetLogging: iOtherFlowCount = " + iOtherFlowCount + ", accessResult = " + accessTask.accessResult + ", resultError= " + accessTask.resultError); + switch (iOtherFlowCount) { + case 0: //0x4cb3,29d6 + CheckBox checkBox = (CheckBox) getActivity().findViewById(R.id.accessFDenableLEDAutoFlash); + long lValue = 0x4db229d6; + if (checkBox.isChecked()) { + lValue |= 0x2000; lValue &= ~0x20; + lValue &= 0xFFFFFFFF; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + "lValue = " + String.format("%08x", lValue)); + } else { + lValue &= ~0x2000; lValue |= 0x20; + lValue &= 0xFFFFFFFF; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + "lValue1 = " + String.format("%08x", lValue)); + } + MainActivity.csLibrary4A.set_fdWriteMem(0xb040, 4, lValue); //~user_cfg1,user_cfg1,~user_cfg0,user_cfg0: default as 0xd629b34c + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRMEM); + logData = new LogData(); + break; + case 1: + int iValue0 = 3; + try { + iValue0 = Integer.parseInt(editTextCntLimit.getText().toString()); + } catch (Exception ex) { + } + editTextCntLimit.setText(String.valueOf(iValue0)); + + String string1 = String.format("%04X", iValue0); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + "accessResult: string1 = " + string1); + String string2 = string1.substring(2, 4) + string1.substring(0, 2) + "0000"; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + "accessResult: string2 = " + string2); + int iValue = Integer.parseInt(string2, 16); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + String.format("accessResult: iValue = %X, iValue1 = %X", iValue0, iValue)); + + MainActivity.csLibrary4A.set_fdWriteMem(0xb094, 4, iValue); //rtc_cnt_limit: default as 0x00000003 + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRMEM); + break; + case 2: + MainActivity.csLibrary4A.set_fdWriteMem(0xb0a4, 4, 0x0A000100); //vdet_alarm_step_cfg, vdet_step_cfg: default as 0 + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRMEM); + break; + case 3: + iValue = 1; + try { + iValue = Integer.parseInt(editTextDelayStart.getText().toString()); + } catch (Exception ex) { } + iDelayToStart = iValue; + editTextDelayStart.setText(String.valueOf(iValue)); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + String.format("accessResult: iValue = %X", iValue)); + + MainActivity.csLibrary4A.set_fdWrite(0xc084, iValue); //vdet_delay_cfg: default as 0xffff in minute + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRREG); + logData.minLogStartDelay = iValue; + break; + case 4: + iValue = 1; + try { + iValue = Integer.parseInt(editTextStep.getText().toString()); + } catch (Exception ex) { } + editTextStep.setText(String.valueOf(iValue)); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + String.format("accessResult: iValue = %X", iValue)); + + MainActivity.csLibrary4A.set_fdWrite(0xc085, iValue); //vdet_step_cfg: default as 0xffff in seconds + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRREG); + logData.secLogSampleInterval = iValue; + break; + case 5: + MainActivity.csLibrary4A.set_fdWrite(0xc099, 0); //summary_min_temperature: default 0 + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRREG); + break; + case 6: + MainActivity.csLibrary4A.set_fdWrite(0xc098, 0x100); //summary_max_temperature: default 0 + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRREG); + break; + case 7: + MainActivity.csLibrary4A.set_fdRegAddr(0xc084); //vdet_delay_cfg: default as 0xffff in minute + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_RDREG); + break; + case 8: + iValue = -1; + try { + iValue = Integer.parseInt(accessTask.accessResult); + } catch (Exception ex) { } + if (iValue != iDelayToStart) { + iOtherFlowCount = 99; + accessTask.accessResult += ": logging failure"; + textViewLoggingValue.setText(accessTask.accessResult); + break; + } + MainActivity.csLibrary4A.set_fdCmdCfg(0); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_START_LOGGING); + break; + case 9: + Date date = new Date(); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + "Current time is " + formatter.format(date)); + + long longTemp = date.getTime() / 1000; + Long longValue = ((longTemp & 0xFF) << 24); + longValue |= ((longTemp & 0xFF00) << 8) ; + longValue |= ((longTemp & 0xFF0000) >> 8); + longValue |= ((longTemp & 0xFF000000) >> 24) ; + MainActivity.csLibrary4A.set_fdWriteMem(0, 4, longValue); //rtc_cnt_limit: default as 0x00000003 + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRMEM); + break; + case 10: + longValue = (((long)logData.minLogStartDelay & 0xFF) << 24); + longValue |= ((logData.minLogStartDelay & 0xFF00) << 8) ; + longValue |= ((logData.secLogSampleInterval & 0XFF) << 8 ); + longValue |= ((logData.secLogSampleInterval & 0xFF00) >> 8) ; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: " + String.format("longValue = %08x, minLogStartDelay = %04x, secLogSampleInterval = %04x", longValue, logData.minLogStartDelay, logData.secLogSampleInterval)); + MainActivity.csLibrary4A.set_fdWriteMem(8, 4, longValue); //rtc_cnt_limit: default as 0x00000003 + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRMEM); + break; + default: + operationSetLogging = false; + if (iOtherFlowCount < 88) { + String strMessage = accessTask.accessResult; + iValue = Integer.parseInt(accessTask.accessResult, 16); + if (iValue != 0xFFFF) strMessage += ": Logging Program Started\n"; + else strMessage += ": invalid logging. Please stop it and try again.\n"; + textViewLoggingValue.setText(strMessage); + } else textViewLoggingValue.setText(accessTask.accessResult); + commandSelected(spinnerSelectCommand.getSelectedItemPosition()); + break; + } + iOtherFlowCount++; + } + else if (operationReadBattery) { + switch(iOtherFlowCount) { + case 0: + MainActivity.csLibrary4A.set_fdWrite(0xc012, 0x0008); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRREG); + break; + case 1: + MainActivity.csLibrary4A.set_fdCmdCfg(0x12); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_GET_TEMPERATURE); + break; + case 2: + MainActivity.csLibrary4A.set_fdCmdCfg(0x92); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_GET_TEMPERATURE); + break; + default: + operationReadBattery = false; + if (iOtherFlowCount < 88) { + int iValue = 0; + try { + iValue = Integer.parseInt(accessTask.accessResult, 16); + float fValue = (float) (iValue & 0xFFFF); + fValue = fValue / 8192 * (float) 2.5; + textViewBatteryValue.setText(String.format("%.2fV", fValue)); + } catch (Exception ex) { + } + } else textViewBatteryValue.setText(accessTask.accessResult); + commandSelected(spinnerSelectCommand.getSelectedItemPosition()); + break; + } + iOtherFlowCount++; + } + else if (operationReadTemperature) { + switch(iOtherFlowCount) { + case 0: + MainActivity.csLibrary4A.set_fdWrite(0xc012, 0x0000); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRREG); + break; + case 1: + MainActivity.csLibrary4A.set_fdCmdCfg(0x06); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_GET_TEMPERATURE); + break; + case 2: + MainActivity.csLibrary4A.set_fdCmdCfg(0x86); + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_GET_TEMPERATURE); + break; + default: + operationReadTemperature = false; + if (iOtherFlowCount < 88) { + int iValue = 0; + try { + iValue = Integer.parseInt(accessTask.accessResult, 16); + if ((iValue & 0x8000) != 0) + textViewTemperatureValue.setText("Store addr overflow"); + else textViewTemperatureValue.setText(i2TemperatureString(iValue)); + } catch (Exception ex) { + } + } else textViewTemperatureValue.setText(accessTask.accessResult); + commandSelected(spinnerSelectCommand.getSelectedItemPosition()); + break; + } + iOtherFlowCount++; + } else { + int position = spinnerSelectCommand.getSelectedItemPosition(); + if (operationStopLogging) { + operationStopLogging = false; + position = 3; operationRead = false; + } + switch (position) { + case 0: + if (operationRead) editTextMemoryValue.setText(accessTask.accessResult); + break; + case 1: + int iValue = Integer.parseInt(accessTask.accessResult, 16); + String strMessage = accessTask.accessResult + ":"; + switch (iValue & 0x7) { + case 0: + strMessage = "User area"; + break; + case 3: + strMessage = "Unlock"; + break; + case 4: + strMessage = "Stop loggging"; + break; + } + strMessage += " password:\nAuth is "; + if ((iValue & 0x80) != 0) strMessage += "passed"; + else strMessage += "failed"; + strMessage += "\nPassword is "; + if ((iValue & 0x40) != 0) strMessage += "zero"; + else strMessage += "non-zero"; + CustomPopupWindow customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart(strMessage, false); + break; + case 2: + if (DEBUG) MainActivity.csLibrary4A.appendToLog("accessResult = " + accessTask.accessResult); + strMessage = accessTask.accessResult; + CheckBox checkBoxGetTemperatureResultType = (CheckBox) getActivity().findViewById(R.id.accessFDGetTemperatureResultType); + if (operationRead) { + iValue = Integer.parseInt(strMessage, 16); + if ((iValue & 0x8000) != 0) strMessage += ": store addr overflow"; + else if (checkBoxGetTemperatureResultType.isChecked()) { + strMessage += ": temperature = "; + strMessage += i2TemperatureString(iValue); + } else + strMessage += String.format(": raw temperature data = %X", iValue & 0x1FFF); + } else { + if (strMessage.matches("FFFA")) strMessage += ": enough field energy"; + else if (strMessage.matches("FFF5")) + strMessage += ": insufficient field energy"; + else if (strMessage.matches("FFF0")) + strMessage += ": not yet enable field check"; + } + customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart(strMessage, false); + break; + case 3: + textViewLoggingValue.setText(accessTask.accessResult); + strMessage = accessTask.accessResult.trim(); + if (operationRead) { + if (strMessage.matches("0000")) strMessage = null; + } else { + iValue = Integer.parseInt(strMessage, 16); + if ((iValue & 2) != 0) strMessage += ": password check is failed"; + if ((iValue & 1) != 0) strMessage += ": RTC stop password is all zero"; + } + if (strMessage != null) { + customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart(strMessage, false); + } + break; + case 4: + strMessage = null; + if (operationRead) { + if (false && accessTask.accessResult.matches("FFFF")) + strMessage = accessTask.accessResult + ": invalid empty address"; + else { + EditText editText = (EditText) getActivity().findViewById(R.id.accessFDRegValue); + editText.setText(accessTask.accessResult); + } + } else { + iValue = 0; + try { + iValue = Integer.parseInt(accessTask.accessResult, 16); + } catch (Exception ex) { + } + if (iValue != 0) { + strMessage = accessTask.accessResult; + if (iValue == (byte) 0xFFFF) strMessage += ": invalid/busy address"; + else { + if ((iValue & 0x4) != 0) + strMessage += ": the register cannot be written"; + if ((iValue & 0x02) != 0) + strMessage += ": invalid register addresss"; + } + } + } + if (strMessage != null) { + customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart(strMessage, false); + } + break; + case 5: + case 7: + case 8: + strMessage = accessTask.accessResult.trim(); + if (strMessage != null && strMessage.length() != 0 && strMessage.matches("0000") == false) { + customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart(strMessage, false); + } + if (position == 8 && iOtherFlowCount == 0) { + iOtherFlowCount++; + MainActivity.csLibrary4A.set_fdWriteMem(0xb040, 4, 0x4db229d6); //~user_cfg1,user_cfg1,~user_cfg0,user_cfg0: default as 0xd629b34c + doAccessTask(RfidReaderChipData.HostCommands.CMD_FDM_WRMEM); + } + break; + case 6: + strMessage = accessTask.accessResult; + iValue = Integer.parseInt(strMessage, 16); + if ((iValue & 0x2000) != 0) strMessage += ": user_access_en"; + if ((iValue & 0x1000) != 0) strMessage += ": rtc logging"; + if ((iValue & 0x800) != 0) strMessage += ": vdet_process_flag"; + if ((iValue & 0x200) != 0) strMessage += ": light_chk_flag"; + if ((iValue & 0x100) != 0) strMessage += ": vbat_pwr_flag"; + customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart(strMessage, false); + break; + default: + break; + } + } + } + }; + + String i2TemperatureString(int iValue) { + String strMessage = ""; + if ((iValue & 0x200) != 0) { + strMessage += "-"; + iValue ^= 0x3FF; + iValue++; + } + if (true) { //8 bit data, 2 bit decimal + strMessage += String.format("%d.", (iValue >> 2) & 0xFF); + strMessage += String.format("%d\u2103", (iValue & 3) * 100 / 4); + } else { //7 bit data, 3 bit decimal + strMessage += String.format("%d.", (iValue >> 3) & 0x7F); + strMessage += String.format("%d\u2103", (iValue & 7) * 1000 / 8); + } + return strMessage; + } + + int getEditTextHexValue(EditText editText, int iStrLen) { + String strValue = editText.getText().toString().trim(); + MainActivity.csLibrary4A.appendToLog("getEditTextHexValue: editText.string=" + strValue + ", iStrLen=" + iStrLen); + if (strValue.length() > iStrLen) strValue = strValue.substring(strValue.length() - iStrLen); + int iValue = 0; + try { + iValue = Integer.parseInt(strValue, 16); + } catch (Exception ex) { } + int iValue2 = 0; + for (int i = 0; i < iStrLen; i++) { iValue2 <<= 4; iValue2 |= 0xFF; } + strValue = String.format("%0" + String.valueOf(iStrLen) + "X", iValue & iValue2); + MainActivity.csLibrary4A.appendToLog("getEditTextHexValue: exit string = " + strValue); + editText.setText(strValue); + return iValue; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_IMPINJ; + +import android.app.Activity; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.SystemClock; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.AccessTask1; +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SelectTag; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; +import com.google.android.material.tabs.TabLayout; + +public class AccessImpinjFragment extends CommonFragment { + CheckBox checkBoxTagFocus, checkBoxFastId, checkBoxProtectSelect, checkBoxAutoTuneDisable, checkBoxProtect, checkBoxShortRange, checkBoxMemorySelect, checkBoxUnkillable; + Spinner spinnerTagSelect; + + TextView textViewUserValue; + Button buttonReadUserBank, buttonWriteUserBank; + TextView textViewRunTime; + enum impinjTag { + m775, m780, m830, m770, m730, monza_R6A, monza_R6P, monza_x8k, others + } + + SelectTag selectTag; + TextView textViewAuthenticatedResult, textViewAutotuneValue, textViewProtectValue, textViewProtectNormalValue, textViewEpc128Value, textViewConfiguration; + Button button, buttonAutoTuneValueRead, buttonProtectValueRead, buttonProtectResumeRead, buttonEpc128ValueRead, buttonRead, buttonWrite; + boolean operationRead = false; + AccessTask accessTask; + AccessTask1 accessTask1; + int iRunType = -1; String stringNewAutoTuneConfig = null; + int unprotecting = 0; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_impinj, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + checkBoxTagFocus = (CheckBox) getActivity().findViewById(R.id.accessImpinjTagFocus); + if (MainActivity.csLibrary4A.get98XX() == 2) checkBoxTagFocus.setText(checkBoxTagFocus.getText().toString() + " (When enabled, tag select is disabled.)"); + MainActivity.csLibrary4A.appendToLog("CheckBoxTagFocus is set"); + checkBoxFastId = (CheckBox) getActivity().findViewById(R.id.accessImpinjFastId); + + checkBoxAutoTuneDisable = (CheckBox) getActivity().findViewById(R.id.accessImpinjAutoTune); + checkBoxProtect = (CheckBox) getActivity().findViewById(R.id.accessImpinjProtect); + checkBoxShortRange = (CheckBox) getActivity().findViewById(R.id.accessImpinjShortRange); + checkBoxMemorySelect = (CheckBox) getActivity().findViewById(R.id.accessImpinjMemorySelect); + checkBoxUnkillable = (CheckBox) getActivity().findViewById(R.id.accessImpinjUnkillable); + + spinnerTagSelect = (Spinner) getActivity().findViewById(R.id.accessImpinjTagSelect); + ArrayAdapter targetAdapter1 = ArrayAdapter.createFromResource(getActivity(), R.array.impinj_options, R.layout.custom_spinner_layout); + targetAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerTagSelect.setAdapter(targetAdapter1); spinnerTagSelect.setSelection(0); + spinnerTagSelect.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + TabLayout.TabView tabView = tabLayout.getTabAt(2).view; + //LinearLayout layout = (LinearLayout) getActivity().findViewById(R.id.accessImpinjAuthenticateLayout); + if (position == impinjTag.m775.ordinal()) { + //layout.setVisibility(View.VISIBLE); + textViewAuthenticatedResult.setText(""); + tabView.setVisibility(View.VISIBLE); + } else { + //layout.setVisibility(View.GONE); + tabView.setVisibility(View.GONE); + } + + LinearLayout layoutA = (LinearLayout) getActivity().findViewById(R.id.accessImpinjProtectLayout); + LinearLayout layoutA1 = (LinearLayout) getActivity().findViewById(R.id.accessImpinjProtectLayout1); + if (position == impinjTag.m775.ordinal() || + position == impinjTag.m780.ordinal() || + position == impinjTag.m830.ordinal() || + position == impinjTag.m770.ordinal() || + position == impinjTag.m730.ordinal()) { + layoutA.setVisibility(View.VISIBLE); + layoutA1.setVisibility(View.VISIBLE); + textViewProtectValue.setText(""); + } else { + layoutA.setVisibility(View.GONE); + layoutA1.setVisibility(View.GONE); + } + + LinearLayout layout0 = (LinearLayout) getActivity().findViewById(R.id.accessImpinjMemorySelectLayout); + if (position == impinjTag.m830.ordinal() || position == impinjTag.monza_R6P.ordinal()) { + layout0.setVisibility(View.VISIBLE); + textViewEpc128Value.setText(""); + } else layout0.setVisibility(View.GONE); + + LinearLayout layout1 = (LinearLayout) getActivity().findViewById(R.id.accessImpinjSelectLayout); + if (position == impinjTag.others.ordinal()) layout1.setVisibility(View.GONE); + else layout1.setVisibility(View.VISIBLE); + + LinearLayout layout2 = (LinearLayout) getActivity().findViewById(R.id.accessImpinjAutotuneLayout); + LinearLayout layout3 = (LinearLayout) getActivity().findViewById(R.id.accessImpinjConfigLayout); + if (position == impinjTag.monza_x8k.ordinal() || position == impinjTag.others.ordinal()) { + layout2.setVisibility(View.GONE); + layout3.setVisibility(View.GONE); + } else { + layout2.setVisibility(View.VISIBLE); + layout3.setVisibility(View.VISIBLE); + + textViewAutotuneValue.setText(""); + + if (position == impinjTag.monza_R6A.ordinal() || position == impinjTag.monza_R6P.ordinal() || position == impinjTag.others.ordinal()) checkBoxProtect.setVisibility(View.GONE); + else checkBoxProtect.setVisibility(View.VISIBLE); + if (position == impinjTag.m830.ordinal() || position == impinjTag.monza_R6P.ordinal()) checkBoxMemorySelect.setVisibility(View.VISIBLE); + else checkBoxMemorySelect.setVisibility(View.GONE); + if (position == impinjTag.m775.ordinal() || position == impinjTag.m780.ordinal() || position == impinjTag.m770.ordinal()) checkBoxUnkillable.setVisibility(View.VISIBLE); + else checkBoxUnkillable.setVisibility(View.GONE); + + checkBoxAutoTuneDisable.setChecked(false); checkBoxAutoTuneDisable.setEnabled(false); + checkBoxProtect.setChecked(false); checkBoxProtect.setEnabled(false); + checkBoxShortRange.setChecked(false); checkBoxShortRange.setEnabled(false); + checkBoxMemorySelect.setChecked(false); checkBoxMemorySelect.setEnabled(false); + checkBoxUnkillable.setChecked(false); checkBoxUnkillable.setEnabled(false); + textViewConfiguration.setText(""); + } + + LinearLayout layout4 = (LinearLayout) getActivity().findViewById(R.id.accessImpinjReadUserLayout); + if (position == impinjTag.monza_x8k.ordinal()) layout4.setVisibility(View.VISIBLE); + else layout4.setVisibility(View.GONE); + } + + @Override + public void onNothingSelected(AdapterView parentView) { + // your code here + } + + }); + + MainActivity.csLibrary4A.setSameCheck(false); + data2Restore.iQuerySession = MainActivity.csLibrary4A.getQuerySession(); + data2Restore.iQueryTarget = MainActivity.csLibrary4A.getQueryTarget(); + data2Restore.tagDelay = MainActivity.csLibrary4A.getTagDelay(); + data2Restore.dwellTime = MainActivity.csLibrary4A.getAntennaDwell(); + data2Restore.tagFocus = MainActivity.csLibrary4A.getTagFocus(); + + selectTag = new SelectTag((Activity)getActivity(), 0); + + if (true) { + textViewAuthenticatedResult = (TextView) getActivity().findViewById(R.id.accessImpinjAuthenticatedResult); + button = (Button) getActivity().findViewById(R.id.accessImpinjAuthenticateButton); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isRfidConnectionValid() == false) return; + if (isRunningAccessTask()) return; + + textViewAuthenticatedResult.setText(""); + boolean invalidRequest = MainActivity.csLibrary4A.setAuthenticateConfiguration(); + accessTask = new AccessTask(button, null, false, true, + selectTag.editTextTagID.getText().toString(), 1, 32, + selectTag.editTextAccessPassword.getText().toString(), Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), RfidReaderChipData.HostCommands.CMD_18K6CAUTHENTICATE, + -1, -1, false, false, + null, null, null, null, null); + accessTask.execute(); + + mHandler.removeCallbacks(updateRunnable); + iRunType = 1; mHandler.post(updateRunnable); + } + }); + } + + if (true) { + textViewAutotuneValue = (TextView) getActivity().findViewById(R.id.accessImpinjAutoTuneValue); + buttonAutoTuneValueRead = (Button) getActivity().findViewById(R.id.accessImpinjAutotuneValueButton); + buttonAutoTuneValueRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isRfidConnectionValid() == false) return; + if (isRunningAccessTask()) return; + + textViewAutotuneValue.setText(""); + boolean invalidRequest = false; + int iAccOffset = 0x1c; int itagSelect = spinnerTagSelect.getSelectedItemPosition(); + if (itagSelect == impinjTag.m775.ordinal()) iAccOffset = 0x1c; + else if (itagSelect == impinjTag.m780.ordinal()) iAccOffset = 0x34; + else if (itagSelect == impinjTag.m830.ordinal()) iAccOffset = 0x14; + else if (itagSelect == impinjTag.m770.ordinal()) iAccOffset = 0x1c; + else if (itagSelect == impinjTag.m730.ordinal()) iAccOffset = 0x14; + else if (itagSelect == impinjTag.monza_R6A.ordinal()) iAccOffset = 0x14; + else if (itagSelect == impinjTag.monza_R6P.ordinal()) iAccOffset = 0x14; + MainActivity.csLibrary4A.appendToLog(String.format("AutoTune offset is 0x%X", iAccOffset)); + if (set_before_access(0, itagSelect, 1) == false) invalidRequest = true; + accessTask = new AccessTask(buttonAutoTuneValueRead, null, invalidRequest, true, + selectTag.editTextTagID.getText().toString(), 1, 32, + selectTag.editTextAccessPassword.getText().toString(), Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), RfidReaderChipData.HostCommands.CMD_18K6CREAD, + -1, -1, false, checkProtectedBoxBeforeAccess(), + null, null, null, null, null); + accessTask.execute(); + mHandler.removeCallbacks(updateRunnable); + iRunType = 2; mHandler.post(updateRunnable); + } + }); + + textViewProtectValue = (TextView) getActivity().findViewById(R.id.accessImpinjProtectValue); + checkBoxProtectSelect = (CheckBox) getActivity().findViewById(R.id.accessImpinjProtectSelect); + textViewProtectNormalValue = (TextView) getActivity().findViewById(R.id.accessImpinjProtectNormalValue); + buttonProtectValueRead = (Button) getActivity().findViewById(R.id.accessImpinjProtectValueButton); + buttonProtectValueRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isRfidConnectionValid() == false) return; + if (isRunningAccessTask()) return; + + textViewProtectValue.setText(""); + boolean invalidRequest = false; + if (set_before_access(1, 2, 6) == false) invalidRequest = true; + accessTask = new AccessTask(buttonProtectValueRead, null, invalidRequest, true, + selectTag.editTextTagID.getText().toString(), 1, 32, + selectTag.editTextAccessPassword.getText().toString(), Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), RfidReaderChipData.HostCommands.CMD_18K6CREAD, + -1, -1, false, checkProtectedBoxBeforeAccess(), + null, null, null, null, null); + MainActivity.csLibrary4A.appendToLog("setSelectCriteria: before execute"); + accessTask.execute(); + MainActivity.csLibrary4A.appendToLog("setSelectCriteria: after execute"); + mHandler.removeCallbacks(updateRunnable); + iRunType = 3; mHandler.post(updateRunnable); + } + }); + + buttonProtectResumeRead = (Button) getActivity().findViewById(R.id.accessImpinjProtectResumeButton); + buttonProtectResumeRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isZeroPassword()) return; + if (isRfidConnectionValid() == false) return; + if (isRunningAccessTask()) { + if (accessTask != null) accessTask.taskCancelReason = AccessTask.TaskCancelRReason.DESTORY; + } + + if (unprotecting > 0) stopProtectResuming(); + else { + unprotecting = 1; + if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m775.ordinal()) selectTag.editTextTagID.setText("E2C011A2"); + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m780.ordinal()) selectTag.editTextTagID.setText("E28011C"); + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m770.ordinal()) selectTag.editTextTagID.setText("E28011A0"); + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m830.ordinal()) selectTag.editTextTagID.setText("E28011B0"); + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m730.ordinal()) selectTag.editTextTagID.setText("E280119"); + selectTag.spinnerSelectBank.setSelection(1); + checkBoxProtectSelect.setChecked(true); + buttonProtectResumeRead.setText("Stop resuming to normal"); + + startConfigRead(); + } + } + }); + + textViewEpc128Value = (TextView) getActivity().findViewById(R.id.accessImpinjEpc128Value); + buttonEpc128ValueRead = (Button) getActivity().findViewById(R.id.accessImpinjEpc128ValueButton); + buttonEpc128ValueRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isRfidConnectionValid() == false) return; + if (isRunningAccessTask()) return; + + textViewEpc128Value.setText(""); + boolean invalidRequest = false; + if (set_before_access(1, 2, 8) == false) invalidRequest = true; + accessTask = new AccessTask(buttonEpc128ValueRead, null, invalidRequest, true, + selectTag.editTextTagID.getText().toString(), 1, 32, + selectTag.editTextAccessPassword.getText().toString(), Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), RfidReaderChipData.HostCommands.CMD_18K6CREAD, + -1, -1, false, checkProtectedBoxBeforeAccess(), + null, null, null, null, null); + accessTask.execute(); + mHandler.removeCallbacks(updateRunnable); + iRunType = 4; mHandler.post(updateRunnable); + } + }); + + textViewRunTime = (TextView) getActivity().findViewById(R.id.accessImpinjRunTime); + buttonReadUserBank = (Button) getActivity().findViewById(R.id.accessRWReadButton); + buttonReadUserBank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + operationRead = true; startAccessUserTask(); + } + }); + + buttonWriteUserBank = (Button) getActivity().findViewById(R.id.accessRWWriteButton); + buttonWriteUserBank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + operationRead = false; startAccessUserTask(); + } + }); + + textViewConfiguration = (TextView) getActivity().findViewById(R.id.accessImpinjConfiguration); + buttonRead = (Button) getActivity().findViewById(R.id.accessImpinjReadButton); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isRfidConnectionValid() == false) return; + if (isRunningAccessTask()) return; + + startConfigRead(); + } + }); + + buttonWrite = (Button) getActivity().findViewById(R.id.accessImpinjWriteButton); + buttonWrite.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isZeroPassword()) return; + if (isRfidConnectionValid() == false) return; + if (isRunningAccessTask()) return; + + if (textViewConfiguration.getText().toString().length() < 4) { + Toast.makeText(MainActivity.mContext, "Please read configuration first", Toast.LENGTH_SHORT).show(); + return; + } + startConfigWrite(); + } + }); + } + } + boolean isZeroPassword() { + boolean bValue = false; + int iValue = 0; + try { + iValue = Integer.parseInt(selectTag.editTextAccessPassword.getText().toString(), 16); + } catch (Exception ex) { + iValue = -1; + } + MainActivity.csLibrary4A.appendToLog("Password = " + iValue); + if (iValue == 0) { + CustomPopupWindow customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart("Before operation, please enter non-zero access password !!!", false); + bValue = true; + } + return bValue; + } + void stopProtectResuming() { + unprotecting = 0; + checkBoxProtectSelect.setChecked(false); + buttonProtectResumeRead.setText("Resume invisible tag to normal"); + } + + boolean updating = false; long msStartTime; int bankProcessing = 0; int restartAccessBank = -1; + void startAccessUserTask() { + msStartTime = SystemClock.elapsedRealtime(); + textViewRunTime.setText(""); + + int iSelectBank = selectTag.spinnerSelectBank.getSelectedItemPosition() + 1; + int iSelectOffset = 32; + if (iSelectBank != 1) iSelectOffset = 0; + + EditText editTextBlockCount = (EditText) getActivity().findViewById(R.id.accessImpinjBlockCount); + EditText editTextUserOffset = (EditText) getActivity().findViewById(R.id.accessImpinjUserOffset); + EditText editTextUserLength = (EditText) getActivity().findViewById(R.id.accessImpinjUserLength); + int accBlockCount = 32, accOffset = 1, accSize = 1; + try { + accBlockCount = Integer.parseInt(editTextBlockCount.getText().toString()); + } catch (Exception ex) { } + try { + accOffset = Integer.valueOf(editTextUserOffset.getText().toString(), 10); + } catch (Exception ex) { } + try { + accSize = Integer.valueOf(editTextUserLength.getText().toString(), 10); + } catch (Exception ex) { } + + textViewUserValue = (TextView) getActivity().findViewById(R.id.accessImpinjUserValue); + if (operationRead) textViewUserValue.setText(""); + boolean invalidRequest = false; + + MainActivity.csLibrary4A.appendToLog("Start accessTask1 with accBlockCount + " + accBlockCount + "F" + editTextBlockCount.getText().toString() + ", accOffset = " + accOffset + "F" + editTextUserOffset.getText().toString() + ", accSize = " + accSize + "F" + editTextUserLength.getText().toString()); + accessTask1 = new AccessTask1( + (operationRead ? buttonReadUserBank : buttonWriteUserBank), invalidRequest, + 3, accOffset, accSize, accBlockCount, null, + selectTag.editTextTagID.getText().toString(), iSelectBank, iSelectOffset, + selectTag.editTextAccessPassword.getText().toString(), + Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), + (operationRead ? RfidReaderChipData.HostCommands.CMD_18K6CREAD: RfidReaderChipData.HostCommands.CMD_18K6CWRITE), updateRunnable); + accessTask1.execute(); + iRunType = 7; + } + void startConfigRead() { + textViewConfiguration.setText(""); + boolean invalidRequest = false; + if (set_before_access(0, 4, 1) == false) invalidRequest = true; + int iSelectBank = selectTag.spinnerSelectBank.getSelectedItemPosition() + 1; + int iSelectOffset = 32; + if (iSelectBank != 1) iSelectOffset = 0; + accessTask = new AccessTask(buttonRead, null, invalidRequest, true, + selectTag.editTextTagID.getText().toString(), iSelectBank, iSelectOffset, + selectTag.editTextAccessPassword.getText().toString(), Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), RfidReaderChipData.HostCommands.CMD_18K6CREAD, + -1, -1, false, checkProtectedBoxBeforeAccess(), + null, null, null, null, null); + accessTask.execute(); + mHandler.removeCallbacks(updateRunnable); + iRunType = 5; mHandler.post(updateRunnable); + } + void startConfigWrite() { + boolean invalidRequest = false; + if (set_before_access(0, 4, 1) == false) invalidRequest = true; + int iSelectBank = selectTag.spinnerSelectBank.getSelectedItemPosition() + 1; + int iSelectOffset = 32; + if (iSelectBank != 1) iSelectOffset = 0; + if (invalidRequest == false) { + String string = textViewConfiguration.getText().toString(); + int iValue = Integer.valueOf(string, 16); + MainActivity.csLibrary4A.appendToLog(String.format("iValue = 0x%02X", iValue)); + + if (checkBoxAutoTuneDisable.isChecked()) iValue |= 0x01; + else iValue &= ~0x01; + + if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m775.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m780.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m830.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m770.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m730.ordinal()) { + if (checkBoxProtect.isChecked()) iValue |= 0x02; + else iValue &= ~0x02; + } + + int iValueModified = 0x02; + if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m775.ordinal()) iValueModified = 0x04; + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m780.ordinal()) iValueModified = 0x04; + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m770.ordinal()) iValueModified = 0x04; + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m830.ordinal()) iValueModified = 0x10; + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m730.ordinal()) iValueModified = 0x10; + if (checkBoxShortRange.isChecked()) iValue |= iValueModified; + else iValue &= ~iValueModified; + + iValueModified = 0; + if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m830.ordinal()) iValueModified = 0x08; + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.monza_R6P.ordinal()) iValueModified = 0x04; + if (iValueModified != 0) { + if (checkBoxMemorySelect.isChecked()) iValue |= iValueModified; + else iValue &= ~iValueModified; + } + + if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m775.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m780.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m770.ordinal()) { + if (checkBoxUnkillable.isChecked()) iValue |= 0x08; + else iValue &= ~0x08; + } + + MainActivity.csLibrary4A.appendToLog(String.format("revised iValue = 0x%02X", iValue)); + string = String.format("%04X", iValue); + MainActivity.csLibrary4A.appendToLog("string = " + string); + MainActivity.csLibrary4A.appendToLog("new AutotuneConfiguration = " + string); + stringNewAutoTuneConfig = string; + if (MainActivity.csLibrary4A.setAccessWriteData(string) == false) { + invalidRequest = true; + } + } + + accessTask = new AccessTask(buttonWrite, null, invalidRequest, true, + selectTag.editTextTagID.getText().toString(), 1, 32, + selectTag.editTextAccessPassword.getText().toString(), Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), RfidReaderChipData.HostCommands.CMD_18K6CWRITE, + -1, -1, false, checkProtectedBoxBeforeAccess(), + null, null, null, null, null); + accessTask.execute(); + mHandler.removeCallbacks(updateRunnable); + iRunType = 6; mHandler.post(updateRunnable); + } + boolean bReadySelected = false; + boolean checkProtectedBoxBeforeAccess() { + bReadySelected = false; + if (checkBoxProtectSelect.isChecked()) { + MainActivity.csLibrary4A.appendToLog("Going to setSelectCriteria disable"); + MainActivity.csLibrary4A.setSelectCriteriaDisable(-1); + MainActivity.csLibrary4A.appendToLog("Going to setSelectCriteria"); + MainActivity.csLibrary4A.setSelectCriteria(-1, true, 4, 0, 3, 0, selectTag.editTextAccessPassword.getText().toString(), false); + bReadySelected = true; + } + return checkBoxProtectSelect.isChecked(); + } + boolean isRfidConnectionValid() { + boolean bValue = false; + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + } else bValue = true; + return bValue; + } + boolean set_before_access(int accBank, int accOffset, int accSize) { + boolean invalidRequest = false; + if (invalidRequest == false) { + if (MainActivity.csLibrary4A.setAccessBank(accBank) == false) { + MainActivity.csLibrary4A.appendToLog("HelloK: accBank, invalidRequest=" + invalidRequest); + invalidRequest = true; + } + } + if (invalidRequest == false) { + if (MainActivity.csLibrary4A.setAccessOffset(accOffset) == false) { + MainActivity.csLibrary4A.appendToLog("HelloK: accOffset, invalidRequest=" + invalidRequest); + invalidRequest = true; + } + } + if (invalidRequest == false) { + if (MainActivity.csLibrary4A.setAccessCount(accSize) == false) { + invalidRequest = true; + } + } + if (invalidRequest) return false; + return true; + } + + boolean isRunningAccessTask() { + boolean retValue = false; + if (accessTask != null) { + if (accessTask.getStatus() != AsyncTask.Status.FINISHED) retValue = true; + } + return retValue; + } + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + if (accessTask == null && accessTask1 == null) { + MainActivity.csLibrary4A.appendToLog("updateRunnable(): null AccessTask"); + } else if (accessTask != null && accessTask.getStatus() == AsyncTask.Status.FINISHED) { + MainActivity.csLibrary4A.appendToLog("accessResult = " + accessTask.accessResult + " with iRunType = " + iRunType); + if (accessTask.accessResult == null) { + MainActivity.csLibrary4A.appendToLog("updateRunnable(): accessTask is finished without result but with error = " + accessTask.resultError); + if (unprotecting > 0) stopProtectResuming(); + } else if (iRunType == 1) textViewAuthenticatedResult.setText(accessTask.accessResult); + else if (iRunType == 2) textViewAutotuneValue.setText(accessTask.accessResult); + else if (iRunType == 3) textViewProtectValue.setText(accessTask.accessResult); + else if (iRunType == 4) textViewEpc128Value.setText(accessTask.accessResult); + else if (iRunType == 5) { + textViewConfiguration.setText(accessTask.accessResult); + int iValue = Integer.valueOf(accessTask.accessResult.substring(accessTask.accessResult.length()-2, accessTask.accessResult.length()), 16); + MainActivity.csLibrary4A.appendToLog("updateRunnable(): " + String.format("accessResult = %s, iValue = 0x%02X", accessTask.accessResult, iValue)); + + if ((iValue & 0x01) != 0) checkBoxAutoTuneDisable.setChecked(true); else checkBoxAutoTuneDisable.setChecked(false); + checkBoxAutoTuneDisable.setEnabled(true); + + if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m775.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m780.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m830.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m770.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m730.ordinal()) { + if ((iValue & 0x02) != 0) checkBoxProtect.setChecked(true); else checkBoxProtect.setChecked(false); + checkBoxProtect.setEnabled(true); + } + + int iBitCompared = 0x02; + if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m775.ordinal()) iBitCompared = 0x04; + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m780.ordinal()) iBitCompared = 0x04; + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m770.ordinal()) iBitCompared = 0x04; + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m830.ordinal()) iBitCompared = 0x10; + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m730.ordinal()) iBitCompared = 0x10; + if ((iValue & iBitCompared) != 0) checkBoxShortRange.setChecked(true); else checkBoxShortRange.setChecked(false); + checkBoxShortRange.setEnabled(true); + + iBitCompared = 0; + if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m830.ordinal()) iBitCompared = 0x08; + else if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.monza_R6P.ordinal()) iBitCompared = 0x04; + if (iBitCompared != 0) { + if ((iValue & iBitCompared) != 0) checkBoxMemorySelect.setChecked(true); else checkBoxMemorySelect.setChecked(false); + checkBoxMemorySelect.setEnabled(true); + } + + if (spinnerTagSelect.getSelectedItemPosition() == impinjTag.m775.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m780.ordinal() || + spinnerTagSelect.getSelectedItemPosition() == impinjTag.m770.ordinal()) { + if ((iValue & 0x08) != 0) checkBoxUnkillable.setChecked(true); + else checkBoxUnkillable.setChecked(false); + checkBoxUnkillable.setEnabled(true); + } + + if (unprotecting > 0) { + textViewProtectValue.setText(accessTask.accessTagEpc); + textViewProtectNormalValue.setText("" + unprotecting); + unprotecting++; + if (checkBoxProtect.isChecked()) { + selectTag.editTextTagID.setText(accessTask.accessTagEpc); + selectTag.spinnerSelectBank.setSelection(0); + checkBoxProtect.setChecked(false); + MainActivity.csLibrary4A.appendToLog("updateRunnable(): startConfigWrite"); + startConfigWrite(); + } else { + MainActivity.csLibrary4A.appendToLog("updateRunnable(): startConfigRead"); + startConfigRead(); + } + } + } + else if (iRunType == 6) { + MainActivity.csLibrary4A.appendToLog("updateRunnable(): accessResult = " + accessTask.accessResult + ", accessError = " + accessTask.resultError); + if (accessTask.resultError.trim().length() != 0) Toast.makeText(MainActivity.mContext, accessTask.resultError, Toast.LENGTH_SHORT).show(); + else if (accessTask.accessResult.length() == 0) textViewConfiguration.setText(stringNewAutoTuneConfig); + + if (unprotecting > 0) stopProtectResuming(); + } + else if (iRunType == 7) textViewUserValue.setText(accessTask.accessResult); + else MainActivity.csLibrary4A.appendToLog("updateRunnable(): No procedure for iRunType == " + iRunType); + } else if (accessTask1 != null && accessTask1.isResultReady()) { + long duration = SystemClock.elapsedRealtime() - msStartTime; + textViewRunTime.setText(String.format("Run time: %.2f sec", ((float) duration / 1000))); MainActivity.csLibrary4A.appendToLog("StreamOut: End of running time"); + MainActivity.csLibrary4A.appendToLog("access1Result = " + accessTask1.getResult() + " with iRunType = " + iRunType); + if (iRunType == 7) textViewUserValue.setText(accessTask1.getResult()); + else MainActivity.csLibrary4A.appendToLog("updateRunnable(): No procedure for iRunType == " + iRunType); + }else { +// MainActivity.csLibrary4A.appendToLog("updateRunnable(): rerun after 100ms with accessTask.getStatus() = " + accessTask.getStatus().toString()); + mHandler.postDelayed(updateRunnable, 100); + } + } + }; + class Data2Restore { + int iQuerySession; + int iQueryTarget; + byte tagDelay; + long dwellTime; + int tagFocus; + } + Data2Restore data2Restore = new Data2Restore(); + + @Override + public void onDestroy() { + MainActivity.csLibrary4A.abortOperation(); + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.setTagGroup(MainActivity.csLibrary4A.getQuerySelect(), data2Restore.iQuerySession, data2Restore.iQueryTarget); + MainActivity.csLibrary4A.setTagDelay((byte)data2Restore.tagDelay); + MainActivity.csLibrary4A.setAntennaDwell(data2Restore.dwellTime); + MainActivity.csLibrary4A.setTagFocus(data2Restore.tagFocus > 0 ? true : false); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + userVisibleHint = true; + MainActivity.csLibrary4A.appendToLog("AccessImpinjFragment is now VISIBLE"); + setupTagID(); + } else { + int iValue = 0; + if (checkBoxTagFocus != null && checkBoxFastId != null) { + if (checkBoxTagFocus.isChecked()) { + MainActivity.csLibrary4A.setTagGroup(MainActivity.csLibrary4A.getQuerySelect(), 1, 0); + MainActivity.csLibrary4A.setTagDelay((byte)0); + MainActivity.csLibrary4A.setAntennaDwell(2000); + iValue |= 0x10; + } else MainActivity.csLibrary4A.setTagGroup(MainActivity.csLibrary4A.getQuerySelect(), 0, 2); + if (checkBoxFastId.isChecked()) iValue |= 0x20; + if (spinnerTagSelect.getSelectedItemPosition() != impinjTag.others.ordinal()) iValue |= (spinnerTagSelect.getSelectedItemPosition() + 1); + MainActivity.tagType = TAG_IMPINJ; /* need more tagType */ MainActivity.mDid = "E28011" + String.format("%02X", iValue); + MainActivity.csLibrary4A.appendToLog(String.format("HelloK: iValue = 0x%02X, mDid = %s", iValue, MainActivity.mDid)); + MainActivity.csLibrary4A.setImpinJExtension(checkBoxTagFocus.isChecked(), checkBoxFastId.isChecked()); + } + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("AccessImpinjFragment is now INVISIBLE" + (checkBoxFastId != null ? (" with Value = " + iValue) : "")); + } + } + + public AccessImpinjFragment(boolean b775) { + super("AccessImpinjFragment"); + } + + void setupTagID() { + ReaderDevice tagSelected = MainActivity.tagSelected; + boolean bSelected = false; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + bSelected = true; + if (selectTag != null) { + selectTag.editTextTagID.setText(tagSelected.getAddress()); + selectTag.spinnerSelectBank.setSelection(0); + } + + String stringDetail = tagSelected.getDetails(); + int indexUser = stringDetail.indexOf("USER="); + if (indexUser != -1) { + String stringUser = stringDetail.substring(indexUser + 5); + MainActivity.csLibrary4A.appendToLog("stringUser = " + stringUser); + + boolean bEnableBAPMode = false; + int number = Integer.valueOf(stringUser.substring(3, 4), 16); + if ((number % 2) == 1) bEnableBAPMode = true; +// CheckBox checkBoxBAP = (CheckBox) getActivity().findViewById(R.id.coldChainEnableBAP); +// checkBoxBAP.setChecked(bEnableBAPMode); + } + } + } + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import androidx.lifecycle.Lifecycle; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class AccessKilowayFragment extends CommonFragment { + final boolean DEBUG = true; + EditText editTextRWTagID, editTextaccessRWAntennaPower; + + TextView textViewOk; + CheckBox checkBoxRepeat, checkBox; + TextView textView; + + private Button buttonRead; + + enum ReadWriteTypes { + NULL, READVALUE + } + ReadWriteTypes readWriteTypes; + + private AccessTask accessTask; + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_kiloway, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + editTextRWTagID = (EditText) getActivity().findViewById(R.id.accessKilowayID); + editTextaccessRWAntennaPower = (EditText) getActivity().findViewById(R.id.accessLEDAntennaPower); + + checkBoxRepeat = (CheckBox) getActivity().findViewById(R.id.accessKilowayRepeat); + textViewOk = (TextView) getActivity().findViewById(R.id.accessKilowayResultOK); + checkBox = (CheckBox) getActivity().findViewById(R.id.accessKilowayResultTitle); + textView = (TextView) getActivity().findViewById(R.id.accessKilowayResult); + + buttonRead = (Button) getActivity().findViewById(R.id.accessKilowayStartButton); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + startAccessTask(); + } + }); + + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onResume() { + super.onResume(); + setupTagID(); + } + + @Override + public void onDestroy() { + if (accessTask != null) accessTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + super.onDestroy(); + } + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED) == false) return; + if(getUserVisibleHint()) { + setupTagID(); + } else checkBoxRepeat.setChecked(false); + } + + boolean isLongjing = false; + public AccessKilowayFragment(boolean isLongjing) { + super("AccessLedTagFragment"); + this.isLongjing = isLongjing; + } + + void setupTagID() { + ReaderDevice tagSelected = MainActivity.tagSelected; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + if (editTextRWTagID != null) editTextRWTagID.setText(tagSelected.getAddress()); + } + } + } + + void startAccessTask() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("startAccessTask()"); + if (updating == false) { + updating = true; bankProcessing = 0; checkProcessing = 0; + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + boolean updating = false; int bankProcessing = 0; int checkProcessing = 0; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment(): Beginning"); /// + boolean rerunRequest = false; boolean taskRequest = false; + if (accessTask == null) { + taskRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment(): NULL accessReadWriteTask"); /// + } else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) { + rerunRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment(): accessReadWriteTask.getStatus() = " + accessTask.getStatus().toString()); + } else { + taskRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment(): FINISHED accessReadWriteTask"); /// + } + if (processResult()) { + rerunRequest = true; MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment(): processResult is TRUE"); + } else { + MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment: processResult is false with taskRequest = " + taskRequest); /// + if (taskRequest) { + boolean invalid = processTickItems(); + MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment(): processTickItems with invalid = " + invalid + ", bankProcessing = " + bankProcessing + ", checkProcessing = " + checkProcessing); /// + if (bankProcessing++ != 0 && invalid == true) { + rerunRequest = true; + if (checkBoxRepeat != null && checkBoxRepeat.isChecked()) { bankProcessing = 0; checkProcessing = 0; } + else rerunRequest = false; + } else { + accessTask = new AccessTask(buttonRead, invalid, true, + editTextRWTagID.getText().toString(), 1, 32, + "00000000", Integer.valueOf(editTextaccessRWAntennaPower.getText().toString()), RfidReaderChipData.HostCommands.CMD_18K6CREAD, + false, null); + accessTask.execute(); + rerunRequest = true; + MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment(): accessTask is created"); /// + } + } + } + if (rerunRequest) { + mHandler.postDelayed(updateRunnable, 500); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment(): Restart"); /// + } + else updating = false; + MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment(): Ending with updating = " + updating); /// + } + }; + + boolean processResult() { + String accessResult = null; + if (accessTask == null) return false; + else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) return false; + else { + accessResult = accessTask.accessResult; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessLedTagFragment(): accessResult = " + accessResult); + if (accessResult == null) { + if (readWriteTypes == ReadWriteTypes.READVALUE) { + textViewOk.setText("E"); + } + } else { + if (readWriteTypes == ReadWriteTypes.READVALUE) { + textViewOk.setText("O"); + textView.setText(accessResult); + readWriteTypes = ReadWriteTypes.NULL; + } + } + accessTask = null; + return true; + } + } + + boolean processTickItems() { + boolean invalidRequest1 = false; + int accBank = 0, accSize = 0, accOffset = 0; + + if (editTextRWTagID.getText().toString().length() == 0) invalidRequest1 = true; + MainActivity.csLibrary4A.appendToLog("1: invalidRequest1 = " + invalidRequest1); + + if (checkBox.isChecked() == true && checkProcessing < 1) { + accBank = 0; accSize = 1; accOffset = 4; + if (isLongjing) { + accBank = 3; accOffset = 112; + } + + readWriteTypes = ReadWriteTypes.READVALUE; checkProcessing = 1; + textViewOk.setText(""); textView.setText(""); + } else { + invalidRequest1 = true; + } + MainActivity.csLibrary4A.appendToLog("2: invalidRequest1 = " + invalidRequest1); + + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessBank(accBank) == false) { + invalidRequest1 = true; + } + } + MainActivity.csLibrary4A.appendToLog("3: invalidRequest1 = " + invalidRequest1); + + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessOffset(accOffset) == false) { + invalidRequest1 = true; + } + } + MainActivity.csLibrary4A.appendToLog("4: invalidRequest1 = " + invalidRequest1); + + if (invalidRequest1 == false) { + if (accSize == 0) { + invalidRequest1 = true; + } else if (MainActivity.csLibrary4A.setAccessCount(accSize) == false) { + invalidRequest1 = true; + } + } + MainActivity.csLibrary4A.appendToLog("5: invalidRequest1 = " + invalidRequest1); + + return invalidRequest1; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_AXZON; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_MAGNUS_S2; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_MAGNUS_S3; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_AXZON_XERXES; + +import androidx.lifecycle.Lifecycle; +import android.graphics.Color; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.GenericTextWatcher; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class AccessMicronFragment extends CommonFragment { + final boolean DEBUG = true; + boolean bXerxesEnable = false; + EditText editTextaccessRWSelectHoldTime, editTextRWTagID, editTextAccessRWAccPassword, editTextaccessRWAntennaPower; + TextView textViewSelectHoldTimeLabel, textViewConfigOk, textViewCalibrationOk, textViewAnalogPort2CodeOk, textViewAnalogPort1CodeOk, textViewSensorCodeOk, textViewRssiCodeOk, textViewTemperatureCodeOk; + CheckBox checkBoxConfig, checkBoxCalibration, checkBoxAnalogPort1Code, checkBoxAnalogPort2Code, checkBoxSensorCode, checkBoxRssiCode, checkBoxTemperatureCode; + Spinner spinnerTagType, spinnerSensorUnit, spinnerTemperatureUnit; + boolean btagTypeSelected = false; + + TextView textViewModelCode, textViewCalibrationVersion, textViewAnalogPort1Code, textViewAnalogPort2Code, textViewSensorCode, textViewRssiCode, textViewTemperatureCode; + private Button buttonRead; + + enum ReadWriteTypes { + NULL, MODELCODE, CALIBRATION, SENSORCODE, RSSICODE, TEMPERATURECODE + } + ReadWriteTypes readWriteTypes; + boolean operationRead = false; + + private AccessTask accessTask; + private int modelCode = 0, selectHold = 15; + private int calCode1, calTemp1, calCode2, calTemp2, calVer = -1; + private boolean changedSelectIndex = false; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_micron, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + editTextRWTagID = (EditText) getActivity().findViewById(R.id.accessMNTagID); + editTextAccessRWAccPassword = (EditText) getActivity().findViewById(R.id.accessMNAccPasswordValue); + editTextAccessRWAccPassword.addTextChangedListener(new GenericTextWatcher(editTextAccessRWAccPassword, 8)); + editTextAccessRWAccPassword.setText(MainActivity.config.configPassword); + + if (MainActivity.config != null) { if (MainActivity.config.config0 != null) selectHold = Integer.parseInt(MainActivity.config.config0); } + EditText editText = (EditText) getActivity().findViewById(R.id.accessMNRssiUpperLimit); + editText.setText(MainActivity.config.config1); + editText = (EditText) getActivity().findViewById(R.id.accessMNRssiLowerLimit); + editText.setText(MainActivity.config.config2); + editText = (EditText) getActivity().findViewById(R.id.accessMNHumidityThreshold); + editText.setText(MainActivity.config.config3); + TableRow tableRow = (TableRow) getActivity().findViewById(R.id.accessMNHumidityThresholdRow); + if (MainActivity.mDid.matches("E28240")) tableRow.setVisibility(View.GONE); + + textViewConfigOk = (TextView) getActivity().findViewById(R.id.accessMNModelCodeOK); + textViewCalibrationOk = (TextView) getActivity().findViewById(R.id.accessMNCalibrationOK); + textViewAnalogPort1CodeOk = (TextView) getActivity().findViewById(R.id.accessMNAnalogPort1CodeOK); + textViewAnalogPort2CodeOk = (TextView) getActivity().findViewById(R.id.accessMNAnalogPort2CodeOK); + textViewSensorCodeOk = (TextView) getActivity().findViewById(R.id.accessMNSensorCodeOK); + textViewRssiCodeOk = (TextView) getActivity().findViewById(R.id.accessMNRssiCodeOK); + textViewTemperatureCodeOk = (TextView) getActivity().findViewById(R.id.accessMNTemperatureCodeOK); + + checkBoxConfig = (CheckBox) getActivity().findViewById(R.id.accessMNModelCodeTitle); + checkBoxCalibration = (CheckBox) getActivity().findViewById(R.id.accessMNCalibrationTitle); + checkBoxAnalogPort1Code = (CheckBox) getActivity().findViewById(R.id.accessMNAnalogPort1CodeTitle); checkBoxAnalogPort1Code.setEnabled(false); + checkBoxAnalogPort2Code = (CheckBox) getActivity().findViewById(R.id.accessMNAnalogPort2CodeTitle); checkBoxAnalogPort2Code.setEnabled(false); + checkBoxSensorCode = (CheckBox) getActivity().findViewById(R.id.accessMNSensorCodeTitle); + checkBoxRssiCode = (CheckBox) getActivity().findViewById(R.id.accessMNRssiCodeTitle); + checkBoxTemperatureCode = (CheckBox) getActivity().findViewById(R.id.accessMNTemperatureCodeTitle); + + textViewModelCode = (TextView) getActivity().findViewById(R.id.accessMNModelCode); + + textViewAnalogPort1Code = (TextView) getActivity().findViewById(R.id.accessMNAnalogPort1Code); + textViewAnalogPort2Code = (TextView) getActivity().findViewById(R.id.accessMNAnalogPort2Code); + textViewSensorCode = (TextView) getActivity().findViewById(R.id.accessMNSensorCode); + textViewRssiCode = (TextView) getActivity().findViewById(R.id.accessMNRssiCode); + textViewCalibrationVersion = (TextView) getActivity().findViewById(R.id.accessMNCalibrationVersion); + textViewTemperatureCode = (TextView) getActivity().findViewById(R.id.accessMNTemperatureCode); + + ArrayAdapter arrayAdapterTagType; + if (bXerxesEnable) arrayAdapterTagType = ArrayAdapter.createFromResource(getActivity(), R.array.xerxesTag_options, R.layout.custom_spinner_layout); + else arrayAdapterTagType = ArrayAdapter.createFromResource(getActivity(), R.array.rfMicronTag_options, R.layout.custom_spinner_layout); + arrayAdapterTagType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerTagType = (Spinner) getActivity().findViewById(R.id.accessMNTagType); + spinnerTagType.setAdapter(arrayAdapterTagType); + spinnerTagType.setEnabled(false); + if (MainActivity.mDid != null) { + if (MainActivity.mDid.matches("E28240")) spinnerTagType.setSelection(0); + else if (MainActivity.mDid.matches("E282402")) spinnerTagType.setSelection(1); + else if (MainActivity.mDid.matches("E282403")) spinnerTagType.setSelection(2); + else if (MainActivity.mDid.matches("E282405")) spinnerTagType.setSelection(3); + } + spinnerTagType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + TableRow tableRowCalibration = (TableRow) getActivity().findViewById(R.id.accessMNCalibrationRow); + TableRow tableRowTemperatureCode = (TableRow) getActivity().findViewById(R.id.accessMNTemperatureCodeRow); + TableRow tableRowAnalogPort1 = (TableRow) getActivity().findViewById(R.id.accessMNAnalogPort1CodeRow); + TableRow tableRowAnalogPort2 = (TableRow) getActivity().findViewById(R.id.accessMNAnalogPort2CodeRow); + + switch (spinnerTagType.getSelectedItemPosition()) { + case 0: + MainActivity.tagType = TAG_AXZON; MainActivity.mDid = "E28240"; + break; + case 1: + MainActivity.tagType = TAG_MAGNUS_S2; MainActivity.mDid = "E282402"; + break; + case 2: + MainActivity.tagType = TAG_MAGNUS_S3; MainActivity.mDid = "E282403"; + break; + case 3: + MainActivity.tagType = TAG_AXZON_XERXES; MainActivity.mDid = "E282405"; + break; + } + if (btagTypeSelected) { + switch (spinnerTagType.getSelectedItemPosition()) { + case 0: + case 1: + editTextaccessRWSelectHoldTime.setText("0"); + break; + case 2: + editTextaccessRWSelectHoldTime.setText("3"); + break; + case 3: + editTextaccessRWSelectHoldTime.setText("9"); + break; + } + } else btagTypeSelected = true; + switch (spinnerTagType.getSelectedItemPosition()) { + case 0: + case 1: + case 2: + textViewSelectHoldTimeLabel.setVisibility(View.GONE); + editTextaccessRWSelectHoldTime.setVisibility(View.GONE); + tableRowAnalogPort1.setVisibility(View.GONE); + tableRowAnalogPort2.setVisibility(View.GONE); + break; + case 3: + textViewSelectHoldTimeLabel.setVisibility(View.VISIBLE); + editTextaccessRWSelectHoldTime.setVisibility(View.VISIBLE); + tableRowAnalogPort1.setVisibility(View.VISIBLE); + tableRowAnalogPort2.setVisibility(View.VISIBLE); + break; + } + switch (spinnerTagType.getSelectedItemPosition()) { + case 0: + case 1: + tableRowCalibration.setVisibility(View.GONE); + tableRowTemperatureCode.setVisibility(View.GONE); + break; + case 2: + case 3: + tableRowCalibration.setVisibility(View.VISIBLE); + tableRowTemperatureCode.setVisibility(View.VISIBLE); + break; + } + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + ArrayAdapter arrayAdapterSensorUnit = ArrayAdapter.createFromResource(getActivity(), R.array.sensor_unit_options, R.layout.custom_spinner_layout); + arrayAdapterSensorUnit.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerSensorUnit = (Spinner) getActivity().findViewById(R.id.accessMNSensorUnit); + spinnerSensorUnit.setAdapter(arrayAdapterSensorUnit); + spinnerSensorUnit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + setSensorCode(null); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + if (MainActivity.mDid.matches("E28240")) spinnerSensorUnit.setEnabled(false); + + ArrayAdapter arrayAdapterTemperatureUnit = ArrayAdapter.createFromResource(getActivity(), R.array.temperature_unit_options, R.layout.custom_spinner_layout); + arrayAdapterTemperatureUnit.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerTemperatureUnit = (Spinner) getActivity().findViewById(R.id.accessMNTemperatureUnit); + spinnerTemperatureUnit.setAdapter(arrayAdapterTemperatureUnit); + spinnerTemperatureUnit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + setTemperatureCode(null); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + + textViewSelectHoldTimeLabel = (TextView) getActivity().findViewById(R.id.accessMNSelectHoldTimeLabel); + editTextaccessRWSelectHoldTime = (EditText) getActivity().findViewById(R.id.accessMNSelectHoldTime); + editTextaccessRWSelectHoldTime.setText(String.valueOf(selectHold)); + + editTextaccessRWAntennaPower = (EditText) getActivity().findViewById(R.id.accessMNAntennaPower); + editTextaccessRWAntennaPower.setText(String.valueOf(MainActivity.config.configPower)); + + buttonRead = (Button) getActivity().findViewById(R.id.accessMNReadButton); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + selectHold = Integer.parseInt(editTextaccessRWSelectHoldTime.getText().toString()); + operationRead = true; startAccessTask(); + } + }); + + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onResume() { + super.onResume(); + setupTagID(); + } + + @Override + public void onDestroy() { + if (accessTask != null) accessTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED) == false) return; + if(getUserVisibleHint()) { + userVisibleHint = true; + setupTagID(); + } else { + userVisibleHint = false; + + if (editTextaccessRWSelectHoldTime == null) return; + int iValue = Integer.parseInt(editTextaccessRWSelectHoldTime.getText().toString()); + if (iValue > 255) editTextaccessRWSelectHoldTime.setText("255"); + else if (iValue < 0) editTextaccessRWSelectHoldTime.setText("0"); + iValue = Integer.parseInt(editTextaccessRWSelectHoldTime.getText().toString()); + MainActivity.selectHold = iValue; + + EditText editText = (EditText) getActivity().findViewById(R.id.accessMNRssiUpperLimit); + MainActivity.config.config1 = editText.getText().toString(); + editText = (EditText) getActivity().findViewById(R.id.accessMNRssiLowerLimit); + MainActivity.config.config2 = editText.getText().toString(); + editText = (EditText) getActivity().findViewById(R.id.accessMNHumidityThreshold); + MainActivity.config.config3 = editText.getText().toString(); + } + } + + public static AccessMicronFragment newInstance(boolean bXerxesEnable) { + AccessMicronFragment myFragment = new AccessMicronFragment(); + myFragment.bXerxesEnable = bXerxesEnable; + return myFragment; + } + public AccessMicronFragment() { + super("AccessMicronFragment"); + } + + void setupTagID() { + ReaderDevice tagSelected = MainActivity.tagSelected; + boolean bSelected = false; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + String stringDetail = tagSelected.getDetails(); + int indexUser = stringDetail.indexOf("TID="); + if (indexUser != -1) { + // + } + bSelected = true; + if (editTextRWTagID != null) editTextRWTagID.setText(tagSelected.getAddress()); + + if (setModelCode(tagSelected.getTid())) { + textViewModelCode.setText(tagSelected.getTid().substring(5)); + } else if (tagSelected.getMdid() == null) { + } else if (tagSelected.getMdid().contains("E282402")) { + textViewModelCode.setText("02"); modelCode = 2; + } else if (tagSelected.getMdid().contains("E282403")) { + textViewModelCode.setText("03"); modelCode = 3; + } else if (tagSelected.getMdid().contains("E282405")) { + textViewModelCode.setText("05"); modelCode = 5; + } + + String strRes = tagSelected.getRes(); + if (strRes != null) { + int ibracket = strRes.indexOf("("); + if (ibracket > 0) strRes = strRes.substring(0, ibracket); + + if (modelCode == 5) { + if (strRes.length() < 4) textViewAnalogPort1Code.setText(""); + else textViewAnalogPort1Code.setText(str2Decimal(strRes.substring(0,4))); + if (strRes.length() < 8) textViewAnalogPort2Code.setText(""); + else textViewAnalogPort2Code.setText(str2Decimal(strRes.substring(4, 8))); + if (strRes.length() < 8) strRes = ""; + else strRes = strRes.substring(8); + } + + if (strRes.length() < 4) textViewSensorCode.setText(""); + else setSensorCode(strRes.substring(0, 4)); + if (strRes.length() < 4) strRes = ""; + else strRes = strRes.substring(4); + + if (modelCode == 2) strRes = tagSelected.getRes2(); + if (strRes.length() < 4) textViewRssiCode.setText(""); + else textViewRssiCode.setText(str2Decimal(strRes.substring(0, 4))); + if (strRes.length() < 4) strRes = ""; + else strRes = strRes.substring(4); + + if (modelCode == 3 || modelCode == 5) { + if (setCalibrationVersion(tagSelected.getUser())) + setTemperatureCode(strRes); + } + } + + stringDetail = tagSelected.getDetails(); + indexUser = stringDetail.indexOf("USER="); + if (indexUser != -1) { + String stringUser = stringDetail.substring(indexUser + 5); + MainActivity.csLibrary4A.appendToLog("stringUser = " + stringUser); + + boolean bEnableBAPMode = false; + int number = Integer.valueOf(stringUser.substring(3, 4), 16); + if ((number % 2) == 1) bEnableBAPMode = true; + } + } + } + } + + void startAccessTask() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("startAccessTask()"); + if (updating == false) { + updating = true; bankProcessing = 0; + checkProcessing = 0; + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + boolean updating = false; int bankProcessing = 0; + int checkProcessing = 0; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + boolean rerunRequest = false; boolean taskRequest = false; + if (accessTask == null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessMicronFragment().updateRunnable(): NULL accessReadWriteTask"); + taskRequest = true; + } else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) { + rerunRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessMicronFragment().updateRunnable(): accessReadWriteTask.getStatus() = " + accessTask.getStatus().toString()); + } else { + taskRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessMicronFragment().updateRunnable(): FINISHED accessReadWriteTask"); + } + if (processResult()) { rerunRequest = true; MainActivity.csLibrary4A.appendToLog("processResult is TRUE");} + else if (taskRequest) { + boolean invalid = processTickItems(); + MainActivity.csLibrary4A.appendToLog("processTickItems, invalid = " + invalid); + if (bankProcessing++ != 0 && invalid == true) rerunRequest = false; + else { + int selectBank = 1; + int selectOffset = 32; + String selectMask = editTextRWTagID.getText().toString(); + accessTask = new AccessTask(buttonRead, null, invalid, true, + selectMask, selectBank, selectOffset, + editTextAccessRWAccPassword.getText().toString(), + Integer.valueOf(editTextaccessRWAntennaPower.getText().toString()), + (operationRead ? RfidReaderChipData.HostCommands.CMD_18K6CREAD: RfidReaderChipData.HostCommands.CMD_18K6CWRITE), + 0, 0, true, bSkipClearPrefilter, + null, null, null, null, null); + accessTask.execute(); + rerunRequest = true; + MainActivity.csLibrary4A.appendToLog("accessTask is created with selectBank = " + selectBank); + } + } + if (rerunRequest) { + mHandler.postDelayed(updateRunnable, 500); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessMicronFragment().updateRunnable(): Restart"); + } + else updating = false; + MainActivity.csLibrary4A.appendToLog("AccessMicronFragment().updateRunnable(): Ending with updating = " + updating); + } + }; + + boolean setModelCode(String strTid) { + if (strTid == null) return false; + if (strTid.length() <= 7) return false; + if (strTid.substring(0, 7).matches("E282401")) { + modelCode = 1; return true; + } else if (strTid.substring(0, 7).matches("E282402")) { + modelCode = 2; return true; + } else if (strTid.substring(0, 7).matches("E282403")) { + modelCode = 3; return true; + } else if (strTid.substring(0, 7).matches("E282405")) { + modelCode = 5; return true; + } + return false; + } + boolean setCalibrationVersion(String strUser) { + MainActivity.csLibrary4A.appendToLog("strUser = " + strUser); + textViewCalibrationVersion.setText(""); + if (strUser == null) return false; + if (strUser.length() < 16) return false; + if (modelCode == 3) { + int crc = Integer.parseInt(strUser.substring(0, 4), 16); + calCode1 = Integer.parseInt(strUser.substring(4, 7), 16); + calTemp1 = Integer.parseInt(strUser.substring(7, 10), 16); + calTemp1 >>= 1; + calCode2 = Integer.parseInt(strUser.substring(9, 13), 16); + calCode2 >>= 1; + calCode2 &= 0xFFF; + calTemp2 = Integer.parseInt(strUser.substring(12, 16), 16); + calTemp2 >>= 2; + calTemp2 &= 0x7FF; + calVer = Integer.parseInt(strUser.substring(15, 16), 16); + calVer &= 0x3; + if (DEBUG) + MainActivity.csLibrary4A.appendToLog("crc = " + crc + ", code1 = " + calCode1 + ", temp1 = " + calTemp1 + ", code2 = " + calCode2 + ", temp2 = " + calTemp2 + ", ver = " + calVer); + strUser += String.format(", v%d", calVer); + } + textViewCalibrationVersion.setText(strUser); + return true; + } + String str2Decimal(String strData) { + int iTemp = -1; + if (strData != null) if (strData.length() >= 4) iTemp = Integer.parseInt(strData.substring(0, 4), 16); + if (iTemp == -1) return ""; + return String.format("%d", iTemp); + } + boolean setRssiCode(String strData) { + if (strData == null) return false; + if (strData.length() < 4) return false; + + int iTemp = Integer.parseInt(strData.substring(0,4), 16); iTemp &= 0x1F; + textViewRssiCode.setText(String.format("%d", iTemp)); //"%02X" + EditText editText = (EditText) getActivity().findViewById(R.id.accessMNRssiLowerLimit); + int iTempLower = Integer.parseInt(editText.getText().toString()); + editText = (EditText) getActivity().findViewById(R.id.accessMNRssiUpperLimit); + int iTempUpper = Integer.parseInt(editText.getText().toString()); + if (iTemp >= iTempLower && iTemp <= iTempUpper) textViewRssiCode.setTextColor(Color.BLACK); + else textViewRssiCode.setTextColor(Color.RED); + return true; + } + + String strSensorCode0; + boolean setSensorCode(String strData) { + if (strData == null) { + if (strSensorCode0 != null && textViewSensorCode.getText().toString().length() != 0) strData = strSensorCode0; + else return false; + } + if (strData.length() < 4) return false; + strSensorCode0 = strData; + strData = str2Decimal(strData); + if (spinnerSensorUnit.getSelectedItemPosition() == 1) { + float fValue = (float) Integer.parseInt(strData); + if (true) { + EditText editText = (EditText) getActivity().findViewById(R.id.accessMNHumidityThreshold); + int iValue = Integer.parseInt(editText.getText().toString()); + MainActivity.csLibrary4A.appendToLog("iValue for Dry/Wet comparision = " + iValue); + if (fValue >= iValue) strData = "dry"; + else strData = "wet"; + } else { + if (modelCode == 2) fValue /= (float) 0x1F; + else fValue /= (float) 0x1FF; + fValue *= 100; + strData = String.format("%.1f", fValue); + } + } + textViewSensorCode.setText(strData); + return true; + } + + String strTemperatureCode0; + boolean setTemperatureCode(String strData) { + if (strData == null) { + if (strTemperatureCode0 != null && textViewTemperatureCode.getText().toString().length() != 0) strData = strTemperatureCode0; + else return false; + } + if (strData.length() < 4) return false; + float fTemperature = -500; + if (modelCode == 3 && calVer != -1) { + fTemperature = Integer.parseInt(strData.substring(0, 4), 16); + fTemperature = ((float) calTemp2 - (float) calTemp1) * (fTemperature - (float) calCode1); + fTemperature /= ((float) (calCode2) - (float) calCode1); + fTemperature += (float) calTemp1; + fTemperature -= 800; + fTemperature /= 10; + } else if (modelCode == 5) { + String strCalData = textViewCalibrationVersion.getText().toString(); + if (strCalData != null) fTemperature = MainActivity.csLibrary4A.decodeMicronTemperature(5, strData, strCalData); + } + if (fTemperature != -500) { + if (spinnerTemperatureUnit.getSelectedItemPosition() == 1) { + fTemperature *= 1.8; + fTemperature += 32; + } + strTemperatureCode0 = strData; + strData = String.format("%.1f", fTemperature); + } else { + strTemperatureCode0 = null; + strData = ""; + } + textViewTemperatureCode.setText(strData); + return true; + } + + boolean processResult() { + String accessResult = null; + if (accessTask == null) return false; + else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) return false; + else { + if (changedSelectIndex) { + changedSelectIndex = false; MainActivity.selectFor = 0; + MainActivity.csLibrary4A.setSelectCriteriaDisable(-1); + } + accessResult = accessTask.accessResult; + if (accessResult == null) { + if (readWriteTypes == ReadWriteTypes.MODELCODE) { + textViewConfigOk.setText("E"); + //checkBoxConfig.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.CALIBRATION) { + textViewCalibrationOk.setText("E"); + //checkBoxCalibration.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.SENSORCODE) { + textViewSensorCodeOk.setText("E"); + //checkBoxSensorCode.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.RSSICODE) { + textViewRssiCodeOk.setText("E"); + //checkBoxRssiCode.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.TEMPERATURECODE) { + textViewTemperatureCodeOk.setText("E"); + //checkBoxTemperatureCode.setChecked(false); + } + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("accessResult = " + accessResult); + if (readWriteTypes == ReadWriteTypes.MODELCODE) { + textViewConfigOk.setText("O"); + //checkBoxConfig.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + boolean valid = setModelCode(accessResult); + if (valid) textViewModelCode.setText(accessResult.substring(5)); + else Toast.makeText(MainActivity.mContext, "This is not Micron 0X tag !!!", Toast.LENGTH_SHORT).show(); + } else if (readWriteTypes == ReadWriteTypes.CALIBRATION) { + textViewCalibrationOk.setText("O"); + //checkBoxCalibration.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + setCalibrationVersion(accessResult); + } else if (readWriteTypes == ReadWriteTypes.SENSORCODE) { + textViewSensorCodeOk.setText("O"); + //checkBoxSensorCode.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + setSensorCode(accessResult); + } else if (readWriteTypes == ReadWriteTypes.RSSICODE) { + textViewRssiCodeOk.setText("O"); + //checkBoxRssiCode.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + setRssiCode(accessResult); + } else if (readWriteTypes == ReadWriteTypes.TEMPERATURECODE) { + textViewTemperatureCodeOk.setText("O"); + //checkBoxTemperatureCode.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (accessResult.length() >= 4) { + setTemperatureCode(accessResult.substring(0,4)); + } + } + } + accessTask = null; + return true; + } + } + + boolean bSkipClearPrefilter = false; + boolean processTickItems() { + boolean invalidRequest1 = false; + int accBank = 0, accSize = 0, accOffset = 0; + String writeData = ""; + + bSkipClearPrefilter = false; + if (editTextRWTagID.getText().toString().length() == 0) invalidRequest1 = true; + else if (checkBoxConfig.isChecked() == true && checkProcessing < 1 && operationRead) { + accBank = 2; accOffset = 0; accSize = 2; readWriteTypes = ReadWriteTypes.MODELCODE; checkProcessing = 1; + textViewConfigOk.setText(""); textViewModelCode.setText(""); modelCode = -1; + } else if (checkBoxCalibration.isChecked() == true && checkProcessing < 2 && operationRead && (modelCode == 3 || modelCode == 5)) { + accBank = 3; accSize = 4; readWriteTypes = ReadWriteTypes.CALIBRATION; checkProcessing = 2; + accOffset = 8; if (modelCode == 5) accOffset = 18; + textViewCalibrationOk.setText(""); textViewCalibrationVersion.setText(""); calVer = -1; + } else if (checkBoxSensorCode.isChecked() == true && modelCode != -1 && checkProcessing < 3 && operationRead) { + accBank = 0; if (modelCode == 1) accBank = 3; + accOffset = 11; if (modelCode == 3 || modelCode == 5) accOffset = 12; + accSize = 1; readWriteTypes = ReadWriteTypes.SENSORCODE; checkProcessing = 3; + textViewSensorCodeOk.setText(""); textViewSensorCode.setText(""); + } else if (checkBoxRssiCode.isChecked() == true && modelCode != -1 && checkProcessing < 4 && operationRead) { + int offset = 0xA0; + if (modelCode == 3) offset = 0xD0; + else if (modelCode == 5) offset = 0x3D0; + bSkipClearPrefilter = true; + MainActivity.csLibrary4A.setSelectCriteriaDisable(-1); + MainActivity.csLibrary4A.setSelectCriteria(-1, true, 4, 5, selectHold,3, offset, "1F"); + changedSelectIndex = true; + accBank = 0; accOffset = 13; if (modelCode == 1) { accBank = 3; accOffset = 9; } + accSize = 1; readWriteTypes = ReadWriteTypes.RSSICODE; checkProcessing = 4; + textViewRssiCodeOk.setText(""); textViewRssiCode.setText(""); + } else if (checkBoxTemperatureCode.isChecked() == true && (modelCode == 3 || modelCode == 5) && checkProcessing < 5 && operationRead) { + bSkipClearPrefilter = true; + MainActivity.csLibrary4A.setSelectCriteriaDisable(-1); + if (modelCode == 3) MainActivity.csLibrary4A.setSelectCriteria(-1, true, 4, 2, 0,3, 0xE0, ""); + else MainActivity.csLibrary4A.setSelectCriteria(-1, true, 4, 5, selectHold,3, 0x3B0, "00"); + changedSelectIndex = true; + accBank = 0; accOffset = 14; accSize = 1; readWriteTypes = ReadWriteTypes.TEMPERATURECODE; checkProcessing = 5; + textViewTemperatureCodeOk.setText(""); textViewTemperatureCode.setText(""); + } else { + invalidRequest1 = true; + } + + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessBank(accBank) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessOffset(accOffset) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (accSize == 0) { + invalidRequest1 = true; + } else if (MainActivity.csLibrary4A.setAccessCount(accSize) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false && operationRead == false) { + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessWriteData(writeData) == false) { + invalidRequest1 = true; + } + } + } + return invalidRequest1; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.app.Activity; +import android.graphics.Typeface; +import android.os.Bundle; +import android.os.Handler; +import android.os.SystemClock; +import androidx.appcompat.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask1; +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.GenericTextWatcher; +import com.csl.cs710ademoapp.SelectTag; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +import static com.csl.cs710ademoapp.MainActivity.mContext; +import static com.csl.cs710ademoapp.MainActivity.tagSelected; + +public class AccessReadWriteFragment extends CommonFragment { + SelectTag selectTag; + Spinner spinnerSelectBank, spinnerRWSelectEpc1; + EditText editTextRWSelectOffset, editTextAccessRWAccPassword, editTextAccessRWKillPwd, editTextAccessRWAccPwd, editTextAccPc, editTextAccessRWEpc, editTExtAccessRWXpc; + EditText editTextTidValue, editTextUserValue, editTextEpcValue, editTextaccessRWAntennaPower; + TextView textViewEpcLength, textViewRunTime; + private Button buttonRead; + private Button buttonWrite; + Handler mHandler = new Handler(); + String strPCValueRef = ""; + + String accEpcValue = ""; String accXpcValue = ""; String accTidValue = ""; String accUserValue = ""; + enum ReadWriteTypes { + NULL, RESERVE, PC, EPC, XPC, TID, USER, EPC1 + } + boolean operationRead = false; + ReadWriteTypes readWriteTypes; + + private AccessTask1 accessTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_access_readwrite, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + androidx.appcompat.app.ActionBar actionBar; + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_access); + actionBar.setTitle(R.string.title_activity_readwrite); + + selectTag = new SelectTag((Activity)getActivity(), 0); + + spinnerSelectBank = (Spinner) getActivity().findViewById(R.id.selectMemoryBank); + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.read_memoryBank_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerSelectBank.setAdapter(targetAdapter); + spinnerSelectBank.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + switch (position) { + case 0: //if EPC + if (tagSelected != null) selectTag.editTextTagID.setText(tagSelected.getAddress()); + editTextRWSelectOffset.setText("32"); + break; + case 1: + if (tagSelected != null) { if (tagSelected.getTid() != null) selectTag.editTextTagID.setText(tagSelected.getTid()); } + editTextRWSelectOffset.setText("0"); + break; + case 2: + if (tagSelected != null) { if (tagSelected.getUser() != null) selectTag.editTextTagID.setText(tagSelected.getUser()); } + editTextRWSelectOffset.setText("0"); + break; + default: + break; + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + + editTextRWSelectOffset = (EditText) getActivity().findViewById(R.id.selectMemoryOffset); + spinnerRWSelectEpc1 = (Spinner) getActivity().findViewById(R.id.accessRWEpc1Title1); + ArrayAdapter targetAdapter1 = ArrayAdapter.createFromResource(getActivity(), R.array.memoryBank_options, R.layout.custom_spinner_layout); + targetAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerRWSelectEpc1.setAdapter(targetAdapter1); spinnerRWSelectEpc1.setSelection(1); + + editTextAccessRWAccPassword = (EditText) getActivity().findViewById(R.id.selectPasswordValue); + editTextAccessRWAccPassword.addTextChangedListener(new GenericTextWatcher(editTextAccessRWAccPassword, 8)); + editTextAccessRWAccPassword.setText("00000000"); + editTextAccessRWKillPwd = (EditText) getActivity().findViewById(R.id.accessRWKillPwdValue); + editTextAccessRWKillPwd.addTextChangedListener(new GenericTextWatcher(editTextAccessRWKillPwd, 8)); + editTextAccessRWAccPwd = (EditText) getActivity().findViewById(R.id.accessRWAccPwdValue); + editTextAccessRWAccPwd.addTextChangedListener(new GenericTextWatcher(editTextAccessRWAccPwd, 8)); + editTextAccPc = (EditText) getActivity().findViewById(R.id.accessRWAccPcValue); + editTextAccPc.setHint("PC value"); + editTextAccPc.addTextChangedListener(new GenericTextWatcher(editTextAccPc, 4)); + editTextAccessRWEpc = (EditText) getActivity().findViewById(R.id.accessRWAccEpcValue); + editTExtAccessRWXpc = (EditText) getActivity().findViewById(R.id.accessRWAccXpcValue); + editTextTidValue = (EditText) getActivity().findViewById(R.id.accessRWTidValue); + editTextTidValue.setHint("Data Pattern"); + editTextUserValue = (EditText) getActivity().findViewById(R.id.accessRWUserValue); editTextUserValue.setTypeface(Typeface.MONOSPACE); + editTextUserValue.setHint("Data Pattern"); + editTextEpcValue = (EditText) getActivity().findViewById(R.id.accessRWEpcValue); + editTextEpcValue.setHint("Data Pattern"); + + editTextaccessRWAntennaPower = (EditText) getActivity().findViewById(R.id.selectAntennaPower); + editTextaccessRWAntennaPower.setText(String.valueOf(300)); + + textViewEpcLength = (TextView) getActivity().findViewById(R.id.accessRWAccEpcLength); + textViewRunTime = (TextView) getActivity().findViewById(R.id.accessRWRunTime); + + buttonRead = (Button) getActivity().findViewById(R.id.accessRWReadButton); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + operationRead = true; startAccessTask(); + } + }); + + buttonWrite = (Button) getActivity().findViewById(R.id.accessRWWriteButton); + buttonWrite.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + operationRead = false; startAccessTask(); + } + }); + + ReaderDevice tagSelected = MainActivity.tagSelected; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + String strEpcValue = tagSelected.getAddress(); + String detail = tagSelected.getDetails(); + String header = "PC="; + if (detail != null && detail.indexOf(header) >= 0) { + int index = detail.indexOf(header) + header.length(); + strPCValueRef = detail.substring(index, index + 4); + updatePCEpc(strPCValueRef, strEpcValue); + } + } + } + MainActivity.csLibrary4A.setSameCheck(true); + } + + @Override + public void onDestroy() { + if (accessTask != null) accessTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + public AccessReadWriteFragment() { + super("AccessReadWriteFragment"); + } + + int getPC2EpcWordCount(String detail) { + String detail2 = detail.substring(0, 1); + int number2 = Integer.valueOf(detail2, 16) * 2; + String detail3 = detail.substring(1, 2); + int number3 = Integer.valueOf(detail3, 16); + if ((number3 / 8) != 0) number2 += 1; + return number2; + } + void updatePCEpc(String strPCValue, String strEpcValue) { + boolean needPopup = false; + if (strPCValue == null) strPCValue = ""; + if (strPCValue.length() != 0) editTextAccPc.setText(strPCValue); + else strPCValue = strPCValueRef; + if (strPCValueRef != null && strPCValue != null) { + if (strPCValue.matches(strPCValueRef) == false && strPCValue.length() == 4) { + needPopup = true; + strPCValueRef = strPCValue; + } + } + + int iWordCount = getPC2EpcWordCount(strPCValue); + textViewEpcLength.setText("EPC has " + (iWordCount * 16) + " bits"); + if (strEpcValue != null) { + tagSelected.setAddress(strEpcValue); if (spinnerSelectBank.getSelectedItemPosition() == 0) selectTag.editTextTagID.setText(strEpcValue); + editTextAccessRWEpc.setText(strEpcValue); + } else { + if (iWordCount * 4 < selectTag.editTextTagID.getText().toString().length()) { + // needPopup = true; + String strTemp = selectTag.editTextTagID.getText().toString().substring(0, iWordCount * 4); + tagSelected.setAddress(strEpcValue); if (spinnerSelectBank.getSelectedItemPosition() == 0) selectTag.editTextTagID.setText(strTemp); + } + if (iWordCount * 4 < editTextAccessRWEpc.getText().toString().length()) { + // needPopup = true; + String strTemp = editTextAccessRWEpc.getText().toString().substring(0, iWordCount * 4); + editTextAccessRWEpc.setText(strTemp); + } + if (editTextAccessRWEpc.getText().toString().length() != 0) { + String strTemp = editTextAccessRWEpc.getText().toString(); + if (selectTag.editTextTagID.getText().toString().matches(strTemp) == false) { + // needPopup = true; + tagSelected.setAddress(strTemp); if (spinnerSelectBank.getSelectedItemPosition() == 0) selectTag.editTextTagID.setText(strTemp); + } + } + } + editTextAccessRWEpc.addTextChangedListener(new GenericTextWatcher(editTextAccessRWEpc, iWordCount * 4)); + String strTemp = editTextAccessRWEpc.getText().toString(); + editTextAccessRWEpc.setText(strTemp); + + if (needPopup) { + CustomPopupWindow customPopupWindow = new CustomPopupWindow(mContext); + customPopupWindow.popupStart("Changing EPC Length will automatically modify to " + (iWordCount * 16) + " bits.", false); + } + } + + long msStartTime; + void startAccessTask() { + if (selectTag.editTextTagID.getText().toString().length() == 0) { + Toast.makeText(MainActivity.mContext, "Please select tag first !!!", Toast.LENGTH_SHORT).show(); + return; + } + if (updating == false) { + msStartTime = SystemClock.elapsedRealtime(); + textViewRunTime.setText(""); + updating = true; bankProcessing = 0; restartAccessBank = -1; +// MainActivity.mCs108Library4a. + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + boolean updating = false; int bankProcessing = 0; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + boolean rerunRequest = true; boolean taskRequest = false; + if (processResult()) { rerunRequest = true; } + else if (accessTask == null || accessTask.isResultReady()) { + bcheckBoxAll = false; + boolean invalid = processTickItems(); + if (bankProcessing == 0 && bcheckBoxAll) rerunRequest = false; + else if (bankProcessing++ != 0 && invalid == true) rerunRequest = false; + else { + if (restartAccessBank != accessBank) { + restartAccessBank = accessBank; + restartCounter = 3; + } + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessReadWriteFragment().InventoryRfidTask(): tagID=" + selectTag.editTextTagID.getText() + ", operationrRead=" + operationRead + ", accessBank=" + accessBank + ", accOffset=" + accOffset + ", accSize=" + accSize); + int selectOffset = 0; + selectOffset = Integer.parseInt(editTextRWSelectOffset.getText().toString()); + EditText editTextBlockCount = (EditText) getActivity().findViewById(R.id.accessRWBlockCount); + Integer accBlockCount = 32; + try { + accBlockCount = Integer.parseInt(editTextBlockCount.getText().toString()); + } catch (Exception ex) { } + MainActivity.csLibrary4A.appendToLog("strOut: accWriteData=" + accWriteData); + accessTask = new AccessTask1( + (operationRead ? buttonRead : buttonWrite), invalid, + accessBank, accOffset, accSize, accBlockCount, accWriteData, + selectTag.editTextTagID.getText().toString(), spinnerSelectBank.getSelectedItemPosition() + 1, selectOffset, + editTextAccessRWAccPassword.getText().toString(), + Integer.valueOf(editTextaccessRWAntennaPower.getText().toString()), + (operationRead ? RfidReaderChipData.HostCommands.CMD_18K6CREAD: RfidReaderChipData.HostCommands.CMD_18K6CWRITE), updateRunnable); + accessTask.execute(); + rerunRequest = true; + } + } + if (rerunRequest) { + mHandler.postDelayed(updateRunnable, 100); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessReadWriteFragment().updateRunnable(): Restart"); + } + else { + if (bankProcessing == 0 && bcheckBoxAll) { + Toast.makeText(MainActivity.mContext, "no choice selected yet", Toast.LENGTH_SHORT).show(); + } + updating = false; + } + } + }; + + TextView textViewReserveOk, textViewPcOk, textViewEpcOk, textViewTidOk, textViewUserOk, textViewEpc1Ok; + CheckBox checkBoxReserve, checkBoxPc, checkBoxEpc, checkBoxTid, checkBoxUser, checkBoxEpc1; + int accessBank, accSize, accOffset; String accWriteData; + int restartCounter = 0; int restartAccessBank = -1; + boolean processResult() { + String accessResult = null; + if (accessTask == null) return false; + if (accessTask.isResultReady() == false) return false; + else { + long duration = SystemClock.elapsedRealtime() - msStartTime; + textViewRunTime.setText(String.format("Run time: %.2f sec", ((float) duration / 1000))); + accessResult = accessTask.getResult(); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("processResult(): accessResult = " + accessResult); + if (accessResult == null) { + if (readWriteTypes == ReadWriteTypes.RESERVE) { + textViewReserveOk.setText("E"); checkBoxReserve.setChecked(false); + } + if (readWriteTypes == ReadWriteTypes.PC) { + textViewPcOk.setText("E"); checkBoxPc.setChecked(false); + } + if (readWriteTypes == ReadWriteTypes.EPC) { + textViewEpcOk.setText("E"); checkBoxEpc.setChecked(false); + } + if (readWriteTypes == ReadWriteTypes.TID) { + textViewTidOk.setText("E"); checkBoxTid.setChecked(false); + } + if (readWriteTypes == ReadWriteTypes.USER) { + textViewUserOk.setText("E"); checkBoxUser.setChecked(false); + } + if (readWriteTypes == ReadWriteTypes.EPC1) { + textViewEpc1Ok.setText("E"); checkBoxEpc1.setChecked(false); + } + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("accessResult = " + accessResult); + if (readWriteTypes == ReadWriteTypes.RESERVE) { + textViewReserveOk.setText("O"); checkBoxReserve.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (accessResult.length() == 0 || operationRead == false) { + } else if (accessResult.length() < 8) { + editTextAccessRWKillPwd.setText(accessResult); + } else { + editTextAccessRWKillPwd.setText(accessResult.substring(0, 8)); + } + if (accessResult.length() <= 8) { + editTextAccessRWAccPwd.setText(""); + } else if (accessResult.length() < 16) { + editTextAccessRWAccPwd.setText(accessResult.subSequence(8, accessResult.length())); + } else { + editTextAccessRWAccPwd.setText(accessResult.subSequence(8, 16)); + } + } else if (readWriteTypes == ReadWriteTypes.PC) { + textViewPcOk.setText("O"); checkBoxPc.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) { + String newValue = ""; + if (accessResult.length() <= 4) { + newValue = accessResult.subSequence(0, accessResult.length()).toString(); + } else { + newValue = accessResult.subSequence(0, 4).toString(); + } + editTextAccPc.setText(newValue); + } + updatePCEpc(editTextAccPc.getText().toString(), null); + } else if (readWriteTypes == ReadWriteTypes.EPC) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessReadWrite(). EPC DATA with accessBank = " + accessBank + ", with accessResult.length = " + accessResult.length()); + textViewEpcOk.setText("O"); checkBoxEpc.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) { + String newValue = ""; + if (accessResult.length() <= 4) { + newValue = accessResult.subSequence(0, accessResult.length()).toString(); + } else { + newValue = accessResult.subSequence(0, 4).toString(); + } + editTextAccPc.setText(newValue); + } + updatePCEpc(editTextAccPc.getText().toString(), null); + + if (operationRead) { + String newValue = ""; + if (accessResult.length() > 4) { + newValue = accessResult.subSequence(4, accessResult.length()).toString(); + } + editTextAccessRWEpc.setText(newValue); + } + } else if (readWriteTypes == ReadWriteTypes.XPC) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessReadWrite(). XPC DATA with accessBank = " + accessBank + ", with accessResult.length = " + accessResult.length() + ", with accessResult=" + accessResult); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) { + String newValue = accessResult.toString(); + editTExtAccessRWXpc.setText(newValue); + accXpcValue = newValue; + } else { + accXpcValue = editTExtAccessRWXpc.getText().toString(); + } + } else if (readWriteTypes == ReadWriteTypes.TID) { + textViewTidOk.setText("O"); checkBoxTid.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (accessResult.length() == 0 || operationRead == false) { + } else editTextTidValue.setText(accessResult); + } else if (readWriteTypes == ReadWriteTypes.USER) { + textViewUserOk.setText("O"); checkBoxUser.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessReadWrite(). DATA with accessBank = " + accessBank); + if (accessTask != null) { + int iLength = accessTask.deformatWriteAccessData(accessResult).length(); + MainActivity.csLibrary4A.appendToLog("endingMessage length=" + iLength); + if (iLength < accSize*4) textViewUserOk.setText("H"); + } + editTextUserValue.setText(accessResult); + accUserValue = accessResult; + } else { + accUserValue = editTextUserValue.getText().toString(); + } + } else if (readWriteTypes == ReadWriteTypes.EPC1) { + textViewEpc1Ok.setText("O"); checkBoxEpc1.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (accessResult.length() == 0 || operationRead == false) { + } else { + editTextEpcValue.setText(accessResult); + accEpcValue = accessResult; + } + if (operationRead == false) accEpcValue = editTextEpcValue.getText().toString(); + } + accessResult = null; + } + accessTask = null; + return true; + } + } + boolean bcheckBoxAll = false; + boolean processTickItems() { + String writeData = ""; + boolean invalidRequest1 = false; + + textViewReserveOk = (TextView) getActivity().findViewById(R.id.accessRWReserveOK); + textViewPcOk = (TextView) getActivity().findViewById(R.id.accessRWPcOK); + textViewEpcOk = (TextView) getActivity().findViewById(R.id.accessRWEpcOK); + textViewTidOk = (TextView) getActivity().findViewById(R.id.accessRWTidOK); + textViewUserOk = (TextView) getActivity().findViewById(R.id.accessRWUserOK); + textViewEpc1Ok = (TextView) getActivity().findViewById(R.id.accessRWEpc1OK); + + checkBoxReserve = (CheckBox) getActivity().findViewById(R.id.accessRWReserveTitle); + checkBoxPc = (CheckBox) getActivity().findViewById(R.id.accessRWPcTitle); + checkBoxEpc = (CheckBox) getActivity().findViewById(R.id.accessRWEpcTitle); + checkBoxTid = (CheckBox) getActivity().findViewById(R.id.accessRWTidTitle); + checkBoxUser = (CheckBox) getActivity().findViewById(R.id.accessRWUserTitle); + checkBoxEpc1 = (CheckBox) getActivity().findViewById(R.id.accessRWEpc1); + + if (checkBoxReserve.isChecked() == true) { + textViewReserveOk.setText(""); + accessBank = 0; accOffset = 0; accSize = 4; readWriteTypes = ReadWriteTypes.RESERVE; + if (operationRead) { + editTextAccessRWKillPwd.setText(""); + editTextAccessRWAccPwd.setText(""); + } else { + String strValue = editTextAccessRWKillPwd.getText().toString(); + String strValue1 = editTextAccessRWAccPwd.getText().toString(); + if (strValue.length() != 8 || strValue1.length() != 8) { + invalidRequest1 = true; + } else { + writeData = strValue + strValue1; + } + } + } else if (checkBoxPc.isChecked() == true || ((checkBoxEpc.isChecked() == true) && (strPCValueRef.length() != 4) )) { + textViewPcOk.setText(""); + accessBank = 1; accOffset = 1; accSize = 1; readWriteTypes = ReadWriteTypes.PC; + if (operationRead) { + editTextAccPc.setText(""); + } else { + String strValue = editTextAccPc.getText().toString(); + if (strValue.length() != 4) invalidRequest1 = true; + else writeData = strValue; + } + } else if (checkBoxEpc.isChecked() == true) { + textViewEpcOk.setText(""); + accessBank = 1; accOffset = 1; accSize = 0; readWriteTypes = ReadWriteTypes.EPC; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("processTickItems(): start EPC operation"); + if (operationRead) { + if (strPCValueRef.length() != 4) accSize = 1; + else { + accSize = getPC2EpcWordCount(strPCValueRef) + 1; + editTextAccessRWEpc.setText(""); + } + } else { + String strValue = editTextAccPc.getText().toString(); + String strValue1 = editTextAccessRWEpc.getText().toString(); + if (strValue1.length() == 0) { + if (strValue.length() != 4) invalidRequest1 = true; + else { + accSize = 1; + writeData = strValue; + } + } else { + accSize += strValue1.length() / 4; + if (strValue1.length() % 4 != 0) accSize++; + if (strValue.length() == 4) { + int iPCWordCount = getPC2EpcWordCount(strValue); + if (iPCWordCount < accSize) accSize = iPCWordCount; + accSize++; + writeData = strValue + strValue1; + } else { + accOffset = 2; + writeData = strValue1; + } + } + } + } else if (checkBoxTid.isChecked() == true) { + textViewTidOk.setText(""); + accessBank = 2; accOffset = 0; accSize = 0; readWriteTypes = ReadWriteTypes.TID; + EditText editTextTidValue = (EditText) getActivity().findViewById(R.id.accessRWTidValue); + if (operationRead) { + int iValue = 0; + try { + EditText editTextTidOffset = (EditText) getActivity().findViewById(R.id.accessRWTidOffset); + iValue = Integer.parseInt(editTextTidOffset.getText().toString()); + } catch (Exception ex) { + } + accOffset = iValue; + iValue = 0; + try { + EditText editTextTidLength = (EditText) getActivity().findViewById(R.id.accessRWTidLength); + iValue = Integer.parseInt(editTextTidLength.getText().toString()); + } catch (Exception ex) { + } + accSize = iValue; + editTextTidValue.setText(""); + } else { + invalidRequest1 = true; + editTextTidValue.setText(""); + + } + } else if (checkBoxUser.isChecked() == true) { + textViewUserOk.setText(""); + accessBank = 3; accOffset = 0; accSize = 0; readWriteTypes = ReadWriteTypes.USER; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("processTickItems(): start USER operation"); + int iValue = 0; + try { + EditText editTextTidOffset = (EditText) getActivity().findViewById(R.id.accessRWUserOffset); + iValue = Integer.parseInt(editTextTidOffset.getText().toString()); + } catch (Exception ex) { + } + accOffset = iValue; + iValue = 0; + try { + EditText editTextUserLength = (EditText) getActivity().findViewById(R.id.accessRWUserLength); + iValue = Integer.parseInt(editTextUserLength.getText().toString()); + } catch (Exception ex) { + } + accSize = iValue; + if (operationRead) { + editTextUserValue.setText(""); + } else { + String strValue = editTextUserValue.getText().toString(); + MainActivity.csLibrary4A.appendToLog("strOut: strValue=" + strValue + ", strValue.length=" + strValue.length() + ", accUserValue=" + accUserValue + ", accUserValue.lengt=" + accUserValue.length()); + if (strValue.length() >= 4 && accUserValue.matches(strValue) == false) { + writeData = strValue; + } + } + } else if (checkBoxEpc1.isChecked() == true) { + textViewEpc1Ok.setText(""); + accessBank = spinnerRWSelectEpc1.getSelectedItemPosition(); accOffset = 0; accSize = 0; readWriteTypes = ReadWriteTypes.EPC1; + int iValue = 0; + try { + EditText editTextEpcOffset = (EditText) getActivity().findViewById(R.id.accessRWEpcOffset); + iValue = Integer.parseInt(editTextEpcOffset.getText().toString()); + } catch (Exception ex) { + } + accOffset = iValue; + iValue = 0; + try { + EditText editTextEpcLength = (EditText) getActivity().findViewById(R.id.accessRWEpcLength); + iValue = Integer.parseInt(editTextEpcLength.getText().toString()); + } catch (Exception ex) { + } + accSize = iValue; + if (operationRead) { + editTextEpcValue.setText(""); + } else { + String strValue = editTextEpcValue.getText().toString(); + if (strValue.length() >= 4 && strValue.matches(accEpcValue) == false) { + accSize = strValue.length() / 4; + if (strValue.length() %4 != 0) accSize++; + writeData = strValue; + } + } + } else { + invalidRequest1 = true; + bcheckBoxAll = true; + } + + if (restartAccessBank == accessBank) { + if (restartCounter == 0) invalidRequest1 = true; + else restartCounter--; + } + accWriteData = writeData; + return invalidRequest1; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.app.Activity; +import android.graphics.Typeface; +import android.os.Bundle; +import android.os.Handler; +import android.os.SystemClock; +import androidx.appcompat.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask1; +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.GenericTextWatcher; +import com.csl.cs710ademoapp.SelectTag; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +import static com.csl.cs710ademoapp.MainActivity.mContext; +import static com.csl.cs710ademoapp.MainActivity.tagSelected; + +public class AccessReadWriteUserFragment extends CommonFragment { + SelectTag selectTag; + Spinner spinnerSelectBank, spinnerRWSelectBank; + EditText editTextRWSelectOffset, editTextAccessRWAccPassword, editTextAccessRWKillPwd, editTextAccessRWAccPwd, editTextAccPc, editTextAccessRWEpc; + EditText editTextUserValue, editTextEpcValue, editTextaccessRWAntennaPower; + TextView textViewEpcLength, textViewRunTime; + private Button buttonRead; + private Button buttonWrite; + Handler mHandler = new Handler(); + String strPCValueRef = ""; + + String accEpcValue = ""; String accUserValue = ""; + enum ReadWriteTypes { + NULL, USER, SBANK + } + boolean operationRead = false; + ReadWriteTypes readWriteTypes; + + private AccessTask1 accessTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_access_readwrite, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + androidx.appcompat.app.ActionBar actionBar; + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_access); + actionBar.setTitle(R.string.title_activity_readWriteUser); + + selectTag = new SelectTag((Activity)getActivity(), 0); + spinnerSelectBank = (Spinner) getActivity().findViewById(R.id.selectMemoryBank); + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.read_memoryBank_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerSelectBank.setAdapter(targetAdapter); + spinnerSelectBank.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + switch (position) { + case 0: //if EPC + if (tagSelected != null) selectTag.editTextTagID.setText(tagSelected.getAddress()); + editTextRWSelectOffset.setText("32"); + break; + case 1: + if (tagSelected != null) { if (tagSelected.getTid() != null) selectTag.editTextTagID.setText(tagSelected.getTid()); } + editTextRWSelectOffset.setText("0"); + break; + case 2: + if (tagSelected != null) { if (tagSelected.getUser() != null) selectTag.editTextTagID.setText(tagSelected.getUser()); } + editTextRWSelectOffset.setText("0"); + break; + default: + break; + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + + TableRow tableRow = (TableRow) getActivity().findViewById(R.id.accessRWReserveTitleRow); + tableRow.setVisibility(View.GONE); + tableRow = (TableRow) getActivity().findViewById(R.id.accessRWReserveValueRow); + tableRow.setVisibility(View.GONE); + tableRow = (TableRow) getActivity().findViewById(R.id.accessRWPcTitleRow); + tableRow.setVisibility(View.GONE); + tableRow = (TableRow) getActivity().findViewById(R.id.accessRWEpcTitleRow); + tableRow.setVisibility(View.GONE); + tableRow = (TableRow) getActivity().findViewById(R.id.accessRWTidTitleRow); + tableRow.setVisibility(View.GONE); + tableRow = (TableRow) getActivity().findViewById(R.id.accessRWTidValueRow); + tableRow.setVisibility(View.GONE); + tableRow = (TableRow) getActivity().findViewById(R.id.accessRWAnyTitleRow); + tableRow.setVisibility(View.GONE); + tableRow = (TableRow) getActivity().findViewById(R.id.accessRWAnyValueRow); + tableRow.setVisibility(View.GONE); + + editTextRWSelectOffset = (EditText) getActivity().findViewById(R.id.selectMemoryOffset); + spinnerRWSelectBank = (Spinner) getActivity().findViewById(R.id.accessRWEpc1Title1); + ArrayAdapter targetAdapter1 = ArrayAdapter.createFromResource(getActivity(), R.array.memoryBank_options, R.layout.custom_spinner_layout); + targetAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerRWSelectBank.setAdapter(targetAdapter1); spinnerRWSelectBank.setSelection(1); + + editTextAccessRWAccPassword = (EditText) getActivity().findViewById(R.id.selectPasswordValue); + editTextAccessRWAccPassword.addTextChangedListener(new GenericTextWatcher(editTextAccessRWAccPassword, 8)); + editTextAccessRWAccPassword.setText("00000000"); + editTextAccessRWKillPwd = (EditText) getActivity().findViewById(R.id.accessRWKillPwdValue); + editTextAccessRWKillPwd.addTextChangedListener(new GenericTextWatcher(editTextAccessRWKillPwd, 8)); + editTextAccessRWAccPwd = (EditText) getActivity().findViewById(R.id.accessRWAccPwdValue); + editTextAccessRWAccPwd.addTextChangedListener(new GenericTextWatcher(editTextAccessRWAccPwd, 8)); + editTextAccPc = (EditText) getActivity().findViewById(R.id.accessRWAccPcValue); + editTextAccPc.setHint("PC value"); + editTextAccPc.addTextChangedListener(new GenericTextWatcher(editTextAccPc, 4)); + editTextAccessRWEpc = (EditText) getActivity().findViewById(R.id.accessRWAccEpcValue); + EditText editTextBlockCount = (EditText) getActivity().findViewById(R.id.accessRWBlockCount); + editTextBlockCount.setText("48"); + EditText editTextUserLength = (EditText) getActivity().findViewById(R.id.accessRWUserLength); + editTextUserLength.setText("512"); + editTextUserValue = (EditText) getActivity().findViewById(R.id.accessRWUserValue); editTextUserValue.setTypeface(Typeface.MONOSPACE); + editTextUserValue.setHint("Data Pattern"); + editTextEpcValue = (EditText) getActivity().findViewById(R.id.accessRWEpcValue); + editTextEpcValue.setHint("Data Pattern"); + + editTextaccessRWAntennaPower = (EditText) getActivity().findViewById(R.id.selectAntennaPower); + editTextaccessRWAntennaPower.setText(String.valueOf(300)); + + textViewEpcLength = (TextView) getActivity().findViewById(R.id.accessRWAccEpcLength); + textViewRunTime = (TextView) getActivity().findViewById(R.id.accessRWRunTime); + + buttonRead = (Button) getActivity().findViewById(R.id.accessRWReadButton); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + operationRead = true; startAccessTask(); + } + }); + + buttonWrite = (Button) getActivity().findViewById(R.id.accessRWWriteButton); + buttonWrite.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + operationRead = false; startAccessTask(); + } + }); + + ReaderDevice tagSelected = MainActivity.tagSelected; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + String strEpcValue = tagSelected.getAddress(); + String detail = tagSelected.getDetails(); + String header = "PC="; + int index = detail.indexOf(header) + header.length(); + strPCValueRef = detail.substring(index, index + 4); + updatePCEpc(strPCValueRef, strEpcValue); + } + } + MainActivity.csLibrary4A.setSameCheck(true); + } + + @Override + public void onDestroy() { + if (accessTask != null) accessTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + public AccessReadWriteUserFragment() { + super("AccessReadWriteUserFragment"); + } + + int getPC2EpcWordCount(String detail) { + String detail2 = detail.substring(0, 1); + int number2 = Integer.valueOf(detail2, 16) * 2; + String detail3 = detail.substring(1, 2); + int number3 = Integer.valueOf(detail3, 16); + if ((number3 / 8) != 0) number2 += 1; + return number2; + } + void updatePCEpc(String strPCValue, String strEpcValue) { + boolean needPopup = false; + if (strPCValue == null) strPCValue = ""; + if (strPCValue.length() != 0) editTextAccPc.setText(strPCValue); + else strPCValue = strPCValueRef; + if (strPCValueRef != null && strPCValue != null) { + if (strPCValue.matches(strPCValueRef) == false && strPCValue.length() == 4) { + needPopup = true; + strPCValueRef = strPCValue; + } + } + + int iWordCount = getPC2EpcWordCount(strPCValue); + textViewEpcLength.setText("EPC has " + (iWordCount * 16) + " bits"); + if (strEpcValue != null) { + tagSelected.setAddress(strEpcValue); if (spinnerSelectBank.getSelectedItemPosition() == 0) selectTag.editTextTagID.setText(strEpcValue); + editTextAccessRWEpc.setText(strEpcValue); + } else { + if (iWordCount * 4 < selectTag.editTextTagID.getText().toString().length()) { + // needPopup = true; + String strTemp = selectTag.editTextTagID.getText().toString().substring(0, iWordCount * 4); + tagSelected.setAddress(strEpcValue); if (spinnerSelectBank.getSelectedItemPosition() == 0) selectTag.editTextTagID.setText(strTemp); + } + if (iWordCount * 4 < editTextAccessRWEpc.getText().toString().length()) { + // needPopup = true; + String strTemp = editTextAccessRWEpc.getText().toString().substring(0, iWordCount * 4); + editTextAccessRWEpc.setText(strTemp); + } + if (editTextAccessRWEpc.getText().toString().length() != 0) { + String strTemp = editTextAccessRWEpc.getText().toString(); + if (selectTag.editTextTagID.getText().toString().matches(strTemp) == false) { + // needPopup = true; + tagSelected.setAddress(strEpcValue); if (spinnerSelectBank.getSelectedItemPosition() == 0) selectTag.editTextTagID.setText(strTemp); + } + } + } + editTextAccessRWEpc.addTextChangedListener(new GenericTextWatcher(editTextAccessRWEpc, iWordCount * 4)); + String strTemp = editTextAccessRWEpc.getText().toString(); + editTextAccessRWEpc.setText(strTemp); + + if (needPopup) { + CustomPopupWindow customPopupWindow = new CustomPopupWindow(mContext); + customPopupWindow.popupStart("Changing EPC Length will automatically modify to " + (iWordCount * 16) + " bits.", false); + } + } + + long msStartTime; + void startAccessTask() { + if (selectTag.editTextTagID.getText().toString().length() == 0) { + Toast.makeText(MainActivity.mContext, "Please select tag first !!!", Toast.LENGTH_SHORT).show(); + return; + } + CheckBox checkBox = (CheckBox) getActivity().findViewById(R.id.accessRWUserTitle); + checkBox.setChecked(true); + if (updating == false) { + msStartTime = SystemClock.elapsedRealtime(); + textViewRunTime.setText(""); MainActivity.csLibrary4A.appendToLog("StreamOut: Start of running time"); + updating = true; bankProcessing = 0; restartAccessBank = -1; + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + boolean updating = false; int bankProcessing = 0; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + boolean rerunRequest = true; boolean taskRequest = false; + if (processResult()) { rerunRequest = true; } + else if (accessTask == null || accessTask.isResultReady()) { + bcheckBoxAll = false; + boolean invalid = processTickItems(); + if (bankProcessing == 0 && bcheckBoxAll) rerunRequest = false; + else if (bankProcessing++ != 0 && invalid == true) rerunRequest = false; + else { + if (restartAccessBank != accessBank) { + restartAccessBank = accessBank; + restartCounter = 3; + } + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessReadWriteUserFragment().InventoryRfidTask(): tagID=" + selectTag.editTextTagID.getText() + ", operationrRead=" + operationRead + ", accessBank=" + accessBank + ", accOffset=" + accOffset + ", accSize=" + accSize); + int selectOffset = 0; + selectOffset = Integer.parseInt(editTextRWSelectOffset.getText().toString()); + EditText editTextBlockCount = (EditText) getActivity().findViewById(R.id.accessRWBlockCount); + Integer accBlockCount = 32; + try { + accBlockCount = Integer.parseInt(editTextBlockCount.getText().toString()); + } catch (Exception ex) { } + MainActivity.csLibrary4A.appendToLog("strOut: accWriteData=" + accWriteData); + accessTask = new AccessTask1( + (operationRead ? buttonRead : buttonWrite), invalid, + accessBank, accOffset, accSize, accBlockCount, accWriteData, + selectTag.editTextTagID.getText().toString(), spinnerSelectBank.getSelectedItemPosition() + 1, selectOffset, + editTextAccessRWAccPassword.getText().toString(), + Integer.valueOf(editTextaccessRWAntennaPower.getText().toString()), + (operationRead ? RfidReaderChipData.HostCommands.CMD_18K6CREAD: RfidReaderChipData.HostCommands.CMD_18K6CWRITE), updateRunnable); + accessTask.execute(); + rerunRequest = true; + } + } + if (rerunRequest) { + mHandler.postDelayed(updateRunnable, 100); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessReadWriteUserFragment().updateRunnable(): Restart"); + } + else { + if (bankProcessing == 0 && bcheckBoxAll) { + Toast.makeText(MainActivity.mContext, "no choice selected yet", Toast.LENGTH_SHORT).show(); + } + updating = false; + } + } + }; + + TextView textViewUserOk, textViewBankOk; + CheckBox checkBoxUser, checkBoxBank; + int accessBank, accSize, accOffset; String accWriteData; + int restartCounter = 0; int restartAccessBank = -1; + boolean processResult() { + String accessResult = null; + if (accessTask == null) return false; + if (accessTask.isResultReady() == false) return false; + else { + long duration = SystemClock.elapsedRealtime() - msStartTime; + textViewRunTime.setText(String.format("Run time: %.2f sec", ((float) duration / 1000))); MainActivity.csLibrary4A.appendToLog("StreamOut: End of running time"); + accessResult = accessTask.getResult(); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("processResult(): accessResult = " + accessResult); + if (accessResult == null) { + if (readWriteTypes == ReadWriteTypes.USER) { + textViewUserOk.setText("E"); checkBoxUser.setChecked(false); + } + if (readWriteTypes == ReadWriteTypes.SBANK) { + textViewBankOk.setText("E"); checkBoxBank.setChecked(false); + } + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("accessResult = " + accessResult); + if (readWriteTypes == ReadWriteTypes.USER) { + textViewUserOk.setText("O"); checkBoxUser.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessReadWrite(). DATA with accessBank = " + accessBank); + if (accessTask != null) { + int iLength = accessTask.deformatWriteAccessData(accessResult).length(); + MainActivity.csLibrary4A.appendToLog("endingMessage length=" + iLength); + if (iLength < accSize*4) textViewUserOk.setText("H"); + } + editTextUserValue.setText(accessResult); + accUserValue = accessResult; + } else { + accUserValue = editTextUserValue.getText().toString(); + } + } else if (readWriteTypes == ReadWriteTypes.SBANK) { + textViewBankOk.setText("O"); checkBoxBank.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (accessResult.length() == 0 || operationRead == false) { + } else { + editTextEpcValue.setText(accessResult); + accEpcValue = accessResult; + } + if (operationRead == false) accEpcValue = editTextEpcValue.getText().toString(); + } + accessResult = null; + } + accessTask = null; + return true; + } + } + boolean bcheckBoxAll = false; + boolean processTickItems() { + String writeData = ""; + boolean invalidRequest1 = false; + + textViewUserOk = (TextView) getActivity().findViewById(R.id.accessRWUserOK); + textViewBankOk = (TextView) getActivity().findViewById(R.id.accessRWEpc1OK); + + checkBoxUser = (CheckBox) getActivity().findViewById(R.id.accessRWUserTitle); + checkBoxBank = (CheckBox) getActivity().findViewById(R.id.accessRWEpc1); + + if (checkBoxUser.isChecked() == true) { + textViewUserOk.setText(""); + accessBank = 3; accOffset = 0; accSize = 0; readWriteTypes = ReadWriteTypes.USER; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("processTickItems(): start USER operation"); + int iValue = 0; + try { + EditText editTextTidOffset = (EditText) getActivity().findViewById(R.id.accessRWUserOffset); + iValue = Integer.parseInt(editTextTidOffset.getText().toString()); + } catch (Exception ex) { + } + accOffset = iValue; + iValue = 0; + try { + EditText editTextUserLength = (EditText) getActivity().findViewById(R.id.accessRWUserLength); + iValue = Integer.parseInt(editTextUserLength.getText().toString()); + } catch (Exception ex) { + } + accSize = iValue; + if (operationRead) { + editTextUserValue.setText(""); + } else { + String strValue = editTextUserValue.getText().toString(); + MainActivity.csLibrary4A.appendToLog("strOut: strValue=" + strValue + ", strValue.length=" + strValue.length() + ", accUserValue=" + accUserValue + ", accUserValue.lengt=" + accUserValue.length()); + if (strValue.length() >= 4 && accUserValue.matches(strValue) == false) { + writeData = strValue; + } + } + } else if (checkBoxBank.isChecked() == true) { + textViewBankOk.setText(""); + accessBank = spinnerRWSelectBank.getSelectedItemPosition(); accOffset = 0; accSize = 0; readWriteTypes = ReadWriteTypes.SBANK; + int iValue = 0; + try { + EditText editTextEpcOffset = (EditText) getActivity().findViewById(R.id.accessRWEpcOffset); + iValue = Integer.parseInt(editTextEpcOffset.getText().toString()); + } catch (Exception ex) { + } + accOffset = iValue; + iValue = 0; + try { + EditText editTextEpcLength = (EditText) getActivity().findViewById(R.id.accessRWEpcLength); + iValue = Integer.parseInt(editTextEpcLength.getText().toString()); + } catch (Exception ex) { + } + accSize = iValue; + if (operationRead) { + editTextEpcValue.setText(""); + } else { + String strValue = editTextEpcValue.getText().toString(); + if (strValue.length() >= 4 && strValue.matches(accEpcValue) == false) { + accSize = strValue.length() / 4; + if (strValue.length() %4 != 0) accSize++; + writeData = strValue; + } + } + } else { + invalidRequest1 = true; + bcheckBoxAll = true; + } + + if (restartAccessBank == accessBank) { + if (restartCounter == 0) invalidRequest1 = true; + else restartCounter--; + } + accWriteData = writeData; + return invalidRequest1; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cs710ademoapp.MainActivity.mContext; + +import android.graphics.Color; +import android.os.AsyncTask; +import android.os.Bundle; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.InventoryBarcodeTask; +import com.csl.cs710ademoapp.InventoryRfidTask; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.NotificationConnector; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; +import com.csl.cslibrary4a.Utility; + +import java.util.ArrayList; + +public class AccessRegisterFragment extends CommonFragment { + CustomPopupWindow customPopupWindow; + + TableRow tableRowSelectMask, tableRowSelectBank; + Spinner spinnerSelectBank, spinnerAccessBank, spinnerWriteEpcClass, spinnerWriteDataType; + EditText editTextSelectMask, editTextSelectPopulation, editTextPassword, editTextAntennaPower, editTextWriteData, editTextWriteLength; + CheckBox checkBoxWriteLengthEnable; + TextView textViewSelectedTags, textViewWriteCount, textViewRunTime, textViewTagGot, textViewVoltageLevel; + TextView textViewYield, textViewTotal; + Button buttonSelect, buttonClearSelect, buttonReadBar, buttonWrite; + + InventoryRfidTask inventoryRfidTask; + InventoryBarcodeTask inventoryBarcodeTask; + AccessTask accessTask; + + ReaderDevice tagSelected = MainActivity.tagSelected; + boolean newWriteData; + String writeValueOld = ""; + int iAutoRun = 0; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_access_register, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_access); + actionBar.setTitle(R.string.title_activity_registertag); + + customPopupWindow = new CustomPopupWindow(mContext); + + tableRowSelectMask = (TableRow) getActivity().findViewById(R.id.registerSelectMaskRow); + tableRowSelectBank = (TableRow) getActivity().findViewById(R.id.registerSelectBankRow); + + spinnerSelectBank = (Spinner) getActivity().findViewById(R.id.registerSelectBank); + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.read_memoryBank_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerSelectBank.setAdapter(targetAdapter); + spinnerSelectBank.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + switch (position) { + case 0: //if EPC + if (tagSelected != null) editTextSelectMask.setText(tagSelected.getAddress()); + break; + case 1: + if (tagSelected != null) { if (tagSelected.getTid() != null) editTextSelectMask.setText(tagSelected.getTid()); } + break; + case 2: + if (tagSelected != null) { if (tagSelected.getUser() != null) editTextSelectMask.setText(tagSelected.getUser()); } + break; + default: + break; + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + + spinnerAccessBank = (Spinner) getActivity().findViewById(R.id.registerAccessBank); + targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.write_memoryBank_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerAccessBank.setAdapter(targetAdapter); + + spinnerWriteEpcClass = (Spinner) getActivity().findViewById(R.id.registerWriteEpcClass); + targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.write_Epc_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerWriteEpcClass.setAdapter(targetAdapter); + spinnerWriteEpcClass.setEnabled(false); + + spinnerWriteDataType = (Spinner) getActivity().findViewById(R.id.registerWriteDataType); + targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.write_data_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerWriteDataType.setAdapter(targetAdapter); + + Button buttonConfirm = (Button) getActivity().findViewById(R.id.registerConfirm2Button); + buttonConfirm.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast.makeText(MainActivity.mContext, "Step 2 data is confirmed.", Toast.LENGTH_SHORT).show(); + } + }); + + editTextSelectMask = (EditText) getActivity().findViewById(R.id.registerSelectMask); + editTextSelectPopulation = (EditText) getActivity().findViewById(R.id.registerSelectPopulation); + editTextPassword = (EditText) getActivity().findViewById(R.id.registerPassword); + editTextPassword.setText("00000000"); + editTextAntennaPower = (EditText) getActivity().findViewById(R.id.registerAntennaPower); + editTextWriteData = (EditText) getActivity().findViewById(R.id.registerWriteData); + editTextWriteData.setEnabled(true); +// editTextBarValue.setText("19dec163"); + newWriteData = false; editTextWriteData.setTextColor(Color.RED); + editTextWriteData.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + + @Override + public void afterTextChanged(Editable editable) { + String writeValue = editTextWriteData.getText().toString().trim(); + if (true) newWriteData = true; + if (writeValue.matches(writeValueOld) == false) { + writeValueOld = writeValue; + editTextWriteData.setTextColor(Color.BLACK); + //checkBoxNewValue.setEnabled(true); + //checkBoxNewValue.setText("Reset to old value"); + newWriteData = true; + } + + if (inventoryBarcodeTask != null) { + if (inventoryBarcodeTask.getStatus() == AsyncTask.Status.RUNNING) { + barcodeReadDone = true; MainActivity.csLibrary4A.appendToLog("barcodeReadDone = true in textChanged"); + MainActivity.csLibrary4A.appendToLog("going to startStopBarcodeHandler 1"); startStopBarcodeHandler(false); + } + } + if (checkBoxWriteLengthEnable.isChecked() == false) { + int length1 = writeValue.length() * 4; + int length = length1 / 16; + if (length * 16 != length1) length++; + editTextWriteLength.setText(String.valueOf(length)); + } + } + }); + editTextWriteLength = (EditText) getActivity().findViewById(R.id.registerWriteLength); + + checkBoxWriteLengthEnable = (CheckBox) getActivity().findViewById(R.id.registerWriteLengthEnable); + checkBoxWriteLengthEnable.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + if (isChecked) editTextWriteLength.setEnabled(true); + else editTextWriteLength.setEnabled(false); + } + }); + + buttonClearSelect = (Button) getActivity().findViewById(R.id.registerClearSelectButton); + buttonClearSelect.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + tagSelected = null; + editTextSelectMask.setText(""); + } + }); + + buttonSelect = (Button) getActivity().findViewById(R.id.registerSelectButton); + buttonSelect.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (buttonSelect.getText().toString().contains("Clear")) { + buttonClearSelect.setVisibility(View.VISIBLE); + tableRowSelectMask.setVisibility(View.VISIBLE); + tableRowSelectBank.setVisibility(View.VISIBLE); + textViewSelectedTags.setText(""); + buttonSelect.setText("Read"); + } else if (buttonSelect.getText().toString().contains("Stop")) { + inventoryRfidTask.taskCancelReason = InventoryRfidTask.TaskCancelRReason.BUTTON_RELEASE; + mHandler.removeCallbacks(runnableSelect); + textViewSelectedTags.setText(""); + for (int i = 0; i < epcArrayList.size(); i++) { + MainActivity.csLibrary4A.appendToLog("epcArrayList.get[" + i + "] = " + epcArrayList.get(i)); + textViewSelectedTags.append(epcArrayList.get(i) + "\n"); + } + if (textViewSelectedTags.getText().toString().trim().length() == 0) { + buttonSelect.setText("Read"); + } else { + buttonClearSelect.setVisibility(View.GONE); + tableRowSelectMask.setVisibility(View.GONE); + tableRowSelectBank.setVisibility(View.GONE); + buttonSelect.setText("Clear"); + } + } + else { + textViewSelectedTags.setText(""); + String strTagId = editTextSelectMask.getText().toString(); + int selectBank = spinnerSelectBank.getSelectedItemPosition() + 1; + long pwrlevel = Integer.parseInt(editTextAntennaPower.getText().toString()); + MainActivity.csLibrary4A.setTagRead(0); + MainActivity.csLibrary4A.setSelectedTag(strTagId, selectBank, pwrlevel); + MainActivity.csLibrary4A.appendToLog("Debug_Compact: AccessRegisterFragment.onActivityCreated.onClick"); + MainActivity.csLibrary4A.startOperation(RfidReaderChipData.OperationTypes.TAG_INVENTORY); + inventoryRfidTask = new InventoryRfidTask(); + inventoryRfidTask.execute(); + MainActivity.sharedObjects.serviceArrayList.clear(); epcArrayList.clear(); + mHandler.post(runnableSelect); buttonSelect.setText("Stop"); + } + } + }); + + Button buttonConvert = (Button) getActivity().findViewById(R.id.registerWriteConvert); + buttonConvert.setOnClickListener(new View.OnClickListener() { + EditText editTextWriteEpcFilter = (EditText) getActivity().findViewById(R.id.registerWriteEpcFilter); + EditText editTextWriteEpcCompanyPrefix = (EditText) getActivity().findViewById(R.id.registerWriteEpcCompanyPrefix); + EditText editTextWriteEpcItemReference = (EditText) getActivity().findViewById(R.id.registerWriteEpcItemReference); + EditText editTextWriteEpcSerial = (EditText) getActivity().findViewById(R.id.registerWriteEpcSerial); + @Override + public void onClick(View view) { + String strValue = MainActivity.csLibrary4A.getEpc4upcSerial( + Utility.EpcClass.values()[spinnerWriteEpcClass.getSelectedItemPosition()], + editTextWriteEpcFilter.getText().toString(), + editTextWriteEpcCompanyPrefix.getText().toString(), + editTextWriteEpcItemReference.getText().toString(), + editTextWriteEpcSerial.getText().toString() + ); + if (strValue != null) editTextWriteData.setText(strValue); + } + }); + + buttonReadBar = (Button) getActivity().findViewById(R.id.registerReadBarButton); + buttonReadBar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + MainActivity.csLibrary4A.appendToLog("going to startStopBarcodeHandler 2"); startStopBarcodeHandler(false); + } + }); + + textViewSelectedTags = (TextView) getActivity().findViewById(R.id.registerSelectedTags); + //textViewWriteCount = (TextView) getActivity().findViewById(R.id.registerWrittenCount); + textViewRunTime = (TextView) getActivity().findViewById(R.id.registerRunTime); + textViewTagGot = (TextView) getActivity().findViewById(R.id.registetTagGotView); + textViewVoltageLevel = (TextView) getActivity().findViewById(R.id.registerVoltageLevel); + + buttonWrite = (Button) getActivity().findViewById(R.id.registerWriteButton); + buttonWrite.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (buttonWrite.getText().toString().trim().length() == 0) return; + runningAuto123 = 0; startStopAccessHandler(false); + } + }); + + Button buttonWrite3 = (Button) getActivity().findViewById(R.id.registerWrite3Button); + buttonWrite3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (accessTask != null) if (accessTask.getStatus() == AsyncTask.Status.RUNNING) return; + runningAuto123 = 0; startStopAccessHandler(false); + } + }); + + Button buttonAuto = (Button) getActivity().findViewById(R.id.registerAutoButton); + buttonAuto.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (accessTask != null) if (accessTask.getStatus() == AsyncTask.Status.RUNNING) return; + runningAuto123 = 1; startStopAccessHandler(false); + } + }); + + Button buttonAuto123 = (Button) getActivity().findViewById(R.id.registerAutoButtonWBarcodeRead); + buttonAuto123.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (accessTask != null) if (accessTask.getStatus() == AsyncTask.Status.RUNNING) return; + runningAuto123 = 2; mHandler.post(runnableAuto123); + } + }); + + textViewYield = (TextView) getActivity().findViewById(R.id.registerYieldView); + textViewTotal = (TextView) getActivity().findViewById(R.id.registerTotalView); + + Button buttonResetCount = (Button) getActivity().findViewById(R.id.registerResetCountButton); + buttonResetCount.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + resetCount = true; + textViewRunTime.setText(""); textViewTagGot.setText(""); textViewVoltageLevel.setText(""); + textViewYield.setText(""); textViewTotal.setText(""); + } + }); + + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onResume() { + super.onResume(); + setNotificationListener(); + } + + @Override + public void onPause() { + MainActivity.csLibrary4A.setNotificationListener(null); + super.onPause(); + } + + @Override + public void onDestroy() { + MainActivity.csLibrary4A.setNotificationListener(null); + mHandler.removeCallbacks(runnableSelect); + mHandler.removeCallbacks(runnableAuto123); + if (inventoryBarcodeTask != null) inventoryBarcodeTask.taskCancelReason = InventoryBarcodeTask.TaskCancelRReason.DESTORY; + if (accessTask != null) accessTask.taskCancelReason = AccessTask.TaskCancelRReason.DESTORY; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AcccessRegisterFragment().onDestory(): onDestory()"); + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + public AccessRegisterFragment() { + super("AccessRegisterFragment"); + } + + void setNotificationListener() { + MainActivity.csLibrary4A.setNotificationListener(new NotificationConnector.NotificationListener() { + @Override + public void onChange() { + MainActivity.csLibrary4A.appendToLog("TRIGGER key is pressed."); + if (barcodeReadRequesting) { + if (customPopupWindow.popupWindow.isShowing()) { + customPopupWindow.popupWindow.dismiss(); + barcodeReadRequesting = false; MainActivity.csLibrary4A.appendToLog("barcodeReadRequesting = false"); + ready2nextRun = true; MainActivity.csLibrary4A.appendToLog("ready2nextRun 1 = true after popup"); + } + } + } + }); + } + + ArrayList epcArrayList = new ArrayList(); + Runnable runnableSelect = new Runnable() { + @Override + public void run() { + while (MainActivity.sharedObjects.serviceArrayList.size() != 0) { + String strEpc = MainActivity.sharedObjects.serviceArrayList.get(0); MainActivity.sharedObjects.serviceArrayList.remove(0); + MainActivity.csLibrary4A.appendToLog("epcArrayList.add[" + epcArrayList.size() + "] = " + strEpc); + boolean matched = false; + for (int i = 0; i < epcArrayList.size(); i++) { + if (epcArrayList.get(i).matches(strEpc)) { + matched = true; + break; + } + } + if (matched == false && strEpc != null) { + epcArrayList.add(strEpc); + } + } + textViewSelectedTags.setText("unique tag number = " + epcArrayList.size()); + mHandler.postDelayed(runnableSelect, 1000); + } + }; + + boolean ready2nextRun = true, barcodeReadRequesting = false, barcodeReadDone = false; + boolean runningAccessTask = false; int runningAuto123 = 0, totalTag = 0; + Runnable runnableAuto123 = new Runnable() { + @Override + public void run() { + boolean running = false; + MainActivity.csLibrary4A.appendToLog("found barcodeReadRequesting as " + barcodeReadRequesting ); + if (barcodeReadRequesting) { + if (customPopupWindow.popupWindow.isShowing()) running = true; + else { + barcodeReadRequesting = false; MainActivity.csLibrary4A.appendToLog("barcodeReadRequesting = false"); + ready2nextRun = true; MainActivity.csLibrary4A.appendToLog("ready2nextRun 1 = true after popup"); + } + } + MainActivity.csLibrary4A.appendToLog("runnableAuto123: runningAuto123 = " + runningAuto123 + ", inventoryBarcodeTask = " + (inventoryBarcodeTask != null ? "valid" : "null")); + if (runningAuto123 == 2 && inventoryBarcodeTask != null) { if (inventoryBarcodeTask.getStatus() == AsyncTask.Status.RUNNING) running = true; } + MainActivity.csLibrary4A.appendToLog("runnableAuto123: accessTask = " + (accessTask != null ? "valid" : "null")); + if (accessTask != null) { if (accessTask.getStatus() == AsyncTask.Status.RUNNING) running = true; } + MainActivity.csLibrary4A.appendToLog("runnableAuto123: running = " + running); + if (running == false) { + int totalTagNew = getTotalTag(); + if (runningAccessTask) { + if (totalTagNew > totalTag) { + if (spinnerWriteDataType.getSelectedItemPosition() == 2) editTextWriteData.setText(incrementString(editTextWriteData.getText().toString())); + } else runningAuto123 = 0; + } + MainActivity.csLibrary4A.appendToLog("runnableAuto123: totalTagNew = " + totalTagNew + ", totalTag = " + totalTag + ", runningAuto123 = " + runningAuto123 + ", runningAccessTask = " + runningAccessTask); + runningAccessTask = false; + + boolean bcontinue = true; + if (spinnerWriteDataType.getSelectedItemPosition() == 1 && ready2nextRun == false) { + if (buttonSelect.getText().toString().contains("Clear")) { + if (textViewSelectedTags.getText().toString().trim().length() == 0) bcontinue = false; + } + if (bcontinue) { + customPopupWindow.popupStart("Next barcode.", false); + barcodeReadRequesting = true; MainActivity.csLibrary4A.appendToLog("barcodeReadRequesting = true"); + barcodeReadDone = false; MainActivity.csLibrary4A.appendToLog("barcodeReadDone = false as popup"); + bcontinue = false; + running = true; + } + } + if (bcontinue) { + if (ready2nextRun == false) { + if (buttonSelect.getText().toString().contains("Clear")) { + if (textViewSelectedTags.getText().toString().trim().length() != 0) { + ready2nextRun = true; MainActivity.csLibrary4A.appendToLog("ready2nextRun = true as valid selected tag in textview"); + } + } else { + ready2nextRun = true; MainActivity.csLibrary4A.appendToLog("ready2nextRun = true as not clear"); + } + } + if (ready2nextRun) { + if (startStopAccessHandler(false)) running = true; + } + } + } + if (running && runningAuto123 == 2) mHandler.postDelayed(runnableAuto123, 250); + else { + ready2nextRun = true; MainActivity.csLibrary4A.appendToLog("ready2nextRun = true at the runnable end"); + barcodeReadRequesting = false; barcodeReadDone = false; MainActivity.csLibrary4A.appendToLog("barcodeReadDone = false at the runnable end"); + } + } + }; + + String incrementString(String string1) { + for (int i = 0; i < string1.length(); i++) { + String string2 = string1.substring(string1.length() - 1 - i, string1.length() - i); + Integer iValue = Integer.valueOf(string2, 16); + if (++iValue >= 16) iValue = 0; + String stringA = string1.substring(0, string1.length() - 1 - i); + String stringB = String.format("%X", iValue); + String stringC = null; + if (i > 0) stringC = string1.substring(string1.length() - i, string1.length()); + MainActivity.csLibrary4A.appendToLog("stringABC = " + stringA + "," + stringB + "," + stringC); + String stringABC = (stringA != null ? stringA : "") + stringB + (stringC != null ? stringC : ""); + string1 = stringABC; + if (iValue != 0) break; + } + return string1; + } + + int getTotalTag() { + int iValue = 0; + String stringTotal = textViewTotal.getText().toString(); + String stringTotalTag = stringTotal.replaceAll("[^0-9.]", ""); + try { + iValue = Integer.parseInt(stringTotalTag); + } catch (Exception ex) { + } + MainActivity.csLibrary4A.appendToLog("totalTag = " + iValue); + return iValue; + } + + void startStopBarcodeHandler(boolean buttonTrigger) { + if (MainActivity.sharedObjects.runningInventoryRfidTask) { + Toast.makeText(MainActivity.mContext, "Running RFID access", Toast.LENGTH_SHORT).show(); + return; + } + + boolean started = false; + if (inventoryBarcodeTask != null) if (inventoryBarcodeTask.getStatus() == AsyncTask.Status.RUNNING) started = true; + if (buttonTrigger && ((started && MainActivity.csLibrary4A.getTriggerButtonStatus()) || (started == false && MainActivity.csLibrary4A.getTriggerButtonStatus() == false))) return; + if (started == false) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } + if (MainActivity.csLibrary4A.isBarcodeFailure()) { + MainActivity.csLibrary4A.appendToLog("Toasted 'Barcode is disable'"); + Toast.makeText(MainActivity.mContext, "Barcode is disabled", Toast.LENGTH_SHORT).show(); + return; + } + boolean noToast = true; //runningAuto123; + inventoryBarcodeTask = new InventoryBarcodeTask(null, null, editTextWriteData, null, null, null, buttonReadBar, buttonWrite, null, noToast); + inventoryBarcodeTask.execute(); + } else inventoryBarcodeTask.taskCancelReason = InventoryBarcodeTask.TaskCancelRReason.STOP; + } + + boolean startStopAccessHandler(boolean buttonTrigger) { + boolean runningBarcode = false; + if (inventoryBarcodeTask != null) { + if (inventoryBarcodeTask.getStatus() == AsyncTask.Status.RUNNING) { + MainActivity.csLibrary4A.appendToLog("going to startStopBarcodeHandler 1"); startStopBarcodeHandler(buttonTrigger); + runningBarcode = true; + } + } + + boolean runningAccessTask = false; + if (accessTask != null) { if (accessTask.getStatus() == AsyncTask.Status.RUNNING) runningAccessTask = true; } + if (buttonTrigger && ((runningAccessTask && MainActivity.csLibrary4A.getTriggerButtonStatus()) || (runningAccessTask == false && MainActivity.csLibrary4A.getTriggerButtonStatus() == false))) { + return true; + } + + boolean validResult = true; + if (runningBarcode) { } + else if (runningAccessTask) { + if (buttonTrigger) accessTask.taskCancelReason = AccessTask.TaskCancelRReason.BUTTON_RELEASE; + else accessTask.taskCancelReason = AccessTask.TaskCancelRReason.STOP; + } else { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + validResult = false; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + validResult = false; + } else if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) { + Toast.makeText(MainActivity.mContext, R.string.toast_not_ready, Toast.LENGTH_SHORT).show(); + validResult = false; + } + + if (validResult) { + if (barcodeReadDone == false && spinnerWriteDataType.getSelectedItemPosition() == 1) { + MainActivity.csLibrary4A.appendToLog("going to startStopBarcodeHandler 2"); + startStopBarcodeHandler(buttonTrigger); + } else { + totalTag = getTotalTag(); + if (startAccessTask()) validResult = false; + else if (runningAuto123 == 2) this.runningAccessTask = true; + MainActivity.csLibrary4A.appendToLog("runningAccessTask = " + this.runningAccessTask); + resetOldValue(); + ready2nextRun = false; + MainActivity.csLibrary4A.appendToLog("ready2nextRun = false after startStopAccessHandler"); + } + } + } + return validResult; + } + + void resetOldValue() { + editTextWriteData.setTextColor(Color.RED); + /*checkBoxNewValue.setEnabled(false); + checkBoxNewValue.setText("Old value"); + checkBoxNewValue.setChecked(false);*/ + newWriteData = false; + } + + boolean resetCount = true; + boolean startAccessTask() { + boolean invalidRequest1 = false; + + int selectQValue = -1, selectPopulation = -1; + try { + selectPopulation = Integer.parseInt(editTextSelectPopulation.getText().toString()); + } catch (Exception ex) { } + if (selectPopulation < 0) invalidRequest1 = true; + else if (selectPopulation <= getTotalTag()) invalidRequest1 = true; + else { + selectQValue = MainActivity.csLibrary4A.getPopulation2Q(selectPopulation); + if (selectQValue < 0) invalidRequest1 = true; + } + MainActivity.csLibrary4A.appendToLog("selectQValue = " + selectQValue + ", selectPopulation = " + selectPopulation); + + String selectMask = ""; + int selectBank1 = -1; + int selectOffset1 = -1; + if (buttonSelect.getText().toString().contains("Clear")) { + String[] stringSplited = textViewSelectedTags.getText().toString().split("\n", 2); + if (stringSplited != null && stringSplited.length > 0 && stringSplited[0] != null && stringSplited[0].trim().length() != 0) { + selectMask = stringSplited[0].trim(); + selectBank1 = 1; + selectOffset1 = 32; + if (stringSplited.length > 1 && stringSplited[1] != null && stringSplited[1].trim().length() != 0) textViewSelectedTags.setText(stringSplited[1].trim()); + else textViewSelectedTags.setText(""); + } + } else { + selectMask = editTextSelectMask.getText().toString().trim(); + int selectBankPosition = spinnerSelectBank.getSelectedItemPosition(); + selectBank1 = selectBankPosition + 1; + int selectOffset = 0; + try { + EditText editTextSelectOffset = (EditText) getActivity().findViewById(R.id.registerSelectOffset); + selectOffset = Integer.parseInt(editTextSelectOffset.getText().toString()); + } catch (Exception ex) { } + selectOffset1 = selectBankPosition == 0 ? selectOffset + 32 : selectOffset; + } + if (selectMask.trim().length() == 0 || selectBank1 < 0 || selectOffset1 < 0) { + invalidRequest1 = true; + } + + String password = editTextPassword.getText().toString(); + if (password.length() != 8) invalidRequest1 = true; + + int antennaPower = -1; + try { + editTextAntennaPower = (EditText) getActivity().findViewById(R.id.registerAntennaPower); + antennaPower = Integer.parseInt(editTextAntennaPower.getText().toString()); + } catch (Exception ex) { } + if (antennaPower < 0) invalidRequest1 = true; + + int accessBank = spinnerAccessBank.getSelectedItemPosition() == 0 ? 1 : 3; + MainActivity.csLibrary4A.appendToLog("accessBank = " + accessBank); + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessBank(accessBank) == false) invalidRequest1 = true; + } + + int writeOffset = -1; + try { + EditText editTextWriteOffset = (EditText) getActivity().findViewById(R.id.registerWriteOffset); + writeOffset = Integer.parseInt(editTextWriteOffset.getText().toString()); + if (spinnerAccessBank.getSelectedItemPosition() == 0) writeOffset += 2; + } catch (Exception ex) { } + if (writeOffset < 0) invalidRequest1 = true; + MainActivity.csLibrary4A.appendToLog("writeOffset = " + writeOffset); + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessOffset(writeOffset) == false) invalidRequest1 = true; + } + + int writeLength = -1; + try { + writeLength = Integer.parseInt(editTextWriteLength.getText().toString()); + } catch (Exception ex) { } + if (writeLength < 0) invalidRequest1 = true; + MainActivity.csLibrary4A.appendToLog("writeLength = " + writeLength); + if (invalidRequest1 == false) { + if (writeLength == 0) invalidRequest1 = true; + else if (MainActivity.csLibrary4A.setAccessCount(writeLength) == false) { + invalidRequest1 = true; + } + } + + String writeData = editTextWriteData.getText().toString().trim(); + if (writeData.length() == 0) invalidRequest1 = true; + MainActivity.csLibrary4A.appendToLog("writeData = " + writeData); + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessWriteData(writeData) == false) { + invalidRequest1 = true; + } + } + + int repeatCount = 0; + if (runningAuto123 == 1) repeatCount = selectPopulation; + + MainActivity.csLibrary4A.appendToLog("invalidRequest1 = " + invalidRequest1 + + ", selectMask = " + selectMask + ", selectBank1 = " + selectBank1 + ", selectOffset1 = " + selectOffset1 + + ", password = " + password + ", power = " + antennaPower + ", repeatCount = " + repeatCount + ", resetCount = " + resetCount); + accessTask = new AccessTask(buttonWrite, textViewWriteCount, invalidRequest1, true, + selectMask, selectBank1, selectOffset1, + password, antennaPower, RfidReaderChipData.HostCommands.CMD_18K6CWRITE, + selectQValue, repeatCount, resetCount, false, + textViewRunTime, textViewTagGot, textViewVoltageLevel, textViewYield, textViewTotal); + accessTask.execute(); + resetCount = false; + return invalidRequest1; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class AccessSecurityFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Lock", "Kill"}; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_access); + actionBar.setTitle(R.string.title_activity_security); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, new AccessSecurityLockFragment()); + adapter.setFragment(1, new AccessSecurityKillFragment()); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public AccessSecurityFragment() { + super("AccessSecurityFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.GenericTextWatcher; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.NotificationConnector; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class AccessSecurityKillFragment extends CommonFragment { + private EditText editTextTagID, editTextPassword, editTextAntennaPower; + private Button button; + + private AccessTask accessTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_kill, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + editTextTagID = (EditText) getActivity().findViewById(R.id.accessKillTagID); + editTextPassword = (EditText) getActivity().findViewById(R.id.accessKillPasswordValue); + editTextPassword.addTextChangedListener(new GenericTextWatcher(editTextPassword, 8)); + editTextPassword.setText("00000000"); + + editTextAntennaPower = (EditText) getActivity().findViewById(R.id.accessKillAntennaPower); + editTextAntennaPower.setText(String.valueOf(300)); + + button = (Button) getActivity().findViewById(R.id.accessKillButton); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + startAccessTask(); + } + }); + + ReaderDevice tagSelected = MainActivity.tagSelected; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + editTextTagID.setText(tagSelected.getAddress()); + } + } + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onResume() { + super.onResume(); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessSecurityKillFragment().onResume(): userVisibleHint = " + userVisibleHint); + if (userVisibleHint) { + setNotificationListener(); + } + } + + @Override + public void onPause() { + MainActivity.csLibrary4A.setNotificationListener(null); + super.onPause(); + } + + @Override + public void onDestroy() { + MainActivity.csLibrary4A.setNotificationListener(null); + if (accessTask != null) accessTask.cancel(true); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + userVisibleHint = true; + MainActivity.csLibrary4A.appendToLog("AccessSecurityKillFragment is now VISIBLE"); + setNotificationListener(); + } else { + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("AccessSecurityKillFragment is now INVISIBLE"); + MainActivity.csLibrary4A.setNotificationListener(null); + } + } + + public AccessSecurityKillFragment() { + super("AccessSecurityKillFragment"); + } + + void setNotificationListener() { + MainActivity.csLibrary4A.setNotificationListener(new NotificationConnector.NotificationListener() { + @Override + public void onChange() { + MainActivity.csLibrary4A.appendToLog("TRIGGER key is pressed."); + if (MainActivity.csLibrary4A.getTriggerButtonStatus()) startAccessTask(); + } + }); + } + + void startAccessTask() { + if (accessTask != null) if (accessTask.getStatus() == AsyncTask.Status.RUNNING) return; + boolean invalidRequest = false; + String strTagID = editTextTagID.getText().toString(); + String strPassword = editTextPassword.getText().toString(); + int powerLevel = Integer.valueOf(editTextAntennaPower.getText().toString()); + accessTask = new AccessTask(button, null, invalidRequest, true, + strTagID, 1, 32, + strPassword, powerLevel, RfidReaderChipData.HostCommands.CMD_18K6CKILL, + 0, 0, true, false, + null, null, null, null, null); + accessTask.execute(); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.GenericTextWatcher; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.NotificationConnector; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class AccessSecurityLockFragment extends CommonFragment { + private EditText editTextTagID, editTextPassword, editTextAntennaPower; + private CheckBox checkBox; + private Spinner spinner4KillPwd, spinner4AccessPwd, spinner4EpcMemory, spinner4TidMemory, spinner4UserMemory; + private Button button; + + private AccessTask accessTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_lock, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + editTextTagID = (EditText) getActivity().findViewById(R.id.accessLockTagID); + editTextPassword = (EditText) getActivity().findViewById(R.id.accessLockPasswordValue); + editTextPassword.addTextChangedListener(new GenericTextWatcher(editTextPassword, 8)); + editTextPassword.setText("00000000"); + + checkBox = (CheckBox) getActivity().findViewById(R.id.accessLockAllPermLock); + + ArrayAdapter arrayAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.access_lock_privilege_array, R.layout.custom_spinner_layout); + arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + spinner4KillPwd = (Spinner) getActivity().findViewById(R.id.accessLockPrivilege4KillPwd); + spinner4KillPwd.setAdapter(arrayAdapter); + + spinner4AccessPwd = (Spinner) getActivity().findViewById(R.id.accessLockPrivilege4AccessPwd); + spinner4AccessPwd.setAdapter(arrayAdapter); + + spinner4EpcMemory = (Spinner) getActivity().findViewById(R.id.accessLockPrivilege4EpcMemory); + spinner4EpcMemory.setAdapter(arrayAdapter); + + spinner4TidMemory = (Spinner) getActivity().findViewById(R.id.accessLockPrivilege4TidMemory); + spinner4TidMemory.setAdapter(arrayAdapter); + + spinner4UserMemory = (Spinner) getActivity().findViewById(R.id.accessLockPrivilege4UserMemory); + spinner4UserMemory.setAdapter(arrayAdapter); + + editTextAntennaPower = (EditText) getActivity().findViewById(R.id.accessLockAntennaPower); + editTextAntennaPower.setText(String.valueOf(300)); + + button = (Button) getActivity().findViewById(R.id.accessLockButton); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + startAccessTask(); + } + }); + + ReaderDevice tagSelected = MainActivity.tagSelected; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + editTextTagID.setText(tagSelected.getAddress()); + } + } + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onResume() { + super.onResume(); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessSecurityLockFragment().onResume(): userVisibleHint = " + userVisibleHint); + if (userVisibleHint) { + setNotificationListener(); + } + } + + @Override + public void onPause() { + MainActivity.csLibrary4A.setNotificationListener(null); + super.onPause(); + } + + @Override + public void onDestroy() { + MainActivity.csLibrary4A.setNotificationListener(null); + if (accessTask != null) accessTask.cancel(true); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + userVisibleHint = true; + MainActivity.csLibrary4A.appendToLog("AccessSecurityLockFragment is now VISIBLE"); + setNotificationListener(); + } else { + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("AccessSecurityLockFragment is now INVISIBLE"); + MainActivity.csLibrary4A.setNotificationListener(null); + } + } + + public AccessSecurityLockFragment() { + super("AccessSecurityLockFragment"); + } + + void setNotificationListener() { + MainActivity.csLibrary4A.setNotificationListener(new NotificationConnector.NotificationListener() { + @Override + public void onChange() { + MainActivity.csLibrary4A.appendToLog("TRIGGER key is pressed."); + if (MainActivity.csLibrary4A.getTriggerButtonStatus()) startAccessTask(); + } + }); + } + + void startAccessTask() { + int accessLockAction = 0; + int accessLockMask = 0; + int lockAction; + + if (accessTask != null) if (accessTask.getStatus() == AsyncTask.Status.RUNNING) return; + if (checkBox.isChecked()) { + accessLockAction = 0x3FF; + accessLockMask = 0x3FF; + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("accessLockAction = " + String.format("%x", accessLockAction) + ", accessLockMask = " + String.format("%x", accessLockMask)); + lockAction = spinner4KillPwd.getSelectedItemPosition(); + accessLockAction |= ((lockAction == 0 ? 0 : lockAction - 1) << 8); + accessLockMask |= ((lockAction == 0 ? 0 : 3) << 8); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Kill: accessLockAction = " + String.format("%x", accessLockAction) + ", accessLockMask = " + String.format("%x", accessLockMask)); + + lockAction = spinner4AccessPwd.getSelectedItemPosition(); + accessLockAction |= ((lockAction == 0 ? 0 : lockAction - 1) << 6); + accessLockMask |= ((lockAction == 0 ? 0 : 3) << 6); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Access: accessLockAction = " + String.format("%x", accessLockAction) + ", accessLockMask = " + String.format("%x", accessLockMask)); + + lockAction = spinner4EpcMemory.getSelectedItemPosition(); + accessLockAction |= ((lockAction == 0 ? 0 : lockAction - 1) << 4); + accessLockMask |= ((lockAction == 0 ? 0 : 3) << 4); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Epc: accessLockAction = " + String.format("%x", accessLockAction) + ", accessLockMask = " + String.format("%x", accessLockMask)); + + lockAction = spinner4TidMemory.getSelectedItemPosition(); + accessLockAction |= ((lockAction == 0 ? 0 : lockAction - 1) << 2); + accessLockMask |= ((lockAction == 0 ? 0 : 3) << 2); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Tid: accessLockAction = " + String.format("%x", accessLockAction) + ", accessLockMask = " + String.format("%x", accessLockMask)); + + lockAction = spinner4UserMemory.getSelectedItemPosition(); + accessLockAction |= (lockAction == 0 ? 0 : lockAction - 1); + accessLockMask |= (lockAction == 0 ? 0 : 3); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Uesr: accessLockAction = " + String.format("%x", accessLockAction) + ", accessLockMask = " + String.format("%x", accessLockMask)); + } + + boolean invalidRequest = false; + String strTagID = editTextTagID.getText().toString(); + String strPassword = editTextPassword.getText().toString(); + int powerLevel = Integer.valueOf(editTextAntennaPower.getText().toString()); + if (invalidRequest == false) { + if (MainActivity.csLibrary4A.setAccessLockAction(accessLockAction, accessLockMask) == false) { + invalidRequest = true; + } + } + accessTask = new AccessTask(button, null, invalidRequest, true, + strTagID, 1, 32, + strPassword, powerLevel, RfidReaderChipData.HostCommands.CMD_18K6CLOCK, + 0, 0, true, false, + null, null, null, null, null); + accessTask.execute(); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_NXP; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_NXP_UCODE8_EPC; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_NXP_UCODE8_EPCBRAND; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_NXP_UCODE8_EPCBRANDTID; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_NXP_UCODE8_EPCTID; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_NXP_UCODEDNA; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.Spinner; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.google.android.material.tabs.TabLayout; + +public class AccessUcode8Fragment extends CommonFragment { + final boolean DEBUG = true; + Spinner spinnerTagSelect; + RadioButton radioButtonSelectEpc, radioButtonSelectEpcTid, radioButtonSelectEpcBrand, radioButtonSelectEpcBrandTidCheck; + enum nxpTag { + ucode8, ucodeDNA, others + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_ucode8, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + spinnerTagSelect = (Spinner) getActivity().findViewById(R.id.accessNxpTagSelect); + ArrayAdapter targetAdapter1 = ArrayAdapter.createFromResource(getActivity(), R.array.nxp_options, R.layout.custom_spinner_layout); + targetAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerTagSelect.setAdapter(targetAdapter1); spinnerTagSelect.setSelection(0); + spinnerTagSelect.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + TabLayout.TabView tabView = tabLayout.getTabAt(2).view; tabView.setVisibility(View.GONE); + TabLayout.TabView tabViewUntrace = tabLayout.getTabAt(3).view; tabViewUntrace.setVisibility(View.GONE); + LinearLayout layout = (LinearLayout) getActivity().findViewById(R.id.accessNxpUcode8Select); layout.setVisibility(View.GONE); + if (position == nxpTag.ucode8.ordinal()) { + updateUcode8Type(); + MainActivity.csLibrary4A.appendToLog("AccessUcode8Fragment.onItemSelected[spinnerTagSelect] set MainActivity.mDid as " + MainActivity.mDid); + if (MainActivity.csLibrary4A.get98XX() == 0) tabViewUntrace.setVisibility(View.VISIBLE); + layout.setVisibility(View.VISIBLE); + } else if (position == nxpTag.ucodeDNA.ordinal()) { + MainActivity.tagType = TAG_NXP_UCODEDNA; MainActivity.mDid = "E2C06"; + MainActivity.csLibrary4A.appendToLog("AccessUcode8Fragment.onItemSelected set MainActivity.mDid as E2C06"); + tabView.setVisibility(View.VISIBLE); + if (MainActivity.csLibrary4A.get98XX() == 0) tabViewUntrace.setVisibility(View.VISIBLE); + } else { + MainActivity.tagType = TAG_NXP; MainActivity.mDid = "E2806"; + MainActivity.csLibrary4A.appendToLog("AccessUcode8Fragment.onItemSelected set MainActivity.mDid as E2806"); + } + MainActivity.csLibrary4A.appendToLog("new mDid = " + MainActivity.mDid); + } + + @Override + public void onNothingSelected(AdapterView parentView) { + // your code here + } + + }); + + radioButtonSelectEpc = (RadioButton) getActivity().findViewById(R.id.accessUC8SelectEpc); + radioButtonSelectEpcTid = (RadioButton) getActivity().findViewById(R.id.accessUC8SelectEpcTid); + radioButtonSelectEpcBrand = (RadioButton) getActivity().findViewById(R.id.accessUC8SelectEpcBrand); + radioButtonSelectEpcBrandTidCheck = (RadioButton) getActivity().findViewById(R.id.accessUC8SelectEpcBrandTidCheck); + if (MainActivity.csLibrary4A.get98XX() == 2) { + radioButtonSelectEpc.setChecked(true); + radioButtonSelectEpcBrand.setVisibility(View.GONE); + radioButtonSelectEpcBrandTidCheck.setVisibility(View.GONE); + } else radioButtonSelectEpcBrand.setChecked(true); + + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onDestroy() { + MainActivity.csLibrary4A.setSameCheck(true); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + userVisibleHint = true; + MainActivity.csLibrary4A.appendToLog("AccessUcode8Fragment is now VISIBLE"); + // setNotificationListener(); + } else { + updateUcode8Type(); + MainActivity.csLibrary4A.appendToLog("AccessUcode8Fragment.setUserVisibleHint set MainActivity.mDid as " + MainActivity.mDid); + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("AccessUcode8Fragment is now INVISIBLE"); + } + } + + void updateUcode8Type() { + if (spinnerTagSelect != null && spinnerTagSelect.getSelectedItemPosition() == nxpTag.ucode8.ordinal()) { + if (radioButtonSelectEpc != null && radioButtonSelectEpcTid != null && radioButtonSelectEpcBrand != null && radioButtonSelectEpcBrandTidCheck != null) { + if (radioButtonSelectEpc.isChecked()) { + MainActivity.csLibrary4A.appendToLog("Selected EPC"); + MainActivity.tagType = TAG_NXP_UCODE8_EPC; MainActivity.mDid = "E2806894A"; + MainActivity.csLibrary4A.appendToLog("AccessUcode8Fragment.setUserVisibleHint set MainActivity.mDid as E2806894A"); + } + if (radioButtonSelectEpcTid.isChecked()) { + MainActivity.csLibrary4A.appendToLog("Selected EPC+TID"); + MainActivity.tagType = TAG_NXP_UCODE8_EPCTID; MainActivity.mDid = "E2806894B"; + MainActivity.csLibrary4A.appendToLog("AccessUcode8Fragment.setUserVisibleHint set MainActivity.mDid as E2806894b"); + } + if (radioButtonSelectEpcBrand.isChecked()) { + MainActivity.csLibrary4A.appendToLog("Selected EPC+BRAND"); + MainActivity.tagType = TAG_NXP_UCODE8_EPCBRAND; MainActivity.mDid = "E2806894C"; + MainActivity.csLibrary4A.appendToLog("AccessUcode8Fragment.setUserVisibleHint set MainActivity.mDid as E2806894C"); + } + if (radioButtonSelectEpcBrandTidCheck.isChecked()) { + MainActivity.csLibrary4A.appendToLog("Selected EPC+BRAND"); + MainActivity.tagType = TAG_NXP_UCODE8_EPCBRANDTID; MainActivity.mDid = "E2806894d"; + MainActivity.csLibrary4A.appendToLog("AccessUcode8Fragment.setUserVisibleHint set MainActivity.mDid as E2806894d"); + } + MainActivity.csLibrary4A.appendToLog("newDid 1 = " + MainActivity.mDid); + } + } + } + + public AccessUcode8Fragment() { + super("AccessUcode8Fragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cs710ademoapp.MainActivity.csLibrary4A; + +import android.app.Activity; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.Spinner; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.GenericTextWatcher; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SaveList2ExternalTask; +import com.csl.cs710ademoapp.SelectTag; +import com.csl.cslibrary4a.AesCmac; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import javax.crypto.Cipher; +import javax.crypto.Mac; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class AccessUcodeFragment extends CommonFragment { + final boolean DEBUG = true; int iTagType = -1; + SelectTag selectTag; + TextView textViewAesKey0ActivateOk, textViewAesKey1ActivateOk, textViewAesKey0Ok, textViewAesKey1Ok; + Spinner spinnerHideTid; + CheckBox checkBoxAuthEncryptMode, checkBoxAuthValidMode; + CheckBox checkBoxHideEpc, checkBoxHideTid, checkBoxHideUser, checkBoxHideRange; + CheckBox checkBoxAesKey0Activate, checkBoxAesKey1Activate, checkBoxAesKey0, checkBoxAesKey1; + + EditText editTextAuthKeyId, editTextAuthMsg, editTextAuthProfile, editTextAuthOffset, editTextAuthBlockId, editTextAuthProtMode, editTextEpcSize, editTextAesKey0, editTextAesKey1, editTextAuthResponse; + TextView textViewAuthResponseDecoded, textViewAuthResponseDecodedCustom, editTextAuthResponseEncodedMac, textViewImpinjResponse; + EditText editTextAccessUCTid, editTextAccessUCserverImpinj, editTextAccessUCemail, editTextAccessUCpassword; + private Button buttonRead, buttonWrite; + private Button buttonReadBuffer, buttonTam1, buttonTam2, buttonUntrace, buttonShowEpc; String strShowEpcButtonBackup; + + enum ReadWriteTypes { + NULL, TEMPERATURE, AESKEY0, AESKEY1, AESKEY0ACTIVATE, AESKEY1ACTIVATE, ENABLE + } + boolean operationRead = false; + boolean readBufferChecked = false; + boolean authenChecked = false; boolean authenTam1; int keyId, profile, offset, blockId, protMode; String strChallenge; + boolean untraceChecked = false; + boolean showEpcChecked = false; + ReadWriteTypes readWriteTypes; + boolean bImpinJTag = false; + + private AccessTask accessTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_ucode, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + if (MainActivity.mDid != null) if (MainActivity.mDid.contains("E28240")) iTagType = 5; + + selectTag = new SelectTag((Activity)getActivity(), 1); + if (MainActivity.mDid != null && MainActivity.mDid.indexOf("E2801") == 0) bImpinJTag = true; + + spinnerHideTid = (Spinner) getActivity().findViewById(R.id.accessUCHideTid); + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.hideTid_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerHideTid.setAdapter(targetAdapter); + + checkBoxHideEpc = (CheckBox) getActivity().findViewById(R.id.accessUCHideEpc); + checkBoxHideTid = (CheckBox) getActivity().findViewById(R.id.accessUCHideTid1); + checkBoxHideUser = (CheckBox) getActivity().findViewById(R.id.accessUCHideUser); + checkBoxHideRange = (CheckBox) getActivity().findViewById(R.id.accessUCHideRange); + textViewAesKey0ActivateOk = (TextView) getActivity().findViewById(R.id.accessUCAesKey0ActivateOK); + textViewAesKey1ActivateOk = (TextView) getActivity().findViewById(R.id.accessUCAesKey1ActivateOK); + checkBoxAesKey0Activate = (CheckBox) getActivity().findViewById(R.id.accessUCAesKey0Activate); + checkBoxAesKey1Activate = (CheckBox) getActivity().findViewById(R.id.accessUCAesKey1Activate); + + TableRow tableRow = (TableRow) getActivity().findViewById(R.id.accessUCAesKeysRow); + if (iTagType == 5) tableRow.setVisibility(View.GONE); + textViewAesKey0Ok = (TextView) getActivity().findViewById(R.id.accessUCAesKey0OK); + textViewAesKey1Ok = (TextView) getActivity().findViewById(R.id.accessUCAesKey1OK); + checkBoxAesKey0 = (CheckBox) getActivity().findViewById(R.id.accessUCAesKey0Title); + checkBoxAesKey1 = (CheckBox) getActivity().findViewById(R.id.accessUCAesKey1Title); + + editTextAuthKeyId = (EditText) getActivity().findViewById(R.id.accessUCAuthKeyId); + editTextAuthKeyId.setText(String.valueOf(0)); + editTextAuthMsg = (EditText) getActivity().findViewById(R.id.accessUCAuthMsg); + editTextAuthMsg.addTextChangedListener(new GenericTextWatcher(editTextAuthMsg, bImpinJTag ? 12 : 20)); + editTextAuthProfile = (EditText) getActivity().findViewById(R.id.accessUCAuthProfile); + editTextAuthProfile.setText(String.valueOf(0)); + editTextAuthOffset = (EditText) getActivity().findViewById(R.id.accessUCAuthOffset); + editTextAuthOffset.setText(String.valueOf(0)); + editTextAuthBlockId = (EditText) getActivity().findViewById(R.id.accessUCAuthBlockId); + editTextAuthBlockId.setText(String.valueOf(1)); + + TextView textViewAuthProtModeLabel = (TextView) getActivity().findViewById(R.id.accessUCAuthProtModeLabel); + editTextAuthProtMode = (EditText) getActivity().findViewById(R.id.accessUCAuthProtMode); + TableRow tableRowAuthProtMode = (TableRow) getActivity().findViewById(R.id.accessUCAuthtModeRow); + checkBoxAuthEncryptMode = (CheckBox) getActivity().findViewById(R.id.accessUCAuthEncryptMode); + checkBoxAuthValidMode = (CheckBox) getActivity().findViewById(R.id.accessUCAuthValidMode); + if (iTagType == 5) { + textViewAuthProtModeLabel.setVisibility(View.GONE); + editTextAuthProtMode.setVisibility(View.GONE); + } else { + tableRowAuthProtMode.setVisibility(View.GONE); + editTextAuthProtMode.setText(String.valueOf(1)); + } + + editTextAuthResponse = (EditText) getActivity().findViewById(R.id.accessUCAuthResponse); + textViewAuthResponseDecoded = (TextView) getActivity().findViewById(R.id.accessUCAuthResponseDecoded); + textViewAuthResponseDecodedCustom = (TextView) getActivity().findViewById(R.id.accessUCAuthResponseDecodedCustom); + editTextAuthResponseEncodedMac = (TextView) getActivity().findViewById(R.id.accessUCAuthResponseEecodedMac); + textViewImpinjResponse = (TextView) getActivity().findViewById(R.id.accessUCImpinjResponse); + editTextEpcSize = (EditText) getActivity().findViewById(R.id.accessUCEpcSize); + editTextAesKey0 = (EditText) getActivity().findViewById(R.id.accessUCAesKey0); + editTextAesKey0.addTextChangedListener(new GenericTextWatcher(editTextAesKey0, 32)); + editTextAesKey1 = (EditText) getActivity().findViewById(R.id.accessUCAesKey1); + editTextAesKey1.addTextChangedListener(new GenericTextWatcher(editTextAesKey1, 32)); + + buttonRead = (Button) getActivity().findViewById(R.id.accessUCReadButton); + if (iTagType == 5) buttonRead.setVisibility(View.GONE); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + operationRead = true; startAccessTask(); + } + }); + + buttonWrite = (Button) getActivity().findViewById(R.id.accessUCWriteButton); + buttonWrite.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + operationRead = false; startAccessTask(); + } + }); + + buttonReadBuffer = (Button) getActivity().findViewById(R.id.accessUCReadBufferButton); + buttonReadBuffer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + readBufferChecked = true; startAccessTask(); + } + }); + + buttonTam1 = (Button) getActivity().findViewById(R.id.accessUCTam1AuthButton); + buttonTam1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + MainActivity.csLibrary4A.appendToLog("buttonTam1 is pressed"); + authenTam1 = true; authenChecked = true; keyId = Integer.parseInt(editTextAuthKeyId.getText().toString()); strChallenge = editTextAuthMsg.getText().toString(); + startAccessTask(); + } + }); + + buttonTam2 = (Button) getActivity().findViewById(R.id.accessUCTam2AuthButton); + buttonTam2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + MainActivity.csLibrary4A.appendToLog("buttonTam2 is pressed"); + authenTam1 = false; authenChecked = true; keyId = Integer.parseInt(editTextAuthKeyId.getText().toString()); strChallenge = editTextAuthMsg.getText().toString(); + profile = Integer.parseInt(editTextAuthProfile.getText().toString()); + offset = Integer.parseInt(editTextAuthOffset.getText().toString()); + blockId = Integer.parseInt(editTextAuthBlockId.getText().toString()); + if (iTagType != 5) protMode = Integer.parseInt(editTextAuthProtMode.getText().toString()); + else { + protMode = 0; + if (checkBoxAuthEncryptMode.isChecked()) protMode += 1; + if (checkBoxAuthValidMode.isChecked()) protMode += 2; + } + startAccessTask(); + } + }); + + buttonUntrace = (Button) getActivity().findViewById(R.id.accessUCUntraceButton); + buttonUntrace.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + untraceChecked = true; startAccessTask(); + } + }); + + tableRow = (TableRow) getActivity().findViewById(R.id.accessUCShowEpcRow); + if (iTagType == 5) tableRow.setVisibility(View.GONE); + buttonShowEpc = (Button) getActivity().findViewById(R.id.accessUCShowEpcButton); + buttonShowEpc.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + showEpcChecked = true; startAccessTask(); + } + }); + + TextView textViewWarning = (TextView) getActivity().findViewById(R.id.accessUCWarning); + if (iTagType == 5) textViewWarning.setText("Notice: Xerxes assumes Key0 for Tam1 and Tam 2"); + else textViewWarning.setText("Notice: Ucode assumes Key1 for Tam2"); + + MainActivity.csLibrary4A.getAuthenticateReplyLength(); + MainActivity.csLibrary4A.getUntraceableEpcLength(); + MainActivity.csLibrary4A.setSameCheck(false); + + MainActivity.csLibrary4A.appendToLog("mDid in AccessUcodeFragment = " + MainActivity.mDid); + TextView textView = (TextView) getActivity().findViewById(R.id.accessUCAuthKeyIdLabel); + EditText editText = (EditText) getActivity().findViewById(R.id.accessUCAuthKeyId); + TableRow tableRow1 = (TableRow) getActivity().findViewById(R.id.accessUCAuthProfileRow); + LinearLayout layout1 = (LinearLayout) getActivity().findViewById(R.id.accessUCKeyLayout); + LinearLayout layout = (LinearLayout) getActivity().findViewById(R.id.accessUCButtons); + if (bImpinJTag) { + textView.setVisibility(View.GONE); + editText.setVisibility(View.GONE); + editTextAuthMsg.setText("049CA53E55EA"); + tableRow1.setVisibility(View.GONE); + layout1.setVisibility(View.GONE); + layout.setVisibility(View.GONE); + } + + Button buttonImpinjCheck = (Button) getActivity().findViewById(R.id.accessUCImpinjCheck); + buttonImpinjCheck.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (!bRunning) { + textViewImpinjResponse.setText(""); + mHandler.post(runnable); + } + } + }); + + editTextAccessUCserverImpinj = (EditText) getActivity().findViewById(R.id.accessUCserverImpinj); + editTextAccessUCemail = (EditText) getActivity().findViewById(R.id.accessUCemail); + editTextAccessUCpassword = (EditText) getActivity().findViewById(R.id.accessUCpassword); + if (true) { + editTextAccessUCserverImpinj.setText(csLibrary4A.getServerImpinjLocation()); + editTextAccessUCemail.setText(csLibrary4A.getServerImpinjName()); + editTextAccessUCpassword.setText(csLibrary4A.getServerImpinjPassword()); + } else if (false) { + editTextAccessUCserverImpinj.setText("https://h9tqczg9-7275.asse.devtunnels.ms"); + editTextAccessUCemail.setText("wallace.sit@cne.com.hk"); + editTextAccessUCpassword.setText("Cne12345678?"); + } else { + editTextAccessUCserverImpinj.setText("https://democloud.convergence.com.hk/ias"); + editTextAccessUCemail.setText("wallace.sit@cne.com.hk"); + editTextAccessUCpassword.setText("Cne12345678?"); + } + } + + SaveList2ExternalTask saveExternalTask; boolean bRunning = false; int bStep = 0; String strBearer = null; + Runnable runnable = new Runnable() { + @Override + public void run() { + csLibrary4A.appendToLog("0 bRunning = " + bRunning + ", bStep = " + bStep); + if (saveExternalTask != null && saveExternalTask.getStatus() == AsyncTask.Status.FINISHED) { + bStep++; + if (saveExternalTask.responseCode != 200) bStep++; + else { + if (bStep == 1) strBearer = saveExternalTask.response; + else { + String strTid = null, strResult = null; + JSONObject obj = null; + try { + obj = new JSONObject(saveExternalTask.response); + JSONArray jsonArray = obj.getJSONArray("tagValidity"); + MainActivity.csLibrary4A.appendToLog("Json tagValidity is " + (jsonArray == null ? "null" : "valid")); + strTid = jsonArray.getJSONObject(0).getString("tid"); + strResult = jsonArray.getJSONObject(0).getString("tagValid"); + } catch (JSONException e) { + csLibrary4A.appendToLog("Json exception = " + e.toString()); + } + if (strTid != null && strResult != null) { + //textViewImpinjResponse.setText(strResult + " " + strTid); + textViewImpinjResponse.setText((strResult.matches("true") ? "Valid" : "Invalid")); + } + } + } + MainActivity.csLibrary4A.appendToLog("responseCode = " + saveExternalTask.responseCode + ", response = " + saveExternalTask.response); + saveExternalTask = null; + } + csLibrary4A.appendToLog("bRunning = " + bRunning + ", bStep = " + bStep); + if (bStep < 2) { + if (saveExternalTask == null || saveExternalTask.getStatus() != AsyncTask.Status.RUNNING) { + csLibrary4A.appendToLog("1 bRunning = " + bRunning + ", bStep = " + bStep); + bRunning = true; + if (bStep == 0) { + bStep = 0; + saveExternalTask = new SaveList2ExternalTask(true); + + JSONObject object = new JSONObject(); + try { + //object.put("Username", "CslAuth2047#$"); + //object.put("Password", "Sheungwan123#$"); + object.put("email", editTextAccessUCemail.getText().toString()); //"wallace.sit@cne.com.hk"); + object.put("password", editTextAccessUCpassword.getText().toString()); //"Cne12345678?"); + } catch (Exception ex) { + MainActivity.csLibrary4A.appendToLog("Error in creating Json"); + } + saveExternalTask.messageStr = object.toString(); + //saveExternalTask.url = "https://ias.authenticate.impinj.io/external/jwt/authenticate"; + saveExternalTask.url = editTextAccessUCserverImpinj.getText().toString() + "/api/Auth/login"; // "https://h9tqczg9-7275.asse.devtunnels.ms/api/Auth/login"; + MainActivity.csLibrary4A.appendToLog("Adddress: " + saveExternalTask.url + ", json message:" + saveExternalTask.messageStr); + saveExternalTask.execute(); + MainActivity.csLibrary4A.appendToLog("responseCode = " + saveExternalTask.responseCode + ", response = " + saveExternalTask.response); + } else { + saveExternalTask = new SaveList2ExternalTask(true); + + JSONObject object = new JSONObject(); + try { + JSONArray jsonArray = new JSONArray(); + JSONObject object1 = new JSONObject(); + object1.put("tid", editTextAccessUCTid.getText().toString()); //tagSelected.getTid()); //"E2C011A21234123412341234"); // + object1.put("challenge", editTextAuthMsg.getText().toString()); + object1.put("tagResponse", editTextAuthResponse.getText().toString()); + jsonArray.put(object1); + object.put("tagVerify", jsonArray); + object.put("sendSignature", true); + object.put("sendSalt", true); + object.put("sendTime", true); + } catch (Exception ex) { + MainActivity.csLibrary4A.appendToLog("Error in creating Json"); + } + saveExternalTask.messageStr = object.toString(); + saveExternalTask.url = editTextAccessUCserverImpinj.getText().toString() + "/api/ImpinjAuthentication/authenticate"; //"https://h9tqczg9-7275.asse.devtunnels.ms/api/ImpinjAuthentication/authenticate"; + saveExternalTask.strBearer = "Bearer " + strBearer; + MainActivity.csLibrary4A.appendToLog("Adddress: " + saveExternalTask.url + ", json message:" + saveExternalTask.messageStr); + saveExternalTask.execute(); + MainActivity.csLibrary4A.appendToLog("responseCode = " + saveExternalTask.responseCode + ", response = " + saveExternalTask.response); + } + } + mHandler.postDelayed(runnable, 100); + } else { + bRunning = false; bStep = 0; + } + } + }; + + @Override + public void onResume() { + super.onResume(); + setupTagID(); + } + + @Override + public void onDestroy() { + if (accessTask != null) accessTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + //MainActivity.mCs108Library4a.appendToLog("onDestroy"); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + userVisibleHint = true; + MainActivity.csLibrary4A.appendToLog("AccessUcodeFragment is now VISIBLE"); + setupTagID(); + // setNotificationListener(); + } else { + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("AccessUcodeFragment is now INVISIBLE"); +// MainActivity.mCs108Library4a.setNotificationListener(null); + } + } + + public AccessUcodeFragment() { + super("AccessUcodeFragment"); + } + + void setupTagID() { + if (selectTag == null) return; + ReaderDevice tagSelected = MainActivity.tagSelected; + MainActivity.csLibrary4A.appendToLog("Start with tagSelected = " + (tagSelected == null ? "NULL" : (tagSelected.getSelected() + ", " + tagSelected.getAddress()))); + boolean bSelected = false; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + bSelected = true; + MainActivity.csLibrary4A.appendToLog("selectTag is " + (selectTag == null ? "NULL" : "valid")); + if (selectTag != null) MainActivity.csLibrary4A.appendToLog("selectTag.editTextTag is " + (selectTag.editTextTagID == null ? "NULL" : "valid")); + if (selectTag.editTextTagID != null) { + MainActivity.csLibrary4A.appendToLog("editTextRWTagID.setTTEXT " + tagSelected.getAddress()); + selectTag.editTextTagID.setText(tagSelected.getAddress()); + } + + String stringDetail = tagSelected.getDetails(); + int indexUser = stringDetail.indexOf("USER="); + if (indexUser != -1) { + String stringUser = stringDetail.substring(indexUser + 5); + MainActivity.csLibrary4A.appendToLog("stringUser = " + stringUser); + + boolean bEnableBAPMode = false; + int number = Integer.valueOf(stringUser.substring(3, 4), 16); + if ((number % 2) == 1) bEnableBAPMode = true; +// CheckBox checkBoxBAP = (CheckBox) getActivity().findViewById(R.id.coldChainEnableBAP); +// checkBoxBAP.setChecked(bEnableBAPMode); + } + + editTextAccessUCTid = (EditText) getActivity().findViewById(R.id.accessUCTid); + editTextAccessUCTid.setText(tagSelected.getTid()); + } + } + } + + private byte[] doubleSubKey(byte[] k) { + byte[] ret = new byte[k.length]; + + boolean firstBitSet = ((k[0]&0x80) != 0); + for (int i=0; i= 2) { + if (true) { + AesCmac mac = null; + mac = new AesCmac(); + secretKey = new SecretKeySpec(key1, "AES"); + mac.init(secretKey); //set master key + mac.updateBlock(dataIn); //given input + decValue = mac.doFinal(); + } else if (true) { + cipher = Cipher.getInstance(strAlgo); + secretKey = new SecretKeySpec(key1, "AES"); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv)); + + // First calculate k0 from zero bytes + byte[] k0 = new byte[16]; + cipher.update(k0, 0, k0.length, k0, 0); + + // Calculate values for k1 and k2 + byte[] k1 = doubleSubKey(k0); + byte[] k2 = doubleSubKey(k1); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv)); + int bufferCount; + } else if (false) { + secretKey = new SecretKeySpec(key1, "AES"); + Mac hmac = Mac.getInstance("HmacSHA256"); //HmacMD5, HmacSHA1, HmacSHA256 + hmac.init(secretKey); + hmac.update(iv); + decValue = hmac.doFinal(dataIn); + MainActivity.csLibrary4A.appendToLog("decValue1.length = " + decValue.length); + } else { + secretKey = new SecretKeySpec(key1, "AES"); + cipher = Cipher.getInstance(strAlgo); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv)); + decValue = cipher.doFinal(dataIn); + } + String strMac = MainActivity.csLibrary4A.byteArrayToString(decValue).substring(0, 24); + editTextAuthResponseEncodedMac.setText(strMac); + + strMatchResult += ", MAC"; + strMatching = editTextAuthResponse.getText().toString(); + while (strMatching.length() > 32) + strMatching = strMatching.substring(32).trim(); + bMatch = false; + if (strMatching.matches(strMac)) bMatch = true; + if (bMatch) strMatchResult += " Matched"; + else strMatchResult += " Not Matched"; + } + } + Toast.makeText(MainActivity.mContext, strMatchResult, Toast.LENGTH_SHORT).show(); + retValue = true; + } + + if (false) { + secretKey = new SecretKeySpec(key, "HmacSHA256"); + try { + Mac hmac = Mac.getInstance("HmacSHA256"); + + byte[] data2dec = dataIn; + byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + hmac.init(secretKey); + hmac.update(iv); + byte[] decValue = hmac.doFinal(data2dec); + MainActivity.csLibrary4A.appendToLog("decValue.length = " + decValue.length); + editTextAuthResponseEncodedMac.setText(MainActivity.csLibrary4A.byteArrayToString(decValue)); + if (false) { + byte[] decValue16 = new byte[16]; + System.arraycopy(decValue, 0, decValue16, 0, 16); + textViewAuthResponseDecoded.setText(MainActivity.csLibrary4A.byteArrayToString(decValue16)); + if (protMode == 0 || protMode == 2) { + decValue16 = new byte[16]; + System.arraycopy(data2dec, 16, decValue16, 0, 16); + } else { + decValue16 = new byte[16]; + System.arraycopy(decValue, 16, decValue16, 0, 16); + } + textViewAuthResponseDecodedCustom.setText(MainActivity.csLibrary4A.byteArrayToString(decValue16)); + retValue = true; + } + } catch (Exception ex) { + MainActivity.csLibrary4A.appendToLog("Error while encrypting: " + ex.toString()); + } + } + } catch (Exception ex) { + MainActivity.csLibrary4A.appendToLog("Error while encrypting: " + ex.toString()); + } + return retValue; + } + void startAccessTask() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("startAccessTask()"); + MainActivity.csLibrary4A.setInvAlgo(false); + if (MainActivity.csLibrary4A.getRetryCount() < 2) MainActivity.csLibrary4A.setRetryCount(2); + if (updating == false) { + updating = true; bankProcessing = 0; + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + boolean updating = false; int bankProcessing = 0; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + boolean rerunRequest = false; boolean taskRequest = false; + if (accessTask == null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("updateRunnable(): NULL accessReadWriteTask"); + taskRequest = true; + } else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) { + rerunRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("updateRunnable(): accessReadWriteTask.getStatus() = " + accessTask.getStatus().toString()); + } else { + taskRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("updateRunnable(): FINISHED accessReadWriteTask"); + } + if (processResult()) { rerunRequest = true; MainActivity.csLibrary4A.appendToLog("processResult is TRUE"); } + else if (taskRequest) { + boolean invalid = processTickItems(); + MainActivity.csLibrary4A.appendToLog("processTickItems, invalid = " + invalid); + if (bankProcessing++ != 0 && invalid == true) rerunRequest = false; + else { + Button button; + if (readBufferChecked) button = buttonReadBuffer; + else if (authenChecked && authenTam1) button = buttonTam1; + else if (authenChecked) button = buttonTam2; + else if (untraceChecked) button = buttonUntrace; + else if (showEpcChecked) { if (strShowEpcButtonBackup == null) strShowEpcButtonBackup = buttonShowEpc.getText().toString(); buttonShowEpc.setText("Show"); button = buttonShowEpc; } + else if (operationRead) button = buttonRead; + else button = buttonWrite; + + RfidReaderChipData.HostCommands hostCommand; + if (readBufferChecked) hostCommand = RfidReaderChipData.HostCommands.CMD_READBUFFER; + else if (authenChecked) hostCommand = RfidReaderChipData.HostCommands.CMD_18K6CAUTHENTICATE; + else if (untraceChecked || showEpcChecked) hostCommand = RfidReaderChipData.HostCommands.CMD_UNTRACEABLE; + else if (operationRead) hostCommand = RfidReaderChipData.HostCommands.CMD_18K6CREAD; + else hostCommand = RfidReaderChipData.HostCommands.CMD_18K6CWRITE; + + accessTask = new AccessTask(button, null, invalid, true, + selectTag.editTextTagID.getText().toString(), 1, 32, + selectTag.editTextAccessPassword.getText().toString(), Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), hostCommand, + 0, 0, true, false, + null, null, null, null, null); + accessTask.execute(); + rerunRequest = true; + MainActivity.csLibrary4A.appendToLog("accessTask is created"); + } + } + if (rerunRequest) { + mHandler.postDelayed(updateRunnable, 500); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("updateRunnable(): Restart"); + } + else updating = false; + MainActivity.csLibrary4A.appendToLog("updateRunnable(): Ending with updating = " + updating); + } + }; + + short setTemperature(float fTemperature) { + if (fTemperature > 63.75) fTemperature = (float) 63.75; + else if (fTemperature < -64) fTemperature = -64; + boolean bNegative = false; + if (fTemperature < 0) { bNegative = true; fTemperature = 0 - fTemperature; } + fTemperature += 0.125; fTemperature /= 0.25; + short retValue = (short)fTemperature; + if (bNegative) { retValue--; retValue &= 0xFF; retValue ^= 0xFF; retValue |= 0x100; } + return retValue; + } + String getTemperatue(String stringInput) { + byte bValue = Byte.parseByte(stringInput.substring(0,1), 16); + byte bValue2 = Byte.parseByte(stringInput.substring(1, 2), 16); bValue2 <<= 4; + byte bValue3 = Byte.parseByte(stringInput.substring(2, 3), 16); bValue2 |= bValue3; + String stringValue = ""; short sValue = (short)(bValue2 & 0xFF); + if ((bValue & 0x01) != 0) { stringValue = "-"; bValue2 ^= 0xFF; sValue = (short)(bValue2 & 0xFF); sValue++; } + stringValue += String.valueOf((sValue & 0x1FF) >> 2); + switch (sValue & 0x03) { + case 1: + stringValue += ".25"; + break; + case 2: + stringValue += ".50"; + break; + case 3: + stringValue += ".75"; + break; + } + return stringValue; + } + + boolean processResult() { + String accessResult = null; + if (accessTask == null) return false; + else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) return false; + else { + accessResult = accessTask.accessResult; + if (readBufferChecked) readBufferChecked = false; + else if (authenChecked) { + authenChecked = false; if (accessResult != null) { + String strValue = ""; + for (int i = 0; i < accessResult.length(); i += 32) { + int i_end = i + 32; if (i_end >= accessResult.length()) i_end = accessResult.length(); + if (i != 0) strValue += "\n"; + strValue += accessResult.substring(i, i_end); + } + editTextAuthResponse.setText(strValue); + if (bImpinJTag) { + LinearLayout layout = (LinearLayout) getActivity().findViewById(R.id.accessUCImpinjLayout); + if (authenTam1) layout.setVisibility(View.VISIBLE); + else layout.setVisibility(View.GONE); + } else processAESdata(accessResult); + } + } + else if (untraceChecked) untraceChecked = false; + else if (showEpcChecked) { showEpcChecked = false; if (strShowEpcButtonBackup != null) buttonShowEpc.setText(strShowEpcButtonBackup); strShowEpcButtonBackup = null; } + else if (accessResult == null) { + if (readWriteTypes == ReadWriteTypes.AESKEY0ACTIVATE) { + textViewAesKey0ActivateOk.setText("E"); checkBoxAesKey0Activate.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.AESKEY1ACTIVATE) { + textViewAesKey1ActivateOk.setText("E"); checkBoxAesKey1Activate.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.AESKEY0) { + textViewAesKey0Ok.setText("E"); checkBoxAesKey0.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.AESKEY1) { + textViewAesKey1Ok.setText("E"); checkBoxAesKey1.setChecked(false); + } + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("accessResult = " + accessResult); + if (readWriteTypes == ReadWriteTypes.AESKEY0ACTIVATE) { + textViewAesKey0ActivateOk.setText("O"); checkBoxAesKey0Activate.setChecked(false); readWriteTypes = ReadWriteTypes.NULL; + } else if (readWriteTypes == ReadWriteTypes.AESKEY1ACTIVATE) { + textViewAesKey1ActivateOk.setText("O"); checkBoxAesKey1Activate.setChecked(false); readWriteTypes = ReadWriteTypes.NULL; + } else if (readWriteTypes == ReadWriteTypes.AESKEY0) { + textViewAesKey0Ok.setText("O"); checkBoxAesKey0.setChecked(false); readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) editTextAesKey0.setText(accessResult); + } else if (readWriteTypes == ReadWriteTypes.AESKEY1) { + textViewAesKey1Ok.setText("O"); checkBoxAesKey1.setChecked(false); readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) editTextAesKey1.setText(accessResult); + } + } + accessTask = null; + return true; + } + } + boolean processTickItems() { + boolean invalidRequest1 = false; + int accSize = 0, accOffset = 0, accBank = 3; + String writeData = ""; + + if (readBufferChecked) { + accOffset = 0; accSize = 1; + } else if (authenChecked) { + if (authenTam1) { + if (bImpinJTag) { + if (MainActivity.csLibrary4A.setTamConfiguration(false, strChallenge) == false) + invalidRequest1 = true; + } else if (MainActivity.csLibrary4A.setTam1Configuration(keyId, strChallenge) == false) + invalidRequest1 = true; + } else if (bImpinJTag) { + if (MainActivity.csLibrary4A.setTamConfiguration(true, strChallenge) == false) + invalidRequest1 = true; + } else if (MainActivity.csLibrary4A.setTam2Configuration(keyId, strChallenge, profile, offset, blockId, protMode) == false) + invalidRequest1 = true; + if (invalidRequest1 == false) { editTextAuthResponse.setText(""); textViewAuthResponseDecoded.setText(""); textViewAuthResponseDecodedCustom.setText(""); editTextAuthResponseEncodedMac.setText(""); } + return invalidRequest1; + } else if (untraceChecked) { + if (MainActivity.csLibrary4A.setUntraceable(checkBoxHideEpc.isChecked(), checkBoxHideEpc.isChecked() ? 2 : 6, checkBoxHideTid.isChecked() ? 1: 0, checkBoxHideUser.isChecked(), checkBoxHideRange.isChecked()) == false) invalidRequest1 = true; + return invalidRequest1; + } else if (showEpcChecked) { + try { + if (MainActivity.csLibrary4A.setUntraceable(false, Integer.parseInt(editTextEpcSize.getText().toString()), 0, false, false) == false) invalidRequest1 = true; + } catch (Exception ex) { + invalidRequest1 = true; + } + return invalidRequest1; + } else if (checkBoxAesKey0Activate.isChecked() == true) { + accOffset = 0xC8; accSize = 1; readWriteTypes = ReadWriteTypes.AESKEY0ACTIVATE; textViewAesKey0ActivateOk.setText(""); + if (operationRead == false) writeData = "E200"; + } else if (checkBoxAesKey1Activate.isChecked() == true) { + accOffset = 0xD8; accSize = 1; readWriteTypes = ReadWriteTypes.AESKEY1ACTIVATE; textViewAesKey0ActivateOk.setText(""); + if (operationRead == false) writeData = "E200"; + } else if (checkBoxAesKey0.isChecked() == true) { + accOffset = 0xC0; if (iTagType == 5) { accOffset = 0x10; accBank = 0; } + accSize = 8; readWriteTypes = ReadWriteTypes.AESKEY0; textViewAesKey0Ok.setText(""); + if (operationRead) editTextAesKey0.setText(""); + else writeData = editTextAesKey0.getText().toString(); + } else if (checkBoxAesKey1.isChecked() == true) { + accOffset = 0xD0; if (iTagType == 5) { accOffset = 0x18; accBank = 0; } + accSize = 8; readWriteTypes = ReadWriteTypes.AESKEY1; textViewAesKey1Ok.setText(""); + if (operationRead) editTextAesKey1.setText(""); + else writeData = editTextAesKey1.getText().toString(); + } else { + invalidRequest1 = true; + } + + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessBank(accBank) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessOffset(accOffset) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (accSize == 0) { + invalidRequest1 = true; + } else if (MainActivity.csLibrary4A.setAccessCount(accSize) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false && operationRead == false) { + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessWriteData(writeData) == false) { + invalidRequest1 = true; + } + } + } + return invalidRequest1; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import androidx.lifecycle.Lifecycle; +import android.os.AsyncTask; +import android.os.Bundle; +import android.text.InputType; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.GenericTextWatcher; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class AccessXerxesLoggerFragment extends CommonFragment { + final boolean DEBUG = true; + boolean bXerxesEnable = false; + EditText editTextRWTagID, editTextAccessRWAccPassword, editTextaccessRWAntennaPower; + TextView textViewUserCode1OK, textViewUserCode2OK, textViewUserCode3OK, textViewUserCode4OK, textViewUserCode5OK; + CheckBox checkBoxUserCode1, checkBoxUserCode2, checkBoxUserCode3, checkBoxUserCode4, checkBoxUserCode5; + EditText editTextUserCode1, editTextUserCode2, editTextUserCode3, editTextUserCode4, editTextUserCode5; + Spinner spinnerUserCode2Unit, spinnerUserCode3Unit; int iUserCode2UnitPosition, iUserCode3UnitPosition; + String strReadUserCode1, strReadUserCode2, strReadUserCode3, strReadUserCode4, strReadUserCode5; + private Button buttonRead, buttonWrite; + + enum ReadWriteTypes { + NULL, USERCODE1, USERCODE2, USERCODE3, USERCODE4, USERCODE5 + } + ReadWriteTypes readWriteTypes; + boolean operationRead = false; + + private AccessTask accessTask; + private int modelCode = 0; + private int calCode1, calTemp1, calCode2, calTemp2, calVer = -1; + private boolean changedSelectIndex = false; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_access_xerxes, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + editTextRWTagID = (EditText) getActivity().findViewById(R.id.accessXXTagID); + editTextAccessRWAccPassword = (EditText) getActivity().findViewById(R.id.accessXXAccPasswordValue); + editTextAccessRWAccPassword.addTextChangedListener(new GenericTextWatcher(editTextAccessRWAccPassword, 8)); + editTextAccessRWAccPassword.setText("00000000"); + + textViewUserCode1OK = (TextView) getActivity().findViewById(R.id.accessXXXerxes1OK); + textViewUserCode2OK = (TextView) getActivity().findViewById(R.id.accessXXXerxes2OK); + textViewUserCode3OK = (TextView) getActivity().findViewById(R.id.accessXXXerxes3OK); + textViewUserCode4OK = (TextView) getActivity().findViewById(R.id.accessXXXerxes4OK); + textViewUserCode5OK = (TextView) getActivity().findViewById(R.id.accessXXXerxes5OK); + + checkBoxUserCode1 = (CheckBox) getActivity().findViewById(R.id.accessXXXerxees1Title); checkBoxUserCode1.setText("Log number:"); + checkBoxUserCode2 = (CheckBox) getActivity().findViewById(R.id.accessXXXerxees2Title); checkBoxUserCode2.setText("Temperature:"); + checkBoxUserCode3 = (CheckBox) getActivity().findViewById(R.id.accessXXXerxees3Title); checkBoxUserCode3.setText("Maximum temperature:"); + checkBoxUserCode4 = (CheckBox) getActivity().findViewById(R.id.accessXXXerxees4Title); checkBoxUserCode4.setText("Alarm high trigger count:"); + checkBoxUserCode5 = (CheckBox) getActivity().findViewById(R.id.accessXXXerxees5Title); checkBoxUserCode5.setText("Alarm low trigger count:"); + + editTextUserCode1 = (EditText) getActivity().findViewById(R.id.accessXXXerxes1Code); editTextUserCode1.setInputType(InputType.TYPE_CLASS_NUMBER); + editTextUserCode2 = (EditText) getActivity().findViewById(R.id.accessXXXerxes2Code); editTextUserCode2.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_NUMBER_FLAG_SIGNED); + editTextUserCode3 = (EditText) getActivity().findViewById(R.id.accessXXXerxes3Code); editTextUserCode3.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_NUMBER_FLAG_SIGNED); + editTextUserCode4 = (EditText) getActivity().findViewById(R.id.accessXXXerxes4Code); editTextUserCode4.setInputType(InputType.TYPE_CLASS_NUMBER); + editTextUserCode5 = (EditText) getActivity().findViewById(R.id.accessXXXerxes5Code); editTextUserCode5.setInputType(InputType.TYPE_CLASS_NUMBER); + + ArrayAdapter arrayAdapterUserCode2Unit = ArrayAdapter.createFromResource(getActivity(), R.array.temperature_unit_options, R.layout.custom_spinner_layout); + arrayAdapterUserCode2Unit.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerUserCode2Unit = (Spinner) getActivity().findViewById(R.id.accessXXXerxes2Unit); + spinnerUserCode2Unit.setAdapter(arrayAdapterUserCode2Unit); + spinnerUserCode2Unit.setSelection(0); iUserCode2UnitPosition = 0; + spinnerUserCode2Unit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + if (i != iUserCode2UnitPosition) { + String strValue = editTextUserCode2.getText().toString(); + if (iUserCode2UnitPosition == 0 && i == 1) strValue = MainActivity.csLibrary4A.temperatureC2F(strValue); + else if (iUserCode2UnitPosition == 1 && i == 0) strValue = MainActivity.csLibrary4A.temperatureF2C(strValue); + editTextUserCode2.setText(strValue); + } + iUserCode2UnitPosition = i; + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + } + }); + + spinnerUserCode3Unit = (Spinner) getActivity().findViewById(R.id.accessXXXerxes3Unit); + spinnerUserCode3Unit.setAdapter(arrayAdapterUserCode2Unit); + spinnerUserCode3Unit.setSelection(0); iUserCode3UnitPosition = 0; + spinnerUserCode3Unit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + if (i != iUserCode3UnitPosition) { + String strValue = editTextUserCode3.getText().toString(); + if (iUserCode3UnitPosition == 0 && i == 1) strValue = MainActivity.csLibrary4A.temperatureC2F(strValue); + else if (iUserCode3UnitPosition == 1 && i == 0) strValue = MainActivity.csLibrary4A.temperatureF2C(strValue); + editTextUserCode3.setText(strValue); + } + iUserCode3UnitPosition = i; + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + } + }); + + editTextaccessRWAntennaPower = (EditText) getActivity().findViewById(R.id.accessXXAntennaPower); + editTextaccessRWAntennaPower.setText(String.valueOf(300)); + + buttonRead = (Button) getActivity().findViewById(R.id.accessRWReadButton); + buttonRead.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + operationRead = true; startAccessTask(); + } + }); + + buttonWrite = (Button) getActivity().findViewById(R.id.accessRWWriteButton); + buttonWrite.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + operationRead = false; startAccessTask(); + } + }); + + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onResume() { + super.onResume(); + setupTagID(); + } + + @Override + public void onDestroy() { + if (accessTask != null) accessTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED) == false) return; + if(getUserVisibleHint()) { + userVisibleHint = true; + setupTagID(); + } else { + userVisibleHint = false; + } + } + + public AccessXerxesLoggerFragment() { + super("AccessXerxesLoggerFragment"); + } + + void setupTagID() { + ReaderDevice tagSelected = MainActivity.tagSelected; + boolean bSelected = false; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + String stringDetail = tagSelected.getDetails(); + int indexUser = stringDetail.indexOf("TID="); + if (indexUser != -1) { + // + } + bSelected = true; + if (editTextRWTagID != null) editTextRWTagID.setText(tagSelected.getAddress()); + + if (tagSelected.getMdid() == null) { + } else if (tagSelected.getMdid().contains("E282402")) { + modelCode = 2; + } else if (tagSelected.getMdid().contains("E282403")) { + modelCode = 3; + } else if (tagSelected.getMdid().contains("E282405")) { + modelCode = 5; + } + + String strRes = tagSelected.getRes(); + if (strRes != null) { + int ibracket = strRes.indexOf("("); + if (ibracket > 0) strRes = strRes.substring(0, ibracket); + } + + stringDetail = tagSelected.getDetails(); + indexUser = stringDetail.indexOf("USER="); + if (indexUser != -1) { + String stringUser = stringDetail.substring(indexUser + 5); + MainActivity.csLibrary4A.appendToLog("stringUser = " + stringUser); + + boolean bEnableBAPMode = false; + int number = Integer.valueOf(stringUser.substring(3, 4), 16); + if ((number % 2) == 1) bEnableBAPMode = true; + } + } + } + } + + void startAccessTask() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("startAccessTask()"); + if (updating == false) { + updating = true; bankProcessing = 0; + checkProcessing = 0; + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + boolean updating = false; int bankProcessing = 0; + int checkProcessing = 0; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + boolean rerunRequest = false; boolean taskRequest = false; + if (accessTask == null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessXerxesLoggerFragment().updateRunnable(): NULL accessReadWriteTask"); + taskRequest = true; + } else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) { + rerunRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessXerxesLoggerFragment().updateRunnable(): accessReadWriteTask.getStatus() = " + accessTask.getStatus().toString()); + } else { + taskRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessXerxesLoggerFragment().updateRunnable(): FINISHED accessReadWriteTask"); + } + if (processResult()) { rerunRequest = true; MainActivity.csLibrary4A.appendToLog("processResult is TRUE");} + else if (taskRequest) { + boolean invalid = processTickItems(); + MainActivity.csLibrary4A.appendToLog("processTickItems, invalid = " + invalid); + if (bankProcessing++ != 0 && invalid == true) rerunRequest = false; + else { + int selectBank = 1; + int selectOffset = 32; + String selectMask = editTextRWTagID.getText().toString(); + accessTask = new AccessTask((operationRead ? buttonRead : buttonWrite), null, invalid, true, + selectMask, selectBank, selectOffset, + editTextAccessRWAccPassword.getText().toString(), Integer.valueOf(editTextaccessRWAntennaPower.getText().toString()), (operationRead ? RfidReaderChipData.HostCommands.CMD_18K6CREAD: RfidReaderChipData.HostCommands.CMD_18K6CWRITE), + 0, 0, true, false, + null, null, null, null, null); + accessTask.execute(); + rerunRequest = true; + MainActivity.csLibrary4A.appendToLog("accessTask is created with selectBank = " + selectBank); + } + } + if (rerunRequest) { + mHandler.postDelayed(updateRunnable, 500); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AccessXerxesLoggerFragment().updateRunnable(): Restart"); + } + else updating = false; + MainActivity.csLibrary4A.appendToLog("AccessXerxesLoggerFragment().updateRunnable(): Ending with updating = " + updating); + } + }; + + boolean setTemperatureCode(String strData, int iTempIndex) { + if (strData == null) return false; + if (strData.length() < 4) return false; + + String strValue = MainActivity.csLibrary4A.strFloat16toFloat32(strData); + if (strValue == null) return false; + else { + if ( (iTempIndex == 0 && spinnerUserCode2Unit.getSelectedItemPosition() == 1) + || (iTempIndex == 1 && spinnerUserCode3Unit.getSelectedItemPosition() == 1) ) + strValue = MainActivity.csLibrary4A.temperatureC2F(strValue); + if (iTempIndex == 0) editTextUserCode2.setText(strValue); + else editTextUserCode3.setText(strValue); + } + return true; + } + + boolean processResult() { + String accessResult = null; + if (accessTask == null) return false; + else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) return false; + else { + if (changedSelectIndex) { + changedSelectIndex = false; MainActivity.selectFor = 0; + MainActivity.csLibrary4A.setSelectCriteriaDisable(-1); + } + accessResult = accessTask.accessResult; + if (accessResult == null) { + if (readWriteTypes == ReadWriteTypes.USERCODE1) { + textViewUserCode1OK.setText("E"); + //checkBoxUserCode1.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.USERCODE2) { + textViewUserCode2OK.setText("E"); + //checkBoxUserCode2.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.USERCODE3) { + textViewUserCode3OK.setText("E"); + //checkBoxUserCode3.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.USERCODE4) { + textViewUserCode4OK.setText("E"); + //checkBoxUserCode4.setChecked(false); + } else if (readWriteTypes == ReadWriteTypes.USERCODE5) { + textViewUserCode5OK.setText("E"); + //checkBoxUserCode5.setChecked(false); + } + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("accessResult = " + accessResult); + if (readWriteTypes == ReadWriteTypes.USERCODE1) { + textViewUserCode1OK.setText("O"); + //checkBoxUserCode1.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) { + int iValue = Integer.parseInt(accessResult, 16); + strReadUserCode1 = String.valueOf(iValue); + editTextUserCode1.setText(strReadUserCode1); + } + } else if (readWriteTypes == ReadWriteTypes.USERCODE2) { + textViewUserCode2OK.setText("O"); + //checkBoxUserCode2.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) setTemperatureCode(accessResult, 0); + } else if (readWriteTypes == ReadWriteTypes.USERCODE3) { + textViewUserCode3OK.setText("O"); + //checkBoxUserCode3.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) setTemperatureCode(accessResult, 1); + } else if (readWriteTypes == ReadWriteTypes.USERCODE4) { + textViewUserCode4OK.setText("O"); + //checkBoxUserCode4.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) { + int iValue = Integer.parseInt(accessResult, 16); + strReadUserCode4 = String.valueOf(iValue); + editTextUserCode4.setText(strReadUserCode4); + } + } else if (readWriteTypes == ReadWriteTypes.USERCODE5) { + textViewUserCode5OK.setText("O"); + //checkBoxUserCode5.setChecked(false); + readWriteTypes = ReadWriteTypes.NULL; + if (operationRead) { + int iValue = Integer.parseInt(accessResult, 16); + strReadUserCode5 = String.valueOf(iValue); + editTextUserCode5.setText(strReadUserCode5); + } + } + } + accessTask = null; + return true; + } + } + + boolean processTickItems() { + boolean invalidRequest1 = false; + int accBank = 0, accSize = 0, accOffset = 0; + String writeData = ""; + + if (editTextRWTagID.getText().toString().length() == 0) invalidRequest1 = true; + else if (checkBoxUserCode1.isChecked() == true && checkProcessing < 1 && modelCode == 5) { + accBank = 3; accSize = 1; accOffset = 2; readWriteTypes = ReadWriteTypes.USERCODE1; checkProcessing = 1; + if (operationRead) { + textViewUserCode1OK.setText(""); + editTextUserCode1.setText(""); + } else { + String strValue = editTextUserCode1.getText().toString(); + if (strValue.length() == 0) invalidRequest1 = true; + else { + int iValue = Integer.parseInt(strValue); + if (iValue > 0xFFFF) invalidRequest1 = true; + else writeData = String.format("%04X", iValue); + } + } + } else if (checkBoxUserCode2.isChecked() == true && checkProcessing < 2 && modelCode == 5) { + accBank = 3; accSize = 1; accOffset = 3; readWriteTypes = ReadWriteTypes.USERCODE2; checkProcessing = 2; + if (operationRead) { + textViewUserCode2OK.setText(""); + editTextUserCode2.setText(""); + } else { + String strValue = editTextUserCode2.getText().toString(); + if (strValue.length() == 0) invalidRequest1 = true; + else { + if (spinnerUserCode2Unit.getSelectedItemPosition() == 1) strValue = MainActivity.csLibrary4A.temperatureF2C(strValue); + strValue = MainActivity.csLibrary4A.str2float16(strValue); + if (strValue.length() != 4) invalidRequest1 = true; + else writeData = strValue; + } + } + } else if (checkBoxUserCode3.isChecked() == true && checkProcessing < 3 && modelCode == 5) { + accBank = 3; accSize = 1; accOffset = 4; readWriteTypes = ReadWriteTypes.USERCODE3; checkProcessing = 3; + if (operationRead) { + textViewUserCode3OK.setText(""); + editTextUserCode3.setText(""); + } else { + String strValue = editTextUserCode3.getText().toString(); + if (strValue.length() == 0) invalidRequest1 = true; + else { + if (spinnerUserCode3Unit.getSelectedItemPosition() == 1) strValue = MainActivity.csLibrary4A.temperatureF2C(strValue); + strValue = MainActivity.csLibrary4A.str2float16(strValue); + if (strValue.length() != 4) invalidRequest1 = true; + else writeData = strValue; + } + } + } else if (checkBoxUserCode4.isChecked() == true && checkProcessing < 4 && modelCode == 5) { + accBank = 3; accSize = 1; accOffset = 5; readWriteTypes = ReadWriteTypes.USERCODE4; checkProcessing = 4; + if (operationRead) { + textViewUserCode4OK.setText(""); + editTextUserCode4.setText(""); + } else { + String strValue = editTextUserCode4.getText().toString(); + if (strValue.length() == 0) invalidRequest1 = true; + else { + int iValue = Integer.parseInt(strValue); + if (iValue > 0xFFFF) invalidRequest1 = true; + else writeData = String.format("%04X", iValue); + } + } + } else if (checkBoxUserCode5.isChecked() == true && checkProcessing < 5 && modelCode == 5) { + accBank = 3; accSize = 1; accOffset = 6; readWriteTypes = ReadWriteTypes.USERCODE5; checkProcessing = 5; + if (operationRead) { + textViewUserCode5OK.setText(""); + editTextUserCode5.setText(""); + } else { + String strValue = editTextUserCode5.getText().toString(); + if (strValue.length() == 0) invalidRequest1 = true; + else { + int iValue = Integer.parseInt(strValue); + if (iValue > 0xFFFF) invalidRequest1 = true; + else writeData = String.format("%04X", iValue); + } + } + } else { + invalidRequest1 = true; + } + + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessBank(accBank) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessOffset(accOffset) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false) { + if (accSize == 0) { + invalidRequest1 = true; + } else if (MainActivity.csLibrary4A.setAccessCount(accSize) == false) { + invalidRequest1 = true; + } + } + if (invalidRequest1 == false && operationRead == false) { + if (invalidRequest1 == false) { + if (MainActivity.csLibrary4A.setAccessWriteData(writeData) == false) { + invalidRequest1 = true; + } + } + } + return invalidRequest1; + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_EM_AURASENSE; + +import android.os.Bundle; + +import com.google.android.material.tabs.TabLayout; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public class AuraSenseFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AuraSenseAdapter mAdapter; + + private String[] tabs = {"Configuration", "Scan" }; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment1 = (InventoryRfidiMultiFragment) mAdapter.fragment1; + if (item.getItemId() == R.id.menuAction_clear) { + fragment1.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment1.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment1.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment1.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment1.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_auraSense); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + mAdapter = new AuraSenseAdapter(getActivity().getSupportFragmentManager()); + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(mAdapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + } + + @Override + public void onPause() { + mAdapter.fragment0.onPause(); + mAdapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + mAdapter.fragment0.onStop(); + mAdapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + mAdapter.fragment0.onDestroyView(); + mAdapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + mAdapter.fragment0.onDestroy(); + mAdapter.fragment1.onDestroy(); + MainActivity.csLibrary4A.setSelectCriteriaDisable(-1); + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + @Override + public void onDetach() { + mAdapter.fragment0.onDetach(); + mAdapter.fragment1.onDetach(); + super.onDetach(); + } + + public AuraSenseFragment() { + super("AuraSenseFragment"); + } + + class AuraSenseAdapter extends FragmentStatePagerAdapter { + private final int NO_OF_TABS = 2; + public Fragment fragment0, fragment1, fragment2; + + @Override + public Fragment getItem(int index) { + Fragment fragment = null; + switch (index) { + case 0: + fragment = new AccessAuraSenseFragment(); + fragment0 = fragment; + break; + default: + fragment = InventoryRfidiMultiFragment.newInstance(true, TAG_EM_AURASENSE, "E280B12"); + fragment1 = fragment; + break; + } + return fragment; + } + + @Override + public int getCount() { + return NO_OF_TABS; + } + + @Override + public int getItemPosition(Object object) { + return PagerAdapter.POSITION_NONE; + } + + public AuraSenseAdapter(FragmentManager fm) { + super(fm); + } + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import androidx.lifecycle.Lifecycle; +import android.os.Bundle; + +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public class AxzonFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = { "Scan/Select", "Read" }; + private String[] tabsXerxes0 = { "Logger" }; + private String[] tabsXerxes = { "Logger", "Security" }; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment = (InventoryRfidiMultiFragment) adapter.fragment0; + if (item.getItemId() == R.id.menuAction_clear) { + fragment.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + MainActivity.csLibrary4A.appendToLog("MainActivity.mDid = " + MainActivity.mDid); + if (false) actionBar.setTitle(R.string.title_activity_axzon); + else { + String stringTitle = getResources().getString(R.string.title_activity_axzon); + if (MainActivity.mDid.matches("E282402")) stringTitle = "S2"; + else if (MainActivity.mDid.matches("E282403")) stringTitle = "S3"; + if (MainActivity.mDid.matches("E282405")) stringTitle = "Xerxes"; + actionBar.setTitle(stringTitle); + } + + boolean bXervesTag = false; + if (MainActivity.mDid != null) if (MainActivity.mDid.matches("E282405")) bXervesTag = true; + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), (bXervesTag ? 4 : 2)); + adapter.setFragment(0, InventoryRfidiMultiFragment.newInstance(true, null, "")); + adapter.setFragment(1, AccessMicronFragment.newInstance(true)); + adapter.setFragment(2, new AccessXerxesLoggerFragment()); + adapter.setFragment(3, new AccessUcodeFragment()); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + if (bXervesTag) { + if (MainActivity.csLibrary4A.get98XX() == 2 && MainActivity.csLibrary4A.getMacVer().indexOf("1.2") != 0) { + for (String tab_name : tabsXerxes0) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + } else { + for (String tab_name : tabsXerxes) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + } + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + + MainActivity.csLibrary4A.setBasicCurrentLinkProfile(); + } + + @Override + public void onPause() { + if (adapter.fragment0 != null) if (adapter.fragment0.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment0.onPause(); + if (adapter.fragment1 != null) if (adapter.fragment1.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment1.onPause(); + if (adapter.fragment2 != null) if (adapter.fragment2.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment2.onPause(); + if (adapter.fragment3 != null) if (adapter.fragment3.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment3.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + if (adapter.fragment0 != null) if (adapter.fragment0.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment0.onStop(); + if (adapter.fragment1 != null) if (adapter.fragment1.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment1.onStop(); + if (adapter.fragment2 != null) if (adapter.fragment2.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment2.onStop(); + if (adapter.fragment3 != null) if (adapter.fragment3.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment3.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + if (adapter.fragment0 != null) if (adapter.fragment0.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment0.onDestroyView(); + if (adapter.fragment1 != null) if (adapter.fragment1.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment1.onDestroyView(); + if (adapter.fragment2 != null) if (adapter.fragment2.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment2.onDestroyView(); + if (adapter.fragment3 != null) if (adapter.fragment3.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment3.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + if (adapter.fragment0 != null) if (adapter.fragment0.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment0.onDestroy(); + if (adapter.fragment1 != null) if (adapter.fragment1.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment1.onDestroy(); + if (adapter.fragment2 != null) if (adapter.fragment2.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment2.onDestroy(); + if (adapter.fragment3 != null) if (adapter.fragment3.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment3.onDestroy(); + if (MainActivity.selectFor != -1) { + MainActivity.csLibrary4A.setSelectCriteriaDisable(-1); + MainActivity.selectFor = -1; + } + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + @Override + public void onDetach() { + if (adapter.fragment0 != null) if (adapter.fragment0.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment0.onDetach(); + if (adapter.fragment1 != null) if (adapter.fragment1.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment1.onDetach(); + if (adapter.fragment2 != null) if (adapter.fragment2.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment2.onDetach(); + if (adapter.fragment3 != null) if (adapter.fragment3.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) adapter.fragment3.onDetach(); + super.onDetach(); + } + + public AxzonFragment() { super("AxzonFragment"); } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_AXZON; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_MAGNUS_S2; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_MAGNUS_S3; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_AXZON_XERXES; + +import android.os.Bundle; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public class AxzonSelectorFragment extends CommonFragment { + boolean bXerxesEnable = false; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_select_axzon, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (((AppCompatActivity) getActivity()).getSupportActionBar() != null) { + ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setTitle(R.string.title_activity_axzonSelector); + } + + Button button_s2 = (Button) getActivity().findViewById(R.id.select_axzon_s2); + button_s2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + gotoAxzonFragment(2); + } + }); + Button button_s3 = (Button) getActivity().findViewById(R.id.select_axzon_s3); + button_s3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + gotoAxzonFragment(3); + } + }); + Button button_xx = (Button) getActivity().findViewById(R.id.select_axzon_xx); + button_xx.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + gotoAxzonFragment(5); + } + }); + Button button_all = (Button) getActivity().findViewById(R.id.select_axzon_all); + button_all.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + gotoAxzonFragment(0); + } + }); + if (bXerxesEnable == false) { + button_xx.setVisibility(View.GONE); + button_all.setText("All Magnus"); + } + } + + public static AxzonSelectorFragment newInstance(boolean bXerxesEnable) { + AxzonSelectorFragment myFragment = new AxzonSelectorFragment(); + myFragment.bXerxesEnable = bXerxesEnable; + return myFragment; + } + public AxzonSelectorFragment() { + super("AxzonSelectorFragment"); + } + + void gotoAxzonFragment(int tagType) { + switch(tagType) { + case 2: + MainActivity.tagType = TAG_MAGNUS_S2; MainActivity.mDid = "E282402"; + break; + case 3: + MainActivity.tagType = TAG_MAGNUS_S3; MainActivity.mDid = "E282403"; + break; + case 5: + MainActivity.tagType = TAG_AXZON_XERXES; MainActivity.mDid = "E282405"; + break; + default: + MainActivity.tagType = TAG_AXZON; MainActivity.mDid = "E2824"; + break; + } + MainActivity.csLibrary4A.appendToLog("HelloABC: gotoAxzonFragment with tagType = " + tagType + ", MainActivity.mDid = " + MainActivity.mDid); + + MainActivity.csLibrary4A.appendToLog("HelloABC: config is " + (MainActivity.config == null ? "null" : "Valid")); + MainActivity.config.configPassword = "00000000"; + MainActivity.config.configPower = Integer.toString(300); + MainActivity.config.config0 = Integer.toString(9); + MainActivity.config.config1 = Integer.toString(21); + MainActivity.config.config2 = Integer.toString(13); + if (tagType == 2) MainActivity.config.config3 = Integer.toString(13); + else MainActivity.config.config3 = Integer.toString(160); + + if (true) { + Fragment fragment; + if (bXerxesEnable) fragment = new AxzonFragment(); + else fragment = new MicronFragment(); + + FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + fragmentTransaction.replace(R.id.content_frame, fragment); + fragmentTransaction.addToBackStack(null); + fragmentTransaction.commit(); + } else { + Fragment fragment = AccessConfigFragment.newInstance(bXerxesEnable); + FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + fragmentTransaction.replace(R.id.content_frame, fragment); + fragmentTransaction.addToBackStack(null); + fragmentTransaction.commit(); + } + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_EM_COLDCHAIN; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class ColdChainFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Select Tag", "Logging", "One-shot"}; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment1 = (InventoryRfidiMultiFragment) adapter.fragment0; + if (item.getItemId() == R.id.menuAction_clear) { + fragment1.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment1.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment1.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment1.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment1.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_coldChain); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, InventoryRfidiMultiFragment.newInstance(true, TAG_EM_COLDCHAIN, "E280B0")); + adapter.setFragment(1, new AccessColdChainFragment()); + adapter.setFragment(2, new AccessEm4325PassiveFragment()); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (int i = 0; i < tabs.length; i++) { + if (MainActivity.csLibrary4A.get98XX() == 2 && i == tabs.length -1) break;; + String tab_name = tabs[i]; + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + } + + @Override + public void onPause() { + if (adapter.fragment0 != null) adapter.fragment0.onPause(); + if (adapter.fragment1 != null) adapter.fragment1.onPause(); + if (adapter.fragment2 != null) adapter.fragment2.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + if (adapter.fragment0 != null) adapter.fragment0.onStop(); + if (adapter.fragment1 != null) adapter.fragment1.onStop(); + if (adapter.fragment2 != null) adapter.fragment2.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + if (adapter.fragment0 != null) adapter.fragment0.onDestroyView(); + if (adapter.fragment1 != null) adapter.fragment1.onDestroyView(); + if (adapter.fragment2 != null) adapter.fragment2.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + if (adapter.fragment0 != null) adapter.fragment0.onDestroy(); + if (adapter.fragment1 != null) adapter.fragment1.onDestroy(); + if (adapter.fragment2 != null) adapter.fragment2.onDestroy(); + super.onDestroy(); + } + + @Override + public void onDetach() { + if (adapter.fragment0 != null) adapter.fragment0.onDetach(); + if (adapter.fragment1 != null) adapter.fragment1.onDetach(); + if (adapter.fragment2 != null) adapter.fragment2.onDetach(); + super.onDetach(); + } + + public ColdChainFragment() { + super("ColdChainFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.text.SpannableString; +import android.text.style.ForegroundColorSpan; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + +import com.csl.cs710ademoapp.CustomAlertDialog; +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public abstract class CommonFragment extends Fragment { + final boolean DEBUG = false; final String TAG = "Hello"; + private String fragmentName; + MenuItem menuTriggerItem, menuBatteryVoltageItem; + Handler mHandler = new Handler(); + boolean fragmentActive = false; + + @Override + public void onAttach(Context context) { + if (DEBUG) { + if (fragmentName == null) Log.i(TAG, "CommonFragment.onAttach: NULL fragmentName"); + else Log.i(TAG, "CommonFragment.onAttach: fragmentName = " + fragmentName); + if (MainActivity.csLibrary4A == null) Log.i(TAG, "CommonFragment.onAttach: NULL MainActivity.csLibrary4a"); + if (fragmentName == null) MainActivity.csLibrary4A.appendToLog("NULL fragmentName"); + MainActivity.csLibrary4A.appendToLog(fragmentName); + } + super.onAttach(context); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog(fragmentName); + super.onCreate(savedInstanceState); + } + + boolean menuFragment = false; + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState, boolean menuFragment) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog(fragmentName); + this.menuFragment = menuFragment; + + bleConnected = false; if (MainActivity.csLibrary4A.isBleConnected()) bleConnected = true; + rfidFailure = false; if (MainActivity.csLibrary4A.isRfidFailure()) rfidFailure = true; + ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + boolean bHomeAsUpEnabled = true; + if (fragmentName.matches("HomeFragment")) bHomeAsUpEnabled = false; + if (fragmentName.matches("HomeWFragment")) bHomeAsUpEnabled = false; + actionBar.setDisplayHomeAsUpEnabled(bHomeAsUpEnabled); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("CommonFragment: onCreateView with fragmentName = " + fragmentName + " , onOptionsItemSelected = " + menuFragment + ", DisplayHomeAsUpEnabled = " + bHomeAsUpEnabled); + + if (menuFragment) setHasOptionsMenu(true); + return super.onCreateView(inflater, container, savedInstanceState); + } + + int triggerCount_old; + private final Runnable updateTriggerRunnable = new Runnable() { + @Override + public void run() { + short reportCount = 5; + if (MainActivity.csLibrary4A.isBleConnected()) { + byte[] notificationData = MainActivity.csLibrary4A.onNotificationEvent(); + if (false && notificationData != null) { + MainActivity.csLibrary4A.appendToLog("2 matched Error: " + MainActivity.csLibrary4A.byteArrayToString(notificationData)); + CustomPopupWindow customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart("Common Notification Error Code A101: " + MainActivity.csLibrary4A.byteArrayToString(notificationData), false); + } + reportCount = MainActivity.csLibrary4A.getTriggerReportingCount(); + } + + mHandler.postDelayed(updateTriggerRunnable, reportCount * 1100); + if (menuTriggerItem == null) return; + if (MainActivity.csLibrary4A.isBleConnected() == false) { menuTriggerItem.setTitle(""); return; } + + int triggerCount = MainActivity.csLibrary4A.getTriggerCount(); + if (triggerCount != triggerCount_old) { + triggerCount_old = triggerCount; + if (MainActivity.csLibrary4A.getTriggerButtonStatus()) menuTriggerItem.setTitle("Ton"); + else menuTriggerItem.setTitle("Toff"); + } else menuTriggerItem.setTitle(""); + } + }; + + boolean bleDisConnecting = false; + boolean bleConnected = false, rfidFailure = false; + int batteryCount_old; boolean batteryUpdate = false; CustomPopupWindow batteryWarningPopupWindow; String strBatteryLow; + private final Runnable updateBatteryRunnable = new Runnable() { + @Override + public void run() { + mHandler.postDelayed(updateBatteryRunnable, 5000); //normal battery level updates every 4 seconds + + if (menuBatteryVoltageItem == null) return; + if (MainActivity.csLibrary4A.isBleConnected() == false) { + if (bleDisConnecting) bleConnected = false; bleDisConnecting = true; + if (bleConnected) { + bleConnected = false; if (DEBUG) MainActivity.csLibrary4A.appendToLog("bleConnected is FALSE in " + fragmentName); + if (false) Toast.makeText(MainActivity.mContext, "Bluetooth is disconnected", Toast.LENGTH_SHORT).show(); + else { + CustomAlertDialog appdialog = new CustomAlertDialog(); + appdialog.Confirm((Activity) MainActivity.mContext, "Bluetooth is DISCONNECTED", + "Do you want to reconnect the Bluetooth ?", + "No thanks", "Reconnect", + new Runnable() { + @Override + public void run() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Confirm is pressed"); + MainActivity.csLibrary4A.connect(null); + } + }, + new Runnable() { + @Override + public void run() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Cancel is pressed."); + } + }); + } + } else if (DEBUG) MainActivity.csLibrary4A.appendToLog("bleConnected is Kept as FALSE in " + fragmentName); + MainActivity.sharedObjects.batteryWarningShown = 0; menuBatteryVoltageItem.setTitle(""); + return; + } else { + bleConnected = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("bleConnected is TRUE in " + fragmentName); + } + + if (MainActivity.csLibrary4A.isRfidFailure()) { + if (rfidFailure == false) { + rfidFailure = true; + if (false) { + CustomAlertDialog appdialog = new CustomAlertDialog(); + appdialog.Confirm((Activity) MainActivity.mContext, "Rfid Transmission failure", + "Do you want to disconnect the Bluetooth ?", + "No thanks", "Disconnect", + new Runnable() { + @Override + public void run() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Confirm is pressed"); + MainActivity.csLibrary4A.forceBTdisconnect(); + } + }, + new Runnable() { + @Override + public void run() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Cancel is pressed."); + } + }); + } + } + } else { + rfidFailure = false; + } + + int batteryCount = MainActivity.csLibrary4A.getBatteryCount(); + String strText = MainActivity.csLibrary4A.getBatteryDisplay(false); + if (batteryCount_old != batteryCount) strBatteryLow = MainActivity.csLibrary4A.isBatteryLow(); + + if (strBatteryLow == null) MainActivity.sharedObjects.batteryWarningShown = 0; + else if (++MainActivity.sharedObjects.batteryWarningShown == 1) { + if (batteryWarningPopupWindow != null) + batteryWarningPopupWindow.popupWindow.dismiss(); + batteryWarningPopupWindow = new CustomPopupWindow(MainActivity.mContext); + batteryWarningPopupWindow.popupStart(strBatteryLow + "% Battery Life Left, Please Recharge CSL Reader or Replace with Freshly Charged CSL Reader battery", false); + } else if (false && MainActivity.sharedObjects.batteryWarningShown > 10) MainActivity.sharedObjects.batteryWarningShown = 0; + + if (batteryCount_old == batteryCount && strText.length() != 0) { + if (batteryUpdate) strText = "B" + strText; + else strText = "A" + strText; + batteryUpdate = !batteryUpdate; + menuBatteryVoltageItem.setTitle(strText); + MainActivity.csLibrary4A.batteryLevelRequest(); + } else { + batteryCount_old = batteryCount; + SpannableString spanString = new SpannableString(strText); + spanString.setSpan(new ForegroundColorSpan(Color.RED), 0, spanString.length(), 0); //fix the color to white + if (false || strBatteryLow != null) menuBatteryVoltageItem.setTitle(spanString); + else menuBatteryVoltageItem.setTitle(strText); + } + } + }; + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog(fragmentName); + super.onActivityCreated(savedInstanceState); + } + + @Override + public void onViewStateRestored(Bundle savedInstanceState) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog(fragmentName); + super.onViewStateRestored(savedInstanceState); + } + + @Override + public void onStart() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog(fragmentName); + super.onStart(); + } + + @Override + public void onResume() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog(fragmentName); + if (menuFragment) { + batteryCount_old = -1; + mHandler.post(updateTriggerRunnable); + mHandler.post(updateBatteryRunnable); + } + super.onResume(); + fragmentActive = true; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog(fragmentName + " with fragmentActive = " + fragmentActive); + if (fragmentActive == false) return; + if (fragmentName.matches("ConnectionFragment")) { + inflater.inflate(R.menu.menu_connection, menu); + if (MainActivity.csLibrary4A.isBleScanning()) { + menu.findItem(R.id.action_refresh).setActionView(R.layout.actionbar_indeterminate_progress); + } else { + menu.findItem(R.id.action_refresh).setActionView(null); + } + } else { + inflater.inflate(R.menu.menu_home, menu); + menuBatteryVoltageItem = menu.findItem(R.id.home_voltage);; + menuTriggerItem = menu.findItem(R.id.home_trigger); + menu.removeItem(R.id.home_menu); + if (fragmentName.matches("InventoryFragment") + || fragmentName.contains("InventoryRfidiMultiFragment") + || fragmentName.contains("InventoryRfidSimpleFragment") + + || fragmentName.contains("ImpinjFragment") + || fragmentName.contains("Ucode8Fragment") + || fragmentName.contains("UcodeFragment") + || fragmentName.contains("ColdChainFragment") + || fragmentName.contains("AuraSenseFragment") + || fragmentName.contains("AxzonFragment") + || fragmentName.contains("MicronFragment") + || fragmentName.contains("FdmicroFragment") + || fragmentName.contains("LedTagFragment") + + || fragmentName.contains("InventoryRfidSimpleFragment") + ) { + menu.findItem(R.id.menuAction_clear).setTitle("Clear"); + menu.findItem(R.id.menuAction_save).setTitle("Save"); + menu.findItem(R.id.menuAction_share).setTitle("Share"); + menu.findItem(R.id.menuAction_share).setIcon(android.R.drawable.ic_menu_share); + if (fragmentName.contains("InventoryBarcodeFragment")) { + menu.removeItem(R.id.menuAction_sort); + menu.removeItem(R.id.menuAction_sortRssi); + } else { + menu.findItem(R.id.menuAction_sort).setTitle("Sort by EPC"); + menu.findItem(R.id.menuAction_sortRssi).setTitle("Sort by Rssi"); + } + } else { + menu.removeItem(R.id.menuAction_clear); + menu.removeItem(R.id.menuAction_save); + menu.removeItem(R.id.menuAction_share); + menu.removeItem(R.id.menuAction_sort); + menu.removeItem(R.id.menuAction_sortRssi); + } + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("CommonFragment: onOptionsItemSelected"); + if (DEBUG) MainActivity.csLibrary4A.appendToLog(fragmentName + " with fragmentActive = " + fragmentActive); + if (fragmentActive == false) return false; + switch (item.getItemId()) { + case android.R.id.home: + if (DEBUG) MainActivity.csLibrary4A.appendToLog("CommonFragment: onOptionsItemSelected: getActivity().onBackPressed"); + getActivity().onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + public void onPause() { + fragmentActive = false; + if (DEBUG) MainActivity.csLibrary4A.appendToLog(fragmentName); + super.onPause(); + } + + @Override + public void onStop() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog(fragmentName); + mHandler.removeCallbacks(updateTriggerRunnable); + mHandler.removeCallbacks(updateBatteryRunnable); + super.onStop(); + } + + @Override + public void onDestroyView() { + if (false) MainActivity.csLibrary4A.appendToLog(fragmentName); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + if (DEBUG && MainActivity.csLibrary4A != null) MainActivity.csLibrary4A.appendToLog(fragmentName); + super.onDestroy(); + } + + @Override + public void onDetach() { + if (DEBUG && MainActivity.csLibrary4A != null) MainActivity.csLibrary4A.appendToLog(fragmentName); + super.onDetach(); + } + + CommonFragment(String text) { + fragmentName = text; + if (DEBUG) MainActivity.csLibrary4A.appendToLog(",,," + fragmentName); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.Manifest; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.le.ScanCallback; +import android.content.pm.PackageManager; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; + +import android.os.ParcelUuid; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.CustomProgressDialog; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.BluetoothGatt; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cs710ademoapp.adapters.ReaderListAdapter; + +import java.util.ArrayList; + +public class ConnectionFragment extends CommonFragment { + private DeviceScanTask deviceScanTask; + private ReaderListAdapter readerListAdapter; + private BluetoothAdapter.LeScanCallback mLeScanCallback; + private ScanCallback mScanCallback; + private ArrayList readersList = MainActivity.sharedObjects.readersList; + + private ArrayList mScanResultList = new ArrayList<>(); + private Handler mHandler = new Handler(); + private DeviceConnectTask deviceConnectTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_connection, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_rdl); + actionBar.setTitle(R.string.title_activity_connection); + + TextView textview = (TextView) getActivity().findViewById(R.id.connection_warning); + MainActivity.csLibrary4A.appendToLog("getActivity().getPackageName() = " + getActivity().getPackageName()); + if (getActivity().getPackageName().contains("com.csl.cs710ademoapp")) textview.setVisibility(View.VISIBLE); + + if (MainActivity.csLibrary4A.isBleConnected() == false) readersList.clear(); + final ListView readerListView = (ListView) getActivity().findViewById(R.id.readersList); + TextView readerEmptyView = (TextView) getActivity().findViewById(R.id.empty); + readerListView.setEmptyView(readerEmptyView); + readerListAdapter = new ReaderListAdapter(getActivity(), R.layout.readers_list_item, readersList, true, true); + readerListView.setAdapter(readerListAdapter); + readerListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + readerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + boolean DEBUG = false; + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (bConnecting) return; + + ReaderDevice readerDevice = readerListAdapter.getItem(position); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("ConnectionFragment.OnItemClickListener: bConnecting = " + bConnecting + ", postion = " + position); + boolean bSelectOld = readerDevice.getSelected(); + + if (MainActivity.csLibrary4A.isBleConnected() && readerDevice.isConnected() && (readerDevice.getSelected() || false)) { + MainActivity.csLibrary4A.appendToLog("ConnectionFragment.onItemClick, Fragment: "); + MainActivity.csLibrary4A.disconnect(false); bleDisConnecting = true; + readersList.clear(); + } else if (MainActivity.csLibrary4A.isBleConnected() == false && readerDevice.getSelected() == false) { + boolean validStart = false; + if (deviceConnectTask == null) { + validStart = true; + } else if (deviceConnectTask.getStatus() == AsyncTask.Status.FINISHED) { + validStart = true; + } + if (validStart) { + bConnecting = true; + if (deviceScanTask != null) deviceScanTask.cancel(true); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("ConnectionFragment.OnItemClickListener: Connecting"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + deviceConnectTask = new DeviceConnectTask(position, readerDevice, "Connecting with " + readerDevice.getName()); + deviceConnectTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else { + deviceConnectTask = new DeviceConnectTask(position, readerDevice, "Connecting with " + readerDevice.getName()); + deviceConnectTask.execute(); + } + } + } + + if (readersList.size() > position) { + if (readerDevice.getSelected()) readerDevice.setSelected(false); + else readerDevice.setSelected(true); + readersList.set(position, readerDevice); + for (int i = 0; i < readersList.size(); i++) { + if (i != position) { + ReaderDevice readerDevice1 = readersList.get(i); + if (readerDevice1.getSelected()) { + readerDevice1.setSelected(false); + readersList.set(i, readerDevice1); + } + } + } + } + readerListAdapter.notifyDataSetChanged(); + } + }); + if (MainActivity.csLibrary4A.isBleConnected() == false) { + for (int i = 0; i < readersList.size(); i++) { + ReaderDevice readerDevice1 = readersList.get(i); + if (readerDevice1.isConnected()) { + readerDevice1.setConnected(false); + readersList.set(i, readerDevice1); + } + } + } + readerListAdapter.notifyDataSetChanged(); + } + + @Override + public void onResume() { + mHandler.post(checkRunnable); + super.onResume(); + } + + @Override + public void onStop() { + mHandler.removeCallbacks(checkRunnable); + if (deviceScanTask != null) { + deviceScanTask.cancel(true); + } + if (deviceConnectTask != null) { + deviceConnectTask.cancel(true); + } + super.onStop(); + } + + public ConnectionFragment() { + super("ConnectionFragment"); + } + + private final Runnable checkRunnable = new Runnable() { + @Override + public void run() { + boolean operating = false; + if (MainActivity.csLibrary4A.isBleConnected()) operating = true; + if (operating == false && deviceScanTask != null) { + if (deviceScanTask.isCancelled() == false) operating = true; + } + if (operating == false && deviceConnectTask != null) { + if (deviceConnectTask.isCancelled() == false) operating = true; + } + if (operating == false) { + deviceScanTask = new DeviceScanTask(); + deviceScanTask.execute(); + } + mHandler.postDelayed(checkRunnable, 5000); + } + }; + + private class DeviceScanTask extends AsyncTask { + private long timeMillisUpdate = System.currentTimeMillis(); + ArrayList readersListOld = new ArrayList(); + boolean wait4process = false; boolean scanning = false, DEBUG = false; + + @Override + protected String doInBackground(Void... a) { + while (isCancelled() == false) { + if (wait4process == false) { + BluetoothGatt.CsScanData csScanData = MainActivity.csLibrary4A.getNewDeviceScanned(); + if (csScanData != null) mScanResultList.add(csScanData); + if (scanning == false || mScanResultList.size() != 0 || System.currentTimeMillis() - timeMillisUpdate > 10000) { + wait4process = true; publishProgress(""); + } + } + } + return "End of Asynctask()"; + } + + @Override + protected void onProgressUpdate(String... output) { + if (scanning == false) { + scanning = true; + if (MainActivity.csLibrary4A.scanLeDevice(true) == false) cancel(true); + else getActivity().invalidateOptionsMenu(); + } + boolean listUpdated = false; + while (mScanResultList.size() != 0) { + BluetoothGatt.CsScanData scanResultA = mScanResultList.get(0); + mScanResultList.remove(0); + if (getActivity() == null) continue; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if (ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) continue; + } else if (ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED) continue; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("scanResultA.device.getType() = " + scanResultA.device.getType() + ". scanResultA.rssi = " + scanResultA.rssi); + if (/*scanResultA.device.getType() == BluetoothDevice.DEVICE_TYPE_LE &&*/(true || scanResultA.rssi < 0)) { + boolean match = false; + for (int i = 0; i < readersList.size(); i++) { + String stringReaderAddress = readersList.get(i).getAddress(); + String stringDeviceAddress = (scanResultA.device == null ? scanResultA.getAddress() : scanResultA.device.getAddress()); + if (stringReaderAddress.matches(stringDeviceAddress)) { + ReaderDevice readerDevice1 = readersList.get(i); + int count = readerDevice1.getCount(); + count++; + readerDevice1.setCount(count); + readerDevice1.setRssi(scanResultA.rssi); + readerDevice1.setServiceUUID2p1(scanResultA.serviceUUID2p2); + readersList.set(i, readerDevice1); listUpdated = true; + match = true; + break; + } + } + if (match == false) { + String name = scanResultA.getName(); //(scanResultA.device == null ? scanResultA.getName() : scanResultA.device.getName()); + if (false) { + if (scanResultA.device != null && scanResultA.rssi == 0) { + BluetoothDevice bluetoothDevice = scanResultA.device; + ParcelUuid[] parcelUuids = bluetoothDevice.getUuids(); + for (int k = 0; parcelUuids != null && k < parcelUuids.length; k++) { + name += (", " + parcelUuids[k].toString()); + } + } + } + String address = (scanResultA.device == null ? scanResultA.getAddress() : scanResultA.device.getAddress()); + ReaderDevice readerDevice = new ReaderDevice(name, address, false, "", 1, scanResultA.rssi, scanResultA.serviceUUID2p2); + String strInfo = ""; + if (scanResultA.device != null && scanResultA.device.getBondState() == 12) { + strInfo += "BOND_BONDED\n"; + } + readerDevice.setDetails(strInfo + "scanRecord=" + MainActivity.csLibrary4A.byteArrayToString(scanResultA.scanRecord)); + readersList.add(readerDevice); listUpdated = true; + } + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("deviceScanTask: rssi=" + scanResultA.rssi + ", error type=" + scanResultA.device.getType()); + } + } + if (System.currentTimeMillis() - timeMillisUpdate > 10000) { + timeMillisUpdate = System.currentTimeMillis(); + for (int i = 0; i < readersList.size(); i++) { + ReaderDevice readerDeviceNew = readersList.get(i); + boolean matched = false; + for (int k = 0; k < readersListOld.size(); k++) { + ReaderDevice readerDeviceOld = readersListOld.get(k); + if (readerDeviceOld.getAddress().matches(readerDeviceNew.getAddress())) { + matched = true; + if (readerDeviceOld.getCount() >= readerDeviceNew.getCount()) { + readersList.remove(i); listUpdated = true; + readersListOld.remove(k); + } else readerDeviceOld.setCount(readerDeviceNew.getCount()); + break; + } + } + if (matched == false) { + ReaderDevice readerDevice1 = new ReaderDevice(null, readerDeviceNew.getAddress(), false, null, readerDeviceNew.getCount(), 0); + readersListOld.add(readerDevice1); + } + } + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Matched. Updated readerListOld with size = " + readersListOld.size()); + MainActivity.csLibrary4A.scanLeDevice(false); + getActivity().invalidateOptionsMenu(); + scanning = false; + } + if (listUpdated) readerListAdapter.notifyDataSetChanged(); + wait4process = false; + } + + @Override + protected void onCancelled() { + super.onCancelled(); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Stop Scanning 1A"); + deviceScanEnding(); + } + + @Override + protected void onPostExecute(String result) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Stop Scanning 1B"); + deviceScanEnding(); + } + + void deviceScanEnding() { + MainActivity.csLibrary4A.scanLeDevice(false); + } + } + + long connectTimeMillis; boolean bConnecting = false; + private class DeviceConnectTask extends AsyncTask { + boolean DEBUG = false; + private int position; + private final ReaderDevice connectingDevice; + private String prgressMsg; + int waitTime; + private CustomProgressDialog progressDialog; + private int setting; + + DeviceConnectTask(int position, ReaderDevice connectingDevice, String prgressMsg) { + this.position = position; + this.connectingDevice = connectingDevice; + this.prgressMsg = prgressMsg; + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + + if (DEBUG) MainActivity.csLibrary4A.appendToLog("start of Connection with mrfidToWriteSize = " + MainActivity.csLibrary4A.mrfidToWriteSize()); + MainActivity.csLibrary4A.connect(connectingDevice); + waitTime = 30; + setting = -1; + progressDialog = new CustomProgressDialog(getActivity(), prgressMsg); + progressDialog.show(); + } + + @Override + protected Integer doInBackground(Void... a) { + do { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + publishProgress("kkk "); + if (MainActivity.csLibrary4A.isBleConnected()) { + setting = 0; break; + } + } while (--waitTime > 0); + if (progressDialog.isShowing()) + progressDialog.dismiss(); + if (setting != 0 || waitTime <= 0) { + cancel(true); + } + publishProgress("mmm "); + return waitTime; + } + + @Override + protected void onProgressUpdate(String... output) { + } + + @Override + protected void onCancelled(Integer result) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("ConnectionFragment.deviceConnectTask: onCancelled(): setting = " + setting + ", waitTime = " + waitTime); + if (setting >= 0) { + Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.toast_ble_setup_problem), Toast.LENGTH_SHORT).show(); + } else { + MainActivity.csLibrary4A.isBleConnected(); + Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.error_bluetooth_connection_failed), Toast.LENGTH_SHORT).show(); + } + super.onCancelled(); + MainActivity.csLibrary4A.disconnect(false); bleDisConnecting = true; + + bConnecting = false; + } + + protected void onPostExecute(Integer result) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("ConnectionFragment.deviceConnectTask: onPostExecute(): setting = " + setting + ", waitTime = " + waitTime); + ReaderDevice readerDevice = readersList.get(position); + readerDevice.setConnected(true); + readersList.set(position, readerDevice); + readerListAdapter.notifyDataSetChanged(); + + String connectedBleAddress = connectingDevice.getAddress(); + if (connectedBleAddress.matches(MainActivity.sharedObjects.connectedBleAddressOld) == false) MainActivity.sharedObjects.versionWarningShown = false; + MainActivity.sharedObjects.connectedBleAddressOld = connectedBleAddress; + MainActivity.sharedObjects.barsList.clear(); + MainActivity.sharedObjects.tagsList.clear(); + MainActivity.sharedObjects.tagsIndexList.clear(); + + Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.toast_ble_connected), Toast.LENGTH_SHORT).show(); + + connectTimeMillis = System.currentTimeMillis(); + super.onPostExecute(result); + + if (DEBUG) MainActivity.csLibrary4A.appendToLog("ConnectionFragment: onPostExecute: getActivity().onBackPressed"); + getActivity().onBackPressed(); + bConnecting = false; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("end of Connection with mrfidToWriteSize = " + MainActivity.csLibrary4A.mrfidToWriteSize()); + } + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static android.Manifest.permission.ACCESS_COARSE_LOCATION; +import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.Manifest.permission.BLUETOOTH; +import static android.Manifest.permission.BLUETOOTH_CONNECT; +import static android.Manifest.permission.BLUETOOTH_SCAN; +import static android.Manifest.permission.READ_EXTERNAL_STORAGE; +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; +import static android.content.Context.LOCATION_SERVICE; + +import static com.csl.cs710ademoapp.MainActivity.mContext; + +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.drawable.ColorDrawable; +import android.location.LocationManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.provider.Settings; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.InputMethodInfo; +import android.view.inputmethod.InputMethodManager; +import android.view.inputmethod.InputMethodSubtype; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.ListView; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; + +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.DrawerListContent; +import com.csl.cs710ademoapp.adapters.ReaderListAdapter; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.CustomAlertDialog; +import com.csl.cslibrary4a.BluetoothGatt; +import com.csl.cslibrary4a.ReaderDevice; + +import java.util.ArrayList; +import java.util.List; + +public class DirectWedgeFragment extends CommonFragment { + Button buttonConnect; + private ArrayList readersList = MainActivity.sharedObjects.readersList; + Handler handler = new Handler(); + private ReaderListAdapter readerListAdapter; + boolean bWedgeConnecting = false, bWedgeConnected = false; + boolean bCurrentIMEmatched = false; + String stringImeExpected, stringLabelExpected; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_directwedge, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + TableRow tableRow1 = getActivity().findViewById(R.id.directWedgeRow1); + TableRow tableRow2 = getActivity().findViewById(R.id.directWedgeRow2); + TableRow tableRow3 = getActivity().findViewById(R.id.directWedgeRow3); + TableRow tableRow4 = getActivity().findViewById(R.id.directWedgeRow4); + TableRow tableRow5 = getActivity().findViewById(R.id.directWedgeRow5); + TableRow tableRowStart = getActivity().findViewById(R.id.directWedgeRowStart); + MainActivity.csLibrary4A.appendToLog("getPackageName = " + getActivity().getPackageName()); + if (getActivity().getPackageName().contains("cs710awedgeapp")) { + androidx.appcompat.app.ActionBar actionBar; + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_access); + ColorDrawable colorDrawable = new ColorDrawable(getResources().getColor(R.color.colorPrimary)); + actionBar.setBackgroundDrawable(colorDrawable); + actionBar.setTitle(R.string.app_ime_simplewedge1); + actionBar.setDisplayHomeAsUpEnabled(false); + //String strTitle = actionBar.getTitle().toString() + " v" + BuildConfig.VERSION_NAME; + //actionBar.setTitle(strTitle); + } else { //if (getActivity().getPackageName().contains("cs710ademoapp")) { + ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle("Wedge"); + + tableRow1.setVisibility(View.GONE); + tableRow2.setVisibility(View.GONE); + tableRow3.setVisibility(View.GONE); + tableRow4.setVisibility(View.GONE); + tableRow5.setVisibility(View.GONE); + tableRowStart.setVisibility(View.VISIBLE); + } + + if (false) { + ReaderDevice readerDevice1 = new ReaderDevice(null, "123456", false, null, 0, 0); + ReaderDevice readerDevice2 = new ReaderDevice(null, "1234567890", false, null, 0, 0); + readersList.add(readerDevice1); + readersList.add(readerDevice2); + } + + ListView readerListView = (ListView) getActivity().findViewById(R.id.directWedgeListView); + TextView readerEmptyView = (TextView) getActivity().findViewById(R.id.directWedgeTextViewEmpty); + readerListView.setEmptyView(readerEmptyView); + readerListAdapter = new ReaderListAdapter(getActivity(), R.layout.readers_list_item, readersList, true, true); + readerListView.setAdapter(readerListAdapter); + readerListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + readerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + boolean DEBUG = true; + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("OnItemClickListener: bConnecting = " + bWedgeConnecting + ", position = " + position); + if (bWedgeConnecting) return; + + ReaderDevice readerDevice = readerListAdapter.getItem(position); + if (readersList.size() > position) { + if (readerDevice.getSelected()) readerDevice.setSelected(false); + else readerDevice.setSelected(true); + readersList.set(position, readerDevice); + for (int i = 0; i < readersList.size(); i++) { + if (i != position) { + ReaderDevice readerDevice1 = readersList.get(i); + if (readerDevice1.getSelected()) { + readerDevice1.setSelected(false); + readersList.set(i, readerDevice1); + } + } + } + } + readerListAdapter.notifyDataSetChanged(); + + if (DEBUG) MainActivity.csLibrary4A.appendToLog("OnItemClickListener: readerDevice.getSelected = " + readerDevice.getSelected()); + if (MainActivity.csLibrary4A.isBleConnected() && readerDevice.getSelected() == false && readerDevice.isConnected()) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("OnItemClickListener: going to disconnect"); + disconnectWedge(); + } else if (MainActivity.csLibrary4A.isBleConnected() == false && readerDevice.getSelected()) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("OnItemClickListener: going to CONNECT"); + if (true) connectWedge(readerDevice); + } + } + }); + + Button buttonSetup = (Button) getActivity().findViewById(R.id.directWedgeButtonSetup); + buttonSetup.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() || true) new SettingWedgeFragment().show(getChildFragmentManager(), "TAG"); + else if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.toast_not_ready), Toast.LENGTH_SHORT).show(); + else Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.toast_ble_not_connected), Toast.LENGTH_SHORT).show(); + } + }); + + buttonConnect = (Button) getActivity().findViewById(R.id.directWedgeButtonConnect); + buttonConnect.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (bWedgeConnecting) return; + if (MainActivity.csLibrary4A.isBleConnected()) { + disconnectWedge(); + readerListAdapter.notifyDataSetChanged(); + } else { + boolean bFound = false; + for (int i = 0; i < readersList.size(); i++) { + ReaderDevice readerDevice = readersList.get(i); + if (readerDevice.getSelected() && readerDevice.isConnected() == false) { + connectWedge(readerDevice); + bFound = true; + break; + } + } + if (bFound == false) Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.toast_select_reader_first), Toast.LENGTH_SHORT).show(); + } + } + }); + + Button buttonStart = (Button) getActivity().findViewById(R.id.directWedgeButtonStart); + if (!getActivity().getPackageName().matches("com.csl.cs710awedgeapp")) buttonStart.setVisibility(View.VISIBLE); + buttonStart.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected()) { + if (MainActivity.csLibrary4A.mrfidToWriteSize() == 0) { + MainActivity.wedged = true; + Intent i = new Intent(Intent.ACTION_MAIN); + i.addCategory(Intent.CATEGORY_HOME); + startActivity(i); + } + } else Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.toast_ble_not_connected), Toast.LENGTH_SHORT).show(); + } + }); + + Button buttonInfo = (Button) getActivity().findViewById(R.id.directWedgeButtonInfo); + buttonInfo.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + CustomPopupWindow customPopupWindow = new CustomPopupWindow(mContext); + String stringInfo = + "1. For the first time launching the application, please grant device permission for location, connectivity and enabling . \n\n" + + "2. Readers will be discovered by the app and please check the box on the right hand side to select the reader to be connected. \n\n" + + "3. Once connected, put the application in background.\n\n" + + "4. Open the target application where you would like data to be printed.\n\n" + + "5. On the target applicatoin , put the cursor to the text field where data will be printed. Switch your keyboard to .\n\n" + + "6. Press and hold the trigger key of the reader to start reading tags. EPC values will be printed to the cursor on your target application.\n\n" + + "7. Switch back to the CSL Data Wedge application. Now you can press the \"Disconnect\" button to disconnect from the reader.\n\n" + + "8. Configuration button: Press the button to modify parameters such as power, prefix, suffix and delimiter.\n\n"; + MainActivity.csLibrary4A.appendToLog(stringInfo); + customPopupWindow.popupStart(stringInfo, false); + } + }); + + handler.post(runnableStartService); + handler.postDelayed(runnableStart, 1000); + } + + @Override + public void onResume() { + super.onResume(); + readerListAdapter.notifyDataSetChanged(); + updateCurrentIMEMatched(); + } + + @Override + public void onDestroy() { + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + public DirectWedgeFragment() { + super("DirectWedgeFragment"); + } + + public static boolean bUserRequestedDisconnect = false; + void disconnectWedge() { + MainActivity.csLibrary4A.appendToLog("foregroundReader108: updated 2A"); + MainActivity.csLibrary4A.setForegroundServiceEnable(false); + MainActivity.csLibrary4A.appendToLog("getForegroundReader = " + MainActivity.csLibrary4A.getForegroundReader()); + + MainActivity.csLibrary4A.disconnect(false); bleDisConnecting = true; bWedgeConnecting = false; bUserRequestedDisconnect = true; + readersList.clear(); + buttonConnect.setText("Connect"); + handler.removeCallbacks(runnableStart); handler.postDelayed(runnableStart, 2000); + + MainActivity.csLibrary4A.setWedgeDeviceName(null); MainActivity.csLibrary4A.setWedgeDeviceAddress(null); + } + void connectWedge(ReaderDevice readerDevice) { + MainActivity.csLibrary4A.scanLeDevice(false); + MainActivity.csLibrary4A.connect(readerDevice); bWedgeConnecting = true; bWedgeConnected = false; bUserRequestedDisconnect = false; + buttonConnect.setText("Connecting"); + MainActivity.csLibrary4A.setWedgeDeviceName(readerDevice.getName()); MainActivity.csLibrary4A.setWedgeDeviceAddress(readerDevice.getAddress()); + MainActivity.csLibrary4A.setWedgeDeviceUUID2p1(readerDevice.getServiceUUID2p1()); + } + + Runnable runnableStartService = new Runnable() { + boolean DEBUG = false; + + @Override + public void run() { + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, WRITE_EXTERNAL_STORAGE) = " + ActivityCompat.checkSelfPermission(mContext, WRITE_EXTERNAL_STORAGE)); + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, READ_EXTERNAL_STORAGE) = " + ActivityCompat.checkSelfPermission(mContext, READ_EXTERNAL_STORAGE)); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (mContext.checkSelfPermission(WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + MainActivity.csLibrary4A.appendToLog("runnableStartService: requestPermissions WRITE_EXTERNAL_STORAGE"); // + requestPermissions(new String[] { WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE }, 1); + //Toast.makeText(mContext, com.csl.cslibrary4a.R.string.toast_permission_not_granted, Toast.LENGTH_SHORT).show(); + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: WRITE_EXTERNAL_STORAGE is permitted"); /// + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: no need to handle WRITE_EXTERNAL_STORAGE"); + + LocationManager locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); + MainActivity.csLibrary4A.appendToLog("runnableStartService: locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) = " + locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)); + MainActivity.csLibrary4A.appendToLog("runnableStartService: locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) = " + locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)); + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, ACCESS_FINE_LOCATION) = " + ActivityCompat.checkSelfPermission(mContext, ACCESS_FINE_LOCATION)); + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, ACCESS_COARSE_LOCATION) = " + ActivityCompat.checkSelfPermission(mContext, ACCESS_COARSE_LOCATION)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if ((ActivityCompat.checkSelfPermission(mContext, ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED + || ActivityCompat.checkSelfPermission(mContext, ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { + CustomAlertDialog appdialog = new CustomAlertDialog(); + appdialog.Confirm(getActivity(), "Use your location", + "This app collects location data in the background. In terms of the features using this location data in the background, this App collects location data when it is reading RFID tag in all inventory pages. The purpose of this is to correlate the RFID tag with the actual GNSS(GPS) location of the tag. In other words, this is to track the physical location of the logistics item tagged with the RFID tag.", + "No thanks", "Turn on", + new Runnable() { + @Override + public void run() { + MainActivity.csLibrary4A.appendToLog("runnableStartService: allow permission in ACCESS_FINE_LOCATION handler"); + MainActivity.csLibrary4A.appendToLog("runnableStartService: requestPermissions ACCESS_FINE_LOCATION"); + requestPermissions(new String[] { ACCESS_FINE_LOCATION }, 123); //ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION + //if (false) Toast.makeText(mContext, com.csl.cslibrary4a.R.string.toast_permission_not_granted, Toast.LENGTH_SHORT).show(); + /*{ + LocationManager locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); + if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) == false && locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) == false) { + MainActivity.csLibrary4A.appendToLog("popupAlert: StreamOut: start activity ACTION_LOCATION_SOURCE_SETTINGS"); + Intent intent1 = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + mContext.startActivity(intent1); + } + }*/ + //bleEnableRequestShown0 = true; mHandler.postDelayed(mRquestAllowRunnable, 60000); + //bAlerting = false; + } + }, + new Runnable() { + @Override + public void run() { + MainActivity.csLibrary4A.appendToLog("runnableStartService: reject permission in ACCESS_FINE_LOCATION handler"); + //bAlerting = false; + //bleEnableRequestShown0 = true; mHandler.postDelayed(mRquestAllowRunnable, 60000); + } + }); + MainActivity.csLibrary4A.appendToLog("runnableStartService: started ACCESS_FINE_LOCATION handler"); + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: handled ACCESS_FINE_LOCATION"); + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: no need to handle ACCESS_FINE_LOCATION"); + + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, BLUETOOTH_CONNECT) = " + ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_CONNECT)); + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, BLUETOOTH_SCAN) = " + ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_SCAN)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if (ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { + MainActivity.csLibrary4A.appendToLog("runnableStartService: requestPermissions BLUETOOTH_SCAN and BLUETOOTH_CONNECT"); + requestPermissions(new String[] { BLUETOOTH_SCAN, BLUETOOTH_CONNECT }, 123); + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: handled BLUETOOTH_CONNECT and BLUETOOTH_SCAN"); + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: no need to handle BLUETOOTH_SCAN and BLUETOOTH_CONNECT"); + } + }; + + int runningMode = -1, connectWait = 0, scanWait = 0; + Runnable runnableStart = new Runnable() { + @Override + public void run() { + boolean bValue = true; + if (MainActivity.csLibrary4A.isBleConnected()) { + if (MainActivity.csLibrary4A.mrfidToWriteSize() == 0) { + bWedgeConnecting = false; + if (bWedgeConnected == false) { + bWedgeConnected = true; + MainActivity.csLibrary4A.setPowerLevel(MainActivity.csLibrary4A.getWedgePower()); + MainActivity.csLibrary4A.appendToLog("runnableStart: isBleConnected is true with mrfidToWriteSize = " + MainActivity.csLibrary4A.mrfidToWriteSize()); + for (int i = 0; i < readersList.size(); i++) { + ReaderDevice readerDevice = readersList.get(i); + if (readerDevice.getSelected() && readerDevice.isConnected() == false) { + readerDevice.setConnected(true); + readersList.set(i, readerDevice); + readerListAdapter.notifyDataSetChanged(); + } + } + if (getActivity().getPackageName().contains("cs710awedgeapp")) { + MainActivity.csLibrary4A.appendToLog("foregroundReader108: updated 2b"); + MainActivity.csLibrary4A.setForegroundServiceEnable(true); + MainActivity.csLibrary4A.saveSetting2File(); + } + } + buttonConnect.setText("Disconnect"); + } //else Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.toast_not_ready), Toast.LENGTH_SHORT).show(); + } else if (bWedgeConnecting) { + MainActivity.csLibrary4A.appendToLog("runnableStart: bConnecting is true"); + } else if (MainActivity.csLibrary4A.isBleScanning()) { + MainActivity.csLibrary4A.appendToLog("runnableStart: isBleScanning is true"); + boolean listUpdated = false; + if (++scanWait > 10) { + boolean bValue1 = MainActivity.csLibrary4A.scanLeDevice(false); + MainActivity.csLibrary4A.appendToLog("runnableStart: STOP scanning with result = " + bValue1); + scanWait = 0; + readersList.clear(); + listUpdated = true; + } else { + while (true) { + BluetoothGatt.CsScanData csScanData = MainActivity.csLibrary4A.getNewDeviceScanned(); + if (csScanData != null) { + BluetoothGatt.CsScanData scanResultA = csScanData; + if (getActivity() == null) continue; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if (ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + continue; + } + } else if (ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), BLUETOOTH) != PackageManager.PERMISSION_GRANTED) { + continue; + } + if (DEBUG) + MainActivity.csLibrary4A.appendToLog("runnableStart: scanResultA.device.getType() = " + scanResultA.device.getType() + ". scanResultA.rssi = " + scanResultA.rssi); + if (/*scanResultA.device.getType() == BluetoothDevice.DEVICE_TYPE_LE &&*/ (true || scanResultA.rssi < 0)) { + boolean match = false; + for (int i = 0; i < readersList.size(); i++) { + if (readersList.get(i).getAddress().matches(scanResultA.device.getAddress())) { + ReaderDevice readerDevice1 = readersList.get(i); + int count = readerDevice1.getCount(); + count++; + readerDevice1.setCount(count); + readerDevice1.setRssi(scanResultA.rssi); + readersList.set(i, readerDevice1); + listUpdated = true; + match = true; + break; + } + } + if (match == false) { + ReaderDevice readerDevice = new ReaderDevice(scanResultA.device.getName(), scanResultA.device.getAddress(), false, "", 1, scanResultA.rssi, scanResultA.serviceUUID2p2); + String strInfo = ""; + if (scanResultA.device.getBondState() == 12) { + strInfo += "BOND_BONDED\n"; + } + //readerDevice.setDetails(strInfo + "scanRecord=" + mCsLibrary4A.byteArrayToString(scanResultA.scanRecord)); + readersList.add(readerDevice); + listUpdated = true; + } + } else { + if (DEBUG) + MainActivity.csLibrary4A.appendToLog("runnableStart: deviceScanTask: rssi=" + scanResultA.rssi + ", error type=" + scanResultA.device.getType()); + } + //scanWait = 0; + } else { + MainActivity.csLibrary4A.appendToLog("runnableStart: NO reader is found with scanWait = " + scanWait); + break; + } + } + if (listUpdated) readerListAdapter.notifyDataSetChanged(); + } + } else { + MainActivity.csLibrary4A.appendToLog("bbb 4"); + if (bWedgeConnected) { + bWedgeConnected = false; + MainActivity.csLibrary4A.appendToLog("bbb 4A"); + readersList.clear(); readerListAdapter.notifyDataSetChanged(); + buttonConnect.setText("Connect"); + } + MainActivity.csLibrary4A.appendToLog("runnableStart: isBleScanning is FALSE"); + boolean bScanPermitted = true; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { //that is android 12 or above + if (ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED + || ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { + bScanPermitted = false; + //MainActivity.csLibrary4A.appendToLog("runnableStartService: requestPermissions BLUETOOTH_SCAN and BLUETOOTH_CONNECT"); + //requestPermissions(new String[] { BLUETOOTH_SCAN, BLUETOOTH_CONNECT }, 123); + MainActivity.csLibrary4A.appendToLog("runnableStart: CANNOT start scanLeDevice as BLUETOOTH_CONNECT && BLUETOOTH_SCAN is NOT yet permitted"); + } else { + MainActivity.csLibrary4A.appendToLog("runnableStartService: BLUETOOTH_CONNECT and BLUETOOTH_SCAN and (ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION) is permitted"); + } + } else { + MainActivity.csLibrary4A.appendToLog("runnableStartService: no need to handle BLUETOOTH_SCAN and BLUETOOTH_CONNECT"); + if (ActivityCompat.checkSelfPermission(mContext, BLUETOOTH) != PackageManager.PERMISSION_GRANTED) { + bScanPermitted = false; + MainActivity.csLibrary4A.appendToLog("runnableStart: CANNOT start scanLeDevice as BLUETOOTH is NOT yet permitted"); + } else { + MainActivity.csLibrary4A.appendToLog("runnableStartService: BLUETOOTH_CONNECT and BLUETOOTH_SCAN and (ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION) is permitted"); + } + } + if ((ActivityCompat.checkSelfPermission(mContext, ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED + || ActivityCompat.checkSelfPermission(mContext, ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { + bScanPermitted = false; + MainActivity.csLibrary4A.appendToLog("runnableStart: CANNOT start scanLeDevice as ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION is NOT yet permitted"); + } + bWedgeConnecting = false; connectWait = 0; scanWait = 0; + boolean bValue1 = false; + if (bScanPermitted) bValue1 = MainActivity.csLibrary4A.scanLeDevice(true); + MainActivity.csLibrary4A.appendToLog("runnableStart: starting scanLeDevice is " + bValue1 + " with isScanning = " + MainActivity.csLibrary4A.isBleScanning()); + } + handler.postDelayed(runnableStart, 1000); + } + }; + CustomAlertDialog appdialog; + void popupAlert() { + MainActivity.csLibrary4A.appendToLog("DirectWedgeFragment: entering popupAlert"); + if (appdialog != null && appdialog.isShowing()) { + MainActivity.csLibrary4A.appendToLog("DirectWedgeFragment: skip popupAlert"); + return; + } + appdialog = new CustomAlertDialog(); + appdialog.Confirm(getActivity(), "Enable <" + stringLabelExpected + ">", + "<" + stringLabelExpected + "> is not enabled. Click OK to open Languages & Input Settings. You will need to select <" + stringLabelExpected + "> in your current keyboard to use it", + "No thanks", "OK", + new Runnable() { + @Override + public void run() { + MainActivity.csLibrary4A.appendToLog("Ok Procedure"); + Intent enableIntent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS); + enableIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + getActivity().startActivity(enableIntent); + } + }, + new Runnable() { + @Override + public void run() { + MainActivity.csLibrary4A.appendToLog("Cancel procedure"); + getActivity().finish(); + //System.exit(0); + } + }); + MainActivity.csLibrary4A.appendToLog("DirectWedgeFragment: EXIT popupAlert"); + } + + void updateCurrentIMEMatched() { + if (true) { + boolean bFound = false; + List list = null; + stringImeExpected = getActivity().getPackageName() + ".CustomIME"; + if (MainActivity.drawerPositionsDefault != DrawerListContent.DrawerPositions.MAIN) stringLabelExpected = getResources().getString(R.string.app_ime_simplewedge1); + else if (getActivity().getPackageName().contains("cs710ademoapp")) stringLabelExpected = getResources().getString(R.string.app_ime_cs710); + else stringLabelExpected = getResources().getString(R.string.app_ime_cs108); + InputMethodManager inputMethodManager = inputMethodManager = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE); + + MainActivity.csLibrary4A.appendToLog("FEATURE_INPUT_METHODS is " + getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_INPUT_METHODS)); + list = inputMethodManager.getEnabledInputMethodList(); bFound = false; + MainActivity.csLibrary4A.appendToLog("getCurrentInputMethodSubtype = " + inputMethodManager.getCurrentInputMethodSubtype().getLanguageTag()); + for (int i = 0; i < list.size(); i++) { + MainActivity.csLibrary4A.appendToLog("enabled " + i + ": " + list.get(i).getServiceName() + + ", " + list.get(i).getPackageName() + + ", " + list.get(i).loadLabel(getActivity().getPackageManager()).toString() + + ", " + list.get(i).getIsDefaultResourceId()); + if (list.get(i).getServiceName().contains(stringImeExpected) && list.get(i).loadLabel(getActivity().getPackageManager()).toString().contains(stringLabelExpected)) { + bFound = true; + MainActivity.csLibrary4A.appendToLog("Found expected IME"); + } + } + + if (bFound == false) { + MainActivity.csLibrary4A.appendToLog("DirectWedgeFragment: No " + stringImeExpected + " is found"); + if (false) inputMethodManager.showInputMethodPicker(); + else popupAlert(); + } else if (true) { + list = inputMethodManager.getInputMethodList(); bFound = false; + for (int i = 0; i < list.size(); i++) { + MainActivity.csLibrary4A.appendToLog(i + ": " + list.get(i).getServiceName() + + ", " + list.get(i).getPackageName() + + ", " + list.get(i).loadLabel(getActivity().getPackageManager()).toString() + + ", " + list.get(i).getIsDefaultResourceId()); + + List submethods = inputMethodManager.getEnabledInputMethodSubtypeList(list.get(i), true); + for (InputMethodSubtype submethod : submethods) { + if (submethod.getMode().equals("keyboard")) { + String currentLocale = submethod.getLocale(); + MainActivity.csLibrary4A.appendToLog("Available input method locale: " + currentLocale); + } + } + + if (list.get(i).getServiceName().contains(stringImeExpected) && list.get(i).loadLabel(getActivity().getPackageManager()).toString().contains(stringLabelExpected)) { + bFound = true; + MainActivity.csLibrary4A.appendToLog("Found expected IME with id = " + list.get(i).getId()); + String idCurrent = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); + MainActivity.csLibrary4A.appendToLog("Found current IME with id = " + idCurrent); + if (list.get(i).getId().matches(idCurrent)) { + MainActivity.csLibrary4A.appendToLog("expected IME matches current IME"); + bCurrentIMEmatched = true; + } else { + MainActivity.csLibrary4A.appendToLog("expected IME does NOT match current IME"); + bCurrentIMEmatched = false; + } +/* + CustomIME customIME = new CustomIME(); + InputMethodService inputMethodService = getActivity().get + customIME.switchInputMethod(list.get(i).getId()); +*/ + //String oldDefaultKeyboard = Settings.Secure.getString(resolver, Setting.Secure.DEFAULT_INPUT_METHOD); + //MainActivity.csLibrary4A.appendToLog("oldDefaultKeyboard = " + oldDefaultKeyboard); + /*inputMethodManager.toggleSoftInputFromWindow( + linearLayout.getApplicationWindowToken(), + InputMethodManager.SHOW_FORCED, 0);*/ + + IBinder iBinder = getView().getWindowToken(); + MainActivity.csLibrary4A.appendToLog("iBinder is " + (iBinder == null ? "null" : "valid")); + if (iBinder != null) inputMethodManager.setInputMethod(iBinder, list.get(i).getId()); + } + } + } + } + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_FDMICRO; + +import android.os.Bundle; + +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import com.csl.cs710ademoapp.R; + +public class FdmicroFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Scan", "Configuration"}; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment = (InventoryRfidiMultiFragment) adapter.fragment0; + if (item.getItemId() == R.id.menuAction_clear) { + fragment.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_fdMicro); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, InventoryRfidiMultiFragment.newInstance(true, TAG_FDMICRO, "E2827001")); + adapter.setFragment(1, new AccessFdmicroFragment()); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public FdmicroFragment() { + super("FdmicroFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; + +import com.csl.cs710ademoapp.BuildConfig; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public class ForegroundFragment extends CommonFragment { + Handler mHandler = new Handler(); + long timeMillis = 0; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_about, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_about); + actionBar.setTitle(R.string.title_activity_about); + + TextView appVersionView = (TextView) getActivity().findViewById(R.id.appVersion); + appVersionView.setText(BuildConfig.VERSION_NAME); + TextView libVersionView = (TextView) getActivity().findViewById(R.id.libVersion); + libVersionView.setText(MainActivity.csLibrary4A.getlibraryVersion()); + + MainActivity.mSensorConnector.mLocationDevice.turnOn(true); + MainActivity.mSensorConnector.mSensorDevice.turnOn(true); + mHandler.post(updateRunnable); + } + + @Override + public void onDestroy() { + MainActivity.mSensorConnector.mLocationDevice.turnOn(false); + MainActivity.mSensorConnector.mSensorDevice.turnOn(false); + mHandler.removeCallbacks(updateRunnable); + super.onDestroy(); + } + + public ForegroundFragment() { + super("AboutFragment"); + } + + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + TextView timeStampView = (TextView) getActivity().findViewById(R.id.timeStamp); + TextView locationView = (TextView) getActivity().findViewById(R.id.GeoLocation); + TextView eCompassView = (TextView) getActivity().findViewById(R.id.eCompass); + + TextView radioVersion = (TextView) getActivity().findViewById(R.id.radioVersion); + TextView modelVersion = (TextView) getActivity().findViewById(R.id.modelVersion); + TextView moduleRfidOnStatus = (TextView) getActivity().findViewById(R.id.moduleRfid_onStatus); + TextView moduleBarOnStatus = (TextView) getActivity().findViewById(R.id.moduleBar_onStatus); + TextView triggerOnStatus = (TextView) getActivity().findViewById(R.id.trigger_onStatus); + TextView moduleBattery = (TextView) getActivity().findViewById(R.id.module_battery); + TextView moduleVersionLabel = (TextView) getActivity().findViewById(R.id.module_versionLabel); + if (MainActivity.csLibrary4A.get98XX() == 2) moduleVersionLabel.setText("Atmel firmware version"); + else if (MainActivity.csLibrary4A.get98XX() == 0) moduleVersionLabel.setText("SiliconLab firmware version"); + TextView moduleVersion = (TextView) getActivity().findViewById(R.id.module_version); + TextView radioSerial = (TextView) getActivity().findViewById(R.id.radio_serialnumber); + TextView radioBoardVersion = (TextView) getActivity().findViewById(R.id.radio_boardVersion); + TextView productSerial = (TextView) getActivity().findViewById(R.id.module_productserialnumber); + TextView boardVersion = (TextView) getActivity().findViewById(R.id.module_boardversion); + TextView barcodeSerial = (TextView) getActivity().findViewById(R.id.moduleBar_serialNumber); + TextView barcodeDate = (TextView) getActivity().findViewById(R.id.moduleBar_date); + TextView barcodeVersion = (TextView) getActivity().findViewById(R.id.moduleBar_version); + + TextView bluetoothVersion = (TextView) getActivity().findViewById(R.id.bluetooth_version); + TextView bluetoothAddress = (TextView) getActivity().findViewById(R.id.bluetooth_address); + TextView bluetoothRssi = (TextView) getActivity().findViewById(R.id.bluetooth_rssi); + + timeStampView.setText(MainActivity.mSensorConnector.getTimeStamp()); + locationView.setText(MainActivity.mSensorConnector.mLocationDevice.getLocation()); + eCompassView.setText(MainActivity.mSensorConnector.mSensorDevice.getEcompass()); + if (MainActivity.csLibrary4A.isBleConnected()) { + if (System.currentTimeMillis() - timeMillis > 5000) { + timeMillis = System.currentTimeMillis(); + radioVersion.setText(MainActivity.csLibrary4A.getMacVer()); + modelVersion.setText(MainActivity.csLibrary4A.getModelNumber()); + moduleVersion.setText(MainActivity.csLibrary4A.hostProcessorICGetFirmwareVersion()); + bluetoothVersion.setText(MainActivity.csLibrary4A.getBluetoothICFirmwareVersion()); + MainActivity.csLibrary4A.batteryLevelRequest(); + } + moduleRfidOnStatus.setText(MainActivity.csLibrary4A.getRfidOnStatus() ? "on" : "off"); + triggerOnStatus.setText(MainActivity.csLibrary4A.getTriggerButtonStatus() ? "pressed" : "released"); + moduleBarOnStatus.setText(MainActivity.csLibrary4A.getBarcodeOnStatus() ? "on" : "off"); + moduleBattery.setText(MainActivity.csLibrary4A.getBatteryDisplay(true)); + if (MainActivity.csLibrary4A.isRfidFailure()) radioSerial.setText("Not available"); + else radioSerial.setText(MainActivity.csLibrary4A.getRadioSerial()); + radioBoardVersion.setText(MainActivity.csLibrary4A.getRadioBoardVersion()); + productSerial.setText(MainActivity.csLibrary4A.getHostProcessorICSerialNumber()); + boardVersion.setText(MainActivity.csLibrary4A.getHostProcessorICBoardVersion()); + if (MainActivity.csLibrary4A.isBarcodeFailure()) barcodeSerial.setText("Not available"); + else { + barcodeSerial.setText(MainActivity.csLibrary4A.getBarcodeSerial()); + barcodeDate.setText(MainActivity.csLibrary4A.getBarcodeDate()); + barcodeVersion.setText(MainActivity.csLibrary4A.getBarcodeVersion()); + } + bluetoothAddress.setText(MainActivity.csLibrary4A.getBluetoothDeviceAddress()); + bluetoothRssi.setText(String.valueOf(MainActivity.csLibrary4A.getRssi())); + } else { + radioVersion.setText(""); + moduleRfidOnStatus.setText(""); + moduleBarOnStatus.setText(""); + triggerOnStatus.setText(""); + moduleBattery.setText(""); + moduleVersion.setText(""); + bluetoothVersion.setText(""); + radioSerial.setText(""); + radioBoardVersion.setText(""); + productSerial.setText(""); + boardVersion.setText(""); + barcodeSerial.setText(""); + bluetoothAddress.setText(""); + bluetoothRssi.setText(""); + } + mHandler.postDelayed(updateRunnable, 1000); + } + }; +} + + + +package com.csl.cs710ademoapp.fragments; + +import static android.Manifest.permission.ACCESS_COARSE_LOCATION; +import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.Manifest.permission.BLUETOOTH_CONNECT; +import static android.Manifest.permission.BLUETOOTH_SCAN; +import static android.Manifest.permission.POST_NOTIFICATIONS; +import static android.Manifest.permission.READ_EXTERNAL_STORAGE; +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; +import static android.content.Context.LOCATION_SERVICE; +import static androidx.core.app.ServiceCompat.STOP_FOREGROUND_REMOVE; +import static androidx.core.app.ServiceCompat.stopForeground; +import static androidx.core.content.ContextCompat.getSystemService; +import static com.csl.cs710ademoapp.MainActivity.isHomeFragment; +import static com.csl.cs710ademoapp.MainActivity.mContext; + +import android.app.ActivityManager; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.location.LocationManager; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.LinearLayout; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.app.NotificationManagerCompat; +import androidx.core.content.ContextCompat; + +import com.csl.cs710ademoapp.CustomAlertDialog; +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.CustomProgressDialog; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.MyForegroundService; +import com.csl.cs710ademoapp.R; + +public class HomeFragment extends CommonFragment { + final boolean DEBUG = false; + + @Override + public void onAttach(Context context) { + Log.i("Hello", "HomeFragment.onAttach"); + super.onAttach(context); + } + @Override + public void onStart() { + Log.i("Hello", "HomeFragment.onStart"); + isHomeFragment = true; + MainActivity.csLibrary4A.appendToLog("isHomeFragment1 = " + isHomeFragment); + super.onStart(); + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + if (getActivity().getPackageName().contains("com.csl.cs710ademoapp")) return inflater.inflate(R.layout.home_layout710, container, false); + else return inflater.inflate(R.layout.home_layout108, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (true && ((AppCompatActivity) getActivity()).getSupportActionBar() != null) { + ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(android.R.drawable.ic_menu_save); + if (getActivity().getPackageName().contains("cs710ademoapp")) actionBar.setTitle(R.string.title_activity_home_cs710); + else actionBar.setTitle(R.string.title_activity_home_cs108); + } + if (true) { + String strForegroundReader = MainActivity.csLibrary4A.getForegroundReader(); + MainActivity.csLibrary4A.appendToLog("strForegroundReader = " + strForegroundReader + ", getForegroundServiceEnable = " + MainActivity.csLibrary4A.getForegroundServiceEnable()); + if (!getActivity().getPackageName().contains("com.csl.cs710awedgeapp") && strForegroundReader != null && strForegroundReader.length() != 0) { + MainActivity.csLibrary4A.appendToLog("strForegroundReader = " + strForegroundReader + ", getForegroundServiceEnable = " + MainActivity.csLibrary4A.getForegroundServiceEnable()); + LinearLayout linearLayout1, linearLayout2, linearLayout3, linearLayout4, linearLayout5; + linearLayout1 = (LinearLayout) getActivity().findViewById(R.id.mainRow1); + linearLayout2 = (LinearLayout) getActivity().findViewById(R.id.mainRow2); + linearLayout3 = (LinearLayout) getActivity().findViewById(R.id.mainRow3); + linearLayout4 = (LinearLayout) getActivity().findViewById(R.id.mainRow4); + linearLayout5 = (LinearLayout) getActivity().findViewById(R.id.mainRow5); + if (getActivity().getPackageName().contains("com.csl.cs710ademoapp")) { + FrameLayout frameLayout = (FrameLayout) getActivity().findViewById(R.id.mainButton1); + frameLayout.setVisibility(View.INVISIBLE); + } else { + Button button = (Button) getActivity().findViewById(R.id.mainButton1); + button.setVisibility(View.INVISIBLE); + } + linearLayout1.setVisibility(View.INVISIBLE); + linearLayout2.setVisibility(View.GONE); + linearLayout3.setVisibility(View.VISIBLE); + linearLayout4.setVisibility(View.INVISIBLE); + //linearLayout5.setVisibility(View.INVISIBLE); + + } + } + MainActivity.tagType = null; MainActivity.mDid = null; + if (true || MainActivity.sharedObjects.versionWarningShown == false) + mHandler.post(runnableConfiguring); + mHandler.postDelayed(runnableStartService, 1000); + } + + @Override + public void onStop() { + stopProgressDialog(); + mHandler.removeCallbacks(runnableConfiguring); + super.onStop(); + } + + @Override + public void onDestroyView() { + isHomeFragment = false; + //MainActivity.csLibrary4A.appendToLog("isHomeFragment1 = " + isHomeFragment); + super.onDestroyView(); + } + + public HomeFragment() { + super("HomeFragment"); + } + + CustomProgressDialog progressDialog; + void stopProgressDialog() { + if (progressDialog != null) { if (progressDialog.isShowing()) progressDialog.dismiss(); } + } + Runnable runnableConfiguring = new Runnable() { + boolean DEBUG = false; + @Override + public void run() { + if (true) { + MainActivity.csLibrary4A.appendToLog("runnableConfiguring(): isBleConnected = " + MainActivity.csLibrary4A.isBleConnected() + ", isRfidFailure = " + MainActivity.csLibrary4A.isRfidFailure()); + MainActivity.csLibrary4A.appendToLog("runnableConfiguring(): mrfidToWriteSize = " + MainActivity.csLibrary4A.mrfidToWriteSize()); + } + boolean progressShown = false; + if (progressDialog != null) { if (progressDialog.isShowing()) progressShown = true; } + if (MainActivity.csLibrary4A.isBleConnected() == false || MainActivity.csLibrary4A.isRfidFailure()) { + if (progressShown) { + stopProgressDialog(); + /*String stringPopup = "Connection failed, please rescan."; + CustomPopupWindow customPopupWindow = new CustomPopupWindow((Context) getActivity()); + customPopupWindow.popupStart(stringPopup, false); */ + } + } else if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("mrfidToWriteSize = " + MainActivity.csLibrary4A.mrfidToWriteSize()); + mHandler.postDelayed(runnableConfiguring, 250); + if (progressShown == false) { + progressDialog = new CustomProgressDialog(getActivity(), "Initializing reader. Please wait."); + progressDialog.show(); + } + } else { + stopProgressDialog(); + if (MainActivity.sharedObjects.versionWarningShown == false) { + String stringPopup = MainActivity.csLibrary4A.checkVersion(); + if (stringPopup != null && stringPopup.length() != 0) { + if (stringPopup.indexOf("Unknown") != 0) stringPopup = "Firmware too old\nPlease upgrade firmware to at least:" + stringPopup; + CustomPopupWindow customPopupWindow = new CustomPopupWindow((Context)getActivity()); + customPopupWindow.popupStart(stringPopup, false); + } + MainActivity.sharedObjects.versionWarningShown = true; + } + } + MainActivity.csLibrary4A.setPwrManagementMode(true); + } + }; + + Runnable runnableStartService = new Runnable() { + boolean DEBUG = false; + + @Override + public void run() { + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, WRITE_EXTERNAL_STORAGE) = " + ActivityCompat.checkSelfPermission(mContext, WRITE_EXTERNAL_STORAGE)); + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, READ_EXTERNAL_STORAGE) = " + ActivityCompat.checkSelfPermission(mContext, READ_EXTERNAL_STORAGE)); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (mContext.checkSelfPermission(WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + MainActivity.csLibrary4A.appendToLog("runnableStartService: requestPermissions WRITE_EXTERNAL_STORAGE"); // + requestPermissions(new String[] { WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE }, 1); + //Toast.makeText(mContext, com.csl.cslibrary4a.R.string.toast_permission_not_granted, Toast.LENGTH_SHORT).show(); + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: WRITE_EXTERNAL_STORAGE is permitted"); /// + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: no need to handle WRITE_EXTERNAL_STORAGE"); + + LocationManager locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); + MainActivity.csLibrary4A.appendToLog("runnableStartService: locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) = " + locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)); + MainActivity.csLibrary4A.appendToLog("runnableStartService: locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) = " + locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)); + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, ACCESS_FINE_LOCATION) = " + ActivityCompat.checkSelfPermission(mContext, ACCESS_FINE_LOCATION)); + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, ACCESS_COARSE_LOCATION) = " + ActivityCompat.checkSelfPermission(mContext, ACCESS_COARSE_LOCATION)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if ((ActivityCompat.checkSelfPermission(mContext, ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(mContext, ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { + CustomAlertDialog appdialog = new CustomAlertDialog(); + appdialog.Confirm(getActivity(), "Use your location", + "This app collects location data in the background. In terms of the features using this location data in the background, this App collects location data when it is reading RFID tag in all inventory pages. The purpose of this is to correlate the RFID tag with the actual GNSS(GPS) location of the tag. In other words, this is to track the physical location of the logistics item tagged with the RFID tag.", + "No thanks", "Turn on", + new Runnable() { + @Override + public void run() { + MainActivity.csLibrary4A.appendToLog("runnableStartService: allow permission in ACCESS_FINE_LOCATION handler"); + MainActivity.csLibrary4A.appendToLog("runnableStartService: requestPermissions ACCESS_FINE_LOCATION"); + requestPermissions(new String[] { ACCESS_FINE_LOCATION }, 123); //ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION + //if (false) Toast.makeText(mContext, com.csl.cslibrary4a.R.string.toast_permission_not_granted, Toast.LENGTH_SHORT).show(); + /*{ + LocationManager locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); + if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) == false && locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) == false) { + MainActivity.csLibrary4A.appendToLog("popupAlert: StreamOut: start activity ACTION_LOCATION_SOURCE_SETTINGS"); + Intent intent1 = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + mContext.startActivity(intent1); + } + }*/ + //bleEnableRequestShown0 = true; mHandler.postDelayed(mRquestAllowRunnable, 60000); + //bAlerting = false; + } + }, + new Runnable() { + @Override + public void run() { + MainActivity.csLibrary4A.appendToLog("runnableStartService: reject permission in ACCESS_FINE_LOCATION handler"); + //bAlerting = false; + //bleEnableRequestShown0 = true; mHandler.postDelayed(mRquestAllowRunnable, 60000); + } + }); + MainActivity.csLibrary4A.appendToLog("runnableStartService: started ACCESS_FINE_LOCATION handler"); + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: handled ACCESS_FINE_LOCATION"); + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: no need to handle ACCESS_FINE_LOCATION"); + + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, BLUETOOTH_CONNECT) = " + ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_CONNECT)); + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, BLUETOOTH_SCAN) = " + ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_SCAN)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if (ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { + MainActivity.csLibrary4A.appendToLog("runnableStartService: requestPermissions BLUETOOTH_SCAN and BLUETOOTH_CONNECT"); + requestPermissions(new String[] { BLUETOOTH_SCAN, BLUETOOTH_CONNECT }, 123); + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: handled BLUETOOTH_CONNECT and BLUETOOTH_SCAN"); + } else MainActivity.csLibrary4A.appendToLog("runnableStartService: no need to handle BLUETOOTH_SCAN and BLUETOOTH_CONNECT"); + + MainActivity.csLibrary4A.appendToLog("runnableStartService: ActivityCompat.checkSelfPermission(activity, POST_NOTIFICATIONS) = " + ActivityCompat.checkSelfPermission(mContext, POST_NOTIFICATIONS)); + if (NotificationManagerCompat.from(getActivity()).areNotificationsEnabled()) MainActivity.csLibrary4A.appendToLog("Notification is enabled"); + else MainActivity.csLibrary4A.appendToLog("Notification is disabled"); + if (!MainActivity.foregroundServiceEnable) { } + else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ActivityCompat.checkSelfPermission(mContext, POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + MainActivity.csLibrary4A.appendToLog("runnableStartService: requestPermissions POST_NOTIFICATIONS"); + requestPermissions(new String[] { POST_NOTIFICATIONS }, 10); //POST_NOTIFICATIONS, FOREGROUND_SERVICE_LOCATION + } else { + MainActivity.csLibrary4A.appendToLog("runnableStartService: handled POST_NOTIFICATIONS"); + startService(); + } + } else { + MainActivity.csLibrary4A.appendToLog("runnableStartService: no need to handle POST_NOTIFICATIONS"); + startService(); + } + } + }; + Intent serviceIntent; + Service serviceStarted; + public void startService() { + ActivityManager activityManager = (ActivityManager) getSystemService(getContext(), ActivityManager.class); + for (ActivityManager.RunningServiceInfo service: activityManager.getRunningServices(Integer.MAX_VALUE)) { + MainActivity.csLibrary4A.appendToLog("MyForegroundService.class.getName = " + MyForegroundService.class.getName() + ", service.service.getClassName = " + service.service.getClassName()); + if (MyForegroundService.class.getName().equals(service.service.getClassName())) { + return; + } + } + serviceIntent = new Intent(getActivity(), MyForegroundService.class); + Log.i("Hello", "getActivity is " + (getActivity() == null ? "NULL" : "Valid")); + serviceIntent.putExtra("inputExtra", "Foreground Service Example in Android"); + Log.i("Hello", "getContext is " + (getContext() == null ? "NULL" : "Valid")); + ContextCompat.startForegroundService(getContext(), serviceIntent); + } + public void stopService1() { + //Intent serviceIntent = new Intent(getActivity(), CustomForegroundService.class); + stopForeground(serviceStarted, STOP_FOREGROUND_REMOVE); + } + + void popupAlert() { + + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public class HomeSpecialFragment extends CommonFragment { + final boolean DEBUG = false; + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.home_special_layout, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (((AppCompatActivity) getActivity()).getSupportActionBar() != null) { + ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setTitle(R.string.title_activity_special); + } + + Button buttonAuraSense = (Button) getActivity().findViewById(R.id.SpecialButtonAurasense); + Button buttonFdmicro = (Button) getActivity().findViewById(R.id.SpecialButtonFdmicro); + Button buttonLanda = (Button) getActivity().findViewById(R.id.SpecialButtonLanda); + if (MainActivity.csLibrary4A.get98XX() == 2) { + buttonAuraSense.setVisibility(View.GONE); + buttonFdmicro.setVisibility(View.GONE); buttonLanda.setVisibility(View.GONE); + } + MainActivity.tagType = null; MainActivity.mDid = null; + if (MainActivity.csLibrary4A.isBleConnected()) MainActivity.csLibrary4A.restoreAfterTagSelect(); + } + + public HomeSpecialFragment() { + super("HomeSpecialFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class HomeWFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Normal", "Simple"}; + int iTargetOld, iSessionOld; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment1 = (InventoryRfidiMultiFragment) adapter.fragment1; + if (item.getItemId() == R.id.menuAction_clear) { + fragment1.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment1.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment1.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment1.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment1.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_home_cs108); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + MainActivity.csLibrary4A.appendToLog("adaptoer is " + (adapter == null ? "null" : "valid")); + if (adapter != null) { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + } + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, new HomeFragment()); + adapter.setFragment(1, new DirectWedgeFragment()); + + MainActivity.csLibrary4A.appendToLog("viewPager is " + (viewPager == null ? "null" : "valid")); + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(null); viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + MainActivity.csLibrary4A.appendToLog("adding tab_name = " + tab_name); + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public HomeWFragment() { + super("HomeWFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class ImpinjFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Configure", "Scan", "Authenticate"}; + int iTargetOld, iSessionOld; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment = (InventoryRfidiMultiFragment) adapter.getItem(1); + if (item.getItemId() == R.id.menuAction_clear) { + fragment.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_impinj); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, new AccessImpinjFragment(false)); + adapter.setFragment(1, InventoryRfidiMultiFragment.newInstance(true, null, "")); + adapter.setFragment(2, new AccessUcodeFragment()); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + + iTargetOld = MainActivity.csLibrary4A.getQueryTarget(); + iSessionOld = MainActivity.csLibrary4A.getQuerySession(); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + MainActivity.csLibrary4A.setTagGroup(MainActivity.csLibrary4A.getQuerySelect(), iSessionOld, iTargetOld); + //MainActivity.mCs108Library4a.macWrite(0x203, 0); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public ImpinjFragment() { + super("ImpinjFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_IMPINJ_M755; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class ImpinjM775Fragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Configuration", "Scan"}; + int iTargetOld, iSessionOld; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment = (InventoryRfidiMultiFragment) adapter.getItem(1); + return fragment.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_m775); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, new AccessImpinjFragment(true)); + adapter.setFragment(1, InventoryRfidiMultiFragment.newInstance(true, TAG_IMPINJ_M755, "E2C011")); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + + iTargetOld = MainActivity.csLibrary4A.getQueryTarget(); + iSessionOld = MainActivity.csLibrary4A.getQuerySession(); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + MainActivity.csLibrary4A.setTagGroup(MainActivity.csLibrary4A.getQuerySelect(), iSessionOld, iTargetOld); + //MainActivity.library4a.macWrite(0x203, 0); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public ImpinjM775Fragment() { + super("ImpinjM775Fragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.content.Intent; +import android.media.MediaPlayer; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.InventoryBarcodeTask; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SaveList2ExternalTask; +import com.csl.cs710ademoapp.adapters.ReaderListAdapter; +import com.csl.cslibrary4a.NotificationConnector; +import com.csl.cslibrary4a.ReaderDevice; + +import java.util.Collections; + +public class InventoryBarcodeFragment extends CommonFragment { + private ListView barcodeListView; + private TextView barcodeEmptyView; + private TextView barcodeRunTime, barcodeVoltageLevel; + private TextView barcodeYieldView, barcodeTotal; + private Button button; + + MediaPlayer playerO, playerN; + + private ReaderListAdapter readerListAdapter; + + InventoryBarcodeTask inventoryBarcodeTask; + + void clearTagsList() { + barcodeYieldView.setText(""); barcodeTotal.setText(""); + MainActivity.sharedObjects.barsList.clear(); + readerListAdapter.notifyDataSetChanged(); + } + void sortTagsList() { + Collections.sort(MainActivity.sharedObjects.barsList); + readerListAdapter.notifyDataSetChanged(); + } + void saveTagsList() { + SaveList2ExternalTask saveExternalTask = new SaveList2ExternalTask(MainActivity.sharedObjects.barsList); + saveExternalTask.execute(); + } + void shareTagsList() { + SaveList2ExternalTask saveExternalTask = new SaveList2ExternalTask(MainActivity.sharedObjects.barsList); + String stringOutput = saveExternalTask.createStrEpcList(); + + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, stringOutput); + sendIntent.setType("text/plain"); + startActivity(Intent.createChooser(sendIntent, "Sharing to")); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_inventory_barcode, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.menuAction_clear) { + clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + //sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + barcodeListView = (ListView) getActivity().findViewById(R.id.inventoryBarcodeList); + barcodeEmptyView = (TextView) getActivity().findViewById(R.id.inventoryBarcodeEmpty); + barcodeListView.setEmptyView(barcodeEmptyView); + readerListAdapter = new ReaderListAdapter(getActivity(), R.layout.readers_list_item, MainActivity.sharedObjects.barsList, true, false); + barcodeListView.setAdapter(readerListAdapter); + barcodeListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + barcodeListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + ReaderDevice readerDevice = readerListAdapter.getItem(position); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Position = " + position); + if (readerDevice.getSelected()) { + readerDevice.setSelected(false); + } else { + readerDevice.setSelected(true); + } + MainActivity.sharedObjects.barsList.set(position, readerDevice); + if (readerDevice.getSelected()) MainActivity.tagSelected = readerDevice; + else MainActivity.tagSelected = null; + for (int i = 0; i < MainActivity.sharedObjects.barsList.size(); i++) { + if (i != position) { + ReaderDevice readerDevice1 = MainActivity.sharedObjects.barsList.get(i); + if (readerDevice1.getSelected()) { + readerDevice1.setSelected(false); + MainActivity.sharedObjects.barsList.set(i, readerDevice1); + } + } + } + readerListAdapter.notifyDataSetChanged(); + } + }); + + barcodeRunTime = (TextView) getActivity().findViewById(R.id.inventoryBarcodeRunTime); + barcodeVoltageLevel = (TextView) getActivity().findViewById(R.id.inventoryBarcodeVoltageLevel); + + barcodeYieldView = (TextView) getActivity().findViewById(R.id.inventoryBarcodeYield); + button = (Button) getActivity().findViewById(R.id.inventoryBarcodeButton); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startStopHandler(false); + } + }); + + barcodeTotal = (TextView) getActivity().findViewById(R.id.inventoryBarcodeTotal); + + MainActivity.csLibrary4A.getBarcodePreSuffix(); + } + + @Override + public void onResume() { + super.onResume(); + if (true) MainActivity.csLibrary4A.appendToLog("InventoryBarcodeFragment().onResume(): userVisibleHint = " + userVisibleHint); + if (userVisibleHint) { + MainActivity.csLibrary4A.setAutoBarStartSTop(true); setNotificationListener(); + } + } + + @Override + public void onPause() { + if (MainActivity.csLibrary4A != null) MainActivity.csLibrary4A.setNotificationListener(null); + if (inventoryBarcodeTask != null) { + if (DEBUG && MainActivity.csLibrary4A != null) MainActivity.csLibrary4A.appendToLog("InventoryBarcodeFragment().onDestory(): VALID inventoryBarcodeTask"); + inventoryBarcodeTask.taskCancelReason = InventoryBarcodeTask.TaskCancelRReason.DESTORY; + } + super.onPause(); + } + + @Override + public void onDestroy() { + if (MainActivity.csLibrary4A != null) { + MainActivity.csLibrary4A.setAutoBarStartSTop(false); + MainActivity.csLibrary4A.setNotificationListener(null); + } + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + MainActivity.csLibrary4A.appendToLog("InventoryBarcodeFragment is now VISIBLE"); + userVisibleHint = true; + MainActivity.csLibrary4A.setAutoBarStartSTop(true); setNotificationListener(); + } else { + MainActivity.csLibrary4A.appendToLog("InventoryBarcodeFragment is now INVISIBLE"); + userVisibleHint = false; + MainActivity.csLibrary4A.setAutoBarStartSTop(false); MainActivity.csLibrary4A.setNotificationListener(null); + } + } + + public InventoryBarcodeFragment() { + super("InventoryBarcodeFragment"); + } + + void setNotificationListener() { + MainActivity.csLibrary4A.setNotificationListener(new NotificationConnector.NotificationListener() { + @Override + public void onChange() { + startStopHandler(true); + } + }); + } + + void startStopHandler(boolean buttonTrigger) { + if (buttonTrigger) MainActivity.csLibrary4A.appendToLog("BARTRIGGER: getTriggerButtonStatus = " + MainActivity.csLibrary4A.getTriggerButtonStatus()); + if (MainActivity.sharedObjects.runningInventoryRfidTask) { + Toast.makeText(MainActivity.mContext, "Running RFID inventory", Toast.LENGTH_SHORT).show(); + return; + } + boolean started = false; + if (inventoryBarcodeTask != null) if (inventoryBarcodeTask.getStatus() == AsyncTask.Status.RUNNING) started = true; + if (buttonTrigger && ((started && MainActivity.csLibrary4A.getTriggerButtonStatus()) || (started == false && MainActivity.csLibrary4A.getTriggerButtonStatus() == false))) { + MainActivity.csLibrary4A.appendToLog("BARTRIGGER: trigger ignore"); + return; + } + if (started == false) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } + if (MainActivity.csLibrary4A.isBarcodeFailure()) { + Toast.makeText(MainActivity.mContext, "Barcode is disabled", Toast.LENGTH_SHORT).show(); + return; + } + MainActivity.csLibrary4A.appendToLog("BARTRIGGER: Start Barcode inventory"); + started = true; + inventoryBarcodeTask = new InventoryBarcodeTask(MainActivity.sharedObjects.barsList, readerListAdapter, null, barcodeRunTime, barcodeVoltageLevel, barcodeYieldView, button, null, barcodeTotal, false); + inventoryBarcodeTask.execute(); + } else { + MainActivity.csLibrary4A.appendToLog("BARTRIGGER: Stop Barcode inventory"); + if (buttonTrigger) inventoryBarcodeTask.taskCancelReason = InventoryBarcodeTask.TaskCancelRReason.BUTTON_RELEASE; + else inventoryBarcodeTask.taskCancelReason = InventoryBarcodeTask.TaskCancelRReason.STOP; + } + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class InventoryFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"RFID", "Barcode"}; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + savedInstanceState = null; + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + MainActivity.csLibrary4A.appendToLog("InventoryFragment: onOptionsItemSelected with viewPager as " + viewPager.getCurrentItem()); + InventoryRfidiMultiFragment fragment0 = (InventoryRfidiMultiFragment) adapter.getItem(0); + InventoryBarcodeFragment fragment1 = (InventoryBarcodeFragment) adapter.getItem(1); + switch (viewPager.getCurrentItem()) { + case 0: + return fragment0.onOptionsItemSelected(item); + case 1: + return fragment1.onOptionsItemSelected(item); + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_inventory); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, InventoryRfidiMultiFragment.newInstance(false, null, null)); + adapter.setFragment(1, new InventoryBarcodeFragment()); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + Log.i("Hello", "InventoryFragment.onActivity"); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public InventoryFragment() { + super("InventoryFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_ASYGN; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_CTESIUS; + +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; + +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.GenericTextWatcher; +import com.csl.cs710ademoapp.InventoryRfidTask; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SaveList2ExternalTask; +import com.csl.cs710ademoapp.adapters.ReaderListAdapter; +import com.csl.cslibrary4a.NotificationConnector; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReader; +import com.csl.cslibrary4a.RfidReaderChipData; + +import java.util.Collections; +import java.util.Comparator; + +public class InventoryRfidiMultiFragment extends CommonFragment { + final private boolean bAdd2End = false; + private boolean bMultiBank = false, bMultiBankInventory = false, bctesiusInventory = false; + private RfidReader.TagType tagType; + private String mDid = null; + int vibrateTimeBackup = 0; + + private CheckBox checkBoxDupElim, checkBoxFilterByTid, checkBoxFilterByEpc, checkBoxFilterByProtect; + private EditText editTextProtectPassword; + private Spinner spinnerBank1, spinnerBank2; + private ListView rfidListView; + private TextView rfidEmptyView; + private TextView rfidRunTime, rfidVoltageLevel; + private TextView rfidYieldView; + private TextView rfidRateView; + private Button button; + + private ReaderListAdapter readerListAdapter; + private InventoryRfidTask inventoryRfidTask; + + void clearTagsList() { + MainActivity.csLibrary4A.appendToLog("InventoryRfidMultiFragment: NOT onOptionsItemSelected: clearTagsList"); + MainActivity.csLibrary4A.appendToLog("runningInventoryRfidTask = " + MainActivity.sharedObjects.runningInventoryRfidTask + ", readerListAdapter" + (readerListAdapter != null ? " tagCount = " + String.valueOf(readerListAdapter.getCount()) : " = NULL")); + if (MainActivity.sharedObjects.runningInventoryRfidTask) return; + rfidYieldView.setText(""); + rfidRateView.setText(""); + MainActivity.tagSelected = null; + MainActivity.sharedObjects.tagsList.clear(); + MainActivity.sharedObjects.tagsIndexList.clear(); + readerListAdapter.notifyDataSetChanged(); + MainActivity.mLogView.setText(""); + } + void sortTagsList() { + if (MainActivity.sharedObjects.runningInventoryRfidTask) return; + Collections.sort(MainActivity.sharedObjects.tagsList); + readerListAdapter.notifyDataSetChanged(); + } + void sortTagsListByRssi() { + if (MainActivity.sharedObjects.runningInventoryRfidTask) return; + Collections.sort(MainActivity.sharedObjects.tagsList, new Comparator() { + @Override + public int compare(ReaderDevice deviceTag, ReaderDevice t1) { + if (deviceTag.getRssi() == t1.getRssi()) return 0; + else if (deviceTag.getRssi() < t1.getRssi()) return 1; + else return -1; + } + }); + readerListAdapter.notifyDataSetChanged(); + } + void saveTagsList() { + if (MainActivity.sharedObjects.runningInventoryRfidTask) return; + SaveList2ExternalTask saveExternalTask = new SaveList2ExternalTask(MainActivity.sharedObjects.tagsList); + saveExternalTask.execute(); + } + void shareTagsList() { + SaveList2ExternalTask saveExternalTask = new SaveList2ExternalTask(MainActivity.sharedObjects.tagsList); + String stringOutput = saveExternalTask.createStrEpcList(); + + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, stringOutput); + sendIntent.setType("text/plain"); + startActivity(Intent.createChooser(sendIntent, "Sharing to")); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, bMultiBankInventory | bctesiusInventory); + return inflater.inflate(R.layout.fragment_inventory_rfid_multi, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + MainActivity.csLibrary4A.appendToLog("InventoryRfidMultiFragment: onOptionsItemSelected"); + if (item.getItemId() == R.id.menuAction_clear) { + clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + bMultiBank = getArguments().getBoolean("bMultiBank"); + mDid = getArguments().getString("mDid"); + try { + int iValue = getArguments().getInt("enumTagType"); + MainActivity.csLibrary4A.appendToLog("onCreate: enumTagType iValue = " + iValue); + tagType = RfidReader.TagType.values()[iValue]; + MainActivity.csLibrary4A.appendToLog("onCreate: enumTagType = " + tagType.toString()); + } catch (Exception e) { } + if (bMultiBank && mDid == null) { + bMultiBankInventory = true; + } else if (bMultiBank && mDid != null) { + if (mDid.matches("E2003") + || mDid.matches("E200B0") + || (tagType == TAG_CTESIUS /*mDid.matches("E203510"*/) + || (tagType == TAG_ASYGN /*mDid.matches("E283A")*/)) { + bctesiusInventory = true; + } + } + } + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + MainActivity.selectFor = -1; + if (bMultiBankInventory | bctesiusInventory) { + ActionBar actionBar; + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + if (bMultiBankInventory) actionBar.setTitle(R.string.title_activity_inventoryRfidMulti); + else if (bctesiusInventory) { + if (mDid.matches("E2003")) actionBar.setTitle("Alien"); + else if (mDid.matches("E200B0")) actionBar.setTitle(R.string.title_activity_bap); + else if (tagType == TAG_CTESIUS /*mDid.matches("E203510")*/) actionBar.setTitle(R.string.title_activity_ctesisu); + else if (tagType == TAG_ASYGN /*mDid.matches("E283A")*/) actionBar.setTitle("AS321x"); + } + } + if (bMultiBankInventory) { + LinearLayout linearLayout = (LinearLayout) getActivity().findViewById(R.id.inventoryMultibankSetting); + linearLayout.setVisibility(View.VISIBLE); + checkBoxDupElim = (CheckBox) getActivity().findViewById(R.id.accessInventoryDupElim); + checkBoxDupElim.setVisibility(View.VISIBLE); + checkBoxDupElim.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (checkBoxDupElim.isChecked()) readerListAdapter.setSelectDupElim(true); + else readerListAdapter.setSelectDupElim(false); + } + }); + } + + checkBoxFilterByTid = (CheckBox) getActivity().findViewById(R.id.accessInventoryFilterByTid); + MainActivity.csLibrary4A.appendToLog("InventoryRfidMultiFragment.onActivityCreated: mDid = " + mDid + ", MainActivity.mDid = " + MainActivity.mDid); + if (mDid != null) { + if (mDid.indexOf("E2827001") == 0) { + checkBoxFilterByTid.setVisibility(View.VISIBLE); + //checkBoxFilterByTid.setText("filter FM13DT160 only"); + } + } else if (bMultiBankInventory == false) { + checkBoxFilterByEpc = (CheckBox) getActivity().findViewById(R.id.accessInventoryFilterByEpc); + checkBoxFilterByEpc.setVisibility(View.VISIBLE); + } + + checkBoxFilterByProtect = (CheckBox) getActivity().findViewById(R.id.accessInventoryFilterByProtect); + editTextProtectPassword = (EditText) getActivity().findViewById(R.id.accessInventoryProtectPassword); + editTextProtectPassword.addTextChangedListener(new GenericTextWatcher(editTextProtectPassword, 8)); + editTextProtectPassword.setText("00000000"); + + ArrayAdapter lockAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.memoryBank_options, R.layout.custom_spinner_layout); + lockAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + spinnerBank1 = (Spinner) getActivity().findViewById(R.id.accessInventoryBank1); + spinnerBank1.setAdapter(lockAdapter); spinnerBank1.setSelection(2); + spinnerBank2 = (Spinner) getActivity().findViewById(R.id.accessInventoryBank2); + spinnerBank2.setAdapter(lockAdapter); spinnerBank2.setSelection(3); + + rfidListView = (ListView) getActivity().findViewById(R.id.inventoryRfidList1); + rfidEmptyView = (TextView) getActivity().findViewById(R.id.inventoryRfidEmpty1); + rfidListView.setEmptyView(rfidEmptyView); + boolean bSelect4detail = true; + if (bMultiBankInventory) bSelect4detail = false; + boolean needDupElim = true; + + boolean need4Extra1 = MainActivity.csLibrary4A.getPortNumber() > 1 ? true : false; + boolean need4Extra2 = (mDid != null ? true : false); + + readerListAdapter = new ReaderListAdapter(getActivity(), R.layout.readers_list_item, MainActivity.sharedObjects.tagsList, bSelect4detail, true, needDupElim, need4Extra1, need4Extra2); + rfidListView.setAdapter(readerListAdapter); + rfidListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + rfidListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + ReaderDevice readerDevice = readerListAdapter.getItem(position); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Position = " + position); + if (readerDevice.getSelected()) { + readerDevice.setSelected(false); + } else { + readerDevice.setSelected(true); + String strPopup = readerDevice.getUpcSerial(); + MainActivity.csLibrary4A.appendToLog("strPopup = " + (strPopup == null ? "null" : strPopup)); + if (strPopup != null && strPopup.trim().length() != 0) { + strPopup = MainActivity.csLibrary4A.getUpcSerialDetail(strPopup); + CustomPopupWindow epcSerialPopupWindow = new CustomPopupWindow(MainActivity.mContext); + epcSerialPopupWindow.popupStart(strPopup, false); + } + } + MainActivity.sharedObjects.tagsList.set(position, readerDevice); + if (readerDevice.getSelected()) MainActivity.tagSelected = readerDevice; + else MainActivity.tagSelected = null; + for (int i = 0; i < MainActivity.sharedObjects.tagsList.size(); i++) { + if (i != position) { + ReaderDevice readerDevice1 = MainActivity.sharedObjects.tagsList.get(i); + if (readerDevice1.getSelected()) { + readerDevice1.setSelected(false); + MainActivity.sharedObjects.tagsList.set(i, readerDevice1); + } + } + } + readerListAdapter.notifyDataSetChanged(); + } + }); + + rfidRunTime = (TextView) getActivity().findViewById(R.id.inventoryRfidRunTime1); + rfidVoltageLevel = (TextView) getActivity().findViewById(R.id.inventoryRfidVoltageLevel1); + TextView rfidFilterOn = (TextView) getActivity().findViewById(R.id.inventoryRfidFilterOn1); + if (mDid != null || (MainActivity.csLibrary4A.getSelectEnable() == false && MainActivity.csLibrary4A.getInvMatchEnable() == false && MainActivity.csLibrary4A.getRssiFilterEnable() == false)) + rfidFilterOn.setVisibility(View.INVISIBLE); + + rfidYieldView = (TextView) getActivity().findViewById(R.id.inventoryRfidYield1); + rfidRateView = (TextView) getActivity().findViewById(R.id.inventoryRfidRate1); + button = (Button) getActivity().findViewById(R.id.inventoryRfidButton1); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startStopHandler(false); + } + }); + + vibrateTimeBackup = MainActivity.csLibrary4A.getVibrateTime(); + final Button buttonT1 = (Button) getActivity().findViewById(R.id.inventoryRfidButtonT1); + buttonT1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String buttonText = buttonT1.getText().toString().trim(); + if (buttonText.toUpperCase().matches("BUZ")) { + MainActivity.csLibrary4A.appendToLog("setVibrateOn G 1"); + MainActivity.csLibrary4A.setVibrateTime(0); MainActivity.csLibrary4A.setVibrateOn(1); + buttonT1.setText("STOP"); + } + else { + MainActivity.csLibrary4A.appendToLog("setVibrateOn H 0"); + MainActivity.csLibrary4A.setVibrateOn(0); + buttonT1.setText("BUZ"); + } + } + }); + } + + @Override + public void onResume() { + super.onResume(); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryRfidiMultiFragment().onResume(): userVisibleHint = " + userVisibleHint); + if (userVisibleHint) setNotificationListener(); + } + + @Override + public void onPause() { + MainActivity.csLibrary4A.setNotificationListener(null); + super.onPause(); + } + + @Override + public void onDestroy() { + mHandler.removeCallbacks(runnableCheckReady); + if (MainActivity.csLibrary4A != null) MainActivity.csLibrary4A.setNotificationListener(null); + if (inventoryRfidTask != null) { + inventoryRfidTask.taskCancelReason = InventoryRfidTask.TaskCancelRReason.DESTORY; + if (MainActivity.csLibrary4A != null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryRfidiMultiFragment().onDestory(): VALID inventoryRfidTask"); + MainActivity.csLibrary4A.abortOperation(); //added in case inventoryRiidTask is removed + } + } + if (MainActivity.csLibrary4A != null) { + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.setInvBrandId(false); + resetSelectData(); + MainActivity.csLibrary4A.setVibrateTime(vibrateTimeBackup); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryRfidiMultiFragment().onDestory(): onDestory()"); + } + super.onDestroy(); + } + + boolean userVisibleHint = true; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + userVisibleHint = true; + MainActivity.csLibrary4A.appendToLog("InventoryRfidiMultiFragment is now VISIBLE"); + MainActivity.csLibrary4A.appendToLog("11 mDid = " + mDid + ", MainActivity.mDid = " + MainActivity.mDid); + if (MainActivity.mDid != null && MainActivity.mDid.indexOf("E28011") == 0) { + int iValue = Integer.valueOf(MainActivity.mDid.substring(6, 8), 16); + iValue &= 0x0F; + MainActivity.csLibrary4A.appendToLog(String.format("iValue = 0x%X", iValue)); + if (iValue > 0 && iValue < 6) { + checkBoxFilterByProtect.setVisibility(View.VISIBLE); + editTextProtectPassword.setVisibility(View.VISIBLE); + } else { + checkBoxFilterByProtect.setVisibility(View.GONE); checkBoxFilterByProtect.setChecked(false); + editTextProtectPassword.setVisibility(View.GONE); + } + } + MainActivity.csLibrary4A.appendToLog("setNotificationListener in multibank inventory"); + setNotificationListener(); + } else { + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("InventoryRfidiMultiFragment is now INVISIBLE"); + MainActivity.csLibrary4A.appendToLog("setNotificationListener null in multibank inventory"); + MainActivity.csLibrary4A.setNotificationListener(null); + if (inventoryRfidTask != null) { + inventoryRfidTask.taskCancelReason = InventoryRfidTask.TaskCancelRReason.STOP; + } + } + } + + public static InventoryRfidiMultiFragment newInstance(boolean bMultiBank, RfidReader.TagType tagType, String mDid) { + InventoryRfidiMultiFragment myFragment = new InventoryRfidiMultiFragment(); + + Bundle args = new Bundle(); + MainActivity.csLibrary4A.appendToLog("newInstance: enumTagType = " + (tagType == null ? "null" : tagType.toString())); + if (tagType != null) args.putInt("enumTagType", tagType.ordinal()); + args.putBoolean("bMultiBank", bMultiBank); + args.putString("mDid", mDid); + myFragment.setArguments(args); + + return myFragment; + } + public InventoryRfidiMultiFragment() { + super("InventoryRfidiMultiFragment"); + } + + void setNotificationListener() { + MainActivity.csLibrary4A.appendToLog("setNotificationListener A in multibank inventory"); + MainActivity.csLibrary4A.setNotificationListener(new NotificationConnector.NotificationListener() { + @Override + public void onChange() { + MainActivity.csLibrary4A.appendToLog("setNotificationListener TRIGGER key is pressed in multibank inventory."); + startStopHandler(true); + } + }); + } + + boolean needResetData = false; + void resetSelectData() { + MainActivity.csLibrary4A.appendToLog("InventoryRfidMultiFragment.resetSelectData: mDid = " + mDid + ", MainActivity.mDid = " + MainActivity.mDid); + if (MainActivity.mDid != null && MainActivity.mDid.indexOf("E282405") == 0) { } + else MainActivity.csLibrary4A.restoreAfterTagSelect(); + if (needResetData) { + MainActivity.csLibrary4A.setTagRead(0); + MainActivity.csLibrary4A.setAccessBank(1); + MainActivity.csLibrary4A.setAccessOffset(0); + MainActivity.csLibrary4A.setAccessCount(0); + needResetData = false; + } + if (mDid != null && tagType == TAG_CTESIUS /*mDid.matches("E203510")*/) MainActivity.csLibrary4A.setSelectCriteriaDisable(1); + } + void startStopHandler(boolean buttonTrigger) { + MainActivity.csLibrary4A.appendToLog("0 buttonTrigger is " + buttonTrigger); + if (buttonTrigger) MainActivity.csLibrary4A.appendToLog("BARTRIGGER: getTriggerButtonStatus = " + MainActivity.csLibrary4A.getTriggerButtonStatus()); + if (MainActivity.sharedObjects.runningInventoryBarcodeTask) { + Toast.makeText(MainActivity.mContext, "Running barcode inventory", Toast.LENGTH_SHORT).show(); + return; + } + boolean started = false; + if (inventoryRfidTask != null) if (inventoryRfidTask.getStatus() == AsyncTask.Status.RUNNING) started = true; + if (buttonTrigger && ((started && MainActivity.csLibrary4A.getTriggerButtonStatus()) || (started == false && MainActivity.csLibrary4A.getTriggerButtonStatus() == false))) { + MainActivity.csLibrary4A.appendToLog("BARTRIGGER: trigger ignore"); + return; + } + if (started == false) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) { + //Toast.makeText(MainActivity.mContext, R.string.toast_not_ready, Toast.LENGTH_SHORT).show(); + mHandler.post(runnableCheckReady); + return; + } + if (bAdd2End) rfidListView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); + else rfidListView.setSelection(0); + startInventoryTask(); + } else if (MainActivity.csLibrary4A.mrfidToWriteSize() == 0) { + if (bAdd2End) rfidListView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_NORMAL); + if (buttonTrigger) inventoryRfidTask.taskCancelReason = InventoryRfidTask.TaskCancelRReason.BUTTON_RELEASE; + else inventoryRfidTask.taskCancelReason = InventoryRfidTask.TaskCancelRReason.STOP; + MainActivity.csLibrary4A.appendToLogView("CANCELLING: StartStopHandler generates taskCancelReason = " + inventoryRfidTask.taskCancelReason.toString()); + } else MainActivity.csLibrary4A.appendToLog("BtData. Stop when still writing !!!"); + } + void startInventoryTask() { + MainActivity.csLibrary4A.appendToLog("startInventoryTask"); + //RfidReader.ExtraBankData extraBankData = new RfidReader.ExtraBankData(); + String mDid = this.mDid; + + MainActivity.csLibrary4A.appendToLog("Rin: mDid = " + (mDid == null ? "null" : mDid) + ", MainActivity.mDid = " + MainActivity.mDid + ", bMultiBankInventory = " + bMultiBankInventory); + if (mDid != null && MainActivity.mDid != null) { + if (MainActivity.mDid.indexOf("E280B12") != 0) mDid = MainActivity.mDid; + } + + RfidReader.ExtraBankData extraBankData = new RfidReader.ExtraBankData(); + if (mDid != null) extraBankData.setExtraBankData(MainActivity.tagType, mDid); + else if (bMultiBank) { + CheckBox checkBox = (CheckBox) getActivity().findViewById(R.id.accessInventoryBankTitle1); + int extra1Bank = 0, extra2Bank = 0; + int extra1Count, extra2Count; + int extra1Offset = 0, extra2Offset = 0; + if (checkBox.isChecked()) { + extra1Bank = spinnerBank1.getSelectedItemPosition(); + EditText editText = (EditText) getActivity().findViewById(R.id.accessInventoryOffset1); + extra1Offset = Integer.valueOf(editText.getText().toString()); + editText = (EditText) getActivity().findViewById(R.id.accessInventoryLength1); + extra1Count = Integer.valueOf(editText.getText().toString()); + } else extra1Count = 0; + checkBox = (CheckBox) getActivity().findViewById(R.id.accessInventoryBankTitle2); + if (checkBox.isChecked()) { + extra2Bank = spinnerBank2.getSelectedItemPosition(); + EditText editText = (EditText) getActivity().findViewById(R.id.accessInventoryOffset2); + extra2Offset = Integer.valueOf(editText.getText().toString()); + editText = (EditText) getActivity().findViewById(R.id.accessInventoryLength2); + extra2Count = Integer.valueOf(editText.getText().toString()); + } else extra2Count = 0; + extraBankData.setExtraBankData(extra1Bank, extra1Count, extra1Offset, extra2Bank, extra2Count, extra2Offset); + } + + if (mDid != null) { + MainActivity.csLibrary4A.appendToLog("mDid is valid as " + mDid); + if (MainActivity.mDid != null && mDid.length() == 0) mDid = MainActivity.mDid; + MainActivity.csLibrary4A.appendToLog("new mDid is " + mDid); + + MainActivity.csLibrary4A.appendToLog("mDid = " + mDid); + if (tagType == TAG_CTESIUS /*mDid.matches("E203510")*/) { + if (MainActivity.csLibrary4A.get98XX() == 2) MainActivity.csLibrary4A.setCurrentLinkProfile(1); //set profile 302 + } else if (tagType == TAG_ASYGN /*mDid.matches("E283A")*/) { + if (MainActivity.csLibrary4A.get98XX() == 2) MainActivity.csLibrary4A.setCurrentLinkProfile(9); //set profile 244 + } else if (mDid.matches("E282405")) { + if (MainActivity.csLibrary4A.getRetryCount() < 2) MainActivity.csLibrary4A.setRetryCount(2); + } + boolean bNeedSelectedTagByTID = true; + if (mDid.indexOf("E2806894") == 0) { + Log.i(TAG, "HelloK: Find E2806894 with MainActivity.mDid = " + MainActivity.mDid + ", mDid = " + mDid); + if (mDid.matches("E2806894A")) { + Log.i(TAG, "HelloK: Find E2806894A"); + MainActivity.csLibrary4A.setInvBrandId(false); + } else if (mDid.matches("E2806894B")) { + Log.i(TAG, "HelloK: Find E2806894B"); + MainActivity.csLibrary4A.setInvBrandId(false); + if (true) bNeedSelectedTagByTID = false; + } else if (mDid.matches("E2806894C") || mDid.matches("E2806894d")) { + Log.i(TAG, "HelloK: Find " + MainActivity.mDid); + MainActivity.csLibrary4A.setInvBrandId(true); + if (true) bNeedSelectedTagByTID = false; + } + } + MainActivity.csLibrary4A.setOtherInventoryData(tagType, mDid); + int iValue123 = MainActivity.csLibrary4A.setSelectData(tagType, mDid, + bNeedSelectedTagByTID && checkBoxFilterByTid.isChecked(), + (checkBoxFilterByProtect.isChecked() ? editTextProtectPassword.getText().toString(): null), + MainActivity.selectFor, MainActivity.selectHold); + if (mDid.indexOf("E2806894") == 0) { + mDid = "E2806894"; + } + if (iValue123 > 0) MainActivity.selectFor = iValue123; + } + + MainActivity.csLibrary4A.appendToLog("bSgtinOnly: bMultiBank is " + bMultiBank + ", checkBoxFilterByEpc is " + (checkBoxFilterByEpc == null ? "null" : checkBoxFilterByEpc.isChecked())); + if (bMultiBank == false) { + if (checkBoxFilterByEpc.isChecked()) { + MainActivity.csLibrary4A.appendToLog("bSgtinOnly: clearTagList"); + clearTagsList(); + } + MainActivity.csLibrary4A.restoreAfterTagSelect(); + inventoryRfidTask = new InventoryRfidTask(getContext(), -1, -1, 0, 0, 0, 0, + false, MainActivity.csLibrary4A.getInventoryBeep(), + MainActivity.sharedObjects.tagsList, readerListAdapter, null, RfidReader.TagType.TAG_NULL, null, + rfidRunTime, null, rfidVoltageLevel, rfidYieldView, button, rfidRateView); + inventoryRfidTask.bSgtinOnly = checkBoxFilterByEpc.isChecked(); + MainActivity.csLibrary4A.appendToLog("Debug_Compact 1: InventoryRfidMultiFragment.startInventoryTask"); + MainActivity.csLibrary4A.startOperation(RfidReaderChipData.OperationTypes.TAG_INVENTORY_COMPACT); + } else { + boolean inventoryUcode8_bc = mDid != null && mDid.matches("E2806894") && MainActivity.mDid != null && (MainActivity.mDid.matches("E2806894B") || MainActivity.mDid.matches("E2806894C")); + if ((extraBankData.extra1Bank != -1 && extraBankData.extra1Count != 0) || (extraBankData.extra2Bank != -1 && extraBankData.extra2Count != 0)) { + extraBankData.adjustExtraBank1(); + MainActivity.csLibrary4A.appendToLog("HelloK: mDid = " + mDid + ", MainActivity.mDid = " + MainActivity.mDid + " with extra1Bank = " + extraBankData.extra1Bank + "," + extraBankData.extra1Offset + "," + extraBankData.extra1Count + ", extra2Bank = " + extraBankData.extra2Bank + "," + extraBankData.extra2Offset + "," + extraBankData.extra2Count); + if (mDid != null) MainActivity.csLibrary4A.setResReadNoReply(mDid.matches("E281D")); + if (inventoryUcode8_bc == false) { + MainActivity.csLibrary4A.appendToLog("BleStreamOut: Set Multibank"); + MainActivity.csLibrary4A.setTagRead(extraBankData.extra2Count != 0 && extraBankData.extra2Count != 0 ? 2 : 1); + MainActivity.csLibrary4A.setAccessBank(extraBankData.extra1Bank, extraBankData.extra2Bank); + MainActivity.csLibrary4A.setAccessOffset(extraBankData.extra1Offset, extraBankData.extra2Offset); + MainActivity.csLibrary4A.setAccessCount(extraBankData.extra1Count, extraBankData.extra2Count); + needResetData = true; + } else if (needResetData) { + MainActivity.csLibrary4A.setTagRead(0); + MainActivity.csLibrary4A.setAccessBank(1); + MainActivity.csLibrary4A.setAccessOffset(0); + MainActivity.csLibrary4A.setAccessCount(0); + needResetData = false; + } + } else resetSelectData(); + MainActivity.csLibrary4A.appendToLog("startInventoryTask: going to startOperation with extra1Bank = " + extraBankData.extra1Bank + "," + extraBankData.extra1Offset + "," + extraBankData.extra1Count + ", extra2Bank = " + extraBankData.extra2Bank + "," + extraBankData.extra2Offset + "," + extraBankData.extra2Count); + inventoryRfidTask = new InventoryRfidTask(getContext(), extraBankData.extra1Bank, extraBankData.extra2Bank, extraBankData.extra1Count, extraBankData.extra2Count, extraBankData.extra1Offset, extraBankData.extra2Offset, + false, MainActivity.csLibrary4A.getInventoryBeep(), + MainActivity.sharedObjects.tagsList, readerListAdapter, null, tagType, mDid, + rfidRunTime, null, rfidVoltageLevel, rfidYieldView, button, rfidRateView); + inventoryRfidTask.bProtectOnly = checkBoxFilterByProtect.isChecked(); + if (inventoryUcode8_bc) { + MainActivity.csLibrary4A.appendToLog("Debug_Compact 2: InventoryRfidMultiFragment.startInventoryTask"); + MainActivity.csLibrary4A.startOperation(RfidReaderChipData.OperationTypes.TAG_INVENTORY_COMPACT); + } else { + MainActivity.csLibrary4A.appendToLog("Debug_Compact 3: InventoryRfidMultiFragment.startInventoryTask"); + MainActivity.csLibrary4A.startOperation(RfidReaderChipData.OperationTypes.TAG_INVENTORY); + } + } + inventoryRfidTask.execute(); + } + + private final Runnable runnableCheckReady = new Runnable() { + @Override + public void run() { + if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) { + button.setEnabled(false); + button.setText("Please wait"); + MainActivity.csLibrary4A.setNotificationListener(null); + mHandler.postDelayed(runnableCheckReady, 500); + } else { + button.setText("Start"); + button.setEnabled(true); + if (userVisibleHint) setNotificationListener(); + } + } + }; +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cs710ademoapp.MainActivity.tagSelected; + +import android.app.Activity; +import android.os.AsyncTask; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.ProgressBar; +import android.widget.SeekBar; +import android.widget.Spinner; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.CustomMediaPlayer; +import com.csl.cs710ademoapp.InventoryRfidTask; +import com.csl.cs710ademoapp.SelectTag; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.NotificationConnector; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReader; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class InventoryRfidSearchFragment extends CommonFragment { + double dBuV_dBm_constant = MainActivity.csLibrary4A.dBuV_dBm_constant; + final int labelMin = -90; + final int labelMax = -10; + + SelectTag selectTag; + private ProgressBar geigerProgress; + private CheckBox checkBoxGeigerTone; + private SeekBar seekGeiger; + private Spinner memoryBankSpinner; + private EditText editTextRWSelectOffset, editTextGeigerAntennaPower; + private TextView geigerThresholdView; + private TextView geigerTagRssiView; + private TextView geigerTagGotView; + private TextView geigerRunTime, geigerVoltageLevelView; + private TextView rfidYieldView; + private TextView rfidRateView; + private Button button; + + private boolean started = false; + int thresholdValue = 0; + + private InventoryRfidTask geigerSearchTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_geiger_search, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (!isTabbed) { + androidx.appcompat.app.ActionBar actionBar; + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_loc); + actionBar.setTitle(R.string.title_activity_geiger); + } + + selectTag = new SelectTag((Activity)getActivity(), 0); + TableRow tableRowProgressLabel; + TextView textViewProgressLabelMin = (TextView) getActivity().findViewById(R.id.geigerProgressLabelMin); + TextView textViewProgressLabelMid = (TextView) getActivity().findViewById(R.id.geigerProgressLabelMid); + TextView textViewProgressLabelMax = (TextView) getActivity().findViewById(R.id.geigerProgressLabelMax); + textViewProgressLabelMin.setText(String.format("%.0f", MainActivity.csLibrary4A.getRssiDisplaySetting() != 0 ? labelMin : labelMin + dBuV_dBm_constant)); + textViewProgressLabelMid.setText(String.format("%.0f", MainActivity.csLibrary4A.getRssiDisplaySetting() != 0 ? labelMin + (labelMax - labelMin) / 2 : labelMin + (labelMax - labelMin) / 2 + dBuV_dBm_constant)); + textViewProgressLabelMax.setText(String.format("%.0f", MainActivity.csLibrary4A.getRssiDisplaySetting() != 0 ? labelMax : labelMax + dBuV_dBm_constant)); + + geigerProgress = (ProgressBar) getActivity().findViewById(R.id.geigerProgress); + checkBoxGeigerTone = (CheckBox) getActivity().findViewById(R.id.geigerToneCheck); + + seekGeiger = (SeekBar) getActivity().findViewById(R.id.geigerSeek); + seekGeiger.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (seekBar == seekGeiger && fromUser == true) { + thresholdValue = progress; + geigerThresholdView.setText(String.format("%.2f", MainActivity.csLibrary4A.getRssiDisplaySetting() == 0 ? thresholdValue : thresholdValue - dBuV_dBm_constant)); + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { } + }); + + memoryBankSpinner = (Spinner) getActivity().findViewById(R.id.selectMemoryBank); + ArrayAdapter memoryBankAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.read_memoryBank_options, R.layout.custom_spinner_layout); + memoryBankAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + memoryBankSpinner.setAdapter(memoryBankAdapter); + memoryBankSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + switch (position) { + case 0: //if EPC + if (tagSelected != null) selectTag.editTextTagID.setText(tagSelected.getAddress()); + editTextRWSelectOffset.setText("32"); + break; + case 1: + if (tagSelected != null) selectTag.editTextTagID.setText(tagSelected.getTid()); + editTextRWSelectOffset.setText("0"); + break; + case 2: + if (tagSelected != null) selectTag.editTextTagID.setText(tagSelected.getUser()); + editTextRWSelectOffset.setText("0"); + break; + default: + break; + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + + editTextRWSelectOffset = (EditText) getActivity().findViewById(R.id.selectMemoryOffset); + + TableRow tableRowSelectPassword = (TableRow) getActivity().findViewById(R.id.selectPasswordRow); + tableRowSelectPassword.setVisibility(View.GONE); + + editTextGeigerAntennaPower = (EditText) getActivity().findViewById(R.id.selectAntennaPower); + editTextGeigerAntennaPower.setText(String.valueOf(300)); + + geigerThresholdView = (TextView) getActivity().findViewById(R.id.geigerThreshold); + geigerTagRssiView = (TextView) getActivity().findViewById(R.id.geigerTagRssi); + geigerTagRssiView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + + @Override + public void afterTextChanged(Editable editable) { + if (alertRssiUpdateTime < 0) return; + double rssi = Double.parseDouble(geigerTagRssiView.getText().toString()); + if (MainActivity.csLibrary4A.getRssiDisplaySetting() != 0) rssi += dBuV_dBm_constant; + + double progressPos = geigerProgress.getMax() * ( rssi - labelMin - dBuV_dBm_constant) / (labelMax - labelMin); + if (progressPos < 0) progressPos = 0; + if (progressPos > geigerProgress.getMax()) progressPos = geigerProgress.getMax(); + geigerProgress.setProgress((int) (progressPos)); + + alertRssiUpdateTime = System.currentTimeMillis(); alertRssi = rssi; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("afterTextChanged(): alerting = " + alerting + ", alertRssi = " + alertRssi); + if (rssi > thresholdValue && checkBoxGeigerTone.isChecked()) { + if (alerting == false) { + alerting = true; + mHandler.removeCallbacks(mAlertRunnable); + mHandler.post(mAlertRunnable); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("afterTextChanged(): mAlertRunnable starts"); + } + } + } + }); + geigerRunTime = (TextView) getActivity().findViewById(R.id.geigerRunTime); + geigerTagGotView = (TextView) getActivity().findViewById(R.id.geigerTagGot); + geigerVoltageLevelView = (TextView) getActivity().findViewById(R.id.geigerVoltageLevel); + rfidYieldView = (TextView) getActivity().findViewById(R.id.geigerYield); + rfidRateView = (TextView) getActivity().findViewById(R.id.geigerRate); + button = (Button) getActivity().findViewById(R.id.geigerStart); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startStopHandler(false); + } + }); + + playerN = MainActivity.sharedObjects.playerL; + setupTagID(); + } + + @Override + public void onResume() { + super.onResume(); + if (userVisibleHint) setNotificationListener(); + } + + @Override + public void onPause() { + MainActivity.csLibrary4A.setNotificationListener(null); + super.onPause(); + } + + @Override + public void onDestroy() { + MainActivity.csLibrary4A.setNotificationListener(null); + if (geigerSearchTask != null) { + geigerSearchTask.taskCancelReason = InventoryRfidTask.TaskCancelRReason.DESTORY; + } + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + boolean userVisibleHint = true; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + userVisibleHint = true; + MainActivity.csLibrary4A.appendToLog("InventoryRfidSearchFragment is now VISIBLE"); + setupTagID(); + MainActivity.csLibrary4A.appendToLog("setNotificationListener in search inventory"); + setNotificationListener(); + } else { + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("InventoryRfidSearchFragment is now INVISIBLE"); + MainActivity.csLibrary4A.appendToLog("setNotificationListener NULL in search inventory"); + MainActivity.csLibrary4A.setNotificationListener(null); + } + } + + boolean isTabbed = false; + public InventoryRfidSearchFragment(boolean isTabbed) { + super("InventoryRfidSearchFragment"); + this.isTabbed = isTabbed; + } + void setupTagID() { + final ReaderDevice tagSelected = MainActivity.tagSelected; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + if (tagSelected.getTid() != null) { + if (tagSelected.getTid().indexOf("E281D") == 0 || tagSelected.getTid().indexOf("E201E") == 0) { + memoryBankSpinner.setSelection(1); + } + } + switch (memoryBankSpinner.getSelectedItemPosition()) { + case 0: + selectTag.editTextTagID.setText(tagSelected.getAddress()); + break; + case 1: + selectTag.editTextTagID.setText(tagSelected.getTid()); + break; + case 2: + selectTag.editTextTagID.setText(tagSelected.getUser()); + break; + } + } + } + } + + double alertRssi; boolean alerting = false; long alertRssiUpdateTime; + CustomMediaPlayer playerN; + private final Runnable mAlertRunnable = new Runnable() { + @Override + public void run() { + boolean alerting1 = true; + final int toneLength = 50; + + mHandler.removeCallbacks(mAlertRunnable); + + if (alertRssi < 20 || alertRssi < thresholdValue || checkBoxGeigerTone.isChecked() == false || alertRssiUpdateTime < 0 || System.currentTimeMillis() - alertRssiUpdateTime > 200) alerting1 = false; + if (alerting1 == false) { + playerN.pause(); alerting = false; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("mAlertRunnable(): ENDS with new alerting1 = " + alerting1 + ", alertRssi = " + alertRssi); + } else if (playerN.isPlaying() == false) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("mAlertRunnable(): TONE starts"); + mHandler.postDelayed(mAlertRunnable, toneLength); + playerN.start(); + } else { + int tonePause = 0; + if (alertRssi >= 60) tonePause = toneLength; + else if (alertRssi >= 50) tonePause = 250 - toneLength; + else if (alertRssi >= 40) tonePause = 500 - toneLength; + else if (alertRssi >= 30) tonePause = 1000 - toneLength; + else if (alertRssi >= 20) tonePause = 2000 - toneLength; + if (tonePause > 0) mHandler.postDelayed(mAlertRunnable, tonePause); + if (tonePause <= 0 || alertRssi < 60) { playerN.pause(); if (DEBUG) MainActivity.csLibrary4A.appendToLog("Pause"); } + if (DEBUG) MainActivity.csLibrary4A.appendToLog("mAlertRunnable(): START with new alerting1 = " + alerting1 + ", alertRssi = " + alertRssi); + alerting = tonePause > 0 ? true : false; + } + } + }; + + void setNotificationListener() { + MainActivity.csLibrary4A.appendToLog("setNotificationListener A in search inventory"); + MainActivity.csLibrary4A.setNotificationListener(new NotificationConnector.NotificationListener() { + @Override + public void onChange() { + MainActivity.csLibrary4A.appendToLog("setNotificationListener TRIGGER key is pressed in search inventory."); + startStopHandler(true); + } + }); + } + + void startStopHandler(boolean buttonTrigger) { + boolean started = false; + if (geigerSearchTask != null) { + if (geigerSearchTask.getStatus() == AsyncTask.Status.RUNNING) started = true; + } + if (buttonTrigger == true && + ((started && MainActivity.csLibrary4A.getTriggerButtonStatus()) + || (started == false && MainActivity.csLibrary4A.getTriggerButtonStatus() == false))) return; + if (started == false) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) { + Toast.makeText(MainActivity.mContext, R.string.toast_not_ready, Toast.LENGTH_SHORT).show(); + return; + } + startInventoryTask(); + alertRssiUpdateTime = 0; + } else { + if (buttonTrigger) geigerSearchTask.taskCancelReason = InventoryRfidTask.TaskCancelRReason.BUTTON_RELEASE; + else geigerSearchTask.taskCancelReason = InventoryRfidTask.TaskCancelRReason.STOP; + alertRssiUpdateTime = -1; + } + } + + void startInventoryTask() { + started = true; boolean invalidRequest = false; + if (tagSelected != null) { + if (tagSelected.getTid() != null) { + if (tagSelected.getTid().indexOf("E201E") == 0) { + MainActivity.csLibrary4A.setTagRead(1); + MainActivity.csLibrary4A.setAccessBank(3); + MainActivity.csLibrary4A.setAccessOffset(112); + MainActivity.csLibrary4A.setAccessCount(1); + } + } + } + int memorybank = memoryBankSpinner.getSelectedItemPosition(); + int powerLevel = Integer.valueOf(editTextGeigerAntennaPower.getText().toString()); + if (powerLevel < 0 || powerLevel > MainActivity.powerLevelMax) { + MainActivity.csLibrary4A.appendToLog("invalidRequest = " + invalidRequest + ", with powerLevel = " + powerLevel); + invalidRequest = true; + } else if (MainActivity.csLibrary4A.setSelectedTag(selectTag.editTextTagID.getText().toString(), memorybank+1, powerLevel) == false) { + invalidRequest = true; + MainActivity.csLibrary4A.appendToLog("invalidRequest = " + invalidRequest + ", with setSelectedTag as false, string = " + selectTag.editTextTagID.getText().toString() + ", bank = " + memorybank+1 + ", power = " + powerLevel); + } else { + MainActivity.csLibrary4A.startOperation(RfidReaderChipData.OperationTypes.TAG_SEARCHING); + } + MainActivity.csLibrary4A.appendToLog("invalidRequest = " + invalidRequest); + geigerSearchTask = new InventoryRfidTask(getContext(), -1,-1, 0, 0, 0, 0, invalidRequest, true, + null, null, geigerTagRssiView, RfidReader.TagType.TAG_NULL, null, + geigerRunTime, geigerTagGotView, geigerVoltageLevelView, null, button, rfidRateView); + geigerSearchTask.execute(); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.content.Intent; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Handler; +import android.os.Looper; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SaveList2ExternalTask; +import com.csl.cs710ademoapp.SharedObjects; +import com.csl.cs710ademoapp.adapters.ReaderListAdapter; +import com.csl.cslibrary4a.NotificationConnector; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public class InventoryRfidSimpleFragment extends CommonFragment { + final private boolean bAdd2End = false; + int vibrateTimeBackup = 0; + + private ListView rfidListView; + private TextView rfidEmptyView; + private TextView rfidRunTime; + private TextView rfidYieldView; + private TextView rfidRateView; + private Button button, buttonShow; + + private ReaderListAdapter readerListAdapter; + + void clearTagsList() { + if (bRunningInventory) return; + rfidYieldView.setText(""); + rfidRateView.setText(""); + MainActivity.tagSelected = null; + MainActivity.sharedObjects.tagsList.clear(); MainActivity.sharedObjects.tagsIndexList.clear(); + readerListAdapter.notifyDataSetChanged(); + MainActivity.mLogView.setText(""); + } + void sortTagsList() { + if (bRunningInventory) return; + Collections.sort(MainActivity.sharedObjects.tagsList); + readerListAdapter.notifyDataSetChanged(); + } + void sortTagsListByRssi() { + if (bRunningInventory) return; + Collections.sort(MainActivity.sharedObjects.tagsList, new Comparator() { + @Override + public int compare(ReaderDevice deviceTag, ReaderDevice t1) { + if (deviceTag.getRssi() == t1.getRssi()) return 0; + else if (deviceTag.getRssi() < t1.getRssi()) return 1; + else return -1; + } + }); + readerListAdapter.notifyDataSetChanged(); + } + void saveTagsList() { + if (bRunningInventory) return; + SaveList2ExternalTask saveExternalTask = new SaveList2ExternalTask(MainActivity.sharedObjects.tagsList); + saveExternalTask.execute(); + } + void shareTagsList() { + SaveList2ExternalTask saveExternalTask = new SaveList2ExternalTask(MainActivity.sharedObjects.tagsList); + String stringOutput = saveExternalTask.createStrEpcList(); + + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, stringOutput); + sendIntent.setType("text/plain"); + startActivity(Intent.createChooser(sendIntent, "Sharing to")); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.menuAction_clear) { + clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_inventory_rfid_simple, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + MainActivity.selectFor = -1; + if (true) { + androidx.appcompat.app.ActionBar actionBar; + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_simpleInventory); + } + + rfidListView = (ListView) getActivity().findViewById(R.id.simpleInventoryinventoryRfidList1); + rfidEmptyView = (TextView) getActivity().findViewById(R.id.simpleInventoryRfidEmpty1); + rfidListView.setEmptyView(rfidEmptyView); + boolean bSelect4detail = true; + + boolean needDupElim = true; + boolean need4Extra1 = MainActivity.csLibrary4A.getPortNumber() > 1 ? true : false; + boolean need4Extra2 = false; + readerListAdapter = new ReaderListAdapter(getActivity(), R.layout.readers_list_item, MainActivity.sharedObjects.tagsList, bSelect4detail, true, needDupElim, need4Extra1, need4Extra2); + + rfidListView.setAdapter(readerListAdapter); + rfidListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + rfidListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + ReaderDevice readerDevice = readerListAdapter.getItem(position); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Position = " + position); + if (readerDevice.getSelected()) { + readerDevice.setSelected(false); + } else { + readerDevice.setSelected(true); + } + MainActivity.sharedObjects.tagsList.set(position, readerDevice); + if (readerDevice.getSelected()) MainActivity.tagSelected = readerDevice; + else MainActivity.tagSelected = null; + for (int i = 0; i < MainActivity.sharedObjects.tagsList.size(); i++) { + if (i != position) { + ReaderDevice readerDevice1 = MainActivity.sharedObjects.tagsList.get(i); + if (readerDevice1.getSelected()) { + readerDevice1.setSelected(false); + MainActivity.sharedObjects.tagsList.set(i, readerDevice1); + } + } + } + readerListAdapter.notifyDataSetChanged(); + } + }); + + rfidRunTime = (TextView) getActivity().findViewById(R.id.simpleInventoryRfidRunTime1); + TextView rfidFilterOn = (TextView) getActivity().findViewById(R.id.SimpleInventoryRfidFilterOn1); + if (MainActivity.csLibrary4A.getSelectEnable() == false && MainActivity.csLibrary4A.getInvMatchEnable() == false && MainActivity.csLibrary4A.getRssiFilterEnable() == false ) + rfidFilterOn.setVisibility(View.INVISIBLE); + + rfidYieldView = (TextView) getActivity().findViewById(R.id.simpleInventoryRfidYield1); + rfidRateView = (TextView) getActivity().findViewById(R.id.simpleInventoryRfidRate1); + + button = (Button) getActivity().findViewById(R.id.simpleInventoryRfidButton1); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startStopHandler(false); + } + }); + + buttonShow = (Button) getActivity().findViewById(R.id.simpleInventoryRfidButtonShow); + buttonShow.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + buttonShow.setVisibility(View.GONE); + inventoryHandler_tag(); + } + }); + + vibrateTimeBackup = MainActivity.csLibrary4A.getVibrateTime(); + } + + @Override + public void onResume() { + super.onResume(); + setNotificationListener(); + } + + @Override + public void onPause() { + MainActivity.csLibrary4A.setNotificationListener(null); + super.onPause(); + } + + @Override + public void onDestroy() { + mHandler.removeCallbacks(runnableCheckReady); + MainActivity.csLibrary4A.setNotificationListener(null); + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.setInvBrandId(false); + MainActivity.csLibrary4A.setVibrateTime(vibrateTimeBackup); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryRfidSimpleFragment().onDestory(): onDestory()"); + super.onDestroy(); + } + + public static InventoryRfidSimpleFragment newInstance(boolean bMultiBank, String mDid) { + InventoryRfidSimpleFragment myFragment = new InventoryRfidSimpleFragment(); + + Bundle args = new Bundle(); + args.putBoolean("bMultiBank", bMultiBank); + args.putString("mDid", mDid); + myFragment.setArguments(args); + + return myFragment; + } + public InventoryRfidSimpleFragment() { + super("InventoryRfidSimpleFragment"); + } + + void setNotificationListener() { + MainActivity.csLibrary4A.setNotificationListener(new NotificationConnector.NotificationListener() { + @Override + public void onChange() { + MainActivity.csLibrary4A.appendToLog("TRIGGER key is pressed."); + startStopHandler(true); + } + }); + } + void startStopHandler(boolean buttonTrigger) { + if (buttonTrigger) MainActivity.csLibrary4A.appendToLog("getTriggerButtonStatus = " + MainActivity.csLibrary4A.getTriggerButtonStatus()); + else MainActivity.csLibrary4A.appendToLog("TriggerButton is pressed"); + + boolean started = false; + if (bRunningInventory) started = true; + if (buttonTrigger && ((started && MainActivity.csLibrary4A.getTriggerButtonStatus()) || (started == false && MainActivity.csLibrary4A.getTriggerButtonStatus() == false))) { + MainActivity.csLibrary4A.appendToLog("BARTRIGGER: trigger ignore"); + return; + } + MainActivity.csLibrary4A.appendToLog("started = " + started); + if (started == false) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) { + //Toast.makeText(MainActivity.mContext, R.string.toast_not_ready, Toast.LENGTH_SHORT).show(); + mHandler.post(runnableCheckReady); + return; + } + + if (true) { + EditText editText = (EditText) getActivity().findViewById(R.id.simpleInventoryTagPopulation); + int iValue = Integer.valueOf(editText.getText().toString(), 16); + MainActivity.csLibrary4A.setPopulation(iValue); + + editText = (EditText) getActivity().findViewById(R.id.simpleInventoryTagTargetNumber); + iTagTarget = Integer.valueOf(editText.getText().toString()); + iTagGot = 0; + + uplinkPacketList.clear(); + + timeMillis = System.currentTimeMillis(); startTimeMillis = timeMillis; runTimeMillis = timeMillis; + total = 0; + } + + MainActivity.sharedObjects.tagsList.clear(); MainActivity.sharedObjects.tagsIndexList.clear(); + rfidYieldView.setText(""); + rfidRateView.setText(""); + button.setText("Stop"); + if (bAdd2End) rfidListView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); + else rfidListView.setSelection(0); + + MainActivity.csLibrary4A.appendToLog("setVibrateOn i 2 with getInventoryVibrate as " + MainActivity.csLibrary4A.getInventoryVibrate() + ", getVibrateModeSetting as " + MainActivity.csLibrary4A.getVibrateModeSetting()); + if (MainActivity.csLibrary4A.getInventoryVibrate() && MainActivity.csLibrary4A.getVibrateModeSetting() == 1) { + MainActivity.csLibrary4A.setVibrateOn(2); + } + //else MainActivity.csLibrary4A.setVibrateOn(0); + + startInventoryTask(); + bRunningInventory = true; + myHandler.post(runnableSimpleInentory); + } else { + MainActivity.csLibrary4A.abortOperation(); + if (bAdd2End) rfidListView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_NORMAL); + if (true) { bRunningInventory = false; } + } + } + + boolean bRunningInventory = false; + int total; + long timeMillis, startTimeMillis, runTimeMillis, rateTimeMillis; + int iTagTarget, iTagGot; + Handler myHandler = new Handler(Looper.getMainLooper()); + ArrayList uplinkPacketList = new ArrayList<>(); + Runnable runnableSimpleInentory = new Runnable() { + @Override + public void run() { + RfidReaderChipData.Rx000pkgData uplinkPacket; + if (MainActivity.csLibrary4A.isBleConnected() && bRunningInventory) { + while (MainActivity.csLibrary4A.mrfidToWriteSize() == 0 && (iTagTarget == 0 || iTagGot < iTagTarget)) { + if (System.currentTimeMillis() > runTimeMillis + 1000) { + runTimeMillis = System.currentTimeMillis(); + long timePeriod = (System.currentTimeMillis() - startTimeMillis) / 1000; + if (timePeriod > 0) { + if (rfidRunTime != null) rfidRunTime.setText(String.format("Run time: %d sec", timePeriod)); + } + } + uplinkPacket = MainActivity.csLibrary4A.onRFIDEvent(); + if (uplinkPacket == null) break; + else { + uplinkPacketList.add(uplinkPacket); + iTagGot++; + mHandler.postDelayed(runnableStartBeep, 250); + } + } + if (iTagTarget != 0 && iTagGot >= iTagTarget) { + MainActivity.csLibrary4A.abortOperation(); + bRunningInventory = false; + } + + if (iTagGot != 0) { + rfidYieldView.setText("Total:" + iTagGot); + + long tagRate = MainActivity.csLibrary4A.getTagRate(); + String strRate = ""; boolean bUpdateRate = false; + if (tagRate >= 0) { + strRate = String.valueOf(tagRate); + bUpdateRate = true; + } else { + if (System.currentTimeMillis() - rateTimeMillis > 1500) { + strRate = "___"; + bUpdateRate = true; + } + } + if (bUpdateRate) { + rfidRateView.setText("Rate:" + strRate); + rateTimeMillis = System.currentTimeMillis(); + } + } + myHandler.postDelayed(runnableSimpleInentory, 200); + } else { + bRunningInventory = false; + button.setText("Start"); buttonShow.setVisibility(View.VISIBLE); + } + } + }; + + void inventoryHandler_tag() { + double rssi = 0; + int phase = -1, chidx = -1, port = -1; + int total = 0; + + while (uplinkPacketList.size() != 0) { + RfidReaderChipData.Rx000pkgData uplinkPacket = uplinkPacketList.get(0); + uplinkPacketList.remove(0); + RfidReaderChipData.Rx000pkgData tagData = uplinkPacket; + + boolean match = false; + total++; + rssi = uplinkPacket.decodedRssi; + phase = uplinkPacket.decodedPhase; + chidx = uplinkPacket.decodedChidx; + port = uplinkPacket.decodedPort; + + ReaderDevice deviceTag = null; + int iMatchItem = -1; + if (true) { + int index = Collections.binarySearch(MainActivity.sharedObjects.tagsIndexList, new SharedObjects.TagsIndex(MainActivity.csLibrary4A.byteArrayToString(tagData.decodedEpc), 0)); + if (index >= 0) { + iMatchItem = MainActivity.sharedObjects.tagsIndexList.size() - 1 - MainActivity.sharedObjects.tagsIndexList.get(index).getPosition(); + } + } + if (iMatchItem >= 0) { + deviceTag = MainActivity.sharedObjects.tagsList.get(iMatchItem); + int count = deviceTag.getCount(); + count++; + deviceTag.setCount(count); + deviceTag.setRssi(rssi); + deviceTag.setPhase(phase); + deviceTag.setChannel(chidx); + deviceTag.setPort(port); + MainActivity.sharedObjects.tagsList.set(iMatchItem, deviceTag); + match = true; + } + if (match == false) { + deviceTag = new ReaderDevice("", MainActivity.csLibrary4A.byteArrayToString(uplinkPacket.decodedEpc), false, null, + MainActivity.csLibrary4A.byteArrayToString(uplinkPacket.decodedPc), + null, + (uplinkPacket.decodedCrc != null ? MainActivity.csLibrary4A.byteArrayToString(uplinkPacket.decodedCrc) : null), + null, null, 0, 0, null, 0, 0,null, null, null, null, 1, + rssi, phase, chidx, port, + 0, 0, 0, 0, 0, 0, null, 0); + if (bAdd2End) MainActivity.sharedObjects.tagsList.add(deviceTag); + else MainActivity.sharedObjects.tagsList.add(0, deviceTag); + SharedObjects.TagsIndex tagsIndex = new SharedObjects.TagsIndex(MainActivity.csLibrary4A.byteArrayToString(uplinkPacket.decodedEpc), MainActivity.sharedObjects.tagsList.size() - 1); + MainActivity.sharedObjects.tagsIndexList.add(tagsIndex); + Collections.sort(MainActivity.sharedObjects.tagsIndexList); + } + } + MainActivity.csLibrary4A.appendToLog("readerListAdapter is " + (readerListAdapter != null ? "valid" : "null")); + if (readerListAdapter != null) readerListAdapter.notifyDataSetChanged(); + rfidYieldView.setText("Unique:" + MainActivity.sharedObjects.tagsList.size() + "\nTotal:" + total); + } + + Runnable runnableStartBeep = new Runnable() { + @Override + public void run() { + //if (MainActivity.isInventoryRfidRequestNewSound()) MainActivity.sharedObjects.playerN.start(); //playerN.setVolume(300, 300); + //else + MainActivity.sharedObjects.playerO.start(); + } + }; + + void startInventoryTask() { + MainActivity.csLibrary4A.appendToLog("startInventoryTask"); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + MainActivity.csLibrary4A.startOperation(RfidReaderChipData.OperationTypes.TAG_INVENTORY_COMPACT); + } + + private final Runnable runnableCheckReady = new Runnable() { + @Override + public void run() { + if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) { + button.setEnabled(false); + button.setText("Please wait"); + MainActivity.csLibrary4A.setNotificationListener(null); + mHandler.postDelayed(runnableCheckReady, 500); + } else { + button.setText("Start"); + button.setEnabled(true); + setNotificationListener(); + } + } + }; +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_KILOWAY; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class KilowayFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Scan", "Geiger"}; //, "Access"}; + int iTargetOld, iSessionOld; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment = (InventoryRfidiMultiFragment) adapter.getItem(0); + if (item.getItemId() == R.id.menuAction_clear) { + fragment.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_kiloway); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, InventoryRfidiMultiFragment.newInstance(true, TAG_KILOWAY, "E281D")); + adapter.setFragment(1, new InventoryRfidSearchFragment(true)); + adapter.setFragment(2, new AccessKilowayFragment(false)); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + + iTargetOld = MainActivity.csLibrary4A.getQueryTarget(); + iSessionOld = MainActivity.csLibrary4A.getQuerySession(); + MainActivity.csLibrary4A.setBasicCurrentLinkProfile(); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + MainActivity.csLibrary4A.setTagGroup(MainActivity.csLibrary4A.getQuerySelect(), iSessionOld, iTargetOld); + //MainActivity.mCs108Library4a.macWrite(0x203, 0); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public KilowayFragment() { + super("LedTagFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_LONGJING; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class LongjingFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Scan", "Geiger"}; //"Access", + int iTargetOld, iSessionOld; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment1 = (InventoryRfidiMultiFragment) adapter.getItem(0); + if (item.getItemId() == R.id.menuAction_clear) { + fragment1.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment1.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment1.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment1.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment1.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_longjing); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, InventoryRfidiMultiFragment.newInstance(true, TAG_LONGJING, "E201E")); + adapter.setFragment(1, new InventoryRfidSearchFragment(true)); + adapter.setFragment(2, new AccessKilowayFragment(true)); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + + iTargetOld = MainActivity.csLibrary4A.getQueryTarget(); + iSessionOld = MainActivity.csLibrary4A.getQuerySession(); + MainActivity.csLibrary4A.setBasicCurrentLinkProfile(); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + MainActivity.csLibrary4A.setTagGroup(MainActivity.csLibrary4A.getQuerySelect(), iSessionOld, iTargetOld); + //MainActivity.mCs108Library4a.macWrite(0x203, 0); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public LongjingFragment() { + super("LedTagFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; + +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public class MicronFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = { "Scan/Select", "Read" }; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment = (InventoryRfidiMultiFragment) adapter.fragment0; + if (item.getItemId() == R.id.menuAction_clear) { + fragment.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_emMicro); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, InventoryRfidiMultiFragment.newInstance(true, null, "")); + adapter.setFragment(1, AccessMicronFragment.newInstance(false)); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + + MainActivity.csLibrary4A.setBasicCurrentLinkProfile(); + } + + @Override + public void onPause() { + if (adapter.fragment0 != null) adapter.fragment0.onPause(); + if (adapter.fragment1 != null) adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + if (adapter.fragment0 != null) adapter.fragment0.onStop(); + if (adapter.fragment1 != null) adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + if (adapter.fragment0 != null) adapter.fragment0.onDestroyView(); + if (adapter.fragment1 != null) adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + if (adapter.fragment0 != null) adapter.fragment0.onDestroy(); + if (adapter.fragment1 != null) adapter.fragment1.onDestroy(); + if (MainActivity.selectFor != -1) { + MainActivity.csLibrary4A.setSelectCriteriaDisable(-1); + MainActivity.selectFor = -1; + } + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + @Override + public void onDetach() { + if (adapter.fragment0 != null) adapter.fragment0.onDetach(); + if (adapter.fragment1 != null) adapter.fragment1.onDetach(); + super.onDetach(); + } + + public MicronFragment() { + super("MicronFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.os.Handler; +import android.text.InputFilter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.Spinner; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SettingTask; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class SettingAdminFragment extends CommonFragment { + private CheckBox checkBoxTriggerReporting, checkBoxInventoryBeep, checkBoxInventoryVibrate, checkBoxSaveFileEnable, checkBoxSaveCloudEnable, checkBoxSaveNewCloudEnable, checkBoxSaveAllCloudEnable, checkBoxDebugEnable, checkBoxForegroundService; + private CheckBox checkBoxCsvColumnResBank, checkBoxCsvColumnEpcBank, checkBoxCsvColumnTidBank, checkBoxCsvColumnUserBank, checkBoxCsvColumnPhase, checkBoxCsvColumnChannel, checkBoxCsvColumnTime, checkBoxCsvColumnTimeZone, checkBoxCsvColumnLocation, checkBoxCsvColumnDirection, checkBoxCsvColumnOthers; + private EditText editTextDeviceName, editTextCycleDelay, editTextTriggerReportingCount, editTextBeepCount, editTextVibrateTime, editTextVibrateWindow, editTextServer, editTextServerTimeout, editTextServerMqtt, editTextTopicMqtt, editTextForegroundDupElim, editTextServerImpinj, editTextServerImpinjName, editTextServerImpinjPasword; + private RadioButton radioButtonCloudSaveNone, radioButtonCloudSaveHttp, radioButtonCloudSaveMqtt; + private TextView textViewReaderModel; + private Spinner spinnerQueryBattery, spinnerQueryRssi, spinnerQueryVibrateMode, spinnerSavingFormat; + private Button buttonCSLServer, button; + + final boolean sameCheck = true; + Handler mHandler = new Handler(); + + int batteryDisplaySelect = -1; + int rssiDisplaySelect = -1; + int vibrateModeSelect = -1; + int savingFormatSelect = -1; + int csvColumnSelect = -1; + String deviceName = ""; + long cycleDelay = -1; long cycleDelayMin = 0; long cycleDelayMax = 2000; + int iBeepCount = -1; int iBeepCountMin = 1; int iBeepCountMax = 100; + short sTriggerCount = -1, sTriggerCountMin = 1, sTriggerCountMax = 100; + int iVibrateTime = -1; int iVibrateTimeMin = 1; int iVibrateTimeMax = 999; + int iVibrateWindow = -1; int iVibrateWindowMin = 1; int iVibrateWindowMax = 4; + boolean triggerReporting, inventoryBeep, inventoryVibrate, saveFileEnable, saveCloudEnable, saveNewCloudEnable, saveAllCloudEnable, debugEnable, foregroundServiceEnable; + String serverName, serverMqtt, topicMqtt, serverImpinj, serverImpinjName, serverImpinjPasword; + int buttonCloudSave = -1, iForegroundDupElimNew = -1; + int iServerTimeout = -1; int iServerTimeoutMin = 3; int iServerTimeoutMax = 9; + + private SettingTask settingTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_settings_admin, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + textViewReaderModel = (TextView) getActivity().findViewById(R.id.settingAdminReaderModel); + editTextDeviceName = (EditText) getActivity().findViewById(R.id.settingAdminDeviceName); + editTextDeviceName.setBackgroundResource(R.drawable.my_edittext_background); + editTextDeviceName.setHint("Name Pattern"); + InputFilter[] FilterArray = new InputFilter[1]; + FilterArray[0] = new InputFilter.LengthFilter(20); + editTextDeviceName.setFilters(FilterArray); + + spinnerQueryBattery = (Spinner) getActivity().findViewById(R.id.settingAdminBattery); + { + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.admin_battery_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerQueryBattery.setAdapter(targetAdapter); + } + + spinnerQueryRssi = (Spinner) getActivity().findViewById(R.id.settingAdminRssi); + { + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.admin_rssi_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerQueryRssi.setAdapter(targetAdapter); + } + + spinnerQueryVibrateMode = (Spinner) getActivity().findViewById(R.id.settingAdminVibrateMode); + { + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.admin_vibratemode_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerQueryVibrateMode.setAdapter(targetAdapter); + } + + if (MainActivity.csLibrary4A.get98XX() == 2) { + LinearLayout linearLayout = (LinearLayout) getActivity().findViewById(R.id.settingAdminCycleDelayRow); + linearLayout.setVisibility(View.GONE); + spinnerQueryVibrateMode.setEnabled(false); + } + + spinnerSavingFormat = (Spinner) getActivity().findViewById(R.id.settingAdminSavingFormat); + { + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.admin_savingformat_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerSavingFormat.setAdapter(targetAdapter); + spinnerSavingFormat.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + LinearLayout linearLayout = (LinearLayout) getActivity().findViewById(R.id.settingAdminCSVColumnSelectLayout); + switch (i) { + case 1: + linearLayout.setVisibility(View.VISIBLE); + break; + default: + linearLayout.setVisibility(View.GONE); + break; + } + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); + } + + checkBoxCsvColumnResBank = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnResBank); + checkBoxCsvColumnEpcBank = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnEpcBank); + checkBoxCsvColumnTidBank = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnTidBank); + checkBoxCsvColumnUserBank = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnUserBank); + checkBoxCsvColumnPhase = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnPhase); + checkBoxCsvColumnChannel = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnChannel); + checkBoxCsvColumnTime = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnTime); + checkBoxCsvColumnTimeZone = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnTimeZone); + checkBoxCsvColumnLocation = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnLocation); + checkBoxCsvColumnDirection = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnDirection); + checkBoxCsvColumnOthers = (CheckBox) getActivity().findViewById(R.id.settingAdminCSVColumnOthers); + + TextView textViewAdminCycleDelayLabel = (TextView) getActivity().findViewById(R.id.settingAdminCycleDelayLabel); + String stringAdminCycleDelayLabel = textViewAdminCycleDelayLabel.getText().toString(); + stringAdminCycleDelayLabel += "(" + String.valueOf(cycleDelayMin) + "-" + String.valueOf(cycleDelayMax) + "ms)"; + textViewAdminCycleDelayLabel.setText(stringAdminCycleDelayLabel); + editTextCycleDelay = (EditText) getActivity().findViewById(R.id.settingAdminCycleDelay); + + TextView textViewAdminTriggerReportingCountLabel = (TextView) getActivity().findViewById(R.id.settingAdminTriggerReportingCountLabel); + String stringAdminTriggeringReportingCountLabel = textViewAdminTriggerReportingCountLabel.getText().toString(); + stringAdminTriggeringReportingCountLabel += "(" + String.valueOf(sTriggerCountMin) + "-" + String.valueOf(sTriggerCountMax) + ") sec"; + textViewAdminTriggerReportingCountLabel.setText(stringAdminTriggeringReportingCountLabel); + editTextTriggerReportingCount = (EditText) getActivity().findViewById(R.id.settingAdminTriggerReportingCount); + + TextView textViewAdminBeepCountLabel = (TextView) getActivity().findViewById(R.id.settingAdminBeepCountLabel); + String stringAdminBeepCountLabel = textViewAdminBeepCountLabel.getText().toString(); + stringAdminBeepCountLabel += "(" + String.valueOf(iBeepCountMin) + "-" + String.valueOf(iBeepCountMax) + ")"; + textViewAdminBeepCountLabel.setText(stringAdminBeepCountLabel); + editTextBeepCount = (EditText) getActivity().findViewById(R.id.settingAdminBeepCount); + + TextView textViewAdminVibrateTimeLabel = (TextView) getActivity().findViewById(R.id.settingAdminVibrateTimeLabel); + String stringAdminVibrateTimeLabel = textViewAdminVibrateTimeLabel.getText().toString(); + stringAdminVibrateTimeLabel += "(" + String.valueOf(iVibrateTimeMin) + "-" + String.valueOf(iVibrateTimeMax) + "ms)"; + textViewAdminVibrateTimeLabel.setText(stringAdminVibrateTimeLabel); + editTextVibrateTime = (EditText) getActivity().findViewById(R.id.settingAdminVibrateTime); + + TextView textViewAdminVibrateWindowLabel = (TextView) getActivity().findViewById(R.id.settingAdminVibrateWindowLabel); + String stringAdminVibrateWindowLabel = textViewAdminVibrateWindowLabel.getText().toString(); + stringAdminVibrateWindowLabel += "(" + String.valueOf(iVibrateWindowMin) + "-" + String.valueOf(iVibrateWindowMax) + "sec)"; + textViewAdminVibrateWindowLabel.setText(stringAdminVibrateWindowLabel); + editTextVibrateWindow = (EditText) getActivity().findViewById(R.id.settingAdminVibrateWindow); + + checkBoxTriggerReporting = (CheckBox) getActivity().findViewById(R.id.settingAdminTriggerReporting); + checkBoxInventoryBeep = (CheckBox) getActivity().findViewById(R.id.settingAdminInventoryBeep); + checkBoxInventoryVibrate = (CheckBox) getActivity().findViewById(R.id.settingAdminInventoryVibrate); + checkBoxSaveFileEnable = (CheckBox) getActivity().findViewById(R.id.settingAdminToFileEnable); + checkBoxSaveCloudEnable = (CheckBox) getActivity().findViewById(R.id.settingAdminToCloudEnable); + checkBoxSaveNewCloudEnable = (CheckBox) getActivity().findViewById(R.id.settingAdminNewToCloudEnable); + checkBoxSaveAllCloudEnable = (CheckBox) getActivity().findViewById(R.id.settingAdminAllToCloudEnable); + editTextServer = (EditText) getActivity().findViewById(R.id.settingAdminServer); + editTextServer.setHint("Cloud Address Pattern"); + editTextServerMqtt = (EditText) getActivity().findViewById(R.id.settingAdminMqttServer); + editTextServerMqtt.setHint("IP Address Pattern"); + editTextTopicMqtt = (EditText) getActivity().findViewById(R.id.settingAdminTopicMqtt); + editTextForegroundDupElim = (EditText) getActivity().findViewById(R.id.settingAdminDupElimDelay); + radioButtonCloudSaveNone = (RadioButton) getActivity().findViewById(R.id.settingAdminCloudSaveNone); + radioButtonCloudSaveHttp = (RadioButton) getActivity().findViewById(R.id.settingAdminCloudSaveHttp); + radioButtonCloudSaveMqtt = (RadioButton) getActivity().findViewById(R.id.settingAdminCloudSaveMqtt); + editTextServerImpinj = (EditText) getActivity().findViewById(R.id.settingAdminServerImpinj); + editTextServerImpinjName = (EditText) getActivity().findViewById(R.id.settingAdminServerImpinjName); + editTextServerImpinjPasword = (EditText) getActivity().findViewById(R.id.settingAdminServerImpinjPassword); + + TextView textViewAdminServerConnectTimeoutLabel = (TextView) getActivity().findViewById(R.id.settingAdminServerConnectTimeoutLabel); + String stringAdminServerConnectTimeoutLabel = textViewAdminServerConnectTimeoutLabel.getText().toString(); + stringAdminServerConnectTimeoutLabel += "(" + String.valueOf(iServerTimeoutMin) + "-" + String.valueOf(iServerTimeoutMax) + "sec)"; + textViewAdminServerConnectTimeoutLabel.setText(stringAdminServerConnectTimeoutLabel); + editTextServerTimeout = (EditText) getActivity().findViewById(R.id.settingAdminServerConnectTimeout); + + buttonCSLServer = (Button) getActivity().findViewById(R.id.settingAdminCSLServer); + buttonCSLServer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String serverLocation = "https://" + "democloud.convergence.com.hk:" + "29090/WebServiceRESTs/1.0/req/" + "create-update-delete/update-entity/" + "tagdata"; + //String serverLocation = "https://" + "www.convergence.com.hk:" + "29090/WebServiceRESTs/1.0/req/" + "create-update-delete/update-entity/" + "tagdata"; + //String serverLocation = "http://ptsv2.com/t/10i1t-1519143332/post"; + editTextServer.setText(serverLocation); + //String serverMqttLocation = "192.168.25.182"; + //editTextServerMqtt.setText(serverMqttLocation); + //editTextTopicMqtt.setText("test/topic"); + } + }); + + Button buttonReset = (Button) getActivity().findViewById(R.id.settingAdminBarcodeResetButton); + buttonReset.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isBarcodeFailure()) { + Toast.makeText(MainActivity.mContext, "Barcode is disabled", Toast.LENGTH_SHORT).show(); + return; + } else { + MainActivity.csLibrary4A.setBarcodeOn(true); + MainActivity.csLibrary4A.barcodeSendCommandConinuous(); + MainActivity.csLibrary4A.setBarcodeOn(false); + MainActivity.csLibrary4A.saveSetting2File(); + Toast.makeText(MainActivity.mContext, R.string.toast_saved, Toast.LENGTH_SHORT).show(); + } + } + }); + + Button buttonReset2 = (Button) getActivity().findViewById(R.id.settingAdminBarcodeResetButtonT); + buttonReset2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isBarcodeFailure()) { + Toast.makeText(MainActivity.mContext, "Barcode is disabled", Toast.LENGTH_SHORT).show(); + return; + } else { + MainActivity.csLibrary4A.setBarcodeOn(true); + MainActivity.csLibrary4A.barcodeSendCommandTrigger(); + MainActivity.csLibrary4A.saveSetting2File(); + Toast.makeText(MainActivity.mContext, R.string.toast_saved, Toast.LENGTH_SHORT).show(); + } + } + }); + + Button buttonReset3 = (Button) getActivity().findViewById(R.id.settingAdminBarcodeResetButtonF); + buttonReset3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isBarcodeFailure()) { + Toast.makeText(MainActivity.mContext, "Barcode is disabled", Toast.LENGTH_SHORT).show(); + return; + } else { + MainActivity.csLibrary4A.setBarcodeOn(true); + MainActivity.csLibrary4A.barcodeSendCommandSetPreSuffix(); + Toast.makeText(MainActivity.mContext, R.string.toast_saved, Toast.LENGTH_SHORT).show(); + } + } + }); + + Button buttonReset4 = (Button) getActivity().findViewById(R.id.settingAdminBarcodeResetButtonR); + buttonReset4.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isBarcodeFailure()) { + Toast.makeText(MainActivity.mContext, "Barcode is disabled", Toast.LENGTH_SHORT).show(); + return; + } else { + MainActivity.csLibrary4A.setBarcodeOn(true); + MainActivity.csLibrary4A.barcodeSendCommandResetPreSuffix(); + Toast.makeText(MainActivity.mContext, R.string.toast_saved, Toast.LENGTH_SHORT).show(); + } + } + }); + + Button buttonReset1 = (Button) getActivity().findViewById(R.id.settingAdminReaderResetButton); + buttonReset1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (false && MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } else { + MainActivity.csLibrary4A.setReaderDefault(); + MainActivity.csLibrary4A.saveSetting2File(); + Toast.makeText(MainActivity.mContext, R.string.toast_saved, Toast.LENGTH_SHORT).show(); + + mHandler.post(updateRunnable); + CustomPopupWindow customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + String stringInfo = "Please power cycle reader and also this application"; + customPopupWindow.popupStart(stringInfo, false); + } + } + }); + + button = (Button) getActivity().findViewById(R.id.settingSaveButtonAdmin); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean validValue = false; + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (false && MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } else if (updateRunning) { + Toast.makeText(MainActivity.mContext, R.string.toast_not_ready, Toast.LENGTH_SHORT).show(); + return; + } else { + try { + deviceName = editTextDeviceName.getText().toString(); + batteryDisplaySelect = spinnerQueryBattery.getSelectedItemPosition(); + rssiDisplaySelect = spinnerQueryRssi.getSelectedItemPosition(); + vibrateModeSelect = spinnerQueryVibrateMode.getSelectedItemPosition(); + savingFormatSelect = spinnerSavingFormat.getSelectedItemPosition(); + { + csvColumnSelect = 0; + if (checkBoxCsvColumnResBank.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.RESERVE_BANK.ordinal()); + if (checkBoxCsvColumnEpcBank.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.EPC_BANK.ordinal()); + if (checkBoxCsvColumnTidBank.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.TID_BANK.ordinal()); + if (checkBoxCsvColumnUserBank.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.USER_BANK.ordinal()); + if (checkBoxCsvColumnPhase.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.PHASE.ordinal()); + if (checkBoxCsvColumnChannel.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.CHANNEL.ordinal()); + if (checkBoxCsvColumnTime.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.TIME.ordinal()); + if (checkBoxCsvColumnTimeZone.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.TIMEZONE.ordinal()); + if (checkBoxCsvColumnLocation.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.LOCATION.ordinal()); + if (checkBoxCsvColumnDirection.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.DIRECTION.ordinal()); + if (checkBoxCsvColumnOthers.isChecked()) csvColumnSelect |= (0x01 << RfidReaderChipData.CsvColumn.OTHERS.ordinal()); + } + if (editTextCycleDelay != null) cycleDelay = Long.parseLong(editTextCycleDelay.getText().toString()); + if (editTextTriggerReportingCount != null) sTriggerCount = Short.parseShort(editTextTriggerReportingCount.getText().toString()); + if (editTextBeepCount != null) iBeepCount = Integer.parseInt(editTextBeepCount.getText().toString()); + if (editTextVibrateTime != null) iVibrateTime = Integer.parseInt(editTextVibrateTime.getText().toString()); + if (editTextVibrateWindow != null) iVibrateWindow = Integer.parseInt(editTextVibrateWindow.getText().toString()); + triggerReporting = checkBoxTriggerReporting.isChecked(); + inventoryBeep = checkBoxInventoryBeep.isChecked(); + inventoryVibrate = checkBoxInventoryVibrate.isChecked(); + saveFileEnable = checkBoxSaveFileEnable.isChecked(); + saveCloudEnable = checkBoxSaveCloudEnable.isChecked(); + saveNewCloudEnable = checkBoxSaveNewCloudEnable.isChecked(); + saveAllCloudEnable = checkBoxSaveAllCloudEnable.isChecked(); + serverName = editTextServer.getText().toString(); + iServerTimeout = Integer.parseInt(editTextServerTimeout.getText().toString()); + serverMqtt = editTextServerMqtt.getText().toString(); + topicMqtt = editTextTopicMqtt.getText().toString(); + iForegroundDupElimNew = Integer.parseInt(editTextForegroundDupElim.getText().toString()); + buttonCloudSave = 0; + if (radioButtonCloudSaveNone.isChecked()) buttonCloudSave = 0; + else if (radioButtonCloudSaveHttp.isChecked()) buttonCloudSave = 1; + else if (radioButtonCloudSaveMqtt.isChecked()) buttonCloudSave = 2; + serverImpinj = editTextServerImpinj.getText().toString(); + serverImpinjName = editTextServerImpinjName.getText().toString(); + serverImpinjPasword = editTextServerImpinjPasword.getText().toString(); + debugEnable = checkBoxDebugEnable.isChecked(); + foregroundServiceEnable = checkBoxForegroundService.isChecked(); + settingUpdate(); + } catch (Exception ex) { + Toast.makeText(MainActivity.mContext, R.string.toast_invalid_range, Toast.LENGTH_SHORT).show(); + } + } + } + }); + + checkBoxDebugEnable = (CheckBox) getActivity().findViewById(R.id.settingAdminDebugEnable); + checkBoxForegroundService = (CheckBox) getActivity().findViewById(R.id.settingAdminForegroundEnable); + + if (!MainActivity.foregroundServiceEnable) { + LinearLayout linearLayout = (LinearLayout) getActivity().findViewById(R.id.settingAdminForegroundLayout); + linearLayout.setVisibility(View.GONE); + } + if (sameCheck == false) MainActivity.csLibrary4A.setSameCheck(false); + mHandler.post(updateRunnable); + } + + @Override + public void onDestroy() { + if (settingTask != null) settingTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + mHandler.removeCallbacks(updateRunnable); + super.onDestroy(); + } + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(isVisibleToUser) { + checkBoxTriggerReporting.setChecked(MainActivity.csLibrary4A.getTriggerReporting()); + checkBoxInventoryBeep.setChecked(MainActivity.csLibrary4A.getInventoryBeep()); + checkBoxInventoryVibrate.setChecked(MainActivity.csLibrary4A.getInventoryVibrate()); + checkBoxSaveFileEnable.setChecked(MainActivity.csLibrary4A.getSaveFileEnable()); + checkBoxSaveCloudEnable.setChecked(MainActivity.csLibrary4A.getSaveCloudEnable()); + checkBoxSaveNewCloudEnable.setChecked(MainActivity.csLibrary4A.getSaveNewCloudEnable()); + checkBoxSaveAllCloudEnable.setChecked(MainActivity.csLibrary4A.getSaveAllCloudEnable()); + checkBoxDebugEnable.setChecked(MainActivity.csLibrary4A.getUserDebugEnable()); + checkBoxForegroundService.setChecked(MainActivity.csLibrary4A.getForegroundServiceEnable()); + } + } + + public SettingAdminFragment() { + super("SettingAdminFragment"); + } + + boolean updateRunning = false; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + int iValue; + long lValue; + boolean updating = false; + + updateRunning = true; + spinnerQueryBattery.setSelection(MainActivity.csLibrary4A.getBatteryDisplaySetting()); + spinnerQueryRssi.setSelection(MainActivity.csLibrary4A.getRssiDisplaySetting()); + spinnerQueryVibrateMode.setSelection(MainActivity.csLibrary4A.getVibrateModeSetting()); + spinnerSavingFormat.setSelection(MainActivity.csLibrary4A.getSavingFormatSetting()); + { + int csvColumnSelect = MainActivity.csLibrary4A.getCsvColumnSelectSetting(); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.RESERVE_BANK.ordinal())) != 0) checkBoxCsvColumnResBank.setChecked(true); else checkBoxCsvColumnResBank.setChecked(false); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.EPC_BANK.ordinal())) != 0) checkBoxCsvColumnEpcBank.setChecked(true); else checkBoxCsvColumnEpcBank.setChecked(false); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.TID_BANK.ordinal())) != 0) checkBoxCsvColumnTidBank.setChecked(true); else checkBoxCsvColumnTidBank.setChecked(false); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.USER_BANK.ordinal())) != 0) checkBoxCsvColumnUserBank.setChecked(true); else checkBoxCsvColumnUserBank.setChecked(false); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.PHASE.ordinal())) != 0) checkBoxCsvColumnPhase.setChecked(true); else checkBoxCsvColumnPhase.setChecked(false); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.CHANNEL.ordinal())) != 0) checkBoxCsvColumnChannel.setChecked(true); else checkBoxCsvColumnChannel.setChecked(false); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.TIME.ordinal())) != 0) checkBoxCsvColumnTime.setChecked(true); else checkBoxCsvColumnTime.setChecked(false); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.TIMEZONE.ordinal())) != 0) checkBoxCsvColumnTimeZone.setChecked(true); else checkBoxCsvColumnTimeZone.setChecked(false); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.LOCATION.ordinal())) != 0) checkBoxCsvColumnLocation.setChecked(true); else checkBoxCsvColumnLocation.setChecked(false); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.DIRECTION.ordinal())) != 0) checkBoxCsvColumnDirection.setChecked(true); else checkBoxCsvColumnDirection.setChecked(false); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.OTHERS.ordinal())) != 0) checkBoxCsvColumnOthers.setChecked(true); else checkBoxCsvColumnOthers.setChecked(false); + } + if (editTextCycleDelay != null) editTextCycleDelay.setText(String.valueOf(MainActivity.csLibrary4A.getCycleDelay())); + if (editTextTriggerReportingCount != null) { + int triggerReportingCount = MainActivity.csLibrary4A.getTriggerReportingCount(); + if (triggerReportingCount != MainActivity.csLibrary4A.iNO_SUCH_SETTING) { + TableRow tableRow = (TableRow) getActivity().findViewById(R.id.settingAdminTriggerReportingRow); + tableRow.setVisibility(View.VISIBLE); + } + editTextTriggerReportingCount.setText(String.valueOf(triggerReportingCount)); + } + if (editTextBeepCount != null) editTextBeepCount.setText(String.valueOf(MainActivity.csLibrary4A.getBeepCount())); + if (editTextVibrateTime != null) editTextVibrateTime.setText(String.valueOf(MainActivity.csLibrary4A.getVibrateTime())); + if (editTextVibrateWindow != null) editTextVibrateWindow.setText(String.valueOf(MainActivity.csLibrary4A.getVibrateWindow())); + editTextServer.setText(MainActivity.csLibrary4A.getServerLocation()); + editTextServerTimeout.setText(String.valueOf(MainActivity.csLibrary4A.getServerTimeout())); + editTextServerMqtt.setText(MainActivity.csLibrary4A.getServerMqttLocation()); + editTextTopicMqtt.setText(MainActivity.csLibrary4A.getTopicMqtt()); + editTextForegroundDupElim.setText(String.valueOf(MainActivity.csLibrary4A.getForegroundDupElim())); + int inventoryCloudSave = MainActivity.csLibrary4A.getInventoryCloudSave(); + if (inventoryCloudSave == 0) radioButtonCloudSaveNone.setChecked(true); + else if (inventoryCloudSave == 1) radioButtonCloudSaveHttp.setChecked(true); + else if (inventoryCloudSave == 2) radioButtonCloudSaveMqtt.setChecked(true); + editTextServerImpinj.setText(MainActivity.csLibrary4A.getServerImpinjLocation()); + editTextServerImpinjName.setText(MainActivity.csLibrary4A.getServerImpinjName()); + editTextServerImpinjPasword.setText(MainActivity.csLibrary4A.getServerImpinjPassword()); + if (updating == false) { + String name = MainActivity.csLibrary4A.getBluetoothICFirmwareName(); + if (name == null) { + MainActivity.csLibrary4A.appendToLog("updating 1"); + updating = true; + } + else if (name.length() == 0) { + MainActivity.csLibrary4A.appendToLog("updating 2"); + updating = true; + } + else editTextDeviceName.setText(name); + } + if (updating == false) { + String name = MainActivity.csLibrary4A.getModelNumber(); + if (name == null) { + MainActivity.csLibrary4A.appendToLog("updating 3"); + updating = true; + } + else if (name.length() == 0) { + MainActivity.csLibrary4A.appendToLog("updating 4"); + updating = true; + } + else textViewReaderModel.setText(name); + } + if (updating) { + mHandler.postDelayed(updateRunnable, 1000); + } else updateRunning = false; + } + }; + + void settingUpdate() { + boolean sameSetting = true; + boolean invalidRequest = false; + + if (invalidRequest == false && (MainActivity.csLibrary4A.getBluetoothICFirmwareName().matches(deviceName) == false || sameCheck == false)) { + sameSetting = false; + if (MainActivity.csLibrary4A.setBluetoothICFirmwareName(deviceName) == false) + invalidRequest = true; + } + if (invalidRequest == false && (MainActivity.csLibrary4A.getBatteryDisplaySetting() != batteryDisplaySelect || sameCheck == false)) { + sameSetting = false; + if (MainActivity.csLibrary4A.setBatteryDisplaySetting(batteryDisplaySelect) == false) + invalidRequest = true; + } + if (invalidRequest == false && (MainActivity.csLibrary4A.getRssiDisplaySetting() != rssiDisplaySelect || sameCheck == false)) { + sameSetting = false; + if (MainActivity.csLibrary4A.setRssiDisplaySetting(rssiDisplaySelect) == false) + invalidRequest = true; + } + if (invalidRequest == false && (MainActivity.csLibrary4A.getVibrateModeSetting() != vibrateModeSelect || sameCheck == false)) { + sameSetting = false; + if (MainActivity.csLibrary4A.setVibrateModeSetting(vibrateModeSelect) == false) + invalidRequest = true; + } + if (invalidRequest == false && (MainActivity.csLibrary4A.getSavingFormatSetting() != savingFormatSelect || sameCheck == false)) { + sameSetting = false; + if (MainActivity.csLibrary4A.setSavingFormatSetting(savingFormatSelect) == false) + invalidRequest = true; + } + if (invalidRequest == false && (MainActivity.csLibrary4A.getCsvColumnSelectSetting() != csvColumnSelect || sameCheck == false)) { + sameSetting = false; + if (MainActivity.csLibrary4A.setCsvColumnSelectSetting(csvColumnSelect) == false) + invalidRequest = true; + } + if (invalidRequest == false && editTextCycleDelay != null) { + if (MainActivity.csLibrary4A.getCycleDelay() != cycleDelay || sameCheck == false) { + sameSetting = false; + if (cycleDelay < cycleDelayMin || cycleDelay > cycleDelayMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setCycleDelay(cycleDelay) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextTriggerReportingCount != null) { + if (MainActivity.csLibrary4A.getTriggerReportingCount() != sTriggerCount || sameCheck == false) { + sameSetting = false; + if (sTriggerCount < sTriggerCountMin || sTriggerCount > sTriggerCountMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setTriggerReportingCount(sTriggerCount) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextBeepCount != null) { + if (MainActivity.csLibrary4A.getBeepCount() != iBeepCount || sameCheck == false) { + sameSetting = false; + if (iBeepCount < iBeepCountMin || iBeepCount > iBeepCountMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setBeepCount(iBeepCount) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextVibrateTime != null) { + if (MainActivity.csLibrary4A.getVibrateTime() != iVibrateTime || sameCheck == false) { + sameSetting = false; + if (iVibrateTime < iVibrateTimeMin || iVibrateTime > iVibrateTimeMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setVibrateTime(iVibrateTime) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextVibrateWindow != null) { + if (MainActivity.csLibrary4A.getVibrateWindow() != iVibrateWindow || sameCheck == false) { + sameSetting = false; + if (iVibrateWindow < iVibrateWindowMin || iVibrateWindow > iVibrateWindowMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setVibrateWindow(iVibrateWindow) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && checkBoxInventoryVibrate != null) { + MainActivity.csLibrary4A.appendToLog("getInventoryVibrate = " + MainActivity.csLibrary4A.getInventoryVibrate() + ", inventoryVibrate = " + inventoryVibrate); + if (MainActivity.csLibrary4A.getInventoryVibrate() != inventoryVibrate || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setInventoryVibrate(inventoryVibrate) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && checkBoxTriggerReporting != null) { + if (MainActivity.csLibrary4A.getTriggerReporting() != triggerReporting || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setTriggerReporting(triggerReporting) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && checkBoxInventoryBeep != null) { + MainActivity.csLibrary4A.appendToLog("getInventoryBeep = " + MainActivity.csLibrary4A.getInventoryBeep() + ", inventoryBeep = " + inventoryBeep); + if (MainActivity.csLibrary4A.getInventoryBeep() != inventoryBeep || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setInventoryBeep(inventoryBeep) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && checkBoxSaveFileEnable != null) { + MainActivity.csLibrary4A.appendToLog("getSaveFileEnable = " + MainActivity.csLibrary4A.getSaveFileEnable() + ", saveFileEnable = " + saveFileEnable); + if (MainActivity.csLibrary4A.getSaveFileEnable() != saveFileEnable || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setSaveFileEnable(saveFileEnable) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && checkBoxSaveCloudEnable != null) { + MainActivity.csLibrary4A.appendToLog("getSaveCloudEnable = " + MainActivity.csLibrary4A.getSaveCloudEnable() + ", saveCloudEnable = " + saveCloudEnable); + if (MainActivity.csLibrary4A.getSaveCloudEnable() != saveCloudEnable || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setSaveCloudEnable(saveCloudEnable) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && checkBoxSaveNewCloudEnable != null) { + MainActivity.csLibrary4A.appendToLog("getSaveNewCloudEnable = " + MainActivity.csLibrary4A.getSaveNewCloudEnable() + ", saveNewCloudEnable = " + saveNewCloudEnable); + if (MainActivity.csLibrary4A.getSaveNewCloudEnable() != saveNewCloudEnable || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setSaveNewCloudEnable(saveNewCloudEnable) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && checkBoxSaveAllCloudEnable != null) { + MainActivity.csLibrary4A.appendToLog("getSaveAllCloudEnable = " + MainActivity.csLibrary4A.getSaveAllCloudEnable() + ", saveAllCloudEnable = " + saveAllCloudEnable); + if (MainActivity.csLibrary4A.getSaveAllCloudEnable() != saveAllCloudEnable || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setSaveAllCloudEnable(saveAllCloudEnable) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextServer != null) { + String serverLocation = MainActivity.csLibrary4A.getServerLocation(); if (serverLocation == null) serverLocation = ""; + if (serverLocation.matches(serverName) == false || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setServerLocation(serverName) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextServerTimeout != null) { + if (MainActivity.csLibrary4A.getServerTimeout() != iServerTimeout || sameCheck == false) { + sameSetting = false; + if (iServerTimeout < iServerTimeoutMin || iServerTimeout > iServerTimeoutMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setServerTimeout(iServerTimeout) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextServerMqtt != null) { + String serverLocation = MainActivity.csLibrary4A.getServerMqttLocation(); if (serverLocation == null) serverLocation = ""; + if (serverLocation.matches(serverMqtt) == false || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setServerMqttLocation(serverMqtt) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextTopicMqtt != null) { + String topic = MainActivity.csLibrary4A.getTopicMqtt(); if (topic == null) topic = ""; + if (topic.matches(topicMqtt) == false || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setTopicMqtt(topicMqtt) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextForegroundDupElim != null) { + int iForegroundDupElim = MainActivity.csLibrary4A.getForegroundDupElim(); if (iForegroundDupElim < 0) iForegroundDupElim = 0; + if (iForegroundDupElim != iForegroundDupElimNew || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setForegroundDupElim(iForegroundDupElimNew) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && radioButtonCloudSaveNone != null && radioButtonCloudSaveHttp != null && radioButtonCloudSaveMqtt != null) { + int inventoryCloudSave = MainActivity.csLibrary4A.getInventoryCloudSave(); + if (inventoryCloudSave != buttonCloudSave || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setInventoryCloudSave(buttonCloudSave) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextServerImpinj != null) { + String string = MainActivity.csLibrary4A.getServerImpinjLocation(); if (string == null) string = ""; + MainActivity.csLibrary4A.appendToLog("old serverImpinj = " + string + ", new = " + serverImpinj); + if (string.matches(serverImpinj) == false || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setServerImpinjLocation(serverImpinj) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextServerImpinjName != null) { + String string = MainActivity.csLibrary4A.getServerImpinjName(); if (string == null) string = ""; + MainActivity.csLibrary4A.appendToLog("old serverImpinjName = " + string + ", new = " + serverImpinjName); + if (string.matches(serverImpinjName) == false || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setServerImpinjName(serverImpinjName) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && editTextServerImpinjPasword != null) { + String string = MainActivity.csLibrary4A.getServerImpinjPassword(); if (string == null) string = ""; + MainActivity.csLibrary4A.appendToLog("old serverImpinjPassword = " + string + ", new = " + serverImpinjPasword + ", matched = " + string.matches(serverImpinjPasword)); + if (string.length() != serverImpinjPasword.length() || string.matches(serverImpinjPasword) == false || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setServerImpinjPassword(serverImpinjPasword) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && checkBoxDebugEnable != null) { + MainActivity.csLibrary4A.appendToLog("getDebugEnable = " + MainActivity.csLibrary4A.getUserDebugEnable() + ", debugEnable = " + debugEnable); + if (MainActivity.csLibrary4A.getUserDebugEnable() != debugEnable || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setUserDebugEnable(debugEnable) == false) + invalidRequest = true; + } + } + if (invalidRequest == false && checkBoxForegroundService != null && MainActivity.foregroundServiceEnable) { + MainActivity.csLibrary4A.appendToLog("getForegroundServiceEnable = " + MainActivity.csLibrary4A.getForegroundServiceEnable() + ", foregroundServiceEnable = " + foregroundServiceEnable); + if (MainActivity.csLibrary4A.getForegroundServiceEnable() != foregroundServiceEnable || sameCheck == false) { + sameSetting = false; + MainActivity.csLibrary4A.appendToLog("foregroundReader108: updated 2C"); + if (MainActivity.csLibrary4A.setForegroundServiceEnable(foregroundServiceEnable) == false) + invalidRequest = true; + } + } + settingTask = new SettingTask(button, sameSetting, invalidRequest); + settingTask.execute(); + MainActivity.csLibrary4A.saveSetting2File(); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class SettingFilterFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Pre-filter", "Post-filter", "Rssi-filter"}; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_filters); + actionBar.setTitle(R.string.title_activity_filters); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, new SettingFilterPreFragment()); + adapter.setFragment(1, new SettingFilterPostFragment()); + adapter.setFragment(2, new SettingFilterRssiFragment()); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + Log.i(TAG, "tab.position is " + tab.getPosition()); + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public SettingFilterFragment() { + super("SettingFilterFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Toast; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SettingTask; + +public class SettingFilterPostFragment extends CommonFragment { + private CheckBox checkBoxEnable; + private CheckBox checkBoxType; + private EditText postFilterOffset; + private EditText filterPostMaskData; + private Button button; + + final boolean sameCheck = false; + Handler mHandler = new Handler(); + + boolean invMatchEnable; + boolean invMatchType; + int invMatchOffset = -1; + String invMatchData = null; + + private SettingTask settingTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_filterpost_content, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + checkBoxEnable = (CheckBox) getActivity().findViewById(R.id.filterPostCheckEnable); + checkBoxType = (CheckBox) getActivity().findViewById(R.id.filterPostCheckType); + postFilterOffset = (EditText) getActivity().findViewById(R.id.filterPostOffset); + filterPostMaskData = (EditText) getActivity().findViewById(R.id.filterPostMaskData); + + button = (Button) getActivity().findViewById(R.id.filterPostSaveButton); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean validValue = false; + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } else { + try { + invMatchEnable = checkBoxEnable.isChecked(); + invMatchType = checkBoxType.isChecked(); + invMatchOffset = Integer.parseInt(postFilterOffset.getText().toString()); + + settingUpdate(); + } catch (Exception ex) { + Toast.makeText(MainActivity.mContext, R.string.toast_invalid_range, Toast.LENGTH_SHORT).show(); + } + } + } + }); + + if (sameCheck == false) MainActivity.csLibrary4A.setSameCheck(false); + mHandler.post(updateRunnable); + } + + @Override + public void onDestroy() { + if (settingTask != null) settingTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + mHandler.removeCallbacks(updateRunnable); + super.onDestroy(); + } + + public SettingFilterPostFragment() { + super("SettingFilterPostFragment"); + } + + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + int iValue; + long lValue; + boolean updating = false; + + if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) updating = true; + else { + if (updating == false) { + checkBoxEnable.setChecked(MainActivity.csLibrary4A.getInvMatchEnable()); + checkBoxType.setChecked(MainActivity.csLibrary4A.getInvMatchType()); + } + if (updating == false) { + int iValue1 = MainActivity.csLibrary4A.getInvMatchOffset(); + if (iValue1 < 0) { + updating = true; + } else { + postFilterOffset.setText(String.valueOf(iValue1)); + } + } + if (updating == false && filterPostMaskData.getText().length() == 0) { + String strValue = MainActivity.csLibrary4A.getInvMatchData(); + if (strValue == null) { + updating = true; + } else { + filterPostMaskData.setText(strValue); + } + } + } + if (updating) { + mHandler.postDelayed(updateRunnable, 1000); + } + } + }; + + void settingUpdate() { + boolean dataMatched = false; + invMatchData = filterPostMaskData.getText().toString(); + String strValue = MainActivity.csLibrary4A.getInvMatchData(); + boolean sameSetting = true; + boolean invalidRequest = false; + + if (invMatchData.length() != strValue.length()) { + dataMatched = false; + } else if (invMatchData.length() == 0 && strValue.length() == 0) { + dataMatched = true; + } else dataMatched = invMatchData.matches(strValue); + if (MainActivity.csLibrary4A.getInvMatchEnable() != invMatchEnable + || MainActivity.csLibrary4A.getInvMatchType() != invMatchType + || MainActivity.csLibrary4A.getInvMatchOffset() != invMatchOffset + || dataMatched == false || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setPostMatchCriteria(invMatchEnable, invMatchType, invMatchOffset, invMatchData) == false) + invalidRequest = true; + } + settingTask = new SettingTask(button, sameSetting, invalidRequest); + settingTask.execute(); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.Toast; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SettingTask; + +public class SettingFilterPreFragment extends CommonFragment { + private EditText editTextFilterPreSelectIndex; + private CheckBox checkBoxEnable; + private Spinner targetSpinner; + private Spinner actionSpinner; + private Spinner memoryBankSpinner; + private Spinner spinnerMaskDataType; + private EditText preFilterOffset; + private EditText filterPreMaskDataHex, filterPreMaskDataBit; + private Button button; + + final boolean sameCheck = false; + Handler mHandler = new Handler(); + + int invSelectIndex = -1; + boolean invSelectEnable; + int invSelectTarget = -1; + int invSelectAction = -1; + int invSelectMaskBank = -1; + int invSelectMaskOffset = -1; + String invSelectMaskData = null; + + private SettingTask settingTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_filterpre_content, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + editTextFilterPreSelectIndex = (EditText) getActivity().findViewById(R.id.filterPreSelectxIndex); + checkBoxEnable = (CheckBox) getActivity().findViewById(R.id.filterPreCheck); + + targetSpinner = (Spinner) getActivity().findViewById(R.id.preFilterTarget); + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.filterPre_target_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + targetSpinner.setAdapter(targetAdapter); + if (false) targetSpinner.setEnabled(false); + + actionSpinner = (Spinner) getActivity().findViewById(R.id.preFilterAction); + ArrayAdapter actionAdapter; + if (true) { //MainActivity.csLibrary4A.getQuerySelect() >= 2) { + actionAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.filterPre_SLaction_options, R.layout.custom_spinner_layout); + } else { + actionAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.filterPre_SessionAction_options, R.layout.custom_spinner_layout); + } + actionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + actionSpinner.setAdapter(actionAdapter); + if (false) actionSpinner.setEnabled(false); + + memoryBankSpinner = (Spinner) getActivity().findViewById(R.id.preFilterMemoryBank); + ArrayAdapter memoryBankAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.read_memoryBank_options, R.layout.custom_spinner_layout); + memoryBankAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + memoryBankSpinner.setAdapter(memoryBankAdapter); + memoryBankSpinner.setEnabled(true); + + spinnerMaskDataType = (Spinner) getActivity().findViewById(R.id.filterPreMaskDataType); + ArrayAdapter maskDataTypeAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.dataType_options, R.layout.custom_spinner_layout); + maskDataTypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerMaskDataType.setAdapter(maskDataTypeAdapter); + spinnerMaskDataType.setEnabled(true); + spinnerMaskDataType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + if (spinnerMaskDataType.getSelectedItemPosition() == 0) { + filterPreMaskDataHex.setVisibility(View.VISIBLE); + filterPreMaskDataBit.setVisibility(View.GONE); + } else { + filterPreMaskDataHex.setVisibility(View.GONE); + filterPreMaskDataBit.setVisibility(View.VISIBLE); + } + } + @Override + public void onNothingSelected(AdapterView adapterView) { + } + }); + + preFilterOffset = (EditText) getActivity().findViewById(R.id.filterPreOffset); + filterPreMaskDataHex = (EditText) getActivity().findViewById(R.id.filterPreMaskDataHex); + filterPreMaskDataBit = (EditText) getActivity().findViewById(R.id.filterPreMaskDataBit); + + button = (Button) getActivity().findViewById(R.id.filterPreSaveButton); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean validValue = false; + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } else { + try { + invSelectIndex = Integer.parseInt(editTextFilterPreSelectIndex.getText().toString()); + invSelectEnable = checkBoxEnable.isChecked(); + invSelectTarget = targetSpinner.getSelectedItemPosition(); + invSelectAction = actionSpinner.getSelectedItemPosition(); + invSelectMaskBank = memoryBankSpinner.getSelectedItemPosition() + 1; + invSelectMaskOffset = Integer.parseInt(preFilterOffset.getText().toString()); if (invSelectMaskBank == 1) invSelectMaskOffset += 32; + + settingUpdate(); + } catch (Exception ex) { + Toast.makeText(MainActivity.mContext, R.string.toast_invalid_range, Toast.LENGTH_SHORT).show(); + } + } + } + }); + + if (sameCheck == false) MainActivity.csLibrary4A.setSameCheck(false); + mHandler.post(updateRunnable); + } + + @Override + public void onDestroy() { + if (settingTask != null) settingTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + mHandler.removeCallbacks(updateRunnable); + super.onDestroy(); + } + + public SettingFilterPreFragment() { + super("SettingFilterPreFragment"); + } + + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + int iValue; + long lValue; + boolean updating = false; + + if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) updating = true; + else { + if (updating == false && editTextFilterPreSelectIndex.getText().length() == 0) { + lValue = MainActivity.csLibrary4A.getInvSelectIndex(); + MainActivity.csLibrary4A.appendToLog("updateRunnable getInvSelectIndex = " + lValue); + if (lValue < 0) { + updating = true; + } else { + editTextFilterPreSelectIndex.setText(String.valueOf(lValue)); + } + } + if (updating == false) { + boolean bValue = MainActivity.csLibrary4A.getSelectEnable(); + MainActivity.csLibrary4A.appendToLog("updateRunnable getSelectEnable = " + bValue); + checkBoxEnable.setChecked(bValue); + } + if (updating == false) { + int iValue1 = MainActivity.csLibrary4A.getSelectTarget(); + MainActivity.csLibrary4A.appendToLog("updateRunnable getSelectTarget = " + iValue1); + if (iValue1 < 0) { + updating = true; + } else { + if (iValue1 > 4) iValue1 = 4; + iValue1 = 4; //fixed as SL + targetSpinner.setSelection(iValue1); + } + } + if (updating == false) { + int iValue1 = MainActivity.csLibrary4A.getSelectAction(); + MainActivity.csLibrary4A.appendToLog("updateRunnable getSelectAction = " + iValue1); + if (iValue1 < 0) { + updating = true; + } else { + actionSpinner.setSelection(iValue1); + } + } + if (updating == false) { + int iValue1 = MainActivity.csLibrary4A.getSelectMaskBank(); + MainActivity.csLibrary4A.appendToLog("updateRunnable getSelectMaskBank = " + iValue1); + if (iValue1 < 0) { + updating = true; + } else { + if (iValue1 < 1) iValue1 = 1; + iValue1--; + memoryBankSpinner.setSelection(iValue1); + } + } + if (updating == false) { + int iValue1 = MainActivity.csLibrary4A.getSelectMaskOffset(); + MainActivity.csLibrary4A.appendToLog("updateRunnable getSelectMaskOffset = " + iValue1); + if (iValue1 < 0) { + updating = true; + } else { + if (iValue1 < 32) iValue1 = 32; + iValue1 -= 32; + preFilterOffset.setText(String.valueOf(iValue1)); + } + } + if (updating == false) { + String strValue = MainActivity.csLibrary4A.getSelectMaskData(); + MainActivity.csLibrary4A.appendToLog("updateRunnable getSelectMaskData = " + strValue); + if (strValue == null) { + updating = true; + } else { + spinnerMaskDataType.setSelection(0); + filterPreMaskDataHex.setText(strValue); + } + } + } + if (updating) { + mHandler.postDelayed(updateRunnable, 1000); + } + } + }; + + void settingUpdate() { + boolean sameSetting = true; + boolean invalidRequest = false; + + if (MainActivity.csLibrary4A.getInvSelectIndex() != invSelectIndex) { + sameSetting = false; + if (MainActivity.csLibrary4A.setInvSelectIndex(invSelectIndex) == false) + invalidRequest = true; + else { + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + if (sameSetting == true && invalidRequest == false) { + if (true) + { + boolean dataMatched = false; + boolean maskbit = (spinnerMaskDataType.getSelectedItemPosition() == 0 ? false : true); + if (maskbit) invSelectMaskData = filterPreMaskDataBit.getText().toString(); + else invSelectMaskData = filterPreMaskDataHex.getText().toString(); + String strValue = MainActivity.csLibrary4A.getSelectMaskData(); + if (invSelectMaskData.length() != strValue.length()) { } + else if (invSelectMaskData.length() == 0 && strValue.length() == 0) { dataMatched = true; } + else dataMatched = invSelectMaskData.matches(strValue); + if (MainActivity.csLibrary4A.getSelectEnable() != invSelectEnable + || MainActivity.csLibrary4A.getSelectTarget() != invSelectTarget + || MainActivity.csLibrary4A.getSelectAction() != invSelectAction + || MainActivity.csLibrary4A.getSelectMaskBank() != invSelectMaskBank + || MainActivity.csLibrary4A.getSelectMaskOffset() != invSelectMaskOffset + || dataMatched == false || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setSelectCriteria(0, invSelectEnable, invSelectTarget, invSelectAction, invSelectMaskBank, invSelectMaskOffset, invSelectMaskData, maskbit) == false) + invalidRequest = true; + } + } + } + + settingTask = new SettingTask(button, sameSetting, invalidRequest); + settingTask.execute(); + MainActivity.csLibrary4A.saveSetting2File(); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SettingTask; + +public class SettingFilterRssiFragment extends CommonFragment { + private CheckBox checkBoxEnable; + private Spinner spinnerFilterType, spinnerFilterOption; + private EditText editTextFilterThreshold1, editTextFilterThreshold2, editTextFilterCount; + private Button button; + + final boolean sameCheck = false; + Handler mHandler = new Handler(); + + boolean invSelectEnable; + int invSelectFilterType = -1, invSelectFilterOption = -1; + double invSelectFilterThreshold1 = -1, invSelectFilterThreshold2 = -1; + long invSelectFilterCount = -1; + + private SettingTask settingTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_filterrssi_content, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + checkBoxEnable = (CheckBox) getActivity().findViewById(R.id.filterRssiCheck); + + spinnerFilterType = (Spinner) getActivity().findViewById(R.id.filterRssiFilterType); + ArrayAdapter filterTypeAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.filterType_options, R.layout.custom_spinner_layout); + filterTypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerFilterType.setAdapter(filterTypeAdapter); + spinnerFilterType.setEnabled(false); + + spinnerFilterOption = (Spinner) getActivity().findViewById(R.id.filterRssiFilterOption); + ArrayAdapter filterOptionAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.filter_options1, R.layout.custom_spinner_layout); + filterOptionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerFilterOption.setAdapter(filterOptionAdapter); + + String strUnit = MainActivity.csLibrary4A.getRssiDisplaySetting() > 0 ? "(dBm)" : "(dBuV)"; + TextView textViewThreshold1 = (TextView) getActivity().findViewById(R.id.filterRssiThreshold1Label); + textViewThreshold1.setText(textViewThreshold1.getText().toString() + strUnit); + TextView textViewThreshold2 = (TextView) getActivity().findViewById(R.id.filterRssiThreshold2Label); + textViewThreshold2.setText(textViewThreshold2.getText().toString() + strUnit); + + editTextFilterThreshold1 = (EditText) getActivity().findViewById(R.id.filterRssiThreshold1); + editTextFilterThreshold2 = (EditText) getActivity().findViewById(R.id.filterRssiThreshold2); + editTextFilterCount = (EditText) getActivity().findViewById(R.id.filterRssiCount); + + button = (Button) getActivity().findViewById(R.id.filterRssiSaveButton); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean validValue = false; + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } else { + boolean bValid = false; + try { + invSelectEnable = checkBoxEnable.isChecked(); + invSelectFilterType = spinnerFilterType.getSelectedItemPosition(); + invSelectFilterOption = spinnerFilterOption.getSelectedItemPosition(); + invSelectFilterThreshold1 = Float.parseFloat(editTextFilterThreshold1.getText().toString()); + if (MainActivity.csLibrary4A.getRssiDisplaySetting() > 0) invSelectFilterThreshold1 += MainActivity.csLibrary4A.dBuV_dBm_constant; + invSelectFilterThreshold2 = Float.parseFloat(editTextFilterThreshold2.getText().toString()); + if (MainActivity.csLibrary4A.getRssiDisplaySetting() > 0) invSelectFilterThreshold2 += MainActivity.csLibrary4A.dBuV_dBm_constant; + invSelectFilterCount = Integer.parseInt(editTextFilterCount.getText().toString()); + bValid = true; + } catch (Exception ex) { + Toast.makeText(MainActivity.mContext, R.string.toast_invalid_range, Toast.LENGTH_SHORT).show(); + } + if (bValid) settingUpdate(); + } + } + }); + + if (sameCheck == false) MainActivity.csLibrary4A.setSameCheck(false); + mHandler.post(updateRunnable); + } + + @Override + public void onDestroy() { + if (settingTask != null) settingTask.cancel(true); + MainActivity.csLibrary4A.setSameCheck(true); + mHandler.removeCallbacks(updateRunnable); + super.onDestroy(); + } + + public SettingFilterRssiFragment() { + super("SettingFilterRssiFragment"); + } + + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + int iValue; + long lValue; + String updating = null; + + if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) updating = "waiting empty buffer"; + else { + if (updating == null) { + boolean bValue = MainActivity.csLibrary4A.getRssiFilterEnable(); + MainActivity.csLibrary4A.appendToLog("0 updateRunnable getSelectEnable = " + bValue); + checkBoxEnable.setChecked(bValue); + } + if (updating == null) { + int iValue1 = MainActivity.csLibrary4A.getRssiFilterType(); + MainActivity.csLibrary4A.appendToLog("1 updateRunnable getSelectAction = " + iValue1); + if (iValue1 < 0) updating = "getting filter type"; + else spinnerFilterType.setSelection(iValue1); + } + if (updating == null) { + int iValue1 = MainActivity.csLibrary4A.getRssiFilterOption(); + MainActivity.csLibrary4A.appendToLog("2 updateRunnable getSelectAction = " + iValue1); + if (iValue1 < 0) updating = "getting filter option"; + else spinnerFilterOption.setSelection(iValue1); + } + if (updating == null) { + double dValue = MainActivity.csLibrary4A.getRssiFilterThreshold1(); + MainActivity.csLibrary4A.appendToLog(String.format("3 updateRunnable getRssiFilterThreshold1 = %f", dValue)); + if (dValue < 0 && false) updating = "updating threshold 1"; + else editTextFilterThreshold1.setText(String.format("%.1f", (MainActivity.csLibrary4A.getRssiDisplaySetting() > 0 ? dValue -= MainActivity.csLibrary4A.dBuV_dBm_constant : dValue))); + } + if (updating == null) { + double dValue = MainActivity.csLibrary4A.getRssiFilterThreshold2(); + MainActivity.csLibrary4A.appendToLog(String.format("4 updateRunnable getRssiFilterThreshold2 = %f", dValue)); + if (dValue < 0 && false) updating = "updating threshold 2"; + else editTextFilterThreshold2.setText(String.format("%.1f", (MainActivity.csLibrary4A.getRssiDisplaySetting() > 0 ? dValue -= MainActivity.csLibrary4A.dBuV_dBm_constant : dValue))); + } + if (updating == null) { + long lValue1 = MainActivity.csLibrary4A.getRssiFilterCount(); + MainActivity.csLibrary4A.appendToLog(String.format("5 updateRunnable getRssiFilterCount = %d", lValue1)); + if (lValue1 < 0) updating = "updating count"; + else editTextFilterCount.setText(String.valueOf(lValue1)); + } + } + if (updating != null) { + mHandler.postDelayed(updateRunnable, 1000); + MainActivity.csLibrary4A.appendToLogView("Updating in " + updating); + } + } + }; + + void settingUpdate() { + boolean sameSetting = true; + String invalidRequest = null; + + if (sameSetting == true && invalidRequest == null) { + if (MainActivity.csLibrary4A.getRssiFilterEnable() != invSelectEnable + || MainActivity.csLibrary4A.getRssiFilterType() != invSelectFilterType + || MainActivity.csLibrary4A.getRssiFilterOption() != invSelectFilterOption) { + sameSetting = false; + if (MainActivity.csLibrary4A.setRssiFilterConfig(invSelectEnable, invSelectFilterType, invSelectFilterOption) == false) invalidRequest = "setting filter type"; + } + if (MainActivity.csLibrary4A.getRssiFilterThreshold1() != invSelectFilterThreshold1 || MainActivity.csLibrary4A.getRssiFilterThreshold2() != invSelectFilterThreshold2) { + sameSetting = false; + MainActivity.csLibrary4A.appendToLog(String.format("updateRunnable: getRssiFilterThreshold2 = %f, invSelectFilterThreshold2 = %f", MainActivity.csLibrary4A.getRssiFilterThreshold2(), invSelectFilterThreshold2)); + invSelectFilterThreshold2 = 0; + if (MainActivity.csLibrary4A.setRssiFilterThreshold(invSelectFilterThreshold1, invSelectFilterThreshold2) == false) invalidRequest = "setting filter threshold"; + } + if (MainActivity.csLibrary4A.getRssiFilterCount() != invSelectFilterCount) { + sameSetting = false; + MainActivity.csLibrary4A.appendToLog("rssiFilterCount = " + invSelectFilterCount); + if (MainActivity.csLibrary4A.setRssiFilterCount(invSelectFilterCount) == false) invalidRequest = "setting filter count"; + } + } + + if (invalidRequest != null) { + String strValue = "Invalid " + invalidRequest + ". Operation is cancelled."; + Toast.makeText(MainActivity.mContext, strValue, Toast.LENGTH_SHORT).show(); + + } else { + settingTask = new SettingTask(button, sameSetting, false); + settingTask.execute(); + MainActivity.csLibrary4A.saveSetting2File(); + } + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cslibrary4a.AdapterTab; +import com.csl.cs710ademoapp.R; +import com.google.android.material.tabs.TabLayout; + +public class SettingFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + FragmentStatePagerAdapter pagerAdapter; + AdapterTab adapter; + Fragment fragment0, fragment1; + + private String[] tabs = { "Operation", "Administration" }; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setTitle(R.string.title_activity_settings); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); + pagerAdapter = new FragmentStatePagerAdapter(getActivity().getSupportFragmentManager()) { + @Override + public int getCount() { + return tabs.length; + } + @Override + public int getItemPosition(Object object) { + return PagerAdapter.POSITION_NONE; + } + @Override + public Fragment getItem(int position) { + Fragment fragment = null; + switch (position) { + case 0: + fragment = new SettingOperateFragment(); //AccessSecurityLockFragment(); //InventoryRfidiMultiFragment(); + fragment0 = fragment; + break; + case 1: + fragment1 = new SettingAdminFragment(); + break; + default: + fragment = null; + break; + } + return fragment; + } + }; + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, new SettingOperateFragment()); + adapter.setFragment(1, new SettingAdminFragment()); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); //pagerAdapter); //mAdapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + MainActivity.csLibrary4A.setAntennaSelect(0); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public SettingFragment() { + super("SettingFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.Spinner; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.CustomPopupWindow; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SettingTask; + +public class SettingOperateFragment extends CommonFragment { + final String strOVERRIDE = "Override"; final String strRESET = "Reset"; + private CheckBox checkBoxPortEnable, checkBoxTagFocus, checkBoxFastId, checkBoxHighCompression; + private Spinner spinnerRegulatoryRegion, spinnerFrequencyOrder, spinnerChannel, spinnerQueryTarget, spinnerQuerySession, spinnerInvAlgo, spinnerProfile, spinnerRflnaGain, spinnerIflnaGain, spinnerAgcGain; + private EditText editTextPopulation, editTextStartQValue, editTextOperatePower, editTextPortDwell, editTextTagDelay, editTextIntraPkDelay, editTextDupDelay, editTextRetry; + private TextView textViewPortChannel; + private Button buttonPortSelect, buttonOverride, button, button1; + private TextView textViewEnvironmentalRSSI; + + boolean sameCheck = true; + Handler mHandler = new Handler(); + class SettingBeforeTagFocus { + int querySession; + int queryTarget; + String dwell; + String tagDelay;//, intraPkDelay, dupDelay; + void store() { + querySession = spinnerQuerySession.getSelectedItemPosition(); spinnerQuerySession.setSelection(1); spinnerQuerySession.setEnabled(false); + queryTarget = spinnerQueryTarget.getSelectedItemPosition(); spinnerQueryTarget.setSelection(0); spinnerQueryTarget.setEnabled(false); + dwell = editTextPortDwell.getText().toString(); editTextPortDwell.setText("2000"); editTextPortDwell.setEnabled(false); + tagDelay = editTextTagDelay.getText().toString(); editTextTagDelay.setText("0"); editTextTagDelay.setEnabled(false); + //intraPkDelay = editTextIntraPkDelay.getText().toString(); editTextIntraPkDelay.setText("0"); editTextIntraPkDelay.setEnabled(false); + //dupDelay = editTextDupDelay.getText().toString(); editTextDupDelay.setText("0"); editTextDupDelay.setEnabled(false); + } + void restore() { + spinnerQuerySession.setSelection(querySession); spinnerQuerySession.setEnabled(true); + spinnerQueryTarget.setSelection(queryTarget); spinnerQueryTarget.setEnabled(true); + editTextPortDwell.setText(dwell); editTextPortDwell.setEnabled(true); + editTextTagDelay.setText(tagDelay); editTextTagDelay.setEnabled(true); + //editTextIntraPkDelay.setText(intraPkDelay); editTextIntraPkDelay.setEnabled(true); + //editTextDupDelay.setText(dupDelay); editTextDupDelay.setEnabled(true); + } + }; + SettingBeforeTagFocus settingBeforeTagFocus = new SettingBeforeTagFocus(); + + boolean overriding = false; + int countrySelect = -1; + int channelOrder = -1; int channelSelect = -1; + int channel = -1; final int channelMin = 1; int channelMax = 1; int iPortNumber = 1; + boolean portEnable = false; + long powerLevel = -1; final long powerLevelMin = 0; final long powerLevelMax = 300; + long dwellTime = -1; final long dwellTimeMin = 0; final long dwellTimeMax = 10000; + byte byteTagDelay = -1; byte byteTagDelayMin = 0; byte byteTagDelayMax = 63; + byte byteIntraPkDelay = -1; byte byteIntraPkDelayMin = 0; byte byteIntraPkDelayMax = 63; + byte byteDupDelay = -1; byte byteDupDelayMin = 0; byte byteDupDelayMax = 63; + int iPopulation = -1; int iPopulationMin = 1; int iPopulationMax = 9999; + byte byteFixedQValue = -1; byte byteFixedQValueMin = 0; byte byteFixedQValueMax = 15; + int queryTarget; + int querySession = -1; + int tagFocus = -1, fastId = -1; + boolean invAlgoDynamic = false; + int retry = -1; + int profile = -1; + int highCompression = -1, rflnagain = -1, iflnagain = -1, agcgain = -1; + + private SettingTask settingTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_settings_operate, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (MainActivity.csLibrary4A.get98XX() == 2) { + TableRow tableRow = (TableRow) getActivity().findViewById(R.id.settingOperateCompactDelayRow); + tableRow.setVisibility(View.GONE); + LinearLayout linearLayout = (LinearLayout) getActivity().findViewById(R.id.settingOperateGainControl); + linearLayout.setVisibility(View.GONE); + } else { + TableRow tableRow = (TableRow) getActivity().findViewById(R.id.settingOperateDupDelayRow); + tableRow.setVisibility(View.GONE); + TableRow tableRow1 = (TableRow) getActivity().findViewById(R.id.settingOperateIntraPkDelayRow); + tableRow1.setVisibility(View.GONE); + //TableRow tableRow2 = (TableRow) getActivity().findViewById(R.id.settingOperatePortWarningRow); + //tableRow2.setVisibility(View.GONE); + } + + spinnerRegulatoryRegion = (Spinner) getActivity().findViewById(R.id.settingOperateRegulatoryRegion); + spinnerFrequencyOrder = (Spinner) getActivity().findViewById(R.id.settingOperateFrequencyOrder); spinnerFrequencyOrder.setEnabled(false); + spinnerChannel = (Spinner) getActivity().findViewById(R.id.settingOperateChannel); + + iPortNumber = MainActivity.csLibrary4A.getPortNumber(); + if (iPortNumber == 1 && false) { + TableRow tableRow = (TableRow) getActivity().findViewById(R.id.settingOperatePortChannelRow); + tableRow.setVisibility(View.GONE); + tableRow = (TableRow) getActivity().findViewById(R.id.settingOperatePortEnableRow); + tableRow.setVisibility(View.GONE); + tableRow = (TableRow) getActivity().findViewById(R.id.settingOperatePortDwellRow); + tableRow.setVisibility(View.GONE); + } else { + int iTemp = iPortNumber; + if (iTemp > 1) channelMax = iTemp; + else channelMax = 16; + if (channelMax != 1) { + TextView textViewPortChannelLabel = (TextView) getActivity().findViewById(R.id.settingOperatePortChannelLabel); + if (iPortNumber != 1) textViewPortChannelLabel.setText("Ant port #"); + else textViewPortChannelLabel.setText("Power level"); + String stringPortChannelLabel = textViewPortChannelLabel.getText().toString(); + stringPortChannelLabel += "(" + String.valueOf(channelMin) + "-" + String.valueOf(channelMax) + ")"; + textViewPortChannelLabel.setText(stringPortChannelLabel); + } + textViewPortChannel = (TextView) getActivity().findViewById(R.id.settingOperatePortChannel); textViewPortChannel.setText("1"); + buttonPortSelect = (Button) getActivity().findViewById(R.id.settingOperatePortChannelSelect); + if (false && MainActivity.csLibrary4A.get98XX() == 2) buttonPortSelect.setEnabled(false); + buttonPortSelect.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int channel = Integer.parseInt(textViewPortChannel.getText().toString()); + if (channel < 1) channel = channelMin; + if (++channel > channelMax) channel = channelMin; + textViewPortChannel.setText(""); if (MainActivity.csLibrary4A.setAntennaSelect(channel-1)) textViewPortChannel.setText(String.valueOf(channel)); + editTextOperatePower.setText(""); + editTextPortDwell.setText(""); + mHandler.post(updateRunnable); + } + }); + + checkBoxPortEnable = (CheckBox) getActivity().findViewById(R.id.settingOperatePortEnable); + + TextView textViewPortDwellLabel = (TextView) getActivity().findViewById(R.id.settingOperatePortDwellLabel); + String stringPortDwellLabel = textViewPortDwellLabel.getText().toString(); + stringPortDwellLabel += "(" + String.valueOf(dwellTimeMin) + "-" + String.valueOf(dwellTimeMax) + ")"; + textViewPortDwellLabel.setText(stringPortDwellLabel); + editTextPortDwell = (EditText) getActivity().findViewById(R.id.settingOperatePortDwell); + } + + TextView textViewAdminTagDelayLabel = (TextView) getActivity().findViewById(R.id.settingAdminTagDelayLabel); + String stringAdminTagDelayLabel = textViewAdminTagDelayLabel.getText().toString(); + stringAdminTagDelayLabel += "(" + String.valueOf(byteTagDelayMin) + "-" + String.valueOf(byteTagDelayMax) + "ms)"; + textViewAdminTagDelayLabel.setText(stringAdminTagDelayLabel); + editTextTagDelay = (EditText) getActivity().findViewById(R.id.settingOperateTagDelay); + editTextIntraPkDelay = (EditText) getActivity().findViewById(R.id.settingOperateIntraPkDelay); + editTextDupDelay = (EditText) getActivity().findViewById(R.id.settingOperateDupDelay); + + TextView textViewOperatePowerLabel = (TextView) getActivity().findViewById(R.id.settingOperatePowerLabel); + String stringOperationPowerLabel = textViewOperatePowerLabel.getText().toString(); + stringOperationPowerLabel += "(" + String.valueOf(powerLevelMin) + "-" + String.valueOf(powerLevelMax) + ")"; + textViewOperatePowerLabel.setText(stringOperationPowerLabel); + editTextOperatePower = (EditText) getActivity().findViewById(R.id.settingOperatePower); + + TextView textViewOperatePopulationLabel = (TextView) getActivity().findViewById(R.id.settingOperatePopulationLabel); + String stringOperationPopulationLabel = textViewOperatePopulationLabel.getText().toString(); + stringOperationPopulationLabel += "(" + String.valueOf(iPopulationMin) + "-" + String.valueOf(iPopulationMax) + ")"; + textViewOperatePopulationLabel.setText(stringOperationPopulationLabel); + editTextPopulation = (EditText) getActivity().findViewById(R.id.settingOperatePopulation); + + editTextStartQValue = (EditText) getActivity().findViewById(R.id.settingOperateQValue); + + spinnerQueryTarget = (Spinner) getActivity().findViewById(R.id.settingOperateTarget); + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.query_target_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerQueryTarget.setAdapter(targetAdapter); + + spinnerQuerySession = (Spinner) getActivity().findViewById(R.id.settingOperateSession); + targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.query_session_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerQuerySession.setAdapter(targetAdapter); + + checkBoxTagFocus = (CheckBox) getActivity().findViewById(R.id.settingOperateTagFocus); + String string = checkBoxTagFocus.getText().toString(); + if (MainActivity.csLibrary4A.get98XX() == 2) checkBoxTagFocus.setText(string.substring(0, string.length()-1) + ". When enabled, tag select is disabled.)"); + checkBoxTagFocus.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) settingBeforeTagFocus.store(); + else settingBeforeTagFocus.restore(); + } + }); + + checkBoxFastId = (CheckBox) getActivity().findViewById(R.id.settingOperateFastId); + + spinnerInvAlgo = (Spinner) getActivity().findViewById(R.id.settingOperateAlgorithmToUse); + targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.inventory_algorithm_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerInvAlgo.setAdapter(targetAdapter); + + TextView textViewRetry = (TextView) getActivity().findViewById(R.id.settingOperateRetryLabel); + if (MainActivity.csLibrary4A.get98XX() == 2) textViewRetry.setText("Minimum minQ cycles"); + editTextRetry = (EditText) getActivity().findViewById(R.id.settingOperateRetry); + + spinnerProfile = (Spinner) getActivity().findViewById(R.id.settingOperateProfile); + if (true) { + ArrayAdapter targetAdapter1 = new ArrayAdapter(getContext(), android.R.layout.simple_spinner_dropdown_item, MainActivity.csLibrary4A.getProfileList()); + targetAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerProfile.setAdapter(targetAdapter1); + } + + MainActivity.csLibrary4A.resetEnvironmentalRSSI(); + textViewEnvironmentalRSSI = (TextView) getActivity().findViewById(R.id.settingOperateEnvironmentalRSSI); + checkBoxHighCompression = (CheckBox) getActivity().findViewById(R.id.settingOperateHighCompression); + + spinnerRflnaGain = (Spinner) getActivity().findViewById(R.id.settingOperateRflnaGain); + targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.rflnagain_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerRflnaGain.setAdapter(targetAdapter); + + spinnerIflnaGain = (Spinner) getActivity().findViewById(R.id.settingOperateIflnaGain); + targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.iflnagain_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerIflnaGain.setAdapter(targetAdapter); + + spinnerAgcGain = (Spinner) getActivity().findViewById(R.id.settingOperateAgcGAin); + targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.agcgain_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerAgcGain.setAdapter(targetAdapter); + + buttonOverride = (Button) getActivity().findViewById(R.id.settingOperateOverrideButton); + String strText = buttonOverride.getText().toString(); + if (strText.contains(strOVERRIDE)) { + editTextPopulation.setEnabled(true); + editTextStartQValue.setEnabled(false); + } else { + editTextPopulation.setEnabled(false); + editTextStartQValue.setEnabled(true); + } + buttonOverride.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String strText = buttonOverride.getText().toString(); + if (strText.contains(strOVERRIDE)) { + editTextPopulation.setEnabled(false); + editTextStartQValue.setEnabled(true); + buttonOverride.setText(strRESET); overriding = true; + } else { + editTextPopulation.setEnabled(true); + editTextStartQValue.setEnabled(false);; + buttonOverride.setText(strOVERRIDE); overriding = false; + + iPopulation = Integer.parseInt(editTextPopulation.getText().toString()); + editTextStartQValue.setText(String.valueOf(MainActivity.csLibrary4A.getPopulation2Q(iPopulation))); + } + } + }); + + button = (Button) getActivity().findViewById(R.id.settingSaveButtonOperate); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sameCheck = true; settingUpdate1(); + } + }); + + button1 = (Button) getActivity().findViewById(R.id.settingSaveButtonOperate1); + button1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sameCheck = false; settingUpdate1(); + } + }); + + mHandler.post(updateRunnable); + } + + void settingUpdate1() { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } else if (updateRunning) { + Toast.makeText(MainActivity.mContext, R.string.toast_not_ready, Toast.LENGTH_SHORT).show(); + return; + } else { + MainActivity.csLibrary4A.setSameCheck(sameCheck); + try { + countrySelect = spinnerRegulatoryRegion.getSelectedItemPosition(); + channelOrder = spinnerFrequencyOrder.getSelectedItemPosition(); + channelSelect = spinnerChannel.getSelectedItemPosition(); + if (textViewPortChannel != null) + channel = Integer.parseInt(textViewPortChannel.getText().toString()); + if (checkBoxPortEnable != null) portEnable = checkBoxPortEnable.isChecked(); + powerLevel = Long.parseLong(editTextOperatePower.getText().toString()); + if (editTextPortDwell != null) + dwellTime = Long.parseLong(editTextPortDwell.getText().toString()); + if (editTextTagDelay != null) + byteTagDelay = Byte.parseByte(editTextTagDelay.getText().toString()); + if (editTextIntraPkDelay != null) + byteIntraPkDelay = Byte.parseByte(editTextIntraPkDelay.getText().toString()); + if (editTextDupDelay != null) + byteDupDelay = Byte.parseByte(editTextDupDelay.getText().toString()); + iPopulation = Integer.parseInt(editTextPopulation.getText().toString()); + byteFixedQValue = Byte.parseByte(editTextStartQValue.getText().toString()); + queryTarget = spinnerQueryTarget.getSelectedItemPosition(); + querySession = spinnerQuerySession.getSelectedItemPosition(); + tagFocus = (checkBoxTagFocus.isChecked() ? 1 : 0); + fastId = (checkBoxFastId.isChecked() ? 1 : 0); + invAlgoDynamic = (spinnerInvAlgo.getSelectedItemPosition() == 0 ? true : false); + retry = Integer.parseInt(editTextRetry.getText().toString()); + profile = spinnerProfile.getSelectedItemPosition(); + highCompression = (checkBoxHighCompression.isChecked() ? 1 : 0); + rflnagain = spinnerRflnaGain.getSelectedItemPosition(); + iflnagain = spinnerIflnaGain.getSelectedItemPosition(); + agcgain = spinnerAgcGain.getSelectedItemPosition(); + settingUpdate(); + } catch (Exception ex) { + Toast.makeText(MainActivity.mContext, R.string.toast_invalid_range, Toast.LENGTH_SHORT).show(); + } + } + } + + @Override + public void onDestroy() { + if (settingTask != null) settingTask.cancel(true); + if (MainActivity.csLibrary4A != null) MainActivity.csLibrary4A.setSameCheck(true); + mHandler.removeCallbacks(updateRunnable); + super.onDestroy(); + } + + boolean userVisibleHint = true; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + MainActivity.csLibrary4A.appendToLog("isVisibleToUser = " + isVisibleToUser); + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + if (userVisibleHint == false) { + userVisibleHint = true; + mHandler.post(updateRunnable); + } + } else { + userVisibleHint = false; + } + } + + public SettingOperateFragment() { + super("SettingOperateFragment"); + } + + boolean updateRunning = false; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + int iValue; + long lValue; + boolean updating = false; + + updateRunning = true; + if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 1"); + } + else { + iPopulation = MainActivity.csLibrary4A.getPopulation(); + if (iPopulation < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 2"); + } + else { + editTextPopulation.setText(String.valueOf(iPopulation)); + + byteFixedQValue = MainActivity.csLibrary4A.getQValue(); + editTextStartQValue.setText(String.valueOf(byteFixedQValue)); + if (MainActivity.csLibrary4A.getPopulation2Q(iPopulation) != byteFixedQValue) { + buttonOverride.setText(strRESET); overriding = true; + } else { + buttonOverride.setText(strOVERRIDE); overriding = false; + } + } + if (updating == false && textViewPortChannel != null) { + lValue = MainActivity.csLibrary4A.getAntennaSelect(); + if (lValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 4"); + } else { + textViewPortChannel.setText(String.valueOf(lValue+1)); + } + } + if (checkBoxPortEnable != null) checkBoxPortEnable.setChecked(MainActivity.csLibrary4A.getAntennaEnable()); + if (updating == false) { + lValue = MainActivity.csLibrary4A.getPwrlevel(); + if (lValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 5"); + } else { + editTextOperatePower.setText(String.valueOf(lValue)); + } + } + if (updating == false && editTextPortDwell != null) { + lValue = MainActivity.csLibrary4A.getAntennaDwell(); + if (lValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 6"); + } else { + editTextPortDwell.setText(String.valueOf(lValue)); + } + } + if (editTextTagDelay != null) editTextTagDelay.setText(String.valueOf(MainActivity.csLibrary4A.getTagDelay())); + if (editTextIntraPkDelay != null) editTextIntraPkDelay.setText(String.valueOf(MainActivity.csLibrary4A.getIntraPkDelay())); + if (editTextDupDelay != null) editTextDupDelay.setText(String.valueOf(MainActivity.csLibrary4A.getDupDelay())); + if (updating == false) { + spinnerQueryTarget.setSelection(MainActivity.csLibrary4A.getQueryTarget()); + } + if (updating == false) { + iValue = MainActivity.csLibrary4A.getQuerySession(); + if (iValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 7"); + } else { + spinnerQuerySession.setSelection(iValue); + } + } + if (updating == false) { + iValue = MainActivity.csLibrary4A.getTagFocus(); + if (iValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 8"); + } + else { + checkBoxTagFocus.setChecked(iValue > 0 ? true : false); + if (checkBoxTagFocus.isChecked()) settingBeforeTagFocus.store(); + } + } + if (updating == false) { + iValue = MainActivity.csLibrary4A.getFastId(); + if (iValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 8"); + } + else checkBoxFastId.setChecked(iValue > 0 ? true : false); + } + if (updating == false) { + spinnerInvAlgo.setSelection(MainActivity.csLibrary4A.getInvAlgo() ? 0 : 1); + } + if (updating == false) { + int iRetry = MainActivity.csLibrary4A.getRetryCount(); + if (iRetry < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 9"); + } + else editTextRetry.setText(String.valueOf(iRetry)); + } + if (updating == false) { + String[] strCountryList = MainActivity.csLibrary4A.getCountryList(); + for (int i = 0; i < strCountryList.length; i++) MainActivity.csLibrary4A.appendToLog("updating: String " + i + " = " + strCountryList[i]); + String[] strChannelFrequencyList = MainActivity.csLibrary4A.getChannelFrequencyList(); + //for (int i = 0; i < strChannelFrequencyList.length; i++) MainActivity.csLibrary4A.appendToLog("updating: String " + i + " = " + strChannelFrequencyList[i]); + if (strCountryList == null) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 10"); + } else { + ArrayAdapter targetAdapter1 = new ArrayAdapter(getActivity(), R.layout.custom_spinner_layout, strCountryList); + targetAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerRegulatoryRegion.setAdapter(targetAdapter1); + int countryNumber = MainActivity.csLibrary4A.getCountryNumberInList(); + MainActivity.csLibrary4A.appendToLog("updating countryNumber = " + countryNumber); + if (countryNumber < 0 || countryNumber > strCountryList.length) spinnerRegulatoryRegion.setSelection(0); + else spinnerRegulatoryRegion.setSelection(countryNumber); + if (strCountryList.length == 1) spinnerRegulatoryRegion.setEnabled(false); + else spinnerRegulatoryRegion.setEnabled(true); + + ArrayAdapter targetAdapter; + //if (MainActivity.csLibrary4A.getChannelHoppingDefault()) + targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.frequencyOrder_options, R.layout.custom_spinner_layout); + //else targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.frequencyAgile_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerFrequencyOrder.setAdapter(targetAdapter); + spinnerFrequencyOrder.setSelection(MainActivity.csLibrary4A.getChannelHoppingStatus() ? 0 : 1); + if (MainActivity.csLibrary4A.getChannelHoppingStatus()) spinnerChannel.setEnabled(false); + else spinnerChannel.setEnabled(true); + + ArrayAdapter targetAdapter2 = new ArrayAdapter(getActivity(), R.layout.custom_spinner_layout, strChannelFrequencyList); + targetAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerChannel.setAdapter(targetAdapter2); + int channel = MainActivity.csLibrary4A.getChannel(); + MainActivity.csLibrary4A.appendToLog("channel = " + channel); + if (channel < 0 || channel > strChannelFrequencyList.length) spinnerChannel.setSelection(0); + else spinnerChannel.setSelection(channel); + } + } + } + if (updating == false) { + iValue = MainActivity.csLibrary4A.getCurrentProfile(); + if (iValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 11"); + } else { + spinnerProfile.setSelection(iValue); + } + } + if (updating == false) { + String strRssi = MainActivity.csLibrary4A.getEnvironmentalRSSI(); + if (strRssi == null) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 12"); + } + else textViewEnvironmentalRSSI.setText(strRssi); + } + if (updating == false) { + iValue = MainActivity.csLibrary4A.getHighCompression(); + if (iValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 13"); + } else checkBoxHighCompression.setChecked(iValue == 0 ? false : true); + } + if (updating == false) { + iValue = MainActivity.csLibrary4A.getRflnaGain(); + if (iValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 14"); + } else { + switch (iValue) { + case 2: + iValue = 1; + break; + case 3: + iValue = 2; + break; + case 0: + default: + iValue = 0; + break; + } + spinnerRflnaGain.setSelection(iValue); + } + } + if (updating == false) { + iValue = MainActivity.csLibrary4A.getIflnaGain(); + if (iValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 15"); + } else { + switch (iValue) { + case 1: + iValue = 1; + break; + case 3: + iValue = 2; + break; + case 7: + iValue = 3; + break; + case 0: + default: + iValue = 0; + break; + } + spinnerIflnaGain.setSelection(iValue); + } + } + if (updating == false) { + iValue = MainActivity.csLibrary4A.getAgcGain(); + if (iValue < 0) { + updating = true; MainActivity.csLibrary4A.appendToLog("updating 16"); + } else { + switch (iValue) { + case 4: + iValue = 1; + break; + case 6: + iValue = 2; + break; + case 7: + iValue = 3; + break; + case 0: + default: + iValue = 0; + break; + + } + spinnerAgcGain.setSelection(iValue); + } + } + if (updating) { + mHandler.postDelayed(updateRunnable, 500); + } else updateRunning = false; + } + }; + + void settingUpdate() { + boolean sameSetting = true; + boolean invalidRequest = false; + boolean changedChannel = false; + + if (invalidRequest == false && (MainActivity.csLibrary4A.getCountryNumberInList() != countrySelect || sameCheck == false)) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 1"); + if (MainActivity.csLibrary4A.setCountryInList(countrySelect) == false) invalidRequest = true; + } + if (invalidRequest == false && (MainActivity.csLibrary4A.getChannelHoppingStatus() != (channelOrder == 0 ? true : false) || sameCheck == false)) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 2"); + if (MainActivity.csLibrary4A.setChannelHoppingStatus(channelOrder == 0 ? true : false) == false) invalidRequest = true; + else if (channelOrder > 0) spinnerChannel.setEnabled(true); + else spinnerChannel.setEnabled(false); + spinnerChannel.setSelection(MainActivity.csLibrary4A.getChannel()); MainActivity.csLibrary4A.appendToLog("1 channel = "); + } + if (invalidRequest == false && (MainActivity.csLibrary4A.getChannel() != channelSelect || sameCheck == false)) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 3"); + if (channelSelect < MainActivity.csLibrary4A.FreqChnCnt()) { + if (MainActivity.csLibrary4A.setChannel(channelSelect) == false) invalidRequest = true; + } else { + invalidRequest = true; + } + } + if (false && invalidRequest == false && (MainActivity.csLibrary4A.getAntennaSelect() + 1 != channel || sameCheck == false)) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 4"); + if (channel < channelMin || channel > channelMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setAntennaSelect(channel - 1) == false) invalidRequest = true; + else changedChannel = true; + } + if (invalidRequest == false && (MainActivity.csLibrary4A.getAntennaEnable() != portEnable || sameCheck == false || changedChannel)) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 5"); + if (MainActivity.csLibrary4A.setAntennaEnable(portEnable) == false) + invalidRequest = true; + } + if (invalidRequest == false && (MainActivity.csLibrary4A.getPwrlevel() != powerLevel || sameCheck == false)) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 6"); + if (powerLevel < powerLevelMin) invalidRequest = true; + else if (powerLevel > MainActivity.powerLevelMax) { + CustomPopupWindow customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart("Power can only be set to 320 or below", false); + invalidRequest = true; + } + else if (MainActivity.csLibrary4A.setPowerLevel(powerLevel) == false) invalidRequest = true; + } + if ((invalidRequest == false && (MainActivity.csLibrary4A.getAntennaDwell() != dwellTime || sameCheck == false || changedChannel))) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 7"); + if (dwellTime < dwellTimeMin || dwellTime > dwellTimeMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setAntennaDwell(dwellTime) == false) invalidRequest = true; + } + if ((invalidRequest == false && editTextTagDelay != null)) { + if (MainActivity.csLibrary4A.getTagDelay() != byteTagDelay || sameCheck == false) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 8"); + if (byteTagDelay < byteTagDelayMin || byteTagDelay > byteTagDelayMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setTagDelay(byteTagDelay) == false) + invalidRequest = true; + } + } + if ((invalidRequest == false && editTextIntraPkDelay != null)) { + if (MainActivity.csLibrary4A.getIntraPkDelay() != byteIntraPkDelay || sameCheck == false) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 9A"); + if (byteDupDelay < byteIntraPkDelayMin || byteIntraPkDelay > byteIntraPkDelayMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setIntraPkDelay(byteIntraPkDelay) == false) + invalidRequest = true; + } + } + if ((invalidRequest == false && editTextDupDelay != null)) { + if (MainActivity.csLibrary4A.getDupDelay() != byteDupDelay || sameCheck == false) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 9"); + if (byteDupDelay < byteDupDelayMin || byteDupDelay > byteDupDelayMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setDupDelay(byteDupDelay) == false) + invalidRequest = true; + } + } + + if (overriding) { + if (MainActivity.csLibrary4A.getQValue() != byteFixedQValue || sameCheck == false) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 9"); + if (byteFixedQValue < byteFixedQValueMin || byteFixedQValue > byteFixedQValueMax) invalidRequest = true; + if (MainActivity.csLibrary4A.setQValue(byteFixedQValue) == false) + invalidRequest = true; + } + } else { + if (invalidRequest == false && (MainActivity.csLibrary4A.getPopulation() != iPopulation || MainActivity.csLibrary4A.getQValue() != byteFixedQValue || sameCheck == false)) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 10"); + if (iPopulation < iPopulationMin || iPopulation > iPopulationMax) invalidRequest = true; + else if (MainActivity.csLibrary4A.setPopulation(iPopulation) == false) { + invalidRequest = true; + } else { + editTextStartQValue.setText(String.valueOf(MainActivity.csLibrary4A.getPopulation2Q(iPopulation))); + } + } + } + if ((MainActivity.csLibrary4A.getQueryTarget() != queryTarget + || MainActivity.csLibrary4A.getQuerySession() != querySession || sameCheck == false)) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 11"); + if (MainActivity.csLibrary4A.setTagGroup(MainActivity.csLibrary4A.getQuerySelect(), querySession, queryTarget) == false) + invalidRequest = true; + } + if (MainActivity.csLibrary4A.getTagFocus() != tagFocus || sameCheck == false) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 12"); + if (MainActivity.csLibrary4A.setTagFocus(tagFocus > 0 ? true : false) == false) + invalidRequest = true; + } + if (MainActivity.csLibrary4A.getFastId() != fastId || sameCheck == false) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 12"); + if (MainActivity.csLibrary4A.setFastId(fastId > 0 ? true : false) == false) + invalidRequest = true; + } + if (invalidRequest == false) { + if (MainActivity.csLibrary4A.getInvAlgo() != invAlgoDynamic || sameCheck == false) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 13"); + if (MainActivity.csLibrary4A.setInvAlgo(invAlgoDynamic) == false) + invalidRequest = true; + spinnerQueryTarget.setSelection(MainActivity.csLibrary4A.getQueryTarget()); + } + } + if (invalidRequest == false) { + if (MainActivity.csLibrary4A.getRetryCount() != retry || sameCheck == false) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 14"); + if (MainActivity.csLibrary4A.setRetryCount(retry) == false) + invalidRequest = true; + } + } + if (invalidRequest == false) { + if (MainActivity.csLibrary4A.getCurrentProfile() != profile || sameCheck == false) { + sameSetting = false; MainActivity.csLibrary4A.appendToLog("point 15 with profile = " + profile); + if (MainActivity.csLibrary4A.setCurrentLinkProfile(profile) == false) + invalidRequest = true; + } + } + if (invalidRequest == false) { + switch(rflnagain) { + case 1: + rflnagain = 2; + break; + case 2: + rflnagain = 3; + break; + case 0: + default: + rflnagain = 0; + break; + } + switch(iflnagain) { + case 1: + iflnagain = 1; + break; + case 2: + iflnagain = 3; + break; + case 3: + iflnagain = 7; + break; + case 0: + default: + iflnagain = 0; + break; + } + switch(agcgain) { + case 1: + agcgain = 4; + break; + case 2: + agcgain = 6; + break; + case 3: + agcgain = 7; + break; + case 0: + default: + agcgain = 0; + break; + } + if ((MainActivity.csLibrary4A.getHighCompression() != highCompression) + || (MainActivity.csLibrary4A.getRflnaGain() != rflnagain) + || (MainActivity.csLibrary4A.getIflnaGain() != iflnagain) + || (MainActivity.csLibrary4A.getAgcGain() != agcgain) + || sameCheck == false) { + sameSetting = false; + if (MainActivity.csLibrary4A.setRxGain(highCompression, rflnagain, iflnagain, agcgain) == false) + invalidRequest = true; + } + } + settingTask = new SettingTask((sameCheck ? button: button1), sameSetting, invalidRequest); + settingTask.execute(); + MainActivity.csLibrary4A.saveSetting2File(); + mHandler.post(updateRunnable); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.Spinner; + +import androidx.fragment.app.DialogFragment; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public class SettingWedgeFragment extends DialogFragment { + EditText editTextPower, editTextPrefix, editTextSuffix; + Spinner spinnerDelimiter, spinnerOutput; + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_directwedge_settings, null); + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("Wedge Settings"); + //builder.setMessage("simple wedge setttings"); + builder.setView(view); + builder.setPositiveButton("Save", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + String wedgePower = editTextPower.getText().toString(); + try { + int iWedgePower = Integer.parseInt(wedgePower); + if (iWedgePower < 0) iWedgePower = 0; + else if (iWedgePower > 300) iWedgePower = 300; + editTextPower.setText(String.valueOf(iWedgePower)); + MainActivity.csLibrary4A.setWedgePower(iWedgePower); + } catch (Exception ex) { } + MainActivity.csLibrary4A.setWedgePrefix(editTextPrefix.getText().toString()); + MainActivity.csLibrary4A.setWedgeSuffix(editTextSuffix.getText().toString()); + int wedgeDelimiter = 0x0A; + switch (spinnerDelimiter.getSelectedItemPosition()) { + default: + break; + case 1: + wedgeDelimiter = 0x09; + break; + case 2: + wedgeDelimiter = 0x2c; + break; + case 3: + wedgeDelimiter = 0x20; + break; + case 4: + wedgeDelimiter = -1; + break; + } + MainActivity.csLibrary4A.setWedgeDelimiter(wedgeDelimiter); + MainActivity.csLibrary4A.appendToLog("SettingWedgeFragment, onCreateDialog: wedgeDelimiter = " + MainActivity.csLibrary4A.getWedgeOutput()); + MainActivity.csLibrary4A.setWedgeOutput(spinnerOutput.getSelectedItemPosition()); + MainActivity.csLibrary4A.saveWedgeSetting2File(); + getDialog().dismiss(); + } + }); + builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + getDialog().dismiss(); + } + }); + + editTextPower = (EditText) view.findViewById(R.id.directWedgeSettingEditTextPower); + MainActivity.csLibrary4A.appendToLog("editTextPower is " + (editTextPower == null ? "null" : "valid")); + if (editTextPower != null) editTextPower.setText(String.valueOf(MainActivity.csLibrary4A.getWedgePower())); + + editTextPrefix = (EditText) view.findViewById(R.id.directWedgeSettingEditTextPrefix); + MainActivity.csLibrary4A.appendToLog("editTextPrefix is " + (editTextPrefix == null ? "null" : "valid")); + if (editTextPrefix != null) editTextPrefix.setText(MainActivity.csLibrary4A.getWedgePrefix()); + + editTextSuffix = (EditText) view.findViewById(R.id.directWedgeSettingEditTextSuffix); + MainActivity.csLibrary4A.appendToLog("editTextSuffix is " + (editTextSuffix == null ? "null" : "valid")); + if (editTextSuffix != null) editTextSuffix.setText(MainActivity.csLibrary4A.getWedgeSuffix()); + + spinnerDelimiter = (Spinner) view.findViewById(R.id.directWedgeSettingSpinnerDelimiter); + MainActivity.csLibrary4A.appendToLog("spinnerDelimiter is " + (spinnerDelimiter == null ? "null" : "valid")); + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.delimiter_options, R.layout.custom_spinner_layout); + MainActivity.csLibrary4A.appendToLog("targetAdapter is " + (targetAdapter == null ? "null" : "valid")); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + int position = 0; + MainActivity.csLibrary4A.appendToLog("SettingWedgeFragment, onCreatDialog: wedgeDelimiter = " + MainActivity.csLibrary4A.getWedgeDelimiter()); + switch (MainActivity.csLibrary4A.getWedgeDelimiter()) { + default: + position = 0; + break; + case 0x09: + position = 1; + break; + case 0x2C: + position = 2; + break; + case 0x20: + position = 3; + break; + case -1: + position = 4; + break; + } + MainActivity.csLibrary4A.appendToLog("position is " + position); + spinnerDelimiter.setAdapter(targetAdapter); + spinnerDelimiter.setSelection(position); + + spinnerOutput = (Spinner) view.findViewById(R.id.directWedgeSettingSpinnerOutput); + MainActivity.csLibrary4A.appendToLog("spinnerOutput is " + (spinnerOutput == null ? "null" : "valid")); + ArrayAdapter targetAdapter1 = ArrayAdapter.createFromResource(getActivity(), R.array.wedgeOutput_options, R.layout.custom_spinner_layout); + MainActivity.csLibrary4A.appendToLog("targetAdapter1 is " + (targetAdapter1 == null ? "null" : "valid")); + targetAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + int position1 = MainActivity.csLibrary4A.getWedgeOutput(); + MainActivity.csLibrary4A.appendToLog("position1 is " + position1); + spinnerOutput.setAdapter(targetAdapter1); + spinnerOutput.setSelection(position1); + + return builder.create(); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static android.Manifest.permission.RECORD_AUDIO; +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; + +import android.content.pm.PackageManager; +import android.media.MediaPlayer; +import android.media.MediaRecorder; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.SeekBar; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.SimpleDateFormat; + +public class Test1Fragment extends CommonFragment { + Button startbtn, stopbtn, playbtn, stopplay; + MediaRecorder mRecorder; + MediaPlayer mediaPlayer; + static final String LOG_TAG = "AudioRecording"; + static String mFileName = null; + public static final int REQUEST_AUDIO_PERMISSION_CODE = 1; + Handler handler = new Handler(); + + TextView seekBarHint; + SeekBar seekBar; + boolean wasPlaying = false; + + File file; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_test1, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + androidx.appcompat.app.ActionBar actionBar; + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_access); + actionBar.setTitle("Test"); + + startbtn = (Button) getActivity().findViewById(R.id.btnRecord); + stopbtn = (Button) getActivity().findViewById(R.id.btnStop); + playbtn = (Button) getActivity().findViewById(R.id.btnPlay); + stopplay = (Button) getActivity().findViewById(R.id.btnStopPlay); + stopbtn.setEnabled(false); + playbtn.setEnabled(false); + stopplay.setEnabled(false); + mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); + mFileName += "/Download/cs710Java/"; + + seekBarHint = (TextView) getActivity().findViewById(R.id.textView); + seekBar = (SeekBar) getActivity().findViewById(R.id.seekbar); + + startbtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(CheckPermissions() == false) RequestPermissions(); + else { + startbtn.setEnabled(false); + stopbtn.setEnabled(true); + playbtn.setEnabled(false); + stopplay.setEnabled(false); + + mRecorder = new MediaRecorder(); + mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); + mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); + mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); + mFileName += "audio"; + mFileName += new SimpleDateFormat("_yyMMdd_HHmmss").format(new java.util.Date()); + Log.i("Hello2", "mFileName is " + mFileName ); + mRecorder.setOutputFile(mFileName + ".3gp"); + try { + mRecorder.prepare(); + } catch (IOException e) { + Log.e(LOG_TAG, "prepare() failed"); + } + mRecorder.start(); + Toast.makeText(getActivity().getApplicationContext(), "Recording Started", Toast.LENGTH_LONG).show(); + + file = new File(getActivity().getFilesDir(), mFileName + ".txt"); + try { + FileOutputStream stream = new FileOutputStream(file); + stream.write("Start of data\n".getBytes()); + String outData = "preFilterData.maskbit"; + stream.write(outData.getBytes()); + stream.write("End of data\n".getBytes()); + stream.close(); + } catch (Exception ex) { + Log.i("Hello2", "Exception is " + ex.toString()); + } + + MainActivity.mSensorConnector.mLocationDevice.turnOn(true); + MainActivity.mSensorConnector.mSensorDevice.turnOn(true); + handler.post(runnableRecord); + } + } + }); + + stopbtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startbtn.setEnabled(true); + stopbtn.setEnabled(false); + playbtn.setEnabled(true); + stopplay.setEnabled(true); + mRecorder.stop(); + mRecorder.release(); + mRecorder = null; + Toast.makeText(getActivity().getApplicationContext(), "Recording Stopped", Toast.LENGTH_LONG).show(); + + MainActivity.mSensorConnector.mLocationDevice.turnOn(false); + MainActivity.mSensorConnector.mSensorDevice.turnOn(false); + handler.removeCallbacks(runnableRecord); + } + }); + + playbtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startbtn.setEnabled(true); + stopbtn.setEnabled(false); + playbtn.setEnabled(false); + stopplay.setEnabled(true); + + if (mediaPlayer != null) { + try { + if (mediaPlayer.isPlaying()) { + clearMediaPlayer(); + wasPlaying = true; + } + } catch (Exception ex) { + Log.i("Hello2", "Exception is " + ex.toString()); + } + } + if (!wasPlaying) { + if (mediaPlayer == null) mediaPlayer = new MediaPlayer(); + try { + mediaPlayer.setDataSource(mFileName); + mediaPlayer.prepare(); + mediaPlayer.setLooping(false); + seekBar.setMax(mediaPlayer.getDuration()); + + mediaPlayer.start(); + Toast.makeText(getActivity().getApplicationContext(), "Recording Started Playing", Toast.LENGTH_LONG).show(); + handler.removeCallbacks(runnablePlay); + handler.post(runnablePlay); + } catch (IOException e) { + Log.e(LOG_TAG, "prepare() failed"); + } + } + } + }); + + stopplay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearMediaPlayer(); + Toast.makeText(getActivity().getApplicationContext(),"Playing Audio Stopped", Toast.LENGTH_SHORT).show(); + } + }); + + seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + seekBarHint.setVisibility(View.VISIBLE); + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { + seekBarHint.setVisibility(View.VISIBLE); + int x = (int) Math.ceil(progress / 1000f); + if (x != 0 && mediaPlayer != null && !mediaPlayer.isPlaying()) { + clearMediaPlayer(); + } + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + if (mediaPlayer != null && mediaPlayer.isPlaying()) { + mediaPlayer.seekTo(seekBar.getProgress()); + } + } + }); + } + + void clearMediaPlayer() { + if (mediaPlayer != null) { + mediaPlayer.stop(); + mediaPlayer.release(); + } + seekBar.setProgress(0); + startbtn.setEnabled(true); + stopbtn.setEnabled(false); + playbtn.setEnabled(true); + stopplay.setEnabled(false); + mediaPlayer = null; + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + switch (requestCode) { + case REQUEST_AUDIO_PERMISSION_CODE: + if (grantResults.length> 0) { + boolean permissionToRecord = grantResults[0] == PackageManager.PERMISSION_GRANTED; + boolean permissionToStore = grantResults[1] == PackageManager.PERMISSION_GRANTED; + if (permissionToRecord && permissionToStore) { + Toast.makeText(getActivity().getApplicationContext(), "Permission Granted", Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(getActivity().getApplicationContext(),"Permission Denied",Toast.LENGTH_LONG).show(); + } + } + break; + } + } + + boolean CheckPermissions() { + int result = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), WRITE_EXTERNAL_STORAGE); + int result1 = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), RECORD_AUDIO); + Log.i("Hello2", "result = " + result + ", result1 = " + result1); + return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED; + } + + void RequestPermissions() { + ActivityCompat.requestPermissions(getActivity(), new String[]{RECORD_AUDIO, WRITE_EXTERNAL_STORAGE}, REQUEST_AUDIO_PERMISSION_CODE); + } + + + final Runnable runnableRecord = new Runnable() { + boolean DEBUG = false; + @Override + public void run() { + String stringLocation = MainActivity.mSensorConnector.mLocationDevice.getLocation(); + String stringCompass = MainActivity.mSensorConnector.mSensorDevice.getEcompass(); + Log.i("Hello2", "stringLocation = " + stringLocation + ", stringCompass = " + stringCompass); + handler.postDelayed(runnableRecord, 1000); + } + }; + + final Runnable runnablePlay = new Runnable() { + boolean DEBUG = false; + @Override + public void run() { + boolean bPlaying = false; + try { + if (mediaPlayer != null && mediaPlayer.isPlaying()) { + int currentPosition = mediaPlayer.getCurrentPosition(); + int total = mediaPlayer.getDuration(); + if (currentPosition < total) { + seekBar.setProgress(currentPosition); + bPlaying = true; + } + } else clearMediaPlayer(); + } catch (Exception ex) { + Log.i("Hello2", "Runnable Exception: " + ex.toString()); + } + if (bPlaying) handler.postDelayed(runnablePlay, 1000); + else clearMediaPlayer(); + } + }; + + @Override + public void onDestroy() { + super.onDestroy(); + } + + public Test1Fragment() { + super("Test1Fragment"); + } + +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; + +import androidx.appcompat.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; + +public class TestFragment extends CommonFragment { + private Button buttonRead; + private Button buttonWrite; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.fragment_test, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + androidx.appcompat.app.ActionBar actionBar; + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_access); + actionBar.setTitle("Test"); + + buttonRead = (Button) getActivity().findViewById(R.id.accessRWReadButton); + buttonWrite = (Button) getActivity().findViewById(R.id.accessRWWriteButton); + } + + @Override + public void onDestroy() { + MainActivity.csLibrary4A.setSameCheck(true); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + public TestFragment() { + super("TestFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class Ucode8Fragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Configure", "Scan", "Security", "Untrace"}; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment = (InventoryRfidiMultiFragment) adapter.getItem(1); + if (item.getItemId() == R.id.menuAction_clear) { + fragment.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_ucode8); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, new AccessUcode8Fragment()); + adapter.setFragment(1, InventoryRfidiMultiFragment.newInstance(true, null, "")); + adapter.setFragment(2, new AccessUcodeFragment()); + adapter.setFragment(3, new UtraceFragment()); + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + MainActivity.csLibrary4A.setSelectCriteriaDisable(1); + MainActivity.csLibrary4A.restoreAfterTagSelect(); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public Ucode8Fragment() { + super("Ucode8Fragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_NXP_UCODEDNA; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import com.csl.cs710ademoapp.R; +import com.csl.cslibrary4a.AdapterTab; +import com.google.android.material.tabs.TabLayout; + +public class UcodeFragment extends CommonFragment { + private ActionBar actionBar; + private ViewPager viewPager; + AdapterTab adapter; + + private String[] tabs = {"Scan", "Authenticate"}; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, true); + return inflater.inflate(R.layout.custom_tabbed_layout, container, false); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + InventoryRfidiMultiFragment fragment = (InventoryRfidiMultiFragment) adapter.getItem(0); + if (item.getItemId() == R.id.menuAction_clear) { + fragment.clearTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_sortRssi) { + fragment.sortTagsListByRssi(); + return true; + } else if (item.getItemId() == R.id.menuAction_sort) { + fragment.sortTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_save) { + fragment.saveTagsList(); + return true; + } else if (item.getItemId() == R.id.menuAction_share) { + fragment.shareTagsList(); + return true; + } else return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); + actionBar.setIcon(R.drawable.dl_inv); + actionBar.setTitle(R.string.title_activity_ucodeDNA); + + TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.OperationsTabLayout); + + adapter = new AdapterTab(getActivity().getSupportFragmentManager(), tabs.length); + adapter.setFragment(0, InventoryRfidiMultiFragment.newInstance(true, TAG_NXP_UCODEDNA, "E2C06")); + adapter.setFragment(1, new AccessUcodeFragment()); + + + viewPager = (ViewPager) getActivity().findViewById(R.id.OperationsPager); + viewPager.setAdapter(adapter); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + + for (String tab_name : tabs) { + tabLayout.addTab(tabLayout.newTab().setText(tab_name)); + } + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + } + + @Override + public void onPause() { + adapter.fragment0.onPause(); + adapter.fragment1.onPause(); + super.onPause(); + } + + @Override + public void onStop() { + adapter.fragment0.onStop(); + adapter.fragment1.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + adapter.fragment0.onDestroyView(); + adapter.fragment1.onDestroyView(); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + adapter.fragment0.onDestroy(); + adapter.fragment1.onDestroy(); + super.onDestroy(); + } + + @Override + public void onDetach() { + adapter.fragment0.onDetach(); + adapter.fragment1.onDetach(); + super.onDetach(); + } + + public UcodeFragment() { + super("UcodeFragment"); + } +} + + + +package com.csl.cs710ademoapp.fragments; + +import android.app.Activity; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.RadioButton; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.AccessTask; +import com.csl.cs710ademoapp.MainActivity; +import com.csl.cs710ademoapp.R; +import com.csl.cs710ademoapp.SelectTag; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +public class UtraceFragment extends CommonFragment { + final boolean DEBUG = true; + SelectTag selectTag; + Spinner memoryBankSpinner; + EditText editTextRWTagID, editTextAccessRWAccPassword; + CheckBox checkBoxHideXpc, checkBoxHideEpc, checkBoxHideTid, checkBoxHideUser, checkBoxHideRange; + RadioButton radioButtonRangeToggle, radioButtonRangeReduced, radioButtonHideSomeTid, radioButtonHideAllTid; + + EditText editTextEpcSize; + private Button buttonUntrace; String strUntraceButtonBackup; + private AccessTask accessTask; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState, false); + return inflater.inflate(R.layout.fragment_utrace, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + selectTag = new SelectTag((Activity)getActivity(), 2); + + checkBoxHideXpc = (CheckBox) getActivity().findViewById(R.id.utraceAssertUXPC); + checkBoxHideEpc = (CheckBox) getActivity().findViewById(R.id.utraceHideEpc); + checkBoxHideEpc.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + TextView textView = (TextView) getActivity().findViewById(R.id.utraceEpcLengthTitle); + if (isChecked) { + textView.setVisibility(View.VISIBLE); + editTextEpcSize.setVisibility(View.VISIBLE); + } else { + textView.setVisibility(View.INVISIBLE); + editTextEpcSize.setVisibility(View.INVISIBLE); + } + } + }); + checkBoxHideTid = (CheckBox) getActivity().findViewById(R.id.utraceHideTid); + radioButtonHideSomeTid = (RadioButton) getActivity().findViewById(R.id.utraceHideSomeTid); + radioButtonHideAllTid = (RadioButton) getActivity().findViewById(R.id.utraceHideAllTid); + checkBoxHideTid.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + RadioButton radioButton1 = (RadioButton) getActivity().findViewById(R.id.utraceHideSomeTid); + RadioButton radioButton2 = (RadioButton) getActivity().findViewById(R.id.utraceHideAllTid); + if (isChecked) { + radioButton1.setVisibility(View.VISIBLE); + radioButton2.setVisibility(View.VISIBLE); + } else { + radioButton1.setVisibility(View.INVISIBLE); + radioButton2.setVisibility(View.INVISIBLE); + } + } + }); + checkBoxHideUser = (CheckBox) getActivity().findViewById(R.id.utraceHideUser); + + checkBoxHideRange = (CheckBox) getActivity().findViewById(R.id.utraceHideRange); + radioButtonRangeToggle = (RadioButton) getActivity().findViewById(R.id.utraceRangeToggle); + radioButtonRangeReduced = (RadioButton) getActivity().findViewById(R.id.utraceRangeReduced); + checkBoxHideRange.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + RadioButton radioButton1 = (RadioButton) getActivity().findViewById(R.id.utraceRangeToggle); + RadioButton radioButton2 = (RadioButton) getActivity().findViewById(R.id.utraceRangeReduced); + if (isChecked) { + radioButton1.setVisibility(View.VISIBLE); + radioButton2.setVisibility(View.VISIBLE); + } else { + radioButton1.setVisibility(View.INVISIBLE); + radioButton2.setVisibility(View.INVISIBLE); + } + } + }); + + editTextEpcSize = (EditText) getActivity().findViewById(R.id.utraceEpcLength); + + selectTag.editTextAccessAntennaPower.setText(String.valueOf(300)); + + buttonUntrace = (Button) getActivity().findViewById(R.id.utraceUntraceButton); + buttonUntrace.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (MainActivity.csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, R.string.toast_ble_not_connected, Toast.LENGTH_SHORT).show(); + return; + } else if (MainActivity.csLibrary4A.isRfidFailure()) { + Toast.makeText(MainActivity.mContext, "Rfid is disabled", Toast.LENGTH_SHORT).show(); + return; + } + startAccessTask(); + } + }); + + MainActivity.csLibrary4A.appendToLog("going to setupTagID"); setupTagID(); + MainActivity.csLibrary4A.setSameCheck(false); + } + + @Override + public void onResume() { + super.onResume(); + MainActivity.csLibrary4A.appendToLog("going to setupTagID"); setupTagID(); + } + + @Override + public void onDestroy() { + if (accessTask != null) accessTask.cancel(true); + super.onDestroy(); + } + + boolean userVisibleHint = false; + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if(getUserVisibleHint()) { + MainActivity.csLibrary4A.appendToLog("going to setupTagID"); setupTagID(); + userVisibleHint = true; + MainActivity.csLibrary4A.appendToLog("UtraceFragment is now VISIBLE"); + } else { + userVisibleHint = false; + MainActivity.csLibrary4A.appendToLog("UtraceFragment is now INVISIBLE"); + } + } + + public UtraceFragment() { + super("UtraceFragment"); + } + + void setupTagID() { + MainActivity.csLibrary4A.appendToLog("selectTag 1 = " + (selectTag != null ? "Valid" : "Null")); + if (selectTag == null) return; + ReaderDevice tagSelected = MainActivity.tagSelected; + MainActivity.csLibrary4A.appendToLog("Start with tagSelected = " + (tagSelected == null ? "NULL" : (tagSelected.getSelected() + ", " + tagSelected.getAddress()))); + boolean bSelected = false; + if (tagSelected != null) { + if (tagSelected.getSelected() == true) { + bSelected = true; + MainActivity.csLibrary4A.appendToLog("selectTag is " + (selectTag == null ? "NULL" : "valid")); + if (selectTag != null) MainActivity.csLibrary4A.appendToLog("selectTag.editTextTag is " + (selectTag.editTextTagID == null ? "NULL" : "valid")); + if (selectTag.editTextTagID != null) { + MainActivity.csLibrary4A.appendToLog("editTextRWTagID.setText " + tagSelected.getAddress()); + selectTag.editTextTagID.setText(tagSelected.getAddress()); + } + + String stringDetail = tagSelected.getDetails(); + int indexUser = stringDetail.indexOf("USER="); + if (indexUser != -1) { + String stringUser = stringDetail.substring(indexUser + 5); + MainActivity.csLibrary4A.appendToLog("stringUser = " + stringUser); + + boolean bEnableBAPMode = false; + int number = Integer.valueOf(stringUser.substring(3, 4), 16); + if ((number % 2) == 1) bEnableBAPMode = true; +// CheckBox checkBoxBAP = (CheckBox) getActivity().findViewById(R.id.coldChainEnableBAP); +// checkBoxBAP.setChecked(bEnableBAPMode); + } + } + } + } + + void startAccessTask() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("startAccessTask()"); + if (updating == false) { + updating = true; + mHandler.removeCallbacks(updateRunnable); + mHandler.post(updateRunnable); + } + } + boolean updating = false; + private final Runnable updateRunnable = new Runnable() { + @Override + public void run() { + boolean rerunRequest = false; boolean taskRequest = false; + if (accessTask == null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("updateRunnable(): NULL accessReadWriteTask"); + taskRequest = true; + } else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) { + rerunRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("updateRunnable(): accessReadWriteTask.getStatus() = " + accessTask.getStatus().toString()); + } else { + taskRequest = true; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("updateRunnable(): FINISHED accessReadWriteTask"); + } + if (processResult()) { MainActivity.csLibrary4A.appendToLog("processResult is TRUE"); } + else if (taskRequest) { + int rangeValue = 0; + if (checkBoxHideRange.isChecked()) { + if (radioButtonRangeToggle.isChecked()) rangeValue = 1; + else if (radioButtonRangeReduced.isChecked()) rangeValue = 2; + } + int tidValue = 0; + if (checkBoxHideTid.isChecked()) { + if (radioButtonHideSomeTid.isChecked()) tidValue = 1; + else if (radioButtonHideAllTid.isChecked()) tidValue = 2; + } + int epcValue = 0; + epcValue = Integer.parseInt(editTextEpcSize.getText().toString()); + if (epcValue < 0 || epcValue > 31) { + epcValue = 6; editTextEpcSize.setText("6"); + } + boolean invalid = (MainActivity.csLibrary4A.setUntraceable(rangeValue, checkBoxHideUser.isChecked(), tidValue, epcValue, checkBoxHideEpc.isChecked(), checkBoxHideXpc.isChecked()) == false); + MainActivity.csLibrary4A.appendToLog("processTickItems, invalid = " + invalid); + + Button button = buttonUntrace; int selectBank = selectTag.spinnerSelectBank.getSelectedItemPosition() + 1; MainActivity.csLibrary4A.appendToLog("selectBank = " + selectBank); + //if (strUntraceButtonBackup == null) strUntraceButtonBackup = buttonUntrace.getText().toString(); buttonUntrace.setText("Show"); button = buttonUntrace; + accessTask = new AccessTask(button, null, invalid, true, + selectTag.editTextTagID.getText().toString(), selectBank, (selectBank == 1 ? 32 : 0), + selectTag.editTextAccessPassword.getText().toString(), Integer.valueOf(selectTag.editTextAccessAntennaPower.getText().toString()), RfidReaderChipData.HostCommands.CMD_UNTRACEABLE, + 0, 0, true, false, + null, null, null, null, null); + accessTask.execute(); + rerunRequest = true; + } + if (rerunRequest) { + mHandler.postDelayed(updateRunnable, 500); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("updateRunnable(): Restart"); + } + else updating = false; + MainActivity.csLibrary4A.appendToLog("updateRunnable(): Ending with updating = " + updating); + } + }; + + boolean processResult() { + String accessResult = null; + if (accessTask == null) return false; + else if (accessTask.getStatus() != AsyncTask.Status.FINISHED) return false; + else { + accessResult = accessTask.accessResult; + //if (strUntraceButtonBackup != null) buttonUntrace.setText(strUntraceButtonBackup); strUntraceButtonBackup = null; + accessTask = null; + return true; + } + } +} + + + +package com.csl.cs710ademoapp; + +import android.graphics.Color; +import android.text.Editable; +import android.text.InputFilter; +import android.text.TextWatcher; +import android.widget.EditText; + +public class GenericTextWatcher implements TextWatcher { + EditText editText; + int maxLength; + InputFilter mInputFilter; + + public GenericTextWatcher(EditText editText, int maxLength) { + this.editText = editText; + this.maxLength = maxLength; + mInputFilter = new InputFilter.LengthFilter(maxLength); + editText.setFilters(new InputFilter[] { mInputFilter }); + } + + public void afterTextChanged(Editable s) { + if (s.length() != 0 && s.length() < maxLength) { + editText.setTextColor(Color.RED); + } else + editText.setTextColor(Color.BLACK); + } + public void beforeTextChanged(CharSequence s, int start, int count, int after){} + public void onTextChanged(CharSequence s, int start, int before, int count){} +} + + + +package com.csl.cs710ademoapp; + +import android.os.AsyncTask; +import android.os.Handler; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.adapters.ReaderListAdapter; +import com.csl.cslibrary4a.ReaderDevice; + +import java.util.ArrayList; + +public class InventoryBarcodeTask extends AsyncTask { + final boolean DEBUG = false, ALLOW_WEDGE = true; + public enum TaskCancelRReason { + NULL, INVALD_REQUEST, DESTORY, STOP, BUTTON_RELEASE, TIMEOUT + } + final private boolean bAdd2End = false; + final boolean endingRequest = false; + + public TaskCancelRReason taskCancelReason; + int batteryCountInventory_old; long startTimeMillis, runTimeMillis; + + private int total, allTotal; + private int yield = 0; + private long timeMillis; + + boolean requestSound = false; boolean requestNewSound = false; boolean requestNewVibrate = false; long timeMillisNewVibrate; + long timeMillisSound = 0; + Handler handler = new Handler(); boolean bUseVibrateMode0 = false; + + protected void onPreExecute() { + MainActivity.sharedObjects.runningInventoryBarcodeTask = true; + if (button != null) button.setText("Stop"); if (button1 != null) button1.setText("Stop"); + total = 0; allTotal = 0; yield = 0; + if (tagsList != null) { + yield = tagsList.size(); + for (int i = 0; i < yield; i++) { + allTotal += tagsList.get(i).getCount(); + } + } +// tagsList.clear(); +// readerListAdapter.notifyDataSetChanged(); + timeMillis = 0; startTimeMillis = System.currentTimeMillis(); runTimeMillis = startTimeMillis; + taskCancelReason = TaskCancelRReason.NULL; + if (barcodeYieldView != null) barcodeYieldView.setText(""); + + MainActivity.csLibrary4A.barcodeInventory(true); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryBarcodeFragment.InventoryRfidTask.onPreExecute()"); + MainActivity.csLibrary4A.appendToLog("setVibrateOn A 3 with getInventoryVibrate as " + MainActivity.csLibrary4A.getInventoryVibrate() + ", bUseVibrateMode0 as " + bUseVibrateMode0); + if (MainActivity.csLibrary4A.getInventoryVibrate() && bUseVibrateMode0 == false) MainActivity.csLibrary4A.setVibrateOn(3); + } + + @Override + protected String doInBackground(Void... a) { + while (MainActivity.csLibrary4A.isBleConnected() && isCancelled() == false) { + int batteryCount = MainActivity.csLibrary4A.getBatteryCount(); + if (batteryCountInventory_old != batteryCount) { + batteryCountInventory_old = batteryCount; + publishProgress("VV"); + } + if (System.currentTimeMillis() > runTimeMillis + 1000) { + runTimeMillis = System.currentTimeMillis(); + publishProgress("WW"); + } + if (System.currentTimeMillis() - timeMillisSound > 1000) { + timeMillisSound = System.currentTimeMillis(); + requestSound = true; + } + byte[] onBarcodeEvent = MainActivity.csLibrary4A.onBarcodeEvent(); + if (onBarcodeEvent != null) { + MainActivity.csLibrary4A.appendToLog("BarStream: onBarcodeEvent= " + MainActivity.csLibrary4A.byteArrayToString(onBarcodeEvent)); + String stringBar = null; + if (true) stringBar = new String(onBarcodeEvent); + else if (onBarcodeEvent.length != 0) { + for (int i = 0; i < onBarcodeEvent.length; i++) { + String stringLetter = ""; + if (false && onBarcodeEvent[i] == 0x0D) { if (false) stringLetter = ""; } + else if (false && onBarcodeEvent[i] == 0x0A) { if (false) stringLetter = ""; } + else { + byte[] arrayLetter = new byte[1]; + arrayLetter[0] = onBarcodeEvent[i]; + stringLetter = new String(arrayLetter); + if (stringLetter.length() == 0) MainActivity.csLibrary4A.appendToLog("Non-printable character = " + MainActivity.csLibrary4A.byteArrayToString(arrayLetter)); + } + if (stringBar == null) stringBar = stringLetter; + else stringBar += stringLetter; + } + } + MainActivity.csLibrary4A.appendToLog("BarStream: onBarcodeEvent, stringBar= " + stringBar); + if (stringBar != null) { if (stringBar.length() != 0) { publishProgress(null, stringBar.trim()); } } + timeMillis = System.currentTimeMillis(); + } else if (System.currentTimeMillis() - timeMillis > 300) { if (taskCancelReason != TaskCancelRReason.NULL) cancel(true); } + if (MainActivity.csLibrary4A.isBleConnected() == false) taskCancelReason = TaskCancelRReason.DESTORY; + } + return "End of Asynctask()"; + } + + @Override + protected void onProgressUpdate(String... output) { + if (output != null) { + if (output[0] != null) { + if (output[0].length() == 2) { + if (output[0].contains("WW")) { + long timePeriod = (System.currentTimeMillis() - startTimeMillis) / 1000; + if (timePeriod > 0) + if (barcodeRunTime != null) barcodeRunTime.setText(String.format("Run time: %d sec", timePeriod)); + } else if (taskCancelReason == TaskCancelRReason.NULL) { + if (barcodeVoltageLevel != null) barcodeVoltageLevel.setText(MainActivity.csLibrary4A.getBatteryDisplay(true)); + } + } + return; + } + if (registerBarValue != null) registerBarValue.setText(output[1]); + boolean match = false; + if (false || tagsList != null) { + MainActivity.csLibrary4A.appendToLog("BarMatch: Matching bdata = " + output[1]); + for (int i = 0; i < tagsList.size(); i++) { + String strInList = tagsList.get(i).getAddress(); + if (output[1].length() == strInList.length() && output[1].indexOf(strInList) == 0) { + MainActivity.csLibrary4A.appendToLog("BarMatch: Matched stored bdata" + i + "= " + tagsList.get(i).getAddress()); + ReaderDevice readerDevice = tagsList.get(i); + int count = readerDevice.getCount(); + count++; + readerDevice.setCount(count); + tagsList.set(i, readerDevice); + match = true; + break; + } else MainActivity.csLibrary4A.appendToLog("BarMatch: NOT Matched stored bdata" + i + "= " + tagsList.get(i).getAddress()); + } + } + if (match == false) { + if (ALLOW_WEDGE) MainActivity.sharedObjects.serviceArrayList.add(output[1]); + MainActivity.csLibrary4A.appendToLog(output[1] + " is added to MainActivity.shareObjects.serviceArrayList with size = " + MainActivity.sharedObjects.serviceArrayList.size()); + + ReaderDevice readerDevice = new ReaderDevice("", output[1], false, "", 1, 0); + if (tagsList != null) { + if (bAdd2End) tagsList.add(readerDevice); + else tagsList.add(0, readerDevice); + } + yield++; + if (barcodeYieldView != null) barcodeYieldView.setText("Unique:" + String.valueOf(yield)); + requestNewSound = true; requestNewVibrate = true; + } + total++; allTotal++; + if (barcodeRateView != null) barcodeRateView.setText("Total:" + String.valueOf(allTotal)); + if (readerListAdapter != null) readerListAdapter.notifyDataSetChanged(); + + if (playerN != null && playerO != null) { + if (requestSound && playerO.isPlaying() == false && playerN.isPlaying() == false) { + if (true) { + if (bStartBeepWaiting == false) { + bStartBeepWaiting = true; + handler.postDelayed(runnableStartBeep, 250); + } + if (MainActivity.csLibrary4A.getInventoryVibrate()) { + boolean validVibrate0 = false, validVibrate = false; + if (MainActivity.csLibrary4A.getVibrateModeSetting() == 0) { + if (requestNewVibrate) validVibrate0 = true; + } else validVibrate0 = true; + requestNewVibrate = false; + + if (bUseVibrateMode0 && validVibrate0 && bStartVibrateWaiting == false) { + if (System.currentTimeMillis() - timeMillisNewVibrate > MainActivity.csLibrary4A.getVibrateWindow() * 1000 ) { + timeMillisNewVibrate = System.currentTimeMillis(); + validVibrate = true; + } + } + if (validVibrate) { + MainActivity.csLibrary4A.appendToLog("setVibrateOn b 1"); + MainActivity.csLibrary4A.setVibrateOn(1); + bStartVibrateWaiting = true; + handler.postDelayed(runnableStartVibrate, MainActivity.csLibrary4A.getVibrateTime()); + } + } + } else { + requestSound = false; + if (requestNewSound) { + requestNewSound = false; + if (playerN != null) playerN.start(); + } else { + if (playerO != null) playerO.start(); + } + } + } + } + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryBarcodeFragment with NULL data"); + } + } + + boolean bStartBeepWaiting = false; + Runnable runnableStartBeep = new Runnable() { + @Override + public void run() { + bStartBeepWaiting = false; + requestSound = false; + if (requestNewSound) { + requestNewSound = false; + playerN.start(); //playerN.setVolume(300, 300); + } else { + playerO.start(); //playerO.setVolume(30, 30); + } + } + }; + + boolean bStartVibrateWaiting = false; + Runnable runnableStartVibrate = new Runnable() { + @Override + public void run() { + bStartVibrateWaiting = false; + } + }; + + @Override + protected void onCancelled() { + super.onCancelled(); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryBarcodeFragment() onCancelled()"); + + DeviceConnectTask4InventoryEnding(taskCancelReason); + } + + @Override + protected void onPostExecute(String result) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryBarcodeFragment() onPostExecute(): " + result); + + DeviceConnectTask4InventoryEnding(taskCancelReason); + } + + private EditText registerBarValue; + private ArrayList tagsList; + private ReaderListAdapter readerListAdapter; + private TextView barcodeRunTime, barcodeVoltageLevel; + private TextView barcodeYieldView; + private Button button, button1; String textButton, btextButton1; + private TextView barcodeRateView; + private boolean noToast; + CustomMediaPlayer playerO, playerN; + public InventoryBarcodeTask() { } + public InventoryBarcodeTask(ArrayList tagsList, ReaderListAdapter readerListAdapter, EditText registerBarValue, + TextView barcodeRunTime, TextView barcodeVoltageLevel, + TextView barcodeYieldView, Button button, Button button1, TextView barcodeRateView, boolean noToast) { + this.registerBarValue = registerBarValue; + this.tagsList = tagsList; + this.readerListAdapter = readerListAdapter; + this.barcodeRunTime = barcodeRunTime; + this.barcodeVoltageLevel = barcodeVoltageLevel; + this.barcodeYieldView = barcodeYieldView; + this.button = button; textButton = button.getText().toString(); + this.button1 = button1; if (button1 != null) btextButton1 = button1.getText().toString(); + this.barcodeRateView = barcodeRateView; + this.noToast = noToast; + + playerO = MainActivity.sharedObjects.playerO; + playerN = MainActivity.sharedObjects.playerN; + } + + void DeviceConnectTask4InventoryEnding(TaskCancelRReason taskCancelRReason) { + if (readerListAdapter != null) readerListAdapter.notifyDataSetChanged(); + MainActivity.csLibrary4A.barcodeInventory(false); + if (true) MainActivity.csLibrary4A.appendToLog("DeviceConnectTask4InventoryEnding(): sent setBarcodeOn(false)"); + if (taskCancelReason == null) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (noToast == false) Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_END, Toast.LENGTH_SHORT).show(); + button.setText(textButton); + if (button1 != null) button1.setText(btextButton1); + } + }, 5000); + } else { + if (endingRequest) { + switch (taskCancelReason) { + case STOP: + if (noToast == false) + Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_STOP, Toast.LENGTH_SHORT).show(); + break; + case BUTTON_RELEASE: + if (noToast == false) + Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_BUTTON, Toast.LENGTH_SHORT).show(); + break; + } + } + if (button != null) button.setText(textButton); + if (button1 != null) button1.setText(btextButton1); + } + MainActivity.sharedObjects.runningInventoryBarcodeTask = false; + MainActivity.csLibrary4A.appendToLog("setVibrateOn C 0"); + MainActivity.csLibrary4A.setVibrateOn(0); + } +} + + + +package com.csl.cs710ademoapp; + +import android.content.Context; +import android.os.AsyncTask; +import android.os.Handler; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import com.csl.cs710ademoapp.adapters.ReaderListAdapter; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReader; +import com.csl.cslibrary4a.RfidReaderChipData; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; + +public class InventoryRfidTask extends AsyncTask { + final boolean DEBUG = false; final boolean ALLOW_WEDGE = true; boolean ALLOW_RTSAVE = false; + public enum TaskCancelRReason { + NULL, INVALD_REQUEST, DESTORY, STOP, BUTTON_RELEASE, TIMEOUT, RFID_RESET, ERROR + } + final private boolean bAdd2End = false; + final boolean endingRequest = true; + + Context context; + public TaskCancelRReason taskCancelReason; + public boolean bSgtinOnly = false, bProtectOnly; + private boolean invalidRequest; + boolean beepEnable; + + private ArrayList tagsList; + private ReaderListAdapter readerListAdapter; + private TextView geigerTagRssiView; + private TextView rfidRunTime, geigerTagGotView, rfidVoltageLevel; + private TextView rfidYieldView, rfidRateView; + private Button button; + + CustomMediaPlayer playerO, playerN; int requestSoundCount; + + int extra1Bank = -1, extra2Bank = -1; + RfidReader.TagType tagType; String strMdid; + + final boolean invalidDisplay = false; + private int total, allTotal; + private int yield, yield4RateCount, yieldRate; + double rssi = 0; int phase, chidx, data1_count, data2_count, data1_offset, data2_offset; + int port = -1; int portstatus; int backport1, backport2, codeSensor, codeRssi; float codeTempC; final int INVALID_CODEVALUE = -500; String brand; + long timeMillis, startTimeMillis, runTimeMillis; + long firstTime; + long lastTime; + boolean continousRequest = false; + int batteryCountInventory_old; + + boolean requestSound = false; boolean requestNewSound = false; boolean requestNewVibrate = false; long timeMillisNewVibrate; + String strEpcOld = ""; + private ArrayList rx000pkgDataArrary = new ArrayList(); + private String endingMessaage; + + SaveList2ExternalTask saveExternalTask; + boolean serverConnectValid = false; + Handler handler = new Handler(); boolean bValidVibrateNewAll = false; boolean bUseVibrateMode0 = false; + + void inventoryHandler_setup() { + MainActivity.csLibrary4A.appendToLog("InventoryRfidTask.inventoryHandler_setup set runningInventoryRfidTask as true "); + MainActivity.sharedObjects.runningInventoryRfidTask = true; + total = 0; allTotal = 0; yield = 0; + if (tagsList != null) { + yield = tagsList.size(); + for (int i = 0; i < yield; i++) { + allTotal += tagsList.get(i).getCount(); + } + MainActivity.csLibrary4A.appendToLog("yield = " + yield + ", allTotal = " + allTotal); + } + MainActivity.csLibrary4A.clearInvalidata(); + + timeMillis = System.currentTimeMillis(); startTimeMillis = System.currentTimeMillis(); runTimeMillis = startTimeMillis; + firstTime = 0; + lastTime = 0; + + if (rfidVoltageLevel != null) rfidVoltageLevel.setText(""); + if (rfidYieldView != null) rfidYieldView.setText(""); + if (rfidRateView != null) rfidRateView.setText(""); + + taskCancelReason = TaskCancelRReason.NULL; + if (invalidRequest) { + cancel(true); + taskCancelReason = TaskCancelRReason.INVALD_REQUEST; + Toast.makeText(MainActivity.mContext, "Invalid Request.", Toast.LENGTH_SHORT).show(); + } + if (button != null) button.setText("Stop"); + MainActivity.mSensorConnector.mLocationDevice.turnOn(true); + MainActivity.mSensorConnector.mSensorDevice.turnOn(true); + if (ALLOW_RTSAVE) { + saveExternalTask = new SaveList2ExternalTask(false); + if (saveExternalTask.openServer(false)) { + serverConnectValid = true; + MainActivity.csLibrary4A.appendToLog("openServer is done"); + } else { + MainActivity.csLibrary4A.appendToLog("openServer has Exception"); + } + } + MainActivity.csLibrary4A.appendToLog("serverConnectValid = " + serverConnectValid); + + + MainActivity.csLibrary4A.appendToLog("getInventoryVibrate = " + MainActivity.csLibrary4A.getInventoryVibrate() + + ", bUseVibrate0 = " + bUseVibrateMode0 + + ", getVibrateModeSetting = " + MainActivity.csLibrary4A.getVibrateModeSetting() + ); + if (MainActivity.csLibrary4A.getInventoryVibrate() && bUseVibrateMode0 == false && MainActivity.csLibrary4A.getVibrateModeSetting() == 1) bValidVibrateNewAll = true; + MainActivity.csLibrary4A.appendToLog("setVibrateOn d 2 with bValidVibrateNewAll = " + bValidVibrateNewAll); + if (bValidVibrateNewAll) MainActivity.csLibrary4A.setVibrateOn(2); + } + + @Override + protected void onPreExecute() { + //inventoryHandler_setup(); + } + + byte[] notificationData; + @Override + protected String doInBackground(Void... a) { + boolean ending = false, triggerReleased = false; long triggerReleaseTime = 0; + RfidReaderChipData.Rx000pkgData rx000pkgData = null; + while (MainActivity.csLibrary4A.onRFIDEvent() != null) { } //clear up possible message before operation + while (MainActivity.csLibrary4A.isBleConnected() && isCancelled() == false && ending == false && MainActivity.csLibrary4A.isRfidFailure() == false) { + int batteryCount = MainActivity.csLibrary4A.getBatteryCount(); + if (batteryCountInventory_old != batteryCount) { + batteryCountInventory_old = batteryCount; + publishProgress("VV"); + } + if (System.currentTimeMillis() > runTimeMillis + 1000) { + runTimeMillis = System.currentTimeMillis(); + publishProgress("WW"); + } + + notificationData = MainActivity.csLibrary4A.onNotificationEvent(); + rx000pkgData = MainActivity.csLibrary4A.onRFIDEvent(); + if (rx000pkgData != null && MainActivity.csLibrary4A.mrfidToWriteSize() == 0) { + if (rx000pkgData.responseType == null) { + publishProgress("null response"); + } else if (rx000pkgData.responseType == RfidReaderChipData.HostCmdResponseTypes.TYPE_18K6C_INVENTORY) { + { + if (rx000pkgData.decodedError != null) publishProgress(rx000pkgData.decodedError); + else { + if (firstTime == 0) firstTime = rx000pkgData.decodedTime; + else lastTime = rx000pkgData.decodedTime; + rx000pkgDataArrary.add(rx000pkgData); publishProgress(null, "", ""); + } + } + } else if (rx000pkgData.responseType == RfidReaderChipData.HostCmdResponseTypes.TYPE_18K6C_INVENTORY_COMPACT) { + { + if (rx000pkgData.decodedError != null) publishProgress(rx000pkgData.decodedError); + else { + if (firstTime == 0) firstTime = rx000pkgData.decodedTime; + rx000pkgDataArrary.add(rx000pkgData); publishProgress(null, "", ""); + } + } + } else if (rx000pkgData.responseType == RfidReaderChipData.HostCmdResponseTypes.TYPE_ANTENNA_CYCLE_END) { + timeMillis = System.currentTimeMillis(); + } else if (rx000pkgData.responseType == RfidReaderChipData.HostCmdResponseTypes.TYPE_COMMAND_ABORT_RETURN) { + MainActivity.csLibrary4A.appendToLog("AAA: Abort return is received !!!"); + ending = true; + } else if (rx000pkgData.responseType == RfidReaderChipData.HostCmdResponseTypes.TYPE_COMMAND_END) { + if (rx000pkgData.decodedError != null) endingMessaage = rx000pkgData.decodedError; + if (continousRequest) { + MainActivity.csLibrary4A.batteryLevelRequest(); + MainActivity.csLibrary4A.appendToLog("Debug_Compact: InventoryRfidTask.doInBackground"); + MainActivity.csLibrary4A.startOperation(RfidReaderChipData.OperationTypes.TAG_INVENTORY_COMPACT); + } else ending = true; + } + } else if (false && notificationData != null) { + MainActivity.csLibrary4A.appendToLog("matched Error: resultError=" + MainActivity.csLibrary4A.byteArrayToString(notificationData)); + publishProgress("P"); + taskCancelReason = TaskCancelRReason.ERROR; + } + if (false) { + if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) timeMillis = System.currentTimeMillis(); + } else { + //suspend the current thread up to 5 seconds until all the commands on the output buffer got sent out + long toCnt = System.currentTimeMillis(); + if (MainActivity.csLibrary4A.mrfidToWriteSize() != 0) { + while (System.currentTimeMillis() - toCnt < 50000 && MainActivity.csLibrary4A.mrfidToWriteSize() != 0) { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + MainActivity.csLibrary4A.appendToLog("InventoryRfidTask: send commands elapsed time: " + String.format("%d", System.currentTimeMillis() - toCnt)); + timeMillis = System.currentTimeMillis(); + } + } + if (System.currentTimeMillis() - timeMillis > 10000 && false) { //no tag timeout handling during inventory + if (true) taskCancelReason = TaskCancelRReason.TIMEOUT; + else { + timeMillisSound = System.currentTimeMillis(); + requestSound = true; + } + } + if (triggerReleased == false && taskCancelReason == TaskCancelRReason.BUTTON_RELEASE) { + triggerReleased = true; triggerReleaseTime = System.currentTimeMillis(); + //taskCancelReason = TaskCancelRReason.NULL; + MainActivity.csLibrary4A.appendToLog("AAA: release is triggered !!!"); + } + if (taskCancelReason != TaskCancelRReason.NULL) { + MainActivity.csLibrary4A.abortOperation(); + publishProgress("XX"); + if (popRequest) publishProgress("P"); + timeMillis = 0; + boolean endStatus = true; + cancel(true); + } else if (triggerReleased && (System.currentTimeMillis() > (triggerReleaseTime + 2000))) { + MainActivity.csLibrary4A.appendToLog("AAA: triggerRelease Timeout !!!"); + taskCancelReason = TaskCancelRReason.BUTTON_RELEASE; + } + } + String stringReturn = "End of Asynctask()"; + if (MainActivity.csLibrary4A.isBleConnected() == false) stringReturn = "isBleConnected is false"; + else if (isCancelled()) stringReturn = "isCancelled is true"; + else if (MainActivity.csLibrary4A.isRfidFailure()) stringReturn = "isRfidFailure is true"; + else if (ending) stringReturn = (rx000pkgData == null ? "null ending" : (rx000pkgData.responseType.toString() + " ending")); + return stringReturn; + } + + long firstTimeOld = 0, timeMillisSound = 0; int totalOld = 0; + @Override + protected void onProgressUpdate(String... output) { + if (false) MainActivity.csLibrary4A.appendToLog("InventoryRfidTask: output[0] = " + output[0]); + if (output[0] != null) { + if (output[0].length() == 1) inventoryHandler_endReason(); + else if (output[0].length() == 2) { + if (output[0].contains("XX")) MainActivity.csLibrary4A.appendToLogView("CANCELLING: PostProgressUpdate sent abortOperation"); + else if (output[0].contains("WW")) inventoryHandler_runtime(); + else if (output[0].contains("VV")) inventoryHandler_voltage(); + } else + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryRfidTask.InventoryRfidTask.onProgressUpdate(): " + output[0]); + } else tagHandler(); + } + + void inventoryHandler_endReason() { + String message; + switch (taskCancelReason) { + case STOP: + message = "Stop button pressed"; + break; + case BUTTON_RELEASE: + message = "Trigger Released"; + break; + case TIMEOUT: + message = "Time Out"; + break; + case ERROR: + message = "Inventory Notification Error code A101: " + MainActivity.csLibrary4A.byteArrayToString(notificationData); + break; + default: + message = taskCancelReason.name(); + break; + } + CustomPopupWindow customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart(message, false); + } + void inventoryHandler_runtime() { + long timePeriod = (System.currentTimeMillis() - startTimeMillis) / 1000; + if (timePeriod > 0) { + if (rfidRunTime != null) rfidRunTime.setText(String.format("Run time: %d sec", timePeriod)); + yieldRate = yield4RateCount; yield4RateCount = 0; + } + } + void inventoryHandler_voltage() { + if (rfidVoltageLevel != null) rfidVoltageLevel.setText(MainActivity.csLibrary4A.getBatteryDisplay(true)); + } + + boolean bGotTagRate = false; + void tagHandler() { + boolean DEBUG = false; + { + long currentTime = 0; + { + while (rx000pkgDataArrary.size() != 0) { + RfidReaderChipData.Rx000pkgData rx000pkgData = rx000pkgDataArrary.get(0); + rx000pkgDataArrary.remove(0); + if (rx000pkgData == null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryRfidTask: null rx000pkgData !!!"); + continue; + }; + + boolean match = false; + boolean updated = false; + currentTime = rx000pkgData.decodedTime; + int iFlag = rx000pkgData.flags; + String strPc = MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.decodedPc); + if (strPc.length() != 4) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("InventoryRfidTask: !!! rx000pkgData.Pc length = " + strPc.length()); + continue; + } + /*int extraLength = 0; + if (extra1Bank != -1 && rx000pkgData.decodedData1 != null) extraLength += rx000pkgData.decodedData1.length; + if (extra2Bank != -1 && rx000pkgData.decodedData2 != null) extraLength += rx000pkgData.decodedData2.length; + if (extraLength != 0) { + byte[] decodedEpcNew = new byte[rx000pkgData.decodedEpc.length - extraLength]; + System.arraycopy(rx000pkgData.decodedEpc, 0, decodedEpcNew, 0, decodedEpcNew.length); + rx000pkgData.decodedEpc = decodedEpcNew; + }*/ + MainActivity.csLibrary4A.appendToLog("ApData: decodedEpc = " + MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.decodedEpc) + ", data1,2 = " + MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.decodedData1) + ", " + MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.decodedData2)); + String strEpc = MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.decodedEpc); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloC: decodePc = " + strPc + ", decodedEpc = " + strEpc + ", iFlags = " + String.format("%2X", iFlag)); + portstatus = INVALID_CODEVALUE; backport1 = INVALID_CODEVALUE; backport2 = INVALID_CODEVALUE; codeSensor = INVALID_CODEVALUE; codeRssi = INVALID_CODEVALUE; codeTempC = INVALID_CODEVALUE; brand = null; + String strExtra2 = null; if (rx000pkgData.decodedData2 != null) strExtra2 = MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.decodedData2); + if (strExtra2 != null && strMdid != null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloK: strExtra2 = " + strExtra2 + ", strMdid = " + strMdid); + if (strMdid.contains("E200B0")) portstatus = Integer.parseInt(strExtra2.substring(3, 4), 16); + } + String strExtra1 = null; if (rx000pkgData.decodedData1 != null) { + strExtra1 = MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.decodedData1); + if (strMdid != null && strExtra1 != null && strExtra2 != null) { + MainActivity.csLibrary4A.appendToLog("strExtra1 = " + strExtra1 + ", strExtra2 = " + strExtra2); + decodeMicronData(strExtra1, strExtra2); + } + } + String strAddresss = strEpc; + String strCrc16 = null; if (rx000pkgData.decodedCrc != null) strCrc16 = MainActivity.csLibrary4A.byteArrayToString(rx000pkgData.decodedCrc); + + int extra1Bank = this.extra1Bank; + int data1_offset = this.data1_offset; + + if (strMdid != null) { + if (tagType == RfidReader.TagType.TAG_CTESIUS /*strMdid.indexOf("E203510") == 0*/) { + if (strEpc.length() == 24 && strExtra2 != null) { + codeTempC = MainActivity.csLibrary4A.decodeCtesiusTemperature(strEpc.substring(16, 24), strExtra2); + strEpc = strEpc.substring(0, 16); strAddresss = strEpc; + } + } else if (tagType == RfidReader.TagType.TAG_ASYGN /*strMdid.indexOf("E283A") == 0*/) { + MainActivity.csLibrary4A.appendToLog("E283A is found with extra1Bank = " + extra1Bank + ", strExtra1 = " + strExtra1 + ", extra2Bank = " + extra2Bank + ", strExtra2 = " + strExtra2); + if (strExtra2 != null && strExtra2.length() >= 28) codeTempC = MainActivity.csLibrary4A.decodeAsygnTemperature(strExtra2); + } + } + + boolean bFastId = false; boolean bTempId = false; + MainActivity.csLibrary4A.appendToLog("bFastId is false with MainActivity.mDid = " + MainActivity.mDid + ", getFastId = " + MainActivity.csLibrary4A.getFastId()); + if (MainActivity.mDid != null) { + if (MainActivity.mDid.indexOf("E28011") == 0) { + int iValue = Integer.valueOf(MainActivity.mDid.substring("E28011".length()), 16); + MainActivity.csLibrary4A.appendToLog(String.format("iValue = 0x%02X", iValue)); + if ((iValue & 0x20) != 0) { + bFastId = true; MainActivity.csLibrary4A.appendToLog("bFastId is true"); + } + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloK: iValue = " + String.format("%02X", iValue)); + } + } else if (MainActivity.csLibrary4A.getFastId() > 0) { + bFastId = true; MainActivity.csLibrary4A.appendToLog("bFastId is true"); + } + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloK: strMdid = " + strMdid + ", MainMdid = " + MainActivity.mDid + ", bFastId = " + bFastId); + + int iPc = Integer.parseInt(strPc, 16); + String strXpc = null; int iSensorData = ReaderDevice.INVALID_SENSORDATA; if ((iPc & 0x0200) != 0 && strEpc != null && strEpc.length() >= 8) { + MainActivity.csLibrary4A.appendToLog("strPc = " + strPc + ", strEpc = " + strEpc); + int iXpcw1 = Integer.parseInt(strEpc.substring(0, 4), 16); + if ((iXpcw1 & 0x8000) != 0) { + strXpc = strEpc.substring(0, 8); + strEpc = strEpc.substring(8); strAddresss = strEpc; + if (strMdid != null) { + if (strMdid.indexOf("E280B12") == 0) { + int iXpcw2 = Integer.parseInt(strXpc.substring(4, 8), 16); + if ((iXpcw1 & 0x8100) != 0 && (iXpcw2 & 0xF000) == 0) { + if ((iXpcw2 & 0x0C00) == 0x0C00) { + //iXpcw2 |= 0x200; + iSensorData = iXpcw2 & 0x1FF; + if ((iXpcw2 & 0x200) != 0) { + iSensorData ^= 0x1FF; iSensorData++; iSensorData = -iSensorData; + //MainActivity.csLibrary4A.appendToLog(String.format("Hello123: iXpcw2 = %04X, iSensorData = %d", iXpcw2, iSensorData )); + } + } + } + } + } + } else { + strXpc = strEpc.substring(0, 4); + strEpc = strEpc.substring(4); strAddresss = strEpc; + } + } + + if (bFastId) { + String strEpc1 = null, strTid = null; + boolean bValidFastId = false; + if (strEpc.length() > 24) { + strEpc1 = strEpc.substring(0, strEpc.length() - 24); + strTid = strEpc.substring(strEpc.length() - 24, strEpc.length()); + if (strTid.indexOf("E28011") == 0 || strTid.indexOf("E2C011") == 0 ) { + strEpc = strEpc1; strAddresss = strEpc; + strExtra2 = strTid; + extra2Bank = 2; + data2_offset = 0; + bValidFastId = true; + } + } + if (bValidFastId == false) return; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloK: Doing IMPINJ Inventory with strMdid = " + strMdid + ", strEpc1 = " + strEpc1 + ":, strTid = " + strTid); + } else if (MainActivity.mDid != null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloK: MainActivity.mDid = " + MainActivity.mDid); + if (MainActivity.mDid.matches("E2806894B")) { + if (strEpc.length() >= 24) { + String strEpc1 = strEpc.substring(0, strEpc.length() - 24); + String strTid = strEpc.substring(strEpc.length() - 24, strEpc.length()); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloK: matched E2806894B with strEpc = " + strEpc + ", strEpc1 = " + strEpc1 + ", strTid = " + strTid + ", strExtra1 = " + strExtra1); + boolean matched = true; + if (strExtra1 != null) { + if (!(strExtra1.length() == 8 && strTid.contains(strExtra1))) matched = false; + } + if (matched) { + strEpc = strEpc1; + strAddresss = strEpc; + strExtra2 = strTid; + extra2Bank = 2; + data2_offset = 0; + } + /*if (strTid.contains("E2806894") == false) { + MainActivity.csLibrary4A.appendToLog("HelloK: Skip the record without strExtra1 E2806894: " + strEpc); + return; + }*/ + } + } else if (MainActivity.mDid.matches("E2806894C") || MainActivity.mDid.matches("E2806894d")) { + if (strEpc.length() >= 4) { + String strEpc1 = strEpc.substring(0, strEpc.length() - 4); + String strBrand = strEpc.substring(strEpc.length() - 4, strEpc.length()); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloK: matched E2806894B with strEpc = " + strEpc + ", strEpc1 = " + strEpc1 + ", strBrand = " + strBrand + ", strExtra1 = " + strExtra1); + boolean matched = true; + if (strExtra1 != null || MainActivity.mDid.matches("E2806894d")) { + if (!(strExtra1 != null && strExtra1.length() == 8 && strExtra1.contains("E2806894"))) { + matched = false; + /*if (MainActivity.mDid.matches("E2806894d")) { + MainActivity.csLibrary4A.appendToLog("HelloK: Skip the record without strExtra1 E2806894: " + strEpc); + return; + }*/ + } + } + if (matched) { + strEpc = strEpc1; strAddresss = strEpc; + brand = strBrand; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloK: brand 1 = " + brand + ", strEpc = " + strEpc); + } + } + } + } + + if (DEBUG || true) MainActivity.csLibrary4A.appendToLog("strMdid = " + strMdid + ", strTidCompared = " + strMdid + ", MainActivity.mDid = " + MainActivity.mDid + ", strExtra1 = " + strExtra1 + ", strExtra2 = " + strExtra2); + if (strMdid != null) { + String strTidCompared = strMdid; + if (strTidCompared.indexOf("E28011") == 0) { + int iValue = Integer.valueOf(MainActivity.mDid.substring("E28011".length()), 16); + MainActivity.csLibrary4A.appendToLog(String.format("iValue = 0x%02X", iValue)); + if ((iValue & 0x40) != 0) strTidCompared = "E2C011"; + else if ((iValue & 0x80) != 0) strTidCompared = "E280117"; + else strTidCompared = "E28011"; + } + MainActivity.csLibrary4A.appendToLog("strTidCompared = " + strTidCompared); + if (strTidCompared.matches("E28011")) { } + else if (strTidCompared.matches("E2806894") && MainActivity.mDid.matches("E2806894C")) { } + else if (strTidCompared.matches("E281D")) { } + else if (strTidCompared.matches("E282402")) { } + else if (strTidCompared.matches("E282403")) { } + else if (strTidCompared.matches("E282405")) { } + else { //if (strMdid.matches("E280B0")) + boolean bMatched = false; + if (strExtra1 != null && strExtra1.indexOf(strTidCompared) == 0) { + bMatched = true; if (DEBUG) MainActivity.csLibrary4A.appendToLog("strExtra1 contains strTidCompared"); + } else if (strExtra2 != null && strExtra2.indexOf(strTidCompared) == 0) { + bMatched = true; if (DEBUG) MainActivity.csLibrary4A.appendToLog("strEXTRA2 contains strTidCompared"); + } + MainActivity.csLibrary4A.appendToLog("bMatched = " + bMatched); + if (bMatched == false) return; + } + } + + rssi = rx000pkgData.decodedRssi; + phase = rx000pkgData.decodedPhase; + chidx = rx000pkgData.decodedChidx; + port = rx000pkgData.decodedPort; + + timeMillis = System.currentTimeMillis(); + + double rssiGeiger = rssi; + if (MainActivity.csLibrary4A.getRssiDisplaySetting() != 0) + rssiGeiger -= MainActivity.csLibrary4A.dBuV_dBm_constant; + if (geigerTagRssiView != null) + geigerTagRssiView.setText(String.format("%.1f", rssiGeiger)); + if (geigerTagGotView != null) geigerTagGotView.setText(strEpc); + + if (tagsList == null) { + if (strEpc.matches(strEpcOld)) { + match = true; + updated = true; + } + } else if (readerListAdapter.getSelectDupElim()) { + ReaderDevice readerDevice = null; + int iMatchItem = -1; + if (false) { + int index = Collections.binarySearch(MainActivity.sharedObjects.tagsIndexList, new SharedObjects.TagsIndex(strAddresss, 0)); + if (index >= 0) { + iMatchItem = MainActivity.sharedObjects.tagsIndexList.size() - 1 - MainActivity.sharedObjects.tagsIndexList.get(index).getPosition(); + } + } else { + String strCompare = null; + if (extra1Bank == 2) { + strCompare = strExtra1; //MainActivity.csLibrary4A.appendToLog("1strExtra = " + strExtra1 + ", " + readerDevice.getTid() + ", " + readerDevice.getTid().matches(strCompare)); + } else if (extra2Bank == 2) { + strCompare = strExtra2; //MainActivity.csLibrary4A.appendToLog("2strExtra = " + strExtra2 + ", " + readerDevice.getTid() + ", " + readerDevice.getTid().matches(strCompare)); + } + for (int i = 0; i < tagsList.size(); i++) { + //MainActivity.csLibrary4A.appendToLog("strEpc = " + strEpc + ", tagsList.get(" + i + ").getAdddress = " + tagsList.get(i).getAddress()); + if (strEpc == null || tagsList.get(i).getAddress() == null) { } + else if (strEpc.matches(tagsList.get(i).getAddress())) { + boolean bTidMatched = true; + if (strCompare != null && tagsList.get(i).getTid() != null) bTidMatched = tagsList.get(i).getTid().matches(strCompare); + if (bTidMatched) { + iMatchItem = i; + break; + } + } + } + } + MainActivity.csLibrary4A.appendToLog("Doing duplicate elimination with iMatchItem = " + iMatchItem); + if (iMatchItem >= 0) { + readerDevice = tagsList.get(iMatchItem); + int count = readerDevice.getCount(); + count++; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloK: updated Epc = " + readerDevice.getAddress() + ", brand = " + brand); + readerDevice.setCount(count); + readerDevice.setXpc(strXpc); + readerDevice.setRssi(rssi); + readerDevice.setPhase(phase); + readerDevice.setChannel(chidx); + readerDevice.setPort(port); + readerDevice.setStatus(portstatus); + readerDevice.setBackport1((backport1)); + readerDevice.setBackport2(backport2); + readerDevice.setCodeSensor(codeSensor); + readerDevice.setCodeRssi(codeRssi); + readerDevice.setBrand(brand); + readerDevice.setCodeTempC(codeTempC); + readerDevice.setSensorData(iSensorData); + if (strExtra1 != null) readerDevice.setExtra1(strExtra1, extra1Bank, data1_offset); + else if (readerDevice.getstrExtra1() != null) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("HelloK: no null replacement of StrExtra1"); + } + if (strExtra2 != null) readerDevice.setExtra2(strExtra2, extra2Bank, data2_offset); + else if (readerDevice.getstrExtra2() != null) { + MainActivity.csLibrary4A.appendToLog("HelloK: no null replacement of StrExtra2"); + } + tagsList.set(iMatchItem, readerDevice); + match = true; + updated = true; + } + } + if (ALLOW_WEDGE) MainActivity.sharedObjects.serviceArrayList.add(strEpc); + + boolean bAddDevice = true; String strValue = null; + MainActivity.csLibrary4A.appendToLog("bProtectOnly = " + bProtectOnly); + if (bSgtinOnly) { + strValue = MainActivity.csLibrary4A.getUpcSerial(strEpc); + MainActivity.csLibrary4A.appendToLog("bSgtinOnly = " + bSgtinOnly + ", strValue = " + (strValue == null ? "null" : strValue)); + if (strValue == null) bAddDevice = false; + } else if (bProtectOnly) { + bAddDevice = false; + if (strExtra1 != null) { + strValue = strExtra1.substring(strExtra1.length() - 1); + int iValue = Integer.parseInt(strValue, 16); + MainActivity.csLibrary4A.appendToLog("bProtectOnly = " + bProtectOnly + ", strExtra1 = " + (strExtra1 == null ? "null" : strExtra1) + ", iValue = " + iValue); + if ((iValue & 0x02) != 0) bAddDevice = true; + } else MainActivity.csLibrary4A.appendToLog("NULL strExtra1"); + } + if (bAddDevice == false) { } + else if (match == false) { + if (tagsList == null) { + strEpcOld = strEpc; + updated = true; + } else { + MainActivity.csLibrary4A.appendToLog("HelloK: New Epc = " + strEpc + ", brand = " + brand); + ReaderDevice readerDevice = new ReaderDevice("", strEpc, false, null, + strPc, strXpc, strCrc16, strMdid, + strExtra1, extra1Bank, data1_offset, + strExtra2, extra2Bank, data2_offset, + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS").format(new Date()), new SimpleDateFormat("z").format(new Date()).replaceAll("GMT", ""), + MainActivity.mSensorConnector.mLocationDevice.getLocation(), MainActivity.mSensorConnector.mSensorDevice.getEcompass(), + 1, rssi, phase, chidx, port, portstatus, backport1, backport2, codeSensor, codeRssi, codeTempC, brand, iSensorData); + if (bSgtinOnly && strValue != null) readerDevice.setUpcSerial(strValue); + if (strMdid != null) { + if (strMdid.indexOf("E282402") == 0) readerDevice.setCodeSensorMax(0x1F); + else readerDevice.setCodeSensorMax(0x1FF); + } + if (bAdd2End) tagsList.add(readerDevice); + else tagsList.add(0, readerDevice); + SharedObjects.TagsIndex tagsIndex = new SharedObjects.TagsIndex(strAddresss, tagsList.size() - 1); MainActivity.sharedObjects.tagsIndexList.add(tagsIndex); Collections.sort(MainActivity.sharedObjects.tagsIndexList); + MainActivity.csLibrary4A.appendToLog("openServer: serverConnectValid is " + serverConnectValid); + if (serverConnectValid && ALLOW_RTSAVE && true) { + try { +// saveExternalTask = new SaveList2ExternalTask(); +// saveExternalTask.openServer(); + String msgOutput = saveExternalTask.createJSON(null, readerDevice).toString(); MainActivity.csLibrary4A.appendToLog("Json = " + msgOutput); + saveExternalTask.write2Server(msgOutput); + MainActivity.csLibrary4A.appendToLog("openServer: write2Server data = " + msgOutput); + + // saveExternalTask.closeServer(); + MainActivity.csLibrary4A.appendToLog("write2Server is done"); + } catch (Exception ex) { + MainActivity.csLibrary4A.appendToLog("write2Server has Exception"); + } + } + } + yield++; yield4RateCount++; + updated = true; + requestNewSound = true; requestNewVibrate = true; + requestSound = true; + } + if (updated && bAddDevice) { + total++; + allTotal++; + } + } + } + if (++requestSoundCount >= MainActivity.csLibrary4A.getBeepCount()) { + requestSoundCount = 0; + requestSound = true; + } + if (requestSound && requestNewSound) requestSoundCount = 0; + if (readerListAdapter != null) readerListAdapter.notifyDataSetChanged(); + if (invalidDisplay) { + if (rfidYieldView != null) rfidYieldView.setText(String.valueOf(total) + "," + String.valueOf(MainActivity.csLibrary4A.getValidata())); + if (rfidRateView != null) rfidRateView.setText(String.valueOf(MainActivity.csLibrary4A.getInvalidata()) + "," + String.valueOf(MainActivity.csLibrary4A.getInvalidUpdata())); + } else { + String stringTemp = "Unique:" + String.valueOf(yield); + stringTemp += "\nTotal:" + String.valueOf(allTotal) + "\n"; + if (rfidYieldView != null) rfidYieldView.setText(stringTemp); + if (total != 0 && currentTime - firstTimeOld > 500) { + if (firstTimeOld == 0) firstTimeOld = firstTime; + if (totalOld == 0) totalOld = total; + + String strRate = "Error:" + String.valueOf(MainActivity.csLibrary4A.getInvalidata()) + "/"; + if (true) { + float fErrorRate = (float) MainActivity.csLibrary4A.getInvalidata() / ((float) MainActivity.csLibrary4A.getValidata() + (float) MainActivity.csLibrary4A.getInvalidata()) * 100; + strRate += String.valueOf(MainActivity.csLibrary4A.getValidata()) + "/" + String.valueOf((int) fErrorRate) + "%"; + } else if (true) { + strRate += String.valueOf(MainActivity.csLibrary4A.getInvalidUpdata()) + "/" + String.valueOf(MainActivity.csLibrary4A.getValidata()); + } + + strRate += "\nRate/New:"; + if (firstTimeOld != 0) { + long tagRate = MainActivity.csLibrary4A.getTagRate(); + long tagRate2 = -1; + if (currentTime > firstTimeOld) tagRate2 = totalOld * 1000 / (currentTime - firstTimeOld); + if (tagRate >= 0 || bGotTagRate) { + bGotTagRate = true; + if (true) strRate += (tagRate != -1 ? String.valueOf(tagRate) : "___"); + else strRate += (tagRate != -1 ? String.valueOf(tagRate) : "___") + "/" + String.valueOf(tagRate2); + strRate += "/" + String.valueOf(yieldRate); + } else { + if (lastTime == 0) { + tagRate = MainActivity.csLibrary4A.getStreamInRate() / 17; + //strRate += "rAte"; + } else if (currentTime > firstTimeOld) { + tagRate = totalOld * 1000 / (currentTime - firstTimeOld); + //strRate += "Rate"; + } + strRate += String.valueOf(tagRate) + "/" + String.valueOf(yieldRate); + } + } + + if (rfidRateView != null) rfidRateView.setText(strRate); + //if (lastTime - firstTime > 1000) { + firstTimeOld = currentTime; + totalOld = total; + total = 0; + //} + } + } + if (false) MainActivity.csLibrary4A.appendToLogView("playerN = " + (playerN == null ? "Null" : "Valid") + ", playerO = " + (playerO == null ? "Null" : "Valid")); + if (playerN != null && playerO != null) { + if (false) MainActivity.csLibrary4A.appendToLogView("requestSound = " + requestSound + ", bStartBeepWaiting = " + bStartBeepWaiting + ", Op=" + playerO.isPlaying() + ", Np=" + playerN.isPlaying()); + if (requestSound && playerO.isPlaying() == false && playerN.isPlaying() == false) { + if (true) { + if (bStartBeepWaiting == false) { + bStartBeepWaiting = true; + if (false) MainActivity.csLibrary4A.appendToLogView("Going to play old song"); + handler.postDelayed(runnableStartBeep, 250); + } + if (MainActivity.csLibrary4A.getInventoryVibrate()) { + boolean validVibrate0 = false, validVibrate = false; + if (MainActivity.csLibrary4A.getVibrateModeSetting() == 0) { + if (requestNewVibrate) validVibrate0 = true; + } else if (bValidVibrateNewAll == false) validVibrate0 = true; + requestNewVibrate = false; + + if (validVibrate0) { + if (bStartVibrateWaiting == false) { + validVibrate = true; + } else if (bUseVibrateMode0 == false) { + handler.removeCallbacks(runnableStartVibrate); int timeout = MainActivity.csLibrary4A.getVibrateWindow() * 1000; + handler.postDelayed(runnableStartVibrate, MainActivity.csLibrary4A.getVibrateWindow() * 1000); + } + } + + if (validVibrate) { + MainActivity.csLibrary4A.appendToLog("setVibrateOn E with bUseVibrateMode0 as " + bUseVibrateMode0); + if (bUseVibrateMode0) MainActivity.csLibrary4A.setVibrateOn(1); + else MainActivity.csLibrary4A.setVibrateOn(2); + bStartVibrateWaiting = true; int timeout = MainActivity.csLibrary4A.getVibrateWindow() * 1000; + handler.postDelayed(runnableStartVibrate, MainActivity.csLibrary4A.getVibrateWindow() * 1000); + } + } + } else { + requestSound = false; + if (requestNewSound) { + requestNewSound = false; + playerN.start(); + } else { + playerO.start(); + } + } + } + } + } + } + + boolean bStartBeepWaiting = false; + Runnable runnableStartBeep = new Runnable() { + @Override + public void run() { + if (false) MainActivity.csLibrary4A.appendToLogView("Playing old song"); + bStartBeepWaiting = false; + requestSound = false; + if (requestNewSound) { + requestNewSound = false; + playerN.start(); //playerN.setVolume(300, 300); + } else { + playerO.start(); //playerO.setVolume(30, 30); + } + } + }; + + boolean bStartVibrateWaiting = false; + Runnable runnableStartVibrate = new Runnable() { + @Override + public void run() { + bStartVibrateWaiting = false; + MainActivity.csLibrary4A.appendToLog("setVibrateOn F1 with bUseVibrateMode0 as " + bUseVibrateMode0); + if (bUseVibrateMode0 == false) MainActivity.csLibrary4A.setVibrateOn(0); + } + }; + + @Override + protected void onCancelled() { + super.onCancelled(); + if (DEBUG || true) MainActivity.csLibrary4A.appendToLogView("InventoryRfidTask.InventoryRfidTask.onCancelled()"); + + DeviceConnectTask4InventoryEnding(taskCancelReason); + } + + @Override + protected void onPostExecute(String result) { + if (DEBUG || true) MainActivity.csLibrary4A.appendToLogView("InventoryRfidTask.InventoryRfidTask.onPostExecute(): " + result); + + DeviceConnectTask4InventoryEnding(taskCancelReason); + } + + public InventoryRfidTask() { + inventoryHandler_setup(); + } + public InventoryRfidTask(Context context, int extra1Bank, int extra2Bank, int data1_count, int data2_count, int data1_offset, int data2_offset, + boolean invalidRequest, boolean beepEnable, + ArrayList tagsList, ReaderListAdapter readerListAdapter, TextView geigerTagRssiView, + RfidReader.TagType tagType, String strMdid, + TextView rfidRunTime, TextView geigerTagGotView, TextView rfidVoltageLevel, + TextView rfidYieldView, Button button, TextView rfidRateView) { + this.context = context; + this.extra1Bank = extra1Bank; + this.extra2Bank = extra2Bank; + this.data1_count = data1_count; + this.data2_count = data2_count; + this.data1_offset = data1_offset; + this.data2_offset = data2_offset; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("data1_count = " + data1_count + ", data2_count = " + data2_count + ", extra1Bank = " + extra1Bank + ", extra2Bank = " + extra2Bank); + + this.invalidRequest = invalidRequest; + + this.geigerTagRssiView = geigerTagRssiView; + this.tagsList = tagsList; + this.readerListAdapter = readerListAdapter; + this.tagType = tagType; + this.strMdid = strMdid; MainActivity.csLibrary4A.appendToLog("HelloK: strMdid = " + strMdid); + + this.rfidRunTime = rfidRunTime; + this.geigerTagGotView = geigerTagGotView; + this.rfidVoltageLevel = rfidVoltageLevel; + this.rfidYieldView = rfidYieldView; + this.button = button; + this.rfidRateView = rfidRateView; + this.beepEnable = beepEnable; + + MainActivity.csLibrary4A.appendToLogView("going to create playerO and playerN with beepEnable = " + beepEnable); + if (tagsList != null && readerListAdapter != null && beepEnable) { + playerO = MainActivity.sharedObjects.playerO; + playerN = MainActivity.sharedObjects.playerN; + MainActivity.csLibrary4A.appendToLogView("playerO and playerN is created"); + } + inventoryHandler_setup(); + } + + boolean popRequest = false; Toast mytoast; + void DeviceConnectTask4InventoryEnding(TaskCancelRReason taskCancelReason) { + MainActivity.csLibrary4A.appendToLogView("CANCELLING: TaskEnding sent abortOperation again with taskCancelReason = " + taskCancelReason.toString()); + MainActivity.csLibrary4A.abortOperation(); //added in case previous command end is received with inventory stopped + MainActivity.csLibrary4A.appendToLog("serverConnectValid = " + serverConnectValid); + if (serverConnectValid && ALLOW_RTSAVE) { + if (saveExternalTask.closeServer()) MainActivity.csLibrary4A.appendToLog("closeServer is done"); + else MainActivity.csLibrary4A.appendToLog("closeServer has Exception"); + } + MainActivity.csLibrary4A.appendToLog("INVENDING: Ending with endingRequest = " + endingRequest); + if (MainActivity.mContext == null) return; + if (readerListAdapter != null) readerListAdapter.notifyDataSetChanged(); + if (mytoast != null) mytoast.cancel(); + if (endingRequest) { + switch (taskCancelReason) { + case NULL: + mytoast = Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_END, Toast.LENGTH_SHORT); + break; + case STOP: + mytoast = Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_STOP, Toast.LENGTH_SHORT); + break; + case BUTTON_RELEASE: + if (false) mytoast = Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_BUTTON, Toast.LENGTH_SHORT); + break; + case TIMEOUT: + mytoast = Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_TIMEOUT, Toast.LENGTH_SHORT); + break; + case RFID_RESET: + mytoast = Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_RFIDRESET, Toast.LENGTH_SHORT); + break; + case INVALD_REQUEST: + mytoast = Toast.makeText(MainActivity.mContext, R.string.toast_invalid_sendHostRequest, Toast.LENGTH_SHORT); + break; + default: + mytoast = Toast.makeText(MainActivity.mContext, ("Finish reason as " + taskCancelReason.toString()), Toast.LENGTH_SHORT); + break; + } + MainActivity.csLibrary4A.appendToLog("INVENDING: Toasting"); + if (mytoast != null) mytoast.show(); + } + if (button != null) button.setText("Start"); + MainActivity.csLibrary4A.appendToLog("InventoryRfidTask.DeviceConnectTask4InventoryEnding set runningInventoryRfidTask as false "); + MainActivity.sharedObjects.runningInventoryRfidTask = false; + if (endingMessaage != null) { + CustomPopupWindow customPopupWindow = new CustomPopupWindow(MainActivity.mContext); + customPopupWindow.popupStart(endingMessaage, false); + } + MainActivity.mSensorConnector.mLocationDevice.turnOn(false); + MainActivity.mSensorConnector.mSensorDevice.turnOn(false); + MainActivity.csLibrary4A.appendToLog("setVibrateOn F 0"); + MainActivity.csLibrary4A.setVibrateOn(0); + } + + String decodeMicronData(String strActData, String strCalData) { + int iTag35 = -1; + if (strMdid.contains("E282402")) iTag35 = 2; + else if (strMdid.contains("E282403")) iTag35 = 3; + else if (strMdid.contains("E282405")) iTag35 = 5; + if (iTag35 < 2) return ""; + + if (iTag35 == 5) { + backport1 = Integer.parseInt(strActData.substring(0, 4), 16); backport2 = Integer.parseInt(strActData.substring(4, 8), 16); + MainActivity.csLibrary4A.appendToLog("backport1 = " + backport1 + ", backport2 = " + backport2); + strActData = strActData.substring(8); + } + int iSensorCode = Integer.parseInt(strActData.substring(0,4), 16); iSensorCode &= 0x1FF; if (iTag35 == 2) iSensorCode &= 0x1F; codeSensor = iSensorCode; + int iRssi; + String strRetValue = ""; + if (iTag35 == 2) { + iRssi = Integer.parseInt(strCalData.substring(0,4), 16); iRssi &= 0x1F; codeRssi = iRssi; + } else if (iTag35 == 3) { + iRssi = Integer.parseInt(strActData.substring(4,8), 16); iRssi &= 0x1F; codeRssi = iRssi; + + if (true) { + if (strActData.length() < 8) return null; + codeTempC = MainActivity.csLibrary4A.decodeMicronTemperature(iTag35, strActData.substring(8, 12), strCalData); + } else { + int calCode1, calTemp1, calCode2, calTemp2, calVer = -1; + if (strCalData == null) return null; + if (strCalData.length() < 16) return null; + int crc = Integer.parseInt(strCalData.substring(0, 4), 16); + calCode1 = Integer.parseInt(strCalData.substring(4, 7), 16); + calTemp1 = Integer.parseInt(strCalData.substring(7, 10), 16); + calTemp1 >>= 1; + calCode2 = Integer.parseInt(strCalData.substring(9, 13), 16); + calCode2 >>= 1; + calCode2 &= 0xFFF; + calTemp2 = Integer.parseInt(strCalData.substring(12, 16), 16); + calTemp2 >>= 2; + calTemp2 &= 0x7FF; + calVer = Integer.parseInt(strCalData.substring(15, 16), 16); + calVer &= 0x3; + + if (strActData == null) return null; + if (strActData.length() < 8) return null; + + float fTemperature = Integer.parseInt(strActData.substring(8, 12), 16); + fTemperature = ((float) calTemp2 - (float) calTemp1) * (fTemperature - (float) calCode1); + fTemperature /= ((float) (calCode2) - (float) calCode1); + fTemperature += (float) calTemp1; + fTemperature -= 800; + fTemperature /= 10; + codeTempC = fTemperature; + } + } else if (iTag35 == 5) { + iRssi = Integer.parseInt(strActData.substring(4,8), 16); iRssi &= 0x1F; codeRssi = iRssi; + + if (true) { + codeTempC = MainActivity.csLibrary4A.decodeMicronTemperature(iTag35, strActData.substring(8, 12), strCalData); + } else { + int iTemp; + float calCode2 = Integer.parseInt(strCalData.substring(0, 4), 16); + calCode2 /= 16; + iTemp = Integer.parseInt(strCalData.substring(4, 8), 16); + iTemp &= 0x7FF; + float calTemp2 = iTemp; + calTemp2 -= 600; + calTemp2 /= 10; + float calCode1 = Integer.parseInt(strCalData.substring(8, 12), 16); + calCode1 /= 16; + iTemp = Integer.parseInt(strCalData.substring(12, 16), 16); + iTemp &= 0x7FF; + float calTemp1 = iTemp; + calTemp1 -= 600; + calTemp1 /= 10; + + float fTemperature = Integer.parseInt(strActData.substring(8, 12), 16); + fTemperature -= calCode1; + fTemperature *= (calTemp2 - calTemp1); + fTemperature /= (calCode2 - calCode1); + fTemperature += calTemp1; + codeTempC = fTemperature; + } + } + return ""; + } +} + + + +package com.csl.cs710ademoapp; + +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_ALIEN; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_ASYGN; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_CTESIUS; +import static com.csl.cslibrary4a.RfidReader.TagType.TAG_EM_BAP; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; + +import com.csl.cs710ademoapp.DrawerListContent.DrawerPositions; +import com.csl.cs710ademoapp.adapters.DrawerListAdapter; +import com.csl.cs710ademoapp.fragments.AboutFragment; +import com.csl.cs710ademoapp.fragments.AccessReadWriteFragment; +import com.csl.cs710ademoapp.fragments.AccessReadWriteUserFragment; +import com.csl.cs710ademoapp.fragments.AccessRegisterFragment; +import com.csl.cs710ademoapp.fragments.AccessSecurityFragment; +import com.csl.cs710ademoapp.fragments.AuraSenseFragment; +import com.csl.cs710ademoapp.fragments.AxzonSelectorFragment; +import com.csl.cs710ademoapp.fragments.ColdChainFragment; +import com.csl.cs710ademoapp.fragments.ConnectionFragment; +import com.csl.cs710ademoapp.fragments.DirectWedgeFragment; +import com.csl.cs710ademoapp.fragments.FdmicroFragment; +import com.csl.cs710ademoapp.fragments.HomeFragment; +import com.csl.cs710ademoapp.fragments.HomeSpecialFragment; +import com.csl.cs710ademoapp.fragments.ImpinjFragment; +import com.csl.cs710ademoapp.fragments.ImpinjM775Fragment; +import com.csl.cs710ademoapp.fragments.InventoryFragment; +import com.csl.cs710ademoapp.fragments.InventoryRfidSearchFragment; +import com.csl.cs710ademoapp.fragments.InventoryRfidSimpleFragment; +import com.csl.cs710ademoapp.fragments.InventoryRfidiMultiFragment; +import com.csl.cs710ademoapp.fragments.KilowayFragment; +import com.csl.cs710ademoapp.fragments.LongjingFragment; +import com.csl.cs710ademoapp.fragments.SettingFilterFragment; +import com.csl.cs710ademoapp.fragments.SettingFragment; +import com.csl.cs710ademoapp.fragments.TestFragment; +import com.csl.cs710ademoapp.fragments.Ucode8Fragment; +import com.csl.cs710ademoapp.fragments.UcodeFragment; +import com.csl.cslibrary4a.CsLibrary4A; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReader; + +public class MainActivity extends AppCompatActivity { + final boolean DEBUG = false; final String TAG = "Hello"; + public static boolean foregroundServiceEnable = false; + public static boolean activityActive = false; + public static DrawerPositions drawerPositionsDefault = DrawerPositions.MAIN; + public static int powerLevelMax = 320; + + //Tag to identify the currently displayed fragment + Fragment fragment = null; + protected static final String TAG_CONTENT_FRAGMENT = "ContentFragment"; + public static boolean isHomeFragment = false; + + public static TextView mLogView; + private DrawerLayout mDrawerLayout; + private ListView mDrawerList; + private CharSequence mTitle; + + public static Context mContext; + public static CsLibrary4A csLibrary4A; + public static SharedObjects sharedObjects; + public static SensorConnector mSensorConnector; + public static ReaderDevice tagSelected; + + Handler mHandler = new Handler(); + + public static String mDid; public static int selectHold; public static int selectFor; + public static RfidReader.TagType tagType; + public static class Config { + public String configPassword, configPower, config0, config1, config2, config3; + }; + public static Config config = new Config(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + if (DEBUG) { + if (savedInstanceState == null) Log.i(TAG, "MainActivity.onCreate: NULL savedInstanceState"); + else Log.i(TAG, "MainActivity.onCreate: VALID savedInstanceState"); + } + Log.i("Hello", "PackageName is " + getPackageName()); + if (getPackageName().matches("com.csl.updwedgeservice")) setContentView(R.layout.activity_main1); + else setContentView(R.layout.activity_main); + + mTitle = getTitle(); + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + mDrawerList = (ListView) findViewById(R.id.left_drawer); + + mLogView = (TextView) findViewById(R.id.log_view); + + // set up the drawer's list view with items and click listener + mDrawerList.setAdapter(new DrawerListAdapter(this, R.layout.drawer_list_item, DrawerListContent.ITEMS)); + mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); + + mContext = this; + sharedObjects = new SharedObjects(mContext); + csLibrary4A = new CsLibrary4A(mContext, mLogView); + mSensorConnector = new SensorConnector(mContext); + + EdgeToEdge.enable(this); + super.onCreate(savedInstanceState); + if (savedInstanceState == null) selectItem(drawerPositionsDefault); + if (true) Log.i(TAG, "MainActivity.onCreate.onCreate: END"); + } + + @Override + protected void onRestart() { + super.onRestart(); + MainActivity.csLibrary4A.connect(null); + if (DEBUG) csLibrary4A.appendToLog("MainActivity.onRestart()"); + } + + @Override + protected void onStart() { + super.onStart(); + if (DEBUG) csLibrary4A.appendToLog("MainActivity.onStart()"); + } + + @Override + protected void onResume() { + super.onResume(); + activityActive = true; wedged = false; + if (DEBUG) csLibrary4A.appendToLog("MainActivity.onResume()"); + } + + @Override + protected void onPause() { + if (DEBUG) csLibrary4A.appendToLog("MainActivity.onPause()"); + activityActive = false; + super.onPause(); + } + + @Override + protected void onStop() { + if (DEBUG) csLibrary4A.appendToLog("MainActivity.onStop()"); + super.onStop(); + } + + @Override + protected void onDestroy() { + if (DEBUG) csLibrary4A.appendToLog("MainActivity.onDestroy()"); + if (true) { csLibrary4A.disconnect(true); } + csLibrary4A = null; + super.onDestroy(); + } + + boolean configureDisplaying = false; + Toast configureToast; + private final Runnable configureRunnable = new Runnable() { + @Override + public void run() { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("AAA: mrfidToWriteSize = " + csLibrary4A.mrfidToWriteSize()); + if (csLibrary4A.mrfidToWriteSize() != 0) { + MainActivity.csLibrary4A.mrfidToWritePrint(); + configureDisplaying = true; + mHandler.postDelayed(configureRunnable, 500); + } else { + configureDisplaying = false; + progressDialog.dismiss(); + } + } + }; + + CustomProgressDialog progressDialog; + private void selectItem(DrawerPositions position) { + if (DEBUG) Log.i(TAG, "MainActivity.selectItem: position = " + position); + if (position != DrawerPositions.MAIN + && position != DrawerPositions.SPECIAL + && position != DrawerPositions.ABOUT + && position != DrawerPositions.CONNECT + && position != DrawerPositions.DIRECTWEDGE && csLibrary4A.isBleConnected() == false) { + Toast.makeText(MainActivity.mContext, "Bluetooth Disconnected. Please Connect.", Toast.LENGTH_SHORT).show(); + return; + } + switch (position) { + case MAIN: + fragment = new HomeFragment(); + break; + case SPECIAL: + fragment = new HomeSpecialFragment(); + break; + + case ABOUT: + //fragment = new Test1Fragment(); + fragment = new AboutFragment(); + break; + case CONNECT: + fragment = new ConnectionFragment(); + break; + case INVENTORY: + fragment = new InventoryFragment(); + break; + case SEARCH: + fragment = new InventoryRfidSearchFragment(false); + break; + case MULTIBANK: + fragment = InventoryRfidiMultiFragment.newInstance(true, null, null); + break; + case SIMINVENTORY: + fragment = InventoryRfidSimpleFragment.newInstance(false, null); + break; + case SETTING: + fragment = new SettingFragment(); + break; + case FILTER: + fragment = new SettingFilterFragment(); + break; + case READWRITE: + fragment = new AccessReadWriteFragment(); + break; + case SECURITY: + fragment = new AccessSecurityFragment(); + break; + + case IMPINVENTORY: + fragment = new ImpinjFragment(); + break; + case IMP775: + fragment = new ImpinjM775Fragment(); + break; + case ALIEN: + fragment = InventoryRfidiMultiFragment.newInstance(true, TAG_ALIEN, "E2003"); + break; + case UCODE8: + fragment = new Ucode8Fragment(); + break; + case UCODEDNA: + fragment = new UcodeFragment(); + break; + case BAPCARD: + fragment = InventoryRfidiMultiFragment.newInstance(true, TAG_EM_BAP, "E200B0"); + break; + case COLDCHAIN: + fragment = new ColdChainFragment(); + break; + case AURASENSE: + fragment = new AuraSenseFragment(); + break; + case KILOWAY: + fragment = new KilowayFragment(); + break; + case LONGJING: + fragment = new LongjingFragment(); + break; + case AXZON: + fragment = AxzonSelectorFragment.newInstance(true); + break; + case RFMICRON: + fragment = AxzonSelectorFragment.newInstance(false); + break; + case FDMICRO: + fragment = new FdmicroFragment(); + break; + case CTESIUS: + fragment = InventoryRfidiMultiFragment.newInstance(true, TAG_CTESIUS, "E203510"); + break; + case ASYGNTAG: + fragment = InventoryRfidiMultiFragment.newInstance(true, TAG_ASYGN, "E283A"); + break; + + case REGISTER: + fragment = new AccessRegisterFragment(); + break; + case READWRITEUSER: + fragment = new AccessReadWriteUserFragment(); + break; + case WEDGE: + case DIRECTWEDGE: + fragment = new DirectWedgeFragment(); + break; + case BLANK: + fragment = new TestFragment(); + break; + } + + FragmentManager fragmentManager = getSupportFragmentManager(); + + if (position == drawerPositionsDefault) { + //Pop the back stack since we want to maintain only one level of the back stack + //Don't add the transaction to back stack since we are navigating to the first fragment + //being displayed and adding the same to the backstack will result in redundancy + fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); + fragmentManager.beginTransaction().replace(R.id.content_frame, fragment, TAG_CONTENT_FRAGMENT).commit(); + } else { + //Pop the back stack since we want to maintain only one level of the back stack + //Add the transaction to the back stack since we want the state to be preserved in the back stack + //fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); + fragmentManager.beginTransaction().replace(R.id.content_frame, fragment, TAG_CONTENT_FRAGMENT).addToBackStack(null).commit(); + } + mDrawerLayout.closeDrawer(mDrawerList); + } + + @Override + public void setTitle(CharSequence title) { + mTitle = title; + getSupportActionBar().setTitle(mTitle); + } + + @Override + public void onBackPressed() { + if (drawerPositionsDefault != DrawerPositions.MAIN) return; + mDrawerList.setItemChecked(0, true); + Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_CONTENT_FRAGMENT); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("MainActivity super.onBackPressed"); + super.onBackPressed(); + } + + public static boolean permissionRequesting; + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("permissionRequesting: requestCode = " + requestCode + ", permissions is " + (permissions == null ? "null" : "valid") + ", grantResults is " + (grantResults == null ? "null" : "valid") ); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("permissionRequesting: permissions[" + permissions.length + "] = " + (permissions != null && permissions.length > 0 ? permissions[0] : "")); + if (grantResults != null && grantResults.length != 0) { + boolean bNegative = false; + for (int i = 0; i < grantResults.length; i++) { + if (grantResults[i] < 0) bNegative = true; + if (DEBUG) csLibrary4A.appendToLog("permissionRequesting: grantResults[" + i + "] = " + grantResults[i] ); + } + if (bNegative) { + Toast toast = Toast.makeText(this, R.string.toast_permission_not_granted, Toast.LENGTH_SHORT); + if (false) toast.setGravity(Gravity.TOP | Gravity.RIGHT, 100, 200); + toast.show(); + } + } + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + permissionRequesting = false; + } + + public void sfnClicked(View view) { + selectItem(DrawerPositions.SPECIAL); + } + + public void privacyClicked(View view) { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + intent.addCategory(Intent.CATEGORY_BROWSABLE); + intent.setData(Uri.parse("https://www.convergence.com.hk/apps-privacy-policy")); + startActivity(intent); + } + + public void aboutClicked(View view) { selectItem(DrawerPositions.ABOUT); } + public void connectClicked(View view) { selectItem(DrawerPositions.CONNECT); } + public void invClicked(View view) { selectItem(DrawerPositions.INVENTORY); } + public void locateClicked(View view) { + selectItem(DrawerPositions.SEARCH); + } + public void multiBankClicked(View view) { selectItem(DrawerPositions.MULTIBANK); } + public void settClicked(View view) { + selectItem(DrawerPositions.SETTING); + } + public void filterClicked(View view) { + selectItem(DrawerPositions.FILTER); + } + public void rrClicked(View view) { + selectItem(DrawerPositions.READWRITE); + } + public void rrUserClicked(View view) { selectItem(DrawerPositions.READWRITEUSER); } + + public void accessClicked(View view) { + selectItem(DrawerPositions.SECURITY); + } + + public void impInventoryClicked(View view) { selectItem(DrawerPositions.IMPINVENTORY); } + public void m775Clicked(View view) { selectItem(DrawerPositions.IMP775); } + public void alienClicked(View view) { selectItem(DrawerPositions.ALIEN); } + public void uCode8Clicked(View view) { selectItem(DrawerPositions.UCODE8); } + public void uCodeClicked(View view) { selectItem(DrawerPositions.UCODEDNA); } + public void bapCardClicked(View view) { selectItem(DrawerPositions.BAPCARD); } + public void coldChainClicked(View view) { selectItem(DrawerPositions.COLDCHAIN); } + public void aurasenseClicked(View view) { selectItem(DrawerPositions.AURASENSE); } + public void kilowayClicked(View view) { selectItem(DrawerPositions.KILOWAY); } + public void longjingClicked(View view) { selectItem(DrawerPositions.LONGJING); } + public void axzonClicked(View view) { selectItem(DrawerPositions.AXZON); } + public void rfMicronClicked(View view) { selectItem(DrawerPositions.RFMICRON); } + public void fdmicroClicked(View view) { selectItem(DrawerPositions.FDMICRO); } + public void ctesiusClicked(View view) { selectItem(DrawerPositions.CTESIUS); } + public void asygnClicked(View view) { selectItem(DrawerPositions.ASYGNTAG); } + + public void regClicked(View view) { selectItem(DrawerPositions.REGISTER); } + public static boolean wedged = false; + public void wedgeClicked(View view) { + if (false) { + wedged = true; + Intent i = new Intent(Intent.ACTION_MAIN); + i.addCategory(Intent.CATEGORY_HOME); + startActivity(i); + } else selectItem(DrawerPositions.WEDGE); + } + public void directWedgeClicked(View view) { + selectItem(DrawerPositions.DIRECTWEDGE); + } + + public void simpleInventoryClicked(View view) { selectItem(DrawerPositions.SIMINVENTORY); } + + public void blankClicked(View view) { if (false) selectItem(DrawerPositions.BLANK); } + + // The click listener for ListView in the navigation drawer + private class DrawerItemClickListener implements ListView.OnItemClickListener { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (DEBUG) Log.i(TAG, "MainActivity.onItemClick: position = " + position + ", id = " + id); + selectItem(DrawerPositions.toDrawerPosition(position)); + } + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + if (DEBUG) csLibrary4A.appendToLog("onNewIntent !!! intent.getAction = " + intent.getAction()); + readFromIntent(intent); + } + private void readFromIntent(Intent intent) { + if (DEBUG) csLibrary4A.appendToLog("onNewIntent !!! readFromIntent entry"); + String action = intent.getAction(); + } +} + + + +package com.csl.cs710ademoapp; + +import static android.Manifest.permission.BLUETOOTH_CONNECT; +import static android.Manifest.permission.BLUETOOTH_SCAN; +import static com.csl.cs710ademoapp.MainActivity.mContext; +import static com.csl.cs710ademoapp.MyForegroundService.ForegroundServiceState.CLOUDCONNECT; +import static com.csl.cs710ademoapp.MyForegroundService.ForegroundServiceState.CONNECT; +import static com.csl.cs710ademoapp.MyForegroundService.ForegroundServiceState.CONNECTED; +import static com.csl.cs710ademoapp.MyForegroundService.ForegroundServiceState.INVENTORY; +import static com.csl.cs710ademoapp.MyForegroundService.ForegroundServiceState.NULL; +import static com.csl.cs710ademoapp.MyForegroundService.ForegroundServiceState.SCAN; +import static com.csl.cs710ademoapp.MyForegroundService.ForegroundServiceState.WAIT; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; +import android.os.Binder; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.util.Log; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.core.app.NotificationCompat; + +import com.csl.cs710ademoapp.fragments.AboutFragment; +import com.csl.cslibrary4a.BluetoothGatt; +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Random; + +public class MyForegroundService extends Service { + boolean DEBUG = false; + String TAG = "Hello"; + Handler mHandler = new Handler(); + public static final String CHANNEL_ID = "ForegroundServiceChannelA"; + public static final int SERVICE_ID = 1; + NotificationManager notificationManager; + NotificationCompat.Builder notificationCompatBuilder; + ReaderDevice readerDevice; + SaveList2ExternalTask saveExternalTask; boolean isHttpServerOpened; + MyMqttClient myMqttClient; + ArrayList epcArrayList = new ArrayList(); + ArrayList readerDeviceArrayList = new ArrayList<>(); + long startTimeMillis, inventoryStartTimeMillis = 0; + int iConnectingCount = 0; + + private final IBinder binder = new LocalBinder(); + public class LocalBinder extends Binder { + MyForegroundService getService() { + // Return this instance of LocalService so clients can call public methods. + return MyForegroundService.this; + } + } + + @Override + public void onCreate() { + super.onCreate(); + mHandler.post(serviceRunnable); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + //String input = intent.getStringExtra("inputExtra"); + if (MainActivity.csLibrary4A != null) Log.i(TAG, "MyForegroundService onStartCommand: csLibrary4A is created"); + else Log.i(TAG, "MyForegroundService onStartCommand: null csLibrary4A"); + Log.i(TAG, "MyForegroundService: onStartCommand"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Log.i(TAG, "MyForegroundService: createNotificationChannel"); + NotificationChannel serviceChannel = new NotificationChannel( + CHANNEL_ID, + "Foreground Service Channel", + NotificationManager.IMPORTANCE_LOW + ); + notificationManager = (NotificationManager) getSystemService(NotificationManager.class); //NotificationManager.class); //NOTIFICATION_SERVICE + List list = notificationManager.getNotificationChannels(); Log.i(TAG, "MyForegroundService onStartComand: getNotificationChannels.size = " + list.size()); + notificationManager.createNotificationChannel(serviceChannel); + list = notificationManager.getNotificationChannels(); Log.i(TAG, "MyForegroundService onStartCommand: after createNotificationChannel, getNotificationChannels.size = " + list.size()); + } + + Intent notificationIntent = new Intent(this, AboutFragment.class); + //notificationIntent.setFlags((Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)); + PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE); + notificationCompatBuilder = new NotificationCompat.Builder(this, CHANNEL_ID) + .setContentTitle("Cs710Reader Foreground Service") + .setSmallIcon(R.drawable.csl_logo_230510); + //.setPriority(NotificationCompat.PRIORITY_DEFAULT) + //.setContentIntent(pendingIntent) + //.setAutoCancel(true) + //.build(); + Notification notification = updateNotification("MyForegroundService starts"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + startForeground(SERVICE_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION); + } else { + startForeground(SERVICE_ID, notification); + } + + thread = new Thread( + new Runnable() { + @Override + public void run() { + while (true) { + int iRandom = getRandomNumber(); + String strMessage = iRandom + ", "; + if (MainActivity.csLibrary4A == null) { + strMessage += "Cannot connect. Please restart App"; + foregroundServiceState = NULL; + } else + { + ForegroundServiceState foregroundServiceStateOld = foregroundServiceState; + if (foregroundServiceState == NULL) { + strMessage += "ServiceState = " + foregroundServiceState.toString(); + foregroundServiceState = WAIT; + } else if (foregroundServiceState == WAIT) { + strMessage += "Wait to enable Foreground Service"; + if (isForegroundEnable()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { //that is android 12 or above + if (ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED + || ActivityCompat.checkSelfPermission(mContext, BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { + Log.i(TAG, "runnableStart: CANNOT start scanLeDevice as BLUETOOTH_CONNECT && BLUETOOTH_SCAN is NOT yet permitted"); + } else if (MainActivity.csLibrary4A.isBleConnected()) { + foregroundServiceState = CONNECTED; + Log.i(TAG, "going to CONNECTED"); + } else if (MainActivity.activityActive == false) { + Log.i(TAG, "runnableStartService: BLUETOOTH_CONNECT and BLUETOOTH_SCAN and (ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION) is permitted"); + } else { + Log.i(TAG, "Start ScanLeDevice"); + MainActivity.csLibrary4A.scanLeDevice(true); + foregroundServiceState = SCAN; + } + } + } + } else if (foregroundServiceState == SCAN) { + strMessage += "Scanning reader"; + if (MainActivity.csLibrary4A.isBleConnected()) { + foregroundServiceState = CONNECTED; + } else if (isForegroundEnable()) { + BluetoothGatt.CsScanData csScanData = null; + while (true) { + csScanData = MainActivity.csLibrary4A.getNewDeviceScanned(); + Log.i(TAG, "cs108ScanData is " + (csScanData == null ? "null" : "valid") + ", foregroundReader = " + MainActivity.csLibrary4A.getForegroundReader()); + if (csScanData == null) break; + strMessage += ("\n" + csScanData.device.getAddress()); + if (csScanData.device.getAddress().matches(MainActivity.csLibrary4A.getForegroundReader())) { //"84:C6:92:9D:DD:52")) { + readerDevice = new ReaderDevice(csScanData.device.getName(), csScanData.device.getAddress(), false, "", 1, csScanData.rssi, csScanData.serviceUUID2p2); + String strInfo = ""; + if (csScanData.device.getBondState() == 12) { + strInfo += "BOND_BONDED\n"; + } + readerDevice.setDetails(strInfo + "scanRecord=" + MainActivity.csLibrary4A.byteArrayToString(csScanData.scanRecord)); + + MainActivity.csLibrary4A.scanLeDevice(false); + MainActivity.csLibrary4A.connect(readerDevice); + foregroundServiceState = CONNECT; + iConnectingCount = 0; + break; + } + } + if (foregroundServiceState != CONNECT && csScanData != null) + strMessage += ("\n" + csScanData.device.getAddress()); + } else { + Log.i(TAG, "Stop ScanLeDevice"); + MainActivity.csLibrary4A.scanLeDevice(false); + foregroundServiceState = NULL; + } + } else if (foregroundServiceState == CONNECT) { + strMessage += "Connecting Reader"; + if (MainActivity.csLibrary4A.isBleConnected()) { + readerDevice.setConnected(true); + readerDevice.setSelected(true); + MainActivity.sharedObjects.readersList.add(readerDevice); + foregroundServiceState = CONNECTED; + } else if (++iConnectingCount > 10) { + MainActivity.csLibrary4A.disconnect(false); + foregroundServiceState = NULL; + } + } else if (foregroundServiceState == CLOUDCONNECT) { + strMessage += "Connecting MQTT Server"; + if (!MainActivity.csLibrary4A.isBleConnected()) + foregroundServiceState = CONNECTED; + else if (!isForegroundEnable()) + foregroundServiceState = CONNECTED; + if (false && MainActivity.csLibrary4A.getInventoryCloudSave() == 1) { + saveExternalTask = new SaveList2ExternalTask(false); + Log.i(TAG, "Server: new saveExternalTask"); + isHttpServerOpened = saveExternalTask.openServer(false); + Log.i(TAG, "Server: openServer is " + isHttpServerOpened); + foregroundServiceState = CONNECTED; + } else if (MainActivity.csLibrary4A.getInventoryCloudSave() == 2) { + if (myMqttClient != null && myMqttClient.isMqttServerConnected) { + Log.i(TAG, "MyForegroundService: Connecting MQTT 1"); + foregroundServiceState = CONNECTED; + } else { + Log.i(TAG, "MyForegroundService: Connecting MQTT 2"); + myMqttClient = new MyMqttClient(getApplicationContext()); + myMqttClient.connect(null); + } + } else foregroundServiceState = NULL; + } else if (foregroundServiceState == CONNECTED) { + strMessage += "Connected"; + if (MainActivity.csLibrary4A.isBleConnected()) { + if (isForegroundEnable()) { + boolean bStartInventory = false; + if (MainActivity.csLibrary4A.getInventoryCloudSave() == 1) { + if (false && !isHttpServerOpened) { + Log.i(TAG, "Server: going to CloudConnect"); + foregroundServiceState = CLOUDCONNECT; + } else if (MainActivity.csLibrary4A.getTriggerButtonStatus()) { + strMessage += ("\n" + "H pressed trigger"); + bStartInventory = true; + } else strMessage += ("\n" + "H released trigger"); + } else if (MainActivity.csLibrary4A.getInventoryCloudSave() == 2 + && MainActivity.csLibrary4A.getServerMqttLocation().length() > 0 && MainActivity.csLibrary4A.getTopicMqtt().length() > 0) { + if (myMqttClient == null || !myMqttClient.isMqttServerConnected) + foregroundServiceState = CLOUDCONNECT; + else if (MainActivity.csLibrary4A.getTriggerButtonStatus()) { + strMessage += (" with trigger pressed"); + bStartInventory = true; + } else strMessage += (" with trigger released"); + } + if (bStartInventory) { + Log.i(TAG, "Debug_Compact: MyForegroundService.onStartCommand"); + MainActivity.csLibrary4A.startOperation(RfidReaderChipData.OperationTypes.TAG_INVENTORY_COMPACT); + Log.i(TAG, "Server:sss startOperation"); + inventoryStartTimeMillis = System.currentTimeMillis(); + foregroundServiceState = INVENTORY; + } + } + if (false) Log.i(TAG, "isForegroundEnable = " + isForegroundEnable() + + ", getInventoryCloudSave = " + MainActivity.csLibrary4A.getInventoryCloudSave() + + ", getServerMqttLocation = " + MainActivity.csLibrary4A.getServerMqttLocation() + + ", getTopicMqtt = " + MainActivity.csLibrary4A.getTopicMqtt()); + } else { + Log.i(TAG, "Disconnecting"); + MainActivity.csLibrary4A.disconnect(false); + if (isHttpServerOpened) { + if (saveExternalTask.closeServer()) + Log.i(TAG, "Server: closeServer success"); + else Log.i(TAG, "Server: closeServer failure"); + isHttpServerOpened = false; + } + if (myMqttClient != null) myMqttClient.disconnect(null); + foregroundServiceState = NULL; + } + } else if (foregroundServiceState == INVENTORY) { + strMessage += "Doing inventory "; + Log.i(TAG, "inventory: isBleConnected = " + MainActivity.csLibrary4A.isBleConnected()); + Log.i(TAG, "inventory: myMqttClient = " + (myMqttClient == null ? "null" : myMqttClient.isMqttServerConnected)); + if (!MainActivity.csLibrary4A.isBleConnected()) + foregroundServiceState = CONNECTED; +// else if (csLibrary4A.getInventoryCloudSave() == 2 && (myMqttClient == null || !myMqttClient.isMqttServerConnected)) foregroundServiceState = CONNECTED; + else { + long timePeriod = System.currentTimeMillis() - startTimeMillis; + if (timePeriod > MainActivity.csLibrary4A.getForegroundDupElim() * 1000L) { + startTimeMillis = System.currentTimeMillis(); + Log.i(TAG, "Foreground removes strEpcList of size " + epcArrayList.size()); + epcArrayList.clear(); + } + timePeriod = System.currentTimeMillis() - inventoryStartTimeMillis; + if (MainActivity.csLibrary4A.getInventoryCloudSave() == 2) + timePeriod = 0; + if (isForegroundEnable() && MainActivity.csLibrary4A.getTriggerButtonStatus() && timePeriod < 2000L) { + RfidReaderChipData.Rx000pkgData rx000pkgData = null, rx000pkgData1 = null; + while (MainActivity.csLibrary4A.getTriggerButtonStatus()) { + rx000pkgData = MainActivity.csLibrary4A.onRFIDEvent(); + Log.i(TAG, "rx000pkgData is " + (rx000pkgData == null ? "null" : "valid") + + ", rx000pkgData1 is " + (rx000pkgData1 == null ? "null" : "valid")); + if (rx000pkgData == null) { + if (rx000pkgData1 == null) + strMessage += ("\n NO Tag is found"); + break; + } else { + rx000pkgData1 = rx000pkgData; + String strEpc = MainActivity.csLibrary4A.byteArrayToString(rx000pkgData1.decodedEpc); + if (strEpc == null || strEpc.length() <= 0) + rx000pkgData1 = null; + else { + boolean match = false; + for (int i = 0; i < epcArrayList.size(); i++) { + if (strEpc.matches(epcArrayList.get(i))) { + match = true; + Log.i(TAG, "Foreground matches tag " + strEpc); + break; + } + } + if (!match) epcArrayList.add(strEpc); + else rx000pkgData1 = null; + } + if (rx000pkgData1 != null) { + Log.i(TAG, "Server: getInventoryCloudSave = " + MainActivity.csLibrary4A.getInventoryCloudSave()); + if (MainActivity.csLibrary4A.getInventoryCloudSave() == 1) { + ReaderDevice readerDevice1 = new ReaderDevice("", MainActivity.csLibrary4A.byteArrayToString(rx000pkgData1.decodedEpc), false, null, + MainActivity.csLibrary4A.byteArrayToString(rx000pkgData1.decodedPc), null, MainActivity.csLibrary4A.byteArrayToString(rx000pkgData1.decodedCrc), null, + null, -1, -1, + null, -1, -1, + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS").format(new Date()), new SimpleDateFormat("z").format(new Date()).replaceAll("GMT", ""), + MainActivity.mSensorConnector.mLocationDevice.getLocation(), MainActivity.mSensorConnector.mSensorDevice.getEcompass(), + 1, rx000pkgData1.decodedRssi, rx000pkgData1.decodedPhase, rx000pkgData1.decodedChidx, rx000pkgData1.decodedPort, -1, -1, -1, -1, -1, -1, null, -1); + + readerDeviceArrayList.add(readerDevice1); + } else if (MainActivity.csLibrary4A.getInventoryCloudSave() == 2) { + myMqttClient.publish(MainActivity.csLibrary4A.byteArrayToString(rx000pkgData1.decodedEpc)); + } + } + } + } + if (rx000pkgData1 != null) + strMessage += ("\n " + MainActivity.csLibrary4A.byteArrayToString(rx000pkgData1.decodedEpc)); + } else { //isForegroundEnable() && csLibrary4A.getTriggerButtonStatus() && timePeriod + Log.i(TAG, "Server:sss abortOperation with isForegroundEnable = " + isForegroundEnable() + + ", getTriggerButtonStatus = " + MainActivity.csLibrary4A.getTriggerButtonStatus() + ", timePeriod = " + timePeriod + ", "); + MainActivity.csLibrary4A.abortOperation(); + while (true) { + RfidReaderChipData.Rx000pkgData rx000pkgData = MainActivity.csLibrary4A.onRFIDEvent(); + if (rx000pkgData == null) break; + } + if (readerDeviceArrayList.size() != 0) { + saveExternalTask = new SaveList2ExternalTask(false); + Log.i(TAG, "Server: new saveExternalTask"); + isHttpServerOpened = saveExternalTask.openServer(false); + Log.i(TAG, "Server: openServer is " + isHttpServerOpened); + String messageStr = saveExternalTask.createJSON(readerDeviceArrayList, null).toString(); + Log.i(TAG, "Server: Json = " + messageStr); + saveExternalTask.write2Server(messageStr); + Log.i(TAG, "Server: write2Server success"); + if (saveExternalTask.closeServer()) + Log.i(TAG, "Server: closeServer success"); + else Log.i(TAG, "Server: closeServer failure"); + } + foregroundServiceState = CONNECTED; + } + } + } + if (foregroundServiceState != foregroundServiceStateOld) { + strMessage += (", New ServiceState = " + foregroundServiceState.toString()); + } + MainActivity.csLibrary4A.batteryLevelRequest(); //dummy reader access + } + + updateNotification(strMessage); + try { + int iTime = 2000; + if (foregroundServiceState == INVENTORY) iTime = 100; + Thread.sleep(iTime); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + ); + thread.start(); + + // Builds the notification and issues it. + //do heavy work on a background thread + //stopSelf(); + return super.onStartCommand(intent, flags, startId); //return START_NOT_STICKY; + } + + @Override + public void onDestroy() { + Log.i(TAG, "MyForegroundService: onDestroy"); + mHandler.removeCallbacks(serviceRunnable); + if (MainActivity.csLibrary4A != null) { + MainActivity.csLibrary4A.disconnect(false); + Log.i(TAG, "MyForegroundService: onDestroy 0"); + } + thread.stop(); + stopSelf(); + super.onDestroy(); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + Log.i(TAG, "MyForegroundService: onBind"); + return binder; // null; + } + + @Override + public void onTaskRemoved(Intent rootIntent) { + Log.i(TAG, "MyForegroundService: onTaskRemoved"); + System.out.println("onTaskRemoved called"); + super.onTaskRemoved(rootIntent); + //do something you want + //stop service + thread.stop(); + this.stopSelf(); + } + + Thread thread = null; + Notification updateNotification(String string) { + if (DEBUG) Log.i(TAG, "MyForegroundService.updateNotification: " + string); + notificationCompatBuilder.setContentText(string); + Notification notification = notificationCompatBuilder.build(); + notificationManager.notify(1, notification); + return notification; + } + + int batteryCount_old; String strBatteryLow_old; + Runnable serviceRunnable = new Runnable() { + @Override + public void run() { + if (DEBUG) Log.i(TAG, "MyForegroundService.serviceRunnable starts"); + mHandler.postDelayed(serviceRunnable, 2000); + if (!MainActivity.activityActive && MainActivity.csLibrary4A != null && MainActivity.csLibrary4A.isBleConnected()) { + int batteryCount = MainActivity.csLibrary4A.getBatteryCount(); + String strBatteryLow = MainActivity.csLibrary4A.isBatteryLow(); + if (DEBUG) Log.i(TAG, "MyForegroundService.serviceRunnable: batteryCount = " + batteryCount + ", batteryCount_old = " + batteryCount_old); + if (batteryCount_old != batteryCount) { + batteryCount_old = batteryCount; + if (strBatteryLow == null || strBatteryLow_old == null) + strBatteryLow_old = strBatteryLow; + else if (!strBatteryLow.matches(strBatteryLow_old)) + strBatteryLow_old = strBatteryLow; + } + if (strBatteryLow != null) { + if (false) Log.i(TAG, "CustomIME Debug 112"); + Toast.makeText(mContext, + "Battery Low: " + strBatteryLow + "% Battery Life Left", + Toast.LENGTH_SHORT).show(); + } + } + } + }; + + final Random mGenerator = new Random(); + int getRandomNumber() { + return mGenerator.nextInt(100); + } + + boolean isForegroundEnable() { + if (MainActivity.csLibrary4A == null) return false; + if (DEBUG) Log.i(TAG, "MyForegroundService.isForegroundEnable: isHomeFragment = " + MainActivity.isHomeFragment + ", getForegroundReader = " + MainActivity.csLibrary4A.getForegroundReader()); + return (MainActivity.isHomeFragment && MainActivity.csLibrary4A.getForegroundReader().length() != 0); + } + + enum ForegroundServiceState { + NULL, WAIT, SCAN, CONNECT, CLOUDCONNECT, CONNECTED, INVENTORY, DISCONNECT + } + ForegroundServiceState foregroundServiceState = NULL; +} + + + +package com.csl.cs710ademoapp; + +import android.content.Context; +import android.util.Log; +import android.view.View; + +import org.eclipse.paho.client.mqttv3.IMqttActionListener; +import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; +import org.eclipse.paho.client.mqttv3.IMqttToken; +import org.eclipse.paho.client.mqttv3.MqttCallback; +import org.eclipse.paho.client.mqttv3.MqttClient; +import org.eclipse.paho.client.mqttv3.MqttConnectOptions; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +import info.mqtt.android.service.Ack; +import info.mqtt.android.service.MqttAndroidClient; + +public class MyMqttClient { + final boolean DEBUG = false; final String TAG = "Hello"; + boolean isMqttServerConnected = false; + Context context; + public MyMqttClient(Context context) { + this.context = context; + + ///This here are the mqtt broker informations + String clientId = MqttClient.generateClientId(); + Log.i(TAG, "MQTT: clientId is " + (clientId == null ? "null" : clientId)); + //String serverMqttLocation = "tcp://192.168.25.153:1883"; + //String serverMqttLocation = "tcp://localhost:1883"; + String serverMqttLocation = "tcp://" + MainActivity.csLibrary4A.getServerMqttLocation() + ":1883"; + Log.i(TAG, "MQTT: serverLocation is " + serverMqttLocation); + client = new MqttAndroidClient(context, serverMqttLocation, clientId, Ack.AUTO_ACK); + Log.i(TAG, "MQTT: client is " + (client == null ? "null" : "valid")); + + if (true) { + MqttConnectOptions options = new MqttConnectOptions(); + //options.setUserName("narada"); + //options.setPassword("narada146551".toCharArray()); + //options.setPassword("narada683796".toCharArray()); + options.setKeepAliveInterval(60);//seconds + options.setCleanSession(true); + options.setAutomaticReconnect(true); + } + + /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + ContextCompat.registerReceiver(this, mMessageReceiver, + new IntentFilter(AppConstants.INTENT_FILTERS.DASHBOARD_MESSAGE),RECEIVER_NOT_EXPORTED); + }else { + ContextCompat.registerReceiver(this, mMessageReceiver, + new IntentFilter(AppConstants.INTENT_FILTERS.DASHBOARD_MESSAGE)); + }*/ + + client.setCallback(new MqttCallback() { + @Override + public void connectionLost(Throwable cause) { + Log.i(TAG, "MQTT: client.setCallback connectionLost"); + isMqttServerConnected = false; + } + + @Override + public void messageArrived(String topic, MqttMessage message) throws Exception { + Log.i(TAG, "MQTT: client.setCallback messageArrived"); + } + + @Override + public void deliveryComplete(IMqttDeliveryToken token) { + Log.i(TAG, "MQTT: client.setCallback deliveryComplete"); + } + }); + } + MqttAndroidClient client; + public void connect(View v) { + try { + IMqttToken token = client.connect(); + token.setActionCallback(new IMqttActionListener() { + @Override + public void onSuccess(IMqttToken asyncActionToken) { + Log.i(TAG, "MQTT: client.connect.setActionCallback onSuccess"); + //Toast.makeText(MainActivity.this,"connected!!",Toast.LENGTH_LONG).show(); + subscribe(); + isMqttServerConnected = true; + } + + @Override + public void onFailure(IMqttToken asyncActionToken, Throwable exception) { + Log.i(TAG, "MQTT: client.connect.setActionCallback onFailure"); + //Toast.makeText(MainActivity.this,"connection failed!!",Toast.LENGTH_LONG).show(); + } + }); + } catch (Exception e) { + Log.i(TAG, "MQTT: conn Exception: " + e.toString()); + } + } + public void disconnect(View v) { + try { + IMqttToken token = client.disconnect(); + token.setActionCallback(new IMqttActionListener() { + @Override + public void onSuccess(IMqttToken asyncActionToken) { + isMqttServerConnected = false; + Log.i(TAG, "MQTT: client.disconnect.setActionCallback onSuccess"); + //Toast.makeText(MainActivity.this,"Disconnected!!",Toast.LENGTH_LONG).show(); + } + + @Override + public void onFailure(IMqttToken asyncActionToken, Throwable exception) { + Log.i(TAG, "MQTT: client.disconnect.setActionCallback onFailure"); + //Toast.makeText(MainActivity.this,"Could not diconnect!!",Toast.LENGTH_LONG).show(); + } + }); + } catch (Exception e) { + Log.i(TAG, "MQTT: disconn Exception: " + e.toString()); + } + } + private void subscribe() { + try{ + client.subscribe("event",0); + Log.i(TAG, "MQTT: client.subscribe"); + } catch (Exception e){ + Log.i(TAG, "MQTT: setSubscription Exception: " + e.toString()); + } + } + public void publish(String message) { + String topic = MainActivity.csLibrary4A.getTopicMqtt(); + //String message = "the payload 11"; + try { + client.publish(topic, message.getBytes(),0,false); + Log.i(TAG, "MQTT: client.publish"); + //Toast.makeText(this,"Published Message",Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + Log.i(TAG, "MQTT: published Exception: " + e.toString()); + } + } +} + + + +package com.csl.cs710ademoapp; + +import static android.content.Context.WIFI_SERVICE; +import static com.csl.cs710ademoapp.MainActivity.csLibrary4A; +import static com.csl.cs710ademoapp.MainActivity.mContext; + +import android.bluetooth.BluetoothAdapter; +import android.media.MediaScannerConnection; +import android.net.wifi.WifiManager; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Environment; +import android.provider.Settings; +import android.util.Log; + +import com.csl.cslibrary4a.ReaderDevice; +import com.csl.cslibrary4a.RfidReaderChipData; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.URL; +import java.security.SecureRandom; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +public class SaveList2ExternalTask extends AsyncTask { + public String messageStr; + String resultDisplay = ""; + public String errorDisplay; + ArrayList tagsList; ReaderDevice tagDevice1; + CustomPopupWindow customPopupWindow; + boolean savedFile = false; + int fileFormat = 0; + + public String url = null, strBearer = null; + HttpURLConnection con; + String stringBluetoothMAC, stringWifiMac; + + public SaveList2ExternalTask(ArrayList tagsList) { + this.tagsList = tagsList; + + stringBluetoothMAC = BluetoothAdapter.getDefaultAdapter().getAddress().replaceAll(":", ""); + csLibrary4A.appendToLog("stringBluetoothMac from getMacAddress = " + stringBluetoothMAC); + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S) { } + else if (stringBluetoothMAC.contains("020000000000")) { + final String SECURE_SETTINGS_BLUETOOTH_ADDRESS = "bluetooth_address"; + String macAddress = Settings.Secure.getString(mContext.getContentResolver(), SECURE_SETTINGS_BLUETOOTH_ADDRESS); //Not OK in android 8, >= 32 + csLibrary4A.appendToLog("stringBluetoothMac from Settings.Secure.getString = " + macAddress); + stringBluetoothMAC = macAddress; + } + + stringWifiMac = ((WifiManager) MainActivity.mContext.getSystemService(WIFI_SERVICE)).getConnectionInfo().getMacAddress().replaceAll(":", ""); + csLibrary4A.appendToLog("stringWifMac from getMacAddress = " + stringWifiMac); + if (stringWifiMac.contains("020000000000")) { + try { + List all = Collections.list(NetworkInterface.getNetworkInterfaces()); + for (NetworkInterface nif : all) { + csLibrary4A.appendToLog("nif.getName = " + nif.getName() + ", macByts = " + csLibrary4A.byteArrayToString(nif.getHardwareAddress())); + } + + WifiManager wifiMan = (WifiManager) mContext.getSystemService(WIFI_SERVICE); + int wifiState = wifiMan.getWifiState(); + //wifiMan.setWifiEnabled(true); + File fl = new File("/sys/class/net/wlan0/address"); + FileInputStream fin = new FileInputStream(fl); //Not Ok in Amdroid 11 + StringBuilder builder = new StringBuilder(); + int ch; + while ((ch = fin.read()) != -1) { + builder.append((char) ch); + } + String fileMAC = builder.toString(); + csLibrary4A.appendToLog("getName: file content = " + fileMAC); + fin.close(); + + stringWifiMac = fileMAC; + //boolean enabled = WifiManager.WIFI_STATE_ENABLED == wifiState; + //wifiMan.setWifiEnabled(enabled); + } catch (Exception ex) { + csLibrary4A.appendToLog("Exception : " + ex.getCause()); + } + } + } + boolean bImpinjServer = false; + public SaveList2ExternalTask(boolean bImpinjServer) { + csLibrary4A.appendToLog("bImpinjServer = " + bImpinjServer); + this.bImpinjServer = bImpinjServer; + } + + @Override + protected void onPreExecute() { + if (!bImpinjServer) { + if (tagsList == null) cancel(true); + if (MainActivity.csLibrary4A.getSavingFormatSetting() == 0) + messageStr = createJSON(tagsList, null).toString(); + else messageStr = createCSV(tagsList, null); + resultDisplay = save2File(messageStr, true); + } + customPopupWindow = new CustomPopupWindow(mContext); + csLibrary4A.appendToLog("SaveList2ExternalTask: resultDisplay = " + resultDisplay); + if (resultDisplay == null) resultDisplay = ""; + else { + resultDisplay += "\n"; + savedFile = true; + customPopupWindow.popupStart(resultDisplay + "Connecting server. Please wait.", true); + csLibrary4A.appendToLog("SaveList2ExternalTask: popupStart is done"); + } + } + + protected String doInBackground(Void... params) { + Log.i("Hello", "bImpinjServer: doInBackground starts"); + if (MainActivity.csLibrary4A.isBleConnected() == false) { + resultDisplay += "Error in sending data to server as the reader is not connected"; + return null; + } else if (MainActivity.csLibrary4A.getSaveCloudEnable() == false && bImpinjServer == false) { + resultDisplay += "No saving to cloud as it is disabled"; + return null; + } + try { + if (true) { + csLibrary4A.appendToLog("bImpinjServer: doInBackground starts doing"); + openServer(bImpinjServer); csLibrary4A.appendToLog("bImpinjServer: doInBackground after openServer"); + write2Server(messageStr); csLibrary4A.appendToLog("bImpinjServer: doInBackground after write2Server"); + closeServer(); csLibrary4A.appendToLog("bImpinjServer: doInBackground after closeServer"); + } else if (true) { + String serverAddress = "192.168.25.119:21"; + String addressPort[]; + InetAddress serverAddr = null; + int serverPort = 0; + boolean validLocation = false; + if (serverAddress != null) { + addressPort = serverAddress.trim().split(":"); + if (addressPort.length == 2) { + try { + serverAddr = InetAddress.getByName(addressPort[0]); + serverPort = Integer.decode(addressPort[1]); + validLocation = true; + } catch (Exception ex) { } + } + } + if (validLocation == false) resultDisplay += "Error in creating server location from " + csLibrary4A.getServerLocation() + " !!!"; + else { + DatagramSocket udpSocket = new DatagramSocket(); + byte[] buf = messageStr.getBytes(); + DatagramPacket packet = new DatagramPacket(buf, buf.length, serverAddr, serverPort); + udpSocket.send(packet); + resultDisplay += "Success in sending data to " + csLibrary4A.getServerLocation(); + } + } + } catch (Exception e) { + errorDisplay += ": " + e.getMessage() + "\n"; + } + if (errorDisplay != null) resultDisplay += "Error in sending data to server " + (url != null ? url : "") + " with " + errorDisplay; + while (MainActivity.permissionRequesting) { } + return null; + } + protected void onProgressUpdate(Void... output) { } + protected void onCancelled() { } + protected void onPostExecute(String output) { + if (savedFile == false) resultDisplay += "\n" + save2File(messageStr, false); + customPopupWindow.popupWindow.dismiss(); + csLibrary4A.appendToLog("bImpinjServer = " + bImpinjServer + ", responseCode = " + responseCode + ", resultDisplay = " + resultDisplay); + if (resultDisplay != null && resultDisplay.length() != 0) { + if (!bImpinjServer || responseCode != 200) customPopupWindow.popupStart(resultDisplay, false); + } + } + + public String createStrEpcList() { + String stringOutput = ""; + if (tagsList != null) { + for (int i = 0; i < tagsList.size(); i++) { + ReaderDevice tagDevice = tagsList.get(i); + if (tagDevice.getAddress() != null) stringOutput += tagDevice.getAddress() + "\n"; + } + } + return stringOutput; + } + + int sequenceNumber; + public JSONObject createJSON(ArrayList tagsList0, ReaderDevice tagDevice0) { + JSONObject object = new JSONObject(); + try { + object.put("sequenceNumber", sequenceNumber++); + + if (tagsList0 != null || tagDevice0 != null) { + JSONArray jsonArray = new JSONArray(); + int i = 1; if (tagsList0 != null) i = tagsList0.size(); + object.put("numberOfTags", i); + while (--i >= 0) { + ReaderDevice tagDevice; + if (tagsList0 != null) tagDevice = tagsList0.get(i); + else tagDevice = tagDevice0; + + String accessPassword = null, killPassword = null, pcData = null, epcData = null, resBankData = null, epcBankData = null, tidBankData = null, userBankData = null; + String timeOfRead = null, timeZone = null, location = null, compass = null; + int phase = -1, channel = -1; + if (tagDevice != null) { + pcData = tagDevice.getPc(); + epcData = tagDevice.getAddress(); + resBankData = tagDevice.getRes(); + epcBankData = tagDevice.getEpc(); + tidBankData = tagDevice.getTid(); + userBankData = tagDevice.getUser(); + timeOfRead = tagDevice.getTimeOfRead(); + timeZone = tagDevice.getTimeZone(); + location = tagDevice.getLocation(); + compass = tagDevice.getCompass(); + phase = tagDevice.getPhase(); + channel = tagDevice.getChannel(); + } + + JSONObject objectTag = new JSONObject(); + + objectTag.put("accessPassword", accessPassword); + objectTag.put("killPassword", killPassword); + + objectTag.put("pc", pcData); + objectTag.put("epc", epcData); + + objectTag.put("resBank", resBankData); + objectTag.put("epcBank", epcBankData); + objectTag.put("tidBank", tidBankData); + objectTag.put("userBank", userBankData); + if (phase != -1) objectTag.put("phase", phase); + if (channel != -1) objectTag.put("channel", channel); + + objectTag.put("timeOfRead", timeOfRead); + objectTag.put("timeZone", timeZone); + objectTag.put("locationOfRead", location); + objectTag.put("eCompass", compass); + + objectTag.put("antennaPort", "0"); + jsonArray.put(objectTag); + } + object.put("tags", jsonArray); + } + + object.put("userDescription","this is example tag data"); + + object.put("rfidReaderName", MainActivity.csLibrary4A.getBluetoothICFirmwareName()); + object.put("rfidReaderSerialNumber", MainActivity.csLibrary4A.getHostProcessorICSerialNumber()); + object.put("rfidReaderInternalSerialNumber", MainActivity.csLibrary4A.getRadioSerial()); + + object.put("smartPhoneName", Build.MODEL); + String strPhoneSerial = Build.SERIAL; + object.put("smartPhoneSerialNumber", strPhoneSerial); + object.put("smartPhoneBluetoothMACAddress", stringBluetoothMAC); + object.put("smartPhoneWiFiMACAddress", stringWifiMac); + + object.put("smartPhoneUUID", null); + object.put("pcName", null); + object.put("pcEthernetMACAddress", null); + object.put("pcWiFiMACAddress", null); + + object.put("operatorId","Generic Operator"); + object.put("operatorSiteId","Generic Site"); + } catch (Exception ex) { } + return object; + } + + public String createCSV(ArrayList tagsList0, ReaderDevice tagDevice0) { + String object = ""; + int csvColumnSelect = MainActivity.csLibrary4A.getCsvColumnSelectSetting(); + try { + if (tagsList0 != null || tagDevice0 != null) { + JSONArray jsonArray = new JSONArray(); + int i = 1; if (tagsList0 != null) i = tagsList0.size(); + if (true) { + String objectTag; + objectTag = "PC,"; + objectTag += "EPC,"; + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.RESERVE_BANK.ordinal())) != 0) objectTag += "Reserve Bank,"; + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.EPC_BANK.ordinal())) != 0) objectTag += "EPC Bank,"; + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.TID_BANK.ordinal())) != 0) objectTag += "TID Bank,"; + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.USER_BANK.ordinal())) != 0) objectTag += "User Bank,"; + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.PHASE.ordinal())) != 0) objectTag += "Phase,"; + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.CHANNEL.ordinal())) != 0) objectTag += "Channel,"; + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.TIME.ordinal())) != 0) objectTag += "Time Of Read,"; + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.TIMEZONE.ordinal())) != 0) objectTag += "Time Zone,"; + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.LOCATION.ordinal())) != 0) objectTag += "location Of Read Latitude, Location of Read Longitude, "; + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.DIRECTION.ordinal())) != 0) objectTag += "eCompass"; + objectTag += "\n"; + object += objectTag; + } + + while (--i >= 0) { + ReaderDevice tagDevice; + if (tagsList0 != null) tagDevice = tagsList0.get(i); + else tagDevice = tagDevice0; + + String accessPassword = null, killPassword = null, pcData = null, epcData = null, resBankData = null, epcBankData = null, tidBankData = null, userBankData = null; + String timeOfRead = null, timeZone = null, location = null, compass = null; + int phase = -1, channel = -1; + if (tagDevice != null) { + pcData = tagDevice.getPc(); + epcData = tagDevice.getAddress(); + resBankData = tagDevice.getRes(); + epcBankData = tagDevice.getEpc(); + tidBankData = tagDevice.getTid(); + userBankData = tagDevice.getUser(); + timeOfRead = tagDevice.getTimeOfRead(); MainActivity.csLibrary4A.appendToLog("timeOfRead = " + timeOfRead ); + if (false) { + int index = timeOfRead.indexOf("."); + if (index >= 0) { + String string1 = timeOfRead.substring(0, index); + timeOfRead = string1; + MainActivity.csLibrary4A.appendToLog("index = " + index + ", revised timeOfRead = " + timeOfRead ); + } + } + timeZone = tagDevice.getTimeZone(); + location = tagDevice.getLocation(); + compass = tagDevice.getCompass(); + phase = tagDevice.getPhase(); + channel = tagDevice.getChannel(); + } + + String objectTag; + objectTag = String.format("=\"%s\",", pcData); + objectTag += String.format("=\"%s\",", epcData); + + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.RESERVE_BANK.ordinal())) != 0) objectTag += String.format("=\"%s\",", resBankData); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.EPC_BANK.ordinal())) != 0) objectTag += String.format("=\"%s\",", epcBankData); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.TID_BANK.ordinal())) != 0) objectTag += String.format("=\"%s\",", tidBankData); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.USER_BANK.ordinal())) != 0) objectTag += String.format("=\"%s\",", userBankData); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.PHASE.ordinal())) != 0) objectTag += String.format("%d,", phase); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.CHANNEL.ordinal())) != 0) objectTag += String.format("%d,", channel); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.TIME.ordinal())) != 0) objectTag += String.format("=\"%s\",", timeOfRead); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.TIMEZONE.ordinal())) != 0) objectTag += String.format("%s,", timeZone); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.LOCATION.ordinal())) != 0) objectTag += String.format("%s,", location); + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.DIRECTION.ordinal())) != 0)objectTag += String.format("%s", compass); + objectTag += "\n"; + object += objectTag; + } + + if ((csvColumnSelect & (0x01 << RfidReaderChipData.CsvColumn.OTHERS.ordinal())) != 0) { + object += "\nUser Description,this is example tag data\n"; + + object += String.format("RFID Reader Name,=\"%s\"\n", MainActivity.csLibrary4A.getBluetoothICFirmwareName()); + object += String.format("RFID Reader Serial Number,=\"%s\"\n", MainActivity.csLibrary4A.getHostProcessorICSerialNumber()); + object += String.format("RFID Reader Radio Serial Number,=\"%s\"\n", MainActivity.csLibrary4A.getRadioSerial()); + if (true) { + object += String.format("RFID Reader Barcode Serial Number,=\"%s\"\n", MainActivity.csLibrary4A.getBarcodeSerial()); + object += String.format("RFID Reader Bluetooth MAC address,=\"%s\"\n", MainActivity.csLibrary4A.getBluetoothDeviceAddress()); + } + object += String.format("Smart Phone Name,=\"%s\"\n", Build.MODEL); + } + } + } catch (Exception ex) { } + return object; + } + + public String save2File(String messageStr, boolean requestPermission) { + String resultDisplay = ""; + if (MainActivity.csLibrary4A.getSaveFileEnable() == false) return "No saving file as it is disabled"; + boolean writeExtPermission = true; +/* + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (mContext.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + csLibrary4A.appendToLog("WRITE_EXTERNAL_STORAGE Permission is required !!!"); + writeExtPermission = false; + if (requestPermission) { + csLibrary4A.appendToLog("requestPermissions WRITE_EXTERNAL_STORAGE 1"); + MainActivity.permissionRequesting = true; requestPermissions((Activity) mContext, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); + if (false) Toast.makeText(mContext, R.string.toast_permission_not_granted, Toast.LENGTH_SHORT).show(); + return null; + } + } else csLibrary4A.appendToLog("WRITE_EXTERNAL_STORAGE Permission is GRANTED !!!"); + } +*/ + errorDisplay = null; + if (writeExtPermission == false) { + errorDisplay = "denied WRITE_EXTERNAL_STORAGE Permission !!!"; + } else if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) == false) errorDisplay = "Error in mouting external storage !!!"; + else { + String strDir = "csReaderJava"; + File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + Environment.DIRECTORY_DOWNLOADS + "/" + strDir); + if (path.exists() == false) path.mkdirs(); + if (path.exists() == false) errorDisplay = "Error in making directory !!!"; + else { + String dateTime = new SimpleDateFormat("yyMMdd_HHmmss").format(new Date()); + String fileName = strDir + "_" + dateTime + (csLibrary4A.getSavingFormatSetting() == 0 ? ".txt" : ".csv"); + File file = new File(path, fileName); + if (file == null) errorDisplay = "Error in making directory !!!"; + else { + try { + errorDisplay = "Error in FileOutputStream()"; + FileOutputStream outputStream = new FileOutputStream(file); + errorDisplay = "Error in write()"; + outputStream.write(messageStr.getBytes()); + errorDisplay = "Error in close()"; outputStream.close(); + MediaScannerConnection.scanFile(mContext, new String[]{file.getAbsolutePath()}, null, null); + resultDisplay = "Success in saving data to Download/" + strDir + "/" + fileName; + errorDisplay = null; + } catch (Exception ex) { + errorDisplay += ex.getMessage(); + } + } + } + } + if (errorDisplay != null) return "Error in saving file with " + errorDisplay; + return resultDisplay; + } + + public boolean openServer(boolean bImpinjServer) { + boolean bValue = true; + try { + if (false) { + url = "https://"; + url += "192.168.25.21:"; + url += "29090/WebServiceRESTs/1.0/req/"; + } else if (false) url = "http://ptsv2.com/t/10i1t-1519143332/post"; + else if (bImpinjServer) { + } //url = "https://h9tqczg9-7275.asse.devtunnels.ms/api/Auth/login"; //"https://142.251.220.110"; // + else url = csLibrary4A.getServerLocation(); + MainActivity.csLibrary4A.appendToLog("nnn 1: url is " + url); + + errorDisplay = "Error in SSLContext.getInstance()"; + SSLContext sc = SSLContext.getInstance("TLSv1.2"); + MainActivity.csLibrary4A.appendToLog("nnn 2: SSLContext sc is " + (sc == null ? "null" : "valid")); + errorDisplay = "Error in SSLContext.init()"; + sc.init(null, new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException { + throw new UnsupportedOperationException("TrustManager.checkClientTrusted: Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + } + }, new SecureRandom()); + MainActivity.csLibrary4A.appendToLog("nnn 3: SSLContext sc.init is Okay"); + if (true) { + errorDisplay = "Error in setDefaultSSLSocketFactory()"; + MainActivity.csLibrary4A.appendToLog("nnn 4: sc.getSocketFactory is " + (sc.getSocketFactory() == null ? "null" : "valid")); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + MainActivity.csLibrary4A.appendToLog("nnn 5: HttpsURLConnection.setDefaultSSLSocketFactory is Okay"); + errorDisplay = "Error in setDefaultHostnameVerifier()"; + HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) { + return true; + } + }); + MainActivity.csLibrary4A.appendToLog("nnn 6: HttpsURLConnection.setDefaultHostnameVerifier is Okay"); + } + HttpsURLConnection.setFollowRedirects(false); + MainActivity.csLibrary4A.appendToLog("nnn 7: HttpsURLConnection.setFollowRedirects is Okay"); + + errorDisplay = "Error in URL()"; + URL obj = new URL(url); + MainActivity.csLibrary4A.appendToLog("nnn 8: URL(obj) is " + (obj != null ? "valid" : "NULL") + " with url = " + url); + errorDisplay = "Error in openConnection()"; + boolean isHttps = false; + if (url.length() >= 6) { + if (url.substring(0, 6).matches("https:")) isHttps = true; + } + con = (HttpURLConnection) obj.openConnection(); + MainActivity.csLibrary4A.appendToLog("nnn 9: HttpURLConnection obj.openConnection is " + (con == null ? "null" : "valid")); + if (isHttps) { + con = (HttpsURLConnection) obj.openConnection(); + MainActivity.csLibrary4A.appendToLog("nnn 10: HttpsURLConnection obj.openConnection is " + (con == null ? "null" : "valid")); + } + errorDisplay = "Error in setConnectTimeout()"; + con.setConnectTimeout(MainActivity.csLibrary4A.getServerTimeout() * 1000); + MainActivity.csLibrary4A.appendToLog("nnn 11: con.setConnectTimeout is Okay"); + errorDisplay = "Error in setRequestMethod()"; + con.setRequestMethod("POST"); + MainActivity.csLibrary4A.appendToLog("nnn 12: con.setRequestMethod is Okay"); + //errorDisplay = "Error in setRequestProperty(User-Agent)"; con.setRequestProperty("User-Agent", "Mozilla/5.0"); + //errorDisplay = "Error in setRequestProperty(text/plain)"; con.setRequestProperty("text/plain", "text/plain"); + //errorDisplay = "Error in setRequestProperty(Accept-Language)"; con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); + MainActivity.csLibrary4A.appendToLog("nnn 13: authenticate in url position : " + url.indexOf("authenticate")); + if (url.indexOf("authenticate") >= 0) { + String string = strBearer; + MainActivity.csLibrary4A.appendToLog("nnn 14: Authorization value = " + string); + errorDisplay = "Error in setRequestProperty(Authorization)"; + con.setRequestProperty("Authorization", string); + MainActivity.csLibrary4A.appendToLog("nnn 15 : con.setRequestProperty is Okay"); + } + errorDisplay = "Error in setRequestProperty(Content)"; + con.setRequestProperty("Content-Type", "application/json); //; charset=utf8"); + MainActivity.csLibrary4A.appendToLog("nnn 16: con.setRequestProperty is Okay"); + errorDisplay = "Error in setDoOutput()"; + con.setDoOutput(true); + MainActivity.csLibrary4A.appendToLog("nnn 17: con.setDoOutput is Okay"); + errorDisplay = "Error in setDoInput()"; + con.setDoInput(true); + MainActivity.csLibrary4A.appendToLog("nnn 18: Finished openServer"); + } catch (Exception ex) { + MainActivity.csLibrary4A.appendToLog("openServer Exception: " + ex.getMessage()); + bValue = false; + } + return bValue; + } + + boolean serverWritten = false; + public void write2Server(String messageStr0) { + csLibrary4A.appendToLog("messageStr0 = " + messageStr0); + try { + //InputStream is = con.getInputStream(); DataInputStream ir = new DataInputStream(is); + errorDisplay = "Error in getOutputStream()"; OutputStream os = con.getOutputStream(); + errorDisplay = "Error in DataOutputStream()"; DataOutputStream wr = new DataOutputStream(os); + + errorDisplay = "Error in writeBytes()"; wr.writeBytes(messageStr0); + + errorDisplay = "Error in flush()"; wr.flush(); + errorDisplay = "Error in close(wr)"; wr.close(); + errorDisplay = "Error in close(os)"; os.close(); + serverWritten = true; + //csLibrary4A.appendToLog("inputStream = " + ir.readUTF()); + MainActivity.csLibrary4A.appendToLog("nnn 19: finished write2Server"); + } catch (Exception ex) { + MainActivity.csLibrary4A.appendToLog("nnn 20: errorDisplay = " + errorDisplay + ", exception = " + ex.getMessage()); + } + } + + public int responseCode; public String response = null; + public boolean closeServer() { + boolean bValue = true; + if (serverWritten) { + try { + errorDisplay = "Error in getResponseCode()"; + responseCode = con.getResponseCode(); + //MainActivity.csLibrary4A.appendToLog("errorDisplay = " + errorDisplay); + MainActivity.csLibrary4A.appendToLog("responseCode = " + responseCode); + if (responseCode != 200) + errorDisplay = "Error in response code = " + responseCode; + else { + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + //MainActivity.csLibrary4A.appendToLog("errorDisplay = " + errorDisplay); + String inputLine; + response = ""; + while ((inputLine = in.readLine()) != null) { + response += inputLine; + } + in.close(); + //MainActivity.csLibrary4A.appendToLog("errorDisplay = " + errorDisplay); + resultDisplay += "Success in sending data to server with response = " + response; + MainActivity.csLibrary4A.appendToLog("response = " + response); + errorDisplay = null; + } + } catch (Exception ex) { + bValue = false; + } + } + con.disconnect(); + return bValue; + } +} + + + +package com.csl.cs710ademoapp; + +import android.app.Activity; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TableRow; + +import static com.csl.cs710ademoapp.MainActivity.tagSelected; + +public class SelectTag { + public EditText editTextTagID, editTextSelectOffset, editTextAccessPassword, editTextAccessAntennaPower; + public Spinner spinnerSelectBank; + public TableRow tableRowSelectMemoryBank, tableRowSelectPassword; + + public SelectTag(Activity activity, int index) { + if (index == 2) tableRowSelectMemoryBank = (TableRow) activity.findViewById(R.id.selectMemoryBankRow2); + else if (index == 1) tableRowSelectMemoryBank = (TableRow) activity.findViewById(R.id.selectMemoryBankRow1); + else tableRowSelectMemoryBank = (TableRow) activity.findViewById(R.id.selectMemoryBankRow); + if (index == 2) tableRowSelectPassword = (TableRow) activity.findViewById(R.id.selectPasswordRow2); + else if (index == 1) tableRowSelectPassword = (TableRow) activity.findViewById(R.id.selectPasswordRow1); + else tableRowSelectPassword = (TableRow) activity.findViewById(R.id.selectPasswordRow); + + if (index == 2) editTextTagID = (EditText) activity.findViewById(R.id.selectTagID2); + else if (index == 1) editTextTagID = (EditText) activity.findViewById(R.id.selectTagID1); + else editTextTagID = (EditText) activity.findViewById(R.id.selectTagID); + if (index == 2) editTextSelectOffset = (EditText) activity.findViewById(R.id.selectMemoryOffset2); + else if (index == 1) editTextSelectOffset = (EditText) activity.findViewById(R.id.selectMemoryOffset1); + else editTextSelectOffset = (EditText) activity.findViewById(R.id.selectMemoryOffset); + //editTextRWSelectOffset.setVisibility(View.VISIBLE); + + if (index == 2) spinnerSelectBank = (Spinner) activity.findViewById(R.id.selectMemoryBank2); + else if (index == 1) spinnerSelectBank = (Spinner) activity.findViewById(R.id.selectMemoryBank1); + else spinnerSelectBank = (Spinner) activity.findViewById(R.id.selectMemoryBank); + ArrayAdapter targetAdapter = ArrayAdapter.createFromResource(activity, R.array.read_memoryBank_options, R.layout.custom_spinner_layout); + targetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerSelectBank.setAdapter(targetAdapter); + spinnerSelectBank.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + setBankSelected(position); + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + + if (index == 2) editTextAccessPassword = (EditText) activity.findViewById(R.id.selectPasswordValue2); + else if (index == 1) editTextAccessPassword = (EditText) activity.findViewById(R.id.selectPasswordValue1); + else editTextAccessPassword = (EditText) activity.findViewById(R.id.selectPasswordValue); + editTextAccessPassword.addTextChangedListener(new GenericTextWatcher(editTextAccessPassword, 8)); + editTextAccessPassword.setText("00000000"); + + if (index == 2) editTextAccessAntennaPower = (EditText) activity.findViewById(R.id.selectAntennaPower2); + else if (index == 1) editTextAccessAntennaPower = (EditText) activity.findViewById(R.id.selectAntennaPower1); + else editTextAccessAntennaPower = (EditText) activity.findViewById(R.id.selectAntennaPower); + editTextAccessAntennaPower.setText(String.valueOf(300)); + } + + public void updateBankSelected() { + setBankSelected(-1); + } + void setBankSelected(int position) { + if (position < 0 || position > 2) position = spinnerSelectBank.getSelectedItemPosition(); + switch (position) { + case 0: //if EPC + if (tagSelected != null) editTextTagID.setText(tagSelected.getAddress()); + editTextSelectOffset.setText("32"); + break; + case 1: + if (tagSelected != null) { if (tagSelected.getTid() != null) editTextTagID.setText(tagSelected.getTid()); } + editTextSelectOffset.setText("0"); + break; + case 2: + if (tagSelected != null) { if (tagSelected.getUser() != null) editTextTagID.setText(tagSelected.getUser()); } + editTextSelectOffset.setText("0"); + break; + default: + break; + } + } +} + + + +package com.csl.cs710ademoapp; + +import android.Manifest; +import android.content.Context; +import android.content.pm.PackageManager; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.os.Bundle; +import androidx.core.app.ActivityCompat; +import android.widget.Toast; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import static android.content.Context.LOCATION_SERVICE; +import static android.content.Context.SENSOR_SERVICE; + +public class SensorConnector { + final boolean DEBUG = false; + + public String getTimeStamp() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); + return sdf.format(new Date()); + } + + public LocationDevice mLocationDevice; + public SensorDevice mSensorDevice; + + private Sensor mAccelerometer; + private Sensor mMagnetometer; + + SensorConnector(Context context) { + mLocationDevice = new LocationDevice(context); + mSensorDevice = new SensorDevice(context); + } + + public class LocationDevice { + private Context mContext; + private LocationManager locationManager; + private Location location; + + public String getLocation() { + if (location != null) { + return Location.convert(location.getLatitude(), Location.FORMAT_DEGREES) + ", " + Location.convert(location.getLongitude(), Location.FORMAT_DEGREES); + } else { + return ""; + } + } + + private boolean onStatus = false; + + LocationDevice(Context context) { + mContext = context; + + PackageManager mPackageManager; + mPackageManager = (PackageManager) context.getPackageManager(); + if (!(mPackageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION))) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("there is NO Feature_Location"); + Toast.makeText(context.getApplicationContext(), "there is NO LOCATION_FEATURE in this phone !!! Please use another phone.", Toast.LENGTH_LONG).show(); + } else locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); + } + + public void turnOn(boolean onStatus) { + if (locationManager != null) { + if (true) MainActivity.csLibrary4A.appendToLog("permission.ACCESS_FINE_LOCATION = " + ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION)); + if (true) MainActivity.csLibrary4A.appendToLog("permission.ACCESS_COARSE_LOCATION = " + ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION)); + if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(mContext.getApplicationContext(), "LOCATION_FEATURE permission is NOT GRANTED in this phone !!! Please go to Phone Setup and enable Location Services and Relaunch.", Toast.LENGTH_SHORT).show(); + } else if (onStatus && this.onStatus == false) { + this.onStatus = onStatus; + if (true) MainActivity.csLibrary4A.appendToLog("LocationDevice.setRfidOn(): ON with LocationManager: ON"); + if (true) MainActivity.csLibrary4A.appendToLog("LocationManager.PASSIVE_PROVIDER = " + LocationManager.PASSIVE_PROVIDER); + location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); +// locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener); + if (true) locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, locationListener); //not working in iData2S phone + } else if (onStatus == false && this.onStatus) { + this.onStatus = onStatus; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("LocationDevice.setRfidOn(): OFF"); + locationManager.removeUpdates(locationListener); + } + } + } + + private LocationListener locationListener = new LocationListener() { + @Override + public void onLocationChanged(Location location) { + if (true) MainActivity.csLibrary4A.appendToLog("onLocationChanged(): " + location.getProvider()); + location = location; + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + } + + @Override + public void onProviderEnabled(String provider) { + } + + @Override + public void onProviderDisabled(String provider) { + } + }; + } + + public class SensorDevice { + private Context mContext; + private SensorManager mSensorManager; + private float[] mOrientation = new float[3]; + + public String getEcompass() { + String s0, s1, s2; + synchronized (mOrientation) { + float azimuthInRadians = mOrientation[0]; + if (azimuthInRadians == 0) return null; + float azimuthInDegress = (float) (Math.toDegrees(azimuthInRadians) + 360) % 360; + s0 = String.format("%.1f", azimuthInDegress); + } + return s0; // + ", " + s1 + ", " + s2; + } + + private boolean onStatus = false; + + SensorDevice(Context context) { + mContext = context; + + mSensorManager = (SensorManager) mContext.getSystemService(SENSOR_SERVICE); + List deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("SensorDevice(): List of sensors"); + for (int i = 0; i < deviceSensors.size(); i++) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog(deviceSensors.get(i).getType() + "," + deviceSensors.get(i).getName()); + } + } + + public void turnOn(boolean onStatus) { + if (onStatus && this.onStatus == false) { + Sensor mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); + Sensor mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); + if (mSensorManager.registerListener(sensorEventListener, mAccelerometer, SensorManager.SENSOR_DELAY_UI) == false) { + Toast.makeText(mContext.getApplicationContext(), "ACCELEROMETER is NOT supported in this phone !!! Please use another phone.", Toast.LENGTH_LONG).show(); + mAccelerometer = null; + } + if (mSensorManager.registerListener(sensorEventListener, mMagnetometer, SensorManager.SENSOR_DELAY_UI) == false) { + if (false) Toast.makeText(mContext.getApplicationContext(), "MAGNETOMETER is NOT supported in this phone !!! Please use another phone.", Toast.LENGTH_LONG).show(); + mMagnetometer = null; + } + if (mAccelerometer == null || mMagnetometer == null) { + mSensorManager.unregisterListener(sensorEventListener); + } else { + this.onStatus = onStatus; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("SensorDevice.setRfidOn(): ON"); + } + } else if (this.onStatus && onStatus == false) { + this.onStatus = onStatus; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("SensorDevice.setRfidOn(): OFF"); + mSensorManager.unregisterListener(sensorEventListener); + } + } + + private SensorEventListener sensorEventListener = new SensorEventListener() { + private float[] mLastAccelerometer = new float[3]; + private boolean mLastAccelerometerSet = false; + private float[] mLastMagnetometer = new float[3]; + private boolean mLastMagnetometerSet = false; + + private float[] mR = new float[9]; + + @Override + public void onSensorChanged(SensorEvent event) { + if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { + if (event.values.length == mLastAccelerometer.length) { + System.arraycopy(event.values, 0, mLastAccelerometer, 0, mLastAccelerometer.length); + mLastAccelerometerSet = true; +// appendToLog("onSensorChanged(): updated mAccelerometer"); + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("onSensorChanged(): mAccelerometer: " + event.values.length); + } + } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { + if (event.values.length == mLastMagnetometer.length) { + System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length); + mLastMagnetometerSet = true; +// appendToLog("onSensorChanged(): updated mMagnetometer"); + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("onSensorChanged(): mMagnetometer: " + event.values.length); + } + } else { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("onSensorChanged(): " + event.sensor.getType() + "," + event.sensor.getName()); + } + + if (mLastAccelerometerSet && mLastMagnetometerSet) { + SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer); + synchronized (mOrientation) { + SensorManager.getOrientation(mR, mOrientation); + } + mLastAccelerometerSet = false; + mLastMagnetometerSet = false; + if (DEBUG) MainActivity.csLibrary4A.appendToLog("onSensorChanged(): updated mOrientation with mOrientation=" + mOrientation[0]); + } + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + }; + } +} + + + +package com.csl.cs710ademoapp; + +import android.os.AsyncTask; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; + +public class SettingTask extends AsyncTask { + final boolean DEBUG = false; + private enum TaskCancelRReason { + SAME_SETTING, INVALD_REQUEST, TIMEOUT + } + private TaskCancelRReason taskCancelReason; + + Button button; + boolean sameSetting = false; + boolean invalidRequest = false; + + public SettingTask(Button button, boolean sameSetting, boolean invalidRequest) { + button.setVisibility(View.INVISIBLE); + this.button = button; + this.sameSetting = sameSetting; + this.invalidRequest = invalidRequest; + } + + @Override + protected void onPreExecute() { + if (sameSetting) { + taskCancelReason = TaskCancelRReason.SAME_SETTING; + cancel(true); + } else if (invalidRequest) { + taskCancelReason = TaskCancelRReason.INVALD_REQUEST; + cancel(true); + } + } + + @Override + protected String doInBackground(Void... a) { + long timeMillis = System.currentTimeMillis(); + int writeSize = MainActivity.csLibrary4A.mrfidToWriteSize(); + while (true) { + int writeSizeN = MainActivity.csLibrary4A.mrfidToWriteSize(); + if (writeSizeN == 0) break; + if (writeSizeN < writeSize) { + writeSize = writeSizeN; + timeMillis = System.currentTimeMillis(); + } else if (System.currentTimeMillis() - timeMillis > 5000) { + taskCancelReason = TaskCancelRReason.TIMEOUT; + cancel(true); + } + } + return "End of Asynctask()"; + } + + @Override + protected void onProgressUpdate(String... output) { } + + @Override + protected void onCancelled() { + super.onCancelled(); + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Setting0Fragment.SettingTask.onCancelled()"); + if (taskCancelReason != null) { + switch (taskCancelReason) { + case SAME_SETTING: + Toast.makeText(MainActivity.mContext, R.string.toast_same_setting, Toast.LENGTH_SHORT).show(); + break; + case INVALD_REQUEST: + Toast.makeText(MainActivity.mContext, R.string.toast_invalid_sendHostRequest, Toast.LENGTH_SHORT).show(); + break; + case TIMEOUT: + Toast.makeText(MainActivity.mContext, R.string.toast_abort_by_TIMEOUT, Toast.LENGTH_SHORT).show(); + break; + } + } + button.setVisibility(View.VISIBLE); + } + + @Override + protected void onPostExecute(String result) { + if (DEBUG) MainActivity.csLibrary4A.appendToLog("Setting0Fragment.SettingTask.onPostExecute(): " + result); + + Toast.makeText(MainActivity.mContext, R.string.toast_saved, Toast.LENGTH_SHORT).show(); + button.setVisibility(View.VISIBLE); + } +} + + + +package com.csl.cs710ademoapp; + +import android.content.Context; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; + +import com.csl.cslibrary4a.ReaderDevice; + +import java.util.ArrayList; + +public class SharedObjects { + public static class TagsIndex implements Comparable { + private String address; + private int position; + + @Keep + public TagsIndex(String address, int position) { + this.address = address; + this.position = position; + } + + @Keep public String getAddress() { + return address; + } + @Keep public int getPosition() { + return position; + } + + @Override + public int compareTo(@NonNull TagsIndex tagsIndex) { + return address.compareTo(tagsIndex.address); + } + } + + Context context; + + public ArrayList readersList = new ArrayList(); + public String connectedBleAddressOld = ""; + public boolean versionWarningShown = false; + public int batteryWarningShown = 0; + + public boolean runningInventoryRfidTask = false; + public ArrayList tagsList = new ArrayList<>(); + public ArrayList tagsIndexList = new ArrayList<>(); + public ArrayList serviceArrayList = new ArrayList(); + + public boolean runningInventoryBarcodeTask = false; + public ArrayList barsList = new ArrayList<>(); + + public CustomMediaPlayer playerO, playerN, playerL; + + public SharedObjects(Context context) { + this.context = context; + playerO = new CustomMediaPlayer(context, "beeplow.mp3"); + playerN = new CustomMediaPlayer(context, "beephigh.mp3"); + playerL = new CustomMediaPlayer(context, "beep3s1khz.wav"); + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +