From 8c4c8e6bbee7cc73a94a566e2a89829e737ddc52 Mon Sep 17 00:00:00 2001 From: George Hotz Date: Sat, 22 Aug 2020 14:48:01 -0700 Subject: [PATCH 01/17] update code stats script --- scripts/code_stats.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/scripts/code_stats.py b/scripts/code_stats.py index d3bc48bcec..b0d1e9ba3b 100755 --- a/scripts/code_stats.py +++ b/scripts/code_stats.py @@ -26,6 +26,9 @@ class Analyzer(ast.NodeVisitor): self.generic_visit(node) tlns = 0 +carlns = 0 +scriptlns = 0 +testlns = 0 for f in sorted(pyf): if f not in fouts: continue @@ -35,7 +38,17 @@ for f in sorted(pyf): tree = ast.parse(src) Analyzer().visit(tree) print("%5d %s %s" % (lns, f, xbit)) - tlns += lns + if 'test' in f: + testlns += lns + elif f.startswith('tools/') or f.startswith('scripts/') or f.startswith('selfdrive/debug'): + scriptlns += lns + elif f.startswith('selfdrive/car'): + carlns += lns + else: + tlns += lns -print("%d lines of parsed openpilot python" % tlns) +print("%d lines of openpilot python" % tlns) +print("%d lines of car ports" % carlns) +print("%d lines of tools/scripts/debug" % scriptlns) +print("%d lines of tests" % testlns) #print(sorted(list(imps))) From 520c2676b682903d2be8f661ce98ac85fa50c439 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 23 Aug 2020 00:33:19 -0700 Subject: [PATCH 02/17] type hints for messaging (#2061) * bump cereal * fix bugs found by mypy * bump cereal --- cereal | 2 +- selfdrive/debug/get_fingerprint.py | 3 +++ selfdrive/debug/internal/measure_modeld_packet_drop.py | 3 +++ tools/replay/sensorium.py | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cereal b/cereal index 50d3751489..b9a54adaf4 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 50d37514897c07ae605691ee602ad6a01b51b890 +Subproject commit b9a54adaf4c825bf2b44d9d60d8e6105eb78e9b1 diff --git a/selfdrive/debug/get_fingerprint.py b/selfdrive/debug/get_fingerprint.py index 9ece7d7268..2695d457d1 100755 --- a/selfdrive/debug/get_fingerprint.py +++ b/selfdrive/debug/get_fingerprint.py @@ -17,6 +17,9 @@ logcan = messaging.sub_sock('can') msgs = {} while True: lc = messaging.recv_sock(logcan, True) + if lc is None: + continue + for c in lc.can: # read also msgs sent by EON on CAN bus 0x80 and filter out the # addr with more than 11 bits diff --git a/selfdrive/debug/internal/measure_modeld_packet_drop.py b/selfdrive/debug/internal/measure_modeld_packet_drop.py index 457771df0e..2405ee9487 100755 --- a/selfdrive/debug/internal/measure_modeld_packet_drop.py +++ b/selfdrive/debug/internal/measure_modeld_packet_drop.py @@ -11,6 +11,9 @@ if __name__ == "__main__": while True: m = messaging.recv_one(modeld_sock) + if m is None: + continue + frame_id = m.model.frameId t = m.logMonoTime / 1e9 frame_cnt += 1 diff --git a/tools/replay/sensorium.py b/tools/replay/sensorium.py index 10b2a960d1..4897089b96 100755 --- a/tools/replay/sensorium.py +++ b/tools/replay/sensorium.py @@ -26,7 +26,7 @@ if __name__ == "__main__": while 1: fpkt = messaging.recv_one(frame) - if len(fpkt.frame.image) == 0: + if fpkt is None or len(fpkt.frame.image) == 0: continue sm.update(timeout=1) rgb_img_raw = fpkt.frame.image From a3f56430195d5b2d0119f8bbf929f07c9a625959 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 23 Aug 2020 18:18:19 -0700 Subject: [PATCH 03/17] split dockerfile into base image and CI image (#2066) * split dockerfile into base image and CI * doesn't exist yet * fix path * cache on this branch * latest * use cache * don't double pull --- .dockerignore | 16 +++++++ .github/workflows/test.yaml | 13 ++++-- ...ile.openpilot => Dockerfile.openpilot_base | 42 +------------------ Dockerfile.openpilotci | 24 +++++++++++ Jenkinsfile | 2 +- 5 files changed, 53 insertions(+), 44 deletions(-) rename Dockerfile.openpilot => Dockerfile.openpilot_base (53%) create mode 100644 Dockerfile.openpilotci diff --git a/.dockerignore b/.dockerignore index 2b3e7c54fd..556cc328f0 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,21 @@ .git .DS_Store +*.dylib +*.DSYM +*.d +*.pyc +*.pyo +.*.swp +.*.swo +.*.un~ +*.tmp +*.o +*.o-* +*.os +*.os-* +*.so +*.a + notebooks phone massivemap diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 7d0ae1f456..7bcaf54cee 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -11,9 +11,14 @@ env: CI_RUN: docker run -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID --rm tmppilotci /bin/bash -c UNIT_TEST: coverage run --append -m unittest discover BUILD: | - docker pull $(grep -ioP '(?<=^from)\s+\S+' Dockerfile.openpilot) || true + # build the openpilot docker base image + docker pull $(grep -ioP '(?<=^from)\s+\S+' Dockerfile.openpilot_base) || true + docker pull docker.io/commaai/openpilot-base:latest || true + docker build --cache-from docker.io/commaai/openpilot-base:latest -t commaai/openpilot-base:latest -f Dockerfile.openpilot_base . + + # build the final CI image docker pull docker.io/commaai/openpilotci:latest || true - docker build --cache-from docker.io/commaai/openpilotci:latest -t tmppilot -f Dockerfile.openpilot . + docker build --cache-from docker.io/commaai/openpilotci:latest -t tmppilot -f Dockerfile.openpilotci . jobs: build_release: @@ -30,7 +35,7 @@ jobs: run: | mkdir $TEST_DIR cp -pR --parents $(cat release/files_common) $TEST_DIR - cp Dockerfile.openpilot $TEST_DIR + cp Dockerfile.openpilot_base Dockerfile.openpilotci $TEST_DIR # need this to build on x86 cp -pR --parents phonelibs/libyuv phonelibs/snpe \ @@ -88,6 +93,8 @@ jobs: - name: Push to dockerhub run: | docker login -u wmelching -p ${{ secrets.COMMA_DOCKERHUB_TOKEN}} + docker tag commaai/openpilot-base:latest docker.io/commaai/openpilot-base:latest + docker push docker.io/commaai/openpilot-base:latest docker tag tmppilot docker.io/commaai/openpilotci:latest docker push docker.io/commaai/openpilotci:latest diff --git a/Dockerfile.openpilot b/Dockerfile.openpilot_base similarity index 53% rename from Dockerfile.openpilot rename to Dockerfile.openpilot_base index 8577282126..06e2a95a09 100644 --- a/Dockerfile.openpilot +++ b/Dockerfile.openpilot_base @@ -1,6 +1,5 @@ FROM ubuntu:16.04 ENV PYTHONUNBUFFERED 1 -ENV PYTHONPATH /tmp/openpilot:${PYTHONPATH} RUN apt-get update && apt-get install -y --no-install-recommends \ autoconf \ @@ -58,42 +57,5 @@ RUN pyenv install 3.8.2 && \ pip install --no-cache-dir --upgrade pip==20.1.1 && \ pip install --no-cache-dir pipenv==2018.11.26 && \ cd /tmp && \ - pipenv install --system --deploy --clear && \ - pip uninstall -y pipenv && \ - pip install --no-cache-dir \ - matplotlib==3.1.1 \ - dictdiffer==0.8.0 \ - fastcluster==1.1.25 \ - aenum==2.2.1 \ - lru-dict==1.1.6 \ - scipy==1.4.1 \ - tenacity==5.1.1 \ - azure-common==1.1.23 \ - azure-nspkg==3.0.2 \ - azure-storage-blob==2.1.0 \ - azure-storage-common==2.1.0 \ - azure-storage-nspkg==3.1.0 \ - pycurl==7.43.0.3 \ - coverage==5.1 \ - pre-commit==2.4.0 \ - parameterized==0.7.4 - -RUN mkdir -p /tmp/openpilot - -COPY SConstruct \ - .pylintrc \ - .pre-commit-config.yaml \ - /tmp/openpilot/ - -COPY ./pyextra /tmp/openpilot/pyextra -COPY ./phonelibs /tmp/openpilot/phonelibs -COPY ./laika /tmp/openpilot/laika -COPY ./laika_repo /tmp/openpilot/laika_repo -COPY ./rednose /tmp/openpilot/rednose -COPY ./tools /tmp/openpilot/tools -COPY ./release /tmp/openpilot/release -COPY ./common /tmp/openpilot/common -COPY ./opendbc /tmp/openpilot/opendbc -COPY ./cereal /tmp/openpilot/cereal -COPY ./panda /tmp/openpilot/panda -COPY ./selfdrive /tmp/openpilot/selfdrive + pipenv install --system --deploy --dev --clear && \ + pip uninstall -y pipenv diff --git a/Dockerfile.openpilotci b/Dockerfile.openpilotci new file mode 100644 index 0000000000..0490d0a2d0 --- /dev/null +++ b/Dockerfile.openpilotci @@ -0,0 +1,24 @@ +FROM commaai/openpilot-base:latest + +ENV PYTHONUNBUFFERED 1 +ENV PYTHONPATH /tmp/openpilot:${PYTHONPATH} + +RUN mkdir -p /tmp/openpilot + +COPY SConstruct \ + .pylintrc \ + .pre-commit-config.yaml \ + /tmp/openpilot/ + +COPY ./pyextra /tmp/openpilot/pyextra +COPY ./phonelibs /tmp/openpilot/phonelibs +COPY ./laika /tmp/openpilot/laika +COPY ./laika_repo /tmp/openpilot/laika_repo +COPY ./rednose /tmp/openpilot/rednose +COPY ./tools /tmp/openpilot/tools +COPY ./release /tmp/openpilot/release +COPY ./common /tmp/openpilot/common +COPY ./opendbc /tmp/openpilot/opendbc +COPY ./cereal /tmp/openpilot/cereal +COPY ./panda /tmp/openpilot/panda +COPY ./selfdrive /tmp/openpilot/selfdrive diff --git a/Jenkinsfile b/Jenkinsfile index dd0e2c12fa..eb16835ce5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -70,7 +70,7 @@ pipeline { stage('PC tests') { agent { dockerfile { - filename 'Dockerfile.openpilot' + filename 'Dockerfile.openpilotci' args '--privileged --shm-size=1G --user=root' } } From de7b901dc1518bf6e1dff0534f02be223d0e175f Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 24 Aug 2020 20:00:00 +0800 Subject: [PATCH 04/17] move matmul3 into live_thread (#2069) --- selfdrive/modeld/modeld.cc | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/selfdrive/modeld/modeld.cc b/selfdrive/modeld/modeld.cc index 3df4078a7e..9411a0ec02 100644 --- a/selfdrive/modeld/modeld.cc +++ b/selfdrive/modeld/modeld.cc @@ -43,6 +43,13 @@ void* live_thread(void *arg) { 0.0, 910.0, 437.0, 0.0, 0.0, 1.0; + // debayering does a 2x downscale + mat3 yuv_transform = transform_scale_buffer((mat3){{ + 1.0, 0.0, 0.0, + 0.0, 1.0, 0.0, + 0.0, 0.0, 1.0, + }}, 0.5); + while (!do_exit) { if (sm.update(10) > 0){ @@ -59,12 +66,13 @@ void* live_thread(void *arg) { camera_frame_from_ground.col(2) = camera_frame_from_road_frame.col(3); auto warp_matrix = camera_frame_from_ground * ground_from_medmodel_frame; - - pthread_mutex_lock(&transform_lock); + mat3 transform = {}; for (int i=0; i<3*3; i++) { - cur_transform.v[i] = warp_matrix(i / 3, i % 3); + transform.v[i] = warp_matrix(i / 3, i % 3); } - + mat3 model_transform = matmul3(yuv_transform, transform); + pthread_mutex_lock(&transform_lock); + cur_transform = model_transform; run_model = true; pthread_mutex_unlock(&transform_lock); } @@ -109,13 +117,6 @@ int main(int argc, char **argv) { model_init(&model, device_id, context, true); LOGW("models loaded, modeld starting"); - // debayering does a 2x downscale - mat3 yuv_transform = transform_scale_buffer((mat3){{ - 1.0, 0.0, 0.0, - 0.0, 1.0, 0.0, - 0.0, 0.0, 1.0, - }}, 0.5); - // loop VisionStream stream; while (!do_exit) { @@ -151,7 +152,7 @@ int main(int argc, char **argv) { } pthread_mutex_lock(&transform_lock); - mat3 transform = cur_transform; + mat3 model_transform = cur_transform; const bool run_model_this_iter = run_model; pthread_mutex_unlock(&transform_lock); @@ -168,8 +169,6 @@ int main(int argc, char **argv) { vec_desire[desire] = 1.0; } - mat3 model_transform = matmul3(yuv_transform, transform); - mt1 = millis_since_boot(); // TODO: don't make copies! From 727055e0a077ceb4ea9ff55de9fd795cf675b48a Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 24 Aug 2020 20:04:52 +0800 Subject: [PATCH 05/17] remove device_id&context from ModelFrame (#2064) --- selfdrive/modeld/models/commonmodel.c | 10 ++++------ selfdrive/modeld/models/commonmodel.h | 4 ---- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/selfdrive/modeld/models/commonmodel.c b/selfdrive/modeld/models/commonmodel.c index eebf4761af..0bdc61bbe3 100644 --- a/selfdrive/modeld/models/commonmodel.c +++ b/selfdrive/modeld/models/commonmodel.c @@ -7,25 +7,23 @@ void frame_init(ModelFrame* frame, int width, int height, cl_device_id device_id, cl_context context) { int err; - frame->device_id = device_id; - frame->context = context; transform_init(&frame->transform, context, device_id); frame->transformed_width = width; frame->transformed_height = height; - frame->transformed_y_cl = clCreateBuffer(frame->context, CL_MEM_READ_WRITE, + frame->transformed_y_cl = clCreateBuffer(context, CL_MEM_READ_WRITE, (size_t)frame->transformed_width*frame->transformed_height, NULL, &err); assert(err == 0); - frame->transformed_u_cl = clCreateBuffer(frame->context, CL_MEM_READ_WRITE, + frame->transformed_u_cl = clCreateBuffer(context, CL_MEM_READ_WRITE, (size_t)(frame->transformed_width/2)*(frame->transformed_height/2), NULL, &err); assert(err == 0); - frame->transformed_v_cl = clCreateBuffer(frame->context, CL_MEM_READ_WRITE, + frame->transformed_v_cl = clCreateBuffer(context, CL_MEM_READ_WRITE, (size_t)(frame->transformed_width/2)*(frame->transformed_height/2), NULL, &err); assert(err == 0); frame->net_input_size = ((width*height*3)/2)*sizeof(float); - frame->net_input = clCreateBuffer(frame->context, CL_MEM_READ_WRITE, + frame->net_input = clCreateBuffer(context, CL_MEM_READ_WRITE, frame->net_input_size, (void*)NULL, &err); assert(err == 0); diff --git a/selfdrive/modeld/models/commonmodel.h b/selfdrive/modeld/models/commonmodel.h index bb52366481..7aed3d7998 100644 --- a/selfdrive/modeld/models/commonmodel.h +++ b/selfdrive/modeld/models/commonmodel.h @@ -20,10 +20,6 @@ float softplus(float input); float sigmoid(float input); typedef struct ModelFrame { - cl_device_id device_id; - cl_context context; - - // input Transform transform; int transformed_width, transformed_height; cl_mem transformed_y_cl, transformed_u_cl, transformed_v_cl; From 17dd07e751a7fd3f4fe62811614b41ce9650811a Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 24 Aug 2020 20:07:27 +0800 Subject: [PATCH 06/17] visionstream: fix doube fd close (#2057) * s->ipc_fd counld be closed twice * white space --- selfdrive/common/visionipc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/selfdrive/common/visionipc.c b/selfdrive/common/visionipc.c index bae05ccc77..6820491156 100644 --- a/selfdrive/common/visionipc.c +++ b/selfdrive/common/visionipc.c @@ -90,6 +90,7 @@ int visionstream_init(VisionStream *s, VisionStreamType type, bool tbuffer, Visi err = vipc_send(s->ipc_fd, &p); if (err < 0) { close(s->ipc_fd); + s->ipc_fd = -1; return -1; } @@ -97,6 +98,7 @@ int visionstream_init(VisionStream *s, VisionStreamType type, bool tbuffer, Visi err = vipc_recv(s->ipc_fd, &rp); if (err <= 0) { close(s->ipc_fd); + s->ipc_fd = -1; return -1; } assert(rp.type == VIPC_STREAM_BUFS); @@ -190,5 +192,5 @@ void visionstream_destroy(VisionStream *s) { } } if (s->bufs) free(s->bufs); - close(s->ipc_fd); + if (s->ipc_fd >= 0) close(s->ipc_fd); } From c7904cdec3eefb0cb01f77b594a1a11f0423e019 Mon Sep 17 00:00:00 2001 From: eFini Date: Mon, 24 Aug 2020 22:09:30 +1000 Subject: [PATCH 07/17] fingerprint for China 2019 CRV Hybrid (#2056) --- selfdrive/car/honda/values.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 713c38ae1b..0a521b78ab 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -645,10 +645,12 @@ FW_VERSIONS = { (Ecu.vsa, 0x18da28f1, None): [ b'57114-TPA-G020\x00\x00', b'57114-TPG-A020\x00\x00', + b'57114-TMB-H030\x00\x00', ], (Ecu.eps, 0x18da30f1, None): [ b'39990-TPA-G030\x00\x00', b'39990-TPG-A020\x00\x00', + b'39990-TMA-H020\x00\x00', ], (Ecu.gateway, 0x18daeff1, None): [ b'38897-TMA-H110\x00\x00', @@ -661,10 +663,12 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x18dab5f1, None): [ b'36161-TPA-E050\x00\x00', b'36161-TPG-A030\x00\x00', + b'36161-TMB-H040\x00\x00', ], (Ecu.combinationMeter, 0x18da60f1, None): [ b'78109-TPA-G520\x00\x00', b'78109-TPG-A110\x00\x00', + b'78109-TMB-H220\x00\x00', ], (Ecu.hud, 0x18da61f1, None): [ b'78209-TLA-X010\x00\x00', @@ -672,10 +676,12 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36802-TPA-E040\x00\x00', b'36802-TPG-A020\x00\x00', + b'36802-TMB-H040\x00\x00', ], (Ecu.srs, 0x18da53f1, None): [ b'77959-TLA-G220\x00\x00', b'77959-TLA-C320\x00\x00', + b'77959-TLA-H240\x00\x00', ], }, CAR.FIT: { From 08d6fe18805c3e7e9fe512b1b343ab69d49f12da Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 24 Aug 2020 20:15:34 +0800 Subject: [PATCH 08/17] paint.cc: deleted two meaningless lines (#2043) --- selfdrive/ui/paint.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/selfdrive/ui/paint.cc b/selfdrive/ui/paint.cc index f8e3675516..b9475a92b1 100644 --- a/selfdrive/ui/paint.cc +++ b/selfdrive/ui/paint.cc @@ -637,8 +637,6 @@ static void ui_draw_vision_header(UIState *s) { } static void ui_draw_vision_footer(UIState *s) { - nvgBeginPath(s->vg); - nvgRect(s->vg, s->scene.ui_viz_rx, footer_y, s->scene.ui_viz_rw, footer_h); ui_draw_vision_face(s); From 9eb3d89ca273bf9960890c9e60687960b552346d Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Mon, 24 Aug 2020 14:17:41 +0200 Subject: [PATCH 09/17] Thermald cleanup (#2049) * Thermald cleanup * no Temps, fix ui formatter * Fix scaling * Don't touch that * typo * Fix fan control * Fix if * change cereal * Update comment --- cereal | 2 +- selfdrive/boardd/boardd.cc | 4 +- selfdrive/thermald/thermald.py | 90 +++++++++++++++++++--------------- selfdrive/ui/sidebar.cc | 2 +- 4 files changed, 55 insertions(+), 43 deletions(-) diff --git a/cereal b/cereal index b9a54adaf4..3f13766df1 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit b9a54adaf4c825bf2b44d9d60d8e6105eb78e9b1 +Subproject commit 3f13766df1f366955338b283990334e046baffe4 diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index 146e219f90..69be6a1726 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -392,8 +392,8 @@ void hardware_control_thread() { LOGD("start hardware control thread"); SubMaster sm({"thermal", "frontFrame"}); - // Only control fan speed on UNO - if (panda->hw_type != cereal::HealthData::HwType::UNO) return; + // Other pandas don't have hardware to control + if (panda->hw_type != cereal::HealthData::HwType::UNO && panda->hw_type != cereal::HealthData::HwType::DOS) return; uint64_t last_front_frame_t = 0; uint16_t prev_fan_speed = 999; diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index d70625c792..cddcb562fc 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -1,23 +1,32 @@ #!/usr/bin/env python3 -import os import datetime -import psutil +import os import time +from collections import namedtuple + +import psutil from smbus2 import SMBus + +import cereal.messaging as messaging from cereal import log -from common.android import ANDROID, get_network_type, get_network_strength -from common.params import Params, put_nonblocking -from common.realtime import sec_since_boot, DT_TRML -from common.numpy_fast import clip, interp +from common.android import get_network_strength, get_network_type from common.filter_simple import FirstOrderFilter -from selfdrive.version import terms_version, training_version, get_git_branch -from selfdrive.swaglog import cloudlog -import cereal.messaging as messaging +from common.numpy_fast import clip, interp +from common.params import Params, put_nonblocking +from common.realtime import DT_TRML, sec_since_boot from selfdrive.controls.lib.alertmanager import set_offroad_alert from selfdrive.loggerd.config import get_available_percent from selfdrive.pandad import get_expected_signature -from selfdrive.thermald.power_monitoring import PowerMonitoring, get_battery_capacity, get_battery_status, \ - get_battery_current, get_battery_voltage, get_usb_present +from selfdrive.swaglog import cloudlog +from selfdrive.thermald.power_monitoring import (PowerMonitoring, + get_battery_capacity, + get_battery_current, + get_battery_status, + get_battery_voltage, + get_usb_present) +from selfdrive.version import get_git_branch, terms_version, training_version + +ThermalConfig = namedtuple('ThermalConfig', ['cpu', 'gpu', 'mem', 'bat', 'ambient']) FW_SIGNATURE = get_expected_signature() @@ -30,35 +39,41 @@ DAYS_NO_CONNECTIVITY_MAX = 7 # do not allow to engage after a week without inte DAYS_NO_CONNECTIVITY_PROMPT = 4 # send an offroad prompt after 4 days with no internet DISCONNECT_TIMEOUT = 5. # wait 5 seconds before going offroad after disconnect so you get an alert +EON = os.path.isfile('/EON') +TICI = os.path.isfile('/TICI') + LEON = False last_eon_fan_val = None -def read_tz(x, clip=True): - if not ANDROID: - # we don't monitor thermal on PC +def get_thermal_config(): + # (tz, scale) + if EON: + return ThermalConfig(cpu=((5, 7, 10, 12), 10), gpu=((16,), 10), mem=(2, 10), bat=(29, 1000), ambient=(25, 1)) + elif TICI: + return ThermalConfig(cpu=((1, 2, 3, 4, 5, 6, 7, 8), 1000), gpu=((48,49), 1000), mem=(15, 1000), bat=(None, 1), ambient=(70, 1000)) + else: + return ThermalConfig(cpu=((None,), 1), gpu=((None,), 1), mem=(None, 1), bat=(None, 1), ambient=(None, 1)) + + +def read_tz(x): + if x is None: return 0 + try: with open("/sys/devices/virtual/thermal/thermal_zone%d/temp" % x) as f: - ret = int(f.read()) - if clip: - ret = max(0, ret) + return int(f.read()) except FileNotFoundError: return 0 - return ret - -def read_thermal(): +def read_thermal(thermal_config): dat = messaging.new_message('thermal') - dat.thermal.cpu0 = read_tz(5) - dat.thermal.cpu1 = read_tz(7) - dat.thermal.cpu2 = read_tz(10) - dat.thermal.cpu3 = read_tz(12) - dat.thermal.mem = read_tz(2) - dat.thermal.gpu = read_tz(16) - dat.thermal.bat = read_tz(29) - dat.thermal.pa0 = read_tz(25) + dat.thermal.cpu = [read_tz(z) / thermal_config.cpu[1] for z in thermal_config.cpu[0]] + dat.thermal.gpu = [read_tz(z) / thermal_config.gpu[1] for z in thermal_config.gpu[0]] + dat.thermal.mem = read_tz(thermal_config.mem[0]) / thermal_config.mem[1] + dat.thermal.ambient = read_tz(thermal_config.ambient[0]) / thermal_config.ambient[1] + dat.thermal.bat = read_tz(thermal_config.bat[0]) / thermal_config.bat[1] return dat @@ -183,11 +198,13 @@ def thermald_thread(): pm = PowerMonitoring() no_panda_cnt = 0 + thermal_config = get_thermal_config() + while 1: health = messaging.recv_sock(health_sock, wait=True) location = messaging.recv_sock(location_sock) location = location.gpsLocation if location else None - msg = read_thermal() + msg = read_thermal(thermal_config) if health is not None: usb_power = health.health.usbPowerMode != log.HealthData.UsbPowerMode.client @@ -208,7 +225,7 @@ def thermald_thread(): is_uno = health.health.hwType == log.HealthData.HwType.uno has_relay = health.health.hwType in [log.HealthData.HwType.blackPanda, log.HealthData.HwType.uno, log.HealthData.HwType.dos] - if is_uno or not ANDROID: + if (not EON) or is_uno: cloudlog.info("Setting up UNO fan handler") handle_fan = handle_fan_uno else: @@ -243,7 +260,7 @@ def thermald_thread(): msg.thermal.usbOnline = get_usb_present() # Fake battery levels on uno for frame - if is_uno: + if (not EON) or is_uno: msg.thermal.batteryPercent = 100 msg.thermal.batteryStatus = "Charging" msg.thermal.bat = 0 @@ -251,14 +268,9 @@ def thermald_thread(): current_filter.update(msg.thermal.batteryCurrent / 1e6) # TODO: add car battery voltage check - max_cpu_temp = cpu_temp_filter.update( - max(msg.thermal.cpu0, - msg.thermal.cpu1, - msg.thermal.cpu2, - msg.thermal.cpu3) / 10.0) - - max_comp_temp = max(max_cpu_temp, msg.thermal.mem / 10., msg.thermal.gpu / 10.) - bat_temp = msg.thermal.bat / 1000. + max_cpu_temp = cpu_temp_filter.update(max(msg.thermal.cpu)) + max_comp_temp = max(max_cpu_temp, msg.thermal.mem, max(msg.thermal.gpu)) + bat_temp = msg.thermal.bat if handle_fan is not None: fan_speed = handle_fan(max_cpu_temp, bat_temp, fan_speed, ignition) diff --git a/selfdrive/ui/sidebar.cc b/selfdrive/ui/sidebar.cc index cc187f449e..e6274f88c5 100644 --- a/selfdrive/ui/sidebar.cc +++ b/selfdrive/ui/sidebar.cc @@ -124,7 +124,7 @@ static void ui_draw_sidebar_temp_metric(UIState *s) { char temp_value_str[32]; char temp_value_unit[32]; const int temp_y_offset = 0; - snprintf(temp_value_str, sizeof(temp_value_str), "%d", s->scene.thermal.getPa0()); + snprintf(temp_value_str, sizeof(temp_value_str), "%.0f", s->scene.thermal.getAmbient()); snprintf(temp_value_unit, sizeof(temp_value_unit), "%s", "°C"); snprintf(temp_label_str, sizeof(temp_label_str), "%s", "TEMP"); strcat(temp_value_str, temp_value_unit); From b731b1b99ed60e7b7482946e542c3a2c31f5a9c0 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Mon, 24 Aug 2020 14:18:42 +0200 Subject: [PATCH 10/17] bump cereal --- cereal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal b/cereal index 3f13766df1..16e424f406 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 3f13766df1f366955338b283990334e046baffe4 +Subproject commit 16e424f406cee5b1197c024bbeab47b9ea016140 From 39c7dc2072a2bf512afd7ac11ebe601ba754ad1d Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Mon, 24 Aug 2020 14:43:24 +0200 Subject: [PATCH 11/17] fix prebuilt container --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 7bcaf54cee..edd18624ac 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -109,7 +109,7 @@ jobs: with: submodules: true - name: Build Docker image - run: echo "RUN cd /tmp/openpilot && scons -c && scons -j3" >> Dockerfile.openpilot && eval "$BUILD" + run: echo "RUN cd /tmp/openpilot && scons -c && scons -j\$(nproc)" >> Dockerfile.openpilotci && eval "$BUILD" - name: Push to dockerhub run: | docker login -u wmelching -p ${{ secrets.COMMA_DOCKERHUB_TOKEN}} From 6bb2630eba1bff2db745e56d639fce8b85ec6d0d Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Mon, 24 Aug 2020 16:56:29 +0200 Subject: [PATCH 12/17] Pandad: turn on panda power (#2073) * pandad turn on panda power * Add gpio.py * needs bytes Co-authored-by: Comma Device --- common/gpio.py | 22 ++++++++++++++++++++++ common/hardware.py | 4 ++++ release/files_common | 2 ++ selfdrive/pandad.py | 23 ++++++++++++++++++++++- selfdrive/thermald/thermald.py | 4 +--- 5 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 common/gpio.py create mode 100644 common/hardware.py diff --git a/common/gpio.py b/common/gpio.py new file mode 100644 index 0000000000..73603f262d --- /dev/null +++ b/common/gpio.py @@ -0,0 +1,22 @@ +GPIO_HUB_RST_N = 30 +GPIO_UBLOX_RST_N = 32 +GPIO_UBLOX_SAFEBOOT_N = 33 +GPIO_UBLOX_PWR_EN = 34 +GPIO_STM_RST_N = 124 +GPIO_STM_BOOT0 = 134 + + +def gpio_init(pin, output): + try: + with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f: + f.write(b"out" if output else b"in") + except Exception as e: + print(f"Failed to set gpio {pin} direction: {e}") + + +def gpio_set(pin, high): + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f: + f.write(b"1" if high else b"0") + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") diff --git a/common/hardware.py b/common/hardware.py new file mode 100644 index 0000000000..a1bab3c313 --- /dev/null +++ b/common/hardware.py @@ -0,0 +1,4 @@ +import os + +EON = os.path.isfile('/EON') +TICI = os.path.isfile('/TICI') diff --git a/release/files_common b/release/files_common index 3bff234eab..2df9430159 100644 --- a/release/files_common +++ b/release/files_common @@ -18,6 +18,8 @@ apk/ai.comma*.apk common/.gitignore common/__init__.py common/android.py +common/hardware.py +common/gpio.py common/realtime.py common/clock.pyx common/timeout.py diff --git a/selfdrive/pandad.py b/selfdrive/pandad.py index 64fde86686..36ccad3796 100755 --- a/selfdrive/pandad.py +++ b/selfdrive/pandad.py @@ -3,8 +3,27 @@ import os import time +from common.hardware import TICI +from common.gpio import GPIO_HUB_RST_N, GPIO_STM_BOOT0, GPIO_STM_RST_N, gpio_init, gpio_set +from panda import BASEDIR, Panda, PandaDFU, build_st from selfdrive.swaglog import cloudlog -from panda import Panda, PandaDFU, BASEDIR, build_st + + +def set_panda_power(power=True): + if not TICI: + return + + gpio_init(GPIO_STM_RST_N, True) + gpio_init(GPIO_STM_BOOT0, True) + gpio_init(GPIO_HUB_RST_N, True) + + gpio_set(GPIO_STM_RST_N, False) + gpio_set(GPIO_HUB_RST_N, True) + gpio_set(GPIO_STM_BOOT0, False) + + time.sleep(0.1) + + gpio_set(GPIO_STM_RST_N, power) def get_firmware_fn(): @@ -88,10 +107,12 @@ def update_panda(): def main(): + set_panda_power() update_panda() os.chdir("boardd") os.execvp("./boardd", ["./boardd"]) + if __name__ == "__main__": main() diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index cddcb562fc..63f1a7e9b6 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -11,6 +11,7 @@ import cereal.messaging as messaging from cereal import log from common.android import get_network_strength, get_network_type from common.filter_simple import FirstOrderFilter +from common.hardware import EON, TICI from common.numpy_fast import clip, interp from common.params import Params, put_nonblocking from common.realtime import DT_TRML, sec_since_boot @@ -39,9 +40,6 @@ DAYS_NO_CONNECTIVITY_MAX = 7 # do not allow to engage after a week without inte DAYS_NO_CONNECTIVITY_PROMPT = 4 # send an offroad prompt after 4 days with no internet DISCONNECT_TIMEOUT = 5. # wait 5 seconds before going offroad after disconnect so you get an alert -EON = os.path.isfile('/EON') -TICI = os.path.isfile('/TICI') - LEON = False last_eon_fan_val = None From 71eedbce44b9239d05c3309a6f85c3c8abbb3908 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 25 Aug 2020 00:25:16 +0800 Subject: [PATCH 13/17] Remove unnecessary string copy (#2067) --- selfdrive/common/swaglog.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/selfdrive/common/swaglog.cc b/selfdrive/common/swaglog.cc index 41b6358d98..9d90347547 100644 --- a/selfdrive/common/swaglog.cc +++ b/selfdrive/common/swaglog.cc @@ -93,15 +93,13 @@ void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func {"created", seconds_since_epoch()} }; - char* log_s = strdup(log_j.dump().c_str()); - assert(log_s); + std::string log_s = log_j.dump(); free(msg_buf); char levelnum_c = levelnum; zmq_send(s.sock, &levelnum_c, 1, ZMQ_NOBLOCK | ZMQ_SNDMORE); - zmq_send(s.sock, log_s, strlen(log_s), ZMQ_NOBLOCK); - free(log_s); + zmq_send(s.sock, log_s.c_str(), log_s.length(), ZMQ_NOBLOCK); pthread_mutex_unlock(&s.lock); } From ac4e244b3bf9bdc14db51369fc43e6bef8a9d3ec Mon Sep 17 00:00:00 2001 From: VirtuallyChris Date: Mon, 24 Aug 2020 16:11:24 -0700 Subject: [PATCH 14/17] More Insight FW versions --- selfdrive/car/honda/values.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 0a521b78ab..c21e783166 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -897,6 +897,7 @@ FW_VERSIONS = { b'77959-TXM-A230\x00\x00', ], (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TXM-A030\x00\x00', b'57114-TXM-A040\x00\x00', ], (Ecu.shiftByWire, 0x18da0bf1, None): [ @@ -906,6 +907,7 @@ FW_VERSIONS = { b'38897-TXM-A020\x00\x00', ], (Ecu.combinationMeter, 0x18da60f1, None): [ + b'78109-TXM-A010\x00\x00', b'78109-TXM-A020\x00\x00', ], }, From 7956bb6883c75d97ca823d33c038841ef9e9e679 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 25 Aug 2020 00:56:42 -0700 Subject: [PATCH 15/17] mac ui kind of works (#2079) --- Dockerfile.openpilot_base | 1 - selfdrive/ui/qt/ui.cc | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Dockerfile.openpilot_base b/Dockerfile.openpilot_base index 06e2a95a09..4cec8a36a7 100644 --- a/Dockerfile.openpilot_base +++ b/Dockerfile.openpilot_base @@ -21,7 +21,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libffi-dev \ libglew-dev \ libgles2-mesa-dev \ - libglfw3-dev \ libglib2.0-0 \ liblzma-dev \ libomp-dev \ diff --git a/selfdrive/ui/qt/ui.cc b/selfdrive/ui/qt/ui.cc index 40ade50df0..2948a805a1 100644 --- a/selfdrive/ui/qt/ui.cc +++ b/selfdrive/ui/qt/ui.cc @@ -5,7 +5,13 @@ int main(int argc, char *argv[]) { QSurfaceFormat fmt; +#ifdef __APPLE__ + fmt.setVersion(3, 2); + fmt.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile); + fmt.setRenderableType(QSurfaceFormat::OpenGL); +#else fmt.setRenderableType(QSurfaceFormat::OpenGLES); +#endif QSurfaceFormat::setDefaultFormat(fmt); QApplication a(argc, argv); From e497b95f549b6e6d5a249121804231878c747e90 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Tue, 25 Aug 2020 10:53:04 +0200 Subject: [PATCH 16/17] Universal clocksd (#2075) * universal clocksd * start in manager * remove android include * Apple hacks Co-authored-by: Comma Device --- SConstruct | 8 ++++---- selfdrive/clocksd/SConscript | 2 +- selfdrive/clocksd/clocksd.cc | 32 +++++++++++++++++++++++++++----- selfdrive/manager.py | 2 +- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/SConstruct b/SConstruct index e3765a15c1..72a4acfceb 100644 --- a/SConstruct +++ b/SConstruct @@ -302,19 +302,19 @@ SConscript(['selfdrive/controls/lib/longitudinal_mpc_model/SConscript']) SConscript(['selfdrive/boardd/SConscript']) SConscript(['selfdrive/proclogd/SConscript']) +SConscript(['selfdrive/clocksd/SConscript']) SConscript(['selfdrive/loggerd/SConscript']) SConscript(['selfdrive/locationd/SConscript']) SConscript(['selfdrive/locationd/models/SConscript']) - if arch == "aarch64": SConscript(['selfdrive/logcatd/SConscript']) SConscript(['selfdrive/sensord/SConscript']) - SConscript(['selfdrive/clocksd/SConscript']) -else: - SConscript(['tools/lib/index_log/SConscript']) if arch != "larch64": SConscript(['selfdrive/ui/SConscript']) + +if arch == "x86_64": + SConscript(['tools/lib/index_log/SConscript']) diff --git a/selfdrive/clocksd/SConscript b/selfdrive/clocksd/SConscript index 601e64bf16..d1cf13e9e8 100644 --- a/selfdrive/clocksd/SConscript +++ b/selfdrive/clocksd/SConscript @@ -1,2 +1,2 @@ Import('env', 'common', 'cereal', 'messaging') -env.Program('clocksd.cc', LIBS=['diag', 'time_genoff', common, cereal, messaging, 'capnp', 'zmq', 'kj']) \ No newline at end of file +env.Program('clocksd.cc', LIBS=[common, cereal, messaging, 'capnp', 'zmq', 'kj']) diff --git a/selfdrive/clocksd/clocksd.cc b/selfdrive/clocksd/clocksd.cc index 2e17058e0e..3658115ab4 100644 --- a/selfdrive/clocksd/clocksd.cc +++ b/selfdrive/clocksd/clocksd.cc @@ -1,12 +1,22 @@ +#include +#include + #include #include +#include #include -#include #include -#include + +#include #include "messaging.hpp" #include "common/timing.h" +// Apple doesn't have timerfd +#ifndef __APPLE__ +#include +#endif + +#ifdef QCOM namespace { int64_t arm_cntpct() { int64_t v; @@ -14,13 +24,14 @@ namespace { return v; } } +#endif int main() { setpriority(PRIO_PROCESS, 0, -13); - int err = 0; PubMaster pm({"clocks"}); +#ifndef __APPLE__ int timerfd = timerfd_create(CLOCK_BOOTTIME, 0); assert(timerfd >= 0); @@ -30,19 +41,26 @@ int main() { spec.it_value.tv_sec = 1; spec.it_value.tv_nsec = 0; - err = timerfd_settime(timerfd, 0, &spec, 0); + int err = timerfd_settime(timerfd, 0, &spec, 0); assert(err == 0); uint64_t expirations = 0; while ((err = read(timerfd, &expirations, sizeof(expirations)))) { if (err < 0) break; +#else + // Just run at 1Hz on apple + while (true){ + std::this_thread::sleep_for(std::chrono::seconds(1)); +#endif uint64_t boottime = nanos_since_boot(); uint64_t monotonic = nanos_monotonic(); uint64_t monotonic_raw = nanos_monotonic_raw(); uint64_t wall_time = nanos_since_epoch(); +#ifdef QCOM uint64_t modem_uptime_v = arm_cntpct() / 19200ULL; // 19.2 mhz clock +#endif capnp::MallocMessageBuilder msg; cereal::Event::Builder event = msg.initRoot(); @@ -53,11 +71,15 @@ int main() { clocks.setMonotonicNanos(monotonic); clocks.setMonotonicRawNanos(monotonic_raw); clocks.setWallTimeNanos(wall_time); +#ifdef QCOM clocks.setModemUptimeMillis(modem_uptime_v); +#endif pm.send("clocks", msg); } +#ifndef __APPLE__ close(timerfd); +#endif return 0; -} \ No newline at end of file +} diff --git a/selfdrive/manager.py b/selfdrive/manager.py index e9ef36a2fc..75168781b3 100755 --- a/selfdrive/manager.py +++ b/selfdrive/manager.py @@ -239,6 +239,7 @@ car_started_processes = [ 'proclogd', 'ubloxd', 'locationd', + 'clocksd', ] driver_view_processes = [ @@ -255,7 +256,6 @@ if WEBCAM: if ANDROID: car_started_processes += [ 'sensord', - 'clocksd', 'gpsd', 'dmonitoringmodeld', ] From 2be2b6634174389e007446c5961b0d05e8abdf82 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Tue, 25 Aug 2020 17:30:14 +0200 Subject: [PATCH 17/17] bump cereal --- cereal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal b/cereal index 16e424f406..b409259426 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 16e424f406cee5b1197c024bbeab47b9ea016140 +Subproject commit b40925942610dd0e985224da21b20572a02a31bc