初步实现保存恢复功能
This commit is contained in:
parent
54f0c896a7
commit
57822b76b8
@ -17,13 +17,14 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
window.readVcdFile = async () => {
|
window.readVcdFile = async () => {
|
||||||
const response = await fetch('test.vcd');
|
let inputFile = 'test.vcd';
|
||||||
|
const response = await fetch(inputFile);
|
||||||
const blob = await response.blob();
|
const blob = await response.blob();
|
||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
reader.onload = event => {
|
reader.onload = event => {
|
||||||
const arrayBuffer = event.target.result;
|
const arrayBuffer = event.target.result;
|
||||||
resolve(arrayBuffer);
|
resolve([arrayBuffer, inputFile]);
|
||||||
};
|
};
|
||||||
reader.readAsArrayBuffer(blob);
|
reader.readAsArrayBuffer(blob);
|
||||||
});
|
});
|
||||||
|
13
src/App.vue
13
src/App.vue
@ -28,6 +28,7 @@ import ToolBar from '@/components/toolbar';
|
|||||||
import Sidebar from '@/components/sidebar';
|
import Sidebar from '@/components/sidebar';
|
||||||
import RightNav from '@/components/right-nav.vue';
|
import RightNav from '@/components/right-nav.vue';
|
||||||
import Pivot from '@/components/pivot';
|
import Pivot from '@/components/pivot';
|
||||||
|
import { recoverFromInputFile } from './hook/recover';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@ -85,7 +86,12 @@ onMounted(async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 初始化载入 vcd 文件
|
// 初始化载入 vcd 文件
|
||||||
const arrayBuffer = await window.readVcdFile();
|
const [arrayBuffer, inputFile] = await window.readVcdFile();
|
||||||
|
|
||||||
|
// 寻找 inputFile 下同名的文件,载入配置中
|
||||||
|
await recoverFromInputFile(inputFile);
|
||||||
|
|
||||||
|
|
||||||
const url = await getCrossOriginWorkerURL(window.workerPath);
|
const url = await getCrossOriginWorkerURL(window.workerPath);
|
||||||
const worker = new Worker(url, {
|
const worker = new Worker(url, {
|
||||||
name: 'vcd-stream',
|
name: 'vcd-stream',
|
||||||
@ -120,6 +126,11 @@ onMounted(async () => {
|
|||||||
emitter.emit('meta-ready', null);
|
emitter.emit('meta-ready', null);
|
||||||
|
|
||||||
// 这一步时,已经加载完成
|
// 这一步时,已经加载完成
|
||||||
|
|
||||||
|
// 根据 recoverConfig 完成现场回复
|
||||||
|
|
||||||
|
|
||||||
|
// 初始化右侧的模型 treeview 面板
|
||||||
// 默认第一个模块被选中
|
// 默认第一个模块被选中
|
||||||
if (VcdInfo.topModules.length > 0) {
|
if (VcdInfo.topModules.length > 0) {
|
||||||
const defaultMod = VcdInfo.topModules[0];
|
const defaultMod = VcdInfo.topModules[0];
|
||||||
|
4
src/components/treeview/signals.js
Normal file
4
src/components/treeview/signals.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
export const controller = {
|
||||||
|
lastSignal: undefined
|
||||||
|
};
|
@ -26,6 +26,7 @@ import { useI18n } from 'vue-i18n';
|
|||||||
import { emitter, globalLookup } from '@/hook/global';
|
import { emitter, globalLookup } from '@/hook/global';
|
||||||
import { makeIconClass } from '@/hook/utils';
|
import { makeIconClass } from '@/hook/utils';
|
||||||
import { WaveContainerView } from '@/hook/wave-container-view';
|
import { WaveContainerView } from '@/hook/wave-container-view';
|
||||||
|
import { controller } from './signals';
|
||||||
|
|
||||||
defineComponent({ name: 'signals' });
|
defineComponent({ name: 'signals' });
|
||||||
|
|
||||||
@ -47,10 +48,6 @@ function makeSignalCaption(signal) {
|
|||||||
return signal.size === 1 ? '' : `${signal.size - 1}:0`;
|
return signal.size === 1 ? '' : `${signal.size - 1}:0`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const controller = {
|
|
||||||
lastSignal: undefined
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 用于点击波形后触发的逻辑,如果波形已经在列表中,则去除,否则,加入
|
* @description 用于点击波形后触发的逻辑,如果波形已经在列表中,则去除,否则,加入
|
||||||
* NOTE:该函数需要同时操作所有的波形容器视图
|
* NOTE:该函数需要同时操作所有的波形容器视图
|
||||||
|
57
src/hook/recover.js
Normal file
57
src/hook/recover.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import { controller } from "@/components/treeview/signals";
|
||||||
|
import { globalLookup } from "./global";
|
||||||
|
import { WaveContainerView } from "./wave-container-view";
|
||||||
|
|
||||||
|
export const recoverConfig = {
|
||||||
|
/**
|
||||||
|
* @type {Map<string, IRenderOption>}
|
||||||
|
*/
|
||||||
|
waves: new Map(),
|
||||||
|
};
|
||||||
|
|
||||||
|
async function findRecoverFile(recoverJsonPath) {
|
||||||
|
try {
|
||||||
|
const response = await fetch(recoverJsonPath);
|
||||||
|
if (!response.ok) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const recoverJson = await response.json();
|
||||||
|
return recoverJson;
|
||||||
|
} catch (error) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {string} inputFile 读取的 vcd 文件的路径
|
||||||
|
*/
|
||||||
|
export async function recoverFromInputFile(inputFile) {
|
||||||
|
const recoverJsonPath = inputFile + '.pkl';
|
||||||
|
const recoverJson = await findRecoverFile(recoverJsonPath);
|
||||||
|
if (recoverJson) {
|
||||||
|
const waves = recoverJson.waves;
|
||||||
|
if (waves instanceof Array && waves.length > 0) {
|
||||||
|
for (const wave of waves) {
|
||||||
|
const name = wave.name;
|
||||||
|
const option = wave.option;
|
||||||
|
if (name === undefined || option === undefined || recoverConfig.waves.has(name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
recoverConfig.waves.set(name, option);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 恢复现场的函数,主要恢复两个变量 currentWiresRenderView 和 currentSignalRenderOptions
|
||||||
|
* @param {TopModWireItem[]} topModules
|
||||||
|
*/
|
||||||
|
export function recoverSession(topModules) {
|
||||||
|
// 匹配前缀树
|
||||||
|
|
||||||
|
|
||||||
|
controller.lastSignal = undefined;
|
||||||
|
globalLookup.render();
|
||||||
|
}
|
@ -67,6 +67,7 @@
|
|||||||
* @property {string} name
|
* @property {string} name
|
||||||
* @property {number} size
|
* @property {number} size
|
||||||
* @property {string} type
|
* @property {string} type
|
||||||
|
* @property {(TopModWireItem | WireItem)[]} body
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user