fix: 修复jtag边界扫描前后端的bug:无法开始停止,无法通过认证,后端崩溃

This commit is contained in:
2025-08-02 13:10:44 +08:00
parent e5f2be616c
commit cb229c2a30
5 changed files with 110 additions and 45 deletions

View File

@@ -1,7 +1,7 @@
import { ref, reactive, watchPostEffect, onMounted, onUnmounted } from "vue";
import { defineStore } from "pinia";
import { useLocalStorage } from "@vueuse/core";
import { isString, toNumber, type Dictionary } from "lodash";
import { isString, toNumber, isUndefined, type Dictionary } from "lodash";
import z from "zod";
import { isNumber } from "mathjs";
import { Mutex, withTimeout } from "async-mutex";
@@ -9,8 +9,9 @@ import { useConstraintsStore } from "@/stores/constraints";
import { useDialogStore } from "./dialog";
import { toFileParameterOrUndefined } from "@/utils/Common";
import { AuthManager } from "@/utils/AuthManager";
import { HubConnectionBuilder } from "@microsoft/signalr";
import { HubConnection, HubConnectionBuilder } from "@microsoft/signalr";
import { getHubProxyFactory, getReceiverRegister } from "@/TypedSignalR.Client";
import type { IJtagHub } from "@/TypedSignalR.Client/server.Hubs.JtagHub";
export const useEquipments = defineStore("equipments", () => {
// Global Stores
@@ -28,22 +29,32 @@ export const useEquipments = defineStore("equipments", () => {
1000,
new Error("JtagClient Mutex Timeout!"),
);
const jtagHubConnection = new HubConnectionBuilder()
.withUrl("http://localhost:5000/hubs/JtagHub")
.withAutomaticReconnect()
.build();
const jtagHubProxy =
getHubProxyFactory("IJtagHub").createHubProxy(jtagHubConnection);
const jtagHubSubscription = getReceiverRegister("IJtagReceiver").register(
jtagHubConnection,
{
const jtagHubConnection = ref<HubConnection>();
const jtagHubProxy = ref<IJtagHub>();
onMounted(async () => {
// 每次挂载都重新创建连接
jtagHubConnection.value =
AuthManager.createAuthenticatedJtagHubConnection();
jtagHubProxy.value = getHubProxyFactory("IJtagHub").createHubProxy(
jtagHubConnection.value,
);
getReceiverRegister("IJtagReceiver").register(jtagHubConnection.value, {
onReceiveBoundaryScanData: async (msg) => {
constrainsts.batchSetConstraintStates(msg);
},
},
);
onMounted(() => {
});
await jtagHubConnection.value.start();
});
onUnmounted(() => {
// 断开连接,清理资源
if (jtagHubConnection.value) {
jtagHubConnection.value.stop();
jtagHubConnection.value = undefined;
jtagHubProxy.value = undefined;
}
});
// Matrix Key
@@ -87,13 +98,27 @@ export const useEquipments = defineStore("equipments", () => {
}
async function jtagBoundaryScanSetOnOff(enable: boolean) {
jtagHubConnection.start();
enableJtagBoundaryScan.value = enable;
if (enable) {
jtagHubProxy.startBoundaryScan(jtagBoundaryScanFreq.value);
} else {
jtagHubProxy.stopBoundaryScan();
if (isUndefined(jtagHubProxy.value)) {
console.error("JtagHub Not Initialize...");
return;
}
if (enable) {
const ret = await jtagHubProxy.value.startBoundaryScan(
jtagBoundaryScanFreq.value,
);
if (!ret) {
console.error("Failed to start boundary scan");
return;
}
} else {
const ret = await jtagHubProxy.value.stopBoundaryScan();
if (!ret) {
console.error("Failed to stop boundary scan");
return;
}
}
enableJtagBoundaryScan.value = enable;
}
async function jtagUploadBitstream(bitstream: File): Promise<boolean> {

View File

@@ -15,7 +15,10 @@ import {
DebuggerClient,
ExamClient,
} from "@/APIClient";
import router from "@/router";
import { HubConnectionBuilder } from "@microsoft/signalr";
import axios, { type AxiosInstance } from "axios";
import { isNull } from "lodash";
// 支持的客户端类型联合类型
type SupportedClient =
@@ -117,7 +120,7 @@ export class AuthManager {
if (!token) return null;
const instance = axios.create();
instance.interceptors.request.use(config => {
instance.interceptors.request.use((config) => {
config.headers = config.headers || {};
(config.headers as any)["Authorization"] = `Bearer ${token}`;
return config;
@@ -183,11 +186,11 @@ export class AuthManager {
public static createAuthenticatedNetConfigClient(): NetConfigClient {
return AuthManager.createAuthenticatedClient(NetConfigClient);
}
public static createAuthenticatedOscilloscopeApiClient(): OscilloscopeApiClient {
return AuthManager.createAuthenticatedClient(OscilloscopeApiClient);
}
public static createAuthenticatedDebuggerClient(): DebuggerClient {
return AuthManager.createAuthenticatedClient(DebuggerClient);
}
@@ -196,6 +199,21 @@ export class AuthManager {
return AuthManager.createAuthenticatedClient(ExamClient);
}
public static createAuthenticatedJtagHubConnection() {
const token = this.getToken();
if (isNull(token)) {
router.push("/login");
throw Error("Token Null!");
}
return new HubConnectionBuilder()
.withUrl("http://127.0.0.1:5000/hubs/JtagHub", {
accessTokenFactory: () => token,
})
.withAutomaticReconnect()
.build();
}
// 登录函数
public static async login(
username: string,