From 7cd9568423a2e78187d16018b70a78f56c02027d Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 19 Jan 2024 14:05:03 -0800 Subject: [PATCH] remove dashcam branch (#31081) * remove dashcam branch * fix * more cleanup * remove param * one more --- Jenkinsfile | 4 ++-- common/params.cc | 1 - launch_env.sh | 4 ---- launch_openpilot.sh | 2 -- release/build_release.sh | 7 ------- release/verify.sh | 2 +- scripts/build_small.sh | 2 +- selfdrive/controls/controlsd.py | 3 +-- selfdrive/controls/tests/test_startup.py | 1 - selfdrive/manager/manager.py | 7 ------- selfdrive/manager/test/test_manager.py | 1 - selfdrive/test/helpers.py | 2 -- selfdrive/test/process_replay/process_replay.py | 1 - selfdrive/thermald/thermald.py | 3 +-- selfdrive/ui/SConscript | 14 ++++---------- selfdrive/ui/installer/continue_dashcam.sh | 4 ---- selfdrive/ui/installer/installer.cc | 4 ++-- selfdrive/ui/qt/offroad/onboarding.cc | 2 +- selfdrive/ui/qt/offroad/settings.cc | 16 +++++++--------- selfdrive/ui/qt/setup/setup.cc | 6 +++--- selfdrive/ui/qt/util.cc | 2 +- selfdrive/ui/translations/main_ar.ts | 4 ---- selfdrive/ui/translations/main_de.ts | 4 ---- selfdrive/ui/translations/main_fr.ts | 4 ---- selfdrive/ui/translations/main_ja.ts | 4 ---- selfdrive/ui/translations/main_ko.ts | 4 ---- selfdrive/ui/translations/main_pt-BR.ts | 4 ---- selfdrive/ui/translations/main_th.ts | 4 ---- selfdrive/ui/translations/main_tr.ts | 4 ---- selfdrive/ui/translations/main_zh-CHS.ts | 4 ---- selfdrive/ui/translations/main_zh-CHT.ts | 4 ---- selfdrive/updated.py | 2 +- system/loggerd/logger.cc | 2 +- system/version.py | 2 +- tools/webcam/README.md | 2 +- 35 files changed, 28 insertions(+), 108 deletions(-) delete mode 100755 selfdrive/ui/installer/continue_dashcam.sh diff --git a/Jenkinsfile b/Jenkinsfile index 4b0fe6a84..1d724721d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -168,7 +168,7 @@ node { env.GIT_COMMIT = checkout(scm).GIT_COMMIT def excludeBranches = ['master-ci', 'devel', 'devel-staging', 'release3', 'release3-staging', - 'dashcam3', 'dashcam3-staging', 'testing-closet*', 'hotfix-*'] + 'testing-closet*', 'hotfix-*'] def excludeRegex = excludeBranches.join('|').replaceAll('\\*', '.*') if (env.BRANCH_NAME != 'master') { @@ -180,7 +180,7 @@ node { try { if (env.BRANCH_NAME == 'devel-staging') { deviceStage("build release3-staging", "tici-needs-can", [], [ - ["build release3-staging & dashcam3-staging", "RELEASE_BRANCH=release3-staging DASHCAM_BRANCH=dashcam3-staging $SOURCE_DIR/release/build_release.sh"], + ["build release3-staging", "RELEASE_BRANCH=release3-staging $SOURCE_DIR/release/build_release.sh"], ]) } diff --git a/common/params.cc b/common/params.cc index 639de5322..386813efd 100644 --- a/common/params.cc +++ b/common/params.cc @@ -182,7 +182,6 @@ std::unordered_map keys = { {"PandaHeartbeatLost", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, {"PandaSomResetTriggered", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, {"PandaSignatures", CLEAR_ON_MANAGER_START}, - {"Passive", PERSISTENT}, {"PrimeType", PERSISTENT}, {"RecordFront", PERSISTENT}, {"RecordFrontLock", PERSISTENT}, // for the internal fleet diff --git a/launch_env.sh b/launch_env.sh index dd8f431c6..c16f06191 100755 --- a/launch_env.sh +++ b/launch_env.sh @@ -10,8 +10,4 @@ if [ -z "$AGNOS_VERSION" ]; then export AGNOS_VERSION="9.1" fi -if [ -z "$PASSIVE" ]; then - export PASSIVE="1" -fi - export STAGING_ROOT="/data/safe_staging" diff --git a/launch_openpilot.sh b/launch_openpilot.sh index 1525e1715..2888814c2 100755 --- a/launch_openpilot.sh +++ b/launch_openpilot.sh @@ -1,5 +1,3 @@ #!/usr/bin/bash -export PASSIVE="0" exec ./launch_chffrplus.sh - diff --git a/release/build_release.sh b/release/build_release.sh index b713876cd..fc15cf6cd 100755 --- a/release/build_release.sh +++ b/release/build_release.sh @@ -102,11 +102,4 @@ if [ ! -z "$RELEASE_BRANCH" ]; then git push -f origin $RELEASE_BRANCH:$RELEASE_BRANCH fi -if [ ! -z "$DASHCAM_BRANCH" ]; then - # Create dashcam - git rm selfdrive/car/*/carcontroller.py - git commit -m "create dashcam release from release" - git push -f origin $RELEASE_BRANCH:$DASHCAM_BRANCH -fi - echo "[-] done T=$SECONDS" diff --git a/release/verify.sh b/release/verify.sh index 56f21183f..ec5266bd8 100755 --- a/release/verify.sh +++ b/release/verify.sh @@ -6,7 +6,7 @@ RED="\033[0;31m" GREEN="\033[0;32m" CLEAR="\033[0m" -BRANCHES="devel dashcam3 release3" +BRANCHES="devel release3" for b in $BRANCHES; do if git diff --quiet origin/$b origin/$b-staging && [ "$(git rev-parse origin/$b)" = "$(git rev-parse origin/$b-staging)" ]; then printf "%-10s $GREEN ok $CLEAR\n" "$b" diff --git a/scripts/build_small.sh b/scripts/build_small.sh index d53c7a6c7..90f55373e 100755 --- a/scripts/build_small.sh +++ b/scripts/build_small.sh @@ -26,7 +26,7 @@ cd $OUT git tag -l | xargs git tag -d # remove non-master branches -BRANCHES="release2 dashcam dashcam3 release3 devel master-ci nightly" +BRANCHES="release2 release3 devel master-ci nightly" for branch in $BRANCHES; do git branch -D $branch git branch -D ${branch}-staging || true diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 78bcf8a9b..a25b23469 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -105,14 +105,13 @@ class Controls: self.is_metric = self.params.get_bool("IsMetric") self.is_ldw_enabled = self.params.get_bool("IsLdwEnabled") openpilot_enabled_toggle = self.params.get_bool("OpenpilotEnabledToggle") - passive = self.params.get_bool("Passive") or not openpilot_enabled_toggle # detect sound card presence and ensure successful init sounds_available = HARDWARE.get_sound_card_online() car_recognized = self.CP.carName != 'mock' - controller_available = self.CI.CC is not None and not passive and not self.CP.dashcamOnly + controller_available = self.CI.CC is not None and openpilot_enabled_toggle and not self.CP.dashcamOnly self.CP.passive = not car_recognized or not controller_available or self.CP.dashcamOnly if self.CP.passive: safety_config = car.CarParams.SafetyConfig.new_message() diff --git a/selfdrive/controls/tests/test_startup.py b/selfdrive/controls/tests/test_startup.py index a93152e84..02c0f486f 100755 --- a/selfdrive/controls/tests/test_startup.py +++ b/selfdrive/controls/tests/test_startup.py @@ -69,7 +69,6 @@ class TestStartup(unittest.TestCase): pm = messaging.PubMaster(['can', 'pandaStates']) params = Params() - params.put_bool("Passive", False) params.put_bool("OpenpilotEnabledToggle", True) # Build capnn version of FW array diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index 13b03c4dc..5c0d5518b 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -58,13 +58,6 @@ def manager_init() -> None: if params.get(k) is None: params.put(k, v) - # is this dashcam? - if os.getenv("PASSIVE") is not None: - params.put_bool("Passive", bool(int(os.getenv("PASSIVE", "0")))) - - if params.get("Passive") is None: - raise Exception("Passive must be set to continue") - # Create folders needed for msgq try: os.mkdir("/dev/shm") diff --git a/selfdrive/manager/test/test_manager.py b/selfdrive/manager/test/test_manager.py index e97c4d14d..9dc8bf1cd 100755 --- a/selfdrive/manager/test/test_manager.py +++ b/selfdrive/manager/test/test_manager.py @@ -21,7 +21,6 @@ BLACKLIST_PROCS = ['manage_athenad', 'pandad', 'pigeond'] @pytest.mark.tici class TestManager(unittest.TestCase): def setUp(self): - os.environ['PASSIVE'] = '0' HARDWARE.set_power_save(False) # ensure clean CarParams diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index 693604442..af6390d74 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -12,7 +12,6 @@ from openpilot.tools.lib.logreader import LogIterable def set_params_enabled(): - os.environ['PASSIVE'] = "0" os.environ['REPLAY'] = "1" os.environ['FINGERPRINT'] = "TOYOTA COROLLA TSS2 2019" os.environ['LOGPRINT'] = "debug" @@ -21,7 +20,6 @@ def set_params_enabled(): params.put("HasAcceptedTerms", terms_version) params.put("CompletedTrainingVersion", training_version) params.put_bool("OpenpilotEnabledToggle", True) - params.put_bool("Passive", False) # valid calib msg = messaging.new_message('liveCalibration') diff --git a/selfdrive/test/process_replay/process_replay.py b/selfdrive/test/process_replay/process_replay.py index 19f1c127a..b95c75ddf 100755 --- a/selfdrive/test/process_replay/process_replay.py +++ b/selfdrive/test/process_replay/process_replay.py @@ -725,7 +725,6 @@ def _replay_multi_process( def generate_params_config(lr=None, CP=None, fingerprint=None, custom_params=None) -> Dict[str, Any]: params_dict = { "OpenpilotEnabledToggle": True, - "Passive": False, "DisengageOnAccelerator": True, "DisableLogging": False, } diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index 605cf5108..ab30b1579 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -297,8 +297,7 @@ def thermald_thread(end_event, hw_queue) -> None: # with 2% left, we killall, otherwise the phone will take a long time to boot startup_conditions["free_space"] = msg.deviceState.freeSpacePercent > 2 - startup_conditions["completed_training"] = params.get("CompletedTrainingVersion") == training_version or \ - params.get_bool("Passive") + startup_conditions["completed_training"] = params.get("CompletedTrainingVersion") == training_version startup_conditions["not_driver_view"] = not params.get_bool("IsDriverViewEnabled") startup_conditions["not_taking_snapshot"] = not params.get_bool("IsTakingSnapshot") diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index 03006e3b4..a3cba124f 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -101,23 +101,17 @@ if GetOption('extras') and arch != "Darwin": senv['LINKFLAGS'].append('-Wl,-strip-debug') release = "release3" - dashcam = "dashcam3" installers = [ ("openpilot", release), ("openpilot_test", f"{release}-staging"), ("openpilot_nightly", "nightly"), ("openpilot_internal", "master"), - ("dashcam", dashcam), - ("dashcam_test", f"{dashcam}-staging"), ] - cont = {} - for brand in ("openpilot", "dashcam"): - cont[brand] = senv.Command(f"installer/continue_{brand}.o", f"installer/continue_{brand}.sh", - "ld -r -b binary -o $TARGET $SOURCE") + cont = senv.Command(f"installer/continue_openpilot.o", f"installer/continue_openpilot.sh", + "ld -r -b binary -o $TARGET $SOURCE") for name, branch in installers: - brand = "dashcam" if "dashcam" in branch else "openpilot" - d = {'BRANCH': f"'\"{branch}\"'", 'BRAND': f"'\"{brand}\"'"} + d = {'BRANCH': f"'\"{branch}\"'"} if "internal" in name: d['INTERNAL'] = "1" @@ -126,7 +120,7 @@ if GetOption('extras') and arch != "Darwin": r.raise_for_status() d['SSH_KEYS'] = f'\\"{r.text.strip()}\\"' obj = senv.Object(f"installer/installers/installer_{name}.o", ["installer/installer.cc"], CPPDEFINES=d) - f = senv.Program(f"installer/installers/installer_{name}", [obj, cont[brand]], LIBS=qt_libs) + f = senv.Program(f"installer/installers/installer_{name}", [obj, cont], LIBS=qt_libs) # keep installers small assert f[0].get_size() < 350*1e3 diff --git a/selfdrive/ui/installer/continue_dashcam.sh b/selfdrive/ui/installer/continue_dashcam.sh deleted file mode 100755 index 25233fff1..000000000 --- a/selfdrive/ui/installer/continue_dashcam.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/bash - -cd /data/openpilot -exec ./launch_chffrplus.sh diff --git a/selfdrive/ui/installer/installer.cc b/selfdrive/ui/installer/installer.cc index 179ce60c6..d43ed37ae 100644 --- a/selfdrive/ui/installer/installer.cc +++ b/selfdrive/ui/installer/installer.cc @@ -33,8 +33,8 @@ const QString CACHE_PATH = "/data/openpilot.cache"; #define INSTALL_PATH "/data/openpilot" #define TMP_INSTALL_PATH "/data/tmppilot" -extern const uint8_t str_continue[] asm("_binary_selfdrive_ui_installer_continue_" BRAND "_sh_start"); -extern const uint8_t str_continue_end[] asm("_binary_selfdrive_ui_installer_continue_" BRAND "_sh_end"); +extern const uint8_t str_continue[] asm("_binary_selfdrive_ui_installer_continue_openpilot_sh_start"); +extern const uint8_t str_continue_end[] asm("_binary_selfdrive_ui_installer_continue_openpilot_sh_end"); bool time_valid() { time_t rawtime; diff --git a/selfdrive/ui/qt/offroad/onboarding.cc b/selfdrive/ui/qt/offroad/onboarding.cc index c7c22f0ea..d4fcee55c 100644 --- a/selfdrive/ui/qt/offroad/onboarding.cc +++ b/selfdrive/ui/qt/offroad/onboarding.cc @@ -183,7 +183,7 @@ void DeclinePage::showEvent(QShowEvent *event) { void OnboardingWindow::updateActiveScreen() { if (!accepted_terms) { setCurrentIndex(0); - } else if (!training_done && !params.getBool("Passive")) { + } else if (!training_done) { setCurrentIndex(1); } else { emit onboardingDone(); diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index eec9fede0..6d79aeb23 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -215,15 +215,13 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { }); addItem(resetCalibBtn); - if (!params.getBool("Passive")) { - auto retrainingBtn = new ButtonControl(tr("Review Training Guide"), tr("REVIEW"), tr("Review the rules, features, and limitations of openpilot")); - connect(retrainingBtn, &ButtonControl::clicked, [=]() { - if (ConfirmationDialog::confirm(tr("Are you sure you want to review the training guide?"), tr("Review"), this)) { - emit reviewTrainingGuide(); - } - }); - addItem(retrainingBtn); - } + auto retrainingBtn = new ButtonControl(tr("Review Training Guide"), tr("REVIEW"), tr("Review the rules, features, and limitations of openpilot")); + connect(retrainingBtn, &ButtonControl::clicked, [=]() { + if (ConfirmationDialog::confirm(tr("Are you sure you want to review the training guide?"), tr("Review"), this)) { + emit reviewTrainingGuide(); + } + }); + addItem(retrainingBtn); if (Hardware::TICI()) { auto regulatoryBtn = new ButtonControl(tr("Regulatory"), tr("VIEW"), ""); diff --git a/selfdrive/ui/qt/setup/setup.cc b/selfdrive/ui/qt/setup/setup.cc index 67f1c136d..4f2e4f48c 100644 --- a/selfdrive/ui/qt/setup/setup.cc +++ b/selfdrive/ui/qt/setup/setup.cc @@ -20,7 +20,7 @@ #include "selfdrive/ui/qt/widgets/input.h" const std::string USER_AGENT = "AGNOSSetup-"; -const QString DASHCAM_URL = "https://dashcam.comma.ai"; +const QString TEST_URL = "https://openpilot.comma.ai"; bool is_elf(char *fname) { FILE *fp = fopen(fname, "rb"); @@ -229,11 +229,11 @@ QWidget * Setup::network_setup() { } repaint(); }); - request->sendRequest(DASHCAM_URL); + request->sendRequest(TEST_URL); QTimer *timer = new QTimer(this); QObject::connect(timer, &QTimer::timeout, [=]() { if (!request->active() && cont->isVisible()) { - request->sendRequest(DASHCAM_URL); + request->sendRequest(TEST_URL); } }); timer->start(1000); diff --git a/selfdrive/ui/qt/util.cc b/selfdrive/ui/qt/util.cc index c5222b865..16d31ce30 100644 --- a/selfdrive/ui/qt/util.cc +++ b/selfdrive/ui/qt/util.cc @@ -25,7 +25,7 @@ QString getVersion() { } QString getBrand() { - return Params().getBool("Passive") ? QObject::tr("dashcam") : QObject::tr("openpilot"); + return QObject::tr("openpilot"); } QString getUserAgent() { diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index 203280763..b7e35d7b6 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -562,10 +562,6 @@ Exit إغلاق - - dashcam - dashcam - openpilot openpilot diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index 782d65b06..deab47e2c 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -557,10 +557,6 @@ Exit Verlassen - - dashcam - dashcam - openpilot openpilot diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index f3aef3d43..8cd5a4ea2 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -558,10 +558,6 @@ Exit Quitter - - dashcam - dashcam - openpilot openpilot diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index ba3ca8faf..27cd7246d 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -556,10 +556,6 @@ Exit 閉じる - - dashcam - ドライブレコーダー - openpilot openpilot diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index b2b76f390..725e3c2f7 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -557,10 +557,6 @@ Exit 종료 - - dashcam - 블랙박스 - openpilot openpilot diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index e89a3b1f5..19e35b2c1 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -558,10 +558,6 @@ Exit Sair - - dashcam - dashcam - openpilot openpilot diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index 0d0bda4ab..01d8a93ca 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -557,10 +557,6 @@ Exit ปิด - - dashcam - กล้องติดรถยนต์ - openpilot openpilot diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index d14dd518a..c4e661edf 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -556,10 +556,6 @@ Exit Çık - - dashcam - araç yol kamerası - openpilot openpilot diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index ef0d78402..68211b4b3 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -557,10 +557,6 @@ Exit 退出 - - dashcam - 行车记录仪 - openpilot openpilot diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 121bf58f1..1bdd2d52e 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -557,10 +557,6 @@ Exit 離開 - - dashcam - 行車記錄器 - openpilot openpilot diff --git a/selfdrive/updated.py b/selfdrive/updated.py index 8a46a11a7..eb2759223 100755 --- a/selfdrive/updated.py +++ b/selfdrive/updated.py @@ -342,7 +342,7 @@ class Updater: def check_for_update(self) -> None: cloudlog.info("checking for updates") - excluded_branches = ('release2', 'release2-staging', 'dashcam', 'dashcam-staging') + excluded_branches = ('release2', 'release2-staging') try: run(["git", "ls-remote", "origin", "HEAD"], OVERLAY_MERGED) diff --git a/system/loggerd/logger.cc b/system/loggerd/logger.cc index 3af2c50aa..bc842f4a9 100644 --- a/system/loggerd/logger.cc +++ b/system/loggerd/logger.cc @@ -43,7 +43,7 @@ kj::Array logger_build_init_data() { init.setGitCommit(params_map["GitCommit"]); init.setGitBranch(params_map["GitBranch"]); init.setGitRemote(params_map["GitRemote"]); - init.setPassive(params.getBool("Passive")); + init.setPassive(false); init.setDongleId(params_map["DongleId"]); auto lparams = init.initParams().initEntries(params_map.size()); diff --git a/system/version.py b/system/version.py index f9fd2bc84..6bcae5f3f 100755 --- a/system/version.py +++ b/system/version.py @@ -7,7 +7,7 @@ from functools import lru_cache from openpilot.common.basedir import BASEDIR from openpilot.common.swaglog import cloudlog -RELEASE_BRANCHES = ['release3-staging', 'dashcam3-staging', 'release3', 'dashcam3', 'nightly'] +RELEASE_BRANCHES = ['release3-staging', 'release3', 'nightly'] TESTED_BRANCHES = RELEASE_BRANCHES + ['devel', 'devel-staging'] training_version: bytes = b"0.2.0" diff --git a/tools/webcam/README.md b/tools/webcam/README.md index bdf39b814..709e8514c 100644 --- a/tools/webcam/README.md +++ b/tools/webcam/README.md @@ -33,7 +33,7 @@ USE_WEBCAM=1 scons -j$(nproc) ## GO ``` cd ~/openpilot/selfdrive/manager -PASSIVE=0 NOSENSOR=1 USE_WEBCAM=1 ./manager.py +NOSENSOR=1 USE_WEBCAM=1 ./manager.py ``` - Start the car, then the UI should show the road webcam's view - Adjust and secure the webcams (you can run tools/webcam/front_mount_helper.py to help mount the driver camera)