blob: 455c7e95d2fe7c3b2aef30363fddbbe0bb791e21 [file] [log] [blame]
James Kuszmaul5f5e1232020-12-22 20:58:00 -08001// This file provides an index of all standard plot configs.
2// In the future, this may be split into more pieces (e.g., to have
3// year-specific indices). For now, the pattern for creating a new plot
4// is that you provide an exported function (a la the plot*() functions imported
5// below) which, when called, will generate the plot in the provided div.
6// This file handles providing a master list of all known plots so that
7// the user can just open a single web-page and select the plot that they want
8// from a drop-down. A given plot will not be loaded until it has been selected
9// once, at which point it will stay loaded. This means that if the user wants
10// to switch between several plot configs, they don't incur any performance
11// penalty associated with swapping.
12// By default, no plot is selected, but the plot= URL parameter may be used
13// to specify a specific plot, so that people can create links to a specific
14// plot.
15// The plot*() functions are called *after* we have already received a valid
16// config from the web server, so config handlers do not need to be used.
17//
18// The exact setup of this will be in flux as we add more configs and figure out
19// what setups work best--we will likely end up with separate index files for
20// each robot year, and may even end up allowing plots to be specified solely
21// using JSON rather than requiring people to write a script just to create
22// a plot.
Philipp Schrader548aedf2023-02-17 20:09:13 -080023import {Configuration} from '../../aos/configuration_generated';
24import {Connection} from '../../aos/network/www/proxy';
25import {plotImu} from '../wpilib/imu_plotter';
26import {plotDrivetrain} from '../control_loops/drivetrain/drivetrain_plotter';
27import {plotSpline} from '../control_loops/drivetrain/spline_plotter';
28import {plotDownEstimator} from '../control_loops/drivetrain/down_estimator_plotter';
milind upadhyay9bd381d2021-01-23 13:44:13 -080029import {plotRobotState} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080030 '../control_loops/drivetrain/robot_state_plotter'
Milind Upadhyayeb739bb2022-03-02 10:49:21 -080031import {plotFinisher as plot2020Finisher} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080032 '../../y2020/control_loops/superstructure/finisher_plotter'
Milind Upadhyayeb739bb2022-03-02 10:49:21 -080033import {plotTurret as plot2020Turret} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080034 '../../y2020/control_loops/superstructure/turret_plotter'
James Kuszmaulf7c8a092022-02-12 16:46:09 -080035import {plotLocalizer as plot2020Localizer} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080036 '../../y2020/control_loops/drivetrain/localizer_plotter'
Milind Upadhyayeb739bb2022-03-02 10:49:21 -080037import {plotAccelerator as plot2020Accelerator} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080038 '../../y2020/control_loops/superstructure/accelerator_plotter'
Milind Upadhyayeb739bb2022-03-02 10:49:21 -080039import {plotHood as plot2020Hood} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080040 '../../y2020/control_loops/superstructure/hood_plotter'
Milind Upadhyayeb739bb2022-03-02 10:49:21 -080041import {plotSuperstructure as plot2021Superstructure} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080042 '../../y2021_bot3/control_loops/superstructure/superstructure_plotter';
Milind Upadhyayeb739bb2022-03-02 10:49:21 -080043import {plotTurret as plot2022Turret} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080044 '../../y2022/control_loops/superstructure/turret_plotter'
Ravago Jonesb64988c2022-03-06 15:05:01 -080045import {plotSuperstructure as plot2022Superstructure} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080046 '../../y2022/control_loops/superstructure/superstructure_plotter'
James Kuszmaul81e71842023-09-29 15:25:13 -070047import {plotSuperstructure as plot2023Superstructure} from
48 '../../y2023/control_loops/superstructure/superstructure_plotter'
Austin Schuh76f227c2022-02-23 16:34:08 -080049import {plotCatapult as plot2022Catapult} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080050 '../../y2022/control_loops/superstructure/catapult_plotter'
Ravago Jones8b004782022-03-05 17:23:08 -080051import {plotIntakeFront as plot2022IntakeFront, plotIntakeBack as plot2022IntakeBack} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080052 '../../y2022/control_loops/superstructure/intake_plotter'
Milind Upadhyayeb739bb2022-03-02 10:49:21 -080053import {plotClimber as plot2022Climber} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080054 '../../y2022/control_loops/superstructure/climber_plotter'
James Kuszmaulf7c8a092022-02-12 16:46:09 -080055import {plotLocalizer as plot2022Localizer} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080056 '../../y2022/localizer/localizer_plotter'
James Kuszmaul827a6d62023-03-26 12:40:29 -070057import {plotLocalizer as plot2023Localizer} from
58 '../../y2023/localizer/localizer_plotter'
James Kuszmaul313e9ce2024-02-11 17:47:33 -080059import {plotLocalizer as plot2024Localizer} from
60 '../../y2024/localizer/localizer_plotter'
James Kuszmaulb35e2342022-03-06 15:44:00 -080061import {plotVision as plot2022Vision} from
Philipp Schrader548aedf2023-02-17 20:09:13 -080062 '../../y2022/vision/vision_plotter'
James Kuszmaula8e0d6e2023-03-12 13:33:36 -070063import {plotVision as plot2023Corrections} from
64 '../../y2023/localizer/corrections_plotter'
James Kuszmaul313e9ce2024-02-11 17:47:33 -080065import {plotVision as plot2024Corrections} from
66 '../../y2024/localizer/corrections_plotter'
Philipp Schrader548aedf2023-02-17 20:09:13 -080067import {plotDemo} from '../../aos/network/www/demo_plot';
James Kuszmaul5f5e1232020-12-22 20:58:00 -080068
James Kuszmaul5f5e1232020-12-22 20:58:00 -080069const rootDiv = document.createElement('div');
Austin Schuh5ec17ef2022-07-15 14:37:16 -070070rootDiv.style.width = '100%';
James Kuszmaul5f5e1232020-12-22 20:58:00 -080071document.body.appendChild(rootDiv);
72
73const helpDiv = document.createElement('div');
74rootDiv.appendChild(helpDiv);
75helpDiv.innerHTML =
James Kuszmaul461b0682020-12-22 22:20:21 -080076 'Help: click + drag to pan, double click to reset, scroll to zoom, ' +
77 'right-click + drag to zoom to rectangle, Esc to cancel. ' +
James Kuszmaul5f5e1232020-12-22 20:58:00 -080078 'Hold the x/y keys to only pan/zoom along the x/y axes.';
79
80class PlotState {
81 public readonly div: HTMLElement;
82 private initialized = false;
83 constructor(
84 parentDiv: HTMLElement,
85 private readonly initializer:
86 (conn: Connection, element: Element) => void) {
87 this.div = document.createElement('div');
88 parentDiv.appendChild(this.div);
89 this.hide();
90 }
91 initialize(conn: Connection): void {
92 if (!this.initialized) {
93 this.initializer(conn, this.div);
94 this.initialized = true;
95 }
96 }
97 hide(): void {
98 this.div.style.display = "none";
99 }
100 show(): void {
101 this.div.style.display = "block";
102 }
103}
104
105const plotSelect = document.createElement('select');
106rootDiv.appendChild(plotSelect);
107
108const plotDiv = document.createElement('div');
Austin Schuh975c5942022-07-15 14:38:10 -0700109plotDiv.style.marginTop = '10px';
James Kuszmaul5f5e1232020-12-22 20:58:00 -0800110plotDiv.style.left = '0';
111plotDiv.style.position = 'absolute';
Austin Schuh5ec17ef2022-07-15 14:37:16 -0700112plotDiv.style.width = '100%';
James Kuszmaul5f5e1232020-12-22 20:58:00 -0800113rootDiv.appendChild(plotDiv);
114
115// The master list of all the plots that we provide. For a given config, it
116// is possible that not all of these plots will be usable depending on the
117// presence of certain channels.
118const plotIndex = new Map<string, PlotState>([
119 ['Demo', new PlotState(plotDiv, plotDemo)],
James Kuszmaul48671362020-12-24 13:54:16 -0800120 ['IMU', new PlotState(plotDiv, plotImu)],
James Kuszmaulc4ae11c2020-12-26 16:26:58 -0800121 ['Drivetrain', new PlotState(plotDiv, plotDrivetrain)],
James Kuszmaul73fc1352021-04-09 22:31:25 -0700122 ['Spline Debug', new PlotState(plotDiv, plotSpline)],
James Kuszmaulac2b6b42021-03-07 22:38:06 -0800123 ['Down Estimator', new PlotState(plotDiv, plotDownEstimator)],
milind upadhyay9bd381d2021-01-23 13:44:13 -0800124 ['Robot State', new PlotState(plotDiv, plotRobotState)],
James Kuszmaul313e9ce2024-02-11 17:47:33 -0800125 ['2024 Vision', new PlotState(plotDiv, plot2024Corrections)],
126 ['2024 Localizer', new PlotState(plotDiv, plot2024Localizer)],
James Kuszmaula8e0d6e2023-03-12 13:33:36 -0700127 ['2023 Vision', new PlotState(plotDiv, plot2023Corrections)],
James Kuszmaul827a6d62023-03-26 12:40:29 -0700128 ['2023 Localizer', new PlotState(plotDiv, plot2023Localizer)],
James Kuszmaul81e71842023-09-29 15:25:13 -0700129 ['2023 Superstructure', new PlotState(plotDiv, plot2023Superstructure)],
Milind Upadhyayeb739bb2022-03-02 10:49:21 -0800130 ['2020 Finisher', new PlotState(plotDiv, plot2020Finisher)],
131 ['2020 Accelerator', new PlotState(plotDiv, plot2020Accelerator)],
132 ['2020 Hood', new PlotState(plotDiv, plot2020Hood)],
133 ['2020 Turret', new PlotState(plotDiv, plot2020Turret)],
James Kuszmaulf7c8a092022-02-12 16:46:09 -0800134 ['2020 Localizer', new PlotState(plotDiv, plot2020Localizer)],
Milind Upadhyayeb739bb2022-03-02 10:49:21 -0800135 ['2022 Localizer', new PlotState(plotDiv, plot2022Localizer)],
James Kuszmaulb35e2342022-03-06 15:44:00 -0800136 ['2022 Vision', new PlotState(plotDiv, plot2022Vision)],
Ravago Jonesb64988c2022-03-06 15:05:01 -0800137 ['2022 Superstructure', new PlotState(plotDiv, plot2022Superstructure)],
Austin Schuh76f227c2022-02-23 16:34:08 -0800138 ['2022 Catapult', new PlotState(plotDiv, plot2022Catapult)],
Ravago Jones8b004782022-03-05 17:23:08 -0800139 ['2022 Intake Front', new PlotState(plotDiv, plot2022IntakeFront)],
140 ['2022 Intake Back', new PlotState(plotDiv, plot2022IntakeBack)],
Milind Upadhyayeb739bb2022-03-02 10:49:21 -0800141 ['2022 Climber', new PlotState(plotDiv, plot2022Climber)],
142 ['2022 Turret', new PlotState(plotDiv, plot2022Turret)],
Milind Upadhyayeb739bb2022-03-02 10:49:21 -0800143 ['Y2021 3rd Robot Superstructure', new PlotState(plotDiv, plot2021Superstructure)],
James Kuszmaul5f5e1232020-12-22 20:58:00 -0800144]);
145
146const invalidSelectValue = 'null';
147function getDefaultPlot(): string {
148 const urlParams = (new URL(document.URL)).searchParams;
149 const urlParamKey = 'plot';
150 if (!urlParams.has(urlParamKey)) {
151 return invalidSelectValue;
152 }
153 const desiredPlot = urlParams.get(urlParamKey);
154 if (!plotIndex.has(desiredPlot)) {
155 return invalidSelectValue;
156 }
157 return desiredPlot;
158}
159
160const conn = new Connection();
161
James Kuszmaulb8989f72021-03-07 20:00:02 -0800162let reloadOnChange = false;
163
James Kuszmaul5f5e1232020-12-22 20:58:00 -0800164conn.connect();
165
166conn.addConfigHandler((config: Configuration) => {
167 plotSelect.add(new Option("Select Plot", invalidSelectValue));
168 for (const name of plotIndex.keys()) {
169 plotSelect.add(new Option(name, name));
170 }
171 plotSelect.addEventListener('input', () => {
172 for (const plot of plotIndex.values()) {
173 plot.hide();
174 }
175 if (plotSelect.value == invalidSelectValue) {
176 return;
177 }
178 plotIndex.get(plotSelect.value).initialize(conn);
179 plotIndex.get(plotSelect.value).show();
James Kuszmaulc4ae11c2020-12-26 16:26:58 -0800180 // Set the URL so that if you reload you get back to this plot.
181 window.history.replaceState(
182 null, null, '?plot=' + encodeURIComponent(plotSelect.value));
James Kuszmaulb8989f72021-03-07 20:00:02 -0800183 if (reloadOnChange) {
184 window.location.reload();
185 }
186 reloadOnChange = true;
James Kuszmaul5f5e1232020-12-22 20:58:00 -0800187 });
188 plotSelect.value = getDefaultPlot();
189 // Force the event to occur once at the start.
190 plotSelect.dispatchEvent(new Event('input'));
James Kuszmaulf7c8a092022-02-12 16:46:09 -0800191});