Skip to content

Commit de4519e

Browse files
committed
2 parents dd086bf + fdc4a7f commit de4519e

18 files changed

+111
-78
lines changed

common/SConscript

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ common_libs = [
1010
'statlog.cc',
1111
'swaglog.cc',
1212
'util.cc',
13-
'gpio.cc',
1413
'i2c.cc',
1514
'watchdog.cc',
1615
]
1716

17+
if arch != "Darwin":
18+
common_libs.append('gpio.cc')
19+
1820
_common = fxn('common', common_libs, LIBS="json11")
1921

2022
files = [

selfdrive/boardd/boardd.cc

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <unistd.h>
88

99
#include <algorithm>
10+
#include <array>
1011
#include <atomic>
1112
#include <bitset>
1213
#include <cassert>

selfdrive/boardd/panda.cc

+4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ Panda::Panda(std::string serial, uint32_t bus_offset) : bus_offset(bus_offset) {
1414
try {
1515
handle = std::make_unique<PandaUsbHandle>(serial);
1616
} catch (std::exception &e) {
17+
#ifndef __APPLE__
1718
handle = std::make_unique<PandaSpiHandle>(serial);
19+
#endif
1820
}
1921

2022
hw_type = get_hw_type();
@@ -46,11 +48,13 @@ std::string Panda::hw_serial() {
4648
std::vector<std::string> Panda::list() {
4749
std::vector<std::string> serials = PandaUsbHandle::list();
4850

51+
#ifndef __APPLE__
4952
for (auto s : PandaSpiHandle::list()) {
5053
if (std::find(serials.begin(), serials.end(), s) == serials.end()) {
5154
serials.push_back(s);
5255
}
5356
}
57+
#endif
5458

5559
return serials;
5660
}

selfdrive/boardd/panda_comms.h

+4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
#include <cstdint>
66
#include <vector>
77

8+
#ifndef __APPLE__
89
#include <linux/spi/spidev.h>
10+
#endif
911

1012
#include <libusb-1.0/libusb.h>
1113

@@ -52,6 +54,7 @@ class PandaUsbHandle : public PandaCommsHandle {
5254
void handle_usb_issue(int err, const char func[]);
5355
};
5456

57+
#ifndef __APPLE__
5558
class PandaSpiHandle : public PandaCommsHandle {
5659
public:
5760
PandaSpiHandle(std::string serial);
@@ -75,3 +78,4 @@ class PandaSpiHandle : public PandaCommsHandle {
7578
int spi_transfer(uint8_t endpoint, uint8_t *tx_data, uint16_t tx_len, uint8_t *rx_data, uint16_t max_rx_len);
7679
int spi_transfer_retry(uint8_t endpoint, uint8_t *tx_data, uint16_t tx_len, uint8_t *rx_data, uint16_t max_rx_len);
7780
};
81+
#endif

selfdrive/boardd/spi.cc

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#ifndef __APPLE__
12
#include <sys/file.h>
23
#include <sys/ioctl.h>
34
#include <linux/spi/spidev.h>
@@ -339,3 +340,4 @@ int PandaSpiHandle::spi_transfer(uint8_t endpoint, uint8_t *tx_data, uint16_t tx
339340
transfer_fail:
340341
return ret;
341342
}
343+
#endif

selfdrive/loggerd/SConscript

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ if arch == "Darwin":
1313
# fix OpenCL
1414
del libs[libs.index('OpenCL')]
1515
env['FRAMEWORKS'] = ['OpenCL']
16+
# exclude v4l
17+
del src[src.index('encoder/v4l_encoder.cc')]
1618

1719
logger_lib = env.Library('logger', src)
1820
libs.insert(0, logger_lib)

tools/cabana/SConscript

+3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ cabana_lib = cabana_env.Library("cabana_lib", ['mainwin.cc', 'streams/livestream
2424
'commands.cc', 'messageswidget.cc', 'settings.cc', 'util.cc', 'detailwidget.cc', 'tools/findsimilarbits.cc'], LIBS=cabana_libs, FRAMEWORKS=base_frameworks)
2525
cabana_env.Program('_cabana', ['cabana.cc', cabana_lib, asset_obj], LIBS=cabana_libs, FRAMEWORKS=base_frameworks)
2626

27+
if arch == "Darwin":
28+
cabana_env.Execute('install_name_tool -change opendbc/can/libdbc.dylib @loader_path/../../opendbc/can/libdbc.dylib ./_cabana')
29+
2730
if GetOption('test'):
2831
cabana_env.Program('tests/_test_cabana', ['tests/test_runner.cc', 'tests/test_cabana.cc', cabana_lib], LIBS=[cabana_libs])
2932

tools/cabana/chartswidget.cc

+28-9
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ ChartsWidget::ChartsWidget(QWidget *parent) : QWidget(parent) {
3030
title_label->setContentsMargins(0, 0, 12, 0);
3131
columns_cb = new QComboBox(this);
3232
columns_cb->addItems({"1", "2", "3", "4"});
33-
toolbar->addWidget(new QLabel(tr("Columns:")));
34-
toolbar->addWidget(columns_cb);
33+
columns_lb_action = toolbar->addWidget(new QLabel(tr("Columns:")));
34+
columns_cb_action = toolbar->addWidget(columns_cb);
3535

3636
QLabel *stretch_label = new QLabel(this);
3737
stretch_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
@@ -46,19 +46,21 @@ ChartsWidget::ChartsWidget(QWidget *parent) : QWidget(parent) {
4646
range_slider->setPageStep(60); // 1 min
4747
toolbar->addWidget(range_slider);
4848

49-
toolbar->addWidget(zoom_range_lb = new QLabel());
50-
reset_zoom_btn = toolbar->addAction(bootstrapPixmap("arrow-counterclockwise"), "");
49+
reset_zoom_btn = toolbar->addAction(bootstrapPixmap("zoom-out"), "");
5150
reset_zoom_btn->setToolTip(tr("Reset zoom (drag on chart to zoom X-Axis)"));
5251
remove_all_btn = toolbar->addAction(bootstrapPixmap("x"), "");
5352
remove_all_btn->setToolTip(tr("Remove all charts"));
5453
dock_btn = toolbar->addAction("");
5554
main_layout->addWidget(toolbar);
5655

5756
// charts
57+
charts_layout = new QGridLayout();
58+
charts_layout->setSpacing(10);
59+
5860
QWidget *charts_container = new QWidget(this);
5961
QVBoxLayout *charts_main_layout = new QVBoxLayout(charts_container);
6062
charts_main_layout->setContentsMargins(0, 0, 0, 0);
61-
charts_main_layout->addLayout(charts_layout = new QGridLayout);
63+
charts_main_layout->addLayout(charts_layout);
6264
charts_main_layout->addStretch(0);
6365

6466
QScrollArea *charts_scroll = new QScrollArea(this);
@@ -167,7 +169,6 @@ void ChartsWidget::setMaxChartRange(int value) {
167169

168170
void ChartsWidget::updateToolBar() {
169171
range_lb->setText(QString(" %1:%2 ").arg(max_chart_range / 60, 2, 10, QLatin1Char('0')).arg(max_chart_range % 60, 2, 10, QLatin1Char('0')));
170-
zoom_range_lb->setText(is_zoomed ? tr("Zooming: %1 - %2").arg(zoomed_range.first, 0, 'f', 2).arg(zoomed_range.second, 0, 'f', 2) : "");
171172
title_label->setText(tr("Charts: %1").arg(charts.size()));
172173
dock_btn->setIcon(bootstrapPixmap(docking ? "arrow-up-right" : "arrow-down-left"));
173174
dock_btn->setToolTip(docking ? tr("Undock charts") : tr("Dock charts"));
@@ -230,8 +231,13 @@ void ChartsWidget::setColumnCount(int n) {
230231
void ChartsWidget::updateLayout() {
231232
int n = column_count;
232233
for (; n > 1; --n) {
233-
if ((n * (CHART_MIN_WIDTH + charts_layout->spacing())) < rect().width()) break;
234+
if ((n * CHART_MIN_WIDTH + (n - 1) * charts_layout->spacing()) < charts_layout->geometry().width()) break;
234235
}
236+
237+
bool show_column_cb = n > 1;
238+
columns_lb_action->setVisible(show_column_cb);
239+
columns_cb_action->setVisible(show_column_cb);
240+
235241
for (int i = 0; i < charts.size(); ++i) {
236242
charts_layout->addWidget(charts[charts.size() - i - 1], i / n, i % n);
237243
}
@@ -469,6 +475,18 @@ void ChartView::updatePlot(double cur, double min, double max) {
469475
axis_x->setRange(min, max);
470476
updateAxisY();
471477
}
478+
479+
// Show points when zoomed in enough
480+
for (auto &s : sigs) {
481+
auto begin = std::lower_bound(s.vals.begin(), s.vals.end(), axis_x->min(), [](auto &p, double x) { return p.x() < x; });
482+
auto end = std::lower_bound(s.vals.begin(), s.vals.end(), axis_x->max(), [](auto &p, double x) { return p.x() < x; });
483+
484+
int num_points = std::max<int>(end - begin, 1);
485+
int pixels_per_point = width() / num_points;
486+
487+
s.series->setPointsVisible(pixels_per_point > 20);
488+
}
489+
472490
scene()->invalidate({}, QGraphicsScene::ForegroundLayer);
473491
}
474492

@@ -521,8 +539,8 @@ void ChartView::updateAxisY() {
521539

522540
if (min_y == std::numeric_limits<double>::max()) min_y = 0;
523541
if (max_y == std::numeric_limits<double>::lowest()) max_y = 0;
524-
if (max_y == min_y) {
525-
axis_y->setRange(min_y - 1, max_y + 1);
542+
if (std::abs(max_y - min_y) < 1e-3) {
543+
applyNiceNumbers(min_y - 1, max_y + 1);
526544
} else {
527545
double range = max_y - min_y;
528546
applyNiceNumbers(min_y - range * 0.05, max_y + range * 0.05);
@@ -539,6 +557,7 @@ void ChartView::applyNiceNumbers(qreal min, qreal max) {
539557
tick_count = int(max - min) + 1;
540558
axis_y->setRange(min * step, max * step);
541559
axis_y->setTickCount(tick_count);
560+
axis_y->setLabelFormat("%.1f");
542561
}
543562

544563
// nice numbers can be expressed as form of 1*10^n, 2* 10^n or 5*10^n

tools/cabana/chartswidget.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ public slots:
116116
ChartView *findChart(const QString &id, const Signal *sig);
117117

118118
QLabel *title_label;
119-
QLabel *zoom_range_lb;
120119
QLabel *range_lb;
121120
QSlider *range_slider;
122121
bool docking = true;
@@ -131,6 +130,8 @@ public slots:
131130
std::pair<double, double> display_range;
132131
std::pair<double, double> zoomed_range;
133132
bool use_dark_theme = false;
133+
QAction *columns_lb_action;
134+
QAction *columns_cb_action;
134135
QComboBox *columns_cb;
135136
int column_count = 1;
136137
const int CHART_MIN_WIDTH = 300;

tools/cabana/detailwidget.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ EditMessageDialog::EditMessageDialog(const QString &msg_id, const QString &title
186186
form_layout->addRow("ID", new QLabel(msg_id));
187187

188188
name_edit = new QLineEdit(title, this);
189-
name_edit->setValidator(new QRegExpValidator(QRegExp("^(\\w+)"), name_edit));
189+
name_edit->setValidator(new NameValidator(name_edit));
190190
form_layout->addRow(tr("Name"), name_edit);
191191

192192
size_spin = new QSpinBox(this);

tools/cabana/historylog.cc

+19-27
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ void HistoryLogModel::updateState() {
8484
if ((has_more_data = !new_msgs.empty())) {
8585
beginInsertRows({}, 0, new_msgs.size() - 1);
8686
messages.insert(messages.begin(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end()));
87-
updateColors();
8887
endInsertRows();
8988
}
9089
last_fetch_time = current_time;
@@ -97,29 +96,11 @@ void HistoryLogModel::fetchMore(const QModelIndex &parent) {
9796
if ((has_more_data = !new_msgs.empty())) {
9897
beginInsertRows({}, messages.size(), messages.size() + new_msgs.size() - 1);
9998
messages.insert(messages.end(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end()));
100-
if (!dynamic_mode) {
101-
updateColors();
102-
}
10399
endInsertRows();
104100
}
105101
}
106102
}
107103

108-
void HistoryLogModel::updateColors() {
109-
if (!display_signals_mode || sigs.empty()) {
110-
const auto freq = can->lastMessage(msg_id).freq;
111-
if (dynamic_mode) {
112-
for (auto it = messages.rbegin(); it != messages.rend(); ++it) {
113-
it->colors = hex_colors.compute(it->data, it->mono_time / (double)1e9, freq);
114-
}
115-
} else {
116-
for (auto it = messages.begin(); it != messages.end(); ++it) {
117-
it->colors = hex_colors.compute(it->data, it->mono_time / (double)1e9, freq);
118-
}
119-
}
120-
}
121-
}
122-
123104
template <class InputIt>
124105
std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData(InputIt first, InputIt last, uint64_t min_time) {
125106
std::deque<HistoryLogModel::Message> msgs;
@@ -153,17 +134,28 @@ template std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData<>(std::
153134

154135
std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData(uint64_t from_time, uint64_t min_time) {
155136
auto events = can->events();
137+
const auto freq = can->lastMessage(msg_id).freq;
138+
const bool update_colors = !display_signals_mode || sigs.empty();
139+
156140
if (dynamic_mode) {
157-
auto it = std::upper_bound(events->rbegin(), events->rend(), from_time, [=](uint64_t ts, auto &e) {
158-
return e->mono_time < ts;
159-
});
160-
return fetchData(it, events->rend(), min_time);
141+
auto first = std::upper_bound(events->rbegin(), events->rend(), from_time, [=](uint64_t ts, auto &e) { return e->mono_time < ts; });
142+
auto msgs = fetchData(first, events->rend(), min_time);
143+
if (update_colors && min_time > 0) {
144+
for (auto it = msgs.rbegin(); it != msgs.rend(); ++it) {
145+
it->colors = hex_colors.compute(it->data, it->mono_time / (double)1e9, freq);
146+
}
147+
}
148+
return msgs;
161149
} else {
162150
assert(min_time == 0);
163-
auto it = std::upper_bound(events->begin(), events->end(), from_time, [=](uint64_t ts, auto &e) {
164-
return ts < e->mono_time;
165-
});
166-
return fetchData(it, events->end(), 0);
151+
auto first = std::upper_bound(events->begin(), events->end(), from_time, [=](uint64_t ts, auto &e) { return ts < e->mono_time; });
152+
auto msgs = fetchData(first, events->end(), 0);
153+
if (update_colors) {
154+
for (auto it = msgs.rbegin(); it != msgs.rend(); ++it) {
155+
it->colors = hex_colors.compute(it->data, it->mono_time / (double)1e9, freq);
156+
}
157+
}
158+
return msgs;
167159
}
168160
}
169161

tools/cabana/historylog.h

-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ class HistoryLogModel : public QAbstractTableModel {
3333
int columnCount(const QModelIndex &parent = QModelIndex()) const override {
3434
return display_signals_mode && !sigs.empty() ? sigs.size() + 1 : 2;
3535
}
36-
void updateColors();
3736
void refresh();
3837

3938
public slots:

0 commit comments

Comments
 (0)