|
|
|
|
@@ -16,6 +16,16 @@ function _logger(source, ctx) {
|
|
|
|
|
return ctx?.logger || source?.logger || null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Resolve the command origin (control authority: parent | GUI | fysical).
|
|
|
|
|
// The shared commandRegistry stamps msg.origin (default 'parent'); legacy flows
|
|
|
|
|
// carried the origin as payload.source. Prefer the legacy field when present so
|
|
|
|
|
// existing flows keep working, otherwise use the registry-stamped msg.origin.
|
|
|
|
|
function _origin(msg) {
|
|
|
|
|
const p = msg && msg.payload;
|
|
|
|
|
if (p && typeof p === 'object' && typeof p.source === 'string' && p.source) return p.source;
|
|
|
|
|
return (typeof msg?.origin === 'string' && msg.origin) ? msg.origin : 'parent';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _send(ctx, ports) {
|
|
|
|
|
if (typeof ctx?.send === 'function') ctx.send(ports);
|
|
|
|
|
}
|
|
|
|
|
@@ -28,19 +38,19 @@ exports.setMode = (source, msg) => {
|
|
|
|
|
// forwards to these directly so behaviour is identical.
|
|
|
|
|
exports.startup = async (source, msg) => {
|
|
|
|
|
const p = msg.payload || {};
|
|
|
|
|
await source.handleInput(p.source ?? 'parent', 'execSequence', 'startup');
|
|
|
|
|
await source.handleInput(_origin(msg), 'execSequence', 'startup');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
exports.shutdown = async (source, msg) => {
|
|
|
|
|
const p = msg.payload || {};
|
|
|
|
|
await source.handleInput(p.source ?? 'parent', 'execSequence', 'shutdown');
|
|
|
|
|
await source.handleInput(_origin(msg), 'execSequence', 'shutdown');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
exports.estop = async (source, msg) => {
|
|
|
|
|
const p = msg.payload || {};
|
|
|
|
|
// Legacy emergencystop carried { source, action } — action defaults to
|
|
|
|
|
// 'emergencystop' when only source is supplied via the canonical topic.
|
|
|
|
|
await source.handleInput(p.source ?? 'parent', p.action ?? 'emergencystop');
|
|
|
|
|
await source.handleInput(_origin(msg), p.action ?? 'emergencystop');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Content-based alias router: legacy `execSequence` carried payload.action in
|
|
|
|
|
@@ -57,13 +67,13 @@ exports.execSequenceAlias = async (source, msg, ctx) => {
|
|
|
|
|
exports.setSetpoint = async (source, msg) => {
|
|
|
|
|
const p = msg.payload || {};
|
|
|
|
|
const action = p.action ?? 'execMovement';
|
|
|
|
|
await source.handleInput(p.source ?? 'parent', action, Number(p.setpoint));
|
|
|
|
|
await source.handleInput(_origin(msg), action, Number(p.setpoint));
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
exports.setFlowSetpoint = async (source, msg) => {
|
|
|
|
|
const p = msg.payload || {};
|
|
|
|
|
const action = p.action ?? 'flowMovement';
|
|
|
|
|
await source.handleInput(p.source ?? 'parent', action, Number(p.setpoint));
|
|
|
|
|
await source.handleInput(_origin(msg), action, Number(p.setpoint));
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
exports.simulateMeasurement = (source, msg, ctx) => {
|
|
|
|
|
|