blob: fdfde8c0ab59fa6d9a0041615e62965d958dd352 [file] [log] [blame]
James Kuszmaul48671362020-12-24 13:54:16 -08001#ifndef FRC971_ANALYSIS_IN_PROCESS_PLOTTER_H_
2#define FRC971_ANALYSIS_IN_PROCESS_PLOTTER_H_
3
4#include <vector>
5
Stephan Pleines85b295c2024-02-04 17:50:26 -08006#include "aos/analysis/plot_data_generated.h"
James Kuszmaul48671362020-12-24 13:54:16 -08007#include "aos/events/simulated_event_loop.h"
8#include "aos/network/web_proxy.h"
James Kuszmaul48671362020-12-24 13:54:16 -08009
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080010namespace frc971::analysis {
James Kuszmaul48671362020-12-24 13:54:16 -080011
12// This class wraps the WebProxy class to provide a convenient C++ interface to
13// dynamically generate plots.
14// Currently, the main useful interface that this provides is a matplotlib-like
15// interface--see in_process_plotter_demo.cc for sample usage. It doesn't
16// precisely follow matplotlib's conventions, but the basic style does mimic
17// matplotlib. Future iterations may ditch this in favor of a more modern
18// interface where we actually return handles for plots and lines and the such.
19//
20// Note that currently the port for the seb server is hard-coded to 8080, so
21// only one instance of the Plotter can be present at once.
22//
23// You must call Spin() for the web server to actually do anything helpful.
24class Plotter {
25 public:
26 Plotter();
27
28 // matplotlib-like interface
29 // The basic pattern is:
30 // 1) Call Figure()
Philipp Schradera6712522023-07-05 20:25:11 -070031 // 2) Set up the lines, labels, etc. for the figure.
James Kuszmaul48671362020-12-24 13:54:16 -080032 // 3) Repeat 1-2 however many times.
33 // 4) Call Publish().
34 // 5) Repeat 1-5 however many times.
35 //
36 // Publish() actually pushes the figures that you setup to the web-page,
37 // either with an autogenerated title or the title set by Title(). All state
38 // is cleared (or should be cleared) by the call to Publish().
39
40 // Sets the title for the current set of plots; if you
41 void Title(std::string_view title);
Austin Schuh5ec17ef2022-07-15 14:37:16 -070042 void AddFigure(std::string_view title = "", double width = 0,
43 double height = 0);
Austin Schuhea62f602022-07-18 16:53:04 -070044 struct LineOptions {
45 std::string_view label = "";
46 std::string_view line_style = "*-";
47 std::string_view color = "";
Austin Schuh69d0b732022-07-20 21:19:32 -070048 double point_size = 3.0;
Austin Schuhea62f602022-07-18 16:53:04 -070049 };
50
James Kuszmaul48671362020-12-24 13:54:16 -080051 void AddLine(const std::vector<double> &x, const std::vector<double> &y,
Austin Schuhea62f602022-07-18 16:53:04 -070052 std::string_view label) {
53 AddLine(x, y, LineOptions{.label = label});
54 }
55 void AddLine(const std::vector<double> &x, const std::vector<double> &y,
56 std::string_view label, std::string_view line_style) {
57 AddLine(x, y, LineOptions{.label = label, .line_style = line_style});
58 }
59 void AddLine(const std::vector<double> &x, const std::vector<double> &y,
60 LineOptions options);
61
James Kuszmaul48671362020-12-24 13:54:16 -080062 void ShareXAxis(bool share) { share_x_axis_ = share; }
63 void XLabel(std::string_view label);
64 void YLabel(std::string_view label);
65 void Publish();
66
67 void Spin();
Austin Schuhea62f602022-07-18 16:53:04 -070068
James Kuszmaul48671362020-12-24 13:54:16 -080069 private:
70 void MaybeFinishFigure();
71
72 aos::FlatbufferDetachedBuffer<aos::Configuration> config_;
73 aos::SimulatedEventLoopFactory event_loop_factory_;
74 std::unique_ptr<aos::EventLoop> event_loop_;
75 aos::Sender<Plot> plot_sender_;
76 aos::web_proxy::WebProxy web_proxy_;
77
78 aos::Sender<Plot>::Builder builder_;
79 flatbuffers::Offset<flatbuffers::String> title_;
80 flatbuffers::Offset<flatbuffers::String> figure_title_;
81 flatbuffers::Offset<flatbuffers::String> xlabel_;
82 flatbuffers::Offset<flatbuffers::String> ylabel_;
83 bool share_x_axis_ = false;
84 float next_top_ = 0;
85 flatbuffers::Offset<Position> position_;
86 std::vector<flatbuffers::Offset<Figure>> figures_;
87 std::vector<flatbuffers::Offset<Line>> lines_;
88
Austin Schuhea62f602022-07-18 16:53:04 -070089 struct ColorWheelColor {
90 std::string name;
91 Color color;
92 };
93
James Kuszmaul48671362020-12-24 13:54:16 -080094 size_t color_wheel_position_ = 0;
Austin Schuhea62f602022-07-18 16:53:04 -070095 std::vector<ColorWheelColor> color_wheel_;
James Kuszmaul48671362020-12-24 13:54:16 -080096};
97
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080098} // namespace frc971::analysis
James Kuszmaul48671362020-12-24 13:54:16 -080099#endif // FRC971_ANALYSIS_IN_PROCESS_PLOTTER_H_