Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
196 changes: 129 additions & 67 deletions config.js
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,14 @@
*/
lmstEpoch: Date.UTC(2020, 2, 18, 0, 0, 0),

/*
* subscriptionMCWSFilterDelay: delay in milliseconds for combining filters for the same subscription
* endpoint connection. Smaller value = quicker display of realtime data (ex, 10ms in a
* low latency environment), higher value = avoids potentially creating and subsequently tearing down new websocket connections if filter changes are happening faster than server response times
* (ex, 100ms+ in a high latency environment)
*/
subscriptionMCWSFilterDelay: 100,

/**
* timeSystems: specify the time systems to use.
* Options are 'scet', 'ert', 'sclk', 'msl.sol' and 'lmst'.
Expand All @@ -193,83 +201,137 @@
*
* key property is required and other options are optional
* timeSystem:
* * key: string, required
* * key: string, required. Time system. Options are 'scet', 'ert', 'sclk', 'msl.sol' and 'lmst'.
* * limit: number, optional - maximum duration between start and end bounds allow
* * presets: array, optional - preset bounds for convenience
* * * preset:
* * * * label: string, descriptive label for preset
* * modeSettings: object, optional - presets for convenience.
* * * fixed: object, optional - valid objects are bounds objects and presets array.
* * * realtime: object, optional - valid objects are clockOffsets and presets array.
* * * lad:object, optional - valid objects are clockoffsets.
* * * *
* * * * Optional objects:
* * * * bounds: start and end bounds for preset as numbers
* * * * * * * * start and end can be declared as a number or a function returning a number
*
* * * * * * * * start: and end: can be declared as a number or a function returning a number
* * * * presets: array of objects consisting of:
* * * * * bounds: - required.
* * * * * label: - required, string
* * * * clockOffsets: object, optional. Start and end relative to active clock.
* * * * start: and end: numbers relative to active clock's 0. Start is negative, end is positive.
* *advanced** example configuration below
*
timeSystems: [
{
key:'scet',
presets: [
{
label: 'Last 2 hours',
bounds: {
start: Date.now() - 1000 * 60 * 60 * 2,
end: Date.now()
}
{
key:'scet',
modeSettings:{
fixed:{
bounds:{
// 1 day ago
start: new Date(
Date.UTC(
new Date().getUTCFullYear(),
new Date().getUTCMonth(),
new Date().getUTCDate()
) - 1 * 864e5
).getTime(),
end: new Date(
Date.UTC(
new Date().getUTCFullYear(),
new Date().getUTCMonth(),
new Date().getUTCDate()
) + 864e5 - 1
).getTime()
},
{
label: 'Last 1 hour',
bounds: {
start: Date.now() - 1000 * 60 * 60,
end: Date.now()
}
presets:[
{
label: 'Last 2 hours (SCET Recorded)',
bounds: {
start: () => Date.now() - 1000 * 60 * 60 * 2,
end: () => Date.now()
}
],
limit: 1000 * 60 * 60 * 6
},
{
key:'ert',
presets: [
{
label: 'Last 2 hours',
bounds: {
start: Date.now() - 1000 * 60 * 60 * 2,
end: Date.now()
}
},
{
label: 'Last 1 hour',
bounds: {
start: Date.now() - 1000 * 60 * 60,
end: Date.now()
}
},
]
},
realtime:{
clockOffsets:{
start: -60 * 60 * 1000,
end: 5 * 60 * 1000
},
presets:[
{
label: 'Last 2 hours (SCET Realtime)',
bounds: {
start: -60 * 60 * 1000 * 2,
end: 5 * 60 * 1000
}
],
limit: 1000 * 60 * 60 * 6
}
]
},
lad:{
clockOffsets:{
start: -60 * 60 * 1000,
end: 5 * 60 * 1000
},
},
},
limit: 1000 * 60 * 60 * 60
},
{
key:'ert',
modeSettings:{
fixed:{
bounds:{
// 1 day ago
start: new Date(
Date.UTC(
new Date().getUTCFullYear(),
new Date().getUTCMonth(),
new Date().getUTCDate()
) - 1 * 864e5
).getTime(),
// today
end: new Date(
Date.UTC(
new Date().getUTCFullYear(),
new Date().getUTCMonth(),
new Date().getUTCDate()
) + 864e5 - 1
).getTime()
},
{
key:'sclk',
presets: [
{
label: 'Last 2 hours',
bounds: {
start: Date.now() - 1000 * 60 * 60 * 2,
end: Date.now()
}
},
{
label: 'Last 1 hour',
bounds: {
start: Date.now() - 1000 * 60 * 60,
end: Date.now()
}
}
],
limit: 1000 / 5 * 60 * 60 * 6
presets:[
{
label: 'Last 2 hours (ERT Recorded)',
bounds: {
start: Date.now() - 1000 * 60 * 60 * 2,
end: Date.now()
}
},
]
},
{
key:'lmst',
presets: []
}
],
*/
realtime:{
clockOffsets:{
start: -60 * 60 * 1000,
end: 5 * 60 * 1000
},
presets:[
{
label: 'Last 2 hours (ERT Realtime)',
bounds: {
start: -60 * 60 * 1000 * 2,
end: 5 * 60 * 1000
}
}
]
},
lad:{
clockOffsets:{
start: -60 * 60 * 1000,
end: 5 * 60 * 1000
},
},
},
limit: 1000 * 60 * 60 * 60
}
],
*/

/**
* allowRealtime: whether or not to allow utc-relative time conductor.
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"mini-css-extract-plugin": "2.7.6",
"moment": "2.30.1",
"node-bourbon": "^4.2.3",
"openmct": "nasa/openmct#omm-r5.3.0-rc3",
"openmct": "nasa/openmct#omm-r5.3.1",
"prettier": "3.4.2",
"printj": "1.3.1",
"raw-loader": "^0.5.1",
Expand Down
2 changes: 1 addition & 1 deletion src/AMMOSPlugins.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ define([
openmct.install(RealtimeSessions.default());

openmct.install(new HistoricalTelemetryPlugin(options));
openmct.install(new RealtimeTelemetryPlugin(vistaTime, options));
openmct.install(new RealtimeTelemetryPlugin.default(vistaTime, options));
openmct.install(new TypePlugin.default());
openmct.install(new TaxonomyPlugin(options.taxonomy));
openmct.install(new LinkPlugin(options));
Expand Down
50 changes: 18 additions & 32 deletions src/realtime/MCWSAlarmMessageStreamProvider.js
Original file line number Diff line number Diff line change
@@ -1,35 +1,23 @@
define(['./MCWSStreamProvider'], function (MCWSStreamProvider) {
'use strict';
import MCWSStreamProvider from './MCWSStreamProvider';

/**
* Provides real-time streaming DataProduct data.
* @constructor
* @augments {MCWSStreamProvider}
* @memberof {vista/telemetry}
*/
var MCWSAlarmMessageStreamProvider = MCWSStreamProvider.extend({
constructor: function (openmct, vistaTime) {
MCWSStreamProvider.call(this, openmct, vistaTime);
}
});

MCWSAlarmMessageStreamProvider.prototype.getUrl = function (domainObject) {
return domainObject.telemetry && domainObject.telemetry.alarmMessageStreamUrl;
};
/**
* Provides real-time streaming DataProduct data.
* @memberof {vista/telemetry}
*/
class MCWSAlarmMessageStreamProvider extends MCWSStreamProvider {
getUrl(domainObject) {
return domainObject.telemetry?.alarmMessageStreamUrl;
}

MCWSAlarmMessageStreamProvider.prototype.getKey = function (domainObject) {
getKey(domainObject) {
return domainObject.telemetry.key;
};
}

MCWSAlarmMessageStreamProvider.prototype.getProperty = function (domainObject) {
getProperty(domainObject) {
return domainObject.telemetry.property;
};

MCWSAlarmMessageStreamProvider.prototype.notifyWorker = function (key, value) {
MCWSStreamProvider.prototype.notifyWorker.call(this, key, value);
};
}

MCWSAlarmMessageStreamProvider.prototype.subscribe = function (domainObject, callback, options) {
subscribe(domainObject, callback, options) {
let { telemetry: { alarmLevel = 'any' } = {} } = domainObject;
alarmLevel = alarmLevel.toUpperCase();
let objects = [
Expand Down Expand Up @@ -68,14 +56,12 @@ define(['./MCWSStreamProvider'], function (MCWSStreamProvider) {
object.telemetry.values = domainObject.telemetry.values;
});

let unsubscribers = objects.map((object) =>
MCWSStreamProvider.prototype.subscribe.call(this, object, callback, options)
);
let unsubscribers = objects.map((object) => super.subscribe(object, callback, options));

return () => {
unsubscribers.forEach((unsubscribe) => unsubscribe());
};
};
}
}

return MCWSAlarmMessageStreamProvider;
});
export default MCWSAlarmMessageStreamProvider;
34 changes: 15 additions & 19 deletions src/realtime/MCWSChannelStreamProvider.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,21 @@
define(['./MCWSStreamProvider'], function (MCWSStreamProvider) {
'use strict';
import MCWSStreamProvider from './MCWSStreamProvider';

/**
* Provides real-time streaming channel data.
* @constructor
* @augments {MCWSStreamProvider}
* @memberof {vista/telemetry}
*/
var MCWSChannelStreamProvider = MCWSStreamProvider.extend({});
/**
* Provides real-time streaming channel data.
* @memberof {vista/telemetry}
*/
class MCWSChannelStreamProvider extends MCWSStreamProvider {
getUrl(domainObject) {
return domainObject.telemetry?.channelStreamUrl;
}

MCWSChannelStreamProvider.prototype.getUrl = function (domainObject) {
return domainObject.telemetry && domainObject.telemetry.channelStreamUrl;
};

MCWSChannelStreamProvider.prototype.getKey = function (domainObject) {
getKey(domainObject) {
return domainObject.telemetry.channel_id;
};
}

MCWSChannelStreamProvider.prototype.getProperty = function () {
getProperty() {
return 'channel_id';
};
}
}

return MCWSChannelStreamProvider;
});
export default MCWSChannelStreamProvider;
34 changes: 15 additions & 19 deletions src/realtime/MCWSCommandStreamProvider.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,24 @@
define(['./MCWSStreamProvider'], function (MCWSStreamProvider) {
'use strict';
import MCWSStreamProvider from './MCWSStreamProvider';

/**
* Provides real-time streaming CommandEvent data.
* @constructor
* @augments {MCWSStreamProvider}
* @memberof {vista/telemetry}
*/
var MCWSCommandStreamProvider = MCWSStreamProvider.extend({});
/**
* Provides real-time streaming CommandEvent data.
* @memberof {vista/telemetry}
*/
class MCWSCommandStreamProvider extends MCWSStreamProvider {
getUrl(domainObject) {
return domainObject.telemetry?.commandEventStreamUrl;
}

MCWSCommandStreamProvider.prototype.getUrl = function (domainObject) {
return domainObject.telemetry && domainObject.telemetry.commandEventStreamUrl;
};

MCWSCommandStreamProvider.prototype.getKey = function (domainObject) {
getKey() {
// We return undefined so that we can match on undefined properties.
return undefined;
};
}

MCWSCommandStreamProvider.prototype.getProperty = function () {
getProperty() {
// We just want something that returns undefined so it matches the
// key above. Hacky.
return 'some_undefined_property';
};
}
}

return MCWSCommandStreamProvider;
});
export default MCWSCommandStreamProvider;
Loading