#pragma once #include #include #include #include #include "tools/cabana/streams/abstractstream.h" #include "tools/cabana/streams/pandastream.h" #ifdef __linux__ #include "tools/cabana/streams/socketcanstream.h" #endif #include "tools/cabana/ui/dialogs/routesdialog.h" #include "tools/cabana/ui/util.h" class AbstractOpenStreamWidget { public: virtual ~AbstractOpenStreamWidget() = default; virtual const char *title() const = 0; virtual void draw() = 0; virtual void drawPopups() {} virtual std::unique_ptr open() = 0; virtual bool openEnabled() const { return true; } }; class OpenReplayWidget : public AbstractOpenStreamWidget { public: const char *title() const override { return "Replay"; } void draw() override; void drawPopups() override; std::unique_ptr open() override; private: std::string route_; bool cameras_[3] = {true, false, false}; RoutesDialog routes_dialog_; std::shared_ptr alive_ = std::make_shared(true); }; class OpenPandaWidget : public AbstractOpenStreamWidget { public: OpenPandaWidget(); const char *title() const override { return "Panda"; } void draw() override; std::unique_ptr open() override; bool openEnabled() const override { return !already_connected_; } private: void refreshSerials(); void buildConfigForm(); bool already_connected_ = false; std::vector serials_; int serial_index_ = 0; bool has_panda_ = false; bool has_fd_ = false; std::vector can_speed_index_, data_speed_index_; PandaStreamConfig config = {}; }; class OpenDeviceWidget : public AbstractOpenStreamWidget { public: const char *title() const override { return "Device"; } void draw() override; std::unique_ptr open() override; private: int mode_ = 1; std::string ip_address_; }; #ifdef __linux__ class OpenSocketCanWidget : public AbstractOpenStreamWidget { public: OpenSocketCanWidget(); const char *title() const override { return "SocketCAN"; } void draw() override; std::unique_ptr open() override; private: void refreshDevices(); std::vector devices_; int device_index_ = 0; SocketCanStreamConfig config = {}; }; #endif class StreamSelector { public: using Callback = std::function stream, const std::string &dbc_file)>; void open(Callback on_done); void draw(); private: bool open_ = false; bool first_frame_ = false; std::string dbc_file_; std::vector> widgets_; Callback on_done_; };