mirror of
https://github.com/nasa/openmct.git
synced 2025-04-09 04:14:32 +00:00
[Telemetry] Add data structure specs
Add specs for data structures which will support resolution of WTD-784 by retaining all data not yet received by callbacks (instead of just the very latest) such that plots can ensure they do not miss streaming data.
This commit is contained in:
parent
01d66bbf93
commit
acf4261a08
0
platform/telemetry/src/TelemetryQueue.js
Normal file
0
platform/telemetry/src/TelemetryQueue.js
Normal file
@ -1,8 +1,8 @@
|
||||
/*global define*/
|
||||
|
||||
define(
|
||||
[],
|
||||
function () {
|
||||
['./TelemetryQueue', './TelemetryTable'],
|
||||
function (TelemetryQueue, TelemetryTable) {
|
||||
"use strict";
|
||||
|
||||
|
||||
@ -25,11 +25,16 @@ define(
|
||||
* associated telemetry data is of interest
|
||||
* @param {Function} callback a function to invoke
|
||||
* when new data has become available.
|
||||
* @param {boolean} lossless true if callback should be invoked
|
||||
* once with every data point available; otherwise, multiple
|
||||
* data events in a short period of time will only invoke
|
||||
* the callback once, with access to the latest data
|
||||
*/
|
||||
function TelemetrySubscription($q, $timeout, domainObject, callback) {
|
||||
function TelemetrySubscription($q, $timeout, domainObject, callback, lossless) {
|
||||
var unsubscribePromise,
|
||||
latestValues = {},
|
||||
telemetryObjects = [],
|
||||
pool = lossless ? new TelemetryQueue() : new TelemetryTable(),
|
||||
metadatas,
|
||||
updatePending;
|
||||
|
||||
@ -56,10 +61,22 @@ define(
|
||||
});
|
||||
}
|
||||
|
||||
function updateValuesFromPool() {
|
||||
var values = pool.poll();
|
||||
Object.keys(values).forEach(function (k) {
|
||||
latestValues[k] = values[k];
|
||||
});
|
||||
}
|
||||
|
||||
// Invoke the observer callback to notify that new streaming
|
||||
// data has become available.
|
||||
function fireCallback() {
|
||||
callback();
|
||||
// Play back from queue if we are lossless
|
||||
while (!pool.isEmpty()) {
|
||||
updateValuesFromPool();
|
||||
callback();
|
||||
}
|
||||
|
||||
// Clear the pending flag so that future updates will
|
||||
// schedule this callback.
|
||||
updatePending = false;
|
||||
@ -80,10 +97,10 @@ define(
|
||||
|
||||
// Update the latest-value table
|
||||
if (count > 0) {
|
||||
latestValues[domainObject.getId()] = {
|
||||
pool.put(domainObject.getId(), {
|
||||
domain: telemetry.getDomainValue(count - 1),
|
||||
range: telemetry.getRangeValue(count - 1)
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
0
platform/telemetry/src/TelemetryTable.js
Normal file
0
platform/telemetry/src/TelemetryTable.js
Normal file
55
platform/telemetry/test/TelemetryQueueSpec.js
Normal file
55
platform/telemetry/test/TelemetryQueueSpec.js
Normal file
@ -0,0 +1,55 @@
|
||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
||||
|
||||
define(
|
||||
["../src/TelemetryQueue"],
|
||||
function (TelemetryQueue) {
|
||||
"use strict";
|
||||
|
||||
describe("The telemetry queue", function () {
|
||||
var queue;
|
||||
|
||||
beforeEach(function () {
|
||||
// put, isEmpty, dequeue
|
||||
queue = new TelemetryQueue();
|
||||
});
|
||||
|
||||
it("stores elements by key", function () {
|
||||
queue.put("a", { someKey: "some value" });
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some value" }});
|
||||
});
|
||||
|
||||
it("merges non-overlapping keys", function () {
|
||||
queue.put("a", { someKey: "some value" });
|
||||
queue.put("b", 42);
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some value" }, b: 42 });
|
||||
});
|
||||
|
||||
it("adds new objects for repeated keys", function () {
|
||||
queue.put("a", { someKey: "some value" });
|
||||
queue.put("a", { someKey: "some other value" });
|
||||
queue.put("b", 42);
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some value" }, b: 42 });
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some other value" } });
|
||||
});
|
||||
|
||||
it("reports emptiness", function () {
|
||||
expect(queue.isEmpty()).toBeTruthy();
|
||||
queue.put("a", { someKey: "some value" });
|
||||
queue.put("a", { someKey: "some other value" });
|
||||
queue.put("b", 42);
|
||||
expect(queue.isEmpty()).toBeFalsy();
|
||||
queue.poll();
|
||||
expect(queue.isEmpty()).toBeFalsy();
|
||||
queue.poll();
|
||||
expect(queue.isEmpty()).toBeTruthy();
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
);
|
53
platform/telemetry/test/TelemetryTableSpec.js
Normal file
53
platform/telemetry/test/TelemetryTableSpec.js
Normal file
@ -0,0 +1,53 @@
|
||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
||||
|
||||
define(
|
||||
["../src/TelemetryTable"],
|
||||
function (TelemetryTable) {
|
||||
"use strict";
|
||||
|
||||
describe("The telemetry table", function () {
|
||||
var queue;
|
||||
|
||||
beforeEach(function () {
|
||||
// put, isEmpty, dequeue
|
||||
queue = new TelemetryTable();
|
||||
});
|
||||
|
||||
it("stores elements by key", function () {
|
||||
queue.put("a", { someKey: "some value" });
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some value" }});
|
||||
});
|
||||
|
||||
it("merges non-overlapping keys", function () {
|
||||
queue.put("a", { someKey: "some value" });
|
||||
queue.put("b", 42);
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some value" }, b: 42 });
|
||||
});
|
||||
|
||||
it("overwrites repeated keys", function () {
|
||||
queue.put("a", { someKey: "some value" });
|
||||
queue.put("a", { someKey: "some other value" });
|
||||
queue.put("b", 42);
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some other value" }, b: 42 });
|
||||
expect(queue.poll())
|
||||
.toBeUndefined();
|
||||
});
|
||||
|
||||
it("reports emptiness", function () {
|
||||
expect(queue.isEmpty()).toBeTruthy();
|
||||
queue.put("a", { someKey: "some value" });
|
||||
queue.put("a", { someKey: "some other value" });
|
||||
queue.put("b", 42);
|
||||
expect(queue.isEmpty()).toBeFalsy();
|
||||
queue.poll();
|
||||
expect(queue.isEmpty()).toBeTruthy();
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
);
|
@ -3,6 +3,8 @@
|
||||
"TelemetryCapability",
|
||||
"TelemetryController",
|
||||
"TelemetryFormatter",
|
||||
"TelemetryQueue",
|
||||
"TelemetrySubscriber",
|
||||
"TelemetrySubscription"
|
||||
"TelemetrySubscription",
|
||||
"TelemetryTable"
|
||||
]
|
Loading…
x
Reference in New Issue
Block a user