Files
ESP32-WijiBoard/web/js/sequence-runner.js
T
osiu97 9aa9d0f69f Implementing effects. Closes #2 (#19)
Co-authored-by: osiu97 <osiu97@gmail.com>
Reviewed-on: #19
2026-07-08 21:47:34 +02:00

83 lines
2.1 KiB
JavaScript

import BLE from './ble.js';
import UI from './ui.js';
import IK from './kinematics.js';
import Settings from './settings.js';
import Motion from './motion.js';
let isRunning = false;
function delayMs(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
export default {
get isRunning() { return isRunning; },
stop() { isRunning = false; },
async run(sequence, spotsData, currentSteps1, currentSteps2, mode, onStepComplete) {
if (isRunning) {
UI.log('A sequence is already running.', 'warn');
return false;
}
isRunning = true;
UI.log(`Running sequence: ${sequence.name}`, 'info');
let steps1 = currentSteps1;
let steps2 = currentSteps2;
for (let i = 0; i < sequence.steps.length; i++) {
if (!isRunning) {
UI.log('Sequence stopped.', 'info');
break;
}
const step = sequence.steps[i];
let targetX, targetY, label;
if (step.type === 'spot') {
const spot = spotsData.find(s => s.id === step.id);
if (!spot) {
UI.log(`Sequence error: Spot '${step.id}' not found. Skipping.`, 'error');
continue;
}
targetX = spot.x;
targetY = spot.y;
label = spot.label || spot.id;
} else if (step.type === 'xy') {
targetX = step.x;
targetY = step.y;
label = `(${targetX}, ${targetY})`;
} else {
UI.log(`Unknown step type: ${step.type}`, 'error');
continue;
}
UI.log(`Seq step: ${label}`, 'info');
const success = await Motion.goto(targetX, targetY, mode || 'direct');
if (!success) {
isRunning = false;
return false;
}
if (!BLE.isConnected()) {
const st = Motion.getSteps();
steps1 = st.steps1;
steps2 = st.steps2;
if (onStepComplete) {
onStepComplete(steps1, steps2);
}
}
// Wait for delay
const waitTime = typeof step.delay === 'number' ? step.delay : Settings.delay;
await delayMs(waitTime);
}
isRunning = false;
UI.log(`Sequence completed.`, 'success');
return true;
}
};