From 10326cf5b2afb790395fd282cf4ea19edf3d7def Mon Sep 17 00:00:00 2001 From: dragonpilot Date: Thu, 23 Jan 2020 14:56:07 +1000 Subject: [PATCH] add battery level and temp to driving ui. --- selfdrive/ui/paint.cc | 119 ++++++++++++++++++++---------------------- selfdrive/ui/ui.cc | 11 +++- selfdrive/ui/ui.hpp | 3 ++ 3 files changed, 71 insertions(+), 62 deletions(-) diff --git a/selfdrive/ui/paint.cc b/selfdrive/ui/paint.cc index a09c6a516..076afdf92 100644 --- a/selfdrive/ui/paint.cc +++ b/selfdrive/ui/paint.cc @@ -790,78 +790,75 @@ static void ui_draw_infobar(UIState *s) { int ui_viz_rx = scene->ui_viz_rx; bool hasSidebar = !s->scene.uilayout_sidebarcollapsed; // rect_w = screen_width - sidebar width - int rect_w = vwp_w - (hasSidebar? sbr_w : 0); - if (s->dragon_driving_ui) { - // if driving ui is enabled, rect_w = rect_w - vision start x - small boarder - rect_w = rect_w - ui_viz_rx - bdr_s; - } + + int rect_w = vwp_w - ui_viz_rx - bdr_s; int rect_h = 80; // rect_x = 0 + sidebar width - int rect_x = 0; - if (s->dragon_driving_ui) { - // if driving ui is enabled, rect_x = rect_x + vision start x - rect_x = rect_x + (hasSidebar? sbr_w : 0) + ui_viz_rx; - } + + // if driving ui is enabled, rect_x = rect_x + vision start x + int rect_x = (hasSidebar? (bdr_s+sbr_w) : ui_viz_rx); + // rect_y = screen height - board - background height int rect_y = vwp_h - bdr_s - rect_h; // int text_width; - int text_x = rect_w / 2; - if (s->dragon_driving_ui) { - text_x = text_x + (hasSidebar? sbr_w : 0) + ui_viz_rx; - } + int text_x = rect_w / 2 + ui_viz_rx; int text_y = rect_y + 55; - // Get local time to display - char infobar[68]; - time_t t = time(NULL); - struct tm tm = *localtime(&t); + char infobar[100]; + // create time string + char date_time[17]; + time_t rawtime = time(NULL); + struct tm timeinfo; + localtime_r(&rawtime, &timeinfo); + strftime(date_time, sizeof(date_time),"%D %T", &timeinfo); + + // Create temp string + char temp[6]; + snprintf(temp, sizeof(temp), "%02.0f°C", s->scene.pa0); + + // create battery percentage string + char battery[4]; + snprintf(battery, sizeof(battery), "%02d%%", s->scene.batteryPercent); if (s->dragon_ui_dev_mini) { - char rel_steer[9]; - snprintf(rel_steer, sizeof(rel_steer), "%s%05.1f°", s->scene.angleSteers < 0? "-" : "+", fabs(s->scene.angleSteers)); + 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), "%7s", "N/A"); - } + 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), "%7s", "-"); + } + 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), "%7s", "-"); + } - 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), "%7s", "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 - ); + snprintf( + infobar, + sizeof(infobar), + "%s /TMP: %s /BAT: %s /REL: %s /DES: %s /DIS: %s", + date_time, + temp, + battery, + rel_steer, + des_steer, + lead_dist + ); } else { - snprintf( - infobar, - sizeof(infobar), - "%04d/%02d/%02d %02d:%02d:%02d", - tm.tm_year + 1900, - tm.tm_mon + 1, - tm.tm_mday, - tm.tm_hour, - tm.tm_min, - tm.tm_sec - ); + snprintf( + infobar, + sizeof(infobar), + "%s /TMP: %s /BAT: %s", + date_time, + temp, + battery + ); } nvgBeginPath(s->vg); @@ -869,7 +866,7 @@ static void ui_draw_infobar(UIState *s) { nvgFillColor(s->vg, nvgRGBA(0, 0, 0, 180)); nvgFill(s->vg); - nvgFontSize(s->vg, hasSidebar? 40:50); + nvgFontSize(s->vg, hasSidebar? 35:42); nvgFontFace(s->vg, "courbd"); nvgFillColor(s->vg, nvgRGBA(255, 255, 255, 180)); nvgTextAlign(s->vg, NVG_ALIGN_CENTER); @@ -1096,7 +1093,7 @@ static void ui_draw_vision_footer(UIState *s) { if (s->dragon_ui_dev) { ui_draw_bbui(s); } - if (s->dragon_ui_dev_mini || s->dragon_enable_dashcam) { + if (s->dragon_ui_dev_mini || s->dragon_enable_dashcam || s->dragon_waze_mode) { ui_draw_infobar(s); } } @@ -1181,8 +1178,8 @@ static void ui_draw_vision(UIState *s) { nvgBeginFrame(s->vg, s->fb_w, s->fb_h, 1.0f); nvgSave(s->vg); + // Draw augmented elements if (s->dragon_driving_ui) { - // Draw augmented elements const int inner_height = viz_w*9/16; nvgScissor(s->vg, ui_viz_rx, box_y, ui_viz_rw, box_h); nvgTranslate(s->vg, ui_viz_rx+ui_viz_ro, box_y + (box_h-inner_height)/2.0); diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 8685d341e..b8740e01e 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -113,6 +113,7 @@ static void ui_init(UIState *s) { s->livecalibration_sock = SubSocket::create(s->ctx, "liveCalibration"); s->radarstate_sock = SubSocket::create(s->ctx, "radarState"); s->carstate_sock = SubSocket::create(s->ctx, "carState"); + s->thermal_sock = SubSocket::create(s->ctx, "thermal"); assert(s->model_sock != NULL); assert(s->controlsstate_sock != NULL); @@ -120,6 +121,7 @@ static void ui_init(UIState *s) { assert(s->livecalibration_sock != NULL); assert(s->radarstate_sock != NULL); assert(s->carstate_sock != NULL); + assert(s->thermal_sock != NULL); s->poller = Poller::create({ s->model_sock, @@ -127,7 +129,8 @@ static void ui_init(UIState *s) { s->uilayout_sock, s->livecalibration_sock, s->radarstate_sock, - s->carstate_sock + s->carstate_sock, + s->thermal_sock }); #ifdef SHOW_SPEEDLIMIT @@ -481,6 +484,12 @@ void handle_message(UIState *s, Message * msg) { } s->scene.leftBlinker = datad.leftBlinker; s->scene.rightBlinker = datad.rightBlinker; + } else if (eventd.which == cereal_Event_thermal) { + struct cereal_ThermalData datad; + cereal_read_ThermalData(&datad, eventd.thermal); + + s->scene.batteryPercent = datad.batteryPercent; + s->scene.pa0 = datad.pa0; } capn_free(&ctx); } diff --git a/selfdrive/ui/ui.hpp b/selfdrive/ui/ui.hpp index 0f09c4e16..8b63cdd35 100644 --- a/selfdrive/ui/ui.hpp +++ b/selfdrive/ui/ui.hpp @@ -122,6 +122,8 @@ typedef struct UIScene { // for minimal UI float angleSteersDes; float angleSteers; + float pa0; + int batteryPercent; // for blinker, from kegman bool leftBlinker; @@ -255,6 +257,7 @@ typedef struct UIState { // dragonpilot SubSocket *carstate_sock; + SubSocket *thermal_sock; int dragon_ui_speed_timeout; int dragon_ui_event_timeout; int dragon_ui_maxspeed_timeout;