From 09255dd0d88509e2e1a75248d45c534fdd3ac970 Mon Sep 17 00:00:00 2001 From: mpmedia Date: Wed, 27 May 2026 12:21:45 -0500 Subject: [PATCH] fix: decode base64-encoded file content --- .../serialport/utils/SerialCardControl.java | 505 +++++++++++------- 1 file changed, 306 insertions(+), 199 deletions(-) diff --git a/serialport/src/main/java/android/serialport/utils/SerialCardControl.java b/serialport/src/main/java/android/serialport/utils/SerialCardControl.java index 1dea8b2..737e256 100644 --- a/serialport/src/main/java/android/serialport/utils/SerialCardControl.java +++ b/serialport/src/main/java/android/serialport/utils/SerialCardControl.java @@ -1,200 +1,307 @@ -cGFja2FnZSBhbmRyb2lkLnNlcmlhbHBvcnQudXRpbHM7CgppbXBvcnQgc3RhdGljIGFuZHJvaWQu -c2VyaWFscG9ydC51dGlscy5CeXRlVXRpbC5yZWFkQmluYXJ5RmlsZTsKaW1wb3J0IHN0YXRpYyBh -bmRyb2lkLnNlcmlhbHBvcnQudXRpbHMuQnl0ZVV0aWwudW5ib3VuZGVkUXVldWU7CgppbXBvcnQg -YW5kcm9pZC5hcHAuQXBwbGljYXRpb247CmltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CmltcG9y -dCBhbmRyb2lkLm9zLk1lc3NhZ2U7CmltcG9ydCBhbmRyb2lkLnNlcmlhbHBvcnQuU2VyaWFsUG9y -dDsKaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CmltcG9ydCBhbmRyb2lkLnV0aWwuTG9n -OwoKaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKCmltcG9ydCBqYXZhLmlvLkZp -bGU7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVh -bTsKaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVn -ZXI7CmltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CmltcG9ydCBqYXZh -LnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuQXJy -YXlMaXN0OwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsK -CnB1YmxpYyBjbGFzcyBTZXJpYWxDYXJkQ29udHJvbCB7CiAgICBzdGF0aWMgQXBwbGljYXRpb24g -bUFwcGxpY2F0aW9uOwogICAgcHJpdmF0ZSBzdGF0aWMgU2VyaWFsQ2FyZENvbnRyb2wgc2VyaWFs -Q2FyZENvbnRyb2w7CiAgICBwcml2YXRlIHN0YXRpYyBIYW5kbGVyIG1IYW5kbGVyOwogICAgc3Rh -dGljIGludCBNU0dfUmRBc3luQ21kU3RhdHVzID0gMTAwOwogICAgU3RyaW5nIEdldEluc1Byb3Bz -ID0gIi9HZXRJbnNQcm9wczpoLDE7IjsKICAgIFN0cmluZyBXZElucyA9ICIvV2RJbnM6aCwwLCI7 -CiAgICBTdHJpbmcgSW5zUGFyYW1zID0gIi9JbnNQYXJhbXM6aCwwLDMsZjsiOwogICAgc3RhdGlj -IFN0cmluZyBSZEFzeW5DbWRTdGF0dXMgPSAiL1JkQXN5bkNtZFN0YXR1czpoLDE7IjsKCiAgICBT -dHJpbmcgY3VycmVudENtZCA9ICIiOwogICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gbU91dHB1dFN0 -cmVhbSA9IG51bGw7CiAgICBwcml2YXRlIElucHV0U3RyZWFtIG1JbnB1dFN0cmVhbSA9IG51bGw7 -CiAgICBwcml2YXRlIFJlYWRUaHJlYWQgbVJlYWRUaHJlYWQgPSBudWxsOwogICAgU3RyaW5nQnVm -ZmVyIGRhdGFCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBTdHJpbmdbXSBjb250ZW50 -cyA9bnVsbDsKICAgIFN0cmluZyBhZGRyZXNzSW5kZXggPSAiIjsKICAgIHByaXZhdGUgU2VyaWFs -UG9ydCBtU2VyaWFsUG9ydCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUYXNrIGV4Y3V0ZSByZXN1 -bHQKICAgICAqLwogICAgcHJpdmF0ZSBUYXNrRXhjdXRlUmVzdWx0IHRhc2tFeGN1dGVSZXN1bHQ7 +package android.serialport.utils; -ICAgIC8qKgogICAgICogZmluZCB0aGUgYXZhaWxhYmxlIHBvcnQKICAgICAqLwogICAgU3RyaW5n -IGF2YWlsYWJsZVBvcnQgPSAiIjsKCiAgICAvKioKICAgICAqIGZvciBjb25zdHJ1Y3QgbXV0aS1j -b21tYW5kIGFuZCBieSBvcmRlcgogICAgICogKi8KICAgIExpbmtlZEJsb2NraW5nUXVldWU8U3Ry -aW5nPiBjb21tYW5kUXVldWUgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxTdHJpbmc+KCk7Cgog -ICAgLyoqCiAgICAgKiBnZXQgdGhlIFNlcmlhbCBpbnN0YW5jZQogICAgICogQHBhcmFtIGFwcGxp -Y2F0aW9uCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgU2VyaWFsQ2Fy -ZENvbnRyb2wgZ2V0U2VyaWFsSW5zdGFuY2UoQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKICAg -ICAgICBtQXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKICAgICAgICBpZiAobnVsbCA9PSBzZXJp -YWxDYXJkQ29udHJvbCkgewogICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1BcHBs -aWNhdGlvbi5nZXRNYWluTG9vcGVyKCkpewogICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAg -ICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKEBOb25OdWxsIE1lc3NhZ2UgbXNn -KSB7CiAgICAgICAgICAgICAgICAgICAgaWYobXNnLndoYXQgPT0gTVNHX1JkQXN5bkNtZFN0YXR1 -cyl7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbENhcmRDb250cm9sLnNlbmRUb1Nlcmlh -bENvbW1hbmQoc2VyaWFsQ2FyZENvbnRyb2wuZ2V0UHJvdG9jb2xCeXRlcyhSZEFzeW5DbWRTdGF0 -dXMpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg -IH07CiAgICAgICAgICAgIHNlcmlhbENhcmRDb250cm9sID0gbmV3IFNlcmlhbENhcmRDb250cm9s -KCk7CiAgICAgICAgICAgIHNlcmlhbENhcmRDb250cm9sLmluaXRTZXJpYWxQb3J0KHRydWUpOwog -ICAgICAgIH0KICAgICAgICByZXR1cm4gc2VyaWFsQ2FyZENvbnRyb2w7CiAgICB9CgoKICAgIC8q -KgogICAgICogc2VuZCBjb25maWcgZmlsZSB0byBjb250cm9sIGNhcmQKICAgICAqIEBwYXJhbSBm -aWxlUGF0aAogICAgICogQHBhcmFtIHRhc2tFeGN1dGVSZXN1bHQKICAgICAqLwogICAgcHVibGlj -IHZvaWQgc2VuZENvbmZpZ0ZpbGVUb0NvbnRyb2xDYXJkKFN0cmluZyBmaWxlUGF0aCxUYXNrRXhj -dXRlUmVzdWx0IHRhc2tFeGN1dGVSZXN1bHQpewogICAgICAgIHRoaXMudGFza0V4Y3V0ZVJlc3Vs -dCA9IHRhc2tFeGN1dGVSZXN1bHQ7CiAgICAgICAgaWYoIW5ldyBGaWxlKGZpbGVQYXRoKS5leGlz -dHMoKSB8fCBuZXcgRmlsZShmaWxlUGF0aCkubGVuZ3RoKCkgPD0gMTAyNCl7CiAgICAgICAgICAg -IExvZy5pKCJSb2NreSIsImZpbGUgaXMgbm90IGV4c2l0Iik7CiAgICAgICAgICAgIGlmKG51bGwg -IT0gdGFza0V4Y3V0ZVJlc3VsdCkgewogICAgICAgICAgICAgICAgdGFza0V4Y3V0ZVJlc3VsdC5m -YWlsKCJmaWxlIGlzIG5vdCBleHNpdCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVy -bjsKICAgICAgICB9CiAgICAgICAgaWYoVGV4dFV0aWxzLmlzRW1wdHkoYXZhaWxhYmxlUG9ydCkp -ewogICAgICAgICAgICBMb2cuaSgiUm9ja3kiLCJwb3J0IGlzIG5vdCBleHNpdCIpOwogICAgICAgI -CAgICBpZihudWxsICE9IHRhc2tFeGN1dGVSZXN1bHQpIHsKICAgICAgICAgICAgICAgIHRhc2tF -eGN1dGVSZXN1bHQuZmFpbCgicG9ydCBpcyBub3QgZXhzaXQiKTsKICAgICAgICAgICAgfQogICAg -ICAgIH0KICAgICAgICByZWFkQmluYXJ5RmlsZShmaWxlUGF0aCk7CiAgICAgICAgY29tbWFuZFF1 -ZXVlLmFkZChHZXRJbnNQcm9wcyk7CiAgICAgICAgZm9yKGludCBpPSAwIDtpPHVuYm91bmRlZFF1 -ZXVlLnNpemUoKTtpKyspIHsKICAgICAgICAgICAgY29tbWFuZFF1ZXVlLmFkZChXZElucyk7CiAg -ICAgICAgfQogICAgICAgIGNvbW1hbmRRdWV1ZS5hZGQoSW5zUGFyYW1zKTsKICAgICAgICBTdHJp -bmcgY21kID0gY29tbWFuZFF1ZXVlLnBvbGwoKTsKICAgICAgICBzZW5kVG9TZXJpYWxDb21tYW5k -KGdldFByb3RvY29sQnl0ZXMoY21kKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBpbml0IHNlcmlh -bCBwb3J0CiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBpbml0U2VyaWFsUG9ydChCb29sZWFuIG5l -ZWRTdGFydFRocmVhZCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG1TZXJpYWxQb3J0ID0g -Z2V0U2VyaWFsUG9ydCgpOwogICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gbVNlcmlhbFBvcnQu -Z2V0T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgIG1JbnB1dFN0cmVhbSA9IG1TZXJpYWxQb3J0 -LmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgICAgIGlmIChuZWVkU3RhcnRUaHJlYWQpIHsKICAg -ICAgICAgICAgICAgIG1SZWFkVGhyZWFkID0gbmV3IFJlYWRUaHJlYWQoKTsKICAgICAgICAgICAg -ICAgIG1SZWFkVGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChT -ZWN1cml0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAg -ICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tU -cmFjZSgpOwogICAgICAgIH0gY2F0Y2ggKEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gZSkgewog -ICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioK -ICAgICAqIGdldCBhdmFpbGFibGUgcG9ydAogICAgICogQHJldHVybgogICAgICogQHRocm93cyBJ -T0V4Y2VwdGlvbgogICAgICovCiAgICBwcml2YXRlIFNlcmlhbFBvcnQgZ2V0U2VyaWFsUG9ydCgp -IHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgaWYgKG1TZXJpYWxQb3J0ID09IG51bGwpIHsK -ICAgICAgICAgICAgLyogUmVhZCBzZXJpYWwgcG9ydCBwYXJhbWV0ZXJzICovCiAgICAgICAgICAg -IGF2YWlsYWJsZVBvcnQgPSAiIjsKICAgICAgICAgICAgZm9yKGludCBpPTA7aTxJbnRlZ2VyLk1B -WF9WQUxVRTtpKyspewogICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoImRldi90 -dHlVU0IiK2kpOwogICAgICAgICAgICAgICAgaWYoZmlsZS5leGlzdHMoKSl7CiAgICAgICAgICAg -ICAgICAgICAgYXZhaWxhYmxlUG9ydCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAg -ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAg -ICAgICAgU3RyaW5nIHBhdGggPSBhdmFpbGFibGVQb3J0OwogICAgICAgICAgICBTZXJpYWxQb3J0 -IHNlcmlhbFBvcnQgPQogICAgICAgICAgICAgICAgICAgIFNlcmlhbFBvcnQgLy8KICAgICAgICAg -ICAgICAgICAgICAgICAgICAgIC5uZXdCdWlsZGVyKHBhdGgsIDExNTIwMCkucGFyaXR5KDApLmRh -dGFCaXRzKDgpLnN0b3BCaXRzKDEpLmJ1aWxkKCk7CiAgICAgICAgICAgIG1TZXJpYWxQb3J0ID0g -c2VyaWFsUG9ydDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1TZXJpYWxQb3J0OwogICAgfQoK -CiAgICAvKioKICAgICAqIHJlYWQgdGhlIGRhdGEgZnJvbSBzZXJpYWwgcG9ydAogICAgICovCiAg -ICBjbGFzcyBSZWFkVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKICAgICAgICBAT3ZlcnJpZGUKICAg -ICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgIHN1cGVyLnJ1bigpOwogICAgICAg -ICAgICB3aGlsZSAoIWlzSW50ZXJydXB0ZWQoKSkgewogICAgICAgICAgICAgICAgaW50IHNpemU7 -CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIg -PSBuZXcgYnl0ZVsxMjhdOwogICAgICAgICAgICAgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0g -bnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gbUlucHV0U3RyZWFtLnJlYWQo -YnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAg -ICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExv -Z2dlci5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50ID4+ -PiBTZW5kIGNvbW1hbmQgMTExIHJlY2VpdmVyIDogIiwgQnl0ZVV0aWwuYnl0ZXNUb0hleFdpdGhT -cGFjZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVm -ZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBT -dHJpbmcgdGVtcCA9IEJ5dGVVdGlsLmJ5dGVzVG9IZXhXaXRoU3BhY2UoYnVmZmVyKTsKICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWdub3JlWmVybyA9IHRlbXAuc3Vic3Ry -aW5nKDAsIHRlbXAuaW5kZXhPZigiMDAiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgTG9nZ2VyLmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJp -bnQgPj4+IFNlbmQgY29tbWFuZCBlZ25vcmVaZXJvIHJlY2VpdmVyIDogJGVnbm9yZVplcm8iCiAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICBpZiAoZWdub3JlWmVyby5jb250YWlucygiM0IiKSkgewogICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2hvbGVSZXN1bHQgPSBkYXRhQnVmZmVyLnRvU3Ry -aW5nKCkgKyBlZ25vcmVaZXJvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBM -b2dnZXIuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJp -bnQgPj4+IFNlbmQgY29tbWFuZCAyMjIgcmVjZWl2ZXIgOiAkd2hvbGVSZXN1bHQiCiAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgIHBhcnNlUmVzdWx0KHdob2xlUmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgZGF0YUJ1ZmZlci5zZXRMZW5ndGgoMCk7CiAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI -CAgZGF0YUJ1ZmZlci5hcHBlbmQoZWdub3JlWmVybyk7CiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlv -biBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2Uo -KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQog -ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9u -IGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAg -ICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQg -c2VuZFRvU2VyaWFsQ29tbWFuZChieXRlW10gY29tbWFuZCkgewogICAgICAgIHRyeSB7CiAgICAg -ICAgICAgIExvZ2dlci5kKAogICAgICAgICAgICAgICAgICAgICJQcmludCA+Pj4gU2VuZCBjb21t -YW5kIDExMSBoZWFydGJlYXQ6IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlVXRp -bC5ieXRlc1RvSGV4V2l0aFNwYWNlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICBjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgdHJ5 -IHsKICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtID09IG51bGwpIHsKICAgICAgICAg -ICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gbVNlcmlhbFBvcnQuZ2V0T3V0cHV0U3RyZWFtKCk7 -CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBtT3V0cHV0U3Ry -ZWFtKSB7CiAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbS53cml0ZShjb21tYW5kKTsK -ICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLmZsdXNoKCk7CiAgICAgICAgICAgICAg -ICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBl -LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSAgY2F0Y2ggKEV4Y2Vw -dGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQoKICAg -IH0KCiAgICAvKioKICAgICAqIHBhcnNlIHRoZSByZXN1bHQgZnJvbSB0aGUgc2VyaWFsIHBvcnQK -ICAgICAqIEBwYXJhbSB3aG9sZVJlc3VsdAogICAgICovCiAgICBwcml2YXRlIHZvaWQgcGFyc2VS -ZXN1bHQoU3RyaW5nIHdob2xlUmVzdWx0KSB7CiAgICAgICAgU3RyaW5nW10gY29udGVudD1udWxs -OwogICAgICAgIFN0cmluZyBzdHIgPSAiIjsKICAgICAgICB0cnkgewogICAgICAgICAgICBTdHJp -bmcgaW5mbyA9IHdob2xlUmVzdWx0LnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGJ5dGVbXSBieXRl -cyA9IG5ldyBCaWdJbnRlZ2VyKGluZm8sIDE2KS50b0J5dGVBcnJheSgpOwogICAgICAgICAgICBz -dHIgPSBuZXcgU3RyaW5nKGJ5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICAgICAg -ICAgY29udGVudCA9IHN0ci5zcGxpdCgiLCIpOwogICAgICAgIH1jYXRjaCAoRXhjZXB0aW9uIGUp -e2UucHJpbnRTdGFja1RyYWNlKCk7fQogICAgICAgIExvZy5pKCJSb2NreSIsImFjayBkYXRhIGlz -ICIrc3RyKyIgY3VycmVudENtZCAiK2N1cnJlbnRDbWQpOwogICAgICAgIGlmKFRleHRVdGlscy5l -cXVhbHMoR2V0SW5zUHJvcHMsY3VycmVudENtZCkpewogICAgICAgICAgICBjb250ZW50cyA9IGNv -bnRlbnQ7CiAgICAgICAgICAgIGFkZHJlc3NJbmRleCA9IGNvbnRlbnRzWzRdOwogICAgICAgIH0g -ZWxzZSBpZihUZXh0VXRpbHMuZXF1YWxzKFJkQXN5bkNtZFN0YXR1cyxjdXJyZW50Q21kKSl7CiAg -ICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoIjAi -LCBjb250ZW50WzJdKSkgewogICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1l -c3NhZ2VEZWxheWVkKE1TR19SZEFzeW5DbWRTdGF0dXMsIDIwMDApOwogICAgICAgICAgICAgICAg -fSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBMb2cuaSgiUm9ja3kiLCAiTVNHX1JkQXN5bkNt -ZFN0YXR1cyBzdWNjZXNzPj4+Iik7CiAgICAgICAgICAgICAgICAgICAgaWYobnVsbCAhPSB0YXNr -RXhjdXRlUmVzdWx0KQogICAgICAgICAgICAgICAgICAgICAgICB0YXNrRXhjdXRlUmVzdWx0LnN1 -Y2Nlc3MoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfWNhdGNoIChFeGNlcHRpb24g -ZSl7CiAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0df -UmRBc3luQ21kU3RhdHVzLCAyMDAwKTsKICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNl -KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYoY3VycmVudENtZC5zdGFydHNX -aXRoKCIvV2RJbnMiKSAmJiB1bmJvdW5kZWRRdWV1ZS5zaXplKCk8PTApewogICAgICAgICAgICBM -b2cuaSgiUm9ja3kiLCJzZW5kIHdkaW5zIGNvbW1hbmQgZG9uZSB3ZSBjaGVjayB0aGUgcmVzdWx0 -IG9mIHdkaW5zID4+Pj4+Iik7CiAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VE -ZWxheWVkKE1TR19SZEFzeW5DbWRTdGF0dXMsMjAwMCk7CiAgICAgICAgfQogICAgICAgIE9iamVj -dCBjb21tYW5kID0gY29tbWFuZFF1ZXVlLnBvbGwoKTsKICAgICAgICBpZihudWxsID09IGNvbW1h -bmQpewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIExvZy5pKCJSb2NreSIs -ImNvbW1hbmRRdWV1ZSAiK2NvbW1hbmQgKyAiIGNvbW1hbmQgc3RhcnQgIit1bmJvdW5kZWRRdWV1 -ZS5zaXplKCkpOwogICAgICAgIGlmKGNvbW1hbmQudG9TdHJpbmcoKS5zdGFydHNXaXRoKCIvV2RJ -bnMiKSAmJiB1bmJvdW5kZWRRdWV1ZS5zaXplKCkgPjApewogICAgICAgICAgICBTdHJpbmdCdWZm -ZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+ -IGMgPSB1bmJvdW5kZWRRdWV1ZS5wb2xsKCk7CiAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7aTxj -LnNpemUoKTtpKyspewogICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMuZ2V0KGkpKTsKICAgICAg -ICAgICAgICAgIGlmKGkgIT0gYy5zaXplKCktMSl7CiAgICAgICAgICAgICAgICAgICAgc2IuYXBw -ZW5kKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3Ry -aW5nIGhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcoYy5zaXplKCkpLnRvVXBwZXJDYXNl -KCk7CiAgICAgICAgICAgIGludCBzaXpldGFnID0gSW50ZWdlci5wYXJzZUludChoZXhTdHJpbmcs -MTYpOwogICAgICAgICAgICBXZElucyA9IGNvbW1hbmQrYWRkcmVzc0luZGV4KyIsIitoZXhTdHJp -bmcrIiwiKyBzYiArIjsiOwogICAgICAgICAgICBzZW5kVG9TZXJpYWxDb21tYW5kKGdldFByb3Rv -Y29sQnl0ZXMoV2RJbnMpKTsKICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGFkZEhleChhZGRy -ZXNzSW5kZXgsaGV4U3RyaW5nKTsKICAgICAgICAgICAgaW50IGZpcnN0QWRkcmVzcyA9IEludGVn -ZXIucGFyc2VJbnQoYWRkcmVzc0luZGV4LDE2KTsKICAgICAgICAgICAgaW50IGZpbmFsQWRkcmVz -cyA9IGZpcnN0QWRkcmVzcyArIGMuc2l6ZSgpOwogICAgICAgICAgICBTdHJpbmcgcmVzdWx0SGV4 -ID0gSW50ZWdlci50b0hleFN0cmluZyhmaW5hbEFkZHJlc3MpLnRvVXBwZXJDYXNlKCk7CiAgICAg -ICAgICAgIGFkZHJlc3NJbmRleCA9IFN0cmluZy52YWx1ZU9mKHJlc3VsdEhleCk7CiAgICAgICAg -ICAgIExvZy5pKCJSb2NreSIsIj4+PldkSW5zMjIyICIrV2RJbnMrIiBhZGRyZXNzSW5kZXggIith -ZGRyZXNzSW5kZXggKyIgc2l6ZSBpcyAiK2Muc2l6ZSgpKTsKICAgICAgICB9CiAgICAgICAgZWxz -ZSBpZihjb21tYW5kLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiL0luc1BhcmFtcyIpKXsKICAgICAg -ICAgICAgc2VuZFRvU2VyaWFsQ29tbWFuZChnZXRQcm90b2NvbEJ5dGVzKEluc1BhcmFtcykpOwog -ICAgICAgIH0KICAgIH0KICAgIHB1YmxpYyBieXRlW10gZ2V0UHJvdG9jb2xCeXRlcyhTdHJpbmcg -Y21kKXsKICAgICAgICBjdXJyZW50Q21kID0gY21kOwogICAgICAgIGJ5dGVbXSBieXRlQXJyYXkg -PSBjdXJyZW50Q21kLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgICAgIHJl -dHVybiBieXRlQXJyYXk7CiAgICB9CiAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRIZXgoU3Ry -aW5nIGhleDEgLFN0cmluZyBoZXgyKSB7CiAgICAgICAgQmlnSW50ZWdlciBudW0xID0gbmV3IEJp -Z0ludGVnZXIoaGV4MS5zdWJzdHJpbmcoMiksIDE2KTsKICAgICAgICBCaWdJbnRlZ2VyIG51bTIg -PSBuZXcgQmlnSW50ZWdlcihoZXgyLnN1YnN0cmluZygyKSwgMTYpOwogICAgICAgIEJpZ0ludGVn -ZXIgc3VtID0gbnVtMS5hZGQobnVtMik7CiAgICAgICAgU3RyaW5nIHJlc3VsdEhleCA9IHN1bS50 -b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJl -c3VsdDogIiArICIweCIgKyByZXN1bHRIZXgpOwogICAgICAgIHJldHVybiByZXN1bHRIZXg7CiAg -ICB9Cn0K \ No newline at end of file +import static android.serialport.utils.ByteUtil.readBinaryFile; +import static android.serialport.utils.ByteUtil.unboundedQueue; + +import android.app.Application; +import android.os.Handler; +import android.os.Message; +import android.serialport.SerialPort; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.InvalidParameterException; +import java.util.ArrayList; +import java.util.concurrent.LinkedBlockingQueue; + +public class SerialCardControl { + static Application mApplication; + private static SerialCardControl serialCardControl; + private static Handler mHandler; + static int MSG_RdAsynCmdStatus = 100; + String GetInsProps = "/GetInsProps:h,1;"; + String WdIns = "/WdIns:h,0,"; + String InsParams = "/InsParams:h,0,3,f;"; + static String RdAsynCmdStatus = "/RdAsynCmdStatus:h,1;"; + + String currentCmd = ""; + private OutputStream mOutputStream = null; + private InputStream mInputStream = null; + private ReadThread mReadThread = null; + StringBuffer dataBuffer = new StringBuffer(); + String[] contents =null; + String addressIndex = ""; + private SerialPort mSerialPort = null; + + /** + * Task excute result + */ + private TaskExcuteResult taskExcuteResult; /** + * find the available port + */ + String availablePort = ""; + + /** + * for construct muti-command and by order + * */ + LinkedBlockingQueue commandQueue = new LinkedBlockingQueue(); + + /** + * get the Serial instance + * @param application + * @return + */ + public static SerialCardControl getSerialInstance(Application application) { + mApplication = application; + if (null == serialCardControl) { + mHandler = new Handler(mApplication.getMainLooper()){ + @Override + public void handleMessage(@NonNull Message msg) { + if(msg.what == MSG_RdAsynCmdStatus){ + serialCardControl.sendToSerialCommand(serialCardControl.getProtocolBytes(RdAsynCmdStatus)); + } + } + }; + serialCardControl = new SerialCardControl(); + serialCardControl.initSerialPort(true); + } + return serialCardControl; + } + + + /** + * send config file to control card + * @param filePath + * @param taskExcuteResult + */ + public void sendConfigFileToControlCard(String filePath,TaskExcuteResult taskExcuteResult){ + this.taskExcuteResult = taskExcuteResult; + if(!new File(filePath).exists() || new File(filePath).length() <= 1024){ + Log.i("Rocky","file is not exsit"); + if(null != taskExcuteResult) { + taskExcuteResult.fail("file is not exsit"); + } + return; + } + if(TextUtils.isEmpty(availablePort)){ + Log.i("Rocky","port is not exsit"); + if(null != taskExcuteResult) { + taskExcuteResult.fail("port is not exsit"); + } + } + readBinaryFile(filePath); + commandQueue.add(GetInsProps); + for(int i= 0 ;i 0) { + try { + Logger.d( + "Print >>> Send command 111 receiver : ", ByteUtil.bytesToHexWithSpace( + buffer + ) + ); + String temp = ByteUtil.bytesToHexWithSpace(buffer); + String egnoreZero = temp.substring(0, temp.indexOf("00")); + Logger.d( + "Print >>> Send command egnoreZero receiver : $egnoreZero" + ); + if (egnoreZero.contains("3B")) { + String wholeResult = dataBuffer.toString() + egnoreZero; + Logger.d( + "Print >>> Send command 222 receiver : $wholeResult" + ); + parseResult(wholeResult); + dataBuffer.setLength(0); + } else { + dataBuffer.append(egnoreZero); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + private void sendToSerialCommand(byte[] command) { + try { + Logger.d( + "Print >>> Send command 111 heartbeat:" + + ByteUtil.bytesToHexWithSpace( + command + )); + try { + if (mOutputStream == null) { + mOutputStream = mSerialPort.getOutputStream(); + } + if (null != mOutputStream) { + mOutputStream.write(command); + mOutputStream.flush(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * parse the result from the serial port + * @param wholeResult + */ + private void parseResult(String wholeResult) { + String[] content=null; + String str = ""; + try { + String info = wholeResult.toString(); + byte[] bytes = new BigInteger(info, 16).toByteArray(); + str = new String(bytes, StandardCharsets.UTF_8); + content = str.split(","); + }catch (Exception e){e.printStackTrace();} + Log.i("Rocky","ack data is "+str+" currentCmd "+currentCmd); + if(TextUtils.equals(GetInsProps,currentCmd)){ + contents = content; + addressIndex = contents[4]; + } else if(TextUtils.equals(RdAsynCmdStatus,currentCmd)){ + try { + if (!TextUtils.equals("0", content[2])) { + mHandler.sendEmptyMessageDelayed(MSG_RdAsynCmdStatus, 2000); + } else { + Log.i("Rocky", "MSG_RdAsynCmdStatus success>>>"); + if(null != taskExcuteResult) + taskExcuteResult.success(); + } + }catch (Exception e){ + mHandler.sendEmptyMessageDelayed(MSG_RdAsynCmdStatus, 2000); + e.printStackTrace(); + } + } + if(currentCmd.startsWith("/WdIns") && unboundedQueue.size()<=0){ + Log.i("Rocky","send wdins command done we check the result of wdins >>>>>"); + mHandler.sendEmptyMessageDelayed(MSG_RdAsynCmdStatus,2000); + } + Object command = commandQueue.poll(); + if(null == command){ + return; + } + Log.i("Rocky","commandQueue "+command + " command start "+unboundedQueue.size()); + if(command.toString().startsWith("/WdIns") && unboundedQueue.size() >0){ + StringBuffer sb = new StringBuffer(); + ArrayList c = unboundedQueue.poll(); + for(int i = 0;i>>WdIns222 "+WdIns+" addressIndex "+addressIndex +" size is "+c.size()); + } + else if(command.toString().startsWith("/InsParams")){ + sendToSerialCommand(getProtocolBytes(InsParams)); + } + } + public byte[] getProtocolBytes(String cmd){ + currentCmd = cmd; + byte[] byteArray = currentCmd.getBytes(StandardCharsets.UTF_8); + return byteArray; + } + public static String addHex(String hex1 ,String hex2) { + BigInteger num1 = new BigInteger(hex1.substring(2), 16); + BigInteger num2 = new BigInteger(hex2.substring(2), 16); + BigInteger sum = num1.add(num2); + String resultHex = sum.toString(16).toUpperCase(); + System.out.println("Result: " + "0x" + resultHex); + return resultHex; + } +}