blob: a93a2ae2a96fdef51fa813f680f1b9090e239d79 [file] [log] [blame]
James Kuszmaul48671362020-12-24 13:54:16 -08001// Provides a plot which handles plotting the plot defined by a
2// frc971.analysis.Plot message.
James Kuszmauldac091f2022-03-22 09:35:06 -07003import {Plot as PlotFb} from 'org_frc971/frc971/analysis/plot_data_generated';
James Kuszmaul48671362020-12-24 13:54:16 -08004import {MessageHandler, TimestampedMessage} from 'org_frc971/aos/network/www/aos_plotter';
James Kuszmauldac091f2022-03-22 09:35:06 -07005import {ByteBuffer} from 'flatbuffers';
James Kuszmaul0d7df892021-04-09 22:19:49 -07006import {Plot, Point} from 'org_frc971/aos/network/www/plotter';
James Kuszmauldac091f2022-03-22 09:35:06 -07007import {Connection} from 'org_frc971/aos/network/www/proxy';
James Kuszmaul136aa2b2022-04-02 14:50:56 -07008import {Schema} from 'flatbuffers_reflection/reflection_generated';
James Kuszmaul48671362020-12-24 13:54:16 -08009
10export function plotData(conn: Connection, parentDiv: Element) {
11 // Set up a selection box to allow the user to choose between plots to show.
12 const plotSelect = document.createElement('select');
13 parentDiv.appendChild(plotSelect);
14 const plots = new Map<string, HTMLElement>();
15 const invalidSelectValue = 'null';
16 plotSelect.addEventListener('input', () => {
17 for (const plot of plots.values()) {
18 plot.style.display = 'none';
19 }
20 if (plotSelect.value == invalidSelectValue) {
21 return;
22 }
23 plots.get(plotSelect.value).style.display = 'block';
24 });
25 plotSelect.add(new Option('Select Plot', invalidSelectValue));
26
27 const plotDiv = document.createElement('div');
James Kuszmaul48671362020-12-24 13:54:16 -080028 parentDiv.appendChild(plotDiv);
29
30 conn.addReliableHandler(
31 '/analysis', 'frc971.analysis.Plot', (data: Uint8Array, time: number) => {
James Kuszmauldac091f2022-03-22 09:35:06 -070032 const plotFb = PlotFb.getRootAsPlot(new ByteBuffer(data));
James Kuszmaul48671362020-12-24 13:54:16 -080033 const name = (!plotFb.title()) ? 'Plot ' + plots.size : plotFb.title();
34 const div = document.createElement('div');
35 div.style.display = 'none';
36 plots.set(name, div);
37 plotDiv.appendChild(div);
38 plotSelect.add(new Option(name, name));
39
40 const linkedXAxes: Plot[] = [];
41
42 for (let ii = 0; ii < plotFb.figuresLength(); ++ii) {
43 const figure = plotFb.figures(ii);
44 const figureDiv = document.createElement('div');
Austin Schuhc2e9c502021-11-25 21:23:24 -080045 figureDiv.style.width = figure.position().width().toString() + "px";
46 figureDiv.style.height = figure.position().height().toString() + "px";
47 figureDiv.style.position = 'relative';
James Kuszmaul48671362020-12-24 13:54:16 -080048 div.appendChild(figureDiv);
Austin Schuhc2e9c502021-11-25 21:23:24 -080049 const plot = new Plot(figureDiv);
James Kuszmaul48671362020-12-24 13:54:16 -080050
51 if (figure.title()) {
52 plot.getAxisLabels().setTitle(figure.title());
53 }
54 if (figure.xlabel()) {
55 plot.getAxisLabels().setXLabel(figure.xlabel());
56 }
57 if (figure.ylabel()) {
James Kuszmaule32fa932021-05-11 21:38:16 -070058 plot.getAxisLabels().setYLabel(figure.ylabel());
James Kuszmaul48671362020-12-24 13:54:16 -080059 }
60 if (figure.shareXAxis()) {
61 for (const other of linkedXAxes) {
62 plot.linkXAxis(other);
63 }
64 linkedXAxes.push(plot);
65 }
66
67 for (let jj = 0; jj < figure.linesLength(); ++jj) {
68 const lineFb = figure.lines(jj);
69 const line = plot.getDrawer().addLine();
70 if (lineFb.label()) {
71 line.setLabel(lineFb.label());
72 }
James Kuszmaul0d7df892021-04-09 22:19:49 -070073 const points = [];
James Kuszmaul48671362020-12-24 13:54:16 -080074 for (let kk = 0; kk < lineFb.pointsLength(); ++kk) {
James Kuszmaul0d7df892021-04-09 22:19:49 -070075 const point = lineFb.points(kk);
76 points.push(new Point(point.x(), point.y()));
James Kuszmaul48671362020-12-24 13:54:16 -080077 }
78 if (lineFb.color()) {
79 line.setColor(
80 [lineFb.color().r(), lineFb.color().g(), lineFb.color().b()]);
81 }
James Kuszmaul19217a42022-06-17 10:54:29 -070082 if (lineFb.style()) {
83 if (lineFb.style().pointSize() !== null) {
84 line.setPointSize(lineFb.style().pointSize());
85 }
86 if (lineFb.style().drawLine() !== null) {
87 line.setDrawLine(lineFb.style().drawLine());
88 }
89 }
James Kuszmaul48671362020-12-24 13:54:16 -080090 line.setPoints(points);
91 }
92 }
93 });
94}