mirror of
https://github.com/nasa/openmct.git
synced 2025-05-31 22:50:49 +00:00
exact values enabled
This commit is contained in:
parent
69db534042
commit
90a24b380f
@ -7,6 +7,7 @@ export default class CompsManager extends EventEmitter {
|
|||||||
#telemetryObjects = {};
|
#telemetryObjects = {};
|
||||||
#telemetryCollections = {};
|
#telemetryCollections = {};
|
||||||
#managerLoadedPromise;
|
#managerLoadedPromise;
|
||||||
|
#dataFrame = {};
|
||||||
|
|
||||||
constructor(openmct, domainObject) {
|
constructor(openmct, domainObject) {
|
||||||
super();
|
super();
|
||||||
@ -47,10 +48,9 @@ export default class CompsManager extends EventEmitter {
|
|||||||
return underlyingTelemetry;
|
return underlyingTelemetry;
|
||||||
}
|
}
|
||||||
|
|
||||||
#telemetryProcessor = (telemetryObjects) => {
|
#telemetryProcessor = (newTelemetry, keyString) => {
|
||||||
// new data!
|
console.debug(`🎉 new data for ${keyString}!`, newTelemetry);
|
||||||
console.debug(`🎉 new data!`, telemetryObjects);
|
this.emit('underlyingTelemetryUpdated', { [keyString]: newTelemetry });
|
||||||
this.emit('underlyingTelemetryUpdated', telemetryObjects);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#clearData() {
|
#clearData() {
|
||||||
@ -68,7 +68,9 @@ export default class CompsManager extends EventEmitter {
|
|||||||
this.#telemetryCollections[keyString] =
|
this.#telemetryCollections[keyString] =
|
||||||
this.#openmct.telemetry.requestCollection(telemetryObject);
|
this.#openmct.telemetry.requestCollection(telemetryObject);
|
||||||
|
|
||||||
this.#telemetryCollections[keyString].on('add', this.#telemetryProcessor);
|
this.#telemetryCollections[keyString].on('add', (data) => {
|
||||||
|
this.#telemetryProcessor(data, keyString);
|
||||||
|
});
|
||||||
this.#telemetryCollections[keyString].on('clear', this.#clearData);
|
this.#telemetryCollections[keyString].on('clear', this.#clearData);
|
||||||
await this.#telemetryCollections[keyString].load();
|
await this.#telemetryCollections[keyString].load();
|
||||||
};
|
};
|
||||||
|
@ -6,41 +6,89 @@ onconnect = function (e) {
|
|||||||
|
|
||||||
port.onmessage = function (event) {
|
port.onmessage = function (event) {
|
||||||
console.debug('🧮 Comps Math Worker message:', event);
|
console.debug('🧮 Comps Math Worker message:', event);
|
||||||
const { type, callbackID, telemetryForComps, expression } = event.data;
|
try {
|
||||||
if (type === 'calculateRequest' || type === 'calculateSubscription') {
|
const { type, callbackID, telemetryForComps, newTelemetry, expression } = event.data;
|
||||||
try {
|
if (type === 'calculateRequest') {
|
||||||
// the reply type is different for request and subscription
|
const result = calculateRequest(telemetryForComps, expression);
|
||||||
const replyType =
|
port.postMessage({ type: 'calculationRequestResult', callbackID, result });
|
||||||
type === 'calculateRequest'
|
} else if (type === 'calculateSubscription') {
|
||||||
? 'calculationRequestResult'
|
const result = calculateSubscription(telemetryForComps, newTelemetry, expression);
|
||||||
: 'calculationSubscriptionResult';
|
if (result.length) {
|
||||||
const result = calculate(telemetryForComps, expression);
|
port.postMessage({ type: 'calculationSubscriptionResult', callbackID, result });
|
||||||
port.postMessage({ type: replyType, callbackID, result });
|
}
|
||||||
} catch (error) {
|
} else if (type === 'init') {
|
||||||
port.postMessage({ type: 'error', callbackID, error: error.message });
|
port.postMessage({ type: 'ready' });
|
||||||
|
} else {
|
||||||
|
throw new Error('Invalid message type');
|
||||||
}
|
}
|
||||||
} else if (type === 'init') {
|
} catch (error) {
|
||||||
port.postMessage({ type: 'ready' });
|
port.postMessage({ type: 'error', error });
|
||||||
} else {
|
|
||||||
port.postMessage({ type: 'error', callbackID, error: 'Invalid message type' });
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
function calculate(telemetryForComps, expression) {
|
function getFullDataFrame(telemetryForComps) {
|
||||||
const dataSet1 = Object.values(telemetryForComps)[0];
|
const dataFrame = {};
|
||||||
const dataSet2 = Object.values(telemetryForComps)[1];
|
Object.keys(telemetryForComps).forEach((key) => {
|
||||||
|
const dataSet = telemetryForComps[key];
|
||||||
|
const telemetryMap = new Map(dataSet.map((item) => [item.utc, item]));
|
||||||
|
dataFrame[key] = telemetryMap;
|
||||||
|
});
|
||||||
|
return dataFrame;
|
||||||
|
}
|
||||||
|
|
||||||
// Organize data by utc for quick access
|
function getReducedDataFrame(telemetryForComps, newTelemetry) {
|
||||||
const utcMap1 = new Map(dataSet1.map((item) => [item.utc, item]));
|
const reducedDataFrame = {};
|
||||||
const utcMap2 = new Map(dataSet2.map((item) => [item.utc, item]));
|
const fullDataFrame = getFullDataFrame(telemetryForComps);
|
||||||
|
// we can assume (due to telemetryCollections) that newTelmetry has at most one key
|
||||||
|
const newTelemetryKey = Object.keys(newTelemetry)[0];
|
||||||
|
const newTelmetryData = newTelemetry[newTelemetryKey];
|
||||||
|
// initalize maps for other telemetry
|
||||||
|
Object.keys(telemetryForComps).forEach((key) => {
|
||||||
|
if (key !== newTelemetryKey) {
|
||||||
|
reducedDataFrame[key] = new Map();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
reducedDataFrame[newTelemetryKey] = new Map(
|
||||||
|
Object.values(newTelmetryData).map((item) => {
|
||||||
|
return [item.utc, item];
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
// march through the new telemetry and look for corresponding telemetry in the other dataset
|
||||||
|
newTelmetryData.forEach((value) => {
|
||||||
|
const newTelemetryUtc = value.utc;
|
||||||
|
Object.keys(telemetryForComps).forEach((otherKey) => {
|
||||||
|
if (otherKey !== newTelemetryKey) {
|
||||||
|
const otherDataSet = fullDataFrame[otherKey];
|
||||||
|
if (otherDataSet.has(newTelemetryUtc)) {
|
||||||
|
reducedDataFrame[otherKey].set(newTelemetryUtc, otherDataSet.get(newTelemetryUtc));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return reducedDataFrame;
|
||||||
|
}
|
||||||
|
|
||||||
|
function calculateSubscription(telemetryForComps, newTelemetry, expression) {
|
||||||
|
const dataFrame = getReducedDataFrame(telemetryForComps, newTelemetry);
|
||||||
|
return calculate(dataFrame, expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
function calculateRequest(telemetryForComps, expression) {
|
||||||
|
const dataFrame = getFullDataFrame(telemetryForComps);
|
||||||
|
return calculate(dataFrame, expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
function calculate(dataFrame, expression) {
|
||||||
const sumResults = [];
|
const sumResults = [];
|
||||||
|
// Iterate over the first dataset and check for matching utc in the other dataset
|
||||||
|
const firstDataSet = Object.values(dataFrame)[0];
|
||||||
|
const secondDataSet = Object.values(dataFrame)[1];
|
||||||
|
|
||||||
// Iterate over the first dataset and check for matching utc in the second dataset
|
for (const [utc, item1] of firstDataSet.entries()) {
|
||||||
for (const [utc, item1] of utcMap1.entries()) {
|
if (secondDataSet.has(utc)) {
|
||||||
if (utcMap2.has(utc)) {
|
const item2 = secondDataSet.get(utc);
|
||||||
const item2 = utcMap2.get(utc);
|
|
||||||
const output = evaluate(expression, { a: item1.sin, b: item2.sin });
|
const output = evaluate(expression, { a: item1.sin, b: item2.sin });
|
||||||
sumResults.push({ utc, output });
|
sumResults.push({ utc, output });
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,18 @@ export default class CompsTelemetryProvider {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#computeOnNewTelemetry(specificCompsManager, newTelemetry, callbackID) {
|
||||||
|
const expression = specificCompsManager.getExpression();
|
||||||
|
const telemetryForComps = specificCompsManager.requestUnderlyingTelemetry();
|
||||||
|
this.#sharedWorker.port.postMessage({
|
||||||
|
type: 'calculateSubscription',
|
||||||
|
telemetryForComps,
|
||||||
|
newTelemetry,
|
||||||
|
expression,
|
||||||
|
callbackID
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
subscribe(domainObject, callback) {
|
subscribe(domainObject, callback) {
|
||||||
const specificCompsManager = CompsManager.getCompsManager(
|
const specificCompsManager = CompsManager.getCompsManager(
|
||||||
domainObject,
|
domainObject,
|
||||||
@ -85,13 +97,7 @@ export default class CompsTelemetryProvider {
|
|||||||
const callbackID = this.#getCallbackID();
|
const callbackID = this.#getCallbackID();
|
||||||
this.#subscriptionCallbacks[callbackID] = callback;
|
this.#subscriptionCallbacks[callbackID] = callback;
|
||||||
specificCompsManager.on('underlyingTelemetryUpdated', (newTelemetry) => {
|
specificCompsManager.on('underlyingTelemetryUpdated', (newTelemetry) => {
|
||||||
const expression = specificCompsManager.getExpression();
|
this.#computeOnNewTelemetry(specificCompsManager, newTelemetry, callbackID);
|
||||||
this.#sharedWorker.port.postMessage({
|
|
||||||
type: 'calculateSubscription',
|
|
||||||
telemetryForComps: newTelemetry,
|
|
||||||
expression,
|
|
||||||
callbackID
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
return () => {
|
return () => {
|
||||||
specificCompsManager.off('calculationUpdated', callback);
|
specificCompsManager.off('calculationUpdated', callback);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user