2024-05-18 14:15:46 +00:00
|
|
|
|
/****************************** */
|
|
|
|
|
/** SFM-V1.7 Fingerprint Sensor */
|
|
|
|
|
/****************************** */
|
|
|
|
|
|
|
|
|
|
// 初期化
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_sfmv17_init",
|
|
|
|
|
"message0": "指紋センサ(ポート %1 )に接続",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "port",
|
|
|
|
|
"check": "String"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "指紋センサ SFM-V1.7 とのシリアル通信を開始します。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "sensor_blocks"
|
|
|
|
|
}]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_sfmv17_init'] = function (block, generator) {
|
|
|
|
|
var value_port = generator.valueToCode(block, 'port', javascript.Order.ATOMIC);
|
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
|
|
|
|
'require_sfmv17', [`const _sfm = require('@ocoge/sfmv17');`]
|
|
|
|
|
);
|
|
|
|
|
var code = `await _sfm.init(_rg, ${value_port}, 115200);\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// リングカラー
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_sfmv17_setringcolor",
|
|
|
|
|
"message0": "指紋センサ LED リング色: %1 ~ %2 %3 周期 %4 秒",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "field_dropdown",
|
|
|
|
|
"name": "start_color",
|
|
|
|
|
"options": [
|
|
|
|
|
[
|
|
|
|
|
"OFF",
|
|
|
|
|
"0x07"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"赤",
|
|
|
|
|
"0x03"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"緑",
|
|
|
|
|
"0x05"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"青",
|
|
|
|
|
"0x06"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"黄",
|
|
|
|
|
"0x01"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"紫",
|
|
|
|
|
"0x02"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"青緑(シアン)",
|
|
|
|
|
"0x04"
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "field_dropdown",
|
|
|
|
|
"name": "end_color",
|
|
|
|
|
"options": [
|
|
|
|
|
[
|
|
|
|
|
"OFF",
|
|
|
|
|
"0x07"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"赤",
|
|
|
|
|
"0x03"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"緑",
|
|
|
|
|
"0x05"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"青",
|
|
|
|
|
"0x06"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"黄",
|
|
|
|
|
"0x01"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"紫",
|
|
|
|
|
"0x02"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"青緑(シアン)",
|
|
|
|
|
"0x04"
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_dummy"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "period_sec",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "指紋センサの LED リングの色を一定周期で切り替えます。周期は 0.3 秒から 2 秒までを指定できます。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "sensor_blocks"
|
|
|
|
|
}]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_sfmv17_setringcolor'] = function (block, generator) {
|
|
|
|
|
var dropdown_start_color = block.getFieldValue('start_color');
|
|
|
|
|
var dropdown_end_color = block.getFieldValue('end_color');
|
|
|
|
|
var value_period_sec = generator.valueToCode(block, 'period_sec', javascript.Order.ATOMIC);
|
|
|
|
|
var code = `await _sfm.setRingColor(${dropdown_start_color}, ${dropdown_end_color}, ${value_period_sec}*1000);\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 記録済みユーザ数取得
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_sfmv17_getusercount",
|
|
|
|
|
"message0": "指紋登録数",
|
|
|
|
|
"output": "Number",
|
|
|
|
|
"tooltip": "データベースに記録された指紋の登録数を返します。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "sensor_blocks"
|
|
|
|
|
}]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_sfmv17_getusercount'] = function (block, generator) {
|
|
|
|
|
var code = `await _sfm.getUserCount()`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 指紋認識
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_sfmv17_recognize",
|
|
|
|
|
"message0": "指紋 ID",
|
|
|
|
|
"output": "Number",
|
|
|
|
|
"tooltip": "指紋を認識します。データベースの指紋と一致した場合その ID を、一致しなければ 0 を、エラーの場合は -1 を返します。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "sensor_blocks"
|
|
|
|
|
}]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_sfmv17_recognize'] = function (block, generator) {
|
|
|
|
|
var code = 'await _sfm.recognition_1vN()';
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 指紋登録
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_sfmv17_registration",
|
|
|
|
|
"message0": "指紋登録 %1",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "field_dropdown",
|
|
|
|
|
"name": "step",
|
|
|
|
|
"options": [
|
|
|
|
|
[
|
2024-05-20 08:35:24 +00:00
|
|
|
|
"ステップ1",
|
2024-05-18 14:15:46 +00:00
|
|
|
|
"1"
|
|
|
|
|
],
|
|
|
|
|
[
|
2024-05-20 08:35:24 +00:00
|
|
|
|
"ステップ2",
|
2024-05-18 14:15:46 +00:00
|
|
|
|
"2"
|
|
|
|
|
],
|
|
|
|
|
[
|
2024-05-20 08:35:24 +00:00
|
|
|
|
"ステップ3",
|
2024-05-18 14:15:46 +00:00
|
|
|
|
"3"
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"output": null,
|
|
|
|
|
"tooltip": "指紋をモジュール内データベースに登録します。ステップ1からステップ3を行います。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "sensor_blocks"
|
|
|
|
|
}]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_sfmv17_registration'] = function (block, generator) {
|
|
|
|
|
var dropdown_step = block.getFieldValue('step');
|
|
|
|
|
var code = `await _sfm.register_3c3r(${dropdown_step})`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
|
|
|
|
|
2024-05-27 14:00:31 +00:00
|
|
|
|
// ユーザ削除 / ID 0 で全削除
|
2024-05-18 14:15:46 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
2024-05-27 14:00:31 +00:00
|
|
|
|
"type": "oc_sfmv17_deleteuser",
|
|
|
|
|
"message0": "ID %1 の指紋を削除",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "uid"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
2024-05-18 14:15:46 +00:00
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2024-05-27 14:00:31 +00:00
|
|
|
|
"tooltip": "登録済みの指紋から ID で指定したものを削除します。ID 0 を指定すると全部の指紋を削除します。",
|
2024-05-18 14:15:46 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "sensor_blocks"
|
|
|
|
|
}]);
|
2024-05-27 14:00:31 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_sfmv17_deleteuser'] = function (block, generator) {
|
|
|
|
|
var value_uid = generator.valueToCode(block, 'uid', javascript.Order.ATOMIC);
|
|
|
|
|
var code = `await _sfm.deleteUser(${value_uid});\n`;
|
2024-05-18 14:15:46 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
2024-05-27 14:00:31 +00:00
|
|
|
|
// 指紋画像を取得
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_sfmv17_getimage",
|
|
|
|
|
"message0": "指紋画像をキャンバスに表示",
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "指紋センサで読み取った指紋をキャンバスに表示します。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "sensor_blocks"
|
|
|
|
|
}]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_sfmv17_getimage'] = function (block, generator) {
|
|
|
|
|
var code = ` let r = await _sfm.getImage();
|
|
|
|
|
console.log(r);
|
|
|
|
|
console.log(r.length)
|
|
|
|
|
let imgdata = _ctx.createImageData(160, 160);
|
|
|
|
|
for (let pixel=0; pixel<r.length; pixel++){
|
|
|
|
|
for (let rgb=0; rgb<3; rgb++)
|
|
|
|
|
imgdata.data[pixel*4+rgb] = r[pixel];
|
|
|
|
|
imgdata.data[pixel*4+3] = 0xff;
|
|
|
|
|
}
|
|
|
|
|
_ctx.putImageData(imgdata,0,0);
|
|
|
|
|
`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2024-05-18 14:15:46 +00:00
|
|
|
|
// 切断
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_sfmv17_stop",
|
|
|
|
|
"message0": "指紋センサから切断",
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "指紋センサとのシリアル通信を終了してポートを開放します。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "sensor_blocks"
|
|
|
|
|
}]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_sfmv17_stop'] = function (block, generator) {
|
|
|
|
|
var code = `await _sfm.stop();\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
flyout_contents = flyout_contents.concat([
|
|
|
|
|
{
|
|
|
|
|
"kind": "label",
|
|
|
|
|
"text": "指紋センサ SFM-V1.7",
|
|
|
|
|
"web-line": "4.0",
|
|
|
|
|
"web-line-width": "200"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"kind": "block",
|
|
|
|
|
"type": "oc_sfmv17_init",
|
|
|
|
|
"inputs": {
|
|
|
|
|
"port": {
|
|
|
|
|
"shadow": {
|
|
|
|
|
"type": "text",
|
|
|
|
|
"fields": {
|
|
|
|
|
"TEXT": "/dev/ttyS0"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"kind": "block",
|
|
|
|
|
"type": "oc_sfmv17_setringcolor",
|
|
|
|
|
"fields": {
|
|
|
|
|
"start_color": "0x03"
|
|
|
|
|
},
|
|
|
|
|
"fields": {
|
|
|
|
|
"end_color": "0x07"
|
|
|
|
|
},
|
|
|
|
|
"inputs": {
|
|
|
|
|
"period_sec": {
|
|
|
|
|
"shadow": {
|
|
|
|
|
"type": "math_number",
|
|
|
|
|
"fields": {
|
|
|
|
|
"NUM": "0.5"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"kind": "block",
|
|
|
|
|
"type": "oc_sfmv17_getusercount"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"kind": "block",
|
|
|
|
|
"type": "oc_sfmv17_recognize"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"kind": "block",
|
|
|
|
|
"type": "oc_sfmv17_registration",
|
|
|
|
|
"fields": {
|
|
|
|
|
"step": "1"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"kind": "block",
|
2024-05-27 14:00:31 +00:00
|
|
|
|
"type": "oc_sfmv17_deleteuser",
|
|
|
|
|
"inputs": {
|
|
|
|
|
"uid": {
|
|
|
|
|
"shadow": {
|
|
|
|
|
"type": "math_number",
|
|
|
|
|
"fields": {
|
|
|
|
|
"NUM": "0"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"kind": "block",
|
|
|
|
|
"type": "oc_sfmv17_getimage"
|
2024-05-18 14:15:46 +00:00
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"kind": "block",
|
|
|
|
|
"type": "oc_sfmv17_stop"
|
|
|
|
|
}
|
|
|
|
|
]);
|
|
|
|
|
|