diff --git a/src/components/PinPuYi/CONST.ts b/src/components/PinPuYi/CONST.ts index cd8298e..fb95e12 100644 --- a/src/components/PinPuYi/CONST.ts +++ b/src/components/PinPuYi/CONST.ts @@ -2,6 +2,20 @@ export enum E_选项卡菜单 { 频率单位列表 = '频率单位列表', 频率菜单列表 = '频率菜单列表', 跨度菜单列表 = '跨度菜单列表', + 幅度菜单列表 = '幅度菜单列表', + 幅度单位列表 = '幅度单位列表', +} + +export enum E_幅度菜单列表的项目 { + RefLevel = 'Ref Level', + // Attenuation = 'Attenuation', // 如果衰减也需要类似交互,则取消注释 +} + +export enum E_幅度单位 { + dBm = 'dBm', + mV = 'mV', + uV = 'µV', // 使用 uV 表示微伏 + uA = 'µA', // 使用 uA 表示微安 } export enum E_跨度菜单列表的项目 { diff --git a/src/components/PinPuYi/PinPuYi.vue b/src/components/PinPuYi/PinPuYi.vue index 3b7338e..42f46a0 100644 --- a/src/components/PinPuYi/PinPuYi.vue +++ b/src/components/PinPuYi/PinPuYi.vue @@ -4,6 +4,8 @@ import { $enum } from 'ts-enum-util'; import { E_Freq单位, + E_幅度单位, + E_幅度菜单列表的项目, E_数字键盘按键, E_跨度菜单列表的项目, E_选项卡菜单, @@ -18,6 +20,15 @@ const state = reactive({ 选中的频率菜单列表的项目: null as E_选项卡菜单Freq菜单列表的项目 | null, 输入的值临时输入字符串: null as null | string, // 用于暂存用户输入 }, + 幅度输入状态: { + 选中的幅度菜单列表的项目: null as E_幅度菜单列表的项目 | null, + 输入的值临时输入字符串: null as null | string, // 用于暂存用户输入 + refLevel: { + value: 0, + unit: E_幅度单位.dBm, + }, + // attenuation: { value: 0, unit: E_幅度单位.dB }, // 如果需要衰减值 + }, center: { value: 0, unit: E_Freq单位.Hz, @@ -56,180 +67,261 @@ const 选项卡标题 = computed(() => [E_选项卡菜单.频率菜单列表]: 'Freq/Channel', [E_选项卡菜单.频率单位列表]: '', [E_选项卡菜单.跨度菜单列表]: 'Span', + [E_选项卡菜单.幅度菜单列表]: 'Amplitude', + [E_选项卡菜单.幅度单位列表]: '', }), ); function 执行点击屏幕右边的按钮(按钮序号: number) { - console.group('🔘 点击屏幕右边的按钮', { 按钮序号 }); - if (state.选项卡当前显示 === E_选项卡菜单.频率菜单列表) { - switch (按钮序号) { - case 1: { - state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目 = E_选项卡菜单Freq菜单列表的项目.CenterFreq; - console.debug('设置 Freq 输入状态为 CenterFreq'); - break; + console.group('🔘 点击屏幕右边的按钮', { 按钮序号, 选项卡当前显示: state.选项卡当前显示 }); + $enum.visitValue(state.选项卡当前显示).with({ + [E_选项卡菜单.频率菜单列表]: () => { + switch (按钮序号) { + case 1: { + state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目 = E_选项卡菜单Freq菜单列表的项目.CenterFreq; + console.debug('设置 Freq 输入状态为 CenterFreq'); + break; + } + case 2: { + state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目 = E_选项卡菜单Freq菜单列表的项目.StartFreq; + console.debug('设置 Freq 输入状态为 StartFreq'); + break; + } + case 3: { + state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目 = E_选项卡菜单Freq菜单列表的项目.StopFreq; + console.debug('设置 Freq 输入状态为 StopFreq'); + break; + } + default: { + console.debug('频率菜单列表 - 这个按键还没有实现'); + break; + } } - case 2: { - state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目 = E_选项卡菜单Freq菜单列表的项目.StartFreq; - console.debug('设置 Freq 输入状态为 StartFreq'); - break; + }, + [E_选项卡菜单.频率单位列表]: () => { + let selectedUnit: E_Freq单位 | null = null; + switch (按钮序号) { + case 1: { + selectedUnit = E_Freq单位.GHz; + break; + } + case 2: { + selectedUnit = E_Freq单位.MHz; + break; + } + case 3: { + selectedUnit = E_Freq单位.kHz; + break; + } + case 4: { + selectedUnit = E_Freq单位.Hz; + break; + } + default: { + console.warn('无效的频率单位按钮序号:', 按钮序号); + console.groupEnd(); + return; + } } - case 3: { - state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目 = E_选项卡菜单Freq菜单列表的项目.StopFreq; - console.debug('设置 Freq 输入状态为 StopFreq'); - break; - } - default: { - console.debug('这个按键还没有实现'); - break; - } - } - } - if (state.选项卡当前显示 === E_选项卡菜单.频率单位列表) { - let selectedUnit: E_Freq单位 | null = null; - switch (按钮序号) { - case 1: { - selectedUnit = E_Freq单位.GHz; - break; - } - case 2: { - selectedUnit = E_Freq单位.MHz; - break; - } - case 3: { - selectedUnit = E_Freq单位.kHz; - break; - } - case 4: { - selectedUnit = E_Freq单位.Hz; - break; - } - default: { - console.warn('无效的单位按钮序号:', 按钮序号); + const tempInputString = state.频谱仪状态.频率输入状态.输入的值临时输入字符串; + const selectedFreqItem = state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目; + // 必须有临时输入值和选中的 Freq 项目才能确认 + if (!tempInputString || !selectedFreqItem) { + console.warn('频率输入未完成或未选择项目,无法确认单位。'); console.groupEnd(); return; - } // 不处理无效按钮 (5, 6, 7) - } - - const tempInputString = state.频谱仪状态.频率输入状态.输入的值临时输入字符串; - const selectedFreqItem = state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目; - - // 必须有临时输入值和选中的 Freq 项目才能确认 - if (!tempInputString || !selectedFreqItem) { - console.warn('输入未完成或未选择 Freq 项目,无法确认单位。', { - tempInputString, - selectedFreqItem, - }); - console.groupEnd(); - return; - } - - const inputValue = Number.parseFloat(tempInputString); - - // 校验解析结果 - if (Number.isNaN(inputValue)) { - console.warn('无法将临时输入解析为有效数字:', tempInputString); - // 暂时不清除临时输入,允许用户修正或重新选择单位 - console.groupEnd(); - return; - } - - console.debug('确认单位:', selectedUnit, '值为:', inputValue); - - // 根据选中的 Freq 项目更新对应的状态 - switch (selectedFreqItem) { - case E_选项卡菜单Freq菜单列表的项目.CenterFreq: { - state.频谱仪状态.center.value = inputValue; - state.频谱仪状态.center.unit = selectedUnit; - console.debug('更新 CenterFreq:', state.频谱仪状态.center); - break; } - case E_选项卡菜单Freq菜单列表的项目.StartFreq: { - state.频谱仪状态.start.value = inputValue; - state.频谱仪状态.start.unit = selectedUnit; - console.debug('更新 StartFreq:', state.频谱仪状态.start); - break; - } - case E_选项卡菜单Freq菜单列表的项目.StopFreq: { - state.频谱仪状态.stop.value = inputValue; - state.频谱仪状态.stop.unit = selectedUnit; - console.debug('更新 StopFreq:', state.频谱仪状态.stop); - break; - } - } - // 重置整个输入状态,为下一次输入做准备 - state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目 = null; - state.频谱仪状态.频率输入状态.输入的值临时输入字符串 = null; - console.debug('输入状态已重置'); + const inputValue = Number.parseFloat(tempInputString); + // 校验解析结果 + if (Number.isNaN(inputValue)) { + console.warn('无法将临时输入解析为有效数字 (频率):', tempInputString); + console.groupEnd(); + return; + } - // 操作完成,切换回 Freq 菜单列表 - state.选项卡当前显示 = E_选项卡菜单.频率菜单列表; - console.debug('切换回 Freq 菜单列表'); - } - if (state.选项卡当前显示 === E_选项卡菜单.跨度菜单列表) { - switch (按钮序号) { - case 1: { - // Full Span - state.频谱仪状态.span.lastSpan.start = state.频谱仪状态.start.value; - state.频谱仪状态.span.lastSpan.stop = state.频谱仪状态.stop.value; - state.频谱仪状态.span.lastSpan.unit = state.频谱仪状态.stop.unit; - state.频谱仪状态.start.value = state.频谱仪状态.span.fullSpan.start; - state.频谱仪状态.start.unit = state.频谱仪状态.span.fullSpan.unit; - state.频谱仪状态.stop.value = state.频谱仪状态.span.fullSpan.stop; - state.频谱仪状态.stop.unit = state.频谱仪状态.span.fullSpan.unit; - state.频谱仪状态.center.value = (state.频谱仪状态.start.value + state.频谱仪状态.stop.value) / 2; - state.频谱仪状态.center.unit = state.频谱仪状态.span.fullSpan.unit; - state.频谱仪状态.span.zeroSpan = false; - console.debug('设置为 Full Span'); - break; + console.debug('确认频率单位:', selectedUnit, '值为:', inputValue); + switch (selectedFreqItem) { + case E_选项卡菜单Freq菜单列表的项目.CenterFreq: { + state.频谱仪状态.center.value = inputValue; + state.频谱仪状态.center.unit = selectedUnit; + console.debug('更新 CenterFreq:', state.频谱仪状态.center); + break; + } + case E_选项卡菜单Freq菜单列表的项目.StartFreq: { + state.频谱仪状态.start.value = inputValue; + state.频谱仪状态.start.unit = selectedUnit; + console.debug('更新 StartFreq:', state.频谱仪状态.start); + break; + } + case E_选项卡菜单Freq菜单列表的项目.StopFreq: { + state.频谱仪状态.stop.value = inputValue; + state.频谱仪状态.stop.unit = selectedUnit; + console.debug('更新 StopFreq:', state.频谱仪状态.stop); + break; + } } - case 2: { - // Zero Span - state.频谱仪状态.span.lastSpan.start = state.频谱仪状态.start.value; - state.频谱仪状态.span.lastSpan.stop = state.频谱仪状态.stop.value; - state.频谱仪状态.span.lastSpan.unit = state.频谱仪状态.stop.unit; - state.频谱仪状态.start.value = state.频谱仪状态.center.value; - state.频谱仪状态.start.unit = state.频谱仪状态.center.unit; - state.频谱仪状态.stop.value = state.频谱仪状态.center.value; - state.频谱仪状态.stop.unit = state.频谱仪状态.center.unit; - state.频谱仪状态.span.zeroSpan = true; - console.debug('设置为 Zero Span'); - break; + state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目 = null; + state.频谱仪状态.频率输入状态.输入的值临时输入字符串 = null; + state.选项卡当前显示 = E_选项卡菜单.频率菜单列表; + console.debug('频率输入状态已重置, 切换回频率菜单列表'); + }, + [E_选项卡菜单.跨度菜单列表]: () => { + switch (按钮序号) { + case 1: { + // Full Span + state.频谱仪状态.span.lastSpan.start = state.频谱仪状态.start.value; + state.频谱仪状态.span.lastSpan.stop = state.频谱仪状态.stop.value; + state.频谱仪状态.span.lastSpan.unit = state.频谱仪状态.stop.unit; + state.频谱仪状态.start.value = state.频谱仪状态.span.fullSpan.start; + state.频谱仪状态.start.unit = state.频谱仪状态.span.fullSpan.unit; + state.频谱仪状态.stop.value = state.频谱仪状态.span.fullSpan.stop; + state.频谱仪状态.stop.unit = state.频谱仪状态.span.fullSpan.unit; + state.频谱仪状态.center.value = (state.频谱仪状态.start.value + state.频谱仪状态.stop.value) / 2; + state.频谱仪状态.center.unit = state.频谱仪状态.span.fullSpan.unit; + state.频谱仪状态.span.zeroSpan = false; + console.debug('设置为 Full Span'); + break; + } + case 2: { + // Zero Span + state.频谱仪状态.span.lastSpan.start = state.频谱仪状态.start.value; + state.频谱仪状态.span.lastSpan.stop = state.频谱仪状态.stop.value; + state.频谱仪状态.span.lastSpan.unit = state.频谱仪状态.stop.unit; + state.频谱仪状态.start.value = state.频谱仪状态.center.value; + state.频谱仪状态.start.unit = state.频谱仪状态.center.unit; + state.频谱仪状态.stop.value = state.频谱仪状态.center.value; + state.频谱仪状态.stop.unit = state.频谱仪状态.center.unit; + state.频谱仪状态.span.zeroSpan = true; + console.debug('设置为 Zero Span'); + break; + } + case 3: { + // Last Span + state.频谱仪状态.start.value = state.频谱仪状态.span.lastSpan.start; + state.频谱仪状态.start.unit = state.频谱仪状态.span.lastSpan.unit; + state.频谱仪状态.stop.value = state.频谱仪状态.span.lastSpan.stop; + state.频谱仪状态.stop.unit = state.频谱仪状态.span.lastSpan.unit; + state.频谱仪状态.center.value = (state.频谱仪状态.start.value + state.频谱仪状态.stop.value) / 2; + state.频谱仪状态.center.unit = state.频谱仪状态.span.lastSpan.unit; + state.频谱仪状态.span.zeroSpan = false; + console.debug('恢复到 Last Span'); + break; + } + default: { + console.debug('跨度菜单列表 - 这个按键还没有实现'); + break; + } } - case 3: { - // Last Span - state.频谱仪状态.start.value = state.频谱仪状态.span.lastSpan.start; - state.频谱仪状态.start.unit = state.频谱仪状态.span.lastSpan.unit; - state.频谱仪状态.stop.value = state.频谱仪状态.span.lastSpan.stop; - state.频谱仪状态.stop.unit = state.频谱仪状态.span.lastSpan.unit; - state.频谱仪状态.center.value = (state.频谱仪状态.start.value + state.频谱仪状态.stop.value) / 2; - state.频谱仪状态.center.unit = state.频谱仪状态.span.lastSpan.unit; - state.频谱仪状态.span.zeroSpan = false; - console.debug('恢复到 Last Span'); - break; + }, + [E_选项卡菜单.幅度菜单列表]: () => { + switch (按钮序号) { + case 1: { + // Ref Level + state.频谱仪状态.幅度输入状态.选中的幅度菜单列表的项目 = E_幅度菜单列表的项目.RefLevel; + state.频谱仪状态.幅度输入状态.输入的值临时输入字符串 = null; + console.debug('设置 幅度输入状态为 RefLevel'); + break; + } + case 2: { + // Attenuation + console.debug('点击了 幅度菜单列表 - Attenuation (功能待实现)'); + break; + } + default: { + console.debug('幅度菜单列表 - 这个按键还没有实现'); + break; + } } - default: { - console.debug('这个按键还没有实现'); - break; + }, + [E_选项卡菜单.幅度单位列表]: () => { + let selectedUnit: E_幅度单位 | null = null; + switch (按钮序号) { + case 1: { + selectedUnit = E_幅度单位.dBm; + break; + } + case 2: { + selectedUnit = E_幅度单位.mV; + break; + } + case 3: { + selectedUnit = E_幅度单位.uV; + break; + } + case 4: { + selectedUnit = E_幅度单位.uA; + break; + } + default: { + console.warn('无效的幅度单位按钮序号:', 按钮序号); + console.groupEnd(); + return; + } } - } - } + + const tempInputString = state.频谱仪状态.幅度输入状态.输入的值临时输入字符串; + const selectedAmpItem = state.频谱仪状态.幅度输入状态.选中的幅度菜单列表的项目; + + if (!tempInputString || !selectedAmpItem) { + console.warn('幅度输入未完成或未选择项目,无法确认单位。'); + console.groupEnd(); + return; + } + + const inputValue = Number.parseFloat(tempInputString); + if (Number.isNaN(inputValue)) { + console.warn('无法将临时输入解析为有效数字 (幅度):', tempInputString); + console.groupEnd(); + return; + } + + console.debug('确认幅度单位:', selectedUnit, '值为:', inputValue); + if (selectedAmpItem === E_幅度菜单列表的项目.RefLevel) { + state.频谱仪状态.幅度输入状态.refLevel.value = inputValue; + state.频谱仪状态.幅度输入状态.refLevel.unit = selectedUnit; + console.debug('更新 RefLevel:', state.频谱仪状态.幅度输入状态.refLevel); + } + state.频谱仪状态.幅度输入状态.选中的幅度菜单列表的项目 = null; + state.频谱仪状态.幅度输入状态.输入的值临时输入字符串 = null; + state.选项卡当前显示 = E_选项卡菜单.幅度菜单列表; + console.debug('幅度输入状态已重置, 切换回幅度菜单列表'); + }, + }); console.groupEnd(); } function 执行点击数字按钮(按钮值: E_数字键盘按键) { console.group('🔢 点击数字按钮', { 按钮值 }); - // 检查是否已选择 Freq 菜单项 - if (!state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目) { - console.warn('请先选择一个 Freq 菜单项 (Center, Start, Stop)'); + const isFreqInputActive = !!state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目; + const isAmpInputActive = !!state.频谱仪状态.幅度输入状态.选中的幅度菜单列表的项目; + + if (!isFreqInputActive && !isAmpInputActive) { + console.warn('请先选择一个频率或幅度菜单项'); console.groupEnd(); return; } - // 使用 临时输入字符串,如果为 null 则视为空字符串 - const 当前临时输入 = state.频谱仪状态.频率输入状态.输入的值临时输入字符串 ?? ''; + let 当前临时输入: string; + let 更新临时输入回调: (newVal: string | null) => void; + let 后续操作菜单: E_选项卡菜单; + + if (isFreqInputActive) { + 当前临时输入 = state.频谱仪状态.频率输入状态.输入的值临时输入字符串 ?? ''; + 更新临时输入回调 = (newVal) => { + state.频谱仪状态.频率输入状态.输入的值临时输入字符串 = newVal; + }; + 后续操作菜单 = E_选项卡菜单.频率单位列表; + } else { + // isAmpInputActive + 当前临时输入 = state.频谱仪状态.幅度输入状态.输入的值临时输入字符串 ?? ''; + 更新临时输入回调 = (newVal) => { + state.频谱仪状态.幅度输入状态.输入的值临时输入字符串 = newVal; + }; + 后续操作菜单 = E_选项卡菜单.幅度单位列表; + } switch (按钮值) { case E_数字键盘按键.Dot: { @@ -238,8 +330,13 @@ function 执行点击数字按钮(按钮值: E_数字键盘按键) { console.debug('已存在小数点,忽略本次输入'); } else { // 如果当前为空,则为 '0.',否则追加 '.' - state.频谱仪状态.频率输入状态.输入的值临时输入字符串 = 当前临时输入 ? `${当前临时输入}.` : '0.'; - console.debug('输入小数点,临时字符串:', state.频谱仪状态.频率输入状态.输入的值临时输入字符串); + 更新临时输入回调(当前临时输入 ? `${当前临时输入}.` : '0.'); + console.debug( + '输入小数点,临时字符串:', + isFreqInputActive + ? state.频谱仪状态.频率输入状态.输入的值临时输入字符串 + : state.频谱仪状态.幅度输入状态.输入的值临时输入字符串, + ); } break; } @@ -254,42 +351,44 @@ function 执行点击数字按钮(按钮值: E_数字键盘按键) { case E_数字键盘按键.Num7: case E_数字键盘按键.Num8: case E_数字键盘按键.Num9: { - // 直接拼接数字到临时字符串 - // 特殊处理:如果当前是 '0',则替换为新数字;如果是 '-0',则替换为 '-'+新数字 if (当前临时输入 === '0') { - state.频谱仪状态.频率输入状态.输入的值临时输入字符串 = String(按钮值); + 更新临时输入回调(String(按钮值)); } else if (当前临时输入 === '-0') { - state.频谱仪状态.频率输入状态.输入的值临时输入字符串 = `-${String(按钮值)}`; + 更新临时输入回调(`-${String(按钮值)}`); } else { - state.频谱仪状态.频率输入状态.输入的值临时输入字符串 = 当前临时输入 + String(按钮值); + 更新临时输入回调(当前临时输入 + String(按钮值)); } - console.debug('输入数字,临时字符串:', state.频谱仪状态.频率输入状态.输入的值临时输入字符串); + console.debug( + '输入数字,临时字符串:', + isFreqInputActive + ? state.频谱仪状态.频率输入状态.输入的值临时输入字符串 + : state.频谱仪状态.幅度输入状态.输入的值临时输入字符串, + ); break; } case E_数字键盘按键.PlusMinus: { - // +/- 逻辑操作临时字符串 if (当前临时输入.startsWith('-')) { - // 如果已经是负数,移除负号 - state.频谱仪状态.频率输入状态.输入的值临时输入字符串 = 当前临时输入.slice(1); + 更新临时输入回调(当前临时输入.slice(1)); } else if (当前临时输入 && 当前临时输入 !== '0' && 当前临时输入 !== '0.') { - // 如果是正数且不为0或0.,添加负号 - state.频谱仪状态.频率输入状态.输入的值临时输入字符串 = `-${当前临时输入}`; + 更新临时输入回调(`-${当前临时输入}`); } else if (当前临时输入 === '' || 当前临时输入 === '0' || 当前临时输入 === '0.') { - // 如果是空或0或0.,变成负号开头 - state.频谱仪状态.频率输入状态.输入的值临时输入字符串 = '-'; + 更新临时输入回调('-'); } else { - // 其他情况(例如只有一个'-')不允许切换 console.debug('无法切换正负号'); } - console.debug('切换正负号,临时字符串:', state.频谱仪状态.频率输入状态.输入的值临时输入字符串); + console.debug( + '切换正负号,临时字符串:', + isFreqInputActive + ? state.频谱仪状态.频率输入状态.输入的值临时输入字符串 + : state.频谱仪状态.幅度输入状态.输入的值临时输入字符串, + ); break; } default: { - // 处理未预期的按钮值(理论上不应发生) console.warn('未知的数字键盘按键:', 按钮值); } } - state.选项卡当前显示 = E_选项卡菜单.频率单位列表; + state.选项卡当前显示 = 后续操作菜单; console.groupEnd(); } @@ -351,7 +450,14 @@ watchEffect(() => {
频谱仪屏幕 - + + +
+ + Ref {{ state.频谱仪状态.幅度输入状态.refLevel.value }} {{ state.频谱仪状态.幅度输入状态.refLevel.unit }} + +
+
Start @@ -366,24 +472,46 @@ watchEffect(() => {
- -
{{ state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目 }}
+ +
+ {{ state.频谱仪状态.频率输入状态.选中的频率菜单列表的项目 }} +
+
+ {{ state.频谱仪状态.幅度输入状态.选中的幅度菜单列表的项目 }} +
+ +
-