mirror of
https://github.com/nasa/openmct.git
synced 2025-06-25 10:44:21 +00:00
Compare commits
2 Commits
plot-wait-
...
tc-api-tak
Author | SHA1 | Date | |
---|---|---|---|
86b3da1e86 | |||
a910b86109 |
150
platform/features/conductor-redux/src/README.md
Normal file
150
platform/features/conductor-redux/src/README.md
Normal file
@ -0,0 +1,150 @@
|
||||
## Notes
|
||||
API is notional for now, based on use-cases identified below. Possible the
|
||||
use cases are not sufficient, so please include in comments
|
||||
any other use cases you'd like to see.
|
||||
|
||||
Plan now is to start building out test suite for the use cases identified below
|
||||
in order to get the API functional. Need to discuss how UI aspects of timeline will be implemented.
|
||||
Propose in place refactoring of existing timeline rather than starting again.
|
||||
|
||||
Some caveats / open questions
|
||||
* I don't understand the use case shown on page 52 of UI sketches. It shows RT/FT, with deltas,
|
||||
with inner interval unlocked. Not sure what result would be, has inner end switched to fixed?
|
||||
Also example on page 55 in real-time where inner end < now. Is there a use case for this? Semantically, it's saying
|
||||
show me real time, but stale data. Why would a user want this? My feeling is that if the inner
|
||||
OR outer ends are moved behind NOW in real-time mode then you drop into historical mode.
|
||||
* For the API itself, have ignored question of how it's namespaced / exposed.
|
||||
Examples assume global namespace and availability from window object.
|
||||
For now API implemented as standard standard Require JS AMDs. Could attach
|
||||
to window from bundle.js. Perhaps attaching to window not best approach though...
|
||||
* Have not included validation (eg. start time < end time) or any other
|
||||
business logic such as what happens when outer interval gets dragged
|
||||
within range of inner interval. Focus is on teasing out the public API
|
||||
right now.
|
||||
* Time systems are vague right now also, I don't know how they're going
|
||||
to work or whether any API has yet been specified.
|
||||
* Not clear on the differences between real-time and follow-time as it
|
||||
concerns the time conductor? For now the API has an end bounds mode
|
||||
of FOLLOW which automatically tracks current time, and a start time mode
|
||||
of RELATIVE. I can envision a real-time plot that is not in follow time mode,
|
||||
but not sure what implication is for time conductor itself and how it
|
||||
differs from an historical plot?
|
||||
* Should the time conductor be responsible for choosing time system / domain? Currently
|
||||
it is.
|
||||
|
||||
## Use Cases
|
||||
1. Historical session is loaded and system sets time bounds on conductor
|
||||
2. Real-time session is loaded, setting custom start and end deltas
|
||||
3. User changes time of interest
|
||||
4. Plot controller listens for change to TOI
|
||||
5. Plot Controller updated on tick
|
||||
6. Plot Controller updated when user changes bounds (eg to reset plot zoom)
|
||||
7. Conductor controller needs to update bounds and mode on TC when user changes bounds
|
||||
|
||||
### Additional possible use-cases
|
||||
1. Telemetry adapter wants to indicate presence of data at a particular time
|
||||
2. Time conductor controller wants to paint map of data availability.
|
||||
|
||||
These use-cases could be features of the TimeConductor, but perhaps makes
|
||||
sense to make knowledge of data availability the sole preserve of telemetry
|
||||
adapters, not TimeConductor itself. Adapters will be ultimately responsible
|
||||
for providing these data so doesn't make much sense to duplicate elsewhere.
|
||||
The TimeConductorController - which knows tick interval on scale (which
|
||||
TimeConductor API does not) - could simply request data availability from
|
||||
telemetry API and paint it into the Time Conductor UI
|
||||
|
||||
## Example implementations of use cases
|
||||
### 1. Real time session is loaded (outside of TC) and system sets time bounds on conductor
|
||||
``` javascript
|
||||
function loadSession(telemetryMetadata) {
|
||||
var tc = MCT.conductor;
|
||||
tc.timeSystem(session.timeSystem());
|
||||
|
||||
//Set start and end modes to fixed date
|
||||
tc.mode(new FixedMode());
|
||||
|
||||
//Set both inner and outer bounds
|
||||
tc.bounds({start: session.start(), end: session.end()});
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Real-time session is loaded (outside of TC), setting custom start and end deltas
|
||||
``` javascript
|
||||
function loadSession(session) {
|
||||
var tc = MCT.conductor;
|
||||
var FIFTEEN_MINUTES = 15 * 60 * 1000;
|
||||
|
||||
// Could have a central ticking source somewhere, or connect to a
|
||||
// remote ticking source. Should not need to be done manually with
|
||||
// each session load. Actually not quite sure what to do with tick
|
||||
// sources yet.
|
||||
|
||||
var tickSource = new LocalClock();
|
||||
tickSource.attach(); // Start ticking
|
||||
|
||||
var mode = new RealtimeMode({
|
||||
startDelta: FIFTEEN_MINUTES,
|
||||
endDelta: 0 // End delta offset is from "Now" in the time system
|
||||
});
|
||||
|
||||
tc.timeSystem(session.timeSystem());
|
||||
|
||||
// Set mode to realtime, specifying a tick source
|
||||
tc.mode(mode);
|
||||
|
||||
//No need to set bounds manually, will be established by mode and the deltas specified
|
||||
}
|
||||
```
|
||||
|
||||
### 3. User changes time of interest
|
||||
```javascript
|
||||
//Somewhere in the TimeConductorController...
|
||||
function changeTOI(newTime) {
|
||||
MCT.conductor.timeOfInterest(newTime);
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Plot controller listens for change to TOI
|
||||
```javascript
|
||||
// toi is attribute of Time Conductor object. Add a listener to the time
|
||||
// conductor to be alerted to changes in value
|
||||
|
||||
// Time conductor is an event emitter, listen to timeOfInterest event
|
||||
MCT.conductor.on("timeOfInterest", function (timeOfInterest) {
|
||||
plot.setTimeOfInterest(timeOfInterest);
|
||||
}
|
||||
```
|
||||
|
||||
### 5. Plot Controller updated on tick
|
||||
``` javascript
|
||||
MCT.conductor.on("bounds", function (bounds) {
|
||||
plotUpdater.setDomainBounds(bounds.start, bounds.end);
|
||||
});
|
||||
```
|
||||
|
||||
### 6. Plot Controller updated when user changes bounds (eg to reset plot zoom)
|
||||
``` javascript
|
||||
MCT.conductor.on("refresh", function (conductor) {
|
||||
plot.setBounds(conductor.bounds());
|
||||
//Also need to reset tick labels. if time system has changed.
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
### 7. Conductor controller needs to update bounds and mode on TC when user changes bounds
|
||||
```javascript
|
||||
var tc = MCT.conductor;
|
||||
|
||||
function dragStartHandle(finalPos){
|
||||
var bounds = tc.bounds();
|
||||
bounds.start = positionToTime(finalPos)
|
||||
tc.bounds(bounds);
|
||||
}
|
||||
|
||||
function dragEndHandle(finalPos){
|
||||
var bounds = tc.bounds();
|
||||
bounds.end = positionToTime(finalPos);
|
||||
tc.bounds(bounds);
|
||||
}
|
||||
|
||||
```
|
148
platform/features/conductor-redux/src/TimeConductor.js
Normal file
148
platform/features/conductor-redux/src/TimeConductor.js
Normal file
@ -0,0 +1,148 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web 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 Web 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.
|
||||
*****************************************************************************/
|
||||
|
||||
define([
|
||||
"EventEmitter",
|
||||
"./UTCTimeSystem",
|
||||
"./modes/RelativeMode",
|
||||
"./modes/FixedMode"
|
||||
], function (EventEmitter, UTCTimeSystem, RelativeMode, FixedMode) {
|
||||
|
||||
/**
|
||||
* A class for setting and querying time conductor state.
|
||||
*
|
||||
* @event TimeConductor:refresh The time conductor has changed, and its values should be re-queried
|
||||
* @event TimeConductor:bounds The start time, end time, or both have been updated
|
||||
* @event TimeConductor:timeOfInterest The Time of Interest has moved.
|
||||
* @constructor
|
||||
*/
|
||||
function TimeConductor() {
|
||||
EventEmitter.call(this);
|
||||
|
||||
//The Time System
|
||||
this.system = new UTCTimeSystem();
|
||||
//The Time Of Interest
|
||||
this.toi = undefined;
|
||||
|
||||
this.bounds = {
|
||||
start: undefined,
|
||||
end: undefined
|
||||
};
|
||||
|
||||
//Default to fixed mode
|
||||
this.modeVal = new FixedMode();
|
||||
}
|
||||
|
||||
TimeConductor.prototype = Object.create(EventEmitter.prototype);
|
||||
|
||||
/**
|
||||
* Validate the given bounds. This can be used for pre-validation of
|
||||
* bounds, for example by views validating user inputs.
|
||||
* @param bounds The start and end time of the conductor.
|
||||
* @returns {string | true} A validation error, or true if valid
|
||||
*/
|
||||
TimeConductor.prototype.validateBounds = function (bounds) {
|
||||
if (!bounds.start ||
|
||||
!bounds.end ||
|
||||
isNaN(bounds.start) ||
|
||||
isNaN(bounds.end)
|
||||
) {
|
||||
return "Start and end must be specified as integer values";
|
||||
} else if (bounds.start > bounds.end){
|
||||
return "Specified start date exceeds end bound";
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
function throwOnError(validationResult) {
|
||||
if (validationResult !== true) {
|
||||
throw validationResult;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the mode of the time conductor.
|
||||
* @param {FixedMode | RealtimeMode} newMode
|
||||
* @fires TimeConductor#refresh
|
||||
* @returns {FixedMode | RealtimeMode}
|
||||
*/
|
||||
TimeConductor.prototype.mode = function (newMode) {
|
||||
if (arguments.length > 0) {
|
||||
this.modeVal = newMode;
|
||||
this.emit('refresh', this);
|
||||
newMode.initialize();
|
||||
}
|
||||
return this.modeVal;
|
||||
};
|
||||
|
||||
/**
|
||||
* @typedef {Object} TimeConductorBounds
|
||||
* @property {number} start The start time displayed by the time conductor in ms since epoch. Epoch determined by current time system
|
||||
* @property {number} end The end time displayed by the time conductor in ms since epoch.
|
||||
*/
|
||||
/**
|
||||
* Set the start and end time of the time conductor. Basic validation of bounds is performed.
|
||||
*
|
||||
* @param {TimeConductorBounds} newBounds
|
||||
* @throws {string} Validation error
|
||||
* @fires TimeConductor#bounds
|
||||
* @returns {TimeConductorBounds}
|
||||
*/
|
||||
TimeConductor.prototype.bounds = function (newBounds) {
|
||||
if (arguments.length > 0) {
|
||||
throwOnError(this.validateBounds(newBounds));
|
||||
this.bounds = newBounds;
|
||||
this.emit('bounds', this.bounds);
|
||||
}
|
||||
return this.bounds;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the time system of the TimeConductor. Time systems determine units, epoch, and other aspects of time representation.
|
||||
* @param newTimeSystem
|
||||
* @fires TimeConductor#refresh
|
||||
* @returns {TimeSystem} The currently applied time system
|
||||
*/
|
||||
TimeConductor.prototype.timeSystem = function (newTimeSystem) {
|
||||
if (arguments.length > 0) {
|
||||
this.system = newTimeSystem;
|
||||
this.emit('refresh', this);
|
||||
}
|
||||
return this.system;
|
||||
};
|
||||
|
||||
/**
|
||||
* The Time of Interest is the temporal focus of the current view. It can be manipulated by the user from the time
|
||||
* conductor or from other views.
|
||||
* @param newTOI
|
||||
* @returns {*}
|
||||
*/
|
||||
TimeConductor.prototype.timeOfInterest = function (newTOI) {
|
||||
if (arguments.length > 0) {
|
||||
this.toi = newTOI;
|
||||
this.emit('toi');
|
||||
}
|
||||
return this.toi;
|
||||
};
|
||||
|
||||
return TimeConductor;
|
||||
});
|
69
platform/features/conductor-redux/src/TimeConductorBounds.js
Normal file
69
platform/features/conductor-redux/src/TimeConductorBounds.js
Normal file
@ -0,0 +1,69 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web 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 Web 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.
|
||||
*****************************************************************************/
|
||||
|
||||
define( [], function () {
|
||||
|
||||
function TimeConductorBounds(conductor) {
|
||||
this.listeners = [];
|
||||
this.start = new TimeConductorLimit(this);
|
||||
this.end = new TimeConductorLimit(this);
|
||||
this.conductor = conductor;
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
TimeConductorBounds.prototype.notify = function (eventType) {
|
||||
eventType = eventType || this.conductor.EventTypes.EITHER;
|
||||
|
||||
this.listeners.forEach(function (element){
|
||||
if (element.eventType & eventType){
|
||||
element.listener(this);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Listen for changes to the bounds
|
||||
* @param listener a callback function to be called when the bounds change. The bounds object will be passed into
|
||||
* the function (ie. 'this')
|
||||
* @param eventType{TimeConductorBounds.EventType} The event type to listen to, ie. system, user, or Both. If not provied, will default to both.
|
||||
* @returns {Function} an 'unlisten' function
|
||||
*/
|
||||
TimeConductorBounds.prototype.listen = function (listener, eventType) {
|
||||
var self = this,
|
||||
wrappedListener = {
|
||||
listener: listener,
|
||||
eventType: eventType
|
||||
};
|
||||
this.listeners.push(wrappedListener);
|
||||
return function () {
|
||||
self.listeners = self.listeners.filter(function (element){
|
||||
return element !== wrappedListener;
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
return TimeConductorBounds;
|
||||
});
|
71
platform/features/conductor-redux/src/TimeConductorLimit.js
Normal file
71
platform/features/conductor-redux/src/TimeConductorLimit.js
Normal file
@ -0,0 +1,71 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web 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 Web 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.
|
||||
*****************************************************************************/
|
||||
|
||||
define( [], function () {
|
||||
|
||||
/**
|
||||
* Defines a limit object for a time conductor bounds, ie. start or end values. Holds time and delta values.
|
||||
*
|
||||
* TODO: Calculation of time from delta. Should probably be done from the 'tick' function at a higher level,
|
||||
* which has start and end values in scope to do calculations.
|
||||
* @param listener
|
||||
* @constructor
|
||||
*/
|
||||
function TimeConductorLimit(listener) {
|
||||
this.deltaVal = undefined;
|
||||
this.timeVal = undefined;
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get or set the start value for the bounds. If newVal is provided, will set the start value. May only set delta in
|
||||
* RELATIVE mode.
|
||||
* @param {Number} [newVal] a time in ms. A negative value describes a time in the past, positive in the future. A
|
||||
* start time cannot have a positive delta offset, but an end time can.
|
||||
* @param {TimeConductor.EventTypes} [eventType=TimeConductor.EventTypes.EITHER] The type of event (User, System, or
|
||||
* Either)
|
||||
* @returns {Number} the start date (in milliseconds since some epoch, depending on time system)
|
||||
*/
|
||||
TimeConductorLimit.prototype.delta = function (newVal, eventType) {
|
||||
if (arguments.length > 0) {
|
||||
this.deltaVal = newVal;
|
||||
this.listener.notify(eventType);
|
||||
}
|
||||
return this.deltaVal;
|
||||
};
|
||||
/**
|
||||
* Get or set the end value for the bounds. If newVal is provided, will set the end value. May only set time in FIXED
|
||||
* mode
|
||||
* @param {Number} [newVal] A time in ms relative to time system epoch.
|
||||
* @param {TimeConductor.EventTypes} [eventType=TimeConductor.EventTypes.EITHER] The type of event (User, System, or Either)
|
||||
* @returns {Number} the end date (in milliseconds since some epoch, depending on time system)
|
||||
*/
|
||||
TimeConductorLimit.prototype.time = function (newVal, eventType) {
|
||||
if (arguments.length > 0) {
|
||||
this.timeVal = newVal;
|
||||
this.listener.notify(eventType);
|
||||
}
|
||||
return this.timeVal;
|
||||
};
|
||||
|
||||
return TimeConductorLimit;
|
||||
});
|
29
platform/features/conductor-redux/src/modes/FixedMode.js
Normal file
29
platform/features/conductor-redux/src/modes/FixedMode.js
Normal file
@ -0,0 +1,29 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web 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 Web 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.
|
||||
*****************************************************************************/
|
||||
|
||||
define([
|
||||
], function () {
|
||||
function FixedMode(options) {
|
||||
|
||||
}
|
||||
return FixedMode;
|
||||
});
|
71
platform/features/conductor-redux/src/modes/RealtimeMode.js
Normal file
71
platform/features/conductor-redux/src/modes/RealtimeMode.js
Normal file
@ -0,0 +1,71 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web 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 Web 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.
|
||||
*****************************************************************************/
|
||||
|
||||
define([
|
||||
], function () {
|
||||
|
||||
/**
|
||||
* Class representing the real-time mode of the Time Conductor. In this mode,
|
||||
* the bounds are updated automatically based on a timing source.
|
||||
*
|
||||
* @param options
|
||||
* @constructor
|
||||
*/
|
||||
function RealtimeMode(options) {
|
||||
this.startDelta = options.startDelta;
|
||||
this.endDelta = options.endDelta;
|
||||
this.tickSource = options.tickSource;
|
||||
this.system = undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
this.prototype.initialize = function (conductor) {
|
||||
var self = this;
|
||||
/**
|
||||
* Deltas can be specified for start and end. An end delta will mean
|
||||
* that the end bound is always in the future by 'endDelta' units
|
||||
*/
|
||||
this.startDelta = this.startDelta || conductor.timeSystem().DEFAULT_DELTA;
|
||||
this.endDelta = this.endDelta || 0;
|
||||
|
||||
function setBounds() {
|
||||
var now = conductor.timeSystem().now();
|
||||
conductor.bounds({
|
||||
start: now - self.startDelta,
|
||||
end: now + self.endDelta
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* If a tick source is specified, listen for ticks
|
||||
*/
|
||||
if (this.tickSource) {
|
||||
this.tickSource.on("tick", setBounds);
|
||||
}
|
||||
//Set initial bounds
|
||||
setBounds();
|
||||
};
|
||||
|
||||
return RealtimeMode;
|
||||
});
|
@ -0,0 +1,50 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web 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 Web 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.
|
||||
*****************************************************************************/
|
||||
|
||||
define([
|
||||
"./TimingSource"
|
||||
], function (TimingSource) {
|
||||
|
||||
/**
|
||||
* A timing source that 'ticks' when new data is available
|
||||
* @implements TimingSource
|
||||
* @constructor
|
||||
*/
|
||||
function DataAvailabilityTicker(){
|
||||
TimingSource.call(this);
|
||||
}
|
||||
|
||||
DataAvailabilityTicker.prototype = Object.create(TimingSource.prototype);
|
||||
|
||||
/**
|
||||
* Registers an event listener to listen for data availability at telemetry source
|
||||
*/
|
||||
DataAvailabilityTicker.prototype.attach = function () {};
|
||||
|
||||
/**
|
||||
* Unregisters event listeners, seasing tick events.
|
||||
*/
|
||||
DataAvailabilityTicker.prototype.detach = function () {};
|
||||
|
||||
DataAvailabilityTicker.prototype.attached = function () {}
|
||||
|
||||
});
|
74
platform/features/conductor-redux/src/timing/LocalClock.js
Normal file
74
platform/features/conductor-redux/src/timing/LocalClock.js
Normal file
@ -0,0 +1,74 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web 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 Web 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.
|
||||
*****************************************************************************/
|
||||
|
||||
define([
|
||||
"./TimingSource"
|
||||
], function (TimingSource) {
|
||||
|
||||
var ONE_SECOND = 1 * 1000;
|
||||
|
||||
/**
|
||||
* A clock that ticks at the given interval (given in ms).
|
||||
*
|
||||
* @implements TimingSource
|
||||
* @constructor
|
||||
*/
|
||||
function LocalClock(interval){
|
||||
TimingSource.call(this);
|
||||
|
||||
this.interval = interval;
|
||||
this.intervalHandle = undefined;
|
||||
}
|
||||
|
||||
LocalClock.prototype = Object.create(TimingSource.prototype);
|
||||
|
||||
/**
|
||||
* Start the clock ticking. Ticks can be listened to by registering
|
||||
* listeners of the "tick" event
|
||||
*/
|
||||
LocalClock.prototype.attach = function () {
|
||||
function tick() {
|
||||
this.emit("tick");
|
||||
}
|
||||
this.stop();
|
||||
|
||||
this.intervalHandle = setInterval(this.bind(this), this.interval || ONE_SECOND);
|
||||
};
|
||||
|
||||
/**
|
||||
* Stop the currently running clock. "tick" events will no longer be emitted
|
||||
*/
|
||||
LocalClock.prototype.detach = function () {
|
||||
if (this.intervalHandle) {
|
||||
clearInterval(this.intervalHandle);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @returns {boolean} true if the clock is currently running
|
||||
*/
|
||||
LocalClock.prototype.attached = function () {
|
||||
return !!this.intervalHandle;
|
||||
}
|
||||
|
||||
|
||||
});
|
56
platform/features/conductor-redux/src/timing/TimingSource.js
Normal file
56
platform/features/conductor-redux/src/timing/TimingSource.js
Normal file
@ -0,0 +1,56 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web 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 Web 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.
|
||||
*****************************************************************************/
|
||||
|
||||
define([
|
||||
"EventEmitter"
|
||||
], function (EventEmitter) {
|
||||
|
||||
/**
|
||||
* An interface defining a timing source. A timing source is a local or remote source of 'tick' events.
|
||||
* Could be used to tick when new data is received from a data source.
|
||||
* @interface
|
||||
* @constructor
|
||||
*/
|
||||
function TimingSource(){
|
||||
EventEmitter.call(this);
|
||||
}
|
||||
|
||||
TimingSource.prototype = Object.create(EventEmitter.prototype);
|
||||
|
||||
/**
|
||||
* Attach to the timing source. If it's a local clock, will start a local timing loop. If remote, will connect to
|
||||
* remote source. If event driven (eg. based on data availability) will attach an event listener to telemetry source.
|
||||
*/
|
||||
TimingSource.prototype.attach = function () {};
|
||||
|
||||
/**
|
||||
* Detach from the timing source
|
||||
*/
|
||||
TimingSource.prototype.detach = function () {};
|
||||
|
||||
/**
|
||||
* @returns {boolean} true if current attached to timing source
|
||||
*/
|
||||
TimingSource.prototype.attached = function () {}
|
||||
|
||||
|
||||
});
|
Reference in New Issue
Block a user