cabana: fix the panda serial selector disappeared after `buildConfigForm()` (#32342)

pull/32332/head
Dean Lee 12 months ago committed by GitHub
parent 3bf7009877
commit 5f8b53be33
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 22
      tools/cabana/cabana.cc
  2. 3
      tools/cabana/mainwin.cc
  3. 78
      tools/cabana/streams/pandastream.cc
  4. 4
      tools/cabana/streams/pandastream.h

@ -3,7 +3,6 @@
#include "selfdrive/ui/qt/util.h" #include "selfdrive/ui/qt/util.h"
#include "tools/cabana/mainwin.h" #include "tools/cabana/mainwin.h"
#include "tools/cabana/streamselector.h"
#include "tools/cabana/streams/devicestream.h" #include "tools/cabana/streams/devicestream.h"
#include "tools/cabana/streams/pandastream.h" #include "tools/cabana/streams/pandastream.h"
#include "tools/cabana/streams/replaystream.h" #include "tools/cabana/streams/replaystream.h"
@ -82,28 +81,17 @@ int main(int argc, char *argv[]) {
} }
} }
int ret = 0;
{
MainWindow w; MainWindow w;
QTimer::singleShot(0, [&]() { if (stream) {
if (!stream) {
StreamSelector dlg(&stream);
dlg.exec();
dbc_file = dlg.dbcFile();
}
if (!stream) {
stream = new DummyStream(&app);
}
stream->start(); stream->start();
if (!dbc_file.isEmpty()) { if (!dbc_file.isEmpty()) {
w.loadFile(dbc_file); w.loadFile(dbc_file);
} }
w.show(); } else {
}); w.openStream();
ret = app.exec();
} }
w.show();
int ret = app.exec();
delete can; delete can;
return ret; return ret;
} }

@ -262,6 +262,9 @@ void MainWindow::openStream() {
} }
stream->start(); stream->start();
statusBar()->showMessage(tr("Route %1 loaded").arg(can->routeName()), 2000); statusBar()->showMessage(tr("Route %1 loaded").arg(can->routeName()), 2000);
} else if (!can) {
stream = new DummyStream(this);
stream->start();
} }
} }

@ -6,39 +6,12 @@
#include <QMessageBox> #include <QMessageBox>
#include <QPushButton> #include <QPushButton>
#include <QThread> #include <QThread>
#include <QVBoxLayout>
// TODO: remove clearLayout PandaStream::PandaStream(QObject *parent, PandaStreamConfig config_) : config(config_), LiveStream(parent) {}
static void clearLayout(QLayout* layout) {
while (layout->count() > 0) {
QLayoutItem* item = layout->takeAt(0);
if (QWidget* widget = item->widget()) {
widget->deleteLater();
}
if (QLayout* childLayout = item->layout()) {
clearLayout(childLayout);
}
delete item;
}
}
PandaStream::PandaStream(QObject *parent, PandaStreamConfig config_) : config(config_), LiveStream(parent) {
if (config.serial.isEmpty()) {
auto serials = Panda::list();
if (serials.size() == 0) {
throw std::runtime_error("No panda found");
}
config.serial = QString::fromStdString(serials[0]);
}
qDebug() << "Connecting to panda with serial" << config.serial;
if (!connect()) {
throw std::runtime_error("Failed to connect to panda");
}
}
bool PandaStream::connect() { bool PandaStream::connect() {
try { try {
qDebug() << "Connecting to panda with serial" << config.serial;
panda.reset(new Panda(config.serial.toStdString())); panda.reset(new Panda(config.serial.toStdString()));
config.bus_config.resize(3); config.bus_config.resize(3);
qDebug() << "Connected"; qDebug() << "Connected";
@ -47,7 +20,6 @@ bool PandaStream::connect() {
} }
panda->set_safety_model(cereal::CarParams::SafetyModel::SILENT); panda->set_safety_model(cereal::CarParams::SafetyModel::SILENT);
for (int bus = 0; bus < config.bus_config.size(); bus++) { for (int bus = 0; bus < config.bus_config.size(); bus++) {
panda->set_can_speed_kbps(bus, config.bus_config[bus].can_speed_kbps); panda->set_can_speed_kbps(bus, config.bus_config[bus].can_speed_kbps);
@ -60,7 +32,6 @@ bool PandaStream::connect() {
panda->set_data_speed_kbps(bus, 10); panda->set_data_speed_kbps(bus, 10);
} }
} }
} }
return true; return true;
} }
@ -108,26 +79,14 @@ AbstractOpenStreamWidget *PandaStream::widget(AbstractStream **stream) {
// OpenPandaWidget // OpenPandaWidget
OpenPandaWidget::OpenPandaWidget(AbstractStream **stream) : AbstractOpenStreamWidget(stream) { OpenPandaWidget::OpenPandaWidget(AbstractStream **stream) : AbstractOpenStreamWidget(stream) {
QVBoxLayout *main_layout = new QVBoxLayout(this); form_layout = new QFormLayout(this);
main_layout->addStretch(1);
QFormLayout *form_layout = new QFormLayout();
QHBoxLayout *serial_layout = new QHBoxLayout(); QHBoxLayout *serial_layout = new QHBoxLayout();
serial_edit = new QComboBox(); serial_layout->addWidget(serial_edit = new QComboBox());
serial_edit->setFixedWidth(300);
serial_layout->addWidget(serial_edit);
QPushButton *refresh = new QPushButton(tr("Refresh")); QPushButton *refresh = new QPushButton(tr("Refresh"));
refresh->setFixedWidth(100); refresh->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
serial_layout->addWidget(refresh); serial_layout->addWidget(refresh);
form_layout->addRow(tr("Serial"), serial_layout); form_layout->addRow(tr("Serial"), serial_layout);
main_layout->addLayout(form_layout);
config_layout = new QFormLayout();
main_layout->addLayout(config_layout);
main_layout->addStretch(1);
QObject::connect(refresh, &QPushButton::clicked, this, &OpenPandaWidget::refreshSerials); QObject::connect(refresh, &QPushButton::clicked, this, &OpenPandaWidget::refreshSerials);
QObject::connect(serial_edit, &QComboBox::currentTextChanged, this, &OpenPandaWidget::buildConfigForm); QObject::connect(serial_edit, &QComboBox::currentTextChanged, this, &OpenPandaWidget::buildConfigForm);
@ -145,15 +104,16 @@ void OpenPandaWidget::refreshSerials() {
} }
void OpenPandaWidget::buildConfigForm() { void OpenPandaWidget::buildConfigForm() {
clearLayout(config_layout); for (int i = form_layout->rowCount() - 1; i > 0; --i) {
QString serial = serial_edit->currentText(); form_layout->removeRow(i);
}
QString serial = serial_edit->currentText();
bool has_fd = false; bool has_fd = false;
bool has_panda = !serial.isEmpty(); bool has_panda = !serial.isEmpty();
if (has_panda) { if (has_panda) {
try { try {
Panda panda = Panda(serial.toStdString()); Panda panda(serial.toStdString());
has_fd = (panda.hw_type == cereal::PandaState::PandaType::RED_PANDA) || (panda.hw_type == cereal::PandaState::PandaType::RED_PANDA_V2); has_fd = (panda.hw_type == cereal::PandaState::PandaType::RED_PANDA) || (panda.hw_type == cereal::PandaState::PandaType::RED_PANDA_V2);
} catch (const std::exception& e) { } catch (const std::exception& e) {
has_panda = false; has_panda = false;
@ -201,20 +161,22 @@ void OpenPandaWidget::buildConfigForm() {
QObject::connect(enable_fd, &QCheckBox::stateChanged, [=](int state) {config.bus_config[i].can_fd = (bool)state;}); QObject::connect(enable_fd, &QCheckBox::stateChanged, [=](int state) {config.bus_config[i].can_fd = (bool)state;});
} }
config_layout->addRow(tr("Bus %1:").arg(i), bus_layout); form_layout->addRow(tr("Bus %1:").arg(i), bus_layout);
} }
} else { } else {
config.serial = ""; config.serial = "";
config_layout->addWidget(new QLabel(tr("No panda found"))); form_layout->addWidget(new QLabel(tr("No panda found")));
} }
} }
bool OpenPandaWidget::open() { bool OpenPandaWidget::open() {
try { if (!config.serial.isEmpty()) {
*stream = new PandaStream(qApp, config); auto panda_stream = std::make_unique<PandaStream>(qApp, config);
} catch (std::exception &e) { if (panda_stream->connect()) {
QMessageBox::warning(nullptr, tr("Warning"), tr("Failed to connect to panda: '%1'").arg(e.what())); *stream = panda_stream.release();
return false;
}
return true; return true;
}
}
QMessageBox::warning(nullptr, tr("Warning"), tr("Failed to connect to panda"));
return false;
} }

@ -21,6 +21,7 @@ class PandaStream : public LiveStream {
Q_OBJECT Q_OBJECT
public: public:
PandaStream(QObject *parent, PandaStreamConfig config_ = {}); PandaStream(QObject *parent, PandaStreamConfig config_ = {});
bool connect();
static AbstractOpenStreamWidget *widget(AbstractStream **stream); static AbstractOpenStreamWidget *widget(AbstractStream **stream);
inline QString routeName() const override { inline QString routeName() const override {
return QString("Live Streaming From Panda %1").arg(config.serial); return QString("Live Streaming From Panda %1").arg(config.serial);
@ -28,7 +29,6 @@ public:
protected: protected:
void streamThread() override; void streamThread() override;
bool connect();
std::unique_ptr<Panda> panda; std::unique_ptr<Panda> panda;
PandaStreamConfig config = {}; PandaStreamConfig config = {};
@ -47,6 +47,6 @@ private:
void buildConfigForm(); void buildConfigForm();
QComboBox *serial_edit; QComboBox *serial_edit;
QFormLayout *config_layout; QFormLayout *form_layout;
PandaStreamConfig config = {}; PandaStreamConfig config = {};
}; };

Loading…
Cancel
Save