You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.5 KiB
100 lines
3.5 KiB
#include <QApplication>
|
|
#include <QCommandLineParser>
|
|
|
|
#include "common/prefix.h"
|
|
#include "selfdrive/ui/qt/util.h"
|
|
#include "tools/cabana/mainwin.h"
|
|
#include "tools/cabana/streamselector.h"
|
|
#include "tools/cabana/streams/devicestream.h"
|
|
#include "tools/cabana/streams/pandastream.h"
|
|
#include "tools/cabana/streams/replaystream.h"
|
|
|
|
int main(int argc, char *argv[]) {
|
|
QCoreApplication::setApplicationName("Cabana");
|
|
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
|
|
initApp(argc, argv, false);
|
|
QApplication app(argc, argv);
|
|
app.setApplicationDisplayName("Cabana");
|
|
app.setWindowIcon(QIcon(":cabana-icon.png"));
|
|
utils::setTheme(settings.theme);
|
|
|
|
QCommandLineParser cmd_parser;
|
|
cmd_parser.addHelpOption();
|
|
cmd_parser.addPositionalArgument("route", "the drive to replay. find your drives at connect.comma.ai");
|
|
cmd_parser.addOption({"demo", "use a demo route instead of providing your own"});
|
|
cmd_parser.addOption({"qcam", "load qcamera"});
|
|
cmd_parser.addOption({"ecam", "load wide road camera"});
|
|
cmd_parser.addOption({"stream", "read can messages from live streaming"});
|
|
cmd_parser.addOption({"panda", "read can messages from panda"});
|
|
cmd_parser.addOption({"panda-serial", "read can messages from panda with given serial", "panda-serial"});
|
|
cmd_parser.addOption({"zmq", "the ip address on which to receive zmq messages", "zmq"});
|
|
cmd_parser.addOption({"data_dir", "local directory with routes", "data_dir"});
|
|
cmd_parser.addOption({"no-vipc", "do not output video"});
|
|
cmd_parser.addOption({"dbc", "dbc file to open", "dbc"});
|
|
cmd_parser.process(app);
|
|
|
|
QString dbc_file = cmd_parser.isSet("dbc") ? cmd_parser.value("dbc") : "";
|
|
|
|
std::unique_ptr<OpenpilotPrefix> op_prefix;
|
|
std::unique_ptr<AbstractStream> stream;
|
|
|
|
if (cmd_parser.isSet("stream")) {
|
|
stream.reset(new DeviceStream(&app, cmd_parser.value("zmq")));
|
|
} else if (cmd_parser.isSet("panda") || cmd_parser.isSet("panda-serial")) {
|
|
PandaStreamConfig config = {};
|
|
if (cmd_parser.isSet("panda-serial")) {
|
|
config.serial = cmd_parser.value("panda-serial");
|
|
}
|
|
stream.reset(new PandaStream(&app, config));
|
|
} else {
|
|
uint32_t replay_flags = REPLAY_FLAG_NONE;
|
|
if (cmd_parser.isSet("ecam")) {
|
|
replay_flags |= REPLAY_FLAG_ECAM;
|
|
} else if (cmd_parser.isSet("qcam")) {
|
|
replay_flags |= REPLAY_FLAG_QCAMERA;
|
|
} else if (cmd_parser.isSet("no-vipc")) {
|
|
replay_flags |= REPLAY_FLAG_NO_VIPC;
|
|
}
|
|
|
|
const QStringList args = cmd_parser.positionalArguments();
|
|
QString route;
|
|
if (args.size() > 0) {
|
|
route = args.first();
|
|
} else if (cmd_parser.isSet("demo")) {
|
|
route = DEMO_ROUTE;
|
|
}
|
|
|
|
if (route.isEmpty()) {
|
|
AbstractStream *out_stream = nullptr;
|
|
StreamSelector dlg;
|
|
dlg.addStreamWidget(ReplayStream::widget(&out_stream));
|
|
dlg.addStreamWidget(PandaStream::widget(&out_stream));
|
|
dlg.addStreamWidget(DeviceStream::widget(&out_stream));
|
|
if (!dlg.exec()) {
|
|
return 0;
|
|
}
|
|
dbc_file = dlg.dbcFile();
|
|
stream.reset(out_stream);
|
|
} else {
|
|
// TODO: Remove when OpenpilotPrefix supports ZMQ
|
|
#ifndef __APPLE__
|
|
op_prefix.reset(new OpenpilotPrefix());
|
|
#endif
|
|
auto replay_stream = new ReplayStream(&app);
|
|
stream.reset(replay_stream);
|
|
if (!replay_stream->loadRoute(route, cmd_parser.value("data_dir"), replay_flags)) {
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
MainWindow w;
|
|
|
|
// Load DBC
|
|
if (!dbc_file.isEmpty()) {
|
|
w.loadFile(dbc_file);
|
|
}
|
|
|
|
w.show();
|
|
return app.exec();
|
|
}
|
|
|