Compare commits
1 Commits
96b84d3124
...
df74ea0fac
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df74ea0fac |
@@ -74,6 +74,16 @@ class MachineGroup {
|
|||||||
// Combination curve data
|
// Combination curve data
|
||||||
this.dynamicTotals = { flow: { min: Infinity, max: 0 }, power: { min: Infinity, max: 0 } , NCog : 0};
|
this.dynamicTotals = { flow: { min: Infinity, max: 0 }, power: { min: Infinity, max: 0 } , NCog : 0};
|
||||||
this.absoluteTotals = { flow: { min: Infinity, max: 0 }, power: { min: Infinity, max: 0 }};
|
this.absoluteTotals = { flow: { min: Infinity, max: 0 }, power: { min: Infinity, max: 0 }};
|
||||||
|
|
||||||
|
// Dispatch serialization. PS ticks demand into MGC at 1 Hz, but
|
||||||
|
// a real pump ramp takes several seconds — without this gate
|
||||||
|
// every PS tick aborts the in-flight dispatch and starts a new
|
||||||
|
// one, so pumps never reach their setpoint. Mirrors
|
||||||
|
// rotatingMachine state.delayedMove: while a dispatch is in
|
||||||
|
// flight the latest demand is parked here for pickup when the
|
||||||
|
// current dispatch settles. Latest-wins.
|
||||||
|
this._dispatchInFlight = false;
|
||||||
|
this._delayedCall = null;
|
||||||
//this always last in the constructor
|
//this always last in the constructor
|
||||||
this.childRegistrationUtils = new childRegistrationUtils(this);
|
this.childRegistrationUtils = new childRegistrationUtils(this);
|
||||||
|
|
||||||
@@ -1274,6 +1284,37 @@ class MachineGroup {
|
|||||||
|
|
||||||
async handleInput(source, demand, powerCap = Infinity, priorityList = null) {
|
async handleInput(source, demand, powerCap = Infinity, priorityList = null) {
|
||||||
|
|
||||||
|
// Serialize dispatches: if a previous handleInput is still
|
||||||
|
// awaiting pump movements, park the latest demand and return.
|
||||||
|
// The in-flight dispatch's `finally` block will pick it up.
|
||||||
|
// See rotatingMachine state.delayedMove for the analogous
|
||||||
|
// pattern at the pump level.
|
||||||
|
if (this._dispatchInFlight) {
|
||||||
|
this._delayedCall = { source, demand, powerCap, priorityList };
|
||||||
|
this.logger.debug(`Dispatch in flight; deferring demand=${demand} until current pump moves complete.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._dispatchInFlight = true;
|
||||||
|
try {
|
||||||
|
return await this._runDispatch(source, demand, powerCap, priorityList);
|
||||||
|
} finally {
|
||||||
|
this._dispatchInFlight = false;
|
||||||
|
// Pick up the latest deferred call (intermediate values were
|
||||||
|
// stomped while we were busy — only the last one matters).
|
||||||
|
if (this._delayedCall) {
|
||||||
|
const next = this._delayedCall;
|
||||||
|
this._delayedCall = null;
|
||||||
|
this.logger.debug(`Dispatch finished; picking up deferred demand=${next.demand}.`);
|
||||||
|
// Recursive call re-enters the gate; safe because
|
||||||
|
// _dispatchInFlight has been reset to false above.
|
||||||
|
await this.handleInput(next.source, next.demand, next.powerCap, next.priorityList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async _runDispatch(source, demand, powerCap = Infinity, priorityList = null) {
|
||||||
|
|
||||||
const demandQ = parseFloat(demand);
|
const demandQ = parseFloat(demand);
|
||||||
|
|
||||||
if(!Number.isFinite(demandQ)){
|
if(!Number.isFinite(demandQ)){
|
||||||
|
|||||||
Reference in New Issue
Block a user