fix: add missing files
This commit is contained in:
parent
4829dd50c7
commit
2e36581665
9
web/eslint.config.js
Normal file
9
web/eslint.config.js
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
// @ts-check
|
||||||
|
|
||||||
|
import eslint from '@eslint/js';
|
||||||
|
import tseslint from 'typescript-eslint';
|
||||||
|
|
||||||
|
export default tseslint.config(
|
||||||
|
eslint.configs.recommended,
|
||||||
|
...tseslint.configs.recommended,
|
||||||
|
);
|
288
web/src/app.ts
Normal file
288
web/src/app.ts
Normal file
|
@ -0,0 +1,288 @@
|
||||||
|
import openmct from "openmct";
|
||||||
|
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.setAssetPath('openmct');
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.LocalStorage());
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.MyItems());
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.Timeline());
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.UTCTimeSystem());
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.Clock({ enableClockIndicator: true }));
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.Timer());
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.Timelist());
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.Hyperlink())
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.Notebook())
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.BarChart())
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.ScatterPlot())
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.SummaryWidget())
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.LADTable());
|
||||||
|
openmct.time.clock('local', { start: -5 * 60 * 1000, end: 0 });
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.time.timeSystem('utc');
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.install(openmct.plugins.Espresso());
|
||||||
|
|
||||||
|
openmct.install(
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.plugins.Conductor({
|
||||||
|
menuOptions: [
|
||||||
|
{
|
||||||
|
name: 'Fixed',
|
||||||
|
timeSystem: 'utc',
|
||||||
|
bounds: {
|
||||||
|
start: Date.now() - 30000000,
|
||||||
|
end: Date.now()
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Realtime',
|
||||||
|
timeSystem: 'utc',
|
||||||
|
clock: 'local',
|
||||||
|
clockOffsets: {
|
||||||
|
start: -30000000,
|
||||||
|
end: 30000
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (process.env.BASE_URL) {
|
||||||
|
console.log("got a thing")
|
||||||
|
console.log(process.env.BASE_URL)
|
||||||
|
}
|
||||||
|
interface Board {
|
||||||
|
name: string
|
||||||
|
type: string
|
||||||
|
units?: string
|
||||||
|
conversion?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Schema {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let schemaCached = null;
|
||||||
|
function getSchema() {
|
||||||
|
if (schemaCached === null) {
|
||||||
|
return fetch(`${process.env.BASE_URL}/api/v1/schema`).then((resp) => {
|
||||||
|
const res = resp.json()
|
||||||
|
console.log("got schema, caching", res);
|
||||||
|
schemaCached = res
|
||||||
|
return res
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return Promise.resolve(schemaCached)
|
||||||
|
}
|
||||||
|
|
||||||
|
const objectProvider = {
|
||||||
|
get: function (id) {
|
||||||
|
return getSchema().then((schema) => {
|
||||||
|
if (id.key === "car") {
|
||||||
|
const comp = schema.packets.map((x) => {
|
||||||
|
return {
|
||||||
|
key: x.name,
|
||||||
|
namespace: "umnsvp"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return {
|
||||||
|
identifier: id,
|
||||||
|
name: "the solar car",
|
||||||
|
type: 'folder',
|
||||||
|
location: 'ROOT',
|
||||||
|
composition: comp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const pkt = schema.packets.find((x) => x.name === id.key)
|
||||||
|
if (pkt) {
|
||||||
|
// if the key matches one of the packet names,
|
||||||
|
// we know it's a packet.
|
||||||
|
|
||||||
|
// construct a list of fields for this packet.
|
||||||
|
const comp = pkt.data.map((field) => {
|
||||||
|
if (field.type === "bitfield") {
|
||||||
|
//
|
||||||
|
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
// we have to do this since
|
||||||
|
// we can't get the packet name otherwise.
|
||||||
|
key: `${pkt.name}.${field.name}`,
|
||||||
|
namespace: "umnsvp"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return {
|
||||||
|
identifier: id,
|
||||||
|
name: pkt.name,
|
||||||
|
type: 'folder',
|
||||||
|
composition: comp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// at this point it's definitely a field aka umnsvp-datum
|
||||||
|
const [pktName, fieldName] = id.key.split('.')
|
||||||
|
return {
|
||||||
|
identifier: id,
|
||||||
|
name: fieldName,
|
||||||
|
type: 'umnsvp-datum',
|
||||||
|
// annotate a special index
|
||||||
|
telemetry: {
|
||||||
|
values: [
|
||||||
|
{
|
||||||
|
key: "value",
|
||||||
|
source: "val",
|
||||||
|
name: "Value",
|
||||||
|
"format": "float",
|
||||||
|
hints: {
|
||||||
|
range: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "utc",
|
||||||
|
source: "ts",
|
||||||
|
name: "Timestamp",
|
||||||
|
format: "utc",
|
||||||
|
hints: {
|
||||||
|
domain: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const TelemHistoryProvider = {
|
||||||
|
supportsRequest: function (dObj) {
|
||||||
|
return dObj.type === 'umnsvp-datum'
|
||||||
|
},
|
||||||
|
request: function (dObj, opt) {
|
||||||
|
const [pktName, fieldName] = dObj.identifier.key.split('.')
|
||||||
|
const url = `${process.env.BASE_URL}/api/v1/packets/${pktName}/${fieldName}?`
|
||||||
|
const params = new URLSearchParams({
|
||||||
|
start: new Date(opt.start).toISOString(),
|
||||||
|
end: new Date(opt.end).toISOString(),
|
||||||
|
})
|
||||||
|
console.log((opt.end - opt.start) / opt.size)
|
||||||
|
return fetch(url + params).then((resp) => {
|
||||||
|
return resp.json()
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function TelemRealtimeProvider() {
|
||||||
|
return function (openmct) {
|
||||||
|
|
||||||
|
const simpleIndicator = openmct.indicators.simpleIndicator();
|
||||||
|
openmct.indicators.add(simpleIndicator);
|
||||||
|
simpleIndicator.text("0 Listeners")
|
||||||
|
const url = `${process.env.BASE_URL.replace(/^http/, 'ws')}/api/v1/packets/subscribe?`
|
||||||
|
// we put our websocket connection here.
|
||||||
|
let connection = new WebSocket(url)
|
||||||
|
// connections contains name: callback mapping
|
||||||
|
const callbacks = {}
|
||||||
|
// names contains a set of *packet names*
|
||||||
|
const names = new Set()
|
||||||
|
|
||||||
|
function handleMessage(event) {
|
||||||
|
const data = JSON.parse(event.data)
|
||||||
|
for (const [key, value] of Object.entries(data.data)) {
|
||||||
|
const id = `${data.name}.${key}`
|
||||||
|
if (id in callbacks) {
|
||||||
|
// we should construct a telem point and make a callback.
|
||||||
|
callbacks[id]({
|
||||||
|
"ts": data.ts,
|
||||||
|
"val": value
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateWebsocket() {
|
||||||
|
const params = new URLSearchParams()
|
||||||
|
for (const name in names) {
|
||||||
|
params.append("name", name)
|
||||||
|
}
|
||||||
|
connection = new WebSocket(url + params)
|
||||||
|
|
||||||
|
connection.onmessage = handleMessage
|
||||||
|
simpleIndicator.text(`${names.size} Listeners`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const provider = {
|
||||||
|
supportsSubscribe: function (dObj) {
|
||||||
|
return dObj.type === "umnsvp-datum"
|
||||||
|
},
|
||||||
|
subscribe: function (dObj, callback) {
|
||||||
|
// identifier is packetname.fieldname. we add the packet name to the set.
|
||||||
|
const key = dObj.identifier.key
|
||||||
|
const [pktName, _] = key.split('.')
|
||||||
|
// add our callback to the dictionary,
|
||||||
|
// add the packet name to the set
|
||||||
|
callbacks[key] = callback
|
||||||
|
names.add(pktName)
|
||||||
|
// update the websocket URL with the new name.
|
||||||
|
updateWebsocket()
|
||||||
|
return function unsubscribe() {
|
||||||
|
// if there's no more listeners on this packet,
|
||||||
|
// we can remove it.
|
||||||
|
console.log("subscribe called %s", JSON.stringify(dObj))
|
||||||
|
if (!Object.keys(callbacks).some((k) => k.startsWith(pktName))) {
|
||||||
|
names.delete(pktName)
|
||||||
|
updateWebsocket()
|
||||||
|
}
|
||||||
|
|
||||||
|
delete callbacks[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openmct.telemetry.addProvider(provider)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function GotelemPlugin() {
|
||||||
|
return function install(openmct) {
|
||||||
|
|
||||||
|
openmct.types.addType('umnsvp-datum', {
|
||||||
|
name: "UMN SVP Data Field",
|
||||||
|
description: "A data field of a packet from the car",
|
||||||
|
creatable: false,
|
||||||
|
cssClass: "icon-telemetry"
|
||||||
|
})
|
||||||
|
openmct.objects.addRoot({
|
||||||
|
namespace: "umnsvp",
|
||||||
|
key: 'car'
|
||||||
|
}, openmct.priority.HIGH)
|
||||||
|
openmct.objects.addProvider('umnsvp', objectProvider);
|
||||||
|
openmct.telemetry.addProvider(TelemHistoryProvider)
|
||||||
|
openmct.install(TelemRealtimeProvider())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
openmct.install(GotelemPlugin())
|
||||||
|
|
||||||
|
//@ts-expect-error openmct
|
||||||
|
openmct.start();
|
19
web/tsconfig.json
Normal file
19
web/tsconfig.json
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
// "baseUrl": "./src",
|
||||||
|
"target": "es6",
|
||||||
|
"checkJs": true,
|
||||||
|
"allowJs": true,
|
||||||
|
"moduleResolution": "Bundler",
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"paths": {
|
||||||
|
"openmct": ["./node_modules/openmct/dist/openmct.d.ts"]
|
||||||
|
},
|
||||||
|
"esModuleInterop": true,
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"./dist/**/*",
|
||||||
|
"webpack.*.js",
|
||||||
|
"eslint.config.js"
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in a new issue