James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 1 | // Provides a plot which handles plotting the plot defined by a |
| 2 | // frc971.analysis.Plot message. |
James Kuszmaul | dac091f | 2022-03-22 09:35:06 -0700 | [diff] [blame] | 3 | import {Plot as PlotFb} from 'org_frc971/frc971/analysis/plot_data_generated'; |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 4 | import {MessageHandler, TimestampedMessage} from 'org_frc971/aos/network/www/aos_plotter'; |
James Kuszmaul | dac091f | 2022-03-22 09:35:06 -0700 | [diff] [blame] | 5 | import {ByteBuffer} from 'flatbuffers'; |
James Kuszmaul | 0d7df89 | 2021-04-09 22:19:49 -0700 | [diff] [blame] | 6 | import {Plot, Point} from 'org_frc971/aos/network/www/plotter'; |
James Kuszmaul | dac091f | 2022-03-22 09:35:06 -0700 | [diff] [blame] | 7 | import {Connection} from 'org_frc971/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( |
| 31 | '/analysis', 'frc971.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) { |
| 51 | // TODO(austin): I don't know the css for 100%, excluding other |
| 52 | // stuff in the div... Just go with a little less for now, it's |
| 53 | // good enough and quite helpful. |
| 54 | figureDiv.style.height = '97%'; |
| 55 | } else { |
| 56 | figureDiv.style.height = |
| 57 | figure.position().height().toString() + 'px'; |
| 58 | } |
Austin Schuh | c2e9c50 | 2021-11-25 21:23:24 -0800 | [diff] [blame] | 59 | figureDiv.style.position = 'relative'; |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 60 | div.appendChild(figureDiv); |
Austin Schuh | c2e9c50 | 2021-11-25 21:23:24 -0800 | [diff] [blame] | 61 | const plot = new Plot(figureDiv); |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 62 | |
| 63 | if (figure.title()) { |
| 64 | plot.getAxisLabels().setTitle(figure.title()); |
| 65 | } |
| 66 | if (figure.xlabel()) { |
| 67 | plot.getAxisLabels().setXLabel(figure.xlabel()); |
| 68 | } |
| 69 | if (figure.ylabel()) { |
James Kuszmaul | e32fa93 | 2021-05-11 21:38:16 -0700 | [diff] [blame] | 70 | plot.getAxisLabels().setYLabel(figure.ylabel()); |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 71 | } |
| 72 | if (figure.shareXAxis()) { |
| 73 | for (const other of linkedXAxes) { |
| 74 | plot.linkXAxis(other); |
| 75 | } |
| 76 | linkedXAxes.push(plot); |
| 77 | } |
| 78 | |
| 79 | for (let jj = 0; jj < figure.linesLength(); ++jj) { |
| 80 | const lineFb = figure.lines(jj); |
| 81 | const line = plot.getDrawer().addLine(); |
| 82 | if (lineFb.label()) { |
| 83 | line.setLabel(lineFb.label()); |
| 84 | } |
James Kuszmaul | 0d7df89 | 2021-04-09 22:19:49 -0700 | [diff] [blame] | 85 | const points = []; |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 86 | for (let kk = 0; kk < lineFb.pointsLength(); ++kk) { |
James Kuszmaul | 0d7df89 | 2021-04-09 22:19:49 -0700 | [diff] [blame] | 87 | const point = lineFb.points(kk); |
| 88 | points.push(new Point(point.x(), point.y())); |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 89 | } |
| 90 | if (lineFb.color()) { |
| 91 | line.setColor( |
| 92 | [lineFb.color().r(), lineFb.color().g(), lineFb.color().b()]); |
| 93 | } |
James Kuszmaul | 19217a4 | 2022-06-17 10:54:29 -0700 | [diff] [blame] | 94 | if (lineFb.style()) { |
| 95 | if (lineFb.style().pointSize() !== null) { |
| 96 | line.setPointSize(lineFb.style().pointSize()); |
| 97 | } |
| 98 | if (lineFb.style().drawLine() !== null) { |
| 99 | line.setDrawLine(lineFb.style().drawLine()); |
| 100 | } |
| 101 | } |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 102 | line.setPoints(points); |
| 103 | } |
| 104 | } |
Austin Schuh | 5ec17ef | 2022-07-15 14:37:16 -0700 | [diff] [blame^] | 105 | |
| 106 | // If this is the first new element (ignoring the placeholder up top), |
| 107 | // select it by default. |
| 108 | if (plotSelect.length == 2) { |
| 109 | plotSelect.value = name; |
| 110 | plotSelect.dispatchEvent(new Event('input')); |
| 111 | } |
James Kuszmaul | 4867136 | 2020-12-24 13:54:16 -0800 | [diff] [blame] | 112 | }); |
| 113 | } |