From f96f78ff79c84a9897fa59cca99782d9c45c3ea8 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 3 Aug 2016 19:34:31 -0700 Subject: [PATCH] Select appropriate tick source based on mode --- example/localTimeSystem/src/LADTickSource.js | 56 +++++++++++++++++++ .../localTimeSystem/src/LocalTimeSystem.js | 7 ++- .../conductor/src/timeSystems/LocalClock.js | 1 + .../src/ui/TimeConductorController.js | 24 +++++++- .../conductor/src/ui/modes/FollowMode.js | 28 +++++----- 5 files changed, 97 insertions(+), 19 deletions(-) create mode 100644 example/localTimeSystem/src/LADTickSource.js diff --git a/example/localTimeSystem/src/LADTickSource.js b/example/localTimeSystem/src/LADTickSource.js new file mode 100644 index 0000000000..e389d91621 --- /dev/null +++ b/example/localTimeSystem/src/LADTickSource.js @@ -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(['../../../platform/features/conductor-v2/conductor/src/timeSystems/LocalClock'], function (LocalClock) { + /** + * @implements TickSource + * @constructor + */ + function LADTickSource ($timeout, period) { + LocalClock.call(this, $timeout, period); + + this.metadata = { + key: 'test-lad', + cssclass: 'icon-clock', + label: 'Latest Available Data', + name: 'Latest available data', + description: 'Monitor real-time streaming data as it comes in. The Time Conductor and displays will automatically advance themselves based on a UTC clock.' + }; + } + LADTickSource.prototype = Object.create(LocalClock.prototype); + + LADTickSource.prototype.tick = function () { + console.log('data tick'); + var now = Date.now(); + this.listeners.forEach(function (listener){ + listener(now); + }); + this.timeoutHandle = this.$timeout(this.tick.bind(this), this.period); + }; + + + LADTickSource.prototype.type = function () { + return 'data'; + }; + + return LADTickSource; +}); diff --git a/example/localTimeSystem/src/LocalTimeSystem.js b/example/localTimeSystem/src/LocalTimeSystem.js index dd62fe1518..6693d090ca 100644 --- a/example/localTimeSystem/src/LocalTimeSystem.js +++ b/example/localTimeSystem/src/LocalTimeSystem.js @@ -22,8 +22,9 @@ define([ '../../../platform/features/conductor-v2/conductor/src/timeSystems/TimeSystem', - '../../../platform/features/conductor-v2/conductor/src/timeSystems/LocalClock' -], function (TimeSystem, LocalClock) { + '../../../platform/features/conductor-v2/conductor/src/timeSystems/LocalClock', + './LADTickSource' +], function (TimeSystem, LocalClock, LADTickSource) { var FIFTEEN_MINUTES = 15 * 60 * 1000, DEFAULT_PERIOD = 1000; @@ -47,7 +48,7 @@ define([ }; this._formats = ['local-format']; - this._tickSources = [new LocalClock($timeout, DEFAULT_PERIOD)]; + this._tickSources = [new LocalClock($timeout, DEFAULT_PERIOD), new LADTickSource($timeout, DEFAULT_PERIOD)]; } LocalTimeSystem.prototype = Object.create(TimeSystem.prototype); diff --git a/platform/features/conductor-v2/conductor/src/timeSystems/LocalClock.js b/platform/features/conductor-v2/conductor/src/timeSystems/LocalClock.js index 80e36b4265..aafec72017 100644 --- a/platform/features/conductor-v2/conductor/src/timeSystems/LocalClock.js +++ b/platform/features/conductor-v2/conductor/src/timeSystems/LocalClock.js @@ -54,6 +54,7 @@ define(['./TickSource'], function (TickSource) { }; LocalClock.prototype.tick = function () { + console.log('clock tick'); var now = Date.now(); this.listeners.forEach(function (listener){ listener(now); diff --git a/platform/features/conductor-v2/conductor/src/ui/TimeConductorController.js b/platform/features/conductor-v2/conductor/src/ui/TimeConductorController.js index a81558c48e..0e5c6e0759 100644 --- a/platform/features/conductor-v2/conductor/src/ui/TimeConductorController.js +++ b/platform/features/conductor-v2/conductor/src/ui/TimeConductorController.js @@ -67,6 +67,7 @@ define( cssclass: 'icon-clock', label: 'Real-time', name: 'Real-time Mode', + tickSourceType: 'clock', description: 'Monitor real-time streaming data as it comes in. The Time Conductor and displays will automatically advance themselves based on a UTC clock.' }; } @@ -77,6 +78,7 @@ define( cssclass: 'icon-database', label: 'LAD', name: 'LAD Mode', + tickSourceType: 'data', description: 'Latest Available Data mode monitors real-time streaming data as it comes in. The Time Conductor and displays will only advance when data becomes available.' }; } @@ -184,6 +186,12 @@ define( }); } }; + + TimeConductorController.prototype.selectTickSource = function (timeSystem, sourceType) { + return timeSystem.tickSources().filter(function (source){ + return source.type() === sourceType; + })[0]; + } /** * Change the selected Time Conductor mode. This will call destroy @@ -197,6 +205,7 @@ define( var newMode = undefined; var timeSystems = []; var timeSystem = undefined; + var tickSourceType = this.modes[newModeKey].tickSourceType; this.$scope.modeModel.selectedKey = newModeKey; @@ -210,19 +219,23 @@ define( timeSystem = timeSystems[0]; newMode = new FixedMode(this.conductor, timeSystem, newModeKey); break; + case 'realtime': // Filter time systems to only those with clock tick // sources - timeSystems = this.timeSystemsForSourceType('clock'); + timeSystems = this.timeSystemsForSourceType(tickSourceType); timeSystem = timeSystems[0]; newMode = new FollowMode(this.conductor, timeSystem, newModeKey); + newMode.tickSource(this.selectTickSource(timeSystem, tickSourceType)); break; + case 'latest': // Filter time systems to only those with data tick // sources - timeSystems = this.timeSystemsForSourceType('data'); + timeSystems = this.timeSystemsForSourceType(tickSourceType); timeSystem = timeSystems[0]; newMode = new FollowMode(this.conductor, timeSystem, newModeKey); + newMode.tickSource(this.selectTickSource(timeSystem, tickSourceType)); break; } newMode.initialize(); @@ -283,6 +296,13 @@ define( var mode = this.conductorService.mode(); mode.timeSystem(newTimeSystem); this.setDeltasFromTimeSystem(newTimeSystem); + + // If current mode supports ticking, set an appropriate tick + // source from the new time system + if (mode.tickSource) { + var tickSourceType = this.modes[mode.key()].tickSourceType; + mode.tickSource(this.selectTickSource(newTimeSystem, tickSourceType)); + } } }; diff --git a/platform/features/conductor-v2/conductor/src/ui/modes/FollowMode.js b/platform/features/conductor-v2/conductor/src/ui/modes/FollowMode.js index fc6a2a8ba9..fb398c0674 100644 --- a/platform/features/conductor-v2/conductor/src/ui/modes/FollowMode.js +++ b/platform/features/conductor-v2/conductor/src/ui/modes/FollowMode.js @@ -37,6 +37,8 @@ define( TimeConductorMode.call(this, conductor, timeSystem, key); this._deltas = undefined; + this._tickSource = undefined; + this._tickSourceUnlisten = undefined; } FollowMode.prototype = Object.create(TimeConductorMode.prototype); @@ -59,16 +61,20 @@ define( }; /** - * @private + * Get or set tick source. Setting tick source will also start + * listening to it and unlisten from any existing tick source * @param tickSource + * @returns {undefined|*} */ - FollowMode.prototype.listenToTickSource = function () { - if (this._timeSystem) { - var tickSource = this._timeSystem.tickSources()[0]; - if (tickSource) { - this.tickSourceUnlisten = tickSource.listen(this.tick.bind(this)); + FollowMode.prototype.tickSource = function (tickSource) { + if (tickSource) { + if (this._tickSourceUnlisten) { + this._tickSourceUnlisten(); } + this._tickSource = tickSource; + this._tickSourceUnlisten = tickSource.listen(this.tick.bind(this)); } + return this._tickSource; }; /** @@ -81,10 +87,6 @@ define( TimeConductorMode.prototype.timeSystem.apply(this, arguments); if (timeSystem) { - if (this.tickSourceUnlisten) { - this.tickSourceUnlisten(); - } - var defaults = timeSystem.defaults()[0]; if (arguments.length > 0) { @@ -100,8 +102,6 @@ define( } this.conductor.timeSystem(timeSystem, bounds); - - this.listenToTickSource(); } } return this._timeSystem; @@ -139,8 +139,8 @@ define( * Stop listening to tick sources */ FollowMode.prototype.destroy = function () { - if (this.tickSourceUnlisten) { - this.tickSourceUnlisten(); + if (this._tickSourceUnlisten) { + this._tickSourceUnlisten(); } };