mirror of
https://github.com/nasa/openmct.git
synced 2025-01-21 12:05:12 +00:00
5940f94644
Don't callback for any telemetry requests from a TelemetryHandle if the handle has been destroyed.
144 lines
6.0 KiB
JavaScript
144 lines
6.0 KiB
JavaScript
/*****************************************************************************
|
|
* 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.
|
|
*****************************************************************************/
|
|
/*global define*/
|
|
|
|
define(
|
|
[],
|
|
function () {
|
|
"use strict";
|
|
|
|
/**
|
|
* A telemetry handle acts as a helper in issuing requests for
|
|
* new telemetry as well as subscribing to real-time updates
|
|
* for the same telemetry series. This is exposed through the
|
|
* `telemetryHandler` service.
|
|
* @param $q Angular's $q, for promises
|
|
* @param {TelemetrySubscription} subscription a subscription
|
|
* to supplied telemetry
|
|
* @constructor
|
|
* @memberof platform/telemetry
|
|
*/
|
|
function TelemetryHandle($q, subscription) {
|
|
var seriesMap = {},
|
|
active = true,
|
|
self = Object.create(subscription);
|
|
|
|
// Request a telemetry series for this specific object
|
|
function requestSeries(telemetryObject, request, callback) {
|
|
var id = telemetryObject.getId(),
|
|
telemetry = telemetryObject.getCapability('telemetry');
|
|
|
|
function receiveSeries(series) {
|
|
// Store it for subsequent lookup
|
|
seriesMap[id] = series;
|
|
// Notify callback of new series data, if there is one
|
|
if (callback && active) {
|
|
callback(telemetryObject, series);
|
|
}
|
|
// Pass it along for promise-chaining
|
|
return series;
|
|
}
|
|
|
|
// Issue the request via the object's telemetry capability
|
|
return telemetry.requestData(request).then(receiveSeries);
|
|
}
|
|
|
|
self.unsubscribe = function () {
|
|
active = false;
|
|
return subscription.unsubscribe();
|
|
};
|
|
|
|
/**
|
|
* Get the most recently obtained telemetry data series associated
|
|
* with this domain object.
|
|
* @param {DomainObject} the domain object which has telemetry
|
|
* data associated with it
|
|
* @return {TelemetrySeries} the most recent telemetry series
|
|
* (or undefined if there is not one)
|
|
* @memberof platform/telemetry.TelemetryHandle#
|
|
*/
|
|
self.getSeries = function (domainObject) {
|
|
var id = domainObject.getId();
|
|
return seriesMap[id];
|
|
};
|
|
|
|
|
|
/**
|
|
* Change the request duration.
|
|
* @param {TelemetryRequest} request the request to issue
|
|
* @param {Function} [callback] a callback that will be
|
|
* invoked as new data becomes available, with the
|
|
* domain object for which new data is available.
|
|
* @memberof platform/telemetry.TelemetryHandle#
|
|
*/
|
|
self.request = function (request, callback) {
|
|
// Issue (and handle) the new request from this object
|
|
function issueRequest(telemetryObject) {
|
|
return requestSeries(telemetryObject, request, callback);
|
|
}
|
|
|
|
// Map the request to all telemetry objects
|
|
function issueRequests(telemetryObjects) {
|
|
return $q.all(telemetryObjects.map(issueRequest));
|
|
}
|
|
|
|
// If the request is a simple number, treat it as a duration
|
|
request = (typeof request === 'number') ?
|
|
{ duration: request } : request;
|
|
|
|
// Look up telemetry-providing objects from the subscription,
|
|
// then issue new requests.
|
|
return subscription.promiseTelemetryObjects()
|
|
.then(issueRequests);
|
|
};
|
|
|
|
/**
|
|
* Get the latest telemetry datum for this domain object. This
|
|
* will be from real-time telemetry, unless an index is specified,
|
|
* in which case it will be pulled from the historical telemetry
|
|
* series at the specified index. If there is no latest available
|
|
* datum, this will return undefined.
|
|
*
|
|
* @param {DomainObject} domainObject the object of interest
|
|
* @param {number} [index] the index of the data of interest
|
|
* @returns {TelemetryDatum} the most recent datum
|
|
*/
|
|
self.getDatum = function (telemetryObject, index) {
|
|
function makeNewDatum(series) {
|
|
return series ?
|
|
subscription.makeDatum(telemetryObject, series, index) :
|
|
undefined;
|
|
}
|
|
|
|
return typeof index !== 'number' ?
|
|
subscription.getDatum(telemetryObject) :
|
|
makeNewDatum(this.getSeries(telemetryObject));
|
|
};
|
|
|
|
return self;
|
|
}
|
|
|
|
return TelemetryHandle;
|
|
|
|
}
|
|
);
|