init commit

This commit is contained in:
叶志超
2023-10-13 16:43:53 +08:00
parent c1fc36b44c
commit d184776cb3
275 changed files with 8305 additions and 0 deletions

View 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 }, // 星座图监控软件配套红盒子接收机
]

View 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
}