From e491cdb48129752324c4e3764f99bd9203c56dec Mon Sep 17 00:00:00 2001
From: lgq <1015864684@qq.com>
Date: 星期二, 31 三月 2026 09:48:44 +0800
Subject: [PATCH] 1.新增VF205门禁机代码

---
 vf205_access/dxmodules/vgUartWorker.js |  166 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 166 insertions(+), 0 deletions(-)

diff --git a/vf205_access/dxmodules/vgUartWorker.js b/vf205_access/dxmodules/vgUartWorker.js
new file mode 100644
index 0000000..62adb8c
--- /dev/null
+++ b/vf205_access/dxmodules/vgUartWorker.js
@@ -0,0 +1,166 @@
+//build:20240715
+//鐢ㄤ簬绠�鍖杣art缁勪欢寰厜閫氫俊鍗忚鐨勪娇鐢紝鎶妘art灏佽鍦ㄨ繖涓獁orker閲岋紝浣跨敤鑰呭彧闇�瑕佽闃卐ventcenter鐨勪簨浠跺氨鍙互鐩戝惉uart
+import log from './dxLogger.js'
+import uart from './dxUart.js'
+import common from './dxCommon.js';
+import dxMap from './dxMap.js'
+import * as os from "os";
+import std from './dxStd.js'
+const map = dxMap.get('default')
+const id = "{{id}}"
+const options = map.get("__vguart__run_init" + id)
+const timeout = 100
+const longTimeout = 500
+
+function run() {
+    uart.open(options.type, options.path, options.id)
+    log.info('vg uart start......,id =', id)
+    std.setInterval(() => {
+        try {
+            // 鎺ユ敹鏁版嵁妯″紡
+            if (options.passThrough) {
+                // 閫忎紶妯″紡锛岄�傞厤闊︽牴涔嬬被
+                passThrough()
+            }
+            if(options.type == uart.TYPE.USBHID){
+                receiveUsb() 
+            } else {
+                // 寰厜閫氫俊鍗忚妯″紡
+                receive()
+            }
+        } catch (error) {
+            log.error(error)
+        }
+    }, 10)
+}
+
+// 閫忎紶妯″紡
+function passThrough() {
+    let pack = [];
+    let buffer = readOne()
+    while (buffer !== null) {
+        pack.push(buffer)
+        os.sleep(10)
+        buffer = readOne()
+    }
+    if (pack.length !== 0) {
+        __bus.fire(uart.VG.RECEIVE_MSG + options.id, pack)//bus.newworker鐨勬椂鍊欎細import eventbus as __bus
+    }
+}
+
+function receive() {
+    //鍓�2涓瓧鑺傚繀椤绘槸55aa
+    let buffer = readOne()
+    if (buffer === null) {
+        return;
+    }
+    if (buffer == 85) {//0x55
+        buffer = readOne()
+        if (buffer != 170) {//0xaa
+            return;
+        }
+    } else {
+        return;
+    }
+    let pack = {};
+    // 璇诲彇鍛戒护瀛楋紙鍗犵敤1Byte锛�
+    buffer = readOne()
+    if (buffer === null) {
+        return;
+    }
+    pack.cmd = buffer
+    if (options.result) {
+        // 璇诲彇缁撴灉瀛楋紙鍗犵敤1Byte锛�
+        buffer = readOne()
+        if (buffer === null) {
+            return;
+        }
+        pack.result = buffer;
+    } else {
+        pack.result = 0//0涓嶅奖鍝峛cc鐨勮绠楃粨鏋�
+    }
+    // 鍛戒护澶村凡瑙f瀽瀹岋紝璇诲彇闀垮害瀛楋紙鍗犵敤2Byte锛�
+    let len1 = readOne()
+    if (len1 === null) {
+        return;
+    }
+    let len2 = readOne()
+    if (len2 === null) {
+        return;
+    }
+    // 瑙f瀽闀垮害瀛楋紝鑾峰彇鏁版嵁鍩熼暱搴�
+    let len = len1 + len2 * 256
+    // 鏍规嵁闀垮害瀛楄鍙栨寚瀹氭暟鎹暱搴�
+    pack.length = len
+    if (len > 0) {
+        buffer = uart.receive(len, longTimeout, options.id)
+        if (buffer === null) {
+            return;
+        }
+        pack.data = Array.from(buffer);
+    } else {
+        pack.data = 0
+    }
+    // 璇诲彇1Byte鐨勬牎楠屼綅
+    buffer = readOne()
+    if (buffer === null) {
+        return;
+    }
+    let bcc = valid(pack, buffer)
+    let res = { cmd: int2hex(pack.cmd), length: pack.length, bcc: bcc }
+    if (pack.length > 0) {
+        res.data = common.arrToHex(pack.data)
+    }
+    if (options.result) {
+        res.result = int2hex(pack.result)
+    }
+    __bus.fire(uart.VG.RECEIVE_MSG + options.id, res)//bus.newworker鐨勬椂鍊欎細import eventbus as __bus
+}
+
+
+function receiveUsb() {
+    let arr = uart.receive(1024, 100, options.id)
+    if (arr && arr[0] == 0x55 && arr[1] == 0xAA) {
+        let cmd = arr[2]
+        let dlen = arr[4] * 256 + arr[3]
+        if (dlen > (1024 - 6)) {
+            let tempLen = dlen - 1024 + 5 
+            while(tempLen >= 0){
+                let tempArr = uart.receive(1024, 100, options.id)
+                tempLen = tempLen - tempArr.length
+                let newArr = new Uint8Array(arr.length + tempArr.length)
+                newArr.set(arr)
+                newArr.set(tempArr, arr.length)
+                arr = newArr
+            }
+        }
+        let data = (dlen == 0 ? [] : Object.values(arr.slice(5, 5 + dlen)))
+        let bcc = common.calculateBcc([0x55, 0xAA, arr[2], arr[3], arr[4]].concat(data))
+        data = data.map(v => v.toString(16).padStart(2, '0')).join('')
+        if (bcc == arr[5 + dlen]) {
+            let res = { "cmd": cmd.toString(16).padStart(2, '0'), "length": dlen, "data": data, "bcc": true }
+            __bus.fire(uart.VG.RECEIVE_MSG + options.id, res)//bus.newworker鐨勬椂鍊欎細import eventbus as __bus
+        }
+    }
+}
+
+function valid(pack, bcc) {
+    let temp = common.calculateBcc([0x55, 0xaa, pack.cmd, pack.result, pack.length % 256, Math.floor(pack.length / 256)].concat(pack.data))
+    return temp === bcc
+}
+function readOne() {
+    let buffer = uart.receive(1, timeout, options.id)
+    if (buffer) {
+        return parseInt(buffer);
+    }
+    return null
+}
+function int2hex(num) {
+    return num.toString(16).padStart(2, '0')
+}
+
+try {
+    run()
+} catch (error) {
+    log.error(error, error.stack)
+}
\ No newline at end of file

--
Gitblit v1.9.3