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

127 lines
3.9 KiB
TypeScript

// config.ts
export interface MqttBrokerConfig {
host: string;
port: number;
vdaInterface: string;
}
export interface VehicleConfig {
serialNumber: string;
channelName: string;
channelManufacturer: string;
manufacturer: string;
vdaVersion: string;
vdaFullVersion: string;
}
export interface Settings {
mapId: string;
stateFrequency: number;
visualizationFrequency: number;
actionTime: number;
robotCount: number;
speed: number;
}
export interface RawConfig {
mqttBroker: MqttBrokerConfig;
vehicle: VehicleConfig;
settings: Settings;
}
export async function loadConfig(): Promise<RawConfig> {
// 配置文件可能的路径列表
const configPaths = [
// 1. 当前工作目录
"./simulator_config.json",
// 2. 相对于模块的路径(开发环境)
new URL("./simulator_config.json", import.meta.url).pathname,
// 3. 可执行文件同目录
"./simulator_config.json",
// 4. 上级目录
"../simulator_config.json",
// 5. 用户主目录
`${Deno.env.get("HOME") || Deno.env.get("USERPROFILE")}/simulator_config.json`,
];
let configContent: string | null = null;
let usedPath: string = "";
// 尝试从多个路径加载配置文件
for (const configPath of configPaths) {
try {
console.log(`🔍 Trying to load config from: ${configPath}`);
configContent = await Deno.readTextFile(configPath);
usedPath = configPath;
console.log(`✅ Successfully loaded config from: ${configPath}`);
break;
} catch (error) {
console.log(`❌ Failed to load config from ${configPath}: ${(error as Error).message}`);
continue;
}
}
// 如果所有路径都失败,创建默认配置
if (!configContent) {
console.log("⚠️ No config file found, creating default configuration...");
const defaultConfig = {
mqtt_broker: {
host: "localhost",
port: "1883",
vda_interface: "uagv"
},
vehicle: {
serial_number: "AGV",
channel_name: "AGV_Channel",
channel_manufacturer: "Default",
manufacturer: "Default Manufacturer",
vda_version: "2.0.0",
vda_full_version: "2.0.0"
},
settings: {
map_id: "default_map",
state_frequency: 1000,
visualization_frequency: 1000,
action_time: 5000,
robot_count: 1,
speed: 1.0
}
};
// 尝试保存默认配置到当前目录
try {
const defaultConfigJson = JSON.stringify(defaultConfig, null, 2);
await Deno.writeTextFile("./simulator_config.json", defaultConfigJson);
console.log("📝 Created default config file: ./simulator_config.json");
configContent = defaultConfigJson;
usedPath = "./simulator_config.json";
} catch (error) {
console.log("⚠️ Could not save default config file, using in-memory configuration");
configContent = JSON.stringify(defaultConfig);
usedPath = "default (in-memory)";
}
}
console.log(`📋 Using configuration from: ${usedPath}`);
const raw = JSON.parse(configContent);
return {
mqttBroker: {
host: raw.mqtt_broker.host,
port: parseInt(raw.mqtt_broker.port, 10),
vdaInterface: raw.mqtt_broker.vda_interface,
},
vehicle: {
serialNumber: raw.vehicle.serial_number,
channelName: raw.vehicle.channel_name,
channelManufacturer: raw.vehicle.channel_manufacturer,
manufacturer: raw.vehicle.manufacturer,
vdaVersion: raw.vehicle.vda_version,
vdaFullVersion: raw.vehicle.vda_full_version,
},
settings: {
mapId: raw.settings.map_id,
stateFrequency: raw.settings.state_frequency,
visualizationFrequency: raw.settings.visualization_frequency,
actionTime: raw.settings.action_time,
robotCount: raw.settings.robot_count,
speed: raw.settings.speed,
},
};
}