feat: 完成逻辑分析仪前端设计

This commit is contained in:
2025-07-15 18:30:18 +08:00
parent b139542c4c
commit 9f25391540
6 changed files with 690 additions and 484 deletions

View File

@@ -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<LogicDataType>();
const alert = useAlertStore();
// 触发设置相关状态
const currentGlobalMode = ref<GlobalCaptureMode>(GlobalCaptureMode.AND);
const isApplying = ref(false);
// 通道配置
const channels = reactive<Channel[]>(
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 };