Welcome to mirror list, hosted at ThFree Co, Russian Federation.

DefaultMetadataProvider.js « telemetry « api « src - github.com/nasa/openmct.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 3d95c317cba791fa00633f25cfcb01e3dba1e086 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*****************************************************************************
 * Open openmct, Copyright (c) 2014-2021, United States Government
 * as represented by the Administrator of the National Aeronautics and Space
 * Administration. All rights reserved.
 *
 * Open openmct 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 openmct 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([
    'lodash'
], function (
    _
) {

    /**
     * This is the default metadata provider; for any object with a "telemetry"
     * property, this provider will return the value of that property as the
     * telemetry metadata.
     *
     * This provider also implements legacy support for telemetry metadata
     * defined on the type.  Telemetry metadata definitions on type will be
     * depreciated in the future.
     */
    function DefaultMetadataProvider(openmct) {
        this.openmct = openmct;
    }

    /**
     * Applies to any domain object with a telemetry property, or whose type
     * definition has a telemetry property.
     */
    DefaultMetadataProvider.prototype.supportsMetadata = function (domainObject) {
        return Boolean(domainObject.telemetry) || Boolean(this.typeHasTelemetry(domainObject));
    };

    /**
     * Retrieves valueMetadata from legacy metadata.
     * @private
     */
    function valueMetadatasFromOldFormat(metadata) {
        const valueMetadatas = [];

        valueMetadatas.push({
            key: 'name',
            name: 'Name'
        });

        metadata.domains.forEach(function (domain, index) {
            const valueMetadata = _.clone(domain);
            valueMetadata.hints = {
                domain: index + 1
            };
            valueMetadatas.push(valueMetadata);
        });

        metadata.ranges.forEach(function (range, index) {
            const valueMetadata = _.clone(range);
            valueMetadata.hints = {
                range: index,
                priority: index + metadata.domains.length + 1
            };

            if (valueMetadata.type === 'enum') {
                valueMetadata.key = 'enum';
                valueMetadata.hints.y -= 10;
                valueMetadata.hints.range -= 10;
                valueMetadata.enumerations =
                    _.sortBy(valueMetadata.enumerations.map(function (e) {
                        return {
                            string: e.string,
                            value: Number(e.value)
                        };
                    }), 'e.value');
                valueMetadata.values = valueMetadata.enumerations.map(e => e.value);
                valueMetadata.max = Math.max(valueMetadata.values);
                valueMetadata.min = Math.min(valueMetadata.values);
            }

            valueMetadatas.push(valueMetadata);
        });

        return valueMetadatas;
    }

    /**
     * Returns telemetry metadata for a given domain object.
     */
    DefaultMetadataProvider.prototype.getMetadata = function (domainObject) {
        const metadata = domainObject.telemetry || {};
        if (this.typeHasTelemetry(domainObject)) {
            const typeMetadata = this.openmct.types.get(domainObject.type).definition.telemetry;

            Object.assign(metadata, typeMetadata);

            if (!metadata.values) {
                metadata.values = valueMetadatasFromOldFormat(metadata);
            }
        }

        return metadata;
    };

    /**
     * @private
     */
    DefaultMetadataProvider.prototype.typeHasTelemetry = function (domainObject) {
        const type = this.openmct.types.get(domainObject.type);

        return Boolean(type.definition.telemetry);
    };

    return DefaultMetadataProvider;

});