Files
cnc_wams/wasm-port/runtime/ui/ini-panel/control-page-controller.js

95 lines
2.0 KiB
JavaScript

import {
refreshMachineSessionControlPage,
} from "./control-page-refresh-workflow.js";
import {
loadMachineSessionForControlPageWorkflow,
} from "./control-page-session-workflow.js";
export function createMachineSessionControlPageController({
panelFrame,
statusNode,
viewNode,
renderControlView,
pollMs = 200,
setIntervalFn = globalThis.setInterval,
} = {}) {
if (!panelFrame) {
throw new Error("A panel iframe is required.");
}
if (!statusNode) {
throw new Error("A control page status node is required.");
}
if (!viewNode) {
throw new Error("A control page view node is required.");
}
if (typeof renderControlView !== "function") {
throw new Error("A control view renderer is required.");
}
let refreshTimer = null;
function getPanelWindow() {
return panelFrame.contentWindow ?? null;
}
function getPanelApi() {
return getPanelWindow()?.linuxCncIniPanelApi ?? null;
}
function getControlView() {
return getPanelApi()?.getMachineSessionControlView?.() ?? null;
}
function render() {
return refresh().renderResult;
}
function refresh() {
return refreshMachineSessionControlPage({
getControlView,
statusNode,
viewNode,
renderControlView,
});
}
function loadSessionState() {
return loadMachineSessionForControlPageWorkflow({
getPanelWindow,
getPanelApi,
getControlView,
});
}
function startPolling() {
if (!refreshTimer) {
refreshTimer = setIntervalFn(render, pollMs);
}
return refreshTimer;
}
function mount({ panelSrc = "./index.html" } = {}) {
panelFrame.addEventListener("load", () => {
render();
startPolling();
});
panelFrame.src = panelSrc;
render();
startPolling();
return controller;
}
const controller = {
getControlView,
getPanelApi,
getPanelWindow,
loadSessionState,
mount,
refresh,
render,
startPolling,
};
return controller;
}