104 lines
3.4 KiB
TypeScript
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;
|
|
}
|