openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
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.

151 lines
3.3 KiB

#pragma once
#include <optional>
#include <QGeoCoordinate>
#include <QGeoManeuver>
#include <QGeoRouteRequest>
#include <QGeoRouteSegment>
#include <QGeoRoutingManager>
#include <QGeoServiceProvider>
#include <QGestureEvent>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QMapboxGL>
#include <QMouseEvent>
#include <QOpenGLWidget>
#include <QScopedPointer>
#include <QString>
#include <QtGlobal>
#include <QTimer>
#include <QWheelEvent>
#include <QMap>
#include <QPixmap>
#include "selfdrive/common/params.h"
#include "selfdrive/common/util.h"
#include "cereal/messaging/messaging.h"
const QString MAPS_HOST = util::getenv("MAPS_HOST", "https://maps.comma.ai").c_str();
class MapInstructions : public QWidget {
Q_OBJECT
private:
QLabel *distance;
QLabel *primary;
QLabel *secondary;
QLabel *icon_01;
QHBoxLayout *lane_layout;
QMap<QString, QVariant> last_banner;
bool error = false;
public:
MapInstructions(QWidget * parent=nullptr);
void showError(QString error);
void hideIfNoError();
public slots:
void updateDistance(float d);
void updateInstructions(QMap<QString, QVariant> banner, bool full);
};
class MapETA : public QWidget {
Q_OBJECT
private:
QLabel *eta;
QLabel *eta_unit;
QLabel *time;
QLabel *time_unit;
QLabel *distance;
QLabel *distance_unit;
Params params;
public:
MapETA(QWidget * parent=nullptr);
public slots:
void updateETA(float seconds, float seconds_typical, float distance);
};
class MapWindow : public QOpenGLWidget {
Q_OBJECT
public:
MapWindow(const QMapboxGLSettings &);
~MapWindow();
private:
void initializeGL() final;
void paintGL() final;
void resizeGL(int w, int h) override;
QMapboxGLSettings m_settings;
QScopedPointer<QMapboxGL> m_map;
void initLayers();
void mousePressEvent(QMouseEvent *ev) final;
void mouseDoubleClickEvent(QMouseEvent *ev) final;
void mouseMoveEvent(QMouseEvent *ev) final;
void wheelEvent(QWheelEvent *ev) final;
bool event(QEvent *event) final;
bool gestureEvent(QGestureEvent *event);
void pinchTriggered(QPinchGesture *gesture);
bool m_sourceAdded = false;
SubMaster *sm;
QTimer* timer;
bool loaded_once = false;
// Panning
QPointF m_lastPos;
int pan_counter = 0;
int zoom_counter = 0;
// Position
std::optional<QMapbox::Coordinate> last_position;
std::optional<float> last_bearing;
FirstOrderFilter velocity_filter;
bool localizer_valid = false;
// Route
bool allow_open = true;
bool gps_ok = false;
QGeoServiceProvider *geoservice_provider;
QGeoRoutingManager *routing_manager;
QGeoRoute route;
QGeoRouteSegment segment;
MapInstructions* map_instructions;
MapETA* map_eta;
QMapbox::Coordinate nav_destination;
// Route recompute
QTimer* recompute_timer;
int recompute_backoff = 0;
int recompute_countdown = 0;
void calculateRoute(QMapbox::Coordinate destination);
void clearRoute();
bool shouldRecompute();
void updateETA();
private slots:
void timerUpdate();
void routeCalculated(QGeoRouteReply *reply);
void recomputeRoute();
public slots:
void offroadTransition(bool offroad);
signals:
void distanceChanged(float distance);
void instructionsChanged(QMap<QString, QVariant> banner, bool full);
void ETAChanged(float seconds, float seconds_typical, float distance);
};