diff --git a/.gitignore b/.gitignore
index f4932ed4f..14ba0bd05 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,6 +42,7 @@ selfdrive/logcatd/logcatd
selfdrive/mapd/default_speeds_by_region.json
selfdrive/proclogd/proclogd
selfdrive/ui/_ui
+selfdrive/ui/_soundd
selfdrive/test/longitudinal_maneuvers/out
selfdrive/visiond/visiond
selfdrive/loggerd/loggerd
diff --git a/Jenkinsfile b/Jenkinsfile
index dbcc11066..20bfcccf6 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -71,7 +71,24 @@ pipeline {
}
steps {
phone_steps("eon-build", [
- ["build release2-staging and dashcam-staging", "cd release && PUSH=1 ./build_release2.sh"],
+ ["build release2-staging & dashcam-staging", "cd release && PUSH=1 ./build_release2.sh"],
+ ])
+ }
+ }
+
+ stage('Build release3') {
+ agent {
+ docker {
+ image 'python:3.7.3'
+ args '--user=root'
+ }
+ }
+ when {
+ branch 'devel-staging'
+ }
+ steps {
+ phone_steps("tici", [
+ ["build release3-staging & dashcam3-staging", "PUSH=1 $SOURCE_DIR/release/build_release3.sh"],
])
}
}
@@ -80,7 +97,10 @@ pipeline {
when {
not {
anyOf {
- branch 'master-ci'; branch 'devel'; branch 'devel-staging'; branch 'release2'; branch 'release2-staging'; branch 'dashcam'; branch 'dashcam-staging'; branch 'testing-closet*'; branch 'hotfix-*'
+ branch 'master-ci'; branch 'devel'; branch 'devel-staging';
+ branch 'release2'; branch 'release2-staging'; branch 'dashcam'; branch 'dashcam-staging';
+ branch 'release3'; branch 'release3-staging'; branch 'dashcam3'; branch 'dashcam3-staging';
+ branch 'testing-closet*'; branch 'hotfix-*'
}
}
}
@@ -152,7 +172,7 @@ pipeline {
phone_steps("eon", [
["build", "cd selfdrive/manager && ./build.py"],
["test athena", "nosetests -s selfdrive/athena/tests/test_athenad_old.py"],
- ["test sounds", "nosetests -s selfdrive/test/test_sounds.py"],
+ ["test sounds", "nosetests -s selfdrive/ui/tests/test_sounds.py"],
["test boardd loopback", "nosetests -s selfdrive/boardd/tests/test_boardd_loopback.py"],
["test loggerd", "python selfdrive/loggerd/tests/test_loggerd.py"],
["test encoder", "python selfdrive/loggerd/tests/test_encoder.py"],
@@ -191,7 +211,6 @@ pipeline {
phone_steps("tici", [
["build", "cd selfdrive/manager && ./build.py"],
["onroad tests", "cd selfdrive/test/ && ./test_onroad.py"],
- //["build release3-staging", "cd release && PUSH=${env.R3_PUSH} ./build_release3.sh"],
])
}
}
diff --git a/README.md b/README.md
index ff1cde33e..aeaeb5613 100644
--- a/README.md
+++ b/README.md
@@ -204,6 +204,7 @@ Community Maintained Cars and Features
| Volkswagen| Jetta 2018-20 | Driver Assistance | Stock | 0mph | 0mph |
| Volkswagen| Jetta GLI 2021 | Driver Assistance | Stock | 0mph | 0mph |
| Volkswagen| Passat 2016-172 | Driver Assistance | Stock | 0mph | 0mph |
+| Volkswagen| T-Cross 2021 | Driver Assistance | Stock | 0mph | 0mph |
| Volkswagen| Tiguan 2020 | Driver Assistance | Stock | 0mph | 0mph |
| Volkswagen| Touran 2017 | Driver Assistance | Stock | 0mph | 0mph |
@@ -298,13 +299,13 @@ openpilot is open source software: the user is free to disable data collection i
openpilot logs the road facing camera, CAN, GPS, IMU, magnetometer, thermal sensors, crashes, and operating system logs.
The driver facing camera is only logged if you explicitly opt-in in settings. The microphone is not recorded.
-By using openpilot, you agree to [our Privacy Policy](https://my.comma.ai/privacy). You understand that use of this software or its related services will generate certain types of user data, which may be logged and stored at the sole discretion of comma. By accepting this agreement, you grant an irrevocable, perpetual, worldwide right to comma for the use of this data.
+By using openpilot, you agree to [our Privacy Policy](https://connect.comma.ai/privacy). You understand that use of this software or its related services will generate certain types of user data, which may be logged and stored at the sole discretion of comma. By accepting this agreement, you grant an irrevocable, perpetual, worldwide right to comma for the use of this data.
Safety and Testing
----
* openpilot observes ISO26262 guidelines, see [SAFETY.md](SAFETY.md) for more details.
-* openpilot has software in the loop [tests](.github/workflows/test.yaml) that run on every commit.
+* openpilot has software in the loop [tests](.github/workflows/selfdrive_tests.yaml) that run on every commit.
* The safety model code lives in panda and is written in C, see [code rigor](https://github.com/commaai/panda#code-rigor) for more details.
* panda has software in the loop [safety tests](https://github.com/commaai/panda/tree/master/tests/safety).
* Internally, we have a hardware in the loop Jenkins test suite that builds and unit tests the various processes.
diff --git a/RELEASES.md b/RELEASES.md
index 767d6331e..59d9ee474 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -1,3 +1,7 @@
+Version 0.8.7 (2021-07-31)
+========================
+ * Volkswagen T-Cross 2021 support thanks to jyoung8607!
+
Version 0.8.6 (2021-07-21)
========================
* Revamp lateral and longitudinal planners
diff --git a/cereal/log.capnp b/cereal/log.capnp
index 4f21fcf98..79c1fd9b2 100644
--- a/cereal/log.capnp
+++ b/cereal/log.capnp
@@ -432,6 +432,7 @@ struct PandaState @0xa7649e2575e4591e {
pedal @4;
uno @5;
dos @6;
+ red @7;
}
enum UsbPowerMode {
diff --git a/cereal/visionipc/visionbuf.h b/cereal/visionipc/visionbuf.h
index f6d84f4c1..fad60f7ab 100644
--- a/cereal/visionipc/visionbuf.h
+++ b/cereal/visionipc/visionbuf.h
@@ -49,7 +49,6 @@ class VisionBuf {
// ion
int handle = 0;
- bool owner = false;
void allocate(size_t len);
void import();
diff --git a/cereal/visionipc/visionbuf_ion.cc b/cereal/visionipc/visionbuf_ion.cc
index 31448daed..92b72b04d 100644
--- a/cereal/visionipc/visionbuf_ion.cc
+++ b/cereal/visionipc/visionbuf_ion.cc
@@ -62,7 +62,6 @@ void VisionBuf::allocate(size_t len) {
memset(addr, 0, ion_alloc.len);
- this->owner = true;
this->len = len;
this->mmap_len = ion_alloc.len;
this->addr = addr;
@@ -82,7 +81,6 @@ void VisionBuf::import(){
err = ioctl(ion_fd, ION_IOC_IMPORT, &fd_data);
assert(err == 0);
- this->owner = false;
this->handle = fd_data.handle;
this->addr = mmap(NULL, this->mmap_len, PROT_READ | PROT_WRITE, MAP_SHARED, this->fd, 0);
assert(this->addr != MAP_FAILED);
@@ -139,10 +137,6 @@ void VisionBuf::free() {
munmap(this->addr, this->mmap_len);
close(this->fd);
- // Free the ION buffer if we also shared it
- if (this->owner){
- struct ion_handle_data handle_data = {.handle = this->handle};
- int ret = ioctl(ion_fd, ION_IOC_FREE, &handle_data);
- assert(ret == 0);
- }
+ struct ion_handle_data handle_data = {.handle = this->handle};
+ ioctl(ion_fd, ION_IOC_FREE, &handle_data);
}
diff --git a/cereal/visionipc/visionipc_server.cc b/cereal/visionipc/visionipc_server.cc
index 4aeb40d6e..adfc23190 100644
--- a/cereal/visionipc/visionipc_server.cc
+++ b/cereal/visionipc/visionipc_server.cc
@@ -122,7 +122,6 @@ void VisionIpcServer::listener(){
bufs[i].buf_cl = 0;
bufs[i].copy_q = 0;
bufs[i].handle = 0;
- bufs[i].owner = false;
bufs[i].server_id = server_id;
}
diff --git a/common/logging_extra.py b/common/logging_extra.py
index 9471b4419..d3a75d0f4 100644
--- a/common/logging_extra.py
+++ b/common/logging_extra.py
@@ -158,7 +158,7 @@ class SwagLogger(logging.Logger):
evt.update(kwargs)
if 'error' in kwargs:
self.error(evt)
- if 'debug' in kwargs:
+ elif 'debug' in kwargs:
self.debug(evt)
else:
self.info(evt)
diff --git a/installer/continue_openpilot.sh b/installer/continue_openpilot.sh
new file mode 100755
index 000000000..3da67313e
--- /dev/null
+++ b/installer/continue_openpilot.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/bash
+
+cd /data/openpilot
+exec ./launch_openpilot.sh
diff --git a/launch_chffrplus.sh b/launch_chffrplus.sh
index d76dd9c18..d8bf6da5c 100755
--- a/launch_chffrplus.sh
+++ b/launch_chffrplus.sh
@@ -93,6 +93,11 @@ function two_init {
}
function tici_init {
+ # wait longer for weston to come up
+ if [ -f "$BASEDIR/prebuilt" ]; then
+ sleep 3
+ fi
+
sudo su -c 'echo "performance" > /sys/class/devfreq/soc:qcom,memlat-cpu0/governor'
sudo su -c 'echo "performance" > /sys/class/devfreq/soc:qcom,memlat-cpu4/governor'
nmcli connection modify --temporary lte gsm.auto-config yes
@@ -103,11 +108,12 @@ function tici_init {
# Check if AGNOS update is required
if [ $(< /VERSION) != "$AGNOS_VERSION" ]; then
+ AGNOS_PY="$DIR/selfdrive/hardware/tici/agnos.py"
MANIFEST="$DIR/selfdrive/hardware/tici/agnos.json"
- $DIR/selfdrive/hardware/tici/agnos.py --swap $MANIFEST
-
- sleep 1
- sudo reboot
+ if $AGNOS_PY --verify $MANIFEST; then
+ sudo reboot
+ fi
+ $DIR/selfdrive/hardware/tici/updater $AGNOS_PY $MANIFEST
fi
}
diff --git a/launch_env.sh b/launch_env.sh
index 3a3fef74e..128d3d687 100755
--- a/launch_env.sh
+++ b/launch_env.sh
@@ -11,7 +11,7 @@ if [ -z "$REQUIRED_NEOS_VERSION" ]; then
fi
if [ -z "$AGNOS_VERSION" ]; then
- export AGNOS_VERSION="0.21"
+ export AGNOS_VERSION="1.1"
fi
if [ -z "$PASSIVE" ]; then
diff --git a/phonelibs/mapbox-gl-native-qt/include/QMapbox b/phonelibs/mapbox-gl-native-qt/include/QMapbox
new file mode 100644
index 000000000..a8479c09a
--- /dev/null
+++ b/phonelibs/mapbox-gl-native-qt/include/QMapbox
@@ -0,0 +1 @@
+#include "qmapbox.hpp"
diff --git a/phonelibs/mapbox-gl-native-qt/include/QMapboxGL b/phonelibs/mapbox-gl-native-qt/include/QMapboxGL
new file mode 100644
index 000000000..15b55a9ab
--- /dev/null
+++ b/phonelibs/mapbox-gl-native-qt/include/QMapboxGL
@@ -0,0 +1 @@
+#include "qmapboxgl.hpp"
diff --git a/phonelibs/mapbox-gl-native-qt/include/qmapbox.hpp b/phonelibs/mapbox-gl-native-qt/include/qmapbox.hpp
new file mode 100644
index 000000000..3acc9d55e
--- /dev/null
+++ b/phonelibs/mapbox-gl-native-qt/include/qmapbox.hpp
@@ -0,0 +1,147 @@
+#ifndef QMAPBOX_H
+#define QMAPBOX_H
+
+#include
+#include
+#include
+#include
+#include
+
+// This header follows the Qt coding style: https://wiki.qt.io/Qt_Coding_Style
+
+#if !defined(QT_MAPBOXGL_STATIC)
+# if defined(QT_BUILD_MAPBOXGL_LIB)
+# define Q_MAPBOXGL_EXPORT Q_DECL_EXPORT
+# else
+# define Q_MAPBOXGL_EXPORT Q_DECL_IMPORT
+# endif
+#else
+# define Q_MAPBOXGL_EXPORT
+#endif
+
+namespace QMapbox {
+
+typedef QPair Coordinate;
+typedef QPair CoordinateZoom;
+typedef QPair ProjectedMeters;
+
+typedef QVector Coordinates;
+typedef QVector CoordinatesCollection;
+
+typedef QVector CoordinatesCollections;
+
+struct Q_MAPBOXGL_EXPORT Feature {
+ enum Type {
+ PointType = 1,
+ LineStringType,
+ PolygonType
+ };
+
+ /*! Class constructor. */
+ Feature(Type type_ = PointType, const CoordinatesCollections& geometry_ = CoordinatesCollections(),
+ const QVariantMap& properties_ = QVariantMap(), const QVariant& id_ = QVariant())
+ : type(type_), geometry(geometry_), properties(properties_), id(id_) {}
+
+ Type type;
+ CoordinatesCollections geometry;
+ QVariantMap properties;
+ QVariant id;
+};
+
+struct Q_MAPBOXGL_EXPORT ShapeAnnotationGeometry {
+ enum Type {
+ LineStringType = 1,
+ PolygonType,
+ MultiLineStringType,
+ MultiPolygonType
+ };
+
+ /*! Class constructor. */
+ ShapeAnnotationGeometry(Type type_ = LineStringType, const CoordinatesCollections& geometry_ = CoordinatesCollections())
+ : type(type_), geometry(geometry_) {}
+
+ Type type;
+ CoordinatesCollections geometry;
+};
+
+struct Q_MAPBOXGL_EXPORT SymbolAnnotation {
+ Coordinate geometry;
+ QString icon;
+};
+
+struct Q_MAPBOXGL_EXPORT LineAnnotation {
+ /*! Class constructor. */
+ LineAnnotation(const ShapeAnnotationGeometry& geometry_ = ShapeAnnotationGeometry(), float opacity_ = 1.0f,
+ float width_ = 1.0f, const QColor& color_ = Qt::black)
+ : geometry(geometry_), opacity(opacity_), width(width_), color(color_) {}
+
+ ShapeAnnotationGeometry geometry;
+ float opacity;
+ float width;
+ QColor color;
+};
+
+struct Q_MAPBOXGL_EXPORT FillAnnotation {
+ /*! Class constructor. */
+ FillAnnotation(const ShapeAnnotationGeometry& geometry_ = ShapeAnnotationGeometry(), float opacity_ = 1.0f,
+ const QColor& color_ = Qt::black, const QVariant& outlineColor_ = QVariant())
+ : geometry(geometry_), opacity(opacity_), color(color_), outlineColor(outlineColor_) {}
+
+ ShapeAnnotationGeometry geometry;
+ float opacity;
+ QColor color;
+ QVariant outlineColor;
+};
+
+typedef QVariant Annotation;
+typedef quint32 AnnotationID;
+typedef QVector AnnotationIDs;
+
+enum NetworkMode {
+ Online, // Default
+ Offline,
+};
+
+Q_MAPBOXGL_EXPORT QVector >& defaultStyles();
+
+Q_MAPBOXGL_EXPORT NetworkMode networkMode();
+Q_MAPBOXGL_EXPORT void setNetworkMode(NetworkMode);
+
+// This struct is a 1:1 copy of mbgl::CustomLayerRenderParameters.
+struct Q_MAPBOXGL_EXPORT CustomLayerRenderParameters {
+ double width;
+ double height;
+ double latitude;
+ double longitude;
+ double zoom;
+ double bearing;
+ double pitch;
+ double fieldOfView;
+};
+
+class Q_MAPBOXGL_EXPORT CustomLayerHostInterface {
+public:
+ virtual ~CustomLayerHostInterface() = default;
+ virtual void initialize() = 0;
+ virtual void render(const CustomLayerRenderParameters&) = 0;
+ virtual void deinitialize() = 0;
+};
+
+Q_MAPBOXGL_EXPORT double metersPerPixelAtLatitude(double latitude, double zoom);
+Q_MAPBOXGL_EXPORT ProjectedMeters projectedMetersForCoordinate(const Coordinate &);
+Q_MAPBOXGL_EXPORT Coordinate coordinateForProjectedMeters(const ProjectedMeters &);
+
+} // namespace QMapbox
+
+Q_DECLARE_METATYPE(QMapbox::Coordinate);
+Q_DECLARE_METATYPE(QMapbox::Coordinates);
+Q_DECLARE_METATYPE(QMapbox::CoordinatesCollection);
+Q_DECLARE_METATYPE(QMapbox::CoordinatesCollections);
+Q_DECLARE_METATYPE(QMapbox::Feature);
+
+Q_DECLARE_METATYPE(QMapbox::SymbolAnnotation);
+Q_DECLARE_METATYPE(QMapbox::ShapeAnnotationGeometry);
+Q_DECLARE_METATYPE(QMapbox::LineAnnotation);
+Q_DECLARE_METATYPE(QMapbox::FillAnnotation);
+
+#endif // QMAPBOX_H
diff --git a/phonelibs/mapbox-gl-native-qt/include/qmapboxgl.hpp b/phonelibs/mapbox-gl-native-qt/include/qmapboxgl.hpp
new file mode 100644
index 000000000..337991aa1
--- /dev/null
+++ b/phonelibs/mapbox-gl-native-qt/include/qmapboxgl.hpp
@@ -0,0 +1,277 @@
+#ifndef QMAPBOXGL_H
+#define QMAPBOXGL_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+class QMapboxGLPrivate;
+
+// This header follows the Qt coding style: https://wiki.qt.io/Qt_Coding_Style
+
+class Q_MAPBOXGL_EXPORT QMapboxGLSettings
+{
+public:
+ QMapboxGLSettings();
+
+ enum GLContextMode {
+ UniqueGLContext = 0,
+ SharedGLContext
+ };
+
+ enum MapMode {
+ Continuous = 0,
+ Static
+ };
+
+ enum ConstrainMode {
+ NoConstrain = 0,
+ ConstrainHeightOnly,
+ ConstrainWidthAndHeight
+ };
+
+ enum ViewportMode {
+ DefaultViewport = 0,
+ FlippedYViewport
+ };
+
+ GLContextMode contextMode() const;
+ void setContextMode(GLContextMode);
+
+ MapMode mapMode() const;
+ void setMapMode(MapMode);
+
+ ConstrainMode constrainMode() const;
+ void setConstrainMode(ConstrainMode);
+
+ ViewportMode viewportMode() const;
+ void setViewportMode(ViewportMode);
+
+ unsigned cacheDatabaseMaximumSize() const;
+ void setCacheDatabaseMaximumSize(unsigned);
+
+ QString cacheDatabasePath() const;
+ void setCacheDatabasePath(const QString &);
+
+ QString assetPath() const;
+ void setAssetPath(const QString &);
+
+ QString accessToken() const;
+ void setAccessToken(const QString &);
+
+ QString apiBaseUrl() const;
+ void setApiBaseUrl(const QString &);
+
+ QString localFontFamily() const;
+ void setLocalFontFamily(const QString &);
+
+ std::function resourceTransform() const;
+ void setResourceTransform(const std::function &);
+
+private:
+ GLContextMode m_contextMode;
+ MapMode m_mapMode;
+ ConstrainMode m_constrainMode;
+ ViewportMode m_viewportMode;
+
+ unsigned m_cacheMaximumSize;
+ QString m_cacheDatabasePath;
+ QString m_assetPath;
+ QString m_accessToken;
+ QString m_apiBaseUrl;
+ QString m_localFontFamily;
+ std::function m_resourceTransform;
+};
+
+struct Q_MAPBOXGL_EXPORT QMapboxGLCameraOptions {
+ QVariant center; // Coordinate
+ QVariant anchor; // QPointF
+ QVariant zoom; // double
+ QVariant bearing; // double
+ QVariant pitch; // double
+};
+
+class Q_MAPBOXGL_EXPORT QMapboxGL : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(double latitude READ latitude WRITE setLatitude)
+ Q_PROPERTY(double longitude READ longitude WRITE setLongitude)
+ Q_PROPERTY(double zoom READ zoom WRITE setZoom)
+ Q_PROPERTY(double bearing READ bearing WRITE setBearing)
+ Q_PROPERTY(double pitch READ pitch WRITE setPitch)
+ Q_PROPERTY(QString styleJson READ styleJson WRITE setStyleJson)
+ Q_PROPERTY(QString styleUrl READ styleUrl WRITE setStyleUrl)
+ Q_PROPERTY(double scale READ scale WRITE setScale)
+ Q_PROPERTY(QMapbox::Coordinate coordinate READ coordinate WRITE setCoordinate)
+ Q_PROPERTY(QMargins margins READ margins WRITE setMargins)
+
+public:
+ enum MapChange {
+ MapChangeRegionWillChange = 0,
+ MapChangeRegionWillChangeAnimated,
+ MapChangeRegionIsChanging,
+ MapChangeRegionDidChange,
+ MapChangeRegionDidChangeAnimated,
+ MapChangeWillStartLoadingMap,
+ MapChangeDidFinishLoadingMap,
+ MapChangeDidFailLoadingMap,
+ MapChangeWillStartRenderingFrame,
+ MapChangeDidFinishRenderingFrame,
+ MapChangeDidFinishRenderingFrameFullyRendered,
+ MapChangeWillStartRenderingMap,
+ MapChangeDidFinishRenderingMap,
+ MapChangeDidFinishRenderingMapFullyRendered,
+ MapChangeDidFinishLoadingStyle,
+ MapChangeSourceDidChange
+ };
+
+ enum MapLoadingFailure {
+ StyleParseFailure,
+ StyleLoadFailure,
+ NotFoundFailure,
+ UnknownFailure
+ };
+
+ // Determines the orientation of the map.
+ enum NorthOrientation {
+ NorthUpwards, // Default
+ NorthRightwards,
+ NorthDownwards,
+ NorthLeftwards,
+ };
+
+ QMapboxGL(QObject* parent = 0,
+ const QMapboxGLSettings& = QMapboxGLSettings(),
+ const QSize& size = QSize(),
+ qreal pixelRatio = 1);
+ virtual ~QMapboxGL();
+
+ QString styleJson() const;
+ QString styleUrl() const;
+
+ void setStyleJson(const QString &);
+ void setStyleUrl(const QString &);
+
+ double latitude() const;
+ void setLatitude(double latitude);
+
+ double longitude() const;
+ void setLongitude(double longitude);
+
+ double scale() const;
+ void setScale(double scale, const QPointF ¢er = QPointF());
+
+ double zoom() const;
+ void setZoom(double zoom);
+
+ double minimumZoom() const;
+ double maximumZoom() const;
+
+ double bearing() const;
+ void setBearing(double degrees);
+ void setBearing(double degrees, const QPointF ¢er);
+
+ double pitch() const;
+ void setPitch(double pitch);
+ void pitchBy(double pitch);
+
+ NorthOrientation northOrientation() const;
+ void setNorthOrientation(NorthOrientation);
+
+ QMapbox::Coordinate coordinate() const;
+ void setCoordinate(const QMapbox::Coordinate &);
+ void setCoordinateZoom(const QMapbox::Coordinate &, double zoom);
+
+ void jumpTo(const QMapboxGLCameraOptions&);
+
+ void setGestureInProgress(bool inProgress);
+
+ void setTransitionOptions(qint64 duration, qint64 delay = 0);
+
+ void addAnnotationIcon(const QString &name, const QImage &sprite);
+
+ QMapbox::AnnotationID addAnnotation(const QMapbox::Annotation &);
+ void updateAnnotation(QMapbox::AnnotationID, const QMapbox::Annotation &);
+ void removeAnnotation(QMapbox::AnnotationID);
+
+ bool setLayoutProperty(const QString &layer, const QString &property, const QVariant &value);
+ bool setPaintProperty(const QString &layer, const QString &property, const QVariant &value);
+
+ bool isFullyLoaded() const;
+
+ void moveBy(const QPointF &offset);
+ void scaleBy(double scale, const QPointF ¢er = QPointF());
+ void rotateBy(const QPointF &first, const QPointF &second);
+
+ void resize(const QSize &size);
+
+ double metersPerPixelAtLatitude(double latitude, double zoom) const;
+ QMapbox::ProjectedMeters projectedMetersForCoordinate(const QMapbox::Coordinate &) const;
+ QMapbox::Coordinate coordinateForProjectedMeters(const QMapbox::ProjectedMeters &) const;
+ QPointF pixelForCoordinate(const QMapbox::Coordinate &) const;
+ QMapbox::Coordinate coordinateForPixel(const QPointF &) const;
+
+ QMapbox::CoordinateZoom coordinateZoomForBounds(const QMapbox::Coordinate &sw, QMapbox::Coordinate &ne) const;
+ QMapbox::CoordinateZoom coordinateZoomForBounds(const QMapbox::Coordinate &sw, QMapbox::Coordinate &ne, double bearing, double pitch);
+
+ void setMargins(const QMargins &margins);
+ QMargins margins() const;
+
+ void addSource(const QString &sourceID, const QVariantMap& params);
+ bool sourceExists(const QString &sourceID);
+ void updateSource(const QString &sourceID, const QVariantMap& params);
+ void removeSource(const QString &sourceID);
+
+ void addImage(const QString &name, const QImage &sprite);
+ void removeImage(const QString &name);
+
+ void addCustomLayer(const QString &id,
+ QScopedPointer& host,
+ const QString& before = QString());
+ void addLayer(const QVariantMap ¶ms, const QString& before = QString());
+ bool layerExists(const QString &id);
+ void removeLayer(const QString &id);
+
+ QVector layerIds() const;
+
+ void setFilter(const QString &layer, const QVariant &filter);
+ QVariant getFilter(const QString &layer) const;
+ // When rendering on a different thread,
+ // should be called on the render thread.
+ void createRenderer();
+ void destroyRenderer();
+ void setFramebufferObject(quint32 fbo, const QSize &size);
+
+public slots:
+ void render();
+ void connectionEstablished();
+
+ // Commit changes, load all the resources
+ // and renders the map when completed.
+ void startStaticRender();
+
+signals:
+ void needsRendering();
+ void mapChanged(QMapboxGL::MapChange);
+ void mapLoadingFailed(QMapboxGL::MapLoadingFailure, const QString &reason);
+ void copyrightsChanged(const QString ©rightsHtml);
+
+ void staticRenderFinished(const QString &error);
+
+private:
+ Q_DISABLE_COPY(QMapboxGL)
+
+ QMapboxGLPrivate *d_ptr;
+};
+
+Q_DECLARE_METATYPE(QMapboxGL::MapChange);
+Q_DECLARE_METATYPE(QMapboxGL::MapLoadingFailure);
+
+#endif // QMAPBOXGL_H
diff --git a/release/build_devel.sh b/release/build_devel.sh
new file mode 100755
index 000000000..db8c69bd7
--- /dev/null
+++ b/release/build_devel.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/bash -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+
+TARGET_DIR=/data/openpilot
+SOURCE_DIR="$(git rev-parse --show-toplevel)"
+
+# set git identity
+source $DIR/identity.sh
+
+echo "[-] Setting up repo T=$SECONDS"
+if [ ! -d "$TARGET_DIR" ]; then
+ mkdir -p $TARGET_DIR
+ cd $TARGET_DIR
+ git init
+ git remote add origin git@github.com:commaai/openpilot.git
+fi
+
+echo "[-] bringing master-ci and devel in sync T=$SECONDS"
+cd $TARGET_DIR
+git prune || true
+git remote prune origin || true
+git fetch origin master-ci
+git fetch origin devel
+
+git checkout -f --track origin/master-ci
+git reset --hard master-ci
+git checkout master-ci
+git reset --hard origin/devel
+git clean -xdf
+
+# remove everything except .git
+echo "[-] erasing old openpilot T=$SECONDS"
+find . -maxdepth 1 -not -path './.git' -not -name '.' -not -name '..' -exec rm -rf '{}' \;
+
+# reset source tree
+cd $SOURCE_DIR
+git clean -xdf
+
+# do the files copy
+echo "[-] copying files T=$SECONDS"
+cd $SOURCE_DIR
+cp -pR --parents $(cat release/files_common) $TARGET_DIR/
+cp -pR --parents $(cat release/files_tici) $TARGET_DIR/
+if [ ! -z "$EXTRA_FILES" ]; then
+ cp -pR --parents $EXTRA_FILES $TARGET_DIR/
+fi
+
+# append source commit hash and build date to version
+GIT_HASH=$(git --git-dir=$SOURCE_DIR/.git rev-parse --short HEAD)
+DATETIME=$(date '+%Y-%m-%dT%H:%M:%S')
+VERSION=$(cat selfdrive/common/version.h | awk -F\" '{print $2}')
+echo "#define COMMA_VERSION \"$VERSION-$GIT_HASH-$DATETIME\"" > selfdrive/common/version.h
+
+# in the directory
+cd $TARGET_DIR
+rm -f panda/board/obj/panda.bin.signed
+
+echo "[-] committing version $VERSION T=$SECONDS"
+git add -f .
+git status
+git commit -a -m "openpilot v$VERSION release"
+
+if [ ! -z "$PUSH" ]; then
+ echo "[-] Pushing to $PUSH T=$SECONDS"
+ git remote set-url origin git@github.com:commaai/openpilot.git
+ git push -f origin master-ci:$PUSH
+fi
+
+echo "[-] done T=$SECONDS"
diff --git a/release/build_release2.sh b/release/build_release2.sh
index ee3c3f465..c607aa820 100755
--- a/release/build_release2.sh
+++ b/release/build_release2.sh
@@ -55,6 +55,14 @@ scons -j3
python selfdrive/manager/test/test_manager.py
selfdrive/car/tests/test_car_interfaces.py
+# Ensure no submodules in release
+if test "$(git submodule--helper list | wc -l)" -gt "0"; then
+ echo "submodules found:"
+ git submodule--helper list
+ exit 1
+fi
+git submodule status
+
# Cleanup
find . -name '*.a' -delete
find . -name '*.o' -delete
diff --git a/release/build_release3.sh b/release/build_release3.sh
new file mode 100755
index 000000000..8c5b8b63b
--- /dev/null
+++ b/release/build_release3.sh
@@ -0,0 +1,91 @@
+#!/usr/bin/bash -e
+
+# git diff --name-status origin/release3-staging | grep "^A" | less
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+
+cd $DIR
+
+BUILD_DIR=/data/openpilot
+SOURCE_DIR="$(git rev-parse --show-toplevel)"
+
+BRANCH=release3-staging
+
+# set git identity
+source $DIR/identity.sh
+
+echo "[-] Setting up repo T=$SECONDS"
+rm -rf $BUILD_DIR
+mkdir -p $BUILD_DIR
+cd $BUILD_DIR
+git init
+git remote add origin git@github.com:commaai/openpilot.git
+git checkout -f -B $BRANCH
+
+# do the files copy
+echo "[-] copying files T=$SECONDS"
+cd $SOURCE_DIR
+cp -pR --parents $(cat release/files_common) $BUILD_DIR/
+cp -pR --parents $(cat release/files_tici) $BUILD_DIR/
+
+# in the directory
+cd $BUILD_DIR
+
+rm -f panda/board/obj/panda.bin.signed
+
+VERSION=$(cat selfdrive/common/version.h | awk -F[\"-] '{print $2}')
+echo "#define COMMA_VERSION \"$VERSION-release\"" > selfdrive/common/version.h
+
+echo "[-] committing version $VERSION T=$SECONDS"
+git add -f .
+git commit -a -m "openpilot v$VERSION release"
+
+# Build panda firmware
+pushd panda/
+CERT=/data/pandaextra/certs/release RELEASE=1 scons -u .
+mv board/obj/panda.bin.signed /tmp/panda.bin.signed
+popd
+
+# Build
+export PYTHONPATH="$BUILD_DIR"
+scons -j$(nproc)
+
+# Run tests
+#python selfdrive/manager/test/test_manager.py
+selfdrive/car/tests/test_car_interfaces.py
+
+# Cleanup
+find . -name '*.a' -delete
+find . -name '*.o' -delete
+find . -name '*.os' -delete
+find . -name '*.pyc' -delete
+find . -name '__pycache__' -delete
+rm -rf panda/board panda/certs panda/crypto
+rm -rf .sconsign.dblite Jenkinsfile release/
+
+# Move back signed panda fw
+mkdir -p panda/board/obj
+mv /tmp/panda.bin.signed panda/board/obj/panda.bin.signed
+
+# Restore phonelibs
+git checkout phonelibs/
+
+# Mark as prebuilt release
+touch prebuilt
+
+# Add built files to git
+git add -f .
+git commit --amend -m "openpilot v$VERSION"
+
+if [ ! -z "$PUSH" ]; then
+ echo "[-] pushing T=$SECONDS"
+ git remote set-url origin git@github.com:commaai/openpilot.git
+ git push -f origin $BRANCH
+
+ # Create dashcam
+ git rm selfdrive/car/*/carcontroller.py
+ git commit -m "create dashcam release from release"
+ git push -f origin $BRANCH:dashcam3-staging
+fi
+
+echo "[-] done T=$SECONDS"
diff --git a/release/check-submodules.sh b/release/check-submodules.sh
new file mode 100755
index 000000000..182042e6b
--- /dev/null
+++ b/release/check-submodules.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+while read hash submodule ref; do
+ git -C $submodule fetch --depth 100 origin master
+ git -C $submodule branch -r --contains $hash | grep "origin/master"
+ if [ "$?" -eq 0 ]; then
+ echo "$submodule ok"
+ else
+ echo "$submodule: $hash is not on master"
+ exit 1
+ fi
+done <<< $(git submodule status --recursive)
diff --git a/release/files_common b/release/files_common
new file mode 100644
index 000000000..c227e5a64
--- /dev/null
+++ b/release/files_common
@@ -0,0 +1,622 @@
+.gitignore
+LICENSE
+launch_env.sh
+launch_chffrplus.sh
+launch_openpilot.sh
+
+Jenkinsfile
+SConstruct
+
+CONTRIBUTING.md
+README.md
+RELEASES.md
+SAFETY.md
+site_scons/site_tools/cython.py
+
+common/.gitignore
+common/__init__.py
+common/gpio.py
+common/realtime.py
+common/clock.pyx
+common/timeout.py
+common/ffi_wrapper.py
+common/file_helpers.py
+common/logging_extra.py
+common/numpy_fast.py
+common/params.py
+common/params_pxd.pxd
+common/params_pyx.pyx
+common/xattr.py
+common/profiler.py
+common/basedir.py
+common/dict_helpers.py
+common/filter_simple.py
+common/stat_live.py
+common/spinner.py
+common/text_window.py
+common/cython_hacks.py
+common/SConscript
+
+common/kalman/.gitignore
+common/kalman/*
+
+common/transformations/__init__.py
+common/transformations/camera.py
+common/transformations/model.py
+
+common/transformations/SConscript
+common/transformations/coordinates.py
+common/transformations/coordinates.cc
+common/transformations/coordinates.hpp
+common/transformations/orientation.py
+common/transformations/orientation.cc
+common/transformations/orientation.hpp
+common/transformations/transformations.pxd
+common/transformations/transformations.pyx
+
+common/api/__init__.py
+
+models/supercombo.dlc
+models/dmonitoring_model_q.dlc
+
+release/*
+
+selfdrive/version.py
+
+selfdrive/__init__.py
+selfdrive/config.py
+selfdrive/crash.py
+selfdrive/swaglog.py
+selfdrive/logmessaged.py
+selfdrive/tombstoned.py
+selfdrive/pandad.py
+selfdrive/updated.py
+selfdrive/rtshield.py
+
+selfdrive/athena/__init__.py
+selfdrive/athena/athenad.py
+selfdrive/athena/manage_athenad.py
+selfdrive/athena/registration.py
+
+selfdrive/boardd/.gitignore
+selfdrive/boardd/SConscript
+selfdrive/boardd/__init__.py
+selfdrive/boardd/boardd.cc
+selfdrive/boardd/boardd.py
+selfdrive/boardd/boardd_api_impl.pyx
+selfdrive/boardd/can_list_to_can_capnp.cc
+selfdrive/boardd/panda.cc
+selfdrive/boardd/panda.h
+selfdrive/boardd/pigeon.cc
+selfdrive/boardd/pigeon.h
+selfdrive/boardd/set_time.py
+
+selfdrive/car/__init__.py
+selfdrive/car/car_helpers.py
+selfdrive/car/fingerprints.py
+selfdrive/car/interfaces.py
+selfdrive/car/vin.py
+selfdrive/car/fw_versions.py
+selfdrive/car/isotp_parallel_query.py
+selfdrive/car/tests/__init__.py
+selfdrive/car/tests/test_car_interfaces.py
+selfdrive/car/chrysler/__init__.py
+selfdrive/car/chrysler/carstate.py
+selfdrive/car/chrysler/interface.py
+selfdrive/car/chrysler/radar_interface.py
+selfdrive/car/chrysler/values.py
+selfdrive/car/chrysler/carcontroller.py
+selfdrive/car/chrysler/chryslercan.py
+selfdrive/car/honda/__init__.py
+selfdrive/car/honda/carstate.py
+selfdrive/car/honda/interface.py
+selfdrive/car/honda/radar_interface.py
+selfdrive/car/honda/values.py
+selfdrive/car/honda/carcontroller.py
+selfdrive/car/honda/hondacan.py
+selfdrive/car/hyundai/__init__.py
+selfdrive/car/hyundai/carstate.py
+selfdrive/car/hyundai/interface.py
+selfdrive/car/hyundai/radar_interface.py
+selfdrive/car/hyundai/values.py
+selfdrive/car/hyundai/carcontroller.py
+selfdrive/car/hyundai/hyundaican.py
+selfdrive/car/toyota/__init__.py
+selfdrive/car/toyota/carstate.py
+selfdrive/car/toyota/interface.py
+selfdrive/car/toyota/radar_interface.py
+selfdrive/car/toyota/values.py
+selfdrive/car/toyota/carcontroller.py
+selfdrive/car/toyota/toyotacan.py
+selfdrive/car/nissan/__init__.py
+selfdrive/car/nissan/carcontroller.py
+selfdrive/car/nissan/carstate.py
+selfdrive/car/nissan/interface.py
+selfdrive/car/nissan/nissancan.py
+selfdrive/car/nissan/radar_interface.py
+selfdrive/car/nissan/values.py
+selfdrive/car/volkswagen/__init__.py
+selfdrive/car/volkswagen/carstate.py
+selfdrive/car/volkswagen/interface.py
+selfdrive/car/volkswagen/radar_interface.py
+selfdrive/car/volkswagen/values.py
+selfdrive/car/volkswagen/carcontroller.py
+selfdrive/car/volkswagen/volkswagencan.py
+selfdrive/car/gm/__init__.py
+selfdrive/car/gm/carstate.py
+selfdrive/car/gm/interface.py
+selfdrive/car/gm/radar_interface.py
+selfdrive/car/gm/values.py
+selfdrive/car/gm/carcontroller.py
+selfdrive/car/gm/gmcan.py
+selfdrive/car/ford/__init__.py
+selfdrive/car/ford/carstate.py
+selfdrive/car/ford/interface.py
+selfdrive/car/ford/radar_interface.py
+selfdrive/car/ford/values.py
+selfdrive/car/ford/carcontroller.py
+selfdrive/car/ford/fordcan.py
+selfdrive/car/subaru/__init__.py
+selfdrive/car/subaru/carstate.py
+selfdrive/car/subaru/interface.py
+selfdrive/car/subaru/radar_interface.py
+selfdrive/car/subaru/values.py
+selfdrive/car/subaru/carcontroller.py
+selfdrive/car/subaru/subarucan.py
+selfdrive/car/mazda/__init__.py
+selfdrive/car/mazda/carstate.py
+selfdrive/car/mazda/interface.py
+selfdrive/car/mazda/radar_interface.py
+selfdrive/car/mazda/values.py
+selfdrive/car/mazda/carcontroller.py
+selfdrive/car/mazda/mazdacan.py
+selfdrive/car/tesla/__init__.py
+selfdrive/car/tesla/teslacan.py
+selfdrive/car/tesla/carcontroller.py
+selfdrive/car/tesla/radar_interface.py
+selfdrive/car/tesla/values.py
+selfdrive/car/tesla/carstate.py
+selfdrive/car/tesla/interface.py
+selfdrive/car/mock/*.py
+
+selfdrive/clocksd/.gitignore
+selfdrive/clocksd/SConscript
+selfdrive/clocksd/clocksd.cc
+
+selfdrive/debug/*.py
+
+selfdrive/common/SConscript
+selfdrive/common/version.h
+
+selfdrive/common/framebuffer.h
+selfdrive/common/framebuffer.cc
+selfdrive/common/glutil.cc
+selfdrive/common/glutil.h
+selfdrive/common/touch.[c,h]
+selfdrive/common/swaglog.h
+selfdrive/common/swaglog.cc
+selfdrive/common/util.cc
+selfdrive/common/util.h
+selfdrive/common/queue.h
+selfdrive/common/clutil.cc
+selfdrive/common/clutil.h
+selfdrive/common/params.h
+selfdrive/common/params.cc
+selfdrive/common/watchdog.cc
+selfdrive/common/watchdog.h
+
+selfdrive/common/modeldata.h
+selfdrive/common/mat.h
+selfdrive/common/timing.h
+
+selfdrive/common/visionimg.cc
+selfdrive/common/visionimg.h
+
+selfdrive/common/gpio.cc
+selfdrive/common/gpio.h
+selfdrive/common/i2c.cc
+selfdrive/common/i2c.h
+
+
+selfdrive/controls/__init__.py
+selfdrive/controls/controlsd.py
+selfdrive/controls/plannerd.py
+selfdrive/controls/radard.py
+selfdrive/controls/lib/__init__.py
+selfdrive/controls/lib/alertmanager.py
+selfdrive/controls/lib/alerts_offroad.json
+selfdrive/controls/lib/events.py
+selfdrive/controls/lib/drive_helpers.py
+selfdrive/controls/lib/latcontrol_pid.py
+selfdrive/controls/lib/latcontrol_indi.py
+selfdrive/controls/lib/latcontrol_lqr.py
+selfdrive/controls/lib/latcontrol_angle.py
+selfdrive/controls/lib/longcontrol.py
+selfdrive/controls/lib/lateral_planner.py
+selfdrive/controls/lib/lane_planner.py
+selfdrive/controls/lib/pid.py
+selfdrive/controls/lib/longitudinal_planner.py
+selfdrive/controls/lib/radar_helpers.py
+selfdrive/controls/lib/vehicle_model.py
+selfdrive/controls/lib/fcw.py
+selfdrive/controls/lib/long_mpc.py
+selfdrive/controls/lib/lead_mpc.py
+
+selfdrive/controls/lib/cluster/*
+
+selfdrive/controls/lib/lateral_mpc/lib_mpc_export/*
+selfdrive/controls/lib/lateral_mpc/.gitignore
+selfdrive/controls/lib/lateral_mpc/SConscript
+selfdrive/controls/lib/lateral_mpc/__init__.py
+selfdrive/controls/lib/lateral_mpc/generator.cpp
+selfdrive/controls/lib/lateral_mpc/libmpc_py.py
+selfdrive/controls/lib/lateral_mpc/lateral_mpc.c
+
+selfdrive/controls/lib/lead_mpc_lib/lib_mpc_export/*
+selfdrive/controls/lib/lead_mpc_lib/.gitignore
+selfdrive/controls/lib/lead_mpc_lib/SConscript
+selfdrive/controls/lib/lead_mpc_lib/__init__.py
+selfdrive/controls/lib/lead_mpc_lib/generator.cpp
+selfdrive/controls/lib/lead_mpc_lib/libmpc_py.py
+selfdrive/controls/lib/lead_mpc_lib/longitudinal_mpc.c
+
+selfdrive/controls/lib/longitudinal_mpc_lib/lib_mpc_export/*
+selfdrive/controls/lib/longitudinal_mpc_lib/.gitignore
+selfdrive/controls/lib/longitudinal_mpc_lib/SConscript
+selfdrive/controls/lib/longitudinal_mpc_lib/__init__.py
+selfdrive/controls/lib/longitudinal_mpc_lib/generator.cpp
+selfdrive/controls/lib/longitudinal_mpc_lib/libmpc_py.py
+selfdrive/controls/lib/longitudinal_mpc_lib/longitudinal_mpc.c
+
+selfdrive/hardware/__init__.py
+selfdrive/hardware/base.h
+selfdrive/hardware/base.py
+selfdrive/hardware/hw.h
+selfdrive/hardware/eon/__init__.py
+selfdrive/hardware/eon/hardware.h
+selfdrive/hardware/eon/hardware.py
+selfdrive/hardware/tici/__init__.py
+selfdrive/hardware/tici/hardware.py
+selfdrive/hardware/tici/amplifier.py
+selfdrive/hardware/tici/iwlist.py
+selfdrive/hardware/pc/__init__.py
+selfdrive/hardware/pc/hardware.py
+
+selfdrive/locationd/__init__.py
+selfdrive/locationd/.gitignore
+selfdrive/locationd/SConscript
+selfdrive/locationd/ubloxd.cc
+selfdrive/locationd/ublox_msg.cc
+selfdrive/locationd/ublox_msg.h
+selfdrive/locationd/generated/ubx.cpp
+selfdrive/locationd/generated/ubx.h
+selfdrive/locationd/generated/gps.cpp
+selfdrive/locationd/generated/gps.h
+
+selfdrive/locationd/locationd.h
+selfdrive/locationd/locationd.cc
+selfdrive/locationd/paramsd.py
+selfdrive/locationd/models/.gitignore
+selfdrive/locationd/models/live_kf.py
+selfdrive/locationd/models/car_kf.py
+selfdrive/locationd/models/constants.py
+selfdrive/locationd/models/live_kf.h
+selfdrive/locationd/models/live_kf.cc
+
+selfdrive/locationd/calibrationd.py
+
+selfdrive/logcatd/SConscript
+selfdrive/logcatd/logcatd_android.cc
+selfdrive/logcatd/logcatd_systemd.cc
+
+selfdrive/proclogd/SConscript
+selfdrive/proclogd/proclogd.cc
+
+selfdrive/loggerd/SConscript
+selfdrive/loggerd/encoder.h
+selfdrive/loggerd/omx_encoder.cc
+selfdrive/loggerd/omx_encoder.h
+selfdrive/loggerd/logger.cc
+selfdrive/loggerd/logger.h
+selfdrive/loggerd/loggerd.cc
+selfdrive/loggerd/bootlog.cc
+selfdrive/loggerd/raw_logger.cc
+selfdrive/loggerd/raw_logger.h
+selfdrive/loggerd/include/msm_media_info.h
+
+selfdrive/loggerd/__init__.py
+selfdrive/loggerd/config.py
+selfdrive/loggerd/uploader.py
+selfdrive/loggerd/deleter.py
+selfdrive/loggerd/xattr_cache.py
+
+selfdrive/sensord/SConscript
+selfdrive/sensord/libdiag.h
+selfdrive/sensord/sensors_qcom.cc
+selfdrive/sensord/sensors_qcom2.cc
+selfdrive/sensord/sensors/*.cc
+selfdrive/sensord/sensors/*.h
+selfdrive/sensord/sensord
+
+selfdrive/thermald/thermald.py
+selfdrive/thermald/power_monitoring.py
+
+selfdrive/test/__init__.py
+selfdrive/test/helpers.py
+selfdrive/test/setup_device_ci.sh
+selfdrive/test/test_fingerprints.py
+selfdrive/test/test_onroad.py
+
+selfdrive/ui/.gitignore
+selfdrive/ui/SConscript
+selfdrive/ui/*.cc
+selfdrive/ui/*.h
+selfdrive/ui/ui
+selfdrive/ui/text
+selfdrive/ui/spinner
+selfdrive/ui/soundd
+
+selfdrive/ui/qt/*.cc
+selfdrive/ui/qt/*.h
+selfdrive/ui/qt/offroad/*.cc
+selfdrive/ui/qt/offroad/*.h
+selfdrive/ui/qt/offroad/*.qml
+selfdrive/ui/qt/widgets/*.cc
+selfdrive/ui/qt/widgets/*.h
+selfdrive/ui/qt/spinner_aarch64
+selfdrive/ui/qt/text_aarch64
+
+selfdrive/camerad/SConscript
+selfdrive/camerad/main.cc
+
+selfdrive/camerad/snapshot/*
+selfdrive/camerad/include/*
+selfdrive/camerad/cameras/camera_common.h
+selfdrive/camerad/cameras/camera_common.cc
+selfdrive/camerad/cameras/camera_frame_stream.cc
+selfdrive/camerad/cameras/camera_frame_stream.h
+selfdrive/camerad/cameras/camera_qcom.cc
+selfdrive/camerad/cameras/camera_qcom.h
+selfdrive/camerad/cameras/debayer.cl
+selfdrive/camerad/cameras/sensor_i2c.h
+selfdrive/camerad/cameras/sensor2_i2c.h
+
+selfdrive/camerad/transforms/rgb_to_yuv.cc
+selfdrive/camerad/transforms/rgb_to_yuv.h
+selfdrive/camerad/transforms/rgb_to_yuv.cl
+selfdrive/camerad/transforms/rgb_to_yuv_test.cc
+
+selfdrive/camerad/imgproc/conv.cl
+selfdrive/camerad/imgproc/pool.cl
+selfdrive/camerad/imgproc/utils.cc
+selfdrive/camerad/imgproc/utils.h
+
+selfdrive/manager/__init__.py
+selfdrive/manager/build.py
+selfdrive/manager/helpers.py
+selfdrive/manager/manager.py
+selfdrive/manager/process_config.py
+selfdrive/manager/process.py
+selfdrive/manager/test/__init__.py
+selfdrive/manager/test/test_manager.py
+
+selfdrive/modeld/SConscript
+selfdrive/modeld/modeld.cc
+selfdrive/modeld/dmonitoringmodeld.cc
+selfdrive/modeld/constants.py
+selfdrive/modeld/modeld
+selfdrive/modeld/dmonitoringmodeld
+
+selfdrive/modeld/models/commonmodel.cc
+selfdrive/modeld/models/commonmodel.h
+selfdrive/modeld/models/driving.cc
+selfdrive/modeld/models/driving.h
+selfdrive/modeld/models/dmonitoring.cc
+selfdrive/modeld/models/dmonitoring.h
+
+selfdrive/modeld/transforms/loadyuv.cc
+selfdrive/modeld/transforms/loadyuv.h
+selfdrive/modeld/transforms/loadyuv.cl
+selfdrive/modeld/transforms/transform.cc
+selfdrive/modeld/transforms/transform.h
+selfdrive/modeld/transforms/transform.cl
+
+selfdrive/modeld/thneed/thneed.*
+selfdrive/modeld/thneed/serialize.cc
+selfdrive/modeld/thneed/compile.cc
+selfdrive/modeld/thneed/include/*
+
+selfdrive/modeld/runners/snpemodel.cc
+selfdrive/modeld/runners/snpemodel.h
+selfdrive/modeld/runners/thneedmodel.cc
+selfdrive/modeld/runners/thneedmodel.h
+selfdrive/modeld/runners/runmodel.h
+selfdrive/modeld/runners/run.h
+
+selfdrive/monitoring/dmonitoringd.py
+selfdrive/monitoring/driver_monitor.py
+
+selfdrive/assets/.gitignore
+selfdrive/assets/assets.qrc
+selfdrive/assets/*.png
+selfdrive/assets/*.svg
+selfdrive/assets/fonts/*.ttf
+selfdrive/assets/images/*
+selfdrive/assets/offroad/*
+selfdrive/assets/sounds/*
+selfdrive/assets/training/*
+
+phonelibs/SConscript
+
+phonelibs/nanovg/*.c
+phonelibs/nanovg/*.h
+
+phonelibs/libgralloc/**
+phonelibs/linux/**
+phonelibs/opencl/**
+phonelibs/zlib/*
+phonelibs/bzip2/*
+phonelibs/openmax/**
+
+phonelibs/json11/json11.cpp
+phonelibs/json11/json11.hpp
+
+phonelibs/qpoases/**
+
+phonelibs/qrcode/*.cc
+phonelibs/qrcode/*.hpp
+
+phonelibs/kaitai/*.h
+phonelibs/kaitai/*.cpp
+
+phonelibs/libyuv/include/**
+phonelibs/libyuv/lib/**
+phonelibs/libyuv/larch64/**
+
+phonelibs/snpe/include/**
+phonelibs/snpe/aarch64**
+phonelibs/snpe/larch64**
+phonelibs/snpe/dsp**
+
+phonelibs/android_frameworks_native/**
+phonelibs/android_hardware_libhardware/**
+phonelibs/android_system_core/**
+
+installer/updater/updater
+installer/updater/updater.cc
+installer/updater/update.json
+installer/updater/Makefile
+
+scripts/update_now.sh
+scripts/stop_updater.sh
+
+pyextra/.gitignore
+
+rednose/**
+
+cereal/.gitignore
+cereal/__init__.py
+cereal/car.capnp
+cereal/legacy.capnp
+cereal/log.capnp
+cereal/services.py
+cereal/SConscript
+cereal/include/**
+cereal/messaging/.gitignore
+cereal/messaging/__init__.py
+cereal/messaging/bridge.cc
+cereal/messaging/impl_msgq.cc
+cereal/messaging/impl_msgq.h
+cereal/messaging/impl_zmq.cc
+cereal/messaging/impl_zmq.h
+cereal/messaging/messaging.cc
+cereal/messaging/messaging.h
+cereal/messaging/messaging.pxd
+cereal/messaging/messaging_pyx.pyx
+cereal/messaging/msgq.cc
+cereal/messaging/msgq.h
+cereal/messaging/socketmaster.cc
+cereal/visionipc/.gitignore
+cereal/visionipc/__init__.py
+cereal/visionipc/*.cc
+cereal/visionipc/*.h
+cereal/visionipc/*.pyx
+cereal/visionipc/*.pxd
+
+panda/.gitignore
+panda/__init__.py
+panda/VERSION
+panda/board/**
+panda/certs/**
+panda/crypto/**
+panda/examples/query_fw_versions.py
+panda/python/**
+
+opendbc/.gitignore
+opendbc/__init__.py
+opendbc/can/__init__.py
+opendbc/can/SConscript
+opendbc/can/can_define.py
+opendbc/can/common.cc
+opendbc/can/common.h
+opendbc/can/common.pxd
+opendbc/can/common_dbc.h
+opendbc/can/dbc.cc
+opendbc/can/dbc.py
+opendbc/can/dbc_template.cc
+opendbc/can/packer.cc
+opendbc/can/packer.py
+opendbc/can/packer_pyx.pyx
+opendbc/can/parser.cc
+opendbc/can/parser.py
+opendbc/can/parser_pyx.pyx
+opendbc/can/process_dbc.py
+opendbc/can/dbc_out/.gitkeep
+opendbc/can/dbc_out/.gitignore
+
+opendbc/chrysler_pacifica_2017_hybrid.dbc
+opendbc/chrysler_pacifica_2017_hybrid_private_fusion.dbc
+
+opendbc/gm_global_a_powertrain.dbc
+opendbc/gm_global_a_object.dbc
+opendbc/gm_global_a_chassis.dbc
+
+opendbc/ford_fusion_2018_pt.dbc
+opendbc/ford_fusion_2018_adas.dbc
+
+opendbc/honda_accord_2018_can_generated.dbc
+opendbc/acura_ilx_2016_can_generated.dbc
+opendbc/acura_rdx_2018_can_generated.dbc
+opendbc/acura_rdx_2020_can_generated.dbc
+opendbc/honda_civic_touring_2016_can_generated.dbc
+opendbc/honda_civic_hatchback_ex_2017_can_generated.dbc
+opendbc/honda_civic_sedan_16_diesel_2019_can_generated.dbc
+opendbc/honda_crv_touring_2016_can_generated.dbc
+opendbc/honda_crv_ex_2017_can_generated.dbc
+opendbc/honda_crv_ex_2017_body_generated.dbc
+opendbc/honda_crv_executive_2016_can_generated.dbc
+opendbc/honda_crv_hybrid_2019_can_generated.dbc
+opendbc/honda_fit_ex_2018_can_generated.dbc
+opendbc/honda_hrv_touring_2019_can_generated.dbc
+opendbc/honda_odyssey_exl_2018_generated.dbc
+opendbc/honda_odyssey_extreme_edition_2018_china_can_generated.dbc
+opendbc/honda_pilot_touring_2017_can_generated.dbc
+opendbc/honda_ridgeline_black_edition_2017_can_generated.dbc
+opendbc/honda_insight_ex_2019_can_generated.dbc
+opendbc/acura_ilx_2016_nidec.dbc
+
+opendbc/hyundai_kia_generic.dbc
+
+opendbc/mazda_2017.dbc
+
+opendbc/nissan_x_trail_2017.dbc
+opendbc/nissan_leaf_2018.dbc
+
+opendbc/subaru_global_2017_generated.dbc
+opendbc/subaru_outback_2015_generated.dbc
+opendbc/subaru_outback_2019_generated.dbc
+opendbc/subaru_forester_2017_generated.dbc
+
+opendbc/toyota_rav4_hybrid_2017_pt_generated.dbc
+opendbc/toyota_rav4_2017_pt_generated.dbc
+opendbc/toyota_prius_2017_pt_generated.dbc
+opendbc/toyota_corolla_2017_pt_generated.dbc
+opendbc/lexus_rx_350_2016_pt_generated.dbc
+opendbc/lexus_rx_hybrid_2017_pt_generated.dbc
+opendbc/toyota_nodsu_pt_generated.dbc
+opendbc/toyota_nodsu_hybrid_pt_generated.dbc
+opendbc/toyota_camry_hybrid_2018_pt_generated.dbc
+opendbc/toyota_highlander_2017_pt_generated.dbc
+opendbc/toyota_highlander_hybrid_2018_pt_generated.dbc
+opendbc/toyota_avalon_2017_pt_generated.dbc
+opendbc/toyota_sienna_xle_2018_pt_generated.dbc
+opendbc/lexus_is_2018_pt_generated.dbc
+opendbc/lexus_ct200h_2018_pt_generated.dbc
+opendbc/lexus_nx300h_2018_pt_generated.dbc
+opendbc/lexus_nx300_2018_pt_generated.dbc
+opendbc/toyota_adas.dbc
+opendbc/toyota_tss2_adas.dbc
+
+opendbc/vw_mqb_2010.dbc
+
+opendbc/tesla_can.dbc
diff --git a/release/files_pc b/release/files_pc
new file mode 100644
index 000000000..1b57f97a7
--- /dev/null
+++ b/release/files_pc
@@ -0,0 +1,3 @@
+phonelibs/mapbox-gl-native-qt/x86_64/**
+
+phonelibs/qt-plugins/x86_64/**
diff --git a/release/files_tici b/release/files_tici
new file mode 100644
index 000000000..f3037a1d4
--- /dev/null
+++ b/release/files_tici
@@ -0,0 +1,27 @@
+installer/continue_openpilot.sh
+
+phonelibs/mapbox-gl-native-qt/include/*
+
+selfdrive/timezoned.py
+
+selfdrive/assets/navigation/*
+selfdrive/assets/training_wide/*
+selfdrive/assets/sounds_tici/*
+
+selfdrive/camerad/cameras/camera_qcom2.cc
+selfdrive/camerad/cameras/camera_qcom2.h
+selfdrive/camerad/cameras/real_debayer.cl
+
+selfdrive/hardware/tici/__init__.py
+selfdrive/hardware/tici/hardware.h
+selfdrive/hardware/tici/hardware.py
+selfdrive/hardware/tici/pins.py
+selfdrive/hardware/tici/agnos.py
+selfdrive/hardware/tici/agnos.json
+selfdrive/hardware/tici/amplifier.py
+selfdrive/hardware/tici/updater
+
+selfdrive/ui/qt/spinner_larch64
+selfdrive/ui/qt/text_larch64
+selfdrive/ui/qt/maps/*.cc
+selfdrive/ui/qt/maps/*.h
diff --git a/release/identity.sh b/release/identity.sh
new file mode 100644
index 000000000..b90372d82
--- /dev/null
+++ b/release/identity.sh
@@ -0,0 +1,5 @@
+export GIT_COMMITTER_NAME="Vehicle Researcher"
+export GIT_COMMITTER_EMAIL="user@comma.ai"
+export GIT_AUTHOR_NAME="Vehicle Researcher"
+export GIT_AUTHOR_EMAIL="user@comma.ai"
+export GIT_SSH_COMMAND="ssh -i /data/gitkey"
diff --git a/selfdrive/assets/.gitignore b/selfdrive/assets/.gitignore
new file mode 100644
index 000000000..283034ca8
--- /dev/null
+++ b/selfdrive/assets/.gitignore
@@ -0,0 +1 @@
+*.cc
diff --git a/selfdrive/assets/assets.qrc b/selfdrive/assets/assets.qrc
new file mode 100644
index 000000000..1fc6d3591
--- /dev/null
+++ b/selfdrive/assets/assets.qrc
@@ -0,0 +1,15 @@
+
+
+ img_continue_triangle.svg
+ img_circled_check.svg
+ img_circled_slash.svg
+ img_eye_open.svg
+ img_eye_closed.svg
+ offroad/icon_lock_closed.svg
+ offroad/icon_checkmark.svg
+ offroad/icon_wifi_strength_low.svg
+ offroad/icon_wifi_strength_medium.svg
+ offroad/icon_wifi_strength_high.svg
+ offroad/icon_wifi_strength_full.svg
+
+
diff --git a/selfdrive/assets/img_circled_check.svg b/selfdrive/assets/img_circled_check.svg
new file mode 100644
index 000000000..27c37395b
--- /dev/null
+++ b/selfdrive/assets/img_circled_check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/img_circled_slash.svg b/selfdrive/assets/img_circled_slash.svg
new file mode 100644
index 000000000..b10a3938d
--- /dev/null
+++ b/selfdrive/assets/img_circled_slash.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/img_continue_triangle.svg b/selfdrive/assets/img_continue_triangle.svg
new file mode 100644
index 000000000..20f9e45dc
--- /dev/null
+++ b/selfdrive/assets/img_continue_triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/selfdrive/assets/img_eye_closed.svg b/selfdrive/assets/img_eye_closed.svg
new file mode 100644
index 000000000..91b229e91
--- /dev/null
+++ b/selfdrive/assets/img_eye_closed.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/selfdrive/assets/img_eye_open.svg b/selfdrive/assets/img_eye_open.svg
new file mode 100644
index 000000000..ea6e41ac5
--- /dev/null
+++ b/selfdrive/assets/img_eye_open.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/selfdrive/assets/navigation/direction_arrive.png b/selfdrive/assets/navigation/direction_arrive.png
new file mode 100644
index 000000000..733c12909
Binary files /dev/null and b/selfdrive/assets/navigation/direction_arrive.png differ
diff --git a/selfdrive/assets/navigation/direction_arrive_left.png b/selfdrive/assets/navigation/direction_arrive_left.png
new file mode 100644
index 000000000..92ff8e034
Binary files /dev/null and b/selfdrive/assets/navigation/direction_arrive_left.png differ
diff --git a/selfdrive/assets/navigation/direction_arrive_right.png b/selfdrive/assets/navigation/direction_arrive_right.png
new file mode 100644
index 000000000..f5983bfe6
Binary files /dev/null and b/selfdrive/assets/navigation/direction_arrive_right.png differ
diff --git a/selfdrive/assets/navigation/direction_arrive_straight.png b/selfdrive/assets/navigation/direction_arrive_straight.png
new file mode 100644
index 000000000..733c12909
Binary files /dev/null and b/selfdrive/assets/navigation/direction_arrive_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_close.png b/selfdrive/assets/navigation/direction_close.png
new file mode 100644
index 000000000..4fdb5d195
Binary files /dev/null and b/selfdrive/assets/navigation/direction_close.png differ
diff --git a/selfdrive/assets/navigation/direction_continue.png b/selfdrive/assets/navigation/direction_continue.png
new file mode 100644
index 000000000..a01045ae6
Binary files /dev/null and b/selfdrive/assets/navigation/direction_continue.png differ
diff --git a/selfdrive/assets/navigation/direction_continue_left.png b/selfdrive/assets/navigation/direction_continue_left.png
new file mode 100644
index 000000000..9a618026f
Binary files /dev/null and b/selfdrive/assets/navigation/direction_continue_left.png differ
diff --git a/selfdrive/assets/navigation/direction_continue_right.png b/selfdrive/assets/navigation/direction_continue_right.png
new file mode 100644
index 000000000..0fbaa3f25
Binary files /dev/null and b/selfdrive/assets/navigation/direction_continue_right.png differ
diff --git a/selfdrive/assets/navigation/direction_continue_slight_left.png b/selfdrive/assets/navigation/direction_continue_slight_left.png
new file mode 100644
index 000000000..08e964dbd
Binary files /dev/null and b/selfdrive/assets/navigation/direction_continue_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_continue_slight_right.png b/selfdrive/assets/navigation/direction_continue_slight_right.png
new file mode 100644
index 000000000..3e21cae11
Binary files /dev/null and b/selfdrive/assets/navigation/direction_continue_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_continue_straight.png b/selfdrive/assets/navigation/direction_continue_straight.png
new file mode 100644
index 000000000..a01045ae6
Binary files /dev/null and b/selfdrive/assets/navigation/direction_continue_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_continue_uturn.png b/selfdrive/assets/navigation/direction_continue_uturn.png
new file mode 100644
index 000000000..0bd1b9177
Binary files /dev/null and b/selfdrive/assets/navigation/direction_continue_uturn.png differ
diff --git a/selfdrive/assets/navigation/direction_depart.png b/selfdrive/assets/navigation/direction_depart.png
new file mode 100644
index 000000000..4bf32c870
Binary files /dev/null and b/selfdrive/assets/navigation/direction_depart.png differ
diff --git a/selfdrive/assets/navigation/direction_depart_left.png b/selfdrive/assets/navigation/direction_depart_left.png
new file mode 100644
index 000000000..1f8d72691
Binary files /dev/null and b/selfdrive/assets/navigation/direction_depart_left.png differ
diff --git a/selfdrive/assets/navigation/direction_depart_right.png b/selfdrive/assets/navigation/direction_depart_right.png
new file mode 100644
index 000000000..f359a685f
Binary files /dev/null and b/selfdrive/assets/navigation/direction_depart_right.png differ
diff --git a/selfdrive/assets/navigation/direction_depart_straight.png b/selfdrive/assets/navigation/direction_depart_straight.png
new file mode 100644
index 000000000..4bf32c870
Binary files /dev/null and b/selfdrive/assets/navigation/direction_depart_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_end_of_road_left.png b/selfdrive/assets/navigation/direction_end_of_road_left.png
new file mode 100644
index 000000000..5c0a24e7c
Binary files /dev/null and b/selfdrive/assets/navigation/direction_end_of_road_left.png differ
diff --git a/selfdrive/assets/navigation/direction_end_of_road_right.png b/selfdrive/assets/navigation/direction_end_of_road_right.png
new file mode 100644
index 000000000..8d9b89d36
Binary files /dev/null and b/selfdrive/assets/navigation/direction_end_of_road_right.png differ
diff --git a/selfdrive/assets/navigation/direction_flag.png b/selfdrive/assets/navigation/direction_flag.png
new file mode 100644
index 000000000..bad12ec66
Binary files /dev/null and b/selfdrive/assets/navigation/direction_flag.png differ
diff --git a/selfdrive/assets/navigation/direction_fork.png b/selfdrive/assets/navigation/direction_fork.png
new file mode 100644
index 000000000..3e0c262e2
Binary files /dev/null and b/selfdrive/assets/navigation/direction_fork.png differ
diff --git a/selfdrive/assets/navigation/direction_fork_left.png b/selfdrive/assets/navigation/direction_fork_left.png
new file mode 100644
index 000000000..b244b42b5
Binary files /dev/null and b/selfdrive/assets/navigation/direction_fork_left.png differ
diff --git a/selfdrive/assets/navigation/direction_fork_right.png b/selfdrive/assets/navigation/direction_fork_right.png
new file mode 100644
index 000000000..aa3efaabc
Binary files /dev/null and b/selfdrive/assets/navigation/direction_fork_right.png differ
diff --git a/selfdrive/assets/navigation/direction_fork_slight_left.png b/selfdrive/assets/navigation/direction_fork_slight_left.png
new file mode 100644
index 000000000..82fa59859
Binary files /dev/null and b/selfdrive/assets/navigation/direction_fork_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_fork_slight_right.png b/selfdrive/assets/navigation/direction_fork_slight_right.png
new file mode 100644
index 000000000..3596a2fbf
Binary files /dev/null and b/selfdrive/assets/navigation/direction_fork_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_fork_straight.png b/selfdrive/assets/navigation/direction_fork_straight.png
new file mode 100644
index 000000000..86f30ab9b
Binary files /dev/null and b/selfdrive/assets/navigation/direction_fork_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_invalid.png b/selfdrive/assets/navigation/direction_invalid.png
new file mode 100644
index 000000000..a01045ae6
Binary files /dev/null and b/selfdrive/assets/navigation/direction_invalid.png differ
diff --git a/selfdrive/assets/navigation/direction_invalid_left.png b/selfdrive/assets/navigation/direction_invalid_left.png
new file mode 100644
index 000000000..9a618026f
Binary files /dev/null and b/selfdrive/assets/navigation/direction_invalid_left.png differ
diff --git a/selfdrive/assets/navigation/direction_invalid_right.png b/selfdrive/assets/navigation/direction_invalid_right.png
new file mode 100644
index 000000000..0fbaa3f25
Binary files /dev/null and b/selfdrive/assets/navigation/direction_invalid_right.png differ
diff --git a/selfdrive/assets/navigation/direction_invalid_slight_left.png b/selfdrive/assets/navigation/direction_invalid_slight_left.png
new file mode 100644
index 000000000..08e964dbd
Binary files /dev/null and b/selfdrive/assets/navigation/direction_invalid_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_invalid_slight_right.png b/selfdrive/assets/navigation/direction_invalid_slight_right.png
new file mode 100644
index 000000000..3e21cae11
Binary files /dev/null and b/selfdrive/assets/navigation/direction_invalid_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_invalid_straight.png b/selfdrive/assets/navigation/direction_invalid_straight.png
new file mode 100644
index 000000000..a01045ae6
Binary files /dev/null and b/selfdrive/assets/navigation/direction_invalid_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_invalid_uturn.png b/selfdrive/assets/navigation/direction_invalid_uturn.png
new file mode 100644
index 000000000..0bd1b9177
Binary files /dev/null and b/selfdrive/assets/navigation/direction_invalid_uturn.png differ
diff --git a/selfdrive/assets/navigation/direction_merge_left.png b/selfdrive/assets/navigation/direction_merge_left.png
new file mode 100644
index 000000000..a713f52c5
Binary files /dev/null and b/selfdrive/assets/navigation/direction_merge_left.png differ
diff --git a/selfdrive/assets/navigation/direction_merge_right.png b/selfdrive/assets/navigation/direction_merge_right.png
new file mode 100644
index 000000000..3390b31a0
Binary files /dev/null and b/selfdrive/assets/navigation/direction_merge_right.png differ
diff --git a/selfdrive/assets/navigation/direction_merge_slight_left.png b/selfdrive/assets/navigation/direction_merge_slight_left.png
new file mode 100644
index 000000000..308f97b5a
Binary files /dev/null and b/selfdrive/assets/navigation/direction_merge_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_merge_slight_right.png b/selfdrive/assets/navigation/direction_merge_slight_right.png
new file mode 100644
index 000000000..8f5289011
Binary files /dev/null and b/selfdrive/assets/navigation/direction_merge_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_merge_straight.png b/selfdrive/assets/navigation/direction_merge_straight.png
new file mode 100644
index 000000000..49c464389
Binary files /dev/null and b/selfdrive/assets/navigation/direction_merge_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_new_name_left.png b/selfdrive/assets/navigation/direction_new_name_left.png
new file mode 100644
index 000000000..9a618026f
Binary files /dev/null and b/selfdrive/assets/navigation/direction_new_name_left.png differ
diff --git a/selfdrive/assets/navigation/direction_new_name_right.png b/selfdrive/assets/navigation/direction_new_name_right.png
new file mode 100644
index 000000000..0fbaa3f25
Binary files /dev/null and b/selfdrive/assets/navigation/direction_new_name_right.png differ
diff --git a/selfdrive/assets/navigation/direction_new_name_sharp_left.png b/selfdrive/assets/navigation/direction_new_name_sharp_left.png
new file mode 100644
index 000000000..77106b493
Binary files /dev/null and b/selfdrive/assets/navigation/direction_new_name_sharp_left.png differ
diff --git a/selfdrive/assets/navigation/direction_new_name_sharp_right.png b/selfdrive/assets/navigation/direction_new_name_sharp_right.png
new file mode 100644
index 000000000..eb3a02f8b
Binary files /dev/null and b/selfdrive/assets/navigation/direction_new_name_sharp_right.png differ
diff --git a/selfdrive/assets/navigation/direction_new_name_slight_left.png b/selfdrive/assets/navigation/direction_new_name_slight_left.png
new file mode 100644
index 000000000..08e964dbd
Binary files /dev/null and b/selfdrive/assets/navigation/direction_new_name_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_new_name_slight_right.png b/selfdrive/assets/navigation/direction_new_name_slight_right.png
new file mode 100644
index 000000000..3e21cae11
Binary files /dev/null and b/selfdrive/assets/navigation/direction_new_name_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_new_name_straight.png b/selfdrive/assets/navigation/direction_new_name_straight.png
new file mode 100644
index 000000000..a01045ae6
Binary files /dev/null and b/selfdrive/assets/navigation/direction_new_name_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_notificaiton_right.png b/selfdrive/assets/navigation/direction_notificaiton_right.png
new file mode 100644
index 000000000..0fbaa3f25
Binary files /dev/null and b/selfdrive/assets/navigation/direction_notificaiton_right.png differ
diff --git a/selfdrive/assets/navigation/direction_notificaiton_sharp_right.png b/selfdrive/assets/navigation/direction_notificaiton_sharp_right.png
new file mode 100644
index 000000000..a7e3c4cee
Binary files /dev/null and b/selfdrive/assets/navigation/direction_notificaiton_sharp_right.png differ
diff --git a/selfdrive/assets/navigation/direction_notification_left.png b/selfdrive/assets/navigation/direction_notification_left.png
new file mode 100644
index 000000000..9a618026f
Binary files /dev/null and b/selfdrive/assets/navigation/direction_notification_left.png differ
diff --git a/selfdrive/assets/navigation/direction_notification_sharp_left.png b/selfdrive/assets/navigation/direction_notification_sharp_left.png
new file mode 100644
index 000000000..dd8a4301d
Binary files /dev/null and b/selfdrive/assets/navigation/direction_notification_sharp_left.png differ
diff --git a/selfdrive/assets/navigation/direction_notification_slight_left.png b/selfdrive/assets/navigation/direction_notification_slight_left.png
new file mode 100644
index 000000000..08e964dbd
Binary files /dev/null and b/selfdrive/assets/navigation/direction_notification_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_notification_slight_right.png b/selfdrive/assets/navigation/direction_notification_slight_right.png
new file mode 100644
index 000000000..3e21cae11
Binary files /dev/null and b/selfdrive/assets/navigation/direction_notification_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_notification_straight.png b/selfdrive/assets/navigation/direction_notification_straight.png
new file mode 100644
index 000000000..a01045ae6
Binary files /dev/null and b/selfdrive/assets/navigation/direction_notification_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_off_ramp_left.png b/selfdrive/assets/navigation/direction_off_ramp_left.png
new file mode 100644
index 000000000..d3fd18289
Binary files /dev/null and b/selfdrive/assets/navigation/direction_off_ramp_left.png differ
diff --git a/selfdrive/assets/navigation/direction_off_ramp_right.png b/selfdrive/assets/navigation/direction_off_ramp_right.png
new file mode 100644
index 000000000..722e3f808
Binary files /dev/null and b/selfdrive/assets/navigation/direction_off_ramp_right.png differ
diff --git a/selfdrive/assets/navigation/direction_off_ramp_slight_left.png b/selfdrive/assets/navigation/direction_off_ramp_slight_left.png
new file mode 100644
index 000000000..ddac4aad6
Binary files /dev/null and b/selfdrive/assets/navigation/direction_off_ramp_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_off_ramp_slight_right.png b/selfdrive/assets/navigation/direction_off_ramp_slight_right.png
new file mode 100644
index 000000000..ed5760886
Binary files /dev/null and b/selfdrive/assets/navigation/direction_off_ramp_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_on_ramp_left.png b/selfdrive/assets/navigation/direction_on_ramp_left.png
new file mode 100644
index 000000000..9a618026f
Binary files /dev/null and b/selfdrive/assets/navigation/direction_on_ramp_left.png differ
diff --git a/selfdrive/assets/navigation/direction_on_ramp_right.png b/selfdrive/assets/navigation/direction_on_ramp_right.png
new file mode 100644
index 000000000..0fbaa3f25
Binary files /dev/null and b/selfdrive/assets/navigation/direction_on_ramp_right.png differ
diff --git a/selfdrive/assets/navigation/direction_on_ramp_sharp_left.png b/selfdrive/assets/navigation/direction_on_ramp_sharp_left.png
new file mode 100644
index 000000000..77106b493
Binary files /dev/null and b/selfdrive/assets/navigation/direction_on_ramp_sharp_left.png differ
diff --git a/selfdrive/assets/navigation/direction_on_ramp_sharp_right.png b/selfdrive/assets/navigation/direction_on_ramp_sharp_right.png
new file mode 100644
index 000000000..a7e3c4cee
Binary files /dev/null and b/selfdrive/assets/navigation/direction_on_ramp_sharp_right.png differ
diff --git a/selfdrive/assets/navigation/direction_on_ramp_slight_left.png b/selfdrive/assets/navigation/direction_on_ramp_slight_left.png
new file mode 100644
index 000000000..a5ea8a881
Binary files /dev/null and b/selfdrive/assets/navigation/direction_on_ramp_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_on_ramp_slight_right.png b/selfdrive/assets/navigation/direction_on_ramp_slight_right.png
new file mode 100644
index 000000000..f8ea3800e
Binary files /dev/null and b/selfdrive/assets/navigation/direction_on_ramp_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_on_ramp_straight.png b/selfdrive/assets/navigation/direction_on_ramp_straight.png
new file mode 100644
index 000000000..a01045ae6
Binary files /dev/null and b/selfdrive/assets/navigation/direction_on_ramp_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_rotary.png b/selfdrive/assets/navigation/direction_rotary.png
new file mode 100644
index 000000000..2a5d264bd
Binary files /dev/null and b/selfdrive/assets/navigation/direction_rotary.png differ
diff --git a/selfdrive/assets/navigation/direction_rotary_left.png b/selfdrive/assets/navigation/direction_rotary_left.png
new file mode 100644
index 000000000..0c4e4ab5e
Binary files /dev/null and b/selfdrive/assets/navigation/direction_rotary_left.png differ
diff --git a/selfdrive/assets/navigation/direction_rotary_right.png b/selfdrive/assets/navigation/direction_rotary_right.png
new file mode 100644
index 000000000..32a6b2504
Binary files /dev/null and b/selfdrive/assets/navigation/direction_rotary_right.png differ
diff --git a/selfdrive/assets/navigation/direction_rotary_sharp_left.png b/selfdrive/assets/navigation/direction_rotary_sharp_left.png
new file mode 100644
index 000000000..c84a6d96c
Binary files /dev/null and b/selfdrive/assets/navigation/direction_rotary_sharp_left.png differ
diff --git a/selfdrive/assets/navigation/direction_rotary_sharp_right.png b/selfdrive/assets/navigation/direction_rotary_sharp_right.png
new file mode 100644
index 000000000..d15cbee00
Binary files /dev/null and b/selfdrive/assets/navigation/direction_rotary_sharp_right.png differ
diff --git a/selfdrive/assets/navigation/direction_rotary_slight_left.png b/selfdrive/assets/navigation/direction_rotary_slight_left.png
new file mode 100644
index 000000000..3838e720a
Binary files /dev/null and b/selfdrive/assets/navigation/direction_rotary_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_rotary_slight_right.png b/selfdrive/assets/navigation/direction_rotary_slight_right.png
new file mode 100644
index 000000000..8cd45fe61
Binary files /dev/null and b/selfdrive/assets/navigation/direction_rotary_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_rotary_straight.png b/selfdrive/assets/navigation/direction_rotary_straight.png
new file mode 100644
index 000000000..b6b0a7311
Binary files /dev/null and b/selfdrive/assets/navigation/direction_rotary_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_roundabout.png b/selfdrive/assets/navigation/direction_roundabout.png
new file mode 100644
index 000000000..2a5d264bd
Binary files /dev/null and b/selfdrive/assets/navigation/direction_roundabout.png differ
diff --git a/selfdrive/assets/navigation/direction_roundabout_left.png b/selfdrive/assets/navigation/direction_roundabout_left.png
new file mode 100644
index 000000000..0c4e4ab5e
Binary files /dev/null and b/selfdrive/assets/navigation/direction_roundabout_left.png differ
diff --git a/selfdrive/assets/navigation/direction_roundabout_right.png b/selfdrive/assets/navigation/direction_roundabout_right.png
new file mode 100644
index 000000000..32a6b2504
Binary files /dev/null and b/selfdrive/assets/navigation/direction_roundabout_right.png differ
diff --git a/selfdrive/assets/navigation/direction_roundabout_sharp_left.png b/selfdrive/assets/navigation/direction_roundabout_sharp_left.png
new file mode 100644
index 000000000..1e8cce8c8
Binary files /dev/null and b/selfdrive/assets/navigation/direction_roundabout_sharp_left.png differ
diff --git a/selfdrive/assets/navigation/direction_roundabout_sharp_right.png b/selfdrive/assets/navigation/direction_roundabout_sharp_right.png
new file mode 100644
index 000000000..d15cbee00
Binary files /dev/null and b/selfdrive/assets/navigation/direction_roundabout_sharp_right.png differ
diff --git a/selfdrive/assets/navigation/direction_roundabout_slight_left.png b/selfdrive/assets/navigation/direction_roundabout_slight_left.png
new file mode 100644
index 000000000..da1b11270
Binary files /dev/null and b/selfdrive/assets/navigation/direction_roundabout_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_roundabout_slight_right.png b/selfdrive/assets/navigation/direction_roundabout_slight_right.png
new file mode 100644
index 000000000..8cd45fe61
Binary files /dev/null and b/selfdrive/assets/navigation/direction_roundabout_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_roundabout_straight.png b/selfdrive/assets/navigation/direction_roundabout_straight.png
new file mode 100644
index 000000000..b6b0a7311
Binary files /dev/null and b/selfdrive/assets/navigation/direction_roundabout_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_turn_left.png b/selfdrive/assets/navigation/direction_turn_left.png
new file mode 100644
index 000000000..9a618026f
Binary files /dev/null and b/selfdrive/assets/navigation/direction_turn_left.png differ
diff --git a/selfdrive/assets/navigation/direction_turn_right.png b/selfdrive/assets/navigation/direction_turn_right.png
new file mode 100644
index 000000000..0fbaa3f25
Binary files /dev/null and b/selfdrive/assets/navigation/direction_turn_right.png differ
diff --git a/selfdrive/assets/navigation/direction_turn_sharp_left.png b/selfdrive/assets/navigation/direction_turn_sharp_left.png
new file mode 100644
index 000000000..dd8a4301d
Binary files /dev/null and b/selfdrive/assets/navigation/direction_turn_sharp_left.png differ
diff --git a/selfdrive/assets/navigation/direction_turn_sharp_right.png b/selfdrive/assets/navigation/direction_turn_sharp_right.png
new file mode 100644
index 000000000..a7e3c4cee
Binary files /dev/null and b/selfdrive/assets/navigation/direction_turn_sharp_right.png differ
diff --git a/selfdrive/assets/navigation/direction_turn_slight_left.png b/selfdrive/assets/navigation/direction_turn_slight_left.png
new file mode 100644
index 000000000..08e964dbd
Binary files /dev/null and b/selfdrive/assets/navigation/direction_turn_slight_left.png differ
diff --git a/selfdrive/assets/navigation/direction_turn_slight_right.png b/selfdrive/assets/navigation/direction_turn_slight_right.png
new file mode 100644
index 000000000..3e21cae11
Binary files /dev/null and b/selfdrive/assets/navigation/direction_turn_slight_right.png differ
diff --git a/selfdrive/assets/navigation/direction_turn_straight.png b/selfdrive/assets/navigation/direction_turn_straight.png
new file mode 100644
index 000000000..a01045ae6
Binary files /dev/null and b/selfdrive/assets/navigation/direction_turn_straight.png differ
diff --git a/selfdrive/assets/navigation/direction_turn_uturn.png b/selfdrive/assets/navigation/direction_turn_uturn.png
new file mode 100644
index 000000000..0bd1b9177
Binary files /dev/null and b/selfdrive/assets/navigation/direction_turn_uturn.png differ
diff --git a/selfdrive/assets/navigation/direction_updown.png b/selfdrive/assets/navigation/direction_updown.png
new file mode 100644
index 000000000..16d0979f3
Binary files /dev/null and b/selfdrive/assets/navigation/direction_updown.png differ
diff --git a/selfdrive/assets/navigation/home.png b/selfdrive/assets/navigation/home.png
new file mode 100644
index 000000000..8a4f65c7d
Binary files /dev/null and b/selfdrive/assets/navigation/home.png differ
diff --git a/selfdrive/assets/navigation/home.svg b/selfdrive/assets/navigation/home.svg
new file mode 100644
index 000000000..f5d89514c
--- /dev/null
+++ b/selfdrive/assets/navigation/home.svg
@@ -0,0 +1,65 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
diff --git a/selfdrive/assets/navigation/home_inactive.png b/selfdrive/assets/navigation/home_inactive.png
new file mode 100644
index 000000000..a58fd3864
Binary files /dev/null and b/selfdrive/assets/navigation/home_inactive.png differ
diff --git a/selfdrive/assets/navigation/screenshot.png b/selfdrive/assets/navigation/screenshot.png
new file mode 100644
index 000000000..9360452a8
Binary files /dev/null and b/selfdrive/assets/navigation/screenshot.png differ
diff --git a/selfdrive/assets/navigation/work.png b/selfdrive/assets/navigation/work.png
new file mode 100644
index 000000000..611f9b038
Binary files /dev/null and b/selfdrive/assets/navigation/work.png differ
diff --git a/selfdrive/assets/navigation/work.svg b/selfdrive/assets/navigation/work.svg
new file mode 100644
index 000000000..2da7bb7d3
--- /dev/null
+++ b/selfdrive/assets/navigation/work.svg
@@ -0,0 +1,66 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
diff --git a/selfdrive/assets/navigation/work_inactive.png b/selfdrive/assets/navigation/work_inactive.png
new file mode 100644
index 000000000..679e6a54b
Binary files /dev/null and b/selfdrive/assets/navigation/work_inactive.png differ
diff --git a/selfdrive/assets/offroad/fcc.html b/selfdrive/assets/offroad/fcc.html
new file mode 100644
index 000000000..7f03a7204
--- /dev/null
+++ b/selfdrive/assets/offroad/fcc.html
@@ -0,0 +1,56 @@
+
+
+ Supplier's Declaration of Conformity: 47 CFR § 2.1077 Compliance Information
+
+ Unique Identifier
+ comma three
+
+ Authorized Components
+
+ Thundersoft TurboX D845 SOM
+ FCC ID: 2AOHHTURBOXSOMD845
+
+ Quectel/EG25-G
+ FCC ID: XMR201903EG25GM
+
+ This device complies with Part 15 of the FCC Rules.
+ Operation is subject to the following two conditions:
+
+
(1) this device may not cause harmful interference, and
+
(2) this device must accept any interference received, including interference that may cause undesired operation.
+
+ The following test reports are subject to this declaration:
+ Test report number: HR20191001605
+ Issue date: 2019-2-21
+
+ The following manufacturer/importer/entity (located in the USA) is responsible for this declaration:
+ Company name: Quectel Wireless Solutions Co., Ltd.
+ Name/Title (legal representative): Yin JiXiong
+ Address: 7th Floor, Hongye Building, No.1801 Hongmei Road, Xuhui District, Shanghai 200233, China
+ Phone: +8602150086326 Extension: 800
+ Fax: +862153253668
+ E-mail: johnny.xiang@quectel.com
+
+
+ Responsible Party - U.S. Contact Information
+ comma.ai
+ 501 W Broadway St
+ STE A #403
+ San Diego, California
+ 92101
+ United States
+ support@comma.ai
+
+ FCC Compliance Statement
+ This device complies with part 15 of the FCC Rules. Operation is subject to the following two conditions: (1) This device may not cause harmful interference, and (2) this device must accept any interference received, including interference that may cause undesired operation. Note: This equipment has been tested and found to comply with the limits for a Class B digital device, pursuant to part 15 of the FCC Rules. These limits are designed to provide reasonable protection against harmful interference in a residential installation.
+ This equipment generates, uses, and can radiate radio frequency energy and, if not installed and used in accordance with the instructions, may cause harmful interference to radio communications. However, there is no guarantee that interference will not occur in a particular installation.
+ If this equipment does cause harmful interference to radio or television reception, which can be determined by turning the equipment off and on, the user is encouraged to try to correct the interference by one or more of the following measures:
+ Reorient or relocate the receiving antenna.
+ Increase the separation between the equipment and receiver.
+ Connect the equipment to an outlet on a circuit different from that to which the receiver is connected.
+ Consult the dealer or an experienced radio/TV technician for help.
+ Changes or modifications to this product not expressly approved by the party responsible for compliance could void the electromagnetic compatibility (EMC) and wireless compliance and negate your authority to operate the product.
+ This product has demonstrated EMC compliance under conditions that included the use of compliant peripheral devices and shielded cables between system components. It is important that you use compliant peripheral devices and shielded cables between system components to reduce the possibility of causing interference to radios, televisions, and other electronic devices.
+ The radiated output power of this device meets the limits of FCC/IC radio frequency exposure limits. This device should be operated with a minimum separation distance of 20 cm (8 inches) between the equipment and a person's body.
+
+