src/curves/ loader + normalizer (with cross-pressure anomaly
detection) + reverseCurve helper
src/prediction/ predictors (predictFlow/Power/Ctrl) +
groupPredictors (lazy group-scope views) +
OperatingPoint (pressure-driven prediction setpoints)
src/drift/ DriftAssessor (per-metric drift) + PredictionHealth
(composes flow/power/pressure into HealthStatus +
confidence sibling — see OPEN_QUESTIONS 2026-05-10)
src/pressure/ VirtualPressureChildren (dashboard-sim) +
PressureInitialization (real-vs-virtual tracking) +
PressureRouter (dispatches by position)
src/state/ stateBindings (state.emitter listener helper) +
isOperationalState
src/measurement/ measurementHandlers (dispatcher for flow/power/temp/pressure)
src/flow/ flowController (handleInput body — execSequence,
execMovement, flowMovement, emergencystop)
src/display/ workingCurves (showWorkingCurves + showCoG admin)
src/commands/ canonical names: set.mode, cmd.startup/shutdown/estop,
set.setpoint, set.flow-setpoint,
data.simulate-measurement, query.curves, query.cog,
child.register. execSequence demuxes by payload.action
to canonical cmd.* handlers.
CONTRACT.md inputs/outputs/events/children surface
110 basic tests pass (100 new + 10 pre-existing).
specificClass.js / nodeClass.js untouched — integration in P5 wave 2.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
93 lines
2.7 KiB
JavaScript
93 lines
2.7 KiB
JavaScript
'use strict';
|
|
|
|
const { MeasurementContainer } = require('generalFunctions');
|
|
|
|
/**
|
|
* VirtualPressureChildren — builds two dashboard-sim children backed
|
|
* by their own MeasurementContainer (upstream + downstream). Children
|
|
* are signed as belonging to a parent machine via `setParentRef`.
|
|
*
|
|
* Extracted from rotatingMachine specificClass._initVirtualPressureChildren.
|
|
*/
|
|
|
|
const DEFAULT_IDS = {
|
|
upstream: 'dashboard-sim-upstream',
|
|
downstream: 'dashboard-sim-downstream',
|
|
};
|
|
|
|
class VirtualPressureChildren {
|
|
/**
|
|
* @param {object} opts
|
|
* - logger: pass-through to MeasurementContainer
|
|
* - unitPolicy: { canonical, output }
|
|
* - parentRef: object to use as parent for setParentRef (optional)
|
|
* - ids: override the default { upstream, downstream } id pair (optional)
|
|
*/
|
|
constructor({ logger, unitPolicy, parentRef = null, ids = DEFAULT_IDS } = {}) {
|
|
this.logger = logger || { warn() {}, debug() {} };
|
|
this.unitPolicy = unitPolicy;
|
|
this.parentRef = parentRef;
|
|
this.ids = { ...DEFAULT_IDS, ...(ids || {}) };
|
|
}
|
|
|
|
/**
|
|
* @returns {{ upstream: VirtualChild, downstream: VirtualChild }}
|
|
* Each child = { config: { general, functionality, asset }, measurements }.
|
|
*/
|
|
build() {
|
|
return {
|
|
upstream: this._createChild('upstream'),
|
|
downstream: this._createChild('downstream'),
|
|
};
|
|
}
|
|
|
|
_createChild(position) {
|
|
const id = this.ids[position];
|
|
const name = `dashboard-sim-${position}`;
|
|
const measurements = new MeasurementContainer({
|
|
autoConvert: true,
|
|
defaultUnits: this._unitMap('output'),
|
|
preferredUnits: this._unitMap('output'),
|
|
canonicalUnits: this.unitPolicy?.canonical,
|
|
storeCanonical: true,
|
|
strictUnitValidation: true,
|
|
throwOnInvalidUnit: true,
|
|
requireUnitForTypes: ['pressure'],
|
|
}, this.logger);
|
|
|
|
if (typeof measurements.setChildId === 'function') measurements.setChildId(id);
|
|
if (typeof measurements.setChildName === 'function') measurements.setChildName(name);
|
|
if (this.parentRef && typeof measurements.setParentRef === 'function') {
|
|
measurements.setParentRef(this.parentRef);
|
|
}
|
|
|
|
return {
|
|
config: {
|
|
general: { id, name },
|
|
functionality: {
|
|
softwareType: 'measurement',
|
|
positionVsParent: position,
|
|
},
|
|
asset: {
|
|
type: 'pressure',
|
|
unit: this.unitPolicy?.output?.pressure,
|
|
},
|
|
},
|
|
measurements,
|
|
};
|
|
}
|
|
|
|
_unitMap(section) {
|
|
const src = this.unitPolicy?.[section] || {};
|
|
return {
|
|
pressure: src.pressure,
|
|
flow: src.flow,
|
|
power: src.power,
|
|
temperature: src.temperature,
|
|
};
|
|
}
|
|
}
|
|
|
|
VirtualPressureChildren.DEFAULT_IDS = DEFAULT_IDS;
|
|
module.exports = VirtualPressureChildren;
|