feat: complete working8 pause semantics

This commit is contained in:
wangdequan
2026-07-07 10:27:02 -04:00
parent 83402c506e
commit 4ba45b2ec5
987 changed files with 340641 additions and 65 deletions

View File

@@ -171,6 +171,7 @@ const initialState = {
interpState: "idle",
interpResumeState: "idle",
taskPaused: false,
motionPaused: false,
manualPanel: "manual",
allHomed: false,
noForceHoming: false,
@@ -1762,6 +1763,7 @@ export function createSimulationStore(seed = {}) {
: state.machine.interpState || "reading",
interpState: "paused",
taskPaused: true,
motionPaused: true,
};
const pauseLock = createTaskHalPauseLock(state, "task-hal-plan-pause");
setState({
@@ -1794,6 +1796,7 @@ export function createSimulationStore(seed = {}) {
: state.machine.interpState,
interpState: "paused",
taskPaused: true,
motionPaused: true,
},
runState: "paused",
taskHalPauseLock: pauseLock,
@@ -1814,7 +1817,7 @@ export function createSimulationStore(seed = {}) {
setState({ operatorMessage: "pause blocked: task mode must be auto or MDI" });
break;
}
if (state.machine?.taskPaused === true || interpState === "paused" || state.runState === "paused") {
if (state.machine?.motionPaused === true || state.machine?.taskPaused === true || interpState === "paused" || state.runState === "paused") {
dispatch({ type: "RESUME", source: "pauseresume" });
break;
}
@@ -1843,6 +1846,7 @@ export function createSimulationStore(seed = {}) {
interpState: resumeState,
interpResumeState: resumeState,
taskPaused: false,
motionPaused: false,
};
setState({
machine: resumedMachine,
@@ -1875,6 +1879,7 @@ export function createSimulationStore(seed = {}) {
interpState: resumeState,
interpResumeState: resumeState,
taskPaused: false,
motionPaused: false,
},
runState: resumeState === "reading" ? "running" : "idle",
taskHalPauseLock: null,
@@ -1910,6 +1915,7 @@ export function createSimulationStore(seed = {}) {
: state.machine.interpState || "reading",
interpState: "paused",
taskPaused: true,
motionPaused: true,
};
setState({
machine: steppedMachine,
@@ -1953,6 +1959,7 @@ export function createSimulationStore(seed = {}) {
: state.machine.interpState,
interpState: "paused",
taskPaused: true,
motionPaused: true,
},
runState: "stepping",
taskHalPauseLock: null,
@@ -3791,7 +3798,17 @@ function applyTaskHalStatusPatch(state, status, operatorMessage, {
const allHomed = Boolean(preserveMachine?.allHomed ?? state.machine.allHomed);
const activeLine = state.programStartLine + Math.max(Number(ui.activeLine || 1) - 1, 0);
const kinsType = resolveTaskHalKinsType(state, status, activeLine);
const paused = Boolean(pauseLock) || interpState === "paused" || motion.paused === true;
const motionPaused = Boolean(pauseLock) ||
ui.motionPaused === true ||
motion.paused === true ||
preserveMachine?.motionPaused === true;
const taskPaused = ui.taskPaused === true || task.taskPaused === true || preserveMachine?.taskPaused === true;
const paused = Boolean(pauseLock) || interpState === "paused" || motionPaused || taskPaused;
const interpResumeState = normalizeTaskHalInterpState(
ui.interpResumeState ||
task.interpResumeState ||
(paused ? state.machine.interpResumeState || "reading" : interpState),
);
const axisPose = pauseLock?.axisPose
? clampAxisPoseToProfile(pauseLock.axisPose, state.profile)
: paused
@@ -3917,8 +3934,9 @@ function applyTaskHalStatusPatch(state, status, operatorMessage, {
mode: taskMode,
manualPanel,
interpState,
interpResumeState: paused ? state.machine.interpResumeState || "reading" : interpState,
interpResumeState,
taskPaused: paused,
motionPaused,
allHomed,
noForceHoming: Boolean(state.machine.noForceHoming),
},
@@ -3952,7 +3970,11 @@ function shouldContinueTaskHalStatusLoop(state = {}, status = {}) {
const interpState = normalizeTaskHalInterpState(ui.interpState || task.interpState);
const taskMode = normalizeLinuxCncTaskMode(ui.taskMode || task.mode || state.machine?.mode);
const aborted = motion.aborted === true;
const paused = interpState === "paused" || motion.paused === true;
const paused = interpState === "paused" ||
ui.motionPaused === true ||
ui.taskPaused === true ||
motion.paused === true ||
task.taskPaused === true;
const openedProgramLineCount = Number(task.openedSourceLineCount || task.openedLineCount || 1);
const complete = interpState === "idle"
&& Number(task.nextProgramLine || 0) >= openedProgramLineCount;
@@ -3962,7 +3984,8 @@ function shouldContinueTaskHalStatusLoop(state = {}, status = {}) {
function isTaskHalRunPausedByOperator(state = {}) {
return state.runState === "paused"
|| state.machine?.interpState === "paused"
|| state.machine?.taskPaused === true;
|| state.machine?.taskPaused === true
|| state.machine?.motionPaused === true;
}
function programControlModeForMachine(machine = {}) {
@@ -3980,6 +4003,7 @@ function createPowerToggleMachinePatch(machine = {}, turningOn = false) {
interpState: "idle",
interpResumeState: "idle",
taskPaused: false,
motionPaused: false,
};
}
@@ -4137,7 +4161,11 @@ function createTaskHalRuntimeFeedback(state, status, axisPose, activeLine) {
const halProgramLine = Number(status?.halSnapshot?.pins?.["motion.program-line"]?.value || 0);
const motionProgramLine = Number(motion.programLine || 0);
const interpState = normalizeTaskHalInterpState(ui.interpState || status?.task?.interpState);
const paused = interpState === "paused" || motion.paused === true;
const paused = interpState === "paused" ||
ui.motionPaused === true ||
ui.taskPaused === true ||
motion.paused === true ||
status?.task?.taskPaused === true;
const currentVelocity = paused ? 0 : Number(ui.currentVelocity || 0);
const requestedVelocity = paused ? 0 : Number(motion.requestedVel || 0) * 60;
return {
@@ -4152,6 +4180,7 @@ function createTaskHalRuntimeFeedback(state, status, axisPose, activeLine) {
activeLineSource: ui.activeLineSource || (motionProgramLine > 0 ? "motion-status" : halProgramLine > 0 ? "hal-pin" : "fallback"),
activeLineHalSynced: motionProgramLine > 0 && halProgramLine > 0 && motionProgramLine === halProgramLine,
type: Number(motion.motionType || 0) === 3 ? "JOG" : "TASK_MOTION",
paused,
timeSeconds: Number(ui.taskCycle || 0) * 0.01,
axisPose,
currentVelocityMmPerMin: currentVelocity,
@@ -4546,6 +4575,7 @@ function normalizeTaskHalInterpState(value) {
const state = String(value || "").toLowerCase();
if (state === "paused") return "paused";
if (state === "reading") return "reading";
if (state === "waiting") return "waiting";
return "idle";
}
@@ -4583,6 +4613,7 @@ function normalizeMachineForLinuxCncTask(machine = {}, runState = "idle") {
interpState,
interpResumeState: machine.interpResumeState || (interpState === "paused" ? "reading" : interpState),
taskPaused: Boolean(machine.taskPaused || interpState === "paused"),
motionPaused: Boolean(machine.motionPaused || machine.taskPaused || interpState === "paused"),
powerOn: taskState === "on",
estopActive: taskState === "estop",
allHomed: Boolean(machine.allHomed),