初步实现保存恢复功能

This commit is contained in:
锦恢 2024-10-10 21:53:37 +08:00
parent 54f0c896a7
commit 57822b76b8
6 changed files with 80 additions and 9 deletions

View File

@ -17,13 +17,14 @@
<script>
window.readVcdFile = async () => {
const response = await fetch('test.vcd');
let inputFile = 'test.vcd';
const response = await fetch(inputFile);
const blob = await response.blob();
const reader = new FileReader();
return new Promise((resolve, reject) => {
reader.onload = event => {
const arrayBuffer = event.target.result;
resolve(arrayBuffer);
resolve([arrayBuffer, inputFile]);
};
reader.readAsArrayBuffer(blob);
});

View File

@ -28,6 +28,7 @@ import ToolBar from '@/components/toolbar';
import Sidebar from '@/components/sidebar';
import RightNav from '@/components/right-nav.vue';
import Pivot from '@/components/pivot';
import { recoverFromInputFile } from './hook/recover';
const { t } = useI18n();
@ -83,9 +84,14 @@ onMounted(async () => {
if (!localStorage.getItem('setting')) {
localStorage.setItem('setting', JSON.stringify(globalSetting));
}
// vcd
const arrayBuffer = await window.readVcdFile();
const [arrayBuffer, inputFile] = await window.readVcdFile();
// inputFile
await recoverFromInputFile(inputFile);
const url = await getCrossOriginWorkerURL(window.workerPath);
const worker = new Worker(url, {
name: 'vcd-stream',
@ -120,6 +126,11 @@ onMounted(async () => {
emitter.emit('meta-ready', null);
//
// recoverConfig
// treeview
//
if (VcdInfo.topModules.length > 0) {
const defaultMod = VcdInfo.topModules[0];

View File

@ -0,0 +1,4 @@
export const controller = {
lastSignal: undefined
};

View File

@ -26,6 +26,7 @@ import { useI18n } from 'vue-i18n';
import { emitter, globalLookup } from '@/hook/global';
import { makeIconClass } from '@/hook/utils';
import { WaveContainerView } from '@/hook/wave-container-view';
import { controller } from './signals';
defineComponent({ name: 'signals' });
@ -47,10 +48,6 @@ function makeSignalCaption(signal) {
return signal.size === 1 ? '' : `${signal.size - 1}:0`;
}
const controller = {
lastSignal: undefined
};
/**
* @description 用于点击波形后触发的逻辑如果波形已经在列表中则去除否则加入
* NOTE该函数需要同时操作所有的波形容器视图
@ -70,7 +67,7 @@ function toggleRender(event, signal) {
renderSignals.push(currentSignal);
}
}
for (const renderSignal of renderSignals) {
WaveContainerView.add(renderSignal);
controller.lastSignal = renderSignal;

57
src/hook/recover.js Normal file
View 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();
}

View File

@ -67,6 +67,7 @@
* @property {string} name
* @property {number} size
* @property {string} type
* @property {(TopModWireItem | WireItem)[]} body
*/
/**