// 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; }