{"version":3,"sources":["jsdelivr-header.js","/npm/@chirimen/rc522_ws1850s@1.0.1/index.js"],"names":[],"mappings":"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","file":"/npm/@chirimen/rc522_ws1850s@1.0.1/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@chirimen/rc522_ws1850s@1.0.1/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.VEML6070 = factory());\n})(this, (function () { 'use strict';\n\n\t// @ts-check\n\t// RC522_WS1850S.js\n\t//\n\t// MFRC522/WS1850S RFIDカードリーダーライブラリ for CHIRIMEN WebI2C\n\t// m5 RFID2が使えます\n\t//。\n\t// by Satoru Takagi\n\t// 2025/08/25\n\t//\n\t//\n\t// https://docs.m5stack.com/en/unit/rfid2\n\t// によると、\n\t// > IC (RC522->WS1850S) のみが置き換えられており、機能上の違いはありません\n\t// とのことだが、ドライバレベル互換なのかというと、この製品のドライバのリンクがRC522を指している\n\t// こと、I2Cアドレスが0x28であることから、差異はあるかもしてないが、ドライバレベル互換のICと想定\n\t//\n\t// https://github.com/arozcan/MFRC522-I2C-Library\n\t// の一部をJavaScriptに移植したものです\n\t//\n\t// History:\n\t// 2025/08/25 : カードの検出と、UIDの読み取りのみ動作しています。\n\t// 2025/08/28 : バグだらけだった上のものをだいぶちゃんとに動かせるようにした（実質これが最初の版）\n\t//\n\t//\n\t// ToDo: 認証＆書き込み\n\n\tclass RC522 {\n\t\tconstructor(i2cPort, slaveAddress) {\n\t\t\tif (!slaveAddress) {\n\t\t\t\tslaveAddress = 0x28; // デフォルトのI2Cアドレス\n\t\t\t}\n\n\t\t\tthis.i2cPort = i2cPort;\n\t\t\tthis.slaveAddress = slaveAddress;\n\t\t\tthis.i2cSlave = null;\n\n\t\t\t// ATQAとSAKを格納するためのプロパティ\n\t\t\tthis.atqa = null;\n\t\t\tthis.sak = null;\n\n\t\t\t// レジスタアドレス\n\t\t\tthis.CommandReg = 0x01;\n\t\t\tthis.ComIrqReg = 0x04;\n\t\t\tthis.ErrorReg = 0x06;\n\t\t\tthis.FIFODataReg = 0x09;\n\t\t\tthis.FIFOLevelReg = 0x0a;\n\t\t\tthis.ControlReg = 0x0c;\n\t\t\tthis.BitFramingReg = 0x0d;\n\t\t\tthis.CollReg = 0x0e;\n\t\t\tthis.ModeReg = 0x11;\n\t\t\tthis.TxModeReg = 0x12;\n\t\t\tthis.RxModeReg = 0x13;\n\t\t\tthis.TxControlReg = 0x14;\n\t\t\tthis.TxASKReg = 0x15;\n\t\t\tthis.RFCfgReg = 0x26;\n\t\t\tthis.GsNReg = 0x27;\n\t\t\tthis.CWGsPReg = 0x28;\n\t\t\tthis.ModGsPReg = 0x29;\n\t\t\tthis.TModeReg = 0x2a;\n\t\t\tthis.TPrescalerReg = 0x2b;\n\t\t\tthis.TReloadRegH = 0x2c;\n\t\t\tthis.TReloadRegL = 0x2d;\n\t\t\tthis.DivIrqReg = 0x05;\n\t\t\tthis.CRCResultRegL = 0x22;\n\t\t\tthis.CRCResultRegH = 0x21;\n\n\t\t\t// MFRC522コマンド\n\t\t\tthis.PCD_Idle = 0x00;\n\t\t\tthis.PCD_Transceive = 0x0c;\n\t\t\tthis.PCD_SoftReset = 0x0f;\n\t\t\tthis.PCD_CalcCRC = 0x03;\n\n\t\t\t// MIFARE PICCコマンド\n\t\t\tthis.PICC_CMD_REQA = 0x26;\n\t\t\tthis.PICC_CMD_WUPA = 0x52;\n\t\t\tthis.PICC_CMD_CT = 0x88;\n\t\t\tthis.PICC_CMD_SEL_CL1 = 0x93; // Cascade Level 1\n\t\t\tthis.PICC_CMD_SEL_CL2 = 0x95; // Cascade Level 2\n\t\t\tthis.PICC_CMD_SEL_CL3 = 0x97; // Cascade Level 3\n\t\t\tthis.PICC_CMD_HLTA = 0x50; // Halt\n\n\t\t\t// ステータスコード\n\t\t\tthis.STATUS_OK = 1;\n\t\t\tthis.STATUS_ERROR = 2;\n\t\t\tthis.STATUS_COLLISION = 3;\n\t\t\tthis.STATUS_TIMEOUT = 4;\n\t\t\tthis.STATUS_NO_ROOM = 5;\n\t\t\tthis.STATUS_INTERNAL_ERROR = 6;\n\t\t\tthis.STATUS_INVALID = 7;\n\t\t\tthis.STATUS_CRC_WRONG = 8;\n\t\t}\n\n\t\t/**\n\t\t * MFRC522モジュールを初期化します。\n\t\t */\n\t\tasync init() {\n\t\t\tthis.i2cSlave = await this.i2cPort.open(this.slaveAddress);\n\t\t\tawait this.PCD_Reset();\n\n\t\t\tawait this.i2cSlave.write8(this.TModeReg, 0x8d);\n\t\t\tawait this.i2cSlave.write8(this.TPrescalerReg, 0x3e);\n\t\t\tawait this.i2cSlave.write8(this.TReloadRegH, 0x00);\n\t\t\tawait this.i2cSlave.write8(this.TReloadRegL, 0x4b);\n\n\t\t\tawait this.i2cSlave.write8(this.TxASKReg, 0x40);\n\t\t\tawait this.i2cSlave.write8(this.ModeReg, 0x3d);\n\n\t\t\tawait this.PCD_AntennaOn();\n\n\t\t\tconsole.log(\"MFRC522 initialized via WebI2C\");\n\t\t}\n\n\t\t/**\n\t\t * MFRC522をソフトリセットします。\n\t\t */\n\t\tasync PCD_Reset() {\n\t\t\tawait this.i2cSlave.write8(this.CommandReg, this.PCD_SoftReset);\n\t\t\tawait sleep(50);\n\t\t\twhile ((await this.i2cSlave.read8(this.CommandReg)) & (1 << 4)) {\n\t\t\t\tawait sleep(10);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * アンテナをオンにします。\n\t\t */\n\t\tasync PCD_AntennaOn() {\n\t\t\tconst value = await this.i2cSlave.read8(this.TxControlReg);\n\t\t\tif ((value & 0x03) !== 0x03) {\n\t\t\t\tawait this.i2cSlave.write8(this.TxControlReg, value | 0x03);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * カードをHALT（休止）状態にします。\n\t\t * @return {Promise<number>} ステータスコード\n\t\t */\n\t\tasync PICC_HaltA() {\n\t\t\tconst command = new Uint8Array([this.PICC_CMD_HLTA, 0x00]);\n\t\t\tconst crc = new Uint8Array(2);\n\n\t\t\t// CRCを計算\n\t\t\tconst { status: crcStatus } = await this.PCD_CalculateCRC(command, 2, crc);\n\t\t\tif (crcStatus !== this.STATUS_OK) {\n\t\t\t\treturn crcStatus;\n\t\t\t}\n\n\t\t\t// コマンドとCRCを結合\n\t\t\tconst sendData = new Uint8Array(4);\n\t\t\tsendData[0] = command[0];\n\t\t\tsendData[1] = command[1];\n\t\t\tsendData[2] = crc[0];\n\t\t\tsendData[3] = crc[1];\n\n\t\t\t// 送信\n\t\t\tconst { status } = await this.PCD_TransceiveData(\n\t\t\t\tsendData,\n\t\t\t\t4,\n\t\t\t\tnew Uint8Array(0),\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tfalse\n\t\t\t);\n\n\t\t\t// PICC_HaltAは、正常な場合でもタイムアウトを返すため、\n\t\t\t// タイムアウトを正常なレスポンスとして処理\n\t\t\tif (status === this.STATUS_TIMEOUT) {\n\t\t\t\treturn this.STATUS_OK;\n\t\t\t}\n\n\t\t\t// 意図せずレスポンスがあった場合はエラー\n\t\t\tif (status === this.STATUS_OK) {\n\t\t\t\treturn this.STATUS_ERROR;\n\t\t\t}\n\n\t\t\treturn status;\n\t\t}\n\n\t\t// --------------------- 通信プロトコル ---------------------\n\n\t\t/**\n\t\t * MFRC522とPICC（カード）間でデータを送受信します。\n\t\t * @param {Uint8Array} sendData 送信するデータ\n\t\t * @param {number} sendLen 送信データの長さ\n\t\t * @param {Uint8Array} backData 受信バッファ\n\t\t * @param {number} backLen 受信バッファの最大長\n\t\t * @param {number} sendValidBits 送信データの最後のバイトの有効ビット数\n\t\t * @param {number} rxAlign 受信データの最初のビットの位置\n\t\t * @param {boolean} checkCRC CRC検証を行うか\n\t\t * @return {Promise<object>} ステータス、有効ビット数、受信バイト数を含むオブジェクト\n\t\t */\n\t\tasync PCD_TransceiveData(\n\t\t\tsendData,\n\t\t\tsendLen,\n\t\t\tbackData,\n\t\t\tbackLen,\n\t\t\tsendValidBits,\n\t\t\trxAlign,\n\t\t\tcheckCRC\n\t\t) {\n\t\t\t//console.log(\"PCD_TransceiveData ===========================\");\n\t\t\tconst waitIRq = 0x30; // RxIrqとIdleIrq\n\t\t\tconst ans = await this.PCD_CommunicateWithPICC(\n\t\t\t\tthis.PCD_Transceive,\n\t\t\t\twaitIRq,\n\t\t\t\tsendData,\n\t\t\t\tsendLen,\n\t\t\t\tbackData,\n\t\t\t\tbackLen,\n\t\t\t\tsendValidBits,\n\t\t\t\trxAlign,\n\t\t\t\tcheckCRC\n\t\t\t);\n\t\t\t//console.log(\"PCD_TransceiveData(NEW) ans:\", ans, \" backData:\", backData);\n\t\t\treturn ans;\n\t\t}\n\n\t\tasync PCD_SetRegisterBitMask(reg, mask) {\n\t\t\tlet tmp = await this.i2cSlave.read8(reg);\n\t\t\tawait this.i2cSlave.write8(reg, tmp | mask); // set bit mask\n\t\t\t//\t\tconsole.log(\"PCD_SetRegisterBitMask:\",{tmp,mask},tmp | mask);\n\t\t}\n\n\t\tasync PCD_ReadRegister(reg, count, values, rxAlign) {\n\t\t\tlet address = reg;\n\t\t\tlet index = 0; // Index in values array.\n\t\t\tawait this.i2cSlave.writeByte(address);\n\t\t\tfor (let j = 0; j < count; j++) {\n\t\t\t\tif (index == 0 && rxAlign) {\n\t\t\t\t\t// Only update bit positions rxAlign..7 in values[0]\n\t\t\t\t\t// Create bit mask for bit positions rxAlign..7\n\t\t\t\t\tlet mask = 0;\n\t\t\t\t\tfor (let i = rxAlign; i <= 7; i++) {\n\t\t\t\t\t\tmask |= 1 << i;\n\t\t\t\t\t}\n\t\t\t\t\t// Read value and tell that we want to read the same address again.\n\t\t\t\t\tlet value = await this.i2cSlave.readByte();\n\t\t\t\t\t// Apply mask to both current value of values[0] and the new data in value.\n\t\t\t\t\tvalues[0] = (values[index] & ~mask) | (value & mask);\n\t\t\t\t} else {\n\t\t\t\t\t// Normal case\n\t\t\t\t\tvalues[index] = await this.i2cSlave.readByte();\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * MFRC522とPICC（カード）間でデータを送受信します。\n\t\t * @param {number} command コマンド\n\t\t * @param {number} waitIRq\n\t\t * @param {Uint8Array} sendData 送信するデータ\n\t\t * @param {number} sendLen 送信データの長さ\n\t\t * @param {Uint8Array} backData 受信バッファ\n\t\t * @param {number} backLen 受信バッファの最大長\n\t\t * @param {number} validBits 送信データの最後のバイトの有効ビット数\n\t\t * @param {number} rxAlign 受信データの最初のビットの位置\n\t\t * @param {boolean} checkCRC CRC検証を行うか\n\t\t * @return {Promise<object>} ステータス、有効ビット数、受信バイト数を含むオブジェクト\n\t\t */\n\t\tasync PCD_CommunicateWithPICC(\n\t\t\tcommand,\n\t\t\twaitIRq,\n\t\t\tsendData,\n\t\t\tsendLen,\n\t\t\tbackData,\n\t\t\tbackLen,\n\t\t\tvalidBits,\n\t\t\trxAlign,\n\t\t\tcheckCRC\n\t\t) {\n\t\t\tlet n, _validBits;\n\t\t\tlet i;\n\n\t\t\t// Prepare values for BitFramingReg\n\t\t\tlet txLastBits = validBits ? validBits : 0;\n\t\t\tlet bitFraming = (rxAlign << 4) + txLastBits; // RxAlign = BitFramingReg[6..4]. TxLastBits = BitFramingReg[2..0]\n\n\t\t\tawait this.i2cSlave.write8(this.CommandReg, this.PCD_Idle);\n\t\t\tawait this.i2cSlave.write8(this.ComIrqReg, 0x7f);\n\t\t\tawait this.PCD_SetRegisterBitMask(this.FIFOLevelReg, 0x80);\n\n\t\t\tconst writeData = new Uint8Array(sendLen + 1);\n\t\t\twriteData[0] = this.FIFODataReg;\n\t\t\twriteData.set(sendData.slice(0, sendLen), 1);\n\t\t\tawait this.i2cSlave.writeBytes(writeData);\n\n\t\t\tawait this.i2cSlave.write8(this.BitFramingReg, bitFraming);\n\t\t\tawait this.i2cSlave.write8(this.CommandReg, command);\n\t\t\tif (command === this.PCD_Transceive) {\n\t\t\t\t//\t\t\tconsole.log(\"PCD_Transceive\");\n\t\t\t\tawait this.PCD_SetRegisterBitMask(this.BitFramingReg, 0x80);\n\t\t\t}\n\n\t\t\t// Loop with a timeout\n\t\t\ti = 2000;\n\t\t\twhile (true) {\n\t\t\t\tn = await this.i2cSlave.read8(this.ComIrqReg);\n\t\t\t\tif (n & waitIRq) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (n & 0x01) {\n\t\t\t\t\t// Timer interrupt - nothing received in 25ms\n\t\t\t\t\treturn { status: this.STATUS_TIMEOUT, validBits, receivedLen: backLen };\n\t\t\t\t}\n\t\t\t\t--i;\n\t\t\t\tif (i == 0) {\n\t\t\t\t\t// The emergency break. If all other condions fail we will eventually terminate on this one after 35.7ms. Communication with the MFRC522 might be down.\n\t\t\t\t\treturn { status: this.STATUS_TIMEOUT, validBits, receivedLen: backLen };\n\t\t\t\t}\n\t\t\t\tawait sleep(1); // Small delay to avoid busy-waiting\n\t\t\t}\n\n\t\t\tconst errorRegValue = await this.i2cSlave.read8(this.ErrorReg);\n\t\t\t//\t\tconsole.log(`PCD_TransceiveData: errorRegValue value: 0x${errorRegValue.toString(16)}`);\n\t\t\t//\t\tconsole.log(`PCD_TransceiveData: Status after loop: ${result}`);\n\n\t\t\t// console.log(\"PCD_CommunicateWithPICC : errorRegValue:\",errorRegValue.toString(2),\" collisions:\",errorRegValue & 0x08, \" stat_error:\",errorRegValue & 0x13);\n\n\t\t\tif (errorRegValue & 0x13) {\n\t\t\t\treturn { status: this.STATUS_ERROR, validBits, receivedLen: backLen };\n\t\t\t}\n\n\t\t\tif (backData && backLen) {\n\t\t\t\tn = await this.i2cSlave.read8(this.FIFOLevelReg);\n\t\t\t\t//\t\t\tconsole.log(\"receivedLen: n:\",n);\n\t\t\t\tif (n > backLen) {\n\t\t\t\t\treturn { status: this.STATUS_NO_ROOM, validBits, receivedLen: backLen };\n\t\t\t\t}\n\t\t\t\tbackLen = n;\n\t\t\t\tawait this.PCD_ReadRegister(this.FIFODataReg, n, backData, rxAlign);\n\t\t\t\t_validBits = (await this.i2cSlave.read8(this.ControlReg)) & 0x07;\n\t\t\t\tif (validBits) {\n\t\t\t\t\tvalidBits = _validBits;\n\t\t\t\t}\n\t\t\t\t//\t\t\tconsole.log(\"backData:\",{backData , backLen,n,_validBits,errorRegValue});\n\t\t\t}\n\n\t\t\t// Tell about collisions\n\t\t\tif (errorRegValue & 0x08) {\n\t\t\t\t// CollErr\n\t\t\t\treturn { status: this.STATUS_COLLISION, validBits, receivedLen: backLen };\n\t\t\t}\n\n\t\t\t// Perform CRC_A validation if requested.\n\t\t\tif (backData && backLen && checkCRC) {\n\t\t\t\t// In this case a MIFARE Classic NAK is not OK.\n\t\t\t\tif (backLen == 1 && _validBits == 4) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: this.STATUS_MIFARE_NACK,\n\t\t\t\t\t\tvalidBits,\n\t\t\t\t\t\treceivedLen: backLen,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// We need at least the CRC_A value and all 8 bits of the last byte must be received.\n\t\t\t\tif (backLen < 2 || _validBits != 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: this.STATUS_CRC_WRONG,\n\t\t\t\t\t\tvalidBits,\n\t\t\t\t\t\treceivedLen: backLen,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// Verify CRC_A - do our own calculation and store the control in controlBuffer.\n\t\t\t\tlet controlBuffer = [];\n\t\t\t\tn = await this.PCD_CalculateCRC(backData, backLen - 2, controlBuffer);\n\t\t\t\tif (n != this.STATUS_OK) {\n\t\t\t\t\treturn { status: n, validBits, receivedLen: backLen };\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tbackData[backLen - 2] != controlBuffer[0] ||\n\t\t\t\t\tbackData[backLen - 1] != controlBuffer[1]\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: this.STATUS_CRC_WRONG,\n\t\t\t\t\t\tvalidBits,\n\t\t\t\t\t\treceivedLen: backLen,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { status: this.STATUS_OK, validBits, receivedLen: backLen };\n\t\t}\n\n\t\t/**\n\t\t * REQAコマンドを送信して、新しいカードに応答を要求します。\n\t\t */\n\t\tasync PICC_RequestA(bufferATQA) {\n\t\t\tlet validBits, status;\n\t\t\tawait this.PCD_ClearRegisterBitMask(this.CollReg, 0x80);\n\t\t\tvalidBits = 7;\n\n\t\t\tconst command = new Uint8Array([this.PICC_CMD_REQA]);\n\t\t\tlet backData = new Uint8Array(2);\n\t\t\tconst { status: currentStatus, validBits: currentValidBits } =\n\t\t\t\tawait this.PCD_TransceiveData(command, 1, backData, 2, 7, 0, false);\n\t\t\tif (currentStatus === this.STATUS_OK) {\n\t\t\t\tstatus = currentStatus;\n\t\t\t\tvalidBits = currentValidBits;\n\t\t\t}\n\n\t\t\tif (status !== this.STATUS_OK) return { status, validBits };\n\n\t\t\tbufferATQA.set(backData);\n\t\t\treturn { status: this.STATUS_OK, validBits };\n\t\t}\n\n\t\tasync PICC_RequestAO(bufferATQA) {\n\t\t\tawait this.i2cSlave.write8(this.CollReg, 0x80); // ValuesAfterColl=1\n\n\t\t\tconst command = new Uint8Array([this.PICC_CMD_REQA]);\n\t\t\tlet backData = new Uint8Array(2);\n\n\t\t\t// タイムアウトする可能性があるため、複数回試行する\n\t\t\tlet status = this.STATUS_ERROR;\n\t\t\tlet validBits = 0;\n\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\t// 3回まで再試行\n\t\t\t\tconst { status: currentStatus, validBits: currentValidBits } =\n\t\t\t\t\tawait this.PCD_TransceiveData(command, 1, backData, 2, 7, 0, false);\n\t\t\t\t// console.log(\"生のATQAデータ:\", backData, \" currentValidBits:\",currentValidBits, \" currentStatus:\",currentStatus);\n\t\t\t\tif (currentStatus === this.STATUS_OK) {\n\t\t\t\t\tstatus = currentStatus;\n\t\t\t\t\tvalidBits = currentValidBits;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tawait sleep(50); // 次の試行まで少し待つ\n\t\t\t}\n\n\t\t\tif (status !== this.STATUS_OK) return { status, validBits };\n\n\t\t\tbufferATQA.set(backData);\n\t\t\treturn { status: this.STATUS_OK, validBits };\n\t\t}\n\n\t\t/**\n\t\t * Clears the bits given in mask from register reg.\n\t\t */\n\n\t\tasync PCD_ClearRegisterBitMask(reg, mask) {\n\t\t\tlet tmp = await this.i2cSlave.read8(reg);\n\t\t\tawait this.i2cSlave.write8(reg, tmp & ~mask); // clear bit mask\n\t\t} // End PCD_ClearRegisterBitMask()\n\n\t\t/**\n\t\t * アンチコリジョン・プロトコルを実行して、カードのUIDを選択・取得します。\n\t\t */\n\t\t// validBits: number\n\t\tasync PICC_Select(uid, validBits) {\n\t\t\tlet uidComplete;\n\t\t\tlet selectDone;\n\t\t\tlet useCascadeTag;\n\t\t\tlet cascadeLevel = 1;\n\t\t\tlet result;\n\t\t\tlet count;\n\t\t\tlet index;\n\t\t\tlet uidIndex;\n\t\t\tlet currentLevelKnownBits;\n\t\t\tlet buffer = new Uint8Array(9); // ポインタ操作に近づける\n\t\t\tlet bufferUsed;\n\t\t\tlet rxAlign;\n\t\t\tlet txLastBits;\n\t\t\tlet responseBuffer;\n\t\t\tlet responseLength;\n\n\t\t\t// Sanity checks\n\t\t\tif (validBits > 80) {\n\t\t\t\treturn this.STATUS_INVALID;\n\t\t\t}\n\n\t\t\t// Prepare MFRC522\n\t\t\tawait this.PCD_ClearRegisterBitMask(this.CollReg, 0x80);\n\n\t\t\tuidComplete = false;\n\t\t\twhile (!uidComplete) {\n\t\t\t\tswitch (cascadeLevel) {\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tbuffer[0] = this.PICC_CMD_SEL_CL1;\n\t\t\t\t\t\tuidIndex = 0;\n\t\t\t\t\t\tuseCascadeTag = validBits && uid.size > 4;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tbuffer[0] = this.PICC_CMD_SEL_CL2;\n\t\t\t\t\t\tuidIndex = 3;\n\t\t\t\t\t\tuseCascadeTag = validBits && uid.size > 7;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\tbuffer[0] = this.PICC_CMD_SEL_CL3;\n\t\t\t\t\t\tuidIndex = 6;\n\t\t\t\t\t\tuseCascadeTag = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn this.STATUS_INTERNAL_ERROR;\n\t\t\t\t}\n\n\t\t\t\tcurrentLevelKnownBits = validBits - 8 * uidIndex;\n\t\t\t\tif (currentLevelKnownBits < 0) currentLevelKnownBits = 0;\n\n\t\t\t\tindex = 2;\n\t\t\t\tif (useCascadeTag) {\n\t\t\t\t\tbuffer[index++] = this.PICC_CMD_CT;\n\t\t\t\t}\n\n\t\t\t\tlet bytesToCopy =\n\t\t\t\t\tMath.floor(currentLevelKnownBits / 8) +\n\t\t\t\t\t(currentLevelKnownBits % 8 ? 1 : 0);\n\t\t\t\tif (bytesToCopy) {\n\t\t\t\t\tlet maxBytes = useCascadeTag ? 3 : 4;\n\t\t\t\t\tif (bytesToCopy > maxBytes) bytesToCopy = maxBytes;\n\t\t\t\t\tfor (count = 0; count < bytesToCopy; count++) {\n\t\t\t\t\t\tbuffer[index++] = uid.uidByte[uidIndex + count];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (useCascadeTag) currentLevelKnownBits += 8;\n\t\t\t\tlet calculatedBCC;\n\t\t\t\tselectDone = false;\n\t\t\t\twhile (!selectDone) {\n\t\t\t\t\t//console.log(\"!!!!!!!!!!!!!!!!!!Loop:\");\n\t\t\t\t\tif (currentLevelKnownBits >= 32) {\n\t\t\t\t\t\tbuffer[1] = 0x70;\n\t\t\t\t\t\tbuffer[6] = buffer[2] ^ buffer[3] ^ buffer[4] ^ buffer[5];\n\t\t\t\t\t\tcalculatedBCC = buffer[6];\n\n\t\t\t\t\t\tconst crcRes = await this.PCD_CalculateCRC(\n\t\t\t\t\t\t\tbuffer,\n\t\t\t\t\t\t\t7,\n\t\t\t\t\t\t\tbuffer.subarray(7)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tresult = crcRes.status;\n\t\t\t\t\t\tif (result !== this.STATUS_OK) {\n\t\t\t\t\t\t\t//\t\t\t\t\t\tconsole.log(\"========PICC_Select NOT STATUS_OK :  uid:\",uid, \" result:\",result);\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttxLastBits = 0;\n\t\t\t\t\t\tbufferUsed = 9;\n\t\t\t\t\t\tresponseBuffer = buffer.subarray(6); // BCC, CRC 部分を再利用\n\t\t\t\t\t\tresponseLength = 3;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttxLastBits = currentLevelKnownBits % 8;\n\t\t\t\t\t\tcount = Math.floor(currentLevelKnownBits / 8);\n\t\t\t\t\t\tindex = 2 + count;\n\t\t\t\t\t\tbuffer[1] = (index << 4) + txLastBits;\n\t\t\t\t\t\tbufferUsed = index + (txLastBits ? 1 : 0);\n\t\t\t\t\t\tresponseBuffer = buffer.subarray(index); // 未使用部分を応答バッファに\n\t\t\t\t\t\tresponseLength = buffer.length - index;\n\t\t\t\t\t}\n\n\t\t\t\t\trxAlign = txLastBits;\n\t\t\t\t\tawait this.i2cSlave.write8(\n\t\t\t\t\t\tthis.BitFramingReg,\n\t\t\t\t\t\t(rxAlign << 4) + txLastBits\n\t\t\t\t\t);\n\n\t\t\t\t\tlet ans = await this.PCD_TransceiveData(\n\t\t\t\t\t\tbuffer,\n\t\t\t\t\t\tbufferUsed,\n\t\t\t\t\t\tresponseBuffer,\n\t\t\t\t\t\tresponseLength,\n\t\t\t\t\t\ttxLastBits,\n\t\t\t\t\t\trxAlign,\n\t\t\t\t\t\tfalse\n\t\t\t\t\t);\n\n\t\t\t\t\tresult = ans.status;\n\t\t\t\t\tresponseLength = ans.receivedLen;\n\t\t\t\t\ttxLastBits = ans.validBits;\n\n\t\t\t\t\t//\t\t\t\tconsole.log(\"???????????????:\",{result,currentLevelKnownBits,responseLength,txLastBits,buffer,responseBuffer});\n\n\t\t\t\t\tif (result === this.STATUS_COLLISION) {\n\t\t\t\t\t\t//\t\t\t\t\tconsole.log(\"???:STATUS_COLLISION\");\n\t\t\t\t\t\tlet coll = await this.PCD_ReadRegister(this.CollReg);\n\t\t\t\t\t\tif (coll & 0x20) {\n\t\t\t\t\t\t\t//\t\t\t\t\t\tconsole.log(\"========PICC_Select STATUS_COLLISION :  uid:\",uid);\n\t\t\t\t\t\t\treturn this.STATUS_COLLISION;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet collisionPos = coll & 0x1f;\n\t\t\t\t\t\tif (collisionPos === 0) collisionPos = 32;\n\t\t\t\t\t\tif (collisionPos <= currentLevelKnownBits)\n\t\t\t\t\t\t\t//\t\t\t\t\tconsole.log(\"========PICC_Select STATUS_INTERNAL_ERROR :  uid:\",uid);\n\t\t\t\t\t\t\treturn this.STATUS_INTERNAL_ERROR;\n\n\t\t\t\t\t\tcurrentLevelKnownBits = collisionPos;\n\t\t\t\t\t\tcount = (currentLevelKnownBits - 1) % 8;\n\t\t\t\t\t\tindex = 1 + Math.floor(currentLevelKnownBits / 8) + (count ? 1 : 0);\n\t\t\t\t\t\tbuffer[index] |= 1 << count;\n\t\t\t\t\t} else if (result !== this.STATUS_OK) {\n\t\t\t\t\t\t//console.log(\"???: NOT! STATUS_OK : uid:\",uid,\"  validBits:\",validBits);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// STATUS_OK\n\t\t\t\t\t\tif (currentLevelKnownBits >= 32) {\n\t\t\t\t\t\t\tselectDone = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentLevelKnownBits = 32;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//console.log(\"???:STATUS_OK\",{result,currentLevelKnownBits,responseLength,txLastBits,selectDone,buffer,responseBuffer});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//console.log(\"EXIT INT LOOP!\");\n\n\t\t\t\tindex = buffer[2] === this.PICC_CMD_CT ? 3 : 2;\n\t\t\t\tbytesToCopy = buffer[2] === this.PICC_CMD_CT ? 3 : 4;\n\t\t\t\tfor (count = 0; count < bytesToCopy; count++) {\n\t\t\t\t\tuid.uidByte[uidIndex + count] = buffer[index++];\n\t\t\t\t}\n\t\t\t\tuid.bcc = calculatedBCC;\n\n\t\t\t\tif (responseLength !== 3 || txLastBits !== 0) {\n\t\t\t\t\t//console.log(\"========PICC_Select STATUS_ERROR :  uid:\",uid);\n\t\t\t\t\treturn this.STATUS_ERROR;\n\t\t\t\t}\n\n\t\t\t\tconst crcRes = await this.PCD_CalculateCRC(\n\t\t\t\t\tresponseBuffer,\n\t\t\t\t\t1,\n\t\t\t\t\tbuffer.subarray(2)\n\t\t\t\t);\n\t\t\t\tresult = crcRes.status;\n\n\t\t\t\tif (result !== this.STATUS_OK) {\n\t\t\t\t\t//console.log(\"========PICC_Select STATUS NOT OK :  result:\",result);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tif (buffer[2] !== responseBuffer[1] || buffer[3] !== responseBuffer[2]) {\n\t\t\t\t\t//console.log(\"========PICC_Select STATUS_CRC_WRONG :  uid:\",uid);\n\t\t\t\t\treturn this.STATUS_CRC_WRONG;\n\t\t\t\t}\n\n\t\t\t\tif (responseBuffer[0] & 0x04) {\n\t\t\t\t\tcascadeLevel++;\n\t\t\t\t} else {\n\t\t\t\t\tuidComplete = true;\n\t\t\t\t\tuid.sak = responseBuffer[0];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tuid.size = 3 * cascadeLevel + 1;\n\t\t\t//console.log(\"========PICC_Select OK :  uid:\",uid);\n\t\t\treturn this.STATUS_OK;\n\t\t}\n\n\t\t/**\n\t\t * CRCを計算します。\n\t\t */\n\t\tasync PCD_CalculateCRC(sendData, sendLen, backData) {\n\t\t\t// CRC計算の前準備\n\t\t\tawait this.i2cSlave.write8(this.CommandReg, this.PCD_Idle);\n\t\t\tawait this.i2cSlave.write8(this.DivIrqReg, 0x04);\n\t\t\tawait this.i2cSlave.write8(this.FIFOLevelReg, 0x80);\n\n\t\t\t// データをFIFOに書き込み\n\t\t\tconst writeData = new Uint8Array(sendLen + 1);\n\t\t\twriteData[0] = this.FIFODataReg;\n\t\t\twriteData.set(sendData.slice(0, sendLen), 1);\n\t\t\tawait this.i2cSlave.writeBytes(writeData);\n\n\t\t\tawait this.i2cSlave.write8(this.CommandReg, this.PCD_CalcCRC);\n\n\t\t\t// CRC計算の完了を待機\n\t\t\tlet i = 2000;\n\t\t\twhile (true) {\n\t\t\t\tconst n = await this.i2cSlave.read8(this.DivIrqReg);\n\t\t\t\tif (n & 0x04) break; // CRCIrq\n\t\t\t\tif (--i === 0) return { status: this.STATUS_TIMEOUT };\n\t\t\t\tawait sleep(1);\n\t\t\t}\n\n\t\t\t// FIFOからではなく、専用レジスタから計算結果のCRCを読み込み\n\t\t\tbackData[0] = await this.i2cSlave.read8(this.CRCResultRegL);\n\t\t\tbackData[1] = await this.i2cSlave.read8(this.CRCResultRegH);\n\n\t\t\treturn { status: this.STATUS_OK };\n\t\t}\n\n\t\t// --------------------- UID取得関連関数 ---------------------\n\n\t\t/**\n\t\t * 新しいカードがリーダー範囲内にあるか確認します。\n\t\t * @return {Promise<boolean>}\n\t\t */\n\t\tasync PICC_IsNewCardPresent() {\n\t\t\tconst bufferATQA = new Uint8Array(2);\n\t\t\tconst { status } = await this.PICC_RequestA(bufferATQA);\n\t\t\tif (status === this.STATUS_OK || status === this.STATUS_COLLISION) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus,\n\t\t\t\t\tatqa: bufferATQA,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t//\t\treturn status === this.STATUS_OK || status === this.STATUS_COLLISION;\n\t\t}\n\n\t\t/**\n\t\t * 範囲内のカードのUIDを読み取ります。\n\t\t * ATQA, SAKも取得し、オブジェクトとして返却します。\n\t\t * @return {Promise<object|null>} 成功すればUID, ATQA, SAKを含むオブジェクト、失敗すればnull\n\t\t */\n\t\tasync PICC_ReadCardSerial() {\n\t\t\tlet result = null;\n\t\t\tconst uid = { uidByte: new Uint8Array(10), size: 0 };\n\t\t\tconst selectStatus = await this.PICC_Select(uid, 0);\n\t\t\t//console.log(\"PICC_ReadCardSerial : uid: \",uid,\"  selectStatus:\",selectStatus);\n\t\t\tif (selectStatus === this.STATUS_OK) {\n\t\t\t\t//\t\t\t\tconsole.log(\"PICC_ReadCardSerial: UIDの読み取りに成功しました。\");\n\t\t\t\tresult = {\n\t\t\t\t\tuid: uid.uidByte.slice(0, uid.size),\n\t\t\t\t\tuidLength: uid.size,\n\t\t\t\t\tbcc: uid.bcc,\n\t\t\t\t\t//\t\t\t\tatqa: this.atqa,\n\t\t\t\t\tsak: uid.sak,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\t// スリープ関数（ミリ秒単位）\n\tfunction sleep(ms) {\n\t\treturn new Promise((resolve) => setTimeout(resolve, ms));\n\t}\n\n\treturn RC522;\n\n}));\n"]}