mirror of
https://github.com/nasa/openmct.git
synced 2025-06-13 04:38:15 +00:00
Merge branch 'topic-conditionals' into dave/conditions-telemetry
This commit is contained in:
@ -31,6 +31,7 @@ define([
|
|||||||
period: 10,
|
period: 10,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
dataRateInHz: 1,
|
dataRateInHz: 1,
|
||||||
|
randomness: 0,
|
||||||
phase: 0
|
phase: 0
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -52,7 +53,8 @@ define([
|
|||||||
'period',
|
'period',
|
||||||
'offset',
|
'offset',
|
||||||
'dataRateInHz',
|
'dataRateInHz',
|
||||||
'phase'
|
'phase',
|
||||||
|
'randomness'
|
||||||
];
|
];
|
||||||
|
|
||||||
request = request || {};
|
request = request || {};
|
||||||
|
@ -65,8 +65,8 @@
|
|||||||
name: data.name,
|
name: data.name,
|
||||||
utc: nextStep,
|
utc: nextStep,
|
||||||
yesterday: nextStep - 60*60*24*1000,
|
yesterday: nextStep - 60*60*24*1000,
|
||||||
sin: sin(nextStep, data.period, data.amplitude, data.offset, data.phase),
|
sin: sin(nextStep, data.period, data.amplitude, data.offset, data.phase, data.randomness),
|
||||||
cos: cos(nextStep, data.period, data.amplitude, data.offset, data.phase)
|
cos: cos(nextStep, data.period, data.amplitude, data.offset, data.phase, data.randomness)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
nextStep += step;
|
nextStep += step;
|
||||||
@ -99,6 +99,7 @@
|
|||||||
var offset = request.offset;
|
var offset = request.offset;
|
||||||
var dataRateInHz = request.dataRateInHz;
|
var dataRateInHz = request.dataRateInHz;
|
||||||
var phase = request.phase;
|
var phase = request.phase;
|
||||||
|
var randomness = request.randomness;
|
||||||
|
|
||||||
var step = 1000 / dataRateInHz;
|
var step = 1000 / dataRateInHz;
|
||||||
var nextStep = start - (start % step) + step;
|
var nextStep = start - (start % step) + step;
|
||||||
@ -110,8 +111,8 @@
|
|||||||
name: request.name,
|
name: request.name,
|
||||||
utc: nextStep,
|
utc: nextStep,
|
||||||
yesterday: nextStep - 60*60*24*1000,
|
yesterday: nextStep - 60*60*24*1000,
|
||||||
sin: sin(nextStep, period, amplitude, offset, phase),
|
sin: sin(nextStep, period, amplitude, offset, phase, randomness),
|
||||||
cos: cos(nextStep, period, amplitude, offset, phase)
|
cos: cos(nextStep, period, amplitude, offset, phase, randomness)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
self.postMessage({
|
self.postMessage({
|
||||||
@ -120,14 +121,14 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function cos(timestamp, period, amplitude, offset, phase) {
|
function cos(timestamp, period, amplitude, offset, phase, randomness) {
|
||||||
return amplitude *
|
return amplitude *
|
||||||
Math.cos(phase + (timestamp / period / 1000 * Math.PI * 2)) + offset;
|
Math.cos(phase + (timestamp / period / 1000 * Math.PI * 2)) + (amplitude * Math.random() * randomness) + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
function sin(timestamp, period, amplitude, offset, phase) {
|
function sin(timestamp, period, amplitude, offset, phase, randomness) {
|
||||||
return amplitude *
|
return amplitude *
|
||||||
Math.sin(phase + (timestamp / period / 1000 * Math.PI * 2)) + offset;
|
Math.sin(phase + (timestamp / period / 1000 * Math.PI * 2)) + (amplitude * Math.random() * randomness) + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendError(error, message) {
|
function sendError(error, message) {
|
||||||
|
@ -122,6 +122,17 @@ define([
|
|||||||
"telemetry",
|
"telemetry",
|
||||||
"phase"
|
"phase"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Randomness",
|
||||||
|
control: "numberfield",
|
||||||
|
cssClass: "l-input-sm l-numeric",
|
||||||
|
key: "randomness",
|
||||||
|
required: true,
|
||||||
|
property: [
|
||||||
|
"telemetry",
|
||||||
|
"randomness"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
initialize: function (object) {
|
initialize: function (object) {
|
||||||
@ -130,7 +141,8 @@ define([
|
|||||||
amplitude: 1,
|
amplitude: 1,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
dataRateInHz: 1,
|
dataRateInHz: 1,
|
||||||
phase: 0
|
phase: 0,
|
||||||
|
randomness: 0
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,3 +1,25 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2020, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
export default class ConditionSetMetadataProvider {
|
export default class ConditionSetMetadataProvider {
|
||||||
constructor(openmct) {
|
constructor(openmct) {
|
||||||
this.openmct = openmct;
|
this.openmct = openmct;
|
||||||
@ -21,12 +43,21 @@ export default class ConditionSetMetadataProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getMetadata(domainObject) {
|
getMetadata(domainObject) {
|
||||||
|
const enumerations = domainObject.configuration.conditionCollection
|
||||||
|
.map((condition, index) => {
|
||||||
|
return {
|
||||||
|
string: condition.configuration.output,
|
||||||
|
value: index
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
values: this.getDomains().concat([
|
values: this.getDomains().concat([
|
||||||
{
|
{
|
||||||
name: 'Output',
|
name: 'Output',
|
||||||
key: 'output',
|
key: 'output',
|
||||||
format: 'string',
|
format: 'enum',
|
||||||
|
enumerations: enumerations,
|
||||||
hints: {
|
hints: {
|
||||||
range: 1
|
range: 1
|
||||||
}
|
}
|
||||||
|
33
src/plugins/condition/ConditionSetViewPolicy.js
Normal file
33
src/plugins/condition/ConditionSetViewPolicy.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2020, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
function ConditionSetViewPolicy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
ConditionSetViewPolicy.prototype.allow = function (view, domainObject) {
|
||||||
|
if (domainObject.getModel().type === 'conditionSet') {
|
||||||
|
return view.key === 'conditionSet.view';
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ConditionSetViewPolicy;
|
@ -30,7 +30,7 @@ export default class ConditionSetViewProvider {
|
|||||||
this.openmct = openmct;
|
this.openmct = openmct;
|
||||||
this.name = 'Conditions View';
|
this.name = 'Conditions View';
|
||||||
this.key = 'conditionSet.view';
|
this.key = 'conditionSet.view';
|
||||||
this.cssClass = 'icon-conditional'; // TODO: replace with class for new icon
|
this.cssClass = 'icon-conditional';
|
||||||
}
|
}
|
||||||
|
|
||||||
canView(domainObject) {
|
canView(domainObject) {
|
||||||
|
@ -23,6 +23,7 @@ import ConditionSetViewProvider from './ConditionSetViewProvider.js';
|
|||||||
import ConditionSetCompositionPolicy from "./ConditionSetCompositionPolicy";
|
import ConditionSetCompositionPolicy from "./ConditionSetCompositionPolicy";
|
||||||
import ConditionSetMetadataProvider from './ConditionSetMetadataProvider';
|
import ConditionSetMetadataProvider from './ConditionSetMetadataProvider';
|
||||||
import ConditionSetTelemetryProvider from './ConditionSetTelemetryProvider';
|
import ConditionSetTelemetryProvider from './ConditionSetTelemetryProvider';
|
||||||
|
import ConditionSetViewPolicy from './ConditionSetViewPolicy';
|
||||||
import uuid from "uuid";
|
import uuid from "uuid";
|
||||||
|
|
||||||
export default function ConditionPlugin() {
|
export default function ConditionPlugin() {
|
||||||
@ -34,7 +35,7 @@ export default function ConditionPlugin() {
|
|||||||
key: 'conditionSet',
|
key: 'conditionSet',
|
||||||
description: 'A set of one or more conditions based on user-specified criteria.',
|
description: 'A set of one or more conditions based on user-specified criteria.',
|
||||||
creatable: true,
|
creatable: true,
|
||||||
cssClass: 'icon-conditional', // TODO: replace with class for new icon
|
cssClass: 'icon-conditional',
|
||||||
initialize: function (domainObject) {
|
initialize: function (domainObject) {
|
||||||
domainObject.configuration = {
|
domainObject.configuration = {
|
||||||
conditionCollection: [{
|
conditionCollection: [{
|
||||||
@ -53,7 +54,10 @@ export default function ConditionPlugin() {
|
|||||||
domainObject.telemetry = {};
|
domainObject.telemetry = {};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
openmct.legacyExtension('policies', {
|
||||||
|
category: 'view',
|
||||||
|
implementation: ConditionSetViewPolicy
|
||||||
|
});
|
||||||
openmct.composition.addPolicy(new ConditionSetCompositionPolicy(openmct).allow);
|
openmct.composition.addPolicy(new ConditionSetCompositionPolicy(openmct).allow);
|
||||||
openmct.telemetry.addProvider(new ConditionSetMetadataProvider(openmct));
|
openmct.telemetry.addProvider(new ConditionSetMetadataProvider(openmct));
|
||||||
openmct.telemetry.addProvider(new ConditionSetTelemetryProvider(openmct));
|
openmct.telemetry.addProvider(new ConditionSetTelemetryProvider(openmct));
|
||||||
|
@ -82,7 +82,10 @@ describe('the plugin', function () {
|
|||||||
it('provides a view', () => {
|
it('provides a view', () => {
|
||||||
const testViewObject = {
|
const testViewObject = {
|
||||||
id:"test-object",
|
id:"test-object",
|
||||||
type: "conditionSet"
|
type: "conditionSet",
|
||||||
|
configuration: {
|
||||||
|
conditionCollection: []
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const applicableViews = openmct.objectViews.get(testViewObject);
|
const applicableViews = openmct.objectViews.get(testViewObject);
|
||||||
|
Reference in New Issue
Block a user