init commit
This commit is contained in:
7
src/render/stores/serialPort/data.ts
Normal file
7
src/render/stores/serialPort/data.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export const filters = [
|
||||
{ usbProductId: 8963 , usbVendorId: 1659 }, // 核心处理模块(micro-usb),蓝色无线通信模块
|
||||
{ usbProductId: 29986, usbVendorId: 6790 }, // 核心处理模块(type-c),红色无线通信模块
|
||||
{ usbProductId: 29987, usbVendorId: 6790 }, // 核心处理模块(type-c)
|
||||
{ usbProductId: 2 , usbVendorId: 12346 }, // 黑色无线通信模块(typc-c,micro-usb)
|
||||
{ usbProductId: 21970, usbVendorId: 6790 }, // 星座图监控软件配套红盒子接收机
|
||||
]
|
||||
140
src/render/stores/serialPort/index.ts
Normal file
140
src/render/stores/serialPort/index.ts
Normal file
@@ -0,0 +1,140 @@
|
||||
import { ref } from 'vue'
|
||||
import { defineStore } from 'pinia'
|
||||
import { filters } from './data'
|
||||
|
||||
|
||||
let keepReading = false
|
||||
let reader = ref()
|
||||
let writer = ref()
|
||||
|
||||
const encoder = new TextEncoder()
|
||||
|
||||
// TODO: 处理串口的连接和断开连接事件
|
||||
// navigator.serial.addEventListener("connect", (event) => {
|
||||
// // TODO: Automatically open event.target or warn user a port is available.
|
||||
// });
|
||||
|
||||
// navigator.serial.addEventListener("disconnect", (event) => {
|
||||
// // TODO: Remove |event.target| from the UI.
|
||||
// // If the serial port was opened, a stream error would be observed as well.
|
||||
// });
|
||||
|
||||
export const useSerialPortStore = defineStore('serialPort', {
|
||||
state: () => ({
|
||||
instance: null,
|
||||
}),
|
||||
getters: {
|
||||
isOpen () {
|
||||
return Boolean(this.instance && reader.value && writer.value)
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
async select() {
|
||||
if (!('serial' in navigator)) throw new Error('当前环境不支持串口功能')
|
||||
|
||||
this.instance = await navigator.serial.requestPort({ filters })
|
||||
},
|
||||
|
||||
async open(options) {
|
||||
if ( !options ) throw new Error('缺少串口配置参数')
|
||||
|
||||
if ( !this.instance ) throw new Error('未选择串口设备')
|
||||
|
||||
if ( this.isOpen ) throw new Error('串口已打开')
|
||||
|
||||
try {
|
||||
await this.instance.open(options)
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
throw new Error('串口被占用')
|
||||
}
|
||||
|
||||
// Turn on Data Terminal Ready (DTR) signal.
|
||||
await this.instance.setSignals({ dataTerminalReady: true });
|
||||
// Turn off Request To Send (RTS) signal.
|
||||
await this.instance.setSignals({ requestToSend: true });
|
||||
|
||||
writer.value = this.instance.writable.getWriter()
|
||||
reader.value = this.instance.readable.getReader()
|
||||
|
||||
eventListeners[SerialPortEventType.afterOpen]?.forEach((cb: Function) => cb(this))
|
||||
|
||||
keepReading = true
|
||||
// Listen to data coming from the serial device.
|
||||
while (this.instance.readable && keepReading) {
|
||||
|
||||
try {
|
||||
while (true) {
|
||||
const { value, done } = await reader.value.read()
|
||||
|
||||
if (done) {
|
||||
// reader.cancel() has been called.
|
||||
break
|
||||
}
|
||||
|
||||
if (value) {
|
||||
// value is a Uint8Array.
|
||||
eventListeners[SerialPortEventType.data]?.forEach((cb: Function) => cb(value))
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
throw new Error('读取串口数据出错')
|
||||
} finally {
|
||||
// Allow the serial port to be closed later.
|
||||
reader.value.releaseLock()
|
||||
reader.value = null
|
||||
}
|
||||
}
|
||||
|
||||
await this.instance.close()
|
||||
},
|
||||
|
||||
async close() {
|
||||
writer.value.releaseLock()
|
||||
writer.value = null
|
||||
|
||||
keepReading = false
|
||||
reader.value.cancel()
|
||||
},
|
||||
|
||||
async write ( data: Uint8Array | string ) {
|
||||
if (!data) return
|
||||
|
||||
if (!writer.value) throw new Error('串口未打开')
|
||||
|
||||
if (typeof(data) == 'string') {
|
||||
// TODO: 跟其他串口通信助手一起测试一下编解码的问题
|
||||
data = encoder.encode(data)
|
||||
}
|
||||
|
||||
await writer.value.write(data);
|
||||
},
|
||||
|
||||
addEventListener (eventName: string, callback: Function) {
|
||||
if (!(eventName in eventListeners)) {
|
||||
eventListeners[eventName] = []
|
||||
}
|
||||
|
||||
eventListeners[eventName].push(callback)
|
||||
},
|
||||
|
||||
removeEventListener (eventName: string, callback: Function) {
|
||||
if (!(eventName in eventListeners)) return
|
||||
|
||||
const index = eventListeners[eventName].indexOf(callback)
|
||||
if (index < 0) return
|
||||
|
||||
eventListeners[eventName].splice(index, 1)
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
const eventListeners = {}
|
||||
export enum SerialPortEventType {
|
||||
beforeOpen,
|
||||
afterOpen,
|
||||
beforeClose,
|
||||
afterClose,
|
||||
data
|
||||
}
|
||||
Reference in New Issue
Block a user