From ca654c9899827b5d22f1ee1a40040188f19c4e6e Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Mon, 13 Jan 2025 18:12:30 +0000 Subject: [PATCH 1/6] Refactor CMakeLists.txt and remove unused main.cpp file to streamline project structure --- CMakeLists.txt | 10 +---- middelWare/src/main.cpp | 86 ----------------------------------------- 2 files changed, 2 insertions(+), 94 deletions(-) delete mode 100644 middelWare/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f5c2c1..3df9b2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,12 @@ cmake_minimum_required(VERSION 3.10) project(Cluster LANGUAGES CXX) -message("CMAKE_SYSROOT " ${CMAKE_SYSROOT}) -message("CMAKE_LIBRARY_ARCHITECTURE " ${CMAKE_LIBRARY_ARCHITECTURE}) + set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) - set(zenohc_DIR "/usr/local/lib/cmake/zenohc") set(zenohcxx_DIR "/usr/local/lib/cmake/zenohcxx") + find_package(Qt6 COMPONENTS Core Quick DBus REQUIRED) find_package(zenohc REQUIRED) find_package(zenohcxx REQUIRED) @@ -30,8 +29,3 @@ add_executable(speedometer target_link_libraries(speedometer zenohcxx::zenohc -lm -ldl Qt6::Core Qt6::DBus Qt6::Quick) -add_executable(zenoh - ./middelWare/src/main.cpp -) - -target_link_libraries(zenoh PRIVATE zenohcxx::zenohc) diff --git a/middelWare/src/main.cpp b/middelWare/src/main.cpp deleted file mode 100644 index 740c371..0000000 --- a/middelWare/src/main.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "zenoh.hxx" - -using namespace zenoh; - -int main(int argc, char** argv) -{ - struct ifreq ifr; - struct sockaddr_can addr; - - int canSocket = socket(PF_CAN, SOCK_RAW, CAN_RAW); - if (canSocket < 0) - { - std::cerr << "Cannot create CAN socket!" << std::endl; - exit(-1); - } - - strcpy(ifr.ifr_name, "can0"); - ioctl(canSocket, SIOCGIFINDEX, &ifr); - - addr.can_family = AF_CAN; - addr.can_ifindex = ifr.ifr_ifindex; - if (bind(canSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) - { - std::cerr << "Cannot bind CAN socket!" << std::endl; - close(canSocket); - exit(1); - } - - std::cout << "CAN socket bound to can0 interface successfully." - << std::endl; - - Config config = Config::create_default(); - auto session = Session::open(std::move(config)); - - auto pubSpeed = - session.declare_publisher(KeyExpr("seame/car/1/speedSensor")); - auto pubBattery = - session.declare_publisher(KeyExpr("seame/car/1/batterySensor")); - - while (1) - { - struct can_frame frame; - - int nbytes = read(canSocket, &frame, sizeof(struct can_frame)); - if (nbytes < 0) - { - std::cerr << "Error reading CAN frame!" << std::endl; - continue; - } - if (frame.can_id == 0x01) - { - int speed; - double wheelDiame = 0.067; - - memcpy(&speed, frame.data, sizeof(int)); - speed = ntohl(speed); - speed = wheelDiame * 3.14 * speed * 10 / 60; - std::string speed_str = std::to_string(speed); - - printf("Publishing speed: '%d'\n", speed); - pubSpeed.put(speed_str.c_str()); - } - else if (frame.can_id == 0x02) - { - int battery; - memcpy(&battery, frame.data, sizeof(int)); - battery = ntohl(battery); - std::string battery_str = std::to_string(battery); - - printf("Publishing battery: '%d\n", battery); - pubBattery.put(battery_str.c_str()); - } - usleep(10); - } - return 0; -} From 48645d36c94a641dc9ef42c09c03b3bd75de07f7 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Tue, 14 Jan 2025 16:03:18 +0000 Subject: [PATCH 2/6] Refactor CANBusHandler to InstrumentCluster and update main application logic --- CMakeLists.txt | 13 ++- include/CANBusHandler.hpp | 35 ------- include/InstrumentCluster.hpp | 97 ++++++++++++++++++++ src/CANBusHandler.cpp | 39 -------- src/InstrumentCluster.cpp | 168 ++++++++++++++++++++++++++++++++++ src/main.cpp | 14 +-- 6 files changed, 278 insertions(+), 88 deletions(-) delete mode 100644 include/CANBusHandler.hpp create mode 100644 include/InstrumentCluster.hpp delete mode 100644 src/CANBusHandler.cpp create mode 100644 src/InstrumentCluster.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3df9b2b..7c64b5c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,12 +20,11 @@ set(CMAKE_AUTORCC ON) qt_add_resources(QT_RESOURCES ./ui/resources.qrc) # Define Executable Target -add_executable(speedometer - ${QT_RESOURCES} # Add Resource File - ./src/main.cpp # Main C++ File - ./src/CANBusHandler.cpp # CANBusHandler Implementation - ./include/CANBusHandler.hpp # CANBusHandler Header +add_executable(InstrumentCluster + ${QT_RESOURCES} + ./src/main.cpp + ./src/InstrumentCluster.cpp + ./include/InstrumentCluster.hpp ) -target_link_libraries(speedometer zenohcxx::zenohc -lm -ldl Qt6::Core Qt6::DBus Qt6::Quick) - +target_link_libraries(InstrumentCluster zenohcxx::zenohc -lm -ldl Qt6::Core Qt6::DBus Qt6::Quick) diff --git a/include/CANBusHandler.hpp b/include/CANBusHandler.hpp deleted file mode 100644 index 041e97e..0000000 --- a/include/CANBusHandler.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef CANBUSHANDLER_HPP -#define CANBUSHANDLER_HPP - -#include -#include -#include "zenoh.hxx" - -using namespace zenoh; - -class CANBusHandler : public QObject -{ - Q_OBJECT - Q_PROPERTY(int speed READ getSpeed NOTIFY speedChanged) - Q_PROPERTY(int battery READ getBattery NOTIFY batteryChanged) - - public: - explicit CANBusHandler(Session& session, QObject* parent = nullptr); - ~CANBusHandler(); - - int getSpeed() const; - int getBattery() const; - void setSpeed(int speed); - void setBattery(int battery); - - signals: - void speedChanged(int speed); - void batteryChanged(int battery); - - private: - int m_speed; - int m_battery; - Session& m_session; -}; - -#endif // CANBUSHANDLER_HPP diff --git a/include/InstrumentCluster.hpp b/include/InstrumentCluster.hpp new file mode 100644 index 0000000..9d8590e --- /dev/null +++ b/include/InstrumentCluster.hpp @@ -0,0 +1,97 @@ +#ifndef INSTRUMENTCLUSTER_HPP +#define INSTRUMENTCLUSTER_HPP + +#include +#include +#include "zenoh.hxx" + +using namespace zenoh; + +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(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; + GearPosition m_gear; + + Session& m_session; + + public: + explicit InstrumentCluster(Session& session, 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; + 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 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 gearChanged(GearPosition gear); +}; + +#endif // INSTRUMENTCLUSTER_HPP diff --git a/src/CANBusHandler.cpp b/src/CANBusHandler.cpp deleted file mode 100644 index 362386a..0000000 --- a/src/CANBusHandler.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "../include/CANBusHandler.hpp" - -CANBusHandler::CANBusHandler(Session& session, QObject* parent) - : QObject(parent), m_speed(0), m_battery(0), m_session(session) -{ -} - -CANBusHandler::~CANBusHandler() -{ - m_session.close(); -} - -int CANBusHandler::getSpeed() const -{ - return m_speed; -} - -int CANBusHandler::getBattery() const -{ - return m_battery; -} - -void CANBusHandler::setSpeed(int speed) -{ - if (m_speed != speed) - { - m_speed = speed; - emit speedChanged(m_speed); - } -} - -void CANBusHandler::setBattery(int battery) -{ - if (m_battery != battery) - emit batteryChanged(m_battery); - { - m_battery = battery; - } -} diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp new file mode 100644 index 0000000..ac16335 --- /dev/null +++ b/src/InstrumentCluster.cpp @@ -0,0 +1,168 @@ +#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() +{ + m_session.close(); +} + +int InstrumentCluster::getSpeed() const +{ + return m_speed; +} + +int InstrumentCluster::getBattery() const +{ + return m_battery; +} + +bool InstrumentCluster::getRightBlinker() const +{ + return m_rightBlinker; +} + +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; +} + +GearPosition InstrumentCluster::getGear() const +{ + return m_gear; +} + +void InstrumentCluster::setSpeed(int speed) +{ + if (m_speed != speed) + { + m_speed = speed; + emit speedChanged(m_speed); + } +} + +void InstrumentCluster::setBattery(int battery) +{ + if (m_battery != battery) + { + m_battery = battery; + emit batteryChanged(m_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 batteryChanged(m_highBeam); + } +} + +void InstrumentCluster::setFrontFogLight(bool frontFogLight) +{ + if (m_frontFogLight != frontFogLight) + { + m_frontFogLight = frontFogLight; + emit speedChanged(m_frontFogLight); + } +} + +void InstrumentCluster::setRearFogLight(bool rearFogLight) +{ + if (m_rearFogLight != rearFogLight) + { + m_rearFogLight = rearFogLight; + emit rightBlinkerChanged(m_rearFogLight); + } +} + +void InstrumentCluster::setHazardLight(bool hazardLight) +{ + if (m_hazardLight != hazardLight) + { + m_hazardLight = hazardLight; + emit speedChanged(m_hazardLight); + } +} + +void InstrumentCluster::setParkingLight(bool parkingLight) +{ + if (m_parkingLight != parkingLight) + { + m_parkingLight = parkingLight; + emit parkingLightChanged(m_parkingLight); + } +} + +void InstrumentCluster::setGear(GearPosition gear) +{ + if (m_gear != gear) + { + m_gear = gear; + emit gearChanged(m_gear); + } +} diff --git a/src/main.cpp b/src/main.cpp index e17a8b1..96a1e76 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "../include/CANBusHandler.hpp" +#include "../include/InstrumentCluster.hpp" int main(int argc, char* argv[]) { @@ -11,8 +11,8 @@ int main(int argc, char* argv[]) Config config = Config::create_default(); auto session = Session::open(std::move(config)); - CANBusHandler canBusHandler(session); - engine.rootContext()->setContextProperty("canBusHandler", &canBusHandler); + InstrumentCluster instrumentCluster(session); + engine.rootContext()->setContextProperty("instrumentCluster", &instrumentCluster); const QUrl url(QStringLiteral("qrc:/Main.qml")); QObject::connect( @@ -25,18 +25,18 @@ int main(int argc, char* argv[]) Qt::QueuedConnection); engine.load(url); - auto speed_handler = [&canBusHandler](const Sample& sample) + auto speed_handler = [&instrumentCluster](const Sample& sample) { int speed = std::stoi(sample.get_payload().as_string()); std::cout << "Sub speed: " << speed << std::endl; - canBusHandler.setSpeed(speed); + instrumentCluster.setSpeed(speed); }; - auto battery_handler = [&canBusHandler](const Sample& sample) + auto battery_handler = [&instrumentCluster](const Sample& sample) { int battery = std::stoi(sample.get_payload().as_string()); std::cout << "Sub battery: " << battery << std::endl; - canBusHandler.setBattery(battery); + instrumentCluster.setBattery(battery); }; auto subSpeed = session.declare_subscriber("seame/car/1/speedSensor", From e0bee84058a1af633c655091c3208e1983a550fe Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Wed, 15 Jan 2025 15:06:48 +0000 Subject: [PATCH 3/6] Refactor InstrumentCluster to emit correct signals and add handlers for light and gear subscriptions --- src/InstrumentCluster.cpp | 8 ++-- src/main.cpp | 99 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 100 insertions(+), 7 deletions(-) diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index ac16335..1e13647 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -118,7 +118,7 @@ void InstrumentCluster::setHighBeam(bool highBeam) if (m_highBeam != highBeam) { m_highBeam = highBeam; - emit batteryChanged(m_highBeam); + emit highBeamChanged(m_highBeam); } } @@ -127,7 +127,7 @@ void InstrumentCluster::setFrontFogLight(bool frontFogLight) if (m_frontFogLight != frontFogLight) { m_frontFogLight = frontFogLight; - emit speedChanged(m_frontFogLight); + emit frontFogLightChanged(m_frontFogLight); } } @@ -136,7 +136,7 @@ void InstrumentCluster::setRearFogLight(bool rearFogLight) if (m_rearFogLight != rearFogLight) { m_rearFogLight = rearFogLight; - emit rightBlinkerChanged(m_rearFogLight); + emit rearFogLightChanged(m_rearFogLight); } } @@ -145,7 +145,7 @@ void InstrumentCluster::setHazardLight(bool hazardLight) if (m_hazardLight != hazardLight) { m_hazardLight = hazardLight; - emit speedChanged(m_hazardLight); + emit hazardLightChanged(m_hazardLight); } } diff --git a/src/main.cpp b/src/main.cpp index 96a1e76..a297ffc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,7 +12,8 @@ int main(int argc, char* argv[]) auto session = Session::open(std::move(config)); InstrumentCluster instrumentCluster(session); - engine.rootContext()->setContextProperty("instrumentCluster", &instrumentCluster); + engine.rootContext()->setContextProperty("instrumentCluster", + &instrumentCluster); const QUrl url(QStringLiteral("qrc:/Main.qml")); QObject::connect( @@ -39,10 +40,102 @@ int main(int argc, char* argv[]) instrumentCluster.setBattery(battery); }; - auto subSpeed = session.declare_subscriber("seame/car/1/speedSensor", - speed_handler, closures::none); + 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 rearFogLight = 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(gear); + }; + + 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 8e031691e6cf29c401b1c764163a1f2d900f6ae6 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Thu, 16 Jan 2025 10:48:44 +0000 Subject: [PATCH 4/6] Fix gear retrieval and update parking light handler in InstrumentCluster --- src/InstrumentCluster.cpp | 2 +- src/main.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index 1e13647..d8c0f11 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -63,7 +63,7 @@ bool InstrumentCluster::getParkingLight() const return m_parkingLight; } -GearPosition InstrumentCluster::getGear() const +InstrumentCluster::GearPosition InstrumentCluster::getGear() const { return m_gear; } diff --git a/src/main.cpp b/src/main.cpp index a297ffc..ffbc34f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -91,7 +91,7 @@ int main(int argc, char* argv[]) auto parkingLight_handler = [&instrumentCluster](const Sample& sample) { - int rearFogLight = std::stoi(sample.get_payload().as_string()); + int parkingLight = std::stoi(sample.get_payload().as_string()); std::cout << "Sub parkingLight: " << parkingLight << std::endl; instrumentCluster.setParkingLight(parkingLight); }; @@ -100,7 +100,7 @@ int main(int argc, char* argv[]) { int gear = std::stoi(sample.get_payload().as_string()); std::cout << "Sub gear: " << gear << std::endl; - instrumentCluster.setGear(gear); + instrumentCluster.setGear(InstrumentCluster::GearPosition::PARK); }; auto subSpeed = session.declare_subscriber("seame/car/1/speedSensor", From d8c389c5a56e531f089c20fd4fc962df4c8614c2 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Thu, 16 Jan 2025 10:50:07 +0000 Subject: [PATCH 5/6] Update SpeedDisplay to use speed from InstrumentCluster instead of CANBusHandler --- ui/SpeedDisplay.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/SpeedDisplay.qml b/ui/SpeedDisplay.qml index e2859da..b7f1e3a 100644 --- a/ui/SpeedDisplay.qml +++ b/ui/SpeedDisplay.qml @@ -5,7 +5,7 @@ Column { Text { font.family: "Open Sans" - text: canBusHandler.speed + text: instrumentCluster.speed font.pixelSize: 110 color: "white" opacity: 1.0 From ba10f4379f575c5841fe72a7ff088745232c43cb Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Thu, 16 Jan 2025 13:44:40 +0000 Subject: [PATCH 6/6] Add middleware CMake configuration and initial main application logic for CAN interface --- MiddleWare/CMakeLists.txt | 17 ++++++++ MiddleWare/src/main.cpp | 86 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 MiddleWare/CMakeLists.txt create mode 100644 MiddleWare/src/main.cpp diff --git a/MiddleWare/CMakeLists.txt b/MiddleWare/CMakeLists.txt new file mode 100644 index 0000000..c1de850 --- /dev/null +++ b/MiddleWare/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.10) + +project(Middelware LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(zenohc_DIR "/usr/local/lib/cmake/zenohc") +set(zenohcxx_DIR "/usr/local/lib/cmake/zenohcxx") + +find_package(zenohc REQUIRED) +find_package(zenohcxx REQUIRED) + +add_executable(middleWare + ./src/main.cpp +) + +target_link_libraries(middleWare PRIVATE zenohcxx::zenohc) diff --git a/MiddleWare/src/main.cpp b/MiddleWare/src/main.cpp new file mode 100644 index 0000000..740c371 --- /dev/null +++ b/MiddleWare/src/main.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "zenoh.hxx" + +using namespace zenoh; + +int main(int argc, char** argv) +{ + struct ifreq ifr; + struct sockaddr_can addr; + + int canSocket = socket(PF_CAN, SOCK_RAW, CAN_RAW); + if (canSocket < 0) + { + std::cerr << "Cannot create CAN socket!" << std::endl; + exit(-1); + } + + strcpy(ifr.ifr_name, "can0"); + ioctl(canSocket, SIOCGIFINDEX, &ifr); + + addr.can_family = AF_CAN; + addr.can_ifindex = ifr.ifr_ifindex; + if (bind(canSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) + { + std::cerr << "Cannot bind CAN socket!" << std::endl; + close(canSocket); + exit(1); + } + + std::cout << "CAN socket bound to can0 interface successfully." + << std::endl; + + Config config = Config::create_default(); + auto session = Session::open(std::move(config)); + + auto pubSpeed = + session.declare_publisher(KeyExpr("seame/car/1/speedSensor")); + auto pubBattery = + session.declare_publisher(KeyExpr("seame/car/1/batterySensor")); + + while (1) + { + struct can_frame frame; + + int nbytes = read(canSocket, &frame, sizeof(struct can_frame)); + if (nbytes < 0) + { + std::cerr << "Error reading CAN frame!" << std::endl; + continue; + } + if (frame.can_id == 0x01) + { + int speed; + double wheelDiame = 0.067; + + memcpy(&speed, frame.data, sizeof(int)); + speed = ntohl(speed); + speed = wheelDiame * 3.14 * speed * 10 / 60; + std::string speed_str = std::to_string(speed); + + printf("Publishing speed: '%d'\n", speed); + pubSpeed.put(speed_str.c_str()); + } + else if (frame.can_id == 0x02) + { + int battery; + memcpy(&battery, frame.data, sizeof(int)); + battery = ntohl(battery); + std::string battery_str = std::to_string(battery); + + printf("Publishing battery: '%d\n", battery); + pubBattery.put(battery_str.c_str()); + } + usleep(10); + } + return 0; +}