openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

263 lines
6.4 KiB

#!/bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
function op_first_install() {
(set -e
echo "Installing op system-wide..."
RC_FILE="${HOME}/.$(basename ${SHELL})rc"
if [ "$(uname)" == "Darwin" ] && [ $SHELL == "/bin/bash" ]; then
RC_FILE="$HOME/.bash_profile"
fi
printf "\nalias op='source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )/op.sh" \"\$@\"'\n" >> $RC_FILE
echo -e " ↳ [${GREEN}${NC}] op installed successfully. Open a new shell to use it.\n"
)
}
# be default, assume openpilot dir is in current directory
OPENPILOT_ROOT=$(pwd)
function op_check_openpilot_dir() {
(set -e
if [ ! -f "$OPENPILOT_ROOT/launch_openpilot.sh" ]; then
echo "openpilot directory not found!"
return 1
fi
)
}
function op_check_git() {
(set -e
cd $OPENPILOT_ROOT
echo "Checking for git..."
if ! command -v "git" > /dev/null 2>&1; then
echo -e " ↳ [${RED}${NC}] git not found on your system!"
return 1
else
echo -e " ↳ [${GREEN}${NC}] git found on your system.\n"
fi
echo "Checking for git lfs files..."
if [[ $(file -b $(git lfs ls-files -n | grep "\.so" | head -n 1)) == "ASCII text" ]]; then
echo -e " ↳ [${RED}${NC}] git lfs files not found! Run git lfs pull"
return 1
else
echo -e " ↳ [${GREEN}${NC}] git lfs files found on your system.\n"
fi
echo "Checking for git submodules..."
if $(git submodule foreach --quiet --recursive 'return 1' 2&> /dev/null); then
echo -e " ↳ [${RED}${NC}] git submodules not found! Run 'git submodule update --init --recursive'"
return 1
else
echo -e " ↳ [${GREEN}${NC}] git submodules found on your system.\n"
fi
)
}
function op_check_os() {
(set -e
echo "Checking for compatible os version..."
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
if [ -f "/etc/os-release" ]; then
source /etc/os-release
case "$VERSION_CODENAME" in
"jammy" | "kinetic" | "noble" | "focal")
OS_VERSION="Ubuntu"
echo -e " ↳ [${GREEN}${NC}] Ubuntu $VERSION_CODENAME detected.\n"
;;
* )
echo -e " ↳ [${RED}${NC}] Incompatible Ubuntu version $VERSION_CODENAME detected!"
return 1
;;
esac
else
echo -e " ↳ [${RED}${NC}] No /etc/os-release on your system. Make sure you're running on Ubuntu, or similar!"
return 1
fi
elif [[ "$OSTYPE" == "darwin"* ]]; then
echo -e " ↳ [${GREEN}${NC}] macos detected.\n"
OS_VERSION="Darwin"
else
echo -e " ↳ [${RED}${NC}] OS type $OSTYPE not supported!"
return 1
fi
)
}
function op_check_python() {
(set -e
echo "Checking for compatible python version..."
export REQUIRED_PYTHON_VERSION=$(grep "requires-python" pyproject.toml | cut -d= -f3- | tr -d '"' | tr -d ' ')
if ! command -v "python3" > /dev/null 2>&1; then
echo -e " ↳ [${RED}${NC}] python3 not found on your system. You need python version at least $REQUIRED_PYTHON_VERSION to continue!"
return 1
else
if $(python3 -c "import sys; quit(not sys.version_info >= tuple(map(int, \"$REQUIRED_PYTHON_VERSION\".split('.'))))"); then
echo -e " ↳ [${GREEN}${NC}] $(python3 --version) detected.\n"
else
echo -e " ↳ [${RED}${NC}] You need python version at least $REQUIRED_PYTHON_VERSION to continue!"
return 1
fi
fi
)
}
# this must be run in the same shell as the user calling "op"
function op_venv() {
op_check_openpilot_dir || return 1
source $OPENPILOT_ROOT/.venv/bin/activate || (echo -e "\nCan't activate venv. Have you ran 'op install' ?" && return 1)
}
function op_check() {
(set -e
op_check_openpilot_dir
cd $OPENPILOT_ROOT
op_check_git
op_check_os
op_check_python
)
}
function op_run() {
(set -e
op_venv
cd $OPENPILOT_ROOT
$OPENPILOT_ROOT/launch_openpilot.sh
)
}
function op_install() {
(set -e
op_check_openpilot_dir
cd $OPENPILOT_ROOT
op_check_os
op_check_python
case "$OS_VERSION" in
"Ubuntu")
$OPENPILOT_ROOT/tools/ubuntu_setup.sh
;;
"Darwin")
$OPENPILOT_ROOT/tools/mac_setup.sh
;;
esac
git submodule update --init --recursive
git lfs pull
)
}
function op_build() {
(set -e
op_venv
cd $OPENPILOT_ROOT
scons $@ || echo -e "\nBuild failed. Have you ran 'op install' ?"
)
}
function op_juggle() {
(set -e
op_venv
cd $OPENPILOT_ROOT
$OPENPILOT_ROOT/tools/plotjuggler/juggle.py $@
)
}
function op_default() {
echo "An openpilot helper"
echo ""
echo -e "\e[4mUsage:\e[0m op [OPTIONS] <COMMAND>"
echo ""
echo -e "\e[4mCommands:\e[0m"
echo " venv Activate the virtual environment"
echo " check Check system requirements (git, os, python) to start using openpilot"
echo " install Install requirements to use openpilot"
echo " build Build openpilot"
echo " run Run openpilot"
echo " juggle Run Plotjuggler"
echo " help Show this message"
echo " --install Install this tool system wide"
echo ""
echo -e "\e[4mOptions:\e[0m"
echo " -d, --dir"
echo " Specify the openpilot directory you want to use"
echo " Default to the current working directory"
echo ""
echo -e "\e[4mExamples:\e[0m"
echo " op --dir /tmp/openpilot check"
echo " Run the check command on openpilot located in /tmp/openpilot"
echo ""
echo " op juggle --install"
echo " Install plotjuggler in the openpilot located in your current"
echo " working directory"
echo ""
echo " op --dir /tmp/openpilot build -j4"
echo " Run the build command on openpilot located in /tmp/openpilot"
echo " on 4 cores"
}
function _op() {
# parse Options
case $1 in
-d | --dir ) shift 1; OPENPILOT_ROOT="$1"; shift 1 ;;
esac
# parse Commands
case $1 in
venv ) shift 1; op_venv "$@" ;;
check ) shift 1; op_check "$@" ;;
install ) shift 1; op_install "$@" ;;
build ) shift 1; op_build "$@" ;;
run ) shift 1; op_run "$@" ;;
juggle ) shift 1; op_juggle "$@" ;;
--install ) shift 1; op_first_install "$@" ;;
* ) op_default "$@" ;;
esac
}
_op $@
# remove from env
unset -f _op
unset -f op_check
unset -f op_install
unset -f op_build
unset -f op_run
unset -f op_juggle
unset -f op_venv
unset -f op_check_openpilot_dir
unset -f op_check_git
unset -f op_check_python
unset -f op_check_os
unset -f op_first_install
unset -f op_default