From e2d77db22a16565310a08edac77dcf92b060ac68 Mon Sep 17 00:00:00 2001 From: Rick Lan Date: Thu, 27 Jun 2019 14:49:59 +1000 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=20minimal=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- selfdrive/ui/ui.c | 81 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 4 deletions(-) diff --git a/selfdrive/ui/ui.c b/selfdrive/ui/ui.c index d5bd98b42..5d04d6c9f 100644 --- a/selfdrive/ui/ui.c +++ b/selfdrive/ui/ui.c @@ -35,6 +35,7 @@ #include "cereal/gen/c/log.capnp.h" #include "slplay.h" +#include #define STATUS_STOPPED 0 #define STATUS_DISENGAGED 1 @@ -164,6 +165,11 @@ typedef struct UIScene { bool gps_planner_active; bool is_playing_alert; + + // for minimal UI + float angleSteersDes; + float angleSteers; + } UIScene; typedef struct { @@ -1411,13 +1417,76 @@ static void ui_draw_vision_header(UIState *s) { nvgRect(s->vg, ui_viz_rx, box_y, ui_viz_rw, header_h); nvgFill(s->vg); - ui_draw_vision_maxspeed(s); + //ui_draw_vision_maxspeed(s); #ifdef SHOW_SPEEDLIMIT ui_draw_vision_speedlimit(s); #endif ui_draw_vision_speed(s); - ui_draw_vision_event(s); + //ui_draw_vision_event(s); +} + +static void ui_draw_infobar(UIState *s) { + // timestamp from pjlao307 dashcam (https://github.com/pjlao307) + int rect_w = 1440; // 1920 * 0.75 + int rect_h = 50; + int rect_x = (1920-rect_w)/2; + int rect_y = (1080-rect_h-50); + int sidebar_offset = 0; + bool hasSidebar = !s->scene.uilayout_sidebarcollapsed; + if (hasSidebar) { + sidebar_offset = 100; + } + + + // Get local time to display + char infobar[68]; + time_t t = time(NULL); + struct tm tm = *localtime(&t); + + char rel_steer[9]; + snprintf(rel_steer, sizeof(rel_steer), "%s%05.1f°", s->scene.angleSteers < 0? "-" : "+", fabs(s->scene.angleSteers)); + + char des_steer[9]; + if (s->scene.engaged) { + snprintf(des_steer, sizeof(des_steer), "%s%05.1f°", s->scene.angleSteersDes < 0? "-" : "+", fabs(s->scene.angleSteersDes)); + } else { + snprintf(des_steer, sizeof(des_steer), "%6s", "N/A"); + } + + + char lead_dist[8]; + if (s->scene.lead_status) { + snprintf(lead_dist, sizeof(lead_dist), "%06.2fm", s->scene.lead_d_rel); + } else { + snprintf(lead_dist, sizeof(lead_dist), "%6s", "N/A"); + } + + + snprintf( + infobar, + sizeof(infobar), + "%04d/%02d/%02d %02d:%02d:%02d | REL: %s | DES: %s | DIST: %s", + tm.tm_year + 1900, + tm.tm_mon + 1, + tm.tm_mday, + tm.tm_hour, + tm.tm_min, + tm.tm_sec, + rel_steer, + des_steer, + lead_dist + ); + + nvgBeginPath(s->vg); + nvgRoundedRect(s->vg, rect_x + sidebar_offset, rect_y, rect_w, rect_h, 15); + nvgFillColor(s->vg, nvgRGBA(0, 0, 0, 100)); + nvgFill(s->vg); + + nvgFontSize(s->vg, 40); + nvgFontFace(s->vg, "courbd"); + nvgFillColor(s->vg, nvgRGBA(255, 255, 255, 175)); + nvgText(s->vg, rect_x + 720 + sidebar_offset, rect_y + 35, infobar, NULL); } static void ui_draw_vision_footer(UIState *s) { @@ -1428,11 +1497,12 @@ static void ui_draw_vision_footer(UIState *s) { nvgBeginPath(s->vg); nvgRect(s->vg, ui_viz_rx, footer_y, ui_viz_rw, footer_h); - ui_draw_vision_face(s); + //ui_draw_vision_face(s); #ifdef SHOW_SPEEDLIMIT ui_draw_vision_map(s); #endif + ui_draw_infobar(s); } static void ui_draw_vision_alert(UIState *s, int va_size, int va_color, @@ -1849,6 +1919,9 @@ static void ui_update(UIState *s) { s->scene.v_curvature = datad.vCurvature; s->scene.decel_for_turn = datad.decelForTurn; + s->scene.angleSteers = datad.angleSteers; + s->scene.angleSteersDes = datad.angleSteersDes; + if (datad.alertSound.str && datad.alertSound.str[0] != '\0' && strcmp(s->alert_type, datad.alertType.str) != 0) { char* error = NULL; if (s->alert_sound[0] != '\0') { @@ -2348,4 +2421,4 @@ int main(int argc, char* argv[]) { assert(err == 0); return 0; -} +} \ No newline at end of file