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.
49 lines
1.8 KiB
49 lines
1.8 KiB
#include "selfdrive/ui/qt/onroad/buttons.h"
|
|
|
|
#include <QPainter>
|
|
|
|
#include "selfdrive/ui/qt/util.h"
|
|
|
|
void drawIcon(QPainter &p, const QPoint ¢er, const QPixmap &img, const QBrush &bg, float opacity) {
|
|
p.setRenderHint(QPainter::Antialiasing);
|
|
p.setOpacity(1.0); // bg dictates opacity of ellipse
|
|
p.setPen(Qt::NoPen);
|
|
p.setBrush(bg);
|
|
p.drawEllipse(center, btn_size / 2, btn_size / 2);
|
|
p.setOpacity(opacity);
|
|
p.drawPixmap(center - QPoint(img.width() / 2, img.height() / 2), img);
|
|
p.setOpacity(1.0);
|
|
}
|
|
|
|
// ExperimentalButton
|
|
ExperimentalButton::ExperimentalButton(QWidget *parent) : experimental_mode(false), engageable(false), QPushButton(parent) {
|
|
setFixedSize(btn_size, btn_size);
|
|
|
|
engage_img = loadPixmap("../assets/img_chffr_wheel.png", {img_size, img_size});
|
|
experimental_img = loadPixmap("../assets/img_experimental.svg", {img_size, img_size});
|
|
QObject::connect(this, &QPushButton::clicked, this, &ExperimentalButton::changeMode);
|
|
}
|
|
|
|
void ExperimentalButton::changeMode() {
|
|
const auto cp = (*uiState()->sm)["carParams"].getCarParams();
|
|
bool can_change = hasLongitudinalControl(cp) && params.getBool("ExperimentalModeConfirmed");
|
|
if (can_change) {
|
|
params.putBool("ExperimentalMode", !experimental_mode);
|
|
}
|
|
}
|
|
|
|
void ExperimentalButton::updateState(const UIState &s) {
|
|
const auto cs = (*s.sm)["selfdriveState"].getSelfdriveState();
|
|
bool eng = cs.getEngageable() || cs.getEnabled();
|
|
if ((cs.getExperimentalMode() != experimental_mode) || (eng != engageable)) {
|
|
engageable = eng;
|
|
experimental_mode = cs.getExperimentalMode();
|
|
update();
|
|
}
|
|
}
|
|
|
|
void ExperimentalButton::paintEvent(QPaintEvent *event) {
|
|
QPainter p(this);
|
|
QPixmap img = experimental_mode ? experimental_img : engage_img;
|
|
drawIcon(p, QPoint(btn_size / 2, btn_size / 2), img, QColor(0, 0, 0, 166), (isDown() || !engageable) ? 0.6 : 1.0);
|
|
}
|
|
|