From c5d114291dac95b3447df48dbd712ec7eb84b89a Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Fri, 17 Jan 2025 15:38:28 +0000 Subject: [PATCH 01/13] Rename InstrumentCluster to InstrumentClusterApp and refactor light properties into LightStatus struct --- CMakeLists.txt | 4 +- include/InstrumentCluster.hpp | 111 ++++++++++++----------- src/InstrumentCluster.cpp | 161 +++++++++++----------------------- src/main.cpp | 117 +----------------------- 4 files changed, 108 insertions(+), 285 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c64b5c..d1877e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,11 +20,11 @@ set(CMAKE_AUTORCC ON) qt_add_resources(QT_RESOURCES ./ui/resources.qrc) # Define Executable Target -add_executable(InstrumentCluster +add_executable(InstrumentClusterApp ${QT_RESOURCES} ./src/main.cpp ./src/InstrumentCluster.cpp ./include/InstrumentCluster.hpp ) -target_link_libraries(InstrumentCluster zenohcxx::zenohc -lm -ldl Qt6::Core Qt6::DBus Qt6::Quick) +target_link_libraries(InstrumentClusterApp zenohcxx::zenohc -lm -ldl Qt6::Core Qt6::DBus Qt6::Quick) diff --git a/include/InstrumentCluster.hpp b/include/InstrumentCluster.hpp index 9d8590e..992693b 100644 --- a/include/InstrumentCluster.hpp +++ b/include/InstrumentCluster.hpp @@ -7,90 +7,87 @@ using namespace zenoh; +struct LightStatus +{ + Q_GADGET + Q_PROPERTY(bool rightBlinker MEMBER rightBlinker) + Q_PROPERTY(bool leftBlinker MEMBER leftBlinker) + Q_PROPERTY(bool lowBeam MEMBER lowBeam) + Q_PROPERTY(bool highBeam MEMBER highBeam) + Q_PROPERTY(bool frontFogLight MEMBER frontFogLight) + Q_PROPERTY(bool rearFogLight MEMBER rearFogLight) + Q_PROPERTY(bool hazardLight MEMBER hazardLight) + Q_PROPERTY(bool parkingLight MEMBER parkingLight) + public: + bool rightBlinker{false}; + bool leftBlinker{false}; + bool lowBeam{false}; + bool highBeam{false}; + bool frontFogLight{false}; + bool rearFogLight{false}; + bool hazardLight{false}; + bool parkingLight{false}; + + public: + bool operator!=(const LightStatus& lights) const + { + return rightBlinker != lights.rightBlinker || + leftBlinker != lights.leftBlinker || lowBeam != lights.lowBeam || + highBeam != lights.highBeam || + frontFogLight != lights.frontFogLight || + rearFogLight != lights.rearFogLight || + hazardLight != lights.hazardLight || + parkingLight != lights.parkingLight; + } +}; +Q_DECLARE_METATYPE(LightStatus) + +enum GearPosition +{ + PARK, + REVERSE, + NEUTRAL, + DRIVE +}; + class InstrumentCluster : public QObject { Q_OBJECT Q_PROPERTY(int speed READ getSpeed NOTIFY speedChanged) Q_PROPERTY(int battery READ getBattery NOTIFY batteryChanged) - Q_PROPERTY( - bool rightBlinker READ getRightBlinker NOTIFY rightBlinkerChanged) - Q_PROPERTY(bool leftBlinker READ getLeftBlinker NOTIFY leftBlinkerChanged) - Q_PROPERTY(bool lowBeam READ getLowBeam NOTIFY lowBeamChanged) - Q_PROPERTY(bool highBeam READ getHighBeam NOTIFY highBeamChanged) - Q_PROPERTY( - bool frontFogLight READ getFrontFogLight NOTIFY frontFogLightChanged) - Q_PROPERTY( - bool readFogLight READ getRearFogLight NOTIFY rearFogLightChanged) - Q_PROPERTY(bool hazardLight READ getHazardLight NOTIFY hazardLightChanged) - Q_PROPERTY( - bool parkingLight READ getParkingLight NOTIFY parkingLightChanged) + Q_PROPERTY(LightStatus lights READ getLights NOTIFY lightsChanged) Q_PROPERTY(GearPosition gear READ getGear NOTIFY gearChanged) - public: - enum class GearPosition - { - PARK, - REVERSE, - NEUTRAL, - DRIVE - }; - - Q_ENUM(GearPosition) - private: int m_speed; int m_battery; - bool m_rightBlinker; - bool m_leftBlinker; - bool m_lowBeam; - bool m_highBeam; - bool m_frontFogLight; - bool m_rearFogLight; - bool m_hazardLight; - bool m_parkingLight; + LightStatus m_lights; GearPosition m_gear; - Session& m_session; + Session m_session; + Subscriber m_subSpeed; + Subscriber m_subBattery; + Subscriber m_subLights; + Subscriber m_subGear; public: - explicit InstrumentCluster(Session& session, QObject* parent = nullptr); + explicit InstrumentCluster(QObject* parent = nullptr); ~InstrumentCluster(); int getSpeed() const; int getBattery() const; - bool getRightBlinker() const; - bool getLeftBlinker() const; - bool getLowBeam() const; - bool getHighBeam() const; - bool getFrontFogLight() const; - bool getRearFogLight() const; - bool getHazardLight() const; - bool getParkingLight() const; + LightStatus getLights() const; GearPosition getGear() const; void setSpeed(int speed); void setBattery(int battery); - void setRightBlinker(bool rightBlinker); - void setLeftBlinker(bool leftBlinker); - void setLowBeam(bool lowBeam); - void setHighBeam(bool highBeam); - void setFrontFogLight(bool frontFogLight); - void setRearFogLight(bool readFogLight); - void setHazardLight(bool hazardLight); - void setParkingLight(bool parkingLight); + void setLights(LightStatus lights); void setGear(GearPosition gear); signals: void speedChanged(int speed); void batteryChanged(int battery); - void rightBlinkerChanged(bool rightBlinker); - void leftBlinkerChanged(bool leftBlinker); - void lowBeamChanged(bool lowBeam); - void highBeamChanged(bool highBeam); - void frontFogLightChanged(bool frontFogLight); - void rearFogLightChanged(bool readFogLight); - void hazardLightChanged(bool hazardLight); - void parkingLightChanged(bool parkingLight); + void lightsChanged(LightStatus lights); void gearChanged(GearPosition gear); }; diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index d8c0f11..068c6ee 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -1,10 +1,49 @@ #include "../include/InstrumentCluster.hpp" -InstrumentCluster::InstrumentCluster(Session& session, QObject* parent) - : QObject(parent), m_speed(0), m_battery(0), m_rightBlinker(false), - m_leftBlinker(false), m_lowBeam(false), m_highBeam(false), - m_frontFogLight(false), m_rearFogLight(false), m_hazardLight(false), - m_parkingLight(false), m_gear(GearPosition::PARK), m_session(session) +InstrumentCluster::InstrumentCluster(QObject* parent) + : QObject(parent), + m_session(Session::open(std::move(Config::create_default()))), + m_subSpeed(m_session.declare_subscriber( + "seame/car/1/speedSensor", + [this](const Sample& sample) + { + int speed = std::stoi(sample.get_payload().as_string()); + std::cout << "Sub speed" << std::endl; + this->setSpeed(speed); + }, + closures::none)), + m_subBattery(m_session.declare_subscriber( + "seame/car/1/batterySensor", + [this](const Sample& sample) + { + int battery = std::stoi(sample.get_payload().as_string()); + std::cout << "Sub battery" << std::endl; + this->setBattery(battery); + }, + closures::none)), + m_subLights(m_session.declare_subscriber( + "seame/car/1/lights", + [this](const Sample& sample) + { + auto lightsStr = sample.get_payload().data(); + LightStatus lights; + memcpy(&lights, lightsStr, sizeof(LightStatus)); + std::cout << "Sub lights" << std::endl; + this->setLights(lights); + }, + closures::none)), + m_subGear(m_session.declare_subscriber( + "seame/car/1/gear", + [this](const Sample& sample) + { + auto gearStr = sample.get_payload().data(); + GearPosition gear; + memcpy(&gear, gearStr, sizeof(GearPosition)); + std::cout << "Sub gear" << std::endl; + this->setGear(gear); + }, + closures::none)), + m_speed(0), m_battery(0), m_gear(GearPosition::PARK) { } @@ -23,47 +62,12 @@ int InstrumentCluster::getBattery() const return m_battery; } -bool InstrumentCluster::getRightBlinker() const +LightStatus InstrumentCluster::getLights() const { - return m_rightBlinker; + return m_lights; } -bool InstrumentCluster::getLeftBlinker() const -{ - return m_leftBlinker; -} - -bool InstrumentCluster::getLowBeam() const -{ - return m_lowBeam; -} - -bool InstrumentCluster::getHighBeam() const -{ - return m_highBeam; -} - -bool InstrumentCluster::getFrontFogLight() const -{ - return m_frontFogLight; -} - -bool InstrumentCluster::getRearFogLight() const -{ - return m_rearFogLight; -} - -bool InstrumentCluster::getHazardLight() const -{ - return m_hazardLight; -} - -bool InstrumentCluster::getParkingLight() const -{ - return m_parkingLight; -} - -InstrumentCluster::GearPosition InstrumentCluster::getGear() const +GearPosition InstrumentCluster::getGear() const { return m_gear; } @@ -86,75 +90,12 @@ void InstrumentCluster::setBattery(int battery) } } -void InstrumentCluster::setRightBlinker(bool rightBlinker) -{ - if (m_rightBlinker != rightBlinker) - { - m_rightBlinker = rightBlinker; - emit rightBlinkerChanged(m_rightBlinker); - } -} - -void InstrumentCluster::setLeftBlinker(bool leftBlinker) -{ - if (m_leftBlinker != leftBlinker) - { - m_leftBlinker = leftBlinker; - emit leftBlinkerChanged(m_leftBlinker); - } -} - -void InstrumentCluster::setLowBeam(bool lowBeam) -{ - if (m_lowBeam != lowBeam) - { - m_lowBeam = lowBeam; - emit lowBeamChanged(m_lowBeam); - } -} - -void InstrumentCluster::setHighBeam(bool highBeam) -{ - if (m_highBeam != highBeam) - { - m_highBeam = highBeam; - emit highBeamChanged(m_highBeam); - } -} - -void InstrumentCluster::setFrontFogLight(bool frontFogLight) -{ - if (m_frontFogLight != frontFogLight) - { - m_frontFogLight = frontFogLight; - emit frontFogLightChanged(m_frontFogLight); - } -} - -void InstrumentCluster::setRearFogLight(bool rearFogLight) -{ - if (m_rearFogLight != rearFogLight) - { - m_rearFogLight = rearFogLight; - emit rearFogLightChanged(m_rearFogLight); - } -} - -void InstrumentCluster::setHazardLight(bool hazardLight) -{ - if (m_hazardLight != hazardLight) - { - m_hazardLight = hazardLight; - emit hazardLightChanged(m_hazardLight); - } -} - -void InstrumentCluster::setParkingLight(bool parkingLight) +void InstrumentCluster::setLights(LightStatus lights) { - if (m_parkingLight != parkingLight) + if (m_lights != lights) { - m_parkingLight = parkingLight; - emit parkingLightChanged(m_parkingLight); + m_lights = lights; + emit lightsChanged(m_lights); } } diff --git a/src/main.cpp b/src/main.cpp index ffbc34f..24db6ad 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,10 +8,7 @@ int main(int argc, char* argv[]) QGuiApplication app(argc, argv); QQmlApplicationEngine engine; - Config config = Config::create_default(); - auto session = Session::open(std::move(config)); - - InstrumentCluster instrumentCluster(session); + InstrumentCluster instrumentCluster; engine.rootContext()->setContextProperty("instrumentCluster", &instrumentCluster); @@ -26,117 +23,5 @@ int main(int argc, char* argv[]) Qt::QueuedConnection); engine.load(url); - auto speed_handler = [&instrumentCluster](const Sample& sample) - { - int speed = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub speed: " << speed << std::endl; - instrumentCluster.setSpeed(speed); - }; - - auto battery_handler = [&instrumentCluster](const Sample& sample) - { - int battery = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub battery: " << battery << std::endl; - instrumentCluster.setBattery(battery); - }; - - auto rightBlinker_handler = [&instrumentCluster](const Sample& sample) - { - int rightBlinker = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub rightBlinker: " << rightBlinker << std::endl; - instrumentCluster.setRightBlinker(rightBlinker); - }; - - auto leftBlinker_handler = [&instrumentCluster](const Sample& sample) - { - int leftBlinker = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub leftBlinker: " << leftBlinker << std::endl; - instrumentCluster.setLeftBlinker(leftBlinker); - }; - - auto lowBeam_handler = [&instrumentCluster](const Sample& sample) - { - int lowBeam = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub lowBeam: " << lowBeam << std::endl; - instrumentCluster.setLowBeam(lowBeam); - }; - - auto highBeam_handler = [&instrumentCluster](const Sample& sample) - { - int highBeam = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub highBeam: " << highBeam << std::endl; - instrumentCluster.setHighBeam(highBeam); - }; - - auto frontFogLight_handler = [&instrumentCluster](const Sample& sample) - { - int frontFogLight = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub frontFogLight: " << frontFogLight << std::endl; - instrumentCluster.setFrontFogLight(frontFogLight); - }; - - auto rearFogLight_handler = [&instrumentCluster](const Sample& sample) - { - int rearFogLight = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub rearFogLight: " << rearFogLight << std::endl; - instrumentCluster.setRearFogLight(rearFogLight); - }; - - auto hazardLight_handler = [&instrumentCluster](const Sample& sample) - { - int hazardLight = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub frontFogLight: " << hazardLight << std::endl; - instrumentCluster.setHazardLight(hazardLight); - }; - - auto parkingLight_handler = [&instrumentCluster](const Sample& sample) - { - int parkingLight = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub parkingLight: " << parkingLight << std::endl; - instrumentCluster.setParkingLight(parkingLight); - }; - - auto gear_handler = [&instrumentCluster](const Sample& sample) - { - int gear = std::stoi(sample.get_payload().as_string()); - std::cout << "Sub gear: " << gear << std::endl; - instrumentCluster.setGear(InstrumentCluster::GearPosition::PARK); - }; - - auto subSpeed = session.declare_subscriber("seame/car/1/speedSensor", - speed_handler, closures::none); - - auto subBattery = session.declare_subscriber( - "seame/car/1/batterySensor", battery_handler, closures::none); - - auto subRightBlinker = session.declare_subscriber( - "seame/car/1/rightBlinker", rightBlinker_handler, closures::none); - - auto subLeftBlinker = session.declare_subscriber( - "seame/car/1/leftBlinker", leftBlinker_handler, closures::none); - - auto subLowBeam = session.declare_subscriber( - "seame/car/1/lowBeam", lowBeam_handler, closures::none); - - auto subHighBeam = session.declare_subscriber( - "seame/car/1/highBeam", highBeam_handler, closures::none); - - auto subFrontFogLight = session.declare_subscriber( - "seame/car/1/frontFogLight", frontFogLight_handler, closures::none); - - auto subRearFogLight = session.declare_subscriber( - "seame/car/1/rearFogLight", rearFogLight_handler, closures::none); - - auto subHazardLight = session.declare_subscriber( - "seame/car/1/hazardLight", hazardLight_handler, closures::none); - - auto subParkingLight = session.declare_subscriber( - "seame/car/1/parkingLight", parkingLight_handler, closures::none); - - auto subGear = session.declare_subscriber("seame/car/1/gear", gear_handler, - closures::none); - - std::cout << "Subs created!" << std::endl; - return app.exec(); } From cb08ae378028a3e720cec219d8d7e779c1c23b8b Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Fri, 17 Jan 2025 16:04:17 +0000 Subject: [PATCH 02/13] Refactor LightStatus struct by removing Q_PROPERTY macros and update memcpy calls to use as_string() for payload handling --- include/InstrumentCluster.hpp | 12 ------------ src/InstrumentCluster.cpp | 8 ++++---- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/include/InstrumentCluster.hpp b/include/InstrumentCluster.hpp index 992693b..aefd529 100644 --- a/include/InstrumentCluster.hpp +++ b/include/InstrumentCluster.hpp @@ -9,16 +9,6 @@ using namespace zenoh; struct LightStatus { - Q_GADGET - Q_PROPERTY(bool rightBlinker MEMBER rightBlinker) - Q_PROPERTY(bool leftBlinker MEMBER leftBlinker) - Q_PROPERTY(bool lowBeam MEMBER lowBeam) - Q_PROPERTY(bool highBeam MEMBER highBeam) - Q_PROPERTY(bool frontFogLight MEMBER frontFogLight) - Q_PROPERTY(bool rearFogLight MEMBER rearFogLight) - Q_PROPERTY(bool hazardLight MEMBER hazardLight) - Q_PROPERTY(bool parkingLight MEMBER parkingLight) - public: bool rightBlinker{false}; bool leftBlinker{false}; bool lowBeam{false}; @@ -28,7 +18,6 @@ struct LightStatus bool hazardLight{false}; bool parkingLight{false}; - public: bool operator!=(const LightStatus& lights) const { return rightBlinker != lights.rightBlinker || @@ -40,7 +29,6 @@ struct LightStatus parkingLight != lights.parkingLight; } }; -Q_DECLARE_METATYPE(LightStatus) enum GearPosition { diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index 068c6ee..7670138 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -25,9 +25,9 @@ InstrumentCluster::InstrumentCluster(QObject* parent) "seame/car/1/lights", [this](const Sample& sample) { - auto lightsStr = sample.get_payload().data(); LightStatus lights; - memcpy(&lights, lightsStr, sizeof(LightStatus)); + memcpy(&lights, sample.get_payload().as_string().c_str(), + sizeof(LightStatus)); std::cout << "Sub lights" << std::endl; this->setLights(lights); }, @@ -36,9 +36,9 @@ InstrumentCluster::InstrumentCluster(QObject* parent) "seame/car/1/gear", [this](const Sample& sample) { - auto gearStr = sample.get_payload().data(); GearPosition gear; - memcpy(&gear, gearStr, sizeof(GearPosition)); + memcpy(&gear, sample.get_payload().as_string().c_str(), + sizeof(GearPosition)); std::cout << "Sub gear" << std::endl; this->setGear(gear); }, From a7a6b62396fa87c4b86a8756897aba7b177d914b Mon Sep 17 00:00:00 2001 From: ziliolu Date: Fri, 17 Jan 2025 16:51:57 +0000 Subject: [PATCH 03/13] background change --- CMakeLists.txt | 1 + assets/images/car-background.png | Bin 0 -> 116929 bytes ui/FootbarInfo.qml | 2 +- ui/GearShiftInfo.qml | 12 ++- ui/LightInfo.qml | 10 +-- ui/Main.qml | 148 +++++++++++++++---------------- ui/SpeedDisplay.qml | 5 +- ui/TurnSignals.qml | 19 ++-- ui/resources.qrc | 3 + 9 files changed, 101 insertions(+), 99 deletions(-) create mode 100644 assets/images/car-background.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c64b5c..dac97fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,3 +28,4 @@ add_executable(InstrumentCluster ) target_link_libraries(InstrumentCluster zenohcxx::zenohc -lm -ldl Qt6::Core Qt6::DBus Qt6::Quick) +target_compile_options(InstrumentCluster PRIVATE -Wall -Werror -Wextra) \ No newline at end of file diff --git a/assets/images/car-background.png b/assets/images/car-background.png new file mode 100644 index 0000000000000000000000000000000000000000..3239bdb9bd7e0b1f1a468c9c3d7f98eea8381d59 GIT binary patch literal 116929 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%0DfxAWj!kDek*T^^Q00am4i1@2jgh(@_?K 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 literal 0 HcmV?d00001 diff --git a/ui/FootbarInfo.qml b/ui/FootbarInfo.qml index 66ea725..082723f 100644 --- a/ui/FootbarInfo.qml +++ b/ui/FootbarInfo.qml @@ -28,7 +28,7 @@ Row { width: 80 visible: true fillMode: Image.PreserveAspectFit - source: "qrc:/assets/icons/battery-5.png" + source: "qrc:/assets/icons/battery-4.png" // Adjust this value to move the image up or down } } diff --git a/ui/GearShiftInfo.qml b/ui/GearShiftInfo.qml index ef5bbce..c52c292 100644 --- a/ui/GearShiftInfo.qml +++ b/ui/GearShiftInfo.qml @@ -6,24 +6,28 @@ Column { font.family: "Open Sans" text: "P" font.pixelSize: app.letterSize - color: "gray" + // color: instrumentCluster.gear === GearPosition.PARK ? "blue" : "white" + color: "white" } Text { font.family: "Open Sans" text: "R" font.pixelSize: app.letterSize - color: "gray" + // color: instrumentCluster.gear === GearPosition.REVERSE ? "blue" : "white" + color: "white" } Text { font.family: "Open Sans" text: "N" font.pixelSize: app.letterSize - color: "gray" + // color: instrumentCluster.gear === GearPosition.NEUTRAL ? "blue" : "white" + color: "white" } Text { font.family: "Open Sans" text: "D" font.pixelSize: app.letterSize - color: "blue" + // color: instrumentCluster.gear === GearPosition.DRIVE ? "blue" : "white" + color: "white" } } \ No newline at end of file diff --git a/ui/LightInfo.qml b/ui/LightInfo.qml index 0994884..b2ed8ac 100644 --- a/ui/LightInfo.qml +++ b/ui/LightInfo.qml @@ -9,7 +9,7 @@ Row { source: "qrc:/assets/icons/low_beam_on.png" width: app.iconWidth height: app.iconHeight - visible: true + visible: instrumentCluster.lowBeam } Image { @@ -17,7 +17,7 @@ Row { source: "qrc:/assets/icons/high_beam_on.png" width: app.iconWidth height: app.iconHeight - visible: true + visible: instrumentCluster.highBeam } Image { @@ -25,7 +25,7 @@ Row { source: "qrc:/assets/icons/front_fog_on.png" width: app.iconWidth height: app.iconHeight - visible: true + visible: instrumentCluster.frontFogLight } Image { @@ -33,7 +33,7 @@ Row { source: "qrc:/assets/icons/parking_lights_on.png" width: app.iconWidth height: app.iconHeight - visible: true + visible: instrumentCluster.parkingLight } Image { @@ -41,6 +41,6 @@ Row { source: "qrc:/assets/icons/back_fog_on.png" width: app.iconWidth height: app.iconHeight - visible: true + visible: instrumentCluster.readFogLight } } diff --git a/ui/Main.qml b/ui/Main.qml index 37c78f3..250d73c 100644 --- a/ui/Main.qml +++ b/ui/Main.qml @@ -6,13 +6,13 @@ ApplicationWindow { visible: true width: Screen.width height: Screen.height - // flags: Qt.FramelessWindowHint + flags: Qt.Window | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint + visibility: Window.FullScreen // Add this line property int letterSize: 25 property int iconWidth: 40 property int iconHeight: 40 property bool carClusterVisible: true - property bool showSplash: true font.family: "Roboto" @@ -24,35 +24,33 @@ ApplicationWindow { anchors.fill: parent visible: app.carClusterVisible - // Background Gradient - Canvas { + // Background Image + Image { + source: "qrc:/assets/images/car-background.png" + // fillMode: Image.PreserveAspectCrop anchors.fill: parent - onPaint: { - var ctx = getContext("2d"); - ctx.fillStyle = "#000000"; - ctx.fillRect(0, 0, width, height); - } } Row { anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.leftMargin: 100 + anchors.verticalCenterOffset: -90 + anchors.horizontalCenter: parent.horizontalCenter + anchors.leftMargin: 2 spacing: 10 - TurnSignals { - isLeft: true - isBlinking: true - } + // Left Turn Signal + TurnSignals {} + + // Speed Display (example) SpeedDisplay {} - TurnSignals { - isLeft: false - isBlinking: false - } + + // Right Turn Signal + TurnSignals {} } GearShiftInfo { anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: -10 anchors.left: parent.left anchors.leftMargin: 20 } @@ -66,71 +64,71 @@ ApplicationWindow { FootbarInfo { anchors.bottom: parent.bottom - anchors.bottomMargin: 60 + anchors.bottomMargin: 0 anchors.left: parent.left - anchors.leftMargin: 70 + anchors.leftMargin: 20 } TimeInfo { anchors.bottom: parent.bottom - anchors.bottomMargin: 60 + anchors.bottomMargin: 5 anchors.right: parent.right - anchors.rightMargin: 70 + anchors.rightMargin: 20 } } - // Logo Screen - Rectangle { - id: splashScreen - visible: app.showSplash - anchors.fill: parent - color: "black" - - // O retângulo sempre fica visível, mas apenas o logo tem a opacidade animada - Image { - id: logo - source: "qrc:/assets/icons/seame-logo.png" // Substitua pelo logo do carro - anchors.centerIn: parent - width: parent.width * 0.5 - height: parent.width * 0.5 - fillMode: Image.PreserveAspectFit - opacity: 1.0 // Começa visível - - SequentialAnimation { - running: true - loops: 1 - - // Transição para mostrar o logo - PropertyAnimation { - target: logo - property: "opacity" - from: 0.0 - to: 1.0 - duration: 3000 // 3 segundos - } - - PauseAnimation { duration: 1000 } // Aguarda 1 segundo com o logo visível - - // Transição para esconder o logo - PropertyAnimation { - target: logo - property: "opacity" - from: 1.0 - to: 0.0 - duration: 2000 // 2 segundos - } - - PauseAnimation { duration: 1000 } // Aguarda 2 segundos com a tela preta - - ScriptAction { - script: { - app.showSplash = false; // Oculta a splash screen - app.carClusterVisible = true; // Mostra o cluster - } - } - } - } - } + // // Logo Screen + // Rectangle { + // id: splashScreen + // visible: app.showSplash + // anchors.fill: parent + // color: "black" + + // // O retângulo sempre fica visível, mas apenas o logo tem a opacidade animada + // Image { + // id: logo + // source: "qrc:/assets/icons/seame-logo.png" // Substitua pelo logo do carro + // anchors.centerIn: parent + // width: parent.width * 0.5 + // height: parent.width * 0.5 + // fillMode: Image.PreserveAspectFit + // opacity: 1.0 // Começa visível + + // SequentialAnimation { + // running: true + // loops: 1 + + // // Transição para mostrar o logo + // PropertyAnimation { + // target: logo + // property: "opacity" + // from: 0.0 + // to: 1.0 + // duration: 3000 // 3 segundos + // } + + // PauseAnimation { duration: 1000 } // Aguarda 1 segundo com o logo visível + + // // Transição para esconder o logo + // PropertyAnimation { + // target: logo + // property: "opacity" + // from: 1.0 + // to: 0.0 + // duration: 2000 // 2 segundos + // } + + // PauseAnimation { duration: 1000 } // Aguarda 2 segundos com a tela preta + + // ScriptAction { + // script: { + // app.showSplash = false; // Oculta a splash screen + // app.carClusterVisible = true; // Mostra o cluster + // } + // } + // } + // } + // } } \ No newline at end of file diff --git a/ui/SpeedDisplay.qml b/ui/SpeedDisplay.qml index b7f1e3a..ec88037 100644 --- a/ui/SpeedDisplay.qml +++ b/ui/SpeedDisplay.qml @@ -1,11 +1,12 @@ import QtQuick 2.15 Column { - spacing: 5 + spacing: 3 Text { font.family: "Open Sans" - text: instrumentCluster.speed + // text: instrumentCluster.speed + text: "12" font.pixelSize: 110 color: "white" opacity: 1.0 diff --git a/ui/TurnSignals.qml b/ui/TurnSignals.qml index 3d33a4e..92639c6 100644 --- a/ui/TurnSignals.qml +++ b/ui/TurnSignals.qml @@ -3,29 +3,24 @@ import QtQuick 2.15 Row { id: root spacing: 10 - - property bool isLeft: true - property bool isBlinking: false - + Image { anchors.verticalCenter: parent.verticalCenter id: turnSignal - source: isLeft ? "qrc:/assets/icons/turn_left_on.png" : "qrc:/assets/icons/turn_right_on.png" + source: instrumentCluster.rightBlinker ? "qrc:/assets/icons/turn_right_on.png" : "qrc:/assets/icons/turn_left_on.png" width: 70 height: 70 opacity: 0.0 - + visible: instrumentCluster.rightBlinker || instrumentCluster.leftBlinker + Timer { id: blinkTimer interval: 500 - running: root.isBlinking + running: instrumentCluster.rightBlinker || instrumentCluster.leftBlinker // Start the timer if any blinker is on repeat: true onTriggered: { - if (turnSignal.isBlinking) { - turnSignal.opacity = turnSignal.opacity === 1.0 ? 0.0 : 1.0; - } else { - turnSignal.opacity = 0.0; - } + // Toggle opacity when blinking + turnSignal.opacity = turnSignal.opacity === 1.0 ? 0.0 : 1.0; } } } diff --git a/ui/resources.qrc b/ui/resources.qrc index 27ab5eb..ed6c1b6 100644 --- a/ui/resources.qrc +++ b/ui/resources.qrc @@ -26,4 +26,7 @@ ../assets/icons/battery-4.png ../assets/icons/battery-5.png + + ../assets/images/car-background.png + \ No newline at end of file From 5cc917b79f301588167a70000d05212d5faab5ad Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Fri, 17 Jan 2025 17:38:33 +0000 Subject: [PATCH 04/13] Refactor InstrumentCluster to use BatteryStatus struct and update light properties in LightStatus struct --- include/InstrumentCluster.hpp | 39 ++++++++++++++++++++++++++++++----- src/InstrumentCluster.cpp | 10 +++++---- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/include/InstrumentCluster.hpp b/include/InstrumentCluster.hpp index aefd529..1973207 100644 --- a/include/InstrumentCluster.hpp +++ b/include/InstrumentCluster.hpp @@ -9,6 +9,17 @@ using namespace zenoh; struct LightStatus { + Q_GADGET + public: + Q_PROPERTY(bool rightBlinker MEMBER rightBlinker) + Q_PROPERTY(bool leftBlinker MEMBER leftBlinker) + Q_PROPERTY(bool lowBeam MEMBER lowBeam) + Q_PROPERTY(bool highBeam MEMBER highBeam) + Q_PROPERTY(bool frontFogLight MEMBER frontFogLight) + Q_PROPERTY(bool rearFogLight MEMBER rearFogLight) + Q_PROPERTY(bool hazardLight MEMBER hazardLight) + Q_PROPERTY(bool parkingLight MEMBER parkingLight) + bool rightBlinker{false}; bool leftBlinker{false}; bool lowBeam{false}; @@ -29,6 +40,24 @@ struct LightStatus parkingLight != lights.parkingLight; } }; +Q_DECLARE_METATYPE(LightStatus) + +struct BatteryStatus +{ + Q_GADGET + public: + Q_PROPERTY(bool percentage MEMBER percentage) + Q_PROPERTY(bool autonomy MEMBER autonomy) + + int percentage; + int autonomy; + + bool operator!=(const BatteryStatus& battery) const + { + return percentage != battery.percentage || autonomy != battery.autonomy; + } +}; +Q_DECLARE_METATYPE(BatteryStatus) enum GearPosition { @@ -42,13 +71,13 @@ class InstrumentCluster : public QObject { Q_OBJECT Q_PROPERTY(int speed READ getSpeed NOTIFY speedChanged) - Q_PROPERTY(int battery READ getBattery NOTIFY batteryChanged) + Q_PROPERTY(BatteryStatus battery READ getBattery NOTIFY batteryChanged) Q_PROPERTY(LightStatus lights READ getLights NOTIFY lightsChanged) Q_PROPERTY(GearPosition gear READ getGear NOTIFY gearChanged) private: int m_speed; - int m_battery; + BatteryStatus m_battery; LightStatus m_lights; GearPosition m_gear; @@ -63,18 +92,18 @@ class InstrumentCluster : public QObject ~InstrumentCluster(); int getSpeed() const; - int getBattery() const; + BatteryStatus getBattery() const; LightStatus getLights() const; GearPosition getGear() const; void setSpeed(int speed); - void setBattery(int battery); + void setBattery(BatteryStatus battery); void setLights(LightStatus lights); void setGear(GearPosition gear); signals: void speedChanged(int speed); - void batteryChanged(int battery); + void batteryChanged(BatteryStatus battery); void lightsChanged(LightStatus lights); void gearChanged(GearPosition gear); }; diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index 7670138..387ce06 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -16,7 +16,9 @@ InstrumentCluster::InstrumentCluster(QObject* parent) "seame/car/1/batterySensor", [this](const Sample& sample) { - int battery = std::stoi(sample.get_payload().as_string()); + BatteryStatus battery; + memcpy(&battery, sample.get_payload().as_string().c_str(), + sizeof(BatteryStatus)); std::cout << "Sub battery" << std::endl; this->setBattery(battery); }, @@ -43,7 +45,7 @@ InstrumentCluster::InstrumentCluster(QObject* parent) this->setGear(gear); }, closures::none)), - m_speed(0), m_battery(0), m_gear(GearPosition::PARK) + m_speed(0), m_gear(GearPosition::PARK) { } @@ -57,7 +59,7 @@ int InstrumentCluster::getSpeed() const return m_speed; } -int InstrumentCluster::getBattery() const +BatteryStatus InstrumentCluster::getBattery() const { return m_battery; } @@ -81,7 +83,7 @@ void InstrumentCluster::setSpeed(int speed) } } -void InstrumentCluster::setBattery(int battery) +void InstrumentCluster::setBattery(BatteryStatus battery) { if (m_battery != battery) { From 6f9476ec00f187cf4d20dd36ac85776071ca0924 Mon Sep 17 00:00:00 2001 From: ziliolu Date: Fri, 17 Jan 2025 17:39:25 +0000 Subject: [PATCH 05/13] image change --- CMakeLists.txt | 6 +++--- include/InstrumentCluster.hpp | 31 +++++++++++++++++++++++++++++++ ui/GearShiftInfo.qml | 1 + ui/LightInfo.qml | 25 ++++++++++++------------- ui/Main.qml | 15 ++++++++++----- 5 files changed, 57 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dac97fd..1430184 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,12 +20,12 @@ set(CMAKE_AUTORCC ON) qt_add_resources(QT_RESOURCES ./ui/resources.qrc) # Define Executable Target -add_executable(InstrumentCluster +add_executable(InstrumentClusterApp ${QT_RESOURCES} ./src/main.cpp ./src/InstrumentCluster.cpp ./include/InstrumentCluster.hpp ) -target_link_libraries(InstrumentCluster zenohcxx::zenohc -lm -ldl Qt6::Core Qt6::DBus Qt6::Quick) -target_compile_options(InstrumentCluster PRIVATE -Wall -Werror -Wextra) \ No newline at end of file +target_link_libraries(InstrumentClusterApp zenohcxx::zenohc -lm -ldl Qt6::Core Qt6::DBus Qt6::Quick) +target_compile_options(InstrumentClusterApp PRIVATE -Wall -Werror -Wextra) \ No newline at end of file diff --git a/include/InstrumentCluster.hpp b/include/InstrumentCluster.hpp index 9d8590e..7b035cc 100644 --- a/include/InstrumentCluster.hpp +++ b/include/InstrumentCluster.hpp @@ -7,6 +7,37 @@ using namespace zenoh; +struct LightStatus +{ + bool rightBlinker{false}; + bool leftBlinker{false}; + bool lowBeam{false}; + bool highBeam{false}; + bool frontFogLight{false}; + bool rearFogLight{false}; + bool hazardLight{false}; + bool parkingLight{false}; + + bool operator!=(const LightStatus& lights) const + { + return rightBlinker != lights.rightBlinker || + leftBlinker != lights.leftBlinker || lowBeam != lights.lowBeam || + highBeam != lights.highBeam || + frontFogLight != lights.frontFogLight || + rearFogLight != lights.rearFogLight || + hazardLight != lights.hazardLight || + parkingLight != lights.parkingLight; + } +}; + +enum GearPosition +{ + PARK, + REVERSE, + NEUTRAL, + DRIVE +}; + class InstrumentCluster : public QObject { Q_OBJECT diff --git a/ui/GearShiftInfo.qml b/ui/GearShiftInfo.qml index c52c292..510f665 100644 --- a/ui/GearShiftInfo.qml +++ b/ui/GearShiftInfo.qml @@ -2,6 +2,7 @@ import QtQuick 2.15 Column { spacing: 10 + Text { font.family: "Open Sans" text: "P" diff --git a/ui/LightInfo.qml b/ui/LightInfo.qml index b2ed8ac..26b2221 100644 --- a/ui/LightInfo.qml +++ b/ui/LightInfo.qml @@ -1,15 +1,14 @@ import QtQuick 2.15 -Row { +Column { spacing: 10 - padding: 10 Image { id: lowBeamSignal source: "qrc:/assets/icons/low_beam_on.png" width: app.iconWidth height: app.iconHeight - visible: instrumentCluster.lowBeam + visible: instrumentCluster.lights.lowBeam } Image { @@ -17,7 +16,7 @@ Row { source: "qrc:/assets/icons/high_beam_on.png" width: app.iconWidth height: app.iconHeight - visible: instrumentCluster.highBeam + visible: instrumentCluster.lights.highBeam } Image { @@ -25,7 +24,7 @@ Row { source: "qrc:/assets/icons/front_fog_on.png" width: app.iconWidth height: app.iconHeight - visible: instrumentCluster.frontFogLight + visible: instrumentCluster.lights.frontFogLight } Image { @@ -33,14 +32,14 @@ Row { source: "qrc:/assets/icons/parking_lights_on.png" width: app.iconWidth height: app.iconHeight - visible: instrumentCluster.parkingLight + visible: instrumentCluster.lights.parkingLight } - Image { - id: backFogSignal - source: "qrc:/assets/icons/back_fog_on.png" - width: app.iconWidth - height: app.iconHeight - visible: instrumentCluster.readFogLight - } + // Image { + // id: backFogSignal + // source: "qrc:/assets/icons/back_fog_on.png" + // width: app.iconWidth + // height: app.iconHeight + // visible: instrumentCluster.lights.backFogLight + // } } diff --git a/ui/Main.qml b/ui/Main.qml index 250d73c..f5be382 100644 --- a/ui/Main.qml +++ b/ui/Main.qml @@ -33,7 +33,7 @@ ApplicationWindow { Row { anchors.verticalCenter: parent.verticalCenter - anchors.verticalCenterOffset: -90 + anchors.verticalCenterOffset: -100 anchors.horizontalCenter: parent.horizontalCenter anchors.leftMargin: 2 spacing: 10 @@ -56,10 +56,15 @@ ApplicationWindow { } LightInfo { - anchors.top: parent.top - anchors.topMargin: 30 - anchors.left: parent.left - anchors.leftMargin: 70 + // anchors.top: parent.top + // anchors.topMargin: 30 + // anchors.left: parent.left + // anchors.leftMargin: 70 + + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: -10 + anchors.right: parent.right + anchors.rightMargin: 20 } FootbarInfo { From 68f81585587f9fcd8d78a4257c340266e41c6805 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Mon, 20 Jan 2025 13:00:52 +0000 Subject: [PATCH 06/13] Refactor turn signal components to separate left and right signals and improve visibility handling --- ui/Main.qml | 9 ++------ ui/{TurnSignals.qml => TurnSignalLeft.qml} | 7 +++--- ui/TurnSignalRight.qml | 27 ++++++++++++++++++++++ ui/resources.qrc | 3 ++- 4 files changed, 34 insertions(+), 12 deletions(-) rename ui/{TurnSignals.qml => TurnSignalLeft.qml} (57%) create mode 100644 ui/TurnSignalRight.qml diff --git a/ui/Main.qml b/ui/Main.qml index 4091dfa..e11d741 100644 --- a/ui/Main.qml +++ b/ui/Main.qml @@ -39,13 +39,13 @@ ApplicationWindow { spacing: 10 // Left Turn Signal - TurnSignals {} + TurnSignalLeft {} // Speed Display (example) SpeedDisplay {} // Right Turn Signal - TurnSignals {} + TurnSignalRight {} } GearShiftInfo { @@ -56,11 +56,6 @@ ApplicationWindow { } LightInfo { - // anchors.top: parent.top - // anchors.topMargin: 30 - // anchors.left: parent.left - // anchors.leftMargin: 70 - anchors.verticalCenter: parent.verticalCenter anchors.verticalCenterOffset: -10 anchors.right: parent.right diff --git a/ui/TurnSignals.qml b/ui/TurnSignalLeft.qml similarity index 57% rename from ui/TurnSignals.qml rename to ui/TurnSignalLeft.qml index 4471a34..e3204a3 100644 --- a/ui/TurnSignals.qml +++ b/ui/TurnSignalLeft.qml @@ -7,16 +7,16 @@ Row { Image { anchors.verticalCenter: parent.verticalCenter id: turnSignal - source: instrumentCluster.lights.rightBlinker ? "qrc:/assets/icons/turn_right_on.png" : "qrc:/assets/icons/turn_left_on.png" + source: "qrc:/assets/icons/turn_left_on.png" width: 70 height: 70 opacity: 0.0 - visible: instrumentCluster.lights.rightBlinker || instrumentCluster.lights.leftBlinker + visible: instrumentCluster.lights.leftBlinker Timer { id: blinkTimer interval: 500 - running: instrumentCluster.lights.rightBlinker || instrumentCluster.lights.leftBlinker // Start the timer if any blinker is on + running: instrumentCluster.lights.leftBlinker repeat: true onTriggered: { // Toggle opacity when blinking @@ -24,5 +24,4 @@ Row { } } } - } diff --git a/ui/TurnSignalRight.qml b/ui/TurnSignalRight.qml new file mode 100644 index 0000000..3a23722 --- /dev/null +++ b/ui/TurnSignalRight.qml @@ -0,0 +1,27 @@ +import QtQuick 2.15 + +Row { + id: root + spacing: 10 + + Image { + anchors.verticalCenter: parent.verticalCenter + id: turnSignal + source: "qrc:/assets/icons/turn_right_on.png" + width: 70 + height: 70 + opacity: 0.0 + visible: instrumentCluster.lights.rightBlinker + + Timer { + id: blinkTimer + interval: 500 + running: instrumentCluster.lights.rightBlinker + repeat: true + onTriggered: { + // Toggle opacity when blinking + turnSignal.opacity = turnSignal.opacity === 1.0 ? 0.0 : 1.0; + } + } + } +} diff --git a/ui/resources.qrc b/ui/resources.qrc index ed6c1b6..0dbaf11 100644 --- a/ui/resources.qrc +++ b/ui/resources.qrc @@ -1,7 +1,8 @@ Main.qml - TurnSignals.qml + TurnSignalLeft.qml + TurnSignalRight.qml SpeedDisplay.qml LightInfo.qml FootbarInfo.qml From dd5fd480f1fae0eeba67fcf5d7c0454bf425aaa3 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Mon, 20 Jan 2025 13:34:20 +0000 Subject: [PATCH 07/13] Calculate and publish battery percentage based on voltage readings --- MiddleWare/src/main.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MiddleWare/src/main.cpp b/MiddleWare/src/main.cpp index 740c371..eab3f29 100644 --- a/MiddleWare/src/main.cpp +++ b/MiddleWare/src/main.cpp @@ -73,8 +73,12 @@ int main(int argc, char** argv) else if (frame.can_id == 0x02) { int battery; + float percentage; + memcpy(&battery, frame.data, sizeof(int)); - battery = ntohl(battery); + battery = ntohl(battery); + percentage = ((battery - 9.5f) / (12.6f - 9.5f)) * 100.0f; + battery = std::min(100.0f, std::max(0.0f, percentage)); std::string battery_str = std::to_string(battery); printf("Publishing battery: '%d\n", battery); From 40692c97f7606648c3f627854b93e9b02dc00663 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Mon, 20 Jan 2025 16:47:15 +0000 Subject: [PATCH 08/13] Remove submodule for Team02-Libs and update CMakeLists to fetch content directly; adjust include paths for InstrumentCluster --- .gitmodules | 3 --- CMakeLists.txt | 2 ++ MiddleWare/CMakeLists.txt | 12 ++++++++++++ MiddleWare/Libs | 1 - src/InstrumentCluster.cpp | 2 +- src/main.cpp | 2 +- 6 files changed, 16 insertions(+), 6 deletions(-) delete mode 100644 .gitmodules delete mode 160000 MiddleWare/Libs diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 07ed0c7..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "MiddleWare/Libs"] - path = MiddleWare/Libs - url = git@github.com:SEAME-pt/Team02-Libs.git diff --git a/CMakeLists.txt b/CMakeLists.txt index d1877e3..0d191f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,8 @@ set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) +include_directories(include) + # Add Resource File (QML and Other Resources) qt_add_resources(QT_RESOURCES ./ui/resources.qrc) diff --git a/MiddleWare/CMakeLists.txt b/MiddleWare/CMakeLists.txt index c1de850..662c97d 100644 --- a/MiddleWare/CMakeLists.txt +++ b/MiddleWare/CMakeLists.txt @@ -10,6 +10,18 @@ set(zenohcxx_DIR "/usr/local/lib/cmake/zenohcxx") find_package(zenohc REQUIRED) find_package(zenohcxx REQUIRED) +include(FetchContent) +FetchContent_Declare( + Libs + GIT_REPOSITORY https://github.com/SEAME-pt/Team02-Libs + GIT_TAG main +) +FetchContent_MakeAvailable(Libs) + +include_directories(${libs_SOURCE_DIR}/Communication/I2C/include) +include_directories(${libs_SOURCE_DIR}/Communication/CAN/include) +include_directories(${libs_SOURCE_DIR}/Peripherals/INA219/include) + add_executable(middleWare ./src/main.cpp ) diff --git a/MiddleWare/Libs b/MiddleWare/Libs deleted file mode 160000 index 7f38a66..0000000 --- a/MiddleWare/Libs +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7f38a66dbbf353c0a477578ca87646fb77df0599 diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index dce0cb4..5d76880 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -1,4 +1,4 @@ -#include "../include/InstrumentCluster.hpp" +#include "InstrumentCluster.hpp" InstrumentCluster::InstrumentCluster(QObject* parent) : QObject(parent), diff --git a/src/main.cpp b/src/main.cpp index aef5587..67ab95b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "../include/InstrumentCluster.hpp" +#include "InstrumentCluster.hpp" int main(int argc, char* argv[]) { From a5d303e800aa8bf063dba54eda72c526d4d84f87 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Mon, 20 Jan 2025 17:28:04 +0000 Subject: [PATCH 09/13] Refactor InstrumentCluster to use int for battery status instead of BatteryStatus type; update related methods and QML bindings --- include/InstrumentCluster.hpp | 8 ++++---- src/InstrumentCluster.cpp | 8 +++----- ui/GearShiftInfo.qml | 2 -- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/include/InstrumentCluster.hpp b/include/InstrumentCluster.hpp index 1775680..59b0daa 100644 --- a/include/InstrumentCluster.hpp +++ b/include/InstrumentCluster.hpp @@ -59,7 +59,7 @@ class InstrumentCluster : public QObject private: int m_speed; - BatteryStatus m_battery; + int m_battery; LightStatus m_lights; GearPosition m_gear; @@ -74,18 +74,18 @@ class InstrumentCluster : public QObject ~InstrumentCluster(); int getSpeed() const; - BatteryStatus getBattery() const; + int getBattery() const; LightStatus getLights() const; GearPosition getGear() const; void setSpeed(int speed); - void setBattery(BatteryStatus battery); + void setBattery(int battery); void setLights(LightStatus lights); void setGear(GearPosition gear); signals: void speedChanged(int speed); - void batteryChanged(BatteryStatus battery); + void batteryChanged(int battery); void lightsChanged(LightStatus lights); void gearChanged(GearPosition gear); }; diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index 5d76880..1fca158 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -16,9 +16,7 @@ InstrumentCluster::InstrumentCluster(QObject* parent) "seame/car/1/batterySensor", [this](const Sample& sample) { - BatteryStatus battery; - memcpy(&battery, sample.get_payload().as_string().c_str(), - sizeof(BatteryStatus)); + int battery = std::stoi(sample.get_payload().as_string()); std::cout << "Sub battery" << std::endl; this->setBattery(battery); }, @@ -68,7 +66,7 @@ int InstrumentCluster::getSpeed() const return m_speed; } -BatteryStatus InstrumentCluster::getBattery() const +int InstrumentCluster::getBattery() const { return m_battery; } @@ -92,7 +90,7 @@ void InstrumentCluster::setSpeed(int speed) } } -void InstrumentCluster::setBattery(BatteryStatus battery) +void InstrumentCluster::setBattery(int battery) { if (m_battery != battery) { diff --git a/ui/GearShiftInfo.qml b/ui/GearShiftInfo.qml index a991427..7bfec57 100644 --- a/ui/GearShiftInfo.qml +++ b/ui/GearShiftInfo.qml @@ -22,13 +22,11 @@ Column { text: "N" font.pixelSize: app.letterSize color: instrumentCluster.gear === GearPosition.NEUTRAL ? "blue" : "white" - color: "white" } Text { font.family: "Open Sans" text: "D" font.pixelSize: app.letterSize color: instrumentCluster.gear === GearPosition.DRIVE ? "blue" : "white" - color: "white" } } \ No newline at end of file From 6d5c39878a84453f619326c2cb33bbbd041de27d Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Tue, 21 Jan 2025 14:54:48 +0000 Subject: [PATCH 10/13] Refactor CMakeLists and main application; update battery handling to use BatteryStatus struct and improve light status properties --- MiddleWare/CMakeLists.txt | 24 ++++++++++++------------ MiddleWare/src/main.cpp | 13 ++++++------- include/InstrumentCluster.hpp | 26 ++++++++++++++++++++++---- src/InstrumentCluster.cpp | 9 ++++++--- 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/MiddleWare/CMakeLists.txt b/MiddleWare/CMakeLists.txt index 662c97d..8e8ffa4 100644 --- a/MiddleWare/CMakeLists.txt +++ b/MiddleWare/CMakeLists.txt @@ -10,20 +10,20 @@ set(zenohcxx_DIR "/usr/local/lib/cmake/zenohcxx") find_package(zenohc REQUIRED) find_package(zenohcxx REQUIRED) -include(FetchContent) -FetchContent_Declare( - Libs - GIT_REPOSITORY https://github.com/SEAME-pt/Team02-Libs - GIT_TAG main -) -FetchContent_MakeAvailable(Libs) +# include(FetchContent) +# FetchContent_Declare( +# Libs +# GIT_REPOSITORY https://github.com/SEAME-pt/Team02-Libs +# GIT_TAG main +# ) +# FetchContent_MakeAvailable(Libs) -include_directories(${libs_SOURCE_DIR}/Communication/I2C/include) -include_directories(${libs_SOURCE_DIR}/Communication/CAN/include) -include_directories(${libs_SOURCE_DIR}/Peripherals/INA219/include) +# include_directories(${libs_SOURCE_DIR}/Communication/I2C/include) +# include_directories(${libs_SOURCE_DIR}/Communication/CAN/include) +# include_directories(${libs_SOURCE_DIR}/Peripherals/INA219/include) -add_executable(middleWare +add_executable(middleWareApp ./src/main.cpp ) -target_link_libraries(middleWare PRIVATE zenohcxx::zenohc) +target_link_libraries(middleWareApp PRIVATE zenohcxx::zenohc) diff --git a/MiddleWare/src/main.cpp b/MiddleWare/src/main.cpp index eab3f29..2d77b77 100644 --- a/MiddleWare/src/main.cpp +++ b/MiddleWare/src/main.cpp @@ -72,16 +72,15 @@ int main(int argc, char** argv) } else if (frame.can_id == 0x02) { - int battery; - float percentage; + double battery; - memcpy(&battery, frame.data, sizeof(int)); - battery = ntohl(battery); - percentage = ((battery - 9.5f) / (12.6f - 9.5f)) * 100.0f; - battery = std::min(100.0f, std::max(0.0f, percentage)); + memcpy(&battery, frame.data, sizeof(double)); + + float percentage = ((battery - 9.5f) / (12.6f - 9.5f)) * 100.0f; + battery = std::min(100.0f, std::max(0.0f, percentage)); std::string battery_str = std::to_string(battery); - printf("Publishing battery: '%d\n", battery); + printf("Publishing battery: '%lf\n", battery); pubBattery.put(battery_str.c_str()); } usleep(10); diff --git a/include/InstrumentCluster.hpp b/include/InstrumentCluster.hpp index 59b0daa..6112dc7 100644 --- a/include/InstrumentCluster.hpp +++ b/include/InstrumentCluster.hpp @@ -9,6 +9,18 @@ using namespace zenoh; struct LightStatus { + Q_GADGET + + Q_PROPERTY(bool rightBlinker MEMBER rightBlinker) + Q_PROPERTY(bool leftBlinker MEMBER leftBlinker) + Q_PROPERTY(bool lowBeam MEMBER lowBeam) + Q_PROPERTY(bool highBeam MEMBER highBeam) + Q_PROPERTY(bool frontFogLight MEMBER frontFogLight) + Q_PROPERTY(bool rearFogLight MEMBER rearFogLight) + Q_PROPERTY(bool hazardLight MEMBER hazardLight) + Q_PROPERTY(bool parkingLight MEMBER parkingLight) + + public: bool rightBlinker{false}; bool leftBlinker{false}; bool lowBeam{false}; @@ -32,6 +44,12 @@ struct LightStatus struct BatteryStatus { + Q_GADGET + + Q_PROPERTY(int percentage MEMBER percentage) + Q_PROPERTY(int autonomy MEMBER autonomy) + + public: int percentage; int autonomy; @@ -59,7 +77,7 @@ class InstrumentCluster : public QObject private: int m_speed; - int m_battery; + BatteryStatus m_battery; LightStatus m_lights; GearPosition m_gear; @@ -74,18 +92,18 @@ class InstrumentCluster : public QObject ~InstrumentCluster(); int getSpeed() const; - int getBattery() const; + BatteryStatus getBattery() const; LightStatus getLights() const; GearPosition getGear() const; void setSpeed(int speed); - void setBattery(int battery); + void setBattery(BatteryStatus battery); void setLights(LightStatus lights); void setGear(GearPosition gear); signals: void speedChanged(int speed); - void batteryChanged(int battery); + void batteryChanged(BatteryStatus battery); void lightsChanged(LightStatus lights); void gearChanged(GearPosition gear); }; diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index 1fca158..b647894 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -16,7 +16,10 @@ InstrumentCluster::InstrumentCluster(QObject* parent) "seame/car/1/batterySensor", [this](const Sample& sample) { - int battery = std::stoi(sample.get_payload().as_string()); + int batteryPercentage = + std::stoi(sample.get_payload().as_string()); + BatteryStatus battery; + battery.percentage = batteryPercentage; std::cout << "Sub battery" << std::endl; this->setBattery(battery); }, @@ -66,7 +69,7 @@ int InstrumentCluster::getSpeed() const return m_speed; } -int InstrumentCluster::getBattery() const +BatteryStatus InstrumentCluster::getBattery() const { return m_battery; } @@ -90,7 +93,7 @@ void InstrumentCluster::setSpeed(int speed) } } -void InstrumentCluster::setBattery(int battery) +void InstrumentCluster::setBattery(BatteryStatus battery) { if (m_battery != battery) { From 5dd62fe49bac0b5831bf85df2765347f14b23c25 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Tue, 21 Jan 2025 15:30:34 +0000 Subject: [PATCH 11/13] Refactor gear handling in InstrumentCluster; update QML bindings for gear display and improve light visibility handling --- src/InstrumentCluster.cpp | 4 ++-- src/main.cpp | 4 ++++ ui/GearShiftInfo.qml | 11 +++++------ ui/LightInfo.qml | 14 +++++++------- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index b647894..d968182 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -49,8 +49,8 @@ InstrumentCluster::InstrumentCluster(QObject* parent) [this](const Sample& sample) { GearPosition gear; - memcpy(&gear, sample.get_payload().as_string().c_str(), - sizeof(GearPosition)); + int gearPayload = std::stoi(sample.get_payload().as_string()); + gear = static_cast(gearPayload); std::cout << "Sub gear" << std::endl; this->setGear(gear); }, diff --git a/src/main.cpp b/src/main.cpp index 67ab95b..e3ca2b2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,6 +14,10 @@ int main(int argc, char* argv[]) engine.rootContext()->setContextProperty("instrumentCluster", &instrumentCluster); + qmlRegisterUncreatableType( + "com.example.gearPosition", 1, 0, "GearPosition", + "Cannot create GearPosition in QML"); + const QUrl url(QStringLiteral("qrc:/Main.qml")); QObject::connect( &engine, &QQmlApplicationEngine::objectCreated, &app, diff --git a/ui/GearShiftInfo.qml b/ui/GearShiftInfo.qml index 7bfec57..280c960 100644 --- a/ui/GearShiftInfo.qml +++ b/ui/GearShiftInfo.qml @@ -1,4 +1,5 @@ import QtQuick 2.15 +import com.example.gearPosition 1.0 Column { spacing: 10 @@ -7,26 +8,24 @@ Column { font.family: "Open Sans" text: "P" font.pixelSize: app.letterSize - // color: instrumentCluster.gear === GearPosition.PARK ? "blue" : "white" - color: "white" + color: instrumentCluster.gear === 1 ? "blue" : "white" } Text { font.family: "Open Sans" text: "R" font.pixelSize: app.letterSize - // color: instrumentCluster.gear === GearPosition.REVERSE ? "blue" : "white" - color: "white" + color: instrumentCluster.gear === 2 ? "blue" : "white" } Text { font.family: "Open Sans" text: "N" font.pixelSize: app.letterSize - color: instrumentCluster.gear === GearPosition.NEUTRAL ? "blue" : "white" + color: instrumentCluster.gear === 3 ? "blue" : "white" } Text { font.family: "Open Sans" text: "D" font.pixelSize: app.letterSize - color: instrumentCluster.gear === GearPosition.DRIVE ? "blue" : "white" + color: instrumentCluster.gear === 4 ? "blue" : "white" } } \ No newline at end of file diff --git a/ui/LightInfo.qml b/ui/LightInfo.qml index 26b2221..190d533 100644 --- a/ui/LightInfo.qml +++ b/ui/LightInfo.qml @@ -35,11 +35,11 @@ Column { visible: instrumentCluster.lights.parkingLight } - // Image { - // id: backFogSignal - // source: "qrc:/assets/icons/back_fog_on.png" - // width: app.iconWidth - // height: app.iconHeight - // visible: instrumentCluster.lights.backFogLight - // } + Image { + id: backFogSignal + source: "qrc:/assets/icons/back_fog_on.png" + width: app.iconWidth + height: app.iconHeight + visible: instrumentCluster.lights.rearFogLight + } } From a594d259e14b3336be4d6e65e12a5d9964c5c520 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Tue, 21 Jan 2025 15:31:03 +0000 Subject: [PATCH 12/13] Remove unused import path for LightInfo.qml in main application --- src/main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e3ca2b2..1bf3355 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,8 +8,6 @@ int main(int argc, char* argv[]) QGuiApplication app(argc, argv); QQmlApplicationEngine engine; - engine.addImportPath("qrc:/LightInfo.qml"); - InstrumentCluster instrumentCluster; engine.rootContext()->setContextProperty("instrumentCluster", &instrumentCluster); From 29ae6c91ce9a2d3e0832c09af3775cd2a2805010 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Tue, 21 Jan 2025 15:47:22 +0000 Subject: [PATCH 13/13] Refactor GearPosition to a struct with Q_PROPERTY for better QML integration; update gear handling in InstrumentCluster and related QML bindings --- include/InstrumentCluster.hpp | 24 +++++++++++++++++++----- src/InstrumentCluster.cpp | 11 ++++++++--- src/main.cpp | 4 ---- ui/GearShiftInfo.qml | 10 +++++----- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/include/InstrumentCluster.hpp b/include/InstrumentCluster.hpp index 6112dc7..4a94553 100644 --- a/include/InstrumentCluster.hpp +++ b/include/InstrumentCluster.hpp @@ -59,12 +59,26 @@ struct BatteryStatus } }; -enum GearPosition +struct GearPosition { - PARK, - REVERSE, - NEUTRAL, - DRIVE + Q_GADGET + + Q_PROPERTY(bool park MEMBER park) + Q_PROPERTY(bool reverse MEMBER reverse) + Q_PROPERTY(bool neutral MEMBER neutral) + Q_PROPERTY(bool drive MEMBER drive) + + public: + bool park{true}; + bool reverse{false}; + bool neutral{false}; + bool drive{false}; + + bool operator!=(const GearPosition& gear) const + { + return park != gear.park || reverse != gear.reverse || + neutral != gear.neutral || drive != gear.drive; + } }; class InstrumentCluster : public QObject diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index d968182..5a3f92f 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -48,14 +48,19 @@ InstrumentCluster::InstrumentCluster(QObject* parent) "seame/car/1/gear", [this](const Sample& sample) { + uint8_t data = + static_cast(sample.get_payload().as_string()[0]); + GearPosition gear; - int gearPayload = std::stoi(sample.get_payload().as_string()); - gear = static_cast(gearPayload); + gear.park = (data & (1 << 0)) != 0; + gear.reverse = (data & (1 << 1)) != 0; + gear.neutral = (data & (1 << 2)) != 0; + gear.drive = (data & (1 << 3)) != 0; std::cout << "Sub gear" << std::endl; this->setGear(gear); }, closures::none)), - m_speed(0), m_gear(GearPosition::PARK) + m_speed(0) { } diff --git a/src/main.cpp b/src/main.cpp index 1bf3355..da2cbcd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,10 +12,6 @@ int main(int argc, char* argv[]) engine.rootContext()->setContextProperty("instrumentCluster", &instrumentCluster); - qmlRegisterUncreatableType( - "com.example.gearPosition", 1, 0, "GearPosition", - "Cannot create GearPosition in QML"); - const QUrl url(QStringLiteral("qrc:/Main.qml")); QObject::connect( &engine, &QQmlApplicationEngine::objectCreated, &app, diff --git a/ui/GearShiftInfo.qml b/ui/GearShiftInfo.qml index 280c960..d449032 100644 --- a/ui/GearShiftInfo.qml +++ b/ui/GearShiftInfo.qml @@ -1,5 +1,5 @@ import QtQuick 2.15 -import com.example.gearPosition 1.0 +// import com.example.gearPosition 1.0 Column { spacing: 10 @@ -8,24 +8,24 @@ Column { font.family: "Open Sans" text: "P" font.pixelSize: app.letterSize - color: instrumentCluster.gear === 1 ? "blue" : "white" + color: instrumentCluster.gear.park ? "blue" : "white" } Text { font.family: "Open Sans" text: "R" font.pixelSize: app.letterSize - color: instrumentCluster.gear === 2 ? "blue" : "white" + color: instrumentCluster.gear.reverse ? "blue" : "white" } Text { font.family: "Open Sans" text: "N" font.pixelSize: app.letterSize - color: instrumentCluster.gear === 3 ? "blue" : "white" + color: instrumentCluster.gear.neutral ? "blue" : "white" } Text { font.family: "Open Sans" text: "D" font.pixelSize: app.letterSize - color: instrumentCluster.gear === 4 ? "blue" : "white" + color: instrumentCluster.gear.drive ? "blue" : "white" } } \ No newline at end of file