mirror of
https://github.com/nasa/openmct.git
synced 2025-01-06 05:14:13 +00:00
18bc7d3637
WTD-1482
121 lines
4.7 KiB
JavaScript
121 lines
4.7 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,Float32Array*/
|
|
|
|
define(
|
|
['./PlotSeriesWindow'],
|
|
function (PlotSeriesWindow) {
|
|
"use strict";
|
|
|
|
|
|
/**
|
|
* Represents a single line or trace of a plot.
|
|
* @param {{PlotLineBuffer}} buffer the plot buffer
|
|
* @constructor
|
|
*/
|
|
function PlotLine(buffer) {
|
|
this.buffer = buffer;
|
|
}
|
|
|
|
/**
|
|
* Add a point to this plot line.
|
|
* @param {number} domainValue the domain value
|
|
* @param {number} rangeValue the range value
|
|
*/
|
|
PlotLine.prototype.addPoint = function (domainValue, rangeValue) {
|
|
var buffer = this.buffer,
|
|
index;
|
|
|
|
// Make sure we got real/useful values here...
|
|
if (domainValue !== undefined && rangeValue !== undefined) {
|
|
index = buffer.findInsertionIndex(domainValue);
|
|
|
|
// Already in the buffer? Skip insertion
|
|
if (index < 0) {
|
|
return;
|
|
}
|
|
|
|
// Insert the point
|
|
if (!buffer.insertPoint(domainValue, rangeValue, index)) {
|
|
// If insertion failed, trim from the beginning...
|
|
buffer.trim(1);
|
|
// ...and try again.
|
|
buffer.insertPoint(domainValue, rangeValue, index);
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Add a series of telemetry data to this plot line.
|
|
* @param {TelemetrySeries} series the data series
|
|
* @param {string} [domain] the key indicating which domain
|
|
* to use when looking up data from this series
|
|
* @param {string} [range] the key indicating which range
|
|
* to use when looking up data from this series
|
|
*/
|
|
PlotLine.prototype.addSeries = function (series, domain, range) {
|
|
var buffer = this.buffer;
|
|
|
|
// Insert a time-windowed data series into the buffer
|
|
function insertSeriesWindow(seriesWindow) {
|
|
var count = seriesWindow.getPointCount();
|
|
|
|
function doInsert() {
|
|
var firstTimestamp = seriesWindow.getDomainValue(0),
|
|
lastTimestamp = seriesWindow.getDomainValue(count - 1),
|
|
startIndex = buffer.findInsertionIndex(firstTimestamp),
|
|
endIndex = buffer.findInsertionIndex(lastTimestamp);
|
|
|
|
// Does the whole series fit in between two adjacent indexes?
|
|
if ((startIndex === endIndex) && startIndex > -1) {
|
|
// Insert it in between
|
|
buffer.insert(seriesWindow, startIndex);
|
|
} else {
|
|
// Split it up, and add the two halves
|
|
seriesWindow.split().forEach(insertSeriesWindow);
|
|
}
|
|
}
|
|
|
|
// Only insert if there are points to insert
|
|
if (count > 0) {
|
|
doInsert();
|
|
}
|
|
}
|
|
|
|
// Should try to add via insertion if a
|
|
// clear insertion point is available;
|
|
// if not, should split and add each half.
|
|
// Insertion operation also needs to factor out
|
|
// redundant timestamps, for overlapping data
|
|
insertSeriesWindow(new PlotSeriesWindow(
|
|
series,
|
|
domain,
|
|
range,
|
|
0,
|
|
series.getPointCount()
|
|
));
|
|
};
|
|
|
|
return PlotLine;
|
|
}
|
|
);
|