diff --git a/src/specificClass.js b/src/specificClass.js index ed528f7..cd78b67 100644 --- a/src/specificClass.js +++ b/src/specificClass.js @@ -1121,16 +1121,18 @@ class MachineGroup { this.logger.debug(this.machines[machineId].state); const currentState = this.machines[machineId].state.getCurrentState(); - if (flow <= 0 && (currentState === "operational" || currentState === "accelerating" || currentState === "decelerating")) { + // Same dispatch shape as optimalControl — see the comment + // there for the rationale. flowmovement BEFORE startup so + // concurrent retargets can update delayedMove without a + // stale chained flowmovement overwriting it after startup. + if (flow > 0) { + await machine.handleInput("parent", "flowmovement", this._canonicalToOutputFlow(flow)); + if (currentState === "idle") { + await machine.handleInput("parent", "execsequence", "startup"); + } + } else if (currentState === "operational" || currentState === "accelerating" || currentState === "decelerating") { await machine.handleInput("parent", "execsequence", "shutdown"); } - else if (currentState === "idle" && flow > 0) { - await machine.handleInput("parent", "execsequence", "startup"); - await machine.handleInput("parent", "flowmovement", this._canonicalToOutputFlow(flow)); - } - else if (currentState === "operational" && flow > 0) { - await machine.handleInput("parent", "flowmovement", this._canonicalToOutputFlow(flow)); - } })); } catch (err) {