From 06ba7648317f114a9a5a9cb113d6c7c8fe491fdb Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Tue, 21 Jan 2025 18:38:13 +0000 Subject: [PATCH 1/7] Add middleware configuration and update InstrumentCluster to use JSON for session management; enhance battery display in FootbarInfo.qml --- MiddleWare/middleWare.json | 17 +++++++++ MiddleWare/src/main.cpp | 2 +- src/InstrumentCluster.cpp | 2 +- src/main.cpp | 2 + ui/FootbarInfo.qml | 77 +++++++++++++++++++------------------- 5 files changed, 59 insertions(+), 41 deletions(-) create mode 100644 MiddleWare/middleWare.json diff --git a/MiddleWare/middleWare.json b/MiddleWare/middleWare.json new file mode 100644 index 0000000..6ec92e9 --- /dev/null +++ b/MiddleWare/middleWare.json @@ -0,0 +1,17 @@ +{ + "mode": "peer", + "connect": { + "endpoints": ["tcp/127.0.0.1:7447"] + }, + "listen": { + "endpoints": ["tcp/127.0.0.1:7448"] + }, + "scouting": { + "multicast": { + "enabled": false + }, + "gossip": { + "enabled": false + } + } +} \ No newline at end of file diff --git a/MiddleWare/src/main.cpp b/MiddleWare/src/main.cpp index 2d77b77..459b3cb 100644 --- a/MiddleWare/src/main.cpp +++ b/MiddleWare/src/main.cpp @@ -39,7 +39,7 @@ int main(int argc, char** argv) std::cout << "CAN socket bound to can0 interface successfully." << std::endl; - Config config = Config::create_default(); + Config config = Config::from_file("middleWare.json"); auto session = Session::open(std::move(config)); auto pubSpeed = diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index 5a3f92f..b1582a7 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -2,7 +2,7 @@ InstrumentCluster::InstrumentCluster(QObject* parent) : QObject(parent), - m_session(Session::open(std::move(Config::create_default()))), + m_session(Session::open(std::move(Config::from_file("local.json")))), m_subSpeed(m_session.declare_subscriber( "seame/car/1/speedSensor", [this](const Sample& sample) diff --git a/src/main.cpp b/src/main.cpp index da2cbcd..d6179c9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,6 +3,8 @@ #include #include "InstrumentCluster.hpp" +using namespace zenoh; + int main(int argc, char* argv[]) { QGuiApplication app(argc, argv); diff --git a/ui/FootbarInfo.qml b/ui/FootbarInfo.qml index 082723f..76cf380 100644 --- a/ui/FootbarInfo.qml +++ b/ui/FootbarInfo.qml @@ -7,48 +7,47 @@ Row { padding: 10 Column { - Row { - - anchors.verticalCenterOffset: -10 - Image { - id: batteryLevel - // source: { - // if (canBusHandler.battery >= 80) { - // "qrc:/assets/icons/battery-5.png" - // } else if (canBusHandler.battery >= 60) { - // "qrc:/assets/icons/battery-4.png" - // } else if (canBusHandler.battery >= 40) { - // "qrc:/assets/icons/battery-3.png" - // } else if (canBusHandler.battery >= 20) { - // "qrc:/assets/icons/battery-2.png" - // } else { - // "qrc:/assets/icons/battery-1.png" - // } - // } - width: 80 - visible: true - fillMode: Image.PreserveAspectFit - source: "qrc:/assets/icons/battery-4.png" - // Adjust this value to move the image up or down - } - } // Row { - // spacing: 5 - // Text { - // font.family: "Open Sans" - // //text: canBusHandler.battery - // text: "100" - // font.pixelSize: app.letterSize - // color: "white" - // } - // Text { - // font.family: "Open Sans" - // text: "%" - // font.pixelSize: app.letterSize - // color: "gray" + // anchors.verticalCenterOffset: -10 + // Image { + // id: batteryLevel + // // source: { + // // if (canBusHandler.battery >= 80) { + // // "qrc:/assets/icons/battery-5.png" + // // } else if (canBusHandler.battery >= 60) { + // // "qrc:/assets/icons/battery-4.png" + // // } else if (canBusHandler.battery >= 40) { + // // "qrc:/assets/icons/battery-3.png" + // // } else if (canBusHandler.battery >= 20) { + // // "qrc:/assets/icons/battery-2.png" + // // } else { + // // "qrc:/assets/icons/battery-1.png" + // // } + // // } + // width: 80 + // visible: true + // fillMode: Image.PreserveAspectFit + // source: "qrc:/assets/icons/battery-4.png" + // // Adjust this value to move the image up or down // } // } + Row { + spacing: 5 + + Text { + font.family: "Open Sans" + text: instrumentCluster.battery.percentage + font.pixelSize: app.letterSize + color: "white" + } + Text { + font.family: "Open Sans" + text: "%" + font.pixelSize: app.letterSize + color: "gray" + } + } } Column { @@ -57,7 +56,7 @@ Row { spacing: 5 Text { font.family: "Open Sans" - text: "256" + text: instrumentCluster.battery.autonomy font.pixelSize: app.letterSize color: "white" } From 083a3e18d73c4d68046b01d7479cbdc69e4ed729 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Tue, 21 Jan 2025 18:53:27 +0000 Subject: [PATCH 2/7] Refactor InstrumentCluster to support configuration file input; update main application to handle dynamic instantiation and improve session management --- MiddleWare/CMakeLists.txt | 4 +- .../MiddleWareConfig.json} | 0 MiddleWare/src/main.cpp | 2 +- config/InstrumentClusterConfig.json | 17 +++++ include/InstrumentCluster.hpp | 2 + src/InstrumentCluster.cpp | 67 ++++++++++++++++++- src/main.cpp | 16 ++++- 7 files changed, 101 insertions(+), 7 deletions(-) rename MiddleWare/{middleWare.json => config/MiddleWareConfig.json} (100%) create mode 100644 config/InstrumentClusterConfig.json diff --git a/MiddleWare/CMakeLists.txt b/MiddleWare/CMakeLists.txt index 8e8ffa4..b7e4c90 100644 --- a/MiddleWare/CMakeLists.txt +++ b/MiddleWare/CMakeLists.txt @@ -22,8 +22,8 @@ find_package(zenohcxx REQUIRED) # include_directories(${libs_SOURCE_DIR}/Communication/CAN/include) # include_directories(${libs_SOURCE_DIR}/Peripherals/INA219/include) -add_executable(middleWareApp +add_executable(MiddleWareApp ./src/main.cpp ) -target_link_libraries(middleWareApp PRIVATE zenohcxx::zenohc) +target_link_libraries(MiddleWareApp PRIVATE zenohcxx::zenohc) diff --git a/MiddleWare/middleWare.json b/MiddleWare/config/MiddleWareConfig.json similarity index 100% rename from MiddleWare/middleWare.json rename to MiddleWare/config/MiddleWareConfig.json diff --git a/MiddleWare/src/main.cpp b/MiddleWare/src/main.cpp index 459b3cb..f0d4887 100644 --- a/MiddleWare/src/main.cpp +++ b/MiddleWare/src/main.cpp @@ -39,7 +39,7 @@ int main(int argc, char** argv) std::cout << "CAN socket bound to can0 interface successfully." << std::endl; - Config config = Config::from_file("middleWare.json"); + Config config = Config::from_file("MiddleWareConfig.json"); auto session = Session::open(std::move(config)); auto pubSpeed = diff --git a/config/InstrumentClusterConfig.json b/config/InstrumentClusterConfig.json new file mode 100644 index 0000000..e63c57c --- /dev/null +++ b/config/InstrumentClusterConfig.json @@ -0,0 +1,17 @@ +{ + "mode": "peer", + "connect": { + "endpoints": [] + }, + "listen": { + "endpoints": ["tcp/127.0.0.1:7447"] + }, + "scouting": { + "multicast": { + "enabled": false + }, + "gossip": { + "enabled": false + } + } +} \ No newline at end of file diff --git a/include/InstrumentCluster.hpp b/include/InstrumentCluster.hpp index 4a94553..89f23a3 100644 --- a/include/InstrumentCluster.hpp +++ b/include/InstrumentCluster.hpp @@ -103,6 +103,8 @@ class InstrumentCluster : public QObject public: explicit InstrumentCluster(QObject* parent = nullptr); + explicit InstrumentCluster(const std::string& configFile, + QObject* parent = nullptr); ~InstrumentCluster(); int getSpeed() const; diff --git a/src/InstrumentCluster.cpp b/src/InstrumentCluster.cpp index b1582a7..c6911f9 100644 --- a/src/InstrumentCluster.cpp +++ b/src/InstrumentCluster.cpp @@ -2,7 +2,72 @@ InstrumentCluster::InstrumentCluster(QObject* parent) : QObject(parent), - m_session(Session::open(std::move(Config::from_file("local.json")))), + 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 batteryPercentage = + std::stoi(sample.get_payload().as_string()); + BatteryStatus battery; + battery.percentage = batteryPercentage; + 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) + { + uint8_t data = + static_cast(sample.get_payload().as_string()[0]); + + LightStatus lights; + lights.rightBlinker = (data & (1 << 0)) != 0; + lights.leftBlinker = (data & (1 << 1)) != 0; + lights.lowBeam = (data & (1 << 2)) != 0; + lights.highBeam = (data & (1 << 3)) != 0; + lights.frontFogLight = (data & (1 << 4)) != 0; + lights.rearFogLight = (data & (1 << 5)) != 0; + lights.hazardLight = (data & (1 << 6)) != 0; + lights.parkingLight = (data & (1 << 7)) != 0; + 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) + { + uint8_t data = + static_cast(sample.get_payload().as_string()[0]); + + GearPosition gear; + 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) +{ +} + +InstrumentCluster::InstrumentCluster(const std::string& configFile, + QObject* parent) + : QObject(parent), + m_session(Session::open(std::move(Config::from_file(configFile)))), m_subSpeed(m_session.declare_subscriber( "seame/car/1/speedSensor", [this](const Sample& sample) diff --git a/src/main.cpp b/src/main.cpp index d6179c9..6cbd359 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,9 +10,17 @@ int main(int argc, char* argv[]) QGuiApplication app(argc, argv); QQmlApplicationEngine engine; - InstrumentCluster instrumentCluster; + InstrumentCluster* instrumentCluster; + if (argc == 2) + { + instrumentCluster = new InstrumentCluster(argv[1]); + } + else + { + instrumentCluster = new InstrumentCluster(); + } engine.rootContext()->setContextProperty("instrumentCluster", - &instrumentCluster); + instrumentCluster); const QUrl url(QStringLiteral("qrc:/Main.qml")); QObject::connect( @@ -25,5 +33,7 @@ int main(int argc, char* argv[]) Qt::QueuedConnection); engine.load(url); - return app.exec(); + int result = app.exec(); + delete instrumentCluster; + return result; } From a96f28af23a7b6dbb04513b4de1b11cb846f9e5e Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Wed, 22 Jan 2025 18:14:37 +0000 Subject: [PATCH 3/7] Enhance main application to support command-line configuration file input; fallback to default configuration if no file is provided --- MiddleWare/src/main.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/MiddleWare/src/main.cpp b/MiddleWare/src/main.cpp index f0d4887..2094401 100644 --- a/MiddleWare/src/main.cpp +++ b/MiddleWare/src/main.cpp @@ -39,8 +39,12 @@ int main(int argc, char** argv) std::cout << "CAN socket bound to can0 interface successfully." << std::endl; - Config config = Config::from_file("MiddleWareConfig.json"); - auto session = Session::open(std::move(config)); + auto config = Config::create_default(); + if (argc == 2) + { + config = Config::from_file(argv[1]); + } + auto session = Session::open(std::move(config)); auto pubSpeed = session.declare_publisher(KeyExpr("seame/car/1/speedSensor")); From b7e8b4e2c1d27093dad8ca90bb3f3a56d85bd4d8 Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Thu, 23 Jan 2025 15:24:25 +0000 Subject: [PATCH 4/7] Add publishers for lights and gear in main application; implement publishing logic for new data frames --- MiddleWare/src/main.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/MiddleWare/src/main.cpp b/MiddleWare/src/main.cpp index 2094401..9651f8e 100644 --- a/MiddleWare/src/main.cpp +++ b/MiddleWare/src/main.cpp @@ -50,6 +50,8 @@ int main(int argc, char** argv) session.declare_publisher(KeyExpr("seame/car/1/speedSensor")); auto pubBattery = session.declare_publisher(KeyExpr("seame/car/1/batterySensor")); + auto pubLights = session.declare_publisher(KeyExpr("seame/car/1/lights")); + auto pubGear = session.declare_publisher(KeyExpr("seame/car/1/gear")); while (1) { @@ -87,6 +89,24 @@ int main(int argc, char** argv) printf("Publishing battery: '%lf\n", battery); pubBattery.put(battery_str.c_str()); } + else if (frame.can_id == 0x03) + { + char lights; + + memcpy(&lights, frame.data, sizeof(char)); + + printf("Publishing lights: '%lf\n", lights); + pubLights.put(lights.c_str()); + } + else if (frame.can_id == 0x04) + { + char gear; + + memcpy(&gear, frame.data, sizeof(char)); + + printf("Publishing gear: '%lf\n", gear); + pubGear.put(gear.c_str()); + } usleep(10); } return 0; From 8af81e362ede71b6490efa1caf6227335ec1441d Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Thu, 23 Jan 2025 15:48:45 +0000 Subject: [PATCH 5/7] Fix publishing logic for lights and gear to use std::to_string for proper string conversion --- MiddleWare/src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MiddleWare/src/main.cpp b/MiddleWare/src/main.cpp index 9651f8e..6da39c0 100644 --- a/MiddleWare/src/main.cpp +++ b/MiddleWare/src/main.cpp @@ -96,7 +96,7 @@ int main(int argc, char** argv) memcpy(&lights, frame.data, sizeof(char)); printf("Publishing lights: '%lf\n", lights); - pubLights.put(lights.c_str()); + pubLights.put(std::to_string(lights)); } else if (frame.can_id == 0x04) { @@ -105,7 +105,7 @@ int main(int argc, char** argv) memcpy(&gear, frame.data, sizeof(char)); printf("Publishing gear: '%lf\n", gear); - pubGear.put(gear.c_str()); + pubGear.put(std::to_string(gear)); } usleep(10); } From 66a68459a31c55c37e277ec886c89afcf40b028a Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Thu, 23 Jan 2025 18:38:46 +0000 Subject: [PATCH 6/7] Refactor publishing logic to improve debug output and handle light and gear data more effectively --- MiddleWare/src/main.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/MiddleWare/src/main.cpp b/MiddleWare/src/main.cpp index 6da39c0..217ab81 100644 --- a/MiddleWare/src/main.cpp +++ b/MiddleWare/src/main.cpp @@ -73,7 +73,7 @@ int main(int argc, char** argv) speed = wheelDiame * 3.14 * speed * 10 / 60; std::string speed_str = std::to_string(speed); - printf("Publishing speed: '%d'\n", speed); + // printf("Publishing speed: '%d'\n", speed); pubSpeed.put(speed_str.c_str()); } else if (frame.can_id == 0x02) @@ -86,7 +86,7 @@ int main(int argc, char** argv) battery = std::min(100.0f, std::max(0.0f, percentage)); std::string battery_str = std::to_string(battery); - printf("Publishing battery: '%lf\n", battery); + // printf("Publishing battery: '%lf\n", battery); pubBattery.put(battery_str.c_str()); } else if (frame.can_id == 0x03) @@ -95,17 +95,25 @@ int main(int argc, char** argv) memcpy(&lights, frame.data, sizeof(char)); - printf("Publishing lights: '%lf\n", lights); - pubLights.put(std::to_string(lights)); + printf("Can received lights: "); + for (int i = 7; i >= 0; i--) + { + printf("%d", (lights >> i) & 0x01); + } + printf("\n"); + + // printf("Publishing lights: '%lf\n", lights[0]); + std::string light_str(1, lights); + pubLights.put(light_str); } else if (frame.can_id == 0x04) { - char gear; + uint8_t gear[1]; - memcpy(&gear, frame.data, sizeof(char)); + memcpy(gear, frame.data, sizeof(gear)); - printf("Publishing gear: '%lf\n", gear); - pubGear.put(std::to_string(gear)); + // printf("Publishing gear: '%lf\n", gear[0]); + pubGear.put(std::to_string(gear[0])); } usleep(10); } From 47a936e2738149900b7981da64c845d0689ccfeb Mon Sep 17 00:00:00 2001 From: Rui Pires Date: Fri, 24 Jan 2025 16:16:03 +0000 Subject: [PATCH 7/7] Fix gear data handling in publishing logic to use char type and correct string conversion --- MiddleWare/src/main.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MiddleWare/src/main.cpp b/MiddleWare/src/main.cpp index 217ab81..5f1839a 100644 --- a/MiddleWare/src/main.cpp +++ b/MiddleWare/src/main.cpp @@ -108,12 +108,13 @@ int main(int argc, char** argv) } else if (frame.can_id == 0x04) { - uint8_t gear[1]; + char gear; - memcpy(gear, frame.data, sizeof(gear)); + memcpy(&gear, frame.data, sizeof(char)); // printf("Publishing gear: '%lf\n", gear[0]); - pubGear.put(std::to_string(gear[0])); + std::string gear_str(1, gear); + pubGear.put(std::to_string(gear_str)); } usleep(10); }