Skip to content

Commit

Permalink
cabana: add csv export (commaai#30800)
Browse files Browse the repository at this point in the history
export csv
  • Loading branch information
deanlee authored Dec 19, 2023
1 parent 8017c25 commit 5f04517
Show file tree
Hide file tree
Showing 13 changed files with 95 additions and 8 deletions.
3 changes: 2 additions & 1 deletion tools/cabana/SConscript
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ cabana_env.Depends(assets, Glob('/assets/*', exclude=[assets, assets_src, "asset

cabana_lib = cabana_env.Library("cabana_lib", ['mainwin.cc', 'streams/socketcanstream.cc', 'streams/pandastream.cc', 'streams/devicestream.cc', 'streams/livestream.cc', 'streams/abstractstream.cc', 'streams/replaystream.cc', 'binaryview.cc', 'historylog.cc', 'videowidget.cc', 'signalview.cc',
'dbc/dbc.cc', 'dbc/dbcfile.cc', 'dbc/dbcmanager.cc',
'utils/export.cc', 'utils/util.cc',
'chart/chartswidget.cc', 'chart/chart.cc', 'chart/signalselector.cc', 'chart/tiplabel.cc', 'chart/sparkline.cc',
'commands.cc', 'messageswidget.cc', 'streamselector.cc', 'settings.cc', 'util.cc', 'detailwidget.cc', 'tools/findsimilarbits.cc', 'tools/findsignal.cc'], LIBS=cabana_libs, FRAMEWORKS=base_frameworks)
'commands.cc', 'messageswidget.cc', 'streamselector.cc', 'settings.cc', 'detailwidget.cc', 'tools/findsimilarbits.cc', 'tools/findsignal.cc'], LIBS=cabana_libs, FRAMEWORKS=base_frameworks)
cabana_env.Program('cabana', ['cabana.cc', cabana_lib, assets], LIBS=cabana_libs, FRAMEWORKS=base_frameworks)

if GetOption('extras'):
Expand Down
2 changes: 1 addition & 1 deletion tools/cabana/dbc/dbc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#include <algorithm>

#include "tools/cabana/util.h"
#include "tools/cabana/utils/util.h"

uint qHash(const MessageId &item) {
return qHash(item.source) ^ qHash(item.address);
Expand Down
16 changes: 15 additions & 1 deletion tools/cabana/historylog.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

#include <functional>

#include <QFileDialog>
#include <QPainter>
#include <QPushButton>
#include <QVBoxLayout>

#include "tools/cabana/commands.h"
#include "tools/cabana/utils/export.h"

QVariant HistoryLogModel::data(const QModelIndex &index, int role) const {
const bool show_signals = display_signals_mode && sigs.size() > 0;
Expand Down Expand Up @@ -220,6 +221,8 @@ LogsWidget::LogsWidget(QWidget *parent) : QFrame(parent) {
h->addWidget(filters_widget);
h->addStretch(0);
h->addWidget(dynamic_mode = new QCheckBox(tr("Dynamic")), 0, Qt::AlignRight);
ToolButton *export_btn = new ToolButton("filetype-csv", tr("Export to CSV file..."));
h->addWidget(export_btn, 0, Qt::AlignRight);

display_type_cb->addItems({"Signal", "Hex"});
display_type_cb->setToolTip(tr("Display signal value or raw hex value"));
Expand Down Expand Up @@ -252,6 +255,7 @@ LogsWidget::LogsWidget(QWidget *parent) : QFrame(parent) {
QObject::connect(signals_cb, SIGNAL(activated(int)), this, SLOT(setFilter()));
QObject::connect(comp_box, SIGNAL(activated(int)), this, SLOT(setFilter()));
QObject::connect(value_edit, &QLineEdit::textChanged, this, &LogsWidget::setFilter);
QObject::connect(export_btn, &QToolButton::clicked, this, &LogsWidget::exportToCSV);
QObject::connect(can, &AbstractStream::seekedTo, model, &HistoryLogModel::refresh);
QObject::connect(dbc(), &DBCManager::DBCFileChanged, this, &LogsWidget::refresh);
QObject::connect(UndoStack::instance(), &QUndoStack::indexChanged, this, &LogsWidget::refresh);
Expand Down Expand Up @@ -304,3 +308,13 @@ void LogsWidget::showEvent(QShowEvent *event) {
model->refresh();
}
}

void LogsWidget::exportToCSV() {
QString dir = QString("%1/%2_%3.csv").arg(settings.last_dir).arg(can->routeName()).arg(msgName(model->msg_id));
QString fn = QFileDialog::getSaveFileName(this, QString("Export %1 to CSV file").arg(msgName(model->msg_id)),
dir, tr("csv (*.csv)"));
if (!fn.isEmpty()) {
const bool export_signals = model->display_signals_mode && model->sigs.size() > 0;
export_signals ? utils::exportSignalsToCSV(fn, model->msg_id) : utils::exportToCSV(fn, model->msg_id);
}
}
3 changes: 2 additions & 1 deletion tools/cabana/historylog.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

#include "tools/cabana/dbc/dbcmanager.h"
#include "tools/cabana/streams/abstractstream.h"
#include "tools/cabana/util.h"
#include "tools/cabana/utils/util.h"

class HeaderView : public QHeaderView {
public:
Expand Down Expand Up @@ -80,6 +80,7 @@ class LogsWidget : public QFrame {

private slots:
void setFilter();
void exportToCSV();

private:
void refresh();
Expand Down
12 changes: 12 additions & 0 deletions tools/cabana/mainwin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "tools/cabana/commands.h"
#include "tools/cabana/streamselector.h"
#include "tools/cabana/tools/findsignal.h"
#include "tools/cabana/utils/export.h"
#include "tools/replay/replay.h"

MainWindow::MainWindow() : QMainWindow() {
Expand Down Expand Up @@ -86,7 +87,9 @@ void MainWindow::createActions() {
QMenu *file_menu = menuBar()->addMenu(tr("&File"));
file_menu->addAction(tr("Open Stream..."), this, &MainWindow::openStream);
close_stream_act = file_menu->addAction(tr("Close stream"), this, &MainWindow::closeStream);
export_to_csv_act = file_menu->addAction(tr("Export to CSV..."), this, &MainWindow::exportToCSV);
close_stream_act->setEnabled(false);
export_to_csv_act->setEnabled(false);
file_menu->addSeparator();

file_menu->addAction(tr("New DBC File"), [this]() { newFile(); }, QKeySequence::New);
Expand Down Expand Up @@ -270,6 +273,14 @@ void MainWindow::closeStream() {
statusBar()->showMessage(tr("stream closed"));
}

void MainWindow::exportToCSV() {
QString dir = QString("%1/%2.csv").arg(settings.last_dir).arg(can->routeName());
QString fn = QFileDialog::getSaveFileName(this, "Export stream to CSV file", dir, tr("csv (*.csv)"));
if (!fn.isEmpty()) {
utils::exportToCSV(fn);
}
}

void MainWindow::newFile(SourceSet s) {
closeFile(s);
dbc()->open(s, "", "");
Expand Down Expand Up @@ -344,6 +355,7 @@ void MainWindow::changingStream() {
void MainWindow::streamStarted() {
bool has_stream = dynamic_cast<DummyStream *>(can) == nullptr;
close_stream_act->setEnabled(has_stream);
export_to_csv_act->setEnabled(has_stream);
tools_menu->setEnabled(has_stream);
createDockWidgets();

Expand Down
2 changes: 2 additions & 0 deletions tools/cabana/mainwin.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class MainWindow : public QMainWindow {
public slots:
void openStream();
void closeStream();
void exportToCSV();
void changingStream();
void streamStarted();

Expand Down Expand Up @@ -94,6 +95,7 @@ public slots:
QMenu *manage_dbcs_menu = nullptr;
QMenu *tools_menu = nullptr;
QAction *close_stream_act = nullptr;
QAction *export_to_csv_act = nullptr;
QAction *save_dbc = nullptr;
QAction *save_dbc_as = nullptr;
QAction *copy_dbc_to_clipboard = nullptr;
Expand Down
2 changes: 1 addition & 1 deletion tools/cabana/settings.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <QStandardPaths>
#include <type_traits>

#include "tools/cabana/util.h"
#include "tools/cabana/utils/util.h"

Settings settings;

Expand Down
2 changes: 1 addition & 1 deletion tools/cabana/streams/abstractstream.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

#include "cereal/messaging/messaging.h"
#include "tools/cabana/dbc/dbcmanager.h"
#include "tools/cabana/util.h"
#include "tools/cabana/utils/util.h"

struct CanData {
void compute(const MessageId &msg_id, const uint8_t *dat, const int size, double current_sec,
Expand Down
47 changes: 47 additions & 0 deletions tools/cabana/utils/export.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include "tools/cabana/utils/export.h"

#include <QFile>
#include <QTextStream>

#include "tools/cabana/streams/abstractstream.h"

namespace utils {

void exportToCSV(const QString &file_name, std::optional<MessageId> msg_id) {
QFile file(file_name);
if (file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
const uint64_t start_time = can->routeStartTime();
QTextStream stream(&file);
stream << "time,addr,bus,data\n";
for (auto e : msg_id ? can->events(*msg_id) : can->allEvents()) {
stream << QString::number((e->mono_time / 1e9) - start_time, 'f', 2) << ","
<< "0x" << QString::number(e->address, 16) << "," << e->src << ","
<< "0x" << QByteArray::fromRawData((const char *)e->dat, e->size).toHex().toUpper() << "\n";
}
}
}

void exportSignalsToCSV(const QString &file_name, const MessageId &msg_id) {
QFile file(file_name);
if (auto msg = dbc()->msg(msg_id); msg && msg->sigs.size() && file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
QTextStream stream(&file);
stream << "time,addr,bus";
for (auto s : msg->sigs)
stream << "," << s->name;
stream << "\n";

const uint64_t start_time = can->routeStartTime();
for (auto e : can->events(msg_id)) {
stream << QString::number((e->mono_time / 1e9) - start_time, 'f', 2) << ","
<< "0x" << QString::number(e->address, 16) << "," << e->src;
for (auto s : msg->sigs) {
double value = 0;
s->getValue(e->dat, e->size, &value);
stream << "," << QString::number(value, 'f', s->precision);
}
stream << "\n";
}
}
}

} // namespace utils
10 changes: 10 additions & 0 deletions tools/cabana/utils/export.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#pragma once

#include <optional>

#include "tools/cabana/dbc/dbcmanager.h"

namespace utils {
void exportToCSV(const QString &file_name, std::optional<MessageId> msg_id = std::nullopt);
void exportSignalsToCSV(const QString &file_name, const MessageId &msg_id);
} // namespace utils
2 changes: 1 addition & 1 deletion tools/cabana/util.cc → tools/cabana/utils/util.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "tools/cabana/util.h"
#include "tools/cabana/utils/util.h"

#include <algorithm>
#include <csignal>
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion tools/cabana/videowidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <QTabBar>

#include "selfdrive/ui/qt/widgets/cameraview.h"
#include "tools/cabana/util.h"
#include "tools/cabana/utils/util.h"
#include "tools/replay/logreader.h"

struct AlertInfo {
Expand Down

0 comments on commit 5f04517

Please sign in to comment.