From 7af8bf127eacbfec2a3f3d419bea5f22b8d726b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E7=AB=8B=E5=B8=AE?= <3294713004@qq.com> Date: Thu, 27 Mar 2025 01:32:40 +0800 Subject: [PATCH] =?UTF-8?q?feat(boards):=20=E8=B0=83=E6=95=B4micropython?= =?UTF-8?q?=E4=B8=8B=E6=9D=BF=E8=BD=BDRFID=E5=9B=BE=E5=BD=A2=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../micropython/blocks/sensor_onboard.js | 15 ++ .../micropython/generators/sensor_onboard.js | 47 +++---- .../micropython_educore/template.xml | 28 ++-- .../micropython_esp32/template.xml | 19 ++- .../micropython_esp32c2/blocks/mini_g2.js | 99 +++++++++++++- .../micropython_esp32c2/template.xml | 29 ++-- .../micropython_esp32c3/blocks/me_g1.js | 129 +++++++++++++++--- .../micropython_esp32c3/template.xml | 29 ++-- .../micropython_esp32s2/template.xml | 19 +-- .../micropython_esp32s3/template.xml | 50 +++---- .../micropython_robot/template.xml | 9 +- 11 files changed, 313 insertions(+), 160 deletions(-) diff --git a/boards/default_src/micropython/blocks/sensor_onboard.js b/boards/default_src/micropython/blocks/sensor_onboard.js index e37ea49b..0414e982 100644 --- a/boards/default_src/micropython/blocks/sensor_onboard.js +++ b/boards/default_src/micropython/blocks/sensor_onboard.js @@ -796,6 +796,21 @@ export const rfid_write_return = { } }; +export const rfid_status = { + init: function () { + this.setColour(SENSOR_ONBOARD_HUE); + this.appendDummyInput("") + .appendField("RFID") + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_RFID_SCAN_OK, "True"], + [Blockly.Msg.MIXLY_RFID_SCAN_NOTAGERR, "None"], + [Blockly.Msg.MIXLY_RFID_SCAN_ERROR, "False"] + ]), "key"); + this.setOutput(true, Number); + this.setInputsInline(true); + } +}; + export const sensor_get_acceleration = { init: function () { this.setColour(SENSOR_ONBOARD_HUE); diff --git a/boards/default_src/micropython/generators/sensor_onboard.js b/boards/default_src/micropython/generators/sensor_onboard.js index f4fb0af2..d5a76a8b 100644 --- a/boards/default_src/micropython/generators/sensor_onboard.js +++ b/boards/default_src/micropython/generators/sensor_onboard.js @@ -268,28 +268,16 @@ export const sensor_get_temperature = function (_, generator) { export const rfid_readid = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2]; - if(version == 'mixgo_mini'){ - generator.definitions_['import_mini_g2'] = 'import mini_g2'; - generator.definitions_['import_mini_g2_ext_rfid'] = 'from mini_g2 import ext_rfid'; - var code = 'ext_rfid.read_card(0, x="id")'; - }else{ - generator.definitions_['import_' + version + '_onboard_rfid'] = "from " + version + " import onboard_rfid"; - var code = 'onboard_rfid.read_card(0, x="id")'; - } + generator.definitions_[`import_${version}_onboard_rfid`] = `from ${version} import onboard_rfid`; + var code = 'onboard_rfid.read_card(0, x="id")'; return [code, generator.ORDER_ATOMIC]; } export const rfid_readcontent = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2]; var sector = generator.valueToCode(this, 'SECTOR', generator.ORDER_ATOMIC); - if(version == 'mixgo_mini'){ - generator.definitions_['import_mini_g2'] = 'import mini_g2'; - generator.definitions_['import_mini_g2_ext_rfid'] = 'from mini_g2 import ext_rfid'; - var code = 'ext_rfid.read_card(' + sector + ')'; - }else{ - generator.definitions_['import_' + version + '_onboard_rfid'] = "from " + version + " import onboard_rfid"; - var code = 'onboard_rfid.read_card(' + sector + ', x="content")'; - } + generator.definitions_[`import_${version}_onboard_rfid`] = `from ${version} import onboard_rfid`; + var code = `onboard_rfid.read_card(${sector}, x="content")`; return [code, generator.ORDER_ATOMIC]; } @@ -297,14 +285,8 @@ export const rfid_write = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2]; var sector = generator.valueToCode(this, 'SECTOR', generator.ORDER_ATOMIC); var cnt = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC); - if(version == 'mixgo_mini'){ - generator.definitions_['import_mini_g2'] = 'import mini_g2'; - generator.definitions_['import_mini_g2_ext_rfid'] = 'from mini_g2 import ext_rfid'; - var code = 'ext_rfid.write_card(' + cnt + ',' + sector + ')\n'; - }else{ - generator.definitions_['import_' + version + '_onboard_rfid'] = "from " + version + " import onboard_rfid"; - var code = 'onboard_rfid.write_card(' + cnt + ', ' + sector + ')\n'; - } + generator.definitions_[`import_${version}_onboard_rfid`] = `from ${version} import onboard_rfid`; + var code = `onboard_rfid.write_card(${cnt}, ${sector})\n`; return code; } @@ -312,13 +294,16 @@ export const rfid_write_return = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2]; var sector = generator.valueToCode(this, 'SECTOR', generator.ORDER_ATOMIC); var cnt = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC); - if (version == "mixgo_mini") { - generator.definitions_['import_mini_g2_ext_rfid'] = 'from mini_g2 import ext_rfid'; - var code = 'ext_rfid.write_card(' + cnt + ',' + sector + ')'; - } else { - generator.definitions_['import_' + version + '_onboard_rfid'] = "from " + version + " import onboard_rfid"; - var code = 'onboard_rfid.write_card(' + cnt + ', ' + sector + ')'; - } + generator.definitions_[`import_${version}_onboard_rfid`] = `from ${version} import onboard_rfid`; + var code = `onboard_rfid.write_card(${cnt}, ${sector})`; + return [code, generator.ORDER_ATOMIC]; +} + +export const rfid_status = function (_, generator) { + var version = Boards.getSelectedBoardKey().split(':')[2]; + var key = this.getFieldValue('key'); + generator.definitions_[`import_${version}_onboard_rfid`] = `from ${version} import onboard_rfid`; + var code = `onboard_rfid.scan_card() == ${key}`; return [code, generator.ORDER_ATOMIC]; } diff --git a/boards/default_src/micropython_educore/template.xml b/boards/default_src/micropython_educore/template.xml index d805df32..d7d04f79 100644 --- a/boards/default_src/micropython_educore/template.xml +++ b/boards/default_src/micropython_educore/template.xml @@ -1522,13 +1522,8 @@ - - - - rfid - - - + + @@ -4108,7 +4103,14 @@ - + + + + ysensor + + + + ysensor @@ -4120,7 +4122,7 @@ - + ysensor @@ -4167,14 +4169,6 @@ - - - - ysensor - - - - diff --git a/boards/default_src/micropython_esp32/template.xml b/boards/default_src/micropython_esp32/template.xml index 7f21cd6b..5a8ec35d 100644 --- a/boards/default_src/micropython_esp32/template.xml +++ b/boards/default_src/micropython_esp32/template.xml @@ -4006,8 +4006,14 @@ - - + + + + ysensor + + + + ysensor @@ -4019,7 +4025,7 @@ - + ysensor @@ -4065,13 +4071,6 @@ - - - - ysensor - - - diff --git a/boards/default_src/micropython_esp32c2/blocks/mini_g2.js b/boards/default_src/micropython_esp32c2/blocks/mini_g2.js index 82ca11e8..ffe36608 100644 --- a/boards/default_src/micropython_esp32c2/blocks/mini_g2.js +++ b/boards/default_src/micropython_esp32c2/blocks/mini_g2.js @@ -1,5 +1,6 @@ import * as Blockly from 'blockly/core'; import { Boards } from 'mixly'; +import { MicroPythonSensorOnBoardBlocks } from '@mixly/micropython'; const MEG1_HUE = 40; @@ -60,6 +61,69 @@ export const mini_g2_varistor = { } }; +/** + * @override override "@micropython.MicroPythonSensorOnBoardBlocks.rfid_readid" + */ +export const rfid_readid = { + init: function () { + this.appendDummyInput() + .appendField('MINI G2'); + MicroPythonSensorOnBoardBlocks.rfid_readid.init.call(this); + this.setColour(MEG1_HUE); + } +}; + +/** + * @override override "@micropython.MicroPythonSensorOnBoardBlocks.rfid_readcontent" + */ +export const rfid_readcontent = { + init: function () { + this.appendDummyInput() + .appendField('MINI G2'); + MicroPythonSensorOnBoardBlocks.rfid_readcontent.init.call(this); + this.setColour(MEG1_HUE); + } +}; + +/** + * @override override "@micropython.MicroPythonSensorOnBoardBlocks.rfid_write" + */ +export const rfid_write = { + init: function () { + this.appendDummyInput() + .appendField('MINI G2'); + MicroPythonSensorOnBoardBlocks.rfid_write.init.call(this); + this.setColour(MEG1_HUE); + } +}; + +/** + * @override override "@micropython.MicroPythonSensorOnBoardBlocks.rfid_write_return" + */ +export const rfid_write_return = { + init: function () { + this.appendDummyInput() + .appendField('MINI G2'); + MicroPythonSensorOnBoardBlocks.rfid_write_return.init.call(this); + this.setColour(MEG1_HUE); + } +}; + +/** + * @override override "@micropython.MicroPythonSensorOnBoardBlocks.rfid_status" + */ +export const rfid_status = { + init: function () { + this.appendDummyInput() + .appendField('MINI G2'); + MicroPythonSensorOnBoardBlocks.rfid_status.init.call(this); + this.setColour(MEG1_HUE); + } +}; + +/** + * @deprecated To be removed in the future + */ export const mini_g2_rfid_readid = { init: function () { var version = Boards.getSelectedBoardKey().split(':')[2] @@ -70,11 +134,17 @@ export const mini_g2_rfid_readid = { .appendField("RFID" + Blockly.Msg.MIXLY_RFID_READ_CARD); this.appendDummyInput("") .appendField(Blockly.Msg.MIXLY_RFID_READ_CARD_UID); + this.appendDummyInput() + .appendField(`(${Blockly.Msg.MIXLY_DEPRECATED})`); this.setOutput(true, Number); this.setInputsInline(true); + this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT); } }; +/** + * @deprecated To be removed in the future + */ export const mini_g2_rfid_readcontent = { init: function () { var version = Boards.getSelectedBoardKey().split(':')[2] @@ -87,11 +157,17 @@ export const mini_g2_rfid_readcontent = { .appendField(Blockly.Msg.MIXLY_LIST_INDEX) this.appendDummyInput("") .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL); + this.appendDummyInput() + .appendField(`(${Blockly.Msg.MIXLY_DEPRECATED})`); this.setOutput(true, Number); this.setInputsInline(true); + this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT); } }; +/** + * @deprecated To be removed in the future + */ export const mini_g2_rfid_write = { init: function () { var version = Boards.getSelectedBoardKey().split(':')[2] @@ -103,13 +179,19 @@ export const mini_g2_rfid_write = { this.appendValueInput('SECTOR') .appendField(Blockly.Msg.MIXLY_LIST_INDEX) this.appendValueInput('CONTENT') - .appendField(Blockly.Msg.MIXLY_COMMUNICATION_WRITE_NUM) + .appendField(Blockly.Msg.MIXLY_COMMUNICATION_WRITE_NUM); + this.appendDummyInput() + .appendField(`(${Blockly.Msg.MIXLY_DEPRECATED})`); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); + this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT); } }; +/** + * @deprecated To be removed in the future + */ export const mini_g2_rfid_write_outcome = { init: function () { var version = Boards.getSelectedBoardKey().split(':')[2] @@ -119,16 +201,22 @@ export const mini_g2_rfid_write_outcome = { .appendField(name) .appendField(Blockly.Msg.MIXLY_COMMUNICATION_RFID_WRITE); this.appendValueInput('SECTOR') - .appendField(Blockly.Msg.MIXLY_LIST_INDEX) + .appendField(Blockly.Msg.MIXLY_LIST_INDEX); this.appendValueInput('CONTENT') - .appendField(Blockly.Msg.MIXLY_COMMUNICATION_WRITE_NUM) + .appendField(Blockly.Msg.MIXLY_COMMUNICATION_WRITE_NUM); this.appendDummyInput() - .appendField(Blockly.Msg.RETURN_SUCCESS_OR_NOT) + .appendField(Blockly.Msg.RETURN_SUCCESS_OR_NOT); + this.appendDummyInput() + .appendField(`(${Blockly.Msg.MIXLY_DEPRECATED})`); this.setInputsInline(true); this.setOutput(true); + this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT); } }; +/** + * @deprecated To be removed in the future + */ export const mini_g2_rfid_status = { init: function () { var version = Boards.getSelectedBoardKey().split(':')[2] @@ -143,7 +231,10 @@ export const mini_g2_rfid_status = { [Blockly.Msg.MIXLY_RFID_SCAN_NOTAGERR, "None"], [Blockly.Msg.MIXLY_RFID_SCAN_ERROR, "False"] ]), "key"); + this.appendDummyInput() + .appendField(`(${Blockly.Msg.MIXLY_DEPRECATED})`); this.setOutput(true, Number); this.setInputsInline(true); + this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT); } }; \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c2/template.xml b/boards/default_src/micropython_esp32c2/template.xml index de8ffb12..d60bb019 100644 --- a/boards/default_src/micropython_esp32c2/template.xml +++ b/boards/default_src/micropython_esp32c2/template.xml @@ -1986,15 +1986,16 @@ - - + + + 0 - + 0 @@ -2006,7 +2007,7 @@ - + 0 @@ -2018,7 +2019,6 @@ - @@ -3854,7 +3854,14 @@ - + + + + ysensor + + + + ysensor @@ -3866,7 +3873,7 @@ - + ysensor @@ -3913,14 +3920,6 @@ - - - - ysensor - - - - diff --git a/boards/default_src/micropython_esp32c3/blocks/me_g1.js b/boards/default_src/micropython_esp32c3/blocks/me_g1.js index 52a174ee..87e422bd 100644 --- a/boards/default_src/micropython_esp32c3/blocks/me_g1.js +++ b/boards/default_src/micropython_esp32c3/blocks/me_g1.js @@ -1,5 +1,6 @@ import * as Blockly from 'blockly/core'; import * as Mixly from 'mixly'; +import { MicroPythonSensorOnBoardBlocks } from '@mixly/micropython'; const MEG1_HUE = 40; @@ -60,6 +61,69 @@ export const me_g1_varistor = { } }; +/** + * @override override "@micropython.MicroPythonSensorOnBoardBlocks.rfid_readid" + */ +export const rfid_readid = { + init: function () { + this.appendDummyInput() + .appendField('ME G1'); + MicroPythonSensorOnBoardBlocks.rfid_readid.init.call(this); + this.setColour(MEG1_HUE); + } +}; + +/** + * @override override "@micropython.MicroPythonSensorOnBoardBlocks.rfid_readcontent" + */ +export const rfid_readcontent = { + init: function () { + this.appendDummyInput() + .appendField('ME G1'); + MicroPythonSensorOnBoardBlocks.rfid_readcontent.init.call(this); + this.setColour(MEG1_HUE); + } +}; + +/** + * @override override "@micropython.MicroPythonSensorOnBoardBlocks.rfid_write" + */ +export const rfid_write = { + init: function () { + this.appendDummyInput() + .appendField('ME G1'); + MicroPythonSensorOnBoardBlocks.rfid_write.init.call(this); + this.setColour(MEG1_HUE); + } +}; + +/** + * @override override "@micropython.MicroPythonSensorOnBoardBlocks.rfid_write_return" + */ +export const rfid_write_return = { + init: function () { + this.appendDummyInput() + .appendField('ME G1'); + MicroPythonSensorOnBoardBlocks.rfid_write_return.init.call(this); + this.setColour(MEG1_HUE); + } +}; + +/** + * @override override "@micropython.MicroPythonSensorOnBoardBlocks.rfid_status" + */ +export const rfid_status = { + init: function () { + this.appendDummyInput() + .appendField('ME G1'); + MicroPythonSensorOnBoardBlocks.rfid_status.init.call(this); + this.setColour(MEG1_HUE); + } +}; + +/** + * @deprecated To be removed in the future + */ export const me_g1_rfid_readid = { init: function () { var version = Mixly.Boards.getSelectedBoardKey().split(':')[2] @@ -70,11 +134,17 @@ export const me_g1_rfid_readid = { .appendField("RFID" + Blockly.Msg.MIXLY_RFID_READ_CARD); this.appendDummyInput("") .appendField(Blockly.Msg.MIXLY_RFID_READ_CARD_UID); + this.appendDummyInput() + .appendField(`(${Blockly.Msg.MIXLY_DEPRECATED})`); this.setOutput(true, Number); this.setInputsInline(true); + this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT); } }; +/** + * @deprecated To be removed in the future + */ export const me_g1_rfid_readcontent = { init: function () { var version = Mixly.Boards.getSelectedBoardKey().split(':')[2] @@ -87,12 +157,42 @@ export const me_g1_rfid_readcontent = { .appendField(Blockly.Msg.MIXLY_LIST_INDEX) this.appendDummyInput("") .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL); + this.appendDummyInput() + .appendField(`(${Blockly.Msg.MIXLY_DEPRECATED})`); this.setOutput(true, Number); this.setInputsInline(true); + this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT); } }; +/** + * @deprecated To be removed in the future + */ export const me_g1_rfid_write = { + init: function () { + var version = Mixly.Boards.getSelectedBoardKey().split(':')[2] + if (version == "mixgo_me") { var name = 'ME G1' } + this.setColour(MEG1_HUE); + this.appendDummyInput() + .appendField(name) + .appendField(Blockly.Msg.MIXLY_COMMUNICATION_RFID_WRITE); + this.appendValueInput('SECTOR') + .appendField(Blockly.Msg.MIXLY_LIST_INDEX); + this.appendValueInput('CONTENT') + .appendField(Blockly.Msg.MIXLY_COMMUNICATION_WRITE_NUM); + this.appendDummyInput() + .appendField(`(${Blockly.Msg.MIXLY_DEPRECATED})`); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT); + } +}; + +/** + * @deprecated To be removed in the future + */ +export const me_g1_rfid_write_outcome = { init: function () { var version = Mixly.Boards.getSelectedBoardKey().split(':')[2] if (version == "mixgo_me") { var name = 'ME G1' } @@ -103,32 +203,20 @@ export const me_g1_rfid_write = { this.appendValueInput('SECTOR') .appendField(Blockly.Msg.MIXLY_LIST_INDEX) this.appendValueInput('CONTENT') - .appendField(Blockly.Msg.MIXLY_COMMUNICATION_WRITE_NUM) - this.setInputsInline(true); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - } -}; - -export const me_g1_rfid_write_outcome = { - init: function(){ - var version=Mixly.Boards.getSelectedBoardKey().split(':')[2] - if(version=="mixgo_me"){var name='ME G1'} - this.setColour(MEG1_HUE); + .appendField(Blockly.Msg.MIXLY_COMMUNICATION_WRITE_NUM); this.appendDummyInput() - .appendField(name) - .appendField(Blockly.Msg.MIXLY_COMMUNICATION_RFID_WRITE); - this.appendValueInput('SECTOR') - .appendField(Blockly.Msg.MIXLY_LIST_INDEX) - this.appendValueInput('CONTENT') - .appendField(Blockly.Msg.MIXLY_COMMUNICATION_WRITE_NUM) + .appendField(Blockly.Msg.RETURN_SUCCESS_OR_NOT); this.appendDummyInput() - .appendField(Blockly.Msg.RETURN_SUCCESS_OR_NOT) + .appendField(`(${Blockly.Msg.MIXLY_DEPRECATED})`); this.setInputsInline(true); this.setOutput(true); + this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT); } }; +/** + * @deprecated To be removed in the future + */ export const me_g1_rfid_status = { init: function () { var version = Mixly.Boards.getSelectedBoardKey().split(':')[2] @@ -143,7 +231,10 @@ export const me_g1_rfid_status = { [Blockly.Msg.MIXLY_RFID_SCAN_NOTAGERR, "1"], [Blockly.Msg.MIXLY_RFID_SCAN_ERROR, "2"] ]), "key"); + this.appendDummyInput() + .appendField(`(${Blockly.Msg.MIXLY_DEPRECATED})`); this.setOutput(true, Number); this.setInputsInline(true); + this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT); } }; \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c3/template.xml b/boards/default_src/micropython_esp32c3/template.xml index ff702138..feb4270b 100644 --- a/boards/default_src/micropython_esp32c3/template.xml +++ b/boards/default_src/micropython_esp32c3/template.xml @@ -1929,15 +1929,16 @@ - + + + 0 - - + 0 @@ -1949,7 +1950,7 @@ - + 0 @@ -1961,7 +1962,6 @@ - @@ -3804,7 +3804,14 @@ - + + + + ysensor + + + + ysensor @@ -3816,7 +3823,7 @@ - + ysensor @@ -3863,14 +3870,6 @@ - - - - ysensor - - - - diff --git a/boards/default_src/micropython_esp32s2/template.xml b/boards/default_src/micropython_esp32s2/template.xml index 4d93b928..7e838a1c 100644 --- a/boards/default_src/micropython_esp32s2/template.xml +++ b/boards/default_src/micropython_esp32s2/template.xml @@ -3543,7 +3543,14 @@ - + + + + ysensor + + + + ysensor @@ -3555,7 +3562,7 @@ - + ysensor @@ -3601,13 +3608,7 @@ - - - - ysensor - - - + diff --git a/boards/default_src/micropython_esp32s3/template.xml b/boards/default_src/micropython_esp32s3/template.xml index e7acb3bf..229ae8e3 100644 --- a/boards/default_src/micropython_esp32s3/template.xml +++ b/boards/default_src/micropython_esp32s3/template.xml @@ -1446,13 +1446,8 @@ - - - - rfid - - - + + @@ -2295,15 +2290,16 @@ - + + + 0 - - + 0 @@ -2315,7 +2311,7 @@ - + 0 @@ -2327,19 +2323,6 @@ - - - - - 5000 - - - - - 500 - - - @@ -4205,7 +4188,14 @@ - + + + + ysensor + + + + ysensor @@ -4217,7 +4207,7 @@ - + ysensor @@ -4263,13 +4253,7 @@ - - - - ysensor - - - + diff --git a/boards/default_src/micropython_robot/template.xml b/boards/default_src/micropython_robot/template.xml index f62faaca..4dc5af1b 100644 --- a/boards/default_src/micropython_robot/template.xml +++ b/boards/default_src/micropython_robot/template.xml @@ -1442,13 +1442,8 @@ - - - - rfid - - - + +