//build:20240715 //用于简化uart组件微光通信协议的使用,把uart封装在这个worker里,使用者只需要订阅eventcenter的事件就可以监听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不影响bcc的计算结果 } // 命令头已解析完,读取长度字(占用2Byte) let len1 = readOne() if (len1 === null) { return; } let len2 = readOne() if (len2 === null) { return; } // 解析长度字,获取数据域长度 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) }