From c2a58198af23dce818d655656345136fd4725e31 Mon Sep 17 00:00:00 2001 From: egisz Date: Thu, 5 Aug 2021 08:28:59 +0300 Subject: [PATCH 01/15] adapt vehicle page for bmw f10 --- include/obd/decoders.hpp | 8 +++++--- src/app/pages/vehicle.cpp | 2 +- src/canbus/elm327.cpp | 2 +- src/obd/command.cpp | 8 ++++---- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/include/obd/decoders.hpp b/include/obd/decoders.hpp index 4bbe8199..c4a6d157 100644 --- a/include/obd/decoders.hpp +++ b/include/obd/decoders.hpp @@ -4,11 +4,13 @@ double percentage(Response resp) { return (100.0 / 255.0) * (int)resp.data.at(0); } -double temp(Response resp) { return (int)resp.data.at(0) - 40; } +double temp(Response resp) { return (int)resp.data.at(0) - 48; } -double rpm(Response resp) { return ((256.0 * (int)resp.data.at(0)) + (int)resp.data.at(1)) / 4.0; } +double torque(Response resp) { return ((256.0 * (int)resp.data.at(2)) + (int)resp.data.at(1)) / 32.0; } -double speed(Response resp) { return (int)resp.data.at(0); } +double rpm(Response resp) { return ((256.0 * (int)resp.data.at(5)) + (int)resp.data.at(4)) / 4.0; } + +double speed(Response resp) { return ((256.0 * (int)resp.data.at(3)) + (int)resp.data.at(2)) / 100.0; } double flow(Response resp) { return ((256.0 * (int)resp.data.at(0)) + (int)resp.data.at(1)) / 100.0; } diff --git a/src/app/pages/vehicle.cpp b/src/app/pages/vehicle.cpp index cbeddba6..fae5f97b 100644 --- a/src/app/pages/vehicle.cpp +++ b/src/app/pages/vehicle.cpp @@ -385,7 +385,7 @@ QWidget *DataTab::engine_load_widget() unit_font.setItalic(true); Gauge *engine_load = - new Gauge({"%", "%"}, value_font, unit_font, Gauge::RIGHT, + new Gauge({"Nm", "Nm"}, value_font, unit_font, Gauge::RIGHT, 500, {cmds.LOAD}, 1, [](double x, bool _) { return x; }, widget); layout->addWidget(engine_load); this->gauges.push_back(engine_load); diff --git a/src/canbus/elm327.cpp b/src/canbus/elm327.cpp index d22e0c34..1ac58661 100755 --- a/src/canbus/elm327.cpp +++ b/src/canbus/elm327.cpp @@ -141,7 +141,7 @@ QCanBusFrame elm327::receive() retFrame->setFrameId(0x7E8); QByteArray payload = QByteArray::fromHex("0000000000000000"); - for( std::vector::size_type i=0; i < resp_str.length()/2; i++){ + for( uint i=0; i < resp_str.length()/2; i++){ payload[i+1] = std::stoi(resp_str.substr(2*i, 2), nullptr, 16); } payload[0] = resp_str.length()/2; diff --git a/src/obd/command.cpp b/src/obd/command.cpp index a0788edb..5081c1aa 100644 --- a/src/obd/command.cpp +++ b/src/obd/command.cpp @@ -1,9 +1,9 @@ #include "obd/command.hpp" #include "obd/decoders.hpp" -Commands cmds = {{"Calculated Engine Load", QCanBusFrame(0x7df, QByteArray::fromHex("0201040000000000")), percentage}, - {"Engine Coolant Temperature", QCanBusFrame(0x7df, QByteArray::fromHex("0201050000000000")), temp}, - {"Engine Revolutions Per Minute (RPM)", QCanBusFrame(0x7df, QByteArray::fromHex("02010C0000000000")), rpm}, - {"Vehicle Speed", QCanBusFrame(0x7df, QByteArray::fromHex("02010D0000000000")), speed}, +Commands cmds = {{"Torque", QCanBusFrame(0xa8, QByteArray::fromHex("0201040000000000")), torque}, + {"Engine Coolant Temperature", QCanBusFrame(0x1d0, QByteArray::fromHex("0201050000000000")), temp}, + {"Engine Revolutions Per Minute (RPM)", QCanBusFrame(0xaa, QByteArray::fromHex("02010C0000000000")), rpm}, + {"Vehicle Speed", QCanBusFrame(0x1a1, QByteArray::fromHex("02010D0000000000")), speed}, {"Intake Air Temperature", QCanBusFrame(0x7df, QByteArray::fromHex("02010F0000000000")), temp}, {"Mass Air Flow (MAF) Rate", QCanBusFrame(0x7df, QByteArray::fromHex("0201100000000000")), flow}}; From bdb3918f83d280483d480f0508dc8008bdbd7f8f Mon Sep 17 00:00:00 2001 From: egisz Date: Thu, 5 Aug 2021 10:52:19 +0300 Subject: [PATCH 02/15] fix RPM for Fxx model --- include/obd/decoders.hpp | 2 +- src/obd/command.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/obd/decoders.hpp b/include/obd/decoders.hpp index c4a6d157..d86a81ba 100644 --- a/include/obd/decoders.hpp +++ b/include/obd/decoders.hpp @@ -8,7 +8,7 @@ double temp(Response resp) { return (int)resp.data.at(0) - 48; } double torque(Response resp) { return ((256.0 * (int)resp.data.at(2)) + (int)resp.data.at(1)) / 32.0; } -double rpm(Response resp) { return ((256.0 * (int)resp.data.at(5)) + (int)resp.data.at(4)) / 4.0; } +double rpm(Response resp) { return ((256.0 * (int)resp.data.at(6)) + (int)resp.data.at(5)) / 4.0; } double speed(Response resp) { return ((256.0 * (int)resp.data.at(3)) + (int)resp.data.at(2)) / 100.0; } diff --git a/src/obd/command.cpp b/src/obd/command.cpp index 5081c1aa..5a858df5 100644 --- a/src/obd/command.cpp +++ b/src/obd/command.cpp @@ -3,7 +3,7 @@ Commands cmds = {{"Torque", QCanBusFrame(0xa8, QByteArray::fromHex("0201040000000000")), torque}, {"Engine Coolant Temperature", QCanBusFrame(0x1d0, QByteArray::fromHex("0201050000000000")), temp}, - {"Engine Revolutions Per Minute (RPM)", QCanBusFrame(0xaa, QByteArray::fromHex("02010C0000000000")), rpm}, + {"Engine Revolutions Per Minute (RPM)", QCanBusFrame(0x0a5, QByteArray::fromHex("02010C0000000000")), rpm}, {"Vehicle Speed", QCanBusFrame(0x1a1, QByteArray::fromHex("02010D0000000000")), speed}, {"Intake Air Temperature", QCanBusFrame(0x7df, QByteArray::fromHex("02010F0000000000")), temp}, {"Mass Air Flow (MAF) Rate", QCanBusFrame(0x7df, QByteArray::fromHex("0201100000000000")), flow}}; From e3b34a56d396689770339f50183137a15d85f321 Mon Sep 17 00:00:00 2001 From: egisz Date: Thu, 5 Aug 2021 17:32:42 +0300 Subject: [PATCH 03/15] refactor vehicle page move data capture to plugin; subscribe and update gauges listening to arbiter --- include/app/arbiter.hpp | 2 ++ include/app/pages/vehicle.hpp | 11 ++++--- src/app/arbiter.cpp | 5 ++++ src/app/pages/vehicle.cpp | 55 ++++++++++++++++++++++++----------- 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/include/app/arbiter.hpp b/include/app/arbiter.hpp index 37c933c3..e30a4b67 100644 --- a/include/app/arbiter.hpp +++ b/include/app/arbiter.hpp @@ -39,6 +39,7 @@ class Arbiter : public QObject { void set_action(Action *action, QString key); void send_openauto_button_press(aasdk::proto::enums::ButtonCode::Enum buttonCode, openauto::projection::WheelDirection wheelDirection = openauto::projection::WheelDirection::NONE); void send_openauto_full_screen(bool fullscreen = true); + void send_vehicle_data(QString gauge_id, int value); QMainWindow *window() { return this->window_; } QSettings &settings() { return this->session_.settings_; } @@ -68,4 +69,5 @@ class Arbiter : public QObject { void action_changed(Action *action, QString key); void openauto_button_press(aasdk::proto::enums::ButtonCode::Enum buttonCode, openauto::projection::WheelDirection wheelDirection); void openauto_full_screen(bool fullscreen); + void vehicle_update_data(QString gauge_id, int value); }; diff --git a/include/app/pages/vehicle.hpp b/include/app/pages/vehicle.hpp index b9e912ca..63439536 100644 --- a/include/app/pages/vehicle.hpp +++ b/include/app/pages/vehicle.hpp @@ -23,12 +23,14 @@ class Gauge : public QWidget { public: enum Orientation { BOTTOM, RIGHT }; - Gauge(units_t units, QFont value_font, QFont unit_font, Orientation orientation, int rate, + Gauge(QString id, units_t units, QFont value_font, QFont unit_font, Orientation orientation, int rate, std::vector cmds, int precision, obd_decoder_t decoder, QWidget *parent = nullptr); - inline void start() { this->timer->start(this->rate); } - inline void stop() { this->timer->stop(); } + // inline void start() { this->timer->start(this->rate); } + // inline void stop() { this->timer->stop(); } + inline QString get_id() { return this->id; }; void can_callback(QByteArray payload); + void set_value(int value); private: QString format_value(double value); @@ -38,10 +40,11 @@ class Gauge : public QWidget { obd_decoder_t decoder; std::vector cmds; + QString id; bool si; int rate; int precision; - QTimer *timer; + // QTimer *timer; signals: void toggle_unit(bool si); diff --git a/src/app/arbiter.cpp b/src/app/arbiter.cpp index eaf99cc7..f952fd7d 100644 --- a/src/app/arbiter.cpp +++ b/src/app/arbiter.cpp @@ -199,3 +199,8 @@ void Arbiter::send_openauto_full_screen(bool fullscreen) { emit openauto_full_screen(fullscreen); } + +void Arbiter::send_vehicle_data(QString gauge_id, int value) +{ + emit vehicle_update_data(gauge_id, value); +} diff --git a/src/app/pages/vehicle.cpp b/src/app/pages/vehicle.cpp index fae5f97b..8cc0748f 100644 --- a/src/app/pages/vehicle.cpp +++ b/src/app/pages/vehicle.cpp @@ -8,19 +8,20 @@ #include "canbus/elm327.hpp" #include "plugins/vehicle_plugin.hpp" -Gauge::Gauge(units_t units, QFont value_font, QFont unit_font, Gauge::Orientation orientation, int rate, +Gauge::Gauge(QString id, units_t units, QFont value_font, QFont unit_font, Gauge::Orientation orientation, int rate, std::vector cmds, int precision, obd_decoder_t decoder, QWidget *parent) : QWidget(parent) { Config *config = Config::get_instance(); - ICANBus *bus = (config->get_vehicle_can_bus())?((ICANBus *)SocketCANBus::get_instance()):((ICANBus *)elm327::get_instance()); + // ICANBus *bus = (config->get_vehicle_can_bus())?((ICANBus *)SocketCANBus::get_instance()):((ICANBus *)elm327::get_instance()); using namespace std::placeholders; std::function callback = std::bind(&Gauge::can_callback, this, std::placeholders::_1); - bus->registerFrameHandler(cmds[0].frame.frameId()+0x9, callback); - DASH_LOG(info)<<"[Gauges] Registered frame handler for id "<<(cmds[0].frame.frameId()+0x9); + // bus->registerFrameHandler(cmds[0].frame.frameId(), callback); + // DASH_LOG(info)<<"[Gauges] Registered frame handler for id "<<(cmds[0].frame.frameId()); + this->id = id; this->si = config->get_si_units(); this->rate = rate; @@ -43,12 +44,12 @@ Gauge::Gauge(units_t units, QFont value_font, QFont unit_font, Gauge::Orientatio unit_label->setFont(unit_font); unit_label->setAlignment(Qt::AlignCenter); - this->timer = new QTimer(this); - connect(this->timer, &QTimer::timeout, [this, bus, cmds]() { - for (auto cmd : cmds) { - bus->writeFrame(cmd.frame); - } - }); + // this->timer = new QTimer(this); + // connect(this->timer, &QTimer::timeout, [this, bus, cmds]() { + // // for (auto cmd : cmds) { + // // bus->writeFrame(cmd.frame); + // // } + // }); connect(config, &Config::si_units_changed, [this, units, unit_label](bool si) { this->si = si; @@ -65,13 +66,19 @@ Gauge::Gauge(units_t units, QFont value_font, QFont unit_font, Gauge::Orientatio void Gauge::can_callback(QByteArray payload){ Response resp = Response(payload); + DASH_LOG(info)<<"[Gauges] can_calback: "<setText(this->format_value(this->decoder(cmd.decoder(resp), this->si))); } } } +void Gauge::set_value(int value){ + DASH_LOG(info)<<"[Gauges] set_value: "<setText(this->format_value(this->decoder(value, this->si))); +} + QString Gauge::format_value(double value) { if (this->precision == 0) @@ -249,8 +256,22 @@ DataTab::DataTab(Arbiter &arbiter, QWidget *parent) QSizePolicy sp_right(QSizePolicy::Preferred, QSizePolicy::Preferred); sp_right.setHorizontalStretch(2); engine_data->setSizePolicy(sp_right); - for (auto &gauge : this->gauges) - gauge->start(); + // for (auto &gauge : this->gauges){ + // // DASH_LOG(info)<<"[Gauges] start: "<<(gauge->get_id().toUtf8().constData()); + // gauge->start(); + // } + + connect(&this->arbiter, &Arbiter::vehicle_update_data, [this](QString gauge_id, int value){ + DASH_LOG(info)<<"[Gauges] arbiter update: "<gauges) { + // QString id = gauge->get_id(); + // DASH_LOG(info)<<"[Gauges] gauge id: " << qPrintable(gauge->get_id()); + if(gauge->get_id() == gauge_id){ + // DASH_LOG(info)<<"[Gauges] Found: "<get_id(); + gauge->set_value(value); + } + } + }); } QWidget *DataTab::speedo_tach_widget() @@ -267,7 +288,7 @@ QWidget *DataTab::speedo_tach_widget() speed_unit_font.setWeight(QFont::Light); speed_unit_font.setItalic(true); - Gauge *speed = new Gauge({"mph", "km/h"}, speed_value_font, speed_unit_font, + Gauge *speed = new Gauge("speed", {"mph", "km/h"}, speed_value_font, speed_unit_font, Gauge::BOTTOM, 100, {cmds.SPEED}, 0, [](double x, bool si) { return si ? x : kph_to_mph(x); }, widget); layout->addWidget(speed); @@ -281,7 +302,7 @@ QWidget *DataTab::speedo_tach_widget() tach_unit_font.setWeight(QFont::Light); tach_unit_font.setItalic(true); - Gauge *rpm = new Gauge({"x1000rpm", "x1000rpm"}, tach_value_font, + Gauge *rpm = new Gauge("rpm", {"x1000rpm", "x1000rpm"}, tach_value_font, tach_unit_font, Gauge::BOTTOM, 100, {cmds.RPM}, 1, [](double x, bool _) { return x / 1000.0; }, widget); layout->addWidget(rpm); @@ -354,7 +375,7 @@ QWidget *DataTab::coolant_temp_widget() unit_font.setWeight(QFont::Light); unit_font.setItalic(true); - Gauge *coolant_temp = new Gauge( + Gauge *coolant_temp = new Gauge("coolant_temp", {"°F", "°C"}, value_font, unit_font, Gauge::RIGHT, 5000, {cmds.COOLANT_TEMP}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }, widget); layout->addWidget(coolant_temp); @@ -385,7 +406,7 @@ QWidget *DataTab::engine_load_widget() unit_font.setItalic(true); Gauge *engine_load = - new Gauge({"Nm", "Nm"}, value_font, unit_font, Gauge::RIGHT, + new Gauge("torque", {"Nm", "Nm"}, value_font, unit_font, Gauge::RIGHT, 500, {cmds.LOAD}, 1, [](double x, bool _) { return x; }, widget); layout->addWidget(engine_load); this->gauges.push_back(engine_load); From c7a7865ae18ec382b0ce60b121e9f931dc960e09 Mon Sep 17 00:00:00 2001 From: egisz Date: Fri, 6 Aug 2021 11:01:08 +0300 Subject: [PATCH 04/15] revert decoders file, it should go to plugin anyway --- include/obd/decoders.hpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/include/obd/decoders.hpp b/include/obd/decoders.hpp index d86a81ba..4bbe8199 100644 --- a/include/obd/decoders.hpp +++ b/include/obd/decoders.hpp @@ -4,13 +4,11 @@ double percentage(Response resp) { return (100.0 / 255.0) * (int)resp.data.at(0); } -double temp(Response resp) { return (int)resp.data.at(0) - 48; } +double temp(Response resp) { return (int)resp.data.at(0) - 40; } -double torque(Response resp) { return ((256.0 * (int)resp.data.at(2)) + (int)resp.data.at(1)) / 32.0; } +double rpm(Response resp) { return ((256.0 * (int)resp.data.at(0)) + (int)resp.data.at(1)) / 4.0; } -double rpm(Response resp) { return ((256.0 * (int)resp.data.at(6)) + (int)resp.data.at(5)) / 4.0; } - -double speed(Response resp) { return ((256.0 * (int)resp.data.at(3)) + (int)resp.data.at(2)) / 100.0; } +double speed(Response resp) { return (int)resp.data.at(0); } double flow(Response resp) { return ((256.0 * (int)resp.data.at(0)) + (int)resp.data.at(1)) / 100.0; } From be76930492635fa6e4c3aece02ae27326ecd2980 Mon Sep 17 00:00:00 2001 From: egisz Date: Fri, 6 Aug 2021 11:11:20 +0300 Subject: [PATCH 05/15] revert commands --- src/obd/command.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/obd/command.cpp b/src/obd/command.cpp index 5a858df5..a0788edb 100644 --- a/src/obd/command.cpp +++ b/src/obd/command.cpp @@ -1,9 +1,9 @@ #include "obd/command.hpp" #include "obd/decoders.hpp" -Commands cmds = {{"Torque", QCanBusFrame(0xa8, QByteArray::fromHex("0201040000000000")), torque}, - {"Engine Coolant Temperature", QCanBusFrame(0x1d0, QByteArray::fromHex("0201050000000000")), temp}, - {"Engine Revolutions Per Minute (RPM)", QCanBusFrame(0x0a5, QByteArray::fromHex("02010C0000000000")), rpm}, - {"Vehicle Speed", QCanBusFrame(0x1a1, QByteArray::fromHex("02010D0000000000")), speed}, +Commands cmds = {{"Calculated Engine Load", QCanBusFrame(0x7df, QByteArray::fromHex("0201040000000000")), percentage}, + {"Engine Coolant Temperature", QCanBusFrame(0x7df, QByteArray::fromHex("0201050000000000")), temp}, + {"Engine Revolutions Per Minute (RPM)", QCanBusFrame(0x7df, QByteArray::fromHex("02010C0000000000")), rpm}, + {"Vehicle Speed", QCanBusFrame(0x7df, QByteArray::fromHex("02010D0000000000")), speed}, {"Intake Air Temperature", QCanBusFrame(0x7df, QByteArray::fromHex("02010F0000000000")), temp}, {"Mass Air Flow (MAF) Rate", QCanBusFrame(0x7df, QByteArray::fromHex("0201100000000000")), flow}}; From 4690d1b596737ca4e8b36bbdad678102d2d817c3 Mon Sep 17 00:00:00 2001 From: egisz Date: Fri, 6 Aug 2021 11:11:59 +0300 Subject: [PATCH 06/15] remove CAN related code --- include/app/pages/vehicle.hpp | 4 ---- src/app/pages/vehicle.cpp | 28 ---------------------------- 2 files changed, 32 deletions(-) diff --git a/include/app/pages/vehicle.hpp b/include/app/pages/vehicle.hpp index 63439536..ae6dd1c6 100644 --- a/include/app/pages/vehicle.hpp +++ b/include/app/pages/vehicle.hpp @@ -26,10 +26,7 @@ class Gauge : public QWidget { Gauge(QString id, units_t units, QFont value_font, QFont unit_font, Orientation orientation, int rate, std::vector cmds, int precision, obd_decoder_t decoder, QWidget *parent = nullptr); - // inline void start() { this->timer->start(this->rate); } - // inline void stop() { this->timer->stop(); } inline QString get_id() { return this->id; }; - void can_callback(QByteArray payload); void set_value(int value); private: @@ -44,7 +41,6 @@ class Gauge : public QWidget { bool si; int rate; int precision; - // QTimer *timer; signals: void toggle_unit(bool si); diff --git a/src/app/pages/vehicle.cpp b/src/app/pages/vehicle.cpp index 8cc0748f..9ef8f902 100644 --- a/src/app/pages/vehicle.cpp +++ b/src/app/pages/vehicle.cpp @@ -13,13 +13,6 @@ Gauge::Gauge(QString id, units_t units, QFont value_font, QFont unit_font, Gauge : QWidget(parent) { Config *config = Config::get_instance(); - // ICANBus *bus = (config->get_vehicle_can_bus())?((ICANBus *)SocketCANBus::get_instance()):((ICANBus *)elm327::get_instance()); - - using namespace std::placeholders; - std::function callback = std::bind(&Gauge::can_callback, this, std::placeholders::_1); - - // bus->registerFrameHandler(cmds[0].frame.frameId(), callback); - // DASH_LOG(info)<<"[Gauges] Registered frame handler for id "<<(cmds[0].frame.frameId()); this->id = id; this->si = config->get_si_units(); @@ -44,13 +37,6 @@ Gauge::Gauge(QString id, units_t units, QFont value_font, QFont unit_font, Gauge unit_label->setFont(unit_font); unit_label->setAlignment(Qt::AlignCenter); - // this->timer = new QTimer(this); - // connect(this->timer, &QTimer::timeout, [this, bus, cmds]() { - // // for (auto cmd : cmds) { - // // bus->writeFrame(cmd.frame); - // // } - // }); - connect(config, &Config::si_units_changed, [this, units, unit_label](bool si) { this->si = si; unit_label->setText(this->si ? units.second : units.first); @@ -64,16 +50,6 @@ Gauge::Gauge(QString id, units_t units, QFont value_font, QFont unit_font, Gauge layout->addStretch(4); } -void Gauge::can_callback(QByteArray payload){ - Response resp = Response(payload); - DASH_LOG(info)<<"[Gauges] can_calback: "<setText(this->format_value(this->decoder(cmd.decoder(resp), this->si))); - } - } -} - void Gauge::set_value(int value){ DASH_LOG(info)<<"[Gauges] set_value: "<setText(this->format_value(this->decoder(value, this->si))); @@ -256,10 +232,6 @@ DataTab::DataTab(Arbiter &arbiter, QWidget *parent) QSizePolicy sp_right(QSizePolicy::Preferred, QSizePolicy::Preferred); sp_right.setHorizontalStretch(2); engine_data->setSizePolicy(sp_right); - // for (auto &gauge : this->gauges){ - // // DASH_LOG(info)<<"[Gauges] start: "<<(gauge->get_id().toUtf8().constData()); - // gauge->start(); - // } connect(&this->arbiter, &Arbiter::vehicle_update_data, [this](QString gauge_id, int value){ DASH_LOG(info)<<"[Gauges] arbiter update: "< Date: Fri, 6 Aug 2021 14:10:48 +0300 Subject: [PATCH 07/15] move gauges settings to config file --- include/app/pages/vehicle.hpp | 6 ++---- include/obd/command.hpp | 8 ++++++-- src/app/pages/vehicle.cpp | 37 ++++++++++++++--------------------- src/obd/command.cpp | 13 ++++++------ 4 files changed, 30 insertions(+), 34 deletions(-) diff --git a/include/app/pages/vehicle.hpp b/include/app/pages/vehicle.hpp index ae6dd1c6..3289109e 100644 --- a/include/app/pages/vehicle.hpp +++ b/include/app/pages/vehicle.hpp @@ -23,8 +23,7 @@ class Gauge : public QWidget { public: enum Orientation { BOTTOM, RIGHT }; - Gauge(QString id, units_t units, QFont value_font, QFont unit_font, Orientation orientation, int rate, - std::vector cmds, int precision, obd_decoder_t decoder, QWidget *parent = nullptr); + Gauge(Command cmd, QFont value_font, QFont unit_font, Orientation orientation, QWidget *parent = nullptr); inline QString get_id() { return this->id; }; void set_value(int value); @@ -35,12 +34,11 @@ class Gauge : public QWidget { QLabel *value_label; obd_decoder_t decoder; - std::vector cmds; QString id; bool si; - int rate; int precision; + units_t units; signals: void toggle_unit(bool si); diff --git a/include/obd/command.hpp b/include/obd/command.hpp index b0ed59cc..fe61ae6c 100644 --- a/include/obd/command.hpp +++ b/include/obd/command.hpp @@ -5,10 +5,14 @@ #include #include "obd/message.hpp" +typedef QPair units_t; + struct Command { + QString id; std::string description; - QCanBusFrame frame; - std::function decoder; + units_t units; + int precision; + std::function decoder; }; struct Commands { diff --git a/src/app/pages/vehicle.cpp b/src/app/pages/vehicle.cpp index 9ef8f902..603dd82c 100644 --- a/src/app/pages/vehicle.cpp +++ b/src/app/pages/vehicle.cpp @@ -4,24 +4,21 @@ #include "app/config.hpp" #include "app/pages/vehicle.hpp" #include "app/window.hpp" -#include "obd/conversions.hpp" #include "canbus/elm327.hpp" #include "plugins/vehicle_plugin.hpp" -Gauge::Gauge(QString id, units_t units, QFont value_font, QFont unit_font, Gauge::Orientation orientation, int rate, - std::vector cmds, int precision, obd_decoder_t decoder, QWidget *parent) +Gauge::Gauge(Command cmd, QFont value_font, QFont unit_font, Gauge::Orientation orientation, QWidget *parent) : QWidget(parent) { Config *config = Config::get_instance(); - this->id = id; + this->id = cmd.id; this->si = config->get_si_units(); - this->rate = rate; - this->precision = precision; + this->precision = cmd.precision; - this->cmds = cmds; - this->decoder = decoder; + this->units = cmd.units; + this->decoder = cmd.decoder; QBoxLayout *layout; if (orientation == BOTTOM) @@ -33,13 +30,13 @@ Gauge::Gauge(QString id, units_t units, QFont value_font, QFont unit_font, Gauge value_label->setFont(value_font); value_label->setAlignment(Qt::AlignCenter); - QLabel *unit_label = new QLabel(this->si ? units.second : units.first, this); + QLabel *unit_label = new QLabel(this->si ? this->units.second : this->units.first, this); unit_label->setFont(unit_font); unit_label->setAlignment(Qt::AlignCenter); - connect(config, &Config::si_units_changed, [this, units, unit_label](bool si) { + connect(config, &Config::si_units_changed, [this, unit_label](bool si) { this->si = si; - unit_label->setText(this->si ? units.second : units.first); + unit_label->setText(this->si ? this->units.second : this->units.first); value_label->setText(this->null_value()); }); @@ -260,9 +257,8 @@ QWidget *DataTab::speedo_tach_widget() speed_unit_font.setWeight(QFont::Light); speed_unit_font.setItalic(true); - Gauge *speed = new Gauge("speed", {"mph", "km/h"}, speed_value_font, speed_unit_font, - Gauge::BOTTOM, 100, {cmds.SPEED}, 0, - [](double x, bool si) { return si ? x : kph_to_mph(x); }, widget); + Gauge *speed = new Gauge(cmds.SPEED, speed_value_font, speed_unit_font, + Gauge::BOTTOM, widget); layout->addWidget(speed); this->gauges.push_back(speed); @@ -274,9 +270,8 @@ QWidget *DataTab::speedo_tach_widget() tach_unit_font.setWeight(QFont::Light); tach_unit_font.setItalic(true); - Gauge *rpm = new Gauge("rpm", {"x1000rpm", "x1000rpm"}, tach_value_font, - tach_unit_font, Gauge::BOTTOM, 100, {cmds.RPM}, 1, - [](double x, bool _) { return x / 1000.0; }, widget); + Gauge *rpm = new Gauge(cmds.RPM, tach_value_font, + tach_unit_font, Gauge::BOTTOM, widget); layout->addWidget(rpm); this->gauges.push_back(rpm); @@ -347,9 +342,8 @@ QWidget *DataTab::coolant_temp_widget() unit_font.setWeight(QFont::Light); unit_font.setItalic(true); - Gauge *coolant_temp = new Gauge("coolant_temp", - {"°F", "°C"}, value_font, unit_font, Gauge::RIGHT, 5000, - {cmds.COOLANT_TEMP}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }, widget); + Gauge *coolant_temp = new Gauge(cmds.COOLANT_TEMP, + value_font, unit_font, Gauge::RIGHT, widget); layout->addWidget(coolant_temp); this->gauges.push_back(coolant_temp); @@ -378,8 +372,7 @@ QWidget *DataTab::engine_load_widget() unit_font.setItalic(true); Gauge *engine_load = - new Gauge("torque", {"Nm", "Nm"}, value_font, unit_font, Gauge::RIGHT, - 500, {cmds.LOAD}, 1, [](double x, bool _) { return x; }, widget); + new Gauge(cmds.LOAD, value_font, unit_font, Gauge::RIGHT, widget); layout->addWidget(engine_load); this->gauges.push_back(engine_load); diff --git a/src/obd/command.cpp b/src/obd/command.cpp index a0788edb..33c7c847 100644 --- a/src/obd/command.cpp +++ b/src/obd/command.cpp @@ -1,9 +1,10 @@ #include "obd/command.hpp" #include "obd/decoders.hpp" +#include "obd/conversions.hpp" -Commands cmds = {{"Calculated Engine Load", QCanBusFrame(0x7df, QByteArray::fromHex("0201040000000000")), percentage}, - {"Engine Coolant Temperature", QCanBusFrame(0x7df, QByteArray::fromHex("0201050000000000")), temp}, - {"Engine Revolutions Per Minute (RPM)", QCanBusFrame(0x7df, QByteArray::fromHex("02010C0000000000")), rpm}, - {"Vehicle Speed", QCanBusFrame(0x7df, QByteArray::fromHex("02010D0000000000")), speed}, - {"Intake Air Temperature", QCanBusFrame(0x7df, QByteArray::fromHex("02010F0000000000")), temp}, - {"Mass Air Flow (MAF) Rate", QCanBusFrame(0x7df, QByteArray::fromHex("0201100000000000")), flow}}; +Commands cmds = {{"load", "Calculated Engine Load", {"%", "%"}, 1, [](double x, bool _) { return x; }}, + {"coolant_temp", "Engine Coolant Temperature", {"°F", "°C"}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }}, + {"rpm", "Engine Revolutions Per Minute (RPM)", {"x1000rpm", "x1000rpm"}, 1, [](double x, bool _) { return x / 1000.0; }}, + {"speed", "Vehicle Speed", {"mph", "km/h"}, 0, [](double x, bool si) { return si ? x : kph_to_mph(x); }}, + {"intake_temp", "Intake Air Temperature", {"°F", "°C"}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }}, + {"maf_rate", "Mass Air Flow (MAF) Rate", {"g/s", "g/s"}, 1, [](double x, bool si) { return x; }}}; From e0025580c47f490ee9f2e48f51733847b2c33d59 Mon Sep 17 00:00:00 2001 From: egisz Date: Fri, 6 Aug 2021 15:02:50 +0300 Subject: [PATCH 08/15] combine all gauge widgets to one method --- include/app/pages/vehicle.hpp | 3 +- include/obd/command.hpp | 8 +++- src/app/pages/vehicle.cpp | 84 ++++++++--------------------------- src/obd/command.cpp | 12 ++--- 4 files changed, 32 insertions(+), 75 deletions(-) diff --git a/include/app/pages/vehicle.hpp b/include/app/pages/vehicle.hpp index 3289109e..60a92547 100644 --- a/include/app/pages/vehicle.hpp +++ b/include/app/pages/vehicle.hpp @@ -79,8 +79,7 @@ class DataTab : public QWidget { QWidget *speedo_tach_widget(); // QWidget *mileage_data_widget(); QWidget *engine_data_widget(); - QWidget *coolant_temp_widget(); - QWidget *engine_load_widget(); + QWidget *vehicle_data_widget(Command cfg); std::vector gauges; }; diff --git a/include/obd/command.hpp b/include/obd/command.hpp index fe61ae6c..1d77fa49 100644 --- a/include/obd/command.hpp +++ b/include/obd/command.hpp @@ -6,11 +6,17 @@ #include "obd/message.hpp" typedef QPair units_t; +struct font_size_t { + int label; + int value; + int unit; +}; struct Command { QString id; - std::string description; + QString description; units_t units; + font_size_t font_size; int precision; std::function decoder; }; diff --git a/src/app/pages/vehicle.cpp b/src/app/pages/vehicle.cpp index 603dd82c..284628a1 100644 --- a/src/app/pages/vehicle.cpp +++ b/src/app/pages/vehicle.cpp @@ -250,31 +250,9 @@ QWidget *DataTab::speedo_tach_widget() layout->setContentsMargins(0, 0, 0, 0); layout->addStretch(3); - - QFont speed_value_font(this->arbiter.forge().font(36, true)); - - QFont speed_unit_font(this->arbiter.forge().font(16)); - speed_unit_font.setWeight(QFont::Light); - speed_unit_font.setItalic(true); - - Gauge *speed = new Gauge(cmds.SPEED, speed_value_font, speed_unit_font, - Gauge::BOTTOM, widget); - layout->addWidget(speed); - this->gauges.push_back(speed); - + layout->addWidget(this->vehicle_data_widget(cmds.SPEED)); layout->addStretch(2); - - QFont tach_value_font(this->arbiter.forge().font(24, true)); - - QFont tach_unit_font(this->arbiter.forge().font(12)); - tach_unit_font.setWeight(QFont::Light); - tach_unit_font.setItalic(true); - - Gauge *rpm = new Gauge(cmds.RPM, tach_value_font, - tach_unit_font, Gauge::BOTTOM, widget); - layout->addWidget(rpm); - this->gauges.push_back(rpm); - + layout->addWidget(this->vehicle_data_widget(cmds.RPM)); layout->addStretch(1); return widget; @@ -319,69 +297,43 @@ QWidget *DataTab::engine_data_widget() layout->setSpacing(0); layout->addStretch(); - layout->addWidget(this->coolant_temp_widget()); + layout->addWidget(this->vehicle_data_widget(cmds.COOLANT_TEMP)); layout->addStretch(); layout->addWidget(Session::Forge::br()); layout->addStretch(); - layout->addWidget(this->engine_load_widget()); + layout->addWidget(this->vehicle_data_widget(cmds.LOAD)); layout->addStretch(); return widget; } -QWidget *DataTab::coolant_temp_widget() +QWidget *DataTab::vehicle_data_widget(Command cfg) { QWidget *widget = new QWidget(this); QVBoxLayout *layout = new QVBoxLayout(widget); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); - QFont value_font(this->arbiter.forge().font(16, true)); + QFont value_font(this->arbiter.forge().font(cfg.font_size.value, true)); - QFont unit_font(this->arbiter.forge().font(12)); + QFont unit_font(this->arbiter.forge().font(cfg.font_size.unit)); unit_font.setWeight(QFont::Light); unit_font.setItalic(true); - Gauge *coolant_temp = new Gauge(cmds.COOLANT_TEMP, + Gauge *gauge = new Gauge(cfg, value_font, unit_font, Gauge::RIGHT, widget); - layout->addWidget(coolant_temp); - this->gauges.push_back(coolant_temp); - - QFont label_font(this->arbiter.forge().font(10)); - label_font.setWeight(QFont::Light); - - QLabel *coolant_temp_label = new QLabel("coolant", widget); - coolant_temp_label->setFont(label_font); - coolant_temp_label->setAlignment(Qt::AlignHCenter); - layout->addWidget(coolant_temp_label); - - return widget; -} - -QWidget *DataTab::engine_load_widget() -{ - QWidget *widget = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(widget); - layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(0); - - QFont value_font(this->arbiter.forge().font(16, true)); - - QFont unit_font(this->arbiter.forge().font(12)); - unit_font.setWeight(QFont::Light); - unit_font.setItalic(true); + layout->addWidget(gauge); + this->gauges.push_back(gauge); - Gauge *engine_load = - new Gauge(cmds.LOAD, value_font, unit_font, Gauge::RIGHT, widget); - layout->addWidget(engine_load); - this->gauges.push_back(engine_load); + if (cfg.font_size.label > 0) { + QFont label_font(this->arbiter.forge().font(cfg.font_size.label)); + label_font.setWeight(QFont::Light); - QFont label_font(this->arbiter.forge().font(10)); - label_font.setWeight(QFont::Light); + QLabel *gauge_label = new QLabel(cfg.description, widget); + gauge_label->setFont(label_font); + gauge_label->setAlignment(Qt::AlignHCenter); + layout->addWidget(gauge_label); + } - QLabel *engine_load_label = new QLabel("load", widget); - engine_load_label->setFont(label_font); - engine_load_label->setAlignment(Qt::AlignHCenter); - layout->addWidget(engine_load_label); return widget; } diff --git a/src/obd/command.cpp b/src/obd/command.cpp index 33c7c847..e9d59a25 100644 --- a/src/obd/command.cpp +++ b/src/obd/command.cpp @@ -2,9 +2,9 @@ #include "obd/decoders.hpp" #include "obd/conversions.hpp" -Commands cmds = {{"load", "Calculated Engine Load", {"%", "%"}, 1, [](double x, bool _) { return x; }}, - {"coolant_temp", "Engine Coolant Temperature", {"°F", "°C"}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }}, - {"rpm", "Engine Revolutions Per Minute (RPM)", {"x1000rpm", "x1000rpm"}, 1, [](double x, bool _) { return x / 1000.0; }}, - {"speed", "Vehicle Speed", {"mph", "km/h"}, 0, [](double x, bool si) { return si ? x : kph_to_mph(x); }}, - {"intake_temp", "Intake Air Temperature", {"°F", "°C"}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }}, - {"maf_rate", "Mass Air Flow (MAF) Rate", {"g/s", "g/s"}, 1, [](double x, bool si) { return x; }}}; +Commands cmds = {{"load", "Calculated Engine Load", {"%", "%"}, {10, 16, 12}, 1, [](double x, bool _) { return x; }}, + {"coolant_temp", "Engine Coolant Temperature", {"°F", "°C"}, {10, 16, 12}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }}, + {"rpm", "Engine Revolutions Per Minute (RPM)", {"x1000rpm", "x1000rpm"}, {0, 24, 12}, 1, [](double x, bool _) { return x / 1000.0; }}, + {"speed", "Vehicle Speed", {"mph", "km/h"}, {0, 36, 16}, 0, [](double x, bool si) { return si ? x : kph_to_mph(x); }}, + {"intake_temp", "Intake Air Temperature", {"°F", "°C"}, {10, 16, 12}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }}, + {"maf_rate", "Mass Air Flow (MAF) Rate", {"g/s", "g/s"}, {10, 16, 12}, 1, [](double x, bool si) { return x; }}}; From 39098942398eaa282057785d9e254948ca880658 Mon Sep 17 00:00:00 2001 From: egisz Date: Fri, 6 Aug 2021 15:34:27 +0300 Subject: [PATCH 09/15] cleanup --- src/app/pages/vehicle.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/app/pages/vehicle.cpp b/src/app/pages/vehicle.cpp index 284628a1..53603c1c 100644 --- a/src/app/pages/vehicle.cpp +++ b/src/app/pages/vehicle.cpp @@ -48,7 +48,7 @@ Gauge::Gauge(Command cmd, QFont value_font, QFont unit_font, Gauge::Orientation } void Gauge::set_value(int value){ - DASH_LOG(info)<<"[Gauges] set_value: "<setText(this->format_value(this->decoder(value, this->si))); } @@ -231,10 +231,8 @@ DataTab::DataTab(Arbiter &arbiter, QWidget *parent) engine_data->setSizePolicy(sp_right); connect(&this->arbiter, &Arbiter::vehicle_update_data, [this](QString gauge_id, int value){ - DASH_LOG(info)<<"[Gauges] arbiter update: "<gauges) { - // QString id = gauge->get_id(); - // DASH_LOG(info)<<"[Gauges] gauge id: " << qPrintable(gauge->get_id()); if(gauge->get_id() == gauge_id){ // DASH_LOG(info)<<"[Gauges] Found: "<get_id(); gauge->set_value(value); From 210eba0a2caf176f278977934a035a0f048188aa Mon Sep 17 00:00:00 2001 From: egisz Date: Mon, 9 Aug 2021 13:37:39 +0300 Subject: [PATCH 10/15] WIP obd as plugin --- include/app/pages/vehicle.hpp | 3 +-- include/obd/command.hpp | 25 ++++++++++++++++--------- src/app/pages/vehicle.cpp | 4 ++-- src/obd/command.cpp | 32 ++++++++++++++++++++++++++------ 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/include/app/pages/vehicle.hpp b/include/app/pages/vehicle.hpp index 60a92547..4c20f6f0 100644 --- a/include/app/pages/vehicle.hpp +++ b/include/app/pages/vehicle.hpp @@ -14,7 +14,6 @@ class Arbiter; -typedef std::function obd_decoder_t; typedef QPair units_t; class Gauge : public QWidget { @@ -33,7 +32,7 @@ class Gauge : public QWidget { QString null_value(); QLabel *value_label; - obd_decoder_t decoder; + unit_converter_t converter; QString id; bool si; diff --git a/include/obd/command.hpp b/include/obd/command.hpp index 1d77fa49..6e1f15af 100644 --- a/include/obd/command.hpp +++ b/include/obd/command.hpp @@ -12,22 +12,29 @@ struct font_size_t { int unit; }; +typedef std::function unit_converter_t; +typedef std::function decoder_t; + struct Command { QString id; QString description; units_t units; font_size_t font_size; int precision; - std::function decoder; + unit_converter_t converter; + QCanBusFrame frame; + decoder_t decoder; }; -struct Commands { - Command LOAD; - Command COOLANT_TEMP; - Command RPM; - Command SPEED; - Command INTAKE_TEMP; - Command MAF; -}; + +typedef Command Commands[6]; +// struct Commands { +// Command LOAD; +// Command COOLANT_TEMP; +// Command RPM; +// Command SPEED; +// Command INTAKE_TEMP; +// Command MAF; +// }; extern Commands cmds; diff --git a/src/app/pages/vehicle.cpp b/src/app/pages/vehicle.cpp index 53603c1c..2c9b3e30 100644 --- a/src/app/pages/vehicle.cpp +++ b/src/app/pages/vehicle.cpp @@ -18,7 +18,7 @@ Gauge::Gauge(Command cmd, QFont value_font, QFont unit_font, Gauge::Orientation this->precision = cmd.precision; this->units = cmd.units; - this->decoder = cmd.decoder; + this->converter = cmd.converter; QBoxLayout *layout; if (orientation == BOTTOM) @@ -49,7 +49,7 @@ Gauge::Gauge(Command cmd, QFont value_font, QFont unit_font, Gauge::Orientation void Gauge::set_value(int value){ // DASH_LOG(info)<<"[Gauges] set_value: "<setText(this->format_value(this->decoder(value, this->si))); + value_label->setText(this->format_value(this->converter(value, this->si))); } QString Gauge::format_value(double value) diff --git a/src/obd/command.cpp b/src/obd/command.cpp index e9d59a25..56d84ba2 100644 --- a/src/obd/command.cpp +++ b/src/obd/command.cpp @@ -2,9 +2,29 @@ #include "obd/decoders.hpp" #include "obd/conversions.hpp" -Commands cmds = {{"load", "Calculated Engine Load", {"%", "%"}, {10, 16, 12}, 1, [](double x, bool _) { return x; }}, - {"coolant_temp", "Engine Coolant Temperature", {"°F", "°C"}, {10, 16, 12}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }}, - {"rpm", "Engine Revolutions Per Minute (RPM)", {"x1000rpm", "x1000rpm"}, {0, 24, 12}, 1, [](double x, bool _) { return x / 1000.0; }}, - {"speed", "Vehicle Speed", {"mph", "km/h"}, {0, 36, 16}, 0, [](double x, bool si) { return si ? x : kph_to_mph(x); }}, - {"intake_temp", "Intake Air Temperature", {"°F", "°C"}, {10, 16, 12}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }}, - {"maf_rate", "Mass Air Flow (MAF) Rate", {"g/s", "g/s"}, {10, 16, 12}, 1, [](double x, bool si) { return x; }}}; +Commands cmds = { + {"load", "Calculated Engine Load", {"%", "%"}, + {10, 16, 12}, 1, [](double x, bool _) { return x; }, + QCanBusFrame(0x7df, QByteArray::fromHex("0201040000000000")), percentage + }, + {"coolant_temp", "Engine Coolant Temperature", {"°F", "°C"}, + {10, 16, 12}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }, + QCanBusFrame(0x7df, QByteArray::fromHex("0201050000000000")), temp + }, + {"rpm", "Engine Revolutions Per Minute (RPM)", {"x1000rpm", "x1000rpm"}, + {0, 24, 12}, 1, [](double x, bool _) { return x / 1000.0; }, + QCanBusFrame(0x7df, QByteArray::fromHex("02010C0000000000")), rpm + }, + {"speed", "Vehicle Speed", {"mph", "km/h"}, + {0, 36, 16}, 0, [](double x, bool si) { return si ? x : kph_to_mph(x); }, + QCanBusFrame(0x7df, QByteArray::fromHex("02010D0000000000")), speed + }, + {"intake_temp", "Intake Air Temperature", {"°F", "°C"}, + {10, 16, 12}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }, + QCanBusFrame(0x7df, QByteArray::fromHex("02010F0000000000")), temp + }, + {"maf_rate", "Mass Air Flow (MAF) Rate", {"g/s", "g/s"}, + {10, 16, 12}, 1, [](double x, bool si) { return x; }, + QCanBusFrame(0x7df, QByteArray::fromHex("0201100000000000")), flow + } +}; From eb6c2bbbe8373a4bc350426a299baa4eec4dc4bb Mon Sep 17 00:00:00 2001 From: egisz Date: Mon, 9 Aug 2021 16:08:37 +0300 Subject: [PATCH 11/15] obd2 plugin refactoring done --- include/app/pages/vehicle.hpp | 33 ++++++++++++++++++++++---- include/obd/command.hpp | 20 ++++------------ include/obd/conversions.hpp | 11 +++++---- src/app/pages/vehicle.cpp | 44 ++++++++++++++++++++++++++--------- src/obd/command.cpp | 31 +++++------------------- 5 files changed, 80 insertions(+), 59 deletions(-) diff --git a/include/app/pages/vehicle.hpp b/include/app/pages/vehicle.hpp index 4c20f6f0..374f33ca 100644 --- a/include/app/pages/vehicle.hpp +++ b/include/app/pages/vehicle.hpp @@ -6,15 +6,40 @@ #include "canbus/socketcanbus.hpp" #include "obd/message.hpp" -#include "obd/command.hpp" +#include "obd/conversions.hpp" + #include "app/widgets/selector.hpp" #include "app/widgets/dialog.hpp" - #include "app/pages/page.hpp" class Arbiter; typedef QPair units_t; +struct font_size_t { + int label; + int value; + int unit; +}; +typedef std::function unit_converter_t; + +struct GaugeConfig { + QString id; + QString description; + units_t units; + font_size_t font_size; + int precision; + unit_converter_t converter; +}; + +// typedef QList Gauges; +struct GaugesConfig { + GaugeConfig LOAD; + GaugeConfig COOLANT_TEMP; + GaugeConfig RPM; + GaugeConfig SPEED; + GaugeConfig INTAKE_TEMP; + GaugeConfig MAF; +}; class Gauge : public QWidget { Q_OBJECT @@ -22,7 +47,7 @@ class Gauge : public QWidget { public: enum Orientation { BOTTOM, RIGHT }; - Gauge(Command cmd, QFont value_font, QFont unit_font, Orientation orientation, QWidget *parent = nullptr); + Gauge(GaugeConfig cfg, QFont value_font, QFont unit_font, Orientation orientation, QWidget *parent = nullptr); inline QString get_id() { return this->id; }; void set_value(int value); @@ -78,7 +103,7 @@ class DataTab : public QWidget { QWidget *speedo_tach_widget(); // QWidget *mileage_data_widget(); QWidget *engine_data_widget(); - QWidget *vehicle_data_widget(Command cfg); + QWidget *vehicle_data_widget(GaugeConfig cfg); std::vector gauges; }; diff --git a/include/obd/command.hpp b/include/obd/command.hpp index 6e1f15af..a0bec09b 100644 --- a/include/obd/command.hpp +++ b/include/obd/command.hpp @@ -2,32 +2,22 @@ #include #include + +#include #include #include "obd/message.hpp" -typedef QPair units_t; -struct font_size_t { - int label; - int value; - int unit; -}; - -typedef std::function unit_converter_t; typedef std::function decoder_t; struct Command { QString id; - QString description; - units_t units; - font_size_t font_size; - int precision; - unit_converter_t converter; QCanBusFrame frame; decoder_t decoder; + QTimer *timer; + int rate; }; - -typedef Command Commands[6]; +typedef QList Commands; // struct Commands { // Command LOAD; // Command COOLANT_TEMP; diff --git a/include/obd/conversions.hpp b/include/obd/conversions.hpp index 82d13f5f..b1c2e6c5 100644 --- a/include/obd/conversions.hpp +++ b/include/obd/conversions.hpp @@ -1,9 +1,12 @@ #pragma once -double kph_to_mph(double val) { return val * 0.621371; } +class Conversion { + public: + static double kph_to_mph(double val) { return val * 0.621371; }; -double c_to_f(double val) { return (val * 9 / 5) + 32; } + static double c_to_f(double val) { return (val * 9 / 5) + 32; }; -double gps_to_gph(double val) { return val * 0.0805; } + static double gps_to_gph(double val) { return val * 0.0805; }; -double gps_to_lph(double val) { return val * 3.6; } + static double gps_to_lph(double val) { return val * 3.6; }; +}; diff --git a/src/app/pages/vehicle.cpp b/src/app/pages/vehicle.cpp index 2c9b3e30..b3e9ac9c 100644 --- a/src/app/pages/vehicle.cpp +++ b/src/app/pages/vehicle.cpp @@ -7,18 +7,40 @@ #include "canbus/elm327.hpp" #include "plugins/vehicle_plugin.hpp" -Gauge::Gauge(Command cmd, QFont value_font, QFont unit_font, Gauge::Orientation orientation, QWidget *parent) +GaugesConfig gauges_cfg = +{ + {"load", "Calculated Engine Load", {"%", "%"}, + {10, 16, 12}, 1, [](double x, bool _) { return x; } + }, + {"coolant_temp", "Engine Coolant Temperature", {"°F", "°C"}, + {10, 16, 12}, 1, [](double x, bool si) { return si ? x : Conversion::c_to_f(x); } + }, + {"rpm", "Engine Revolutions Per Minute (RPM)", {"x1000rpm", "x1000rpm"}, + {0, 24, 12}, 1, [](double x, bool _) { return x / 1000.0; } + }, + {"speed", "Vehicle Speed", {"mph", "km/h"}, + {0, 36, 16}, 0, [](double x, bool si) { return si ? x : Conversion::kph_to_mph(x); } + }, + {"intake_temp", "Intake Air Temperature", {"°F", "°C"}, + {10, 16, 12}, 1, [](double x, bool si) { return si ? x : Conversion::c_to_f(x); } + }, + {"maf_rate", "Mass Air Flow (MAF) Rate", {"g/s", "g/s"}, + {10, 16, 12}, 1, [](double x, bool si) { return x; } + } +}; + +Gauge::Gauge(GaugeConfig cfg, QFont value_font, QFont unit_font, Gauge::Orientation orientation, QWidget *parent) : QWidget(parent) { Config *config = Config::get_instance(); - this->id = cmd.id; + this->id = cfg.id; this->si = config->get_si_units(); - this->precision = cmd.precision; + this->precision = cfg.precision; - this->units = cmd.units; - this->converter = cmd.converter; + this->units = cfg.units; + this->converter = cfg.converter; QBoxLayout *layout; if (orientation == BOTTOM) @@ -248,9 +270,9 @@ QWidget *DataTab::speedo_tach_widget() layout->setContentsMargins(0, 0, 0, 0); layout->addStretch(3); - layout->addWidget(this->vehicle_data_widget(cmds.SPEED)); + layout->addWidget(this->vehicle_data_widget(gauges_cfg.SPEED)); layout->addStretch(2); - layout->addWidget(this->vehicle_data_widget(cmds.RPM)); + layout->addWidget(this->vehicle_data_widget(gauges_cfg.RPM)); layout->addStretch(1); return widget; @@ -276,7 +298,7 @@ QWidget *DataTab::speedo_tach_widget() // unit_font.setItalic(true); // // Gauge *mileage = new Gauge({"mpg", "km/L"}, value_font, unit_font, -// Gauge::BOTTOM, 100, {cmds.SPEED, cmds.MAF}, 1, +// Gauge::BOTTOM, 100, {gauges_cfg.SPEED, gauges_cfg.MAF}, 1, // [](std::vector x, bool si) { // return (si ? x[0] : kph_to_mph(x[0])) / (si ? gps_to_lph(x[1]) : gps_to_gph(x[1])); // }, @@ -295,17 +317,17 @@ QWidget *DataTab::engine_data_widget() layout->setSpacing(0); layout->addStretch(); - layout->addWidget(this->vehicle_data_widget(cmds.COOLANT_TEMP)); + layout->addWidget(this->vehicle_data_widget(gauges_cfg.COOLANT_TEMP)); layout->addStretch(); layout->addWidget(Session::Forge::br()); layout->addStretch(); - layout->addWidget(this->vehicle_data_widget(cmds.LOAD)); + layout->addWidget(this->vehicle_data_widget(gauges_cfg.LOAD)); layout->addStretch(); return widget; } -QWidget *DataTab::vehicle_data_widget(Command cfg) +QWidget *DataTab::vehicle_data_widget(GaugeConfig cfg) { QWidget *widget = new QWidget(this); QVBoxLayout *layout = new QVBoxLayout(widget); diff --git a/src/obd/command.cpp b/src/obd/command.cpp index 56d84ba2..c6769afa 100644 --- a/src/obd/command.cpp +++ b/src/obd/command.cpp @@ -1,30 +1,11 @@ #include "obd/command.hpp" #include "obd/decoders.hpp" -#include "obd/conversions.hpp" Commands cmds = { - {"load", "Calculated Engine Load", {"%", "%"}, - {10, 16, 12}, 1, [](double x, bool _) { return x; }, - QCanBusFrame(0x7df, QByteArray::fromHex("0201040000000000")), percentage - }, - {"coolant_temp", "Engine Coolant Temperature", {"°F", "°C"}, - {10, 16, 12}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }, - QCanBusFrame(0x7df, QByteArray::fromHex("0201050000000000")), temp - }, - {"rpm", "Engine Revolutions Per Minute (RPM)", {"x1000rpm", "x1000rpm"}, - {0, 24, 12}, 1, [](double x, bool _) { return x / 1000.0; }, - QCanBusFrame(0x7df, QByteArray::fromHex("02010C0000000000")), rpm - }, - {"speed", "Vehicle Speed", {"mph", "km/h"}, - {0, 36, 16}, 0, [](double x, bool si) { return si ? x : kph_to_mph(x); }, - QCanBusFrame(0x7df, QByteArray::fromHex("02010D0000000000")), speed - }, - {"intake_temp", "Intake Air Temperature", {"°F", "°C"}, - {10, 16, 12}, 1, [](double x, bool si) { return si ? x : c_to_f(x); }, - QCanBusFrame(0x7df, QByteArray::fromHex("02010F0000000000")), temp - }, - {"maf_rate", "Mass Air Flow (MAF) Rate", {"g/s", "g/s"}, - {10, 16, 12}, 1, [](double x, bool si) { return x; }, - QCanBusFrame(0x7df, QByteArray::fromHex("0201100000000000")), flow - } + {"load", QCanBusFrame(0x7df, QByteArray::fromHex("0201040000000000")), percentage, NULL, 200}, + {"coolant_temp", QCanBusFrame(0x7df, QByteArray::fromHex("0201050000000000")), temp, NULL, 5000}, + {"rpm", QCanBusFrame(0x7df, QByteArray::fromHex("02010C0000000000")), rpm, NULL, 200}, + {"speed", QCanBusFrame(0x7df, QByteArray::fromHex("02010D0000000000")), speed, NULL, 200}, + {"intake_temp", QCanBusFrame(0x7df, QByteArray::fromHex("02010F0000000000")), temp, NULL, 1000}, + {"maf_rate", QCanBusFrame(0x7df, QByteArray::fromHex("0201100000000000")), flow, NULL, 1000} }; From 6d485b89c1a2337786a2c3fc36fa168dcac721e7 Mon Sep 17 00:00:00 2001 From: egisz Date: Mon, 9 Aug 2021 17:17:09 +0300 Subject: [PATCH 12/15] add mpg l/100km indicator --- include/app/pages/vehicle.hpp | 2 +- include/obd/conversions.hpp | 2 ++ src/app/pages/vehicle.cpp | 10 +++++++--- src/obd/command.cpp | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/include/app/pages/vehicle.hpp b/include/app/pages/vehicle.hpp index 374f33ca..87bf9a1b 100644 --- a/include/app/pages/vehicle.hpp +++ b/include/app/pages/vehicle.hpp @@ -38,7 +38,7 @@ struct GaugesConfig { GaugeConfig RPM; GaugeConfig SPEED; GaugeConfig INTAKE_TEMP; - GaugeConfig MAF; + GaugeConfig MPG; }; class Gauge : public QWidget { diff --git a/include/obd/conversions.hpp b/include/obd/conversions.hpp index b1c2e6c5..5c95b789 100644 --- a/include/obd/conversions.hpp +++ b/include/obd/conversions.hpp @@ -9,4 +9,6 @@ class Conversion { static double gps_to_gph(double val) { return val * 0.0805; }; static double gps_to_lph(double val) { return val * 3.6; }; + + static double l100km_to_mpg(double val) { return (val == 0 ? 0 : (235.214583 / val)); }; }; diff --git a/src/app/pages/vehicle.cpp b/src/app/pages/vehicle.cpp index b3e9ac9c..e29cee63 100644 --- a/src/app/pages/vehicle.cpp +++ b/src/app/pages/vehicle.cpp @@ -24,8 +24,8 @@ GaugesConfig gauges_cfg = {"intake_temp", "Intake Air Temperature", {"°F", "°C"}, {10, 16, 12}, 1, [](double x, bool si) { return si ? x : Conversion::c_to_f(x); } }, - {"maf_rate", "Mass Air Flow (MAF) Rate", {"g/s", "g/s"}, - {10, 16, 12}, 1, [](double x, bool si) { return x; } + {"mpg", "Petrol consumption MPG or l/100km", {"mpg", "l/100km"}, + {10, 16, 12}, 1, [](double x, bool si) { return si ? x : Conversion::l100km_to_mpg(x); } } }; @@ -70,7 +70,7 @@ Gauge::Gauge(GaugeConfig cfg, QFont value_font, QFont unit_font, Gauge::Orientat } void Gauge::set_value(int value){ - // DASH_LOG(info)<<"[Gauges] set_value: "<setText(this->format_value(this->converter(value, this->si))); } @@ -323,6 +323,10 @@ QWidget *DataTab::engine_data_widget() layout->addStretch(); layout->addWidget(this->vehicle_data_widget(gauges_cfg.LOAD)); layout->addStretch(); + layout->addWidget(Session::Forge::br()); + layout->addStretch(); + layout->addWidget(this->vehicle_data_widget(gauges_cfg.MPG)); + layout->addStretch(); return widget; } diff --git a/src/obd/command.cpp b/src/obd/command.cpp index c6769afa..2f10fc2a 100644 --- a/src/obd/command.cpp +++ b/src/obd/command.cpp @@ -7,5 +7,5 @@ Commands cmds = { {"rpm", QCanBusFrame(0x7df, QByteArray::fromHex("02010C0000000000")), rpm, NULL, 200}, {"speed", QCanBusFrame(0x7df, QByteArray::fromHex("02010D0000000000")), speed, NULL, 200}, {"intake_temp", QCanBusFrame(0x7df, QByteArray::fromHex("02010F0000000000")), temp, NULL, 1000}, - {"maf_rate", QCanBusFrame(0x7df, QByteArray::fromHex("0201100000000000")), flow, NULL, 1000} + {"maf_rate", QCanBusFrame(0x7df, QByteArray::fromHex("0201100000000000")), flow, NULL, 200} }; From 33137e7efa3f0c1ea62f3b4d1725682a90abb8e7 Mon Sep 17 00:00:00 2001 From: egisz Date: Tue, 10 Aug 2021 11:14:21 +0300 Subject: [PATCH 13/15] add obd2 vehicle plugin, update README --- plugins/vehicle/obd2/README.md | 21 ++++++++++++++++ plugins/vehicle/obd2/obd2.cpp | 44 ++++++++++++++++++++++++++++++++++ plugins/vehicle/obd2/obd2.hpp | 29 ++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 plugins/vehicle/obd2/README.md create mode 100644 plugins/vehicle/obd2/obd2.cpp create mode 100644 plugins/vehicle/obd2/obd2.hpp diff --git a/plugins/vehicle/obd2/README.md b/plugins/vehicle/obd2/README.md new file mode 100644 index 00000000..9953d936 --- /dev/null +++ b/plugins/vehicle/obd2/README.md @@ -0,0 +1,21 @@ +# OBD2 integration + +To test without OBD2, send packets via CANBUS: + +```bash +cansend can0 7e8#03010D1e11100000 # speed 30 km/h +cansend can0 7e8#03010C1e11100000 # rpm to 1.9 +cansend can0 7e8#0301056e00000000 # temp to 70C +cansend can0 7e8#0301046e11100000 # engine load 43% +# mpg - 10l/100km (23mpg) +cansend can0 7e8#030110004f111110 && cansend can0 7e8#03010D1e11100000 +*/ +``` + +Current functionality: + +* Speed +* RPM +* Engine temp +* Engine load +* MPG diff --git a/plugins/vehicle/obd2/obd2.cpp b/plugins/vehicle/obd2/obd2.cpp new file mode 100644 index 00000000..11964598 --- /dev/null +++ b/plugins/vehicle/obd2/obd2.cpp @@ -0,0 +1,44 @@ +#include "obd2.hpp" + +bool Obd2::init(ICANBus* canbus){ + if (this->arbiter) { + OBD2_LOG(info)<<"loading plugin, totoal commands: "<registerFrameHandler(cmds.at(i).frame.frameId()+0x9, [this,i](QByteArray payload){this->readObd2(cmds.at(i), payload);}); + cmds[i].timer = new QTimer(this); + connect(cmds.at(i).timer, &QTimer::timeout, [this, canbus, i]() { + canbus->writeFrame(cmds.at(i).frame); + }); + cmds.at(i).timer->start(cmds.at(i).rate); + OBD2_LOG(info)<<"loaded "<< QString((cmds.at(i).id)).toStdString(); + } + OBD2_LOG(info)<<"loaded successfully"; + return true; + } + else{ + OBD2_LOG(error)<<"Failed to get arbiter"; + return false; + } +} + +QList Obd2::widgets() +{ + QList tabs; + return tabs; +} + +void Obd2::readObd2(Command cmd, QByteArray payload){ + Response resp = Response(payload); + if(cmd.frame.payload().at(2) == resp.PID){ + double value = cmd.decoder(resp); + OBD2_LOG(info)<maf_rate = Conversion::gps_to_lph(value); + } else if (cmd.id == "speed") { + const double mpg = this->maf_rate == 0 ? 0 : value / this->maf_rate; + this->arbiter->vehicle_update_data("mpg", mpg); + } + this->arbiter->vehicle_update_data(cmd.id, value); + } +} diff --git a/plugins/vehicle/obd2/obd2.hpp b/plugins/vehicle/obd2/obd2.hpp new file mode 100644 index 00000000..9a0a9eb9 --- /dev/null +++ b/plugins/vehicle/obd2/obd2.hpp @@ -0,0 +1,29 @@ +#include +#include +#include +#include +#include + +#include "plugins/vehicle_plugin.hpp" +#include "obd/command.hpp" +#include "obd/conversions.hpp" + +#include "app/arbiter.hpp" +#include "openauto/Service/InputService.hpp" + +#define OBD2_LOG(severity) BOOST_LOG_TRIVIAL(severity) << "[OBD2Plugin] " + +class Obd2 : public QObject, VehiclePlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID VehiclePlugin_iid) + Q_INTERFACES(VehiclePlugin) + + public: + bool init(ICANBus* canbus) override; + + private: + QList widgets() override; + double maf_rate; + void readObd2(Command cmd, QByteArray payload); +}; From 7ffb19fa08b518ee53e906261e74f79909bb1d71 Mon Sep 17 00:00:00 2001 From: egisz Date: Tue, 10 Aug 2021 11:15:02 +0300 Subject: [PATCH 14/15] fix gitignore for plugins --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index 58894fd3..edc48278 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,11 @@ Makefile *_autogen/ gitversion.h openauto.ini + +# Plugins # +########### +!plugins/vehicle/ +plugins/vehicle/* +!plugins/vehicle/test +!plugins/vehicle/obd2 +!plugins/vehicle/README.md From 3264c5f19d568be23b9607812fdf1de869a8c096 Mon Sep 17 00:00:00 2001 From: egisz Date: Tue, 10 Aug 2021 11:20:48 +0300 Subject: [PATCH 15/15] change log type to debug --- plugins/vehicle/obd2/obd2.cpp | 2 +- src/app/pages/vehicle.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/vehicle/obd2/obd2.cpp b/plugins/vehicle/obd2/obd2.cpp index 11964598..c411bad1 100644 --- a/plugins/vehicle/obd2/obd2.cpp +++ b/plugins/vehicle/obd2/obd2.cpp @@ -32,7 +32,7 @@ void Obd2::readObd2(Command cmd, QByteArray payload){ Response resp = Response(payload); if(cmd.frame.payload().at(2) == resp.PID){ double value = cmd.decoder(resp); - OBD2_LOG(info)<maf_rate = Conversion::gps_to_lph(value); } else if (cmd.id == "speed") { diff --git a/src/app/pages/vehicle.cpp b/src/app/pages/vehicle.cpp index e29cee63..a57795e8 100644 --- a/src/app/pages/vehicle.cpp +++ b/src/app/pages/vehicle.cpp @@ -24,7 +24,7 @@ GaugesConfig gauges_cfg = {"intake_temp", "Intake Air Temperature", {"°F", "°C"}, {10, 16, 12}, 1, [](double x, bool si) { return si ? x : Conversion::c_to_f(x); } }, - {"mpg", "Petrol consumption MPG or l/100km", {"mpg", "l/100km"}, + {"mpg", "Petrol consumption", {"mpg", "l/100km"}, {10, 16, 12}, 1, [](double x, bool si) { return si ? x : Conversion::l100km_to_mpg(x); } } }; @@ -70,7 +70,7 @@ Gauge::Gauge(GaugeConfig cfg, QFont value_font, QFont unit_font, Gauge::Orientat } void Gauge::set_value(int value){ - DASH_LOG(info)<<"[Gauges] set_value: "<setText(this->format_value(this->converter(value, this->si))); }