Compare commits

...

1 Commits

Author SHA1 Message Date
344cbbb92d square wave generator 2020-04-30 12:46:59 -07:00
4 changed files with 186 additions and 2 deletions

View File

@ -5,6 +5,38 @@ define([
) {
var METADATA_BY_TYPE = {
'squareWaveGenerator': {
values: [
{
key: "name",
name: "Name"
},
{
key: "utc",
name: "Time",
format: "utc",
hints: {
domain: 1
}
},
{
key: "yesterday",
name: "Yesterday",
format: "utc",
hints: {
domain: 2
}
},
{
key: "square",
name: "Square",
formatString: '%d',
hints: {
range: 1
}
}
]
},
'generator': {
values: [
{

View File

@ -0,0 +1,68 @@
define([
'./WorkerInterface'
], function (
WorkerInterface
) {
var REQUEST_DEFAULTS = {
amplitude: 1,
period: 10,
offset: 0,
dataRateInHz: 1,
phase: 0
};
function SquareWaveGeneratorProvider() {
this.workerInterface = new WorkerInterface();
}
SquareWaveGeneratorProvider.prototype.canProvideTelemetry = function (domainObject) {
return domainObject.type === 'squareWaveGenerator';
};
SquareWaveGeneratorProvider.prototype.supportsRequest =
SquareWaveGeneratorProvider.prototype.supportsSubscribe =
SquareWaveGeneratorProvider.prototype.canProvideTelemetry;
SquareWaveGeneratorProvider.prototype.makeWorkerRequest = function (domainObject, request) {
var props = [
'amplitude',
'period',
'offset',
'dataRateInHz',
'phase',
];
request = request || {};
var workerRequest = {};
props.forEach(function (prop) {
if (domainObject.telemetry && domainObject.telemetry.hasOwnProperty(prop)) {
workerRequest[prop] = domainObject.telemetry[prop];
}
if (request && request.hasOwnProperty(prop)) {
workerRequest[prop] = request[prop];
}
if (!workerRequest.hasOwnProperty(prop)) {
workerRequest[prop] = REQUEST_DEFAULTS[prop];
}
workerRequest[prop] = Number(workerRequest[prop]);
});
workerRequest.name = domainObject.name;
return workerRequest;
};
SquareWaveGeneratorProvider.prototype.request = function (domainObject, request) {
var workerRequest = this.makeWorkerRequest(domainObject, request);
workerRequest.start = request.start;
workerRequest.end = request.end;
return this.workerInterface.request(workerRequest);
};
SquareWaveGeneratorProvider.prototype.subscribe = function (domainObject, callback) {
var workerRequest = this.makeWorkerRequest(domainObject, {});
return this.workerInterface.subscribe(workerRequest, callback);
};
return SquareWaveGeneratorProvider;
});

View File

@ -66,7 +66,8 @@
utc: nextStep,
yesterday: nextStep - 60*60*24*1000,
sin: sin(nextStep, data.period, data.amplitude, data.offset, data.phase, data.randomness),
cos: cos(nextStep, data.period, data.amplitude, data.offset, data.phase, data.randomness)
cos: cos(nextStep, data.period, data.amplitude, data.offset, data.phase, data.randomness),
square: square(nextStep, data.period, data.amplitude, data.offset, data.phase)
}
});
nextStep += step;
@ -112,7 +113,8 @@
utc: nextStep,
yesterday: nextStep - 60*60*24*1000,
sin: sin(nextStep, period, amplitude, offset, phase, randomness),
cos: cos(nextStep, period, amplitude, offset, phase, randomness)
cos: cos(nextStep, period, amplitude, offset, phase, randomness),
square: square(nextStep, period, amplitude, offset, phase)
});
}
self.postMessage({
@ -121,6 +123,12 @@
});
}
function square(timestamp, period, amplitude, offset, phase) {
var sinValue = Math.sin(phase + (timestamp / period / 1000 * Math.PI * 2)) + offset;
var value = sinValue > 0 ? amplitude : -amplitude;
return value;
}
function cos(timestamp, period, amplitude, offset, phase, randomness) {
return amplitude *
Math.cos(phase + (timestamp / period / 1000 * Math.PI * 2)) + (amplitude * Math.random() * randomness) + offset;

View File

@ -25,11 +25,13 @@ define([
"./GeneratorProvider",
"./SinewaveLimitProvider",
"./StateGeneratorProvider",
"./SquareWaveGeneratorProvider",
"./GeneratorMetadataProvider"
], function (
GeneratorProvider,
SinewaveLimitProvider,
StateGeneratorProvider,
SquareWaveGeneratorProvider,
GeneratorMetadataProvider
) {
@ -62,6 +64,80 @@ define([
openmct.telemetry.addProvider(new StateGeneratorProvider());
openmct.types.addType("squareWaveGenerator", {
name: "Square Wave Generator",
description: "For development use. Generates example streaming telemetry data using a simple sqaure wave algorithm.",
cssClass: "icon-generator-telemetry",
creatable: true,
form: [
{
name: "Period",
control: "numberfield",
cssClass: "l-input-sm l-numeric",
key: "period",
required: true,
property: [
"telemetry",
"period"
]
},
{
name: "Amplitude",
control: "numberfield",
cssClass: "l-input-sm l-numeric",
key: "amplitude",
required: true,
property: [
"telemetry",
"amplitude"
]
},
{
name: "Offset",
control: "numberfield",
cssClass: "l-input-sm l-numeric",
key: "offset",
required: true,
property: [
"telemetry",
"offset"
]
},
{
name: "Data Rate (hz)",
control: "numberfield",
cssClass: "l-input-sm l-numeric",
key: "dataRateInHz",
required: true,
property: [
"telemetry",
"dataRateInHz"
]
},
{
name: "Phase (radians)",
control: "numberfield",
cssClass: "l-input-sm l-numeric",
key: "phase",
required: true,
property: [
"telemetry",
"phase"
]
}
],
initialize: function (object) {
object.telemetry = {
period: 10,
amplitude: 5,
offset: 0,
dataRateInHz: 10,
phase: 0
};
}
});
openmct.telemetry.addProvider(new SquareWaveGeneratorProvider());
openmct.types.addType("generator", {
name: "Sine Wave Generator",
description: "For development use. Generates example streaming telemetry data using a simple sine wave algorithm.",