James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 1 | // Provides a plot which handles plotting the plot defined by a |
Stephan Pleines | 9e40c8e | 2024-02-07 20:58:28 -0800 | [diff] [blame] | 2 | // aos.analysis.Plot message. |
Philipp Schrader | 548aedf | 2023-02-17 20:09:13 -0800 | [diff] [blame] | 3 | import {Plot as PlotFb} from './plot_data_generated'; |
| 4 | import {MessageHandler, TimestampedMessage} from '../../aos/network/www/aos_plotter'; |
James Kuszmaul | dac091f | 2022-03-22 09:35:06 -0700 | [diff] [blame] | 5 | import {ByteBuffer} from 'flatbuffers'; |
Philipp Schrader | 548aedf | 2023-02-17 20:09:13 -0800 | [diff] [blame] | 6 | import {Plot, Point} from '../../aos/network/www/plotter'; |
| 7 | import {Connection} from '../../aos/network/www/proxy'; |
James Kuszmaul | 136aa2b | 2022-04-02 14:50:56 -0700 | [diff] [blame] | 8 | import {Schema} from 'flatbuffers_reflection/reflection_generated'; |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 9 | |
| 10 | export 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 Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 28 | parentDiv.appendChild(plotDiv); |
| 29 | |
| 30 | conn.addReliableHandler( |
Stephan Pleines | 9e40c8e | 2024-02-07 20:58:28 -0800 | [diff] [blame] | 31 | '/analysis', 'aos.analysis.Plot', (data: Uint8Array, time: number) => { |
James Kuszmaul | dac091f | 2022-03-22 09:35:06 -0700 | [diff] [blame] | 32 | const plotFb = PlotFb.getRootAsPlot(new ByteBuffer(data)); |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 33 | 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 Schuh | 5ec17ef | 2022-07-15 14:37:16 -0700 | [diff] [blame] | 45 | if (figure.position().width() == 0) { |
| 46 | figureDiv.style.width = '100%'; |
| 47 | } else { |
| 48 | figureDiv.style.width = figure.position().width().toString() + 'px'; |
| 49 | } |
| 50 | if (figure.position().height() == 0) { |
Austin Schuh | 6eb83e6 | 2022-07-19 15:40:30 -0700 | [diff] [blame] | 51 | figureDiv.style.height = '100%'; |
Austin Schuh | 5ec17ef | 2022-07-15 14:37:16 -0700 | [diff] [blame] | 52 | } else { |
| 53 | figureDiv.style.height = |
| 54 | figure.position().height().toString() + 'px'; |
| 55 | } |
Austin Schuh | c2e9c50 | 2021-11-25 21:23:24 -0800 | [diff] [blame] | 56 | figureDiv.style.position = 'relative'; |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 57 | div.appendChild(figureDiv); |
Austin Schuh | c2e9c50 | 2021-11-25 21:23:24 -0800 | [diff] [blame] | 58 | const plot = new Plot(figureDiv); |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 59 | |
| 60 | if (figure.title()) { |
| 61 | plot.getAxisLabels().setTitle(figure.title()); |
| 62 | } |
| 63 | if (figure.xlabel()) { |
| 64 | plot.getAxisLabels().setXLabel(figure.xlabel()); |
| 65 | } |
| 66 | if (figure.ylabel()) { |
James Kuszmaul | e32fa93 | 2021-05-11 21:38:16 -0700 | [diff] [blame] | 67 | plot.getAxisLabels().setYLabel(figure.ylabel()); |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 68 | } |
| 69 | if (figure.shareXAxis()) { |
| 70 | for (const other of linkedXAxes) { |
| 71 | plot.linkXAxis(other); |
| 72 | } |
| 73 | linkedXAxes.push(plot); |
| 74 | } |
| 75 | |
| 76 | for (let jj = 0; jj < figure.linesLength(); ++jj) { |
| 77 | const lineFb = figure.lines(jj); |
| 78 | const line = plot.getDrawer().addLine(); |
| 79 | if (lineFb.label()) { |
| 80 | line.setLabel(lineFb.label()); |
| 81 | } |
James Kuszmaul | 0d7df89 | 2021-04-09 22:19:49 -0700 | [diff] [blame] | 82 | const points = []; |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 83 | for (let kk = 0; kk < lineFb.pointsLength(); ++kk) { |
James Kuszmaul | 0d7df89 | 2021-04-09 22:19:49 -0700 | [diff] [blame] | 84 | const point = lineFb.points(kk); |
| 85 | points.push(new Point(point.x(), point.y())); |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 86 | } |
| 87 | if (lineFb.color()) { |
| 88 | line.setColor( |
| 89 | [lineFb.color().r(), lineFb.color().g(), lineFb.color().b()]); |
| 90 | } |
James Kuszmaul | 19217a4 | 2022-06-17 10:54:29 -0700 | [diff] [blame] | 91 | if (lineFb.style()) { |
| 92 | if (lineFb.style().pointSize() !== null) { |
| 93 | line.setPointSize(lineFb.style().pointSize()); |
| 94 | } |
| 95 | if (lineFb.style().drawLine() !== null) { |
| 96 | line.setDrawLine(lineFb.style().drawLine()); |
| 97 | } |
| 98 | } |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 99 | line.setPoints(points); |
| 100 | } |
| 101 | } |
Austin Schuh | 5ec17ef | 2022-07-15 14:37:16 -0700 | [diff] [blame] | 102 | |
| 103 | // If this is the first new element (ignoring the placeholder up top), |
| 104 | // select it by default. |
| 105 | if (plotSelect.length == 2) { |
| 106 | plotSelect.value = name; |
| 107 | plotSelect.dispatchEvent(new Event('input')); |
| 108 | } |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 109 | }); |
| 110 | } |