Advance simulation parity and 3-axis tutorial coverage

This commit is contained in:
2026-08-23 18:00:56 +08:00
parent 4a11d9692b
commit 938654b19d
107 changed files with 13537 additions and 3565 deletions

View File

@@ -14,7 +14,7 @@ function expandHalVariables(value, variables = {}) {
});
}
export function parseHalLine(raw, line = 0, variables = {}) {
export function parseHalLine(raw, line = 0, variables = {}, { webEquivalentPrograms = [] } = {}) {
if (typeof raw !== "string") return { status: "blocked", code: "hal_line_invalid", line };
const clean = expandHalVariables(raw.split("#", 1)[0].trim(), variables);
if (!clean) return null;
@@ -31,7 +31,8 @@ export function parseHalLine(raw, line = 0, variables = {}) {
if (command === "loadusr") {
const program = tokens.find((token, index) => index > 0 && !token.startsWith("-")) ?? "";
const virtual = VIRTUAL_HAL_USER_COMPONENTS.includes(program);
return { schema: HAL_CONFIGURATION_SCHEMA, line, command, status: virtual ? "checked" : "blocked", code: virtual ? null : "hal_host_dynamic_loader", program, ...(virtual ? { capability: "SIM-ADAPTER" } : {}) };
const webEquivalent = webEquivalentPrograms.includes(program);
return { schema: HAL_CONFIGURATION_SCHEMA, line, command, status: virtual || webEquivalent ? "checked" : "blocked", code: virtual || webEquivalent ? null : "hal_host_dynamic_loader", program, ...((virtual || webEquivalent) ? { capability: webEquivalent ? "WEB-EQUIV" : "SIM-ADAPTER" } : {}) };
}
if (command === "addf") {
const thread = tokens[2] ?? "";
@@ -40,11 +41,11 @@ export function parseHalLine(raw, line = 0, variables = {}) {
return { schema: HAL_CONFIGURATION_SCHEMA, line, command, tokens: tokens.slice(1), status: "checked", code: null };
}
export function preflightHalConfiguration({ lines = [], manifest = [], variables = {} } = {}) {
export function preflightHalConfiguration({ lines = [], manifest = [], variables = {}, webEquivalentPrograms = [] } = {}) {
const declared = new Set((Array.isArray(manifest) ? manifest : []).map((row) => row?.component).filter(Boolean));
const records = [];
for (let index = 0; index < lines.length; index += 1) {
const parsed = parseHalLine(lines[index], index + 1, variables);
const parsed = parseHalLine(lines[index], index + 1, variables, { webEquivalentPrograms });
if (!parsed) continue;
if (parsed.command === "loadrt" && parsed.status === "declared" && !declared.has(parsed.module)) {
parsed.status = "blocked";