api-amr/agv_manager.ts
2025-06-04 19:15:02 +08:00

104 lines
3.4 KiB
TypeScript

// agv_manager.ts
// Module to setup and handle the AGV simulation Worker
import { reconnectAllWorker } from './master_manager.ts';
/**
* Sends the device list to the AGV worker.
*/
export async function updateAgvDeviceListFromConfig(worker: Worker) {
try {
const text = await Deno.readTextFile("./devices.json");
const devices = JSON.parse(text);
if (Array.isArray(devices)) {
worker.postMessage({ type: "deviceList", data: devices });
} else {
console.error("agv 配置文件格式错误,要求为数组格式");
}
} catch (error) {
console.error("agv 读取设备配置文件失败:", error);
}
}
export function initAgvWorker(agvWorker: Worker, config: any){
// Send initial init to the AGV worker
agvWorker.postMessage({ type: "init", data: { serverUrl: config.serverUrl } });
}
/**
* Sets up the AGV Worker, wiring message handlers and sending initial init.
* @param kv Deno KV instance for storing/retrieving AGV state
* @param serverUrl The gRPC server URL to send to the AGV worker
* @param masterWorker The master VDA 5050 Worker to forward AGV events to
* @returns The initialized AGV Worker
*/
export function setupAgvWorker(kv: Deno.Kv, config: any, masterWorker: Worker, agvWorker: Worker, web_worker: Worker, mappings: any, instanceId: string): Worker {
console.log("AGV 模拟器 Worker 已启动");
agvWorker.onmessage = async (event: MessageEvent) => {
const message = event.data;
switch (message.type) {
case "inited":
console.log("agv inited");
await updateAgvDeviceListFromConfig(agvWorker);
break;
case "requestKVDataOnline": {
const deviceKey = message.key;
const entry = await kv.get([deviceKey]);
const deviceStatus = entry.value || null;
agvWorker.postMessage({
type: "requestKVDataOnline",
requestId: message.requestId,
data: deviceStatus,
});
break;
}
case "requestKVData": {
const deviceKey = message.key;
const entry = await kv.get([deviceKey]);
const deviceStatus = entry.value || null;
agvWorker.postMessage({
type: "requestKVData",
requestId: message.requestId,
data: deviceStatus,
});
break;
}
case "orderForwarded":
masterWorker.postMessage({
type: "orderForwarded",
data: { agvId: message.agvId, order: message.data },
});
break;
case "instantActionsForwarded":
masterWorker.postMessage({
type: "instantActionsForwarded",
data: { agvId: message.agvId, actions: message.data },
});
break;
case "devicesStatus":
// console.log("收到 Worker devicesStatus 消息,准备更新设备状态",message);
break;
case "reconnect-all": {
console.log("agv 收到 Worker reconnect 消息,准备重连");
agvWorker.postMessage({
type: "shutdown"
});
setTimeout( () => {
agvWorker.terminate();
setTimeout( () => {
reconnectAllWorker(kv, web_worker, masterWorker, agvWorker, config, mappings, instanceId);
}, 2000);
}, 2000);
break;
}
default:
console.warn("未知消息类型 from agvWorker:", message);
}
};
return agvWorker;
}