初步实现保存恢复功能
This commit is contained in:
parent
54f0c896a7
commit
57822b76b8
@ -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);
|
||||
});
|
||||
|
15
src/App.vue
15
src/App.vue
@ -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];
|
||||
|
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 { 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
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 {number} size
|
||||
* @property {string} type
|
||||
* @property {(TopModWireItem | WireItem)[]} body
|
||||
*/
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user