parent
22a4193109
commit
aed724beda
|
@ -1,4 +1,5 @@
|
||||||
venv/
|
venv/
|
||||||
|
.clang-format
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.tags
|
.tags
|
||||||
.ipynb_checkpoints
|
.ipynb_checkpoints
|
||||||
|
@ -6,7 +7,7 @@ venv/
|
||||||
.overlay_init
|
.overlay_init
|
||||||
.overlay_consistent
|
.overlay_consistent
|
||||||
.sconsign.dblite
|
.sconsign.dblite
|
||||||
.vscode
|
.vscode*
|
||||||
model2.png
|
model2.png
|
||||||
a.out
|
a.out
|
||||||
|
|
||||||
|
@ -31,6 +32,7 @@ a.out
|
||||||
*.vcd
|
*.vcd
|
||||||
config.json
|
config.json
|
||||||
clcache
|
clcache
|
||||||
|
compile_commands.json
|
||||||
|
|
||||||
persist
|
persist
|
||||||
board/obj/
|
board/obj/
|
||||||
|
@ -42,6 +44,7 @@ selfdrive/ui/_ui
|
||||||
selfdrive/test/longitudinal_maneuvers/out
|
selfdrive/test/longitudinal_maneuvers/out
|
||||||
selfdrive/visiond/visiond
|
selfdrive/visiond/visiond
|
||||||
selfdrive/loggerd/loggerd
|
selfdrive/loggerd/loggerd
|
||||||
|
selfdrive/loggerd/bootlog
|
||||||
selfdrive/sensord/_gpsd
|
selfdrive/sensord/_gpsd
|
||||||
selfdrive/sensord/_sensord
|
selfdrive/sensord/_sensord
|
||||||
selfdrive/camerad/camerad
|
selfdrive/camerad/camerad
|
||||||
|
@ -68,3 +71,6 @@ flycheck_*
|
||||||
|
|
||||||
cppcheck_report.txt
|
cppcheck_report.txt
|
||||||
comma.sh
|
comma.sh
|
||||||
|
|
||||||
|
selfdrive/modeld/thneed/compile
|
||||||
|
models/*.thneed
|
||||||
|
|
|
@ -1,25 +1,39 @@
|
||||||
def phone(String ip, String step_label, String cmd) {
|
def phone(String ip, String step_label, String cmd) {
|
||||||
def ci_env = "CI=1 TEST_DIR=${env.TEST_DIR} GIT_BRANCH=${env.GIT_BRANCH} GIT_COMMIT=${env.GIT_COMMIT}"
|
|
||||||
|
|
||||||
withCredentials([file(credentialsId: 'id_rsa_public', variable: 'key_file')]) {
|
withCredentials([file(credentialsId: 'id_rsa_public', variable: 'key_file')]) {
|
||||||
sh label: step_label,
|
def ssh_cmd = """
|
||||||
script: """
|
ssh -tt -o StrictHostKeyChecking=no -i ${key_file} -p 8022 'comma@${ip}' /usr/bin/bash <<'EOF'
|
||||||
ssh -tt -o StrictHostKeyChecking=no -i ${key_file} -p 8022 root@${ip} '${ci_env} /usr/bin/bash -le' <<'EOF'
|
|
||||||
echo \$\$ > /dev/cpuset/app/tasks || true
|
set -e
|
||||||
echo \$PPID > /dev/cpuset/app/tasks || true
|
|
||||||
mkdir -p /dev/shm
|
export CI=1
|
||||||
chmod 777 /dev/shm
|
export TEST_DIR=${env.TEST_DIR}
|
||||||
|
export GIT_BRANCH=${env.GIT_BRANCH}
|
||||||
|
export GIT_COMMIT=${env.GIT_COMMIT}
|
||||||
|
|
||||||
|
source ~/.bash_profile
|
||||||
|
|
||||||
|
ln -snf ${env.TEST_DIR} /data/pythonpath
|
||||||
|
|
||||||
|
if [ -f /EON ]; then
|
||||||
|
echo \$\$ > /dev/cpuset/app/tasks || true
|
||||||
|
echo \$PPID > /dev/cpuset/app/tasks || true
|
||||||
|
mkdir -p /dev/shm
|
||||||
|
chmod 777 /dev/shm
|
||||||
|
fi
|
||||||
|
|
||||||
cd ${env.TEST_DIR} || true
|
cd ${env.TEST_DIR} || true
|
||||||
${cmd}
|
${cmd}
|
||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
EOF"""
|
EOF"""
|
||||||
|
|
||||||
|
sh script: ssh_cmd, label: step_label
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def phone_steps(String device_type, steps) {
|
def phone_steps(String device_type, steps) {
|
||||||
lock(resource: "", label: device_type, inversePrecedence: true, variable: 'device_ip', quantity: 1) {
|
lock(resource: "", label: device_type, inversePrecedence: true, variable: 'device_ip', quantity: 1) {
|
||||||
timeout(time: 60, unit: 'MINUTES') {
|
timeout(time: 60, unit: 'MINUTES') {
|
||||||
phone(device_ip, "kill old processes", "pkill -f comma || true")
|
|
||||||
phone(device_ip, "git checkout", readFile("selfdrive/test/setup_device_ci.sh"),)
|
phone(device_ip, "git checkout", readFile("selfdrive/test/setup_device_ci.sh"),)
|
||||||
steps.each { item ->
|
steps.each { item ->
|
||||||
phone(device_ip, item[0], item[1])
|
phone(device_ip, item[0], item[1])
|
||||||
|
@ -40,7 +54,7 @@ pipeline {
|
||||||
|
|
||||||
stages {
|
stages {
|
||||||
|
|
||||||
stage('Release Build') {
|
stage('Build release2') {
|
||||||
agent {
|
agent {
|
||||||
docker {
|
docker {
|
||||||
image 'python:3.7.3'
|
image 'python:3.7.3'
|
||||||
|
@ -104,16 +118,17 @@ pipeline {
|
||||||
stages {
|
stages {
|
||||||
stage('parallel tests') {
|
stage('parallel tests') {
|
||||||
parallel {
|
parallel {
|
||||||
|
|
||||||
stage('Devel Build') {
|
stage('Devel Build') {
|
||||||
environment {
|
environment {
|
||||||
CI_PUSH = "${env.BRANCH_NAME == 'master' ? 'master-ci' : ' '}"
|
CI_PUSH = "${env.BRANCH_NAME == 'master' ? 'master-ci' : ' '}"
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
phone_steps("eon", [
|
phone_steps("eon-build", [
|
||||||
|
["build", "SCONS_CACHE=1 scons -j4"],
|
||||||
|
["test athena", "nosetests -s selfdrive/athena/tests/test_athenad_old.py"],
|
||||||
|
["test manager", "python selfdrive/test/test_manager.py"],
|
||||||
|
["onroad tests", "cd selfdrive/test/ && ./test_onroad.py"],
|
||||||
["build devel", "cd release && CI_PUSH=${env.CI_PUSH} ./build_devel.sh"],
|
["build devel", "cd release && CI_PUSH=${env.CI_PUSH} ./build_devel.sh"],
|
||||||
["test openpilot", "nosetests -s selfdrive/test/test_openpilot.py"],
|
|
||||||
["test cpu usage", "cd selfdrive/test/ && ./test_cpu_usage.py"],
|
|
||||||
["test car interfaces", "cd selfdrive/car/tests/ && ./test_car_interfaces.py"],
|
["test car interfaces", "cd selfdrive/car/tests/ && ./test_car_interfaces.py"],
|
||||||
["test spinner build", "cd selfdrive/ui/spinner && make clean && make"],
|
["test spinner build", "cd selfdrive/ui/spinner && make clean && make"],
|
||||||
["test text window build", "cd selfdrive/ui/text && make clean && make"],
|
["test text window build", "cd selfdrive/ui/text && make clean && make"],
|
||||||
|
@ -124,7 +139,8 @@ pipeline {
|
||||||
stage('Replay Tests') {
|
stage('Replay Tests') {
|
||||||
steps {
|
steps {
|
||||||
phone_steps("eon2", [
|
phone_steps("eon2", [
|
||||||
["camerad/modeld replay", "QCOM_REPLAY=1 scons -j4 && cd selfdrive/test/process_replay && ./camera_replay.py"],
|
["build QCOM_REPLAY", "SCONS_CACHE=1 QCOM_REPLAY=1 scons -j4"],
|
||||||
|
["camerad/modeld replay", "cd selfdrive/test/process_replay && ./camera_replay.py"],
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -135,13 +151,30 @@ pipeline {
|
||||||
["build", "SCONS_CACHE=1 scons -j4"],
|
["build", "SCONS_CACHE=1 scons -j4"],
|
||||||
["test sounds", "nosetests -s selfdrive/test/test_sounds.py"],
|
["test sounds", "nosetests -s selfdrive/test/test_sounds.py"],
|
||||||
["test boardd loopback", "nosetests -s selfdrive/boardd/tests/test_boardd_loopback.py"],
|
["test boardd loopback", "nosetests -s selfdrive/boardd/tests/test_boardd_loopback.py"],
|
||||||
["test loggerd", "CI=1 python selfdrive/loggerd/tests/test_loggerd.py"],
|
["test loggerd", "python selfdrive/loggerd/tests/test_loggerd.py"],
|
||||||
//["test camerad", "CI=1 python selfdrive/camerad/test/test_camerad.py"], // wait for shelf refactor
|
["test encoder", "python selfdrive/loggerd/tests/test_encoder.py"],
|
||||||
|
["test camerad", "python selfdrive/camerad/test/test_camerad.py"],
|
||||||
|
["test logcatd", "python selfdrive/logcatd/tests/test_logcatd_android.py"],
|
||||||
//["test updater", "python installer/updater/test_updater.py"],
|
//["test updater", "python installer/updater/test_updater.py"],
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stage('Tici Build') {
|
||||||
|
environment {
|
||||||
|
R3_PUSH = "${env.BRANCH_NAME == 'master' ? '1' : ' '}"
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
phone_steps("tici", [
|
||||||
|
["build", "SCONS_CACHE=1 scons -j16"],
|
||||||
|
["test loggerd", "python selfdrive/loggerd/tests/test_loggerd.py"],
|
||||||
|
["test encoder", "LD_LIBRARY_PATH=/usr/local/lib python selfdrive/loggerd/tests/test_encoder.py"],
|
||||||
|
["test camerad", "python selfdrive/camerad/test/test_camerad.py"],
|
||||||
|
//["build release3-staging", "cd release && PUSH=${env.R3_PUSH} ./build_release3.sh"],
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,3 +191,4 @@ pipeline {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
27
README.md
27
README.md
|
@ -77,16 +77,17 @@ Supported Cars
|
||||||
| Honda | CR-V Hybrid 2017-2019 | Honda Sensing | Stock | 0mph | 12mph |
|
| Honda | CR-V Hybrid 2017-2019 | Honda Sensing | Stock | 0mph | 12mph |
|
||||||
| Honda | Fit 2018-19 | Honda Sensing | openpilot | 25mph<sup>1</sup> | 12mph |
|
| Honda | Fit 2018-19 | Honda Sensing | openpilot | 25mph<sup>1</sup> | 12mph |
|
||||||
| Honda | HR-V 2019-20 | Honda Sensing | openpilot | 25mph<sup>1</sup> | 12mph |
|
| Honda | HR-V 2019-20 | Honda Sensing | openpilot | 25mph<sup>1</sup> | 12mph |
|
||||||
| Honda | Insight 2019-20 | All | Stock | 0mph | 3mph |
|
| Honda | Insight 2019-21 | All | Stock | 0mph | 3mph |
|
||||||
| Honda | Inspire 2018 | All | Stock | 0mph | 3mph |
|
| Honda | Inspire 2018 | All | Stock | 0mph | 3mph |
|
||||||
| Honda | Odyssey 2018-20 | Honda Sensing | openpilot | 25mph<sup>1</sup> | 0mph |
|
| Honda | Odyssey 2018-20 | Honda Sensing | openpilot | 25mph<sup>1</sup> | 0mph |
|
||||||
| Honda | Passport 2019 | All | openpilot | 25mph<sup>1</sup> | 12mph |
|
| Honda | Passport 2019 | All | openpilot | 25mph<sup>1</sup> | 12mph |
|
||||||
| Honda | Pilot 2016-19 | Honda Sensing | openpilot | 25mph<sup>1</sup> | 12mph |
|
| Honda | Pilot 2016-19 | Honda Sensing | openpilot | 25mph<sup>1</sup> | 12mph |
|
||||||
| Honda | Ridgeline 2017-20 | Honda Sensing | openpilot | 25mph<sup>1</sup> | 12mph |
|
| Honda | Ridgeline 2017-20 | Honda Sensing | openpilot | 25mph<sup>1</sup> | 12mph |
|
||||||
| Hyundai | Palisade 2020 | All | Stock | 0mph | 0mph |
|
| Hyundai | Palisade 2020-21 | All | Stock | 0mph | 0mph |
|
||||||
| Hyundai | Sonata 2020-21 | All | Stock | 0mph | 0mph |
|
| Hyundai | Sonata 2020-21 | All | Stock | 0mph | 0mph |
|
||||||
| Lexus | CT Hybrid 2017-18 | LSS | Stock<sup>3</sup>| 0mph | 0mph |
|
| Lexus | CT Hybrid 2017-18 | LSS | Stock<sup>3</sup>| 0mph | 0mph |
|
||||||
| Lexus | ES 2019-20 | All | openpilot | 0mph | 0mph |
|
| Lexus | ES 2019-20 | All | openpilot | 0mph | 0mph |
|
||||||
|
| Lexus | ES Hybrid 2018 | LSS | Stock<sup>3</sup>| 0mph | 0mph |
|
||||||
| Lexus | ES Hybrid 2019 | All | openpilot | 0mph | 0mph |
|
| Lexus | ES Hybrid 2019 | All | openpilot | 0mph | 0mph |
|
||||||
| Lexus | IS 2017-2019 | All | Stock | 22mph | 0mph |
|
| Lexus | IS 2017-2019 | All | Stock | 22mph | 0mph |
|
||||||
| Lexus | IS Hybrid 2017 | All | Stock | 0mph | 0mph |
|
| Lexus | IS Hybrid 2017 | All | Stock | 0mph | 0mph |
|
||||||
|
@ -96,15 +97,16 @@ Supported Cars
|
||||||
| Lexus | RX 2020-21 | All | openpilot | 0mph | 0mph |
|
| Lexus | RX 2020-21 | All | openpilot | 0mph | 0mph |
|
||||||
| Lexus | RX Hybrid 2016-19 | All | Stock<sup>3</sup>| 0mph | 0mph |
|
| Lexus | RX Hybrid 2016-19 | All | Stock<sup>3</sup>| 0mph | 0mph |
|
||||||
| Lexus | RX Hybrid 2020 | All | openpilot | 0mph | 0mph |
|
| Lexus | RX Hybrid 2020 | All | openpilot | 0mph | 0mph |
|
||||||
| Toyota | Avalon 2016-18 | TSS-P | Stock<sup>3</sup>| 20mph<sup>1</sup> | 0mph |
|
| Toyota | Avalon 2016-18, 2021 | TSS-P | Stock<sup>3</sup>| 20mph<sup>1</sup> | 0mph |
|
||||||
| Toyota | Camry 2018-20 | All | Stock | 0mph<sup>4</sup> | 0mph |
|
| Toyota | Camry 2018-20 | All | Stock | 0mph<sup>4</sup> | 0mph |
|
||||||
| Toyota | Camry 2021 | All | openpilot | 0mph | 0mph |
|
| Toyota | Camry 2021 | All | openpilot | 0mph | 0mph |
|
||||||
| Toyota | Camry Hybrid 2018-20 | All | Stock | 0mph<sup>4</sup> | 0mph |
|
| Toyota | Camry Hybrid 2018-20 | All | Stock | 0mph<sup>4</sup> | 0mph |
|
||||||
| Toyota | C-HR 2017-19 | All | Stock | 0mph | 0mph |
|
| Toyota | Camry Hybrid 2021 | All | openpilot | 0mph | 0mph |
|
||||||
|
| Toyota | C-HR 2017-20 | All | Stock | 0mph | 0mph |
|
||||||
| Toyota | C-HR Hybrid 2017-19 | All | Stock | 0mph | 0mph |
|
| Toyota | C-HR Hybrid 2017-19 | All | Stock | 0mph | 0mph |
|
||||||
| Toyota | Corolla 2017-19 | All | Stock<sup>3</sup>| 20mph<sup>1</sup> | 0mph |
|
| Toyota | Corolla 2017-19 | All | Stock<sup>3</sup>| 20mph<sup>1</sup> | 0mph |
|
||||||
| Toyota | Corolla 2020-21 | All | openpilot | 0mph | 0mph |
|
| Toyota | Corolla 2020-21 | All | openpilot | 0mph | 0mph |
|
||||||
| Toyota | Corolla Hatchback 2019-20 | All | openpilot | 0mph | 0mph |
|
| Toyota | Corolla Hatchback 2019-21 | All | openpilot | 0mph | 0mph |
|
||||||
| Toyota | Corolla Hybrid 2020-21 | All | openpilot | 0mph | 0mph |
|
| Toyota | Corolla Hybrid 2020-21 | All | openpilot | 0mph | 0mph |
|
||||||
| Toyota | Highlander 2017-19 | All | Stock<sup>3</sup>| 0mph | 0mph |
|
| Toyota | Highlander 2017-19 | All | Stock<sup>3</sup>| 0mph | 0mph |
|
||||||
| Toyota | Highlander 2020-21 | All | openpilot | 0mph | 0mph |
|
| Toyota | Highlander 2020-21 | All | openpilot | 0mph | 0mph |
|
||||||
|
@ -113,6 +115,7 @@ Supported Cars
|
||||||
| Toyota | Prius 2016-20 | TSS-P | Stock<sup>3</sup>| 0mph | 0mph |
|
| Toyota | Prius 2016-20 | TSS-P | Stock<sup>3</sup>| 0mph | 0mph |
|
||||||
| Toyota | Prius 2021 | All | openpilot | 0mph | 0mph |
|
| Toyota | Prius 2021 | All | openpilot | 0mph | 0mph |
|
||||||
| Toyota | Prius Prime 2017-20 | All | Stock<sup>3</sup>| 0mph | 0mph |
|
| Toyota | Prius Prime 2017-20 | All | Stock<sup>3</sup>| 0mph | 0mph |
|
||||||
|
| Toyota | Prius Prime 2021 | All | openpilot | 0mph | 0mph |
|
||||||
| Toyota | Rav4 2016-18 | TSS-P | Stock<sup>3</sup>| 20mph<sup>1</sup> | 0mph |
|
| Toyota | Rav4 2016-18 | TSS-P | Stock<sup>3</sup>| 20mph<sup>1</sup> | 0mph |
|
||||||
| Toyota | Rav4 2019-21 | All | openpilot | 0mph | 0mph |
|
| Toyota | Rav4 2019-21 | All | openpilot | 0mph | 0mph |
|
||||||
| Toyota | Rav4 Hybrid 2016-18 | TSS-P | Stock<sup>3</sup>| 0mph | 0mph |
|
| Toyota | Rav4 Hybrid 2016-18 | TSS-P | Stock<sup>3</sup>| 0mph | 0mph |
|
||||||
|
@ -129,6 +132,7 @@ Community Maintained Cars and Features
|
||||||
|
|
||||||
| Make | Model (US Market Reference) | Supported Package | ACC | No ACC accel below | No ALC below |
|
| Make | Model (US Market Reference) | Supported Package | ACC | No ACC accel below | No ALC below |
|
||||||
| ----------| ------------------------------| ------------------| -----------------| -------------------| -------------|
|
| ----------| ------------------------------| ------------------| -----------------| -------------------| -------------|
|
||||||
|
| Audi | A3 2015, 2017 | Prestige | Stock | 0mph | 0mph |
|
||||||
| Buick | Regal 2018<sup>1</sup> | Adaptive Cruise | openpilot | 0mph | 7mph |
|
| Buick | Regal 2018<sup>1</sup> | Adaptive Cruise | openpilot | 0mph | 7mph |
|
||||||
| Cadillac | ATS 2018<sup>1</sup> | Adaptive Cruise | openpilot | 0mph | 7mph |
|
| Cadillac | ATS 2018<sup>1</sup> | Adaptive Cruise | openpilot | 0mph | 7mph |
|
||||||
| Chevrolet | Malibu 2017<sup>1</sup> | Adaptive Cruise | openpilot | 0mph | 7mph |
|
| Chevrolet | Malibu 2017<sup>1</sup> | Adaptive Cruise | openpilot | 0mph | 7mph |
|
||||||
|
@ -136,7 +140,7 @@ Community Maintained Cars and Features
|
||||||
| Chrysler | Pacifica 2017-18 | Adaptive Cruise | Stock | 0mph | 9mph |
|
| Chrysler | Pacifica 2017-18 | Adaptive Cruise | Stock | 0mph | 9mph |
|
||||||
| Chrysler | Pacifica 2020 | Adaptive Cruise | Stock | 0mph | 39mph |
|
| Chrysler | Pacifica 2020 | Adaptive Cruise | Stock | 0mph | 39mph |
|
||||||
| Chrysler | Pacifica Hybrid 2017-18 | Adaptive Cruise | Stock | 0mph | 9mph |
|
| Chrysler | Pacifica Hybrid 2017-18 | Adaptive Cruise | Stock | 0mph | 9mph |
|
||||||
| Chrysler | Pacifica Hybrid 2019-20 | Adaptive Cruise | Stock | 0mph | 39mph |
|
| Chrysler | Pacifica Hybrid 2019-21 | Adaptive Cruise | Stock | 0mph | 39mph |
|
||||||
| Genesis | G70 2018 | All | Stock | 0mph | 0mph |
|
| Genesis | G70 2018 | All | Stock | 0mph | 0mph |
|
||||||
| Genesis | G80 2018 | All | Stock | 0mph | 0mph |
|
| Genesis | G80 2018 | All | Stock | 0mph | 0mph |
|
||||||
| Genesis | G90 2018 | All | Stock | 0mph | 0mph |
|
| Genesis | G90 2018 | All | Stock | 0mph | 0mph |
|
||||||
|
@ -148,17 +152,18 @@ Community Maintained Cars and Features
|
||||||
| Hyundai | Ioniq Electric 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
| Hyundai | Ioniq Electric 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||||
| Hyundai | Kona 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
| Hyundai | Kona 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||||
| Hyundai | Kona EV 2019 | SCC + LKAS | Stock | 0mph | 0mph |
|
| Hyundai | Kona EV 2019 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||||
| Hyundai | Santa Fe 2019 | All | Stock | 0mph | 0mph |
|
| Hyundai | Santa Fe 2019-20 | All | Stock | 0mph | 0mph |
|
||||||
| Hyundai | Sonata 2019 | SCC + LKAS | Stock | 0mph | 0mph |
|
| Hyundai | Sonata 2018-2019 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||||
| Hyundai | Veloster 2019 | SCC + LKAS | Stock | 5mph | 0mph |
|
| Hyundai | Veloster 2019 | SCC + LKAS | Stock | 5mph | 0mph |
|
||||||
| Jeep | Grand Cherokee 2016-18 | Adaptive Cruise | Stock | 0mph | 9mph |
|
| Jeep | Grand Cherokee 2016-18 | Adaptive Cruise | Stock | 0mph | 9mph |
|
||||||
| Jeep | Grand Cherokee 2019-20 | Adaptive Cruise | Stock | 0mph | 39mph |
|
| Jeep | Grand Cherokee 2019-20 | Adaptive Cruise | Stock | 0mph | 39mph |
|
||||||
| Kia | Forte 2018-19 | SCC + LKAS | Stock | 0mph | 0mph |
|
| Kia | Forte 2018-19, 2021 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||||
| Kia | Niro EV 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
| Kia | Niro EV 2020 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||||
| Kia | Optima 2017 | SCC + LKAS | Stock | 0mph | 32mph |
|
| Kia | Optima 2017 | SCC + LKAS | Stock | 0mph | 32mph |
|
||||||
| Kia | Optima 2019 | SCC + LKAS | Stock | 0mph | 0mph |
|
| Kia | Optima 2019 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||||
| Kia | Sorento 2018 | SCC + LKAS | Stock | 0mph | 0mph |
|
| Kia | Sorento 2018 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||||
| Kia | Stinger 2018 | SCC + LKAS | Stock | 0mph | 0mph |
|
| Kia | Stinger 2018 | SCC + LKAS | Stock | 0mph | 0mph |
|
||||||
|
| Nissan | Altima 2020 | ProPILOT | Stock | 0mph | 0mph |
|
||||||
| Nissan | Leaf 2018-20 | ProPILOT | Stock | 0mph | 0mph |
|
| Nissan | Leaf 2018-20 | ProPILOT | Stock | 0mph | 0mph |
|
||||||
| Nissan | Rogue 2018-19 | ProPILOT | Stock | 0mph | 0mph |
|
| Nissan | Rogue 2018-19 | ProPILOT | Stock | 0mph | 0mph |
|
||||||
| Nissan | X-Trail 2017 | ProPILOT | Stock | 0mph | 0mph |
|
| Nissan | X-Trail 2017 | ProPILOT | Stock | 0mph | 0mph |
|
||||||
|
@ -263,7 +268,7 @@ By using openpilot, you agree to [our Privacy Policy](https://my.comma.ai/privac
|
||||||
Safety and Testing
|
Safety and Testing
|
||||||
----
|
----
|
||||||
|
|
||||||
* openpilot observes ISO26262 guidelines, see [SAFETY.md](SAFETY.md) for more detail.
|
* 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/test.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.
|
* 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).
|
* panda has software in the loop [safety tests](https://github.com/commaai/panda/tree/master/tests/safety).
|
||||||
|
@ -331,8 +336,6 @@ Directory Structure
|
||||||
├── test # Unit tests, system tests and a car simulator
|
├── test # Unit tests, system tests and a car simulator
|
||||||
└── ui # The UI
|
└── ui # The UI
|
||||||
|
|
||||||
To understand how the services interact, see `cereal/service_list.yaml`.
|
|
||||||
|
|
||||||
Licensing
|
Licensing
|
||||||
------
|
------
|
||||||
|
|
||||||
|
|
17
RELEASES.md
17
RELEASES.md
|
@ -1,3 +1,20 @@
|
||||||
|
Version 0.8.2 (2021-02-26)
|
||||||
|
========================
|
||||||
|
* Use model points directly in MPC (no more polyfits), making lateral planning more accurate
|
||||||
|
* Use model heading prediction for smoother lateral control
|
||||||
|
* Smarter actuator delay compensation
|
||||||
|
* Improve qcamera resolution for improved video in explorer and connect
|
||||||
|
* Adjust maximum engagement speed to better fit the model's training distribution
|
||||||
|
* New driver monitoring model trained with 3x more diverse data
|
||||||
|
* Improved face detection with masks
|
||||||
|
* More predictable DM alerts when visibility is bad
|
||||||
|
* Rewritten video streaming between openpilot processes
|
||||||
|
* Improved longitudinal tuning on TSS2 Corolla and Rav4 thanks to briskspirit!
|
||||||
|
* Audi A3 2015 and 2017 support thanks to keeleysam!
|
||||||
|
* Nissan Altima 2020 support thanks to avolmensky!
|
||||||
|
* Lexus ES Hybrid 2018 support thanks to TheInventorMan!
|
||||||
|
* Toyota Camry Hybrid 2021 support thanks to alancyau!
|
||||||
|
|
||||||
Version 0.8.1 (2020-12-21)
|
Version 0.8.1 (2020-12-21)
|
||||||
========================
|
========================
|
||||||
* Original EON is deprecated, upgrade to comma two
|
* Original EON is deprecated, upgrade to comma two
|
||||||
|
|
147
SConstruct
147
SConstruct
|
@ -17,6 +17,28 @@ AddOption('--asan',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
help='turn on ASAN')
|
help='turn on ASAN')
|
||||||
|
|
||||||
|
AddOption('--ubsan',
|
||||||
|
action='store_true',
|
||||||
|
help='turn on UBSan')
|
||||||
|
|
||||||
|
AddOption('--clazy',
|
||||||
|
action='store_true',
|
||||||
|
help='build with clazy')
|
||||||
|
|
||||||
|
AddOption('--compile_db',
|
||||||
|
action='store_true',
|
||||||
|
help='build clang compilation database')
|
||||||
|
|
||||||
|
AddOption('--mpc-generate',
|
||||||
|
action='store_true',
|
||||||
|
help='regenerates the mpc sources')
|
||||||
|
|
||||||
|
AddOption('--external-sconscript',
|
||||||
|
action='store',
|
||||||
|
metavar='FILE',
|
||||||
|
dest='external_sconscript',
|
||||||
|
help='add an external SConscript to the build')
|
||||||
|
|
||||||
real_arch = arch = subprocess.check_output(["uname", "-m"], encoding='utf8').rstrip()
|
real_arch = arch = subprocess.check_output(["uname", "-m"], encoding='utf8').rstrip()
|
||||||
if platform.system() == "Darwin":
|
if platform.system() == "Darwin":
|
||||||
arch = "Darwin"
|
arch = "Darwin"
|
||||||
|
@ -27,11 +49,12 @@ if arch == "aarch64" and TICI:
|
||||||
USE_WEBCAM = os.getenv("USE_WEBCAM") is not None
|
USE_WEBCAM = os.getenv("USE_WEBCAM") is not None
|
||||||
QCOM_REPLAY = arch == "aarch64" and os.getenv("QCOM_REPLAY") is not None
|
QCOM_REPLAY = arch == "aarch64" and os.getenv("QCOM_REPLAY") is not None
|
||||||
|
|
||||||
|
lenv = {
|
||||||
|
"PATH": os.environ['PATH'],
|
||||||
|
}
|
||||||
|
|
||||||
if arch == "aarch64" or arch == "larch64":
|
if arch == "aarch64" or arch == "larch64":
|
||||||
lenv = {
|
lenv["LD_LIBRARY_PATH"] = '/data/data/com.termux/files/usr/lib'
|
||||||
"LD_LIBRARY_PATH": '/data/data/com.termux/files/usr/lib',
|
|
||||||
"PATH": os.environ['PATH'],
|
|
||||||
}
|
|
||||||
|
|
||||||
if arch == "aarch64":
|
if arch == "aarch64":
|
||||||
# android
|
# android
|
||||||
|
@ -43,6 +66,7 @@ if arch == "aarch64" or arch == "larch64":
|
||||||
]
|
]
|
||||||
|
|
||||||
libpath = [
|
libpath = [
|
||||||
|
"/usr/local/lib",
|
||||||
"/usr/lib",
|
"/usr/lib",
|
||||||
"/system/vendor/lib64",
|
"/system/vendor/lib64",
|
||||||
"/system/comma/usr/lib",
|
"/system/comma/usr/lib",
|
||||||
|
@ -71,17 +95,10 @@ if arch == "aarch64" or arch == "larch64":
|
||||||
if QCOM_REPLAY:
|
if QCOM_REPLAY:
|
||||||
cflags += ["-DQCOM_REPLAY"]
|
cflags += ["-DQCOM_REPLAY"]
|
||||||
cxxflags += ["-DQCOM_REPLAY"]
|
cxxflags += ["-DQCOM_REPLAY"]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
cflags = []
|
cflags = []
|
||||||
cxxflags = []
|
cxxflags = []
|
||||||
|
cpppath = []
|
||||||
lenv = {
|
|
||||||
"PATH": "#external/bin:" + os.environ['PATH'],
|
|
||||||
}
|
|
||||||
cpppath = [
|
|
||||||
"#external/tensorflow/include",
|
|
||||||
]
|
|
||||||
|
|
||||||
if arch == "Darwin":
|
if arch == "Darwin":
|
||||||
libpath = [
|
libpath = [
|
||||||
|
@ -89,15 +106,16 @@ else:
|
||||||
"#cereal",
|
"#cereal",
|
||||||
"#selfdrive/common",
|
"#selfdrive/common",
|
||||||
"/usr/local/lib",
|
"/usr/local/lib",
|
||||||
|
"/usr/local/opt/openssl/lib",
|
||||||
"/System/Library/Frameworks/OpenGL.framework/Libraries",
|
"/System/Library/Frameworks/OpenGL.framework/Libraries",
|
||||||
]
|
]
|
||||||
cflags += ["-DGL_SILENCE_DEPRECATION"]
|
cflags += ["-DGL_SILENCE_DEPRECATION"]
|
||||||
cxxflags += ["-DGL_SILENCE_DEPRECATION"]
|
cxxflags += ["-DGL_SILENCE_DEPRECATION"]
|
||||||
|
cpppath += ["/usr/local/opt/openssl/include"]
|
||||||
else:
|
else:
|
||||||
libpath = [
|
libpath = [
|
||||||
"#phonelibs/snpe/x86_64-linux-clang",
|
"#phonelibs/snpe/x86_64-linux-clang",
|
||||||
"#phonelibs/libyuv/x64/lib",
|
"#phonelibs/libyuv/x64/lib",
|
||||||
"#external/tensorflow/lib",
|
|
||||||
"#cereal",
|
"#cereal",
|
||||||
"#selfdrive/common",
|
"#selfdrive/common",
|
||||||
"/usr/lib",
|
"/usr/lib",
|
||||||
|
@ -106,7 +124,6 @@ else:
|
||||||
|
|
||||||
rpath = [
|
rpath = [
|
||||||
"phonelibs/snpe/x86_64-linux-clang",
|
"phonelibs/snpe/x86_64-linux-clang",
|
||||||
"external/tensorflow/lib",
|
|
||||||
"cereal",
|
"cereal",
|
||||||
"selfdrive/common"
|
"selfdrive/common"
|
||||||
]
|
]
|
||||||
|
@ -115,11 +132,14 @@ else:
|
||||||
rpath = [os.path.join(os.getcwd(), x) for x in rpath]
|
rpath = [os.path.join(os.getcwd(), x) for x in rpath]
|
||||||
|
|
||||||
if GetOption('asan'):
|
if GetOption('asan'):
|
||||||
ccflags_asan = ["-fsanitize=address", "-fno-omit-frame-pointer"]
|
ccflags = ["-fsanitize=address", "-fno-omit-frame-pointer"]
|
||||||
ldflags_asan = ["-fsanitize=address"]
|
ldflags = ["-fsanitize=address"]
|
||||||
|
elif GetOption('ubsan'):
|
||||||
|
ccflags = ["-fsanitize=undefined"]
|
||||||
|
ldflags = ["-fsanitize=undefined"]
|
||||||
else:
|
else:
|
||||||
ccflags_asan = []
|
ccflags = []
|
||||||
ldflags_asan = []
|
ldflags = []
|
||||||
|
|
||||||
# change pythonpath to this
|
# change pythonpath to this
|
||||||
lenv["PYTHONPATH"] = Dir("#").path
|
lenv["PYTHONPATH"] = Dir("#").path
|
||||||
|
@ -138,11 +158,12 @@ env = Environment(
|
||||||
"-Wno-inconsistent-missing-override",
|
"-Wno-inconsistent-missing-override",
|
||||||
"-Wno-c99-designator",
|
"-Wno-c99-designator",
|
||||||
"-Wno-reorder-init-list",
|
"-Wno-reorder-init-list",
|
||||||
] + cflags + ccflags_asan,
|
] + cflags + ccflags,
|
||||||
|
|
||||||
CPPPATH=cpppath + [
|
CPPPATH=cpppath + [
|
||||||
"#",
|
"#",
|
||||||
"#selfdrive",
|
"#selfdrive",
|
||||||
|
"#phonelibs/catch2/include",
|
||||||
"#phonelibs/bzip2",
|
"#phonelibs/bzip2",
|
||||||
"#phonelibs/libyuv/include",
|
"#phonelibs/libyuv/include",
|
||||||
"#phonelibs/openmax/include",
|
"#phonelibs/openmax/include",
|
||||||
|
@ -155,6 +176,7 @@ env = Environment(
|
||||||
"#phonelibs/linux/include",
|
"#phonelibs/linux/include",
|
||||||
"#phonelibs/snpe/include",
|
"#phonelibs/snpe/include",
|
||||||
"#phonelibs/nanovg",
|
"#phonelibs/nanovg",
|
||||||
|
"#phonelibs/qrcode",
|
||||||
"#selfdrive/boardd",
|
"#selfdrive/boardd",
|
||||||
"#selfdrive/common",
|
"#selfdrive/common",
|
||||||
"#selfdrive/camerad",
|
"#selfdrive/camerad",
|
||||||
|
@ -163,14 +185,15 @@ env = Environment(
|
||||||
"#selfdrive/modeld",
|
"#selfdrive/modeld",
|
||||||
"#selfdrive/sensord",
|
"#selfdrive/sensord",
|
||||||
"#selfdrive/ui",
|
"#selfdrive/ui",
|
||||||
"#cereal/messaging",
|
|
||||||
"#cereal",
|
"#cereal",
|
||||||
|
"#cereal/messaging",
|
||||||
|
"#cereal/visionipc",
|
||||||
"#opendbc/can",
|
"#opendbc/can",
|
||||||
],
|
],
|
||||||
|
|
||||||
CC='clang',
|
CC='clang',
|
||||||
CXX='clang++',
|
CXX='clang++',
|
||||||
LINKFLAGS=ldflags_asan,
|
LINKFLAGS=ldflags,
|
||||||
|
|
||||||
RPATH=rpath,
|
RPATH=rpath,
|
||||||
|
|
||||||
|
@ -188,7 +211,7 @@ env = Environment(
|
||||||
tools=["default", "cython", "compilation_db"],
|
tools=["default", "cython", "compilation_db"],
|
||||||
)
|
)
|
||||||
|
|
||||||
if GetOption('test'):
|
if GetOption('compile_db'):
|
||||||
env.CompilationDatabase('compile_commands.json')
|
env.CompilationDatabase('compile_commands.json')
|
||||||
|
|
||||||
if os.environ.get('SCONS_CACHE'):
|
if os.environ.get('SCONS_CACHE'):
|
||||||
|
@ -239,6 +262,64 @@ else:
|
||||||
|
|
||||||
Export('envCython')
|
Export('envCython')
|
||||||
|
|
||||||
|
# Qt build environment
|
||||||
|
qt_env = None
|
||||||
|
if arch in ["x86_64", "Darwin", "larch64"]:
|
||||||
|
qt_env = env.Clone()
|
||||||
|
|
||||||
|
qt_modules = ["Widgets", "Gui", "Core", "DBus", "Multimedia", "Network", "Concurrent", "WebEngine", "WebEngineWidgets"]
|
||||||
|
|
||||||
|
qt_libs = []
|
||||||
|
if arch == "Darwin":
|
||||||
|
qt_env['QTDIR'] = "/usr/local/opt/qt"
|
||||||
|
QT_BASE = "/usr/local/opt/qt/"
|
||||||
|
qt_dirs = [
|
||||||
|
QT_BASE + "include/",
|
||||||
|
]
|
||||||
|
qt_dirs += [f"{QT_BASE}include/Qt{m}" for m in qt_modules]
|
||||||
|
qt_env["LINKFLAGS"] += ["-F" + QT_BASE + "lib"]
|
||||||
|
qt_env["FRAMEWORKS"] += [f"Qt{m}" for m in qt_modules] + ["OpenGL"]
|
||||||
|
else:
|
||||||
|
qt_env['QTDIR'] = "/usr"
|
||||||
|
qt_dirs = [
|
||||||
|
f"/usr/include/{real_arch}-linux-gnu/qt5",
|
||||||
|
f"/usr/include/{real_arch}-linux-gnu/qt5/QtGui/5.5.1/QtGui",
|
||||||
|
f"/usr/include/{real_arch}-linux-gnu/qt5/QtGui/5.12.8/QtGui",
|
||||||
|
]
|
||||||
|
qt_dirs += [f"/usr/include/{real_arch}-linux-gnu/qt5/Qt{m}" for m in qt_modules]
|
||||||
|
|
||||||
|
qt_libs = [f"Qt5{m}" for m in qt_modules]
|
||||||
|
if arch == "larch64":
|
||||||
|
qt_libs += ["GLESv2", "wayland-client"]
|
||||||
|
elif arch != "Darwin":
|
||||||
|
qt_libs += ["GL"]
|
||||||
|
|
||||||
|
qt_env.Tool('qt')
|
||||||
|
qt_env['CPPPATH'] += qt_dirs + ["#selfdrive/ui/qt/"]
|
||||||
|
qt_flags = [
|
||||||
|
"-D_REENTRANT",
|
||||||
|
"-DQT_NO_DEBUG",
|
||||||
|
"-DQT_WIDGETS_LIB",
|
||||||
|
"-DQT_GUI_LIB",
|
||||||
|
"-DQT_CORE_LIB"
|
||||||
|
]
|
||||||
|
qt_env['CXXFLAGS'] += qt_flags
|
||||||
|
qt_env['LIBPATH'] += ['#selfdrive/ui']
|
||||||
|
qt_env['LIBS'] = qt_libs
|
||||||
|
|
||||||
|
if GetOption("clazy"):
|
||||||
|
checks = [
|
||||||
|
"level0",
|
||||||
|
"level1",
|
||||||
|
"no-range-loop",
|
||||||
|
"no-non-pod-global-static",
|
||||||
|
]
|
||||||
|
qt_env['CXX'] = 'clazy'
|
||||||
|
qt_env['ENV']['CLAZY_IGNORE_DIRS'] = qt_dirs[0]
|
||||||
|
qt_env['ENV']['CLAZY_CHECKS'] = ','.join(checks)
|
||||||
|
Export('qt_env')
|
||||||
|
|
||||||
|
|
||||||
# still needed for apks
|
# still needed for apks
|
||||||
zmq = 'zmq'
|
zmq = 'zmq'
|
||||||
Export('env', 'arch', 'real_arch', 'zmq', 'SHARED', 'USE_WEBCAM', 'QCOM_REPLAY')
|
Export('env', 'arch', 'real_arch', 'zmq', 'SHARED', 'USE_WEBCAM', 'QCOM_REPLAY')
|
||||||
|
@ -251,26 +332,32 @@ if SHARED:
|
||||||
else:
|
else:
|
||||||
cereal = [File('#cereal/libcereal.a')]
|
cereal = [File('#cereal/libcereal.a')]
|
||||||
messaging = [File('#cereal/libmessaging.a')]
|
messaging = [File('#cereal/libmessaging.a')]
|
||||||
|
visionipc = [File('#cereal/libvisionipc.a')]
|
||||||
|
|
||||||
Export('cereal', 'messaging')
|
Export('cereal', 'messaging')
|
||||||
|
|
||||||
SConscript(['selfdrive/common/SConscript'])
|
SConscript(['selfdrive/common/SConscript'])
|
||||||
Import('_common', '_visionipc', '_gpucommon', '_gpu_libs')
|
Import('_common', '_gpucommon', '_gpu_libs')
|
||||||
|
|
||||||
if SHARED:
|
if SHARED:
|
||||||
common, visionipc, gpucommon = abspath(common), abspath(visionipc), abspath(gpucommon)
|
common, gpucommon = abspath(common), abspath(gpucommon)
|
||||||
else:
|
else:
|
||||||
common = [_common, 'json11']
|
common = [_common, 'json11']
|
||||||
visionipc = _visionipc
|
|
||||||
gpucommon = [_gpucommon] + _gpu_libs
|
gpucommon = [_gpucommon] + _gpu_libs
|
||||||
|
|
||||||
Export('common', 'visionipc', 'gpucommon')
|
Export('common', 'gpucommon', 'visionipc')
|
||||||
|
|
||||||
|
|
||||||
|
# Build openpilot
|
||||||
|
|
||||||
|
SConscript(['cereal/SConscript'])
|
||||||
SConscript(['opendbc/can/SConscript'])
|
SConscript(['opendbc/can/SConscript'])
|
||||||
|
|
||||||
|
SConscript(['phonelibs/SConscript'])
|
||||||
|
|
||||||
SConscript(['common/SConscript'])
|
SConscript(['common/SConscript'])
|
||||||
SConscript(['common/kalman/SConscript'])
|
SConscript(['common/kalman/SConscript'])
|
||||||
SConscript(['common/transformations/SConscript'])
|
SConscript(['common/transformations/SConscript'])
|
||||||
SConscript(['phonelibs/SConscript'])
|
|
||||||
|
|
||||||
SConscript(['selfdrive/camerad/SConscript'])
|
SConscript(['selfdrive/camerad/SConscript'])
|
||||||
SConscript(['selfdrive/modeld/SConscript'])
|
SConscript(['selfdrive/modeld/SConscript'])
|
||||||
|
@ -294,6 +381,10 @@ SConscript(['selfdrive/ui/SConscript'])
|
||||||
if arch != "Darwin":
|
if arch != "Darwin":
|
||||||
SConscript(['selfdrive/logcatd/SConscript'])
|
SConscript(['selfdrive/logcatd/SConscript'])
|
||||||
|
|
||||||
if arch == "x86_64":
|
if real_arch == "x86_64":
|
||||||
|
SConscript(['tools/nui/SConscript'])
|
||||||
SConscript(['tools/lib/index_log/SConscript'])
|
SConscript(['tools/lib/index_log/SConscript'])
|
||||||
|
|
||||||
|
external_sconscript = GetOption('external_sconscript')
|
||||||
|
if external_sconscript:
|
||||||
|
SConscript([external_sconscript])
|
||||||
|
|
Binary file not shown.
|
@ -6,10 +6,16 @@ package-lock.json
|
||||||
__pycache__
|
__pycache__
|
||||||
.*.swp
|
.*.swp
|
||||||
.*.swo
|
.*.swo
|
||||||
libcereal*.a
|
*.os
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
|
||||||
|
test_runner
|
||||||
|
|
||||||
libmessaging.*
|
libmessaging.*
|
||||||
libmessaging_shared.*
|
libmessaging_shared.*
|
||||||
services.h
|
services.h
|
||||||
.sconsign.dblite
|
.sconsign.dblite
|
||||||
libcereal_shared.*
|
libcereal_shared.*
|
||||||
.mypy_cache/
|
.mypy_cache/
|
||||||
|
catch2/
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
Import('env', 'envCython', 'arch', 'zmq')
|
Import('env', 'envCython', 'arch', 'zmq', 'QCOM_REPLAY')
|
||||||
|
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
|
@ -6,30 +6,28 @@ cereal_dir = Dir('.')
|
||||||
gen_dir = Dir('gen')
|
gen_dir = Dir('gen')
|
||||||
messaging_dir = Dir('messaging')
|
messaging_dir = Dir('messaging')
|
||||||
|
|
||||||
# TODO: remove src-prefix and cereal from command string. can we set working directory?
|
# Build cereal
|
||||||
|
|
||||||
|
schema_files = ['log.capnp', 'car.capnp', 'legacy.capnp']
|
||||||
env.Command(["gen/c/include/c++.capnp.h", "gen/c/include/java.capnp.h"], [], "mkdir -p " + gen_dir.path + "/c/include && touch $TARGETS")
|
env.Command(["gen/c/include/c++.capnp.h", "gen/c/include/java.capnp.h"], [], "mkdir -p " + gen_dir.path + "/c/include && touch $TARGETS")
|
||||||
env.Command(['gen/cpp/car.capnp.c++', 'gen/cpp/log.capnp.c++', 'gen/cpp/car.capnp.h', 'gen/cpp/log.capnp.h'],
|
env.Command([f'gen/cpp/{s}.c++' for s in schema_files] + [f'gen/cpp/{s}.h' for s in schema_files],
|
||||||
['car.capnp', 'log.capnp'],
|
schema_files,
|
||||||
f"capnpc --src-prefix={cereal_dir.path} $SOURCES -o c++:{gen_dir.path}/cpp/")
|
f"capnpc --src-prefix={cereal_dir.path} $SOURCES -o c++:{gen_dir.path}/cpp/")
|
||||||
|
|
||||||
if shutil.which('capnpc-java'):
|
if shutil.which('capnpc-java'):
|
||||||
env.Command(['gen/java/Car.java', 'gen/java/Log.java'],
|
env.Command(['gen/java/Car.java', 'gen/java/Log.java'],
|
||||||
['car.capnp', 'log.capnp'],
|
schema_files,
|
||||||
f"capnpc $SOURCES --src-prefix={cereal_dir.path} -o java:{gen_dir.path}/java/")
|
f"capnpc $SOURCES --src-prefix={cereal_dir.path} -o java:{gen_dir.path}/java/")
|
||||||
|
|
||||||
# TODO: remove non shared cereal and messaging
|
# TODO: remove non shared cereal and messaging
|
||||||
cereal_objects = env.SharedObject([
|
cereal_objects = env.SharedObject([f'gen/cpp/{s}.c++' for s in schema_files])
|
||||||
'gen/cpp/car.capnp.c++',
|
|
||||||
'gen/cpp/log.capnp.c++',
|
|
||||||
])
|
|
||||||
|
|
||||||
env.Library('cereal', cereal_objects)
|
env.Library('cereal', cereal_objects)
|
||||||
env.SharedLibrary('cereal_shared', cereal_objects)
|
env.SharedLibrary('cereal_shared', cereal_objects)
|
||||||
|
|
||||||
cereal_dir = Dir('.')
|
# Build messaging
|
||||||
services_h = env.Command(['services.h'],
|
|
||||||
['service_list.yaml', 'services.py'],
|
services_h = env.Command(['services.h'], ['services.py'], 'python3 ' + cereal_dir.path + '/services.py > $TARGET')
|
||||||
'python3 ' + cereal_dir.path + '/services.py > $TARGET')
|
|
||||||
|
|
||||||
messaging_objects = env.SharedObject([
|
messaging_objects = env.SharedObject([
|
||||||
'messaging/messaging.cc',
|
'messaging/messaging.cc',
|
||||||
|
@ -52,10 +50,33 @@ if arch == "aarch64":
|
||||||
env.Program('messaging/bridge', ['messaging/bridge.cc'], LIBS=[messaging_lib, 'zmq'])
|
env.Program('messaging/bridge', ['messaging/bridge.cc'], LIBS=[messaging_lib, 'zmq'])
|
||||||
Depends('messaging/bridge.cc', services_h)
|
Depends('messaging/bridge.cc', services_h)
|
||||||
|
|
||||||
# different target?
|
|
||||||
#env.Program('messaging/demo', ['messaging/demo.cc'], LIBS=[messaging_lib, 'zmq'])
|
|
||||||
|
|
||||||
envCython.Program('messaging/messaging_pyx.so', 'messaging/messaging_pyx.pyx', LIBS=envCython["LIBS"]+[messaging_lib, "zmq"])
|
envCython.Program('messaging/messaging_pyx.so', 'messaging/messaging_pyx.pyx', LIBS=envCython["LIBS"]+[messaging_lib, "zmq"])
|
||||||
|
|
||||||
|
|
||||||
|
# Build Vision IPC
|
||||||
|
vipc_sources = [
|
||||||
|
'visionipc/ipc.cc',
|
||||||
|
'visionipc/visionipc_server.cc',
|
||||||
|
'visionipc/visionipc_client.cc',
|
||||||
|
'visionipc/visionbuf.cc',
|
||||||
|
]
|
||||||
|
|
||||||
|
if arch in ["aarch64", "larch64"] and (not QCOM_REPLAY):
|
||||||
|
vipc_sources += ['visionipc/visionbuf_ion.cc']
|
||||||
|
else:
|
||||||
|
vipc_sources += ['visionipc/visionbuf_cl.cc']
|
||||||
|
|
||||||
|
vipc_objects = env.SharedObject(vipc_sources)
|
||||||
|
vipc = env.Library('visionipc', vipc_objects)
|
||||||
|
|
||||||
|
|
||||||
|
libs = envCython["LIBS"]+["OpenCL", "zmq", vipc, messaging_lib]
|
||||||
|
if arch == "Darwin":
|
||||||
|
del libs[libs.index('OpenCL')]
|
||||||
|
envCython['FRAMEWORKS'] += ['OpenCL']
|
||||||
|
envCython.Program('visionipc/visionipc_pyx.so', 'visionipc/visionipc_pyx.pyx', LIBS=libs)
|
||||||
|
|
||||||
|
|
||||||
if GetOption('test'):
|
if GetOption('test'):
|
||||||
env.Program('messaging/test_runner', ['messaging/test_runner.cc', 'messaging/msgq_tests.cc'], LIBS=[messaging_lib])
|
env.Program('messaging/test_runner', ['messaging/test_runner.cc', 'messaging/msgq_tests.cc'], LIBS=[messaging_lib])
|
||||||
|
env.Program('visionipc/test_runner', ['visionipc/test_runner.cc', 'visionipc/visionipc_tests.cc'], LIBS=[vipc, messaging_lib, 'zmq', 'pthread', 'OpenCL'])
|
||||||
|
|
|
@ -11,6 +11,8 @@ $Java.outerClassname("Car");
|
||||||
|
|
||||||
struct CarEvent @0x9b1657f34caf3ad3 {
|
struct CarEvent @0x9b1657f34caf3ad3 {
|
||||||
name @0 :EventName;
|
name @0 :EventName;
|
||||||
|
|
||||||
|
# event types
|
||||||
enable @1 :Bool;
|
enable @1 :Bool;
|
||||||
noEntry @2 :Bool;
|
noEntry @2 :Bool;
|
||||||
warning @3 :Bool; # alerts presented only when enabled or soft disabling
|
warning @3 :Bool; # alerts presented only when enabled or soft disabling
|
||||||
|
@ -21,7 +23,6 @@ struct CarEvent @0x9b1657f34caf3ad3 {
|
||||||
permanent @8 :Bool; # alerts presented regardless of openpilot state
|
permanent @8 :Bool; # alerts presented regardless of openpilot state
|
||||||
|
|
||||||
enum EventName @0xbaa8c5d505f727de {
|
enum EventName @0xbaa8c5d505f727de {
|
||||||
# TODO: copy from error list
|
|
||||||
canError @0;
|
canError @0;
|
||||||
steerUnavailable @1;
|
steerUnavailable @1;
|
||||||
brakeUnavailable @2;
|
brakeUnavailable @2;
|
||||||
|
@ -36,7 +37,6 @@ struct CarEvent @0x9b1657f34caf3ad3 {
|
||||||
buttonEnable @12;
|
buttonEnable @12;
|
||||||
pedalPressed @13;
|
pedalPressed @13;
|
||||||
cruiseDisabled @14;
|
cruiseDisabled @14;
|
||||||
radarCanError @15;
|
|
||||||
speedTooLow @17;
|
speedTooLow @17;
|
||||||
outOfSpace @18;
|
outOfSpace @18;
|
||||||
overheat @19;
|
overheat @19;
|
||||||
|
@ -73,13 +73,11 @@ struct CarEvent @0x9b1657f34caf3ad3 {
|
||||||
preLaneChangeLeft @57;
|
preLaneChangeLeft @57;
|
||||||
preLaneChangeRight @58;
|
preLaneChangeRight @58;
|
||||||
laneChange @59;
|
laneChange @59;
|
||||||
internetConnectivityNeeded @61;
|
|
||||||
communityFeatureDisallowed @62;
|
communityFeatureDisallowed @62;
|
||||||
lowMemory @63;
|
lowMemory @63;
|
||||||
stockAeb @64;
|
stockAeb @64;
|
||||||
ldw @65;
|
ldw @65;
|
||||||
carUnrecognized @66;
|
carUnrecognized @66;
|
||||||
radarCommIssue @67;
|
|
||||||
driverMonitorLowAcc @68;
|
driverMonitorLowAcc @68;
|
||||||
invalidLkasSetting @69;
|
invalidLkasSetting @69;
|
||||||
speedTooHigh @70;
|
speedTooHigh @70;
|
||||||
|
@ -100,9 +98,12 @@ struct CarEvent @0x9b1657f34caf3ad3 {
|
||||||
deviceFalling @90;
|
deviceFalling @90;
|
||||||
fanMalfunction @91;
|
fanMalfunction @91;
|
||||||
cameraMalfunction @92;
|
cameraMalfunction @92;
|
||||||
|
gpsMalfunction @94;
|
||||||
startupOneplus @82;
|
startupOneplus @82;
|
||||||
|
processNotRunning @95;
|
||||||
|
|
||||||
|
radarCanErrorDEPRECATED @15;
|
||||||
|
radarCommIssueDEPRECATED @67;
|
||||||
gasUnavailableDEPRECATED @3;
|
gasUnavailableDEPRECATED @3;
|
||||||
dataNeededDEPRECATED @16;
|
dataNeededDEPRECATED @16;
|
||||||
modelCommIssueDEPRECATED @27;
|
modelCommIssueDEPRECATED @27;
|
||||||
|
@ -113,6 +114,7 @@ struct CarEvent @0x9b1657f34caf3ad3 {
|
||||||
calibrationProgressDEPRECATED @47;
|
calibrationProgressDEPRECATED @47;
|
||||||
invalidGiraffeHondaDEPRECATED @49;
|
invalidGiraffeHondaDEPRECATED @49;
|
||||||
invalidGiraffeToyotaDEPRECATED @60;
|
invalidGiraffeToyotaDEPRECATED @60;
|
||||||
|
internetConnectivityNeededDEPRECATED @61;
|
||||||
whitePandaUnsupportedDEPRECATED @81;
|
whitePandaUnsupportedDEPRECATED @81;
|
||||||
commIssueWarningDEPRECATED @83;
|
commIssueWarningDEPRECATED @83;
|
||||||
focusRecoverActiveDEPRECATED @86;
|
focusRecoverActiveDEPRECATED @86;
|
||||||
|
@ -125,7 +127,6 @@ struct CarEvent @0x9b1657f34caf3ad3 {
|
||||||
# all speeds in m/s
|
# all speeds in m/s
|
||||||
|
|
||||||
struct CarState {
|
struct CarState {
|
||||||
errorsDEPRECATED @0 :List(CarEvent.EventName);
|
|
||||||
events @13 :List(CarEvent);
|
events @13 :List(CarEvent);
|
||||||
|
|
||||||
# car speed
|
# car speed
|
||||||
|
@ -146,8 +147,8 @@ struct CarState {
|
||||||
brakeLights @19 :Bool;
|
brakeLights @19 :Bool;
|
||||||
|
|
||||||
# steering wheel
|
# steering wheel
|
||||||
steeringAngle @7 :Float32; # deg
|
steeringAngleDeg @7 :Float32;
|
||||||
steeringRate @15 :Float32; # deg/s
|
steeringRateDeg @15 :Float32;
|
||||||
steeringTorque @8 :Float32; # TODO: standardize units
|
steeringTorque @8 :Float32; # TODO: standardize units
|
||||||
steeringTorqueEps @27 :Float32; # TODO: standardize units
|
steeringTorqueEps @27 :Float32; # TODO: standardize units
|
||||||
steeringPressed @9 :Bool; # if the user is using the steering wheel
|
steeringPressed @9 :Bool; # if the user is using the steering wheel
|
||||||
|
@ -235,6 +236,8 @@ struct CarState {
|
||||||
gapAdjustCruise @11;
|
gapAdjustCruise @11;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errorsDEPRECATED @0 :List(CarEvent.EventName);
|
||||||
}
|
}
|
||||||
|
|
||||||
# ******* radar state @ 20hz *******
|
# ******* radar state @ 20hz *******
|
||||||
|
@ -278,10 +281,6 @@ struct CarControl {
|
||||||
enabled @0 :Bool;
|
enabled @0 :Bool;
|
||||||
active @7 :Bool;
|
active @7 :Bool;
|
||||||
|
|
||||||
gasDEPRECATED @1 :Float32;
|
|
||||||
brakeDEPRECATED @2 :Float32;
|
|
||||||
steeringTorqueDEPRECATED @3 :Float32;
|
|
||||||
|
|
||||||
actuators @6 :Actuators;
|
actuators @6 :Actuators;
|
||||||
|
|
||||||
cruiseControl @4 :CruiseControl;
|
cruiseControl @4 :CruiseControl;
|
||||||
|
@ -293,7 +292,7 @@ struct CarControl {
|
||||||
brake @1: Float32;
|
brake @1: Float32;
|
||||||
# range from -1.0 - 1.0
|
# range from -1.0 - 1.0
|
||||||
steer @2: Float32;
|
steer @2: Float32;
|
||||||
steerAngle @3: Float32;
|
steeringAngleDeg @3: Float32;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CruiseControl {
|
struct CruiseControl {
|
||||||
|
@ -329,8 +328,6 @@ struct CarControl {
|
||||||
}
|
}
|
||||||
|
|
||||||
enum AudibleAlert {
|
enum AudibleAlert {
|
||||||
# these are the choices from the Honda
|
|
||||||
# map as good as you can for your car
|
|
||||||
none @0;
|
none @0;
|
||||||
chimeEngage @1;
|
chimeEngage @1;
|
||||||
chimeDisengage @2;
|
chimeDisengage @2;
|
||||||
|
@ -342,6 +339,10 @@ struct CarControl {
|
||||||
chimeWarning2Repeat @8;
|
chimeWarning2Repeat @8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gasDEPRECATED @1 :Float32;
|
||||||
|
brakeDEPRECATED @2 :Float32;
|
||||||
|
steeringTorqueDEPRECATED @3 :Float32;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ****** car param ******
|
# ****** car param ******
|
||||||
|
@ -358,6 +359,7 @@ struct CarParams {
|
||||||
|
|
||||||
minEnableSpeed @7 :Float32;
|
minEnableSpeed @7 :Float32;
|
||||||
minSteerSpeed @8 :Float32;
|
minSteerSpeed @8 :Float32;
|
||||||
|
maxSteeringAngleDeg @54 :Float32;
|
||||||
safetyModel @9 :SafetyModel;
|
safetyModel @9 :SafetyModel;
|
||||||
safetyModelPassive @42 :SafetyModel = silent;
|
safetyModelPassive @42 :SafetyModel = silent;
|
||||||
safetyParam @10 :Int16;
|
safetyParam @10 :Int16;
|
||||||
|
@ -406,7 +408,6 @@ struct CarParams {
|
||||||
steerActuatorDelay @36 :Float32; # Steering wheel actuator delay in seconds
|
steerActuatorDelay @36 :Float32; # Steering wheel actuator delay in seconds
|
||||||
openpilotLongitudinalControl @37 :Bool; # is openpilot doing the longitudinal control?
|
openpilotLongitudinalControl @37 :Bool; # is openpilot doing the longitudinal control?
|
||||||
carVin @38 :Text; # VIN number queried during fingerprinting
|
carVin @38 :Text; # VIN number queried during fingerprinting
|
||||||
isPandaBlack @39: Bool;
|
|
||||||
dashcamOnly @41: Bool;
|
dashcamOnly @41: Bool;
|
||||||
transmissionType @43 :TransmissionType;
|
transmissionType @43 :TransmissionType;
|
||||||
carFw @44 :List(CarFw);
|
carFw @44 :List(CarFw);
|
||||||
|
@ -438,10 +439,19 @@ struct CarParams {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LateralINDITuning {
|
struct LateralINDITuning {
|
||||||
outerLoopGain @0 :Float32;
|
outerLoopGainBP @4 :List(Float32);
|
||||||
innerLoopGain @1 :Float32;
|
outerLoopGainV @5 :List(Float32);
|
||||||
timeConstant @2 :Float32;
|
innerLoopGainBP @6 :List(Float32);
|
||||||
actuatorEffectiveness @3 :Float32;
|
innerLoopGainV @7 :List(Float32);
|
||||||
|
timeConstantBP @8 :List(Float32);
|
||||||
|
timeConstantV @9 :List(Float32);
|
||||||
|
actuatorEffectivenessBP @10 :List(Float32);
|
||||||
|
actuatorEffectivenessV @11 :List(Float32);
|
||||||
|
|
||||||
|
outerLoopGainDEPRECATED @0 :Float32;
|
||||||
|
innerLoopGainDEPRECATED @1 :Float32;
|
||||||
|
timeConstantDEPRECATED @2 :Float32;
|
||||||
|
actuatorEffectivenessDEPRECATED @3 :Float32;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LateralLQRTuning {
|
struct LateralLQRTuning {
|
||||||
|
@ -539,4 +549,6 @@ struct CarParams {
|
||||||
fwdCamera @0; # Standard/default integration at LKAS camera
|
fwdCamera @0; # Standard/default integration at LKAS camera
|
||||||
gateway @1; # Integration at vehicle's CAN gateway
|
gateway @1; # Integration at vehicle's CAN gateway
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isPandaBlackDEPRECATED @39: Bool;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,850 @@
|
||||||
|
using Cxx = import "./include/c++.capnp";
|
||||||
|
$Cxx.namespace("cereal");
|
||||||
|
|
||||||
|
using Java = import "./include/java.capnp";
|
||||||
|
$Java.package("ai.comma.openpilot.cereal");
|
||||||
|
$Java.outerClassname("Legacy");
|
||||||
|
|
||||||
|
@0x80ef1ec4889c2a63;
|
||||||
|
|
||||||
|
# legacy.capnp: a home for deprecated structs
|
||||||
|
|
||||||
|
struct LogRotate @0x9811e1f38f62f2d1 {
|
||||||
|
segmentNum @0 :Int32;
|
||||||
|
path @1 :Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LiveUI @0xc08240f996aefced {
|
||||||
|
rearViewCam @0 :Bool;
|
||||||
|
alertText1 @1 :Text;
|
||||||
|
alertText2 @2 :Text;
|
||||||
|
awarenessStatus @3 :Float32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OrbslamCorrection @0x8afd33dc9b35e1aa {
|
||||||
|
correctionMonoTime @0 :UInt64;
|
||||||
|
prePositionECEF @1 :List(Float64);
|
||||||
|
postPositionECEF @2 :List(Float64);
|
||||||
|
prePoseQuatECEF @3 :List(Float32);
|
||||||
|
postPoseQuatECEF @4 :List(Float32);
|
||||||
|
numInliers @5 :UInt32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct EthernetPacket @0xa99a9d5b33cf5859 {
|
||||||
|
pkt @0 :Data;
|
||||||
|
ts @1 :Float32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CellInfo @0xcff7566681c277ce {
|
||||||
|
timestamp @0 :UInt64;
|
||||||
|
repr @1 :Text; # android toString() for now
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WifiScan @0xd4df5a192382ba0b {
|
||||||
|
bssid @0 :Text;
|
||||||
|
ssid @1 :Text;
|
||||||
|
capabilities @2 :Text;
|
||||||
|
frequency @3 :Int32;
|
||||||
|
level @4 :Int32;
|
||||||
|
timestamp @5 :Int64;
|
||||||
|
|
||||||
|
centerFreq0 @6 :Int32;
|
||||||
|
centerFreq1 @7 :Int32;
|
||||||
|
channelWidth @8 :ChannelWidth;
|
||||||
|
operatorFriendlyName @9 :Text;
|
||||||
|
venueName @10 :Text;
|
||||||
|
is80211mcResponder @11 :Bool;
|
||||||
|
passpoint @12 :Bool;
|
||||||
|
|
||||||
|
distanceCm @13 :Int32;
|
||||||
|
distanceSdCm @14 :Int32;
|
||||||
|
|
||||||
|
enum ChannelWidth @0xcb6a279f015f6b51 {
|
||||||
|
w20Mhz @0;
|
||||||
|
w40Mhz @1;
|
||||||
|
w80Mhz @2;
|
||||||
|
w160Mhz @3;
|
||||||
|
w80Plus80Mhz @4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LiveEventData @0x94b7baa90c5c321e {
|
||||||
|
name @0 :Text;
|
||||||
|
value @1 :Int32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ModelData @0xb8aad62cffef28a9 {
|
||||||
|
frameId @0 :UInt32;
|
||||||
|
frameAge @12 :UInt32;
|
||||||
|
frameDropPerc @13 :Float32;
|
||||||
|
timestampEof @9 :UInt64;
|
||||||
|
modelExecutionTime @14 :Float32;
|
||||||
|
gpuExecutionTime @16 :Float32;
|
||||||
|
rawPred @15 :Data;
|
||||||
|
|
||||||
|
path @1 :PathData;
|
||||||
|
leftLane @2 :PathData;
|
||||||
|
rightLane @3 :PathData;
|
||||||
|
lead @4 :LeadData;
|
||||||
|
freePath @6 :List(Float32);
|
||||||
|
|
||||||
|
settings @5 :ModelSettings;
|
||||||
|
leadFuture @7 :LeadData;
|
||||||
|
speed @8 :List(Float32);
|
||||||
|
meta @10 :MetaData;
|
||||||
|
longitudinal @11 :LongitudinalData;
|
||||||
|
|
||||||
|
struct PathData @0x8817eeea389e9f08 {
|
||||||
|
points @0 :List(Float32);
|
||||||
|
prob @1 :Float32;
|
||||||
|
std @2 :Float32;
|
||||||
|
stds @3 :List(Float32);
|
||||||
|
poly @4 :List(Float32);
|
||||||
|
validLen @5 :Float32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LeadData @0xd1c9bef96d26fa91 {
|
||||||
|
dist @0 :Float32;
|
||||||
|
prob @1 :Float32;
|
||||||
|
std @2 :Float32;
|
||||||
|
relVel @3 :Float32;
|
||||||
|
relVelStd @4 :Float32;
|
||||||
|
relY @5 :Float32;
|
||||||
|
relYStd @6 :Float32;
|
||||||
|
relA @7 :Float32;
|
||||||
|
relAStd @8 :Float32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ModelSettings @0xa26e3710efd3e914 {
|
||||||
|
bigBoxX @0 :UInt16;
|
||||||
|
bigBoxY @1 :UInt16;
|
||||||
|
bigBoxWidth @2 :UInt16;
|
||||||
|
bigBoxHeight @3 :UInt16;
|
||||||
|
boxProjection @4 :List(Float32);
|
||||||
|
yuvCorrection @5 :List(Float32);
|
||||||
|
inputTransform @6 :List(Float32);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MetaData @0x9744f25fb60f2bf8 {
|
||||||
|
engagedProb @0 :Float32;
|
||||||
|
desirePrediction @1 :List(Float32);
|
||||||
|
brakeDisengageProb @2 :Float32;
|
||||||
|
gasDisengageProb @3 :Float32;
|
||||||
|
steerOverrideProb @4 :Float32;
|
||||||
|
desireState @5 :List(Float32);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LongitudinalData @0xf98f999c6a071122 {
|
||||||
|
distances @2 :List(Float32);
|
||||||
|
speeds @0 :List(Float32);
|
||||||
|
accelerations @1 :List(Float32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ECEFPoint @0xc25bbbd524983447 {
|
||||||
|
x @0 :Float64;
|
||||||
|
y @1 :Float64;
|
||||||
|
z @2 :Float64;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ECEFPointDEPRECATED @0xe10e21168db0c7f7 {
|
||||||
|
x @0 :Float32;
|
||||||
|
y @1 :Float32;
|
||||||
|
z @2 :Float32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct GPSPlannerPoints @0xab54c59699f8f9f3 {
|
||||||
|
curPosDEPRECATED @0 :ECEFPointDEPRECATED;
|
||||||
|
pointsDEPRECATED @1 :List(ECEFPointDEPRECATED);
|
||||||
|
curPos @6 :ECEFPoint;
|
||||||
|
points @7 :List(ECEFPoint);
|
||||||
|
valid @2 :Bool;
|
||||||
|
trackName @3 :Text;
|
||||||
|
speedLimit @4 :Float32;
|
||||||
|
accelTarget @5 :Float32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct GPSPlannerPlan @0xf5ad1d90cdc1dd6b {
|
||||||
|
valid @0 :Bool;
|
||||||
|
poly @1 :List(Float32);
|
||||||
|
trackName @2 :Text;
|
||||||
|
speed @3 :Float32;
|
||||||
|
acceleration @4 :Float32;
|
||||||
|
pointsDEPRECATED @5 :List(ECEFPointDEPRECATED);
|
||||||
|
points @6 :List(ECEFPoint);
|
||||||
|
xLookahead @7 :Float32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct UiNavigationEvent @0x90c8426c3eaddd3b {
|
||||||
|
type @0: Type;
|
||||||
|
status @1: Status;
|
||||||
|
distanceTo @2: Float32;
|
||||||
|
endRoadPointDEPRECATED @3: ECEFPointDEPRECATED;
|
||||||
|
endRoadPoint @4: ECEFPoint;
|
||||||
|
|
||||||
|
enum Type @0xe8db07dcf8fcea05 {
|
||||||
|
none @0;
|
||||||
|
laneChangeLeft @1;
|
||||||
|
laneChangeRight @2;
|
||||||
|
mergeLeft @3;
|
||||||
|
mergeRight @4;
|
||||||
|
turnLeft @5;
|
||||||
|
turnRight @6;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Status @0xb9aa88c75ef99a1f {
|
||||||
|
none @0;
|
||||||
|
passive @1;
|
||||||
|
approaching @2;
|
||||||
|
active @3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LiveLocationData @0xb99b2bc7a57e8128 {
|
||||||
|
status @0 :UInt8;
|
||||||
|
|
||||||
|
# 3D fix
|
||||||
|
lat @1 :Float64;
|
||||||
|
lon @2 :Float64;
|
||||||
|
alt @3 :Float32; # m
|
||||||
|
|
||||||
|
# speed
|
||||||
|
speed @4 :Float32; # m/s
|
||||||
|
|
||||||
|
# NED velocity components
|
||||||
|
vNED @5 :List(Float32);
|
||||||
|
|
||||||
|
# roll, pitch, heading (x,y,z)
|
||||||
|
roll @6 :Float32; # WRT to center of earth?
|
||||||
|
pitch @7 :Float32; # WRT to center of earth?
|
||||||
|
heading @8 :Float32; # WRT to north?
|
||||||
|
|
||||||
|
# what are these?
|
||||||
|
wanderAngle @9 :Float32;
|
||||||
|
trackAngle @10 :Float32;
|
||||||
|
|
||||||
|
# car frame -- https://upload.wikimedia.org/wikipedia/commons/f/f5/RPY_angles_of_cars.png
|
||||||
|
|
||||||
|
# gyro, in car frame, deg/s
|
||||||
|
gyro @11 :List(Float32);
|
||||||
|
|
||||||
|
# accel, in car frame, m/s^2
|
||||||
|
accel @12 :List(Float32);
|
||||||
|
|
||||||
|
accuracy @13 :Accuracy;
|
||||||
|
|
||||||
|
source @14 :SensorSource;
|
||||||
|
# if we are fixing a location in the past
|
||||||
|
fixMonoTime @15 :UInt64;
|
||||||
|
|
||||||
|
gpsWeek @16 :Int32;
|
||||||
|
timeOfWeek @17 :Float64;
|
||||||
|
|
||||||
|
positionECEF @18 :List(Float64);
|
||||||
|
poseQuatECEF @19 :List(Float32);
|
||||||
|
pitchCalibration @20 :Float32;
|
||||||
|
yawCalibration @21 :Float32;
|
||||||
|
imuFrame @22 :List(Float32);
|
||||||
|
|
||||||
|
struct Accuracy @0x943dc4625473b03f {
|
||||||
|
pNEDError @0 :List(Float32);
|
||||||
|
vNEDError @1 :List(Float32);
|
||||||
|
rollError @2 :Float32;
|
||||||
|
pitchError @3 :Float32;
|
||||||
|
headingError @4 :Float32;
|
||||||
|
ellipsoidSemiMajorError @5 :Float32;
|
||||||
|
ellipsoidSemiMinorError @6 :Float32;
|
||||||
|
ellipsoidOrientationError @7 :Float32;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum SensorSource @0xc871d3cc252af657 {
|
||||||
|
applanix @0;
|
||||||
|
kalman @1;
|
||||||
|
orbslam @2;
|
||||||
|
timing @3;
|
||||||
|
dummy @4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OrbOdometry @0xd7700859ed1f5b76 {
|
||||||
|
# timing first
|
||||||
|
startMonoTime @0 :UInt64;
|
||||||
|
endMonoTime @1 :UInt64;
|
||||||
|
|
||||||
|
# fundamental matrix and error
|
||||||
|
f @2: List(Float64);
|
||||||
|
err @3: Float64;
|
||||||
|
|
||||||
|
# number of inlier points
|
||||||
|
inliers @4: Int32;
|
||||||
|
|
||||||
|
# for debug only
|
||||||
|
# indexed by endMonoTime features
|
||||||
|
# value is startMonoTime feature match
|
||||||
|
# -1 if no match
|
||||||
|
matches @5: List(Int16);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OrbFeatures @0xcd60164a8a0159ef {
|
||||||
|
timestampEof @0 :UInt64;
|
||||||
|
# transposed arrays of normalized image coordinates
|
||||||
|
# len(xs) == len(ys) == len(descriptors) * 32
|
||||||
|
xs @1 :List(Float32);
|
||||||
|
ys @2 :List(Float32);
|
||||||
|
descriptors @3 :Data;
|
||||||
|
octaves @4 :List(Int8);
|
||||||
|
|
||||||
|
# match index to last OrbFeatures
|
||||||
|
# -1 if no match
|
||||||
|
timestampLastEof @5 :UInt64;
|
||||||
|
matches @6: List(Int16);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OrbFeaturesSummary @0xd500d30c5803fa4f {
|
||||||
|
timestampEof @0 :UInt64;
|
||||||
|
timestampLastEof @1 :UInt64;
|
||||||
|
|
||||||
|
featureCount @2 :UInt16;
|
||||||
|
matchCount @3 :UInt16;
|
||||||
|
computeNs @4 :UInt64;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OrbKeyFrame @0xc8233c0345e27e24 {
|
||||||
|
# this is a globally unique id for the KeyFrame
|
||||||
|
id @0: UInt64;
|
||||||
|
|
||||||
|
# this is the location of the KeyFrame
|
||||||
|
pos @1: ECEFPoint;
|
||||||
|
|
||||||
|
# these are the features in the world
|
||||||
|
# len(dpos) == len(descriptors) * 32
|
||||||
|
dpos @2 :List(ECEFPoint);
|
||||||
|
descriptors @3 :Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct KalmanOdometry @0x92e21bb7ea38793a {
|
||||||
|
trans @0 :List(Float32); # m/s in device frame
|
||||||
|
rot @1 :List(Float32); # rad/s in device frame
|
||||||
|
transStd @2 :List(Float32); # std m/s in device frame
|
||||||
|
rotStd @3 :List(Float32); # std rad/s in device frame
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OrbObservation @0x9b326d4e436afec7 {
|
||||||
|
observationMonoTime @0 :UInt64;
|
||||||
|
normalizedCoordinates @1 :List(Float32);
|
||||||
|
locationECEF @2 :List(Float64);
|
||||||
|
matchDistance @3: UInt32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CalibrationFeatures @0x8fdfadb254ea867a {
|
||||||
|
frameId @0 :UInt32;
|
||||||
|
|
||||||
|
p0 @1 :List(Float32);
|
||||||
|
p1 @2 :List(Float32);
|
||||||
|
status @3 :List(Int8);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct NavStatus @0xbd8822120928120c {
|
||||||
|
isNavigating @0 :Bool;
|
||||||
|
currentAddress @1 :Address;
|
||||||
|
|
||||||
|
struct Address @0xce7cd672cacc7814 {
|
||||||
|
title @0 :Text;
|
||||||
|
lat @1 :Float64;
|
||||||
|
lng @2 :Float64;
|
||||||
|
house @3 :Text;
|
||||||
|
address @4 :Text;
|
||||||
|
street @5 :Text;
|
||||||
|
city @6 :Text;
|
||||||
|
state @7 :Text;
|
||||||
|
country @8 :Text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct NavUpdate @0xdb98be6565516acb {
|
||||||
|
isNavigating @0 :Bool;
|
||||||
|
curSegment @1 :Int32;
|
||||||
|
segments @2 :List(Segment);
|
||||||
|
|
||||||
|
struct LatLng @0x9eaef9187cadbb9b {
|
||||||
|
lat @0 :Float64;
|
||||||
|
lng @1 :Float64;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Segment @0xa5b39b4fc4d7da3f {
|
||||||
|
from @0 :LatLng;
|
||||||
|
to @1 :LatLng;
|
||||||
|
updateTime @2 :Int32;
|
||||||
|
distance @3 :Int32;
|
||||||
|
crossTime @4 :Int32;
|
||||||
|
exitNo @5 :Int32;
|
||||||
|
instruction @6 :Instruction;
|
||||||
|
|
||||||
|
parts @7 :List(LatLng);
|
||||||
|
|
||||||
|
enum Instruction @0xc5417a637451246f {
|
||||||
|
turnLeft @0;
|
||||||
|
turnRight @1;
|
||||||
|
keepLeft @2;
|
||||||
|
keepRight @3;
|
||||||
|
straight @4;
|
||||||
|
roundaboutExitNumber @5;
|
||||||
|
roundaboutExit @6;
|
||||||
|
roundaboutTurnLeft @7;
|
||||||
|
unkn8 @8;
|
||||||
|
roundaboutStraight @9;
|
||||||
|
unkn10 @10;
|
||||||
|
roundaboutTurnRight @11;
|
||||||
|
unkn12 @12;
|
||||||
|
roundaboutUturn @13;
|
||||||
|
unkn14 @14;
|
||||||
|
arrive @15;
|
||||||
|
exitLeft @16;
|
||||||
|
exitRight @17;
|
||||||
|
unkn18 @18;
|
||||||
|
uturn @19;
|
||||||
|
# ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct TrafficEvent @0xacfa74a094e62626 {
|
||||||
|
type @0 :Type;
|
||||||
|
distance @1 :Float32;
|
||||||
|
action @2 :Action;
|
||||||
|
resuming @3 :Bool;
|
||||||
|
|
||||||
|
enum Type @0xd85d75253435bf4b {
|
||||||
|
stopSign @0;
|
||||||
|
lightRed @1;
|
||||||
|
lightYellow @2;
|
||||||
|
lightGreen @3;
|
||||||
|
stopLight @4;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Action @0xa6f6ce72165ccb49 {
|
||||||
|
none @0;
|
||||||
|
yield @1;
|
||||||
|
stop @2;
|
||||||
|
resumeReady @3;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct AndroidGnss @0xdfdf30d03fc485bd {
|
||||||
|
union {
|
||||||
|
measurements @0 :Measurements;
|
||||||
|
navigationMessage @1 :NavigationMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Measurements @0xa20710d4f428d6cd {
|
||||||
|
clock @0 :Clock;
|
||||||
|
measurements @1 :List(Measurement);
|
||||||
|
|
||||||
|
struct Clock @0xa0e27b453a38f450 {
|
||||||
|
timeNanos @0 :Int64;
|
||||||
|
hardwareClockDiscontinuityCount @1 :Int32;
|
||||||
|
|
||||||
|
hasTimeUncertaintyNanos @2 :Bool;
|
||||||
|
timeUncertaintyNanos @3 :Float64;
|
||||||
|
|
||||||
|
hasLeapSecond @4 :Bool;
|
||||||
|
leapSecond @5 :Int32;
|
||||||
|
|
||||||
|
hasFullBiasNanos @6 :Bool;
|
||||||
|
fullBiasNanos @7 :Int64;
|
||||||
|
|
||||||
|
hasBiasNanos @8 :Bool;
|
||||||
|
biasNanos @9 :Float64;
|
||||||
|
|
||||||
|
hasBiasUncertaintyNanos @10 :Bool;
|
||||||
|
biasUncertaintyNanos @11 :Float64;
|
||||||
|
|
||||||
|
hasDriftNanosPerSecond @12 :Bool;
|
||||||
|
driftNanosPerSecond @13 :Float64;
|
||||||
|
|
||||||
|
hasDriftUncertaintyNanosPerSecond @14 :Bool;
|
||||||
|
driftUncertaintyNanosPerSecond @15 :Float64;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Measurement @0xd949bf717d77614d {
|
||||||
|
svId @0 :Int32;
|
||||||
|
constellation @1 :Constellation;
|
||||||
|
|
||||||
|
timeOffsetNanos @2 :Float64;
|
||||||
|
state @3 :Int32;
|
||||||
|
receivedSvTimeNanos @4 :Int64;
|
||||||
|
receivedSvTimeUncertaintyNanos @5 :Int64;
|
||||||
|
cn0DbHz @6 :Float64;
|
||||||
|
pseudorangeRateMetersPerSecond @7 :Float64;
|
||||||
|
pseudorangeRateUncertaintyMetersPerSecond @8 :Float64;
|
||||||
|
accumulatedDeltaRangeState @9 :Int32;
|
||||||
|
accumulatedDeltaRangeMeters @10 :Float64;
|
||||||
|
accumulatedDeltaRangeUncertaintyMeters @11 :Float64;
|
||||||
|
|
||||||
|
hasCarrierFrequencyHz @12 :Bool;
|
||||||
|
carrierFrequencyHz @13 :Float32;
|
||||||
|
hasCarrierCycles @14 :Bool;
|
||||||
|
carrierCycles @15 :Int64;
|
||||||
|
hasCarrierPhase @16 :Bool;
|
||||||
|
carrierPhase @17 :Float64;
|
||||||
|
hasCarrierPhaseUncertainty @18 :Bool;
|
||||||
|
carrierPhaseUncertainty @19 :Float64;
|
||||||
|
hasSnrInDb @20 :Bool;
|
||||||
|
snrInDb @21 :Float64;
|
||||||
|
|
||||||
|
multipathIndicator @22 :MultipathIndicator;
|
||||||
|
|
||||||
|
enum Constellation @0x9ef1f3ff0deb5ffb {
|
||||||
|
unknown @0;
|
||||||
|
gps @1;
|
||||||
|
sbas @2;
|
||||||
|
glonass @3;
|
||||||
|
qzss @4;
|
||||||
|
beidou @5;
|
||||||
|
galileo @6;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum State @0xcbb9490adce12d72 {
|
||||||
|
unknown @0;
|
||||||
|
codeLock @1;
|
||||||
|
bitSync @2;
|
||||||
|
subframeSync @3;
|
||||||
|
towDecoded @4;
|
||||||
|
msecAmbiguous @5;
|
||||||
|
symbolSync @6;
|
||||||
|
gloStringSync @7;
|
||||||
|
gloTodDecoded @8;
|
||||||
|
bdsD2BitSync @9;
|
||||||
|
bdsD2SubframeSync @10;
|
||||||
|
galE1bcCodeLock @11;
|
||||||
|
galE1c2ndCodeLock @12;
|
||||||
|
galE1bPageSync @13;
|
||||||
|
sbasSync @14;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum MultipathIndicator @0xc04e7b6231d4caa8 {
|
||||||
|
unknown @0;
|
||||||
|
detected @1;
|
||||||
|
notDetected @2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct NavigationMessage @0xe2517b083095fd4e {
|
||||||
|
type @0 :Int32;
|
||||||
|
svId @1 :Int32;
|
||||||
|
messageId @2 :Int32;
|
||||||
|
submessageId @3 :Int32;
|
||||||
|
data @4 :Data;
|
||||||
|
status @5 :Status;
|
||||||
|
|
||||||
|
enum Status @0xec1ff7996b35366f {
|
||||||
|
unknown @0;
|
||||||
|
parityPassed @1;
|
||||||
|
parityRebuilt @2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct QcomGnss @0xde94674b07ae51c1 {
|
||||||
|
logTs @0 :UInt64;
|
||||||
|
union {
|
||||||
|
measurementReport @1 :MeasurementReport;
|
||||||
|
clockReport @2 :ClockReport;
|
||||||
|
drMeasurementReport @3 :DrMeasurementReport;
|
||||||
|
drSvPoly @4 :DrSvPolyReport;
|
||||||
|
rawLog @5 :Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum MeasurementSource @0xd71a12b6faada7ee {
|
||||||
|
gps @0;
|
||||||
|
glonass @1;
|
||||||
|
beidou @2;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum SVObservationState @0xe81e829a0d6c83e9 {
|
||||||
|
idle @0;
|
||||||
|
search @1;
|
||||||
|
searchVerify @2;
|
||||||
|
bitEdge @3;
|
||||||
|
trackVerify @4;
|
||||||
|
track @5;
|
||||||
|
restart @6;
|
||||||
|
dpo @7;
|
||||||
|
glo10msBe @8;
|
||||||
|
glo10msAt @9;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MeasurementStatus @0xe501010e1bcae83b {
|
||||||
|
subMillisecondIsValid @0 :Bool;
|
||||||
|
subBitTimeIsKnown @1 :Bool;
|
||||||
|
satelliteTimeIsKnown @2 :Bool;
|
||||||
|
bitEdgeConfirmedFromSignal @3 :Bool;
|
||||||
|
measuredVelocity @4 :Bool;
|
||||||
|
fineOrCoarseVelocity @5 :Bool;
|
||||||
|
lockPointValid @6 :Bool;
|
||||||
|
lockPointPositive @7 :Bool;
|
||||||
|
lastUpdateFromDifference @8 :Bool;
|
||||||
|
lastUpdateFromVelocityDifference @9 :Bool;
|
||||||
|
strongIndicationOfCrossCorelation @10 :Bool;
|
||||||
|
tentativeMeasurement @11 :Bool;
|
||||||
|
measurementNotUsable @12 :Bool;
|
||||||
|
sirCheckIsNeeded @13 :Bool;
|
||||||
|
probationMode @14 :Bool;
|
||||||
|
|
||||||
|
glonassMeanderBitEdgeValid @15 :Bool;
|
||||||
|
glonassTimeMarkValid @16 :Bool;
|
||||||
|
|
||||||
|
gpsRoundRobinRxDiversity @17 :Bool;
|
||||||
|
gpsRxDiversity @18 :Bool;
|
||||||
|
gpsLowBandwidthRxDiversityCombined @19 :Bool;
|
||||||
|
gpsHighBandwidthNu4 @20 :Bool;
|
||||||
|
gpsHighBandwidthNu8 @21 :Bool;
|
||||||
|
gpsHighBandwidthUniform @22 :Bool;
|
||||||
|
multipathIndicator @23 :Bool;
|
||||||
|
|
||||||
|
imdJammingIndicator @24 :Bool;
|
||||||
|
lteB13TxJammingIndicator @25 :Bool;
|
||||||
|
freshMeasurementIndicator @26 :Bool;
|
||||||
|
|
||||||
|
multipathEstimateIsValid @27 :Bool;
|
||||||
|
directionIsValid @28 :Bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MeasurementReport @0xf580d7d86b7b8692 {
|
||||||
|
source @0 :MeasurementSource;
|
||||||
|
|
||||||
|
fCount @1 :UInt32;
|
||||||
|
|
||||||
|
gpsWeek @2 :UInt16;
|
||||||
|
glonassCycleNumber @3 :UInt8;
|
||||||
|
glonassNumberOfDays @4 :UInt16;
|
||||||
|
|
||||||
|
milliseconds @5 :UInt32;
|
||||||
|
timeBias @6 :Float32;
|
||||||
|
clockTimeUncertainty @7 :Float32;
|
||||||
|
clockFrequencyBias @8 :Float32;
|
||||||
|
clockFrequencyUncertainty @9 :Float32;
|
||||||
|
|
||||||
|
sv @10 :List(SV);
|
||||||
|
|
||||||
|
struct SV @0xf10c595ae7bb2c27 {
|
||||||
|
svId @0 :UInt8;
|
||||||
|
observationState @2 :SVObservationState;
|
||||||
|
observations @3 :UInt8;
|
||||||
|
goodObservations @4 :UInt8;
|
||||||
|
gpsParityErrorCount @5 :UInt16;
|
||||||
|
glonassFrequencyIndex @1 :Int8;
|
||||||
|
glonassHemmingErrorCount @6 :UInt8;
|
||||||
|
filterStages @7 :UInt8;
|
||||||
|
carrierNoise @8 :UInt16;
|
||||||
|
latency @9 :Int16;
|
||||||
|
predetectInterval @10 :UInt8;
|
||||||
|
postdetections @11 :UInt16;
|
||||||
|
|
||||||
|
unfilteredMeasurementIntegral @12 :UInt32;
|
||||||
|
unfilteredMeasurementFraction @13 :Float32;
|
||||||
|
unfilteredTimeUncertainty @14 :Float32;
|
||||||
|
unfilteredSpeed @15 :Float32;
|
||||||
|
unfilteredSpeedUncertainty @16 :Float32;
|
||||||
|
measurementStatus @17 :MeasurementStatus;
|
||||||
|
multipathEstimate @18 :UInt32;
|
||||||
|
azimuth @19 :Float32;
|
||||||
|
elevation @20 :Float32;
|
||||||
|
carrierPhaseCyclesIntegral @21 :Int32;
|
||||||
|
carrierPhaseCyclesFraction @22 :UInt16;
|
||||||
|
fineSpeed @23 :Float32;
|
||||||
|
fineSpeedUncertainty @24 :Float32;
|
||||||
|
cycleSlipCount @25 :UInt8;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ClockReport @0xca965e4add8f4f0b {
|
||||||
|
hasFCount @0 :Bool;
|
||||||
|
fCount @1 :UInt32;
|
||||||
|
|
||||||
|
hasGpsWeek @2 :Bool;
|
||||||
|
gpsWeek @3 :UInt16;
|
||||||
|
hasGpsMilliseconds @4 :Bool;
|
||||||
|
gpsMilliseconds @5 :UInt32;
|
||||||
|
gpsTimeBias @6 :Float32;
|
||||||
|
gpsClockTimeUncertainty @7 :Float32;
|
||||||
|
gpsClockSource @8 :UInt8;
|
||||||
|
|
||||||
|
hasGlonassYear @9 :Bool;
|
||||||
|
glonassYear @10 :UInt8;
|
||||||
|
hasGlonassDay @11 :Bool;
|
||||||
|
glonassDay @12 :UInt16;
|
||||||
|
hasGlonassMilliseconds @13 :Bool;
|
||||||
|
glonassMilliseconds @14 :UInt32;
|
||||||
|
glonassTimeBias @15 :Float32;
|
||||||
|
glonassClockTimeUncertainty @16 :Float32;
|
||||||
|
glonassClockSource @17 :UInt8;
|
||||||
|
|
||||||
|
bdsWeek @18 :UInt16;
|
||||||
|
bdsMilliseconds @19 :UInt32;
|
||||||
|
bdsTimeBias @20 :Float32;
|
||||||
|
bdsClockTimeUncertainty @21 :Float32;
|
||||||
|
bdsClockSource @22 :UInt8;
|
||||||
|
|
||||||
|
galWeek @23 :UInt16;
|
||||||
|
galMilliseconds @24 :UInt32;
|
||||||
|
galTimeBias @25 :Float32;
|
||||||
|
galClockTimeUncertainty @26 :Float32;
|
||||||
|
galClockSource @27 :UInt8;
|
||||||
|
|
||||||
|
clockFrequencyBias @28 :Float32;
|
||||||
|
clockFrequencyUncertainty @29 :Float32;
|
||||||
|
frequencySource @30 :UInt8;
|
||||||
|
gpsLeapSeconds @31 :UInt8;
|
||||||
|
gpsLeapSecondsUncertainty @32 :UInt8;
|
||||||
|
gpsLeapSecondsSource @33 :UInt8;
|
||||||
|
|
||||||
|
gpsToGlonassTimeBiasMilliseconds @34 :Float32;
|
||||||
|
gpsToGlonassTimeBiasMillisecondsUncertainty @35 :Float32;
|
||||||
|
gpsToBdsTimeBiasMilliseconds @36 :Float32;
|
||||||
|
gpsToBdsTimeBiasMillisecondsUncertainty @37 :Float32;
|
||||||
|
bdsToGloTimeBiasMilliseconds @38 :Float32;
|
||||||
|
bdsToGloTimeBiasMillisecondsUncertainty @39 :Float32;
|
||||||
|
gpsToGalTimeBiasMilliseconds @40 :Float32;
|
||||||
|
gpsToGalTimeBiasMillisecondsUncertainty @41 :Float32;
|
||||||
|
galToGloTimeBiasMilliseconds @42 :Float32;
|
||||||
|
galToGloTimeBiasMillisecondsUncertainty @43 :Float32;
|
||||||
|
galToBdsTimeBiasMilliseconds @44 :Float32;
|
||||||
|
galToBdsTimeBiasMillisecondsUncertainty @45 :Float32;
|
||||||
|
|
||||||
|
hasRtcTime @46 :Bool;
|
||||||
|
systemRtcTime @47 :UInt32;
|
||||||
|
fCountOffset @48 :UInt32;
|
||||||
|
lpmRtcCount @49 :UInt32;
|
||||||
|
clockResets @50 :UInt32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DrMeasurementReport @0x8053c39445c6c75c {
|
||||||
|
|
||||||
|
reason @0 :UInt8;
|
||||||
|
seqNum @1 :UInt8;
|
||||||
|
seqMax @2 :UInt8;
|
||||||
|
rfLoss @3 :UInt16;
|
||||||
|
|
||||||
|
systemRtcValid @4 :Bool;
|
||||||
|
fCount @5 :UInt32;
|
||||||
|
clockResets @6 :UInt32;
|
||||||
|
systemRtcTime @7 :UInt64;
|
||||||
|
|
||||||
|
gpsLeapSeconds @8 :UInt8;
|
||||||
|
gpsLeapSecondsUncertainty @9 :UInt8;
|
||||||
|
gpsToGlonassTimeBiasMilliseconds @10 :Float32;
|
||||||
|
gpsToGlonassTimeBiasMillisecondsUncertainty @11 :Float32;
|
||||||
|
|
||||||
|
gpsWeek @12 :UInt16;
|
||||||
|
gpsMilliseconds @13 :UInt32;
|
||||||
|
gpsTimeBiasMs @14 :UInt32;
|
||||||
|
gpsClockTimeUncertaintyMs @15 :UInt32;
|
||||||
|
gpsClockSource @16 :UInt8;
|
||||||
|
|
||||||
|
glonassClockSource @17 :UInt8;
|
||||||
|
glonassYear @18 :UInt8;
|
||||||
|
glonassDay @19 :UInt16;
|
||||||
|
glonassMilliseconds @20 :UInt32;
|
||||||
|
glonassTimeBias @21 :Float32;
|
||||||
|
glonassClockTimeUncertainty @22 :Float32;
|
||||||
|
|
||||||
|
clockFrequencyBias @23 :Float32;
|
||||||
|
clockFrequencyUncertainty @24 :Float32;
|
||||||
|
frequencySource @25 :UInt8;
|
||||||
|
|
||||||
|
source @26 :MeasurementSource;
|
||||||
|
|
||||||
|
sv @27 :List(SV);
|
||||||
|
|
||||||
|
struct SV @0xf08b81df8cbf459c {
|
||||||
|
svId @0 :UInt8;
|
||||||
|
glonassFrequencyIndex @1 :Int8;
|
||||||
|
observationState @2 :SVObservationState;
|
||||||
|
observations @3 :UInt8;
|
||||||
|
goodObservations @4 :UInt8;
|
||||||
|
filterStages @5 :UInt8;
|
||||||
|
predetectInterval @6 :UInt8;
|
||||||
|
cycleSlipCount @7 :UInt8;
|
||||||
|
postdetections @8 :UInt16;
|
||||||
|
|
||||||
|
measurementStatus @9 :MeasurementStatus;
|
||||||
|
|
||||||
|
carrierNoise @10 :UInt16;
|
||||||
|
rfLoss @11 :UInt16;
|
||||||
|
latency @12 :Int16;
|
||||||
|
|
||||||
|
filteredMeasurementFraction @13 :Float32;
|
||||||
|
filteredMeasurementIntegral @14 :UInt32;
|
||||||
|
filteredTimeUncertainty @15 :Float32;
|
||||||
|
filteredSpeed @16 :Float32;
|
||||||
|
filteredSpeedUncertainty @17 :Float32;
|
||||||
|
|
||||||
|
unfilteredMeasurementFraction @18 :Float32;
|
||||||
|
unfilteredMeasurementIntegral @19 :UInt32;
|
||||||
|
unfilteredTimeUncertainty @20 :Float32;
|
||||||
|
unfilteredSpeed @21 :Float32;
|
||||||
|
unfilteredSpeedUncertainty @22 :Float32;
|
||||||
|
|
||||||
|
multipathEstimate @23 :UInt32;
|
||||||
|
azimuth @24 :Float32;
|
||||||
|
elevation @25 :Float32;
|
||||||
|
dopplerAcceleration @26 :Float32;
|
||||||
|
fineSpeed @27 :Float32;
|
||||||
|
fineSpeedUncertainty @28 :Float32;
|
||||||
|
|
||||||
|
carrierPhase @29 :Float64;
|
||||||
|
fCount @30 :UInt32;
|
||||||
|
|
||||||
|
parityErrorCount @31 :UInt16;
|
||||||
|
goodParity @32 :Bool;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DrSvPolyReport @0xb1fb80811a673270 {
|
||||||
|
svId @0 :UInt16;
|
||||||
|
frequencyIndex @1 :Int8;
|
||||||
|
|
||||||
|
hasPosition @2 :Bool;
|
||||||
|
hasIono @3 :Bool;
|
||||||
|
hasTropo @4 :Bool;
|
||||||
|
hasElevation @5 :Bool;
|
||||||
|
polyFromXtra @6 :Bool;
|
||||||
|
hasSbasIono @7 :Bool;
|
||||||
|
|
||||||
|
iode @8 :UInt16;
|
||||||
|
t0 @9 :Float64;
|
||||||
|
xyz0 @10 :List(Float64);
|
||||||
|
xyzN @11 :List(Float64);
|
||||||
|
other @12 :List(Float32);
|
||||||
|
|
||||||
|
positionUncertainty @13 :Float32;
|
||||||
|
ionoDelay @14 :Float32;
|
||||||
|
ionoDot @15 :Float32;
|
||||||
|
sbasIonoDelay @16 :Float32;
|
||||||
|
sbasIonoDot @17 :Float32;
|
||||||
|
tropoDelay @18 :Float32;
|
||||||
|
elevation @19 :Float32;
|
||||||
|
elevationDot @20 :Float32;
|
||||||
|
elevationUncertainty @21 :Float32;
|
||||||
|
velocityCoeff @22 :List(Float64);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LidarPts @0xe3d6685d4e9d8f7a {
|
||||||
|
r @0 :List(UInt16); # uint16 m*500.0
|
||||||
|
theta @1 :List(UInt16); # uint16 deg*100.0
|
||||||
|
reflect @2 :List(UInt8); # uint8 0-255
|
||||||
|
|
||||||
|
# For storing out of file.
|
||||||
|
idx @3 :UInt64;
|
||||||
|
|
||||||
|
# For storing in file
|
||||||
|
pkt @4 :Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
1357
cereal/log.capnp
1357
cereal/log.capnp
File diff suppressed because it is too large
Load Diff
|
@ -5,9 +5,10 @@
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
|
|
||||||
|
#include "services.h"
|
||||||
#include "impl_msgq.hpp"
|
#include "impl_msgq.hpp"
|
||||||
|
|
||||||
|
|
||||||
volatile sig_atomic_t msgq_do_exit = 0;
|
volatile sig_atomic_t msgq_do_exit = 0;
|
||||||
|
|
||||||
void sig_handler(int signal) {
|
void sig_handler(int signal) {
|
||||||
|
@ -15,14 +16,21 @@ void sig_handler(int signal) {
|
||||||
msgq_do_exit = 1;
|
msgq_do_exit = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool service_exists(std::string path){
|
||||||
|
for (const auto& it : services) {
|
||||||
|
if (it.name == path) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static size_t get_size(std::string endpoint){
|
static size_t get_size(std::string endpoint){
|
||||||
size_t sz = DEFAULT_SEGMENT_SIZE;
|
size_t sz = DEFAULT_SEGMENT_SIZE;
|
||||||
|
|
||||||
#if !defined(QCOM) && !defined(QCOM2)
|
if (endpoint == "roadCameraState" || endpoint == "driverCameraState" || endpoint == "wideRoadCameraState"){
|
||||||
if (endpoint == "frame" || endpoint == "frontFrame" || endpoint == "wideFrame"){
|
|
||||||
sz *= 10;
|
sz *= 10;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return sz;
|
return sz;
|
||||||
}
|
}
|
||||||
|
@ -61,10 +69,14 @@ MSGQMessage::~MSGQMessage() {
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
int MSGQSubSocket::connect(Context *context, std::string endpoint, std::string address, bool conflate){
|
int MSGQSubSocket::connect(Context *context, std::string endpoint, std::string address, bool conflate, bool check_endpoint){
|
||||||
assert(context);
|
assert(context);
|
||||||
assert(address == "127.0.0.1");
|
assert(address == "127.0.0.1");
|
||||||
|
|
||||||
|
if (check_endpoint && !service_exists(std::string(endpoint))){
|
||||||
|
std::cout << "Warning, " << std::string(endpoint) << " is not in service list." << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
q = new msgq_queue_t;
|
q = new msgq_queue_t;
|
||||||
int r = msgq_new_queue(q, endpoint.c_str(), get_size(endpoint));
|
int r = msgq_new_queue(q, endpoint.c_str(), get_size(endpoint));
|
||||||
if (r != 0){
|
if (r != 0){
|
||||||
|
@ -150,9 +162,13 @@ MSGQSubSocket::~MSGQSubSocket(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int MSGQPubSocket::connect(Context *context, std::string endpoint){
|
int MSGQPubSocket::connect(Context *context, std::string endpoint, bool check_endpoint){
|
||||||
assert(context);
|
assert(context);
|
||||||
|
|
||||||
|
if (check_endpoint && !service_exists(std::string(endpoint))){
|
||||||
|
std::cout << "Warning, " << std::string(endpoint) << " is not in service list." << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
q = new msgq_queue_t;
|
q = new msgq_queue_t;
|
||||||
int r = msgq_new_queue(q, endpoint.c_str(), get_size(endpoint));
|
int r = msgq_new_queue(q, endpoint.c_str(), get_size(endpoint));
|
||||||
if (r != 0){
|
if (r != 0){
|
||||||
|
|
|
@ -34,7 +34,7 @@ private:
|
||||||
msgq_queue_t * q = NULL;
|
msgq_queue_t * q = NULL;
|
||||||
int timeout;
|
int timeout;
|
||||||
public:
|
public:
|
||||||
int connect(Context *context, std::string endpoint, std::string address, bool conflate=false);
|
int connect(Context *context, std::string endpoint, std::string address, bool conflate=false, bool check_endpoint=true);
|
||||||
void setTimeout(int timeout);
|
void setTimeout(int timeout);
|
||||||
void * getRawSocket() {return (void*)q;}
|
void * getRawSocket() {return (void*)q;}
|
||||||
Message *receive(bool non_blocking=false);
|
Message *receive(bool non_blocking=false);
|
||||||
|
@ -45,7 +45,7 @@ class MSGQPubSocket : public PubSocket {
|
||||||
private:
|
private:
|
||||||
msgq_queue_t * q = NULL;
|
msgq_queue_t * q = NULL;
|
||||||
public:
|
public:
|
||||||
int connect(Context *context, std::string endpoint);
|
int connect(Context *context, std::string endpoint, bool check_endpoint=true);
|
||||||
int sendMessage(Message *message);
|
int sendMessage(Message *message);
|
||||||
int send(char *data, size_t size);
|
int send(char *data, size_t size);
|
||||||
~MSGQPubSocket();
|
~MSGQPubSocket();
|
||||||
|
|
|
@ -54,7 +54,7 @@ ZMQMessage::~ZMQMessage() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ZMQSubSocket::connect(Context *context, std::string endpoint, std::string address, bool conflate){
|
int ZMQSubSocket::connect(Context *context, std::string endpoint, std::string address, bool conflate, bool check_endpoint){
|
||||||
sock = zmq_socket(context->getRawContext(), ZMQ_SUB);
|
sock = zmq_socket(context->getRawContext(), ZMQ_SUB);
|
||||||
if (sock == NULL){
|
if (sock == NULL){
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -71,7 +71,11 @@ int ZMQSubSocket::connect(Context *context, std::string endpoint, std::string ad
|
||||||
zmq_setsockopt(sock, ZMQ_RECONNECT_IVL_MAX, &reconnect_ivl, sizeof(reconnect_ivl));
|
zmq_setsockopt(sock, ZMQ_RECONNECT_IVL_MAX, &reconnect_ivl, sizeof(reconnect_ivl));
|
||||||
|
|
||||||
full_endpoint = "tcp://" + address + ":";
|
full_endpoint = "tcp://" + address + ":";
|
||||||
full_endpoint += std::to_string(get_port(endpoint));
|
if (check_endpoint){
|
||||||
|
full_endpoint += std::to_string(get_port(endpoint));
|
||||||
|
} else {
|
||||||
|
full_endpoint += endpoint;
|
||||||
|
}
|
||||||
|
|
||||||
return zmq_connect(sock, full_endpoint.c_str());
|
return zmq_connect(sock, full_endpoint.c_str());
|
||||||
}
|
}
|
||||||
|
@ -103,14 +107,18 @@ ZMQSubSocket::~ZMQSubSocket(){
|
||||||
zmq_close(sock);
|
zmq_close(sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZMQPubSocket::connect(Context *context, std::string endpoint){
|
int ZMQPubSocket::connect(Context *context, std::string endpoint, bool check_endpoint){
|
||||||
sock = zmq_socket(context->getRawContext(), ZMQ_PUB);
|
sock = zmq_socket(context->getRawContext(), ZMQ_PUB);
|
||||||
if (sock == NULL){
|
if (sock == NULL){
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
full_endpoint = "tcp://*:";
|
full_endpoint = "tcp://*:";
|
||||||
full_endpoint += std::to_string(get_port(endpoint));
|
if (check_endpoint){
|
||||||
|
full_endpoint += std::to_string(get_port(endpoint));
|
||||||
|
} else {
|
||||||
|
full_endpoint += endpoint;
|
||||||
|
}
|
||||||
|
|
||||||
return zmq_bind(sock, full_endpoint.c_str());
|
return zmq_bind(sock, full_endpoint.c_str());
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ private:
|
||||||
void * sock;
|
void * sock;
|
||||||
std::string full_endpoint;
|
std::string full_endpoint;
|
||||||
public:
|
public:
|
||||||
int connect(Context *context, std::string endpoint, std::string address, bool conflate=false);
|
int connect(Context *context, std::string endpoint, std::string address, bool conflate=false, bool check_endpoint=true);
|
||||||
void setTimeout(int timeout);
|
void setTimeout(int timeout);
|
||||||
void * getRawSocket() {return sock;}
|
void * getRawSocket() {return sock;}
|
||||||
Message *receive(bool non_blocking=false);
|
Message *receive(bool non_blocking=false);
|
||||||
|
@ -44,7 +44,7 @@ private:
|
||||||
void * sock;
|
void * sock;
|
||||||
std::string full_endpoint;
|
std::string full_endpoint;
|
||||||
public:
|
public:
|
||||||
int connect(Context *context, std::string endpoint);
|
int connect(Context *context, std::string endpoint, bool check_endpoint=true);
|
||||||
int sendMessage(Message *message);
|
int sendMessage(Message *message);
|
||||||
int send(char *data, size_t size);
|
int send(char *data, size_t size);
|
||||||
~ZMQPubSocket();
|
~ZMQPubSocket();
|
||||||
|
|
|
@ -8,9 +8,13 @@ const bool MUST_USE_ZMQ = true;
|
||||||
const bool MUST_USE_ZMQ = false;
|
const bool MUST_USE_ZMQ = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool messaging_use_zmq(){
|
||||||
|
return std::getenv("ZMQ") || MUST_USE_ZMQ;
|
||||||
|
}
|
||||||
|
|
||||||
Context * Context::create(){
|
Context * Context::create(){
|
||||||
Context * c;
|
Context * c;
|
||||||
if (std::getenv("ZMQ") || MUST_USE_ZMQ){
|
if (messaging_use_zmq()){
|
||||||
c = new ZMQContext();
|
c = new ZMQContext();
|
||||||
} else {
|
} else {
|
||||||
c = new MSGQContext();
|
c = new MSGQContext();
|
||||||
|
@ -20,7 +24,7 @@ Context * Context::create(){
|
||||||
|
|
||||||
SubSocket * SubSocket::create(){
|
SubSocket * SubSocket::create(){
|
||||||
SubSocket * s;
|
SubSocket * s;
|
||||||
if (std::getenv("ZMQ") || MUST_USE_ZMQ){
|
if (messaging_use_zmq()){
|
||||||
s = new ZMQSubSocket();
|
s = new ZMQSubSocket();
|
||||||
} else {
|
} else {
|
||||||
s = new MSGQSubSocket();
|
s = new MSGQSubSocket();
|
||||||
|
@ -28,33 +32,9 @@ SubSocket * SubSocket::create(){
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
SubSocket * SubSocket::create(Context * context, std::string endpoint){
|
SubSocket * SubSocket::create(Context * context, std::string endpoint, std::string address, bool conflate, bool check_endpoint){
|
||||||
SubSocket *s = SubSocket::create();
|
SubSocket *s = SubSocket::create();
|
||||||
int r = s->connect(context, endpoint, "127.0.0.1");
|
int r = s->connect(context, endpoint, address, conflate, check_endpoint);
|
||||||
|
|
||||||
if (r == 0) {
|
|
||||||
return s;
|
|
||||||
} else {
|
|
||||||
delete s;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SubSocket * SubSocket::create(Context * context, std::string endpoint, std::string address){
|
|
||||||
SubSocket *s = SubSocket::create();
|
|
||||||
int r = s->connect(context, endpoint, address);
|
|
||||||
|
|
||||||
if (r == 0) {
|
|
||||||
return s;
|
|
||||||
} else {
|
|
||||||
delete s;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SubSocket * SubSocket::create(Context * context, std::string endpoint, std::string address, bool conflate){
|
|
||||||
SubSocket *s = SubSocket::create();
|
|
||||||
int r = s->connect(context, endpoint, address, conflate);
|
|
||||||
|
|
||||||
if (r == 0) {
|
if (r == 0) {
|
||||||
return s;
|
return s;
|
||||||
|
@ -66,7 +46,7 @@ SubSocket * SubSocket::create(Context * context, std::string endpoint, std::stri
|
||||||
|
|
||||||
PubSocket * PubSocket::create(){
|
PubSocket * PubSocket::create(){
|
||||||
PubSocket * s;
|
PubSocket * s;
|
||||||
if (std::getenv("ZMQ") || MUST_USE_ZMQ){
|
if (messaging_use_zmq()){
|
||||||
s = new ZMQPubSocket();
|
s = new ZMQPubSocket();
|
||||||
} else {
|
} else {
|
||||||
s = new MSGQPubSocket();
|
s = new MSGQPubSocket();
|
||||||
|
@ -74,9 +54,9 @@ PubSocket * PubSocket::create(){
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
PubSocket * PubSocket::create(Context * context, std::string endpoint){
|
PubSocket * PubSocket::create(Context * context, std::string endpoint, bool check_endpoint){
|
||||||
PubSocket *s = PubSocket::create();
|
PubSocket *s = PubSocket::create();
|
||||||
int r = s->connect(context, endpoint);
|
int r = s->connect(context, endpoint, check_endpoint);
|
||||||
|
|
||||||
if (r == 0) {
|
if (r == 0) {
|
||||||
return s;
|
return s;
|
||||||
|
@ -88,7 +68,7 @@ PubSocket * PubSocket::create(Context * context, std::string endpoint){
|
||||||
|
|
||||||
Poller * Poller::create(){
|
Poller * Poller::create(){
|
||||||
Poller * p;
|
Poller * p;
|
||||||
if (std::getenv("ZMQ") || MUST_USE_ZMQ){
|
if (messaging_use_zmq()){
|
||||||
p = new ZMQPoller();
|
p = new ZMQPoller();
|
||||||
} else {
|
} else {
|
||||||
p = new MSGQPoller();
|
p = new MSGQPoller();
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
|
|
||||||
#define MSG_MULTIPLE_PUBLISHERS 100
|
#define MSG_MULTIPLE_PUBLISHERS 100
|
||||||
|
|
||||||
|
bool messaging_use_zmq();
|
||||||
|
|
||||||
class Context {
|
class Context {
|
||||||
public:
|
public:
|
||||||
virtual void * getRawContext() = 0;
|
virtual void * getRawContext() = 0;
|
||||||
|
@ -32,24 +34,23 @@ public:
|
||||||
|
|
||||||
class SubSocket {
|
class SubSocket {
|
||||||
public:
|
public:
|
||||||
virtual int connect(Context *context, std::string endpoint, std::string address, bool conflate=false) = 0;
|
virtual int connect(Context *context, std::string endpoint, std::string address, bool conflate=false, bool check_endpoint=true) = 0;
|
||||||
virtual void setTimeout(int timeout) = 0;
|
virtual void setTimeout(int timeout) = 0;
|
||||||
virtual Message *receive(bool non_blocking=false) = 0;
|
virtual Message *receive(bool non_blocking=false) = 0;
|
||||||
virtual void * getRawSocket() = 0;
|
virtual void * getRawSocket() = 0;
|
||||||
static SubSocket * create();
|
static SubSocket * create();
|
||||||
static SubSocket * create(Context * context, std::string endpoint);
|
static SubSocket * create(Context * context, std::string endpoint, std::string address="127.0.0.1", bool conflate=false, bool check_endpoint=true);
|
||||||
static SubSocket * create(Context * context, std::string endpoint, std::string address);
|
|
||||||
static SubSocket * create(Context * context, std::string endpoint, std::string address, bool conflate);
|
|
||||||
virtual ~SubSocket(){};
|
virtual ~SubSocket(){};
|
||||||
};
|
};
|
||||||
|
|
||||||
class PubSocket {
|
class PubSocket {
|
||||||
public:
|
public:
|
||||||
virtual int connect(Context *context, std::string endpoint) = 0;
|
virtual int connect(Context *context, std::string endpoint, bool check_endpoint=true) = 0;
|
||||||
virtual int sendMessage(Message *message) = 0;
|
virtual int sendMessage(Message *message) = 0;
|
||||||
virtual int send(char *data, size_t size) = 0;
|
virtual int send(char *data, size_t size) = 0;
|
||||||
static PubSocket * create();
|
static PubSocket * create();
|
||||||
static PubSocket * create(Context * context, std::string endpoint);
|
static PubSocket * create(Context * context, std::string endpoint, bool check_endpoint=true);
|
||||||
|
static PubSocket * create(Context * context, std::string endpoint, int port, bool check_endpoint=true);
|
||||||
virtual ~PubSocket(){};
|
virtual ~PubSocket(){};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,6 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "services.h"
|
|
||||||
|
|
||||||
#include "msgq.hpp"
|
#include "msgq.hpp"
|
||||||
|
|
||||||
void sigusr2_handler(int signal) {
|
void sigusr2_handler(int signal) {
|
||||||
|
@ -83,20 +81,9 @@ void msgq_wait_for_subscriber(msgq_queue_t *q){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool service_exists(std::string path){
|
|
||||||
for (const auto& it : services) {
|
|
||||||
if (it.name == path) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int msgq_new_queue(msgq_queue_t * q, const char * path, size_t size){
|
int msgq_new_queue(msgq_queue_t * q, const char * path, size_t size){
|
||||||
assert(size < 0xFFFFFFFF); // Buffer must be smaller than 2^32 bytes
|
assert(size < 0xFFFFFFFF); // Buffer must be smaller than 2^32 bytes
|
||||||
if (!service_exists(std::string(path))){
|
|
||||||
std::cout << "Warning, " << std::string(path) << " is not in service list." << std::endl;
|
|
||||||
}
|
|
||||||
std::signal(SIGUSR2, sigusr2_handler);
|
std::signal(SIGUSR2, sigusr2_handler);
|
||||||
|
|
||||||
const char * prefix = "/dev/shm/";
|
const char * prefix = "/dev/shm/";
|
||||||
|
|
|
@ -1,180 +0,0 @@
|
||||||
# TODO: these port numbers are hardcoded in c, fix this
|
|
||||||
|
|
||||||
# LogRotate: 8001 is a PUSH PULL socket between loggerd and visiond
|
|
||||||
|
|
||||||
# all ZMQ pub sub: port, should_log, frequency, (qlog_decimation)
|
|
||||||
|
|
||||||
# frame syncing packet
|
|
||||||
frame: [8002, true, 20., 1]
|
|
||||||
# accel, gyro, and compass
|
|
||||||
sensorEvents: [8003, true, 100., 100]
|
|
||||||
# GPS data, also global timestamp
|
|
||||||
gpsNMEA: [8004, true, 9.] # 9 msgs each sec
|
|
||||||
# CPU+MEM+GPU+BAT temps
|
|
||||||
thermal: [8005, true, 2., 1]
|
|
||||||
# List(CanData), list of can messages
|
|
||||||
can: [8006, true, 100.]
|
|
||||||
controlsState: [8007, true, 100., 100]
|
|
||||||
#liveEvent: [8008, true, 0.]
|
|
||||||
model: [8009, true, 20., 5]
|
|
||||||
features: [8010, true, 0.]
|
|
||||||
health: [8011, true, 2., 1]
|
|
||||||
radarState: [8012, true, 20., 5]
|
|
||||||
#liveUI: [8014, true, 0.]
|
|
||||||
encodeIdx: [8015, true, 20.]
|
|
||||||
liveTracks: [8016, true, 20.]
|
|
||||||
sendcan: [8017, true, 100.]
|
|
||||||
logMessage: [8018, true, 0.]
|
|
||||||
liveCalibration: [8019, true, 4., 4]
|
|
||||||
androidLog: [8020, true, 0.]
|
|
||||||
carState: [8021, true, 100., 10]
|
|
||||||
# 8022 is reserved for sshd
|
|
||||||
carControl: [8023, true, 100., 10]
|
|
||||||
plan: [8024, true, 20., 2]
|
|
||||||
liveLocation: [8025, true, 0., 1]
|
|
||||||
gpsLocation: [8026, true, 1., 1]
|
|
||||||
ethernetData: [8027, true, 0.]
|
|
||||||
navUpdate: [8028, true, 0.]
|
|
||||||
qcomGnss: [8029, true, 0.]
|
|
||||||
lidarPts: [8030, true, 0.]
|
|
||||||
procLog: [8031, true, 0.5]
|
|
||||||
gpsLocationExternal: [8032, true, 10., 1]
|
|
||||||
ubloxGnss: [8033, true, 10.]
|
|
||||||
clocks: [8034, true, 1., 1]
|
|
||||||
liveMpc: [8035, false, 20.]
|
|
||||||
liveLongitudinalMpc: [8036, false, 20.]
|
|
||||||
navStatus: [8038, true, 0.]
|
|
||||||
gpsLocationTrimble: [8039, true, 0.]
|
|
||||||
trimbleGnss: [8041, true, 0.]
|
|
||||||
ubloxRaw: [8042, true, 20.]
|
|
||||||
gpsPlannerPoints: [8043, true, 0.]
|
|
||||||
gpsPlannerPlan: [8044, true, 0.]
|
|
||||||
applanixRaw: [8046, true, 0.]
|
|
||||||
orbLocation: [8047, true, 0.]
|
|
||||||
trafficEvents: [8048, true, 0.]
|
|
||||||
liveLocationTiming: [8049, true, 0.]
|
|
||||||
orbslamCorrection: [8050, true, 0.]
|
|
||||||
liveLocationCorrected: [8051, true, 0.]
|
|
||||||
orbObservation: [8052, true, 0.]
|
|
||||||
applanixLocation: [8053, true, 0.]
|
|
||||||
liveLocationKalman: [8054, true, 20., 2]
|
|
||||||
uiNavigationEvent: [8055, true, 0.]
|
|
||||||
orbOdometry: [8057, true, 0.]
|
|
||||||
orbFeatures: [8058, false, 0.]
|
|
||||||
orbKeyFrame: [8059, true, 0.]
|
|
||||||
uiLayoutState: [8060, true, 0.]
|
|
||||||
frontEncodeIdx: [8061, true, 5.] # should be 20fps on tici
|
|
||||||
orbFeaturesSummary: [8062, true, 0.]
|
|
||||||
driverState: [8063, true, 5., 1]
|
|
||||||
liveParameters: [8064, true, 20., 2]
|
|
||||||
liveMapData: [8065, true, 0.]
|
|
||||||
cameraOdometry: [8066, true, 20., 5]
|
|
||||||
pathPlan: [8067, true, 20., 2]
|
|
||||||
kalmanOdometry: [8068, true, 0.]
|
|
||||||
thumbnail: [8069, true, 0.2, 1]
|
|
||||||
carEvents: [8070, true, 1., 1]
|
|
||||||
carParams: [8071, true, 0.02, 1]
|
|
||||||
frontFrame: [8072, true, 10.]
|
|
||||||
dMonitoringState: [8073, true, 5., 1]
|
|
||||||
offroadLayout: [8074, false, 0.]
|
|
||||||
wideEncodeIdx: [8075, true, 20.]
|
|
||||||
wideFrame: [8076, true, 20.]
|
|
||||||
modelV2: [8077, true, 20., 20]
|
|
||||||
|
|
||||||
testModel: [8040, false, 0.]
|
|
||||||
testLiveLocation: [8045, false, 0.]
|
|
||||||
testJoystick: [8056, false, 0.]
|
|
||||||
|
|
||||||
# 8080 is reserved for slave testing daemon
|
|
||||||
# 8762 is reserved for logserver
|
|
||||||
|
|
||||||
# manager -- base process to manage starting and stopping of all others
|
|
||||||
# subscribes: thermal
|
|
||||||
|
|
||||||
# **** processes that communicate with the outside world ****
|
|
||||||
|
|
||||||
# thermald -- decides when to start and stop onroad
|
|
||||||
# subscribes: health, location
|
|
||||||
# publishes: thermal
|
|
||||||
|
|
||||||
# boardd -- communicates with the car
|
|
||||||
# subscribes: sendcan
|
|
||||||
# publishes: can, health, ubloxRaw
|
|
||||||
|
|
||||||
# sensord -- publishes IMU and Magnetometer
|
|
||||||
# publishes: sensorEvents
|
|
||||||
|
|
||||||
# gpsd -- publishes EON's gps
|
|
||||||
# publishes: gpsNMEA
|
|
||||||
|
|
||||||
# camerad -- publishes camera frames
|
|
||||||
# publishes: frame, frontFrame, thumbnail
|
|
||||||
# subscribes: driverState
|
|
||||||
|
|
||||||
# dmonitoringmodeld -- runs face detection on camera frames
|
|
||||||
# publishes: driverState
|
|
||||||
|
|
||||||
# **** stateful data transformers ****
|
|
||||||
|
|
||||||
# modeld -- runs & publishes the model
|
|
||||||
# publishes: model, cameraOdometry
|
|
||||||
# subscribes: liveCalibration, pathPlan
|
|
||||||
|
|
||||||
# plannerd -- decides where to drive the car
|
|
||||||
# subscribes: carState, model, radarState, controlsState, liveParameters
|
|
||||||
# publishes: plan, pathPlan, liveMpc, liveLongitudinalMpc
|
|
||||||
|
|
||||||
# controlsd -- drives the car by sending CAN messages to panda
|
|
||||||
# subscribes: can, thermal, health, plan, pathPlan, dMonitoringState, liveCalibration, model
|
|
||||||
# publishes: carState, carControl, sendcan, controlsState, carEvents, carParams
|
|
||||||
|
|
||||||
# dmonitoringd -- processes driver monitoring data and publishes driver awareness
|
|
||||||
# subscribes: driverState, liveCalibration, carState, model, gpsLocation
|
|
||||||
# publishes: dMonitoringState
|
|
||||||
|
|
||||||
# radard -- processes the radar and vision data
|
|
||||||
# subscribes: can, controlsState, model, liveParameters
|
|
||||||
# publishes: radarState, liveTracks
|
|
||||||
|
|
||||||
# params_learner -- learns vehicle params by observing the vehicle dynamics
|
|
||||||
# subscribes: controlsState, sensorEvents, cameraOdometry
|
|
||||||
# publishes: liveParameters
|
|
||||||
|
|
||||||
# calibrationd -- reads posenet and applies a temporal filter on the frame region to look at
|
|
||||||
# subscribes: cameraOdometry
|
|
||||||
# publishes: liveCalibration
|
|
||||||
|
|
||||||
# ubloxd -- read raw ublox data and converts them in readable format
|
|
||||||
# subscribes: ubloxRaw
|
|
||||||
# publishes: ubloxGnss
|
|
||||||
|
|
||||||
# **** LOGGING SERVICE ****
|
|
||||||
|
|
||||||
# loggerd
|
|
||||||
# subscribes: EVERYTHING
|
|
||||||
|
|
||||||
# **** NON VITAL SERVICES ****
|
|
||||||
|
|
||||||
# ui
|
|
||||||
# subscribes: thermal, model, controlsState, uiLayout, liveCalibration, radarState, liveMpc, plusFrame, liveMapData
|
|
||||||
|
|
||||||
# uploader
|
|
||||||
# communicates through file system with loggerd
|
|
||||||
|
|
||||||
# deleter
|
|
||||||
# communicates through file system with loggerd and uploader
|
|
||||||
|
|
||||||
# logmessaged -- central logging service, can log to cloud
|
|
||||||
# publishes: logMessage
|
|
||||||
|
|
||||||
# logcatd -- fetches logcat info from android
|
|
||||||
# publishes: androidLog
|
|
||||||
|
|
||||||
# proclogd -- fetches process information
|
|
||||||
# publishes: procLog
|
|
||||||
|
|
||||||
# tombstoned -- reports native crashes
|
|
||||||
|
|
||||||
# athenad -- on request, open a sub socket and return the value
|
|
||||||
|
|
||||||
# updated -- waits for network access and tries to update every hour
|
|
|
@ -1,34 +1,84 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import os
|
import os
|
||||||
import yaml
|
from typing import Optional
|
||||||
|
|
||||||
|
EON = os.path.isfile('/EON')
|
||||||
|
|
||||||
class Service():
|
class Service:
|
||||||
def __init__(self, port, should_log, frequency, decimation=None):
|
def __init__(self, port: int, should_log: bool, frequency: float, decimation: Optional[int] = None):
|
||||||
self.port = port
|
self.port = port
|
||||||
self.should_log = should_log
|
self.should_log = should_log
|
||||||
self.frequency = frequency
|
self.frequency = frequency
|
||||||
self.decimation = decimation
|
self.decimation = decimation
|
||||||
|
|
||||||
|
service_list = {
|
||||||
|
"roadCameraState": Service(8002, True, 20., 1),
|
||||||
|
"sensorEvents": Service(8003, True, 100., 100),
|
||||||
|
"gpsNMEA": Service(8004, True, 9.),
|
||||||
|
"deviceState": Service(8005, True, 2., 1),
|
||||||
|
"can": Service(8006, True, 100.),
|
||||||
|
"controlsState": Service(8007, True, 100., 100),
|
||||||
|
"features": Service(8010, True, 0.),
|
||||||
|
"pandaState": Service(8011, True, 2., 1),
|
||||||
|
"radarState": Service(8012, True, 20., 5),
|
||||||
|
"roadEncodeIdx": Service(8015, True, 20., 1),
|
||||||
|
"liveTracks": Service(8016, True, 20.),
|
||||||
|
"sendcan": Service(8017, True, 100.),
|
||||||
|
"logMessage": Service(8018, True, 0.),
|
||||||
|
"liveCalibration": Service(8019, True, 4., 4),
|
||||||
|
"androidLog": Service(8020, True, 0., 1),
|
||||||
|
"carState": Service(8021, True, 100., 10),
|
||||||
|
"carControl": Service(8023, True, 100., 10),
|
||||||
|
"longitudinalPlan": Service(8024, True, 20., 2),
|
||||||
|
"liveLocation": Service(8025, True, 0., 1),
|
||||||
|
"gpsLocation": Service(8026, True, 1., 1),
|
||||||
|
"procLog": Service(8031, True, 0.5),
|
||||||
|
"gpsLocationExternal": Service(8032, True, 10., 1),
|
||||||
|
"ubloxGnss": Service(8033, True, 10.),
|
||||||
|
"clocks": Service(8034, True, 1., 1),
|
||||||
|
"liveMpc": Service(8035, False, 20.),
|
||||||
|
"liveLongitudinalMpc": Service(8036, False, 20.),
|
||||||
|
"ubloxRaw": Service(8042, True, 20.),
|
||||||
|
"liveLocationKalman": Service(8054, True, 20., 2),
|
||||||
|
"uiLayoutState": Service(8060, True, 0.),
|
||||||
|
"liveParameters": Service(8064, True, 20., 2),
|
||||||
|
"cameraOdometry": Service(8066, True, 20., 5),
|
||||||
|
"lateralPlan": Service(8067, True, 20., 2),
|
||||||
|
"thumbnail": Service(8069, True, 0.2, 1),
|
||||||
|
"carEvents": Service(8070, True, 1., 1),
|
||||||
|
"carParams": Service(8071, True, 0.02, 1),
|
||||||
|
"driverCameraState": Service(8072, True, 10. if EON else 20., 1),
|
||||||
|
"driverEncodeIdx": Service(8061, True, 10. if EON else 20., 1),
|
||||||
|
"driverState": Service(8063, True, 10. if EON else 20., 1),
|
||||||
|
"driverMonitoringState": Service(8073, True, 10. if EON else 20., 1),
|
||||||
|
"offroadLayout": Service(8074, False, 0.),
|
||||||
|
"wideRoadEncodeIdx": Service(8075, True, 20., 1),
|
||||||
|
"wideRoadCameraState": Service(8076, True, 20., 1),
|
||||||
|
"modelV2": Service(8077, True, 20., 20),
|
||||||
|
"managerState": Service(8078, True, 2., 1),
|
||||||
|
|
||||||
service_list_path = os.path.join(os.path.dirname(__file__), "service_list.yaml")
|
"testModel": Service(8040, False, 0.),
|
||||||
|
"testLiveLocation": Service(8045, False, 0.),
|
||||||
|
"testJoystick": Service(8056, False, 0.),
|
||||||
|
}
|
||||||
|
|
||||||
service_list = {}
|
|
||||||
with open(service_list_path, "r") as f:
|
|
||||||
for k, v in yaml.safe_load(f).items():
|
|
||||||
decimation = None
|
|
||||||
if len(v) == 4:
|
|
||||||
decimation = v[3]
|
|
||||||
|
|
||||||
service_list[k] = Service(v[0], v[1], v[2], decimation)
|
def build_header():
|
||||||
|
h = ""
|
||||||
|
h += "/* THIS IS AN AUTOGENERATED FILE, PLEASE EDIT services.py */\n"
|
||||||
|
h += "#ifndef __SERVICES_H\n"
|
||||||
|
h += "#define __SERVICES_H\n"
|
||||||
|
h += "struct service { char name[0x100]; int port; bool should_log; int frequency; int decimation; };\n"
|
||||||
|
h += "static struct service services[] = {\n"
|
||||||
|
for k, v in service_list.items():
|
||||||
|
should_log = "true" if v.should_log else "false"
|
||||||
|
decimation = -1 if v.decimation is None else v.decimation
|
||||||
|
h += ' { .name = "%s", .port = %d, .should_log = %s, .frequency = %d, .decimation = %d },\n' % \
|
||||||
|
(k, v.port, should_log, v.frequency, decimation)
|
||||||
|
h += "};\n"
|
||||||
|
h += "#endif\n"
|
||||||
|
return h
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print("/* THIS IS AN AUTOGENERATED FILE, PLEASE EDIT service_list.yaml */")
|
print(build_header())
|
||||||
print("#ifndef __SERVICES_H")
|
|
||||||
print("#define __SERVICES_H")
|
|
||||||
print("struct service { char name[0x100]; int port; bool should_log; int frequency; int decimation; };")
|
|
||||||
print("static struct service services[] = {")
|
|
||||||
for k, v in service_list.items():
|
|
||||||
print(' { .name = "%s", .port = %d, .should_log = %s, .frequency = %d, .decimation = %d },' % (k, v.port, "true" if v.should_log else "false", v.frequency, -1 if v.decimation is None else v.decimation))
|
|
||||||
print("};")
|
|
||||||
print("#endif")
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
visionipc_pyx.cpp
|
||||||
|
*.so
|
|
@ -1,6 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdbool.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -10,16 +9,19 @@
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define getsocket() socket(AF_UNIX, SOCK_STREAM, 0)
|
||||||
|
#else
|
||||||
|
#define getsocket() socket(AF_UNIX, SOCK_SEQPACKET, 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "ipc.h"
|
#include "ipc.h"
|
||||||
|
|
||||||
int ipc_connect(const char* socket_path) {
|
int ipc_connect(const char* socket_path) {
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
#ifdef __APPLE__
|
int sock = getsocket();
|
||||||
int sock = socket(AF_UNIX, SOCK_STREAM, 0);
|
|
||||||
#else
|
|
||||||
int sock = socket(AF_UNIX, SOCK_SEQPACKET, 0);
|
|
||||||
#endif
|
|
||||||
if (sock < 0) return -1;
|
if (sock < 0) return -1;
|
||||||
struct sockaddr_un addr = {
|
struct sockaddr_un addr = {
|
||||||
.sun_family = AF_UNIX,
|
.sun_family = AF_UNIX,
|
||||||
|
@ -39,11 +41,8 @@ int ipc_bind(const char* socket_path) {
|
||||||
|
|
||||||
unlink(socket_path);
|
unlink(socket_path);
|
||||||
|
|
||||||
#ifdef __APPLE__
|
int sock = getsocket();
|
||||||
int sock = socket(AF_UNIX, SOCK_STREAM, 0);
|
|
||||||
#else
|
|
||||||
int sock = socket(AF_UNIX, SOCK_SEQPACKET, 0);
|
|
||||||
#endif
|
|
||||||
struct sockaddr_un addr = {
|
struct sockaddr_un addr = {
|
||||||
.sun_family = AF_UNIX,
|
.sun_family = AF_UNIX,
|
||||||
};
|
};
|
||||||
|
@ -87,7 +86,6 @@ int ipc_sendrecv_with_fds(bool send, int fd, void *buf, size_t buf_size, int* fd
|
||||||
cmsg->cmsg_type = SCM_RIGHTS;
|
cmsg->cmsg_type = SCM_RIGHTS;
|
||||||
cmsg->cmsg_len = CMSG_LEN(sizeof(int) * num_fds);
|
cmsg->cmsg_len = CMSG_LEN(sizeof(int) * num_fds);
|
||||||
memcpy(CMSG_DATA(cmsg), fds, sizeof(int) * num_fds);
|
memcpy(CMSG_DATA(cmsg), fds, sizeof(int) * num_fds);
|
||||||
// printf("send clen %d -> %d\n", num_fds, cmsg->cmsg_len);
|
|
||||||
}
|
}
|
||||||
return sendmsg(fd, &msg, 0);
|
return sendmsg(fd, &msg, 0);
|
||||||
} else {
|
} else {
|
||||||
|
@ -102,8 +100,6 @@ int ipc_sendrecv_with_fds(bool send, int fd, void *buf, size_t buf_size, int* fd
|
||||||
recv_fds = (cmsg->cmsg_len - CMSG_LEN(0));
|
recv_fds = (cmsg->cmsg_len - CMSG_LEN(0));
|
||||||
assert(recv_fds > 0 && (recv_fds % sizeof(int)) == 0);
|
assert(recv_fds > 0 && (recv_fds % sizeof(int)) == 0);
|
||||||
recv_fds /= sizeof(int);
|
recv_fds /= sizeof(int);
|
||||||
// printf("recv clen %d -> %d\n", cmsg->cmsg_len, recv_fds);
|
|
||||||
// assert(cmsg->cmsg_len == CMSG_LEN(sizeof(int) * num_fds));
|
|
||||||
|
|
||||||
assert(fds && recv_fds <= num_fds);
|
assert(fds && recv_fds <= num_fds);
|
||||||
memcpy(fds, CMSG_DATA(cmsg), sizeof(int) * recv_fds);
|
memcpy(fds, CMSG_DATA(cmsg), sizeof(int) * recv_fds);
|
|
@ -1,19 +1,7 @@
|
||||||
#ifndef IPC_H
|
#pragma once
|
||||||
#define IPC_H
|
#include <cstddef>
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int ipc_connect(const char* socket_path);
|
int ipc_connect(const char* socket_path);
|
||||||
int ipc_bind(const char* socket_path);
|
int ipc_bind(const char* socket_path);
|
||||||
int ipc_sendrecv_with_fds(bool send, int fd, void *buf, size_t buf_size, int* fds, int num_fds,
|
int ipc_sendrecv_with_fds(bool send, int fd, void *buf, size_t buf_size, int* fds, int num_fds,
|
||||||
int *out_num_fds);
|
int *out_num_fds);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
#define CATCH_CONFIG_MAIN
|
||||||
|
#include "catch2/catch.hpp"
|
|
@ -0,0 +1,40 @@
|
||||||
|
#include "visionbuf.h"
|
||||||
|
|
||||||
|
#define ALIGN(x, align) (((x) + (align)-1) & ~((align)-1))
|
||||||
|
|
||||||
|
#ifdef QCOM
|
||||||
|
// from libadreno_utils.so
|
||||||
|
extern "C" void compute_aligned_width_and_height(int width,
|
||||||
|
int height,
|
||||||
|
int bpp,
|
||||||
|
int tile_mode,
|
||||||
|
int raster_mode,
|
||||||
|
int padding_threshold,
|
||||||
|
int *aligned_w,
|
||||||
|
int *aligned_h);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void visionbuf_compute_aligned_width_and_height(int width, int height, int *aligned_w, int *aligned_h) {
|
||||||
|
#if defined(QCOM) && !defined(QCOM_REPLAY)
|
||||||
|
compute_aligned_width_and_height(ALIGN(width, 32), ALIGN(height, 32), 3, 0, 0, 512, aligned_w, aligned_h);
|
||||||
|
#else
|
||||||
|
*aligned_w = width; *aligned_h = height;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisionBuf::init_rgb(size_t width, size_t height, size_t stride) {
|
||||||
|
this->rgb = true;
|
||||||
|
this->width = width;
|
||||||
|
this->height = height;
|
||||||
|
this->stride = stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisionBuf::init_yuv(size_t width, size_t height){
|
||||||
|
this->rgb = false;
|
||||||
|
this->width = width;
|
||||||
|
this->height = height;
|
||||||
|
|
||||||
|
this->y = (uint8_t *)this->addr;
|
||||||
|
this->u = this->y + (width * height);
|
||||||
|
this->v = this->u + (width / 2 * height / 2);
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
#pragma once
|
||||||
|
#include "visionipc.h"
|
||||||
|
|
||||||
|
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <OpenCL/cl.h>
|
||||||
|
#else
|
||||||
|
#include <CL/cl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VISIONBUF_SYNC_FROM_DEVICE 0
|
||||||
|
#define VISIONBUF_SYNC_TO_DEVICE 1
|
||||||
|
|
||||||
|
enum VisionStreamType {
|
||||||
|
VISION_STREAM_RGB_BACK,
|
||||||
|
VISION_STREAM_RGB_FRONT,
|
||||||
|
VISION_STREAM_RGB_WIDE,
|
||||||
|
VISION_STREAM_YUV_BACK,
|
||||||
|
VISION_STREAM_YUV_FRONT,
|
||||||
|
VISION_STREAM_YUV_WIDE,
|
||||||
|
VISION_STREAM_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
class VisionBuf {
|
||||||
|
public:
|
||||||
|
size_t len = 0;
|
||||||
|
size_t mmap_len = 0;
|
||||||
|
void * addr = nullptr;
|
||||||
|
int fd = 0;
|
||||||
|
|
||||||
|
bool rgb = false;
|
||||||
|
size_t width = 0;
|
||||||
|
size_t height = 0;
|
||||||
|
size_t stride = 0;
|
||||||
|
|
||||||
|
// YUV
|
||||||
|
uint8_t * y = nullptr;
|
||||||
|
uint8_t * u = nullptr;
|
||||||
|
uint8_t * v = nullptr;
|
||||||
|
|
||||||
|
// Visionipc
|
||||||
|
uint64_t server_id = 0;
|
||||||
|
size_t idx = 0;
|
||||||
|
VisionStreamType type;
|
||||||
|
|
||||||
|
// OpenCL
|
||||||
|
cl_mem buf_cl = nullptr;
|
||||||
|
cl_command_queue copy_q = nullptr;
|
||||||
|
|
||||||
|
// ion
|
||||||
|
int handle = 0;
|
||||||
|
bool owner = false;
|
||||||
|
|
||||||
|
void allocate(size_t len);
|
||||||
|
void import();
|
||||||
|
void init_cl(cl_device_id device_id, cl_context ctx);
|
||||||
|
void init_rgb(size_t width, size_t height, size_t stride);
|
||||||
|
void init_yuv(size_t width, size_t height);
|
||||||
|
void sync(int dir);
|
||||||
|
void free();
|
||||||
|
};
|
||||||
|
|
||||||
|
void visionbuf_compute_aligned_width_and_height(int width, int height, int *aligned_w, int *aligned_h);
|
|
@ -0,0 +1,86 @@
|
||||||
|
#include "visionbuf.h"
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
std::atomic<int> offset = 0;
|
||||||
|
|
||||||
|
static void *malloc_with_fd(size_t len, int *fd) {
|
||||||
|
char full_path[0x100];
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
snprintf(full_path, sizeof(full_path)-1, "/tmp/visionbuf_%d_%d", getpid(), offset++);
|
||||||
|
#else
|
||||||
|
snprintf(full_path, sizeof(full_path)-1, "/dev/shm/visionbuf_%d_%d", getpid(), offset++);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*fd = open(full_path, O_RDWR | O_CREAT, 0777);
|
||||||
|
assert(*fd >= 0);
|
||||||
|
|
||||||
|
unlink(full_path);
|
||||||
|
|
||||||
|
ftruncate(*fd, len);
|
||||||
|
void *addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, *fd, 0);
|
||||||
|
assert(addr != MAP_FAILED);
|
||||||
|
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisionBuf::allocate(size_t len) {
|
||||||
|
int fd;
|
||||||
|
void *addr = malloc_with_fd(len, &fd);
|
||||||
|
|
||||||
|
this->len = len;
|
||||||
|
this->mmap_len = len;
|
||||||
|
this->addr = addr;
|
||||||
|
this->fd = fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisionBuf::init_cl(cl_device_id device_id, cl_context ctx){
|
||||||
|
int err;
|
||||||
|
|
||||||
|
this->copy_q = clCreateCommandQueue(ctx, device_id, 0, &err);
|
||||||
|
assert(err == 0);
|
||||||
|
|
||||||
|
this->buf_cl = clCreateBuffer(ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, this->len, this->addr, &err);
|
||||||
|
assert(err == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VisionBuf::import(){
|
||||||
|
assert(this->fd >= 0);
|
||||||
|
this->addr = mmap(NULL, this->mmap_len, PROT_READ | PROT_WRITE, MAP_SHARED, this->fd, 0);
|
||||||
|
assert(this->addr != MAP_FAILED);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VisionBuf::sync(int dir) {
|
||||||
|
int err = 0;
|
||||||
|
if (!this->buf_cl) return;
|
||||||
|
|
||||||
|
if (dir == VISIONBUF_SYNC_FROM_DEVICE) {
|
||||||
|
err = clEnqueueReadBuffer(this->copy_q, this->buf_cl, CL_FALSE, 0, this->len, this->addr, 0, NULL, NULL);
|
||||||
|
} else {
|
||||||
|
err = clEnqueueWriteBuffer(this->copy_q, this->buf_cl, CL_FALSE, 0, this->len, this->addr, 0, NULL, NULL);
|
||||||
|
}
|
||||||
|
assert(err == 0);
|
||||||
|
clFinish(this->copy_q);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisionBuf::free() {
|
||||||
|
if (this->buf_cl){
|
||||||
|
int err = clReleaseMemObject(this->buf_cl);
|
||||||
|
assert(err == 0);
|
||||||
|
|
||||||
|
clReleaseCommandQueue(this->copy_q);
|
||||||
|
}
|
||||||
|
|
||||||
|
munmap(this->addr, this->len);
|
||||||
|
close(this->fd);
|
||||||
|
}
|
|
@ -10,7 +10,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <linux/ion.h>
|
#include <linux/ion.h>
|
||||||
#include <CL/cl_ext.h>
|
#include <CL/cl_ext.h>
|
||||||
#include "common/clutil.h"
|
|
||||||
#include <msm_ion.h>
|
#include <msm_ion.h>
|
||||||
|
|
||||||
#include "visionbuf.h"
|
#include "visionbuf.h"
|
||||||
|
@ -36,7 +36,7 @@ static void ion_init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VisionBuf visionbuf_allocate(size_t len) {
|
void VisionBuf::allocate(size_t len) {
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
ion_init();
|
ion_init();
|
||||||
|
@ -62,46 +62,58 @@ VisionBuf visionbuf_allocate(size_t len) {
|
||||||
|
|
||||||
memset(addr, 0, ion_alloc.len);
|
memset(addr, 0, ion_alloc.len);
|
||||||
|
|
||||||
return (VisionBuf){
|
this->owner = true;
|
||||||
.len = len,
|
this->len = len;
|
||||||
.mmap_len = ion_alloc.len,
|
this->mmap_len = ion_alloc.len;
|
||||||
.addr = addr,
|
this->addr = addr;
|
||||||
.handle = ion_alloc.handle,
|
this->handle = ion_alloc.handle;
|
||||||
.fd = ion_fd_data.fd,
|
this->fd = ion_fd_data.fd;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VisionBuf visionbuf_allocate_cl(size_t len, cl_device_id device_id, cl_context ctx) {
|
void VisionBuf::import(){
|
||||||
VisionBuf buf = visionbuf_allocate(len);
|
int err;
|
||||||
|
assert(this->fd >= 0);
|
||||||
|
|
||||||
assert(((uintptr_t)buf.addr % DEVICE_PAGE_SIZE_CL) == 0);
|
ion_init();
|
||||||
|
|
||||||
|
// Get handle
|
||||||
|
struct ion_fd_data fd_data = {0};
|
||||||
|
fd_data.fd = this->fd;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisionBuf::init_cl(cl_device_id device_id, cl_context ctx) {
|
||||||
|
int err;
|
||||||
|
|
||||||
|
assert(((uintptr_t)this->addr % DEVICE_PAGE_SIZE_CL) == 0);
|
||||||
|
|
||||||
cl_mem_ion_host_ptr ion_cl = {0};
|
cl_mem_ion_host_ptr ion_cl = {0};
|
||||||
ion_cl.ext_host_ptr.allocation_type = CL_MEM_ION_HOST_PTR_QCOM;
|
ion_cl.ext_host_ptr.allocation_type = CL_MEM_ION_HOST_PTR_QCOM;
|
||||||
ion_cl.ext_host_ptr.host_cache_policy = CL_MEM_HOST_UNCACHED_QCOM;
|
ion_cl.ext_host_ptr.host_cache_policy = CL_MEM_HOST_UNCACHED_QCOM;
|
||||||
ion_cl.ion_filedesc = buf.fd;
|
ion_cl.ion_filedesc = this->fd;
|
||||||
ion_cl.ion_hostptr = buf.addr;
|
ion_cl.ion_hostptr = this->addr;
|
||||||
|
|
||||||
buf.buf_cl = CL_CHECK_ERR(clCreateBuffer(ctx,
|
this->buf_cl = clCreateBuffer(ctx,
|
||||||
CL_MEM_USE_HOST_PTR | CL_MEM_EXT_HOST_PTR_QCOM,
|
CL_MEM_USE_HOST_PTR | CL_MEM_EXT_HOST_PTR_QCOM,
|
||||||
buf.len, &ion_cl, &err));
|
this->len, &ion_cl, &err);
|
||||||
return buf;
|
assert(err == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void visionbuf_sync(const VisionBuf* buf, int dir) {
|
void VisionBuf::sync(int dir) {
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
struct ion_fd_data fd_data = {0};
|
|
||||||
fd_data.fd = buf->fd;
|
|
||||||
err = ioctl(ion_fd, ION_IOC_IMPORT, &fd_data);
|
|
||||||
assert(err == 0);
|
|
||||||
|
|
||||||
struct ion_flush_data flush_data = {0};
|
struct ion_flush_data flush_data = {0};
|
||||||
flush_data.handle = fd_data.handle;
|
flush_data.handle = this->handle;
|
||||||
flush_data.vaddr = buf->addr;
|
flush_data.vaddr = this->addr;
|
||||||
flush_data.offset = 0;
|
flush_data.offset = 0;
|
||||||
flush_data.length = buf->len;
|
flush_data.length = this->len;
|
||||||
|
|
||||||
// ION_IOC_INV_CACHES ~= DMA_FROM_DEVICE
|
// ION_IOC_INV_CACHES ~= DMA_FROM_DEVICE
|
||||||
// ION_IOC_CLEAN_CACHES ~= DMA_TO_DEVICE
|
// ION_IOC_CLEAN_CACHES ~= DMA_TO_DEVICE
|
||||||
|
@ -109,36 +121,28 @@ void visionbuf_sync(const VisionBuf* buf, int dir) {
|
||||||
|
|
||||||
struct ion_custom_data custom_data = {0};
|
struct ion_custom_data custom_data = {0};
|
||||||
|
|
||||||
switch (dir) {
|
assert(dir == VISIONBUF_SYNC_FROM_DEVICE || dir == VISIONBUF_SYNC_TO_DEVICE);
|
||||||
case VISIONBUF_SYNC_FROM_DEVICE:
|
custom_data.cmd = (dir == VISIONBUF_SYNC_FROM_DEVICE) ?
|
||||||
custom_data.cmd = ION_IOC_INV_CACHES;
|
ION_IOC_INV_CACHES : ION_IOC_CLEAN_CACHES;
|
||||||
break;
|
|
||||||
case VISIONBUF_SYNC_TO_DEVICE:
|
|
||||||
custom_data.cmd = ION_IOC_CLEAN_CACHES;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
custom_data.arg = (unsigned long)&flush_data;
|
custom_data.arg = (unsigned long)&flush_data;
|
||||||
err = ioctl(ion_fd, ION_IOC_CUSTOM, &custom_data);
|
err = ioctl(ion_fd, ION_IOC_CUSTOM, &custom_data);
|
||||||
assert(err == 0);
|
assert(err == 0);
|
||||||
|
|
||||||
struct ion_handle_data handle_data = {0};
|
|
||||||
handle_data.handle = fd_data.handle;
|
|
||||||
err = ioctl(ion_fd, ION_IOC_FREE, &handle_data);
|
|
||||||
assert(err == 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void visionbuf_free(const VisionBuf* buf) {
|
void VisionBuf::free() {
|
||||||
if (buf->buf_cl) {
|
if (this->buf_cl){
|
||||||
CL_CHECK(clReleaseMemObject(buf->buf_cl));
|
int err = clReleaseMemObject(this->buf_cl);
|
||||||
|
assert(err == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
munmap(buf->addr, buf->mmap_len);
|
|
||||||
close(buf->fd);
|
|
||||||
struct ion_handle_data handle_data = {
|
|
||||||
.handle = buf->handle,
|
|
||||||
};
|
|
||||||
int ret = ioctl(ion_fd, ION_IOC_FREE, &handle_data);
|
|
||||||
assert(ret == 0);
|
|
||||||
}
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
constexpr int VISIONIPC_MAX_FDS = 64;
|
||||||
|
|
||||||
|
struct VisionIpcBufExtra {
|
||||||
|
uint32_t frame_id;
|
||||||
|
uint64_t timestamp_sof;
|
||||||
|
uint64_t timestamp_eof;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VisionIpcPacket {
|
||||||
|
uint64_t server_id;
|
||||||
|
size_t idx;
|
||||||
|
struct VisionIpcBufExtra extra;
|
||||||
|
};
|
|
@ -0,0 +1,29 @@
|
||||||
|
# distutils: language = c++
|
||||||
|
#cython: language_level=3
|
||||||
|
|
||||||
|
from libcpp.string cimport string
|
||||||
|
from libcpp.vector cimport vector
|
||||||
|
from libc.stdint cimport uint32_t, uint64_t
|
||||||
|
from libcpp cimport bool
|
||||||
|
|
||||||
|
cdef extern from "visionbuf.h":
|
||||||
|
cdef enum VisionStreamType:
|
||||||
|
pass
|
||||||
|
|
||||||
|
cdef cppclass VisionBuf:
|
||||||
|
void * addr
|
||||||
|
size_t len
|
||||||
|
|
||||||
|
cdef extern from "visionipc.h":
|
||||||
|
struct VisionIpcBufExtra:
|
||||||
|
uint32_t frame_id
|
||||||
|
uint64_t timestamp_sof
|
||||||
|
uint64_t timestamp_eof
|
||||||
|
|
||||||
|
cdef extern from "visionipc_server.h":
|
||||||
|
cdef cppclass VisionIpcServer:
|
||||||
|
VisionIpcServer(string, void*, void*)
|
||||||
|
void create_buffers(VisionStreamType, size_t, bool, size_t, size_t)
|
||||||
|
VisionBuf * get_buffer(VisionStreamType)
|
||||||
|
void send(VisionBuf *, VisionIpcBufExtra *, bool)
|
||||||
|
void start_listener()
|
|
@ -0,0 +1,119 @@
|
||||||
|
#include <chrono>
|
||||||
|
#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#include "ipc.h"
|
||||||
|
#include "visionipc_client.h"
|
||||||
|
#include "visionipc_server.h"
|
||||||
|
|
||||||
|
VisionIpcClient::VisionIpcClient(std::string name, VisionStreamType type, bool conflate, cl_device_id device_id, cl_context ctx) : name(name), type(type), device_id(device_id), ctx(ctx) {
|
||||||
|
msg_ctx = Context::create();
|
||||||
|
sock = SubSocket::create(msg_ctx, get_endpoint_name(name, type), "127.0.0.1", conflate, false);
|
||||||
|
|
||||||
|
poller = Poller::create();
|
||||||
|
poller->registerSocket(sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect is not thread safe. Do not use the buffers while calling connect
|
||||||
|
bool VisionIpcClient::connect(bool blocking){
|
||||||
|
connected = false;
|
||||||
|
|
||||||
|
// Cleanup old buffers on reconnect
|
||||||
|
for (size_t i = 0; i < num_buffers; i++){
|
||||||
|
buffers[i].free();
|
||||||
|
}
|
||||||
|
num_buffers = 0;
|
||||||
|
|
||||||
|
// Connect to server socket and ask for all FDs of type
|
||||||
|
std::string path = "/tmp/visionipc_" + name;
|
||||||
|
|
||||||
|
int socket_fd = -1;
|
||||||
|
while (socket_fd < 0) {
|
||||||
|
socket_fd = ipc_connect(path.c_str());
|
||||||
|
|
||||||
|
if (socket_fd < 0) {
|
||||||
|
if (blocking){
|
||||||
|
std::cout << "VisionIpcClient connecting" << std::endl;
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send stream type to server to request FDs
|
||||||
|
int r = ipc_sendrecv_with_fds(true, socket_fd, &type, sizeof(type), nullptr, 0, nullptr);
|
||||||
|
assert(r == sizeof(type));
|
||||||
|
|
||||||
|
// Get FDs
|
||||||
|
int fds[VISIONIPC_MAX_FDS];
|
||||||
|
VisionBuf bufs[VISIONIPC_MAX_FDS];
|
||||||
|
r = ipc_sendrecv_with_fds(false, socket_fd, &bufs, sizeof(bufs), fds, VISIONIPC_MAX_FDS, &num_buffers);
|
||||||
|
|
||||||
|
assert(num_buffers > 0);
|
||||||
|
assert(r == sizeof(VisionBuf) * num_buffers);
|
||||||
|
|
||||||
|
// Import buffers
|
||||||
|
for (size_t i = 0; i < num_buffers; i++){
|
||||||
|
buffers[i] = bufs[i];
|
||||||
|
buffers[i].fd = fds[i];
|
||||||
|
buffers[i].import();
|
||||||
|
if (buffers[i].rgb) {
|
||||||
|
buffers[i].init_rgb(buffers[i].width, buffers[i].height, buffers[i].stride);
|
||||||
|
} else {
|
||||||
|
buffers[i].init_yuv(buffers[i].width, buffers[i].height);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (device_id) buffers[i].init_cl(device_id, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
connected = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
VisionBuf * VisionIpcClient::recv(VisionIpcBufExtra * extra, const int timeout_ms){
|
||||||
|
auto p = poller->poll(timeout_ms);
|
||||||
|
|
||||||
|
if (!p.size()){
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Message * r = sock->receive(true);
|
||||||
|
if (r == nullptr){
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get buffer
|
||||||
|
assert(r->getSize() == sizeof(VisionIpcPacket));
|
||||||
|
VisionIpcPacket *packet = (VisionIpcPacket*)r->getData();
|
||||||
|
|
||||||
|
assert(packet->idx < num_buffers);
|
||||||
|
VisionBuf * buf = &buffers[packet->idx];
|
||||||
|
|
||||||
|
if (buf->server_id != packet->server_id){
|
||||||
|
connected = false;
|
||||||
|
delete r;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extra) {
|
||||||
|
*extra = packet->extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf->sync(VISIONBUF_SYNC_TO_DEVICE);
|
||||||
|
delete r;
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VisionIpcClient::~VisionIpcClient(){
|
||||||
|
for (size_t i = 0; i < num_buffers; i++){
|
||||||
|
buffers[i].free();
|
||||||
|
}
|
||||||
|
|
||||||
|
delete sock;
|
||||||
|
delete poller;
|
||||||
|
delete msg_ctx;
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
#pragma once
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "messaging.hpp"
|
||||||
|
#include "visionipc.h"
|
||||||
|
#include "visionbuf.h"
|
||||||
|
|
||||||
|
class VisionIpcClient {
|
||||||
|
private:
|
||||||
|
std::string name;
|
||||||
|
Context * msg_ctx;
|
||||||
|
SubSocket * sock;
|
||||||
|
Poller * poller;
|
||||||
|
|
||||||
|
VisionStreamType type;
|
||||||
|
|
||||||
|
cl_device_id device_id = nullptr;
|
||||||
|
cl_context ctx = nullptr;
|
||||||
|
|
||||||
|
void init_msgq(bool conflate);
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool connected = false;
|
||||||
|
int num_buffers = 0;
|
||||||
|
VisionBuf buffers[VISIONIPC_MAX_FDS];
|
||||||
|
VisionIpcClient(std::string name, VisionStreamType type, bool conflate, cl_device_id device_id=nullptr, cl_context ctx=nullptr);
|
||||||
|
~VisionIpcClient();
|
||||||
|
VisionBuf * recv(VisionIpcBufExtra * extra=nullptr, const int timeout_ms=100);
|
||||||
|
bool connect(bool blocking=true);
|
||||||
|
};
|
|
@ -0,0 +1,49 @@
|
||||||
|
# distutils: language = c++
|
||||||
|
# cython: c_string_encoding=ascii, language_level=3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from libcpp.string cimport string
|
||||||
|
from libcpp cimport bool
|
||||||
|
from libc.string cimport memcpy
|
||||||
|
from libc.stdint cimport uint32_t, uint64_t
|
||||||
|
|
||||||
|
from .visionipc cimport VisionIpcServer as cppVisionIpcServer
|
||||||
|
from .visionipc cimport VisionBuf as cppVisionBuf
|
||||||
|
from .visionipc cimport VisionIpcBufExtra
|
||||||
|
|
||||||
|
cpdef enum VisionStreamType:
|
||||||
|
VISION_STREAM_RGB_BACK
|
||||||
|
VISION_STREAM_RGB_FRONT
|
||||||
|
VISION_STREAM_RGB_WIDE
|
||||||
|
VISION_STREAM_YUV_BACK
|
||||||
|
VISION_STREAM_YUV_FRONT
|
||||||
|
VISION_STREAM_YUV_WIDE
|
||||||
|
|
||||||
|
cdef class VisionIpcServer:
|
||||||
|
cdef cppVisionIpcServer * server
|
||||||
|
|
||||||
|
def __init__(self, string name):
|
||||||
|
self.server = new cppVisionIpcServer(name, NULL, NULL)
|
||||||
|
|
||||||
|
def create_buffers(self, VisionStreamType tp, size_t num_buffers, bool rgb, size_t width, size_t height):
|
||||||
|
self.server.create_buffers(tp, num_buffers, rgb, width, height)
|
||||||
|
|
||||||
|
def send(self, VisionStreamType tp, bytes data, uint32_t frame_id=0, uint64_t timestamp_sof=0, uint64_t timestamp_eof=0):
|
||||||
|
cdef cppVisionBuf * buf = self.server.get_buffer(tp)
|
||||||
|
|
||||||
|
# Populate buffer
|
||||||
|
assert buf.len == len(data)
|
||||||
|
memcpy(buf.addr, <char*>data, len(data))
|
||||||
|
|
||||||
|
cdef VisionIpcBufExtra extra
|
||||||
|
extra.frame_id = frame_id
|
||||||
|
extra.timestamp_sof = timestamp_sof
|
||||||
|
extra.timestamp_eof = timestamp_eof
|
||||||
|
|
||||||
|
self.server.send(buf, &extra, False)
|
||||||
|
|
||||||
|
def start_listener(self):
|
||||||
|
self.server.start_listener()
|
||||||
|
|
||||||
|
def __dealloc__(self):
|
||||||
|
del self.server
|
|
@ -0,0 +1,179 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <chrono>
|
||||||
|
#include <cassert>
|
||||||
|
#include <random>
|
||||||
|
|
||||||
|
#include <poll.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "messaging.hpp"
|
||||||
|
#include "ipc.h"
|
||||||
|
#include "visionipc_server.h"
|
||||||
|
|
||||||
|
std::string get_endpoint_name(std::string name, VisionStreamType type){
|
||||||
|
if (messaging_use_zmq()){
|
||||||
|
assert(name == "camerad");
|
||||||
|
return std::to_string(9000 + static_cast<int>(type));
|
||||||
|
} else {
|
||||||
|
return "visionipc_" + name + "_" + std::to_string(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VisionIpcServer::VisionIpcServer(std::string name, cl_device_id device_id, cl_context ctx) : name(name), device_id(device_id), ctx(ctx) {
|
||||||
|
msg_ctx = Context::create();
|
||||||
|
|
||||||
|
std::random_device rd("/dev/urandom");
|
||||||
|
std::uniform_int_distribution<uint64_t> distribution(0,std::numeric_limits<uint64_t>::max());
|
||||||
|
server_id = distribution(rd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisionIpcServer::create_buffers(VisionStreamType type, size_t num_buffers, bool rgb, size_t width, size_t height){
|
||||||
|
// TODO: assert that this type is not created yet
|
||||||
|
assert(num_buffers < VISIONIPC_MAX_FDS);
|
||||||
|
int aligned_w = 0, aligned_h = 0;
|
||||||
|
|
||||||
|
size_t size = 0;
|
||||||
|
size_t stride = 0; // Only used for RGB
|
||||||
|
|
||||||
|
if (rgb) {
|
||||||
|
visionbuf_compute_aligned_width_and_height(width, height, &aligned_w, &aligned_h);
|
||||||
|
size = (size_t)aligned_w * (size_t)aligned_h * 3;
|
||||||
|
stride = aligned_w * 3;
|
||||||
|
} else {
|
||||||
|
size = width * height * 3 / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Create map + alloc requested buffers
|
||||||
|
for (size_t i = 0; i < num_buffers; i++){
|
||||||
|
VisionBuf* buf = new VisionBuf();
|
||||||
|
buf->allocate(size);
|
||||||
|
buf->idx = i;
|
||||||
|
buf->type = type;
|
||||||
|
|
||||||
|
if (device_id) buf->init_cl(device_id, ctx);
|
||||||
|
|
||||||
|
rgb ? buf->init_rgb(width, height, stride) : buf->init_yuv(width, height);
|
||||||
|
|
||||||
|
buffers[type].push_back(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
cur_idx[type] = 0;
|
||||||
|
|
||||||
|
// Create msgq publisher for each of the `name` + type combos
|
||||||
|
// TODO: compute port number directly if using zmq
|
||||||
|
sockets[type] = PubSocket::create(msg_ctx, get_endpoint_name(name, type), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VisionIpcServer::start_listener(){
|
||||||
|
listener_thread = std::thread(&VisionIpcServer::listener, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VisionIpcServer::listener(){
|
||||||
|
std::cout << "Starting listener for: " << name << std::endl;
|
||||||
|
|
||||||
|
std::string path = "/tmp/visionipc_" + name;
|
||||||
|
int sock = ipc_bind(path.c_str());
|
||||||
|
assert(sock >= 0);
|
||||||
|
|
||||||
|
while (!should_exit){
|
||||||
|
// Wait for incoming connection
|
||||||
|
struct pollfd polls[1] = {{0}};
|
||||||
|
polls[0].fd = sock;
|
||||||
|
polls[0].events = POLLIN;
|
||||||
|
|
||||||
|
int ret = poll(polls, 1, 100);
|
||||||
|
if (ret < 0) {
|
||||||
|
if (errno == EINTR || errno == EAGAIN) continue;
|
||||||
|
std::cout << "poll failed, stopping listener" << std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (should_exit) break;
|
||||||
|
if (!polls[0].revents) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle incoming request
|
||||||
|
int fd = accept(sock, NULL, NULL);
|
||||||
|
assert(fd >= 0);
|
||||||
|
|
||||||
|
VisionStreamType type = VisionStreamType::VISION_STREAM_MAX;
|
||||||
|
int r = ipc_sendrecv_with_fds(false, fd, &type, sizeof(type), nullptr, 0, nullptr);
|
||||||
|
assert(r == sizeof(type));
|
||||||
|
if (buffers.count(type) <= 0) {
|
||||||
|
std::cout << "got request for invalid buffer type: " << type << std::endl;
|
||||||
|
close(fd);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fds[VISIONIPC_MAX_FDS];
|
||||||
|
int num_fds = buffers[type].size();
|
||||||
|
VisionBuf bufs[VISIONIPC_MAX_FDS];
|
||||||
|
|
||||||
|
for (int i = 0; i < num_fds; i++){
|
||||||
|
fds[i] = buffers[type][i]->fd;
|
||||||
|
bufs[i] = *buffers[type][i];
|
||||||
|
|
||||||
|
// Remove some private openCL/ion metadata
|
||||||
|
bufs[i].buf_cl = 0;
|
||||||
|
bufs[i].copy_q = 0;
|
||||||
|
bufs[i].handle = 0;
|
||||||
|
bufs[i].owner = false;
|
||||||
|
|
||||||
|
bufs[i].server_id = server_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = ipc_sendrecv_with_fds(true, fd, &bufs, sizeof(VisionBuf) * num_fds, fds, num_fds, nullptr);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "Stopping listener for: " << name << std::endl;
|
||||||
|
close(sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VisionBuf * VisionIpcServer::get_buffer(VisionStreamType type){
|
||||||
|
// Do we want to keep track if the buffer has been sent out yet and warn user?
|
||||||
|
assert(buffers.count(type));
|
||||||
|
auto b = buffers[type];
|
||||||
|
return b[cur_idx[type]++ % b.size()];
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisionIpcServer::send(VisionBuf * buf, VisionIpcBufExtra * extra, bool sync){
|
||||||
|
if (sync) buf->sync(VISIONBUF_SYNC_FROM_DEVICE);
|
||||||
|
assert(buffers.count(buf->type));
|
||||||
|
assert(buf->idx < buffers[buf->type].size());
|
||||||
|
|
||||||
|
// Send over correct msgq socket
|
||||||
|
VisionIpcPacket packet = {0};
|
||||||
|
packet.server_id = server_id;
|
||||||
|
packet.idx = buf->idx;
|
||||||
|
packet.extra = *extra;
|
||||||
|
|
||||||
|
sockets[buf->type]->send((char*)&packet, sizeof(packet));
|
||||||
|
}
|
||||||
|
|
||||||
|
VisionIpcServer::~VisionIpcServer(){
|
||||||
|
should_exit = true;
|
||||||
|
listener_thread.join();
|
||||||
|
|
||||||
|
// VisionBuf cleanup
|
||||||
|
for( auto const& [type, buf] : buffers ) {
|
||||||
|
for (VisionBuf* b : buf){
|
||||||
|
b->free();
|
||||||
|
delete b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Messaging cleanup
|
||||||
|
for( auto const& [type, sock] : sockets ) {
|
||||||
|
delete sock;
|
||||||
|
}
|
||||||
|
delete msg_ctx;
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
#pragma once
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <atomic>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
#include "messaging.hpp"
|
||||||
|
#include "visionipc.h"
|
||||||
|
#include "visionbuf.h"
|
||||||
|
|
||||||
|
std::string get_endpoint_name(std::string name, VisionStreamType type);
|
||||||
|
|
||||||
|
class VisionIpcServer {
|
||||||
|
private:
|
||||||
|
cl_device_id device_id = nullptr;
|
||||||
|
cl_context ctx = nullptr;
|
||||||
|
uint64_t server_id;
|
||||||
|
|
||||||
|
std::atomic<bool> should_exit = false;
|
||||||
|
std::string name;
|
||||||
|
std::thread listener_thread;
|
||||||
|
|
||||||
|
std::map<VisionStreamType, std::atomic<size_t> > cur_idx;
|
||||||
|
std::map<VisionStreamType, std::vector<VisionBuf*> > buffers;
|
||||||
|
std::map<VisionStreamType, std::map<VisionBuf*, size_t> > idxs;
|
||||||
|
|
||||||
|
Context * msg_ctx;
|
||||||
|
std::map<VisionStreamType, PubSocket*> sockets;
|
||||||
|
|
||||||
|
void listener(void);
|
||||||
|
|
||||||
|
public:
|
||||||
|
VisionIpcServer(std::string name, cl_device_id device_id=nullptr, cl_context ctx=nullptr);
|
||||||
|
~VisionIpcServer();
|
||||||
|
|
||||||
|
VisionBuf * get_buffer(VisionStreamType type);
|
||||||
|
|
||||||
|
void create_buffers(VisionStreamType type, size_t num_buffers, bool rgb, size_t width, size_t height);
|
||||||
|
void send(VisionBuf * buf, VisionIpcBufExtra * extra, bool sync=true);
|
||||||
|
void start_listener();
|
||||||
|
};
|
|
@ -0,0 +1,135 @@
|
||||||
|
#include <thread>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
#include "catch2/catch.hpp"
|
||||||
|
#include "visionipc_server.h"
|
||||||
|
#include "visionipc_client.h"
|
||||||
|
|
||||||
|
static void zmq_sleep(int milliseconds=1000){
|
||||||
|
if (messaging_use_zmq()){
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Connecting"){
|
||||||
|
VisionIpcServer server("camerad");
|
||||||
|
server.create_buffers(VISION_STREAM_YUV_BACK, 1, false, 100, 100);
|
||||||
|
server.start_listener();
|
||||||
|
|
||||||
|
VisionIpcClient client = VisionIpcClient("camerad", VISION_STREAM_YUV_BACK, false);
|
||||||
|
REQUIRE(client.connect());
|
||||||
|
|
||||||
|
REQUIRE(client.connected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Check buffers"){
|
||||||
|
size_t width = 100, height = 200, num_buffers = 5;
|
||||||
|
VisionIpcServer server("camerad");
|
||||||
|
server.create_buffers(VISION_STREAM_YUV_BACK, num_buffers, false, width, height);
|
||||||
|
server.start_listener();
|
||||||
|
|
||||||
|
VisionIpcClient client = VisionIpcClient("camerad", VISION_STREAM_YUV_BACK, false);
|
||||||
|
REQUIRE(client.connect());
|
||||||
|
|
||||||
|
REQUIRE(client.buffers[0].width == width);
|
||||||
|
REQUIRE(client.buffers[0].height == height);
|
||||||
|
REQUIRE(client.buffers[0].len);
|
||||||
|
REQUIRE(client.num_buffers == num_buffers);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Check yuv/rgb"){
|
||||||
|
VisionIpcServer server("camerad");
|
||||||
|
server.create_buffers(VISION_STREAM_YUV_BACK, 1, false, 100, 100);
|
||||||
|
server.create_buffers(VISION_STREAM_RGB_BACK, 1, true, 100, 100);
|
||||||
|
server.start_listener();
|
||||||
|
|
||||||
|
VisionIpcClient client_yuv = VisionIpcClient("camerad", VISION_STREAM_YUV_BACK, false);
|
||||||
|
VisionIpcClient client_rgb = VisionIpcClient("camerad", VISION_STREAM_RGB_BACK, false);
|
||||||
|
client_yuv.connect();
|
||||||
|
client_rgb.connect();
|
||||||
|
|
||||||
|
REQUIRE(client_rgb.buffers[0].rgb == true);
|
||||||
|
REQUIRE(client_yuv.buffers[0].rgb == false);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Send single buffer"){
|
||||||
|
VisionIpcServer server("camerad");
|
||||||
|
server.create_buffers(VISION_STREAM_YUV_BACK, 1, true, 100, 100);
|
||||||
|
server.start_listener();
|
||||||
|
|
||||||
|
VisionIpcClient client = VisionIpcClient("camerad", VISION_STREAM_YUV_BACK, false);
|
||||||
|
REQUIRE(client.connect());
|
||||||
|
zmq_sleep();
|
||||||
|
|
||||||
|
VisionBuf * buf = server.get_buffer(VISION_STREAM_YUV_BACK);
|
||||||
|
REQUIRE(buf != nullptr);
|
||||||
|
|
||||||
|
*((uint64_t*)buf->addr) = 1234;
|
||||||
|
|
||||||
|
VisionIpcBufExtra extra = {0};
|
||||||
|
extra.frame_id = 1337;
|
||||||
|
|
||||||
|
server.send(buf, &extra);
|
||||||
|
|
||||||
|
VisionIpcBufExtra extra_recv = {0};
|
||||||
|
VisionBuf * recv_buf = client.recv(&extra_recv);
|
||||||
|
REQUIRE(recv_buf != nullptr);
|
||||||
|
REQUIRE(*(uint64_t*)recv_buf->addr == 1234);
|
||||||
|
REQUIRE(extra_recv.frame_id == extra.frame_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST_CASE("Test no conflate"){
|
||||||
|
VisionIpcServer server("camerad");
|
||||||
|
server.create_buffers(VISION_STREAM_YUV_BACK, 1, true, 100, 100);
|
||||||
|
server.start_listener();
|
||||||
|
|
||||||
|
VisionIpcClient client = VisionIpcClient("camerad", VISION_STREAM_YUV_BACK, false);
|
||||||
|
REQUIRE(client.connect());
|
||||||
|
zmq_sleep();
|
||||||
|
|
||||||
|
VisionBuf * buf = server.get_buffer(VISION_STREAM_YUV_BACK);
|
||||||
|
REQUIRE(buf != nullptr);
|
||||||
|
|
||||||
|
VisionIpcBufExtra extra = {0};
|
||||||
|
extra.frame_id = 1;
|
||||||
|
server.send(buf, &extra);
|
||||||
|
extra.frame_id = 2;
|
||||||
|
server.send(buf, &extra);
|
||||||
|
|
||||||
|
VisionIpcBufExtra extra_recv = {0};
|
||||||
|
VisionBuf * recv_buf = client.recv(&extra_recv);
|
||||||
|
REQUIRE(recv_buf != nullptr);
|
||||||
|
REQUIRE(extra_recv.frame_id == 1);
|
||||||
|
|
||||||
|
recv_buf = client.recv(&extra_recv);
|
||||||
|
REQUIRE(recv_buf != nullptr);
|
||||||
|
REQUIRE(extra_recv.frame_id == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Test conflate"){
|
||||||
|
VisionIpcServer server("camerad");
|
||||||
|
server.create_buffers(VISION_STREAM_YUV_BACK, 1, true, 100, 100);
|
||||||
|
server.start_listener();
|
||||||
|
|
||||||
|
VisionIpcClient client = VisionIpcClient("camerad", VISION_STREAM_YUV_BACK, true);
|
||||||
|
REQUIRE(client.connect());
|
||||||
|
zmq_sleep();
|
||||||
|
|
||||||
|
VisionBuf * buf = server.get_buffer(VISION_STREAM_YUV_BACK);
|
||||||
|
REQUIRE(buf != nullptr);
|
||||||
|
|
||||||
|
VisionIpcBufExtra extra = {0};
|
||||||
|
extra.frame_id = 1;
|
||||||
|
server.send(buf, &extra);
|
||||||
|
extra.frame_id = 2;
|
||||||
|
server.send(buf, &extra);
|
||||||
|
|
||||||
|
VisionIpcBufExtra extra_recv = {0};
|
||||||
|
VisionBuf * recv_buf = client.recv(&extra_recv);
|
||||||
|
REQUIRE(recv_buf != nullptr);
|
||||||
|
REQUIRE(extra_recv.frame_id == 2);
|
||||||
|
|
||||||
|
recv_buf = client.recv(&extra_recv);
|
||||||
|
REQUIRE(recv_buf == nullptr);
|
||||||
|
}
|
|
@ -27,7 +27,11 @@ class Api():
|
||||||
'iat': now,
|
'iat': now,
|
||||||
'exp': now + timedelta(hours=1)
|
'exp': now + timedelta(hours=1)
|
||||||
}
|
}
|
||||||
return jwt.encode(payload, self.private_key, algorithm='RS256').decode('utf8')
|
token = jwt.encode(payload, self.private_key, algorithm='RS256')
|
||||||
|
if isinstance(token, bytes):
|
||||||
|
token = token.decode('utf8')
|
||||||
|
return token
|
||||||
|
|
||||||
|
|
||||||
def api_get(endpoint, method='GET', timeout=None, access_token=None, **params):
|
def api_get(endpoint, method='GET', timeout=None, access_token=None, **params):
|
||||||
backend = "https://api.commadotai.com/"
|
backend = "https://api.commadotai.com/"
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
import os
|
import os
|
||||||
BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
|
from pathlib import Path
|
||||||
|
|
||||||
from selfdrive.hardware import PC
|
from selfdrive.hardware import PC
|
||||||
|
|
||||||
|
BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
|
||||||
|
|
||||||
if PC:
|
if PC:
|
||||||
PERSIST = os.path.join(BASEDIR, "persist")
|
PERSIST = os.path.join(str(Path.home()), ".comma", "persist")
|
||||||
else:
|
else:
|
||||||
PERSIST = "/persist"
|
PERSIST = "/persist"
|
||||||
|
|
|
@ -2,3 +2,22 @@ from common.params_pyx import Params, UnknownKeyName, put_nonblocking # pylint:
|
||||||
assert Params
|
assert Params
|
||||||
assert UnknownKeyName
|
assert UnknownKeyName
|
||||||
assert put_nonblocking
|
assert put_nonblocking
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
from common.params_pyx import keys # pylint: disable=no-name-in-module, import-error
|
||||||
|
|
||||||
|
params = Params()
|
||||||
|
if len(sys.argv) == 3:
|
||||||
|
name = sys.argv[1]
|
||||||
|
val = sys.argv[2]
|
||||||
|
assert name.encode("utf-8") in keys.keys(), f"unknown param: {name}"
|
||||||
|
print(f"SET: {name} = {val}")
|
||||||
|
params.put(name, val)
|
||||||
|
elif len(sys.argv) == 2:
|
||||||
|
name = sys.argv[1]
|
||||||
|
assert name.encode("utf-8") in keys.keys(), f"unknown param: {name}"
|
||||||
|
print(f"GET: {name} = {params.get(name)}")
|
||||||
|
else:
|
||||||
|
for k in keys.keys():
|
||||||
|
print(f"GET: {k} = {params.get(k)}")
|
||||||
|
|
|
@ -4,7 +4,7 @@ from libcpp cimport bool
|
||||||
cdef extern from "selfdrive/common/params.cc":
|
cdef extern from "selfdrive/common/params.cc":
|
||||||
pass
|
pass
|
||||||
|
|
||||||
cdef extern from "selfdrive/common/util.c":
|
cdef extern from "selfdrive/common/util.cc":
|
||||||
pass
|
pass
|
||||||
|
|
||||||
cdef extern from "selfdrive/common/params.h":
|
cdef extern from "selfdrive/common/params.h":
|
||||||
|
|
|
@ -31,9 +31,11 @@ keys = {
|
||||||
b"GitCommit": [TxType.PERSISTENT],
|
b"GitCommit": [TxType.PERSISTENT],
|
||||||
b"GitRemote": [TxType.PERSISTENT],
|
b"GitRemote": [TxType.PERSISTENT],
|
||||||
b"GithubSshKeys": [TxType.PERSISTENT],
|
b"GithubSshKeys": [TxType.PERSISTENT],
|
||||||
|
b"HardwareSerial": [TxType.PERSISTENT],
|
||||||
b"HasAcceptedTerms": [TxType.PERSISTENT],
|
b"HasAcceptedTerms": [TxType.PERSISTENT],
|
||||||
b"HasCompletedSetup": [TxType.PERSISTENT],
|
b"HasCompletedSetup": [TxType.PERSISTENT],
|
||||||
b"IsDriverViewEnabled": [TxType.CLEAR_ON_MANAGER_START],
|
b"IsDriverViewEnabled": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
|
b"IMEI": [TxType.PERSISTENT],
|
||||||
b"IsLdwEnabled": [TxType.PERSISTENT],
|
b"IsLdwEnabled": [TxType.PERSISTENT],
|
||||||
b"IsMetric": [TxType.PERSISTENT],
|
b"IsMetric": [TxType.PERSISTENT],
|
||||||
b"IsOffroad": [TxType.CLEAR_ON_MANAGER_START],
|
b"IsOffroad": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
|
@ -42,8 +44,9 @@ keys = {
|
||||||
b"IsUpdateAvailable": [TxType.CLEAR_ON_MANAGER_START],
|
b"IsUpdateAvailable": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
b"IsUploadRawEnabled": [TxType.PERSISTENT],
|
b"IsUploadRawEnabled": [TxType.PERSISTENT],
|
||||||
b"LastAthenaPingTime": [TxType.PERSISTENT],
|
b"LastAthenaPingTime": [TxType.PERSISTENT],
|
||||||
b"LastUpdateTime": [TxType.PERSISTENT],
|
b"LastGPSPosition": [TxType.PERSISTENT],
|
||||||
b"LastUpdateException": [TxType.PERSISTENT],
|
b"LastUpdateException": [TxType.PERSISTENT],
|
||||||
|
b"LastUpdateTime": [TxType.PERSISTENT],
|
||||||
b"LiveParameters": [TxType.PERSISTENT],
|
b"LiveParameters": [TxType.PERSISTENT],
|
||||||
b"OpenpilotEnabledToggle": [TxType.PERSISTENT],
|
b"OpenpilotEnabledToggle": [TxType.PERSISTENT],
|
||||||
b"LaneChangeEnabled": [TxType.PERSISTENT],
|
b"LaneChangeEnabled": [TxType.PERSISTENT],
|
||||||
|
@ -55,11 +58,14 @@ keys = {
|
||||||
b"ReleaseNotes": [TxType.PERSISTENT],
|
b"ReleaseNotes": [TxType.PERSISTENT],
|
||||||
b"ShouldDoUpdate": [TxType.CLEAR_ON_MANAGER_START],
|
b"ShouldDoUpdate": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
b"SubscriberInfo": [TxType.PERSISTENT],
|
b"SubscriberInfo": [TxType.PERSISTENT],
|
||||||
|
b"SshEnabled": [TxType.PERSISTENT],
|
||||||
b"TermsVersion": [TxType.PERSISTENT],
|
b"TermsVersion": [TxType.PERSISTENT],
|
||||||
|
b"Timezone": [TxType.PERSISTENT],
|
||||||
b"TrainingVersion": [TxType.PERSISTENT],
|
b"TrainingVersion": [TxType.PERSISTENT],
|
||||||
b"UpdateAvailable": [TxType.CLEAR_ON_MANAGER_START],
|
b"UpdateAvailable": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
b"UpdateFailedCount": [TxType.CLEAR_ON_MANAGER_START],
|
b"UpdateFailedCount": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
b"Version": [TxType.PERSISTENT],
|
b"Version": [TxType.PERSISTENT],
|
||||||
|
b"VisionRadarToggle": [TxType.PERSISTENT],
|
||||||
b"Offroad_ChargeDisabled": [TxType.CLEAR_ON_MANAGER_START, TxType.CLEAR_ON_PANDA_DISCONNECT],
|
b"Offroad_ChargeDisabled": [TxType.CLEAR_ON_MANAGER_START, TxType.CLEAR_ON_PANDA_DISCONNECT],
|
||||||
b"Offroad_ConnectivityNeeded": [TxType.CLEAR_ON_MANAGER_START],
|
b"Offroad_ConnectivityNeeded": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
b"Offroad_ConnectivityNeededPrompt": [TxType.CLEAR_ON_MANAGER_START],
|
b"Offroad_ConnectivityNeededPrompt": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
|
@ -70,6 +76,7 @@ keys = {
|
||||||
b"Offroad_NeosUpdate": [TxType.CLEAR_ON_MANAGER_START],
|
b"Offroad_NeosUpdate": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
b"Offroad_UpdateFailed": [TxType.CLEAR_ON_MANAGER_START],
|
b"Offroad_UpdateFailed": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
b"Offroad_HardwareUnsupported": [TxType.CLEAR_ON_MANAGER_START],
|
b"Offroad_HardwareUnsupported": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
|
b"ForcePowerDown": [TxType.CLEAR_ON_MANAGER_START],
|
||||||
}
|
}
|
||||||
|
|
||||||
def ensure_bytes(v):
|
def ensure_bytes(v):
|
||||||
|
|
|
@ -16,7 +16,7 @@ class Spinner():
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def update(self, spinner_text):
|
def update(self, spinner_text: str):
|
||||||
if self.spinner_proc is not None:
|
if self.spinner_proc is not None:
|
||||||
self.spinner_proc.stdin.write(spinner_text.encode('utf8') + b"\n")
|
self.spinner_proc.stdin.write(spinner_text.encode('utf8') + b"\n")
|
||||||
try:
|
try:
|
||||||
|
@ -24,6 +24,9 @@ class Spinner():
|
||||||
except BrokenPipeError:
|
except BrokenPipeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def update_progress(self, cur: int, total: int):
|
||||||
|
self.update(str(int(100 * cur / total)))
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if self.spinner_proc is not None:
|
if self.spinner_proc is not None:
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
Import('envCython')
|
Import('env', 'envCython')
|
||||||
|
|
||||||
|
transformations = env.Library('transformations', ['orientation.cc', 'coordinates.cc'])
|
||||||
|
Export('transformations')
|
||||||
|
|
||||||
envCython.Program('transformations.so', 'transformations.pyx')
|
envCython.Program('transformations.so', 'transformations.pyx')
|
||||||
|
|
|
@ -39,7 +39,7 @@ Eigen::Matrix3d quat2rot(Eigen::Quaterniond quat){
|
||||||
return quat.toRotationMatrix();
|
return quat.toRotationMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
Eigen::Quaterniond rot2quat(Eigen::Matrix3d rot){
|
Eigen::Quaterniond rot2quat(const Eigen::Matrix3d &rot){
|
||||||
return ensure_unique(Eigen::Quaterniond(rot));
|
return ensure_unique(Eigen::Quaterniond(rot));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ Eigen::Matrix3d euler2rot(Eigen::Vector3d euler){
|
||||||
return quat2rot(euler2quat(euler));
|
return quat2rot(euler2quat(euler));
|
||||||
}
|
}
|
||||||
|
|
||||||
Eigen::Vector3d rot2euler(Eigen::Matrix3d rot){
|
Eigen::Vector3d rot2euler(const Eigen::Matrix3d &rot){
|
||||||
return quat2euler(rot2quat(rot));
|
return quat2euler(rot2quat(rot));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,7 +141,3 @@ Eigen::Vector3d ned_euler_from_ecef(ECEF ecef_init, Eigen::Vector3d ecef_pose){
|
||||||
return {phi, theta, psi};
|
return {phi, theta, psi};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(void){
|
|
||||||
}
|
|
||||||
|
|
|
@ -8,9 +8,9 @@ Eigen::Quaterniond ensure_unique(Eigen::Quaterniond quat);
|
||||||
Eigen::Quaterniond euler2quat(Eigen::Vector3d euler);
|
Eigen::Quaterniond euler2quat(Eigen::Vector3d euler);
|
||||||
Eigen::Vector3d quat2euler(Eigen::Quaterniond quat);
|
Eigen::Vector3d quat2euler(Eigen::Quaterniond quat);
|
||||||
Eigen::Matrix3d quat2rot(Eigen::Quaterniond quat);
|
Eigen::Matrix3d quat2rot(Eigen::Quaterniond quat);
|
||||||
Eigen::Quaterniond rot2quat(Eigen::Matrix3d rot);
|
Eigen::Quaterniond rot2quat(const Eigen::Matrix3d &rot);
|
||||||
Eigen::Matrix3d euler2rot(Eigen::Vector3d euler);
|
Eigen::Matrix3d euler2rot(Eigen::Vector3d euler);
|
||||||
Eigen::Vector3d rot2euler(Eigen::Matrix3d rot);
|
Eigen::Vector3d rot2euler(const Eigen::Matrix3d &rot);
|
||||||
Eigen::Matrix3d rot_matrix(double roll, double pitch, double yaw);
|
Eigen::Matrix3d rot_matrix(double roll, double pitch, double yaw);
|
||||||
Eigen::Matrix3d rot(Eigen::Vector3d axis, double angle);
|
Eigen::Matrix3d rot(Eigen::Vector3d axis, double angle);
|
||||||
Eigen::Vector3d ecef_euler_from_ned(ECEF ecef_init, Eigen::Vector3d ned_pose);
|
Eigen::Vector3d ecef_euler_from_ned(ECEF ecef_init, Eigen::Vector3d ned_pose);
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <memory>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
@ -30,7 +31,7 @@
|
||||||
|
|
||||||
#include "common/framebuffer.h"
|
#include "common/framebuffer.h"
|
||||||
#include "common/touch.h"
|
#include "common/touch.h"
|
||||||
#include "common/utilpp.h"
|
#include "common/util.h"
|
||||||
|
|
||||||
#define USER_AGENT "NEOSUpdater-0.2"
|
#define USER_AGENT "NEOSUpdater-0.2"
|
||||||
|
|
||||||
|
@ -183,7 +184,7 @@ struct Updater {
|
||||||
|
|
||||||
int fb_w, fb_h;
|
int fb_w, fb_h;
|
||||||
|
|
||||||
FramebufferState *fb = NULL;
|
std::unique_ptr<FrameBuffer> fb;
|
||||||
NVGcontext *vg = NULL;
|
NVGcontext *vg = NULL;
|
||||||
int font_regular;
|
int font_regular;
|
||||||
int font_semibold;
|
int font_semibold;
|
||||||
|
@ -227,11 +228,9 @@ struct Updater {
|
||||||
void ui_init() {
|
void ui_init() {
|
||||||
touch_init(&touch);
|
touch_init(&touch);
|
||||||
|
|
||||||
fb = framebuffer_init("updater", 0x00001000, false,
|
fb = std::make_unique<FrameBuffer>("updater", 0x00001000, false, &fb_w, &fb_h);
|
||||||
&fb_w, &fb_h);
|
|
||||||
assert(fb);
|
|
||||||
|
|
||||||
framebuffer_set_power(fb, HWC_POWER_MODE_NORMAL);
|
fb->set_power(HWC_POWER_MODE_NORMAL);
|
||||||
|
|
||||||
vg = nvgCreateGLES3(NVG_ANTIALIAS | NVG_STENCIL_STROKES | NVG_DEBUG);
|
vg = nvgCreateGLES3(NVG_ANTIALIAS | NVG_STENCIL_STROKES | NVG_DEBUG);
|
||||||
assert(vg);
|
assert(vg);
|
||||||
|
@ -465,7 +464,7 @@ struct Updater {
|
||||||
while(battery_cap < min_battery_cap) {
|
while(battery_cap < min_battery_cap) {
|
||||||
battery_cap = battery_capacity();
|
battery_cap = battery_capacity();
|
||||||
battery_cap_text = std::to_string(battery_cap);
|
battery_cap_text = std::to_string(battery_cap);
|
||||||
usleep(1000000);
|
util::sleep_for(1000);
|
||||||
}
|
}
|
||||||
set_running();
|
set_running();
|
||||||
}
|
}
|
||||||
|
@ -483,7 +482,7 @@ struct Updater {
|
||||||
while(battery_cap < min_battery_cap) {
|
while(battery_cap < min_battery_cap) {
|
||||||
battery_cap = battery_capacity();
|
battery_cap = battery_capacity();
|
||||||
battery_cap_text = std::to_string(battery_cap);
|
battery_cap_text = std::to_string(battery_cap);
|
||||||
usleep(1000000);
|
util::sleep_for(1000);
|
||||||
}
|
}
|
||||||
set_running();
|
set_running();
|
||||||
}
|
}
|
||||||
|
@ -751,12 +750,12 @@ struct Updater {
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
|
|
||||||
framebuffer_swap(fb);
|
fb->swap();
|
||||||
|
|
||||||
assert(glGetError() == GL_NO_ERROR);
|
assert(glGetError() == GL_NO_ERROR);
|
||||||
|
|
||||||
// no simple way to do 30fps vsync with surfaceflinger...
|
// no simple way to do 30fps vsync with surfaceflinger...
|
||||||
usleep(30000);
|
util::sleep_for(30);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update_thread_handle.joinable()) {
|
if (update_thread_handle.joinable()) {
|
||||||
|
|
|
@ -8,11 +8,6 @@ source "$BASEDIR/launch_env.sh"
|
||||||
|
|
||||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
|
||||||
|
|
||||||
function tici_init {
|
|
||||||
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'
|
|
||||||
}
|
|
||||||
|
|
||||||
function two_init {
|
function two_init {
|
||||||
# Wifi scan
|
# Wifi scan
|
||||||
wpa_cli IFNAME=wlan0 SCAN
|
wpa_cli IFNAME=wlan0 SCAN
|
||||||
|
@ -110,6 +105,74 @@ function two_init {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function tici_init {
|
||||||
|
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'
|
||||||
|
|
||||||
|
# set success flag for current boot slot
|
||||||
|
sudo abctl --set_success
|
||||||
|
|
||||||
|
# Check if AGNOS update is required
|
||||||
|
if [ $(< /VERSION) != "$AGNOS_VERSION" ]; then
|
||||||
|
# Get number of slot to switch to
|
||||||
|
CUR_SLOT=$(abctl --boot_slot)
|
||||||
|
if [[ "$CUR_SLOT" == "_a" ]]; then
|
||||||
|
OTHER_SLOT="_b"
|
||||||
|
OTHER_SLOT_NUMBER="1"
|
||||||
|
else
|
||||||
|
OTHER_SLOT="_a"
|
||||||
|
OTHER_SLOT_NUMBER="0"
|
||||||
|
fi
|
||||||
|
echo "Cur slot $CUR_SLOT, target $OTHER_SLOT"
|
||||||
|
|
||||||
|
# Get expected hashes from manifest
|
||||||
|
MANIFEST="$DIR/selfdrive/hardware/tici/agnos.json"
|
||||||
|
SYSTEM_HASH_EXPECTED=$(jq -r ".[] | select(.name == \"system\") | .hash_raw" $MANIFEST)
|
||||||
|
SYSTEM_SIZE=$(jq -r ".[] | select(.name == \"system\") | .size" $MANIFEST)
|
||||||
|
BOOT_HASH_EXPECTED=$(jq -r ".[] | select(.name == \"boot\") | .hash_raw" $MANIFEST)
|
||||||
|
BOOT_SIZE=$(jq -r ".[] | select(.name == \"boot\") | .size" $MANIFEST)
|
||||||
|
echo "Expected hashes:"
|
||||||
|
echo "System: $SYSTEM_HASH_EXPECTED"
|
||||||
|
echo "Boot: $BOOT_HASH_EXPECTED"
|
||||||
|
|
||||||
|
# Read hashes from alternate partitions, should already be flashed by updated
|
||||||
|
SYSTEM_HASH=$(dd if="/dev/disk/by-partlabel/system$OTHER_SLOT" bs=1 skip="$SYSTEM_SIZE" count=64 2>/dev/null)
|
||||||
|
BOOT_HASH=$(dd if="/dev/disk/by-partlabel/boot$OTHER_SLOT" bs=1 skip="$BOOT_SIZE" count=64 2>/dev/null)
|
||||||
|
echo "Found hashes:"
|
||||||
|
echo "System: $SYSTEM_HASH"
|
||||||
|
echo "Boot: $BOOT_HASH"
|
||||||
|
|
||||||
|
if [[ "$SYSTEM_HASH" == "$SYSTEM_HASH_EXPECTED" && "$BOOT_HASH" == "$BOOT_HASH_EXPECTED" ]]; then
|
||||||
|
echo "Swapping active slot to $OTHER_SLOT_NUMBER"
|
||||||
|
|
||||||
|
# Clean hashes before swapping to prevent looping
|
||||||
|
dd if=/dev/zero of="/dev/disk/by-partlabel/system$OTHER_SLOT" bs=1 seek="$SYSTEM_SIZE" count=64
|
||||||
|
dd if=/dev/zero of="/dev/disk/by-partlabel/boot$OTHER_SLOT" bs=1 seek="$BOOT_SIZE" count=64
|
||||||
|
sync
|
||||||
|
|
||||||
|
abctl --set_active "$OTHER_SLOT_NUMBER"
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
sudo reboot
|
||||||
|
else
|
||||||
|
echo "Hash mismatch, downloading agnos"
|
||||||
|
if $DIR/selfdrive/hardware/tici/agnos.py $MANIFEST; then
|
||||||
|
echo "Download done, swapping active slot to $OTHER_SLOT_NUMBER"
|
||||||
|
|
||||||
|
# Clean hashes before swapping to prevent looping
|
||||||
|
dd if=/dev/zero of="/dev/disk/by-partlabel/system$OTHER_SLOT" bs=1 seek="$SYSTEM_SIZE" count=64
|
||||||
|
dd if=/dev/zero of="/dev/disk/by-partlabel/boot$OTHER_SLOT" bs=1 seek="$BOOT_SIZE" count=64
|
||||||
|
sync
|
||||||
|
|
||||||
|
abctl --set_active "$OTHER_SLOT_NUMBER"
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
sudo reboot
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
function launch {
|
function launch {
|
||||||
# Remove orphaned git lock if it exists on boot
|
# Remove orphaned git lock if it exists on boot
|
||||||
[ -f "$DIR/.git/index.lock" ] && rm -f $DIR/.git/index.lock
|
[ -f "$DIR/.git/index.lock" ] && rm -f $DIR/.git/index.lock
|
||||||
|
@ -144,6 +207,7 @@ function launch {
|
||||||
|
|
||||||
echo "Restarting launch script ${LAUNCHER_LOCATION}"
|
echo "Restarting launch script ${LAUNCHER_LOCATION}"
|
||||||
unset REQUIRED_NEOS_VERSION
|
unset REQUIRED_NEOS_VERSION
|
||||||
|
unset AGNOS_VERSION
|
||||||
exec "${LAUNCHER_LOCATION}"
|
exec "${LAUNCHER_LOCATION}"
|
||||||
else
|
else
|
||||||
echo "openpilot backup found, not updating"
|
echo "openpilot backup found, not updating"
|
||||||
|
@ -153,17 +217,17 @@ function launch {
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# comma two init
|
# handle pythonpath
|
||||||
|
ln -sfn $(pwd) /data/pythonpath
|
||||||
|
export PYTHONPATH="$PWD"
|
||||||
|
|
||||||
|
# hardware specific init
|
||||||
if [ -f /EON ]; then
|
if [ -f /EON ]; then
|
||||||
two_init
|
two_init
|
||||||
elif [ -f /TICI ]; then
|
elif [ -f /TICI ]; then
|
||||||
tici_init
|
tici_init
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# handle pythonpath
|
|
||||||
ln -sfn $(pwd) /data/pythonpath
|
|
||||||
export PYTHONPATH="$PWD"
|
|
||||||
|
|
||||||
# write tmux scrollback to a file
|
# write tmux scrollback to a file
|
||||||
tmux capture-pane -pq -S-1000 > /tmp/launch_log
|
tmux capture-pane -pq -S-1000 > /tmp/launch_log
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,10 @@ if [ -z "$REQUIRED_NEOS_VERSION" ]; then
|
||||||
export REQUIRED_NEOS_VERSION="15-1"
|
export REQUIRED_NEOS_VERSION="15-1"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -z "$AGNOS_VERSION" ]; then
|
||||||
|
export AGNOS_VERSION="0.6"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$PASSIVE" ]; then
|
if [ -z "$PASSIVE" ]; then
|
||||||
export PASSIVE="1"
|
export PASSIVE="1"
|
||||||
fi
|
fi
|
||||||
|
|
Binary file not shown.
|
@ -48,6 +48,7 @@ BO_ 228 STEERING_CONTROL: 5 EON
|
||||||
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
||||||
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
||||||
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
||||||
|
SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
|
||||||
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
||||||
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
||||||
|
|
||||||
|
|
|
@ -18,5 +18,8 @@ libdbc = env.SharedLibrary('libdbc', ["dbc.cc", "parser.cc", "packer.cc", "commo
|
||||||
# Build packer and parser
|
# Build packer and parser
|
||||||
lenv = envCython.Clone()
|
lenv = envCython.Clone()
|
||||||
lenv["LINKFLAGS"] += [libdbc[0].get_labspath()]
|
lenv["LINKFLAGS"] += [libdbc[0].get_labspath()]
|
||||||
lenv.Program('parser_pyx.so', 'parser_pyx.pyx')
|
parser = lenv.Program('parser_pyx.so', 'parser_pyx.pyx')
|
||||||
lenv.Program('packer_pyx.so', 'packer_pyx.pyx')
|
packer = lenv.Program('packer_pyx.so', 'packer_pyx.pyx')
|
||||||
|
|
||||||
|
lenv.Depends(parser, libdbc)
|
||||||
|
lenv.Depends(packer, libdbc)
|
||||||
|
|
|
@ -56,7 +56,7 @@ public:
|
||||||
const std::vector<SignalParseOptions> &sigoptions);
|
const std::vector<SignalParseOptions> &sigoptions);
|
||||||
void UpdateCans(uint64_t sec, const capnp::List<cereal::CanData>::Reader& cans);
|
void UpdateCans(uint64_t sec, const capnp::List<cereal::CanData>::Reader& cans);
|
||||||
void UpdateValid(uint64_t sec);
|
void UpdateValid(uint64_t sec);
|
||||||
void update_string(std::string data, bool sendcan);
|
void update_string(const std::string &data, bool sendcan);
|
||||||
std::vector<SignalValue> query_latest();
|
std::vector<SignalValue> query_latest();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -208,7 +208,7 @@ void CANParser::UpdateValid(uint64_t sec) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CANParser::update_string(std::string data, bool sendcan) {
|
void CANParser::update_string(const std::string &data, bool sendcan) {
|
||||||
// format for board, make copy due to alignment issues, will be freed on out of scope
|
// format for board, make copy due to alignment issues, will be freed on out of scope
|
||||||
auto amsg = kj::heapArray<capnp::word>((data.length() / sizeof(capnp::word)) + 1);
|
auto amsg = kj::heapArray<capnp::word>((data.length() / sizeof(capnp::word)) + 1);
|
||||||
memcpy(amsg.begin(), data.data(), data.length());
|
memcpy(amsg.begin(), data.data(), data.length());
|
||||||
|
|
|
@ -300,6 +300,7 @@ BO_ 501 DASHBOARD: 8 XXX
|
||||||
SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX
|
SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX
|
||||||
SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX
|
SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX
|
||||||
SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX
|
SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX
|
||||||
|
SG_ CRUISE_STATE : 38|3@0+ (1,0) [0|7] "" XXX
|
||||||
|
|
||||||
BO_ 639 NEW_MSG_27f: 8 XXX
|
BO_ 639 NEW_MSG_27f: 8 XXX
|
||||||
SG_ INCREASING : 47|8@0+ (1,0) [0|255] "" XXX
|
SG_ INCREASING : 47|8@0+ (1,0) [0|255] "" XXX
|
||||||
|
@ -425,9 +426,11 @@ CM_ SG_ 500 ACC_STATUS_1 "2 briefly (9 packets) when ACC goes to green, 1 help w
|
||||||
CM_ SG_ 500 BRAKE_MAYBE "2046 in non-ACC and non-decel. Signal on deceleration. 818 for already stopped break.";
|
CM_ SG_ 500 BRAKE_MAYBE "2046 in non-ACC and non-decel. Signal on deceleration. 818 for already stopped break.";
|
||||||
CM_ SG_ 500 ACC_STATUS_2 "set to 1 in non-ACC, 3 when ACC enabled (white icon), and 7 when ACC in use (green icon)";
|
CM_ SG_ 500 ACC_STATUS_2 "set to 1 in non-ACC, 3 when ACC enabled (white icon), and 7 when ACC in use (green icon)";
|
||||||
CM_ SG_ 500 BRAKE_BOOL_1 "set to 1 when ACC decel. 0 on non-ACC and accel.";
|
CM_ SG_ 500 BRAKE_BOOL_1 "set to 1 when ACC decel. 0 on non-ACC and accel.";
|
||||||
|
CM_ SG_ 501 CRUISE_STATE "may just be an icon, but seems to indicate different cruise modes: ACC and Non-ACC and engaged state for both.";
|
||||||
CM_ SG_ 625 SPEED "zero on non-acc drives";
|
CM_ SG_ 625 SPEED "zero on non-acc drives";
|
||||||
CM_ SG_ 625 ACCEL_PERHAPS "set to 7767 on non-ACC drives. ACC drive 40k is constant speed, 42k is accelerating";
|
CM_ SG_ 625 ACCEL_PERHAPS "set to 7767 on non-ACC drives. ACC drive 40k is constant speed, 42k is accelerating";
|
||||||
CM_ SG_ 268 BRAKE_PERHAPS "triggers only on ACC braking";
|
CM_ SG_ 268 BRAKE_PERHAPS "triggers only on ACC braking";
|
||||||
CM_ SG_ 384 NEW_SIGNAL_1 "set in ACC gas driving. not set in electric human. not sure about gas human driving.";
|
CM_ SG_ 384 NEW_SIGNAL_1 "set in ACC gas driving. not set in electric human. not sure about gas human driving.";
|
||||||
|
VAL_ 501 CRUISE_STATE 0 "Off" 1 "CC On" 2 "CC Engaged" 3 "ACC On" 4 "ACC Engaged";
|
||||||
VAL_ 746 PRNDL 5 "L" 4 "D" 3 "N" 2 "R" 1 "P" ;
|
VAL_ 746 PRNDL 5 "L" 4 "D" 3 "N" 2 "R" 1 "P" ;
|
||||||
VAL_ 792 TURN_SIGNALS 2 "Right" 1 "Left" ;
|
VAL_ 792 TURN_SIGNALS 2 "Right" 1 "Left" ;
|
||||||
|
|
|
@ -48,6 +48,7 @@ BO_ 228 STEERING_CONTROL: 5 EON
|
||||||
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
||||||
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
||||||
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
||||||
|
SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
|
||||||
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
||||||
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ BO_ 228 STEERING_CONTROL: 5 EON
|
||||||
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
||||||
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
||||||
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
||||||
|
SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
|
||||||
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
||||||
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ BO_ 228 STEERING_CONTROL: 5 EON
|
||||||
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
||||||
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
||||||
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
||||||
|
SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
|
||||||
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
||||||
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ BO_ 228 STEERING_CONTROL: 5 EON
|
||||||
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
||||||
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
||||||
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
||||||
|
SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
|
||||||
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
||||||
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ BO_ 228 STEERING_CONTROL: 5 EON
|
||||||
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
||||||
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
||||||
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
||||||
|
SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
|
||||||
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
||||||
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ BO_ 228 STEERING_CONTROL: 5 EON
|
||||||
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
||||||
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
||||||
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
||||||
|
SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
|
||||||
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
||||||
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ BO_ 228 STEERING_CONTROL: 5 EON
|
||||||
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
||||||
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS
|
||||||
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS
|
||||||
|
SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS
|
||||||
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS
|
||||||
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS
|
||||||
|
|
||||||
|
|
|
@ -996,7 +996,7 @@ BO_ 1342 LKAS12: 6 LDWS_LKAS
|
||||||
SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
|
SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU
|
||||||
SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
|
SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU
|
||||||
SG_ CF_LkasDawStatus : 40|3@1+ (1,0) [0|7] "" CLU
|
SG_ CF_LkasDawStatus : 40|3@1+ (1,0) [0|7] "" CLU
|
||||||
SG_ CF_Lkas_Daw_USM : 39|3@1+ (1,0) [0|7] "" CLU
|
SG_ CF_Lkas_Daw_USM : 37|3@1+ (1,0) [0|7] "" CLU
|
||||||
|
|
||||||
BO_ 1338 TMU_GW_E_01: 8 CLU
|
BO_ 1338 TMU_GW_E_01: 8 CLU
|
||||||
SG_ CF_Gway_TeleReqDrLock : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
|
SG_ CF_Gway_TeleReqDrLock : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM
|
||||||
|
@ -1470,19 +1470,24 @@ BO_ 1186 FRT_RADAR11: 2 FCA
|
||||||
SG_ CF_FCA_Equip_Front_Radar : 0|3@1+ (1,0) [0|7] "" LDWS_LKAS,LDW_LKA,ESC
|
SG_ CF_FCA_Equip_Front_Radar : 0|3@1+ (1,0) [0|7] "" LDWS_LKAS,LDW_LKA,ESC
|
||||||
|
|
||||||
BO_ 905 SCC14: 8 SCC
|
BO_ 905 SCC14: 8 SCC
|
||||||
SG_ ComfortBandUpper : 0|6@1+ (0.0986,-4.14) [0|1.26] "m/s^2" ESC
|
SG_ ComfortBandUpper : 0|6@1+ (0.02,0) [0|1.26] "m/s^2" ESC
|
||||||
SG_ ComfortBandLower : 6|6@1+ (0.0986,-4.14) [0|1.26] "m/s^2" ESC
|
SG_ ComfortBandLower : 6|6@1+ (0.02,0) [0|1.26] "m/s^2" ESC
|
||||||
SG_ JerkUpperLimit : 12|7@1+ (1,0) [0|12.7] "m/s^3" ESC
|
SG_ JerkUpperLimit : 12|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC
|
||||||
SG_ JerkLowerLimit : 19|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC
|
SG_ JerkLowerLimit : 19|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC
|
||||||
SG_ ACCMode : 32|3@1+ (1,0) [0|7] "" CLU,HUD,LDWS_LKAS,ESC
|
SG_ ACCMode : 32|3@1+ (1,0) [0|7] "" CLU,HUD,LDWS_LKAS,ESC
|
||||||
SG_ ObjGap : 56|8@1+ (1,0) [0|255] "" CLU,HUD,ESC
|
SG_ ObjGap : 56|8@1+ (1,0) [0|255] "" CLU,HUD,ESC
|
||||||
|
|
||||||
BO_ 1157 LFAHDA_MFC: 4 XXX
|
BO_ 1157 LFAHDA_MFC: 4 XXX
|
||||||
SG_ HDA_USM : 0|2@1+ (1,0) [0|3] "" XXX
|
SG_ HDA_USM : 0|2@1+ (1,0) [0|3] "" XXX
|
||||||
SG_ ACTIVE2 : 4|2@0+ (1,0) [0|3] "" XXX
|
SG_ HDA_Active : 2|1@1+ (1,0) [0|1] "" XXX
|
||||||
SG_ LFA_SysWarning : 16|2@1+ (1,0) [0|3] "" XXX
|
SG_ HDA_Icon_State : 3|2@1+ (1,0) [0|3] "" XXX
|
||||||
SG_ ACTIVE : 25|1@1+ (1,0) [0|3] "" XXX
|
SG_ HDA_Chime : 7|1@1+ (1,0) [0|1] "" XXX
|
||||||
SG_ LFA_USM : 28|2@1+ (1,0) [0|3] "" XXX
|
SG_ HDA_VSetReq : 8|8@1+ (1,0) [0|255] "km/h" XXX
|
||||||
|
SG_ LFA_SysWarning : 16|3@1+ (1,0) [0|7] "" XXX
|
||||||
|
SG_ NEW_SIGNAL_1 : 20|3@1+ (1,0) [0|7] "" XXX
|
||||||
|
SG_ LFA_Icon_State : 24|2@1+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ LFA_USM : 27|2@1+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ HDA_SysWarning : 29|2@1+ (1,0) [0|3] "" XXX
|
||||||
|
|
||||||
BO_ 913 BCM_PO_11: 8 Vector__XXX
|
BO_ 913 BCM_PO_11: 8 Vector__XXX
|
||||||
SG_ BCM_Door_Dri_Status : 5|1@0+ (1,0) [0|1] "" PT_ESC_ABS
|
SG_ BCM_Door_Dri_Status : 5|1@0+ (1,0) [0|1] "" PT_ESC_ABS
|
||||||
|
@ -1565,7 +1570,7 @@ BO_ 352 AHB1: 8 iBAU
|
||||||
SG_ CF_Ahb_Bzzr : 26|1@1+ (1,0) [0|1] "" Vector__XXX
|
SG_ CF_Ahb_Bzzr : 26|1@1+ (1,0) [0|1] "" Vector__XXX
|
||||||
SG_ CF_Ahb_ChkSum : 56|8@1+ (1,0) [0|255] "" Vector__XXX
|
SG_ CF_Ahb_ChkSum : 56|8@1+ (1,0) [0|255] "" Vector__XXX
|
||||||
|
|
||||||
BO_ 1191 4a7MFC: 8 XXX
|
BO_ 1191 MFC_4a7: 8 XXX
|
||||||
SG_ PAINT1 : 0|1@0+ (1,0) [0|1] "" XXX
|
SG_ PAINT1 : 0|1@0+ (1,0) [0|1] "" XXX
|
||||||
|
|
||||||
BO_ 1162 BCA11: 8 BCW
|
BO_ 1162 BCA11: 8 BCW
|
||||||
|
@ -1575,9 +1580,11 @@ BO_ 1162 BCA11: 8 BCW
|
||||||
SG_ RCCA_Brake_Command : 29|1@1+ (1,0) [0|1] "" iBAU
|
SG_ RCCA_Brake_Command : 29|1@1+ (1,0) [0|1] "" iBAU
|
||||||
SG_ Check_Sum : 56|8@1+ (1,0) [0|16] "" iBAU
|
SG_ Check_Sum : 56|8@1+ (1,0) [0|16] "" iBAU
|
||||||
|
|
||||||
BO_ 1136 P_STS: 6 CGW
|
BO_ 1136 P_STS: 8 CGW
|
||||||
SG_ HCU1_STS : 6|2@1+ (1,0) [0|3] "" BCW,EPB,FCA,MDPS,SCC,iBAU
|
SG_ HCU1_STS : 6|2@1+ (1,0) [0|3] "" BCW,EPB,FCA,MDPS,SCC,iBAU
|
||||||
SG_ HCU5_STS : 8|2@1+ (1,0) [0|3] "" EPB,FCA,MDPS,iBAU
|
SG_ HCU5_STS : 8|2@1+ (1,0) [0|3] "" EPB,FCA,MDPS,iBAU
|
||||||
|
SG_ Counter : 58|4@1+ (1,0) [0|15] "" MDPS
|
||||||
|
SG_ Checksum : 62|2@1+ (1,0) [0|3] "" MDPS
|
||||||
|
|
||||||
BO_ 304 YRS11: 8 ACU
|
BO_ 304 YRS11: 8 ACU
|
||||||
SG_ CR_Yrs_Yr : 0|16@1+ (0.005,-163.84) [-163.84|163.83] "deg/s" CGW,iBAU
|
SG_ CR_Yrs_Yr : 0|16@1+ (0.005,-163.84) [-163.84|163.83] "deg/s" CGW,iBAU
|
||||||
|
@ -1601,14 +1608,14 @@ BO_ 320 YRS12: 8 ACU
|
||||||
BO_ 1173 YRS13: 8 ACU
|
BO_ 1173 YRS13: 8 ACU
|
||||||
SG_ YRS_SeralNo : 16|48@1+ (1,0) [0|281474976710655] "" iBAU
|
SG_ YRS_SeralNo : 16|48@1+ (1,0) [0|281474976710655] "" iBAU
|
||||||
|
|
||||||
BO_ 870 366_EMS: 8 EMS
|
BO_ 870 EMS_366: 8 EMS
|
||||||
SG_ N : 7|16@0+ (1,0.25) [0|16383.75] "rpm" XXX
|
SG_ TQI_1 : 0|8@1+ (0.390625,0) [0|99.6094] "%" MDPS
|
||||||
SG_ EMS_Related : 23|16@0+ (1,0) [0|65535] "" XXX
|
SG_ N : 8|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" MDPS
|
||||||
SG_ TQFR : 39|8@0+ (0.390625,0) [0|99.6094] "%" XXX
|
SG_ TQI_2 : 24|8@1+ (0.390625,0) [0|99.6094] "%" MDPS
|
||||||
SG_ VS : 40|8@1+ (1,0) [0|255] "km/h" MDPS
|
SG_ VS : 40|8@1+ (1,0) [0|255] "km/h" MDPS
|
||||||
SG_ SWI_IGK : 48|1@0+ (1,0) [0|1] "" XXX
|
SG_ SWI_IGK : 48|1@0+ (1,0) [0|1] "" XXX
|
||||||
|
|
||||||
BO_ 854 356: 8 XXX
|
BO_ 854 M_356: 8 XXX
|
||||||
SG_ PAINT1 : 32|1@0+ (1,0) [0|1] "" XXX
|
SG_ PAINT1 : 32|1@0+ (1,0) [0|1] "" XXX
|
||||||
SG_ PAINT2 : 34|2@0+ (1,0) [0|1] "" XXX
|
SG_ PAINT2 : 34|2@0+ (1,0) [0|1] "" XXX
|
||||||
SG_ PAINT3 : 36|2@0+ (1,0) [0|3] "" XXX
|
SG_ PAINT3 : 36|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -1633,3 +1640,7 @@ BO_ 1042 ICM_412h: 8 ICM
|
||||||
SG_ PopupMessageOutput_8Level : 55|1@0+ (1,0) [0|1] "" Vector__XXX
|
SG_ PopupMessageOutput_8Level : 55|1@0+ (1,0) [0|1] "" Vector__XXX
|
||||||
|
|
||||||
VAL_ 909 CF_VSM_Warn 2 "FCW" 3 "AEB";
|
VAL_ 909 CF_VSM_Warn 2 "FCW" 3 "AEB";
|
||||||
|
VAL_ 1157 LFA_Icon_State 0 "no_wheel" 1 "white_wheel" 2 "green_wheel" 3 "green_wheel_blink";
|
||||||
|
VAL_ 1157 LFA_SysWarning 0 "no_message" 1 "switching_to_hda" 2 "switching_to_scc" 3 "lfa_error" 4 "check_hda" 5 "keep_hands_on_wheel_orange" 6 "keep_hands_on_wheel_red";
|
||||||
|
VAL_ 1157 HDA_Icon_State 0 "no_hda" 1 "white_hda" 2 "green_hda";
|
||||||
|
VAL_ 1157 HDA_SysWarning 0 "no_message" 1 "driving_convenience_systems_cancelled" 2 "highway_drive_assist_system_cancelled";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -271,6 +271,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -333,6 +334,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -362,8 +364,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -271,6 +271,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -333,6 +334,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -362,8 +364,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -254,6 +254,7 @@ BO_ 1410 VIN_PART_3: 8 CGW
|
||||||
|
|
||||||
BO_ 1553 UI_SETTING: 8 XXX
|
BO_ 1553 UI_SETTING: 8 XXX
|
||||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" XXX
|
||||||
|
|
||||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||||
|
@ -316,6 +317,7 @@ CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||||
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
|
||||||
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
CM_ SG_ 37 STEER_RATE "factor is tbd";
|
||||||
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
|
||||||
|
CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
|
||||||
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
|
||||||
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
|
||||||
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
|
||||||
|
@ -345,8 +347,9 @@ CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
|
||||||
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
|
||||||
CM_ SG_ 1163 TSRSPU "always 1";
|
CM_ SG_ 1163 TSRSPU "always 1";
|
||||||
|
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
|
||||||
|
|
||||||
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
|
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off";
|
||||||
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
|
||||||
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
VAL_ 614 STATE 3 "enabled" 1 "disabled";
|
||||||
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
||||||
|
|
|
@ -13,6 +13,6 @@ pandacan.egg-info/
|
||||||
board/obj/
|
board/obj/
|
||||||
examples/output.csv
|
examples/output.csv
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.vscode
|
.vscode*
|
||||||
nosetests.xml
|
nosetests.xml
|
||||||
.mypy_cache/
|
.mypy_cache/
|
||||||
|
|
|
@ -59,9 +59,10 @@ void peripherals_init(void){
|
||||||
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
|
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
|
||||||
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // main counter
|
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // main counter
|
||||||
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // pedal and fan PWM
|
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // pedal and fan PWM
|
||||||
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // gmlan_alt and IR PWM
|
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // IR PWM
|
||||||
RCC->APB1ENR |= RCC_APB1ENR_TIM5EN; // k-line init
|
RCC->APB1ENR |= RCC_APB1ENR_TIM5EN; // k-line init
|
||||||
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; // interrupt timer
|
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; // interrupt timer
|
||||||
|
RCC->APB1ENR |= RCC_APB1ENR_TIM12EN; // gmlan_alt
|
||||||
RCC->APB1ENR |= RCC_APB1ENR_PWREN; // for RTC config
|
RCC->APB1ENR |= RCC_APB1ENR_PWREN; // for RTC config
|
||||||
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
|
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
|
||||||
RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
|
RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
|
||||||
|
|
|
@ -62,7 +62,23 @@ void dos_set_phone_power(bool enabled){
|
||||||
}
|
}
|
||||||
|
|
||||||
void dos_set_usb_power_mode(uint8_t mode) {
|
void dos_set_usb_power_mode(uint8_t mode) {
|
||||||
dos_set_bootkick(mode == USB_POWER_CDP);
|
bool valid = false;
|
||||||
|
switch (mode) {
|
||||||
|
case USB_POWER_CLIENT:
|
||||||
|
dos_set_bootkick(false);
|
||||||
|
valid = true;
|
||||||
|
break;
|
||||||
|
case USB_POWER_CDP:
|
||||||
|
dos_set_bootkick(true);
|
||||||
|
valid = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
puts("Invalid USB power mode\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (valid) {
|
||||||
|
usb_power_mode = mode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dos_set_gps_mode(uint8_t mode) {
|
void dos_set_gps_mode(uint8_t mode) {
|
||||||
|
|
|
@ -4,13 +4,19 @@ CFLAGS += -Tstm32_flash.ld
|
||||||
|
|
||||||
DFU_UTIL = "dfu-util"
|
DFU_UTIL = "dfu-util"
|
||||||
|
|
||||||
# Compile fast charge (DCP) only not on EON
|
PC = 0
|
||||||
|
|
||||||
ifeq (,$(wildcard /EON))
|
ifeq (,$(wildcard /EON))
|
||||||
|
ifeq (,$(wildcard /TICI))
|
||||||
|
PC = 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq (1, $(PC))
|
||||||
BUILDER = DEV
|
BUILDER = DEV
|
||||||
else
|
else
|
||||||
CFLAGS += "-DEON"
|
CFLAGS += "-DEON"
|
||||||
BUILDER = EON
|
BUILDER = EON
|
||||||
DFU_UTIL = "tools/dfu-util-aarch64"
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#COMPILER_PATH = /home/batman/Downloads/gcc-arm-none-eabi-9-2020-q2-update/bin/
|
#COMPILER_PATH = /home/batman/Downloads/gcc-arm-none-eabi-9-2020-q2-update/bin/
|
||||||
|
|
|
@ -122,23 +122,23 @@ int get_bit_message(char *out, CAN_FIFOMailBox_TypeDef *to_bang) {
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TIM4_IRQ_Handler(void);
|
void TIM12_IRQ_Handler(void);
|
||||||
|
|
||||||
void setup_timer4(void) {
|
void setup_timer(void) {
|
||||||
// register interrupt
|
// register interrupt
|
||||||
REGISTER_INTERRUPT(TIM4_IRQn, TIM4_IRQ_Handler, 40000U, FAULT_INTERRUPT_RATE_GMLAN)
|
REGISTER_INTERRUPT(TIM8_BRK_TIM12_IRQn, TIM12_IRQ_Handler, 40000U, FAULT_INTERRUPT_RATE_GMLAN)
|
||||||
|
|
||||||
// setup
|
// setup
|
||||||
register_set(&(TIM4->PSC), (48-1), 0xFFFFU); // Tick on 1 us
|
register_set(&(TIM12->PSC), (48-1), 0xFFFFU); // Tick on 1 us
|
||||||
register_set(&(TIM4->CR1), TIM_CR1_CEN, 0x3FU); // Enable
|
register_set(&(TIM12->CR1), TIM_CR1_CEN, 0x3FU); // Enable
|
||||||
register_set(&(TIM4->ARR), (30-1), 0xFFFFU); // 33.3 kbps
|
register_set(&(TIM12->ARR), (30-1), 0xFFFFU); // 33.3 kbps
|
||||||
|
|
||||||
// in case it's disabled
|
// in case it's disabled
|
||||||
NVIC_EnableIRQ(TIM4_IRQn);
|
NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn);
|
||||||
|
|
||||||
// run the interrupt
|
// run the interrupt
|
||||||
register_set(&(TIM4->DIER), TIM_DIER_UIE, 0x5F5FU); // Update interrupt
|
register_set(&(TIM12->DIER), TIM_DIER_UIE, 0x5F5FU); // Update interrupt
|
||||||
TIM4->SR = 0;
|
TIM12->SR = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int gmlan_timeout_counter = GMLAN_TICKS_PER_TIMEOUT_TICKLE; //GMLAN transceiver times out every 17ms held high; tickle every 15ms
|
int gmlan_timeout_counter = GMLAN_TICKS_PER_TIMEOUT_TICKLE; //GMLAN transceiver times out every 17ms held high; tickle every 15ms
|
||||||
|
@ -154,7 +154,7 @@ void gmlan_switch_init(int timeout_enable) {
|
||||||
gmlan_switch_below_timeout = 1;
|
gmlan_switch_below_timeout = 1;
|
||||||
set_gpio_mode(GPIOB, 13, MODE_OUTPUT);
|
set_gpio_mode(GPIOB, 13, MODE_OUTPUT);
|
||||||
|
|
||||||
setup_timer4();
|
setup_timer();
|
||||||
|
|
||||||
inverted_bit_to_send = GMLAN_LOW; //We got initialized, set the output low
|
inverted_bit_to_send = GMLAN_LOW; //We got initialized, set the output low
|
||||||
}
|
}
|
||||||
|
@ -192,9 +192,9 @@ int gmlan_fail_count = 0;
|
||||||
#define REQUIRED_SILENT_TIME 10
|
#define REQUIRED_SILENT_TIME 10
|
||||||
#define MAX_FAIL_COUNT 10
|
#define MAX_FAIL_COUNT 10
|
||||||
|
|
||||||
void TIM4_IRQ_Handler(void) {
|
void TIM12_IRQ_Handler(void) {
|
||||||
if (gmlan_alt_mode == BITBANG) {
|
if (gmlan_alt_mode == BITBANG) {
|
||||||
if ((TIM4->SR & TIM_SR_UIF) && (gmlan_sendmax != -1)) {
|
if ((TIM12->SR & TIM_SR_UIF) && (gmlan_sendmax != -1)) {
|
||||||
int read = get_gpio_input(GPIOB, 12);
|
int read = get_gpio_input(GPIOB, 12);
|
||||||
if (gmlan_silent_count < REQUIRED_SILENT_TIME) {
|
if (gmlan_silent_count < REQUIRED_SILENT_TIME) {
|
||||||
if (read == 0) {
|
if (read == 0) {
|
||||||
|
@ -236,13 +236,13 @@ void TIM4_IRQ_Handler(void) {
|
||||||
if ((gmlan_sending == gmlan_sendmax) || (gmlan_fail_count == MAX_FAIL_COUNT)) {
|
if ((gmlan_sending == gmlan_sendmax) || (gmlan_fail_count == MAX_FAIL_COUNT)) {
|
||||||
set_bitbanged_gmlan(1); // recessive
|
set_bitbanged_gmlan(1); // recessive
|
||||||
set_gpio_mode(GPIOB, 13, MODE_INPUT);
|
set_gpio_mode(GPIOB, 13, MODE_INPUT);
|
||||||
register_clear_bits(&(TIM4->DIER), TIM_DIER_UIE); // No update interrupt
|
register_clear_bits(&(TIM12->DIER), TIM_DIER_UIE); // No update interrupt
|
||||||
register_set(&(TIM4->CR1), 0U, 0x3FU); // Disable timer
|
register_set(&(TIM12->CR1), 0U, 0x3FU); // Disable timer
|
||||||
gmlan_sendmax = -1; // exit
|
gmlan_sendmax = -1; // exit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (gmlan_alt_mode == GPIO_SWITCH) {
|
} else if (gmlan_alt_mode == GPIO_SWITCH) {
|
||||||
if ((TIM4->SR & TIM_SR_UIF) && (gmlan_switch_below_timeout != -1)) {
|
if ((TIM12->SR & TIM_SR_UIF) && (gmlan_switch_below_timeout != -1)) {
|
||||||
if ((can_timeout_counter == 0) && gmlan_switch_timeout_enable) {
|
if ((can_timeout_counter == 0) && gmlan_switch_timeout_enable) {
|
||||||
//it has been more than 1 second since timeout was reset; disable timer and restore the GMLAN output
|
//it has been more than 1 second since timeout was reset; disable timer and restore the GMLAN output
|
||||||
set_gpio_output(GPIOB, 13, GMLAN_LOW);
|
set_gpio_output(GPIOB, 13, GMLAN_LOW);
|
||||||
|
@ -266,7 +266,7 @@ void TIM4_IRQ_Handler(void) {
|
||||||
} else {
|
} else {
|
||||||
// Invalid GMLAN mode. Do not put a print statement here, way too fast to keep up with
|
// Invalid GMLAN mode. Do not put a print statement here, way too fast to keep up with
|
||||||
}
|
}
|
||||||
TIM4->SR = 0;
|
TIM12->SR = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) {
|
bool bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) {
|
||||||
|
@ -284,7 +284,7 @@ bool bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) {
|
||||||
set_gpio_mode(GPIOB, 13, MODE_OUTPUT);
|
set_gpio_mode(GPIOB, 13, MODE_OUTPUT);
|
||||||
|
|
||||||
// 33kbps
|
// 33kbps
|
||||||
setup_timer4();
|
setup_timer();
|
||||||
}
|
}
|
||||||
return gmlan_send_ok;
|
return gmlan_send_ok;
|
||||||
}
|
}
|
||||||
|
|
|
@ -614,6 +614,10 @@ int usb_cb_control_msg(USB_Setup_TypeDef *setup, uint8_t *resp, bool hardwired)
|
||||||
case 0xf6:
|
case 0xf6:
|
||||||
siren_enabled = (setup->b.wValue.w != 0U);
|
siren_enabled = (setup->b.wValue.w != 0U);
|
||||||
break;
|
break;
|
||||||
|
// **** 0xf7: set green led enabled
|
||||||
|
case 0xf7:
|
||||||
|
green_led_enabled = (setup->b.wValue.w != 0U);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
puts("NO HANDLER ");
|
puts("NO HANDLER ");
|
||||||
puth(setup->b.bRequest);
|
puth(setup->b.bRequest);
|
||||||
|
@ -701,7 +705,7 @@ void TIM1_BRK_TIM9_IRQ_Handler(void) {
|
||||||
fan_tick();
|
fan_tick();
|
||||||
|
|
||||||
// set green LED to be controls allowed
|
// set green LED to be controls allowed
|
||||||
current_board->set_led(LED_GREEN, controls_allowed);
|
current_board->set_led(LED_GREEN, controls_allowed | green_led_enabled);
|
||||||
|
|
||||||
// turn off the blue LED, turned on by CAN
|
// turn off the blue LED, turned on by CAN
|
||||||
// unless we are in power saving mode
|
// unless we are in power saving mode
|
||||||
|
|
|
@ -14,3 +14,4 @@ bool is_enumerated = 0;
|
||||||
uint32_t heartbeat_counter = 0;
|
uint32_t heartbeat_counter = 0;
|
||||||
uint32_t uptime_cnt = 0;
|
uint32_t uptime_cnt = 0;
|
||||||
bool siren_enabled = false;
|
bool siren_enabled = false;
|
||||||
|
bool green_led_enabled = false;
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,33 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
import usb1
|
|
||||||
|
|
||||||
def enter_download_mode(device):
|
|
||||||
handle = device.open()
|
|
||||||
handle.claimInterface(0)
|
|
||||||
|
|
||||||
try:
|
|
||||||
handle.controlWrite(usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE, 0xd1, 0, 0, b'')
|
|
||||||
except (usb1.USBErrorIO, usb1.USBErrorPipe):
|
|
||||||
print("Device download mode enabled.")
|
|
||||||
time.sleep(1)
|
|
||||||
else:
|
|
||||||
print("Device failed to enter download mode.")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
def find_first_panda(context=None):
|
|
||||||
context = context or usb1.USBContext()
|
|
||||||
for device in context.getDeviceList(skip_on_error=True):
|
|
||||||
if device.getVendorID() == 0xbbaa and device.getProductID() & 0xFF00 == 0xdd00:
|
|
||||||
return device
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
panda_dev = find_first_panda()
|
|
||||||
if panda_dev is None:
|
|
||||||
print("no device found")
|
|
||||||
sys.exit(0)
|
|
||||||
print("found device")
|
|
||||||
enter_download_mode(panda_dev)
|
|
|
@ -676,3 +676,7 @@ class Panda(object):
|
||||||
# ****************** Siren *****************
|
# ****************** Siren *****************
|
||||||
def set_siren(self, enabled):
|
def set_siren(self, enabled):
|
||||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xf6, int(enabled), 0, b'')
|
self._handle.controlWrite(Panda.REQUEST_OUT, 0xf6, int(enabled), 0, b'')
|
||||||
|
|
||||||
|
# ****************** Debug *****************
|
||||||
|
def set_green_led(self, enabled):
|
||||||
|
self._handle.controlWrite(Panda.REQUEST_OUT, 0xf7, int(enabled), 0, b'')
|
||||||
|
|
|
@ -1,93 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2013 The Android Open Source Project
|
|
||||||
* Copyright (C) 2015 The CyanogenMod Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ANDROID_BATTERYSERVICE_H
|
|
||||||
#define ANDROID_BATTERYSERVICE_H
|
|
||||||
|
|
||||||
#include <binder/Parcel.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <utils/Errors.h>
|
|
||||||
#include <utils/String8.h>
|
|
||||||
|
|
||||||
namespace android {
|
|
||||||
|
|
||||||
// must be kept in sync with definitions in BatteryManager.java
|
|
||||||
enum {
|
|
||||||
BATTERY_STATUS_UNKNOWN = 1, // equals BatteryManager.BATTERY_STATUS_UNKNOWN constant
|
|
||||||
BATTERY_STATUS_CHARGING = 2, // equals BatteryManager.BATTERY_STATUS_CHARGING constant
|
|
||||||
BATTERY_STATUS_DISCHARGING = 3, // equals BatteryManager.BATTERY_STATUS_DISCHARGING constant
|
|
||||||
BATTERY_STATUS_NOT_CHARGING = 4, // equals BatteryManager.BATTERY_STATUS_NOT_CHARGING constant
|
|
||||||
BATTERY_STATUS_FULL = 5, // equals BatteryManager.BATTERY_STATUS_FULL constant
|
|
||||||
};
|
|
||||||
|
|
||||||
// must be kept in sync with definitions in BatteryManager.java
|
|
||||||
enum {
|
|
||||||
BATTERY_HEALTH_UNKNOWN = 1, // equals BatteryManager.BATTERY_HEALTH_UNKNOWN constant
|
|
||||||
BATTERY_HEALTH_GOOD = 2, // equals BatteryManager.BATTERY_HEALTH_GOOD constant
|
|
||||||
BATTERY_HEALTH_OVERHEAT = 3, // equals BatteryManager.BATTERY_HEALTH_OVERHEAT constant
|
|
||||||
BATTERY_HEALTH_DEAD = 4, // equals BatteryManager.BATTERY_HEALTH_DEAD constant
|
|
||||||
BATTERY_HEALTH_OVER_VOLTAGE = 5, // equals BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE constant
|
|
||||||
BATTERY_HEALTH_UNSPECIFIED_FAILURE = 6, // equals BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE constant
|
|
||||||
BATTERY_HEALTH_COLD = 7, // equals BatteryManager.BATTERY_HEALTH_COLD constant
|
|
||||||
};
|
|
||||||
|
|
||||||
// must be kept in sync with definitions in BatteryProperty.java
|
|
||||||
enum {
|
|
||||||
BATTERY_PROP_CHARGE_COUNTER = 1, // equals BatteryProperty.CHARGE_COUNTER constant
|
|
||||||
BATTERY_PROP_CURRENT_NOW = 2, // equals BatteryProperty.CURRENT_NOW constant
|
|
||||||
BATTERY_PROP_CURRENT_AVG = 3, // equals BatteryProperty.CURRENT_AVG constant
|
|
||||||
BATTERY_PROP_CAPACITY = 4, // equals BatteryProperty.CAPACITY constant
|
|
||||||
BATTERY_PROP_ENERGY_COUNTER = 5, // equals BatteryProperty.ENERGY_COUNTER constant
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BatteryProperties {
|
|
||||||
bool chargerAcOnline;
|
|
||||||
bool chargerUsbOnline;
|
|
||||||
bool chargerWirelessOnline;
|
|
||||||
int maxChargingCurrent;
|
|
||||||
int batteryStatus;
|
|
||||||
int batteryHealth;
|
|
||||||
bool batteryPresent;
|
|
||||||
int batteryLevel;
|
|
||||||
int batteryVoltage;
|
|
||||||
int batteryTemperature;
|
|
||||||
String8 batteryTechnology;
|
|
||||||
|
|
||||||
bool dockBatterySupported;
|
|
||||||
bool chargerDockAcOnline;
|
|
||||||
int dockBatteryStatus;
|
|
||||||
int dockBatteryHealth;
|
|
||||||
bool dockBatteryPresent;
|
|
||||||
int dockBatteryLevel;
|
|
||||||
int dockBatteryVoltage;
|
|
||||||
int dockBatteryTemperature;
|
|
||||||
String8 dockBatteryTechnology;
|
|
||||||
|
|
||||||
status_t writeToParcel(Parcel* parcel) const;
|
|
||||||
status_t readFromParcel(Parcel* parcel);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BatteryProperty {
|
|
||||||
int64_t valueInt64;
|
|
||||||
|
|
||||||
status_t writeToParcel(Parcel* parcel) const;
|
|
||||||
status_t readFromParcel(Parcel* parcel);
|
|
||||||
};
|
|
||||||
|
|
||||||
}; // namespace android
|
|
||||||
|
|
||||||
#endif // ANDROID_BATTERYSERVICE_H
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2013 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ANDROID_IBATTERYPROPERTIESLISTENER_H
|
|
||||||
#define ANDROID_IBATTERYPROPERTIESLISTENER_H
|
|
||||||
|
|
||||||
#include <binder/IBinder.h>
|
|
||||||
#include <binder/IInterface.h>
|
|
||||||
|
|
||||||
#include <batteryservice/BatteryService.h>
|
|
||||||
|
|
||||||
namespace android {
|
|
||||||
|
|
||||||
// must be kept in sync with interface defined in IBatteryPropertiesListener.aidl
|
|
||||||
enum {
|
|
||||||
TRANSACT_BATTERYPROPERTIESCHANGED = IBinder::FIRST_CALL_TRANSACTION,
|
|
||||||
};
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class IBatteryPropertiesListener : public IInterface {
|
|
||||||
public:
|
|
||||||
DECLARE_META_INTERFACE(BatteryPropertiesListener);
|
|
||||||
|
|
||||||
virtual void batteryPropertiesChanged(struct BatteryProperties props) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
}; // namespace android
|
|
||||||
|
|
||||||
#endif // ANDROID_IBATTERYPROPERTIESLISTENER_H
|
|
|
@ -1,52 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2013 The Android Open Source Project
|
|
||||||
* Copyright (C) 2015 The CyanogenMod Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ANDROID_IBATTERYPROPERTIESREGISTRAR_H
|
|
||||||
#define ANDROID_IBATTERYPROPERTIESREGISTRAR_H
|
|
||||||
|
|
||||||
#include <binder/IInterface.h>
|
|
||||||
#include <batteryservice/IBatteryPropertiesListener.h>
|
|
||||||
|
|
||||||
namespace android {
|
|
||||||
|
|
||||||
// must be kept in sync with interface defined in IBatteryPropertiesRegistrar.aidl
|
|
||||||
enum {
|
|
||||||
REGISTER_LISTENER = IBinder::FIRST_CALL_TRANSACTION,
|
|
||||||
UNREGISTER_LISTENER,
|
|
||||||
GET_PROPERTY,
|
|
||||||
GET_DOCK_PROPERTY,
|
|
||||||
};
|
|
||||||
|
|
||||||
class IBatteryPropertiesRegistrar : public IInterface {
|
|
||||||
public:
|
|
||||||
DECLARE_META_INTERFACE(BatteryPropertiesRegistrar);
|
|
||||||
|
|
||||||
virtual void registerListener(const sp<IBatteryPropertiesListener>& listener) = 0;
|
|
||||||
virtual void unregisterListener(const sp<IBatteryPropertiesListener>& listener) = 0;
|
|
||||||
virtual status_t getProperty(int id, struct BatteryProperty *val) = 0;
|
|
||||||
virtual status_t getDockProperty(int id, struct BatteryProperty *val) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class BnBatteryPropertiesRegistrar : public BnInterface<IBatteryPropertiesRegistrar> {
|
|
||||||
public:
|
|
||||||
virtual status_t onTransact(uint32_t code, const Parcel& data,
|
|
||||||
Parcel* reply, uint32_t flags = 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
}; // namespace android
|
|
||||||
|
|
||||||
#endif // ANDROID_IBATTERYPROPERTIESREGISTRAR_H
|
|
|
@ -1,30 +0,0 @@
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LIBDISKUSAGE_DIRSIZE_H
|
|
||||||
#define __LIBDISKUSAGE_DIRSIZE_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
__BEGIN_DECLS
|
|
||||||
|
|
||||||
int64_t stat_size(struct stat *s);
|
|
||||||
int64_t calculate_dir_size(int dfd);
|
|
||||||
|
|
||||||
__END_DECLS
|
|
||||||
|
|
||||||
#endif /* __LIBDISKUSAGE_DIRSIZE_H */
|
|
|
@ -1,52 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2013 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _LIBINPUT_IINPUT_FLINGER_H
|
|
||||||
#define _LIBINPUT_IINPUT_FLINGER_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include <binder/IInterface.h>
|
|
||||||
|
|
||||||
namespace android {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This class defines the Binder IPC interface for accessing various
|
|
||||||
* InputFlinger features.
|
|
||||||
*/
|
|
||||||
class IInputFlinger : public IInterface {
|
|
||||||
public:
|
|
||||||
DECLARE_META_INTERFACE(InputFlinger);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Binder implementation.
|
|
||||||
*/
|
|
||||||
class BnInputFlinger : public BnInterface<IInputFlinger> {
|
|
||||||
public:
|
|
||||||
enum {
|
|
||||||
DO_SOMETHING_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual status_t onTransact(uint32_t code, const Parcel& data,
|
|
||||||
Parcel* reply, uint32_t flags = 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace android
|
|
||||||
|
|
||||||
#endif // _LIBINPUT_IINPUT_FLINGER_H
|
|
|
@ -1,681 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _LIBINPUT_INPUT_H
|
|
||||||
#define _LIBINPUT_INPUT_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Native input event structures.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <android/input.h>
|
|
||||||
#include <utils/BitSet.h>
|
|
||||||
#include <utils/KeyedVector.h>
|
|
||||||
#include <utils/RefBase.h>
|
|
||||||
#include <utils/String8.h>
|
|
||||||
#include <utils/Timers.h>
|
|
||||||
#include <utils/Vector.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Additional private constants not defined in ndk/ui/input.h.
|
|
||||||
*/
|
|
||||||
enum {
|
|
||||||
/* Signifies that the key is being predispatched */
|
|
||||||
AKEY_EVENT_FLAG_PREDISPATCH = 0x20000000,
|
|
||||||
|
|
||||||
/* Private control to determine when an app is tracking a key sequence. */
|
|
||||||
AKEY_EVENT_FLAG_START_TRACKING = 0x40000000,
|
|
||||||
|
|
||||||
/* Key event is inconsistent with previously sent key events. */
|
|
||||||
AKEY_EVENT_FLAG_TAINTED = 0x80000000,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This flag indicates that the window that received this motion event is partly
|
|
||||||
* or wholly obscured by another visible window above it. This flag is set to true
|
|
||||||
* even if the event did not directly pass through the obscured area.
|
|
||||||
* A security sensitive application can check this flag to identify situations in which
|
|
||||||
* a malicious application may have covered up part of its content for the purpose
|
|
||||||
* of misleading the user or hijacking touches. An appropriate response might be
|
|
||||||
* to drop the suspect touches or to take additional precautions to confirm the user's
|
|
||||||
* actual intent.
|
|
||||||
*/
|
|
||||||
AMOTION_EVENT_FLAG_WINDOW_IS_PARTIALLY_OBSCURED = 0x2,
|
|
||||||
|
|
||||||
/* Motion event is inconsistent with previously sent motion events. */
|
|
||||||
AMOTION_EVENT_FLAG_TAINTED = 0x80000000,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
/* Used when a motion event is not associated with any display.
|
|
||||||
* Typically used for non-pointer events. */
|
|
||||||
ADISPLAY_ID_NONE = -1,
|
|
||||||
|
|
||||||
/* The default display id. */
|
|
||||||
ADISPLAY_ID_DEFAULT = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
/*
|
|
||||||
* Indicates that an input device has switches.
|
|
||||||
* This input source flag is hidden from the API because switches are only used by the system
|
|
||||||
* and applications have no way to interact with them.
|
|
||||||
*/
|
|
||||||
AINPUT_SOURCE_SWITCH = 0x80000000,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
/**
|
|
||||||
* Constants for LEDs. Hidden from the API since we don't actually expose a way to interact
|
|
||||||
* with LEDs to developers
|
|
||||||
*
|
|
||||||
* NOTE: If you add LEDs here, you must also add them to InputEventLabels.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
ALED_NUM_LOCK = 0x00,
|
|
||||||
ALED_CAPS_LOCK = 0x01,
|
|
||||||
ALED_SCROLL_LOCK = 0x02,
|
|
||||||
ALED_COMPOSE = 0x03,
|
|
||||||
ALED_KANA = 0x04,
|
|
||||||
ALED_SLEEP = 0x05,
|
|
||||||
ALED_SUSPEND = 0x06,
|
|
||||||
ALED_MUTE = 0x07,
|
|
||||||
ALED_MISC = 0x08,
|
|
||||||
ALED_MAIL = 0x09,
|
|
||||||
ALED_CHARGING = 0x0a,
|
|
||||||
ALED_CONTROLLER_1 = 0x10,
|
|
||||||
ALED_CONTROLLER_2 = 0x11,
|
|
||||||
ALED_CONTROLLER_3 = 0x12,
|
|
||||||
ALED_CONTROLLER_4 = 0x13,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Maximum number of controller LEDs we support */
|
|
||||||
#define MAX_CONTROLLER_LEDS 4
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SystemUiVisibility constants from View.
|
|
||||||
*/
|
|
||||||
enum {
|
|
||||||
ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE = 0,
|
|
||||||
ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN = 0x00000001,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Maximum number of pointers supported per motion event.
|
|
||||||
* Smallest number of pointers is 1.
|
|
||||||
* (We want at least 10 but some touch controllers obstensibly configured for 10 pointers
|
|
||||||
* will occasionally emit 11. There is not much harm making this constant bigger.)
|
|
||||||
*/
|
|
||||||
#define MAX_POINTERS 16
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Maximum number of samples supported per motion event.
|
|
||||||
*/
|
|
||||||
#define MAX_SAMPLES UINT16_MAX
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Maximum pointer id value supported in a motion event.
|
|
||||||
* Smallest pointer id is 0.
|
|
||||||
* (This is limited by our use of BitSet32 to track pointer assignments.)
|
|
||||||
*/
|
|
||||||
#define MAX_POINTER_ID 31
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Declare a concrete type for the NDK's input event forward declaration.
|
|
||||||
*/
|
|
||||||
struct AInputEvent {
|
|
||||||
virtual ~AInputEvent() { }
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Declare a concrete type for the NDK's input device forward declaration.
|
|
||||||
*/
|
|
||||||
struct AInputDevice {
|
|
||||||
virtual ~AInputDevice() { }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
namespace android {
|
|
||||||
|
|
||||||
#ifdef HAVE_ANDROID_OS
|
|
||||||
class Parcel;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flags that flow alongside events in the input dispatch system to help with certain
|
|
||||||
* policy decisions such as waking from device sleep.
|
|
||||||
*
|
|
||||||
* These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java.
|
|
||||||
*/
|
|
||||||
enum {
|
|
||||||
/* These flags originate in RawEvents and are generally set in the key map.
|
|
||||||
* NOTE: If you want a flag to be able to set in a keylayout file, then you must add it to
|
|
||||||
* InputEventLabels.h as well. */
|
|
||||||
|
|
||||||
// Indicates that the event should wake the device.
|
|
||||||
POLICY_FLAG_WAKE = 0x00000001,
|
|
||||||
|
|
||||||
// Indicates that the key is virtual, such as a capacitive button, and should
|
|
||||||
// generate haptic feedback. Virtual keys may be suppressed for some time
|
|
||||||
// after a recent touch to prevent accidental activation of virtual keys adjacent
|
|
||||||
// to the touch screen during an edge swipe.
|
|
||||||
POLICY_FLAG_VIRTUAL = 0x00000002,
|
|
||||||
|
|
||||||
// Indicates that the key is the special function modifier.
|
|
||||||
POLICY_FLAG_FUNCTION = 0x00000004,
|
|
||||||
|
|
||||||
// Indicates that the key represents a special gesture that has been detected by
|
|
||||||
// the touch firmware or driver. Causes touch events from the same device to be canceled.
|
|
||||||
POLICY_FLAG_GESTURE = 0x00000008,
|
|
||||||
|
|
||||||
POLICY_FLAG_RAW_MASK = 0x0000ffff,
|
|
||||||
|
|
||||||
/* These flags are set by the input dispatcher. */
|
|
||||||
|
|
||||||
// Indicates that the input event was injected.
|
|
||||||
POLICY_FLAG_INJECTED = 0x01000000,
|
|
||||||
|
|
||||||
// Indicates that the input event is from a trusted source such as a directly attached
|
|
||||||
// input device or an application with system-wide event injection permission.
|
|
||||||
POLICY_FLAG_TRUSTED = 0x02000000,
|
|
||||||
|
|
||||||
// Indicates that the input event has passed through an input filter.
|
|
||||||
POLICY_FLAG_FILTERED = 0x04000000,
|
|
||||||
|
|
||||||
// Disables automatic key repeating behavior.
|
|
||||||
POLICY_FLAG_DISABLE_KEY_REPEAT = 0x08000000,
|
|
||||||
|
|
||||||
/* These flags are set by the input reader policy as it intercepts each event. */
|
|
||||||
|
|
||||||
// Indicates that the device was in an interactive state when the
|
|
||||||
// event was intercepted.
|
|
||||||
POLICY_FLAG_INTERACTIVE = 0x20000000,
|
|
||||||
|
|
||||||
// Indicates that the event should be dispatched to applications.
|
|
||||||
// The input event should still be sent to the InputDispatcher so that it can see all
|
|
||||||
// input events received include those that it will not deliver.
|
|
||||||
POLICY_FLAG_PASS_TO_USER = 0x40000000,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Pointer coordinate data.
|
|
||||||
*/
|
|
||||||
struct PointerCoords {
|
|
||||||
enum { MAX_AXES = 30 }; // 30 so that sizeof(PointerCoords) == 128
|
|
||||||
|
|
||||||
// Bitfield of axes that are present in this structure.
|
|
||||||
uint64_t bits __attribute__((aligned(8)));
|
|
||||||
|
|
||||||
// Values of axes that are stored in this structure packed in order by axis id
|
|
||||||
// for each axis that is present in the structure according to 'bits'.
|
|
||||||
float values[MAX_AXES];
|
|
||||||
|
|
||||||
inline void clear() {
|
|
||||||
BitSet64::clear(bits);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isEmpty() const {
|
|
||||||
return BitSet64::isEmpty(bits);
|
|
||||||
}
|
|
||||||
|
|
||||||
float getAxisValue(int32_t axis) const;
|
|
||||||
status_t setAxisValue(int32_t axis, float value);
|
|
||||||
|
|
||||||
void scale(float scale);
|
|
||||||
void applyOffset(float xOffset, float yOffset);
|
|
||||||
|
|
||||||
inline float getX() const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_X);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getY() const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_Y);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_ANDROID_OS
|
|
||||||
status_t readFromParcel(Parcel* parcel);
|
|
||||||
status_t writeToParcel(Parcel* parcel) const;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool operator==(const PointerCoords& other) const;
|
|
||||||
inline bool operator!=(const PointerCoords& other) const {
|
|
||||||
return !(*this == other);
|
|
||||||
}
|
|
||||||
|
|
||||||
void copyFrom(const PointerCoords& other);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void tooManyAxes(int axis);
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Pointer property data.
|
|
||||||
*/
|
|
||||||
struct PointerProperties {
|
|
||||||
// The id of the pointer.
|
|
||||||
int32_t id;
|
|
||||||
|
|
||||||
// The pointer tool type.
|
|
||||||
int32_t toolType;
|
|
||||||
|
|
||||||
inline void clear() {
|
|
||||||
id = -1;
|
|
||||||
toolType = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const PointerProperties& other) const;
|
|
||||||
inline bool operator!=(const PointerProperties& other) const {
|
|
||||||
return !(*this == other);
|
|
||||||
}
|
|
||||||
|
|
||||||
void copyFrom(const PointerProperties& other);
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Input events.
|
|
||||||
*/
|
|
||||||
class InputEvent : public AInputEvent {
|
|
||||||
public:
|
|
||||||
virtual ~InputEvent() { }
|
|
||||||
|
|
||||||
virtual int32_t getType() const = 0;
|
|
||||||
|
|
||||||
inline int32_t getDeviceId() const { return mDeviceId; }
|
|
||||||
|
|
||||||
inline int32_t getSource() const { return mSource; }
|
|
||||||
|
|
||||||
inline void setSource(int32_t source) { mSource = source; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void initialize(int32_t deviceId, int32_t source);
|
|
||||||
void initialize(const InputEvent& from);
|
|
||||||
|
|
||||||
int32_t mDeviceId;
|
|
||||||
int32_t mSource;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Key events.
|
|
||||||
*/
|
|
||||||
class KeyEvent : public InputEvent {
|
|
||||||
public:
|
|
||||||
virtual ~KeyEvent() { }
|
|
||||||
|
|
||||||
virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; }
|
|
||||||
|
|
||||||
inline int32_t getAction() const { return mAction; }
|
|
||||||
|
|
||||||
inline int32_t getFlags() const { return mFlags; }
|
|
||||||
|
|
||||||
inline void setFlags(int32_t flags) { mFlags = flags; }
|
|
||||||
|
|
||||||
inline int32_t getKeyCode() const { return mKeyCode; }
|
|
||||||
|
|
||||||
inline int32_t getScanCode() const { return mScanCode; }
|
|
||||||
|
|
||||||
inline int32_t getMetaState() const { return mMetaState; }
|
|
||||||
|
|
||||||
inline int32_t getRepeatCount() const { return mRepeatCount; }
|
|
||||||
|
|
||||||
inline nsecs_t getDownTime() const { return mDownTime; }
|
|
||||||
|
|
||||||
inline nsecs_t getEventTime() const { return mEventTime; }
|
|
||||||
|
|
||||||
static const char* getLabel(int32_t keyCode);
|
|
||||||
static int32_t getKeyCodeFromLabel(const char* label);
|
|
||||||
|
|
||||||
void initialize(
|
|
||||||
int32_t deviceId,
|
|
||||||
int32_t source,
|
|
||||||
int32_t action,
|
|
||||||
int32_t flags,
|
|
||||||
int32_t keyCode,
|
|
||||||
int32_t scanCode,
|
|
||||||
int32_t metaState,
|
|
||||||
int32_t repeatCount,
|
|
||||||
nsecs_t downTime,
|
|
||||||
nsecs_t eventTime);
|
|
||||||
void initialize(const KeyEvent& from);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int32_t mAction;
|
|
||||||
int32_t mFlags;
|
|
||||||
int32_t mKeyCode;
|
|
||||||
int32_t mScanCode;
|
|
||||||
int32_t mMetaState;
|
|
||||||
int32_t mRepeatCount;
|
|
||||||
nsecs_t mDownTime;
|
|
||||||
nsecs_t mEventTime;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Motion events.
|
|
||||||
*/
|
|
||||||
class MotionEvent : public InputEvent {
|
|
||||||
public:
|
|
||||||
virtual ~MotionEvent() { }
|
|
||||||
|
|
||||||
virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; }
|
|
||||||
|
|
||||||
inline int32_t getAction() const { return mAction; }
|
|
||||||
|
|
||||||
inline int32_t getActionMasked() const { return mAction & AMOTION_EVENT_ACTION_MASK; }
|
|
||||||
|
|
||||||
inline int32_t getActionIndex() const {
|
|
||||||
return (mAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
|
|
||||||
>> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void setAction(int32_t action) { mAction = action; }
|
|
||||||
|
|
||||||
inline int32_t getFlags() const { return mFlags; }
|
|
||||||
|
|
||||||
inline void setFlags(int32_t flags) { mFlags = flags; }
|
|
||||||
|
|
||||||
inline int32_t getEdgeFlags() const { return mEdgeFlags; }
|
|
||||||
|
|
||||||
inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; }
|
|
||||||
|
|
||||||
inline int32_t getMetaState() const { return mMetaState; }
|
|
||||||
|
|
||||||
inline void setMetaState(int32_t metaState) { mMetaState = metaState; }
|
|
||||||
|
|
||||||
inline int32_t getButtonState() const { return mButtonState; }
|
|
||||||
|
|
||||||
inline int32_t setButtonState(int32_t buttonState) { mButtonState = buttonState; }
|
|
||||||
|
|
||||||
inline int32_t getActionButton() const { return mActionButton; }
|
|
||||||
|
|
||||||
inline void setActionButton(int32_t button) { mActionButton = button; }
|
|
||||||
|
|
||||||
inline float getXOffset() const { return mXOffset; }
|
|
||||||
|
|
||||||
inline float getYOffset() const { return mYOffset; }
|
|
||||||
|
|
||||||
inline float getXPrecision() const { return mXPrecision; }
|
|
||||||
|
|
||||||
inline float getYPrecision() const { return mYPrecision; }
|
|
||||||
|
|
||||||
inline nsecs_t getDownTime() const { return mDownTime; }
|
|
||||||
|
|
||||||
inline void setDownTime(nsecs_t downTime) { mDownTime = downTime; }
|
|
||||||
|
|
||||||
inline size_t getPointerCount() const { return mPointerProperties.size(); }
|
|
||||||
|
|
||||||
inline const PointerProperties* getPointerProperties(size_t pointerIndex) const {
|
|
||||||
return &mPointerProperties[pointerIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int32_t getPointerId(size_t pointerIndex) const {
|
|
||||||
return mPointerProperties[pointerIndex].id;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int32_t getToolType(size_t pointerIndex) const {
|
|
||||||
return mPointerProperties[pointerIndex].toolType;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; }
|
|
||||||
|
|
||||||
const PointerCoords* getRawPointerCoords(size_t pointerIndex) const;
|
|
||||||
|
|
||||||
float getRawAxisValue(int32_t axis, size_t pointerIndex) const;
|
|
||||||
|
|
||||||
inline float getRawX(size_t pointerIndex) const {
|
|
||||||
return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getRawY(size_t pointerIndex) const {
|
|
||||||
return getRawAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
float getAxisValue(int32_t axis, size_t pointerIndex) const;
|
|
||||||
|
|
||||||
inline float getX(size_t pointerIndex) const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getY(size_t pointerIndex) const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getPressure(size_t pointerIndex) const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getSize(size_t pointerIndex) const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getTouchMajor(size_t pointerIndex) const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getTouchMinor(size_t pointerIndex) const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getToolMajor(size_t pointerIndex) const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getToolMinor(size_t pointerIndex) const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getOrientation(size_t pointerIndex) const {
|
|
||||||
return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; }
|
|
||||||
|
|
||||||
inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const {
|
|
||||||
return mSampleEventTimes[historicalIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
const PointerCoords* getHistoricalRawPointerCoords(
|
|
||||||
size_t pointerIndex, size_t historicalIndex) const;
|
|
||||||
|
|
||||||
float getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex,
|
|
||||||
size_t historicalIndex) const;
|
|
||||||
|
|
||||||
inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalRawAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalRawAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
float getHistoricalAxisValue(int32_t axis, size_t pointerIndex, size_t historicalIndex) const;
|
|
||||||
|
|
||||||
inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const {
|
|
||||||
return getHistoricalAxisValue(
|
|
||||||
AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex, historicalIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t findPointerIndex(int32_t pointerId) const;
|
|
||||||
|
|
||||||
void initialize(
|
|
||||||
int32_t deviceId,
|
|
||||||
int32_t source,
|
|
||||||
int32_t action,
|
|
||||||
int32_t actionButton,
|
|
||||||
int32_t flags,
|
|
||||||
int32_t edgeFlags,
|
|
||||||
int32_t metaState,
|
|
||||||
int32_t buttonState,
|
|
||||||
float xOffset,
|
|
||||||
float yOffset,
|
|
||||||
float xPrecision,
|
|
||||||
float yPrecision,
|
|
||||||
nsecs_t downTime,
|
|
||||||
nsecs_t eventTime,
|
|
||||||
size_t pointerCount,
|
|
||||||
const PointerProperties* pointerProperties,
|
|
||||||
const PointerCoords* pointerCoords);
|
|
||||||
|
|
||||||
void copyFrom(const MotionEvent* other, bool keepHistory);
|
|
||||||
|
|
||||||
void addSample(
|
|
||||||
nsecs_t eventTime,
|
|
||||||
const PointerCoords* pointerCoords);
|
|
||||||
|
|
||||||
void offsetLocation(float xOffset, float yOffset);
|
|
||||||
|
|
||||||
void scale(float scaleFactor);
|
|
||||||
|
|
||||||
// Apply 3x3 perspective matrix transformation.
|
|
||||||
// Matrix is in row-major form and compatible with SkMatrix.
|
|
||||||
void transform(const float matrix[9]);
|
|
||||||
|
|
||||||
#ifdef HAVE_ANDROID_OS
|
|
||||||
status_t readFromParcel(Parcel* parcel);
|
|
||||||
status_t writeToParcel(Parcel* parcel) const;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static bool isTouchEvent(int32_t source, int32_t action);
|
|
||||||
inline bool isTouchEvent() const {
|
|
||||||
return isTouchEvent(mSource, mAction);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Low-level accessors.
|
|
||||||
inline const PointerProperties* getPointerProperties() const {
|
|
||||||
return mPointerProperties.array();
|
|
||||||
}
|
|
||||||
inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); }
|
|
||||||
inline const PointerCoords* getSamplePointerCoords() const {
|
|
||||||
return mSamplePointerCoords.array();
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char* getLabel(int32_t axis);
|
|
||||||
static int32_t getAxisFromLabel(const char* label);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int32_t mAction;
|
|
||||||
int32_t mActionButton;
|
|
||||||
int32_t mFlags;
|
|
||||||
int32_t mEdgeFlags;
|
|
||||||
int32_t mMetaState;
|
|
||||||
int32_t mButtonState;
|
|
||||||
float mXOffset;
|
|
||||||
float mYOffset;
|
|
||||||
float mXPrecision;
|
|
||||||
float mYPrecision;
|
|
||||||
nsecs_t mDownTime;
|
|
||||||
Vector<PointerProperties> mPointerProperties;
|
|
||||||
Vector<nsecs_t> mSampleEventTimes;
|
|
||||||
Vector<PointerCoords> mSamplePointerCoords;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Input event factory.
|
|
||||||
*/
|
|
||||||
class InputEventFactoryInterface {
|
|
||||||
protected:
|
|
||||||
virtual ~InputEventFactoryInterface() { }
|
|
||||||
|
|
||||||
public:
|
|
||||||
InputEventFactoryInterface() { }
|
|
||||||
|
|
||||||
virtual KeyEvent* createKeyEvent() = 0;
|
|
||||||
virtual MotionEvent* createMotionEvent() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A simple input event factory implementation that uses a single preallocated instance
|
|
||||||
* of each type of input event that are reused for each request.
|
|
||||||
*/
|
|
||||||
class PreallocatedInputEventFactory : public InputEventFactoryInterface {
|
|
||||||
public:
|
|
||||||
PreallocatedInputEventFactory() { }
|
|
||||||
virtual ~PreallocatedInputEventFactory() { }
|
|
||||||
|
|
||||||
virtual KeyEvent* createKeyEvent() { return & mKeyEvent; }
|
|
||||||
virtual MotionEvent* createMotionEvent() { return & mMotionEvent; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
KeyEvent mKeyEvent;
|
|
||||||
MotionEvent mMotionEvent;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An input event factory implementation that maintains a pool of input events.
|
|
||||||
*/
|
|
||||||
class PooledInputEventFactory : public InputEventFactoryInterface {
|
|
||||||
public:
|
|
||||||
PooledInputEventFactory(size_t maxPoolSize = 20);
|
|
||||||
virtual ~PooledInputEventFactory();
|
|
||||||
|
|
||||||
virtual KeyEvent* createKeyEvent();
|
|
||||||
virtual MotionEvent* createMotionEvent();
|
|
||||||
|
|
||||||
void recycle(InputEvent* event);
|
|
||||||
|
|
||||||
private:
|
|
||||||
const size_t mMaxPoolSize;
|
|
||||||
|
|
||||||
Vector<KeyEvent*> mKeyEventPool;
|
|
||||||
Vector<MotionEvent*> mMotionEventPool;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace android
|
|
||||||
|
|
||||||
#endif // _LIBINPUT_INPUT_H
|
|
|
@ -1,170 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2012 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _LIBINPUT_INPUT_DEVICE_H
|
|
||||||
#define _LIBINPUT_INPUT_DEVICE_H
|
|
||||||
|
|
||||||
#include <input/Input.h>
|
|
||||||
#include <input/KeyCharacterMap.h>
|
|
||||||
|
|
||||||
namespace android {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Identifies a device.
|
|
||||||
*/
|
|
||||||
struct InputDeviceIdentifier {
|
|
||||||
inline InputDeviceIdentifier() :
|
|
||||||
bus(0), vendor(0), product(0), version(0) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Information provided by the kernel.
|
|
||||||
String8 name;
|
|
||||||
String8 location;
|
|
||||||
String8 uniqueId;
|
|
||||||
uint16_t bus;
|
|
||||||
uint16_t vendor;
|
|
||||||
uint16_t product;
|
|
||||||
uint16_t version;
|
|
||||||
|
|
||||||
// A composite input device descriptor string that uniquely identifies the device
|
|
||||||
// even across reboots or reconnections. The value of this field is used by
|
|
||||||
// upper layers of the input system to associate settings with individual devices.
|
|
||||||
// It is hashed from whatever kernel provided information is available.
|
|
||||||
// Ideally, the way this value is computed should not change between Android releases
|
|
||||||
// because that would invalidate persistent settings that rely on it.
|
|
||||||
String8 descriptor;
|
|
||||||
|
|
||||||
// A value added to uniquely identify a device in the absence of a unique id. This
|
|
||||||
// is intended to be a minimum way to distinguish from other active devices and may
|
|
||||||
// reuse values that are not associated with an input anymore.
|
|
||||||
uint16_t nonce;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Describes the characteristics and capabilities of an input device.
|
|
||||||
*/
|
|
||||||
class InputDeviceInfo {
|
|
||||||
public:
|
|
||||||
InputDeviceInfo();
|
|
||||||
InputDeviceInfo(const InputDeviceInfo& other);
|
|
||||||
~InputDeviceInfo();
|
|
||||||
|
|
||||||
struct MotionRange {
|
|
||||||
int32_t axis;
|
|
||||||
uint32_t source;
|
|
||||||
float min;
|
|
||||||
float max;
|
|
||||||
float flat;
|
|
||||||
float fuzz;
|
|
||||||
float resolution;
|
|
||||||
};
|
|
||||||
|
|
||||||
void initialize(int32_t id, int32_t generation, int32_t controllerNumber,
|
|
||||||
const InputDeviceIdentifier& identifier, const String8& alias, bool isExternal,
|
|
||||||
bool hasMic);
|
|
||||||
|
|
||||||
inline int32_t getId() const { return mId; }
|
|
||||||
inline int32_t getControllerNumber() const { return mControllerNumber; }
|
|
||||||
inline int32_t getGeneration() const { return mGeneration; }
|
|
||||||
inline const InputDeviceIdentifier& getIdentifier() const { return mIdentifier; }
|
|
||||||
inline const String8& getAlias() const { return mAlias; }
|
|
||||||
inline const String8& getDisplayName() const {
|
|
||||||
return mAlias.isEmpty() ? mIdentifier.name : mAlias;
|
|
||||||
}
|
|
||||||
inline bool isExternal() const { return mIsExternal; }
|
|
||||||
inline bool hasMic() const { return mHasMic; }
|
|
||||||
inline uint32_t getSources() const { return mSources; }
|
|
||||||
|
|
||||||
const MotionRange* getMotionRange(int32_t axis, uint32_t source) const;
|
|
||||||
|
|
||||||
void addSource(uint32_t source);
|
|
||||||
void addMotionRange(int32_t axis, uint32_t source,
|
|
||||||
float min, float max, float flat, float fuzz, float resolution);
|
|
||||||
void addMotionRange(const MotionRange& range);
|
|
||||||
|
|
||||||
inline void setKeyboardType(int32_t keyboardType) { mKeyboardType = keyboardType; }
|
|
||||||
inline int32_t getKeyboardType() const { return mKeyboardType; }
|
|
||||||
|
|
||||||
inline void setKeyCharacterMap(const sp<KeyCharacterMap>& value) {
|
|
||||||
mKeyCharacterMap = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline sp<KeyCharacterMap> getKeyCharacterMap() const {
|
|
||||||
return mKeyCharacterMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void setVibrator(bool hasVibrator) { mHasVibrator = hasVibrator; }
|
|
||||||
inline bool hasVibrator() const { return mHasVibrator; }
|
|
||||||
|
|
||||||
inline void setButtonUnderPad(bool hasButton) { mHasButtonUnderPad = hasButton; }
|
|
||||||
inline bool hasButtonUnderPad() const { return mHasButtonUnderPad; }
|
|
||||||
|
|
||||||
inline const Vector<MotionRange>& getMotionRanges() const {
|
|
||||||
return mMotionRanges;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int32_t mId;
|
|
||||||
int32_t mGeneration;
|
|
||||||
int32_t mControllerNumber;
|
|
||||||
InputDeviceIdentifier mIdentifier;
|
|
||||||
String8 mAlias;
|
|
||||||
bool mIsExternal;
|
|
||||||
bool mHasMic;
|
|
||||||
uint32_t mSources;
|
|
||||||
int32_t mKeyboardType;
|
|
||||||
sp<KeyCharacterMap> mKeyCharacterMap;
|
|
||||||
bool mHasVibrator;
|
|
||||||
bool mHasButtonUnderPad;
|
|
||||||
|
|
||||||
Vector<MotionRange> mMotionRanges;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Types of input device configuration files. */
|
|
||||||
enum InputDeviceConfigurationFileType {
|
|
||||||
INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0, /* .idc file */
|
|
||||||
INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT = 1, /* .kl file */
|
|
||||||
INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP = 2, /* .kcm file */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Gets the path of an input device configuration file, if one is available.
|
|
||||||
* Considers both system provided and user installed configuration files.
|
|
||||||
*
|
|
||||||
* The device identifier is used to construct several default configuration file
|
|
||||||
* names to try based on the device name, vendor, product, and version.
|
|
||||||
*
|
|
||||||
* Returns an empty string if not found.
|
|
||||||
*/
|
|
||||||
extern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier(
|
|
||||||
const InputDeviceIdentifier& deviceIdentifier,
|
|
||||||
InputDeviceConfigurationFileType type);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Gets the path of an input device configuration file, if one is available.
|
|
||||||
* Considers both system provided and user installed configuration files.
|
|
||||||
*
|
|
||||||
* The name is case-sensitive and is used to construct the filename to resolve.
|
|
||||||
* All characters except 'a'-'z', 'A'-'Z', '0'-'9', '-', and '_' are replaced by underscores.
|
|
||||||
*
|
|
||||||
* Returns an empty string if not found.
|
|
||||||
*/
|
|
||||||
extern String8 getInputDeviceConfigurationFilePathByName(
|
|
||||||
const String8& name, InputDeviceConfigurationFileType type);
|
|
||||||
|
|
||||||
} // namespace android
|
|
||||||
|
|
||||||
#endif // _LIBINPUT_INPUT_DEVICE_H
|
|
|
@ -1,447 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _LIBINPUT_INPUT_EVENT_LABELS_H
|
|
||||||
#define _LIBINPUT_INPUT_EVENT_LABELS_H
|
|
||||||
|
|
||||||
#include <input/Input.h>
|
|
||||||
#include <android/keycodes.h>
|
|
||||||
|
|
||||||
#define DEFINE_KEYCODE(key) { #key, AKEYCODE_##key }
|
|
||||||
#define DEFINE_AXIS(axis) { #axis, AMOTION_EVENT_AXIS_##axis }
|
|
||||||
#define DEFINE_LED(led) { #led, ALED_##led }
|
|
||||||
#define DEFINE_FLAG(flag) { #flag, POLICY_FLAG_##flag }
|
|
||||||
|
|
||||||
namespace android {
|
|
||||||
|
|
||||||
template<typename T, size_t N>
|
|
||||||
size_t size(T (&)[N]) { return N; }
|
|
||||||
|
|
||||||
struct InputEventLabel {
|
|
||||||
const char *literal;
|
|
||||||
int value;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static const InputEventLabel KEYCODES[] = {
|
|
||||||
// NOTE: If you add a new keycode here you must also add it to several other files.
|
|
||||||
// Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
|
|
||||||
DEFINE_KEYCODE(UNKNOWN),
|
|
||||||
DEFINE_KEYCODE(SOFT_LEFT),
|
|
||||||
DEFINE_KEYCODE(SOFT_RIGHT),
|
|
||||||
DEFINE_KEYCODE(HOME),
|
|
||||||
DEFINE_KEYCODE(BACK),
|
|
||||||
DEFINE_KEYCODE(CALL),
|
|
||||||
DEFINE_KEYCODE(ENDCALL),
|
|
||||||
DEFINE_KEYCODE(0),
|
|
||||||
DEFINE_KEYCODE(1),
|
|
||||||
DEFINE_KEYCODE(2),
|
|
||||||
DEFINE_KEYCODE(3),
|
|
||||||
DEFINE_KEYCODE(4),
|
|
||||||
DEFINE_KEYCODE(5),
|
|
||||||
DEFINE_KEYCODE(6),
|
|
||||||
DEFINE_KEYCODE(7),
|
|
||||||
DEFINE_KEYCODE(8),
|
|
||||||
DEFINE_KEYCODE(9),
|
|
||||||
DEFINE_KEYCODE(STAR),
|
|
||||||
DEFINE_KEYCODE(POUND),
|
|
||||||
DEFINE_KEYCODE(DPAD_UP),
|
|
||||||
DEFINE_KEYCODE(DPAD_DOWN),
|
|
||||||
DEFINE_KEYCODE(DPAD_LEFT),
|
|
||||||
DEFINE_KEYCODE(DPAD_RIGHT),
|
|
||||||
DEFINE_KEYCODE(DPAD_CENTER),
|
|
||||||
DEFINE_KEYCODE(VOLUME_UP),
|
|
||||||
DEFINE_KEYCODE(VOLUME_DOWN),
|
|
||||||
DEFINE_KEYCODE(POWER),
|
|
||||||
DEFINE_KEYCODE(CAMERA),
|
|
||||||
DEFINE_KEYCODE(CLEAR),
|
|
||||||
DEFINE_KEYCODE(A),
|
|
||||||
DEFINE_KEYCODE(B),
|
|
||||||
DEFINE_KEYCODE(C),
|
|
||||||
DEFINE_KEYCODE(D),
|
|
||||||
DEFINE_KEYCODE(E),
|
|
||||||
DEFINE_KEYCODE(F),
|
|
||||||
DEFINE_KEYCODE(G),
|
|
||||||
DEFINE_KEYCODE(H),
|
|
||||||
DEFINE_KEYCODE(I),
|
|
||||||
DEFINE_KEYCODE(J),
|
|
||||||
DEFINE_KEYCODE(K),
|
|
||||||
DEFINE_KEYCODE(L),
|
|
||||||
DEFINE_KEYCODE(M),
|
|
||||||
DEFINE_KEYCODE(N),
|
|
||||||
DEFINE_KEYCODE(O),
|
|
||||||
DEFINE_KEYCODE(P),
|
|
||||||
DEFINE_KEYCODE(Q),
|
|
||||||
DEFINE_KEYCODE(R),
|
|
||||||
DEFINE_KEYCODE(S),
|
|
||||||
DEFINE_KEYCODE(T),
|
|
||||||
DEFINE_KEYCODE(U),
|
|
||||||
DEFINE_KEYCODE(V),
|
|
||||||
DEFINE_KEYCODE(W),
|
|
||||||
DEFINE_KEYCODE(X),
|
|
||||||
DEFINE_KEYCODE(Y),
|
|
||||||
DEFINE_KEYCODE(Z),
|
|
||||||
DEFINE_KEYCODE(COMMA),
|
|
||||||
DEFINE_KEYCODE(PERIOD),
|
|
||||||
DEFINE_KEYCODE(ALT_LEFT),
|
|
||||||
DEFINE_KEYCODE(ALT_RIGHT),
|
|
||||||
DEFINE_KEYCODE(SHIFT_LEFT),
|
|
||||||
DEFINE_KEYCODE(SHIFT_RIGHT),
|
|
||||||
DEFINE_KEYCODE(TAB),
|
|
||||||
DEFINE_KEYCODE(SPACE),
|
|
||||||
DEFINE_KEYCODE(SYM),
|
|
||||||
DEFINE_KEYCODE(EXPLORER),
|
|
||||||
DEFINE_KEYCODE(ENVELOPE),
|
|
||||||
DEFINE_KEYCODE(ENTER),
|
|
||||||
DEFINE_KEYCODE(DEL),
|
|
||||||
DEFINE_KEYCODE(GRAVE),
|
|
||||||
DEFINE_KEYCODE(MINUS),
|
|
||||||
DEFINE_KEYCODE(EQUALS),
|
|
||||||
DEFINE_KEYCODE(LEFT_BRACKET),
|
|
||||||
DEFINE_KEYCODE(RIGHT_BRACKET),
|
|
||||||
DEFINE_KEYCODE(BACKSLASH),
|
|
||||||
DEFINE_KEYCODE(SEMICOLON),
|
|
||||||
DEFINE_KEYCODE(APOSTROPHE),
|
|
||||||
DEFINE_KEYCODE(SLASH),
|
|
||||||
DEFINE_KEYCODE(AT),
|
|
||||||
DEFINE_KEYCODE(NUM),
|
|
||||||
DEFINE_KEYCODE(HEADSETHOOK),
|
|
||||||
DEFINE_KEYCODE(FOCUS), // *Camera* focus
|
|
||||||
DEFINE_KEYCODE(PLUS),
|
|
||||||
DEFINE_KEYCODE(MENU),
|
|
||||||
DEFINE_KEYCODE(NOTIFICATION),
|
|
||||||
DEFINE_KEYCODE(SEARCH),
|
|
||||||
DEFINE_KEYCODE(MEDIA_PLAY_PAUSE),
|
|
||||||
DEFINE_KEYCODE(MEDIA_STOP),
|
|
||||||
DEFINE_KEYCODE(MEDIA_NEXT),
|
|
||||||
DEFINE_KEYCODE(MEDIA_PREVIOUS),
|
|
||||||
DEFINE_KEYCODE(MEDIA_REWIND),
|
|
||||||
DEFINE_KEYCODE(MEDIA_FAST_FORWARD),
|
|
||||||
DEFINE_KEYCODE(MUTE),
|
|
||||||
DEFINE_KEYCODE(PAGE_UP),
|
|
||||||
DEFINE_KEYCODE(PAGE_DOWN),
|
|
||||||
DEFINE_KEYCODE(PICTSYMBOLS),
|
|
||||||
DEFINE_KEYCODE(SWITCH_CHARSET),
|
|
||||||
DEFINE_KEYCODE(BUTTON_A),
|
|
||||||
DEFINE_KEYCODE(BUTTON_B),
|
|
||||||
DEFINE_KEYCODE(BUTTON_C),
|
|
||||||
DEFINE_KEYCODE(BUTTON_X),
|
|
||||||
DEFINE_KEYCODE(BUTTON_Y),
|
|
||||||
DEFINE_KEYCODE(BUTTON_Z),
|
|
||||||
DEFINE_KEYCODE(BUTTON_L1),
|
|
||||||
DEFINE_KEYCODE(BUTTON_R1),
|
|
||||||
DEFINE_KEYCODE(BUTTON_L2),
|
|
||||||
DEFINE_KEYCODE(BUTTON_R2),
|
|
||||||
DEFINE_KEYCODE(BUTTON_THUMBL),
|
|
||||||
DEFINE_KEYCODE(BUTTON_THUMBR),
|
|
||||||
DEFINE_KEYCODE(BUTTON_START),
|
|
||||||
DEFINE_KEYCODE(BUTTON_SELECT),
|
|
||||||
DEFINE_KEYCODE(BUTTON_MODE),
|
|
||||||
DEFINE_KEYCODE(ESCAPE),
|
|
||||||
DEFINE_KEYCODE(FORWARD_DEL),
|
|
||||||
DEFINE_KEYCODE(CTRL_LEFT),
|
|
||||||
DEFINE_KEYCODE(CTRL_RIGHT),
|
|
||||||
DEFINE_KEYCODE(CAPS_LOCK),
|
|
||||||
DEFINE_KEYCODE(SCROLL_LOCK),
|
|
||||||
DEFINE_KEYCODE(META_LEFT),
|
|
||||||
DEFINE_KEYCODE(META_RIGHT),
|
|
||||||
DEFINE_KEYCODE(FUNCTION),
|
|
||||||
DEFINE_KEYCODE(SYSRQ),
|
|
||||||
DEFINE_KEYCODE(BREAK),
|
|
||||||
DEFINE_KEYCODE(MOVE_HOME),
|
|
||||||
DEFINE_KEYCODE(MOVE_END),
|
|
||||||
DEFINE_KEYCODE(INSERT),
|
|
||||||
DEFINE_KEYCODE(FORWARD),
|
|
||||||
DEFINE_KEYCODE(MEDIA_PLAY),
|
|
||||||
DEFINE_KEYCODE(MEDIA_PAUSE),
|
|
||||||
DEFINE_KEYCODE(MEDIA_CLOSE),
|
|
||||||
DEFINE_KEYCODE(MEDIA_EJECT),
|
|
||||||
DEFINE_KEYCODE(MEDIA_RECORD),
|
|
||||||
DEFINE_KEYCODE(F1),
|
|
||||||
DEFINE_KEYCODE(F2),
|
|
||||||
DEFINE_KEYCODE(F3),
|
|
||||||
DEFINE_KEYCODE(F4),
|
|
||||||
DEFINE_KEYCODE(F5),
|
|
||||||
DEFINE_KEYCODE(F6),
|
|
||||||
DEFINE_KEYCODE(F7),
|
|
||||||
DEFINE_KEYCODE(F8),
|
|
||||||
DEFINE_KEYCODE(F9),
|
|
||||||
DEFINE_KEYCODE(F10),
|
|
||||||
DEFINE_KEYCODE(F11),
|
|
||||||
DEFINE_KEYCODE(F12),
|
|
||||||
DEFINE_KEYCODE(NUM_LOCK),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_0),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_1),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_2),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_3),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_4),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_5),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_6),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_7),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_8),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_9),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_DIVIDE),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_MULTIPLY),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_SUBTRACT),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_ADD),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_DOT),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_COMMA),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_ENTER),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_EQUALS),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_LEFT_PAREN),
|
|
||||||
DEFINE_KEYCODE(NUMPAD_RIGHT_PAREN),
|
|
||||||
DEFINE_KEYCODE(VOLUME_MUTE),
|
|
||||||
DEFINE_KEYCODE(INFO),
|
|
||||||
DEFINE_KEYCODE(CHANNEL_UP),
|
|
||||||
DEFINE_KEYCODE(CHANNEL_DOWN),
|
|
||||||
DEFINE_KEYCODE(ZOOM_IN),
|
|
||||||
DEFINE_KEYCODE(ZOOM_OUT),
|
|
||||||
DEFINE_KEYCODE(TV),
|
|
||||||
DEFINE_KEYCODE(WINDOW),
|
|
||||||
DEFINE_KEYCODE(GUIDE),
|
|
||||||
DEFINE_KEYCODE(DVR),
|
|
||||||
DEFINE_KEYCODE(BOOKMARK),
|
|
||||||
DEFINE_KEYCODE(CAPTIONS),
|
|
||||||
DEFINE_KEYCODE(SETTINGS),
|
|
||||||
DEFINE_KEYCODE(TV_POWER),
|
|
||||||
DEFINE_KEYCODE(TV_INPUT),
|
|
||||||
DEFINE_KEYCODE(STB_POWER),
|
|
||||||
DEFINE_KEYCODE(STB_INPUT),
|
|
||||||
DEFINE_KEYCODE(AVR_POWER),
|
|
||||||
DEFINE_KEYCODE(AVR_INPUT),
|
|
||||||
DEFINE_KEYCODE(PROG_RED),
|
|
||||||
DEFINE_KEYCODE(PROG_GREEN),
|
|
||||||
DEFINE_KEYCODE(PROG_YELLOW),
|
|
||||||
DEFINE_KEYCODE(PROG_BLUE),
|
|
||||||
DEFINE_KEYCODE(APP_SWITCH),
|
|
||||||
DEFINE_KEYCODE(BUTTON_1),
|
|
||||||
DEFINE_KEYCODE(BUTTON_2),
|
|
||||||
DEFINE_KEYCODE(BUTTON_3),
|
|
||||||
DEFINE_KEYCODE(BUTTON_4),
|
|
||||||
DEFINE_KEYCODE(BUTTON_5),
|
|
||||||
DEFINE_KEYCODE(BUTTON_6),
|
|
||||||
DEFINE_KEYCODE(BUTTON_7),
|
|
||||||
DEFINE_KEYCODE(BUTTON_8),
|
|
||||||
DEFINE_KEYCODE(BUTTON_9),
|
|
||||||
DEFINE_KEYCODE(BUTTON_10),
|
|
||||||
DEFINE_KEYCODE(BUTTON_11),
|
|
||||||
DEFINE_KEYCODE(BUTTON_12),
|
|
||||||
DEFINE_KEYCODE(BUTTON_13),
|
|
||||||
DEFINE_KEYCODE(BUTTON_14),
|
|
||||||
DEFINE_KEYCODE(BUTTON_15),
|
|
||||||
DEFINE_KEYCODE(BUTTON_16),
|
|
||||||
DEFINE_KEYCODE(LANGUAGE_SWITCH),
|
|
||||||
DEFINE_KEYCODE(MANNER_MODE),
|
|
||||||
DEFINE_KEYCODE(3D_MODE),
|
|
||||||
DEFINE_KEYCODE(CONTACTS),
|
|
||||||
DEFINE_KEYCODE(CALENDAR),
|
|
||||||
DEFINE_KEYCODE(MUSIC),
|
|
||||||
DEFINE_KEYCODE(CALCULATOR),
|
|
||||||
DEFINE_KEYCODE(ZENKAKU_HANKAKU),
|
|
||||||
DEFINE_KEYCODE(EISU),
|
|
||||||
DEFINE_KEYCODE(MUHENKAN),
|
|
||||||
DEFINE_KEYCODE(HENKAN),
|
|
||||||
DEFINE_KEYCODE(KATAKANA_HIRAGANA),
|
|
||||||
DEFINE_KEYCODE(YEN),
|
|
||||||
DEFINE_KEYCODE(RO),
|
|
||||||
DEFINE_KEYCODE(KANA),
|
|
||||||
DEFINE_KEYCODE(ASSIST),
|
|
||||||
DEFINE_KEYCODE(BRIGHTNESS_DOWN),
|
|
||||||
DEFINE_KEYCODE(BRIGHTNESS_UP),
|
|
||||||
DEFINE_KEYCODE(MEDIA_AUDIO_TRACK),
|
|
||||||
DEFINE_KEYCODE(SLEEP),
|
|
||||||
DEFINE_KEYCODE(WAKEUP),
|
|
||||||
DEFINE_KEYCODE(PAIRING),
|
|
||||||
DEFINE_KEYCODE(MEDIA_TOP_MENU),
|
|
||||||
DEFINE_KEYCODE(11),
|
|
||||||
DEFINE_KEYCODE(12),
|
|
||||||
DEFINE_KEYCODE(LAST_CHANNEL),
|
|
||||||
DEFINE_KEYCODE(TV_DATA_SERVICE),
|
|
||||||
DEFINE_KEYCODE(VOICE_ASSIST),
|
|
||||||
DEFINE_KEYCODE(TV_RADIO_SERVICE),
|
|
||||||
DEFINE_KEYCODE(TV_TELETEXT),
|
|
||||||
DEFINE_KEYCODE(TV_NUMBER_ENTRY),
|
|
||||||
DEFINE_KEYCODE(TV_TERRESTRIAL_ANALOG),
|
|
||||||
DEFINE_KEYCODE(TV_TERRESTRIAL_DIGITAL),
|
|
||||||
DEFINE_KEYCODE(TV_SATELLITE),
|
|
||||||
DEFINE_KEYCODE(TV_SATELLITE_BS),
|
|
||||||
DEFINE_KEYCODE(TV_SATELLITE_CS),
|
|
||||||
DEFINE_KEYCODE(TV_SATELLITE_SERVICE),
|
|
||||||
DEFINE_KEYCODE(TV_NETWORK),
|
|
||||||
DEFINE_KEYCODE(TV_ANTENNA_CABLE),
|
|
||||||
DEFINE_KEYCODE(TV_INPUT_HDMI_1),
|
|
||||||
DEFINE_KEYCODE(TV_INPUT_HDMI_2),
|
|
||||||
DEFINE_KEYCODE(TV_INPUT_HDMI_3),
|
|
||||||
DEFINE_KEYCODE(TV_INPUT_HDMI_4),
|
|
||||||
DEFINE_KEYCODE(TV_INPUT_COMPOSITE_1),
|
|
||||||
DEFINE_KEYCODE(TV_INPUT_COMPOSITE_2),
|
|
||||||
DEFINE_KEYCODE(TV_INPUT_COMPONENT_1),
|
|
||||||
DEFINE_KEYCODE(TV_INPUT_COMPONENT_2),
|
|
||||||
DEFINE_KEYCODE(TV_INPUT_VGA_1),
|
|
||||||
DEFINE_KEYCODE(TV_AUDIO_DESCRIPTION),
|
|
||||||
DEFINE_KEYCODE(TV_AUDIO_DESCRIPTION_MIX_UP),
|
|
||||||
DEFINE_KEYCODE(TV_AUDIO_DESCRIPTION_MIX_DOWN),
|
|
||||||
DEFINE_KEYCODE(TV_ZOOM_MODE),
|
|
||||||
DEFINE_KEYCODE(TV_CONTENTS_MENU),
|
|
||||||
DEFINE_KEYCODE(TV_MEDIA_CONTEXT_MENU),
|
|
||||||
DEFINE_KEYCODE(TV_TIMER_PROGRAMMING),
|
|
||||||
DEFINE_KEYCODE(HELP),
|
|
||||||
DEFINE_KEYCODE(NAVIGATE_PREVIOUS),
|
|
||||||
DEFINE_KEYCODE(NAVIGATE_NEXT),
|
|
||||||
DEFINE_KEYCODE(NAVIGATE_IN),
|
|
||||||
DEFINE_KEYCODE(NAVIGATE_OUT),
|
|
||||||
DEFINE_KEYCODE(STEM_PRIMARY),
|
|
||||||
DEFINE_KEYCODE(STEM_1),
|
|
||||||
DEFINE_KEYCODE(STEM_2),
|
|
||||||
DEFINE_KEYCODE(STEM_3),
|
|
||||||
DEFINE_KEYCODE(MEDIA_SKIP_FORWARD),
|
|
||||||
DEFINE_KEYCODE(MEDIA_SKIP_BACKWARD),
|
|
||||||
DEFINE_KEYCODE(MEDIA_STEP_FORWARD),
|
|
||||||
DEFINE_KEYCODE(MEDIA_STEP_BACKWARD),
|
|
||||||
DEFINE_KEYCODE(SOFT_SLEEP),
|
|
||||||
|
|
||||||
{ NULL, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static const InputEventLabel AXES[] = {
|
|
||||||
DEFINE_AXIS(X),
|
|
||||||
DEFINE_AXIS(Y),
|
|
||||||
DEFINE_AXIS(PRESSURE),
|
|
||||||
DEFINE_AXIS(SIZE),
|
|
||||||
DEFINE_AXIS(TOUCH_MAJOR),
|
|
||||||
DEFINE_AXIS(TOUCH_MINOR),
|
|
||||||
DEFINE_AXIS(TOOL_MAJOR),
|
|
||||||
DEFINE_AXIS(TOOL_MINOR),
|
|
||||||
DEFINE_AXIS(ORIENTATION),
|
|
||||||
DEFINE_AXIS(VSCROLL),
|
|
||||||
DEFINE_AXIS(HSCROLL),
|
|
||||||
DEFINE_AXIS(Z),
|
|
||||||
DEFINE_AXIS(RX),
|
|
||||||
DEFINE_AXIS(RY),
|
|
||||||
DEFINE_AXIS(RZ),
|
|
||||||
DEFINE_AXIS(HAT_X),
|
|
||||||
DEFINE_AXIS(HAT_Y),
|
|
||||||
DEFINE_AXIS(LTRIGGER),
|
|
||||||
DEFINE_AXIS(RTRIGGER),
|
|
||||||
DEFINE_AXIS(THROTTLE),
|
|
||||||
DEFINE_AXIS(RUDDER),
|
|
||||||
DEFINE_AXIS(WHEEL),
|
|
||||||
DEFINE_AXIS(GAS),
|
|
||||||
DEFINE_AXIS(BRAKE),
|
|
||||||
DEFINE_AXIS(DISTANCE),
|
|
||||||
DEFINE_AXIS(TILT),
|
|
||||||
DEFINE_AXIS(GENERIC_1),
|
|
||||||
DEFINE_AXIS(GENERIC_2),
|
|
||||||
DEFINE_AXIS(GENERIC_3),
|
|
||||||
DEFINE_AXIS(GENERIC_4),
|
|
||||||
DEFINE_AXIS(GENERIC_5),
|
|
||||||
DEFINE_AXIS(GENERIC_6),
|
|
||||||
DEFINE_AXIS(GENERIC_7),
|
|
||||||
DEFINE_AXIS(GENERIC_8),
|
|
||||||
DEFINE_AXIS(GENERIC_9),
|
|
||||||
DEFINE_AXIS(GENERIC_10),
|
|
||||||
DEFINE_AXIS(GENERIC_11),
|
|
||||||
DEFINE_AXIS(GENERIC_12),
|
|
||||||
DEFINE_AXIS(GENERIC_13),
|
|
||||||
DEFINE_AXIS(GENERIC_14),
|
|
||||||
DEFINE_AXIS(GENERIC_15),
|
|
||||||
DEFINE_AXIS(GENERIC_16),
|
|
||||||
|
|
||||||
// NOTE: If you add a new axis here you must also add it to several other files.
|
|
||||||
// Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list.
|
|
||||||
{ NULL, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static const InputEventLabel LEDS[] = {
|
|
||||||
DEFINE_LED(NUM_LOCK),
|
|
||||||
DEFINE_LED(CAPS_LOCK),
|
|
||||||
DEFINE_LED(SCROLL_LOCK),
|
|
||||||
DEFINE_LED(COMPOSE),
|
|
||||||
DEFINE_LED(KANA),
|
|
||||||
DEFINE_LED(SLEEP),
|
|
||||||
DEFINE_LED(SUSPEND),
|
|
||||||
DEFINE_LED(MUTE),
|
|
||||||
DEFINE_LED(MISC),
|
|
||||||
DEFINE_LED(MAIL),
|
|
||||||
DEFINE_LED(CHARGING),
|
|
||||||
DEFINE_LED(CONTROLLER_1),
|
|
||||||
DEFINE_LED(CONTROLLER_2),
|
|
||||||
DEFINE_LED(CONTROLLER_3),
|
|
||||||
DEFINE_LED(CONTROLLER_4),
|
|
||||||
|
|
||||||
// NOTE: If you add new LEDs here, you must also add them to Input.h
|
|
||||||
{ NULL, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static const InputEventLabel FLAGS[] = {
|
|
||||||
DEFINE_FLAG(WAKE),
|
|
||||||
DEFINE_FLAG(VIRTUAL),
|
|
||||||
DEFINE_FLAG(FUNCTION),
|
|
||||||
DEFINE_FLAG(GESTURE),
|
|
||||||
|
|
||||||
{ NULL, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static int lookupValueByLabel(const char* literal, const InputEventLabel *list) {
|
|
||||||
while (list->literal) {
|
|
||||||
if (strcmp(literal, list->literal) == 0) {
|
|
||||||
return list->value;
|
|
||||||
}
|
|
||||||
list++;
|
|
||||||
}
|
|
||||||
return list->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char* lookupLabelByValue(int value, const InputEventLabel* list) {
|
|
||||||
while (list->literal) {
|
|
||||||
if (list->value == value) {
|
|
||||||
return list->literal;
|
|
||||||
}
|
|
||||||
list++;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t getKeyCodeByLabel(const char* label) {
|
|
||||||
return int32_t(lookupValueByLabel(label, KEYCODES));
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char* getLabelByKeyCode(int32_t keyCode) {
|
|
||||||
if (keyCode >= 0 && keyCode < size(KEYCODES)) {
|
|
||||||
return KEYCODES[keyCode].literal;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t getKeyFlagByLabel(const char* label) {
|
|
||||||
return uint32_t(lookupValueByLabel(label, FLAGS));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t getAxisByLabel(const char* label) {
|
|
||||||
return int32_t(lookupValueByLabel(label, AXES));
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char* getAxisLabel(int32_t axisId) {
|
|
||||||
return lookupLabelByValue(axisId, AXES);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t getLedByLabel(const char* label) {
|
|
||||||
return int32_t(lookupValueByLabel(label, LEDS));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace android
|
|
||||||
#endif // _LIBINPUT_INPUT_EVENT_LABELS_H
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue