diff --git a/server/src/Controllers/LogicAnalyzerController.cs b/server/src/Controllers/LogicAnalyzerController.cs index f943700..f3c7343 100644 --- a/server/src/Controllers/LogicAnalyzerController.cs +++ b/server/src/Controllers/LogicAnalyzerController.cs @@ -259,7 +259,8 @@ public class LogicAnalyzerController : ControllerBase { try { - if (capture_length < 0 || capture_length > 2048*32) + //DDR深度为 32'h01000000 - 32'h0FFFFFFF + if (capture_length < 0 || capture_length > 0x10000000 - 0x01000000) return BadRequest("采样深度设置错误"); if (pre_capture_length < 0 || pre_capture_length >= capture_length) return BadRequest("预采样深度必须小于捕获深度"); diff --git a/server/src/Peripherals/LogicAnalyzerClient.cs b/server/src/Peripherals/LogicAnalyzerClient.cs index 5bb1693..799a57b 100644 --- a/server/src/Peripherals/LogicAnalyzerClient.cs +++ b/server/src/Peripherals/LogicAnalyzerClient.cs @@ -70,7 +70,7 @@ static class AnalyzerAddr public const UInt32 DMA1_START_WRITE_ADDR = DMA1_BASE + 0x0000_0012; public const UInt32 DMA1_END_WRITE_ADDR = DMA1_BASE + 0x0000_0013; public const UInt32 DMA1_CAPTURE_CTRL_ADDR = DMA1_BASE + 0x0000_0014; - public const UInt32 STORE_OFFSET_ADDR = DDR_BASE + 0x0010_0000; + public const UInt32 STORE_OFFSET_ADDR = DDR_BASE + 0x0100_0000; /// /// 0x0100_0000 - 0x0100_03FF 只读 32位波形存储,得到的32位数据中低八位最先捕获,高八位最后捕获。
diff --git a/src/components/LogicAnalyzer/LogicAnalyzerManager.ts b/src/components/LogicAnalyzer/LogicAnalyzerManager.ts index 1a18a99..baec10d 100644 --- a/src/components/LogicAnalyzer/LogicAnalyzerManager.ts +++ b/src/components/LogicAnalyzer/LogicAnalyzerManager.ts @@ -76,28 +76,12 @@ const channelDivOptions = [ { value: 32, label: "32通道", description: "启用32个通道 (CH0-CH31)" }, ]; -// 捕获深度选项 -const captureLengthOptions = [ - { value: 256, label: "256" }, - { value: 512, label: "512" }, - { value: 1024, label: "1K" }, - { value: 2048, label: "2K" }, - { value: 4096, label: "4K" }, - { value: 8192, label: "8K" }, - { value: 16384, label: "16K" }, - { value: 32768, label: "32K" }, -]; +// 捕获深度限制常量 +const CAPTURE_LENGTH_MIN = 1024; // 最小捕获深度 1024 +const CAPTURE_LENGTH_MAX = 0x10000000 - 0x01000000; // 最大捕获深度 -// 预捕获深度选项 -const preCaptureLengthOptions = [ - { value: 0, label: "0" }, - { value: 16, label: "16" }, - { value: 32, label: "32" }, - { value: 64, label: "64" }, - { value: 128, label: "128" }, - { value: 256, label: "256" }, - { value: 512, label: "512" }, -]; +// 预捕获深度限制常量 +const PRE_CAPTURE_LENGTH_MIN = 0; // 最小预捕获深度 0 // 默认颜色数组 const defaultColors = [ @@ -126,8 +110,8 @@ const [useProvideLogicAnalyzer, useLogicAnalyzerState] = createInjectionState( // 触发设置相关状态 const currentGlobalMode = ref(GlobalCaptureMode.AND); const currentChannelDiv = ref(8); // 默认启用8个通道 - const captureLength = ref(1024); // 捕获深度,默认1024 - const preCaptureLength = ref(0); // 预捕获深度,默认0 + const captureLength = ref(CAPTURE_LENGTH_MIN); // 捕获深度,默认为最小值 + const preCaptureLength = ref(PRE_CAPTURE_LENGTH_MIN); // 预捕获深度,默认0 const isApplying = ref(false); const isCapturing = ref(false); // 添加捕获状态标识 @@ -181,6 +165,64 @@ const [useProvideLogicAnalyzer, useLogicAnalyzerState] = createInjectionState( } }; + // 验证捕获深度 + const validateCaptureLength = (value: number): { valid: boolean; message?: string } => { + if (!Number.isInteger(value)) { + return { valid: false, message: "捕获深度必须是整数" }; + } + if (value < CAPTURE_LENGTH_MIN) { + return { valid: false, message: `捕获深度不能小于 ${CAPTURE_LENGTH_MIN}` }; + } + if (value > CAPTURE_LENGTH_MAX) { + return { valid: false, message: `捕获深度不能大于 ${CAPTURE_LENGTH_MAX.toLocaleString()}` }; + } + return { valid: true }; + }; + + // 验证预捕获深度 + const validatePreCaptureLength = (value: number, currentCaptureLength: number): { valid: boolean; message?: string } => { + if (!Number.isInteger(value)) { + return { valid: false, message: "预捕获深度必须是整数" }; + } + if (value < PRE_CAPTURE_LENGTH_MIN) { + return { valid: false, message: `预捕获深度不能小于 ${PRE_CAPTURE_LENGTH_MIN}` }; + } + if (value >= currentCaptureLength) { + return { valid: false, message: `预捕获深度不能大于等于捕获深度 (${currentCaptureLength})` }; + } + return { valid: true }; + }; + + // 设置捕获深度 + const setCaptureLength = (value: number) => { + const validation = validateCaptureLength(value); + if (!validation.valid) { + alert?.error(validation.message!, 3000); + return false; + } + + // 检查预捕获深度是否仍然有效 + if (preCaptureLength.value >= value) { + preCaptureLength.value = Math.max(0, value - 1); + alert?.warn(`预捕获深度已自动调整为 ${preCaptureLength.value}`, 3000); + } + + captureLength.value = value; + return true; + }; + + // 设置预捕获深度 + const setPreCaptureLength = (value: number) => { + const validation = validatePreCaptureLength(value, captureLength.value); + if (!validation.valid) { + alert?.error(validation.message!, 3000); + return false; + } + + preCaptureLength.value = value; + return true; + }; + // 设置通道组 const setChannelDiv = (channelCount: number) => { // 验证通道数量是否有效 @@ -717,8 +759,15 @@ const [useProvideLogicAnalyzer, useLogicAnalyzerState] = createInjectionState( operators, signalValues, channelDivOptions, // 导出通道组选项 - captureLengthOptions, // 导出捕获深度选项 - preCaptureLengthOptions, // 导出预捕获深度选项 + + // 捕获深度常量和验证 + CAPTURE_LENGTH_MIN, + CAPTURE_LENGTH_MAX, + PRE_CAPTURE_LENGTH_MIN, + validateCaptureLength, + validatePreCaptureLength, + setCaptureLength, + setPreCaptureLength, // 触发设置方法 setChannelDiv, // 导出设置通道组方法 diff --git a/src/components/LogicAnalyzer/TriggerSettings.vue b/src/components/LogicAnalyzer/TriggerSettings.vue index e2381f1..7f6b577 100644 --- a/src/components/LogicAnalyzer/TriggerSettings.vue +++ b/src/components/LogicAnalyzer/TriggerSettings.vue @@ -3,89 +3,182 @@
-
- -
-
-
@@ -177,6 +270,7 @@ diff --git a/src/views/Project/LogicAnalyzer.vue b/src/views/Project/LogicAnalyzer.vue index 91dd27f..5f3b868 100644 --- a/src/views/Project/LogicAnalyzer.vue +++ b/src/views/Project/LogicAnalyzer.vue @@ -61,13 +61,6 @@ 触发设置
- -
- {{ analyzer.enabledChannelCount.value }}/32 通道 - 捕获: {{ analyzer.captureLength.value }} - 预捕获: {{ analyzer.preCaptureLength.value }} - {{ analyzer.globalModes.find(m => m.value === analyzer.currentGlobalMode.value)?.label || '未知' }} -