diff --git a/src/components/LogicAnalyzer/ChannelConfig.vue b/src/components/LogicAnalyzer/ChannelConfig.vue deleted file mode 100644 index 785f340..0000000 --- a/src/components/LogicAnalyzer/ChannelConfig.vue +++ /dev/null @@ -1,174 +0,0 @@ - - - diff --git a/src/components/LogicAnalyzer/LogicAnalyzerManager.ts b/src/components/LogicAnalyzer/LogicAnalyzerManager.ts index e69de29..4b0cacb 100644 --- a/src/components/LogicAnalyzer/LogicAnalyzerManager.ts +++ b/src/components/LogicAnalyzer/LogicAnalyzerManager.ts @@ -0,0 +1,224 @@ +import { createInjectionState } from "@vueuse/core"; +import { generateTestLogicData, type LogicDataType } from "."; +import { shallowRef, reactive, ref, computed } from "vue"; +import { + CaptureConfig, + LogicAnalyzerClient, + GlobalCaptureMode, + SignalOperator, + SignalValue, + type SignalTriggerConfig, +} from "@/APIClient"; +import { AuthManager } from "@/utils/AuthManager"; +import { useAlertStore } from "@/components/Alert"; + +// 通道接口定义 +export interface Channel { + enabled: boolean; + label: string; + color: string; +} + +// 全局模式选项 +const globalModes = [ + { + value: GlobalCaptureMode.AND, + label: "AND", + description: "所有条件都满足时触发", + }, + { + value: GlobalCaptureMode.OR, + label: "OR", + description: "任一条件满足时触发", + }, + { value: GlobalCaptureMode.NAND, label: "NAND", description: "AND的非" }, + { value: GlobalCaptureMode.NOR, label: "NOR", description: "OR的非" }, +]; + +// 操作符选项 +const operators = [ + { value: SignalOperator.Equal, label: "=" }, + { value: SignalOperator.NotEqual, label: "≠" }, + { value: SignalOperator.LessThan, label: "<" }, + { value: SignalOperator.LessThanOrEqual, label: "≤" }, + { value: SignalOperator.GreaterThan, label: ">" }, + { value: SignalOperator.GreaterThanOrEqual, label: "≥" }, +]; + +// 信号值选项 +const signalValues = [ + { value: SignalValue.Logic0, label: "0" }, + { value: SignalValue.Logic1, label: "1" }, + { value: SignalValue.NotCare, label: "X" }, + { value: SignalValue.Rise, label: "↑" }, + { value: SignalValue.Fall, label: "↓" }, + { value: SignalValue.RiseOrFall, label: "↕" }, + { value: SignalValue.NoChange, label: "—" }, + { value: SignalValue.SomeNumber, label: "#" }, +]; + +// 默认颜色数组 +const defaultColors = [ + "#FF5733", + "#33FF57", + "#3357FF", + "#FF33F5", + "#F5FF33", + "#33FFF5", + "#FF8C33", + "#8C33FF", +]; + +const [useProvideLogicAnalyzer, useLogicAnalyzerState] = createInjectionState( + () => { + const logicData = shallowRef(); + const alert = useAlertStore(); + + // 触发设置相关状态 + const currentGlobalMode = ref(GlobalCaptureMode.AND); + const isApplying = ref(false); + + // 通道配置 + const channels = reactive( + Array.from({ length: 8 }, (_, index) => ({ + enabled: false, + label: `CH${index}`, + color: defaultColors[index], + })), + ); + + // 8个信号通道的配置 + const signalConfigs = reactive( + Array.from({ length: 8 }, (_, index) => ({ + signalIndex: index, + operator: SignalOperator.Equal, + value: SignalValue.Logic1, + })), + ); + + // 计算启用的通道数量 + const enabledChannelCount = computed( + () => channels.filter((channel) => channel.enabled).length, + ); + + const enableAllChannels = () => { + channels.forEach((channel) => { + channel.enabled = true; + }); + }; + + const disableAllChannels = () => { + channels.forEach((channel) => { + channel.enabled = false; + }); + }; + + const setGlobalMode = async (mode: GlobalCaptureMode) => { + try { + const client = AuthManager.createAuthenticatedLogicAnalyzerClient(); + const success = await client.setGlobalTrigMode(mode); + + if (success) { + currentGlobalMode.value = mode; + alert?.success( + `全局触发模式已设置为 ${globalModes.find((m) => m.value === mode)?.label}`, + 3000, + ); + } else { + throw new Error("设置失败"); + } + } catch (error) { + console.error("设置全局触发模式失败:", error); + alert?.error("设置全局触发模式失败", 3000); + } + }; + + const applyConfiguration = async () => { + isApplying.value = true; + + try { + const client = AuthManager.createAuthenticatedLogicAnalyzerClient(); + + // 准备配置数据 - 只包含启用的通道 + const enabledSignals = signalConfigs.filter( + (signal, index) => channels[index].enabled, + ); + + const config = new CaptureConfig({ + globalMode: currentGlobalMode.value, + signalConfigs: enabledSignals.map( + (signal) => + ({ + signalIndex: signal.signalIndex, + operator: signal.operator, + value: signal.value, + }) as SignalTriggerConfig, + ), + }); + + // 发送配置 + const success = await client.configureCapture(config); + + if (success) { + const enabledChannelCount = channels.filter( + (ch) => ch.enabled, + ).length; + alert?.success( + `配置已成功应用,启用了 ${enabledChannelCount} 个通道和触发条件`, + 3000, + ); + } else { + throw new Error("应用配置失败"); + } + } catch (error) { + console.error("应用配置失败:", error); + alert?.error("应用配置失败,请检查设备连接", 3000); + } finally { + isApplying.value = false; + } + }; + + const resetConfiguration = () => { + currentGlobalMode.value = GlobalCaptureMode.AND; + + channels.forEach((channel, index) => { + channel.enabled = false; + channel.label = `CH${index}`; + channel.color = defaultColors[index]; + }); + + signalConfigs.forEach((signal) => { + signal.operator = SignalOperator.Equal; + signal.value = SignalValue.Logic1; + }); + + alert?.info("配置已重置", 2000); + }; + + return { + // 原有的逻辑数据 + logicData, + + // 触发设置状态 + currentGlobalMode, + isApplying, + channels, + signalConfigs, + enabledChannelCount, + + // 选项数据 + globalModes, + operators, + signalValues, + + // 触发设置方法 + enableAllChannels, + disableAllChannels, + setGlobalMode, + applyConfiguration, + resetConfiguration, + }; + }, +); + +export { useProvideLogicAnalyzer, useLogicAnalyzerState }; diff --git a/src/components/LogicAnalyzer/LogicalWaveFormDisplay.vue b/src/components/LogicAnalyzer/LogicalWaveFormDisplay.vue index ae2780e..ec5d176 100644 --- a/src/components/LogicAnalyzer/LogicalWaveFormDisplay.vue +++ b/src/components/LogicAnalyzer/LogicalWaveFormDisplay.vue @@ -1,17 +1,43 @@ @@ -19,7 +45,8 @@ diff --git a/src/components/LogicAnalyzer/TriggerSettings.vue b/src/components/LogicAnalyzer/TriggerSettings.vue index 7102045..48e6a83 100644 --- a/src/components/LogicAnalyzer/TriggerSettings.vue +++ b/src/components/LogicAnalyzer/TriggerSettings.vue @@ -1,266 +1,376 @@ diff --git a/src/components/LogicAnalyzer/index.ts b/src/components/LogicAnalyzer/index.ts index 8efbb07..c72ae2b 100644 --- a/src/components/LogicAnalyzer/index.ts +++ b/src/components/LogicAnalyzer/index.ts @@ -1,3 +1,4 @@ +import { exp } from "mathjs"; import LogicalWaveFormDisplay from "./LogicalWaveFormDisplay.vue"; type LogicDataType = { @@ -75,4 +76,4 @@ function generateTestLogicData(): LogicDataType { export { LogicalWaveFormDisplay, generateTestLogicData, type LogicDataType }; export { default as TriggerSettings } from './TriggerSettings.vue' -export { default as ChannelConfig } from './ChannelConfig.vue' \ No newline at end of file +export { useProvideLogicAnalyzer , useLogicAnalyzerState } from './LogicAnalyzerManager.ts' \ No newline at end of file diff --git a/src/views/Project/LogicAnalyzer.vue b/src/views/Project/LogicAnalyzer.vue index 28d6b9b..3173cfc 100644 --- a/src/views/Project/LogicAnalyzer.vue +++ b/src/views/Project/LogicAnalyzer.vue @@ -1,18 +1,25 @@