Replace ifdefs with hardware abstraction layer (#20801)

* add type to class hadwareXXX

* replace ifdefs with hardware layer

* continue

* continue

* new function get_driver_view_transform

* full path to hw.h

* fix build error setup.cc

* apply review

* fix typo

* fix deprecated error:replace deprecated fromPath with new

* fix build error
albatross
Dean Lee 2021-05-06 17:41:46 +08:00 committed by GitHub
parent 937c2fa9f3
commit 757d2923d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 236 additions and 302 deletions

View File

@ -27,6 +27,7 @@
#include "common/timing.h"
#include "messaging.h"
#include "locationd/ublox_msg.h"
#include "selfdrive/hardware/hw.h"
#include "panda.h"
#include "pigeon.h"
@ -361,7 +362,7 @@ void panda_state_thread(bool spoofing_started) {
auto ps = msg.initEvent().initPandaState();
ps.setUptime(pandaState.uptime);
#ifdef QCOM2
if (Hardware::TICI()) {
double read_time = millis_since_boot();
ps.setVoltage(std::stoi(util::read_file("/sys/class/hwmon/hwmon1/in1_input")));
ps.setCurrent(std::stoi(util::read_file("/sys/class/hwmon/hwmon1/curr1_input")));
@ -369,10 +370,10 @@ void panda_state_thread(bool spoofing_started) {
if (read_time > 50) {
LOGW("reading hwmon took %lfms", read_time);
}
#else
} else {
ps.setVoltage(pandaState.voltage);
ps.setCurrent(pandaState.current);
#endif
}
ps.setIgnitionLine(pandaState.ignition_line);
ps.setIgnitionCan(pandaState.ignition_can);
@ -417,17 +418,14 @@ void hardware_control_thread() {
uint16_t prev_fan_speed = 999;
uint16_t ir_pwr = 0;
uint16_t prev_ir_pwr = 999;
#if defined(QCOM) || defined(QCOM2)
bool prev_charging_disabled = false;
#endif
unsigned int cnt = 0;
while (!do_exit && panda->connected) {
cnt++;
sm.update(1000); // TODO: what happens if EINTR is sent while in sm.update?
#if defined(QCOM) || defined(QCOM2)
if (sm.updated("deviceState")){
if (!Hardware::PC() && sm.updated("deviceState")){
// Charging mode
bool charging_disabled = sm["deviceState"].getDeviceState().getChargingDisabled();
if (charging_disabled != prev_charging_disabled){
@ -441,7 +439,6 @@ void hardware_control_thread() {
prev_charging_disabled = charging_disabled;
}
}
#endif
// Other pandas don't have fan/IR to control
if (panda->hw_type != cereal::PandaState::PandaType::UNO && panda->hw_type != cereal::PandaState::PandaType::DOS) continue;
@ -491,11 +488,7 @@ void pigeon_thread() {
PubMaster pm({"ubloxRaw"});
bool ignition_last = false;
#ifdef QCOM2
Pigeon *pigeon = Pigeon::connect("/dev/ttyHS0");
#else
Pigeon *pigeon = Pigeon::connect(panda);
#endif
Pigeon *pigeon = Hardware::TICI() ? Pigeon::connect("/dev/ttyHS0") : Pigeon::connect(panda);
std::unordered_map<char, uint64_t> last_recv_time;
std::unordered_map<char, int64_t> cls_max_dt = {
@ -572,11 +565,7 @@ int main() {
err = set_realtime_priority(54);
LOG("set priority returns %d", err);
#ifdef QCOM2
err = set_core_affinity(4);
#else
err = set_core_affinity(3);
#endif
err = set_core_affinity(Hardware::TICI() ? 4 : 3);
LOG("set affinity returns %d", err);
while (!do_exit){

View File

@ -24,6 +24,7 @@
#include "common/util.h"
#include "modeldata.h"
#include "imgproc/utils.h"
#include "selfdrive/hardware/hw.h"
static cl_program build_debayer_program(cl_device_id device_id, cl_context context, const CameraInfo *ci, const CameraBuf *b, const CameraState *s) {
char args[4096];
@ -35,11 +36,8 @@ static cl_program build_debayer_program(cl_device_id device_id, cl_context conte
ci->frame_width, ci->frame_height, ci->frame_stride,
b->rgb_width, b->rgb_height, b->rgb_stride,
ci->bayer_flip, ci->hdr, s->camera_num);
#ifdef QCOM2
return cl_program_from_file(context, device_id, "cameras/real_debayer.cl", args);
#else
return cl_program_from_file(context, device_id, "cameras/debayer.cl", args);
#endif
const char *cl_file = Hardware::TICI() ? "cameras/real_debayer.cl" : "cameras/debayer.cl";
return cl_program_from_file(context, device_id, cl_file, args);
}
void CameraBuf::init(cl_device_id device_id, cl_context context, CameraState *s, VisionIpcServer * v, int frame_cnt, VisionStreamType rgb_type, VisionStreamType yuv_type, release_cb release_callback) {
@ -64,13 +62,12 @@ void CameraBuf::init(cl_device_id device_id, cl_context context, CameraState *s,
rgb_width = ci->frame_width;
rgb_height = ci->frame_height;
#ifndef QCOM2
// debayering does a 2x downscale
if (ci->bayer) {
if (Hardware::TICI() && ci->bayer) {
rgb_width = ci->frame_width / 2;
rgb_height = ci->frame_height / 2;
}
#endif
yuv_transform = get_model_yuv_transform(ci->bayer);
vipc_server->create_buffers(rgb_type, UI_BUF_COUNT, true, rgb_width, rgb_height);
@ -350,21 +347,27 @@ static void driver_cam_auto_exposure(CameraState *c, SubMaster &sm) {
static const bool is_rhd = Params().getBool("IsRHD");
struct ExpRect {int x1, x2, x_skip, y1, y2, y_skip;};
const CameraBuf *b = &c->buf;
#ifndef QCOM2
bool hist_ceil = false, hl_weighted = false;
int x_offset = 0, y_offset = 0;
int frame_width = b->rgb_width, frame_height = b->rgb_height;
#ifndef QCOM2
int analog_gain = -1;
const int x_offset = 0, y_offset = 0;
const int frame_width = b->rgb_width, frame_height = b->rgb_height;
const ExpRect def_rect = {is_rhd ? 0 : b->rgb_width * 3 / 5, is_rhd ? b->rgb_width * 2 / 5 : b->rgb_width, 2,
b->rgb_height / 3, b->rgb_height, 1};
#else
bool hist_ceil = true, hl_weighted = true;
int analog_gain = (int)c->analog_gain;
const int x_offset = 630, y_offset = 156;
const int frame_width = 668, frame_height = frame_width / 1.33;
const ExpRect def_rect = {96, 1832, 2, 242, 1148, 4};
int analog_gain = c->analog_gain;
#endif
ExpRect def_rect;
if (!Hardware::TICI()) {
def_rect = {is_rhd ? 0 : b->rgb_width * 3 / 5, is_rhd ? b->rgb_width * 2 / 5 : b->rgb_width, 2,
b->rgb_height / 3, b->rgb_height, 1};
} else {
hist_ceil = hl_weighted = true;
x_offset = 630, y_offset = 156;
frame_width = 668, frame_height = frame_width / 1.33;
def_rect = {96, 1832, 2, 242, 1148, 4};
}
static ExpRect rect = def_rect;
// use driver face crop for AE
if (sm.updated("driverState")) {

View File

@ -22,6 +22,7 @@
#include "common/swaglog.h"
#include "common/util.h"
#include "visionipc_server.h"
#include "selfdrive/hardware/hw.h"
ExitHandler do_exit;
@ -43,11 +44,11 @@ void party(cl_device_id device_id, cl_context context) {
int main(int argc, char *argv[]) {
set_realtime_priority(53);
#if defined(QCOM)
if (Hardware::EON()) {
set_core_affinity(2);
#elif defined(QCOM2)
} else if (Hardware::TICI()) {
set_core_affinity(6);
#endif
}
cl_device_id device_id = cl_get_device_id(CL_DEVICE_TYPE_DEFAULT);

View File

@ -20,39 +20,26 @@ const double X_IDXS[TRAJECTORY_SIZE] = { 0. , 0.1875, 0.75 , 1.6875,
#ifdef __cplusplus
#include "common/mat.h"
#ifdef QCOM2
const mat3 fcam_intrinsic_matrix = (mat3){{
2648.0, 0.0, 1928.0/2,
#include "selfdrive/hardware/hw.h"
const mat3 fcam_intrinsic_matrix =
Hardware::TICI() ? (mat3){{2648.0, 0.0, 1928.0 / 2,
0.0, 2648.0, 1208.0 / 2,
0.0, 0.0, 1.0
}};
0.0, 0.0, 1.0}}
: (mat3){{910., 0., 1164.0 / 2,
0., 910., 874.0 / 2,
0., 0., 1.}};
// without unwarp, focal length is for center portion only
const mat3 ecam_intrinsic_matrix = (mat3){{
620.0, 0.0, 1928.0/2,
const mat3 ecam_intrinsic_matrix =
Hardware::TICI() ? (mat3){{620.0, 0.0, 1928.0 / 2,
0.0, 620.0, 1208.0 / 2,
0.0, 0.0, 1.0
}};
#else
const mat3 fcam_intrinsic_matrix = (mat3){{
910., 0., 1164.0/2,
0., 910., 874.0/2,
0., 0., 1.
}};
const mat3 ecam_intrinsic_matrix = (mat3){{
0.0, 0.0, 1.0}}
: (mat3){{0., 0., 0.,
0., 0., 0.,
0., 0., 0.,
0., 0., 0.
}};
#endif
0., 0., 0.}};
static inline mat3 get_model_yuv_transform(bool bayer = true) {
#ifndef QCOM2
float db_s = 0.5; // debayering does a 2x downscale
#else
float db_s = 1.0;
#endif
float db_s = Hardware::TICI() ? 0.5 : 1.0; // debayering does a 2x downscale on TICI
const mat3 transform = (mat3){{
1.0, 0.0, 0.0,
0.0, 1.0, 0.0,

View File

@ -16,7 +16,7 @@
#include <unordered_map>
#include "common/util.h"
#include "common/swaglog.h"
#include "selfdrive/hardware/hw.h"
// keep trying if x gets interrupted by a signal
#define HANDLE_EINTR(x) \
({ \
@ -30,13 +30,8 @@
namespace {
#if defined(QCOM) || defined(QCOM2)
const std::string default_params_path = "/data/params";
const std::string persistent_params_path = "/persist/comma/params";
#else
const std::string default_params_path = util::getenv_default("HOME", "/.comma/params", "/data/params");
const std::string persistent_params_path = default_params_path;
#endif
const std::string default_params_path = !Hardware::PC() ? "/data/params" : util::getenv_default("HOME", "/.comma/params", "/data/params");
const std::string persistent_params_path = !Hardware::PC() ? "/persist/comma/params" : default_params_path;
volatile sig_atomic_t params_do_exit = 0;
void params_sig_handler(int signal) {

View File

@ -13,7 +13,7 @@
#include "common/util.h"
#include "common/version.h"
#include "selfdrive/hardware/hw.h"
#include "swaglog.h"
class LogState {
@ -71,9 +71,9 @@ static void cloudlog_init() {
s.ctx_j["dirty"] = !getenv("CLEAN");
// device type
if (util::file_exists("/EON")) {
if (Hardware::EON()) {
cloudlog_bind_locked("device", "eon");
} else if (util::file_exists("/TICI")) {
} else if (Hardware::TICI()) {
cloudlog_bind_locked("device", "tici");
} else {
cloudlog_bind_locked("device", "pc");

View File

@ -7,16 +7,27 @@
// no-op base hw class
class HardwareNone {
public:
enum Type {
typePC,
typeEON,
typeTICI
};
static constexpr float MAX_VOLUME = 0;
static constexpr float MIN_VOLUME = 0;
static std::string get_os_version() { return "openpilot for PC"; };
static std::string get_os_version() { return "openpilot for PC"; }
static void reboot() {};
static void poweroff() {};
static void set_brightness(int percent) {};
static void set_display_power(bool on) {};
static void reboot() {}
static void poweroff() {}
static void set_brightness(int percent) {}
static void set_display_power(bool on) {}
static bool get_ssh_enabled() { return false; };
static void set_ssh_enabled(bool enabled) {};
static bool get_ssh_enabled() { return false; }
static void set_ssh_enabled(bool enabled) {}
static Type type() { return typePC; }
static bool PC() { return type() == typePC; }
static bool EON() { return type() == typeEON; }
static bool TICI() { return type() == typeTICI; }
};

View File

@ -15,6 +15,7 @@ public:
static constexpr float MAX_VOLUME = 1.0;
static constexpr float MIN_VOLUME = 0.5;
static Type type() { return typeEON; }
static std::string get_os_version() {
return "NEOS " + util::read_file("/VERSION");
};

View File

@ -11,7 +11,7 @@ class HardwareTici : public HardwareNone {
public:
static constexpr float MAX_VOLUME = 0.5;
static constexpr float MIN_VOLUME = 0.4;
static Type type() { return typeTICI; }
static std::string get_os_version() {
return "AGNOS " + util::read_file("/VERSION");
};

View File

@ -20,6 +20,7 @@
#include "common/params.h"
#include "common/version.h"
#include "messaging.h"
#include "selfdrive/hardware/hw.h"
#include "logger.h"
@ -53,9 +54,9 @@ kj::Array<capnp::word> logger_build_init_data() {
MessageBuilder msg;
auto init = msg.initEvent().initInitData();
if (util::file_exists("/EON")) {
if (Hardware::EON()) {
init.setDeviceType(cereal::InitData::DeviceType::NEO);
} else if (util::file_exists("/TICI")) {
} else if (Hardware::TICI()) {
init.setDeviceType(cereal::InitData::DeviceType::TICI);
} else {
init.setDeviceType(cereal::InitData::DeviceType::PC);

View File

@ -8,13 +8,11 @@
#include <kj/array.h>
#include <capnp/serialize.h>
#include "common/util.h"
#include "selfdrive/hardware/hw.h"
#if defined(QCOM) || defined(QCOM2)
const std::string LOG_ROOT = "/data/media/0/realdata";
#else
const std::string LOG_ROOT = util::getenv_default("HOME", "/.comma/media/0/realdata", "/data/media/0/realdata");
#endif
const std::string LOG_ROOT =
Hardware::PC() ? util::getenv_default("HOME", "/.comma/media/0/realdata", "/data/media/0/realdata")
: "/data/media/0/realdata";
#define LOGGER_MAX_HANDLES 16
class BZFile {

View File

@ -26,7 +26,7 @@
#include "logger.h"
#include "messaging.h"
#include "services.h"
#include "selfdrive/hardware/hw.h"
#include "visionipc.h"
#include "visionipc_client.h"
@ -42,16 +42,9 @@
namespace {
constexpr int MAIN_FPS = 20;
#ifndef QCOM2
constexpr int MAIN_BITRATE = 5000000;
constexpr int MAX_CAM_IDX = LOG_CAMERA_ID_DCAMERA;
constexpr int DCAM_BITRATE = 2500000;
#else
constexpr int MAIN_BITRATE = 10000000;
constexpr int MAX_CAM_IDX = LOG_CAMERA_ID_ECAMERA;
constexpr int DCAM_BITRATE = MAIN_BITRATE;
#endif
const int MAIN_BITRATE = Hardware::TICI() ? 10000000 : 5000000;
const int MAX_CAM_IDX = Hardware::TICI() ? LOG_CAMERA_ID_ECAMERA : LOG_CAMERA_ID_DCAMERA;
const int DCAM_BITRATE = Hardware::TICI() ? MAIN_BITRATE : 2500000;
#define NO_CAMERA_PATIENCE 500 // fall back to time-based rotation if all cameras are dead
@ -96,11 +89,8 @@ LogCameraInfo cameras_logged[LOG_CAMERA_ID_MAX] = {
.bitrate = 256000,
.is_h265 = false,
.downscale = true,
#ifndef QCOM2
.frame_width = 480, .frame_height = 360
#else
.frame_width = 526, .frame_height = 330 // keep pixel count the same?
#endif
.frame_width = Hardware::TICI() ? 526 : 480,
.frame_height = Hardware::TICI() ? 330 : 360 // keep pixel count the same?
},
};
@ -279,11 +269,11 @@ void encoder_thread(int cam_idx) {
eidx.setFrameId(extra.frame_id);
eidx.setTimestampSof(extra.timestamp_sof);
eidx.setTimestampEof(extra.timestamp_eof);
#ifdef QCOM2
if (Hardware::TICI()) {
eidx.setType(cereal::EncodeIndex::Type::FULL_H_E_V_C);
#else
} else {
eidx.setType(cam_idx == LOG_CAMERA_ID_DCAMERA ? cereal::EncodeIndex::Type::FRONT : cereal::EncodeIndex::Type::FULL_H_E_V_C);
#endif
}
eidx.setEncodeId(cnt);
eidx.setSegmentNum(rotate_state.cur_seg);
eidx.setSegmentId(out_id);
@ -368,18 +358,14 @@ int main(int argc, char** argv) {
encoder_threads.push_back(std::thread(encoder_thread, LOG_CAMERA_ID_FCAMERA));
s.rotate_state[LOG_CAMERA_ID_FCAMERA].enabled = true;
#if defined(QCOM) || defined(QCOM2)
bool record_front = Params().getBool("RecordFront");
if (record_front) {
if (!Hardware::PC() && Params().getBool("RecordFront")) {
encoder_threads.push_back(std::thread(encoder_thread, LOG_CAMERA_ID_DCAMERA));
s.rotate_state[LOG_CAMERA_ID_DCAMERA].enabled = true;
}
#ifdef QCOM2
if (Hardware::TICI()) {
encoder_threads.push_back(std::thread(encoder_thread, LOG_CAMERA_ID_ECAMERA));
s.rotate_state[LOG_CAMERA_ID_ECAMERA].enabled = true;
#endif
#endif
}
uint64_t msg_count = 0;
uint64_t bytes_count = 0;
@ -453,9 +439,7 @@ int main(int argc, char** argv) {
new_segment &= (((r.stream_frame_id >= r.last_rotate_frame_id + SEGMENT_LENGTH * MAIN_FPS) &&
(!r.should_rotate) && (r.initialized)) ||
(!r.enabled));
#ifndef QCOM2
break; // only look at fcamera frame id if not QCOM2
#endif
if (!Hardware::TICI()) break; // only look at fcamera frame id if not QCOM2
}
} else {
if (tms - last_rotate_tms > SEGMENT_LENGTH * 1000) {

View File

@ -8,7 +8,7 @@
#include "common/clutil.h"
#include "common/util.h"
#include "common/params.h"
#include "selfdrive/hardware/hw.h"
#include "models/driving.h"
#include "messaging.h"
@ -133,17 +133,12 @@ void run_model(ModelState &model, VisionIpcClient &vipc_client) {
int main(int argc, char **argv) {
set_realtime_priority(54);
#ifdef QCOM
if (Hardware::EON()) {
set_core_affinity(2);
#elif QCOM2
} else if (Hardware::TICI()) {
set_core_affinity(7);
#endif
bool wide_camera = false;
#ifdef QCOM2
wide_camera = Params().getBool("EnableWideCamera");
#endif
}
bool wide_camera = Hardware::TICI() ? Params().getBool("EnableWideCamera") : false;
// start calibration thread
std::thread thread = std::thread(calibration_thread, wide_camera);

View File

@ -1,10 +1,11 @@
#include <string.h>
#include <libyuv.h>
#include "selfdrive/hardware/hw.h"
#include "dmonitoring.h"
#include "common/mat.h"
#include "common/timing.h"
#include "common/params.h"
#include <libyuv.h>
#define MODEL_WIDTH 320
#define MODEL_HEIGHT 640
@ -17,12 +18,8 @@
#endif
void dmonitoring_init(DMonitoringModelState* s) {
#if defined(QCOM) || defined(QCOM2)
const char* model_path = "../../models/dmonitoring_model_q.dlc";
#else
const char* model_path = "../../models/dmonitoring_model.dlc";
#endif
const char *model_path = Hardware::PC() ? "../../models/dmonitoring_model.dlc"
: "../../models/dmonitoring_model_q.dlc";
int runtime = USE_DSP_RUNTIME;
s->m = new DefaultRunModel(model_path, &s->output[0], OUTPUT_SIZE, runtime);
s->is_rhd = Params().getBool("IsRHD");
@ -55,24 +52,26 @@ void crop_yuv(uint8_t *raw, int width, int height, uint8_t *y, uint8_t *u, uint8
}
DMonitoringResult dmonitoring_eval_frame(DMonitoringModelState* s, void* stream_buf, int width, int height) {
#ifndef QCOM2
Rect crop_rect = {0, 0, height / 2, height};
if (!s->is_rhd) {
crop_rect.x += width - crop_rect.w;
}
#else
Rect crop_rect;
if (Hardware::TICI()) {
const int full_width_tici = 1928;
const int full_height_tici = 1208;
const int adapt_width_tici = 668;
const int cropped_height = adapt_width_tici / 1.33;
Rect crop_rect = {full_width_tici / 2 - adapt_width_tici / 2,
crop_rect = {full_width_tici / 2 - adapt_width_tici / 2,
full_height_tici / 2 - cropped_height / 2 - 196,
cropped_height / 2,
cropped_height};
if (!s->is_rhd) {
crop_rect.x += adapt_width_tici - crop_rect.w + 32;
}
#endif
} else {
crop_rect = {0, 0, height / 2, height};
if (!s->is_rhd) {
crop_rect.x += width - crop_rect.w;
}
}
int resized_width = MODEL_WIDTH;
int resized_height = MODEL_HEIGHT;

View File

@ -3,6 +3,7 @@
#include "qt/window.h"
#include "qt/qt_window.h"
#include "selfdrive/hardware/hw.h"
int main(int argc, char *argv[]) {
QSurfaceFormat fmt;
@ -15,15 +16,12 @@ int main(int argc, char *argv[]) {
#endif
QSurfaceFormat::setDefaultFormat(fmt);
#ifdef QCOM
if (Hardware::EON()) {
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
#endif
#ifdef QCOM
QSslConfiguration ssl = QSslConfiguration::defaultConfiguration();
ssl.setCaCertificates(QSslCertificate::fromPath("/usr/etc/tls/cert.pem", QSsl::Pem, QRegExp::Wildcard));
ssl.setCaCertificates(QSslCertificate::fromPath("/usr/etc/tls/cert.pem"));
QSslConfiguration::setDefaultConfiguration(ssl);
#endif
}
QApplication a(argc, argv);
MainWindow w;

View File

@ -19,16 +19,12 @@
#include "nanovg_gl.h"
#include "nanovg_gl_utils.h"
#include "paint.h"
#include "selfdrive/hardware/hw.h"
// TODO: this is also hardcoded in common/transformations/camera.py
// TODO: choose based on frame input size
#ifdef QCOM2
const float y_offset = 150.0;
const float zoom = 2912.8;
#else
const float y_offset = 0.0;
const float zoom = 2138.5;
#endif
const float y_offset = Hardware::TICI() ? 150.0 : 0.0;
const float zoom = Hardware::TICI() ? 2912.8 : 2138.5;
static void ui_draw_text(const UIState *s, float x, float y, const char *string, float size, NVGcolor color, const char *font_name) {
nvgFontFace(s->vg, font_name);
@ -129,11 +125,11 @@ static void draw_frame(UIState *s) {
if (s->last_frame) {
glBindTexture(GL_TEXTURE_2D, s->texture[s->last_frame->idx]->frame_tex);
#ifndef QCOM
if (!Hardware::EON()) {
// this is handled in ion on QCOM
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, s->last_frame->width, s->last_frame->height,
0, GL_RGB, GL_UNSIGNED_BYTE, s->last_frame->addr);
#endif
}
}
glUseProgram(s->gl_shader->prog);
@ -246,13 +242,9 @@ static void ui_draw_driver_view(UIState *s) {
// blackout
const int blackout_x_r = valid_rect.right();
#ifndef QCOM2
const int blackout_w_r = rect.right() - valid_rect.right();
const int blackout_x_l = rect.x;
#else
const int blackout_w_r = s->viz_rect.right() - valid_rect.right();
const int blackout_x_l = s->viz_rect.x;
#endif
const Rect &blackout_rect = Hardware::TICI() ? s->viz_rect : rect;
const int blackout_w_r = blackout_rect.right() - valid_rect.right();
const int blackout_x_l = blackout_rect.x;
const int blackout_w_l = valid_rect.x - blackout_x_l;
ui_fill_rect(s->vg, {blackout_x_l, rect.y, blackout_w_l, rect.h}, COLOR_BLACK_ALPHA(144));
ui_fill_rect(s->vg, {blackout_x_r, rect.y, blackout_w_r, rect.h}, COLOR_BLACK_ALPHA(144));
@ -426,41 +418,42 @@ static const mat4 device_transform = {{
0.0, 0.0, 0.0, 1.0,
}};
static const float driver_view_ratio = 1.333;
#ifndef QCOM2
// frame from 4/3 to 16/9 display
static const mat4 driver_view_transform = {{
driver_view_ratio*(1080-2*bdr_s)/(1920-2*bdr_s), 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0,
}};
#else
static mat4 get_driver_view_transform() {
const float driver_view_ratio = 1.333;
mat4 transform;
if (Hardware::TICI()) {
// from dmonitoring.cc
static const int full_width_tici = 1928;
static const int full_height_tici = 1208;
static const int adapt_width_tici = 668;
static const int crop_x_offset = 32;
static const int crop_y_offset = -196;
static const float yscale = full_height_tici * driver_view_ratio / adapt_width_tici;
static const float xscale = yscale*(1080-2*bdr_s)/(2160-2*bdr_s)*full_width_tici/full_height_tici;
static const mat4 driver_view_transform = {{
const int full_width_tici = 1928;
const int full_height_tici = 1208;
const int adapt_width_tici = 668;
const int crop_x_offset = 32;
const int crop_y_offset = -196;
const float yscale = full_height_tici * driver_view_ratio / adapt_width_tici;
const float xscale = yscale*(1080-2*bdr_s)/(2160-2*bdr_s)*full_width_tici/full_height_tici;
transform = (mat4){{
xscale, 0.0, 0.0, xscale*crop_x_offset/full_width_tici*2,
0.0, yscale, 0.0, yscale*crop_y_offset/full_height_tici*2,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0,
}};
#endif
} else {
// frame from 4/3 to 16/9 display
transform = (mat4){{
driver_view_ratio*(1080-2*bdr_s)/(1920-2*bdr_s), 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0,
}};
}
return transform;
}
void ui_nvg_init(UIState *s) {
// init drawing
#ifdef QCOM
// on QCOM, we enable MSAA
s->vg = nvgCreate(0);
#else
s->vg = nvgCreate(NVG_ANTIALIAS | NVG_STENCIL_STROKES | NVG_DEBUG);
#endif
// on EON, we enable MSAA
s->vg = Hardware::EON() ? nvgCreate(0) : nvgCreate(NVG_ANTIALIAS | NVG_STENCIL_STROKES | NVG_DEBUG);
assert(s->vg);
// init fonts
@ -554,7 +547,7 @@ void ui_nvg_init(UIState *s) {
0.0, 0.0, 0.0, 1.0,
}};
s->front_frame_mat = matmul(device_transform, driver_view_transform);
s->front_frame_mat = matmul(device_transform, get_driver_view_transform());
s->rear_frame_mat = matmul(device_transform, frame_transform);
// Apply transformation such that video pixel coordinates match video

View File

@ -13,12 +13,11 @@
#include "api.h"
#include "common/params.h"
#include "common/util.h"
#include "selfdrive/hardware/hw.h"
#if defined(QCOM) || defined(QCOM2)
const std::string private_key_path = "/persist/comma/id_rsa";
#else
const std::string private_key_path = util::getenv_default("HOME", "/.comma/persist/comma/id_rsa", "/persist/comma/id_rsa");
#endif
const std::string private_key_path =
!Hardware::PC() ? util::getenv_default("HOME", "/.comma/persist/comma/id_rsa", "/persist/comma/id_rsa")
: "/persist/comma/id_rsa";
QByteArray CommaApi::rsa_sign(const QByteArray &data) {
auto file = QFile(private_key_path.c_str());

View File

@ -49,13 +49,13 @@ TogglesPanel::TogglesPanel(QWidget *parent) : QWidget(parent) {
"../assets/offroad/icon_shell.png",
this));
#ifndef QCOM2
if (Hardware::TICI()) {
toggles.append(new ParamControl("IsUploadRawEnabled",
"Upload Raw Logs",
"Upload full logs and full resolution video by default while on WiFi. If not enabled, individual logs can be marked for upload at my.comma.ai/useradmin.",
"../assets/offroad/icon_network.png",
this));
#endif
}
ParamControl *record_toggle = new ParamControl("RecordFront",
"Record and Upload Driver Camera",
@ -69,7 +69,7 @@ TogglesPanel::TogglesPanel(QWidget *parent) : QWidget(parent) {
"../assets/offroad/icon_road.png",
this));
#ifdef QCOM2
if (Hardware::TICI()) {
toggles.append(new ParamControl("EnableWideCamera",
"Enable use of Wide Angle Camera",
"Use wide angle camera for driving and ui. Only takes effect after reboot.",
@ -80,8 +80,7 @@ TogglesPanel::TogglesPanel(QWidget *parent) : QWidget(parent) {
"",
"../assets/offroad/icon_network.png",
this));
#endif
}
bool record_lock = Params().getBool("RecordFrontLock");
record_toggle->setEnabled(!record_lock);

View File

@ -2,19 +2,15 @@
#include <QWidget>
#include <QApplication>
#include "selfdrive/hardware/hw.h"
#ifdef QCOM2
#include <qpa/qplatformnativeinterface.h>
#include <QPlatformSurfaceEvent>
#include <wayland-client-protocol.h>
#endif
#ifdef QCOM2
const int vwp_w = 2160, vwp_h = 1080;
#else
const int vwp_w = 1920, vwp_h = 1080;
#endif
const int vwp_w = Hardware::TICI() ? 2160 : 1920;
const int vwp_h = 1080;
inline void setMainWindow(QWidget *w) {
const float scale = getenv("SCALE") != NULL ? std::stof(getenv("SCALE")) : 1.0;

View File

@ -10,6 +10,7 @@
#include "offroad/networking.h"
#include "widgets/input.h"
#include "qt_window.h"
#include "selfdrive/hardware/hw.h"
#define USER_AGENT "AGNOSSetup-0.1"
@ -141,9 +142,9 @@ QWidget * Setup::download_failed() {
QPushButton *reboot_btn = new QPushButton("Reboot");
nav_layout->addWidget(reboot_btn, 0, Qt::AlignBottom | Qt::AlignLeft);
QObject::connect(reboot_btn, &QPushButton::released, this, [=]() {
#ifdef QCOM2
if (Hardware::TICI()) {
std::system("sudo reboot");
#endif
}
});
QPushButton *restart_btn = new QPushButton("Start over");

View File

@ -1,6 +1,7 @@
#include "common/util.h"
#include "sidebar.h"
#include "qt_window.h"
#include "selfdrive/hardware/hw.h"
StatusWidget::StatusWidget(bool has_substatus, QWidget *parent) : QFrame(parent) {
layout = new QVBoxLayout();
@ -178,11 +179,9 @@ void Sidebar::update(const UIState &s) {
panda_color = COLOR_DANGER;
panda_message = "NO\nPANDA";
}
#ifdef QCOM2
else if (s.scene.started) {
else if (Hardware::TICI() && s.scene.started) {
panda_color = s.scene.gpsOK ? COLOR_GOOD : COLOR_WARNING;
panda_message = QString("SAT CNT\n%1").arg(s.scene.satelliteCount);
}
#endif
panda->update(panda_message, panda_color);
}

View File

@ -2,6 +2,7 @@
#include "input.h"
#include "qt_window.h"
#include "selfdrive/hardware/hw.h"
InputDialog::InputDialog(const QString &prompt_text, QWidget *parent) : QDialog(parent) {
layout = new QVBoxLayout();
@ -172,8 +173,8 @@ bool ConfirmationDialog::confirm(const QString &prompt_text, QWidget *parent) {
int ConfirmationDialog::exec() {
// TODO: make this work without fullscreen
#ifdef QCOM2
if (Hardware::TICI()) {
setMainWindow(this);
#endif
}
return QDialog::exec();
}

View File

@ -1,14 +1,10 @@
#include "replay.h"
#include "selfdrive/hardware/hw.h"
Replay::Replay(QString route_, int seek) : route(route_) {
unlogger = new Unlogger(&events, &events_lock, &frs, seek);
current_segment = 0;
bool create_jwt = true;
#if !defined(QCOM) && !defined(QCOM2)
create_jwt = false;
#endif
bool create_jwt = !Hardware::PC();
http = new HttpRequest(this, "https://api.commadotai.com/v1/route/" + route + "/files", "", create_jwt);
QObject::connect(http, &HttpRequest::receivedResponse, this, &Replay::parseResponse);
}

View File

@ -8,7 +8,7 @@
#include "common/swaglog.h"
#include "common/visionimg.h"
#include "common/watchdog.h"
#include "hardware/hw.h"
#include "selfdrive/hardware/hw.h"
#include "ui.h"
#include "paint.h"
#include "qt_window.h"
@ -192,11 +192,10 @@ static void update_state(UIState *s) {
}
if (sm.updated("sensorEvents")) {
for (auto sensor : sm["sensorEvents"].getSensorEvents()) {
if (sensor.which() == cereal::SensorEventData::LIGHT) {
#ifndef QCOM2
if (!Hardware::TICI() && sensor.which() == cereal::SensorEventData::LIGHT) {
scene.light_sensor = sensor.getLight();
#endif
} else if (!scene.started && sensor.which() == cereal::SensorEventData::ACCELERATION) {
}
if (!scene.started && sensor.which() == cereal::SensorEventData::ACCELERATION) {
auto accel = sensor.getAcceleration().getV();
if (accel.totalSize().wordCount){ // TODO: sometimes empty lists are received. Figure out why
scene.accel_sensor = accel[2];
@ -209,13 +208,11 @@ static void update_state(UIState *s) {
}
}
}
#ifdef QCOM2
if (sm.updated("roadCameraState")) {
if (Hardware::TICI() && sm.updated("roadCameraState")) {
auto camera_state = sm["roadCameraState"].getRoadCameraState();
float gain = camera_state.getGainFrac() * (camera_state.getGlobalGain() > 100 ? 2.5 : 1.0) / 10.0;
scene.light_sensor = std::clamp<float>((1023.0 / 1757.0) * (1757.0 - camera_state.getIntegLines()) * (1.0 - gain), 0.0, 1023.0);
}
#endif
scene.started = scene.deviceState.getStarted() || scene.driver_view;
}
@ -244,10 +241,8 @@ static void update_vision(UIState *s) {
VisionBuf * buf = s->vipc_client->recv();
if (buf != nullptr){
s->last_frame = buf;
} else {
#if defined(QCOM) || defined(QCOM2)
} else if (!Hardware::PC()) {
LOGE("visionIPC receive timeout");
#endif
}
}
}
@ -295,11 +290,7 @@ QUIState::QUIState(QObject *parent) : QObject(parent) {
ui_state.fb_h = vwp_h;
ui_state.scene.started = false;
ui_state.last_frame = nullptr;
ui_state.wide_camera = false;
#ifdef QCOM2
ui_state.wide_camera = Params().getBool("EnableWideCamera");
#endif
ui_state.wide_camera = Hardware::TICI() ? Params().getBool("EnableWideCamera") : false;
ui_state.vipc_client_rear = new VisionIpcClient("camerad", ui_state.wide_camera ? VISION_STREAM_RGB_WIDE : VISION_STREAM_RGB_BACK, true);
ui_state.vipc_client_front = new VisionIpcClient("camerad", VISION_STREAM_RGB_FRONT, true);
@ -359,12 +350,9 @@ void Device::setAwake(bool on, bool reset) {
void Device::updateBrightness(const UIState &s) {
float clipped_brightness = std::min(100.0f, (s.scene.light_sensor * brightness_m) + brightness_b);
#ifdef QCOM2
if (!s.scene.started) {
if (Hardware::TICI() && !s.scene.started) {
clipped_brightness = BACKLIGHT_OFFROAD;
}
#endif
int brightness = brightness_filter.update(clipped_brightness);
if (!awake) {